pax_global_header00006660000000000000000000000064126435513040014515gustar00rootroot0000000000000052 comment=423ac1541233ce3bcc306e141787b096baa84763 nco-4.5.4/000077500000000000000000000000001264355130400123065ustar00rootroot00000000000000nco-4.5.4/.gitignore000066400000000000000000000007231264355130400143000ustar00rootroot00000000000000# Git-ignore patterns for ~/nco # Autoconf/Automake Makefile.in .deps .libs *.o *.la *.lo /autom4te.cache /aclocal.m4 /compile /configure /depcomp /install-sh /missing /Makefile # Odd files, litter gmon.out PET0.RegridWeightGen.Log # Editors *.~?~ *~ TAGS # NCO-generic *.nc *.hdf # Directory-specific /config.h /config.guess /config.log /config.sub /config.status /libtool /stamp-h* nco.config.log.*.foo nco.configure.*.foo nco.libtool.*.foo nco.make.*.foo nco-4.5.4/.travis.yml000066400000000000000000000007041264355130400144200ustar00rootroot00000000000000# Syntax-check Travis YAML .travis.yml files at http://lint.travis-ci.org # Force Travis to rebuild by commiting an increment to this counter: 5 language: c compiler: - gcc - clang - g++ before_install: - sudo apt-get update -qq - sudo apt-get install -y -qq antlr libantlr-dev libnetcdf6 libnetcdf-dev netcdf-bin udunits-bin libudunits2-0 libudunits2-dev - ./configure - export DATA='/home/travis' script: - make -j 4 - make test nco-4.5.4/AUTHORS000066400000000000000000000043251264355130400133620ustar00rootroot00000000000000The User Guide documentation (nco.texi) contains the most up-to-date list of contributors to the NCO project, see http://nco.sf.net/nco.html#ppl Henry Butowsky Non-linear operations and 'min()', 'max()', 'total()' support in 'ncra' and 'ncwa'. Type conversion for arithmetic. Migration to netCDF3 API. 'ncap2' parser, lexer, GSL-support, and I/O. Multislabbing algorithm. Variable wildcarding. Numerous hacks. 'ncap2' language. Rorik Peterson Original autotool build support. Long command-line options. Original UDUnits support. Debianization. Numerous bug-fixes. Joe Hamman Python bindings (NCOpy). Daniel Wang Script Workflow Analysis for MultiProcessing (SWAMP). RPM support. Harry Mangalam Benchmarking. OPeNDAP configuration. Pedro Vicente Windows Visual Studio support. netCDF4 groups. Russ Rew Advice on NCO structural algorithms Brian Mays Original packaging for Debian GNU/Linux, 'nroff' man pages. George Shapovalov Packaging for Gentoo GNU/Linux. Bill Kocik Memory management. Len Makin NEC SX architecture support. Jim Edwards AIX architecture support. Juliana Rew Compatibility with large PIDs. Karen Schuchardt Auxiliary coordinate support. Gayathri Venkitachalam MPI implementation. Scott Capps Large work-load testing Peter Campbell, Martin Dix, Mark Flanner, Markus Liebig, Keith Lindsay, Mike Page, Martin Schmidt, Michael Schulz, Lori Sentman, Gary Strand, George White Andrew Wittenberg, Remik Ziemlinski Excellent bug reports and feature requests. Daniel Baumann, Nick Bower, Luk Claebs, Barry deFreese, Aleksandar Jelenak, Francesco Lovergine, Matej Vela Debian packaging Patrice Dumas, Ed Hill, Orion Poplawski RedHat packaging George Shapavalov, Patrick Kursawe Gentoo packaging Filipe Fernandes OpenSuse packaging Takeshi Enomoto, Alexander Hansen Mac OS packaging Eric Blake Autoconf/M4 help Gavin Burris, Kyle Wilcox RHEL and CentOS build scripts and bug reports. Andrea Cimatoribus NCO Spiral Logo Martin Otte, Etienne Tourigny Single bug reports and fixes Wenshan Wang CMIP5 and MODIS processing documentation. Please let me know if your name was omitted! nco-4.5.4/CITATION000066400000000000000000000025541264355130400134510ustar00rootroot00000000000000NCO is three things: a geoscience data analysis toolkit, an open-source software project, and an academic enterprise that embodies fundamental new (research-level) algorithms for geoscience data analysis. Successful academic research depends upon peer-evaluation, dissemination, and explicit acknowledgement of prior work and original results. The accepted way to convey acknowledgement to NCO for ideas or assistance in workflow processing is to cite its peer-reviewed description and or its User Guide. We encourage users and data science researchers to cite NCO for another reason, too: it helps funding agencies track the impact of the work they fund. The recommended citation for NCO software is Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. or Zender, C. S. (2014), netCDF Operator (NCO) User Guide, Version 4.4.3, http://nco.sf.net/nco.pdf. Use the former when referring to overall design, purpose, and optimization of NCO, and use the latter when referring to specific features and/or the Users Guide itself. Additional information on citing NCO is in the User Guide at http://nco.sf.net#ctt A complete list of NCO publications and presentations is at http://nco.sf.net#pub This list links to the full papers and seminars themselves. nco-4.5.4/COPYING000066400000000000000000001045131264355130400133450ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. 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 state 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 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 . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program 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, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU 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 Lesser General Public License instead of this License. But first, please read . nco-4.5.4/COPYRIGHT000066400000000000000000000016411264355130400136030ustar00rootroot00000000000000Charlie Zender wrote most of NCO and holds all NCO copyrights. He licenses NCO under the GNU GPL3 (see file COPYING). Advance permission must be sought from him for any usage or (re-)distribution of NCO code not compliant with the GPL. Contact him at . His surname is zender. All other NCO contributors either explicitly assigned their copyrights to Zender, or their contributions were not legally significant for copyright purposes. These contributors are all listed under "Contributors" in the User Guide documentation (nco.texi) at http://nco.sf.net/nco.html#ppl and in the file AUTHORS The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 nco-4.5.4/INSTALL000066400000000000000000000366001264355130400133440ustar00rootroot00000000000000Installation Instructions ************************* Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, Inc. Copying and distribution of this file, with or without modification, are permitted in any medium without royalty provided the copyright notice and this notice are preserved. This file is offered as-is, without warranty of any kind. Basic Installation ================== Briefly, the shell commands `./configure; make; make install' should configure, build, and install this package. The following more-detailed instructions are generic; see the `README' file for instructions specific to this package. Some packages provide this `INSTALL' file but do not implement all of the features documented below. The lack of an optional feature in a given package is not necessarily a bug. More recommendations for GNU packages can be found in *note Makefile Conventions: (standards)Makefile Conventions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). It can also use an optional file (typically called `config.cache' and enabled with `--cache-file=config.cache' or simply `-C') that saves the results of its tests to speed up reconfiguring. Caching is disabled by default to prevent problems with accidental use of stale cache files. If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If you are using the cache, and at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.ac' (or `configure.in') is used to create `configure' by a program called `autoconf'. You need `configure.ac' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. Running `configure' might take a while. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package, generally using the just-built uninstalled binaries. 4. Type `make install' to install the programs and any data files and documentation. When installing into a prefix owned by root, it is recommended that the package be configured and built as a regular user, and only the `make install' phase executed with root privileges. 5. Optionally, type `make installcheck' to repeat any self-tests, but this time using the binaries in their final installed location. This target does not install anything. Running this target as a regular user, particularly if the prior `make install' required root privileges, verifies that the installation completed correctly. 6. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. 7. Often, you can also type `make uninstall' to remove the installed files again. In practice, not all packages have tested that uninstallation works correctly, even though it is required by the GNU Coding Standards. 8. Some packages, particularly those that use Automake, provide `make distcheck', which can by used by developers to test that all other targets like `make install' and `make uninstall' work correctly. This target is generally not run by end users. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. Run `./configure --help' for details on some of the pertinent environment variables. You can give `configure' initial values for configuration parameters by setting variables in the command line or in the environment. Here is an example: ./configure CC=c99 CFLAGS=-g LIBS=-lposix *Note Defining Variables::, for more details. Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you can use GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. This is known as a "VPATH" build. With a non-GNU `make', it is safer to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. On MacOS X 10.5 and later systems, you can create libraries and executables that work on multiple system types--known as "fat" or "universal" binaries--by specifying multiple `-arch' options to the compiler but only a single `-arch' option to the preprocessor. Like this: ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ CPP="gcc -E" CXXCPP="g++ -E" This is not guaranteed to produce working output in all cases, you may have to build one architecture at a time and combine the results using the `lipo' tool if you have problems. Installation Names ================== By default, `make install' installs the package's commands under `/usr/local/bin', include files under `/usr/local/include', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PREFIX', where PREFIX must be an absolute file name. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you pass the option `--exec-prefix=PREFIX' to `configure', the package uses PREFIX as the prefix for installing programs and libraries. Documentation and other data files still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=DIR' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. In general, the default for these options is expressed in terms of `${prefix}', so that specifying just `--prefix' will affect all of the other directory specifications that were not explicitly provided. The most portable way to affect installation locations is to pass the correct locations to `configure'; however, many packages provide one or both of the following shortcuts of passing variable assignments to the `make install' command line to change installation locations without having to reconfigure or recompile. The first method involves providing an override variable for each affected directory. For example, `make install prefix=/alternate/directory' will choose an alternate location for all directory configuration variables that were expressed in terms of `${prefix}'. Any directories that were specified during `configure', but not in terms of `${prefix}', must each be overridden at install time for the entire installation to be relocated. The approach of makefile variable overrides for each directory variable is required by the GNU Coding Standards, and ideally causes no recompilation. However, some platforms have known limitations with the semantics of shared libraries that end up requiring recompilation when using this method, particularly noticeable in packages that use GNU Libtool. The second method involves providing the `DESTDIR' variable. For example, `make install DESTDIR=/alternate/directory' will prepend `/alternate/directory' before all installation names. The approach of `DESTDIR' overrides is not required by the GNU Coding Standards, and does not work on platforms that have drive letters. On the other hand, it does better at avoiding recompilation issues, and works well even when some directory options were not specified in terms of `${prefix}' at `configure' time. Optional Features ================= If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Some packages offer the ability to configure how verbose the execution of `make' will be. For these packages, running `./configure --enable-silent-rules' sets the default to minimal output, which can be overridden with `make V=1'; while running `./configure --disable-silent-rules' sets the default to verbose, which can be overridden with `make V=0'. Particular systems ================== On HP-UX, the default C compiler is not ANSI C compatible. If GNU CC is not installed, it is recommended to use the following options in order to use an ANSI C compiler: ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" and if that doesn't work, install pre-built binaries of GCC for HP-UX. HP-UX `make' updates targets which have the same time stamps as their prerequisites, which makes it generally unusable when shipped generated files such as `configure' are involved. Use GNU `make' instead. On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot parse its `' header file. The option `-nodtk' can be used as a workaround. If GNU CC is not installed, it is therefore recommended to try ./configure CC="cc" and if that doesn't work, try ./configure CC="cc -nodtk" On Solaris, don't put `/usr/ucb' early in your `PATH'. This directory contains several dysfunctional programs; working variants of these programs are available in `/usr/bin'. So, if you need `/usr/ucb' in your `PATH', put it _after_ `/usr/bin'. On Haiku, software installed for all users goes in `/boot/common', not `/usr/local'. It is recommended to use the following options: ./configure --prefix=/boot/common Specifying the System Type ========================== There may be some features `configure' cannot figure out automatically, but needs to determine by the type of machine the package will run on. Usually, assuming the package is built to be run on the _same_ architectures, `configure' can figure that out, but if it prints a message saying it cannot guess the machine type, give it the `--build=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name which has the form: CPU-COMPANY-SYSTEM where SYSTEM can have one of these forms: OS KERNEL-OS See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the machine type. If you are _building_ compiler tools for cross-compiling, you should use the option `--target=TYPE' to select the type of system they will produce code for. If you want to _use_ a cross compiler, that generates code for a platform different from the build platform, you should specify the "host" platform (i.e., that on which the generated programs will eventually be run) with `--host=TYPE'. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Defining Variables ================== Variables not defined in a site shell script can be set in the environment passed to `configure'. However, some packages may run configure again during the build, and the customized values of these variables may be lost. In order to avoid this problem, you should set them in the `configure' command line, using `VAR=value'. For example: ./configure CC=/usr/local2/bin/gcc causes the specified `gcc' to be used as the C compiler (unless it is overridden in the site shell script). Unfortunately, this technique does not work for `CONFIG_SHELL' due to an Autoconf bug. Until the bug is fixed you can use this workaround: CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash `configure' Invocation ====================== `configure' recognizes the following options to control how it operates. `--help' `-h' Print a summary of all of the options to `configure', and exit. `--help=short' `--help=recursive' Print a summary of the options unique to this package's `configure', and exit. The `short' variant lists options used only in the top level, while the `recursive' variant lists options also present in any nested packages. `--version' `-V' Print the version of Autoconf used to generate the `configure' script, and exit. `--cache-file=FILE' Enable the cache: use and save the results of the tests in FILE, traditionally `config.cache'. FILE defaults to `/dev/null' to disable caching. `--config-cache' `-C' Alias for `--cache-file=config.cache'. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--prefix=DIR' Use DIR as the installation prefix. *note Installation Names:: for more details, including other options available for fine-tuning the installation locations. `--no-create' `-n' Run the configure checks, but stop before creating any output files. `configure' also accepts some other, not widely useful, options. Run `configure --help' for more details. nco-4.5.4/LICENSE000066400000000000000000000015271264355130400133200ustar00rootroot00000000000000All source code created by the NCO project and distributed with NCO is re-distributable under the terms of the GNU General Public License (GPL) Version 3. The full license text is at http://www.gnu.org/copyleft/gpl.html and in the file COPYING. Copyright information is in the file COPYRIGHT. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. nco-4.5.4/Makefile.am000066400000000000000000000011641264355130400143440ustar00rootroot00000000000000# $Header$ -*-makefile-*- # 20151001: Sub-folder is by default, and not when configure --disable-docs is invoked SUBDIRS = data src man @DOC_FOLDER@ # Separately add desired files from nco/bld/ to distribution # Autoconf does not know about the bld directory # In particular, nco/bld/Makefile was created manually, not by autoconf bld_extras = bld/Makefile bld/pvmgetarch bld/nco.spec EXTRA_DIST = $(bld_extras) ACLOCAL_AMFLAGS = -I m4 test: tst tst: $(MAKE) check cd bm && ./nco_bm.pl --regress regress: rgr rgr: cd bm && ./nco_bm.pl --regress regress-mpi: rgr_mpi rgr_mpi: cd bm && ./nco_bm.pl --regress --mpi_prc=2 nco-4.5.4/Makefile.in000066400000000000000000000647311264355130400143660ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = . ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ $(am__configure_deps) $(am__DIST_COMMON) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs CONFIG_HEADER = config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ cscope distdir dist dist-all distcheck am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ $(LISP)config.h.in # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags CSCOPE = cscope DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ $(top_srcdir)/autobld/compile \ $(top_srcdir)/autobld/config.guess \ $(top_srcdir)/autobld/config.sub \ $(top_srcdir)/autobld/install-sh \ $(top_srcdir)/autobld/ltmain.sh $(top_srcdir)/autobld/missing \ $(top_srcdir)/autobld/mkinstalldirs AUTHORS COPYING INSTALL \ autobld/compile autobld/config.guess autobld/config.sub \ autobld/depcomp autobld/install-sh autobld/ltmain.sh \ autobld/missing autobld/mkinstalldirs autobld/texinfo.tex \ autobld/ylwrap DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ if test -d "$(distdir)"; then \ find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -rf "$(distdir)" \ || { sleep 5 && rm -rf "$(distdir)"; }; \ else :; fi am__post_remove_distdir = $(am__remove_distdir) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best DIST_TARGETS = dist-gzip distuninstallcheck_listfiles = find . -type f -print am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # 20151001: Sub-folder is by default, and not when configure --disable-docs is invoked SUBDIRS = data src man @DOC_FOLDER@ # Separately add desired files from nco/bld/ to distribution # Autoconf does not know about the bld directory # In particular, nco/bld/Makefile was created manually, not by autoconf bld_extras = bld/Makefile bld/pvmgetarch bld/nco.spec EXTRA_DIST = $(bld_extras) ACLOCAL_AMFLAGS = -I m4 all: config.h $(MAKE) $(AM_MAKEFLAGS) all-recursive .SUFFIXES: am--refresh: Makefile @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) $(am__cd) $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) $(am__aclocal_m4_deps): config.h: stamp-h1 @test -f $@ || rm -f stamp-h1 @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) rm -f stamp-h1 touch $@ distclean-hdr: -rm -f config.h stamp-h1 mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs distclean-libtool: -rm -f libtool config.lt # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscope: cscope.files test ! -s cscope.files \ || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) clean-cscope: -rm -f cscope.files cscope.files: clean-cscope cscopelist cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags -rm -f cscope.out cscope.in.out cscope.po.out cscope.files distdir: $(DISTFILES) $(am__remove_distdir) test -d "$(distdir)" || mkdir "$(distdir)" @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done -test -n "$(am__skip_mode_fix)" \ || find "$(distdir)" -type d ! -perm -755 \ -exec chmod u+rwx,go+rx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r "$(distdir)" dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__post_remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 $(am__post_remove_distdir) dist-lzip: distdir tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz $(am__post_remove_distdir) dist-xz: distdir tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz $(am__post_remove_distdir) dist-tarZ: distdir @echo WARNING: "Support for distribution archives compressed with" \ "legacy program 'compress' is deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir @echo WARNING: "Support for shar distribution archives is" \ "deprecated." >&2 @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__post_remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__post_remove_distdir) dist dist-all: $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' $(am__post_remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lz*) \ lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ *.tar.xz*) \ xz -dc $(distdir).tar.xz | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir) chmod u+w $(distdir) mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ && ../../configure \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ --srcdir=../.. --prefix="$$dc_install_base" \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ && cd "$$am__cwd" \ || exit 1 $(am__post_remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @test -n '$(distuninstallcheck_dir)' || { \ echo 'ERROR: trying to run $@ with an empty' \ '$$(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ $(am__cd) '$(distuninstallcheck_dir)' || { \ echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ exit 1; \ }; \ test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile config.h installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic 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-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) all install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ am--refresh check check-am clean clean-cscope clean-generic \ clean-libtool cscope cscopelist-am ctags ctags-am dist \ dist-all dist-bzip2 dist-gzip dist-lzip 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-man install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs installdirs-am maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic \ mostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile test: tst tst: $(MAKE) check cd bm && ./nco_bm.pl --regress regress: rgr rgr: cd bm && ./nco_bm.pl --regress regress-mpi: rgr_mpi rgr_mpi: cd bm && ./nco_bm.pl --regress --mpi_prc=2 # 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: nco-4.5.4/README.md000066400000000000000000000106251264355130400135710ustar00rootroot00000000000000NCO NetCDF Operators ==================== The NCO toolkit manipulates and analyzes data stored in [netCDF](http://www.unidata.ucar.edu/packages/netcdf)-accessible formats, including [DAP](http://opendap.org), [HDF4](http://hdfgroup.org/products/hdf4), and [HDF5](http://hdfgroup.org/HDF5). It exploits the geophysical expressivity of many [CF](http://cfconventions.org/1.6.html) (Climate & Forecast) metadata conventions, the flexible description of physical dimensions translated by [UDUnits](http://www.unidata.ucar.edu/packages/udunits), the network transparency of [OPeNDAP](http://opendap.org), the storage features (e.g., compression, chunking, groups) of [HDF](http://hdfgroup.org) (the Hierarchical Data Format), and many powerful mathematical and statistical algorithms of [GSL](http://www.gnu.org/software/gsl) (the GNU Scientific Library). NCO is [fast](http://dust.ess.uci.edu/ppr/ppr_ZeM07.pdf), [powerful](http://dust.ess.uci.edu/ppr/ppr_Zen08.pdf), and [free](http://www.gnu.org/licenses/gpl-3.0.html). What is NCO? ------------ The netCDF Operators (NCO) comprise a dozen standalone, command-line programs that take [netCDF](http://www.unidata.ucar.edu/packages/netcdf), [HDF](http://hdfgroup.org), and/or [DAP](http://opendap.org) files as input, then operate (e.g., derive new data, compute statistics, print, hyperslab, manipulate metadata) and output the results to screen or files in text, binary, or netCDF formats. NCO aids analysis of gridded scientific data. The shell-command style of NCO allows users to manipulate and analyze files interactively, or with expressive scripts that avoid some overhead of higher-level programming environments. Traditional geoscience data analysis requires users to work with numerous flat (data in one level or namespace) files. In that paradigm instruments or models produce, and then repositories archive and distribute, and then researchers request and analyze, collections of flat files. NCO works well with that paradigm, yet it also embodies the necessary algorithms to transition geoscience data analysis from relying solely on traditional (or “flat”) datasets to allowing newer hierarchical (or “nested”) datasets. The next logical step is to support and enable combining all datastreams that meet user-specified criteria into a single or small number of files that hold *all* the science-relevant data organized in hierarchical structures. NCO (and no other software to our knowledge) can do this now. We call the resulting data storage, distribution, and analysis paradigm Group-Oriented Data Analysis and Distribution ([GODAD](http://nco.sf.net/nco.html#godad)). GODAD lets the scientific question organize the data, not the *ad hoc* granularity of all relevant datasets. The [User Guide](http://nco.sf.net/nco.html) illustrates [GODAD](http://nco.sf.net/nco.html#godad) techniques for climate data analysis: | Operator | Full Name | Examples | -------- |:-------------------------- | :---------- | `ncap2` | netCDF Arithmetic Processor | [here](http://nco.sf.net/nco.html#ncap2) | | `ncatted` | netCDF ATTribute EDitor | [here](http://nco.sf.net/nco.html#ncatted) | | `ncbo` | netCDF Binary Operator | [here](http://nco.sf.net/nco.html#ncbo) | | `nces` | netCDF Ensemble Statistics | [here](http://nco.sf.net/nco.html#nces) | | `ncecat` | netCDF Ensemble conCATenator | [here](http://nco.sf.net/nco.html#ncecat) | | `ncflint` | netCDF FiLe INTerpolator | [here](http://nco.sf.net/nco.html#ncflint) | | `ncks` | netCDF Kitchen Sink | [here](http://nco.sf.net/nco.html#ncks) | | `ncpdq` | netCDF Permute Dimensions Quickly, Pack Data Quietly | [here](http://nco.sf.net/nco.html#ncpdq) | | `ncra` | netCDF Record Averager | [here](http://nco.sf.net/nco.html#ncra) | | `ncrcat` | netCDF Record conCATenator | [here](http://nco.sf.net/nco.html#ncrcat) | | `ncremap` | netCDF REMAPer | [here](http://nco.sf.net/nco.html#ncremap) | | `ncrename` | netCDF RENAMEer | [here](http://nco.sf.net/nco.html#ncrename) | | `ncwa` | netCDF Weighted Averager | [here](http://nco.sf.net/nco.html#ncwa) | ### How to Contribute: Volunteer, Endorse, or Donate The NCO project [homepage](http://sf.net/projects/nco) points to mailing lists, discussion forums, and instructions to make contributing easy. It contains everything about NCO that you may be looking for. nco-4.5.4/acinclude.m4000066400000000000000000000026161264355130400145040ustar00rootroot00000000000000AC_DEFUN([AC_CXX_HAVE_VALARRAY], [AC_CACHE_CHECK(whether C++ compiler has working valarray, ac_cv_cxx_have_valarray, [AC_REQUIRE([AC_CXX_NAMESPACES]) AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([#include #ifdef HAVE_NAMESPACES using namespace std; #endif],[valarray x(100); return 0;], ac_cv_cxx_have_valarray=yes, ac_cv_cxx_have_valarray=no) AC_LANG_RESTORE ]) if test "$ac_cv_cxx_have_valarray" = yes; then AC_DEFINE(HAVE_VALARRAY,,[Define if C++ compiler has working valarray]) fi ]) AC_DEFUN([AC_CXX_NAMESPACES], [AC_CACHE_CHECK(whether C++ compiler implements namespaces, ac_cv_cxx_namespaces, [AC_LANG_SAVE AC_LANG_CPLUSPLUS AC_TRY_COMPILE([namespace Outer { namespace Inner { int i = 0; }}], [using namespace Outer::Inner; return i;], ac_cv_cxx_namespaces=yes, ac_cv_cxx_namespaces=no) AC_LANG_RESTORE ]) if test "$ac_cv_cxx_namespaces" = yes; then AC_DEFINE(HAVE_NAMESPACES,,[Define if C++ compiler implements namespaces]) fi ]) dnl NCO_CHECK_FUNCS provided by Eric Blake of RedHat on autoconf USENET group 20100805 AC_DEFUN([NCO_CHECK_FUNCS], [AC_FOREACH([NCO_Func],[$1], [AC_CHECK_FUNC(NCO_Func, [AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_]NCO_Func), [1], [Define to 1 if compiler finds external `]NCO_Func[' function])], [AC_DEFINE_UNQUOTED(AS_TR_CPP([NEED_]NCO_Func), [1], [Define to 1 if compiler needs external `]NCO_Func[' function])]dnl )])]) nco-4.5.4/aclocal.m4000066400000000000000000001307561264355130400141620ustar00rootroot00000000000000# generated automatically by aclocal 1.15 -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # Copyright (C) 2002-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.15' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.15], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.15])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl # Expand $ac_aux_dir to an absolute path. am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target (and possibly the TAP driver). The # system "awk" is bad on some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi dnl The trailing newline in this macro's definition is deliberate, for dnl backward compatibility and to allow trailing 'dnl'-style comments dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh+set}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Copyright (C) 1998-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_LEX # ----------- # Autoconf leaves LEX=: if lex or flex can't be found. Change that to a # "missing" invocation, for better error output. AC_DEFUN([AM_PROG_LEX], [AC_PREREQ([2.50])dnl AC_REQUIRE([AM_MISSING_HAS_RUN])dnl AC_REQUIRE([AC_PROG_LEX])dnl if test "$LEX" = :; then LEX=${am_missing_run}flex fi]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2014 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_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # -*- Autoconf -*- # Obsolete and "removed" macros, that must however still report explicit # error messages when used, to smooth transition. # # Copyright (C) 1996-2014 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. AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2014 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR m4_include([m4/libtool.m4]) m4_include([m4/ltoptions.m4]) m4_include([m4/ltsugar.m4]) m4_include([m4/ltversion.m4]) m4_include([m4/lt~obsolete.m4]) m4_include([acinclude.m4]) nco-4.5.4/autobld/000077500000000000000000000000001264355130400137405ustar00rootroot00000000000000nco-4.5.4/autobld/compile000077500000000000000000000162451264355130400153260ustar00rootroot00000000000000#! /bin/sh # Wrapper for compilers which do not understand '-c -o'. scriptversion=2012-10-14.11; # UTC # Copyright (C) 1999-2013 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_dashL linkdir # Make cl look for libraries in LINKDIR func_cl_dashL () { func_file_conv "$1" if test -z "$lib_path"; then lib_path=$file else lib_path="$lib_path;$file" fi linker_opts="$linker_opts -LIBPATH:$file" } # func_cl_dashl library # Do a library search-path lookup for cl func_cl_dashl () { lib=$1 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 lib=$dir/$lib.dll.lib break fi if test -f "$dir/$lib.lib"; then found=yes lib=$dir/$lib.lib break fi if test -f "$dir/lib$lib.a"; then found=yes lib=$dir/lib$lib.a break fi done IFS=$save_IFS if test "$found" != yes; then lib=$lib.lib fi } # 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) eat=1 func_file_conv "$2" mingw set x "$@" -I"$file" shift ;; -I*) func_file_conv "${1#-I}" mingw set x "$@" -I"$file" shift ;; -l) eat=1 func_cl_dashl "$2" set x "$@" "$lib" shift ;; -l*) func_cl_dashl "${1#-l}" set x "$@" "$lib" shift ;; -L) eat=1 func_cl_dashL "$2" ;; -L*) func_cl_dashL "${1#-L}" ;; -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: nco-4.5.4/autobld/config.guess000077500000000000000000001303611264355130400162640ustar00rootroot00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-06-10' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # # Originally written by Per Bothner. # # You can get the latest version of this script from: # http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD # # Please send patches with a ChangeLog entry to config-patches@gnu.org. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. 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.guess ($timestamp) Originally written by Per Bothner. Copyright 1992-2013 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" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown case "${UNAME_SYSTEM}" in Linux|GNU|GNU/*) # If the system lacks a compiler, then just pick glibc. # We could probably try harder. LIBC=gnu eval $set_cc_for_build cat <<-EOF > $dummy.c #include #if defined(__UCLIBC__) LIBC=uclibc #elif defined(__dietlibc__) LIBC=dietlibc #else LIBC=gnu #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` ;; esac # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ELF__ then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:Bitrig:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` # Reset EXIT trap before exiting to avoid spurious non-zero exit code. exitcode=$? trap '' 0 exit $exitcode ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm*:riscos:*:*|arm*:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; s390x:SunOS:*:*) echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) echo i386-pc-auroraux${UNAME_RELEASE} exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) eval $set_cc_for_build SUN_ARCH="i386" # If there is a compiler, see if it is configured for 64-bit objects. # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. # This test works for both compilers. if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then SUN_ARCH="x86_64" fi fi echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[4567]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep -q __LP64__ then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) UNAME_PROCESSOR=`/usr/bin/uname -p` case ${UNAME_PROCESSOR} in amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW64*:*) echo ${UNAME_MACHINE}-pc-mingw64 exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:MSYS*:*) echo ${UNAME_MACHINE}-pc-msys exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; authenticamd | genuineintel | EM64T) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; 8664:Windows_NT:*) echo x86_64-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; aarch64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; aarch64_be:Linux:*:*) UNAME_MACHINE=aarch64_be echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep -q ld.so.1 if test "$?" = 0 ; then LIBC="gnulibc1" ; fi echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arc:Linux:*:* | arceb:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-${LIBC} else if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_PCS_VFP then echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi else echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf fi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; cris:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; crisv32:Linux:*:*) echo ${UNAME_MACHINE}-axis-linux-${LIBC} exit ;; frv:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; hexagon:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:Linux:*:*) echo ${UNAME_MACHINE}-pc-linux-${LIBC} exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; mips:Linux:*:* | mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef ${UNAME_MACHINE} #undef ${UNAME_MACHINE}el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=${UNAME_MACHINE}el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=${UNAME_MACHINE} #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; } ;; or1k:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; or32:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; padre:Linux:*:*) echo sparc-unknown-linux-${LIBC} exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-${LIBC} ;; PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; *) echo hppa-unknown-linux-${LIBC} ;; esac exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-${LIBC} exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-${LIBC} exit ;; ppc64le:Linux:*:*) echo powerpc64le-unknown-linux-${LIBC} exit ;; ppcle:Linux:*:*) echo powerpcle-unknown-linux-${LIBC} exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux-${LIBC} exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; tile*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-${LIBC} exit ;; x86_64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-${LIBC} exit ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i586. # Note: whatever this is, it MUST be the same as what config.sub # prints for the "djgpp" host, or else GDB configury will decide that # this is a cross-build. echo i586-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; NCR*:*:4.2:* | MPRAS*:*:4.2:*) OS_REL='.3' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; BePC:Haiku:*:*) # Haiku running on Intel PC compatible. echo i586-pc-haiku exit ;; x86_64:Haiku:*:*) echo x86_64-unknown-haiku exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown eval $set_cc_for_build if test "$UNAME_PROCESSOR" = unknown ; then UNAME_PROCESSOR=powerpc fi if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ grep IS_64BIT_ARCH >/dev/null then case $UNAME_PROCESSOR in i386) UNAME_PROCESSOR=x86_64 ;; powerpc) UNAME_PROCESSOR=powerpc64 ;; esac fi fi echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NEO-?:NONSTOP_KERNEL:*:*) echo neo-tandem-nsk${UNAME_RELEASE} exit ;; NSE-*:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; i*86:AROS:*:*) echo ${UNAME_MACHINE}-pc-aros exit ;; x86_64:VMkernel:*:*) echo ${UNAME_MACHINE}-unknown-esx exit ;; esac eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: nco-4.5.4/autobld/config.sub000077500000000000000000001054121264355130400157260ustar00rootroot00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright 1992-2013 Free Software Foundation, Inc. timestamp='2013-10-01' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # 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 Exception is an additional permission under section 7 # of the GNU General Public License, version 3 ("GPLv3"). # Please send patches with a ChangeLog entry to config-patches@gnu.org. # # 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 1992-2013 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-musl* | 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*178) os=-lynxos178 ;; -lynx*5) os=-lynxos5 ;; -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 | arceb \ | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ | avr | avr32 \ | be32 | be64 \ | bfin \ | c4x | c8051 | 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 \ | k1om \ | le32 | le64 \ | lm32 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | microblazeel | 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 \ | mipsr5900 | mipsr5900el \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | moxie \ | mt \ | msp430 \ | nds32 | nds32le | nds32be \ | nios | nios2 | nios2eb | nios2el \ | ns16k | ns32k \ | open8 \ | or1k | 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 | nvptx | 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-* | arceb-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | be32-* | be64-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* \ | c8051-* | 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-* \ | k1om-* \ | le32-* | le64-* \ | lm32-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ | microblaze-* | microblazeel-* \ | 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-* \ | mipsr5900-* | mipsr5900el-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nds32-* | nds32le-* | nds32be-* \ | nios-* | nios2-* | nios2eb-* | nios2el-* \ | 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 ;; mingw64) basic_machine=x86_64-pc os=-mingw64 ;; mingw32) basic_machine=i686-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=i686-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 | rdos64) basic_machine=x86_64-pc os=-rdos ;; rdos32) 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* | -plan9* \ | -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* \ | -bitrig* | -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* | -mingw64* | -linux-gnu* | -linux-android* \ | -linux-newlib* | -linux-musl* | -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 ;; -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 ;; c8051-*) os=-elf ;; hexagon-*) os=-elf ;; 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 ;; or1k-*) 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: nco-4.5.4/autobld/depcomp000077500000000000000000000475561264355130400153360ustar00rootroot00000000000000#! /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: nco-4.5.4/autobld/install-sh000077500000000000000000000332561264355130400157550ustar00rootroot00000000000000#!/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: nco-4.5.4/autobld/ltmain.sh000066400000000000000000010520401264355130400155620ustar00rootroot00000000000000 # 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-1ubuntu1 # 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-1ubuntu1" 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 nco-4.5.4/autobld/missing000077500000000000000000000153311264355130400153420ustar00rootroot00000000000000#! /bin/sh # Common wrapper for a few potentially missing GNU programs. scriptversion=2012-06-26.16; # UTC # Copyright (C) 1996-2013 Free Software Foundation, Inc. # Originally written 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 case $1 in --is-lightweight) # Used by our autoconf macros to check whether the available missing # script is modern enough. exit 0 ;; --run) # Back-compat with the calling convention used by older automake. shift ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due to PROGRAM being missing or too old. Options: -h, --help display this help and exit -v, --version output version information and exit Supported PROGRAM values: aclocal autoconf autoheader autom4te automake makeinfo bison yacc flex lex help2man 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 # Run the given program, remember its exit status. "$@"; st=$? # If it succeeded, we are done. test $st -eq 0 && exit 0 # Also exit now if we it failed (or wasn't found), and '--version' was # passed; such an option is passed most likely to detect whether the # program is present and works. case $2 in --version|--help) exit $st;; esac # Exit code 63 means version mismatch. This often happens when the user # tries to use an ancient version of a tool on a file that requires a # minimum version. if test $st -eq 63; then msg="probably too old" elif test $st -eq 127; then # Program was missing. msg="missing on your system" else # Program was found and executed, but failed. Give up. exit $st fi perl_URL=http://www.perl.org/ flex_URL=http://flex.sourceforge.net/ gnu_software_URL=http://www.gnu.org/software program_details () { case $1 in aclocal|automake) echo "The '$1' program is part of the GNU Automake package:" echo "<$gnu_software_URL/automake>" echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/autoconf>" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; autoconf|autom4te|autoheader) echo "The '$1' program is part of the GNU Autoconf package:" echo "<$gnu_software_URL/autoconf/>" echo "It also requires GNU m4 and Perl in order to run:" echo "<$gnu_software_URL/m4/>" echo "<$perl_URL>" ;; esac } give_advice () { # Normalize program name to check for. normalized_program=`echo "$1" | sed ' s/^gnu-//; t s/^gnu//; t s/^g//; t'` printf '%s\n' "'$1' is $msg." configure_deps="'configure.ac' or m4 files included by 'configure.ac'" case $normalized_program in autoconf*) echo "You should only need it if you modified 'configure.ac'," echo "or m4 files included by it." program_details 'autoconf' ;; autoheader*) echo "You should only need it if you modified 'acconfig.h' or" echo "$configure_deps." program_details 'autoheader' ;; automake*) echo "You should only need it if you modified 'Makefile.am' or" echo "$configure_deps." program_details 'automake' ;; aclocal*) echo "You should only need it if you modified 'acinclude.m4' or" echo "$configure_deps." program_details 'aclocal' ;; autom4te*) echo "You might have modified some maintainer files that require" echo "the 'automa4te' program to be rebuilt." program_details 'autom4te' ;; bison*|yacc*) echo "You should only need it if you modified a '.y' file." echo "You may want to install the GNU Bison package:" echo "<$gnu_software_URL/bison/>" ;; lex*|flex*) echo "You should only need it if you modified a '.l' file." echo "You may want to install the Fast Lexical Analyzer package:" echo "<$flex_URL>" ;; help2man*) echo "You should only need it if you modified a dependency" \ "of a man page." echo "You may want to install the GNU Help2man package:" echo "<$gnu_software_URL/help2man/>" ;; makeinfo*) echo "You should only need it if you modified a '.texi' file, or" echo "any other file indirectly affecting the aspect of the manual." echo "You might want to install the Texinfo package:" echo "<$gnu_software_URL/texinfo/>" echo "The spurious makeinfo call might also be the consequence of" echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" echo "want to install GNU make:" echo "<$gnu_software_URL/make/>" ;; *) echo "You might have modified some files without having the proper" echo "tools for further handling them. Check the 'README' file, it" echo "often tells you about the needed prerequisites for installing" echo "this package. You may also peek at any GNU archive site, in" echo "case some other package contains this missing '$1' program." ;; esac } give_advice "$1" | sed -e '1s/^/WARNING: /' \ -e '2,$s/^/ /' >&2 # Propagate the correct exit status (expected to be 127 for a program # not found, 63 for a program that failed due to version mismatch). exit $st # 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: nco-4.5.4/autobld/mkinstalldirs000077500000000000000000000067221264355130400165550ustar00rootroot00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy scriptversion=2009-04-28.21; # UTC # Original author: Noah Friedman # Created: 1993-05-16 # Public domain. # # This file is maintained in Automake, please report # bugs to or send patches to # . nl=' ' IFS=" "" $nl" errstatus=0 dirmode= usage="\ Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... Create each directory DIR (with mode MODE, if specified), including all leading file name components. Report bugs to ." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" exit $? ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --version) echo "$0 $scriptversion" exit $? ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac # Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and # mkdir -p a/c at the same time, both will detect that a is missing, # one will create a, then the other will try to create a and die with # a "File exists" error. This is a problem when calling mkinstalldirs # from a parallel make. We use --version in the probe to restrict # ourselves to GNU mkdir, which is thread-safe. case $dirmode in '') if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" else # On NextStep and OpenStep, the `mkdir' command does not # recognize any option. It will interpret all options as # directories to create, and then abort because `.' already # exists. test -d ./-p && rmdir ./-p test -d ./--version && rmdir ./--version fi ;; *) if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && test ! -d ./--version; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" else # Clean up after NextStep and OpenStep mkdir. for d in ./-m ./-p ./--version "./$dirmode"; do test -d $d && rmdir $d done fi ;; esac for file do case $file in /*) pathcomp=/ ;; *) pathcomp= ;; esac oIFS=$IFS IFS=/ set fnord $file shift IFS=$oIFS for d do test "x$d" = x && continue pathcomp=$pathcomp$d case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr= chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp=$pathcomp/ done done exit $errstatus # 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: nco-4.5.4/autobld/test-driver000077500000000000000000000076111264355130400161430ustar00rootroot00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # UTC # Copyright (C) 2011-2013 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 # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then estatus=1 fi case $estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # 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: nco-4.5.4/autobld/texinfo.tex000066400000000000000000011721631264355130400161510ustar00rootroot00000000000000% texinfo.tex -- TeX macros to handle Texinfo files. % % Load plain if necessary, i.e., if running under initex. \expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi % \def\texinfoversion{2013-09-10.16} % % Copyright 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, % 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, % 2007, 2008, 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc. % % This texinfo.tex file is free software: you can redistribute it and/or % modify it under the terms of the GNU General Public License as % published by the Free Software Foundation, either version 3 of the % License, or (at your option) any later version. % % This texinfo.tex file is distributed in the hope that it will be % useful, but WITHOUT ANY WARRANTY; without even the implied warranty % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU % General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % As a special exception, when this file is read by TeX when processing % a Texinfo source document, you may use the result without % restriction. This Exception is an additional permission under section 7 % of the GNU General Public License, version 3 ("GPLv3"). % % Please try the latest version of texinfo.tex before submitting bug % reports; you can get the latest version from: % http://ftp.gnu.org/gnu/texinfo/ (the Texinfo release area), or % http://ftpmirror.gnu.org/texinfo/ (same, via a mirror), or % http://www.gnu.org/software/texinfo/ (the Texinfo home page) % The texinfo.tex in any given distribution could well be out % of date, so if that's what you're using, please check. % % Send bug reports to bug-texinfo@gnu.org. Please include including a % complete document in each bug report with which we can reproduce the % problem. Patches are, of course, greatly appreciated. % % To process a Texinfo manual with TeX, it's most reliable to use the % texi2dvi shell script that comes with the distribution. For a simple % manual foo.texi, however, you can get away with this: % tex foo.texi % texindex foo.?? % tex foo.texi % tex foo.texi % dvips foo.dvi -o # or whatever; this makes foo.ps. % The extra TeX runs get the cross-reference information correct. % Sometimes one run after texindex suffices, and sometimes you need more % than two; texi2dvi does it as many times as necessary. % % It is possible to adapt texinfo.tex for other languages, to some % extent. You can get the existing language-specific files from the % full Texinfo distribution. % % The GNU Texinfo home page is http://www.gnu.org/software/texinfo. \message{Loading texinfo [version \texinfoversion]:} % If in a .fmt file, print the version number % and turn on active characters that we couldn't do earlier because % they might have appeared in the input file name. \everyjob{\message{[Texinfo version \texinfoversion]}% \catcode`+=\active \catcode`\_=\active} \chardef\other=12 % We never want plain's \outer definition of \+ in Texinfo. % For @tex, we can use \tabalign. \let\+ = \relax % Save some plain tex macros whose names we will redefine. \let\ptexb=\b \let\ptexbullet=\bullet \let\ptexc=\c \let\ptexcomma=\, \let\ptexdot=\. \let\ptexdots=\dots \let\ptexend=\end \let\ptexequiv=\equiv \let\ptexexclam=\! \let\ptexfootnote=\footnote \let\ptexgtr=> \let\ptexhat=^ \let\ptexi=\i \let\ptexindent=\indent \let\ptexinsert=\insert \let\ptexlbrace=\{ \let\ptexless=< \let\ptexnewwrite\newwrite \let\ptexnoindent=\noindent \let\ptexplus=+ \let\ptexraggedright=\raggedright \let\ptexrbrace=\} \let\ptexslash=\/ \let\ptexstar=\* \let\ptext=\t \let\ptextop=\top {\catcode`\'=\active \global\let\ptexquoteright'}% active in plain's math mode % If this character appears in an error message or help string, it % starts a new line in the output. \newlinechar = `^^J % Use TeX 3.0's \inputlineno to get the line number, for better error % messages, but if we're using an old version of TeX, don't do anything. % \ifx\inputlineno\thisisundefined \let\linenumber = \empty % Pre-3.0. \else \def\linenumber{l.\the\inputlineno:\space} \fi % Set up fixed words for English if not already set. \ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi \ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi \ifx\putworderror\undefined \gdef\putworderror{error}\fi \ifx\putwordfile\undefined \gdef\putwordfile{file}\fi \ifx\putwordin\undefined \gdef\putwordin{in}\fi \ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi \ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi \ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi \ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi \ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi \ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi \ifx\putwordof\undefined \gdef\putwordof{of}\fi \ifx\putwordon\undefined \gdef\putwordon{on}\fi \ifx\putwordpage\undefined \gdef\putwordpage{page}\fi \ifx\putwordsection\undefined \gdef\putwordsection{section}\fi \ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi \ifx\putwordsee\undefined \gdef\putwordsee{see}\fi \ifx\putwordSee\undefined \gdef\putwordSee{See}\fi \ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi \ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi % \ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi \ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi \ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi \ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi \ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi \ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi \ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi \ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi \ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi \ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi \ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi \ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi % \ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi \ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi \ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi \ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi \ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi % Since the category of space is not known, we have to be careful. \chardef\spacecat = 10 \def\spaceisspace{\catcode`\ =\spacecat} % sometimes characters are active, so we need control sequences. \chardef\ampChar = `\& \chardef\colonChar = `\: \chardef\commaChar = `\, \chardef\dashChar = `\- \chardef\dotChar = `\. \chardef\exclamChar= `\! \chardef\hashChar = `\# \chardef\lquoteChar= `\` \chardef\questChar = `\? \chardef\rquoteChar= `\' \chardef\semiChar = `\; \chardef\slashChar = `\/ \chardef\underChar = `\_ % Ignore a token. % \def\gobble#1{} % The following is used inside several \edef's. \def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} % Hyphenation fixes. \hyphenation{ Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script ap-pen-dix bit-map bit-maps data-base data-bases eshell fall-ing half-way long-est man-u-script man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces spell-ing spell-ings stand-alone strong-est time-stamp time-stamps which-ever white-space wide-spread wrap-around } % Margin to add to right of even pages, to left of odd pages. \newdimen\bindingoffset \newdimen\normaloffset \newdimen\pagewidth \newdimen\pageheight % For a final copy, take out the rectangles % that mark overfull boxes (in case you have decided % that the text looks ok even though it passes the margin). % \def\finalout{\overfullrule=0pt } % Sometimes it is convenient to have everything in the transcript file % and nothing on the terminal. We don't just call \tracingall here, % since that produces some useless output on the terminal. We also make % some effort to order the tracing commands to reduce output in the log % file; cf. trace.sty in LaTeX. % \def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% \def\loggingall{% \tracingstats2 \tracingpages1 \tracinglostchars2 % 2 gives us more in etex \tracingparagraphs1 \tracingoutput1 \tracingmacros2 \tracingrestores1 \showboxbreadth\maxdimen \showboxdepth\maxdimen \ifx\eTeXversion\thisisundefined\else % etex gives us more logging \tracingscantokens1 \tracingifs1 \tracinggroups1 \tracingnesting2 \tracingassigns1 \fi \tracingcommands3 % 3 gives us more in etex \errorcontextlines16 }% % @errormsg{MSG}. Do the index-like expansions on MSG, but if things % aren't perfect, it's not the end of the world, being an error message, % after all. % \def\errormsg{\begingroup \indexnofonts \doerrormsg} \def\doerrormsg#1{\errmessage{#1}} % add check for \lastpenalty to plain's definitions. If the last thing % we did was a \nobreak, we don't want to insert more space. % \def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount \removelastskip\penalty-50\smallskip\fi\fi} \def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount \removelastskip\penalty-100\medskip\fi\fi} \def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount \removelastskip\penalty-200\bigskip\fi\fi} % Do @cropmarks to get crop marks. % \newif\ifcropmarks \let\cropmarks = \cropmarkstrue % % Dimensions to add cropmarks at corners. % Added by P. A. MacKay, 12 Nov. 1986 % \newdimen\outerhsize \newdimen\outervsize % set by the paper size routines \newdimen\cornerlong \cornerlong=1pc \newdimen\cornerthick \cornerthick=.3pt \newdimen\topandbottommargin \topandbottommargin=.75in % Output a mark which sets \thischapter, \thissection and \thiscolor. % We dump everything together because we only have one kind of mark. % This works because we only use \botmark / \topmark, not \firstmark. % % A mark contains a subexpression of the \ifcase ... \fi construct. % \get*marks macros below extract the needed part using \ifcase. % % Another complication is to let the user choose whether \thischapter % (\thissection) refers to the chapter (section) in effect at the top % of a page, or that at the bottom of a page. The solution is % described on page 260 of The TeXbook. It involves outputting two % marks for the sectioning macros, one before the section break, and % one after. I won't pretend I can describe this better than DEK... \def\domark{% \toks0=\expandafter{\lastchapterdefs}% \toks2=\expandafter{\lastsectiondefs}% \toks4=\expandafter{\prevchapterdefs}% \toks6=\expandafter{\prevsectiondefs}% \toks8=\expandafter{\lastcolordefs}% \mark{% \the\toks0 \the\toks2 % 0: top marks (\last...) \noexpand\or \the\toks4 \the\toks6 % 1: bottom marks (default, \prev...) \noexpand\else \the\toks8 % 2: color marks }% } % \topmark doesn't work for the very first chapter (after the title % page or the contents), so we use \firstmark there -- this gets us % the mark with the chapter defs, unless the user sneaks in, e.g., % @setcolor (or @url, or @link, etc.) between @contents and the very % first @chapter. \def\gettopheadingmarks{% \ifcase0\topmark\fi \ifx\thischapter\empty \ifcase0\firstmark\fi \fi } \def\getbottomheadingmarks{\ifcase1\botmark\fi} \def\getcolormarks{\ifcase2\topmark\fi} % Avoid "undefined control sequence" errors. \def\lastchapterdefs{} \def\lastsectiondefs{} \def\prevchapterdefs{} \def\prevsectiondefs{} \def\lastcolordefs{} % Main output routine. \chardef\PAGE = 255 \output = {\onepageout{\pagecontents\PAGE}} \newbox\headlinebox \newbox\footlinebox % \onepageout takes a vbox as an argument. Note that \pagecontents % does insertions, but you have to call it yourself. \def\onepageout#1{% \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi % \ifodd\pageno \advance\hoffset by \bindingoffset \else \advance\hoffset by -\bindingoffset\fi % % Do this outside of the \shipout so @code etc. will be expanded in % the headline as they should be, not taken literally (outputting ''code). \def\commmonheadfootline{\let\hsize=\pagewidth \texinfochars} % \ifodd\pageno \getoddheadingmarks \else \getevenheadingmarks \fi \global\setbox\headlinebox = \vbox{\commmonheadfootline \makeheadline}% % \ifodd\pageno \getoddfootingmarks \else \getevenfootingmarks \fi \global\setbox\footlinebox = \vbox{\commmonheadfootline \makefootline}% % {% % Have to do this stuff outside the \shipout because we want it to % take effect in \write's, yet the group defined by the \vbox ends % before the \shipout runs. % \indexdummies % don't expand commands in the output. \normalturnoffactive % \ in index entries must not stay \, e.g., if % the page break happens to be in the middle of an example. % We don't want .vr (or whatever) entries like this: % \entry{{\tt \indexbackslash }acronym}{32}{\code {\acronym}} % "\acronym" won't work when it's read back in; % it needs to be % {\code {{\tt \backslashcurfont }acronym} \shipout\vbox{% % Do this early so pdf references go to the beginning of the page. \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi % \ifcropmarks \vbox to \outervsize\bgroup \hsize = \outerhsize \vskip-\topandbottommargin \vtop to0pt{% \line{\ewtop\hfil\ewtop}% \nointerlineskip \line{% \vbox{\moveleft\cornerthick\nstop}% \hfill \vbox{\moveright\cornerthick\nstop}% }% \vss}% \vskip\topandbottommargin \line\bgroup \hfil % center the page within the outer (page) hsize. \ifodd\pageno\hskip\bindingoffset\fi \vbox\bgroup \fi % \unvbox\headlinebox \pagebody{#1}% \ifdim\ht\footlinebox > 0pt % Only leave this space if the footline is nonempty. % (We lessened \vsize for it in \oddfootingyyy.) % The \baselineskip=24pt in plain's \makefootline has no effect. \vskip 24pt \unvbox\footlinebox \fi % \ifcropmarks \egroup % end of \vbox\bgroup \hfil\egroup % end of (centering) \line\bgroup \vskip\topandbottommargin plus1fill minus1fill \boxmaxdepth = \cornerthick \vbox to0pt{\vss \line{% \vbox{\moveleft\cornerthick\nsbot}% \hfill \vbox{\moveright\cornerthick\nsbot}% }% \nointerlineskip \line{\ewbot\hfil\ewbot}% }% \egroup % \vbox from first cropmarks clause \fi }% end of \shipout\vbox }% end of group with \indexdummies \advancepageno \ifnum\outputpenalty>-20000 \else\dosupereject\fi } \newinsert\margin \dimen\margin=\maxdimen \def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} {\catcode`\@ =11 \gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi % marginal hacks, juha@viisa.uucp (Juha Takala) \ifvoid\margin\else % marginal info is present \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi \dimen@=\dp#1\relax \unvbox#1\relax \ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi \ifr@ggedbottom \kern-\dimen@ \vfil \fi} } % Here are the rules for the cropmarks. Note that they are % offset so that the space between them is truly \outerhsize or \outervsize % (P. A. MacKay, 12 November, 1986) % \def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} \def\nstop{\vbox {\hrule height\cornerthick depth\cornerlong width\cornerthick}} \def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} \def\nsbot{\vbox {\hrule height\cornerlong depth\cornerthick width\cornerthick}} % Parse an argument, then pass it to #1. The argument is the rest of % the input line (except we remove a trailing comment). #1 should be a % macro which expects an ordinary undelimited TeX argument. % \def\parsearg{\parseargusing{}} \def\parseargusing#1#2{% \def\argtorun{#2}% \begingroup \obeylines \spaceisspace #1% \parseargline\empty% Insert the \empty token, see \finishparsearg below. } {\obeylines % \gdef\parseargline#1^^M{% \endgroup % End of the group started in \parsearg. \argremovecomment #1\comment\ArgTerm% }% } % First remove any @comment, then any @c comment. \def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} \def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} % Each occurrence of `\^^M' or `\^^M' is replaced by a single space. % % \argremovec might leave us with trailing space, e.g., % @end itemize @c foo % This space token undergoes the same procedure and is eventually removed % by \finishparsearg. % \def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} \def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} \def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% \def\temp{#3}% \ifx\temp\empty % Do not use \next, perhaps the caller of \parsearg uses it; reuse \temp: \let\temp\finishparsearg \else \let\temp\argcheckspaces \fi % Put the space token in: \temp#1 #3\ArgTerm } % If a _delimited_ argument is enclosed in braces, they get stripped; so % to get _exactly_ the rest of the line, we had to prevent such situation. % We prepended an \empty token at the very beginning and we expand it now, % just before passing the control to \argtorun. % (Similarly, we have to think about #3 of \argcheckspacesY above: it is % either the null string, or it ends with \^^M---thus there is no danger % that a pair of braces would be stripped. % % But first, we have to remove the trailing space token. % \def\finishparsearg#1 \ArgTerm{\expandafter\argtorun\expandafter{#1}} % \parseargdef\foo{...} % is roughly equivalent to % \def\foo{\parsearg\Xfoo} % \def\Xfoo#1{...} % % Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my % favourite TeX trick. --kasal, 16nov03 \def\parseargdef#1{% \expandafter \doparseargdef \csname\string#1\endcsname #1% } \def\doparseargdef#1#2{% \def#2{\parsearg#1}% \def#1##1% } % Several utility definitions with active space: { \obeyspaces \gdef\obeyedspace{ } % Make each space character in the input produce a normal interword % space in the output. Don't allow a line break at this space, as this % is used only in environments like @example, where each line of input % should produce a line of output anyway. % \gdef\sepspaces{\obeyspaces\let =\tie} % If an index command is used in an @example environment, any spaces % therein should become regular spaces in the raw index file, not the % expansion of \tie (\leavevmode \penalty \@M \ ). \gdef\unsepspaces{\let =\space} } \def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} % Define the framework for environments in texinfo.tex. It's used like this: % % \envdef\foo{...} % \def\Efoo{...} % % It's the responsibility of \envdef to insert \begingroup before the % actual body; @end closes the group after calling \Efoo. \envdef also % defines \thisenv, so the current environment is known; @end checks % whether the environment name matches. The \checkenv macro can also be % used to check whether the current environment is the one expected. % % Non-false conditionals (@iftex, @ifset) don't fit into this, so they % are not treated as environments; they don't open a group. (The % implementation of @end takes care not to call \endgroup in this % special case.) % At run-time, environments start with this: \def\startenvironment#1{\begingroup\def\thisenv{#1}} % initialize \let\thisenv\empty % ... but they get defined via ``\envdef\foo{...}'': \long\def\envdef#1#2{\def#1{\startenvironment#1#2}} \def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} % Check whether we're in the right environment: \def\checkenv#1{% \def\temp{#1}% \ifx\thisenv\temp \else \badenverr \fi } % Environment mismatch, #1 expected: \def\badenverr{% \errhelp = \EMsimple \errmessage{This command can appear only \inenvironment\temp, not \inenvironment\thisenv}% } \def\inenvironment#1{% \ifx#1\empty outside of any environment% \else in environment \expandafter\string#1% \fi } % @end foo executes the definition of \Efoo. % But first, it executes a specialized version of \checkenv % \parseargdef\end{% \if 1\csname iscond.#1\endcsname \else % The general wording of \badenverr may not be ideal. \expandafter\checkenv\csname#1\endcsname \csname E#1\endcsname \endgroup \fi } \newhelp\EMsimple{Press RETURN to continue.} % Be sure we're in horizontal mode when doing a tie, since we make space % equivalent to this in @example-like environments. Otherwise, a space % at the beginning of a line will start with \penalty -- and % since \penalty is valid in vertical mode, we'd end up putting the % penalty on the vertical list instead of in the new paragraph. {\catcode`@ = 11 % Avoid using \@M directly, because that causes trouble % if the definition is written into an index file. \global\let\tiepenalty = \@M \gdef\tie{\leavevmode\penalty\tiepenalty\ } } % @: forces normal size whitespace following. \def\:{\spacefactor=1000 } % @* forces a line break. \def\*{\unskip\hfil\break\hbox{}\ignorespaces} % @/ allows a line break. \let\/=\allowbreak % @. is an end-of-sentence period. \def\.{.\spacefactor=\endofsentencespacefactor\space} % @! is an end-of-sentence bang. \def\!{!\spacefactor=\endofsentencespacefactor\space} % @? is an end-of-sentence query. \def\?{?\spacefactor=\endofsentencespacefactor\space} % @frenchspacing on|off says whether to put extra space after punctuation. % \def\onword{on} \def\offword{off} % \parseargdef\frenchspacing{% \def\temp{#1}% \ifx\temp\onword \plainfrenchspacing \else\ifx\temp\offword \plainnonfrenchspacing \else \errhelp = \EMsimple \errmessage{Unknown @frenchspacing option `\temp', must be on|off}% \fi\fi } % @w prevents a word break. Without the \leavevmode, @w at the % beginning of a paragraph, when TeX is still in vertical mode, would % produce a whole line of output instead of starting the paragraph. \def\w#1{\leavevmode\hbox{#1}} % @group ... @end group forces ... to be all on one page, by enclosing % it in a TeX vbox. We use \vtop instead of \vbox to construct the box % to keep its height that of a normal line. According to the rules for % \topskip (p.114 of the TeXbook), the glue inserted is % max (\topskip - \ht (first item), 0). If that height is large, % therefore, no glue is inserted, and the space between the headline and % the text is small, which looks bad. % % Another complication is that the group might be very large. This can % cause the glue on the previous page to be unduly stretched, because it % does not have much material. In this case, it's better to add an % explicit \vfill so that the extra space is at the bottom. The % threshold for doing this is if the group is more than \vfilllimit % percent of a page (\vfilllimit can be changed inside of @tex). % \newbox\groupbox \def\vfilllimit{0.7} % \envdef\group{% \ifnum\catcode`\^^M=\active \else \errhelp = \groupinvalidhelp \errmessage{@group invalid in context where filling is enabled}% \fi \startsavinginserts % \setbox\groupbox = \vtop\bgroup % Do @comment since we are called inside an environment such as % @example, where each end-of-line in the input causes an % end-of-line in the output. We don't want the end-of-line after % the `@group' to put extra space in the output. Since @group % should appear on a line by itself (according to the Texinfo % manual), we don't worry about eating any user text. \comment } % % The \vtop produces a box with normal height and large depth; thus, TeX puts % \baselineskip glue before it, and (when the next line of text is done) % \lineskip glue after it. Thus, space below is not quite equal to space % above. But it's pretty close. \def\Egroup{% % To get correct interline space between the last line of the group % and the first line afterwards, we have to propagate \prevdepth. \endgraf % Not \par, as it may have been set to \lisppar. \global\dimen1 = \prevdepth \egroup % End the \vtop. % \dimen0 is the vertical size of the group's box. \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox % \dimen2 is how much space is left on the page (more or less). \dimen2 = \pageheight \advance\dimen2 by -\pagetotal % if the group doesn't fit on the current page, and it's a big big % group, force a page break. \ifdim \dimen0 > \dimen2 \ifdim \pagetotal < \vfilllimit\pageheight \page \fi \fi \box\groupbox \prevdepth = \dimen1 \checkinserts } % % TeX puts in an \escapechar (i.e., `@') at the beginning of the help % message, so this ends up printing `@group can only ...'. % \newhelp\groupinvalidhelp{% group can only be used in environments such as @example,^^J% where each line of input produces a line of output.} % @need space-in-mils % forces a page break if there is not space-in-mils remaining. \newdimen\mil \mil=0.001in \parseargdef\need{% % Ensure vertical mode, so we don't make a big box in the middle of a % paragraph. \par % % If the @need value is less than one line space, it's useless. \dimen0 = #1\mil \dimen2 = \ht\strutbox \advance\dimen2 by \dp\strutbox \ifdim\dimen0 > \dimen2 % % Do a \strut just to make the height of this box be normal, so the % normal leading is inserted relative to the preceding line. % And a page break here is fine. \vtop to #1\mil{\strut\vfil}% % % TeX does not even consider page breaks if a penalty added to the % main vertical list is 10000 or more. But in order to see if the % empty box we just added fits on the page, we must make it consider % page breaks. On the other hand, we don't want to actually break the % page after the empty box. So we use a penalty of 9999. % % There is an extremely small chance that TeX will actually break the % page at this \penalty, if there are no other feasible breakpoints in % sight. (If the user is using lots of big @group commands, which % almost-but-not-quite fill up a page, TeX will have a hard time doing % good page breaking, for example.) However, I could not construct an % example where a page broke at this \penalty; if it happens in a real % document, then we can reconsider our strategy. \penalty9999 % % Back up by the size of the box, whether we did a page break or not. \kern -#1\mil % % Do not allow a page break right after this kern. \nobreak \fi } % @br forces paragraph break (and is undocumented). \let\br = \par % @page forces the start of a new page. % \def\page{\par\vfill\supereject} % @exdent text.... % outputs text on separate line in roman font, starting at standard page margin % This records the amount of indent in the innermost environment. % That's how much \exdent should take out. \newskip\exdentamount % This defn is used inside fill environments such as @defun. \parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} % This defn is used inside nofill environments such as @example. \parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount \leftline{\hskip\leftskip{\rm#1}}}} % @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current % paragraph. For more general purposes, use the \margin insertion % class. WHICH is `l' or `r'. Not documented, written for gawk manual. % \newskip\inmarginspacing \inmarginspacing=1cm \def\strutdepth{\dp\strutbox} % \def\doinmargin#1#2{\strut\vadjust{% \nobreak \kern-\strutdepth \vtop to \strutdepth{% \baselineskip=\strutdepth \vss % if you have multiple lines of stuff to put here, you'll need to % make the vbox yourself of the appropriate size. \ifx#1l% \llap{\ignorespaces #2\hskip\inmarginspacing}% \else \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% \fi \null }% }} \def\inleftmargin{\doinmargin l} \def\inrightmargin{\doinmargin r} % % @inmargin{TEXT [, RIGHT-TEXT]} % (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; % else use TEXT for both). % \def\inmargin#1{\parseinmargin #1,,\finish} \def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \def\lefttext{#1}% have both texts \def\righttext{#2}% \else \def\lefttext{#1}% have only one text \def\righttext{#1}% \fi % \ifodd\pageno \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin \else \def\temp{\inleftmargin\lefttext}% \fi \temp } % @| inserts a changebar to the left of the current line. It should % surround any changed text. This approach does *not* work if the % change spans more than two lines of output. To handle that, we would % have adopt a much more difficult approach (putting marks into the main % vertical list for the beginning and end of each change). This command % is not documented, not supported, and doesn't work. % \def\|{% % \vadjust can only be used in horizontal mode. \leavevmode % % Append this vertical mode material after the current line in the output. \vadjust{% % We want to insert a rule with the height and depth of the current % leading; that is exactly what \strutbox is supposed to record. \vskip-\baselineskip % % \vadjust-items are inserted at the left edge of the type. So % the \llap here moves out into the left-hand margin. \llap{% % % For a thicker or thinner bar, change the `1pt'. \vrule height\baselineskip width1pt % % This is the space between the bar and the text. \hskip 12pt }% }% } % @include FILE -- \input text of FILE. % \def\include{\parseargusing\filenamecatcodes\includezzz} \def\includezzz#1{% \pushthisfilestack \def\thisfile{#1}% {% \makevalueexpandable % we want to expand any @value in FILE. \turnoffactive % and allow special characters in the expansion \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @include of #1^^J}% \edef\temp{\noexpand\input #1 }% % % This trickery is to read FILE outside of a group, in case it makes % definitions, etc. \expandafter }\temp \popthisfilestack } \def\filenamecatcodes{% \catcode`\\=\other \catcode`~=\other \catcode`^=\other \catcode`_=\other \catcode`|=\other \catcode`<=\other \catcode`>=\other \catcode`+=\other \catcode`-=\other \catcode`\`=\other \catcode`\'=\other } \def\pushthisfilestack{% \expandafter\pushthisfilestackX\popthisfilestack\StackTerm } \def\pushthisfilestackX{% \expandafter\pushthisfilestackY\thisfile\StackTerm } \def\pushthisfilestackY #1\StackTerm #2\StackTerm {% \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% } \def\popthisfilestack{\errthisfilestackempty} \def\errthisfilestackempty{\errmessage{Internal error: the stack of filenames is empty.}} % \def\thisfile{} % @center line % outputs that line, centered. % \parseargdef\center{% \ifhmode \let\centersub\centerH \else \let\centersub\centerV \fi \centersub{\hfil \ignorespaces#1\unskip \hfil}% \let\centersub\relax % don't let the definition persist, just in case } \def\centerH#1{{% \hfil\break \advance\hsize by -\leftskip \advance\hsize by -\rightskip \line{#1}% \break }} % \newcount\centerpenalty \def\centerV#1{% % The idea here is the same as in \startdefun, \cartouche, etc.: if % @center is the first thing after a section heading, we need to wipe % out the negative parskip inserted by \sectionheading, but still % prevent a page break here. \centerpenalty = \lastpenalty \ifnum\centerpenalty>10000 \vskip\parskip \fi \ifnum\centerpenalty>9999 \penalty\centerpenalty \fi \line{\kern\leftskip #1\kern\rightskip}% } % @sp n outputs n lines of vertical space % \parseargdef\sp{\vskip #1\baselineskip} % @comment ...line which is ignored... % @c is the same as @comment % @ignore ... @end ignore is another way to write a comment % \def\comment{\begingroup \catcode`\^^M=\other% \catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% \commentxxx} {\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} % \let\c=\comment % @paragraphindent NCHARS % We'll use ems for NCHARS, close enough. % NCHARS can also be the word `asis' or `none'. % We cannot feasibly implement @paragraphindent asis, though. % \def\asisword{asis} % no translation, these are keywords \def\noneword{none} % \parseargdef\paragraphindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \defaultparindent = 0pt \else \defaultparindent = #1em \fi \fi \parindent = \defaultparindent } % @exampleindent NCHARS % We'll use ems for NCHARS like @paragraphindent. % It seems @exampleindent asis isn't necessary, but % I preserve it to make it similar to @paragraphindent. \parseargdef\exampleindent{% \def\temp{#1}% \ifx\temp\asisword \else \ifx\temp\noneword \lispnarrowing = 0pt \else \lispnarrowing = #1em \fi \fi } % @firstparagraphindent WORD % If WORD is `none', then suppress indentation of the first paragraph % after a section heading. If WORD is `insert', then do indent at such % paragraphs. % % The paragraph indentation is suppressed or not by calling % \suppressfirstparagraphindent, which the sectioning commands do. % We switch the definition of this back and forth according to WORD. % By default, we suppress indentation. % \def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} \def\insertword{insert} % \parseargdef\firstparagraphindent{% \def\temp{#1}% \ifx\temp\noneword \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent \else\ifx\temp\insertword \let\suppressfirstparagraphindent = \relax \else \errhelp = \EMsimple \errmessage{Unknown @firstparagraphindent option `\temp'}% \fi\fi } % Here is how we actually suppress indentation. Redefine \everypar to % \kern backwards by \parindent, and then reset itself to empty. % % We also make \indent itself not actually do anything until the next % paragraph. % \gdef\dosuppressfirstparagraphindent{% \gdef\indent{% \restorefirstparagraphindent \indent }% \gdef\noindent{% \restorefirstparagraphindent \noindent }% \global\everypar = {% \kern -\parindent \restorefirstparagraphindent }% } \gdef\restorefirstparagraphindent{% \global \let \indent = \ptexindent \global \let \noindent = \ptexnoindent \global \everypar = {}% } % @refill is a no-op. \let\refill=\relax % If working on a large document in chapters, it is convenient to % be able to disable indexing, cross-referencing, and contents, for test runs. % This is done with @novalidate (before @setfilename). % \newif\iflinks \linkstrue % by default we want the aux files. \let\novalidate = \linksfalse % @setfilename is done at the beginning of every texinfo file. % So open here the files we need to have open while reading the input. % This makes it possible to make a .fmt file for texinfo. \def\setfilename{% \fixbackslash % Turn off hack to swallow `\input texinfo'. \iflinks \tryauxfile % Open the new aux file. TeX will close it automatically at exit. \immediate\openout\auxfile=\jobname.aux \fi % \openindices needs to do some work in any case. \openindices \let\setfilename=\comment % Ignore extra @setfilename cmds. % % If texinfo.cnf is present on the system, read it. % Useful for site-wide @afourpaper, etc. \openin 1 texinfo.cnf \ifeof 1 \else \input texinfo.cnf \fi \closein 1 % \comment % Ignore the actual filename. } % Called from \setfilename. % \def\openindices{% \newindex{cp}% \newcodeindex{fn}% \newcodeindex{vr}% \newcodeindex{tp}% \newcodeindex{ky}% \newcodeindex{pg}% } % @bye. \outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} \message{pdf,} % adobe `portable' document format \newcount\tempnum \newcount\lnkcount \newtoks\filename \newcount\filenamelength \newcount\pgn \newtoks\toksA \newtoks\toksB \newtoks\toksC \newtoks\toksD \newbox\boxA \newcount\countA \newif\ifpdf \newif\ifpdfmakepagedest % when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 % can be set). So we test for \relax and 0 as well as being undefined. \ifx\pdfoutput\thisisundefined \else \ifx\pdfoutput\relax \else \ifcase\pdfoutput \else \pdftrue \fi \fi \fi % PDF uses PostScript string constants for the names of xref targets, % for display in the outlines, and in other places. Thus, we have to % double any backslashes. Otherwise, a name like "\node" will be % interpreted as a newline (\n), followed by o, d, e. Not good. % % See http://www.ntg.nl/pipermail/ntg-pdftex/2004-July/000654.html and % related messages. The final outcome is that it is up to the TeX user % to double the backslashes and otherwise make the string valid, so % that's what we do. pdftex 1.30.0 (ca.2005) introduced a primitive to % do this reliably, so we use it. % #1 is a control sequence in which to do the replacements, % which we \xdef. \def\txiescapepdf#1{% \ifx\pdfescapestring\thisisundefined % No primitive available; should we give a warning or log? % Many times it won't matter. \else % The expandable \pdfescapestring primitive escapes parentheses, % backslashes, and other special chars. \xdef#1{\pdfescapestring{#1}}% \fi } \newhelp\nopdfimagehelp{Texinfo supports .png, .jpg, .jpeg, and .pdf images with PDF output, and none of those formats could be found. (.eps cannot be supported due to the design of the PDF format; use regular TeX (DVI output) for that.)} \ifpdf % % Color manipulation macros based on pdfcolor.tex, % except using rgb instead of cmyk; the latter is said to render as a % very dark gray on-screen and a very dark halftone in print, instead % of actual black. \def\rgbDarkRed{0.50 0.09 0.12} \def\rgbBlack{0 0 0} % % k sets the color for filling (usual text, etc.); % K sets the color for stroking (thin rules, e.g., normal _'s). \def\pdfsetcolor#1{\pdfliteral{#1 rg #1 RG}} % % Set color, and create a mark which defines \thiscolor accordingly, % so that \makeheadline knows which color to restore. \def\setcolor#1{% \xdef\lastcolordefs{\gdef\noexpand\thiscolor{#1}}% \domark \pdfsetcolor{#1}% } % \def\maincolor{\rgbBlack} \pdfsetcolor{\maincolor} \edef\thiscolor{\maincolor} \def\lastcolordefs{} % \def\makefootline{% \baselineskip24pt \line{\pdfsetcolor{\maincolor}\the\footline}% } % \def\makeheadline{% \vbox to 0pt{% \vskip-22.5pt \line{% \vbox to8.5pt{}% % Extract \thiscolor definition from the marks. \getcolormarks % Typeset the headline with \maincolor, then restore the color. \pdfsetcolor{\maincolor}\the\headline\pdfsetcolor{\thiscolor}% }% \vss }% \nointerlineskip } % % \pdfcatalog{/PageMode /UseOutlines} % % #1 is image name, #2 width (might be empty/whitespace), #3 height (ditto). \def\dopdfimage#1#2#3{% \def\pdfimagewidth{#2}\setbox0 = \hbox{\ignorespaces #2}% \def\pdfimageheight{#3}\setbox2 = \hbox{\ignorespaces #3}% % % pdftex (and the PDF format) support .pdf, .png, .jpg (among % others). Let's try in that order, PDF first since if % someone has a scalable image, presumably better to use that than a % bitmap. \let\pdfimgext=\empty \begingroup \openin 1 #1.pdf \ifeof 1 \openin 1 #1.PDF \ifeof 1 \openin 1 #1.png \ifeof 1 \openin 1 #1.jpg \ifeof 1 \openin 1 #1.jpeg \ifeof 1 \openin 1 #1.JPG \ifeof 1 \errhelp = \nopdfimagehelp \errmessage{Could not find image file #1 for pdf}% \else \gdef\pdfimgext{JPG}% \fi \else \gdef\pdfimgext{jpeg}% \fi \else \gdef\pdfimgext{jpg}% \fi \else \gdef\pdfimgext{png}% \fi \else \gdef\pdfimgext{PDF}% \fi \else \gdef\pdfimgext{pdf}% \fi \closein 1 \endgroup % % without \immediate, ancient pdftex seg faults when the same image is % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) \ifnum\pdftexversion < 14 \immediate\pdfimage \else \immediate\pdfximage \fi \ifdim \wd0 >0pt width \pdfimagewidth \fi \ifdim \wd2 >0pt height \pdfimageheight \fi \ifnum\pdftexversion<13 #1.\pdfimgext \else {#1.\pdfimgext}% \fi \ifnum\pdftexversion < 14 \else \pdfrefximage \pdflastximage \fi} % \def\pdfmkdest#1{{% % We have to set dummies so commands such as @code, and characters % such as \, aren't expanded when present in a section title. \indexnofonts \turnoffactive \makevalueexpandable \def\pdfdestname{#1}% \txiescapepdf\pdfdestname \safewhatsit{\pdfdest name{\pdfdestname} xyz}% }} % % used to mark target names; must be expandable. \def\pdfmkpgn#1{#1} % % by default, use a color that is dark enough to print on paper as % nearly black, but still distinguishable for online viewing. \def\urlcolor{\rgbDarkRed} \def\linkcolor{\rgbDarkRed} \def\endlink{\setcolor{\maincolor}\pdfendlink} % % Adding outlines to PDF; macros for calculating structure of outlines % come from Petr Olsak \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% \else \csname#1\endcsname \fi} \def\advancenumber#1{\tempnum=\expnumber{#1}\relax \advance\tempnum by 1 \expandafter\xdef\csname#1\endcsname{\the\tempnum}} % % #1 is the section text, which is what will be displayed in the % outline by the pdf viewer. #2 is the pdf expression for the number % of subentries (or empty, for subsubsections). #3 is the node text, % which might be empty if this toc entry had no corresponding node. % #4 is the page number % \def\dopdfoutline#1#2#3#4{% % Generate a link to the node text if that exists; else, use the % page number. We could generate a destination for the section % text in the case where a section has no node, but it doesn't % seem worth the trouble, since most documents are normally structured. \edef\pdfoutlinedest{#3}% \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}% \else \txiescapepdf\pdfoutlinedest \fi % % Also escape PDF chars in the display string. \edef\pdfoutlinetext{#1}% \txiescapepdf\pdfoutlinetext % \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{\pdfoutlinetext}% } % \def\pdfmakeoutlines{% \begingroup % Read toc silently, to get counts of subentries for \pdfoutline. \def\partentry##1##2##3##4{}% ignore parts in the outlines \def\numchapentry##1##2##3##4{% \def\thischapnum{##2}% \def\thissecnum{0}% \def\thissubsecnum{0}% }% \def\numsecentry##1##2##3##4{% \advancenumber{chap\thischapnum}% \def\thissecnum{##2}% \def\thissubsecnum{0}% }% \def\numsubsecentry##1##2##3##4{% \advancenumber{sec\thissecnum}% \def\thissubsecnum{##2}% }% \def\numsubsubsecentry##1##2##3##4{% \advancenumber{subsec\thissubsecnum}% }% \def\thischapnum{0}% \def\thissecnum{0}% \def\thissubsecnum{0}% % % use \def rather than \let here because we redefine \chapentry et % al. a second time, below. \def\appentry{\numchapentry}% \def\appsecentry{\numsecentry}% \def\appsubsecentry{\numsubsecentry}% \def\appsubsubsecentry{\numsubsubsecentry}% \def\unnchapentry{\numchapentry}% \def\unnsecentry{\numsecentry}% \def\unnsubsecentry{\numsubsecentry}% \def\unnsubsubsecentry{\numsubsubsecentry}% \readdatafile{toc}% % % Read toc second time, this time actually producing the outlines. % The `-' means take the \expnumber as the absolute number of % subentries, which we calculated on our first read of the .toc above. % % We use the node names as the destinations. \def\numchapentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% \def\numsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% \def\numsubsecentry##1##2##3##4{% \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% \def\numsubsubsecentry##1##2##3##4{% count is always zero \dopdfoutline{##1}{}{##3}{##4}}% % % PDF outlines are displayed using system fonts, instead of % document fonts. Therefore we cannot use special characters, % since the encoding is unknown. For example, the eogonek from % Latin 2 (0xea) gets translated to a | character. Info from % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. % % TODO this right, we have to translate 8-bit characters to % their "best" equivalent, based on the @documentencoding. Too % much work for too little return. Just use the ASCII equivalents % we use for the index sort strings. % \indexnofonts \setupdatafile % We can have normal brace characters in the PDF outlines, unlike % Texinfo index files. So set that up. \def\{{\lbracecharliteral}% \def\}{\rbracecharliteral}% \catcode`\\=\active \otherbackslash \input \tocreadfilename \endgroup } {\catcode`[=1 \catcode`]=2 \catcode`{=\other \catcode`}=\other \gdef\lbracecharliteral[{]% \gdef\rbracecharliteral[}]% ] % \def\skipspaces#1{\def\PP{#1}\def\D{|}% \ifx\PP\D\let\nextsp\relax \else\let\nextsp\skipspaces \addtokens{\filename}{\PP}% \advance\filenamelength by 1 \fi \nextsp} \def\getfilename#1{% \filenamelength=0 % If we don't expand the argument now, \skipspaces will get % snagged on things like "@value{foo}". \edef\temp{#1}% \expandafter\skipspaces\temp|\relax } \ifnum\pdftexversion < 14 \let \startlink \pdfannotlink \else \let \startlink \pdfstartlink \fi % make a live url in pdf output. \def\pdfurl#1{% \begingroup % it seems we really need yet another set of dummies; have not % tried to figure out what each command should do in the context % of @url. for now, just make @/ a no-op, that's the only one % people have actually reported a problem with. % \normalturnoffactive \def\@{@}% \let\/=\empty \makevalueexpandable % do we want to go so far as to use \indexnofonts instead of just % special-casing \var here? \def\var##1{##1}% % \leavevmode\setcolor{\urlcolor}% \startlink attr{/Border [0 0 0]}% user{/Subtype /Link /A << /S /URI /URI (#1) >>}% \endgroup} \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} \def\maketoks{% \expandafter\poptoks\the\toksA|ENDTOKS|\relax \ifx\first0\adn0 \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 \else \ifnum0=\countA\else\makelink\fi \ifx\first.\let\next=\done\else \let\next=\maketoks \addtokens{\toksB}{\the\toksD} \ifx\first,\addtokens{\toksB}{\space}\fi \fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next} \def\makelink{\addtokens{\toksB}% {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} \def\pdflink#1{% \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} \setcolor{\linkcolor}#1\endlink} \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} \else % non-pdf mode \let\pdfmkdest = \gobble \let\pdfurl = \gobble \let\endlink = \relax \let\setcolor = \gobble \let\pdfsetcolor = \gobble \let\pdfmakeoutlines = \relax \fi % \ifx\pdfoutput \message{fonts,} % Change the current font style to #1, remembering it in \curfontstyle. % For now, we do not accumulate font styles: @b{@i{foo}} prints foo in % italics, not bold italics. % \def\setfontstyle#1{% \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. \csname ten#1\endcsname % change the current font } % Select #1 fonts with the current style. % \def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} \def\rm{\fam=0 \setfontstyle{rm}} \def\it{\fam=\itfam \setfontstyle{it}} \def\sl{\fam=\slfam \setfontstyle{sl}} \def\bf{\fam=\bffam \setfontstyle{bf}}\def\bfstylename{bf} \def\tt{\fam=\ttfam \setfontstyle{tt}} % Unfortunately, we have to override this for titles and the like, since % in those cases "rm" is bold. Sigh. \def\rmisbold{\rm\def\curfontstyle{bf}} % Texinfo sort of supports the sans serif font style, which plain TeX does not. % So we set up a \sf. \newfam\sffam \def\sf{\fam=\sffam \setfontstyle{sf}} \let\li = \sf % Sometimes we call it \li, not \sf. % We don't need math for this font style. \def\ttsl{\setfontstyle{ttsl}} % Set the baselineskip to #1, and the lineskip and strut size % correspondingly. There is no deep meaning behind these magic numbers % used as factors; they just match (closely enough) what Knuth defined. % \def\lineskipfactor{.08333} \def\strutheightpercent{.70833} \def\strutdepthpercent {.29167} % % can get a sort of poor man's double spacing by redefining this. \def\baselinefactor{1} % \newdimen\textleading \def\setleading#1{% \dimen0 = #1\relax \normalbaselineskip = \baselinefactor\dimen0 \normallineskip = \lineskipfactor\normalbaselineskip \normalbaselines \setbox\strutbox =\hbox{% \vrule width0pt height\strutheightpercent\baselineskip depth \strutdepthpercent \baselineskip }% } % PDF CMaps. See also LaTeX's t1.cmap. % % do nothing with this by default. \expandafter\let\csname cmapOT1\endcsname\gobble \expandafter\let\csname cmapOT1IT\endcsname\gobble \expandafter\let\csname cmapOT1TT\endcsname\gobble % if we are producing pdf, and we have \pdffontattr, then define cmaps. % (\pdffontattr was introduced many years ago, but people still run % older pdftex's; it's easy to conditionalize, so we do.) \ifpdf \ifx\pdffontattr\thisisundefined \else \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1-0) %%Title: (TeX-OT1-0 TeX OT1 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1) /Supplement 0 >> def /CMapName /TeX-OT1-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <23> <26> <0023> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 40 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1IT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1IT-0) %%Title: (TeX-OT1IT-0 TeX OT1IT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1IT) /Supplement 0 >> def /CMapName /TeX-OT1IT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 8 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <25> <26> <0025> <28> <3B> <0028> <3F> <5B> <003F> <5D> <5E> <005D> <61> <7A> <0061> <7B> <7C> <2013> endbfrange 42 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <00660066> <0C> <00660069> <0D> <0066006C> <0E> <006600660069> <0F> <00660066006C> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <21> <0021> <22> <201D> <23> <0023> <24> <00A3> <27> <2019> <3C> <00A1> <3D> <003D> <3E> <00BF> <5C> <201C> <5F> <02D9> <60> <2018> <7D> <02DD> <7E> <007E> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1IT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% % % \cmapOT1TT \begingroup \catcode`\^^M=\active \def^^M{^^J}% Output line endings as the ^^J char. \catcode`\%=12 \immediate\pdfobj stream {%!PS-Adobe-3.0 Resource-CMap %%DocumentNeededResources: ProcSet (CIDInit) %%IncludeResource: ProcSet (CIDInit) %%BeginResource: CMap (TeX-OT1TT-0) %%Title: (TeX-OT1TT-0 TeX OT1TT 0) %%Version: 1.000 %%EndComments /CIDInit /ProcSet findresource begin 12 dict begin begincmap /CIDSystemInfo << /Registry (TeX) /Ordering (OT1TT) /Supplement 0 >> def /CMapName /TeX-OT1TT-0 def /CMapType 2 def 1 begincodespacerange <00> <7F> endcodespacerange 5 beginbfrange <00> <01> <0393> <09> <0A> <03A8> <21> <26> <0021> <28> <5F> <0028> <61> <7E> <0061> endbfrange 32 beginbfchar <02> <0398> <03> <039B> <04> <039E> <05> <03A0> <06> <03A3> <07> <03D2> <08> <03A6> <0B> <2191> <0C> <2193> <0D> <0027> <0E> <00A1> <0F> <00BF> <10> <0131> <11> <0237> <12> <0060> <13> <00B4> <14> <02C7> <15> <02D8> <16> <00AF> <17> <02DA> <18> <00B8> <19> <00DF> <1A> <00E6> <1B> <0153> <1C> <00F8> <1D> <00C6> <1E> <0152> <1F> <00D8> <20> <2423> <27> <2019> <60> <2018> <7F> <00A8> endbfchar endcmap CMapName currentdict /CMap defineresource pop end end %%EndResource %%EOF }\endgroup \expandafter\edef\csname cmapOT1TT\endcsname#1{% \pdffontattr#1{/ToUnicode \the\pdflastobj\space 0 R}% }% \fi\fi % Set the font macro #1 to the font named \fontprefix#2. % #3 is the font's design size, #4 is a scale factor, #5 is the CMap % encoding (only OT1, OT1IT and OT1TT are allowed, or empty to omit). % Example: % #1 = \textrm % #2 = \rmshape % #3 = 10 % #4 = \mainmagstep % #5 = OT1 % \def\setfont#1#2#3#4#5{% \font#1=\fontprefix#2#3 scaled #4 \csname cmap#5\endcsname#1% } % This is what gets called when #5 of \setfont is empty. \let\cmap\gobble % % (end of cmaps) % Use cm as the default font prefix. % To specify the font prefix, you must define \fontprefix % before you read in texinfo.tex. \ifx\fontprefix\thisisundefined \def\fontprefix{cm} \fi % Support font families that don't use the same naming scheme as CM. \def\rmshape{r} \def\rmbshape{bx} % where the normal face is bold \def\bfshape{b} \def\bxshape{bx} \def\ttshape{tt} \def\ttbshape{tt} \def\ttslshape{sltt} \def\itshape{ti} \def\itbshape{bxti} \def\slshape{sl} \def\slbshape{bxsl} \def\sfshape{ss} \def\sfbshape{ss} \def\scshape{csc} \def\scbshape{csc} % Definitions for a main text size of 11pt. (The default in Texinfo.) % \def\definetextfontsizexi{% % Text fonts (11.2pt, magstep1). \def\textnominalsize{11pt} \edef\mainmagstep{\magstephalf} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1095} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstep1}{OT1} \setfont\deftt\ttshape{10}{\magstep1}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstep1}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter (and unnumbered) fonts (17.28pt). \def\chapnominalsize{17pt} \setfont\chaprm\rmbshape{12}{\magstep2}{OT1} \setfont\chapit\itbshape{10}{\magstep3}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep3}{OT1} \setfont\chaptt\ttbshape{12}{\magstep2}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep3}{OT1TT} \setfont\chapsf\sfbshape{17}{1000}{OT1} \let\chapbf=\chaprm \setfont\chapsc\scbshape{10}{\magstep3}{OT1} \font\chapi=cmmi12 scaled \magstep2 \font\chapsy=cmsy10 scaled \magstep3 \def\chapecsize{1728} % Section fonts (14.4pt). \def\secnominalsize{14pt} \setfont\secrm\rmbshape{12}{\magstep1}{OT1} \setfont\secit\itbshape{10}{\magstep2}{OT1IT} \setfont\secsl\slbshape{10}{\magstep2}{OT1} \setfont\sectt\ttbshape{12}{\magstep1}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\secsf\sfbshape{12}{\magstep1}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep2}{OT1} \font\seci=cmmi12 scaled \magstep1 \font\secsy=cmsy10 scaled \magstep2 \def\sececsize{1440} % Subsection fonts (13.15pt). \def\ssecnominalsize{13pt} \setfont\ssecrm\rmbshape{12}{\magstephalf}{OT1} \setfont\ssecit\itbshape{10}{1315}{OT1IT} \setfont\ssecsl\slbshape{10}{1315}{OT1} \setfont\ssectt\ttbshape{12}{\magstephalf}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1315}{OT1TT} \setfont\ssecsf\sfbshape{12}{\magstephalf}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1315}{OT1} \font\sseci=cmmi12 scaled \magstephalf \font\ssecsy=cmsy10 scaled 1315 \def\ssececsize{1200} % Reduced fonts for @acro in text (10pt). \def\reducednominalsize{10pt} \setfont\reducedrm\rmshape{10}{1000}{OT1} \setfont\reducedtt\ttshape{10}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{1000}{OT1} \setfont\reducedit\itshape{10}{1000}{OT1IT} \setfont\reducedsl\slshape{10}{1000}{OT1} \setfont\reducedsf\sfshape{10}{1000}{OT1} \setfont\reducedsc\scshape{10}{1000}{OT1} \setfont\reducedttsl\ttslshape{10}{1000}{OT1TT} \font\reducedi=cmmi10 \font\reducedsy=cmsy10 \def\reducedecsize{1000} \textleading = 13.2pt % line spacing for 11pt CM \textfonts % reset the current fonts \rm } % end of 11pt text font size definitions, \definetextfontsizexi % Definitions to make the main text be 10pt Computer Modern, with % section, chapter, etc., sizes following suit. This is for the GNU % Press printing of the Emacs 22 manual. Maybe other manuals in the % future. Used with @smallbook, which sets the leading to 12pt. % \def\definetextfontsizex{% % Text fonts (10pt). \def\textnominalsize{10pt} \edef\mainmagstep{1000} \setfont\textrm\rmshape{10}{\mainmagstep}{OT1} \setfont\texttt\ttshape{10}{\mainmagstep}{OT1TT} \setfont\textbf\bfshape{10}{\mainmagstep}{OT1} \setfont\textit\itshape{10}{\mainmagstep}{OT1IT} \setfont\textsl\slshape{10}{\mainmagstep}{OT1} \setfont\textsf\sfshape{10}{\mainmagstep}{OT1} \setfont\textsc\scshape{10}{\mainmagstep}{OT1} \setfont\textttsl\ttslshape{10}{\mainmagstep}{OT1TT} \font\texti=cmmi10 scaled \mainmagstep \font\textsy=cmsy10 scaled \mainmagstep \def\textecsize{1000} % A few fonts for @defun names and args. \setfont\defbf\bfshape{10}{\magstephalf}{OT1} \setfont\deftt\ttshape{10}{\magstephalf}{OT1TT} \setfont\defttsl\ttslshape{10}{\magstephalf}{OT1TT} \def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} % Fonts for indices, footnotes, small examples (9pt). \def\smallnominalsize{9pt} \setfont\smallrm\rmshape{9}{1000}{OT1} \setfont\smalltt\ttshape{9}{1000}{OT1TT} \setfont\smallbf\bfshape{10}{900}{OT1} \setfont\smallit\itshape{9}{1000}{OT1IT} \setfont\smallsl\slshape{9}{1000}{OT1} \setfont\smallsf\sfshape{9}{1000}{OT1} \setfont\smallsc\scshape{10}{900}{OT1} \setfont\smallttsl\ttslshape{10}{900}{OT1TT} \font\smalli=cmmi9 \font\smallsy=cmsy9 \def\smallecsize{0900} % Fonts for small examples (8pt). \def\smallernominalsize{8pt} \setfont\smallerrm\rmshape{8}{1000}{OT1} \setfont\smallertt\ttshape{8}{1000}{OT1TT} \setfont\smallerbf\bfshape{10}{800}{OT1} \setfont\smallerit\itshape{8}{1000}{OT1IT} \setfont\smallersl\slshape{8}{1000}{OT1} \setfont\smallersf\sfshape{8}{1000}{OT1} \setfont\smallersc\scshape{10}{800}{OT1} \setfont\smallerttsl\ttslshape{10}{800}{OT1TT} \font\smalleri=cmmi8 \font\smallersy=cmsy8 \def\smallerecsize{0800} % Fonts for title page (20.4pt): \def\titlenominalsize{20pt} \setfont\titlerm\rmbshape{12}{\magstep3}{OT1} \setfont\titleit\itbshape{10}{\magstep4}{OT1IT} \setfont\titlesl\slbshape{10}{\magstep4}{OT1} \setfont\titlett\ttbshape{12}{\magstep3}{OT1TT} \setfont\titlettsl\ttslshape{10}{\magstep4}{OT1TT} \setfont\titlesf\sfbshape{17}{\magstep1}{OT1} \let\titlebf=\titlerm \setfont\titlesc\scbshape{10}{\magstep4}{OT1} \font\titlei=cmmi12 scaled \magstep3 \font\titlesy=cmsy10 scaled \magstep4 \def\titleecsize{2074} % Chapter fonts (14.4pt). \def\chapnominalsize{14pt} \setfont\chaprm\rmbshape{12}{\magstep1}{OT1} \setfont\chapit\itbshape{10}{\magstep2}{OT1IT} \setfont\chapsl\slbshape{10}{\magstep2}{OT1} \setfont\chaptt\ttbshape{12}{\magstep1}{OT1TT} \setfont\chapttsl\ttslshape{10}{\magstep2}{OT1TT} \setfont\chapsf\sfbshape{12}{\magstep1}{OT1} \let\chapbf\chaprm \setfont\chapsc\scbshape{10}{\magstep2}{OT1} \font\chapi=cmmi12 scaled \magstep1 \font\chapsy=cmsy10 scaled \magstep2 \def\chapecsize{1440} % Section fonts (12pt). \def\secnominalsize{12pt} \setfont\secrm\rmbshape{12}{1000}{OT1} \setfont\secit\itbshape{10}{\magstep1}{OT1IT} \setfont\secsl\slbshape{10}{\magstep1}{OT1} \setfont\sectt\ttbshape{12}{1000}{OT1TT} \setfont\secttsl\ttslshape{10}{\magstep1}{OT1TT} \setfont\secsf\sfbshape{12}{1000}{OT1} \let\secbf\secrm \setfont\secsc\scbshape{10}{\magstep1}{OT1} \font\seci=cmmi12 \font\secsy=cmsy10 scaled \magstep1 \def\sececsize{1200} % Subsection fonts (10pt). \def\ssecnominalsize{10pt} \setfont\ssecrm\rmbshape{10}{1000}{OT1} \setfont\ssecit\itbshape{10}{1000}{OT1IT} \setfont\ssecsl\slbshape{10}{1000}{OT1} \setfont\ssectt\ttbshape{10}{1000}{OT1TT} \setfont\ssecttsl\ttslshape{10}{1000}{OT1TT} \setfont\ssecsf\sfbshape{10}{1000}{OT1} \let\ssecbf\ssecrm \setfont\ssecsc\scbshape{10}{1000}{OT1} \font\sseci=cmmi10 \font\ssecsy=cmsy10 \def\ssececsize{1000} % Reduced fonts for @acro in text (9pt). \def\reducednominalsize{9pt} \setfont\reducedrm\rmshape{9}{1000}{OT1} \setfont\reducedtt\ttshape{9}{1000}{OT1TT} \setfont\reducedbf\bfshape{10}{900}{OT1} \setfont\reducedit\itshape{9}{1000}{OT1IT} \setfont\reducedsl\slshape{9}{1000}{OT1} \setfont\reducedsf\sfshape{9}{1000}{OT1} \setfont\reducedsc\scshape{10}{900}{OT1} \setfont\reducedttsl\ttslshape{10}{900}{OT1TT} \font\reducedi=cmmi9 \font\reducedsy=cmsy9 \def\reducedecsize{0900} \divide\parskip by 2 % reduce space between paragraphs \textleading = 12pt % line spacing for 10pt CM \textfonts % reset the current fonts \rm } % end of 10pt text font size definitions, \definetextfontsizex % We provide the user-level command % @fonttextsize 10 % (or 11) to redefine the text font size. pt is assumed. % \def\xiword{11} \def\xword{10} \def\xwordpt{10pt} % \parseargdef\fonttextsize{% \def\textsizearg{#1}% %\wlog{doing @fonttextsize \textsizearg}% % % Set \globaldefs so that documents can use this inside @tex, since % makeinfo 4.8 does not support it, but we need it nonetheless. % \begingroup \globaldefs=1 \ifx\textsizearg\xword \definetextfontsizex \else \ifx\textsizearg\xiword \definetextfontsizexi \else \errhelp=\EMsimple \errmessage{@fonttextsize only supports `10' or `11', not `\textsizearg'} \fi\fi \endgroup } % In order for the font changes to affect most math symbols and letters, % we have to define the \textfont of the standard families. Since % texinfo doesn't allow for producing subscripts and superscripts except % in the main text, we don't bother to reset \scriptfont and % \scriptscriptfont (which would also require loading a lot more fonts). % \def\resetmathfonts{% \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf \textfont\ttfam=\tentt \textfont\sffam=\tensf } % The font-changing commands redefine the meanings of \tenSTYLE, instead % of just \STYLE. We do this because \STYLE needs to also set the % current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire % \tenSTYLE to set the current font. % % Each font-changing command also sets the names \lsize (one size lower) % and \lllsize (three sizes lower). These relative commands are used in % the LaTeX logo and acronyms. % % This all needs generalizing, badly. % \def\textfonts{% \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy \let\tenttsl=\textttsl \def\curfontsize{text}% \def\lsize{reduced}\def\lllsize{smaller}% \resetmathfonts \setleading{\textleading}} \def\titlefonts{% \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy \let\tenttsl=\titlettsl \def\curfontsize{title}% \def\lsize{chap}\def\lllsize{subsec}% \resetmathfonts \setleading{27pt}} \def\titlefont#1{{\titlefonts\rmisbold #1}} \def\chapfonts{% \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl \def\curfontsize{chap}% \def\lsize{sec}\def\lllsize{text}% \resetmathfonts \setleading{19pt}} \def\secfonts{% \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy \let\tenttsl=\secttsl \def\curfontsize{sec}% \def\lsize{subsec}\def\lllsize{reduced}% \resetmathfonts \setleading{16pt}} \def\subsecfonts{% \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy \let\tenttsl=\ssecttsl \def\curfontsize{ssec}% \def\lsize{text}\def\lllsize{small}% \resetmathfonts \setleading{15pt}} \let\subsubsecfonts = \subsecfonts \def\reducedfonts{% \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy \let\tenttsl=\reducedttsl \def\curfontsize{reduced}% \def\lsize{small}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallfonts{% \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy \let\tenttsl=\smallttsl \def\curfontsize{small}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{10.5pt}} \def\smallerfonts{% \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy \let\tenttsl=\smallerttsl \def\curfontsize{smaller}% \def\lsize{smaller}\def\lllsize{smaller}% \resetmathfonts \setleading{9.5pt}} % Fonts for short table of contents. \setfont\shortcontrm\rmshape{12}{1000}{OT1} \setfont\shortcontbf\bfshape{10}{\magstep1}{OT1} % no cmb12 \setfont\shortcontsl\slshape{12}{1000}{OT1} \setfont\shortconttt\ttshape{12}{1000}{OT1TT} % Define these just so they can be easily changed for other fonts. \def\angleleft{$\langle$} \def\angleright{$\rangle$} % Set the fonts to use with the @small... environments. \let\smallexamplefonts = \smallfonts % About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample % can fit this many characters: % 8.5x11=86 smallbook=72 a4=90 a5=69 % If we use \scriptfonts (8pt), then we can fit this many characters: % 8.5x11=90+ smallbook=80 a4=90+ a5=77 % For me, subjectively, the few extra characters that fit aren't worth % the additional smallness of 8pt. So I'm making the default 9pt. % % By the way, for comparison, here's what fits with @example (10pt): % 8.5x11=71 smallbook=60 a4=75 a5=58 % --karl, 24jan03. % Set up the default fonts, so we can use them for creating boxes. % \definetextfontsizexi \message{markup,} % Check if we are currently using a typewriter font. Since all the % Computer Modern typewriter fonts have zero interword stretch (and % shrink), and it is reasonable to expect all typewriter fonts to have % this property, we can check that font parameter. % \def\ifmonospace{\ifdim\fontdimen3\font=0pt } % Markup style infrastructure. \defmarkupstylesetup\INITMACRO will % define and register \INITMACRO to be called on markup style changes. % \INITMACRO can check \currentmarkupstyle for the innermost % style and the set of \ifmarkupSTYLE switches for all styles % currently in effect. \newif\ifmarkupvar \newif\ifmarkupsamp \newif\ifmarkupkey %\newif\ifmarkupfile % @file == @samp. %\newif\ifmarkupoption % @option == @samp. \newif\ifmarkupcode \newif\ifmarkupkbd %\newif\ifmarkupenv % @env == @code. %\newif\ifmarkupcommand % @command == @code. \newif\ifmarkuptex % @tex (and part of @math, for now). \newif\ifmarkupexample \newif\ifmarkupverb \newif\ifmarkupverbatim \let\currentmarkupstyle\empty \def\setupmarkupstyle#1{% \csname markup#1true\endcsname \def\currentmarkupstyle{#1}% \markupstylesetup } \let\markupstylesetup\empty \def\defmarkupstylesetup#1{% \expandafter\def\expandafter\markupstylesetup \expandafter{\markupstylesetup #1}% \def#1% } % Markup style setup for left and right quotes. \defmarkupstylesetup\markupsetuplq{% \expandafter\let\expandafter \temp \csname markupsetuplq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuplqdefault \else \temp \fi } \defmarkupstylesetup\markupsetuprq{% \expandafter\let\expandafter \temp \csname markupsetuprq\currentmarkupstyle\endcsname \ifx\temp\relax \markupsetuprqdefault \else \temp \fi } { \catcode`\'=\active \catcode`\`=\active \gdef\markupsetuplqdefault{\let`\lq} \gdef\markupsetuprqdefault{\let'\rq} \gdef\markupsetcodequoteleft{\let`\codequoteleft} \gdef\markupsetcodequoteright{\let'\codequoteright} } \let\markupsetuplqcode \markupsetcodequoteleft \let\markupsetuprqcode \markupsetcodequoteright % \let\markupsetuplqexample \markupsetcodequoteleft \let\markupsetuprqexample \markupsetcodequoteright % \let\markupsetuplqkbd \markupsetcodequoteleft \let\markupsetuprqkbd \markupsetcodequoteright % \let\markupsetuplqsamp \markupsetcodequoteleft \let\markupsetuprqsamp \markupsetcodequoteright % \let\markupsetuplqverb \markupsetcodequoteleft \let\markupsetuprqverb \markupsetcodequoteright % \let\markupsetuplqverbatim \markupsetcodequoteleft \let\markupsetuprqverbatim \markupsetcodequoteright % Allow an option to not use regular directed right quote/apostrophe % (char 0x27), but instead the undirected quote from cmtt (char 0x0d). % The undirected quote is ugly, so don't make it the default, but it % works for pasting with more pdf viewers (at least evince), the % lilypond developers report. xpdf does work with the regular 0x27. % \def\codequoteright{% \expandafter\ifx\csname SETtxicodequoteundirected\endcsname\relax \expandafter\ifx\csname SETcodequoteundirected\endcsname\relax '% \else \char'15 \fi \else \char'15 \fi } % % and a similar option for the left quote char vs. a grave accent. % Modern fonts display ASCII 0x60 as a grave accent, so some people like % the code environments to do likewise. % \def\codequoteleft{% \expandafter\ifx\csname SETtxicodequotebacktick\endcsname\relax \expandafter\ifx\csname SETcodequotebacktick\endcsname\relax % [Knuth] pp. 380,381,391 % \relax disables Spanish ligatures ?` and !` of \tt font. \relax`% \else \char'22 \fi \else \char'22 \fi } % Commands to set the quote options. % \parseargdef\codequoteundirected{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequoteundirected\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequoteundirected\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequoteundirected value `\temp', must be on|off}% \fi\fi } % \parseargdef\codequotebacktick{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxicodequotebacktick\endcsname = t% \else\ifx\temp\offword \expandafter\let\csname SETtxicodequotebacktick\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @codequotebacktick value `\temp', must be on|off}% \fi\fi } % [Knuth] pp. 380,381,391, disable Spanish ligatures ?` and !` of \tt font. \def\noligaturesquoteleft{\relax\lq} % Count depth in font-changes, for error checks \newcount\fontdepth \fontdepth=0 % Font commands. % #1 is the font command (\sl or \it), #2 is the text to slant. % If we are in a monospaced environment, however, 1) always use \ttsl, % and 2) do not add an italic correction. \def\dosmartslant#1#2{% \ifusingtt {{\ttsl #2}\let\next=\relax}% {\def\next{{#1#2}\futurelet\next\smartitaliccorrection}}% \next } \def\smartslanted{\dosmartslant\sl} \def\smartitalic{\dosmartslant\it} % Output an italic correction unless \next (presumed to be the following % character) is such as not to need one. \def\smartitaliccorrection{% \ifx\next,% \else\ifx\next-% \else\ifx\next.% \else\ifx\next\.% \else\ifx\next\comma% \else\ptexslash \fi\fi\fi\fi\fi \aftersmartic } % Unconditional use \ttsl, and no ic. @var is set to this for defuns. \def\ttslanted#1{{\ttsl #1}} % @cite is like \smartslanted except unconditionally use \sl. We never want % ttsl for book titles, do we? \def\cite#1{{\sl #1}\futurelet\next\smartitaliccorrection} \def\aftersmartic{} \def\var#1{% \let\saveaftersmartic = \aftersmartic \def\aftersmartic{\null\let\aftersmartic=\saveaftersmartic}% \smartslanted{#1}% } \let\i=\smartitalic \let\slanted=\smartslanted \let\dfn=\smartslanted \let\emph=\smartitalic % Explicit font changes: @r, @sc, undocumented @ii. \def\r#1{{\rm #1}} % roman font \def\sc#1{{\smallcaps#1}} % smallcaps font \def\ii#1{{\it #1}} % italic font % @b, explicit bold. Also @strong. \def\b#1{{\bf #1}} \let\strong=\b % @sansserif, explicit sans. \def\sansserif#1{{\sf #1}} % We can't just use \exhyphenpenalty, because that only has effect at % the end of a paragraph. Restore normal hyphenation at the end of the % group within which \nohyphenation is presumably called. % \def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} \def\restorehyphenation{\hyphenchar\font = `- } % Set sfcode to normal for the chars that usually have another value. % Can't use plain's \frenchspacing because it uses the `\x notation, and % sometimes \x has an active definition that messes things up. % \catcode`@=11 \def\plainfrenchspacing{% \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m \def\endofsentencespacefactor{1000}% for @. and friends } \def\plainnonfrenchspacing{% \sfcode`\.3000\sfcode`\?3000\sfcode`\!3000 \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 \def\endofsentencespacefactor{3000}% for @. and friends } \catcode`@=\other \def\endofsentencespacefactor{3000}% default % @t, explicit typewriter. \def\t#1{% {\tt \rawbackslash \plainfrenchspacing #1}% \null } % @samp. \def\samp#1{{\setupmarkupstyle{samp}\lq\tclose{#1}\rq\null}} % @indicateurl is \samp, that is, with quotes. \let\indicateurl=\samp % @code (and similar) prints in typewriter, but with spaces the same % size as normal in the surrounding text, without hyphenation, etc. % This is a subroutine for that. \def\tclose#1{% {% % Change normal interword space to be same as for the current font. \spaceskip = \fontdimen2\font % % Switch to typewriter. \tt % % But `\ ' produces the large typewriter interword space. \def\ {{\spaceskip = 0pt{} }}% % % Turn off hyphenation. \nohyphenation % \rawbackslash \plainfrenchspacing #1% }% \null % reset spacefactor to 1000 } % We *must* turn on hyphenation at `-' and `_' in @code. % (But see \codedashfinish below.) % Otherwise, it is too hard to avoid overfull hboxes % in the Emacs manual, the Library manual, etc. % % Unfortunately, TeX uses one parameter (\hyphenchar) to control % both hyphenation at - and hyphenation within words. % We must therefore turn them both off (\tclose does that) % and arrange explicitly to hyphenate at a dash. -- rms. { \catcode`\-=\active \catcode`\_=\active \catcode`\'=\active \catcode`\`=\active \global\let'=\rq \global\let`=\lq % default definitions % \global\def\code{\begingroup \setupmarkupstyle{code}% % The following should really be moved into \setupmarkupstyle handlers. \catcode\dashChar=\active \catcode\underChar=\active \ifallowcodebreaks \let-\codedash \let_\codeunder \else \let-\normaldash \let_\realunder \fi % Given -foo (with a single dash), we do not want to allow a break % after the hyphen. \global\let\codedashprev=\codedash % \codex } % \gdef\codedash{\futurelet\next\codedashfinish} \gdef\codedashfinish{% \normaldash % always output the dash character itself. % % Now, output a discretionary to allow a line break, unless % (a) the next character is a -, or % (b) the preceding character is a -. % E.g., given --posix, we do not want to allow a break after either -. % Given --foo-bar, we do want to allow a break between the - and the b. \ifx\next\codedash \else \ifx\codedashprev\codedash \else \discretionary{}{}{}\fi \fi % we need the space after the = for the case when \next itself is a % space token; it would get swallowed otherwise. As in @code{- a}. \global\let\codedashprev= \next } } \def\normaldash{-} % \def\codex #1{\tclose{#1}\endgroup} \def\codeunder{% % this is all so @math{@code{var_name}+1} can work. In math mode, _ % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) % will therefore expand the active definition of _, which is us % (inside @code that is), therefore an endless loop. \ifusingtt{\ifmmode \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. \else\normalunderscore \fi \discretionary{}{}{}}% {\_}% } % An additional complication: the above will allow breaks after, e.g., % each of the four underscores in __typeof__. This is bad. % @allowcodebreaks provides a document-level way to turn breaking at - % and _ on and off. % \newif\ifallowcodebreaks \allowcodebreakstrue \def\keywordtrue{true} \def\keywordfalse{false} \parseargdef\allowcodebreaks{% \def\txiarg{#1}% \ifx\txiarg\keywordtrue \allowcodebreakstrue \else\ifx\txiarg\keywordfalse \allowcodebreaksfalse \else \errhelp = \EMsimple \errmessage{Unknown @allowcodebreaks option `\txiarg', must be true|false}% \fi\fi } % For @command, @env, @file, @option quotes seem unnecessary, % so use \code rather than \samp. \let\command=\code \let\env=\code \let\file=\code \let\option=\code % @uref (abbreviation for `urlref') takes an optional (comma-separated) % second argument specifying the text to display and an optional third % arg as text to display instead of (rather than in addition to) the url % itself. First (mandatory) arg is the url. % (This \urefnobreak definition isn't used now, leaving it for a while % for comparison.) \def\urefnobreak#1{\dourefnobreak #1,,,\finish} \def\dourefnobreak#1,#2,#3,#4\finish{\begingroup \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url \fi \else \code{#1}% only url given, so show it \fi \fi \endlink \endgroup} % This \urefbreak definition is the active one. \def\urefbreak{\begingroup \urefcatcodes \dourefbreak} \let\uref=\urefbreak \def\dourefbreak#1{\urefbreakfinish #1,,,\finish} \def\urefbreakfinish#1,#2,#3,#4\finish{% doesn't work in @example \unsepspaces \pdfurl{#1}% \setbox0 = \hbox{\ignorespaces #3}% \ifdim\wd0 > 0pt \unhbox0 % third arg given, show only that \else \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0 > 0pt \ifpdf \unhbox0 % PDF: 2nd arg given, show only it \else \unhbox0\ (\urefcode{#1})% DVI: 2nd arg given, show both it and url \fi \else \urefcode{#1}% only url given, so show it \fi \fi \endlink \endgroup} % Allow line breaks around only a few characters (only). \def\urefcatcodes{% \catcode\ampChar=\active \catcode\dotChar=\active \catcode\hashChar=\active \catcode\questChar=\active \catcode\slashChar=\active } { \urefcatcodes % \global\def\urefcode{\begingroup \setupmarkupstyle{code}% \urefcatcodes \let&\urefcodeamp \let.\urefcodedot \let#\urefcodehash \let?\urefcodequest \let/\urefcodeslash \codex } % % By default, they are just regular characters. \global\def&{\normalamp} \global\def.{\normaldot} \global\def#{\normalhash} \global\def?{\normalquest} \global\def/{\normalslash} } % we put a little stretch before and after the breakable chars, to help % line breaking of long url's. The unequal skips make look better in % cmtt at least, especially for dots. \def\urefprestretch{\urefprebreak \hskip0pt plus.13em } \def\urefpoststretch{\urefpostbreak \hskip0pt plus.1em } % \def\urefcodeamp{\urefprestretch \&\urefpoststretch} \def\urefcodedot{\urefprestretch .\urefpoststretch} \def\urefcodehash{\urefprestretch \#\urefpoststretch} \def\urefcodequest{\urefprestretch ?\urefpoststretch} \def\urefcodeslash{\futurelet\next\urefcodeslashfinish} { \catcode`\/=\active \global\def\urefcodeslashfinish{% \urefprestretch \slashChar % Allow line break only after the final / in a sequence of % slashes, to avoid line break between the slashes in http://. \ifx\next/\else \urefpoststretch \fi } } % One more complication: by default we'll break after the special % characters, but some people like to break before the special chars, so % allow that. Also allow no breaking at all, for manual control. % \parseargdef\urefbreakstyle{% \def\txiarg{#1}% \ifx\txiarg\wordnone \def\urefprebreak{\nobreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordbefore \def\urefprebreak{\allowbreak}\def\urefpostbreak{\nobreak} \else\ifx\txiarg\wordafter \def\urefprebreak{\nobreak}\def\urefpostbreak{\allowbreak} \else \errhelp = \EMsimple \errmessage{Unknown @urefbreakstyle setting `\txiarg'}% \fi\fi\fi } \def\wordafter{after} \def\wordbefore{before} \def\wordnone{none} \urefbreakstyle after % @url synonym for @uref, since that's how everyone uses it. % \let\url=\uref % rms does not like angle brackets --karl, 17may97. % So now @email is just like @uref, unless we are pdf. % %\def\email#1{\angleleft{\tt #1}\angleright} \ifpdf \def\email#1{\doemail#1,,\finish} \def\doemail#1,#2,#3\finish{\begingroup \unsepspaces \pdfurl{mailto:#1}% \setbox0 = \hbox{\ignorespaces #2}% \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi \endlink \endgroup} \else \let\email=\uref \fi % @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), % `example' (@kbd uses ttsl only inside of @example and friends), % or `code' (@kbd uses normal tty font always). \parseargdef\kbdinputstyle{% \def\txiarg{#1}% \ifx\txiarg\worddistinct \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% \else\ifx\txiarg\wordexample \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% \else\ifx\txiarg\wordcode \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% \else \errhelp = \EMsimple \errmessage{Unknown @kbdinputstyle setting `\txiarg'}% \fi\fi\fi } \def\worddistinct{distinct} \def\wordexample{example} \def\wordcode{code} % Default is `distinct'. \kbdinputstyle distinct % @kbd is like @code, except that if the argument is just one @key command, % then @kbd has no effect. \def\kbd#1{{\def\look{#1}\expandafter\kbdsub\look??\par}} \def\xkey{\key} \def\kbdsub#1#2#3\par{% \def\one{#1}\def\three{#3}\def\threex{??}% \ifx\one\xkey\ifx\threex\three \key{#2}% \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi \else{\tclose{\kbdfont\setupmarkupstyle{kbd}\look}}\fi } % definition of @key that produces a lozenge. Doesn't adjust to text size. %\setfont\keyrm\rmshape{8}{1000}{OT1} %\font\keysy=cmsy9 %\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% % \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% % \vbox{\hrule\kern-0.4pt % \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% % \kern-0.4pt\hrule}% % \kern-.06em\raise0.4pt\hbox{\angleright}}}} % definition of @key with no lozenge. If the current font is already % monospace, don't change it; that way, we respect @kbdinputstyle. But % if it isn't monospace, then use \tt. % \def\key#1{{\setupmarkupstyle{key}% \nohyphenation \ifmonospace\else\tt\fi #1}\null} % @clicksequence{File @click{} Open ...} \def\clicksequence#1{\begingroup #1\endgroup} % @clickstyle @arrow (by default) \parseargdef\clickstyle{\def\click{#1}} \def\click{\arrow} % Typeset a dimension, e.g., `in' or `pt'. The only reason for the % argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. % \def\dmn#1{\thinspace #1} % @l was never documented to mean ``switch to the Lisp font'', % and it is not used as such in any manual I can find. We need it for % Polish suppressed-l. --karl, 22sep96. %\def\l#1{{\li #1}\null} % @acronym for "FBI", "NATO", and the like. % We print this one point size smaller, since it's intended for % all-uppercase. % \def\acronym#1{\doacronym #1,,\finish} \def\doacronym#1,#2,#3\finish{% {\selectfonts\lsize #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @abbr for "Comput. J." and the like. % No font change, but don't do end-of-sentence spacing. % \def\abbr#1{\doabbr #1,,\finish} \def\doabbr#1,#2,#3\finish{% {\plainfrenchspacing #1}% \def\temp{#2}% \ifx\temp\empty \else \space ({\unsepspaces \ignorespaces \temp \unskip})% \fi \null % reset \spacefactor=1000 } % @asis just yields its argument. Used with @table, for example. % \def\asis#1{#1} % @math outputs its argument in math mode. % % One complication: _ usually means subscripts, but it could also mean % an actual _ character, as in @math{@var{some_variable} + 1}. So make % _ active, and distinguish by seeing if the current family is \slfam, % which is what @var uses. { \catcode`\_ = \active \gdef\mathunderscore{% \catcode`\_=\active \def_{\ifnum\fam=\slfam \_\else\sb\fi}% } } % Another complication: we want \\ (and @\) to output a math (or tt) \. % FYI, plain.tex uses \\ as a temporary control sequence (for no % particular reason), but this is not advertised and we don't care. % % The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. \def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} % \def\math{% \tex \mathunderscore \let\\ = \mathbackslash \mathactive % make the texinfo accent commands work in math mode \let\"=\ddot \let\'=\acute \let\==\bar \let\^=\hat \let\`=\grave \let\u=\breve \let\v=\check \let\~=\tilde \let\dotaccent=\dot $\finishmath } \def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. % Some active characters (such as <) are spaced differently in math. % We have to reset their definitions in case the @math was an argument % to a command which sets the catcodes (such as @item or @section). % { \catcode`^ = \active \catcode`< = \active \catcode`> = \active \catcode`+ = \active \catcode`' = \active \gdef\mathactive{% \let^ = \ptexhat \let< = \ptexless \let> = \ptexgtr \let+ = \ptexplus \let' = \ptexquoteright } } % ctrl is no longer a Texinfo command, but leave this definition for fun. \def\ctrl #1{{\tt \rawbackslash \hat}#1} % @inlinefmt{FMTNAME,PROCESSED-TEXT} and @inlineraw{FMTNAME,RAW-TEXT}. % Ignore unless FMTNAME == tex; then it is like @iftex and @tex, % except specified as a normal braced arg, so no newlines to worry about. % \def\outfmtnametex{tex} % \long\def\inlinefmt#1{\doinlinefmt #1,\finish} \long\def\doinlinefmt#1,#2,\finish{% \def\inlinefmtname{#1}% \ifx\inlinefmtname\outfmtnametex \ignorespaces #2\fi } % For raw, must switch into @tex before parsing the argument, to avoid % setting catcodes prematurely. Doing it this way means that, for % example, @inlineraw{html, foo{bar} gets a parse error instead of being % ignored. But this isn't important because if people want a literal % *right* brace they would have to use a command anyway, so they may as % well use a command to get a left brace too. We could re-use the % delimiter character idea from \verb, but it seems like overkill. % \long\def\inlineraw{\tex \doinlineraw} \long\def\doinlineraw#1{\doinlinerawtwo #1,\finish} \def\doinlinerawtwo#1,#2,\finish{% \def\inlinerawname{#1}% \ifx\inlinerawname\outfmtnametex \ignorespaces #2\fi \endgroup % close group opened by \tex. } \message{glyphs,} % and logos. % @@ prints an @, as does @atchar{}. \def\@{\char64 } \let\atchar=\@ % @{ @} @lbracechar{} @rbracechar{} all generate brace characters. % Unless we're in typewriter, use \ecfont because the CM text fonts do % not have braces, and we don't want to switch into math. \def\mylbrace{{\ifmonospace\else\ecfont\fi \char123}} \def\myrbrace{{\ifmonospace\else\ecfont\fi \char125}} \let\{=\mylbrace \let\lbracechar=\{ \let\}=\myrbrace \let\rbracechar=\} \begingroup % Definitions to produce \{ and \} commands for indices, % and @{ and @} for the aux/toc files. \catcode`\{ = \other \catcode`\} = \other \catcode`\[ = 1 \catcode`\] = 2 \catcode`\! = 0 \catcode`\\ = \other !gdef!lbracecmd[\{]% !gdef!rbracecmd[\}]% !gdef!lbraceatcmd[@{]% !gdef!rbraceatcmd[@}]% !endgroup % @comma{} to avoid , parsing problems. \let\comma = , % Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent % Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. \let\, = \ptexc \let\dotaccent = \ptexdot \def\ringaccent#1{{\accent23 #1}} \let\tieaccent = \ptext \let\ubaraccent = \ptexb \let\udotaccent = \d % Other special characters: @questiondown @exclamdown @ordf @ordm % Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. \def\questiondown{?`} \def\exclamdown{!`} \def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} \def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} % Dotless i and dotless j, used for accents. \def\imacro{i} \def\jmacro{j} \def\dotless#1{% \def\temp{#1}% \ifx\temp\imacro \ifmmode\imath \else\ptexi \fi \else\ifx\temp\jmacro \ifmmode\jmath \else\j \fi \else \errmessage{@dotless can be used only with i or j}% \fi\fi } % The \TeX{} logo, as in plain, but resetting the spacing so that a % period following counts as ending a sentence. (Idea found in latex.) % \edef\TeX{\TeX \spacefactor=1000 } % @LaTeX{} logo. Not quite the same results as the definition in % latex.ltx, since we use a different font for the raised A; it's most % convenient for us to use an explicitly smaller font, rather than using % the \scriptstyle font (since we don't reset \scriptstyle and % \scriptscriptstyle). % \def\LaTeX{% L\kern-.36em {\setbox0=\hbox{T}% \vbox to \ht0{\hbox{% \ifx\textnominalsize\xwordpt % for 10pt running text, \lllsize (8pt) is too small for the A in LaTeX. % Revert to plain's \scriptsize, which is 7pt. \count255=\the\fam $\fam\count255 \scriptstyle A$% \else % For 11pt, we can use our lllsize. \selectfonts\lllsize A% \fi }% \vss }}% \kern-.15em \TeX } % Some math mode symbols. \def\bullet{$\ptexbullet$} \def\geq{\ifmmode \ge\else $\ge$\fi} \def\leq{\ifmmode \le\else $\le$\fi} \def\minus{\ifmmode -\else $-$\fi} % @dots{} outputs an ellipsis using the current font. % We do .5em per period so that it has the same spacing in the cm % typewriter fonts as three actual period characters; on the other hand, % in other typewriter fonts three periods are wider than 1.5em. So do % whichever is larger. % \def\dots{% \leavevmode \setbox0=\hbox{...}% get width of three periods \ifdim\wd0 > 1.5em \dimen0 = \wd0 \else \dimen0 = 1.5em \fi \hbox to \dimen0{% \hskip 0pt plus.25fil .\hskip 0pt plus1fil .\hskip 0pt plus1fil .\hskip 0pt plus.5fil }% } % @enddots{} is an end-of-sentence ellipsis. % \def\enddots{% \dots \spacefactor=\endofsentencespacefactor } % @point{}, @result{}, @expansion{}, @print{}, @equiv{}. % % Since these characters are used in examples, they should be an even number of % \tt widths. Each \tt character is 1en, so two makes it 1em. % \def\point{$\star$} \def\arrow{\leavevmode\raise.05ex\hbox to 1em{\hfil$\rightarrow$\hfil}} \def\result{\leavevmode\raise.05ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} \def\expansion{\leavevmode\hbox to 1em{\hfil$\mapsto$\hfil}} \def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} \def\equiv{\leavevmode\hbox to 1em{\hfil$\ptexequiv$\hfil}} % The @error{} command. % Adapted from the TeXbook's \boxit. % \newbox\errorbox % {\tentt \global\dimen0 = 3em}% Width of the box. \dimen2 = .55pt % Thickness of rules % The text. (`r' is open on the right, `e' somewhat less so on the left.) \setbox0 = \hbox{\kern-.75pt \reducedsf \putworderror\kern-1.5pt} % \setbox\errorbox=\hbox to \dimen0{\hfil \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. \advance\hsize by -2\dimen2 % Rules. \vbox{% \hrule height\dimen2 \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. \kern3pt\vrule width\dimen2}% Space to right. \hrule height\dimen2} \hfil} % \def\error{\leavevmode\lower.7ex\copy\errorbox} % @pounds{} is a sterling sign, which Knuth put in the CM italic font. % \def\pounds{{\it\$}} % @euro{} comes from a separate font, depending on the current style. % We use the free feym* fonts from the eurosym package by Henrik % Theiling, which support regular, slanted, bold and bold slanted (and % "outlined" (blackboard board, sort of) versions, which we don't need). % It is available from http://www.ctan.org/tex-archive/fonts/eurosym. % % Although only regular is the truly official Euro symbol, we ignore % that. The Euro is designed to be slightly taller than the regular % font height. % % feymr - regular % feymo - slanted % feybr - bold % feybo - bold slanted % % There is no good (free) typewriter version, to my knowledge. % A feymr10 euro is ~7.3pt wide, while a normal cmtt10 char is ~5.25pt wide. % Hmm. % % Also doesn't work in math. Do we need to do math with euro symbols? % Hope not. % % \def\euro{{\eurofont e}} \def\eurofont{% % We set the font at each command, rather than predefining it in % \textfonts and the other font-switching commands, so that % installations which never need the symbol don't have to have the % font installed. % % There is only one designed size (nominal 10pt), so we always scale % that to the current nominal size. % % By the way, simply using "at 1em" works for cmr10 and the like, but % does not work for cmbx10 and other extended/shrunken fonts. % \def\eurosize{\csname\curfontsize nominalsize\endcsname}% % \ifx\curfontstyle\bfstylename % bold: \font\thiseurofont = \ifusingit{feybo10}{feybr10} at \eurosize \else % regular: \font\thiseurofont = \ifusingit{feymo10}{feymr10} at \eurosize \fi \thiseurofont } % Glyphs from the EC fonts. We don't use \let for the aliases, because % sometimes we redefine the original macro, and the alias should reflect % the redefinition. % % Use LaTeX names for the Icelandic letters. \def\DH{{\ecfont \char"D0}} % Eth \def\dh{{\ecfont \char"F0}} % eth \def\TH{{\ecfont \char"DE}} % Thorn \def\th{{\ecfont \char"FE}} % thorn % \def\guillemetleft{{\ecfont \char"13}} \def\guillemotleft{\guillemetleft} \def\guillemetright{{\ecfont \char"14}} \def\guillemotright{\guillemetright} \def\guilsinglleft{{\ecfont \char"0E}} \def\guilsinglright{{\ecfont \char"0F}} \def\quotedblbase{{\ecfont \char"12}} \def\quotesinglbase{{\ecfont \char"0D}} % % This positioning is not perfect (see the ogonek LaTeX package), but % we have the precomposed glyphs for the most common cases. We put the % tests to use those glyphs in the single \ogonek macro so we have fewer % dummy definitions to worry about for index entries, etc. % % ogonek is also used with other letters in Lithuanian (IOU), but using % the precomposed glyphs for those is not so easy since they aren't in % the same EC font. \def\ogonek#1{{% \def\temp{#1}% \ifx\temp\macrocharA\Aogonek \else\ifx\temp\macrochara\aogonek \else\ifx\temp\macrocharE\Eogonek \else\ifx\temp\macrochare\eogonek \else \ecfont \setbox0=\hbox{#1}% \ifdim\ht0=1ex\accent"0C #1% \else\ooalign{\unhbox0\crcr\hidewidth\char"0C \hidewidth}% \fi \fi\fi\fi\fi }% } \def\Aogonek{{\ecfont \char"81}}\def\macrocharA{A} \def\aogonek{{\ecfont \char"A1}}\def\macrochara{a} \def\Eogonek{{\ecfont \char"86}}\def\macrocharE{E} \def\eogonek{{\ecfont \char"A6}}\def\macrochare{e} % % Use the ec* fonts (cm-super in outline format) for non-CM glyphs. \def\ecfont{% % We can't distinguish serif/sans and italic/slanted, but this % is used for crude hacks anyway (like adding French and German % quotes to documents typeset with CM, where we lose kerning), so % hopefully nobody will notice/care. \edef\ecsize{\csname\curfontsize ecsize\endcsname}% \edef\nominalsize{\csname\curfontsize nominalsize\endcsname}% \ifmonospace % typewriter: \font\thisecfont = ectt\ecsize \space at \nominalsize \else \ifx\curfontstyle\bfstylename % bold: \font\thisecfont = ecb\ifusingit{i}{x}\ecsize \space at \nominalsize \else % regular: \font\thisecfont = ec\ifusingit{ti}{rm}\ecsize \space at \nominalsize \fi \fi \thisecfont } % @registeredsymbol - R in a circle. The font for the R should really % be smaller yet, but lllsize is the best we can do for now. % Adapted from the plain.tex definition of \copyright. % \def\registeredsymbol{% $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% \hfil\crcr\Orb}}% }$% } % @textdegree - the normal degrees sign. % \def\textdegree{$^\circ$} % Laurent Siebenmann reports \Orb undefined with: % Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 % so we'll define it if necessary. % \ifx\Orb\thisisundefined \def\Orb{\mathhexbox20D} \fi % Quotes. \chardef\quotedblleft="5C \chardef\quotedblright=`\" \chardef\quoteleft=`\` \chardef\quoteright=`\' \message{page headings,} \newskip\titlepagetopglue \titlepagetopglue = 1.5in \newskip\titlepagebottomglue \titlepagebottomglue = 2pc % First the title page. Must do @settitle before @titlepage. \newif\ifseenauthor \newif\iffinishedtitlepage % Do an implicit @contents or @shortcontents after @end titlepage if the % user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. % \newif\ifsetcontentsaftertitlepage \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue \newif\ifsetshortcontentsaftertitlepage \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue \parseargdef\shorttitlepage{% \begingroup \hbox{}\vskip 1.5in \chaprm \centerline{#1}% \endgroup\page\hbox{}\page} \envdef\titlepage{% % Open one extra group, as we want to close it in the middle of \Etitlepage. \begingroup \parindent=0pt \textfonts % Leave some space at the very top of the page. \vglue\titlepagetopglue % No rule at page bottom unless we print one at the top with @title. \finishedtitlepagetrue % % Most title ``pages'' are actually two pages long, with space % at the top of the second. We don't want the ragged left on the second. \let\oldpage = \page \def\page{% \iffinishedtitlepage\else \finishtitlepage \fi \let\page = \oldpage \page \null }% } \def\Etitlepage{% \iffinishedtitlepage\else \finishtitlepage \fi % It is important to do the page break before ending the group, % because the headline and footline are only empty inside the group. % If we use the new definition of \page, we always get a blank page % after the title page, which we certainly don't want. \oldpage \endgroup % % Need this before the \...aftertitlepage checks so that if they are % in effect the toc pages will come out with page numbers. \HEADINGSon % % If they want short, they certainly want long too. \ifsetshortcontentsaftertitlepage \shortcontents \contents \global\let\shortcontents = \relax \global\let\contents = \relax \fi % \ifsetcontentsaftertitlepage \contents \global\let\contents = \relax \global\let\shortcontents = \relax \fi } \def\finishtitlepage{% \vskip4pt \hrule height 2pt width \hsize \vskip\titlepagebottomglue \finishedtitlepagetrue } % Settings used for typesetting titles: no hyphenation, no indentation, % don't worry much about spacing, ragged right. This should be used % inside a \vbox, and fonts need to be set appropriately first. Because % it is always used for titles, nothing else, we call \rmisbold. \par % should be specified before the end of the \vbox, since a vbox is a group. % \def\raggedtitlesettings{% \rmisbold \hyphenpenalty=10000 \parindent=0pt \tolerance=5000 \ptexraggedright } % Macros to be used within @titlepage: \let\subtitlerm=\tenrm \def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} \parseargdef\title{% \checkenv\titlepage \vbox{\titlefonts \raggedtitlesettings #1\par}% % print a rule at the page bottom also. \finishedtitlepagefalse \vskip4pt \hrule height 4pt width \hsize \vskip4pt } \parseargdef\subtitle{% \checkenv\titlepage {\subtitlefont \rightline{#1}}% } % @author should come last, but may come many times. % It can also be used inside @quotation. % \parseargdef\author{% \def\temp{\quotation}% \ifx\thisenv\temp \def\quotationauthor{#1}% printed in \Equotation. \else \checkenv\titlepage \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi {\secfonts\rmisbold \leftline{#1}}% \fi } % Set up page headings and footings. \let\thispage=\folio \newtoks\evenheadline % headline on even pages \newtoks\oddheadline % headline on odd pages \newtoks\evenfootline % footline on even pages \newtoks\oddfootline % footline on odd pages % Now make TeX use those variables \headline={{\textfonts\rm \ifodd\pageno \the\oddheadline \else \the\evenheadline \fi}} \footline={{\textfonts\rm \ifodd\pageno \the\oddfootline \else \the\evenfootline \fi}\HEADINGShook} \let\HEADINGShook=\relax % Commands to set those variables. % For example, this is what @headings on does % @evenheading @thistitle|@thispage|@thischapter % @oddheading @thischapter|@thispage|@thistitle % @evenfooting @thisfile|| % @oddfooting ||@thisfile \def\evenheading{\parsearg\evenheadingxxx} \def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} \def\evenheadingyyy #1\|#2\|#3\|#4\finish{% \global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddheading{\parsearg\oddheadingxxx} \def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} \def\oddheadingyyy #1\|#2\|#3\|#4\finish{% \global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% \def\evenfooting{\parsearg\evenfootingxxx} \def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} \def\evenfootingyyy #1\|#2\|#3\|#4\finish{% \global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} \def\oddfooting{\parsearg\oddfootingxxx} \def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} \def\oddfootingyyy #1\|#2\|#3\|#4\finish{% \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% % % Leave some space for the footline. Hopefully ok to assume % @evenfooting will not be used by itself. \global\advance\pageheight by -12pt \global\advance\vsize by -12pt } \parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} % @evenheadingmarks top \thischapter <- chapter at the top of a page % @evenheadingmarks bottom \thischapter <- chapter at the bottom of a page % % The same set of arguments for: % % @oddheadingmarks % @evenfootingmarks % @oddfootingmarks % @everyheadingmarks % @everyfootingmarks \def\evenheadingmarks{\headingmarks{even}{heading}} \def\oddheadingmarks{\headingmarks{odd}{heading}} \def\evenfootingmarks{\headingmarks{even}{footing}} \def\oddfootingmarks{\headingmarks{odd}{footing}} \def\everyheadingmarks#1 {\headingmarks{even}{heading}{#1} \headingmarks{odd}{heading}{#1} } \def\everyfootingmarks#1 {\headingmarks{even}{footing}{#1} \headingmarks{odd}{footing}{#1} } % #1 = even/odd, #2 = heading/footing, #3 = top/bottom. \def\headingmarks#1#2#3 {% \expandafter\let\expandafter\temp \csname get#3headingmarks\endcsname \global\expandafter\let\csname get#1#2marks\endcsname \temp } \everyheadingmarks bottom \everyfootingmarks bottom % @headings double turns headings on for double-sided printing. % @headings single turns headings on for single-sided printing. % @headings off turns them off. % @headings on same as @headings double, retained for compatibility. % @headings after turns on double-sided headings after this page. % @headings doubleafter turns on double-sided headings after this page. % @headings singleafter turns on single-sided headings after this page. % By default, they are off at the start of a document, % and turned `on' after @end titlepage. \def\headings #1 {\csname HEADINGS#1\endcsname} \def\headingsoff{% non-global headings elimination \evenheadline={\hfil}\evenfootline={\hfil}% \oddheadline={\hfil}\oddfootline={\hfil}% } \def\HEADINGSoff{{\globaldefs=1 \headingsoff}} % global setting \HEADINGSoff % it's the default % When we turn headings on, set the page number to 1. % For double-sided printing, put current file name in lower left corner, % chapter name on inside top of right hand pages, document % title on inside top of left hand pages, and page numbers on outside top % edge of all pages. \def\HEADINGSdouble{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \let\contentsalignmacro = \chappager % For single-sided printing, chapter title goes across top left of page, % page number on top right. \def\HEADINGSsingle{% \global\pageno=1 \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } \def\HEADINGSon{\HEADINGSdouble} \def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} \let\HEADINGSdoubleafter=\HEADINGSafter \def\HEADINGSdoublex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\folio\hfil\thistitle}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chapoddpage } \def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} \def\HEADINGSsinglex{% \global\evenfootline={\hfil} \global\oddfootline={\hfil} \global\evenheadline={\line{\thischapter\hfil\folio}} \global\oddheadline={\line{\thischapter\hfil\folio}} \global\let\contentsalignmacro = \chappager } % Subroutines used in generating headings % This produces Day Month Year style of output. % Only define if not already defined, in case a txi-??.tex file has set % up a different format (e.g., txi-cs.tex does this). \ifx\today\thisisundefined \def\today{% \number\day\space \ifcase\month \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec \fi \space\number\year} \fi % @settitle line... specifies the title of the document, for headings. % It generates no output of its own. \def\thistitle{\putwordNoTitle} \def\settitle{\parsearg{\gdef\thistitle}} \message{tables,} % Tables -- @table, @ftable, @vtable, @item(x). % default indentation of table text \newdimen\tableindent \tableindent=.8in % default indentation of @itemize and @enumerate text \newdimen\itemindent \itemindent=.3in % margin between end of table item and start of table text. \newdimen\itemmargin \itemmargin=.1in % used internally for \itemindent minus \itemmargin \newdimen\itemmax % Note @table, @ftable, and @vtable define @item, @itemx, etc., with % these defs. % They also define \itemindex % to index the item name in whatever manner is desired (perhaps none). \newif\ifitemxneedsnegativevskip \def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} \def\internalBitem{\smallbreak \parsearg\itemzzz} \def\internalBitemx{\itemxpar \parsearg\itemzzz} \def\itemzzz #1{\begingroup % \advance\hsize by -\rightskip \advance\hsize by -\tableindent \setbox0=\hbox{\itemindicate{#1}}% \itemindex{#1}% \nobreak % This prevents a break before @itemx. % % If the item text does not fit in the space we have, put it on a line % by itself, and do not allow a page break either before or after that % line. We do not start a paragraph here because then if the next % command is, e.g., @kindex, the whatsit would get put into the % horizontal list on a line by itself, resulting in extra blank space. \ifdim \wd0>\itemmax % % Make this a paragraph so we get the \parskip glue and wrapping, % but leave it ragged-right. \begingroup \advance\leftskip by-\tableindent \advance\hsize by\tableindent \advance\rightskip by0pt plus1fil\relax \leavevmode\unhbox0\par \endgroup % % We're going to be starting a paragraph, but we don't want the % \parskip glue -- logically it's part of the @item we just started. \nobreak \vskip-\parskip % % Stop a page break at the \parskip glue coming up. However, if % what follows is an environment such as @example, there will be no % \parskip glue; then the negative vskip we just inserted would % cause the example and the item to crash together. So we use this % bizarre value of 10001 as a signal to \aboveenvbreak to insert % \parskip glue after all. Section titles are handled this way also. % \penalty 10001 \endgroup \itemxneedsnegativevskipfalse \else % The item text fits into the space. Start a paragraph, so that the % following text (if any) will end up on the same line. \noindent % Do this with kerns and \unhbox so that if there is a footnote in % the item text, it can migrate to the main vertical list and % eventually be printed. \nobreak\kern-\tableindent \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 \unhbox0 \nobreak\kern\dimen0 \endgroup \itemxneedsnegativevskiptrue \fi } \def\item{\errmessage{@item while not in a list environment}} \def\itemx{\errmessage{@itemx while not in a list environment}} % @table, @ftable, @vtable. \envdef\table{% \let\itemindex\gobble \tablecheck{table}% } \envdef\ftable{% \def\itemindex ##1{\doind {fn}{\code{##1}}}% \tablecheck{ftable}% } \envdef\vtable{% \def\itemindex ##1{\doind {vr}{\code{##1}}}% \tablecheck{vtable}% } \def\tablecheck#1{% \ifnum \the\catcode`\^^M=\active \endgroup \errmessage{This command won't work in this context; perhaps the problem is that we are \inenvironment\thisenv}% \def\next{\doignore{#1}}% \else \let\next\tablex \fi \next } \def\tablex#1{% \def\itemindicate{#1}% \parsearg\tabley } \def\tabley#1{% {% \makevalueexpandable \edef\temp{\noexpand\tablez #1\space\space\space}% \expandafter }\temp \endtablez } \def\tablez #1 #2 #3 #4\endtablez{% \aboveenvbreak \ifnum 0#1>0 \advance \leftskip by #1\mil \fi \ifnum 0#2>0 \tableindent=#2\mil \fi \ifnum 0#3>0 \advance \rightskip by #3\mil \fi \itemmax=\tableindent \advance \itemmax by -\itemmargin \advance \leftskip by \tableindent \exdentamount=\tableindent \parindent = 0pt \parskip = \smallskipamount \ifdim \parskip=0pt \parskip=2pt \fi \let\item = \internalBitem \let\itemx = \internalBitemx } \def\Etable{\endgraf\afterenvbreak} \let\Eftable\Etable \let\Evtable\Etable \let\Eitemize\Etable \let\Eenumerate\Etable % This is the counter used by @enumerate, which is really @itemize \newcount \itemno \envdef\itemize{\parsearg\doitemize} \def\doitemize#1{% \aboveenvbreak \itemmax=\itemindent \advance\itemmax by -\itemmargin \advance\leftskip by \itemindent \exdentamount=\itemindent \parindent=0pt \parskip=\smallskipamount \ifdim\parskip=0pt \parskip=2pt \fi % % Try typesetting the item mark that if the document erroneously says % something like @itemize @samp (intending @table), there's an error % right away at the @itemize. It's not the best error message in the % world, but it's better than leaving it to the @item. This means if % the user wants an empty mark, they have to say @w{} not just @w. \def\itemcontents{#1}% \setbox0 = \hbox{\itemcontents}% % % @itemize with no arg is equivalent to @itemize @bullet. \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi % \let\item=\itemizeitem } % Definition of @item while inside @itemize and @enumerate. % \def\itemizeitem{% \advance\itemno by 1 % for enumerations {\let\par=\endgraf \smallbreak}% reasonable place to break {% % If the document has an @itemize directly after a section title, a % \nobreak will be last on the list, and \sectionheading will have % done a \vskip-\parskip. In that case, we don't want to zero % parskip, or the item text will crash with the heading. On the % other hand, when there is normal text preceding the item (as there % usually is), we do want to zero parskip, or there would be too much % space. In that case, we won't have a \nobreak before. At least % that's the theory. \ifnum\lastpenalty<10000 \parskip=0in \fi \noindent \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% % \vadjust{\penalty 1200}}% not good to break after first line of item. \flushcr } % \splitoff TOKENS\endmark defines \first to be the first token in % TOKENS, and \rest to be the remainder. % \def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% % Allow an optional argument of an uppercase letter, lowercase letter, % or number, to specify the first label in the enumerated list. No % argument is the same as `1'. % \envparseargdef\enumerate{\enumeratey #1 \endenumeratey} \def\enumeratey #1 #2\endenumeratey{% % If we were given no argument, pretend we were given `1'. \def\thearg{#1}% \ifx\thearg\empty \def\thearg{1}\fi % % Detect if the argument is a single token. If so, it might be a % letter. Otherwise, the only valid thing it can be is a number. % (We will always have one token, because of the test we just made. % This is a good thing, since \splitoff doesn't work given nothing at % all -- the first parameter is undelimited.) \expandafter\splitoff\thearg\endmark \ifx\rest\empty % Only one token in the argument. It could still be anything. % A ``lowercase letter'' is one whose \lccode is nonzero. % An ``uppercase letter'' is one whose \lccode is both nonzero, and % not equal to itself. % Otherwise, we assume it's a number. % % We need the \relax at the end of the \ifnum lines to stop TeX from % continuing to look for a . % \ifnum\lccode\expandafter`\thearg=0\relax \numericenumerate % a number (we hope) \else % It's a letter. \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax \lowercaseenumerate % lowercase letter \else \uppercaseenumerate % uppercase letter \fi \fi \else % Multiple tokens in the argument. We hope it's a number. \numericenumerate \fi } % An @enumerate whose labels are integers. The starting integer is % given in \thearg. % \def\numericenumerate{% \itemno = \thearg \startenumeration{\the\itemno}% } % The starting (lowercase) letter is in \thearg. \def\lowercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more lowercase letters in @enumerate; get a bigger alphabet}% \fi \char\lccode\itemno }% } % The starting (uppercase) letter is in \thearg. \def\uppercaseenumerate{% \itemno = \expandafter`\thearg \startenumeration{% % Be sure we're not beyond the end of the alphabet. \ifnum\itemno=0 \errmessage{No more uppercase letters in @enumerate; get a bigger alphabet} \fi \char\uccode\itemno }% } % Call \doitemize, adding a period to the first argument and supplying the % common last two arguments. Also subtract one from the initial value in % \itemno, since @item increments \itemno. % \def\startenumeration#1{% \advance\itemno by -1 \doitemize{#1.}\flushcr } % @alphaenumerate and @capsenumerate are abbreviations for giving an arg % to @enumerate. % \def\alphaenumerate{\enumerate{a}} \def\capsenumerate{\enumerate{A}} \def\Ealphaenumerate{\Eenumerate} \def\Ecapsenumerate{\Eenumerate} % @multitable macros % Amy Hendrickson, 8/18/94, 3/6/96 % % @multitable ... @end multitable will make as many columns as desired. % Contents of each column will wrap at width given in preamble. Width % can be specified either with sample text given in a template line, % or in percent of \hsize, the current width of text on page. % Table can continue over pages but will only break between lines. % To make preamble: % % Either define widths of columns in terms of percent of \hsize: % @multitable @columnfractions .25 .3 .45 % @item ... % % Numbers following @columnfractions are the percent of the total % current hsize to be used for each column. You may use as many % columns as desired. % Or use a template: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item ... % using the widest term desired in each column. % Each new table line starts with @item, each subsequent new column % starts with @tab. Empty columns may be produced by supplying @tab's % with nothing between them for as many times as empty columns are needed, % ie, @tab@tab@tab will produce two empty columns. % @item, @tab do not need to be on their own lines, but it will not hurt % if they are. % Sample multitable: % @multitable {Column 1 template} {Column 2 template} {Column 3 template} % @item first col stuff @tab second col stuff @tab third col % @item % first col stuff % @tab % second col stuff % @tab % third col % @item first col stuff @tab second col stuff % @tab Many paragraphs of text may be used in any column. % % They will wrap at the width determined by the template. % @item@tab@tab This will be in third column. % @end multitable % Default dimensions may be reset by user. % @multitableparskip is vertical space between paragraphs in table. % @multitableparindent is paragraph indent in table. % @multitablecolmargin is horizontal space to be left between columns. % @multitablelinespace is space to leave between table items, baseline % to baseline. % 0pt means it depends on current normal line spacing. % \newskip\multitableparskip \newskip\multitableparindent \newdimen\multitablecolspace \newskip\multitablelinespace \multitableparskip=0pt \multitableparindent=6pt \multitablecolspace=12pt \multitablelinespace=0pt % Macros used to set up halign preamble: % \let\endsetuptable\relax \def\xendsetuptable{\endsetuptable} \let\columnfractions\relax \def\xcolumnfractions{\columnfractions} \newif\ifsetpercent % #1 is the @columnfraction, usually a decimal number like .5, but might % be just 1. We just use it, whatever it is. % \def\pickupwholefraction#1 {% \global\advance\colcount by 1 \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% \setuptable } \newcount\colcount \def\setuptable#1{% \def\firstarg{#1}% \ifx\firstarg\xendsetuptable \let\go = \relax \else \ifx\firstarg\xcolumnfractions \global\setpercenttrue \else \ifsetpercent \let\go\pickupwholefraction \else \global\advance\colcount by 1 \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a % separator; typically that is always in the input, anyway. \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% \fi \fi \ifx\go\pickupwholefraction % Put the argument back for the \pickupwholefraction call, so % we'll always have a period there to be parsed. \def\go{\pickupwholefraction#1}% \else \let\go = \setuptable \fi% \fi \go } % multitable-only commands. % % @headitem starts a heading row, which we typeset in bold. % Assignments have to be global since we are inside the implicit group % of an alignment entry. \everycr resets \everytab so we don't have to % undo it ourselves. \def\headitemfont{\b}% for people to use in the template row; not changeable \def\headitem{% \checkenv\multitable \crcr \global\everytab={\bf}% can't use \headitemfont since the parsing differs \the\everytab % for the first item }% % % A \tab used to include \hskip1sp. But then the space in a template % line is not enough. That is bad. So let's go back to just `&' until % we again encounter the problem the 1sp was intended to solve. % --karl, nathan@acm.org, 20apr99. \def\tab{\checkenv\multitable &\the\everytab}% % @multitable ... @end multitable definitions: % \newtoks\everytab % insert after every tab. % \envdef\multitable{% \vskip\parskip \startsavinginserts % % @item within a multitable starts a normal row. % We use \def instead of \let so that if one of the multitable entries % contains an @itemize, we don't choke on the \item (seen as \crcr aka % \endtemplate) expanding \doitemize. \def\item{\crcr}% % \tolerance=9500 \hbadness=9500 \setmultitablespacing \parskip=\multitableparskip \parindent=\multitableparindent \overfullrule=0pt \global\colcount=0 % \everycr = {% \noalign{% \global\everytab={}% \global\colcount=0 % Reset the column counter. % Check for saved footnotes, etc. \checkinserts % Keeps underfull box messages off when table breaks over pages. %\filbreak % Maybe so, but it also creates really weird page breaks when the % table breaks over pages. Wouldn't \vfil be better? Wait until the % problem manifests itself, so it can be fixed for real --karl. }% }% % \parsearg\domultitable } \def\domultitable#1{% % To parse everything between @multitable and @item: \setuptable#1 \endsetuptable % % This preamble sets up a generic column definition, which will % be used as many times as user calls for columns. % \vtop will set a single line and will also let text wrap and % continue for many paragraphs if desired. \halign\bgroup &% \global\advance\colcount by 1 \multistrut \vtop{% % Use the current \colcount to find the correct column width: \hsize=\expandafter\csname col\the\colcount\endcsname % % In order to keep entries from bumping into each other % we will add a \leftskip of \multitablecolspace to all columns after % the first one. % % If a template has been used, we will add \multitablecolspace % to the width of each template entry. % % If the user has set preamble in terms of percent of \hsize we will % use that dimension as the width of the column, and the \leftskip % will keep entries from bumping into each other. Table will start at % left margin and final column will justify at right margin. % % Make sure we don't inherit \rightskip from the outer environment. \rightskip=0pt \ifnum\colcount=1 % The first column will be indented with the surrounding text. \advance\hsize by\leftskip \else \ifsetpercent \else % If user has not set preamble in terms of percent of \hsize % we will advance \hsize by \multitablecolspace. \advance\hsize by \multitablecolspace \fi % In either case we will make \leftskip=\multitablecolspace: \leftskip=\multitablecolspace \fi % Ignoring space at the beginning and end avoids an occasional spurious % blank line, when TeX decides to break the line at the space before the % box from the multistrut, so the strut ends up on a line by itself. % For example: % @multitable @columnfractions .11 .89 % @item @code{#} % @tab Legal holiday which is valid in major parts of the whole country. % Is automatically provided with highlighting sequences respectively % marking characters. \noindent\ignorespaces##\unskip\multistrut }\cr } \def\Emultitable{% \crcr \egroup % end the \halign \global\setpercentfalse } \def\setmultitablespacing{% \def\multistrut{\strut}% just use the standard line spacing % % Compute \multitablelinespace (if not defined by user) for use in % \multitableparskip calculation. We used define \multistrut based on % this, but (ironically) that caused the spacing to be off. % See bug-texinfo report from Werner Lemberg, 31 Oct 2004 12:52:20 +0100. \ifdim\multitablelinespace=0pt \setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip \global\advance\multitablelinespace by-\ht0 \fi % Test to see if parskip is larger than space between lines of % table. If not, do nothing. % If so, set to same dimension as multitablelinespace. \ifdim\multitableparskip>\multitablelinespace \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi% \ifdim\multitableparskip=0pt \global\multitableparskip=\multitablelinespace \global\advance\multitableparskip-7pt % to keep parskip somewhat smaller % than skip between lines in the table. \fi} \message{conditionals,} % @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, % @ifnotxml always succeed. They currently do nothing; we don't % attempt to check whether the conditionals are properly nested. But we % have to remember that they are conditionals, so that @end doesn't % attempt to close an environment group. % \def\makecond#1{% \expandafter\let\csname #1\endcsname = \relax \expandafter\let\csname iscond.#1\endcsname = 1 } \makecond{iftex} \makecond{ifnotdocbook} \makecond{ifnothtml} \makecond{ifnotinfo} \makecond{ifnotplaintext} \makecond{ifnotxml} % Ignore @ignore, @ifhtml, @ifinfo, and the like. % \def\direntry{\doignore{direntry}} \def\documentdescription{\doignore{documentdescription}} \def\docbook{\doignore{docbook}} \def\html{\doignore{html}} \def\ifdocbook{\doignore{ifdocbook}} \def\ifhtml{\doignore{ifhtml}} \def\ifinfo{\doignore{ifinfo}} \def\ifnottex{\doignore{ifnottex}} \def\ifplaintext{\doignore{ifplaintext}} \def\ifxml{\doignore{ifxml}} \def\ignore{\doignore{ignore}} \def\menu{\doignore{menu}} \def\xml{\doignore{xml}} % Ignore text until a line `@end #1', keeping track of nested conditionals. % % A count to remember the depth of nesting. \newcount\doignorecount \def\doignore#1{\begingroup % Scan in ``verbatim'' mode: \obeylines \catcode`\@ = \other \catcode`\{ = \other \catcode`\} = \other % % Make sure that spaces turn into tokens that match what \doignoretext wants. \spaceisspace % % Count number of #1's that we've seen. \doignorecount = 0 % % Swallow text until we reach the matching `@end #1'. \dodoignore{#1}% } { \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. \obeylines % % \gdef\dodoignore#1{% % #1 contains the command name as a string, e.g., `ifinfo'. % % Define a command to find the next `@end #1'. \long\def\doignoretext##1^^M@end #1{% \doignoretextyyy##1^^M@#1\_STOP_}% % % And this command to find another #1 command, at the beginning of a % line. (Otherwise, we would consider a line `@c @ifset', for % example, to count as an @ifset for nesting.) \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% % % And now expand that command. \doignoretext ^^M% }% } \def\doignoreyyy#1{% \def\temp{#1}% \ifx\temp\empty % Nothing found. \let\next\doignoretextzzz \else % Found a nested condition, ... \advance\doignorecount by 1 \let\next\doignoretextyyy % ..., look for another. % If we're here, #1 ends with ^^M\ifinfo (for example). \fi \next #1% the token \_STOP_ is present just after this macro. } % We have to swallow the remaining "\_STOP_". % \def\doignoretextzzz#1{% \ifnum\doignorecount = 0 % We have just found the outermost @end. \let\next\enddoignore \else % Still inside a nested condition. \advance\doignorecount by -1 \let\next\doignoretext % Look for the next @end. \fi \next } % Finish off ignored text. { \obeylines% % Ignore anything after the last `@end #1'; this matters in verbatim % environments, where otherwise the newline after an ignored conditional % would result in a blank line in the output. \gdef\enddoignore#1^^M{\endgroup\ignorespaces}% } % @set VAR sets the variable VAR to an empty value. % @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. % % Since we want to separate VAR from REST-OF-LINE (which might be % empty), we can't just use \parsearg; we have to insert a space of our % own to delimit the rest of the line, and then take it out again if we % didn't need it. % We rely on the fact that \parsearg sets \catcode`\ =10. % \parseargdef\set{\setyyy#1 \endsetyyy} \def\setyyy#1 #2\endsetyyy{% {% \makevalueexpandable \def\temp{#2}% \edef\next{\gdef\makecsname{SET#1}}% \ifx\temp\empty \next{}% \else \setzzz#2\endsetzzz \fi }% } % Remove the trailing space \setxxx inserted. \def\setzzz#1 \endsetzzz{\next{#1}} % @clear VAR clears (i.e., unsets) the variable VAR. % \parseargdef\clear{% {% \makevalueexpandable \global\expandafter\let\csname SET#1\endcsname=\relax }% } % @value{foo} gets the text saved in variable foo. \def\value{\begingroup\makevalueexpandable\valuexxx} \def\valuexxx#1{\expandablevalue{#1}\endgroup} { \catcode`\- = \active \catcode`\_ = \active % \gdef\makevalueexpandable{% \let\value = \expandablevalue % We don't want these characters active, ... \catcode`\-=\other \catcode`\_=\other % ..., but we might end up with active ones in the argument if % we're called from @code, as @code{@value{foo-bar_}}, though. % So \let them to their normal equivalents. \let-\normaldash \let_\normalunderscore } } % We have this subroutine so that we can handle at least some @value's % properly in indexes (we call \makevalueexpandable in \indexdummies). % The command has to be fully expandable (if the variable is set), since % the result winds up in the index file. This means that if the % variable's value contains other Texinfo commands, it's almost certain % it will fail (although perhaps we could fix that with sufficient work % to do a one-level expansion on the result, instead of complete). % \def\expandablevalue#1{% \expandafter\ifx\csname SET#1\endcsname\relax {[No value for ``#1'']}% \message{Variable `#1', used in @value, is not set.}% \else \csname SET#1\endcsname \fi } % @ifset VAR ... @end ifset reads the `...' iff VAR has been defined % with @set. % % To get the special treatment we need for `@end ifset,' we call % \makecond and then redefine. % \makecond{ifset} \def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} \def\doifset#1#2{% {% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname SET#2\endcsname\relax #1% If not set, redefine \next. \fi \expandafter }\next } \def\ifsetfail{\doignore{ifset}} % @ifclear VAR ... @end executes the `...' iff VAR has never been % defined with @set, or has been undefined with @clear. % % The `\else' inside the `\doifset' parameter is a trick to reuse the % above code: if the variable is not set, do nothing, if it is set, % then redefine \next to \ifclearfail. % \makecond{ifclear} \def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} \def\ifclearfail{\doignore{ifclear}} % @ifcommandisdefined CMD ... @end executes the `...' if CMD (written % without the @) is in fact defined. We can only feasibly check at the % TeX level, so something like `mathcode' is going to considered % defined even though it is not a Texinfo command. % \makecond{ifcommanddefined} \def\ifcommanddefined{\parsearg{\doifcmddefined{\let\next=\ifcmddefinedfail}}} % \def\doifcmddefined#1#2{{% \makevalueexpandable \let\next=\empty \expandafter\ifx\csname #2\endcsname\relax #1% If not defined, \let\next as above. \fi \expandafter }\next } \def\ifcmddefinedfail{\doignore{ifcommanddefined}} % @ifcommandnotdefined CMD ... handled similar to @ifclear above. \makecond{ifcommandnotdefined} \def\ifcommandnotdefined{% \parsearg{\doifcmddefined{\else \let\next=\ifcmdnotdefinedfail}}} \def\ifcmdnotdefinedfail{\doignore{ifcommandnotdefined}} % Set the `txicommandconditionals' variable, so documents have a way to % test if the @ifcommand...defined conditionals are available. \set txicommandconditionals % @dircategory CATEGORY -- specify a category of the dir file % which this file should belong to. Ignore this in TeX. \let\dircategory=\comment % @defininfoenclose. \let\definfoenclose=\comment \message{indexing,} % Index generation facilities % Define \newwrite to be identical to plain tex's \newwrite % except not \outer, so it can be used within macros and \if's. \edef\newwrite{\makecsname{ptexnewwrite}} % \newindex {foo} defines an index named foo. % It automatically defines \fooindex such that % \fooindex ...rest of line... puts an entry in the index foo. % It also defines \fooindfile to be the number of the output channel for % the file that accumulates this index. The file's extension is foo. % The name of an index should be no more than 2 characters long % for the sake of vms. % \def\newindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 % Open the file \fi \expandafter\xdef\csname#1index\endcsname{% % Define @#1index \noexpand\doindex{#1}} } % @defindex foo == \newindex{foo} % \def\defindex{\parsearg\newindex} % Define @defcodeindex, like @defindex except put all entries in @code. % \def\defcodeindex{\parsearg\newcodeindex} % \def\newcodeindex#1{% \iflinks \expandafter\newwrite \csname#1indfile\endcsname \openout \csname#1indfile\endcsname \jobname.#1 \fi \expandafter\xdef\csname#1index\endcsname{% \noexpand\docodeindex{#1}}% } % @synindex foo bar makes index foo feed into index bar. % Do this instead of @defindex foo if you don't want it as a separate index. % % @syncodeindex foo bar similar, but put all entries made for index foo % inside @code. % \def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} \def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} % #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), % #3 the target index (bar). \def\dosynindex#1#2#3{% % Only do \closeout if we haven't already done it, else we'll end up % closing the target index. \expandafter \ifx\csname donesynindex#2\endcsname \relax % The \closeout helps reduce unnecessary open files; the limit on the % Acorn RISC OS is a mere 16 files. \expandafter\closeout\csname#2indfile\endcsname \expandafter\let\csname donesynindex#2\endcsname = 1 \fi % redefine \fooindfile: \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname \expandafter\let\csname#2indfile\endcsname=\temp % redefine \fooindex: \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% } % Define \doindex, the driver for all \fooindex macros. % Argument #1 is generated by the calling \fooindex macro, % and it is "foo", the name of the index. % \doindex just uses \parsearg; it calls \doind for the actual work. % This is because \doind is more useful to call from other macros. % There is also \dosubind {index}{topic}{subtopic} % which makes an entry in a two-level index such as the operation index. \def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} \def\singleindexer #1{\doind{\indexname}{#1}} % like the previous two, but they put @code around the argument. \def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} \def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} % Take care of Texinfo commands that can appear in an index entry. % Since there are some commands we want to expand, and others we don't, % we have to laboriously prevent expansion for those that we don't. % \def\indexdummies{% \escapechar = `\\ % use backslash in output files. \def\@{@}% change to @@ when we switch to @ as escape char in index files. \def\ {\realbackslash\space }% % % Need these unexpandable (because we define \tt as a dummy) % definitions when @{ or @} appear in index entry text. Also, more % complicated, when \tex is in effect and \{ is a \delimiter again. % We can't use \lbracecmd and \rbracecmd because texindex assumes % braces and backslashes are used only as delimiters. Perhaps we % should define @lbrace and @rbrace commands a la @comma. \def\{{{\tt\char123}}% \def\}{{\tt\char125}}% % % I don't entirely understand this, but when an index entry is % generated from a macro call, the \endinput which \scanmacro inserts % causes processing to be prematurely terminated. This is, % apparently, because \indexsorttmp is fully expanded, and \endinput % is an expandable command. The redefinition below makes \endinput % disappear altogether for that purpose -- although logging shows that % processing continues to some further point. On the other hand, it % seems \endinput does not hurt in the printed index arg, since that % is still getting written without apparent harm. % % Sample source (mac-idx3.tex, reported by Graham Percival to % help-texinfo, 22may06): % @macro funindex {WORD} % @findex xyz % @end macro % ... % @funindex commtest % % The above is not enough to reproduce the bug, but it gives the flavor. % % Sample whatsit resulting: % .@write3{\entry{xyz}{@folio }{@code {xyz@endinput }}} % % So: \let\endinput = \empty % % Do the redefinitions. \commondummies } % For the aux and toc files, @ is the escape character. So we want to % redefine everything using @ as the escape character (instead of % \realbackslash, still used for index files). When everything uses @, % this will be simpler. % \def\atdummies{% \def\@{@@}% \def\ {@ }% \let\{ = \lbraceatcmd \let\} = \rbraceatcmd % % Do the redefinitions. \commondummies \otherbackslash } % Called from \indexdummies and \atdummies. % \def\commondummies{% % % \definedummyword defines \#1 as \string\#1\space, thus effectively % preventing its expansion. This is used only for control words, % not control letters, because the \space would be incorrect for % control characters, but is needed to separate the control word % from whatever follows. % % For control letters, we have \definedummyletter, which omits the % space. % % These can be used both for control words that take an argument and % those that do not. If it is followed by {arg} in the input, then % that will dutifully get written to the index (or wherever). % \def\definedummyword ##1{\def##1{\string##1\space}}% \def\definedummyletter##1{\def##1{\string##1}}% \let\definedummyaccent\definedummyletter % \commondummiesnofonts % \definedummyletter\_% \definedummyletter\-% % % Non-English letters. \definedummyword\AA \definedummyword\AE \definedummyword\DH \definedummyword\L \definedummyword\O \definedummyword\OE \definedummyword\TH \definedummyword\aa \definedummyword\ae \definedummyword\dh \definedummyword\exclamdown \definedummyword\l \definedummyword\o \definedummyword\oe \definedummyword\ordf \definedummyword\ordm \definedummyword\questiondown \definedummyword\ss \definedummyword\th % % Although these internal commands shouldn't show up, sometimes they do. \definedummyword\bf \definedummyword\gtr \definedummyword\hat \definedummyword\less \definedummyword\sf \definedummyword\sl \definedummyword\tclose \definedummyword\tt % \definedummyword\LaTeX \definedummyword\TeX % % Assorted special characters. \definedummyword\arrow \definedummyword\bullet \definedummyword\comma \definedummyword\copyright \definedummyword\registeredsymbol \definedummyword\dots \definedummyword\enddots \definedummyword\entrybreak \definedummyword\equiv \definedummyword\error \definedummyword\euro \definedummyword\expansion \definedummyword\geq \definedummyword\guillemetleft \definedummyword\guillemetright \definedummyword\guilsinglleft \definedummyword\guilsinglright \definedummyword\lbracechar \definedummyword\leq \definedummyword\minus \definedummyword\ogonek \definedummyword\pounds \definedummyword\point \definedummyword\print \definedummyword\quotedblbase \definedummyword\quotedblleft \definedummyword\quotedblright \definedummyword\quoteleft \definedummyword\quoteright \definedummyword\quotesinglbase \definedummyword\rbracechar \definedummyword\result \definedummyword\textdegree % % We want to disable all macros so that they are not expanded by \write. \macrolist % \normalturnoffactive % % Handle some cases of @value -- where it does not contain any % (non-fully-expandable) commands. \makevalueexpandable } % \commondummiesnofonts: common to \commondummies and \indexnofonts. % \def\commondummiesnofonts{% % Control letters and accents. \definedummyletter\!% \definedummyaccent\"% \definedummyaccent\'% \definedummyletter\*% \definedummyaccent\,% \definedummyletter\.% \definedummyletter\/% \definedummyletter\:% \definedummyaccent\=% \definedummyletter\?% \definedummyaccent\^% \definedummyaccent\`% \definedummyaccent\~% \definedummyword\u \definedummyword\v \definedummyword\H \definedummyword\dotaccent \definedummyword\ogonek \definedummyword\ringaccent \definedummyword\tieaccent \definedummyword\ubaraccent \definedummyword\udotaccent \definedummyword\dotless % % Texinfo font commands. \definedummyword\b \definedummyword\i \definedummyword\r \definedummyword\sansserif \definedummyword\sc \definedummyword\slanted \definedummyword\t % % Commands that take arguments. \definedummyword\abbr \definedummyword\acronym \definedummyword\anchor \definedummyword\cite \definedummyword\code \definedummyword\command \definedummyword\dfn \definedummyword\dmn \definedummyword\email \definedummyword\emph \definedummyword\env \definedummyword\file \definedummyword\image \definedummyword\indicateurl \definedummyword\inforef \definedummyword\kbd \definedummyword\key \definedummyword\math \definedummyword\option \definedummyword\pxref \definedummyword\ref \definedummyword\samp \definedummyword\strong \definedummyword\tie \definedummyword\uref \definedummyword\url \definedummyword\var \definedummyword\verb \definedummyword\w \definedummyword\xref } % \indexnofonts is used when outputting the strings to sort the index % by, and when constructing control sequence names. It eliminates all % control sequences and just writes whatever the best ASCII sort string % would be for a given command (usually its argument). % \def\indexnofonts{% % Accent commands should become @asis. \def\definedummyaccent##1{\let##1\asis}% % We can just ignore other control letters. \def\definedummyletter##1{\let##1\empty}% % All control words become @asis by default; overrides below. \let\definedummyword\definedummyaccent % \commondummiesnofonts % % Don't no-op \tt, since it isn't a user-level command % and is used in the definitions of the active chars like <, >, |, etc. % Likewise with the other plain tex font commands. %\let\tt=\asis % \def\ { }% \def\@{@}% \def\_{\normalunderscore}% \def\-{}% @- shouldn't affect sorting % % Unfortunately, texindex is not prepared to handle braces in the % content at all. So for index sorting, we map @{ and @} to strings % starting with |, since that ASCII character is between ASCII { and }. \def\{{|a}% \def\lbracechar{|a}% % \def\}{|b}% \def\rbracechar{|b}% % % Non-English letters. \def\AA{AA}% \def\AE{AE}% \def\DH{DZZ}% \def\L{L}% \def\OE{OE}% \def\O{O}% \def\TH{ZZZ}% \def\aa{aa}% \def\ae{ae}% \def\dh{dzz}% \def\exclamdown{!}% \def\l{l}% \def\oe{oe}% \def\ordf{a}% \def\ordm{o}% \def\o{o}% \def\questiondown{?}% \def\ss{ss}% \def\th{zzz}% % \def\LaTeX{LaTeX}% \def\TeX{TeX}% % % Assorted special characters. % (The following {} will end up in the sort string, but that's ok.) \def\arrow{->}% \def\bullet{bullet}% \def\comma{,}% \def\copyright{copyright}% \def\dots{...}% \def\enddots{...}% \def\equiv{==}% \def\error{error}% \def\euro{euro}% \def\expansion{==>}% \def\geq{>=}% \def\guillemetleft{<<}% \def\guillemetright{>>}% \def\guilsinglleft{<}% \def\guilsinglright{>}% \def\leq{<=}% \def\minus{-}% \def\point{.}% \def\pounds{pounds}% \def\print{-|}% \def\quotedblbase{"}% \def\quotedblleft{"}% \def\quotedblright{"}% \def\quoteleft{`}% \def\quoteright{'}% \def\quotesinglbase{,}% \def\registeredsymbol{R}% \def\result{=>}% \def\textdegree{o}% % \expandafter\ifx\csname SETtxiindexlquoteignore\endcsname\relax \else \indexlquoteignore \fi % % We need to get rid of all macros, leaving only the arguments (if present). % Of course this is not nearly correct, but it is the best we can do for now. % makeinfo does not expand macros in the argument to @deffn, which ends up % writing an index entry, and texindex isn't prepared for an index sort entry % that starts with \. % % Since macro invocations are followed by braces, we can just redefine them % to take a single TeX argument. The case of a macro invocation that % goes to end-of-line is not handled. % \macrolist } % Undocumented (for FSFS 2nd ed.): @set txiindexlquoteignore makes us % ignore left quotes in the sort term. {\catcode`\`=\active \gdef\indexlquoteignore{\let`=\empty}} \let\indexbackslash=0 %overridden during \printindex. \let\SETmarginindex=\relax % put index entries in margin (undocumented)? % Most index entries go through here, but \dosubind is the general case. % #1 is the index name, #2 is the entry text. \def\doind#1#2{\dosubind{#1}{#2}{}} % Workhorse for all \fooindexes. % #1 is name of index, #2 is stuff to put there, #3 is subentry -- % empty if called from \doind, as we usually are (the main exception % is with most defuns, which call us directly). % \def\dosubind#1#2#3{% \iflinks {% % Store the main index entry text (including the third arg). \toks0 = {#2}% % If third arg is present, precede it with a space. \def\thirdarg{#3}% \ifx\thirdarg\empty \else \toks0 = \expandafter{\the\toks0 \space #3}% \fi % \edef\writeto{\csname#1indfile\endcsname}% % \safewhatsit\dosubindwrite }% \fi } % Write the entry in \toks0 to the index file: % \def\dosubindwrite{% % Put the index entry in the margin if desired. \ifx\SETmarginindex\relax\else \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% \fi % % Remember, we are within a group. \indexdummies % Must do this here, since \bf, etc expand at this stage \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now % so it will be output as is; and it will print as backslash. % % Process the index entry with all font commands turned off, to % get the string to sort by. {\indexnofonts \edef\temp{\the\toks0}% need full expansion \xdef\indexsorttmp{\temp}% }% % % Set up the complete index entry, with both the sort key and % the original text, including any font commands. We write % three arguments to \entry to the .?? file (four in the % subentry case), texindex reduces to two when writing the .??s % sorted result. \edef\temp{% \write\writeto{% \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% }% \temp } % Take care of unwanted page breaks/skips around a whatsit: % % If a skip is the last thing on the list now, preserve it % by backing up by \lastskip, doing the \write, then inserting % the skip again. Otherwise, the whatsit generated by the % \write or \pdfdest will make \lastskip zero. The result is that % sequences like this: % @end defun % @tindex whatever % @defun ... % will have extra space inserted, because the \medbreak in the % start of the @defun won't see the skip inserted by the @end of % the previous defun. % % But don't do any of this if we're not in vertical mode. We % don't want to do a \vskip and prematurely end a paragraph. % % Avoid page breaks due to these extra skips, too. % % But wait, there is a catch there: % We'll have to check whether \lastskip is zero skip. \ifdim is not % sufficient for this purpose, as it ignores stretch and shrink parts % of the skip. The only way seems to be to check the textual % representation of the skip. % % The following is almost like \def\zeroskipmacro{0.0pt} except that % the ``p'' and ``t'' characters have catcode \other, not 11 (letter). % \edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} % \newskip\whatsitskip \newcount\whatsitpenalty % % ..., ready, GO: % \def\safewhatsit#1{\ifhmode #1% \else % \lastskip and \lastpenalty cannot both be nonzero simultaneously. \whatsitskip = \lastskip \edef\lastskipmacro{\the\lastskip}% \whatsitpenalty = \lastpenalty % % If \lastskip is nonzero, that means the last item was a % skip. And since a skip is discardable, that means this % -\whatsitskip glue we're inserting is preceded by a % non-discardable item, therefore it is not a potential % breakpoint, therefore no \nobreak needed. \ifx\lastskipmacro\zeroskipmacro \else \vskip-\whatsitskip \fi % #1% % \ifx\lastskipmacro\zeroskipmacro % If \lastskip was zero, perhaps the last item was a penalty, and % perhaps it was >=10000, e.g., a \nobreak. In that case, we want % to re-insert the same penalty (values >10000 are used for various % signals); since we just inserted a non-discardable item, any % following glue (such as a \parskip) would be a breakpoint. For example: % @deffn deffn-whatever % @vindex index-whatever % Description. % would allow a break between the index-whatever whatsit % and the "Description." paragraph. \ifnum\whatsitpenalty>9999 \penalty\whatsitpenalty \fi \else % On the other hand, if we had a nonzero \lastskip, % this make-up glue would be preceded by a non-discardable item % (the whatsit from the \write), so we must insert a \nobreak. \nobreak\vskip\whatsitskip \fi \fi} % The index entry written in the file actually looks like % \entry {sortstring}{page}{topic} % or % \entry {sortstring}{page}{topic}{subtopic} % The texindex program reads in these files and writes files % containing these kinds of lines: % \initial {c} % before the first topic whose initial is c % \entry {topic}{pagelist} % for a topic that is used without subtopics % \primary {topic} % for the beginning of a topic that is used with subtopics % \secondary {subtopic}{pagelist} % for each subtopic. % Define the user-accessible indexing commands % @findex, @vindex, @kindex, @cindex. \def\findex {\fnindex} \def\kindex {\kyindex} \def\cindex {\cpindex} \def\vindex {\vrindex} \def\tindex {\tpindex} \def\pindex {\pgindex} \def\cindexsub {\begingroup\obeylines\cindexsub} {\obeylines % \gdef\cindexsub "#1" #2^^M{\endgroup % \dosubind{cp}{#2}{#1}}} % Define the macros used in formatting output of the sorted index material. % @printindex causes a particular index (the ??s file) to get printed. % It does not print any chapter heading (usually an @unnumbered). % \parseargdef\printindex{\begingroup \dobreak \chapheadingskip{10000}% % \smallfonts \rm \tolerance = 9500 \plainfrenchspacing \everypar = {}% don't want the \kern\-parindent from indentation suppression. % % See if the index file exists and is nonempty. % Change catcode of @ here so that if the index file contains % \initial {@} % as its first line, TeX doesn't complain about mismatched braces % (because it thinks @} is a control sequence). \catcode`\@ = 11 \openin 1 \jobname.#1s \ifeof 1 % \enddoublecolumns gets confused if there is no text in the index, % and it loses the chapter title and the aux file entries for the % index. The easiest way to prevent this problem is to make sure % there is some text. \putwordIndexNonexistent \else % % If the index file exists but is empty, then \openin leaves \ifeof % false. We have to make TeX try to read something from the file, so % it can discover if there is anything in it. \read 1 to \temp \ifeof 1 \putwordIndexIsEmpty \else % Index files are almost Texinfo source, but we use \ as the escape % character. It would be better to use @, but that's too big a change % to make right now. \def\indexbackslash{\backslashcurfont}% \catcode`\\ = 0 \escapechar = `\\ \begindoublecolumns \input \jobname.#1s \enddoublecolumns \fi \fi \closein 1 \endgroup} % These macros are used by the sorted index file itself. % Change them to control the appearance of the index. \def\initial#1{{% % Some minor font changes for the special characters. \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt % % Remove any glue we may have, we'll be inserting our own. \removelastskip % % We like breaks before the index initials, so insert a bonus. \nobreak \vskip 0pt plus 3\baselineskip \penalty 0 \vskip 0pt plus -3\baselineskip % % Typeset the initial. Making this add up to a whole number of % baselineskips increases the chance of the dots lining up from column % to column. It still won't often be perfect, because of the stretch % we need before each entry, but it's better. % % No shrink because it confuses \balancecolumns. \vskip 1.67\baselineskip plus .5\baselineskip \leftline{\secbf #1}% % Do our best not to break after the initial. \nobreak \vskip .33\baselineskip plus .1\baselineskip }} % \entry typesets a paragraph consisting of the text (#1), dot leaders, and % then page number (#2) flushed to the right margin. It is used for index % and table of contents entries. The paragraph is indented by \leftskip. % % A straightforward implementation would start like this: % \def\entry#1#2{... % But this freezes the catcodes in the argument, and can cause problems to % @code, which sets - active. This problem was fixed by a kludge--- % ``-'' was active throughout whole index, but this isn't really right. % The right solution is to prevent \entry from swallowing the whole text. % --kasal, 21nov03 \def\entry{% \begingroup % % Start a new paragraph if necessary, so our assignments below can't % affect previous text. \par % % Do not fill out the last line with white space. \parfillskip = 0in % % No extra space above this paragraph. \parskip = 0in % % Do not prefer a separate line ending with a hyphen to fewer lines. \finalhyphendemerits = 0 % % \hangindent is only relevant when the entry text and page number % don't both fit on one line. In that case, bob suggests starting the % dots pretty far over on the line. Unfortunately, a large % indentation looks wrong when the entry text itself is broken across % lines. So we use a small indentation and put up with long leaders. % % \hangafter is reset to 1 (which is the value we want) at the start % of each paragraph, so we need not do anything with that. \hangindent = 2em % % When the entry text needs to be broken, just fill out the first line % with blank space. \rightskip = 0pt plus1fil % % A bit of stretch before each entry for the benefit of balancing % columns. \vskip 0pt plus1pt % % When reading the text of entry, convert explicit line breaks % from @* into spaces. The user might give these in long section % titles, for instance. \def\*{\unskip\space\ignorespaces}% \def\entrybreak{\hfil\break}% % % Swallow the left brace of the text (first parameter): \afterassignment\doentry \let\temp = } \def\entrybreak{\unskip\space\ignorespaces}% \def\doentry{% \bgroup % Instead of the swallowed brace. \noindent \aftergroup\finishentry % And now comes the text of the entry. } \def\finishentry#1{% % #1 is the page number. % % The following is kludged to not output a line of dots in the index if % there are no page numbers. The next person who breaks this will be % cursed by a Unix daemon. \setbox\boxA = \hbox{#1}% \ifdim\wd\boxA = 0pt \ % \else % % If we must, put the page number on a line of its own, and fill out % this line with blank space. (The \hfil is overwhelmed with the % fill leaders glue in \indexdotfill if the page number does fit.) \hfil\penalty50 \null\nobreak\indexdotfill % Have leaders before the page number. % % The `\ ' here is removed by the implicit \unskip that TeX does as % part of (the primitive) \par. Without it, a spurious underfull % \hbox ensues. \ifpdf \pdfgettoks#1.% \ \the\toksA \else \ #1% \fi \fi \par \endgroup } % Like plain.tex's \dotfill, except uses up at least 1 em. \def\indexdotfill{\cleaders \hbox{$\mathsurround=0pt \mkern1.5mu.\mkern1.5mu$}\hskip 1em plus 1fill} \def\primary #1{\line{#1\hfil}} \newskip\secondaryindent \secondaryindent=0.5cm \def\secondary#1#2{{% \parfillskip=0in \parskip=0in \hangindent=1in \hangafter=1 \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill \ifpdf \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. \else #2 \fi \par }} % Define two-column mode, which we use to typeset indexes. % Adapted from the TeXbook, page 416, which is to say, % the manmac.tex format used to print the TeXbook itself. \catcode`\@=11 \newbox\partialpage \newdimen\doublecolumnhsize \def\begindoublecolumns{\begingroup % ended by \enddoublecolumns % Grab any single-column material above us. \output = {% % % Here is a possibility not foreseen in manmac: if we accumulate a % whole lot of material, we might end up calling this \output % routine twice in a row (see the doublecol-lose test, which is % essentially a couple of indexes with @setchapternewpage off). In % that case we just ship out what is in \partialpage with the normal % output routine. Generally, \partialpage will be empty when this % runs and this will be a no-op. See the indexspread.tex test case. \ifvoid\partialpage \else \onepageout{\pagecontents\partialpage}% \fi % \global\setbox\partialpage = \vbox{% % Unvbox the main output page. \unvbox\PAGE \kern-\topskip \kern\baselineskip }% }% \eject % run that output routine to set \partialpage % % Use the double-column output routine for subsequent pages. \output = {\doublecolumnout}% % % Change the page size parameters. We could do this once outside this % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 % format, but then we repeat the same computation. Repeating a couple % of assignments once per index is clearly meaningless for the % execution time, so we may as well do it in one place. % % First we halve the line length, less a little for the gutter between % the columns. We compute the gutter based on the line length, so it % changes automatically with the paper format. The magic constant % below is chosen so that the gutter has the same value (well, +-<1pt) % as it did when we hard-coded it. % % We put the result in a separate register, \doublecolumhsize, so we % can restore it in \pagesofar, after \hsize itself has (potentially) % been clobbered. % \doublecolumnhsize = \hsize \advance\doublecolumnhsize by -.04154\hsize \divide\doublecolumnhsize by 2 \hsize = \doublecolumnhsize % % Double the \vsize as well. (We don't need a separate register here, % since nobody clobbers \vsize.) \vsize = 2\vsize } % The double-column output routine for all double-column pages except % the last. % \def\doublecolumnout{% \splittopskip=\topskip \splitmaxdepth=\maxdepth % Get the available space for the double columns -- the normal % (undoubled) page height minus any material left over from the % previous page. \dimen@ = \vsize \divide\dimen@ by 2 \advance\dimen@ by -\ht\partialpage % % box0 will be the left-hand column, box2 the right. \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ \onepageout\pagesofar \unvbox255 \penalty\outputpenalty } % % Re-output the contents of the output page -- any previous material, % followed by the two boxes we just split, in box0 and box2. \def\pagesofar{% \unvbox\partialpage % \hsize = \doublecolumnhsize \wd0=\hsize \wd2=\hsize \hbox to\pagewidth{\box0\hfil\box2}% } % % All done with double columns. \def\enddoublecolumns{% % The following penalty ensures that the page builder is exercised % _before_ we change the output routine. This is necessary in the % following situation: % % The last section of the index consists only of a single entry. % Before this section, \pagetotal is less than \pagegoal, so no % break occurs before the last section starts. However, the last % section, consisting of \initial and the single \entry, does not % fit on the page and has to be broken off. Without the following % penalty the page builder will not be exercised until \eject % below, and by that time we'll already have changed the output % routine to the \balancecolumns version, so the next-to-last % double-column page will be processed with \balancecolumns, which % is wrong: The two columns will go to the main vertical list, with % the broken-off section in the recent contributions. As soon as % the output routine finishes, TeX starts reconsidering the page % break. The two columns and the broken-off section both fit on the % page, because the two columns now take up only half of the page % goal. When TeX sees \eject from below which follows the final % section, it invokes the new output routine that we've set after % \balancecolumns below; \onepageout will try to fit the two columns % and the final section into the vbox of \pageheight (see % \pagebody), causing an overfull box. % % Note that glue won't work here, because glue does not exercise the % page builder, unlike penalties (see The TeXbook, pp. 280-281). \penalty0 % \output = {% % Split the last of the double-column material. Leave it on the % current page, no automatic page break. \balancecolumns % % If we end up splitting too much material for the current page, % though, there will be another page break right after this \output % invocation ends. Having called \balancecolumns once, we do not % want to call it again. Therefore, reset \output to its normal % definition right away. (We hope \balancecolumns will never be % called on to balance too much material, but if it is, this makes % the output somewhat more palatable.) \global\output = {\onepageout{\pagecontents\PAGE}}% }% \eject \endgroup % started in \begindoublecolumns % % \pagegoal was set to the doubled \vsize above, since we restarted % the current page. We're now back to normal single-column % typesetting, so reset \pagegoal to the normal \vsize (after the % \endgroup where \vsize got restored). \pagegoal = \vsize } % % Called at the end of the double column material. \def\balancecolumns{% \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. \dimen@ = \ht0 \advance\dimen@ by \topskip \advance\dimen@ by-\baselineskip \divide\dimen@ by 2 % target to split to %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% \splittopskip = \topskip % Loop until we get a decent breakpoint. {% \vbadness = 10000 \loop \global\setbox3 = \copy0 \global\setbox1 = \vsplit3 to \dimen@ \ifdim\ht3>\dimen@ \global\advance\dimen@ by 1pt \repeat }% %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% \setbox0=\vbox to\dimen@{\unvbox1}% \setbox2=\vbox to\dimen@{\unvbox3}% % \pagesofar } \catcode`\@ = \other \message{sectioning,} % Chapters, sections, etc. % Let's start with @part. \outer\parseargdef\part{\partzzz{#1}} \def\partzzz#1{% \chapoddpage \null \vskip.3\vsize % move it down on the page a bit \begingroup \noindent \titlefonts\rmisbold #1\par % the text \let\lastnode=\empty % no node to associate with \writetocentry{part}{#1}{}% but put it in the toc \headingsoff % no headline or footline on the part page \chapoddpage \endgroup } % \unnumberedno is an oxymoron. But we count the unnumbered % sections so that we can refer to them unambiguously in the pdf % outlines by their "section number". We avoid collisions with chapter % numbers by starting them at 10000. (If a document ever has 10000 % chapters, we're in trouble anyway, I'm sure.) \newcount\unnumberedno \unnumberedno = 10000 \newcount\chapno \newcount\secno \secno=0 \newcount\subsecno \subsecno=0 \newcount\subsubsecno \subsubsecno=0 % This counter is funny since it counts through charcodes of letters A, B, ... \newcount\appendixno \appendixno = `\@ % % \def\appendixletter{\char\the\appendixno} % We do the following ugly conditional instead of the above simple % construct for the sake of pdftex, which needs the actual % letter in the expansion, not just typeset. % \def\appendixletter{% \ifnum\appendixno=`A A% \else\ifnum\appendixno=`B B% \else\ifnum\appendixno=`C C% \else\ifnum\appendixno=`D D% \else\ifnum\appendixno=`E E% \else\ifnum\appendixno=`F F% \else\ifnum\appendixno=`G G% \else\ifnum\appendixno=`H H% \else\ifnum\appendixno=`I I% \else\ifnum\appendixno=`J J% \else\ifnum\appendixno=`K K% \else\ifnum\appendixno=`L L% \else\ifnum\appendixno=`M M% \else\ifnum\appendixno=`N N% \else\ifnum\appendixno=`O O% \else\ifnum\appendixno=`P P% \else\ifnum\appendixno=`Q Q% \else\ifnum\appendixno=`R R% \else\ifnum\appendixno=`S S% \else\ifnum\appendixno=`T T% \else\ifnum\appendixno=`U U% \else\ifnum\appendixno=`V V% \else\ifnum\appendixno=`W W% \else\ifnum\appendixno=`X X% \else\ifnum\appendixno=`Y Y% \else\ifnum\appendixno=`Z Z% % The \the is necessary, despite appearances, because \appendixletter is % expanded while writing the .toc file. \char\appendixno is not % expandable, thus it is written literally, thus all appendixes come out % with the same letter (or @) in the toc without it. \else\char\the\appendixno \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} % Each @chapter defines these (using marks) as the number+name, number % and name of the chapter. Page headings and footings can use % these. @section does likewise. \def\thischapter{} \def\thischapternum{} \def\thischaptername{} \def\thissection{} \def\thissectionnum{} \def\thissectionname{} \newcount\absseclevel % used to calculate proper heading level \newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count % @raisesections: treat @section as chapter, @subsection as section, etc. \def\raisesections{\global\advance\secbase by -1} \let\up=\raisesections % original BFox name % @lowersections: treat @chapter as section, @section as subsection, etc. \def\lowersections{\global\advance\secbase by 1} \let\down=\lowersections % original BFox name % we only have subsub. \chardef\maxseclevel = 3 % % A numbered section within an unnumbered changes to unnumbered too. % To achieve this, remember the "biggest" unnum. sec. we are currently in: \chardef\unnlevel = \maxseclevel % % Trace whether the current chapter is an appendix or not: % \chapheadtype is "N" or "A", unnumbered chapters are ignored. \def\chapheadtype{N} % Choose a heading macro % #1 is heading type % #2 is heading level % #3 is text for heading \def\genhead#1#2#3{% % Compute the abs. sec. level: \absseclevel=#2 \advance\absseclevel by \secbase % Make sure \absseclevel doesn't fall outside the range: \ifnum \absseclevel < 0 \absseclevel = 0 \else \ifnum \absseclevel > 3 \absseclevel = 3 \fi \fi % The heading type: \def\headtype{#1}% \if \headtype U% \ifnum \absseclevel < \unnlevel \chardef\unnlevel = \absseclevel \fi \else % Check for appendix sections: \ifnum \absseclevel = 0 \edef\chapheadtype{\headtype}% \else \if \headtype A\if \chapheadtype N% \errmessage{@appendix... within a non-appendix chapter}% \fi\fi \fi % Check for numbered within unnumbered: \ifnum \absseclevel > \unnlevel \def\headtype{U}% \else \chardef\unnlevel = 3 \fi \fi % Now print the heading: \if \headtype U% \ifcase\absseclevel \unnumberedzzz{#3}% \or \unnumberedseczzz{#3}% \or \unnumberedsubseczzz{#3}% \or \unnumberedsubsubseczzz{#3}% \fi \else \if \headtype A% \ifcase\absseclevel \appendixzzz{#3}% \or \appendixsectionzzz{#3}% \or \appendixsubseczzz{#3}% \or \appendixsubsubseczzz{#3}% \fi \else \ifcase\absseclevel \chapterzzz{#3}% \or \seczzz{#3}% \or \numberedsubseczzz{#3}% \or \numberedsubsubseczzz{#3}% \fi \fi \fi \suppressfirstparagraphindent } % an interface: \def\numhead{\genhead N} \def\apphead{\genhead A} \def\unnmhead{\genhead U} % @chapter, @appendix, @unnumbered. Increment top-level counter, reset % all lower-level sectioning counters to zero. % % Also set \chaplevelprefix, which we prepend to @float sequence numbers % (e.g., figures), q.v. By default (before any chapter), that is empty. \let\chaplevelprefix = \empty % \outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz \def\chapterzzz#1{% % section resetting is \global in case the chapter is in a group, such % as an @include file. \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\chapno by 1 % % Used for \float. \gdef\chaplevelprefix{\the\chapno.}% \resetallfloatnos % % \putwordChapter can contain complex things in translations. \toks0=\expandafter{\putwordChapter}% \message{\the\toks0 \space \the\chapno}% % % Write the actual heading. \chapmacro{#1}{Ynumbered}{\the\chapno}% % % So @section and the like are numbered underneath this chapter. \global\let\section = \numberedsec \global\let\subsection = \numberedsubsec \global\let\subsubsection = \numberedsubsubsec } \outer\parseargdef\appendix{\apphead0{#1}} % normally calls appendixzzz % \def\appendixzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\appendixno by 1 \gdef\chaplevelprefix{\appendixletter.}% \resetallfloatnos % % \putwordAppendix can contain complex things in translations. \toks0=\expandafter{\putwordAppendix}% \message{\the\toks0 \space \appendixletter}% % \chapmacro{#1}{Yappendix}{\appendixletter}% % \global\let\section = \appendixsec \global\let\subsection = \appendixsubsec \global\let\subsubsection = \appendixsubsubsec } % normally unnmhead0 calls unnumberedzzz: \outer\parseargdef\unnumbered{\unnmhead0{#1}} \def\unnumberedzzz#1{% \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 \global\advance\unnumberedno by 1 % % Since an unnumbered has no number, no prefix for figures. \global\let\chaplevelprefix = \empty \resetallfloatnos % % This used to be simply \message{#1}, but TeX fully expands the % argument to \message. Therefore, if #1 contained @-commands, TeX % expanded them. For example, in `@unnumbered The @cite{Book}', TeX % expanded @cite (which turns out to cause errors because \cite is meant % to be executed, not expanded). % % Anyway, we don't want the fully-expanded definition of @cite to appear % as a result of the \message, we just want `@cite' itself. We use % \the to achieve this: TeX expands \the only once, % simply yielding the contents of . (We also do this for % the toc entries.) \toks0 = {#1}% \message{(\the\toks0)}% % \chapmacro{#1}{Ynothing}{\the\unnumberedno}% % \global\let\section = \unnumberedsec \global\let\subsection = \unnumberedsubsec \global\let\subsubsection = \unnumberedsubsubsec } % @centerchap is like @unnumbered, but the heading is centered. \outer\parseargdef\centerchap{% % Well, we could do the following in a group, but that would break % an assumption that \chapmacro is called at the outermost level. % Thus we are safer this way: --kasal, 24feb04 \let\centerparametersmaybe = \centerparameters \unnmhead0{#1}% \let\centerparametersmaybe = \relax } % @top is like @unnumbered. \let\top\unnumbered % Sections. % \outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz \def\seczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% } % normally calls appendixsectionzzz: \outer\parseargdef\appendixsection{\apphead1{#1}} \def\appendixsectionzzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% } \let\appendixsec\appendixsection % normally calls unnumberedseczzz: \outer\parseargdef\unnumberedsec{\unnmhead1{#1}} \def\unnumberedseczzz#1{% \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% } % Subsections. % % normally calls numberedsubseczzz: \outer\parseargdef\numberedsubsec{\numhead2{#1}} \def\numberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% } % normally calls appendixsubseczzz: \outer\parseargdef\appendixsubsec{\apphead2{#1}} \def\appendixsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno}% } % normally calls unnumberedsubseczzz: \outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} \def\unnumberedsubseczzz#1{% \global\subsubsecno=0 \global\advance\subsecno by 1 \sectionheading{#1}{subsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno}% } % Subsubsections. % % normally numberedsubsubseczzz: \outer\parseargdef\numberedsubsubsec{\numhead3{#1}} \def\numberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynumbered}% {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally appendixsubsubseczzz: \outer\parseargdef\appendixsubsubsec{\apphead3{#1}} \def\appendixsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Yappendix}% {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% } % normally unnumberedsubsubseczzz: \outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} \def\unnumberedsubsubseczzz#1{% \global\advance\subsubsecno by 1 \sectionheading{#1}{subsubsec}{Ynothing}% {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% } % These macros control what the section commands do, according % to what kind of chapter we are in (ordinary, appendix, or unnumbered). % Define them by default for a numbered chapter. \let\section = \numberedsec \let\subsection = \numberedsubsec \let\subsubsection = \numberedsubsubsec % Define @majorheading, @heading and @subheading \def\majorheading{% {\advance\chapheadingskip by 10pt \chapbreak }% \parsearg\chapheadingzzz } \def\chapheading{\chapbreak \parsearg\chapheadingzzz} \def\chapheadingzzz#1{% \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip \nobreak \suppressfirstparagraphindent } % @heading, @subheading, @subsubheading. \parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} \parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} \suppressfirstparagraphindent} % These macros generate a chapter, section, etc. heading only % (including whitespace, linebreaking, etc. around it), % given all the information in convenient, parsed form. % Args are the skip and penalty (usually negative) \def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} % Parameter controlling skip before chapter headings (if needed) \newskip\chapheadingskip % Define plain chapter starts, and page on/off switching for it. \def\chapbreak{\dobreak \chapheadingskip {-4000}} \def\chappager{\par\vfill\supereject} % Because \domark is called before \chapoddpage, the filler page will % get the headings for the next chapter, which is wrong. But we don't % care -- we just disable all headings on the filler page. \def\chapoddpage{% \chappager \ifodd\pageno \else \begingroup \headingsoff \null \chappager \endgroup \fi } \def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} \def\CHAPPAGoff{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chapbreak \global\let\pagealignmacro=\chappager} \def\CHAPPAGon{% \global\let\contentsalignmacro = \chappager \global\let\pchapsepmacro=\chappager \global\let\pagealignmacro=\chappager \global\def\HEADINGSon{\HEADINGSsingle}} \def\CHAPPAGodd{% \global\let\contentsalignmacro = \chapoddpage \global\let\pchapsepmacro=\chapoddpage \global\let\pagealignmacro=\chapoddpage \global\def\HEADINGSon{\HEADINGSdouble}} \CHAPPAGon % Chapter opening. % % #1 is the text, #2 is the section type (Ynumbered, Ynothing, % Yappendix, Yomitfromtoc), #3 the chapter number. % % To test against our argument. \def\Ynothingkeyword{Ynothing} \def\Yomitfromtockeyword{Yomitfromtoc} \def\Yappendixkeyword{Yappendix} % \def\chapmacro#1#2#3{% % Insert the first mark before the heading break (see notes for \domark). \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \gdef\lastsectiondefs{\gdef\thissectionname{}\gdef\thissectionnum{}% \gdef\thissection{}}% % \def\temptype{#2}% \ifx\temptype\Ynothingkeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{\thischaptername}}% \else\ifx\temptype\Yomitfromtockeyword \gdef\lastchapterdefs{\gdef\thischaptername{#1}\gdef\thischapternum{}% \gdef\thischapter{}}% \else\ifx\temptype\Yappendixkeyword \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\appendixletter}% % \noexpand\putwordAppendix avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordAppendix{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \else \toks0={#1}% \xdef\lastchapterdefs{% \gdef\noexpand\thischaptername{\the\toks0}% \gdef\noexpand\thischapternum{\the\chapno}% % \noexpand\putwordChapter avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thischapter{\noexpand\putwordChapter{} \noexpand\thischapternum: \noexpand\thischaptername}% }% \fi\fi\fi % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert the chapter heading break. \pchapsepmacro % % Now the second mark, after the heading break. No break points % between here and the heading. \let\prevchapterdefs=\lastchapterdefs \let\prevsectiondefs=\lastsectiondefs \domark % {% \chapfonts \rmisbold % % Have to define \lastsection before calling \donoderef, because the % xref code eventually uses it. On the other hand, it has to be called % after \pchapsepmacro, or the headline will change too soon. \gdef\lastsection{#1}% % % Only insert the separating space if we have a chapter/appendix % number, and don't print the unnumbered ``number''. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unnchap}% \else\ifx\temptype\Yomitfromtockeyword \setbox0 = \hbox{}% contents like unnumbered, but no toc entry \def\toctype{omit}% \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% \def\toctype{app}% \else \setbox0 = \hbox{#3\enspace}% \def\toctype{numchap}% \fi\fi\fi % % Write the toc entry for this chapter. Must come before the % \donoderef, because we include the current node name in the toc % entry, and \donoderef resets it to empty. \writetocentry{\toctype}{#1}{#3}% % % For pdftex, we have to write out the node definition (aka, make % the pdfdest) after any page break, but before the actual text has % been typeset. If the destination for the pdf outline is after the % text, then jumping from the outline may wind up with the text not % being visible, for instance under high magnification. \donoderef{#2}% % % Typeset the actual heading. \nobreak % Avoid page breaks at the interline glue. \vbox{\raggedtitlesettings \hangindent=\wd0 \centerparametersmaybe \unhbox0 #1\par}% }% \nobreak\bigskip % no page break after a chapter title \nobreak } % @centerchap -- centered and unnumbered. \let\centerparametersmaybe = \relax \def\centerparameters{% \advance\rightskip by 3\rightskip \leftskip = \rightskip \parfillskip = 0pt } % I don't think this chapter style is supported any more, so I'm not % updating it with the new noderef stuff. We'll see. --karl, 11aug03. % \def\setchapterstyle #1 {\csname CHAPF#1\endcsname} % \def\unnchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings #1\par}% \nobreak\bigskip\nobreak } \def\chfopen #1#2{\chapoddpage {\chapfonts \vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% \par\penalty 5000 % } \def\centerchfopen #1{% \chapoddpage \vbox{\chapfonts \raggedtitlesettings \hfill #1\hfill}% \nobreak\bigskip \nobreak } \def\CHAPFopen{% \global\let\chapmacro=\chfopen \global\let\centerchapmacro=\centerchfopen} % Section titles. These macros combine the section number parts and % call the generic \sectionheading to do the printing. % \newskip\secheadingskip \def\secheadingbreak{\dobreak \secheadingskip{-1000}} % Subsection titles. \newskip\subsecheadingskip \def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} % Subsubsection titles. \def\subsubsecheadingskip{\subsecheadingskip} \def\subsubsecheadingbreak{\subsecheadingbreak} % Print any size, any type, section title. % % #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is % the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the % section number. % \def\seckeyword{sec} % \def\sectionheading#1#2#3#4{% {% \checkenv{}% should not be in an environment. % % Switch to the right set of fonts. \csname #2fonts\endcsname \rmisbold % \def\sectionlevel{#2}% \def\temptype{#3}% % % Insert first mark before the heading break (see notes for \domark). \let\prevsectiondefs=\lastsectiondefs \ifx\temptype\Ynothingkeyword \ifx\sectionlevel\seckeyword \gdef\lastsectiondefs{\gdef\thissectionname{#1}\gdef\thissectionnum{}% \gdef\thissection{\thissectionname}}% \fi \else\ifx\temptype\Yomitfromtockeyword % Don't redefine \thissection. \else\ifx\temptype\Yappendixkeyword \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \else \ifx\sectionlevel\seckeyword \toks0={#1}% \xdef\lastsectiondefs{% \gdef\noexpand\thissectionname{\the\toks0}% \gdef\noexpand\thissectionnum{#4}% % \noexpand\putwordSection avoids expanding indigestible % commands in some of the translations. \gdef\noexpand\thissection{\noexpand\putwordSection{} \noexpand\thissectionnum: \noexpand\thissectionname}% }% \fi \fi\fi\fi % % Go into vertical mode. Usually we'll already be there, but we % don't want the following whatsit to end up in a preceding paragraph % if the document didn't happen to have a blank line. \par % % Output the mark. Pass it through \safewhatsit, to take care of % the preceding space. \safewhatsit\domark % % Insert space above the heading. \csname #2headingbreak\endcsname % % Now the second mark, after the heading break. No break points % between here and the heading. \global\let\prevsectiondefs=\lastsectiondefs \domark % % Only insert the space after the number if we have a section number. \ifx\temptype\Ynothingkeyword \setbox0 = \hbox{}% \def\toctype{unn}% \gdef\lastsection{#1}% \else\ifx\temptype\Yomitfromtockeyword % for @headings -- no section number, don't include in toc, % and don't redefine \lastsection. \setbox0 = \hbox{}% \def\toctype{omit}% \let\sectionlevel=\empty \else\ifx\temptype\Yappendixkeyword \setbox0 = \hbox{#4\enspace}% \def\toctype{app}% \gdef\lastsection{#1}% \else \setbox0 = \hbox{#4\enspace}% \def\toctype{num}% \gdef\lastsection{#1}% \fi\fi\fi % % Write the toc entry (before \donoderef). See comments in \chapmacro. \writetocentry{\toctype\sectionlevel}{#1}{#4}% % % Write the node reference (= pdf destination for pdftex). % Again, see comments in \chapmacro. \donoderef{#3}% % % Interline glue will be inserted when the vbox is completed. % That glue will be a valid breakpoint for the page, since it'll be % preceded by a whatsit (usually from the \donoderef, or from the % \writetocentry if there was no node). We don't want to allow that % break, since then the whatsits could end up on page n while the % section is on page n+1, thus toc/etc. are wrong. Debian bug 276000. \nobreak % % Output the actual section heading. \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \ptexraggedright \hangindent=\wd0 % zero if no section number \unhbox0 #1}% }% % Add extra space after the heading -- half of whatever came above it. % Don't allow stretch, though. \kern .5 \csname #2headingskip\endcsname % % Do not let the kern be a potential breakpoint, as it would be if it % was followed by glue. \nobreak % % We'll almost certainly start a paragraph next, so don't let that % glue accumulate. (Not a breakpoint because it's preceded by a % discardable item.) However, when a paragraph is not started next % (\startdefun, \cartouche, \center, etc.), this needs to be wiped out % or the negative glue will cause weirdly wrong output, typically % obscuring the section heading with something else. \vskip-\parskip % % This is so the last item on the main vertical list is a known % \penalty > 10000, so \startdefun, etc., can recognize the situation % and do the needful. \penalty 10001 } \message{toc,} % Table of contents. \newwrite\tocfile % Write an entry to the toc file, opening it if necessary. % Called from @chapter, etc. % % Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} % We append the current node name (if any) and page number as additional % arguments for the \{chap,sec,...}entry macros which will eventually % read this. The node name is used in the pdf outlines as the % destination to jump to. % % We open the .toc file for writing here instead of at @setfilename (or % any other fixed time) so that @contents can be anywhere in the document. % But if #1 is `omit', then we don't do anything. This is used for the % table of contents chapter openings themselves. % \newif\iftocfileopened \def\omitkeyword{omit}% % \def\writetocentry#1#2#3{% \edef\writetoctype{#1}% \ifx\writetoctype\omitkeyword \else \iftocfileopened\else \immediate\openout\tocfile = \jobname.toc \global\tocfileopenedtrue \fi % \iflinks {\atdummies \edef\temp{% \write\tocfile{@#1entry{#2}{#3}{\lastnode}{\noexpand\folio}}}% \temp }% \fi \fi % % Tell \shipout to create a pdf destination on each page, if we're % writing pdf. These are used in the table of contents. We can't % just write one on every page because the title pages are numbered % 1 and 2 (the page numbers aren't printed), and so are the first % two pages of the document. Thus, we'd have two destinations named % `1', and two named `2'. \ifpdf \global\pdfmakepagedesttrue \fi } % These characters do not print properly in the Computer Modern roman % fonts, so we must take special care. This is more or less redundant % with the Texinfo input format setup at the end of this file. % \def\activecatcodes{% \catcode`\"=\active \catcode`\$=\active \catcode`\<=\active \catcode`\>=\active \catcode`\\=\active \catcode`\^=\active \catcode`\_=\active \catcode`\|=\active \catcode`\~=\active } % Read the toc file, which is essentially Texinfo input. \def\readtocfile{% \setupdatafile \activecatcodes \input \tocreadfilename } \newskip\contentsrightmargin \contentsrightmargin=1in \newcount\savepageno \newcount\lastnegativepageno \lastnegativepageno = -1 % Prepare to read what we've written to \tocfile. % \def\startcontents#1{% % If @setchapternewpage on, and @headings double, the contents should % start on an odd page, unlike chapters. Thus, we maintain % \contentsalignmacro in parallel with \pagealignmacro. % From: Torbjorn Granlund \contentsalignmacro \immediate\closeout\tocfile % % Don't need to put `Contents' or `Short Contents' in the headline. % It is abundantly clear what they are. \chapmacro{#1}{Yomitfromtoc}{}% % \savepageno = \pageno \begingroup % Set up to handle contents files properly. \raggedbottom % Worry more about breakpoints than the bottom. \advance\hsize by -\contentsrightmargin % Don't use the full line length. % % Roman numerals for page numbers. \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi } % redefined for the two-volume lispref. We always output on % \jobname.toc even if this is redefined. % \def\tocreadfilename{\jobname.toc} % Normal (long) toc. % \def\contents{% \startcontents{\putwordTOC}% \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \ifeof 1 \else \pdfmakeoutlines \fi \closein 1 \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } % And just the chapters. \def\summarycontents{% \startcontents{\putwordShortTOC}% % \let\partentry = \shortpartentry \let\numchapentry = \shortchapentry \let\appentry = \shortchapentry \let\unnchapentry = \shortunnchapentry % We want a true roman here for the page numbers. \secfonts \let\rm=\shortcontrm \let\bf=\shortcontbf \let\sl=\shortcontsl \let\tt=\shortconttt \rm \hyphenpenalty = 10000 \advance\baselineskip by 1pt % Open it up a little. \def\numsecentry##1##2##3##4{} \let\appsecentry = \numsecentry \let\unnsecentry = \numsecentry \let\numsubsecentry = \numsecentry \let\appsubsecentry = \numsecentry \let\unnsubsecentry = \numsecentry \let\numsubsubsecentry = \numsecentry \let\appsubsubsecentry = \numsecentry \let\unnsubsubsecentry = \numsecentry \openin 1 \tocreadfilename\space \ifeof 1 \else \readtocfile \fi \closein 1 \vfill \eject \contentsalignmacro % in case @setchapternewpage odd is in effect \endgroup \lastnegativepageno = \pageno \global\pageno = \savepageno } \let\shortcontents = \summarycontents % Typeset the label for a chapter or appendix for the short contents. % The arg is, e.g., `A' for an appendix, or `3' for a chapter. % \def\shortchaplabel#1{% % This space should be enough, since a single number is .5em, and the % widest letter (M) is 1em, at least in the Computer Modern fonts. % But use \hss just in case. % (This space doesn't include the extra space that gets added after % the label; that gets put in by \shortchapentry above.) % % We'd like to right-justify chapter numbers, but that looks strange % with appendix letters. And right-justifying numbers and % left-justifying letters looks strange when there is less than 10 % chapters. Have to read the whole toc once to know how many chapters % there are before deciding ... \hbox to 1em{#1\hss}% } % These macros generate individual entries in the table of contents. % The first argument is the chapter or section name. % The last argument is the page number. % The arguments in between are the chapter number, section number, ... % Parts, in the main contents. Replace the part number, which doesn't % exist, with an empty box. Let's hope all the numbers have the same width. % Also ignore the page number, which is conventionally not printed. \def\numeralbox{\setbox0=\hbox{8}\hbox to \wd0{\hfil}} \def\partentry#1#2#3#4{\dochapentry{\numeralbox\labelspace#1}{}} % % Parts, in the short toc. \def\shortpartentry#1#2#3#4{% \penalty-300 \vskip.5\baselineskip plus.15\baselineskip minus.1\baselineskip \shortchapentry{{\bf #1}}{\numeralbox}{}{}% } % Chapters, in the main contents. \def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} % % Chapters, in the short toc. % See comments in \dochapentry re vbox and related settings. \def\shortchapentry#1#2#3#4{% \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% } % Appendices, in the main contents. % Need the word Appendix, and a fixed-size box. % \def\appendixbox#1{% % We use M since it's probably the widest letter. \setbox0 = \hbox{\putwordAppendix{} M}% \hbox to \wd0{\putwordAppendix{} #1\hss}} % \def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} % Unnumbered chapters. \def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} \def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} % Sections. \def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} \let\appsecentry=\numsecentry \def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} % Subsections. \def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} \let\appsubsecentry=\numsubsecentry \def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} % And subsubsections. \def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} \let\appsubsubsecentry=\numsubsubsecentry \def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} % This parameter controls the indentation of the various levels. % Same as \defaultparindent. \newdimen\tocindent \tocindent = 15pt % Now for the actual typesetting. In all these, #1 is the text and #2 is the % page number. % % If the toc has to be broken over pages, we want it to be at chapters % if at all possible; hence the \penalty. \def\dochapentry#1#2{% \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip \begingroup \chapentryfonts \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup \nobreak\vskip .25\baselineskip plus.1\baselineskip } \def\dosecentry#1#2{\begingroup \secentryfonts \leftskip=\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsecentry#1#2{\begingroup \subsecentryfonts \leftskip=2\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} \def\dosubsubsecentry#1#2{\begingroup \subsubsecentryfonts \leftskip=3\tocindent \tocentry{#1}{\dopageno\bgroup#2\egroup}% \endgroup} % We use the same \entry macro as for the index entries. \let\tocentry = \entry % Space between chapter (or whatever) number and the title. \def\labelspace{\hskip1em \relax} \def\dopageno#1{{\rm #1}} \def\doshortpageno#1{{\rm #1}} \def\chapentryfonts{\secfonts \rm} \def\secentryfonts{\textfonts} \def\subsecentryfonts{\textfonts} \def\subsubsecentryfonts{\textfonts} \message{environments,} % @foo ... @end foo. % @tex ... @end tex escapes into raw TeX temporarily. % One exception: @ is still an escape character, so that @end tex works. % But \@ or @@ will get a plain @ character. \envdef\tex{% \setupmarkupstyle{tex}% \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie \catcode `\%=14 \catcode `\+=\other \catcode `\"=\other \catcode `\|=\other \catcode `\<=\other \catcode `\>=\other \catcode `\`=\other \catcode `\'=\other \escapechar=`\\ % % ' is active in math mode (mathcode"8000). So reset it, and all our % other math active characters (just in case), to plain's definitions. \mathactive % \let\b=\ptexb \let\bullet=\ptexbullet \let\c=\ptexc \let\,=\ptexcomma \let\.=\ptexdot \let\dots=\ptexdots \let\equiv=\ptexequiv \let\!=\ptexexclam \let\i=\ptexi \let\indent=\ptexindent \let\noindent=\ptexnoindent \let\{=\ptexlbrace \let\+=\tabalign \let\}=\ptexrbrace \let\/=\ptexslash \let\*=\ptexstar \let\t=\ptext \expandafter \let\csname top\endcsname=\ptextop % we've made it outer \let\frenchspacing=\plainfrenchspacing % \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% \def\@{@}% } % There is no need to define \Etex. % Define @lisp ... @end lisp. % @lisp environment forms a group so it can rebind things, % including the definition of @end lisp (which normally is erroneous). % Amount to narrow the margins by for @lisp. \newskip\lispnarrowing \lispnarrowing=0.4in % This is the definition that ^^M gets inside @lisp, @example, and other % such environments. \null is better than a space, since it doesn't % have any width. \def\lisppar{\null\endgraf} % This space is always present above and below environments. \newskip\envskipamount \envskipamount = 0pt % Make spacing and below environment symmetrical. We use \parskip here % to help in doing that, since in @example-like environments \parskip % is reset to zero; thus the \afterenvbreak inserts no space -- but the % start of the next paragraph will insert \parskip. % \def\aboveenvbreak{{% % =10000 instead of <10000 because of a special case in \itemzzz and % \sectionheading, q.v. \ifnum \lastpenalty=10000 \else \advance\envskipamount by \parskip \endgraf \ifdim\lastskip<\envskipamount \removelastskip % it's not a good place to break if the last penalty was \nobreak % or better ... \ifnum\lastpenalty<10000 \penalty-50 \fi \vskip\envskipamount \fi \fi }} \let\afterenvbreak = \aboveenvbreak % \nonarrowing is a flag. If "set", @lisp etc don't narrow margins; it will % also clear it, so that its embedded environments do the narrowing again. \let\nonarrowing=\relax % @cartouche ... @end cartouche: draw rectangle w/rounded corners around % environment contents. \font\circle=lcircle10 \newdimen\circthick \newdimen\cartouter\newdimen\cartinner \newskip\normbskip\newskip\normpskip\newskip\normlskip \circthick=\fontdimen8\circle % \def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth \def\ctr{{\hskip 6pt\circle\char'010}} \def\cbl{{\circle\char'012\hskip -6pt}} \def\cbr{{\hskip 6pt\circle\char'011}} \def\carttop{\hbox to \cartouter{\hskip\lskip \ctl\leaders\hrule height\circthick\hfil\ctr \hskip\rskip}} \def\cartbot{\hbox to \cartouter{\hskip\lskip \cbl\leaders\hrule height\circthick\hfil\cbr \hskip\rskip}} % \newskip\lskip\newskip\rskip \envdef\cartouche{% \ifhmode\par\fi % can't be in the midst of a paragraph. \startsavinginserts \lskip=\leftskip \rskip=\rightskip \leftskip=0pt\rightskip=0pt % we want these *outside*. \cartinner=\hsize \advance\cartinner by-\lskip \advance\cartinner by-\rskip \cartouter=\hsize \advance\cartouter by 18.4pt % allow for 3pt kerns on either % side, and for 6pt waste from % each corner char, and rule thickness \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip % Flag to tell @lisp, etc., not to narrow margin. \let\nonarrowing = t% % % If this cartouche directly follows a sectioning command, we need the % \parskip glue (backspaced over by default) or the cartouche can % collide with the section heading. \ifnum\lastpenalty>10000 \vskip\parskip \penalty\lastpenalty \fi % \vbox\bgroup \baselineskip=0pt\parskip=0pt\lineskip=0pt \carttop \hbox\bgroup \hskip\lskip \vrule\kern3pt \vbox\bgroup \kern3pt \hsize=\cartinner \baselineskip=\normbskip \lineskip=\normlskip \parskip=\normpskip \vskip -\parskip \comment % For explanation, see the end of def\group. } \def\Ecartouche{% \ifhmode\par\fi \kern3pt \egroup \kern3pt\vrule \hskip\rskip \egroup \cartbot \egroup \checkinserts } % This macro is called at the beginning of all the @example variants, % inside a group. \newdimen\nonfillparindent \def\nonfillstart{% \aboveenvbreak \ifdim\hfuzz < 12pt \hfuzz = 12pt \fi % Don't be fussy \sepspaces % Make spaces be word-separators rather than space tokens. \let\par = \lisppar % don't ignore blank lines \obeylines % each line of input is a line of output \parskip = 0pt % Turn off paragraph indentation but redefine \indent to emulate % the normal \indent. \nonfillparindent=\parindent \parindent = 0pt \let\indent\nonfillindent % \emergencystretch = 0pt % don't try to avoid overfull boxes \ifx\nonarrowing\relax \advance \leftskip by \lispnarrowing \exdentamount=\lispnarrowing \else \let\nonarrowing = \relax \fi \let\exdent=\nofillexdent } \begingroup \obeyspaces % We want to swallow spaces (but not other tokens) after the fake % @indent in our nonfill-environments, where spaces are normally % active and set to @tie, resulting in them not being ignored after % @indent. \gdef\nonfillindent{\futurelet\temp\nonfillindentcheck}% \gdef\nonfillindentcheck{% \ifx\temp % \expandafter\nonfillindentgobble% \else% \leavevmode\nonfillindentbox% \fi% }% \endgroup \def\nonfillindentgobble#1{\nonfillindent} \def\nonfillindentbox{\hbox to \nonfillparindent{\hss}} % If you want all examples etc. small: @set dispenvsize small. % If you want even small examples the full size: @set dispenvsize nosmall. % This affects the following displayed environments: % @example, @display, @format, @lisp % \def\smallword{small} \def\nosmallword{nosmall} \let\SETdispenvsize\relax \def\setnormaldispenv{% \ifx\SETdispenvsize\smallword % end paragraph for sake of leading, in case document has no blank % line. This is redundant with what happens in \aboveenvbreak, but % we need to do it before changing the fonts, and it's inconvenient % to change the fonts afterward. \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } \def\setsmalldispenv{% \ifx\SETdispenvsize\nosmallword \else \ifnum \lastpenalty=10000 \else \endgraf \fi \smallexamplefonts \rm \fi } % We often define two environments, @foo and @smallfoo. % Let's do it in one command. #1 is the env name, #2 the definition. \def\makedispenvdef#1#2{% \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2}% \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2}% \expandafter\let\csname E#1\endcsname \afterenvbreak \expandafter\let\csname Esmall#1\endcsname \afterenvbreak } % Define two environment synonyms (#1 and #2) for an environment. \def\maketwodispenvdef#1#2#3{% \makedispenvdef{#1}{#3}% \makedispenvdef{#2}{#3}% } % % @lisp: indented, narrowed, typewriter font; % @example: same as @lisp. % % @smallexample and @smalllisp: use smaller fonts. % Originally contributed by Pavel@xerox. % \maketwodispenvdef{lisp}{example}{% \nonfillstart \tt\setupmarkupstyle{example}% \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. \gobble % eat return } % @display/@smalldisplay: same as @lisp except keep current font. % \makedispenvdef{display}{% \nonfillstart \gobble } % @format/@smallformat: same as @display except don't narrow margins. % \makedispenvdef{format}{% \let\nonarrowing = t% \nonfillstart \gobble } % @flushleft: same as @format, but doesn't obey \SETdispenvsize. \envdef\flushleft{% \let\nonarrowing = t% \nonfillstart \gobble } \let\Eflushleft = \afterenvbreak % @flushright. % \envdef\flushright{% \let\nonarrowing = t% \nonfillstart \advance\leftskip by 0pt plus 1fill\relax \gobble } \let\Eflushright = \afterenvbreak % @raggedright does more-or-less normal line breaking but no right % justification. From plain.tex. \envdef\raggedright{% \rightskip0pt plus2em \spaceskip.3333em \xspaceskip.5em\relax } \let\Eraggedright\par \envdef\raggedleft{% \parindent=0pt \leftskip0pt plus2em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedleft\par \envdef\raggedcenter{% \parindent=0pt \rightskip0pt plus1em \leftskip0pt plus1em \spaceskip.3333em \xspaceskip.5em \parfillskip=0pt \hbadness=10000 % Last line will usually be underfull, so turn off % badness reporting. } \let\Eraggedcenter\par % @quotation does normal linebreaking (hence we can't use \nonfillstart) % and narrows the margins. We keep \parskip nonzero in general, since % we're doing normal filling. So, when using \aboveenvbreak and % \afterenvbreak, temporarily make \parskip 0. % \makedispenvdef{quotation}{\quotationstart} % \def\quotationstart{% \indentedblockstart % same as \indentedblock, but increase right margin too. \ifx\nonarrowing\relax \advance\rightskip by \lispnarrowing \fi \parsearg\quotationlabel } % We have retained a nonzero parskip for the environment, since we're % doing normal filling. % \def\Equotation{% \par \ifx\quotationauthor\thisisundefined\else % indent a bit. \leftline{\kern 2\leftskip \sl ---\quotationauthor}% \fi {\parskip=0pt \afterenvbreak}% } \def\Esmallquotation{\Equotation} % If we're given an argument, typeset it in bold with a colon after. \def\quotationlabel#1{% \def\temp{#1}% \ifx\temp\empty \else {\bf #1: }% \fi } % @indentedblock is like @quotation, but indents only on the left and % has no optional argument. % \makedispenvdef{indentedblock}{\indentedblockstart} % \def\indentedblockstart{% {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip \parindent=0pt % % @cartouche defines \nonarrowing to inhibit narrowing at next level down. \ifx\nonarrowing\relax \advance\leftskip by \lispnarrowing \exdentamount = \lispnarrowing \else \let\nonarrowing = \relax \fi } % Keep a nonzero parskip for the environment, since we're doing normal filling. % \def\Eindentedblock{% \par {\parskip=0pt \afterenvbreak}% } \def\Esmallindentedblock{\Eindentedblock} % LaTeX-like @verbatim...@end verbatim and @verb{...} % If we want to allow any as delimiter, % we need the curly braces so that makeinfo sees the @verb command, eg: % `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org % % [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. % % [Knuth] p.344; only we need to do the other characters Texinfo sets % active too. Otherwise, they get lost as the first character on a % verbatim line. \def\dospecials{% \do\ \do\\\do\{\do\}\do\$\do\&% \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% \do\<\do\>\do\|\do\@\do+\do\"% % Don't do the quotes -- if we do, @set txicodequoteundirected and % @set txicodequotebacktick will not have effect on @verb and % @verbatim, and ?` and !` ligatures won't get disabled. %\do\`\do\'% } % % [Knuth] p. 380 \def\uncatcodespecials{% \def\do##1{\catcode`##1=\other}\dospecials} % % Setup for the @verb command. % % Eight spaces for a tab \begingroup \catcode`\^^I=\active \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} \endgroup % \def\setupverb{% \tt % easiest (and conventionally used) font for verbatim \def\par{\leavevmode\endgraf}% \setupmarkupstyle{verb}% \tabeightspaces % Respect line breaks, % print special symbols as themselves, and % make each space count % must do in this order: \obeylines \uncatcodespecials \sepspaces } % Setup for the @verbatim environment % % Real tab expansion. \newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount % % We typeset each line of the verbatim in an \hbox, so we can handle % tabs. The \global is in case the verbatim line starts with an accent, % or some other command that starts with a begin-group. Otherwise, the % entire \verbbox would disappear at the corresponding end-group, before % it is typeset. Meanwhile, we can't have nested verbatim commands % (can we?), so the \global won't be overwriting itself. \newbox\verbbox \def\starttabbox{\global\setbox\verbbox=\hbox\bgroup} % \begingroup \catcode`\^^I=\active \gdef\tabexpand{% \catcode`\^^I=\active \def^^I{\leavevmode\egroup \dimen\verbbox=\wd\verbbox % the width so far, or since the previous tab \divide\dimen\verbbox by\tabw \multiply\dimen\verbbox by\tabw % compute previous multiple of \tabw \advance\dimen\verbbox by\tabw % advance to next multiple of \tabw \wd\verbbox=\dimen\verbbox \box\verbbox \starttabbox }% } \endgroup % start the verbatim environment. \def\setupverbatim{% \let\nonarrowing = t% \nonfillstart \tt % easiest (and conventionally used) font for verbatim % The \leavevmode here is for blank lines. Otherwise, we would % never \starttabox and the \egroup would end verbatim mode. \def\par{\leavevmode\egroup\box\verbbox\endgraf}% \tabexpand \setupmarkupstyle{verbatim}% % Respect line breaks, % print special symbols as themselves, and % make each space count. % Must do in this order: \obeylines \uncatcodespecials \sepspaces \everypar{\starttabbox}% } % Do the @verb magic: verbatim text is quoted by unique % delimiter characters. Before first delimiter expect a % right brace, after last delimiter expect closing brace: % % \def\doverb'{'#1'}'{#1} % % [Knuth] p. 382; only eat outer {} \begingroup \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] \endgroup % \def\verb{\begingroup\setupverb\doverb} % % % Do the @verbatim magic: define the macro \doverbatim so that % the (first) argument ends when '@end verbatim' is reached, ie: % % \def\doverbatim#1@end verbatim{#1} % % For Texinfo it's a lot easier than for LaTeX, % because texinfo's \verbatim doesn't stop at '\end{verbatim}': % we need not redefine '\', '{' and '}'. % % Inspired by LaTeX's verbatim command set [latex.ltx] % \begingroup \catcode`\ =\active \obeylines % % ignore everything up to the first ^^M, that's the newline at the end % of the @verbatim input line itself. Otherwise we get an extra blank % line in the output. \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% % We really want {...\end verbatim} in the body of the macro, but % without the active space; thus we have to use \xdef and \gobble. \endgroup % \envdef\verbatim{% \setupverbatim\doverbatim } \let\Everbatim = \afterenvbreak % @verbatiminclude FILE - insert text of file in verbatim environment. % \def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} % \def\doverbatiminclude#1{% {% \makevalueexpandable \setupverbatim \indexnofonts % Allow `@@' and other weird things in file names. \wlog{texinfo.tex: doing @verbatiminclude of #1^^J}% \input #1 \afterenvbreak }% } % @copying ... @end copying. % Save the text away for @insertcopying later. % % We save the uninterpreted tokens, rather than creating a box. % Saving the text in a box would be much easier, but then all the % typesetting commands (@smallbook, font changes, etc.) have to be done % beforehand -- and a) we want @copying to be done first in the source % file; b) letting users define the frontmatter in as flexible order as % possible is very desirable. % \def\copying{\checkenv{}\begingroup\scanargctxt\docopying} \def\docopying#1@end copying{\endgroup\def\copyingtext{#1}} % \def\insertcopying{% \begingroup \parindent = 0pt % paragraph indentation looks wrong on title page \scanexp\copyingtext \endgroup } \message{defuns,} % @defun etc. \newskip\defbodyindent \defbodyindent=.4in \newskip\defargsindent \defargsindent=50pt \newskip\deflastargmargin \deflastargmargin=18pt \newcount\defunpenalty % Start the processing of @deffn: \def\startdefun{% \ifnum\lastpenalty<10000 \medbreak \defunpenalty=10003 % Will keep this @deffn together with the % following @def command, see below. \else % If there are two @def commands in a row, we'll have a \nobreak, % which is there to keep the function description together with its % header. But if there's nothing but headers, we need to allow a % break somewhere. Check specifically for penalty 10002, inserted % by \printdefunline, instead of 10000, since the sectioning % commands also insert a nobreak penalty, and we don't want to allow % a break between a section heading and a defun. % % As a further refinement, we avoid "club" headers by signalling % with penalty of 10003 after the very first @deffn in the % sequence (see above), and penalty of 10002 after any following % @def command. \ifnum\lastpenalty=10002 \penalty2000 \else \defunpenalty=10002 \fi % % Similarly, after a section heading, do not allow a break. % But do insert the glue. \medskip % preceded by discardable penalty, so not a breakpoint \fi % \parindent=0in \advance\leftskip by \defbodyindent \exdentamount=\defbodyindent } \def\dodefunx#1{% % First, check whether we are in the right environment: \checkenv#1% % % As above, allow line break if we have multiple x headers in a row. % It's not a great place, though. \ifnum\lastpenalty=10002 \penalty3000 \else \defunpenalty=10002 \fi % % And now, it's time to reuse the body of the original defun: \expandafter\gobbledefun#1% } \def\gobbledefun#1\startdefun{} % \printdefunline \deffnheader{text} % \def\printdefunline#1#2{% \begingroup % call \deffnheader: #1#2 \endheader % common ending: \interlinepenalty = 10000 \advance\rightskip by 0pt plus 1fil\relax \endgraf \nobreak\vskip -\parskip \penalty\defunpenalty % signal to \startdefun and \dodefunx % Some of the @defun-type tags do not enable magic parentheses, % rendering the following check redundant. But we don't optimize. \checkparencounts \endgroup } \def\Edefun{\endgraf\medbreak} % \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; % the only thing remaining is to define \deffnheader. % \def\makedefun#1{% \expandafter\let\csname E#1\endcsname = \Edefun \edef\temp{\noexpand\domakedefun \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% \temp } % \domakedefun \deffn \deffnx \deffnheader % % Define \deffn and \deffnx, without parameters. % \deffnheader has to be defined explicitly. % \def\domakedefun#1#2#3{% \envdef#1{% \startdefun \doingtypefnfalse % distinguish typed functions from all else \parseargusing\activeparens{\printdefunline#3}% }% \def#2{\dodefunx#1}% \def#3% } \newif\ifdoingtypefn % doing typed function? \newif\ifrettypeownline % typeset return type on its own line? % @deftypefnnewline on|off says whether the return type of typed functions % are printed on their own line. This affects @deftypefn, @deftypefun, % @deftypeop, and @deftypemethod. % \parseargdef\deftypefnnewline{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETtxideftypefnnl\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETtxideftypefnnl\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @txideftypefnnl value `\temp', must be on|off}% \fi\fi } % Untyped functions: % @deffn category name args \makedefun{deffn}{\deffngeneral{}} % @deffn category class name args \makedefun{defop}#1 {\defopon{#1\ \putwordon}} % \defopon {category on}class name args \def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deffngeneral {subind}category name args % \def\deffngeneral#1#2 #3 #4\endheader{% % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. \dosubind{fn}{\code{#3}}{#1}% \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% } % Typed functions: % @deftypefn category type name args \makedefun{deftypefn}{\deftypefngeneral{}} % @deftypeop category class type name args \makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} % \deftypeopon {category on}class type name args \def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } % \deftypefngeneral {subind}category type name args % \def\deftypefngeneral#1#2 #3 #4 #5\endheader{% \dosubind{fn}{\code{#4}}{#1}% \doingtypefntrue \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Typed variables: % @deftypevr category type var args \makedefun{deftypevr}{\deftypecvgeneral{}} % @deftypecv category class type var args \makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} % \deftypecvof {category of}class type var args \def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } % \deftypecvgeneral {subind}category type var args % \def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% \dosubind{vr}{\code{#4}}{#1}% \defname{#2}{#3}{#4}\defunargs{#5\unskip}% } % Untyped variables: % @defvr category var args \makedefun{defvr}#1 {\deftypevrheader{#1} {} } % @defcv category class var args \makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} % \defcvof {category of}class var args \def\defcvof#1#2 {\deftypecvof{#1}#2 {} } % Types: % @deftp category name args \makedefun{deftp}#1 #2 #3\endheader{% \doind{tp}{\code{#2}}% \defname{#1}{}{#2}\defunargs{#3\unskip}% } % Remaining @defun-like shortcuts: \makedefun{defun}{\deffnheader{\putwordDeffunc} } \makedefun{defmac}{\deffnheader{\putwordDefmac} } \makedefun{defspec}{\deffnheader{\putwordDefspec} } \makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } \makedefun{defvar}{\defvrheader{\putwordDefvar} } \makedefun{defopt}{\defvrheader{\putwordDefopt} } \makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } \makedefun{defmethod}{\defopon\putwordMethodon} \makedefun{deftypemethod}{\deftypeopon\putwordMethodon} \makedefun{defivar}{\defcvof\putwordInstanceVariableof} \makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} % \defname, which formats the name of the @def (not the args). % #1 is the category, such as "Function". % #2 is the return type, if any. % #3 is the function name. % % We are followed by (but not passed) the arguments, if any. % \def\defname#1#2#3{% \par % Get the values of \leftskip and \rightskip as they were outside the @def... \advance\leftskip by -\defbodyindent % % Determine if we are typesetting the return type of a typed function % on a line by itself. \rettypeownlinefalse \ifdoingtypefn % doing a typed function specifically? % then check user option for putting return type on its own line: \expandafter\ifx\csname SETtxideftypefnnl\endcsname\relax \else \rettypeownlinetrue \fi \fi % % How we'll format the category name. Putting it in brackets helps % distinguish it from the body text that may end up on the next line % just below it. \def\temp{#1}% \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} % % Figure out line sizes for the paragraph shape. We'll always have at % least two. \tempnum = 2 % % The first line needs space for \box0; but if \rightskip is nonzero, % we need only space for the part of \box0 which exceeds it: \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip % % If doing a return type on its own line, we'll have another line. \ifrettypeownline \advance\tempnum by 1 \def\maybeshapeline{0in \hsize}% \else \def\maybeshapeline{}% \fi % % The continuations: \dimen2=\hsize \advance\dimen2 by -\defargsindent % % The final paragraph shape: \parshape \tempnum 0in \dimen0 \maybeshapeline \defargsindent \dimen2 % % Put the category name at the right margin. \noindent \hbox to 0pt{% \hfil\box0 \kern-\hsize % \hsize has to be shortened this way: \kern\leftskip % Intentionally do not respect \rightskip, since we need the space. }% % % Allow all lines to be underfull without complaint: \tolerance=10000 \hbadness=10000 \exdentamount=\defbodyindent {% % defun fonts. We use typewriter by default (used to be bold) because: % . we're printing identifiers, they should be in tt in principle. % . in languages with many accents, such as Czech or French, it's % common to leave accents off identifiers. The result looks ok in % tt, but exceedingly strange in rm. % . we don't want -- and --- to be treated as ligatures. % . this still does not fix the ?` and !` ligatures, but so far no % one has made identifiers using them :). \df \tt \def\temp{#2}% text of the return type \ifx\temp\empty\else \tclose{\temp}% typeset the return type \ifrettypeownline % put return type on its own line; prohibit line break following: \hfil\vadjust{\nobreak}\break \else \space % type on same line, so just followed by a space \fi \fi % no return type #3% output function name }% {\rm\enskip}% hskip 0.5 em of \tenrm % \boldbrax % arguments will be output next, if any. } % Print arguments in slanted roman (not ttsl), inconsistently with using % tt for the name. This is because literal text is sometimes needed in % the argument list (groff manual), and ttsl and tt are not very % distinguishable. Prevent hyphenation at `-' chars. % \def\defunargs#1{% % use sl by default (not ttsl), % tt for the names. \df \sl \hyphenchar\font=0 % % On the other hand, if an argument has two dashes (for instance), we % want a way to get ttsl. We used to recommend @var for that, so % leave the code in, but it's strange for @var to lead to typewriter. % Nowadays we recommend @code, since the difference between a ttsl hyphen % and a tt hyphen is pretty tiny. @code also disables ?` !`. \def\var##1{{\setupmarkupstyle{var}\ttslanted{##1}}}% #1% \sl\hyphenchar\font=45 } % We want ()&[] to print specially on the defun line. % \def\activeparens{% \catcode`\(=\active \catcode`\)=\active \catcode`\[=\active \catcode`\]=\active \catcode`\&=\active } % Make control sequences which act like normal parenthesis chars. \let\lparen = ( \let\rparen = ) % Be sure that we always have a definition for `(', etc. For example, % if the fn name has parens in it, \boldbrax will not be in effect yet, % so TeX would otherwise complain about undefined control sequence. { \activeparens \global\let(=\lparen \global\let)=\rparen \global\let[=\lbrack \global\let]=\rbrack \global\let& = \& \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} \gdef\magicamp{\let&=\amprm} } \newcount\parencount % If we encounter &foo, then turn on ()-hacking afterwards \newif\ifampseen \def\amprm#1 {\ampseentrue{\bf\ }} \def\parenfont{% \ifampseen % At the first level, print parens in roman, % otherwise use the default font. \ifnum \parencount=1 \rm \fi \else % The \sf parens (in \boldbrax) actually are a little bolder than % the contained text. This is especially needed for [ and ] . \sf \fi } \def\infirstlevel#1{% \ifampseen \ifnum\parencount=1 #1% \fi \fi } \def\bfafterword#1 {#1 \bf} \def\opnr{% \global\advance\parencount by 1 {\parenfont(}% \infirstlevel \bfafterword } \def\clnr{% {\parenfont)}% \infirstlevel \sl \global\advance\parencount by -1 } \newcount\brackcount \def\lbrb{% \global\advance\brackcount by 1 {\bf[}% } \def\rbrb{% {\bf]}% \global\advance\brackcount by -1 } \def\checkparencounts{% \ifnum\parencount=0 \else \badparencount \fi \ifnum\brackcount=0 \else \badbrackcount \fi } % these should not use \errmessage; the glibc manual, at least, actually % has such constructs (when documenting function pointers). \def\badparencount{% \message{Warning: unbalanced parentheses in @def...}% \global\parencount=0 } \def\badbrackcount{% \message{Warning: unbalanced square brackets in @def...}% \global\brackcount=0 } \message{macros,} % @macro. % To do this right we need a feature of e-TeX, \scantokens, % which we arrange to emulate with a temporary file in ordinary TeX. \ifx\eTeXversion\thisisundefined \newwrite\macscribble \def\scantokens#1{% \toks0={#1}% \immediate\openout\macscribble=\jobname.tmp \immediate\write\macscribble{\the\toks0}% \immediate\closeout\macscribble \input \jobname.tmp } \fi \def\scanmacro#1{\begingroup \newlinechar`\^^M \let\xeatspaces\eatspaces % % Undo catcode changes of \startcontents and \doprintindex % When called from @insertcopying or (short)caption, we need active % backslash to get it printed correctly. Previously, we had % \catcode`\\=\other instead. We'll see whether a problem appears % with macro expansion. --kasal, 19aug04 \catcode`\@=0 \catcode`\\=\active \escapechar=`\@ % % ... and for \example: \spaceisspace % % The \empty here causes a following catcode 5 newline to be eaten as % part of reading whitespace after a control sequence. It does not % eat a catcode 13 newline. There's no good way to handle the two % cases (untried: maybe e-TeX's \everyeof could help, though plain TeX % would then have different behavior). See the Macro Details node in % the manual for the workaround we recommend for macros and % line-oriented commands. % \scantokens{#1\empty}% \endgroup} \def\scanexp#1{% \edef\temp{\noexpand\scanmacro{#1}}% \temp } \newcount\paramno % Count of parameters \newtoks\macname % Macro name \newif\ifrecursive % Is it recursive? % List of all defined macros in the form % \definedummyword\macro1\definedummyword\macro2... % Currently is also contains all @aliases; the list can be split % if there is a need. \def\macrolist{} % Add the macro to \macrolist \def\addtomacrolist#1{\expandafter \addtomacrolistxxx \csname#1\endcsname} \def\addtomacrolistxxx#1{% \toks0 = \expandafter{\macrolist\definedummyword#1}% \xdef\macrolist{\the\toks0}% } % Utility routines. % This does \let #1 = #2, with \csnames; that is, % \let \csname#1\endcsname = \csname#2\endcsname % (except of course we have to play expansion games). % \def\cslet#1#2{% \expandafter\let \csname#1\expandafter\endcsname \csname#2\endcsname } % Trim leading and trailing spaces off a string. % Concepts from aro-bend problem 15 (see CTAN). {\catcode`\@=11 \gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} \gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} \gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} \def\unbrace#1{#1} \unbrace{\gdef\trim@@@ #1 } #2@{#1} } % Trim a single trailing ^^M off a string. {\catcode`\^^M=\other \catcode`\Q=3% \gdef\eatcr #1{\eatcra #1Q^^MQ}% \gdef\eatcra#1^^MQ{\eatcrb#1Q}% \gdef\eatcrb#1Q#2Q{#1}% } % Macro bodies are absorbed as an argument in a context where % all characters are catcode 10, 11 or 12, except \ which is active % (as in normal texinfo). It is necessary to change the definition of \ % to recognize macro arguments; this is the job of \mbodybackslash. % % Non-ASCII encodings make 8-bit characters active, so un-activate % them to avoid their expansion. Must do this non-globally, to % confine the change to the current group. % % It's necessary to have hard CRs when the macro is executed. This is % done by making ^^M (\endlinechar) catcode 12 when reading the macro % body, and then making it the \newlinechar in \scanmacro. % \def\scanctxt{% used as subroutine \catcode`\"=\other \catcode`\+=\other \catcode`\<=\other \catcode`\>=\other \catcode`\@=\other \catcode`\^=\other \catcode`\_=\other \catcode`\|=\other \catcode`\~=\other \ifx\declaredencoding\ascii \else \setnonasciicharscatcodenonglobal\other \fi } \def\scanargctxt{% used for copying and captions, not macros. \scanctxt \catcode`\\=\other \catcode`\^^M=\other } \def\macrobodyctxt{% used for @macro definitions \scanctxt \catcode`\{=\other \catcode`\}=\other \catcode`\^^M=\other \usembodybackslash } \def\macroargctxt{% used when scanning invocations \scanctxt \catcode`\\=0 } % why catcode 0 for \ in the above? To recognize \\ \{ \} as "escapes" % for the single characters \ { }. Thus, we end up with the "commands" % that would be written @\ @{ @} in a Texinfo document. % % We already have @{ and @}. For @\, we define it here, and only for % this purpose, to produce a typewriter backslash (so, the @\ that we % define for @math can't be used with @macro calls): % \def\\{\normalbackslash}% % % We would like to do this for \, too, since that is what makeinfo does. % But it is not possible, because Texinfo already has a command @, for a % cedilla accent. Documents must use @comma{} instead. % % \anythingelse will almost certainly be an error of some kind. % \mbodybackslash is the definition of \ in @macro bodies. % It maps \foo\ => \csname macarg.foo\endcsname => #N % where N is the macro parameter number. % We define \csname macarg.\endcsname to be \realbackslash, so % \\ in macro replacement text gets you a backslash. % {\catcode`@=0 @catcode`@\=@active @gdef@usembodybackslash{@let\=@mbodybackslash} @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} } \expandafter\def\csname macarg.\endcsname{\realbackslash} \def\margbackslash#1{\char`\#1 } \def\macro{\recursivefalse\parsearg\macroxxx} \def\rmacro{\recursivetrue\parsearg\macroxxx} \def\macroxxx#1{% \getargs{#1}% now \macname is the macname and \argl the arglist \ifx\argl\empty % no arguments \paramno=0\relax \else \expandafter\parsemargdef \argl;% \if\paramno>256\relax \ifx\eTeXversion\thisisundefined \errhelp = \EMsimple \errmessage{You need eTeX to compile a file with macros with more than 256 arguments} \fi \fi \fi \if1\csname ismacro.\the\macname\endcsname \message{Warning: redefining \the\macname}% \else \expandafter\ifx\csname \the\macname\endcsname \relax \else \errmessage{Macro name \the\macname\space already defined}\fi \global\cslet{macsave.\the\macname}{\the\macname}% \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% \addtomacrolist{\the\macname}% \fi \begingroup \macrobodyctxt \ifrecursive \expandafter\parsermacbody \else \expandafter\parsemacbody \fi} \parseargdef\unmacro{% \if1\csname ismacro.#1\endcsname \global\cslet{#1}{macsave.#1}% \global\expandafter\let \csname ismacro.#1\endcsname=0% % Remove the macro name from \macrolist: \begingroup \expandafter\let\csname#1\endcsname \relax \let\definedummyword\unmacrodo \xdef\macrolist{\macrolist}% \endgroup \else \errmessage{Macro #1 not defined}% \fi } % Called by \do from \dounmacro on each macro. The idea is to omit any % macro definitions that have been changed to \relax. % \def\unmacrodo#1{% \ifx #1\relax % remove this \else \noexpand\definedummyword \noexpand#1% \fi } % This makes use of the obscure feature that if the last token of a % is #, then the preceding argument is delimited by % an opening brace, and that opening brace is not consumed. \def\getargs#1{\getargsxxx#1{}} \def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} \def\getmacname#1 #2\relax{\macname={#1}} \def\getmacargs#1{\def\argl{#1}} % For macro processing make @ a letter so that we can make Texinfo private macro names. \edef\texiatcatcode{\the\catcode`\@} \catcode `@=11\relax % Parse the optional {params} list. Set up \paramno and \paramlist % so \defmacro knows what to do. Define \macarg.BLAH for each BLAH % in the params list to some hook where the argument si to be expanded. If % there are less than 10 arguments that hook is to be replaced by ##N where N % is the position in that list, that is to say the macro arguments are to be % defined `a la TeX in the macro body. % % That gets used by \mbodybackslash (above). % % We need to get `macro parameter char #' into several definitions. % The technique used is stolen from LaTeX: let \hash be something % unexpandable, insert that wherever you need a #, and then redefine % it to # just before using the token list produced. % % The same technique is used to protect \eatspaces till just before % the macro is used. % % If there are 10 or more arguments, a different technique is used, where the % hook remains in the body, and when macro is to be expanded the body is % processed again to replace the arguments. % % In that case, the hook is \the\toks N-1, and we simply set \toks N-1 to the % argument N value and then \edef the body (nothing else will expand because of % the catcode regime underwhich the body was input). % % If you compile with TeX (not eTeX), and you have macros with 10 or more % arguments, you need that no macro has more than 256 arguments, otherwise an % error is produced. \def\parsemargdef#1;{% \paramno=0\def\paramlist{}% \let\hash\relax \let\xeatspaces\relax \parsemargdefxxx#1,;,% % In case that there are 10 or more arguments we parse again the arguments % list to set new definitions for the \macarg.BLAH macros corresponding to % each BLAH argument. It was anyhow needed to parse already once this list % in order to count the arguments, and as macros with at most 9 arguments % are by far more frequent than macro with 10 or more arguments, defining % twice the \macarg.BLAH macros does not cost too much processing power. \ifnum\paramno<10\relax\else \paramno0\relax \parsemmanyargdef@@#1,;,% 10 or more arguments \fi } \def\parsemargdefxxx#1,{% \if#1;\let\next=\relax \else \let\next=\parsemargdefxxx \advance\paramno by 1 \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname {\xeatspaces{\hash\the\paramno}}% \edef\paramlist{\paramlist\hash\the\paramno,}% \fi\next} \def\parsemmanyargdef@@#1,{% \if#1;\let\next=\relax \else \let\next=\parsemmanyargdef@@ \edef\tempb{\eatspaces{#1}}% \expandafter\def\expandafter\tempa \expandafter{\csname macarg.\tempb\endcsname}% % Note that we need some extra \noexpand\noexpand, this is because we % don't want \the to be expanded in the \parsermacbody as it uses an % \xdef . \expandafter\edef\tempa {\noexpand\noexpand\noexpand\the\toks\the\paramno}% \advance\paramno by 1\relax \fi\next} % These two commands read recursive and nonrecursive macro bodies. % (They're different since rec and nonrec macros end differently.) % \catcode `\@\texiatcatcode \long\def\parsemacbody#1@end macro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \long\def\parsermacbody#1@end rmacro% {\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% \catcode `\@=11\relax \let\endargs@\relax \let\nil@\relax \def\nilm@{\nil@}% \long\def\nillm@{\nil@}% % This macro is expanded during the Texinfo macro expansion, not during its % definition. It gets all the arguments values and assigns them to macros % macarg.ARGNAME % % #1 is the macro name % #2 is the list of argument names % #3 is the list of argument values \def\getargvals@#1#2#3{% \def\macargdeflist@{}% \def\saveparamlist@{#2}% Need to keep a copy for parameter expansion. \def\paramlist{#2,\nil@}% \def\macroname{#1}% \begingroup \macroargctxt \def\argvaluelist{#3,\nil@}% \def\@tempa{#3}% \ifx\@tempa\empty \setemptyargvalues@ \else \getargvals@@ \fi } % \def\getargvals@@{% \ifx\paramlist\nilm@ % Some sanity check needed here that \argvaluelist is also empty. \ifx\argvaluelist\nillm@ \else \errhelp = \EMsimple \errmessage{Too many arguments in macro `\macroname'!}% \fi \let\next\macargexpandinbody@ \else \ifx\argvaluelist\nillm@ % No more arguments values passed to macro. Set remaining named-arg % macros to empty. \let\next\setemptyargvalues@ \else % pop current arg name into \@tempb \def\@tempa##1{\pop@{\@tempb}{\paramlist}##1\endargs@}% \expandafter\@tempa\expandafter{\paramlist}% % pop current argument value into \@tempc \def\@tempa##1{\longpop@{\@tempc}{\argvaluelist}##1\endargs@}% \expandafter\@tempa\expandafter{\argvaluelist}% % Here \@tempb is the current arg name and \@tempc is the current arg value. % First place the new argument macro definition into \@tempd \expandafter\macname\expandafter{\@tempc}% \expandafter\let\csname macarg.\@tempb\endcsname\relax \expandafter\def\expandafter\@tempe\expandafter{% \csname macarg.\@tempb\endcsname}% \edef\@tempd{\long\def\@tempe{\the\macname}}% \push@\@tempd\macargdeflist@ \let\next\getargvals@@ \fi \fi \next } \def\push@#1#2{% \expandafter\expandafter\expandafter\def \expandafter\expandafter\expandafter#2% \expandafter\expandafter\expandafter{% \expandafter#1#2}% } % Replace arguments by their values in the macro body, and place the result % in macro \@tempa \def\macvalstoargs@{% % To do this we use the property that token registers that are \the'ed % within an \edef expand only once. So we are going to place all argument % values into respective token registers. % % First we save the token context, and initialize argument numbering. \begingroup \paramno0\relax % Then, for each argument number #N, we place the corresponding argument % value into a new token list register \toks#N \expandafter\putargsintokens@\saveparamlist@,;,% % Then, we expand the body so that argument are replaced by their % values. The trick for values not to be expanded themselves is that they % are within tokens and that tokens expand only once in an \edef . \edef\@tempc{\csname mac.\macroname .body\endcsname}% % Now we restore the token stack pointer to free the token list registers % which we have used, but we make sure that expanded body is saved after % group. \expandafter \endgroup \expandafter\def\expandafter\@tempa\expandafter{\@tempc}% } \def\macargexpandinbody@{% %% Define the named-macro outside of this group and then close this group. \expandafter \endgroup \macargdeflist@ % First the replace in body the macro arguments by their values, the result % is in \@tempa . \macvalstoargs@ % Then we point at the \norecurse or \gobble (for recursive) macro value % with \@tempb . \expandafter\let\expandafter\@tempb\csname mac.\macroname .recurse\endcsname % Depending on whether it is recursive or not, we need some tailing % \egroup . \ifx\@tempb\gobble \let\@tempc\relax \else \let\@tempc\egroup \fi % And now we do the real job: \edef\@tempd{\noexpand\@tempb{\macroname}\noexpand\scanmacro{\@tempa}\@tempc}% \@tempd } \def\putargsintokens@#1,{% \if#1;\let\next\relax \else \let\next\putargsintokens@ % First we allocate the new token list register, and give it a temporary % alias \@tempb . \toksdef\@tempb\the\paramno % Then we place the argument value into that token list register. \expandafter\let\expandafter\@tempa\csname macarg.#1\endcsname \expandafter\@tempb\expandafter{\@tempa}% \advance\paramno by 1\relax \fi \next } % Save the token stack pointer into macro #1 \def\texisavetoksstackpoint#1{\edef#1{\the\@cclvi}} % Restore the token stack pointer from number in macro #1 \def\texirestoretoksstackpoint#1{\expandafter\mathchardef\expandafter\@cclvi#1\relax} % newtoks that can be used non \outer . \def\texinonouternewtoks{\alloc@ 5\toks \toksdef \@cclvi} % Tailing missing arguments are set to empty \def\setemptyargvalues@{% \ifx\paramlist\nilm@ \let\next\macargexpandinbody@ \else \expandafter\setemptyargvaluesparser@\paramlist\endargs@ \let\next\setemptyargvalues@ \fi \next } \def\setemptyargvaluesparser@#1,#2\endargs@{% \expandafter\def\expandafter\@tempa\expandafter{% \expandafter\def\csname macarg.#1\endcsname{}}% \push@\@tempa\macargdeflist@ \def\paramlist{#2}% } % #1 is the element target macro % #2 is the list macro % #3,#4\endargs@ is the list value \def\pop@#1#2#3,#4\endargs@{% \def#1{#3}% \def#2{#4}% } \long\def\longpop@#1#2#3,#4\endargs@{% \long\def#1{#3}% \long\def#2{#4}% } % This defines a Texinfo @macro. There are eight cases: recursive and % nonrecursive macros of zero, one, up to nine, and many arguments. % Much magic with \expandafter here. % \xdef is used so that macro definitions will survive the file % they're defined in; @include reads the file inside a group. % \def\defmacro{% \let\hash=##% convert placeholders to macro parameter chars \ifrecursive \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\scanmacro{\temp}}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup\noexpand\scanmacro{\temp}}% \else \ifnum\paramno<10\relax % at most 9 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{\egroup\noexpand\scanmacro{\temp}}% \else % 10 or more \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\gobble \fi \fi \else \ifcase\paramno % 0 \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \or % 1 \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \noexpand\braceorline \expandafter\noexpand\csname\the\macname xxx\endcsname}% \expandafter\xdef\csname\the\macname xxx\endcsname##1{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % at most 9 \ifnum\paramno<10\relax \expandafter\xdef\csname\the\macname\endcsname{% \bgroup\noexpand\macroargctxt \expandafter\noexpand\csname\the\macname xx\endcsname}% \expandafter\xdef\csname\the\macname xx\endcsname##1{% \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% \expandafter\expandafter \expandafter\xdef \expandafter\expandafter \csname\the\macname xxx\endcsname \paramlist{% \egroup \noexpand\norecurse{\the\macname}% \noexpand\scanmacro{\temp}\egroup}% \else % 10 or more: \expandafter\xdef\csname\the\macname\endcsname{% \noexpand\getargvals@{\the\macname}{\argl}% }% \global\expandafter\let\csname mac.\the\macname .body\endcsname\temp \global\expandafter\let\csname mac.\the\macname .recurse\endcsname\norecurse \fi \fi \fi} \catcode `\@\texiatcatcode\relax \def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} % \braceorline decides whether the next nonwhitespace character is a % {. If so it reads up to the closing }, if not, it reads the whole % line. Whatever was read is then fed to the next control sequence % as an argument (by \parsebrace or \parsearg). % \def\braceorline#1{\let\macnamexxx=#1\futurelet\nchar\braceorlinexxx} \def\braceorlinexxx{% \ifx\nchar\bgroup\else \expandafter\parsearg \fi \macnamexxx} % @alias. % We need some trickery to remove the optional spaces around the equal % sign. Make them active and then expand them all to nothing. % \def\alias{\parseargusing\obeyspaces\aliasxxx} \def\aliasxxx #1{\aliasyyy#1\relax} \def\aliasyyy #1=#2\relax{% {% \expandafter\let\obeyedspace=\empty \addtomacrolist{#1}% \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% }% \next } \message{cross references,} \newwrite\auxfile \newif\ifhavexrefs % True if xref values are known. \newif\ifwarnedxrefs % True if we warned once that they aren't known. % @inforef is relatively simple. \def\inforef #1{\inforefzzz #1,,,,**} \def\inforefzzz #1,#2,#3,#4**{% \putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, node \samp{\ignorespaces#1{}}} % @node's only job in TeX is to define \lastnode, which is used in % cross-references. The @node line might or might not have commas, and % might or might not have spaces before the first comma, like: % @node foo , bar , ... % We don't want such trailing spaces in the node name. % \parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} % % also remove a trailing comma, in case of something like this: % @node Help-Cross, , , Cross-refs \def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} \def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} \let\nwnode=\node \let\lastnode=\empty % Write a cross-reference definition for the current node. #1 is the % type (Ynumbered, Yappendix, Ynothing). % \def\donoderef#1{% \ifx\lastnode\empty\else \setref{\lastnode}{#1}% \global\let\lastnode=\empty \fi } % @anchor{NAME} -- define xref target at arbitrary point. % \newcount\savesfregister % \def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} \def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} \def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} % \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an % anchor), which consists of three parts: % 1) NAME-title - the current sectioning name taken from \lastsection, % or the anchor name. % 2) NAME-snt - section number and type, passed as the SNT arg, or % empty for anchors. % 3) NAME-pg - the page number. % % This is called from \donoderef, \anchor, and \dofloat. In the case of % floats, there is an additional part, which is not written here: % 4) NAME-lof - the text as it should appear in a @listoffloats. % \def\setref#1#2{% \pdfmkdest{#1}% \iflinks {% \atdummies % preserve commands, but don't expand them \edef\writexrdef##1##2{% \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef ##1}{##2}}% these are parameters of \writexrdef }% \toks0 = \expandafter{\lastsection}% \immediate \writexrdef{title}{\the\toks0 }% \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. \safewhatsit{\writexrdef{pg}{\folio}}% will be written later, at \shipout }% \fi } % @xrefautosectiontitle on|off says whether @section(ing) names are used % automatically in xrefs, if the third arg is not explicitly specified. % This was provided as a "secret" @set xref-automatic-section-title % variable, now it's official. % \parseargdef\xrefautomaticsectiontitle{% \def\temp{#1}% \ifx\temp\onword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \empty \else\ifx\temp\offword \expandafter\let\csname SETxref-automatic-section-title\endcsname = \relax \else \errhelp = \EMsimple \errmessage{Unknown @xrefautomaticsectiontitle value `\temp', must be on|off}% \fi\fi } % % @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is % the node name, #2 the name of the Info cross-reference, #3 the printed % node name, #4 the name of the Info file, #5 the name of the printed % manual. All but the node name can be omitted. % \def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} \def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} \def\ref#1{\xrefX[#1,,,,,,,]} % \newbox\toprefbox \newbox\printedrefnamebox \newbox\infofilenamebox \newbox\printedmanualbox % \def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup \unsepspaces % % Get args without leading/trailing spaces. \def\printedrefname{\ignorespaces #3}% \setbox\printedrefnamebox = \hbox{\printedrefname\unskip}% % \def\infofilename{\ignorespaces #4}% \setbox\infofilenamebox = \hbox{\infofilename\unskip}% % \def\printedmanual{\ignorespaces #5}% \setbox\printedmanualbox = \hbox{\printedmanual\unskip}% % % If the printed reference name (arg #3) was not explicitly given in % the @xref, figure out what we want to use. \ifdim \wd\printedrefnamebox = 0pt % No printed node name was explicitly given. \expandafter\ifx\csname SETxref-automatic-section-title\endcsname \relax % Not auto section-title: use node name inside the square brackets. \def\printedrefname{\ignorespaces #1}% \else % Auto section-title: use chapter/section title inside % the square brackets if we have it. \ifdim \wd\printedmanualbox > 0pt % It is in another manual, so we don't have it; use node name. \def\printedrefname{\ignorespaces #1}% \else \ifhavexrefs % We (should) know the real title if we have the xref values. \def\printedrefname{\refx{#1-title}{}}% \else % Otherwise just copy the Info node name. \def\printedrefname{\ignorespaces #1}% \fi% \fi \fi \fi % % Make link in pdf output. \ifpdf {\indexnofonts \turnoffactive \makevalueexpandable % This expands tokens, so do it after making catcode changes, so _ % etc. don't get their TeX definitions. This ignores all spaces in % #4, including (wrongly) those in the middle of the filename. \getfilename{#4}% % % This (wrongly) does not take account of leading or trailing % spaces in #1, which should be ignored. \edef\pdfxrefdest{#1}% \ifx\pdfxrefdest\empty \def\pdfxrefdest{Top}% no empty targets \else \txiescapepdf\pdfxrefdest % escape PDF special chars \fi % \leavevmode \startlink attr{/Border [0 0 0]}% \ifnum\filenamelength>0 goto file{\the\filename.pdf} name{\pdfxrefdest}% \else goto name{\pdfmkpgn{\pdfxrefdest}}% \fi }% \setcolor{\linkcolor}% \fi % % Float references are printed completely differently: "Figure 1.2" % instead of "[somenode], p.3". We distinguish them by the % LABEL-title being set to a magic string. {% % Have to otherify everything special to allow the \csname to % include an _ in the xref name, etc. \indexnofonts \turnoffactive \expandafter\global\expandafter\let\expandafter\Xthisreftitle \csname XR#1-title\endcsname }% \iffloat\Xthisreftitle % If the user specified the print name (third arg) to the ref, % print it instead of our usual "Figure 1.2". \ifdim\wd\printedrefnamebox = 0pt \refx{#1-snt}{}% \else \printedrefname \fi % % If the user also gave the printed manual name (fifth arg), append % "in MANUALNAME". \ifdim \wd\printedmanualbox > 0pt \space \putwordin{} \cite{\printedmanual}% \fi \else % node/anchor (non-float) references. % % If we use \unhbox to print the node names, TeX does not insert % empty discretionaries after hyphens, which means that it will not % find a line break at a hyphen in a node names. Since some manuals % are best written with fairly long node names, containing hyphens, % this is a loss. Therefore, we give the text of the node name % again, so it is as if TeX is seeing it for the first time. % \ifdim \wd\printedmanualbox > 0pt % Cross-manual reference with a printed manual name. % \crossmanualxref{\cite{\printedmanual\unskip}}% % \else\ifdim \wd\infofilenamebox > 0pt % Cross-manual reference with only an info filename (arg 4), no % printed manual name (arg 5). This is essentially the same as % the case above; we output the filename, since we have nothing else. % \crossmanualxref{\code{\infofilename\unskip}}% % \else % Reference within this manual. % % _ (for example) has to be the character _ for the purposes of the % control sequence corresponding to the node, but it has to expand % into the usual \leavevmode...\vrule stuff for purposes of % printing. So we \turnoffactive for the \refx-snt, back on for the % printing, back off for the \refx-pg. {\turnoffactive % Only output a following space if the -snt ref is nonempty; for % @unnumbered and @anchor, it won't be. \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi }% % output the `[mynode]' via the macro below so it can be overridden. \xrefprintnodename\printedrefname % % But we always want a comma and a space: ,\space % % output the `page 3'. \turnoffactive \putwordpage\tie\refx{#1-pg}{}% \fi\fi \fi \endlink \endgroup} % Output a cross-manual xref to #1. Used just above (twice). % % Only include the text "Section ``foo'' in" if the foo is neither % missing or Top. Thus, @xref{,,,foo,The Foo Manual} outputs simply % "see The Foo Manual", the idea being to refer to the whole manual. % % But, this being TeX, we can't easily compare our node name against the % string "Top" while ignoring the possible spaces before and after in % the input. By adding the arbitrary 7sp below, we make it much less % likely that a real node name would have the same width as "Top" (e.g., % in a monospaced font). Hopefully it will never happen in practice. % % For the same basic reason, we retypeset the "Top" at every % reference, since the current font is indeterminate. % \def\crossmanualxref#1{% \setbox\toprefbox = \hbox{Top\kern7sp}% \setbox2 = \hbox{\ignorespaces \printedrefname \unskip \kern7sp}% \ifdim \wd2 > 7sp % nonempty? \ifdim \wd2 = \wd\toprefbox \else % same as Top? \putwordSection{} ``\printedrefname'' \putwordin{}\space \fi \fi #1% } % This macro is called from \xrefX for the `[nodename]' part of xref % output. It's a separate macro only so it can be changed more easily, % since square brackets don't work well in some documents. Particularly % one that Bob is working on :). % \def\xrefprintnodename#1{[#1]} % Things referred to by \setref. % \def\Ynothing{} \def\Yomitfromtoc{} \def\Ynumbered{% \ifnum\secno=0 \putwordChapter@tie \the\chapno \else \ifnum\subsecno=0 \putwordSection@tie \the\chapno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie \the\chapno.\the\secno.\the\subsecno \else \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } \def\Yappendix{% \ifnum\secno=0 \putwordAppendix@tie @char\the\appendixno{}% \else \ifnum\subsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno \else \ifnum\subsubsecno=0 \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno \else \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno \fi\fi\fi } % Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. % If its value is nonempty, SUFFIX is output afterward. % \def\refx#1#2{% {% \indexnofonts \otherbackslash \expandafter\global\expandafter\let\expandafter\thisrefX \csname XR#1\endcsname }% \ifx\thisrefX\relax % If not defined, say something at least. \angleleft un\-de\-fined\angleright \iflinks \ifhavexrefs {\toks0 = {#1}% avoid expansion of possibly-complex value \message{\linenumber Undefined cross reference `\the\toks0'.}}% \else \ifwarnedxrefs\else \global\warnedxrefstrue \message{Cross reference values unknown; you must run TeX again.}% \fi \fi \fi \else % It's defined, so just use it. \thisrefX \fi #2% Output the suffix in any case. } % This is the macro invoked by entries in the aux file. Usually it's % just a \def (we prepend XR to the control sequence name to avoid % collisions). But if this is a float type, we have more work to do. % \def\xrdef#1#2{% {% The node name might contain 8-bit characters, which in our current % implementation are changed to commands like @'e. Don't let these % mess up the control sequence name. \indexnofonts \turnoffactive \xdef\safexrefname{#1}% }% % \expandafter\gdef\csname XR\safexrefname\endcsname{#2}% remember this xref % % Was that xref control sequence that we just defined for a float? \expandafter\iffloat\csname XR\safexrefname\endcsname % it was a float, and we have the (safe) float type in \iffloattype. \expandafter\let\expandafter\floatlist \csname floatlist\iffloattype\endcsname % % Is this the first time we've seen this float type? \expandafter\ifx\floatlist\relax \toks0 = {\do}% yes, so just \do \else % had it before, so preserve previous elements in list. \toks0 = \expandafter{\floatlist\do}% \fi % % Remember this xref in the control sequence \floatlistFLOATTYPE, % for later use in \listoffloats. \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0 {\safexrefname}}% \fi } % Read the last existing aux file, if any. No error if none exists. % \def\tryauxfile{% \openin 1 \jobname.aux \ifeof 1 \else \readdatafile{aux}% \global\havexrefstrue \fi \closein 1 } \def\setupdatafile{% \catcode`\^^@=\other \catcode`\^^A=\other \catcode`\^^B=\other \catcode`\^^C=\other \catcode`\^^D=\other \catcode`\^^E=\other \catcode`\^^F=\other \catcode`\^^G=\other \catcode`\^^H=\other \catcode`\^^K=\other \catcode`\^^L=\other \catcode`\^^N=\other \catcode`\^^P=\other \catcode`\^^Q=\other \catcode`\^^R=\other \catcode`\^^S=\other \catcode`\^^T=\other \catcode`\^^U=\other \catcode`\^^V=\other \catcode`\^^W=\other \catcode`\^^X=\other \catcode`\^^Z=\other \catcode`\^^[=\other \catcode`\^^\=\other \catcode`\^^]=\other \catcode`\^^^=\other \catcode`\^^_=\other % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. % in xref tags, i.e., node names. But since ^^e4 notation isn't % supported in the main text, it doesn't seem desirable. Furthermore, % that is not enough: for node names that actually contain a ^ % character, we would end up writing a line like this: 'xrdef {'hat % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first % argument, and \hat is not an expandable control sequence. It could % all be worked out, but why? Either we support ^^ or we don't. % % The other change necessary for this was to define \auxhat: % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter % and then to call \auxhat in \setq. % \catcode`\^=\other % % Special characters. Should be turned off anyway, but... \catcode`\~=\other \catcode`\[=\other \catcode`\]=\other \catcode`\"=\other \catcode`\_=\other \catcode`\|=\other \catcode`\<=\other \catcode`\>=\other \catcode`\$=\other \catcode`\#=\other \catcode`\&=\other \catcode`\%=\other \catcode`+=\other % avoid \+ for paranoia even though we've turned it off % % This is to support \ in node names and titles, since the \ % characters end up in a \csname. It's easier than % leaving it active and making its active definition an actual \ % character. What I don't understand is why it works in the *value* % of the xrdef. Seems like it should be a catcode12 \, and that % should not typeset properly. But it works, so I'm moving on for % now. --karl, 15jan04. \catcode`\\=\other % % Make the characters 128-255 be printing characters. {% \count1=128 \def\loop{% \catcode\count1=\other \advance\count1 by 1 \ifnum \count1<256 \loop \fi }% }% % % @ is our escape character in .aux files, and we need braces. \catcode`\{=1 \catcode`\}=2 \catcode`\@=0 } \def\readdatafile#1{% \begingroup \setupdatafile \input\jobname.#1 \endgroup} \message{insertions,} % including footnotes. \newcount \footnoteno % The trailing space in the following definition for supereject is % vital for proper filling; pages come out unaligned when you do a % pagealignmacro call if that space before the closing brace is % removed. (Generally, numeric constants should always be followed by a % space to prevent strange expansion errors.) \def\supereject{\par\penalty -20000\footnoteno =0 } % @footnotestyle is meaningful for Info output only. \let\footnotestyle=\comment {\catcode `\@=11 % % Auto-number footnotes. Otherwise like plain. \gdef\footnote{% \let\indent=\ptexindent \let\noindent=\ptexnoindent \global\advance\footnoteno by \@ne \edef\thisfootno{$^{\the\footnoteno}$}% % % In case the footnote comes at the end of a sentence, preserve the % extra spacing after we do the footnote number. \let\@sf\empty \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi % % Remove inadvertent blank space before typesetting the footnote number. \unskip \thisfootno\@sf \dofootnote }% % Don't bother with the trickery in plain.tex to not require the % footnote text as a parameter. Our footnotes don't need to be so general. % % Oh yes, they do; otherwise, @ifset (and anything else that uses % \parseargline) fails inside footnotes because the tokens are fixed when % the footnote is read. --karl, 16nov96. % \gdef\dofootnote{% \insert\footins\bgroup % We want to typeset this text as a normal paragraph, even if the % footnote reference occurs in (for example) a display environment. % So reset some parameters. \hsize=\pagewidth \interlinepenalty\interfootnotelinepenalty \splittopskip\ht\strutbox % top baseline for broken footnotes \splitmaxdepth\dp\strutbox \floatingpenalty\@MM \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip \parindent\defaultparindent % \smallfonts \rm % % Because we use hanging indentation in footnotes, a @noindent appears % to exdent this text, so make it be a no-op. makeinfo does not use % hanging indentation so @noindent can still be needed within footnote % text after an @example or the like (not that this is good style). \let\noindent = \relax % % Hang the footnote text off the number. Use \everypar in case the % footnote extends for more than one paragraph. \everypar = {\hang}% \textindent{\thisfootno}% % % Don't crash into the line above the footnote text. Since this % expands into a box, it must come within the paragraph, lest it % provide a place where TeX can split the footnote. \footstrut % % Invoke rest of plain TeX footnote routine. \futurelet\next\fo@t } }%end \catcode `\@=11 % In case a @footnote appears in a vbox, save the footnote text and create % the real \insert just after the vbox finished. Otherwise, the insertion % would be lost. % Similarly, if a @footnote appears inside an alignment, save the footnote % text to a box and make the \insert when a row of the table is finished. % And the same can be done for other insert classes. --kasal, 16nov03. % Replace the \insert primitive by a cheating macro. % Deeper inside, just make sure that the saved insertions are not spilled % out prematurely. % \def\startsavinginserts{% \ifx \insert\ptexinsert \let\insert\saveinsert \else \let\checkinserts\relax \fi } % This \insert replacement works for both \insert\footins{foo} and % \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. % \def\saveinsert#1{% \edef\next{\noexpand\savetobox \makeSAVEname#1}% \afterassignment\next % swallow the left brace \let\temp = } \def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} \def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} \def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} \def\placesaveins#1{% \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname {\box#1}% } % eat @SAVE -- beware, all of them have catcode \other: { \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) \gdef\gobblesave @SAVE{} } % initialization: \def\newsaveins #1{% \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% \next } \def\newsaveinsX #1{% \csname newbox\endcsname #1% \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts \checksaveins #1}% } % initialize: \let\checkinserts\empty \newsaveins\footins \newsaveins\margin % @image. We use the macros from epsf.tex to support this. % If epsf.tex is not installed and @image is used, we complain. % % Check for and read epsf.tex up front. If we read it only at @image % time, we might be inside a group, and then its definitions would get % undone and the next image would fail. \openin 1 = epsf.tex \ifeof 1 \else % Do not bother showing banner with epsf.tex v2.7k (available in % doc/epsf.tex and on ctan). \def\epsfannounce{\toks0 = }% \input epsf.tex \fi \closein 1 % % We will only complain once about lack of epsf.tex. \newif\ifwarnednoepsf \newhelp\noepsfhelp{epsf.tex must be installed for images to work. It is also included in the Texinfo distribution, or you can get it from ftp://tug.org/tex/epsf.tex.} % \def\image#1{% \ifx\epsfbox\thisisundefined \ifwarnednoepsf \else \errhelp = \noepsfhelp \errmessage{epsf.tex not found, images will be ignored}% \global\warnednoepsftrue \fi \else \imagexxx #1,,,,,\finish \fi } % % Arguments to @image: % #1 is (mandatory) image filename; we tack on .eps extension. % #2 is (optional) width, #3 is (optional) height. % #4 is (ignored optional) html alt text. % #5 is (ignored optional) extension. % #6 is just the usual extra ignored arg for parsing stuff. \newif\ifimagevmode \def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup \catcode`\^^M = 5 % in case we're inside an example \normalturnoffactive % allow _ et al. in names % If the image is by itself, center it. \ifvmode \imagevmodetrue \else \ifx\centersub\centerV % for @center @image, we need a vbox so we can have our vertical space \imagevmodetrue \vbox\bgroup % vbox has better behavior than vtop herev \fi\fi % \ifimagevmode \nobreak\medskip % Usually we'll have text after the image which will insert % \parskip glue, so insert it here too to equalize the space % above and below. \nobreak\vskip\parskip \nobreak \fi % % Leave vertical mode so that indentation from an enclosing % environment such as @quotation is respected. % However, if we're at the top level, we don't want the % normal paragraph indentation. % On the other hand, if we are in the case of @center @image, we don't % want to start a paragraph, which will create a hsize-width box and % eradicate the centering. \ifx\centersub\centerV\else \noindent \fi % % Output the image. \ifpdf \dopdfimage{#1}{#2}{#3}% \else % \epsfbox itself resets \epsf?size at each figure. \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi \epsfbox{#1.eps}% \fi % \ifimagevmode \medskip % space after a standalone image \fi \ifx\centersub\centerV \egroup \fi \endgroup} % @float FLOATTYPE,LABEL,LOC ... @end float for displayed figures, tables, % etc. We don't actually implement floating yet, we always include the % float "here". But it seemed the best name for the future. % \envparseargdef\float{\eatcommaspace\eatcommaspace\dofloat#1, , ,\finish} % There may be a space before second and/or third parameter; delete it. \def\eatcommaspace#1, {#1,} % #1 is the optional FLOATTYPE, the text label for this float, typically % "Figure", "Table", "Example", etc. Can't contain commas. If omitted, % this float will not be numbered and cannot be referred to. % % #2 is the optional xref label. Also must be present for the float to % be referable. % % #3 is the optional positioning argument; for now, it is ignored. It % will somehow specify the positions allowed to float to (here, top, bottom). % % We keep a separate counter for each FLOATTYPE, which we reset at each % chapter-level command. \let\resetallfloatnos=\empty % \def\dofloat#1,#2,#3,#4\finish{% \let\thiscaption=\empty \let\thisshortcaption=\empty % % don't lose footnotes inside @float. % % BEWARE: when the floats start float, we have to issue warning whenever an % insert appears inside a float which could possibly float. --kasal, 26may04 % \startsavinginserts % % We can't be used inside a paragraph. \par % \vtop\bgroup \def\floattype{#1}% \def\floatlabel{#2}% \def\floatloc{#3}% we do nothing with this yet. % \ifx\floattype\empty \let\safefloattype=\empty \else {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% \fi % % If label is given but no type, we handle that as the empty type. \ifx\floatlabel\empty \else % We want each FLOATTYPE to be numbered separately (Figure 1, % Table 1, Figure 2, ...). (And if no label, no number.) % \expandafter\getfloatno\csname\safefloattype floatno\endcsname \global\advance\floatno by 1 % {% % This magic value for \lastsection is output by \setref as the % XREFLABEL-title value. \xrefX uses it to distinguish float % labels (which have a completely different output format) from % node and anchor labels. And \xrdef uses it to construct the % lists of floats. % \edef\lastsection{\floatmagic=\safefloattype}% \setref{\floatlabel}{Yfloat}% }% \fi % % start with \parskip glue, I guess. \vskip\parskip % % Don't suppress indentation if a float happens to start a section. \restorefirstparagraphindent } % we have these possibilities: % @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap % @float Foo,lbl & no caption: Foo 1.1 % @float Foo & @caption{Cap}: Foo: Cap % @float Foo & no caption: Foo % @float ,lbl & Caption{Cap}: 1.1: Cap % @float ,lbl & no caption: 1.1 % @float & @caption{Cap}: Cap % @float & no caption: % \def\Efloat{% \let\floatident = \empty % % In all cases, if we have a float type, it comes first. \ifx\floattype\empty \else \def\floatident{\floattype}\fi % % If we have an xref label, the number comes next. \ifx\floatlabel\empty \else \ifx\floattype\empty \else % if also had float type, need tie first. \appendtomacro\floatident{\tie}% \fi % the number. \appendtomacro\floatident{\chaplevelprefix\the\floatno}% \fi % % Start the printed caption with what we've constructed in % \floatident, but keep it separate; we need \floatident again. \let\captionline = \floatident % \ifx\thiscaption\empty \else \ifx\floatident\empty \else \appendtomacro\captionline{: }% had ident, so need a colon between \fi % % caption text. \appendtomacro\captionline{\scanexp\thiscaption}% \fi % % If we have anything to print, print it, with space before. % Eventually this needs to become an \insert. \ifx\captionline\empty \else \vskip.5\parskip \captionline % % Space below caption. \vskip\parskip \fi % % If have an xref label, write the list of floats info. Do this % after the caption, to avoid chance of it being a breakpoint. \ifx\floatlabel\empty \else % Write the text that goes in the lof to the aux file as % \floatlabel-lof. Besides \floatident, we include the short % caption if specified, else the full caption if specified, else nothing. {% \atdummies % % since we read the caption text in the macro world, where ^^M % is turned into a normal character, we have to scan it back, so % we don't write the literal three characters "^^M" into the aux file. \scanexp{% \xdef\noexpand\gtemp{% \ifx\thisshortcaption\empty \thiscaption \else \thisshortcaption \fi }% }% \immediate\write\auxfile{@xrdef{\floatlabel-lof}{\floatident \ifx\gtemp\empty \else : \gtemp \fi}}% }% \fi \egroup % end of \vtop % % place the captured inserts % % BEWARE: when the floats start floating, we have to issue warning % whenever an insert appears inside a float which could possibly % float. --kasal, 26may04 % \checkinserts } % Append the tokens #2 to the definition of macro #1, not expanding either. % \def\appendtomacro#1#2{% \expandafter\def\expandafter#1\expandafter{#1#2}% } % @caption, @shortcaption % \def\caption{\docaption\thiscaption} \def\shortcaption{\docaption\thisshortcaption} \def\docaption{\checkenv\float \bgroup\scanargctxt\defcaption} \def\defcaption#1#2{\egroup \def#1{#2}} % The parameter is the control sequence identifying the counter we are % going to use. Create it if it doesn't exist and assign it to \floatno. \def\getfloatno#1{% \ifx#1\relax % Haven't seen this figure type before. \csname newcount\endcsname #1% % % Remember to reset this floatno at the next chap. \expandafter\gdef\expandafter\resetallfloatnos \expandafter{\resetallfloatnos #1=0 }% \fi \let\floatno#1% } % \setref calls this to get the XREFLABEL-snt value. We want an @xref % to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we % first read the @float command. % \def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% % Magic string used for the XREFLABEL-title value, so \xrefX can % distinguish floats from other xref types. \def\floatmagic{!!float!!} % #1 is the control sequence we are passed; we expand into a conditional % which is true if #1 represents a float ref. That is, the magic % \lastsection value which we \setref above. % \def\iffloat#1{\expandafter\doiffloat#1==\finish} % % #1 is (maybe) the \floatmagic string. If so, #2 will be the % (safe) float type for this float. We set \iffloattype to #2. % \def\doiffloat#1=#2=#3\finish{% \def\temp{#1}% \def\iffloattype{#2}% \ifx\temp\floatmagic } % @listoffloats FLOATTYPE - print a list of floats like a table of contents. % \parseargdef\listoffloats{% \def\floattype{#1}% floattype {% % the floattype might have accents or other special characters, % but we need to use it in a control sequence name. \indexnofonts \turnoffactive \xdef\safefloattype{\floattype}% }% % % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax \ifhavexrefs % if the user said @listoffloats foo but never @float foo. \message{\linenumber No `\safefloattype' floats to list.}% \fi \else \begingroup \leftskip=\tocindent % indent these entries like a toc \let\do=\listoffloatsdo \csname floatlist\safefloattype\endcsname \endgroup \fi } % This is called on each entry in a list of floats. We're passed the % xref label, in the form LABEL-title, which is how we save it in the % aux file. We strip off the -title and look up \XRLABEL-lof, which % has the text we're supposed to typeset here. % % Figures without xref labels will not be included in the list (since % they won't appear in the aux file). % \def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} \def\listoffloatsdoentry#1-title\finish{{% % Can't fully expand XR#1-lof because it can contain anything. Just % pass the control sequence. On the other hand, XR#1-pg is just the % page number, and we want to fully expand that so we can get a link % in pdf output. \toksA = \expandafter{\csname XR#1-lof\endcsname}% % % use the same \entry macro we use to generate the TOC and index. \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% \writeentry }} \message{localization,} % For single-language documents, @documentlanguage is usually given very % early, just after @documentencoding. Single argument is the language % (de) or locale (de_DE) abbreviation. % { \catcode`\_ = \active \globaldefs=1 \parseargdef\documentlanguage{\begingroup \let_=\normalunderscore % normal _ character for filenames \tex % read txi-??.tex file in plain TeX. % Read the file by the name they passed if it exists. \openin 1 txi-#1.tex \ifeof 1 \documentlanguagetrywithoutunderscore{#1_\finish}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 \endgroup % end raw TeX \endgroup} % % If they passed de_DE, and txi-de_DE.tex doesn't exist, % try txi-de.tex. % \gdef\documentlanguagetrywithoutunderscore#1_#2\finish{% \openin 1 txi-#1.tex \ifeof 1 \errhelp = \nolanghelp \errmessage{Cannot read language file txi-#1.tex}% \else \globaldefs = 1 % everything in the txi-LL files needs to persist \input txi-#1.tex \fi \closein 1 } }% end of special _ catcode % \newhelp\nolanghelp{The given language definition file cannot be found or is empty. Maybe you need to install it? Putting it in the current directory should work if nowhere else does.} % This macro is called from txi-??.tex files; the first argument is the % \language name to set (without the "\lang@" prefix), the second and % third args are \{left,right}hyphenmin. % % The language names to pass are determined when the format is built. % See the etex.log file created at that time, e.g., % /usr/local/texlive/2008/texmf-var/web2c/pdftex/etex.log. % % With TeX Live 2008, etex now includes hyphenation patterns for all % available languages. This means we can support hyphenation in % Texinfo, at least to some extent. (This still doesn't solve the % accented characters problem.) % \catcode`@=11 \def\txisetlanguage#1#2#3{% % do not set the language if the name is undefined in the current TeX. \expandafter\ifx\csname lang@#1\endcsname \relax \message{no patterns for #1}% \else \global\language = \csname lang@#1\endcsname \fi % but there is no harm in adjusting the hyphenmin values regardless. \global\lefthyphenmin = #2\relax \global\righthyphenmin = #3\relax } % Helpers for encodings. % Set the catcode of characters 128 through 255 to the specified number. % \def\setnonasciicharscatcode#1{% \count255=128 \loop\ifnum\count255<256 \global\catcode\count255=#1\relax \advance\count255 by 1 \repeat } \def\setnonasciicharscatcodenonglobal#1{% \count255=128 \loop\ifnum\count255<256 \catcode\count255=#1\relax \advance\count255 by 1 \repeat } % @documentencoding sets the definition of non-ASCII characters % according to the specified encoding. % \parseargdef\documentencoding{% % Encoding being declared for the document. \def\declaredencoding{\csname #1.enc\endcsname}% % % Supported encodings: names converted to tokens in order to be able % to compare them with \ifx. \def\ascii{\csname US-ASCII.enc\endcsname}% \def\latnine{\csname ISO-8859-15.enc\endcsname}% \def\latone{\csname ISO-8859-1.enc\endcsname}% \def\lattwo{\csname ISO-8859-2.enc\endcsname}% \def\utfeight{\csname UTF-8.enc\endcsname}% % \ifx \declaredencoding \ascii \asciichardefs % \else \ifx \declaredencoding \lattwo \setnonasciicharscatcode\active \lattwochardefs % \else \ifx \declaredencoding \latone \setnonasciicharscatcode\active \latonechardefs % \else \ifx \declaredencoding \latnine \setnonasciicharscatcode\active \latninechardefs % \else \ifx \declaredencoding \utfeight \setnonasciicharscatcode\active \utfeightchardefs % \else \message{Unknown document encoding #1, ignoring.}% % \fi % utfeight \fi % latnine \fi % latone \fi % lattwo \fi % ascii } % A message to be logged when using a character that isn't available % the default font encoding (OT1). % \def\missingcharmsg#1{\message{Character missing in OT1 encoding: #1.}} % Take account of \c (plain) vs. \, (Texinfo) difference. \def\cedilla#1{\ifx\c\ptexc\c{#1}\else\,{#1}\fi} % First, make active non-ASCII characters in order for them to be % correctly categorized when TeX reads the replacement text of % macros containing the character definitions. \setnonasciicharscatcode\active % % Latin1 (ISO-8859-1) character definitions. \def\latonechardefs{% \gdef^^a0{\tie} \gdef^^a1{\exclamdown} \gdef^^a2{\missingcharmsg{CENT SIGN}} \gdef^^a3{{\pounds}} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\missingcharmsg{YEN SIGN}} \gdef^^a6{\missingcharmsg{BROKEN BAR}} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\copyright} \gdef^^aa{\ordf} \gdef^^ab{\guillemetleft} \gdef^^ac{$\lnot$} \gdef^^ad{\-} \gdef^^ae{\registeredsymbol} \gdef^^af{\={}} % \gdef^^b0{\textdegree} \gdef^^b1{$\pm$} \gdef^^b2{$^2$} \gdef^^b3{$^3$} \gdef^^b4{\'{}} \gdef^^b5{$\mu$} \gdef^^b6{\P} % \gdef^^b7{$^.$} \gdef^^b8{\cedilla\ } \gdef^^b9{$^1$} \gdef^^ba{\ordm} % \gdef^^bb{\guillemetright} \gdef^^bc{$1\over4$} \gdef^^bd{$1\over2$} \gdef^^be{$3\over4$} \gdef^^bf{\questiondown} % \gdef^^c0{\`A} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\~A} \gdef^^c4{\"A} \gdef^^c5{\ringaccent A} \gdef^^c6{\AE} \gdef^^c7{\cedilla C} \gdef^^c8{\`E} \gdef^^c9{\'E} \gdef^^ca{\^E} \gdef^^cb{\"E} \gdef^^cc{\`I} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\"I} % \gdef^^d0{\DH} \gdef^^d1{\~N} \gdef^^d2{\`O} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\~O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\O} \gdef^^d9{\`U} \gdef^^da{\'U} \gdef^^db{\^U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\TH} \gdef^^df{\ss} % \gdef^^e0{\`a} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\~a} \gdef^^e4{\"a} \gdef^^e5{\ringaccent a} \gdef^^e6{\ae} \gdef^^e7{\cedilla c} \gdef^^e8{\`e} \gdef^^e9{\'e} \gdef^^ea{\^e} \gdef^^eb{\"e} \gdef^^ec{\`{\dotless i}} \gdef^^ed{\'{\dotless i}} \gdef^^ee{\^{\dotless i}} \gdef^^ef{\"{\dotless i}} % \gdef^^f0{\dh} \gdef^^f1{\~n} \gdef^^f2{\`o} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\~o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\o} \gdef^^f9{\`u} \gdef^^fa{\'u} \gdef^^fb{\^u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\th} \gdef^^ff{\"y} } % Latin9 (ISO-8859-15) encoding character definitions. \def\latninechardefs{% % Encoding is almost identical to Latin1. \latonechardefs % \gdef^^a4{\euro} \gdef^^a6{\v S} \gdef^^a8{\v s} \gdef^^b4{\v Z} \gdef^^b8{\v z} \gdef^^bc{\OE} \gdef^^bd{\oe} \gdef^^be{\"Y} } % Latin2 (ISO-8859-2) character definitions. \def\lattwochardefs{% \gdef^^a0{\tie} \gdef^^a1{\ogonek{A}} \gdef^^a2{\u{}} \gdef^^a3{\L} \gdef^^a4{\missingcharmsg{CURRENCY SIGN}} \gdef^^a5{\v L} \gdef^^a6{\'S} \gdef^^a7{\S} \gdef^^a8{\"{}} \gdef^^a9{\v S} \gdef^^aa{\cedilla S} \gdef^^ab{\v T} \gdef^^ac{\'Z} \gdef^^ad{\-} \gdef^^ae{\v Z} \gdef^^af{\dotaccent Z} % \gdef^^b0{\textdegree} \gdef^^b1{\ogonek{a}} \gdef^^b2{\ogonek{ }} \gdef^^b3{\l} \gdef^^b4{\'{}} \gdef^^b5{\v l} \gdef^^b6{\'s} \gdef^^b7{\v{}} \gdef^^b8{\cedilla\ } \gdef^^b9{\v s} \gdef^^ba{\cedilla s} \gdef^^bb{\v t} \gdef^^bc{\'z} \gdef^^bd{\H{}} \gdef^^be{\v z} \gdef^^bf{\dotaccent z} % \gdef^^c0{\'R} \gdef^^c1{\'A} \gdef^^c2{\^A} \gdef^^c3{\u A} \gdef^^c4{\"A} \gdef^^c5{\'L} \gdef^^c6{\'C} \gdef^^c7{\cedilla C} \gdef^^c8{\v C} \gdef^^c9{\'E} \gdef^^ca{\ogonek{E}} \gdef^^cb{\"E} \gdef^^cc{\v E} \gdef^^cd{\'I} \gdef^^ce{\^I} \gdef^^cf{\v D} % \gdef^^d0{\DH} \gdef^^d1{\'N} \gdef^^d2{\v N} \gdef^^d3{\'O} \gdef^^d4{\^O} \gdef^^d5{\H O} \gdef^^d6{\"O} \gdef^^d7{$\times$} \gdef^^d8{\v R} \gdef^^d9{\ringaccent U} \gdef^^da{\'U} \gdef^^db{\H U} \gdef^^dc{\"U} \gdef^^dd{\'Y} \gdef^^de{\cedilla T} \gdef^^df{\ss} % \gdef^^e0{\'r} \gdef^^e1{\'a} \gdef^^e2{\^a} \gdef^^e3{\u a} \gdef^^e4{\"a} \gdef^^e5{\'l} \gdef^^e6{\'c} \gdef^^e7{\cedilla c} \gdef^^e8{\v c} \gdef^^e9{\'e} \gdef^^ea{\ogonek{e}} \gdef^^eb{\"e} \gdef^^ec{\v e} \gdef^^ed{\'{\dotless{i}}} \gdef^^ee{\^{\dotless{i}}} \gdef^^ef{\v d} % \gdef^^f0{\dh} \gdef^^f1{\'n} \gdef^^f2{\v n} \gdef^^f3{\'o} \gdef^^f4{\^o} \gdef^^f5{\H o} \gdef^^f6{\"o} \gdef^^f7{$\div$} \gdef^^f8{\v r} \gdef^^f9{\ringaccent u} \gdef^^fa{\'u} \gdef^^fb{\H u} \gdef^^fc{\"u} \gdef^^fd{\'y} \gdef^^fe{\cedilla t} \gdef^^ff{\dotaccent{}} } % UTF-8 character definitions. % % This code to support UTF-8 is based on LaTeX's utf8.def, with some % changes for Texinfo conventions. It is included here under the GPL by % permission from Frank Mittelbach and the LaTeX team. % \newcount\countUTFx \newcount\countUTFy \newcount\countUTFz \gdef\UTFviiiTwoOctets#1#2{\expandafter \UTFviiiDefined\csname u8:#1\string #2\endcsname} % \gdef\UTFviiiThreeOctets#1#2#3{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\endcsname} % \gdef\UTFviiiFourOctets#1#2#3#4{\expandafter \UTFviiiDefined\csname u8:#1\string #2\string #3\string #4\endcsname} \gdef\UTFviiiDefined#1{% \ifx #1\relax \message{\linenumber Unicode char \string #1 not defined for Texinfo}% \else \expandafter #1% \fi } \begingroup \catcode`\~13 \catcode`\"12 \def\UTFviiiLoop{% \global\catcode\countUTFx\active \uccode`\~\countUTFx \uppercase\expandafter{\UTFviiiTmp}% \advance\countUTFx by 1 \ifnum\countUTFx < \countUTFy \expandafter\UTFviiiLoop \fi} \countUTFx = "C2 \countUTFy = "E0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiTwoOctets\string~}} \UTFviiiLoop \countUTFx = "E0 \countUTFy = "F0 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiThreeOctets\string~}} \UTFviiiLoop \countUTFx = "F0 \countUTFy = "F4 \def\UTFviiiTmp{% \xdef~{\noexpand\UTFviiiFourOctets\string~}} \UTFviiiLoop \endgroup \begingroup \catcode`\"=12 \catcode`\<=12 \catcode`\.=12 \catcode`\,=12 \catcode`\;=12 \catcode`\!=12 \catcode`\~=13 \gdef\DeclareUnicodeCharacter#1#2{% \countUTFz = "#1\relax %\wlog{\space\space defining Unicode char U+#1 (decimal \the\countUTFz)}% \begingroup \parseXMLCharref \def\UTFviiiTwoOctets##1##2{% \csname u8:##1\string ##2\endcsname}% \def\UTFviiiThreeOctets##1##2##3{% \csname u8:##1\string ##2\string ##3\endcsname}% \def\UTFviiiFourOctets##1##2##3##4{% \csname u8:##1\string ##2\string ##3\string ##4\endcsname}% \expandafter\expandafter\expandafter\expandafter \expandafter\expandafter\expandafter \gdef\UTFviiiTmp{#2}% \endgroup} \gdef\parseXMLCharref{% \ifnum\countUTFz < "A0\relax \errhelp = \EMsimple \errmessage{Cannot define Unicode char value < 00A0}% \else\ifnum\countUTFz < "800\relax \parseUTFviiiA,% \parseUTFviiiB C\UTFviiiTwoOctets.,% \else\ifnum\countUTFz < "10000\relax \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiB E\UTFviiiThreeOctets.{,;}% \else \parseUTFviiiA;% \parseUTFviiiA,% \parseUTFviiiA!% \parseUTFviiiB F\UTFviiiFourOctets.{!,;}% \fi\fi\fi } \gdef\parseUTFviiiA#1{% \countUTFx = \countUTFz \divide\countUTFz by 64 \countUTFy = \countUTFz \multiply\countUTFz by 64 \advance\countUTFx by -\countUTFz \advance\countUTFx by 128 \uccode `#1\countUTFx \countUTFz = \countUTFy} \gdef\parseUTFviiiB#1#2#3#4{% \advance\countUTFz by "#10\relax \uccode `#3\countUTFz \uppercase{\gdef\UTFviiiTmp{#2#3#4}}} \endgroup \def\utfeightchardefs{% \DeclareUnicodeCharacter{00A0}{\tie} \DeclareUnicodeCharacter{00A1}{\exclamdown} \DeclareUnicodeCharacter{00A3}{\pounds} \DeclareUnicodeCharacter{00A8}{\"{ }} \DeclareUnicodeCharacter{00A9}{\copyright} \DeclareUnicodeCharacter{00AA}{\ordf} \DeclareUnicodeCharacter{00AB}{\guillemetleft} \DeclareUnicodeCharacter{00AD}{\-} \DeclareUnicodeCharacter{00AE}{\registeredsymbol} \DeclareUnicodeCharacter{00AF}{\={ }} \DeclareUnicodeCharacter{00B0}{\ringaccent{ }} \DeclareUnicodeCharacter{00B4}{\'{ }} \DeclareUnicodeCharacter{00B8}{\cedilla{ }} \DeclareUnicodeCharacter{00BA}{\ordm} \DeclareUnicodeCharacter{00BB}{\guillemetright} \DeclareUnicodeCharacter{00BF}{\questiondown} \DeclareUnicodeCharacter{00C0}{\`A} \DeclareUnicodeCharacter{00C1}{\'A} \DeclareUnicodeCharacter{00C2}{\^A} \DeclareUnicodeCharacter{00C3}{\~A} \DeclareUnicodeCharacter{00C4}{\"A} \DeclareUnicodeCharacter{00C5}{\AA} \DeclareUnicodeCharacter{00C6}{\AE} \DeclareUnicodeCharacter{00C7}{\cedilla{C}} \DeclareUnicodeCharacter{00C8}{\`E} \DeclareUnicodeCharacter{00C9}{\'E} \DeclareUnicodeCharacter{00CA}{\^E} \DeclareUnicodeCharacter{00CB}{\"E} \DeclareUnicodeCharacter{00CC}{\`I} \DeclareUnicodeCharacter{00CD}{\'I} \DeclareUnicodeCharacter{00CE}{\^I} \DeclareUnicodeCharacter{00CF}{\"I} \DeclareUnicodeCharacter{00D0}{\DH} \DeclareUnicodeCharacter{00D1}{\~N} \DeclareUnicodeCharacter{00D2}{\`O} \DeclareUnicodeCharacter{00D3}{\'O} \DeclareUnicodeCharacter{00D4}{\^O} \DeclareUnicodeCharacter{00D5}{\~O} \DeclareUnicodeCharacter{00D6}{\"O} \DeclareUnicodeCharacter{00D8}{\O} \DeclareUnicodeCharacter{00D9}{\`U} \DeclareUnicodeCharacter{00DA}{\'U} \DeclareUnicodeCharacter{00DB}{\^U} \DeclareUnicodeCharacter{00DC}{\"U} \DeclareUnicodeCharacter{00DD}{\'Y} \DeclareUnicodeCharacter{00DE}{\TH} \DeclareUnicodeCharacter{00DF}{\ss} \DeclareUnicodeCharacter{00E0}{\`a} \DeclareUnicodeCharacter{00E1}{\'a} \DeclareUnicodeCharacter{00E2}{\^a} \DeclareUnicodeCharacter{00E3}{\~a} \DeclareUnicodeCharacter{00E4}{\"a} \DeclareUnicodeCharacter{00E5}{\aa} \DeclareUnicodeCharacter{00E6}{\ae} \DeclareUnicodeCharacter{00E7}{\cedilla{c}} \DeclareUnicodeCharacter{00E8}{\`e} \DeclareUnicodeCharacter{00E9}{\'e} \DeclareUnicodeCharacter{00EA}{\^e} \DeclareUnicodeCharacter{00EB}{\"e} \DeclareUnicodeCharacter{00EC}{\`{\dotless{i}}} \DeclareUnicodeCharacter{00ED}{\'{\dotless{i}}} \DeclareUnicodeCharacter{00EE}{\^{\dotless{i}}} \DeclareUnicodeCharacter{00EF}{\"{\dotless{i}}} \DeclareUnicodeCharacter{00F0}{\dh} \DeclareUnicodeCharacter{00F1}{\~n} \DeclareUnicodeCharacter{00F2}{\`o} \DeclareUnicodeCharacter{00F3}{\'o} \DeclareUnicodeCharacter{00F4}{\^o} \DeclareUnicodeCharacter{00F5}{\~o} \DeclareUnicodeCharacter{00F6}{\"o} \DeclareUnicodeCharacter{00F8}{\o} \DeclareUnicodeCharacter{00F9}{\`u} \DeclareUnicodeCharacter{00FA}{\'u} \DeclareUnicodeCharacter{00FB}{\^u} \DeclareUnicodeCharacter{00FC}{\"u} \DeclareUnicodeCharacter{00FD}{\'y} \DeclareUnicodeCharacter{00FE}{\th} \DeclareUnicodeCharacter{00FF}{\"y} \DeclareUnicodeCharacter{0100}{\=A} \DeclareUnicodeCharacter{0101}{\=a} \DeclareUnicodeCharacter{0102}{\u{A}} \DeclareUnicodeCharacter{0103}{\u{a}} \DeclareUnicodeCharacter{0104}{\ogonek{A}} \DeclareUnicodeCharacter{0105}{\ogonek{a}} \DeclareUnicodeCharacter{0106}{\'C} \DeclareUnicodeCharacter{0107}{\'c} \DeclareUnicodeCharacter{0108}{\^C} \DeclareUnicodeCharacter{0109}{\^c} \DeclareUnicodeCharacter{0118}{\ogonek{E}} \DeclareUnicodeCharacter{0119}{\ogonek{e}} \DeclareUnicodeCharacter{010A}{\dotaccent{C}} \DeclareUnicodeCharacter{010B}{\dotaccent{c}} \DeclareUnicodeCharacter{010C}{\v{C}} \DeclareUnicodeCharacter{010D}{\v{c}} \DeclareUnicodeCharacter{010E}{\v{D}} \DeclareUnicodeCharacter{0112}{\=E} \DeclareUnicodeCharacter{0113}{\=e} \DeclareUnicodeCharacter{0114}{\u{E}} \DeclareUnicodeCharacter{0115}{\u{e}} \DeclareUnicodeCharacter{0116}{\dotaccent{E}} \DeclareUnicodeCharacter{0117}{\dotaccent{e}} \DeclareUnicodeCharacter{011A}{\v{E}} \DeclareUnicodeCharacter{011B}{\v{e}} \DeclareUnicodeCharacter{011C}{\^G} \DeclareUnicodeCharacter{011D}{\^g} \DeclareUnicodeCharacter{011E}{\u{G}} \DeclareUnicodeCharacter{011F}{\u{g}} \DeclareUnicodeCharacter{0120}{\dotaccent{G}} \DeclareUnicodeCharacter{0121}{\dotaccent{g}} \DeclareUnicodeCharacter{0124}{\^H} \DeclareUnicodeCharacter{0125}{\^h} \DeclareUnicodeCharacter{0128}{\~I} \DeclareUnicodeCharacter{0129}{\~{\dotless{i}}} \DeclareUnicodeCharacter{012A}{\=I} \DeclareUnicodeCharacter{012B}{\={\dotless{i}}} \DeclareUnicodeCharacter{012C}{\u{I}} \DeclareUnicodeCharacter{012D}{\u{\dotless{i}}} \DeclareUnicodeCharacter{0130}{\dotaccent{I}} \DeclareUnicodeCharacter{0131}{\dotless{i}} \DeclareUnicodeCharacter{0132}{IJ} \DeclareUnicodeCharacter{0133}{ij} \DeclareUnicodeCharacter{0134}{\^J} \DeclareUnicodeCharacter{0135}{\^{\dotless{j}}} \DeclareUnicodeCharacter{0139}{\'L} \DeclareUnicodeCharacter{013A}{\'l} \DeclareUnicodeCharacter{0141}{\L} \DeclareUnicodeCharacter{0142}{\l} \DeclareUnicodeCharacter{0143}{\'N} \DeclareUnicodeCharacter{0144}{\'n} \DeclareUnicodeCharacter{0147}{\v{N}} \DeclareUnicodeCharacter{0148}{\v{n}} \DeclareUnicodeCharacter{014C}{\=O} \DeclareUnicodeCharacter{014D}{\=o} \DeclareUnicodeCharacter{014E}{\u{O}} \DeclareUnicodeCharacter{014F}{\u{o}} \DeclareUnicodeCharacter{0150}{\H{O}} \DeclareUnicodeCharacter{0151}{\H{o}} \DeclareUnicodeCharacter{0152}{\OE} \DeclareUnicodeCharacter{0153}{\oe} \DeclareUnicodeCharacter{0154}{\'R} \DeclareUnicodeCharacter{0155}{\'r} \DeclareUnicodeCharacter{0158}{\v{R}} \DeclareUnicodeCharacter{0159}{\v{r}} \DeclareUnicodeCharacter{015A}{\'S} \DeclareUnicodeCharacter{015B}{\'s} \DeclareUnicodeCharacter{015C}{\^S} \DeclareUnicodeCharacter{015D}{\^s} \DeclareUnicodeCharacter{015E}{\cedilla{S}} \DeclareUnicodeCharacter{015F}{\cedilla{s}} \DeclareUnicodeCharacter{0160}{\v{S}} \DeclareUnicodeCharacter{0161}{\v{s}} \DeclareUnicodeCharacter{0162}{\cedilla{t}} \DeclareUnicodeCharacter{0163}{\cedilla{T}} \DeclareUnicodeCharacter{0164}{\v{T}} \DeclareUnicodeCharacter{0168}{\~U} \DeclareUnicodeCharacter{0169}{\~u} \DeclareUnicodeCharacter{016A}{\=U} \DeclareUnicodeCharacter{016B}{\=u} \DeclareUnicodeCharacter{016C}{\u{U}} \DeclareUnicodeCharacter{016D}{\u{u}} \DeclareUnicodeCharacter{016E}{\ringaccent{U}} \DeclareUnicodeCharacter{016F}{\ringaccent{u}} \DeclareUnicodeCharacter{0170}{\H{U}} \DeclareUnicodeCharacter{0171}{\H{u}} \DeclareUnicodeCharacter{0174}{\^W} \DeclareUnicodeCharacter{0175}{\^w} \DeclareUnicodeCharacter{0176}{\^Y} \DeclareUnicodeCharacter{0177}{\^y} \DeclareUnicodeCharacter{0178}{\"Y} \DeclareUnicodeCharacter{0179}{\'Z} \DeclareUnicodeCharacter{017A}{\'z} \DeclareUnicodeCharacter{017B}{\dotaccent{Z}} \DeclareUnicodeCharacter{017C}{\dotaccent{z}} \DeclareUnicodeCharacter{017D}{\v{Z}} \DeclareUnicodeCharacter{017E}{\v{z}} \DeclareUnicodeCharacter{01C4}{D\v{Z}} \DeclareUnicodeCharacter{01C5}{D\v{z}} \DeclareUnicodeCharacter{01C6}{d\v{z}} \DeclareUnicodeCharacter{01C7}{LJ} \DeclareUnicodeCharacter{01C8}{Lj} \DeclareUnicodeCharacter{01C9}{lj} \DeclareUnicodeCharacter{01CA}{NJ} \DeclareUnicodeCharacter{01CB}{Nj} \DeclareUnicodeCharacter{01CC}{nj} \DeclareUnicodeCharacter{01CD}{\v{A}} \DeclareUnicodeCharacter{01CE}{\v{a}} \DeclareUnicodeCharacter{01CF}{\v{I}} \DeclareUnicodeCharacter{01D0}{\v{\dotless{i}}} \DeclareUnicodeCharacter{01D1}{\v{O}} \DeclareUnicodeCharacter{01D2}{\v{o}} \DeclareUnicodeCharacter{01D3}{\v{U}} \DeclareUnicodeCharacter{01D4}{\v{u}} \DeclareUnicodeCharacter{01E2}{\={\AE}} \DeclareUnicodeCharacter{01E3}{\={\ae}} \DeclareUnicodeCharacter{01E6}{\v{G}} \DeclareUnicodeCharacter{01E7}{\v{g}} \DeclareUnicodeCharacter{01E8}{\v{K}} \DeclareUnicodeCharacter{01E9}{\v{k}} \DeclareUnicodeCharacter{01F0}{\v{\dotless{j}}} \DeclareUnicodeCharacter{01F1}{DZ} \DeclareUnicodeCharacter{01F2}{Dz} \DeclareUnicodeCharacter{01F3}{dz} \DeclareUnicodeCharacter{01F4}{\'G} \DeclareUnicodeCharacter{01F5}{\'g} \DeclareUnicodeCharacter{01F8}{\`N} \DeclareUnicodeCharacter{01F9}{\`n} \DeclareUnicodeCharacter{01FC}{\'{\AE}} \DeclareUnicodeCharacter{01FD}{\'{\ae}} \DeclareUnicodeCharacter{01FE}{\'{\O}} \DeclareUnicodeCharacter{01FF}{\'{\o}} \DeclareUnicodeCharacter{021E}{\v{H}} \DeclareUnicodeCharacter{021F}{\v{h}} \DeclareUnicodeCharacter{0226}{\dotaccent{A}} \DeclareUnicodeCharacter{0227}{\dotaccent{a}} \DeclareUnicodeCharacter{0228}{\cedilla{E}} \DeclareUnicodeCharacter{0229}{\cedilla{e}} \DeclareUnicodeCharacter{022E}{\dotaccent{O}} \DeclareUnicodeCharacter{022F}{\dotaccent{o}} \DeclareUnicodeCharacter{0232}{\=Y} \DeclareUnicodeCharacter{0233}{\=y} \DeclareUnicodeCharacter{0237}{\dotless{j}} \DeclareUnicodeCharacter{02DB}{\ogonek{ }} \DeclareUnicodeCharacter{1E02}{\dotaccent{B}} \DeclareUnicodeCharacter{1E03}{\dotaccent{b}} \DeclareUnicodeCharacter{1E04}{\udotaccent{B}} \DeclareUnicodeCharacter{1E05}{\udotaccent{b}} \DeclareUnicodeCharacter{1E06}{\ubaraccent{B}} \DeclareUnicodeCharacter{1E07}{\ubaraccent{b}} \DeclareUnicodeCharacter{1E0A}{\dotaccent{D}} \DeclareUnicodeCharacter{1E0B}{\dotaccent{d}} \DeclareUnicodeCharacter{1E0C}{\udotaccent{D}} \DeclareUnicodeCharacter{1E0D}{\udotaccent{d}} \DeclareUnicodeCharacter{1E0E}{\ubaraccent{D}} \DeclareUnicodeCharacter{1E0F}{\ubaraccent{d}} \DeclareUnicodeCharacter{1E1E}{\dotaccent{F}} \DeclareUnicodeCharacter{1E1F}{\dotaccent{f}} \DeclareUnicodeCharacter{1E20}{\=G} \DeclareUnicodeCharacter{1E21}{\=g} \DeclareUnicodeCharacter{1E22}{\dotaccent{H}} \DeclareUnicodeCharacter{1E23}{\dotaccent{h}} \DeclareUnicodeCharacter{1E24}{\udotaccent{H}} \DeclareUnicodeCharacter{1E25}{\udotaccent{h}} \DeclareUnicodeCharacter{1E26}{\"H} \DeclareUnicodeCharacter{1E27}{\"h} \DeclareUnicodeCharacter{1E30}{\'K} \DeclareUnicodeCharacter{1E31}{\'k} \DeclareUnicodeCharacter{1E32}{\udotaccent{K}} \DeclareUnicodeCharacter{1E33}{\udotaccent{k}} \DeclareUnicodeCharacter{1E34}{\ubaraccent{K}} \DeclareUnicodeCharacter{1E35}{\ubaraccent{k}} \DeclareUnicodeCharacter{1E36}{\udotaccent{L}} \DeclareUnicodeCharacter{1E37}{\udotaccent{l}} \DeclareUnicodeCharacter{1E3A}{\ubaraccent{L}} \DeclareUnicodeCharacter{1E3B}{\ubaraccent{l}} \DeclareUnicodeCharacter{1E3E}{\'M} \DeclareUnicodeCharacter{1E3F}{\'m} \DeclareUnicodeCharacter{1E40}{\dotaccent{M}} \DeclareUnicodeCharacter{1E41}{\dotaccent{m}} \DeclareUnicodeCharacter{1E42}{\udotaccent{M}} \DeclareUnicodeCharacter{1E43}{\udotaccent{m}} \DeclareUnicodeCharacter{1E44}{\dotaccent{N}} \DeclareUnicodeCharacter{1E45}{\dotaccent{n}} \DeclareUnicodeCharacter{1E46}{\udotaccent{N}} \DeclareUnicodeCharacter{1E47}{\udotaccent{n}} \DeclareUnicodeCharacter{1E48}{\ubaraccent{N}} \DeclareUnicodeCharacter{1E49}{\ubaraccent{n}} \DeclareUnicodeCharacter{1E54}{\'P} \DeclareUnicodeCharacter{1E55}{\'p} \DeclareUnicodeCharacter{1E56}{\dotaccent{P}} \DeclareUnicodeCharacter{1E57}{\dotaccent{p}} \DeclareUnicodeCharacter{1E58}{\dotaccent{R}} \DeclareUnicodeCharacter{1E59}{\dotaccent{r}} \DeclareUnicodeCharacter{1E5A}{\udotaccent{R}} \DeclareUnicodeCharacter{1E5B}{\udotaccent{r}} \DeclareUnicodeCharacter{1E5E}{\ubaraccent{R}} \DeclareUnicodeCharacter{1E5F}{\ubaraccent{r}} \DeclareUnicodeCharacter{1E60}{\dotaccent{S}} \DeclareUnicodeCharacter{1E61}{\dotaccent{s}} \DeclareUnicodeCharacter{1E62}{\udotaccent{S}} \DeclareUnicodeCharacter{1E63}{\udotaccent{s}} \DeclareUnicodeCharacter{1E6A}{\dotaccent{T}} \DeclareUnicodeCharacter{1E6B}{\dotaccent{t}} \DeclareUnicodeCharacter{1E6C}{\udotaccent{T}} \DeclareUnicodeCharacter{1E6D}{\udotaccent{t}} \DeclareUnicodeCharacter{1E6E}{\ubaraccent{T}} \DeclareUnicodeCharacter{1E6F}{\ubaraccent{t}} \DeclareUnicodeCharacter{1E7C}{\~V} \DeclareUnicodeCharacter{1E7D}{\~v} \DeclareUnicodeCharacter{1E7E}{\udotaccent{V}} \DeclareUnicodeCharacter{1E7F}{\udotaccent{v}} \DeclareUnicodeCharacter{1E80}{\`W} \DeclareUnicodeCharacter{1E81}{\`w} \DeclareUnicodeCharacter{1E82}{\'W} \DeclareUnicodeCharacter{1E83}{\'w} \DeclareUnicodeCharacter{1E84}{\"W} \DeclareUnicodeCharacter{1E85}{\"w} \DeclareUnicodeCharacter{1E86}{\dotaccent{W}} \DeclareUnicodeCharacter{1E87}{\dotaccent{w}} \DeclareUnicodeCharacter{1E88}{\udotaccent{W}} \DeclareUnicodeCharacter{1E89}{\udotaccent{w}} \DeclareUnicodeCharacter{1E8A}{\dotaccent{X}} \DeclareUnicodeCharacter{1E8B}{\dotaccent{x}} \DeclareUnicodeCharacter{1E8C}{\"X} \DeclareUnicodeCharacter{1E8D}{\"x} \DeclareUnicodeCharacter{1E8E}{\dotaccent{Y}} \DeclareUnicodeCharacter{1E8F}{\dotaccent{y}} \DeclareUnicodeCharacter{1E90}{\^Z} \DeclareUnicodeCharacter{1E91}{\^z} \DeclareUnicodeCharacter{1E92}{\udotaccent{Z}} \DeclareUnicodeCharacter{1E93}{\udotaccent{z}} \DeclareUnicodeCharacter{1E94}{\ubaraccent{Z}} \DeclareUnicodeCharacter{1E95}{\ubaraccent{z}} \DeclareUnicodeCharacter{1E96}{\ubaraccent{h}} \DeclareUnicodeCharacter{1E97}{\"t} \DeclareUnicodeCharacter{1E98}{\ringaccent{w}} \DeclareUnicodeCharacter{1E99}{\ringaccent{y}} \DeclareUnicodeCharacter{1EA0}{\udotaccent{A}} \DeclareUnicodeCharacter{1EA1}{\udotaccent{a}} \DeclareUnicodeCharacter{1EB8}{\udotaccent{E}} \DeclareUnicodeCharacter{1EB9}{\udotaccent{e}} \DeclareUnicodeCharacter{1EBC}{\~E} \DeclareUnicodeCharacter{1EBD}{\~e} \DeclareUnicodeCharacter{1ECA}{\udotaccent{I}} \DeclareUnicodeCharacter{1ECB}{\udotaccent{i}} \DeclareUnicodeCharacter{1ECC}{\udotaccent{O}} \DeclareUnicodeCharacter{1ECD}{\udotaccent{o}} \DeclareUnicodeCharacter{1EE4}{\udotaccent{U}} \DeclareUnicodeCharacter{1EE5}{\udotaccent{u}} \DeclareUnicodeCharacter{1EF2}{\`Y} \DeclareUnicodeCharacter{1EF3}{\`y} \DeclareUnicodeCharacter{1EF4}{\udotaccent{Y}} \DeclareUnicodeCharacter{1EF8}{\~Y} \DeclareUnicodeCharacter{1EF9}{\~y} \DeclareUnicodeCharacter{2013}{--} \DeclareUnicodeCharacter{2014}{---} \DeclareUnicodeCharacter{2018}{\quoteleft} \DeclareUnicodeCharacter{2019}{\quoteright} \DeclareUnicodeCharacter{201A}{\quotesinglbase} \DeclareUnicodeCharacter{201C}{\quotedblleft} \DeclareUnicodeCharacter{201D}{\quotedblright} \DeclareUnicodeCharacter{201E}{\quotedblbase} \DeclareUnicodeCharacter{2022}{\bullet} \DeclareUnicodeCharacter{2026}{\dots} \DeclareUnicodeCharacter{2039}{\guilsinglleft} \DeclareUnicodeCharacter{203A}{\guilsinglright} \DeclareUnicodeCharacter{20AC}{\euro} \DeclareUnicodeCharacter{2192}{\expansion} \DeclareUnicodeCharacter{21D2}{\result} \DeclareUnicodeCharacter{2212}{\minus} \DeclareUnicodeCharacter{2217}{\point} \DeclareUnicodeCharacter{2261}{\equiv} }% end of \utfeightchardefs % US-ASCII character definitions. \def\asciichardefs{% nothing need be done \relax } % Make non-ASCII characters printable again for compatibility with % existing Texinfo documents that may use them, even without declaring a % document encoding. % \setnonasciicharscatcode \other \message{formatting,} \newdimen\defaultparindent \defaultparindent = 15pt \chapheadingskip = 15pt plus 4pt minus 2pt \secheadingskip = 12pt plus 3pt minus 2pt \subsecheadingskip = 9pt plus 2pt minus 2pt % Prevent underfull vbox error messages. \vbadness = 10000 % Don't be very finicky about underfull hboxes, either. \hbadness = 6666 % Following George Bush, get rid of widows and orphans. \widowpenalty=10000 \clubpenalty=10000 % Use TeX 3.0's \emergencystretch to help line breaking, but if we're % using an old version of TeX, don't do anything. We want the amount of % stretch added to depend on the line length, hence the dependence on % \hsize. We call this whenever the paper size is set. % \def\setemergencystretch{% \ifx\emergencystretch\thisisundefined % Allow us to assign to \emergencystretch anyway. \def\emergencystretch{\dimen0}% \else \emergencystretch = .15\hsize \fi } % Parameters in order: 1) textheight; 2) textwidth; % 3) voffset; 4) hoffset; 5) binding offset; 6) topskip; % 7) physical page height; 8) physical page width. % % We also call \setleading{\textleading}, so the caller should define % \textleading. The caller should also set \parskip. % \def\internalpagesizes#1#2#3#4#5#6#7#8{% \voffset = #3\relax \topskip = #6\relax \splittopskip = \topskip % \vsize = #1\relax \advance\vsize by \topskip \outervsize = \vsize \advance\outervsize by 2\topandbottommargin \pageheight = \vsize % \hsize = #2\relax \outerhsize = \hsize \advance\outerhsize by 0.5in \pagewidth = \hsize % \normaloffset = #4\relax \bindingoffset = #5\relax % \ifpdf \pdfpageheight #7\relax \pdfpagewidth #8\relax % if we don't reset these, they will remain at "1 true in" of % whatever layout pdftex was dumped with. \pdfhorigin = 1 true in \pdfvorigin = 1 true in \fi % \setleading{\textleading} % \parindent = \defaultparindent \setemergencystretch } % @letterpaper (the default). \def\letterpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % If page is nothing but text, make it come out even. \internalpagesizes{607.2pt}{6in}% that's 46 lines {\voffset}{.25in}% {\bindingoffset}{36pt}% {11in}{8.5in}% }} % Use @smallbook to reset parameters for 7x9.25 trim size. \def\smallbook{{\globaldefs = 1 \parskip = 2pt plus 1pt \textleading = 12pt % \internalpagesizes{7.5in}{5in}% {-.2in}{0in}% {\bindingoffset}{16pt}% {9.25in}{7in}% % \lispnarrowing = 0.3in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .5cm }} % Use @smallerbook to reset parameters for 6x9 trim size. % (Just testing, parameters still in flux.) \def\smallerbook{{\globaldefs = 1 \parskip = 1.5pt plus 1pt \textleading = 12pt % \internalpagesizes{7.4in}{4.8in}% {-.2in}{-.4in}% {0pt}{14pt}% {9in}{6in}% % \lispnarrowing = 0.25in \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = .4cm }} % Use @afourpaper to print on European A4 paper. \def\afourpaper{{\globaldefs = 1 \parskip = 3pt plus 2pt minus 1pt \textleading = 13.2pt % % Double-side printing via postscript on Laserjet 4050 % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. % To change the settings for a different printer or situation, adjust % \normaloffset until the front-side and back-side texts align. Then % do the same for \bindingoffset. You can set these for testing in % your texinfo source file like this: % @tex % \global\normaloffset = -6mm % \global\bindingoffset = 10mm % @end tex \internalpagesizes{673.2pt}{160mm}% that's 51 lines {\voffset}{\hoffset}% {\bindingoffset}{44pt}% {297mm}{210mm}% % \tolerance = 700 \hfuzz = 1pt \contentsrightmargin = 0pt \defbodyindent = 5mm }} % Use @afivepaper to print on European A5 paper. % From romildo@urano.iceb.ufop.br, 2 July 2000. % He also recommends making @example and @lisp be small. \def\afivepaper{{\globaldefs = 1 \parskip = 2pt plus 1pt minus 0.1pt \textleading = 12.5pt % \internalpagesizes{160mm}{120mm}% {\voffset}{\hoffset}% {\bindingoffset}{8pt}% {210mm}{148mm}% % \lispnarrowing = 0.2in \tolerance = 800 \hfuzz = 1.2pt \contentsrightmargin = 0pt \defbodyindent = 2mm \tableindent = 12mm }} % A specific text layout, 24x15cm overall, intended for A4 paper. \def\afourlatex{{\globaldefs = 1 \afourpaper \internalpagesizes{237mm}{150mm}% {\voffset}{4.6mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% % % Must explicitly reset to 0 because we call \afourpaper. \globaldefs = 0 }} % Use @afourwide to print on A4 paper in landscape format. \def\afourwide{{\globaldefs = 1 \afourpaper \internalpagesizes{241mm}{165mm}% {\voffset}{-2.95mm}% {\bindingoffset}{7mm}% {297mm}{210mm}% \globaldefs = 0 }} % @pagesizes TEXTHEIGHT[,TEXTWIDTH] % Perhaps we should allow setting the margins, \topskip, \parskip, % and/or leading, also. Or perhaps we should compute them somehow. % \parseargdef\pagesizes{\pagesizesyyy #1,,\finish} \def\pagesizesyyy#1,#2,#3\finish{{% \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi \globaldefs = 1 % \parskip = 3pt plus 2pt minus 1pt \setleading{\textleading}% % \dimen0 = #1\relax \advance\dimen0 by \voffset % \dimen2 = \hsize \advance\dimen2 by \normaloffset % \internalpagesizes{#1}{\hsize}% {\voffset}{\normaloffset}% {\bindingoffset}{44pt}% {\dimen0}{\dimen2}% }} % Set default to letter. % \letterpaper \message{and turning on texinfo input format.} \def^^L{\par} % remove \outer, so ^L can appear in an @comment % DEL is a comment character, in case @c does not suffice. \catcode`\^^? = 14 % Define macros to output various characters with catcode for normal text. \catcode`\"=\other \def\normaldoublequote{"} \catcode`\$=\other \def\normaldollar{$}%$ font-lock fix \catcode`\+=\other \def\normalplus{+} \catcode`\<=\other \def\normalless{<} \catcode`\>=\other \def\normalgreater{>} \catcode`\^=\other \def\normalcaret{^} \catcode`\_=\other \def\normalunderscore{_} \catcode`\|=\other \def\normalverticalbar{|} \catcode`\~=\other \def\normaltilde{~} % This macro is used to make a character print one way in \tt % (where it can probably be output as-is), and another way in other fonts, % where something hairier probably needs to be done. % % #1 is what to print if we are indeed using \tt; #2 is what to print % otherwise. Since all the Computer Modern typewriter fonts have zero % interword stretch (and shrink), and it is reasonable to expect all % typewriter fonts to have this, we can check that font parameter. % \def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} % Same as above, but check for italic font. Actually this also catches % non-italic slanted fonts since it is impossible to distinguish them from % italic fonts. But since this is only used by $ and it uses \sl anyway % this is not a problem. \def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} % Turn off all special characters except @ % (and those which the user can use as if they were ordinary). % Most of these we simply print from the \tt font, but for some, we can % use math or other variants that look better in normal text. \catcode`\"=\active \def\activedoublequote{{\tt\char34}} \let"=\activedoublequote \catcode`\~=\active \def\activetilde{{\tt\char126}} \let~ = \activetilde \chardef\hat=`\^ \catcode`\^=\active \def\activehat{{\tt \hat}} \let^ = \activehat \catcode`\_=\active \def_{\ifusingtt\normalunderscore\_} \let\realunder=_ % Subroutine for the previous macro. \def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } \catcode`\|=\active \def|{{\tt\char124}} \chardef \less=`\< \catcode`\<=\active \def\activeless{{\tt \less}}\let< = \activeless \chardef \gtr=`\> \catcode`\>=\active \def\activegtr{{\tt \gtr}}\let> = \activegtr \catcode`\+=\active \def+{{\tt \char 43}} \catcode`\$=\active \def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix % used for headline/footline in the output routine, in case the page % breaks in the middle of an @tex block. \def\texinfochars{% \let< = \activeless \let> = \activegtr \let~ = \activetilde \let^ = \activehat \markupsetuplqdefault \markupsetuprqdefault % in principle, all other definitions in \tex have to be undone too. } % If a .fmt file is being used, characters that might appear in a file % name cannot be active until we have parsed the command line. % So turn them off again, and have \everyjob (or @setfilename) turn them on. % \otherifyactive is called near the end of this file. \def\otherifyactive{\catcode`+=\other \catcode`\_=\other} % Used sometimes to turn off (effectively) the active characters even after % parsing them. \def\turnoffactive{% \normalturnoffactive \otherbackslash } \catcode`\@=0 % \backslashcurfont outputs one backslash character in current font, % as in \char`\\. \global\chardef\backslashcurfont=`\\ \global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work % \realbackslash is an actual character `\' with catcode other, and % \doublebackslash is two of them (for the pdf outlines). {\catcode`\\=\other @gdef@realbackslash{\} @gdef@doublebackslash{\\}} % In texinfo, backslash is an active character; it prints the backslash % in fixed width font. \catcode`\\=\active % @ for escape char from now on. % The story here is that in math mode, the \char of \backslashcurfont % ends up printing the roman \ from the math symbol font (because \char % in math mode uses the \mathcode, and plain.tex sets % \mathcode`\\="026E). It seems better for @backslashchar{} to always % print a typewriter backslash, hence we use an explicit \mathchar, % which is the decimal equivalent of "715c (class 7, e.g., use \fam; % ignored family value; char position "5C). We can't use " for the % usual hex value because it has already been made active. @def@normalbackslash{{@tt @ifmmode @mathchar29020 @else @backslashcurfont @fi}} @let@backslashchar = @normalbackslash % @backslashchar{} is for user documents. % On startup, @fixbackslash assigns: % @let \ = @normalbackslash % \rawbackslash defines an active \ to do \backslashcurfont. % \otherbackslash defines an active \ to be a literal `\' character with % catcode other. We switch back and forth between these. @gdef@rawbackslash{@let\=@backslashcurfont} @gdef@otherbackslash{@let\=@realbackslash} % Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of % the literal character `\'. Also revert - to its normal character, in % case the active - from code has slipped in. % {@catcode`- = @active @gdef@normalturnoffactive{% @let-=@normaldash @let"=@normaldoublequote @let$=@normaldollar %$ font-lock fix @let+=@normalplus @let<=@normalless @let>=@normalgreater @let\=@normalbackslash @let^=@normalcaret @let_=@normalunderscore @let|=@normalverticalbar @let~=@normaltilde @markupsetuplqdefault @markupsetuprqdefault @unsepspaces } } % Make _ and + \other characters, temporarily. % This is canceled by @fixbackslash. @otherifyactive % If a .fmt file is being used, we don't want the `\input texinfo' to show up. % That is what \eatinput is for; after that, the `\' should revert to printing % a backslash. % @gdef@eatinput input texinfo{@fixbackslash} @global@let\ = @eatinput % On the other hand, perhaps the file did not have a `\input texinfo'. Then % the first `\' in the file would cause an error. This macro tries to fix % that, assuming it is called before the first `\' could plausibly occur. % Also turn back on active characters that might appear in the input % file name, in case not using a pre-dumped format. % @gdef@fixbackslash{% @ifx\@eatinput @let\ = @normalbackslash @fi @catcode`+=@active @catcode`@_=@active } % Say @foo, not \foo, in error messages. @escapechar = `@@ % These (along with & and #) are made active for url-breaking, so need % active definitions as the normal characters. @def@normaldot{.} @def@normalquest{?} @def@normalslash{/} % These look ok in all fonts, so just make them not special. % @hashchar{} gets its own user-level command, because of #line. @catcode`@& = @other @def@normalamp{&} @catcode`@# = @other @def@normalhash{#} @catcode`@% = @other @def@normalpercent{%} @let @hashchar = @normalhash @c Finally, make ` and ' active, so that txicodequoteundirected and @c txicodequotebacktick work right in, e.g., @w{@code{`foo'}}. If we @c don't make ` and ' active, @code will not get them as active chars. @c Do this last of all since we use ` in the previous @catcode assignments. @catcode`@'=@active @catcode`@`=@active @markupsetuplqdefault @markupsetuprqdefault @c Local variables: @c eval: (add-hook 'write-file-hooks 'time-stamp) @c page-delimiter: "^\\\\message" @c time-stamp-start: "def\\\\texinfoversion{" @c time-stamp-format: "%:y-%02m-%02d.%02H" @c time-stamp-end: "}" @c End: @c vim:sw=2: @ignore arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 @end ignore nco-4.5.4/autobld/ylwrap000077500000000000000000000143571264355130400152160ustar00rootroot00000000000000#! /bin/sh # ylwrap - wrapper for lex/yacc invocations. scriptversion=2011-08-25.18; # UTC # Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003, 2004, 2005, # 2007, 2009, 2010, 2011 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 # . case "$1" in '') echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 exit 1 ;; --basedir) basedir=$2 shift 2 ;; -h|--h*) cat <<\EOF Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... Wrapper for lex/yacc invocations, renaming files as desired. INPUT is the input file OUTPUT is one file PROG generates DESIRED is the file we actually want instead of OUTPUT PROGRAM is program to run ARGS are passed to PROG Any number of OUTPUT,DESIRED pairs may be used. Report bugs to . EOF exit $? ;; -v|--v*) echo "ylwrap $scriptversion" exit $? ;; esac # The input. input="$1" shift case "$input" in [\\/]* | ?:[\\/]*) # Absolute path; do nothing. ;; *) # Relative path. Make it absolute. input="`pwd`/$input" ;; esac pairlist= while test "$#" -ne 0; do if test "$1" = "--"; then shift break fi pairlist="$pairlist $1" shift done # The program to run. prog="$1" shift # Make any relative path in $prog absolute. case "$prog" in [\\/]* | ?:[\\/]*) ;; *[\\/]*) prog="`pwd`/$prog" ;; esac # FIXME: add hostname here for parallel makes that run commands on # other machines. But that might take us over the 14-char limit. dirname=ylwrap$$ do_exit="cd '`pwd`' && rm -rf $dirname > /dev/null 2>&1;"' (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 mkdir $dirname || exit 1 cd $dirname case $# in 0) "$prog" "$input" ;; *) "$prog" "$@" "$input" ;; esac ret=$? if test $ret -eq 0; then set X $pairlist shift first=yes # Since DOS filename conventions don't allow two dots, # the DOS version of Bison writes out y_tab.c instead of y.tab.c # and y_tab.h instead of y.tab.h. Test to see if this is the case. y_tab_nodot="no" if test -f y_tab.c || test -f y_tab.h; then y_tab_nodot="yes" fi # The directory holding the input. input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` # Quote $INPUT_DIR so we can use it in a regexp. # FIXME: really we should care about more than `.' and `\'. input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` while test "$#" -ne 0; do from="$1" # Handle y_tab.c and y_tab.h output by DOS if test $y_tab_nodot = "yes"; then if test $from = "y.tab.c"; then from="y_tab.c" else if test $from = "y.tab.h"; then from="y_tab.h" fi fi fi if test -f "$from"; then # If $2 is an absolute path name, then just use that, # otherwise prepend `../'. case "$2" in [\\/]* | ?:[\\/]*) target="$2";; *) target="../$2";; esac # We do not want to overwrite a header file if it hasn't # changed. This avoid useless recompilations. However the # parser itself (the first file) should always be updated, # because it is the destination of the .y.c rule in the # Makefile. Divert the output of all other files to a temporary # file so we can compare them to existing versions. if test $first = no; then realtarget="$target" target="tmp-`echo $target | sed s/.*[\\/]//g`" fi # Edit out `#line' or `#' directives. # # We don't want the resulting debug information to point at # an absolute srcdir; it is better for it to just mention the # .y file with no path. # # We want to use the real output file name, not yy.lex.c for # instance. # # We want the include guards to be adjusted too. FROM=`echo "$from" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` TARGET=`echo "$2" | sed \ -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ -e "s,$FROM,$TARGET," "$from" >"$target" || ret=$? # Check whether header files must be updated. if test $first = no; then if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then echo "$2" is unchanged rm -f "$target" else echo updating "$2" mv -f "$target" "$realtarget" fi fi else # A missing file is only an error for the first file. This # is a blatant hack to let us support using "yacc -d". If -d # is not specified, we don't want an error when the header # file is "missing". if test $first = yes; then ret=1 fi fi shift shift first=no done else ret=$? fi # Remove the directory. cd .. rm -rf $dirname 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: nco-4.5.4/autogen.sh000077500000000000000000000063471264355130400143210ustar00rootroot00000000000000#! /bin/sh # Purpose: Configure NCO for CVS build # If you compile from a released tar-ball, do not run this script # Just run ./configure directly # Copyright (C) 2003--2009 Charlie Zender # License: GNU General Public License (GPL) Version 3 # See http://www.gnu.org/copyleft/gpl.html for full license text # Contributed to NCO by Magnus Hagdorn # Originally from the GIMP project's autogen.sh ACLOCAL=${ACLOCAL-aclocal} AUTOCONF=${AUTOCONF-autoconf} AUTOHEADER=${AUTOHEADER-autoheader} AUTOMAKE=${AUTOMAKE-automake} LIBTOOLIZE=${LIBTOOLIZE-libtoolize} AUTOCONF_REQUIRED_VERSION=2.54 AUTOMAKE_REQUIRED_VERSION=1.9.6 check_version () { VERSION_A=$1 VERSION_B=$2 save_ifs="$IFS" IFS=. set dummy $VERSION_A 0 0 0 MAJOR_A=$2 MINOR_A=$3 MICRO_A=$4 set dummy $VERSION_B 0 0 0 MAJOR_B=$2 MINOR_B=$3 MICRO_B=$4 IFS="$save_ifs" if expr "$MAJOR_A" = "$MAJOR_B" > /dev/null; then if expr "$MINOR_A" \> "$MINOR_B" > /dev/null; then echo "yes (version $VERSION_A)" elif expr "$MINOR_A" = "$MINOR_B" > /dev/null; then if expr "$MICRO_A" \>= "$MICRO_B" > /dev/null; then echo "yes (version $VERSION_A)" else echo "Too old (version $VERSION_A)" DIE=1 fi else echo "Too old (version $VERSION_A)" DIE=1 fi elif expr "$MAJOR_A" \> "$MAJOR_B" > /dev/null; then echo "Major version might be too new ($VERSION_A)" else echo "Too old (version $VERSION_A)" DIE=1 fi } echo echo Checking if required version of automake is installed echo DIE=0 echo -n "checking for autoconf >= $AUTOCONF_REQUIRED_VERSION ... " if ($AUTOCONF --version) < /dev/null > /dev/null 2>&1; then VER=`$AUTOCONF --version | head -n 1 \ | grep -iw autoconf | sed "s/.* \([0-9.]*\)[-a-z0-9]*$/\1/"` check_version $VER $AUTOCONF_REQUIRED_VERSION else echo echo " You must have autoconf installed to compile $PROJECT." echo " Download the appropriate package for your distribution," echo " or get the source tarball at ftp://ftp.gnu.org/pub/gnu/autoconf/" echo DIE=1; fi echo -n "checking for automake >= $AUTOMAKE_REQUIRED_VERSION ... " if ($AUTOMAKE --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=$AUTOMAKE ACLOCAL=$ACLOCAL elif (automake-1.10 --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake-1.10 ACLOCAL=aclocal-1.10 elif (automake-1.9 --version) < /dev/null > /dev/null 2>&1; then AUTOMAKE=automake-1.9 ACLOCAL=aclocal-1.9 else echo echo " You must have automake $AUTOMAKE_REQUIRED_VERSION or newer installed to compile $PROJECT." echo " Download the appropriate package for your distribution," echo " or get the source tarball at ftp://ftp.gnu.org/pub/gnu/automake/" echo DIE=1 fi if test x$AUTOMAKE != x; then VER=`$AUTOMAKE --version \ | grep automake | sed "s/.* \([0-9.]*\)[-a-z0-9]*$/\1/"` check_version $VER $AUTOMAKE_REQUIRED_VERSION fi if test "$DIE" -eq 1; then echo echo "Please install/upgrade the missing tools and call me again." echo exit 1 fi rm -rf autom4te.cache $ACLOCAL -I m4\ && $AUTOHEADER \ && $AUTOMAKE --foreign --add-missing \ && $AUTOCONF nco-4.5.4/bld/000077500000000000000000000000001264355130400130475ustar00rootroot00000000000000nco-4.5.4/bld/Makefile000066400000000000000000002404741264355130400145220ustar00rootroot00000000000000# $Header$ -*-makefile-*- # Purpose: GNU Makefile for NCO module nco # Requires GNU Make---AT&T Make chokes on GNU syntax # Copyright (C) 1994--2016 Charlie Zender # License: GNU General Public License (GPL) Version 3 # See http://www.gnu.org/copyleft/gpl.html for full license text # Quickie test copies: # scp ~/nco/bld/Makefile tephra.ess.uci.edu:nco/bld # scp ~/nco/bld/Makefile dust.ess.uci.edu:nco/bld # scp ~/nco/bld/Makefile gplogin2.ps.uci.edu:nco/bld # Machine build parameters # Source Method Packages Compiler # aerosol.ess.uci.edu: NCO Configure All else LLVM # firn.ess.uci.edu : NCO Configure All else LLVM # givre.ess.uci.edu : NCO + netCDF Makefile All else LLVM # roulee.ess.uci.edu : NCO + netCDF Makefile All else GCC # neige.ess.uci.edu : NCO Makefile All else GCC # glace.ess.uci.edu : NCO Configure All else GCC # grele.ess.uci.edu : NCO Makefile All else GCC # yellowstone.ucar.e : NCO Makefile All else Intel # rhea.ccs.ornl.gov : NCO Makefile All else GCC # cooley.alcf.anl.g : NCO Configure All else GCC # edison.nersc.gov : NCO Configure All else Intel # travis CI : NCO Configure All else gcc,clang,g++ # Usage (testing): # make tst # Vanilla regression test # make FL_FMT=netcdf4 tst # netCDF4 regression test # make MPI_PRC=3 tst # MPI regression test # make MPI_PRC=3 bm # MPI benchmarks # make THR_NBR=2 tst # OpenMP regression test # make THR_NBR=2 bm # OpenMP benchmarks # make MPI=Y # MPI features (HDF5 and PnetCDF I/O) # make NETCDF4=Y # netCDF4 features # make PNETCDF=Y # PnetCDF features # Usage (Compilation): # cd ~/nco/qt;qmake;make;cd - # Qt # cd ~/nco/bld;make;cd - # Default build # cd ~/nco/bld;make USR_TKN='-DNC_HAVE_RENAME_GRP';cd - # New API # cd ~/nco/bld;make UDUNITS_INC='/usr/include/udunits2';cd - # Fedora build # cd ~/nco/bld;make cln bin_cln;cd - # Clean all dependencies for fresh build # cd ~/nco/bld;make dir all; cd - # Create target directories then build # cd ~/nco/bld;make dbg;cd - # Print make diagnostics # cd ~/nco/bld;make DPKG=Y;cd - # Debian hardening # cd ~/nco/bld;make ESMF=Y;cd - # ESMF regridding # cd ~/nco/bld;make GSL=Y;cd - # GSL support # cd ~/nco/bld;make I18N=Y;cd - # Internationalization # cd ~/nco/bld;make lib_cln;cd - # Clean libraries # cd ~/nco/bld;make MPI=Y;cd - # MPI support # cd ~/nco/bld;make MPI_FAKE=Y;cd - # Spoof MPI support # cd ~/nco/bld;make OMP=Y;cd - # OpenMP support # cd ~/nco/bld;make OPTS=D;cd - # "Debugging": Enough symbols for debugging (default) # cd ~/nco/bld;make OPTS=O;cd - # "Optimize": For production (includes symbols) # cd ~/nco/bld;make OPTS=R;cd - # "Regular": No optimization or debugging # cd ~/nco/bld;make OPTS=X;cd - # "eXtreme": All debugging switches available # cd ~/nco/bld;make sys;cd - # Install in /usr/local (must sudo) # cd ~/nco/bld;make SZ=Y;cd - # Szip support # cd ~/nco/bld;make UDUNITS=Y;cd - # UDUnits support # cd ~/nco/bld;make --jobs=4;cd - # Parallel make # Normal (Linux) developer systems: # cd ~/nco/bld;make cln all ncap2;cd - # New default for most machines # cd ~/nco/bld;make OMP=Y CUDA=Y OPTS=D NETCDF4=Y UDUNITS=Y allinone;cd - # givre # cd ~/nco/bld;make OMP=Y OPTS=D NETCDF4=Y UDUNITS=Y allinone;cd - # givre, neige # cd ~/nco/bld;make OMP=Y OPTS=D NETCDF4=N UDUNITS=Y allinone;cd - # glace, virga # mpi-selector --set openmpi_gcc-1.3.3 # Then use /sopt/netcdf/netcdf3-gcc-serial serial libraries # mpi-selector --set mpich_pgi_1.2.7p1 # After compiling # cd ~/nco/bld;ANTLR_ROOT=/sopt/gfortran_g++ NETCDF_ROOT=/sopt/gfortran_g++ SZ_LIB=/sopt/lib UDUNITS_INC=/sopt/include UDUNITS_LIB=/sopt/lib make OMP=Y OPTS=D NETCDF4=Y SZ=Y UDUNITS=N allinone;cd - # greenplanet gcc # cd ~/nco/bld;ANTLR=/home/pvicente/install/antlr-2.7.7/bin/antlr ANTLR_ROOT=/home/pvicente/install/antlr-2.7.7 NETCDF_ROOT=/home/pvicente/install/netcdf-4.3.0 UDUNITS_INC=/home/pvicente/install/udunits-2.1.24/include UDUNITS_LIB=/home/pvicente/install/udunits-2.1.24/lib make OPTS=D allinone;cd - # greenplanet gcc pedro # cd ~/nco/bld;ANTLR=/sopt/ifort_icpc/bin/antlr ANTLR_ROOT=/sopt/ifort_icpc SZ_LIB=/sopt/lib UDUNITS_INC=/sopt/include UDUNITS_LIB=/sopt/lib make OMP=Y OPTS=D NETCDF4=Y SZ=Y UDUNITS=N allinone;cd - # greenplanet intel # cd ~/nco/bld;ANTLR=/sopt/pgf90_pgcc/bin/antlr ANTLR_ROOT=/sopt/pgf90_pgcc SZ_LIB=/sopt/lib UDUNITS_INC=/sopt/include UDUNITS_LIB=/sopt/lib make OMP=Y OPTS=D NETCDF4=N SZ=Y UDUNITS=N allinone;cd - # greenplanet pgi # cd ~/nco/bld;make OMP=Y OPTS=D NETCDF4=N UDUNITS=Y allinone;cd - # pbs # cd ~/nco/bld;make OMP=Y OPTS=D NETCDF4=N UDUNITS=Y allinone;cd - # grele # cd ~/nco/bld;make NETCDF4=N all ncap2;cd - # tephra # cd ~/nco/bld;make OMP=Y OPTS=D NETCDF4=N UDUNITS=N allinone;cd - # silt, clay # cd ~/nco/bld;NETCDF_INC='/usr/include/netcdf-3' NETCDF_LIB='/usr/lib64' make GSL=N OMP=N OPTS=D NETCDF4=N UDUNITS=N allinone;cd - # snow # cd ~/nco/bld;make OMP=N OPTS=D NETCDF4=N UDUNITS=N USR_TKN='-DNEED_NC_INQ_FORMAT' allinone;cd - # snow w/OPeNDAP # cd ~/nco/bld;make OPTS=D USR_TKN='-DNEED_NC_INQ_FORMAT' allinone;cd - # 64-bit ABI on UCI MPC: # cd ~/nco/bld;env ANTLR='/software/antlr/bin/antlr' ANTLR_ROOT='/software/antlr' UDUNITS_INC='/software/udunits/include' UDUNITS_LIB='/software/udunits/lib' make --jobs=1 ABI=64 allinone;cd - # 64-bit ABI on UCI IPCC: # cd ~/nco/bld;env ANTLR='/usr/local/pgi/bin/antlr' ANTLR_ROOT='/usr/local/pgi' make --jobs=1 ABI=64 allinone;cd - # 64-bit ABI netCDF3 on NCAR AIX systems (bluefire): # cd ~/nco/bld;ANTLR='/contrib/antlr-2.7.7/bin/antlr' ANTLR_ROOT='/contrib/antlr-2.7.7' GSL_INC='/contrib/gsl-1.12/include' GSL_LIB='/contrib/gsl-1.12/lib' NETCDF_LIB='/usr/local/lib64/r4i4' UDUNITS_INC='/contrib/udunits-1.12.9/include' UDUNITS_LIB='/contrib/udunits-1.12.9/lib' make --jobs=1 OPTS=D NETCDF4=N UDUNITS=N allinone ABI=64;cd - # 64-bit ABI netCDF4 on NCAR AIX systems (bluefire): # cd ~/nco/bld;ANTLR='/contrib/antlr-2.7.7/bin/antlr' ANTLR_ROOT='/contrib/antlr-2.7.7' CURL_LIB='/contrib/curl/7.21.2/lib' GSL_INC='/contrib/gsl-1.12/include' GSL_LIB='/contrib/gsl-1.12/lib' HDF5_ROOT='/contrib/hdf5-1.8.7_seq' LDFLAGS='-lnetcdf -lhdf5_hl -lhdf5 -lz' NETCDF_ROOT='/contrib/netcdf/4.1.3_seq' SZ_LIB='/contrib/szip/lib' UDUNITS_LIB='/contrib/zlib/lib' make --jobs=1 OPTS=D SZ=Y allinone ABI=64;cd - # 64-bit ABI netCDF4 on NCAR AIX systems (bluefire): # cd ~/bin/AIX;/usr/local/bin/tar cvzf ~/nco-4.4.6.aix53.tar.gz nc*;scp ~/nco-4.4.6.aix53.tar.gz zender,nco@web.sf.net:/home/project-web/nco/htdocs/src # netCDF4 on NCAR Linux cluster systems (mirage): # cd ~/nco/bld;make OPTS=D allinone;cd - # netCDF4 on ORNL Linux cluster systems (titan, rhea.ccs.ornl.gov): # module avail # . ~/.bashrc # module add intel gsl # export LD_LIBRARY_PATH='/sw/redhat6/netcdf/4.1.3/rhel6.4_intel13.1.3/lib:/sw/redhat6/szip/2.1/rhel6.6_gnu4.8.2/lib':${LD_LIBRARY_PATH} # export NETCDF_ROOT='/sw/redhat6/netcdf/4.1.3/rhel6.4_intel13.1.3' # export PATH='/sw/redhat6/netcdf/4.1.3/rhel6.4_intel13.1.3/bin':${PATH} # cd ~/nco/bld;make ANTLR_ROOT=${HOME} NETCDF_ROOT='/sw/redhat6/netcdf/4.1.3/rhel6.4_intel13.1.3' SZ=Y SZ_LIB='/sw/redhat6/szip/2.1/rhel6.6_gnu4.8.2/lib' UDUNITS_INC='/sw/redhat6/udunits/2.1.24/rhel6.4_intel13.1.3/include' UDUNITS_LIB='/sw/redhat6/udunits/2.1.24/rhel6.4_intel13.1.3/lib' OPTS=D allinone;cd - # ncap2: # netCDF4 on NCAR Linux cluster systems (yellowstone): # /ncar/opt/hpss/hsi # Starts HPSS session # export PATH=${PATH}\:/ncar/opt/hpss # GNU (works): # module swap intel gnu;module add gsl;module add netcdf/4.3.0; # export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}\:/glade/apps/opt/udunits/2.1.24/gnu/default/lib # cd ~/nco/bld;make NETCDF_ROOT='/glade/apps/opt/netcdf/4.3.0/gnu/default' UDUNITS_INC='/glade/apps/opt/udunits/2.1.24/gnu/default/include' UDUNITS_LIB='/glade/apps/opt/udunits/2.1.24/gnu/default/lib' OPTS=D allinone;cd - # Intel (works as of 20140129): # module add intel;module add gsl;module add netcdf/4.3.0; # https://www2.cisl.ucar.edu/sites/default/files/Yellowstone_Started_Nov30-2.pdf # module add pnetcdf/1.4.1 # export PATH=${PATH}:/glade/apps/opt/netcdf/4.3.0/intel/12.1.5/bin # needed for ncgen # export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/glade/apps/opt/netcdf/4.3.0/intel/12.1.5/lib # needed to run NCO # cd ~/nco/bld;make NETCDF_ROOT='/glade/apps/opt/netcdf/4.3.0/intel/default' UDUNITS_INC='/glade/apps/opt/udunits/2.1.24/intel/12.1.4/include' UDUNITS_LIB='/glade/apps/opt/udunits/2.1.24/intel/12.1.4/lib' OPTS=D allinone;cd - # Cygwin on Windows Vista systems: # cd ~/nco/bld;ANTLR='antlr' make --jobs=1 GSL=Y OPTS=D NETCDF4=Y UDUNITS=Y allinone;cd - # cd ~/bin/WIN32;tar cvzf ~/nco-4.5.2.win32.cygwin.tar.gz nc* ; scp ~/nco-4.5.2.win32.cygwin.tar.gz zender,nco@web.sf.net:/home/project-web/nco/htdocs/src # Data files to dust # cd ~/nco/data;scp cmip5.nc obs.nc mdl_1.nc mdl_2.nc in_grp*.nc in.nc in_4c.nc dust.ess.uci.edu:/var/www/html/nco # Top-level tokens defining directory structure # These tokens may be over-ridden by environment variables or when invoking make, e.g., make OMP=Y MY_BLD_DIR := ../bld ifndef PVM_ARCH PVM_ARCH := $(shell ${MY_BLD_DIR}/pvmgetarch) endif ifndef MY_BIN_DIR MY_BIN_DIR := ../bin endif ifndef MY_LIB_DIR MY_LIB_DIR := ../lib endif ifndef MY_MAN_DIR MY_MAN_DIR := ../man endif ifndef MY_OBJ_DIR MY_OBJ_DIR := ../obj endif MY_BM_DIR := ../bm MY_DAT_DIR := ../data MY_DBN_DIR := ../debian MY_DOC_DIR := ../doc MY_DPN_DIR := ${MY_OBJ_DIR} MY_QT_DIR := ../qt MY_SRC_DIR := ../src/nco MY_INC_DIR := ${MY_SRC_DIR} NCO_CXX_SRC_DIR := ${MY_SRC_DIR}/../nco_c++ NCOXX_SRC_DIR := ${MY_SRC_DIR}/../nco++ # Primary tokens which determine build options # Specify non-default when invoking make, e.g. make OMP=Y ifndef ABI # 32- vs. 64-bit ABI: 32=32-bit mode, 64=64-bit mode (default) if available ABI := 64 endif # endif ABI ifndef CCACHE CCACHE := N endif # CCACHE ifndef CNK # Use newer netCDF4.1 chunking API CNK := Y endif # endif CNK ifndef CUDA CUDA := N endif # CUDA ifndef DAP DAP := Y endif # DAP ifndef DBG # Debugging token N=No (default) Y=Yes DBG := N endif # endif DBG ifndef DPKG # Debian hardening tokens DPKG := N endif # endif DPKG ifdef FL_FMT # Pass this netCDF4 argument to nco_bm.pl FL_FMT_SNG := "--fl_fmt=${FL_FMT}" else # endif FL_FMT FL_FMT_SNG := endif # endif FL_FMT ifndef GCC_RCH_ARG GCC_RCH_ARG := endif # endif GCC_RCH_ARG ifndef GSL # Use GSL functionality GSL := Y endif # endif GSL ifndef ICC_RCH_ARG ICC_RCH_ARG := endif # endif ICC_RCH_ARG ifndef I18N I18N := N endif ifndef NCO_YY_PFX NCO_YY_PFX := nco_yy endif ifndef MK_DPN MK_DPN = ${CPP} -M # NB: Recursive expansion required MK_DPN_CXX = ${CXX} -M # NB: Recursive expansion required endif # endif MK_DPN ifndef MPI # MPI MPI := N endif # endif MPI ifndef MPI_FAKE # MPI MPI_FAKE := N endif # endif MPI_FAKE ifndef NCO_VRS # Used for RPM building NCO_VRS := $(shell cat ${MY_DOC_DIR}/VERSION) endif ifndef NETCDF4 # netCDF4 support NETCDF4 := Y endif # endif NETCDF4 ifndef NETCDF_ROOT NETCDF_ROOT := /usr/local endif ifndef NETCDF4_ROOT NETCDF4_ROOT := ${NETCDF_ROOT} endif ifndef NETCDF_INC ifdef INC_NCAR NETCDF_INC := ${INC_NCAR} # NCAR module path else # endelse INC_NCAR NETCDF_INC := ${NETCDF_ROOT}/include # Directory containing netcdf.h endif # endif INC_NCAR endif # endif NETCDF_INC ifndef NETCDF_LIB ifdef LIB_NCAR NETCDF_LIB := ${LIB_NCAR} # NCAR module path else # endelse LIB_NCAR NETCDF_LIB := ${NETCDF_ROOT}/lib # Directory containing libnetcdf.a endif # endif LIB_NCAR endif # endif NETCDF_LIB ifndef ${OMP} # OpenMP OMP := N endif # endif OMP ifndef OPTS OPTS := D endif ifndef PGI_RCH_ARG PGI_RCH_ARG := endif # endif PGI_RCH_ARG ifndef PNETCDF # pnetCDF support PNETCDF := N endif # endif PNETCDF ifndef PSC_RCH_ARG PSC_RCH_ARG := endif # endif PSC_RCH_ARG ifndef RPM RPM := N endif # endif RPM ifndef STC # Created statically linked executable STC := N endif ifndef SZ # Link to Szip library SZ := N endif ifndef UDUNITS # Use UDUnits functionality UDUNITS := Y endif ifndef UNAMES UNAMES := $(shell uname -s) endif ifndef USR_TKN USR_TKN := endif # endif USR_TKN ifndef VRS_SNG # VRS_SNG := $(shell date +%Y%m%d) # 20150622 VRS_SNG := $(shell git describe --abbrev=7 --dirty --always --tags) endif # endif VRS_SNG ifndef ZNETCDF # znetcdf support ZNETCDF := N endif # endif ZNETCDF # Derived-tokens based on primary tokens # These tokens should not be altered by hand # NB: CPP_TKN is recursively expanded variable, define only when components are ready CPP_TKN = ${USR_TKN} -D${PVM_ARCH} -DNO_NETCDF_2 -DVERSION='${VRS_SNG}' -DHOSTNAME='${HOST}' -DUSER='${USER}' -DNCO_ABORT_ON_ERROR ifndef LFLAGS # Flags for Flex (Lex) LFLAGS := -P${NCO_YY_PFX} endif ifndef YFLAGS # Flags for Bison (Yacc) YFLAGS := -d --name-prefix=${NCO_YY_PFX} endif # Internationalize NCO with i18n features ifeq (${I18N},Y) MY_SHR_DIR := ${HOME}/share MY_ES_DIR := ${MY_SHR_DIR}/locale/es/LC_MESSAGES MY_FR_DIR := ${MY_SHR_DIR}/locale/fr/LC_MESSAGES endif # Message Passing Interface (MPI) ifeq (${MPI_FAKE},Y) # MPI_FAKE instructs make to compile mpnc*.c operators without defining ENABLE_MPI # Resulting executables use UP or SMP code not MPI code # This tests compile, link, execution of MPI mpnc*.c code without using any MPI calls MPI := Y endif # !MPI_FAKE ifdef MPI_PRC # MPI_PRC tells test scripts how many MPI processes to spawn # Pass this MPI argument to nco_bm.pl MPI_PRC_SNG := "--mpi_prc=${MPI_PRC}" # MPI_PRC implies MPI MPI := Y else # !MPI_PRC MPI_PRC_SNG := endif # !MPI_PRC # PnetCDF implies MPI ifeq (${PNETCDF},Y) MPI := Y endif # !PNETCDF LINUX_OR_MACOSX := N ifneq (${null},$(findstring LINUX,${PVM_ARCH})) LINUX_OR_MACOSX := Y endif ifneq (${null},$(findstring MACOSX,${PVM_ARCH})) LINUX_OR_MACOSX := Y endif # Decide among the plethora of compilers. Use names like LINUX_CC for historical reasons. ifeq (${LINUX_OR_MACOSX},Y) ifndef LINUX_CXX # C++ compiler for Linux LINUX_CXX := g++ #LINUX_CXX := clang #LINUX_CXX := como #LINUX_CXX := icpc #LINUX_CXX := insure #LINUX_CXX := pathCC #LINUX_CXX := pgCC endif # endif LINUX_CXX ifndef LINUX_CC # C compiler for Linux LINUX_CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE #LINUX_CC := clang #LINUX_CC := como --c99 #LINUX_CC := icc -std=c99 -D_DEFAULT_SOURCE #LINUX_CC := insure #LINUX_CC := nvcc #LINUX_CC := pathcc -std=c99 #LINUX_CC := pgcc -c9x endif # endif LINUX_CC ifndef LINUX_FC # Fortran compiler for Linux #LINUX_FC := g95 LINUX_FC := gfortran #LINUX_FC := ifort #LINUX_FC := lf95 #LINUX_FC := pathf95 #LINUX_FC := pgf90 endif # endif LINUX_CC endif # endif LINUX_OR_MACOSX # OpenMP ifeq (${OMP},Y) ifdef THR_NBR # Pass this OpenMP argument to nco_bm.pl THR_NBR_SNG := "--thr_nbr=${THR_NBR}" else # endif THR_NBR THR_NBR_SNG := endif # endif THR_NBR endif # endif OMP ifeq (${RPM},Y) # rpm command, and thus RPM variables only guaranteed in RedHat Linux # Use recursive expansion so rpm command is not executed on non-RPM systems MDL_RPM_NST_NM = $(shell rpm -qa | grep nco-) # Name of installed package # MDL_RPM_PRV_NM = $(shell rpm -qp foo) # Name of package provided by specified RPM endif # endif RPM ifeq (${PVM_ARCH},WIN32) BNR_SFX := .exe else BNR_SFX := ${null} endif ifeq (${ESMF},Y) # Build ESMF-enabled NCO # Place ESMF block after DAP blocks for both to work together ifdef ESMF_INC ESMF_INC_FLG := -I${ESMF_INC} else ifdef ESMF_ROOT ifeq (${PVM_ARCH},MACOSX) ESMF_INC_FLG := -I${ESMF_ROOT}/include/esmf else ESMF_INC_FLG := -I${ESMF_ROOT}/include endif # endif MACOSX else ESMF_INC_FLG := -I/usr/local/include endif # endif ESMF_ROOT endif # endif ESMF_INC # 20150319: For some reaseon, ESMC.h #includes ESMC_VM.h which #includes mpi.h ifeq (${PVM_ARCH},MACOSX) # Use stub header for uniprocessor MPI emulation provided by ESMF ESMF_INC_FLG += -I/Users/zender/data/esmf/src/Infrastructure/stubs/mpiuni ESMF_LIB_RT := ${null} ESMF_LIB_LAPACK := -llapack ESMF_LIB_XERCES := -lxerces-c else # endif MACOSX # Use real MPI ESMF_INC_FLG += -I/usr/include/openmpi-x86_64 ESMF_LIB_RT := -lrt ESMF_LIB_LAPACK := ${null} ESMF_LIB_XERCES := ${null} endif # endif MACOSX ifdef ESMF_LIB ESMF_LIB_FLG := -L${ESMF_LIB} -lesmf ${ESMF_LIB_LAPACK} ${ESMF_LIB_RT} ${ESMF_LIB_XERCES} -lgfortran -ldl -lnetcdff -lnetcdf_c++ else ifdef ESMF_ROOT ESMF_LIB_FLG := -L${ESMF_ROOT}/lib -lesmf ${ESMF_LIB_LAPACK} ${ESMF_LIB_RT} ${ESMF_LIB_XERCES} -lgfortran -ldl -lnetcdff -lnetcdf_c++ else ESMF_LIB_FLG := -L/usr/local/lib -lesmf ${ESMF_LIB_LAPACK} ${ESMF_LIB_RT} ${ESMF_LIB_XERCES} -lgfortran -ldl -lnetcdff -lnetcdf_c++ endif # endif ESMF_ROOT endif # endif ESMF_LIB endif # end if ESMF ifeq (${GSL},Y) # Build GSL-enabled NCO # Place GSL block after DAP blocks for both to work together ifdef GSL_INC GSL_INC_FLG := -I${GSL_INC} else GSL_INC_FLG := $(shell gsl-config --cflags) endif # endif GSL_INC ifdef GSL_LIB GSL_LIB_FLG := -L${GSL_LIB} -lgsl else GSL_LIB_FLG := $(shell gsl-config --libs) endif # endif GSL_LIB endif # end if GSL ifeq (${SZ},Y) # 20150515: -lsz needed (at least by icc) on rhea ifdef SZ_LIB SZ_LIB_FLG := -L${SZ_LIB} -lsz else SZ_LIB_FLG := -lsz endif # end if SZ_LIB endif # end if SZ ifeq (${UDUNITS},Y) # 20130607: -lexpat needed on .deb systems, not on RPM systems ifdef UDUNITS_INC UDUNITS_INC_FLG := -I${UDUNITS_INC} else UDUNITS_INC_FLG := -I/usr/include/udunits2 endif # endif UDUNITS_INC ifdef UDUNITS_LIB UDUNITS_LIB_FLG := -L${UDUNITS_LIB} -ludunits2 else UDUNITS_LIB_FLG := -ludunits2 endif # end if UDUNITS_LIB endif # end if UDUNITS # At this point we change NETCDF_INC from a directory to a flag NC_CFLAGS := $(shell ${NETCDF_ROOT}/bin/nc-config --cflags) NC_LDFLAGS := $(shell ${NETCDF_ROOT}/bin/nc-config --libs) NCO_LDFLAGS := -L${MY_LIB_DIR} -lnco ifeq (${MPI},Y) # Enable MPI functionality NC_CFLAGS := $(shell /usr/local/parallel/bin/nc-config --cflags) NC_LDFLAGS := $(shell /usr/local/parallel/bin/nc-config --libs) MPI_CFLAGS := -I/usr/include/openmpi-x86_64 MPI_LDFLAGS := -L/usr/lib64/openmpi/lib -lmpi endif # endif MPI ifdef LIB_NCAR NC_LDFLAGS := ${LIB_NCAR} ${NC_LDFLAGS} endif OTHER_CFLAGS := ${ESMF_INC_FLG} ${NC_CFLAGS} ${MPI_CFLAGS} ${GSL_INC_FLG} ${UDUNITS_INC_FLG} OTHER_LDFLAGS := ${NCO_LDFLAGS} ${ESMF_LIB_FLG} ${NC_LDFLAGS} ${MPI_LDFLAGS} ${GSL_LIB_FLG} ${SZ_LIB_FLG} ${UDUNITS_LIB_FLG} # NB: Do NOT add comment lines, e.g., # This is a comma, to character definitions null := space := ${null} ${null} comma := , newline := \n # '/' and '+' appear in filenames ('/' is directory separator) # Operating on these with Perl is problematic since they are special Rx characters # We replace `/' and '+' by non-special Rx's, call perl, then demangle # Unique character(s) to substitute for '/' and '+' before passing to perl Rx slash_rx := cszzsc plus_rx := xdikmj # Unique character(s) to replace by ${slash_rx} before passing to perl regex slash := / plus := + MY_OBJ_DIR_RX := $(subst ${slash},${slash_rx},${MY_OBJ_DIR}) MY_DPN_DIR_RX := $(subst ${slash},${slash_rx},${MY_DPN_DIR}) # Directories to search for source files MDL_PTH := ./ ${MY_SRC_DIR} # Find all C, C++, CUDA files in given directory FIND_FNC = $(wildcard ${dir}/*.cc ${dir}/*.c ${dir}/*.cu) # Assemble source files from all directories SRC_LST = $(foreach dir, ${MDL_PTH},$(FIND_FNC)) # Source file names with directories removed MDL_SRC := $(notdir $(SRC_LST)) # Dependency list for executable MDL_OBJ := $(addprefix ${MY_OBJ_DIR}/,$(addsuffix .o, $(basename ${MDL_SRC}))) # Dependency (make) file for each object file MDL_DPN := $(addprefix ${MY_DPN_DIR}/,$(addsuffix .d, $(basename ${MDL_SRC}))) # VPATH helps make find dependencies (which are not pathname qualified) in *.d file VPATH := $(subst ${space},:,${MDL_PTH}) # Prepend -I to use for compiler argument CPP_PTH := $(foreach dir,${MDL_PTH},-I${dir}) # Variables having to do with binary executables created by module MDL_BIN_TRG := ncap ncatted ncbo ncecat ncflint ncks ncpdq ncra ncrename ncwa # NCO binary targets MDL_BIN_SYM_LNK := ncdiff ncea nces ncrcat # Symbolic links MDL_BIN_SPT := ncremap # Scripts ifeq (${MPI},Y) # MDL_MPI_TRG := mpncbo mpncecat mpncflint mpncpdq mpncra mpncwa # MPI binary targets MDL_MPI_TRG := # MPI binary targets MDL_MPI_TRG_SMP := ncbo ncecat ncflint ncpdq ncra ncwa # MPI binary targets # MDL_MPI_SYM_LNK := mpncdiff mpncea mpnces mpncrcat # MPI Symbolic links MDL_MPI_SYM_LNK := # MPI Symbolic links MDL_MPI_STB := ${MDL_MPI_TRG} ${MDL_MPI_SYM_LNK} # All MPI files in MY_BIN_DIR MDL_MPI_BIN := $(addprefix ${MY_BIN_DIR}/,${MDL_MPI_TRG}) # mpi_cln removes these files MDL_MPI_OBJ := $(addsuffix .o,$(addprefix ${MY_OBJ_DIR}/,${MDL_MPI_TRG})) # mpi_cln removes these files MDL_BIN_TRG += ${MDL_MPI_TRG} # NCO binary targets MDL_BIN_SYM_LNK += ${MDL_MPI_SYM_LNK} # Symbolic links endif # endif MPI MDL_BIN_STB := ${MDL_BIN_TRG} ${MDL_BIN_SPT} ${MDL_BIN_SYM_LNK} # All NCO files in MY_BIN_DIR MDL_BIN := $(addprefix ${MY_BIN_DIR}/,${MDL_BIN_STB}) # distclean removes these files # Variables having to do with header files created by module # List header targets alphabetically by "category": MDL_INC_TRG := # Raw (no functions) MDL_INC_TRG += libnco.h # libnco MDL_INC_SYM_LNK := # Symbolic links MDL_INC_STB = ${MDL_INC_TRG} ${MDL_INC_SYM_LNK} # All header files in ${MY_INC_DIR} MDL_INC = $(addprefix ${MY_INC_DIR}/,${MDL_INC_STB}) # dst_cln removes these files # Variables having to do with NCO data MDL_DAT_STB := 85 86 87 88 89 h0001 h0002 h0003 # Symbolic links to in.nc MDL_DAT_STB := $(addsuffix .nc,${MDL_DAT_STB}) # `make data' creates these files MDL_DAT := $(addprefix ${MY_DAT_DIR}/,${MDL_DAT_STB}) # `make distclean' removes these files # Variables having to do with NCO documentation MDL_DOC_SRC := $(addprefix ../,acinclude.m4 configure.ac configure.eg Makefile.am) $(addprefix ${MY_DOC_DIR}/,nco.texi ANNOUNCE MANIFEST NEWS README TODO VERSION beta.txt debian.txt dods.sh index.shtml xmp_cesm.html man_end.txt man_srt.txt ncap.txt nco_news.shtml nco_src_frg.txt opendap.sh) $(addprefix ${MY_DBN_DIR}/,changelog compat control copyright files info rules doc-base) # `make tags' includes these files MDL_DOC_TRG := nco.dvi nco.html nco.info nco.pdf nco.ps nco.txt nco.xml # `make doc' creates these files MDL_DOC := $(addprefix ${MY_DOC_DIR}/,${MDL_DOC_TRG}) # `make distclean' removes these files MDL_MAN := $(wildcard ${MY_MAN_DIR}/*.1) MDL_MAN := $(notdir ${MDL_MAN}) MDL_MAN := $(addprefix ${MY_MAN_DIR}/,${MDL_MAN}) # distclean removes these files # Variables having to do with NCO build MDL_BLD_SRC := $(addprefix ${MY_BLD_DIR}/,libnco_tst.c libnco_c++_tst.cc Makefile nco.spec nco_dst.pl) # `make tags' includes these files MDL_BLD_SRC += $(addprefix ${MY_BM_DIR}/,NCO_bm.pm NCO_benchmarks.pm NCO_rgr.pm nco_bm.pl nco_bm.sh mk_bm_plots.pl) # `make tags' includes these files MDL_BLD_SRC += $(addprefix ${MY_DAT_DIR}/,Makefile.am) $(addprefix ${MY_SRC_DIR}/,Makefile.am) $(addprefix ${MY_DOC_DIR}/,Makefile.am) $(addprefix ${NCO_CXX_SRC_DIR}/,Makefile.am) $(addprefix ${NCOXX_SRC_DIR}/,Makefile.am) # `make tags' includes these files # Files, if any, to exclude from tags #TAGS_FILTER_FILES := .//libnco_tst.c .//libnco_c++_tst.cc ../src/nco/lex.${NCO_YY_PFX}.c TAGS_FILTER_FILES := .//libnco_tst.c .//libnco_c++_tst.cc ../bld/lex.${NCO_YY_PFX}.c # TAGS_FILTER_FILES := .//libnco_tst.c .//libnco_c++_tst.cc # Variables having to do with Qt build system MDL_QT_SRC := $(addprefix ${MY_QT_DIR}/,nco.pro libnco/libnco.pro ncatted/ncatted.pro ncbo/ncbo.pro ncecat/ncecat.pro ncflint/ncflint.pro ncks/ncks.pro ncpdq/ncpdq.pro ncra/ncra.pro ncrename/ncrename.pro ncwa/ncwa.pro tst_nco_c++/tst_nco_c++.pro) # `make tags' includes these files # Variables having to do with ncap MDL_NCAP_SRC := $(addprefix ${MY_SRC_DIR}/,ncap_yacc.y ncap_lex.l ncap.h) # `make tags' includes these files MDL_NCAP_TRG := ncap_yacc.c ncap_yacc.h ncap_lex.c # `make ncap' creates these files MDL_NCAP := $(addprefix ${MY_SRC_DIR}/,${MDL_NCAP_TRG}) # `make distclean' removes these files # Variables having to do with C++ source and documentation # fxm: auto-generate source code components of C++ lists MDL_CXX_SRC := $(addprefix ${NCOXX_SRC_DIR}/,libnco++.hh Makefile.am Makefile.old ncap2.cc ncap2.hh ncap2_utl.cc NcapVar.cc NcapVar.hh NcapVarVector.cc NcapVarVector.hh NcapVector.hh ncoGrammer.g nco_antlr_pst_prc.pl fmc_cls.cc fmc_cls.hh fmc_all_cls.cc fmc_all_cls.hh fmc_gsl_cls.cc fmc_gsl_cls.hh Invoke.cc Invoke.hh map_srt_tmp.hh nco_gsl.c nco_gsl.h prs_cls.cc prs_cls.hh sdo_utl.cc sdo_utl.hh sym_cls.cc sym_cls.hh VarOp.hh vtl_cls.hh) $(addprefix ${NCO_CXX_SRC_DIR}/,INSTALL libnco_c++.hh Makefile.am Makefile.old nco_att.cc nco_att.hh nco_dmn.cc nco_dmn.hh nco_fl.cc nco_fl.hh nco_hgh.cc nco_hgh.hh nco_utl.cc nco_utl.hh nco_var.cc nco_var.hh README TODO tst.cc) # `make tags' includes these files TAGS_FILES := ${MY_SRC_DIR}/*.h $(filter-out ${TAGS_FILTER_FILES},${SRC_LST}) ${MDL_DOC_SRC} ${MDL_MAN} ${MDL_BLD_SRC} ${MDL_CXX_SRC} ${MDL_NCAP_SRC} ${MDL_QT_SRC} # Redefine default C and C++ pattern rules ${MY_OBJ_DIR}/%.o : %.c ${CC} ${CPPFLAGS} ${CFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/%.o : %.cu nvcc -deviceemu ${CPPFLAGS} ${CFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/%.o : %.ccxb ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) # Default Fortran pattern rules: CRAY and RS6K must override these rules ${MY_OBJ_DIR}/%.o : %.F ${FC} ${CPPFLAGS} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< # Rules for installing header files #${MY_INC_DIR}/%.h : %.h # cp -f -p $(notdir $@) $@ ${MY_INC_DIR}/%.hh : %.hh cp -f -p $(notdir $@) $@ # Rules for installing i18n files # -k_ : Treat underscore as keyword (so "_" is equivalent to "gettext") # --default-domain : Name of program or library # --join-existing : Join messages with existing file %.po : %.c xgettext --default-domain=$* -k_ --join-existing $< ${MY_ES_DIR}/%.mo : %.po # Linux version accepts more arguments than Solaris version # msgfmt --output-file=$@ --statistics $< msgfmt -o $@ $< # Automatically generate a dependency file for each source file # $* is the stem, e.g., f # $@ is the filename of the target, e.g., f.d # Linux gcc may return an extra `.F' on Fortran names, e.g., `hello.F.o: hello.F' # (.F)? gets rid of this extra `.F' ${MY_DPN_DIR}/%.d : %.F # Following command makes, e.g., f.d begin "f.o f.d : f.F ..." # Since f.o is not preceded by ${MY_OBJ_DIR}, objects are not recompiled when sources are touched. # ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.F\.o/$*.o $@/g;' > $@ # Following command makes, e.g., f.d begin "/home/zender/obj/LINUX/f.o f.d : f.F ..." # This works fairly well, but is a hack # First pattern substitutes MY_OBJ_DIR_RX, which has placeholders for slashes # Second pattern substitutes slashes for the placeholders ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*(\.F)?\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ # Following command makes, e.g., f.d begin "${MY_OBJ_DIR}/f.o f.d : f.F ..." # This would be the ideal command but I can't get the dollar sign to show up # ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.F\.o/\${dollar}MY_OBJ_DIR\/$*.o $@/g;' > $@ ${MY_DPN_DIR}/%.d : %.c # ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.o/$*.o $@/g;' > $@ ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ ${MY_DPN_DIR}/%.d : %.cu nvcc -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ ${MY_DPN_DIR}/%.d : %.cc # NB: Use ${CXX} rather than ${CPP} on C++ files for now because, e.g., SUNMP cpp does not pre-process .cc files quite correctly # Extra hack to allow C++ filenames to contain '+' character # $(subst ${plus},${plus_rx},${*}) is filename stub with an Rx in place of '+' ${MK_DPN_CXX} ${CXXCPPFLAGS} $< | perl -p -e 's/\${plus}/${plus_rx}/g;s/$(subst ${plus},${plus_rx},${*})\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g;s/${plus_rx}/\${plus}/g' > $@ # First LDFLAGS is for typical C programs with netCDF, math, and networking # Second LDFLAGS, when present, enables C/Fortran linking # Manually define autotools tokens normally defined with HAVE_CONFIG_H in config.h # Initialize OS-specific tokens to empty CPP_TKN_OS := -DHAVE_REGEX_H -DNCO_HAVE_REGEX_FUNCTIONALITY -DHAVE_GETPAGESIZE -DHAVE_GETRUSAGE -DNEED_STRCASESTR # gcc 4.7.3 finally includes strcasestr() in string.h iff _GNU_SOURCE token is defined # NB: C++ (or at least g++ 4.7.3) always includes strcasestr()---work around this with tokens in nco_sng_utl.[ch] ifneq (${PVM_ARCH},CRAY) CPP_TKN_OS += -DHAVE_MKSTEMP endif # CRAY ifneq (${null},$(findstring ${PVM_ARCH},FREEBSDLINUXALPHALINUXAMD64LINUXARMMACOSXWIN32)) CPP_TKN_OS += -DHAVE_GETOPT_H -DHAVE_GETOPT_LONG endif # !LINUX ifneq (${null},$(findstring ${PVM_ARCH},AIXSGIMP64)) CPP_TKN_OS += -DNEED_GETOPT_LONG endif # !(AIX || SGI) ifeq (${CNK},Y) CPP_TKN_OS += -DHAVE_NEW_CHUNKING_API endif # !CNK ifeq (${DAP},Y) CPP_TKN_OS += -DENABLE_DAP endif # !DAP ifeq (${ESMF},Y) CPP_TKN_OS += -DENABLE_ESMF endif # !ESMF ifeq (${GSL},Y) CPP_TKN_OS += -DENABLE_GSL -DHAVE_GSL_H endif # !GSL ifeq (${MPI},Y) ifneq (${MPI_FAKE},Y) CPP_TKN_OS += -DENABLE_MPI endif # MPI_FAKE endif # !MPI ifeq (${UDUNITS},Y) CPP_TKN_OS += -DENABLE_UDUNITS -DHAVE_UDUNITS_H -DHAVE_UDUNITS2_H endif # !UDUNITS ifeq (${NETCDF4},Y) CPP_TKN_OS += -DENABLE_NETCDF4 -DHAVE_NETCDF4_H endif # endif NETCDF4 ifeq (${PNETCDF},Y) CPP_TKN_OS += -DENABLE_PNETCDF endif # !PNETCDF # endif PNETCDF # Assume strcasecmp() and strdup() routines are present (Comeau, Pathscale are exceptions) CPP_TKN_OS += # fxm: Define HAVE_LIBINTL, HAVE_LOCALE_H, HAVE_GETTEXT, HAVE_OMP_H # Works on AIX and AIX46K ifneq (${null},$(findstring AIX,${PVM_ARCH})) # 20030804: Always use re-entrant (_r) compilers---Jim Edwards NCAR/IBM CC := xlc_r -qlanglvl=extc99 #CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE CXX := xlC_r # CXX := g++ CPP := xlc -c -qlanglvl=extc99 -qsuppress=1501-245 -I/usr/lpp/ppe.poe/include FC := xlf95_r ifneq (${null},$(findstring xl,${CC})) # /usr/include headers must occur before Visual Age headers to prevent xlC pragma warnings # Visual Age compiler headers must occur before g++ headers CPP_TKN_OS += -I/usr/include -I/usr/vacpp/include endif # xlC compilers # Add /usr/local/include for libintl.h explicitly until netCDF is moved there CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} -DNEED_LOGF LD := ld # 20020422: -lC links to AIX C++ library which contains float intrinsics cosf()... # -bh:5 suppresses annoying messages from xlC linker WARNING: Duplicate symbol: ... LDFLAGS += -bh:5 ${OTHER_LDFLAGS} -lm -lC LEX := flex LINT := lint YACC := bison # AIX VA Compiler Collection ifneq (${null},$(findstring xl,${CC})) # Visual Age compiler defaults specified in /etc/vac.cfg # Additional switch to fix compiler warnings on csz.c # -qarch=auto : Automatically detect architecture of compiling machine and assume execution on same machine # -qlonglong allow long long integers (and strtoll(), strtoull()) (default on in C not C++). Redundant with -qlanglvl=extc99 # -qmaxmem=num Limit memory used by space intensive optimizations to kilobytes # -qspill=size Size in B of register allocation spill area, mie needs > 1040 B # -qsrcmsg prints transgressing source line with finger # -qsuppress=1501-245 : Suppress RLIM_INFINITY memory message due to ulimits # -qtune=auto : Optimize executable for architecture detected during compilation CFLAGS := -qmaxmem=8192 -qspill=2048 -qsrcmsg -qsuppress=1501-245 FFLAGS := -NS2000 -qfixed=132 -qsrcmsg # -bh:5 suppresses annoying messages from xlC linker WARNING: Duplicate symbol: ... LDFLAGS += -bh:5 -qsuppress=1501-245 #LDFLAGS += -lxlf90 # Required for linking Fortran objects ifeq (${OMP},Y) FC := xlf95_r # -qsmp=noauto : Turn on SMP/OMP code generation but do no automatic parallelization # -qsmp=omp : Use industry standard OMP without IBM extensions OMP_FLG := -qsmp=omp else CPP_DFN += -U_OPENMP FC := xlf95 endif # endif OMP ifeq (${OPTS},O) # -O : -O3 is safe, -O5 is dangerous # -qstrict: Ensure that -O3 optimizations do not alter program semantics # -Q : Inline all appropriate subprograms CFLAGS += -O3 -g -qstrict -Q FFLAGS += -O3 -g -qstrict -Q endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS += -g endif ifeq (${OPTS},X) # -qflttrap generates instructions for floating point exceptions # -qidirfirst uses headers found in -I directories first # -qmakedep creates .d file # -qwarn64 check for possible long-to-integer or pointer-to-integer truncation # -qhalt=e stop compiler if error severity equals or exceeds i, w, e, s, u CFLAGS += -g -qflttrap -qidirfirst -qwarn64 -qcheck=all -qhalt=s FFLAGS += -g endif ifeq (${ABI},64) AR := ar -X 64 CFLAGS += -q64 FFLAGS += -q64 LDFLAGS += -q64 else CPPFLAGS += -D_LARGE_FILES endif # endif ABI # Additional flags for AIX: # -M Generate information to be included in a "make" description file; output goes to .u file # -c Do not send object files to the linkage editor # -P Preprocess but do not compile; output goes to .i file # Using -P causes additional warning messages about lm # Not using -P causes *.o files to be created twice ${MY_DPN_DIR}/%.d : %.c ${MK_DPN} ${CPPFLAGS} $< ;perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' $*.u > $@ ; \ rm -f $*.i $*.o $*.u; ${MY_DPN_DIR}/%.d : %.cc ${MK_DPN_CXX} ${CPPFLAGS} $< ;perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' $*.u > $@ ; \ rm -f $*.i $*.o $*.u; endif # endif AIX VA Compiler Collection # GNU Compiler Collection ifneq (${null},$(findstring gcc,${CC})) CFLAGS := -Wall -Werror=format-security -Wunused ifeq (${OPTS},O) CFLAGS += -O -g ${GCC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -O LDFLAGS += /usr/local/lib/ccmalloc-g++.o -L/usr/local/lib -lccmalloc -ldl endif ifeq (${ABI},64) CC += -maix64 CXX += -maix64 endif # endif ABI CXXFLAGS := ${CFLAGS} endif # endif GNU Compiler Collection # -q64: Select 64-bit compiler mode (required for accessing large files) # -qwarn64: Warn on possible long-to-integer or pointer-to-integer truncation CXXFLAGS := ${CFLAGS} ifeq (${OMP},Y) CFLAGS += ${OMP_FLG} CXXFLAGS += ${OMP_FLG} FFLAGS += ${OMP_FLG} LDFLAGS := ${OMP_FLG} ${LDFLAGS} endif # endif OMP endif # endif AIX ifeq (${PVM_ARCH},ALPHA) ifeq (${OMP},Y) OMP_FLG := -omp endif # endif OMP CXX := cxx CC := cc CFLAGS := ${OMP_FLG} CPP := cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 FFLAGS := -r8 -i4 -c ${OMP_FLG} -automatic FIXEDFLAGS := -extend_source ${OMP_FLG} -automatic FREEFLAGS := -DHIDE_SHR_MSG -free LD := ld LDFLAGS += ${OMP_FLG} ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O2 -g -ansi_alias FFLAGS += -O3 -g -inline speed endif ifeq (${OPTS},D) CFLAGS += -g -check_bounds -check -check_omp FFLAGS += -g3 -C endif ifeq (${OPTS},X) CFLAGS := -g -N 132 FFLAGS := -g -check bounds -check omp_bindings -check overflow -check underflow endif CXXFLAGS := ${CFLAGS} ${MY_OBJ_DIR}/%.o : %.F90 ${FC} -c ${FREEFLAGS} ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< ${MY_OBJ_DIR}/%.o : %.F ${FC} -c ${FIXEDFLAGS} ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< endif # endif ALPHA ifeq (${PVM_ARCH},CRAY) CXX := CC CC := cc CPP := cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 # -F enables macro substitution # -dp enables DOUBLEPRECISION/double FFLAGS := -N 132 -F -dp LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -h rounddiv -h nofastmd -h nofastmodulus FFLAGS += -O2 -g endif ifeq (${OPTS},D) CFLAGS += -g -h indef -h rounddiv -h nofastmd -h nofastmodulus FFLAGS += -g -ei endif ifeq (${OPTS},X) CFLAGS += -g -h rounddiv -h indef -h bounds -h nofastmd -h nofastmodulus FFLAGS += -g -ei -Rabc endif # 19971021 Added -P to suppress #line # directives on Fortran files ${MY_OBJ_DIR}/%.o : %.F ${CPP} -P ${CPPFLAGS} $< > $(patsubst %.F,%.f,$(notdir $<)) ${FC} -c ${FFLAGS} $(patsubst %.F,%.f,$(notdir $<)) -mv -f $(notdir $@) ${MY_OBJ_DIR} rm -f $(patsubst %.F,%.f,$(notdir $<)) ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} $< mv -f $(notdir $@) ${MY_OBJ_DIR} endif # endif CRAY ifeq (${PVM_ARCH},HPPA) CXX := g++ CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f77 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lnsl -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O2 -g FFLAGS := -fast -eendif endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS := -g -e endif ifeq (${OPTS},X) CFLAGS += -g FFLAGS := -g -e endif endif # endif HPPA # Works on LINUX, LINUXALPHA, LINUXAMD64, LINUXARM, and FREEBSD and MACOSX ifneq (${null},$(findstring ${PVM_ARCH},LINUXALPHALINUXAMD64LINUXARMFREEBSDMACOSX)) CXX := ${LINUX_CXX} CC := ${LINUX_CC} CPP := ${CC} # NB: nameser.h needs -Di386, but gcc sends -Di586 (on pentiums) CPP_TKN_OS += -Di386 CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := ${LINUX_FC} LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm ifeq (${PVM_ARCH},MACOSX) LDFLAGS += -lresolv endif # endif MACOSX LEX := flex LINT := lint YACC := bison # Comeau C Compiler ifeq (${CXX},como) CFLAGS := CPPFLAGS += -DNEED_STRCASECMP CPPFLAGS += -DNEED_STRDUP LDFLAGS := ${COMOROOT}/libcomo/libcomo.a ${LDFLAGS} ifeq (${OPTS},O) CFLAGS += -O -g endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g endif CXXFLAGS := ${CFLAGS} endif # endif Comeau C Compiler # GNU Compiler Collection or LLVM # 20140204: gcc and clang should receive identical options ifeq (gcc,$(firstword ${CC})) GCC_OR_CLANG := Y endif ifeq (clang,$(firstword ${CC})) GCC_OR_CLANG := Y endif ifeq (${GCC_OR_CLANG},Y) CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE CFLAGS := -Wall -Wuninitialized # Compilation flags for numerical routines recommended by GSL 1.3 manual, p. 397 # Greenplanet has old compiler that lacks -Werror=format-security # CFLAGS += -W -Wmissing-prototypes -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -fno-common -g CFLAGS += -Werror=format-security -W -Wmissing-prototypes -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -fno-common -g # Compilation flags recommended by GSL and others that I like and use: # -D_BSD_SOURCE: Support 4.3 BSD Unix extensions to ANSI C (prevents nameser.h warnings) # -D_POSIX_SOURCE: Support POSIX.1 standard additions to ANSI C (prevents fileno warnings) # -pedantic: Disallow non-ISO constructs (including type long long) (sometimes useful) # -W: Extra warnings, including missing return values, comparison of signed with unsigned # -Wall: Warn about common programming problems # -Wcast-align: Warn if casting pointer to type of different size # -Wcast-qual: Warn if const qualifier removed from pointer # -Werror: Consider warnings as errors # -Werror=format-security: Consider this specific warning as errors (requires gcc > 4.1.2) # -Wmaybe-uninitialized: Warn on uninitialized variables. GCC has many false negatives, clang is better? Available on GCC 4.8.2+. Not available on GCC 4.6.3-. # -Wmissing-prototypes: Warn if missing prototypes # -Wpointer-arith: Warn if pointer arithmetic on types without size, e.g., void # -Wshadow: Warn if local variable has same name as other local variable # -Wsometimes-uninitialized: LLVM/clang uses this but GCC does not # -Wswitch: Warn if switch statement has enumerated index and case label outside enumeration range # -Wuninitialized: Warn on uninitialized variables. GCC has many false negatives, clang is better? # -Wunused: Warn on unused functions, labels, parameters, values, and variables # -Wwrite-strings: Apply const-qualifier to string constants, die if overwritten # -fno-common: Prevent global variables from being simultaneously defined in different files # -g: Put debugging symbols in executable # -pg: Enable profiling, generate gmon.out output files (also needed by linker) # -O3: clang -O4 DNE, highest clang optimization is -O3 # -O4: Turn on optimization so uninitialized variables are flagged. Downside: optimizes-out many debugging symbols # Compilation flags recommended by GSL that I do not like and do not use: # -ansi: Support only strict ANSI C. Equivalent to -std=c89, conflicts with -std=c99 # --no-alias? -fstrict-aliasing # -Waggregate-return: Warn if functions return aggregates like structures or unions # -Wconversion: Warn if converting signed to unsigned. Intended for obsolete, non-prototyped code. Triggers fabsf(), sqrtf(), warnings. # -Wnested-externs: Warn if extern is encountered within function. C only? # -Wstrict-prototypes: Warn if inconsistent prototypes. C only? # -Wtraditional: Warn if constructs differ between traditional and ANSI C. C only? # -Dinline=: inline is not an ANSI keyword, must undefine inline to work with -ansi # -fshort-enums: Make enums as short as possible, ususally non-int. Do not ever invoke this! This breaks ABI and causes subtle problems ifeq (${OMP},Y) ifneq (clang,$(firstword ${CC})) # 20140526 clang does not recognize/utilize -fopenmp OMP_FLG_C := -fopenmp OMP_FLG_F := -fopenmp LDFLAGS += -lgomp -lpthread endif # endif clang endif # endif OMP ifeq (${OPTS},O) ifeq (clang,$(firstword ${CC})) CFLAGS += -O3 -g ${GCC_RCH_ARG} else # endif clang CFLAGS += -O4 -g ${GCC_RCH_ARG} endif # endif clang endif ifeq (${OPTS},D) CFLAGS += -g -Wno-switch endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) # 20090715: https://wiki.ubuntu.com/CompilerFlags # -D_FORTIFY_SOURCE=2 : Compile-time libc checks, run-time buffer/memory checks # : NB: _FORTIFY_SOURCE macro requires -O switch # -fstack-protector : Enable run-time stack overflow verification # -Wformat-security : Warn about misuse of format strings # -Wl,-z,relro : Read-only relocation table area in final ELF CPPFLAGS += -D_FORTIFY_SOURCE=2 CFLAGS += -g -O -fstack-protector -Wformat-security ifneq (clang,$(firstword ${CC})) # 20150106 clang does not recognize/utilize -z CFLAGS += -Wl,-z,relro endif # endif clang # 20090715: -Werror triggers known nc_put_var?_string() and nco_def_var_chunking() errors # CFLAGS += -g -pg -fno-inline -Werror # CFLAGS += -g -O -pg -fno-inline CFLAGS += -g -pg -fno-inline LDFLAGS += -pg # LDFLAGS += /usr/local/lib/ccmalloc-gcc.o -L/usr/local/lib -lccmalloc -ldl endif ifneq (${null},$(findstring AMD64,${PVM_ARCH})) ifeq (${ABI},64) CFLAGS += -m64 FFLAGS += -m64 LDFLAGS += -m64 endif # endif ABI endif # endif LINUXAMD64 CXXFLAGS := ${CFLAGS} endif # endif GNU Compiler Collection or LLVM # Intel (Kai) C Compiler ifeq (icc,$(firstword ${CC})) # -fast: enable -xP -O3 -ipo -static # -ipo[n]: enable multi-file IP optimizations (between files) # -no-gcc: do not define __GNUC__, __GNUC_MINOR__, and __GNUC_PATCHLEVEL__ macros # -static: prevents linking with shared libraries # -std=c99: Enable C99 support for C programs # -xB: specialize code to run exclusively on Intel Pentium M and compatible Intel processors # -xK: specialize code to run exclusively on Intel Pentium III and compatible Intel processors # -xN: specialize code to run exclusively on Intel Pentium 4 and compatible Intel processors # -xP: specialize code to run exclusively on Intel Pentium 4 processors with SSE3 extensions # -Wall: enable all warnings # -Werror:force warnings to be reported as errors # -w0: display errors (same as -w) # -w1: display warnings and errors (DEFAULT) # -w2: display remarks, warnings, and errors # -wd[,,...] disable diagnostics L1 through LN # warning #274: declaration is not visible outside of function # remark #981: operands are evaluated in unspecified order # remark #810: conversion from "double" to "float" may lose significant bits # remark #1572: floating-point equality and inequality comparisons are unreliable CFLAGS := -w1 -wd274 # Rhea icc 13.1.3 (gcc version 4.4.7 compatibility) requires -D_BSD_SOURCE on files that #include nameser.h, recent transition of gcc 4.9 to -D_DEFAULT_SOURCE does not cut the mustard CPPFLAGS += -no-gcc -D_BSD_SOURCE LDFLAGS += -lsvml OMP_FLG_C := -openmp -openmp_report0 ifeq (${OPTS},O) CFLAGS += -O3 -g ${ICC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -Wall -wd810,981,1572 -inline_debug_info endif CXXFLAGS := ${CFLAGS} endif # endif Intel (Kai) C Compiler # Intel (Kai) Fortran Compiler ifeq (${FC},ifc) # -e95 issues warnings for non-standard fortran # -fpp2 necessary, but not sufficient, for OpenMP FFLAGS := -extend_source -implicitnone -vms -e95 -fpp2 # -lVaxlib needed for iargc_, getarg_ LDFLAGS += -lVaxlib OMP_FLG_C := -openmp ifeq (${PRC},D) FFLAGS += -i4 -r8 -doubletemps else FFLAGS += -i4 endif ifeq (${OPTS},O) FFLAGS += -O2 -g endif ifeq (${OPTS},D) FFLAGS += -g endif ifeq (${OPTS},R) FFLAGS += endif ifeq (${OPTS},X) FFLAGS += -g -C -e95 endif endif # endif Intel (Kai) Fortran Compiler # cd ~;nvcc -o libcuda_add.a -deviceemu -lib simpleTemplates.cu # cd ~;g++ -I/usr/local/cuda/include -c -o test.o test.c # cd ~;g++ -o ~/test test.o libcuda_add.a # NVidia C Compiler ifeq (nvcc,$(firstword ${CC})) CPPFLAGS += # -deviceemu: Emulate CUDA CPU # -lib: build static libraries CFLAGS := -deviceemu -lib ifeq (${OMP},Y) OMP_FLG_C := OMP_FLG_F := LDFLAGS += endif # endif OMP ifeq (${OPTS},O) CFLAGS += -O -g endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g LDFLAGS += endif ifneq (${null},$(findstring AMD64,${PVM_ARCH})) ifeq (${ABI},64) CFLAGS += FFLAGS += LDFLAGS += endif # endif ABI endif # endif LINUXAMD64 CXXFLAGS := ${CFLAGS} endif # endif NVidia C Compiler # Pathscale (QLogic) C Compiler ifeq (pathcc,$(firstword ${CC})) # pathcc -show-defaults # shows that pathcc automatically sets many hardware-specific options # man -k pathscale for full listing # -O2 = -O: Default optimization # -Ofast = -O3: CFLAGS := CPPFLAGS += -DNEED_STRCASECMP LDFLAGS += OMP_FLG_C := -apo -mp ifeq (${OPTS},O) CFLAGS += -O3 -g ${PSC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += -O2 endif ifeq (${OPTS},X) CFLAGS += -g endif CXXFLAGS := ${CFLAGS} endif # end Pathscale (QLogic) C++ Compiler # Portland Group C++ Compiler ifeq (pgcc,$(firstword ${CC})) # Enable Large File Support (LFS) by default CFLAGS := -Mlfs # Pass kludgy PGI identifier to flag for broken C99 designated initializers etc. CPPFLAGS := $(filter-out -DHAVE_C99,${CPPFLAGS}) CPPFLAGS := -DPGI_CC ${CPPFLAGS} LDFLAGS += -Mlfs OMP_FLG_C := -mp ifeq (${OPTS},O) CFLAGS += -fast ${PGI_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -Mbounds endif CXXFLAGS := ${CFLAGS} endif # endif Portland Group C++ Compiler # Portland Group Fortran Compiler ifeq (${FC},pgf90) FFLAGS := -Mextend -Mnosecond_underscore -byteswapio -Mrecursive -Mdalign -Ktrap=fp -Mlfs OMP_FLG_F := -mp ifeq (${PRC},D) FFLAGS += -Mr8 -Mi4 endif ifeq (${OPTS},O) FFLAGS += -fast endif ifeq (${OPTS},D) FFLAGS += -g endif ifeq (${OPTS},R) FFLAGS += endif ifeq (${OPTS},X) FFLAGS += -g -Mbounds endif endif # endif Portland Group Fortran Compiler # G77 Fortran compiler ifeq (${FC},g77) FFLAGS := -ffixed-line-length-132 -fno-second-underscore ifeq (${OPTS},O) FFLAGS += -O -g endif ifeq (${OPTS},D) FFLAGS += -g -fdebug-kludge endif ifeq (${OPTS},R) FFLAGS += -fdebug-kludge endif ifeq (${OPTS},X) FFLAGS := -g -O -fdebug-kludge -fbounds-check endif endif # endif G77 Fortran compiler ifeq (${DPKG},Y) CPPFLAGS+=$(shell dpkg-buildflags --get CPPFLAGS) CFLAGS+=$(shell dpkg-buildflags --get CFLAGS) CXXFLAGS+=$(shell dpkg-buildflags --get CXXFLAGS) LDFLAGS+=$(shell dpkg-buildflags --get LDFLAGS) endif # endif OMP ifeq (${OMP},Y) CFLAGS += ${OMP_FLG_C} CXXFLAGS += ${OMP_FLG_C} FFLAGS += ${OMP_FLG_C} # LD behavior assumes C source code LDFLAGS := ${OMP_FLG_C} ${LDFLAGS} endif # endif OMP endif # endif LINUX, LINUXALPHA, LINUXAMD64, LINUXARM, FREEBSD, MACOSX # NB: Deprecated as of 201403. Now MACOSX is subsumed in LINUX ifeq (${PVM_ARCH},MACOSXOLD) CXX := ${LINUX_CXX} # NB: -D_POSIX_SOURCE breaks MACOSX build in nco_fl_utl.c, nco_mmr.c #CC := cc -std=c99 -pedantic -D_BSD_SOURCE CC := ${LINUX_CC} -std=c99 -pedantic -D_BSD_SOURCE CPP := ${CC} # -fno-common: Allows shared libraries to build CFLAGS := -Wall -Werror=format-security -fno-common CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lresolv -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -O LDFLAGS += /usr/local/lib/ccmalloc-gcc.o -L/usr/local/lib -lccmalloc -ldl endif CXXFLAGS := ${CFLAGS} ifeq (${OMP},Y) CFLAGS += ${OMP_FLG} FFLAGS += ${OMP_FLG} LDFLAGS := ${OMP_FLG} ${LDFLAGS} endif # endif OMP endif # endif MACOSXOLD ifeq (${PVM_ARCH},NECSX) ifeq (${OMP},Y) OMP_FLG := -Popenmp endif # endif OMP CXX := c++ #CC := c++ -Xa CC := cc CPP := c++ -E #CPP := /usr/lib/cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -h2 -hmath vector -hxint # CFLAGS += -Cvopt -math vector -xint FFLAGS = -Cvopt -f3 endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS = -g -f3 endif ifeq (${OPTS},X) CFLAGS += -g -h0 -hstack=nan # CFLAGS += -Cdebug -init stack=nan FFLAGS = -Cdebug -eR -f3 -Wf"-init stack=nan heap=nan" endif MK_DPN = /usr/local/bin/mkdep.perl /usr/lib/cpp # NECSX try this ${MY_DPN_DIR}/%.d : %.c ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ endif # endif NECSX ifeq (${PVM_ARCH},RS6K) CXX := g++ CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE CPP := /lib/cpp -P CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := xlf LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O2 CPP := ${CPP} ${CPPFLAGS} PREPROCESS.F := ${CPP} ${CPPFLAGS} FFLAGS := -O -g -NS2000 -qfixed=132 endif ifeq (${OPTS},D) CFLAGS += -g CPP := ${CPP} ${CPPFLAGS} PREPROCESS.F := ${CPP} ${CPPFLAGS} FFLAGS := -g -NS2000 -qfixed=132 endif ${MY_OBJ_DIR}/%.o : %.F ${CPP} ${CPPFLAGS} $< ${MY_OBJ_DIR}/$(basename $<).f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/$(basename $<).f ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< endif # endif RS6K # SGI6, SGI64, SGIMP64 ifneq (${null},$(findstring SGI,${PVM_ARCH})) ifeq (${OMP},Y) OMP_FLG := -mp -mpio endif # endif OMP CXX := CC -LANG:std CC := cc -c99 # 20000302: -w suppresses warnings which will swamp linker #CXX := g++ -w #CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} ifdef $(MIPSPRO_SGI) # SGIs like dataproc keep omp.h in special location determined by module MIPSpro CPPFLAGS := -I$(MIPSPRO_SGI)/usr/include ${CPPFLAGS} endif FC := f90 -cpp LD := ld LEX := flex LINT := lint YACC := bison ifeq (${PVM_ARCH},SGI6) GCC_ABI_FLG := -mabi=32 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips3 SGI_ABI_FLG := -n32 -mips3 ${OMP_FLG} else # SGI64, SGIMP64 ifeq (${ABI},64) GCC_ABI_FLG := -mabi=64 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips4 -L/usr/local/lib/mabi=64 SGI_ABI_FLG := -64 -mips4 ${OMP_FLG} else # ABI=32 GCC_ABI_FLG := -mabi=32 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips4 SGI_ABI_FLG := -n32 -mips4 ${OMP_FLG} endif # endif ABI endif # endif SGI64, SGIMP64 ifeq (gcc,$(firstword ${CC})) LDFLAGS += ${GCC_LDFLAGS_SZ_SPC} ${OTHER_LDFLAGS} -lm CFLAGS := ${GCC_ABI_FLG} -Wall -Werror=format-security ifeq (${OPTS},O) CFLAGS += -O2 endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g -O endif CXXFLAGS := ${CFLAGS} endif # endif CC=gcc ifeq (cc,$(firstword ${CC})) LDFLAGS += ${SGI_ABI_FLG} ${OTHER_LDFLAGS} -lm CFLAGS := ${SGI_ABI_FLG} ifeq (${OPTS},O) CFLAGS += -O2 endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g -trapuv endif endif # endif CC=cc # Fortran flags FFLAGS := ${SGI_ABI_FLG} -extend_source ifeq (${OPTS},O) FFLAGS := -O2 -g endif ifeq (${OPTS},R) FFLAGS := endif ifeq (${OPTS},D) FFLAGS := -g endif ifeq (${OPTS},X) FFLAGS := -g -check_bounds -trapuv endif # end fortran flags endif # endif SGI6, SGI64, SGIMP64 ifeq (${UNAMES},SunOS) CXX := CC CC:= c99 -D_BSD_SOURCE CFLAGS := CPP := cc -E #CXX := g++ #CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE #CFLAGS := -Wall #CPP := cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 -DHIDE_SHR_MSG #FFLAGS := -xs -stackvar -e -Qoption f90comp -r8const FFLAGS := -xs -stackvar -e LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lsunmath -lresolv -lsocket -lnsl -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O2 -g FFLAGS += -fast endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g FFLAGS += -g # NB: 19980601 -C (range-checking) is not supported by Sun f90 ifeq (${FC},f77) FFLAGS += -C endif endif CXXFLAGS := ${CFLAGS} endif # endif SunOS=SUN4SOL2,SUNMP ifeq (${PVM_ARCH},WIN32) CXX := g++ CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE # NB: nameser.h needs -Di386, but gcc sends -Di586 (on pentiums) #CPP_TKN_OS += -Di386 -DNEED_STRCASECMP -DNEED_STRDUP -I/usr/include CPP_TKN_OS += -Di386 -DNEED_STRDUP -I/usr/include CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := g77 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O -g endif ifeq (${OPTS},D) CFLAGS += -g endif ${MY_OBJ_DIR}/%.o : %.F ${FC} -c ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< endif # endif WIN32 # Resolve nvcc CUDA run-time library functions ifeq (${CUDA},Y) CUDA_FLG_C := CUDA_FLG_F := LDFLAGS += -L/usr/local/cuda/lib -lcudart endif # endif CUDA # Internationalize NCO with i18n features ifeq (${I18N},Y) CPPFLAGS += -DI18N ifneq (${null},$(findstring MACOSX,${PVM_ARCH})) LDFLAGS += -lintl endif endif # endif I18N # Default to MPICC, MPICXX to CC, CXX and cross your fingers MPICC := ${CC} MPICXX := ${CXX} # Manipulate CC, CPP, CXX as appropriate for MPI-enabled operators ifeq (${MPI},Y) ifneq (${null},$(findstring xl,${CC})) # NB: AIX is not debugged yet MPICC := $(subst xlc,mpcc,${CC}) MPICXX := $(subst xlC,mpCC,${CXX}) endif # endif AIX VA Compiler Collection ifneq (${null},$(findstring gcc,${CC})) MPICC := $(subst gcc,mpicc,${CC}) MPICXX := $(subst g++,mpicxx,${CXX}) endif # endif GNU Compiler Collection ifeq (icpc,$(firstword ${CXX})) MPICC := $(subst icc,mpicc,${CC}) MPICXX := $(subst icpc,mpicxx,${CXX}) endif # endif Intel (Kai) C++ Compiler ifneq (${null},$(findstring pathcc,${CC})) MPICC := $(subst pathcc,mpicc,${CC}) MPICXX := $(subst pathCC,mpicxx,${CXX}) endif # endif Pathscale (QLogic) Compilers CPP := ${MPICC} endif # endif MPI # Use MPI modifications, if any, to build all objects CC := ${MPICC} CXX := ${MPICXX} # Disable OpenMP on platforms which automatically support it ifneq (${OMP},Y) ifneq (${null},$(findstring SGI,${PVM_ARCH})) CFLAGS := $(filter-out -mp -mpio,${CFLAGS}) LDFLAGS := $(filter-out -mp -mpio,${LDFLAGS}) endif # endif SGI CPPFLAGS += -U_OPENMP endif # endif OMP ifneq (${null},$(findstring LINUX,${PVM_ARCH})) ifeq (${CCACHE},Y) # Prefix CC and CXX with ccache CC := ccache ${CC} CXX := ccache ${CXX} endif # !CCACHE endif # !LINUX ifeq (${STC},Y) # Created statically linked executable LDFLAGS := -static ${LDFLAGS} endif # endif STC # Define CPPCXXFLAGS after making all possible modifications to CPPFLAGS # Add nco_c++ to directory search path CXXCPPFLAGS := ${CPPFLAGS} -I${NCO_CXX_SRC_DIR} # Define any remaining variables libnco := ${MY_LIB_DIR}/libnco # Default targets all: dir lib ${MDL_BIN_TRG} ${MDL_BIN_SPT} data non_ncap: dir lib $(filter-out ncap,${MDL_BIN_TRG}) ${MDL_BIN_SPT} data # .PHONY tells make to remake the following non-file targets .PHONY: all cln dst_cln dbg ${MDL_BIN_TRG} ${MDL_BIN_SPT} # Delete default suffixes---this should increase speed .SUFFIXES: # Define suffixes that matter .SUFFIXES: .cc .c .cu .o .F .d # Delete targets that were not successfully made .DELETE_ON_ERROR: # Target directories which may not exist dir: bin_dir obj_dir lib_dir bin_dir: # Compaq ALPHA complains about -install # -install -d ${MY_BIN_DIR} -mkdir -p ${MY_BIN_DIR} lib_dir: # -install -d ${MY_BIN_DIR} -mkdir -p ${MY_LIB_DIR} obj_dir: # -install -d ${MY_BIN_DIR} -mkdir -p ${MY_OBJ_DIR} # The whole shebang allinone: all nco_c++ nco++ nco_c++: -cd ../src/nco_c++; ${MAKE} -f Makefile.old DBG=${DBG} NETCDF4=${NETCDF4} OMP=${OMP} OPTS=${OPTS} SZ=${SZ} lib dat all nco++: -cd ../src/nco++; ${MAKE} -f Makefile.old CNK=${CNK} DAP=${DAP} DBG=${DBG} GSL=${GSL} MPI=${MPI} NETCDF4=${NETCDF4} OMP=${OMP} OPTS=${OPTS} PNETCDF=${PNETCDF} SZ=${SZ} UDUNITS=${UDUNITS} lib all # Targets in bin mpi: mpi_nco mpinco: mpi_nco mpnco: mpi_nco mpi_nco: ${MDL_MPI_TRG} -rm -f ${MY_BIN_DIR}/mpirun && ln -f -s `which mpirun` ${MY_BIN_DIR}/mpirun mpncbo: ${MY_BIN_DIR}/mpncbo ${MY_BIN_DIR}/mpncbo: ${MY_OBJ_DIR}/mpncbo.o lib ${MPICC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} cd ${MY_BIN_DIR}; rm -f mpncdiff; ln -s -f mpncbo mpncdiff # 20050710: icc 8.1 with -axW flag dies compiling ncecat # 20050915: Same problem occurs with MPI_FAKE version of mpncecat ifeq (icc,$(firstword ${LINUX_CC})) ncecat : CFLAGS := $(filter-out -axW,${CFLAGS}) ifeq (${MPI_FAKE},Y) mpncecat : CFLAGS := $(filter-out -axW,${CFLAGS}) endif # !MPI_FAKE endif # endif Intel (Kai) C Compiler mpncecat: ${MY_BIN_DIR}/mpncecat ${MY_BIN_DIR}/mpncecat: ${MY_OBJ_DIR}/mpncecat.o lib ${MPICC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} mpncflint: ${MY_BIN_DIR}/mpncflint ${MY_BIN_DIR}/mpncflint: ${MY_OBJ_DIR}/mpncflint.o lib ${MPICC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} mpncpdq: ${MY_BIN_DIR}/mpncpdq ${MY_BIN_DIR}/mpncpdq: ${MY_OBJ_DIR}/mpncpdq.o lib ${MPICC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} # cd ${MY_BIN_DIR}; rm -f mpncunpack; ln -s -f mpncpdq mpncunpack # cd ${MY_BIN_DIR}; rm -f mpncpack; ln -s -f mpncpdq mpncpack mpncra: ${MY_BIN_DIR}/mpncra ${MY_BIN_DIR}/mpncra: ${MY_OBJ_DIR}/mpncra.o lib ${MPICC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} cd ${MY_BIN_DIR}; rm -f mpncea; ln -s -f mpncra mpncea cd ${MY_BIN_DIR}; rm -f mpnces; ln -s -f mpncra mpnces cd ${MY_BIN_DIR}; rm -f mpncrcat; ln -s -f mpncra mpncrcat mpncwa: ${MY_BIN_DIR}/mpncwa ${MY_BIN_DIR}/mpncwa: ${MY_OBJ_DIR}/mpncwa.o ${MY_OBJ_DIR}/ncap_yacc.o ${MY_OBJ_DIR}/ncap_lex.o ${MY_OBJ_DIR}/ncap_utl.o lib ${MPICC} -o $@${BNR_SFX} $< ${MY_OBJ_DIR}/ncap_yacc.o ${MY_OBJ_DIR}/ncap_lex.o ${MY_OBJ_DIR}/ncap_utl.o ${LDFLAGS} chmod 755 $@${BNR_SFX} ncatted: ${MY_BIN_DIR}/ncatted ${MY_BIN_DIR}/ncatted: ${MY_OBJ_DIR}/ncatted.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} ncbo: ${MY_BIN_DIR}/ncbo ${MY_BIN_DIR}/ncbo: ${MY_OBJ_DIR}/ncbo.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} cd ${MY_BIN_DIR}; rm -f ncdiff; ln -s -f ncbo ncdiff ncecat: ${MY_BIN_DIR}/ncecat ${MY_BIN_DIR}/ncecat: ${MY_OBJ_DIR}/ncecat.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} ncflint: ${MY_BIN_DIR}/ncflint ${MY_BIN_DIR}/ncflint: ${MY_OBJ_DIR}/ncflint.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} ncks: ${MY_BIN_DIR}/ncks ${MY_BIN_DIR}/ncks: ${MY_OBJ_DIR}/ncks.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} ncpdq: ${MY_BIN_DIR}/ncpdq ${MY_BIN_DIR}/ncpdq: ${MY_OBJ_DIR}/ncpdq.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} cd ${MY_BIN_DIR}; rm -f ncunpack; ln -s -f ncpdq ncunpack cd ${MY_BIN_DIR}; rm -f ncpack; ln -s -f ncpdq ncpack ncra: ${MY_BIN_DIR}/ncra ${MY_BIN_DIR}/ncra: ${MY_OBJ_DIR}/ncra.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} cd ${MY_BIN_DIR}; rm -f ncea; ln -s -f ncra ncea cd ${MY_BIN_DIR}; rm -f nces; ln -s -f ncra nces cd ${MY_BIN_DIR}; rm -f ncrcat; ln -s -f ncra ncrcat ncremap: ${MY_BIN_DIR}/ncremap ${MY_BIN_DIR}/ncremap: ${MY_DAT_DIR}/ncremap /bin/cp -f ${MY_DAT_DIR}/ncremap ${MY_BIN_DIR} ncrename: ${MY_BIN_DIR}/ncrename ${MY_BIN_DIR}/ncrename: ${MY_OBJ_DIR}/ncrename.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} ncwa: ${MY_BIN_DIR}/ncwa ${MY_BIN_DIR}/ncwa: ${MY_OBJ_DIR}/ncwa.o ${MY_OBJ_DIR}/ncap_yacc.o ${MY_OBJ_DIR}/ncap_lex.o ${MY_OBJ_DIR}/ncap_utl.o lib ifeq (${MSVC},TRUE) ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} else ${CC} -o $@${BNR_SFX} $< ${MY_OBJ_DIR}/ncap_yacc.o ${MY_OBJ_DIR}/ncap_lex.o ${MY_OBJ_DIR}/ncap_utl.o ${LDFLAGS} endif chmod 755 $@${BNR_SFX} bin: ${MDL_BIN_TRG} ${MDL_BIN_SPT} binclean: bin_cln bin_cln: rm -f ${MDL_BIN} mpiclean: mpi_cln mpi_cln: rm -f ${MDL_MPI_BIN} ${MDL_MPI_OBJ} mpi_fake_cp: ${MDL_MPI_TRG} - for fl in ${MDL_MPI_TRG_SMP}; do /bin/cp -f ${MY_BIN_DIR}/$$fl ${MY_BIN_DIR}/mp$$fl; done # 20050916 fxm: not sure why simpler substitution method does not work # - for fl in ${MDL_MPI_TRG}; do /bin/cp -f ${MY_BIN_DIR}/$$fl ${MY_BIN_DIR}/$(subst mp,,$$fl); done strip: - printf "Before stripping...\n";ls -l ${MDL_BIN};strip ${MDL_BIN};printf "After stripping...\n";ls -l ${MDL_BIN} # Targets in bld buildclean: bld_cln bld_cln: cd ${MY_BLD_DIR}; rm -f TAGS libtest: libtst libtst: libnco_tst libnco_c++_tst libnco_tst: ${MY_BLD_DIR}/libnco_tst ${MY_BLD_DIR}/libnco_tst: ${MY_BLD_DIR}/libnco_tst.o lib ${CC} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} libnco_c++_tst: ${MY_BLD_DIR}/libnco_c++_tst ${MY_BLD_DIR}/libnco_c++_tst: ${MY_BLD_DIR}/libnco_c++_tst.o lib ${CXX} -o $@${BNR_SFX} $< ${LDFLAGS} chmod 755 $@${BNR_SFX} rpm: ${MY_BLD_DIR}/nco.spec # Building rpm requires root priveleges, e.g., sudo make NCO_VRS=4.5.2 rpm # Building NCO RPM requires following packages # rpm -q bison flex netcdf-devel libtool automake autoconf udunits udunits-devel curl-devel libxml2 libxml2-devel librx-devel # sudo yum install bison flex netcdf-devel libtool automake autoconf udunits udunits-devel curl-devel libxml2 libxml2-devel librx-devel cd ${DATA}/tmp; \ /bin/rm -fr ${DATA}/tmp/nco*; \ cp -r ${HOME}/nco nco-${NCO_VRS}; \ tar cvzf nco-${NCO_VRS}.tar.gz ./nco-${NCO_VRS}; \ mv ${DATA}/tmp/nco-${NCO_VRS}.tar.gz /usr/src/redhat/SOURCES; \ /bin/rm -f /usr/src/redhat/SPECS/nco-${NCO_VRS}.spec; \ ln -s ${HOME}/nco/bld/nco.spec /usr/src/redhat/SPECS/nco-${NCO_VRS}.spec; \ cd /usr/src/redhat/SPECS; \ rpmbuild -ba --sign nco-${NCO_VRS}.spec; # Crypographically sign RPM packages with GPG: http://fedoranews.org/tchung/gpg # gpg --export -a 'Charlie Zender' > ~/GPG-zender # Export public key from key ring to text file # sudo rpm --import ~/GPG-zender # Import public key to RPM database # rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' # Verify list of GPG public keys in RPM database # Verify ~/.rpmmacros file specifies _signature and gpg_name # sudo rpm --addsign /usr/src/redhat/SRPMS/nco-${NCO_VRS}-?.src.rpm /usr/src/redhat/RPMS/i386/nco-${NCO_VRS}-?.i386.rpm # Sign RPM packages # rpm --checksig /usr/src/redhat/SRPMS/nco-${NCO_VRS}-?.src.rpm /usr/src/redhat/RPMS/i386/nco-${NCO_VRS}-?.i386.rpm # Check signatures rpmnet: ${MY_BLD_DIR}/nco.spec # Building rpm requires root priveleges, e.g., sudo make NCO_VRS=3.1.8 rpmnet - if test -f /usr/src/redhat/SOURCES/nco-${NCO_VRS}.tar.gz; then printf "Using existing nco-${NCO_VRS}.tar.gz\n" ; else ${MY_BIN_DIR}/ncks -R -p ftp://dust.ess.uci.edu/pub/zender/nco -l /usr/src/redhat/SOURCES nco-${NCO_VRS}.tar.gz; fi /bin/rm -f /usr/src/redhat/SPECS/nco-${NCO_VRS}.spec; \ cd /usr/src/redhat/SOURCES; \ tar xvzf nco-${NCO_VRS}.tar.gz ./nco-${NCO_VRS}/bld/nco.spec; \ mv ./nco-${NCO_VRS}/bld/nco.spec /usr/src/redhat/SPECS/nco.spec; \ cd /usr/src/redhat/SPECS; \ rpmbuild -ba --sign nco.spec; \ scp /usr/src/redhat/SRPMS/nco-${NCO_VRS}-?.src.rpm /usr/src/redhat/RPMS/i386/nco-${NCO_VRS}-?.i386.rpm zender@dust.ess.uci.edu:/var/www/html/nco/src rpm_cln: rpm --erase ${MDL_RPM_NST_NM} # Targets in bm bench: bm bnch: bm bm: cd ${MY_BM_DIR}; \ env MY_BIN_DIR=${MY_BIN_DIR} ../bm/nco_bm.pl --dbg=0 --bench --udpreport ${FL_FMT_SNG} ${MPI_PRC_SNG} ${THR_NBR_SNG} file: fl fl: cd ${MY_BM_DIR}; \ env MY_BIN_DIR=${MY_BIN_DIR} ../bm/nco_bm.pl --dbg=0 --test_files=A --udpreport ${FL_FMT_SNG} ${MPI_PRC_SNG} ${THR_NBR_SNG} regression: tst rgr: tst test: tst tst: dat cd ${MY_BM_DIR}; \ env MY_BIN_DIR=${MY_BIN_DIR} ../bm/nco_bm.pl --dbg=0 --regress --udpreport ${FL_FMT_SNG} ${MPI_PRC_SNG} ${THR_NBR_SNG} # Targets in dat # ncgen rules to build netCDF4 files must be error-tolerant to build on netCDF3-only installations bug: ${MY_DAT_DIR}/buggy.nc ${MY_DAT_DIR}/buggy.nc: ${MY_DAT_DIR}/buggy.cdl -ncgen -k netCDF-4 -b -o $@ $< dap: data -cd ~/nco/data; scp in.nc in.cdl dust.ess.uci.edu:/var/www/html/dodsdata; scp in.nc in.cdl esmf.ess.uci.edu:/var/www/html/dodsdata; scp in.nc in.cdl esmf.ess.uci.edu:/data/dodsdata data: dat dat: ${MY_DAT_DIR}/cmip5.nc ${MY_DAT_DIR}/obs.nc ${MY_DAT_DIR}/dsm.nc ${MY_DAT_DIR}/hdn.nc ${MY_DAT_DIR}/hdf.hdf ${MY_DAT_DIR}/mdl_1.nc ${MY_DAT_DIR}/mdl_2.nc ${MY_DAT_DIR}/mdl_3.nc ${MY_DAT_DIR}/mrd.nc ${MY_DAT_DIR}/in.nc ${MY_DAT_DIR}/in_4c.nc ${MY_DAT_DIR}/in_grp.nc ${MY_DAT_DIR}/in_4.nc ${MY_DAT_DIR}/in_grp_1.nc ${MY_DAT_DIR}/in_grp_2.nc ${MY_DAT_DIR}/in_grp_3.nc ${MY_DAT_DIR}/in_grp_4.nc ${MY_DAT_DIR}/in_grp_5.nc ${MY_DAT_DIR}/in_grp_6.nc ${MY_DAT_DIR}/in_grp_7.nc ${MY_DAT_DIR}/in_rec_zero.nc -for fl in ${MDL_DAT_STB}; do cd ${MY_DAT_DIR}; ln -s -f in.nc $$fl; done ${MY_DAT_DIR}/in.nc: ${MY_DAT_DIR}/in.cdl ncgen -b -o $@ $< ${MY_DAT_DIR}/in_4c.nc: ${MY_DAT_DIR}/in.nc -ncks -O -7 --cnk_dmn time,10 $< $@ # ncgen default chunksize for time = 4 MB produces ~200 MB in_4c.nc file. Avoid that! # -ncgen -k hdf5-nc3 -b -o $@ $< ${MY_DAT_DIR}/in_rec_zero.nc: ${MY_DAT_DIR}/in_rec_zero.cdl ncgen -b -o $@ $< ${MY_DAT_DIR}/in_grp.nc: ${MY_DAT_DIR}/in_grp.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_4.nc: ${MY_DAT_DIR}/in_4.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_1.nc: ${MY_DAT_DIR}/in_1.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_2.nc: ${MY_DAT_DIR}/in_2.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_1.nc: ${MY_DAT_DIR}/in_grp_1.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_2.nc: ${MY_DAT_DIR}/in_grp_2.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_3.nc: ${MY_DAT_DIR}/in_grp_3.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_4.nc: ${MY_DAT_DIR}/in_grp_4.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_5.nc: ${MY_DAT_DIR}/in_grp_5.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_6.nc: ${MY_DAT_DIR}/in_grp_6.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/in_grp_7.nc: ${MY_DAT_DIR}/in_grp_7.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/cmip5.nc: ${MY_DAT_DIR}/cmip5.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/hdn.nc: ${MY_DAT_DIR}/hdn.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/mrd.nc: ${MY_DAT_DIR}/mrd.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/dsm.nc: ${MY_DAT_DIR}/dsm.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/obs.nc: ${MY_DAT_DIR}/obs.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/hdf.hdf: ${MY_DAT_DIR}/hdf.cdl -hncgen -b -o $@ $< ${MY_DAT_DIR}/mdl_1.nc: ${MY_DAT_DIR}/mdl_1.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/mdl_2.nc: ${MY_DAT_DIR}/mdl_2.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/mdl_3.nc: ${MY_DAT_DIR}/mdl_3.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snd_ncwa.nc: ${MY_DAT_DIR}/snd_ncwa.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snc_ncwa.nc: ${MY_DAT_DIR}/snc_ncwa.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snd_grp.nc: ${MY_DAT_DIR}/snd_grp.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snc_grp.nc: ${MY_DAT_DIR}/snc_grp.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snc.nc: ${MY_DAT_DIR}/snc.cdl -ncgen -k netCDF-4 -b -o $@ $< ${MY_DAT_DIR}/snd.nc: ${MY_DAT_DIR}/snd.cdl -ncgen -k netCDF-4 -b -o $@ $< dataclean: dat_cln dat_cln: rm -f ${MDL_DAT} cd ${MY_DAT_DIR}; rm -f foo* tst_ftp: dat - if test -f ${MY_DAT_DIR}/nco_tst.nc; then printf "" ; else ${MY_BIN_DIR}/ncks -q -R -p ftp://dust.ess.uci.edu/pub/zender/nco -l ${MY_DAT_DIR} nco_tst.nc; if [ $? != 0 ]; then printf "WARNING: Unable to retrieve ftp://dust.ess.uci.edu/pub/zender/nco/nco_tst.nc required for self-test, possible problem with getting through your firewall? Manually download and install in directory ../data to continue self test...\n"; fi; fi cd ${MY_BLD_DIR}; \ env MY_BIN_DIR=${MY_BIN_DIR} MY_DAT_DIR=${MY_DAT_DIR} ./nco_tst.pl testclean: tst_cln tst_cln: cd ${MY_DAT_DIR}; rm -f foo* nco_tst.nc # Targets in doc # Each make directive line spawns a separate shell so must use `cd dir;cmd' format doc: ${MY_DOC_DIR}/nco.dvi ${MY_DOC_DIR}/nco.html ${MY_DOC_DIR}/nco.info ${MY_DOC_DIR}/nco.ps ${MY_DOC_DIR}/nco.pdf ${MY_DOC_DIR}/nco.txt ${MY_DOC_DIR}/nco.xml ${MY_DOC_DIR}/nco.dvi: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; texi2dvi --output=$@ $< ${MY_DOC_DIR}/nco.info: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; makeinfo --no-split --output=$@ $< ${MY_DOC_DIR}/nco.html: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; texi2html -monolithic -verbose $< # cd ${MY_DOC_DIR}; makeinfo --html --no-split --output=$@ $< ${MY_DOC_DIR}/nco.ps: ${MY_DOC_DIR}/nco.dvi cd ${MY_DOC_DIR}; dvips -o $@ nco.dvi ${MY_DOC_DIR}/nco.pdf: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; texi2dvi --pdf --output=$@ $< # cd ${MY_DOC_DIR}; ps2pdf -dMaxSubsetPct=100 -dCompatibilityLevel=1.2 -dSubsetFonts=true -dEmbedAllFonts=true nco.ps $@ ${MY_DOC_DIR}/nco.txt: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; makeinfo --no-headers --no-split --output=$@ $< # Neither of these xml formats seems to be viewable ${MY_DOC_DIR}/nco.xml: ${MY_DOC_DIR}/nco.texi cd ${MY_DOC_DIR}; makeinfo --xml --no-split --output=$@ $< # cd ${MY_DOC_DIR}; makeinfo --docbook --no-split --output=$@ $< docclean: doc_cln doc_cln: cd ${MY_DOC_DIR}; rm -f nco.info* nco.dvi nco.html* nco.ps nco.pdf *~ # Targets in dpn depend: dpn dpn: ${MDL_DPN} dpn_cln: rm -f ${MDL_DPN} # Targets in inc include: inc inc: ${MDL_INC} inc_cln: rm -f ${MDL_INC} love: echo "Not war?" # Targets in lib library: lib lib : inc ${libnco}.a ifeq (${PVM_ARCH},MACOSX) ranlib ${libnco}.a endif # endif LINUX # If not using glibc, build Sittler's getopt() and getopt_long() functions ifeq (${null},$(findstring ${PVM_ARCH},FREEBSDLINUXALPHALINUXAMD64LINUXARMMACOSXWIN32)) ${libnco}.a: ${libnco}.a(${MY_OBJ_DIR}/nco_getopt.o) endif # endif not glibc ${libnco}.a: ${libnco}.a(${MY_OBJ_DIR}/nco_att_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_aux.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_bnr.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cln_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cnf_dmn.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cnf_typ.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cnk.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cnv_arm.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_cnv_csm.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_ctl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_dbg.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_dmn_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_fl_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_grp_trv.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_grp_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_lmt.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_lst_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_md5.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_mmr.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_msa.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_mss_val.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_netcdf.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_omp.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_pck.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_ppc.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_prn.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_rec_var.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_rgr.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_rth_flt.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_rth_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_scl_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_scm.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_sld.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_sng_utl.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_srm.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_var_avg.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_var_lst.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_var_rth.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_var_scv.o) \ ${libnco}.a(${MY_OBJ_DIR}/nco_var_utl.o) libclean: lib_cln lib_cln: rm -f ${libnco}.* ${libnco}*.* ${libnco}++.a ${libnco}_c++.a # Targets in man man: ${MDL_MAN} cd ../man;sudo cp -f *.1 ${MY_MAN_DIR}/man1 man_cln: rm -f ${MDL_MAN} # Targets in obj object: obj obj: ${MDL_OBJ} objclean: obj_cln obj_cln: rm -f ${MDL_OBJ} # Targets in root autotools: dst_cln - cd ..; aclocal;autoheader;automake --foreign;autoconf ; ./configure --enable-optimize-custom --prefix=${HOME} --bindir=${MY_BIN_DIR} --datadir=${HOME}/nco/data --libdir=${MY_LIB_DIR} --mandir=${HOME}/nco/man ; ${MAKE} install rootclean: root_cln root_cln: - cd ..; rm -f config.h config.guess config.log config.status config.sub libtool Makefile stamp-h1; rm -r -f autom4te.cache conftest # Targets in src src: ${MDL_NCAP} src_cln: rm -f ${MDL_NCAP} # Targets in /usr/local sys: ${MDL_BIN_TRG} ${MDL_BIN_SPT} - cd ${MY_BIN_DIR};sudo /bin/cp -f ${MDL_BIN_TRG} ${MDL_BIN_SPT} ncap2 /usr/local/bin; cd /usr/local/bin; sudo rm -f ncdiff ncea nces ncrcat ncunpack; sudo ln -s -f ncbo ncdiff; sudo ln -s -f ncra ncea; sudo ln -s -f ncra nces; sudo ln -s -f ncra ncrcat; sudo ln -s -f ncpdq ncunpack; sudo ln -s -f ncpdq ncpack; cd ${HOME}/nco/src/nco++; ${MAKE} -f Makefile.old OPTS=${OPTS} $@ sys_cln: - cd /usr/local/bin;rm -f ${MDL_BIN_TRG} ${MDL_BIN_SPT} ${MDL_BIN_SYM_LNK} # Housekeeping clean: cln cln: lib_cln dpn_cln obj_cln src_cln tst_cln cd ${MY_DOC_DIR}; rm -f nco.aux nco.cp nco.cps nco.fn nco.ky nco.log nco.pg nco.toc nco.tp nco.vr debug: dbg dbg: @printf "ABI = ${ABI}\n" @printf "AR = ${AR}\n" @printf "BNR_SFX = ${BNR_SFX}\n" @printf "CC = ${CC}\n" @printf "CCACHE = ${CCACHE}\n" @printf "CFLAGS = ${CFLAGS}\n" @printf "CNK = ${CNK}\n" @printf "CPP = ${CPP}\n" @printf "CPPFLAGS = ${CPPFLAGS}\n" @printf "CPP_PTH = ${CPP_PTH}\n" @printf "CPP_TKN = ${CPP_TKN}\n" @printf "CURL_LIB = ${CURL_LIB}\n" @printf "CXX = ${CXX}\n" @printf "CXXFLAGS = ${CXXFLAGS}\n" @printf "DAP = ${DAP}\n" @printf "DAP_ROOT = ${DAP_ROOT}\n" @printf "DBG = ${DBG}\n" @printf "FC = ${FC}\n" @printf "FFLAGS = ${FFLAGS}\n" @printf "FL_FMT = ${FL_FMT}\n" @printf "GCC_RCH_ARG = ${GCC_RCH_ARG}\n" @printf "GSL = ${GSL}\n" @printf "GSL_INC_FLG = ${GSL_INC_FLG}\n" @printf "GSL_LIB_FLG = ${GSL_LIB_FLG}\n" @printf "HDF5_ROOT = ${HDF5_ROOT}\n" @printf "HDF5_INC = ${HDF5_INC}\n" @printf "HDF5_LIB = ${HDF5_LIB}\n" @printf "HOST = ${HOST}\n" @printf "HOSTNAME = ${HOSTNAME}\n" @printf "ICC_RCH_ARG = ${ICC_RCH_ARG}\n" @printf "INC_NCAR = ${INC_NCAR}\n" @printf "LAMMPICC = ${LAMMPICC}\n" @printf "LAMMPICXX = ${LAMMPICXX}\n" @printf "LDFLAGS = ${LDFLAGS}\n" @printf "LEX = ${LEX}\n" @printf "LFLAGS = ${LFLAGS}\n" @printf "LIB_NCAR = ${LIB_NCAR}\n" @printf "LINUX_CC = ${LINUX_CC}\n" @printf "LINUX_CXX = ${LINUX_CXX}\n" @printf "MDL_BIN = ${MDL_BIN}\n" @printf "MDL_BIN_SPT = ${MDL_BIN_SPT}\n" @printf "MDL_BIN_SYM_LNK = ${MDL_BIN_SYM_LNK}\n" @printf "MDL_BIN_TRG = ${MDL_BIN_TRG}\n" @printf "MDL_DPN = ${MDL_DPN}\n" @printf "MDL_MAN = ${MDL_MAN}\n" @printf "MDL_MPI_TRG = ${MDL_MPI_TRG}\n" @printf "MDL_OBJ = ${MDL_OBJ}\n" @printf "MDL_PTH = ${MDL_PTH}\n" @printf "MDL_RPM_NST_NM = ${MDL_RPM_NST_NM}\n" @printf "MDL_SRC = ${MDL_SRC}\n" @printf "MPI = ${MPI}\n" @printf "MPICC = ${MPICC}\n" @printf "MPICH_CC = ${MPICH_CC}\n" @printf "MPICH_CXX = ${MPICH_CXX}\n" @printf "MPICXX = ${MPICXX}\n" @printf "MPI_PRC = ${MPI_PRC}\n" @printf "MPI_PRC_SNG = ${MPI_PRC_SNG}\n" @printf "MPI_ROOT = ${MPI_ROOT}\n" @printf "MY_BIN_DIR = ${MY_BIN_DIR}\n" @printf "MY_BLD_DIR = ${MY_BLD_DIR}\n" @printf "MY_BLD_DIR = ${MY_BLD_DIR}\n" @printf "MY_DAT_DIR = ${MY_DAT_DIR}\n" @printf "MY_DOC_DIR = ${MY_DOC_DIR}\n" @printf "MY_DPN_DIR = ${MY_DPN_DIR}\n" @printf "MY_INC_DIR = ${MY_INC_DIR}\n" @printf "MY_LIB_DIR = ${MY_LIB_DIR}\n" @printf "MY_MAN_DIR = ${MY_MAN_DIR}\n" @printf "MY_OBJ_DIR = ${MY_OBJ_DIR}\n" @printf "NCO_LDFLAGS = ${NCO_LDFLAGS}\n" @printf "NCO_VRS = ${NCO_VRS}\n" @printf "NC_CFLAGS = ${NC_CFLAGS}\n" @printf "NC_LDFLAGS = ${NC_LDFLAGS}\n" @printf "NETCDF4 = ${NETCDF4}\n" @printf "NETCDF4_ROOT = ${NETCDF4_ROOT}\n" @printf "NETCDF_INC = ${NETCDF_INC}\n" @printf "NETCDF_LIB = ${NETCDF_LIB}\n" @printf "NETCDF_ROOT = ${NETCDF_ROOT}\n" @printf "OMP = ${OMP}\n" @printf "OPTS = ${OPTS}\n" @printf "OTHER_CFLAGS = ${OTHER_CFLAGS}\n" @printf "OTHER_LDFLAGS = ${OTHER_LDFLAGS}\n" @printf "PGI_RCH_ARG = ${PGI_RCH_ARG}\n" @printf "PNETCDF = ${PNETCDF}\n" @printf "PSC_RCH_ARG = ${PSC_RCH_ARG}\n" @printf "PVM_ARCH = ${PVM_ARCH}\n" @printf "RPM = ${RPM}\n" @printf "SRC_LST = ${SRC_LST}\n" @printf "STC = ${STC}\n" @printf "SZ = ${SZ}\n" @printf "SZ_LIB = ${SZ_LIB}\n" @printf "TAGS_FILES = ${TAGS_FILES}\n" @printf "TAGS_FILTER_FILES = ${TAGS_FILTER_FILES}\n" @printf "THR_NBR = ${THR_NBR}\n" @printf "THR_NBR_SNG = ${THR_NBR_SNG}\n" @printf "UDUNITS = ${UDUNITS}\n" @printf "UDUNITS_INC = ${UDUNITS_INC}\n" @printf "UDUNITS_LIB = ${UDUNITS_LIB}\n" @printf "UDUNITS_INC_FLG = ${UDUNITS_INC_FLG}\n" @printf "UDUNITS_LIB_FLG = ${UDUNITS_LIB_FLG}\n" @printf "VPATH = ${VPATH}\n" @printf "VRS_SNG = ${VRS_SNG}\n" @printf "YACC = ${YACC}\n" @printf "YFLAGS = ${YFLAGS}\n" distclean: dst_cln dst_cln: cln bin_cln dat_cln doc_cln root_cln cd ${MY_BLD_DIR}; rm -f *~ cd ${MY_DAT_DIR}; rm -f buggy.nc cmip5.nc dsm.nc obs.nc hdf.hdf mdl_1.nc mdl_2.nc mdl_3.nc in.nc in_4c.nc in_4.nc in_grp.nc in_grp_1.nc in_grp_2.nc in_grp_3.nc in_grp_4.nc in_grp_5.nc in_grp_6.nc in_grp_7.nc in_rec_zero.nc *~ tags: etags ${TAGS_FILES} # etags ${MY_SRC_DIR}/*.h $(filter-out ${TAGS_FILTER_FILES},${SRC_LST}) ${MDL_DOC_SRC} ${MDL_MAN} ${MDL_BLD_SRC} ${MDL_CXX_SRC} ${MDL_NCAP_SRC} ${MDL_QT_SRC} # Reset internal YACC and LEX patterns %.c : %.y %.c : %.l # It is safest to do both YACC and LEX after either file changes # Otherwise only changing one and then switching, e.g., from bison to yacc, can cause problems # NB: Bison has problem when bison.simple declares yyparse() as int yyparse (void); # Solution is to comment out that definition in bison.simple ifeq (${YACC},bison) ${MY_SRC_DIR}/%_yacc.c ${MY_SRC_DIR}/%_yacc.h : ${MY_SRC_DIR}/%_yacc.y ${YACC} ${YFLAGS} --output=$(basename $<).c -d $< #${MY_SRC_DIR}/%_yacc.c ${MY_SRC_DIR}/%_yacc.h : ${MY_SRC_DIR}/%_yacc.y # ${YACC} ${YFLAGS} --file-prefix=$(notdir $($(basename $<))) -d $< #%_yacc.c %_yacc.h : %_yacc.y # ${YACC} ${YFLAGS} --file-prefix=$(notdir $($(basename $<))) -d $< endif ifeq (${YACC},yacc) %.tab.c %.tab.h : %.y ${YACC} ${YFLAGS} $< mv y.tab.c $(basename $<).c mv y.tab.h $(basename $<).h endif %_lex.c : %_lex.l ${LEX} ${LFLAGS} $< mv lex.${NCO_YY_PFX}.c $(basename $<).c # Target-specific variable values syntax TARGET ... : VARIABLE-ASSIGNMENT # Rules begin in leftmost column else interpreted as commands ifneq (${null},$(findstring ${PVM_ARCH},LINUXALPHALINUXAMD64LINUXARMFREEBSD)) ifeq (gcc,$(firstword ${CC})) ${MY_OBJ_DIR}/nco_grp_trv.o : CFLAGS := $(filter-out -Wcast-qual,${CFLAGS}) ${MY_OBJ_DIR}/nco_grp_trv.o : CXXFLAGS := $(filter-out -Wcast-qual,${CXXFLAGS}) endif # endif GCC endif # endif LINUX # ncap, and only ncap, requires AIX system C++ library ifneq (${null},$(findstring AIX,${PVM_ARCH})) ifneq (${null},$(findstring xl,${CC})) # Target-specific variable values syntax TARGET ... : VARIABLE-ASSIGNMENT # Rules begin in leftmost column else interpreted as commands ncap : LDFLAGS += -lC endif # endif AIX VA Compiler Collection endif # endif AIX # For some reason, ncap_lex.c is not remade when I expect it to be, so I explicitly remove the object file every time ncap: ${MY_OBJ_DIR}/ncap_yacc.o ${MY_OBJ_DIR}/ncap_lex.o ncap_yacc.h ${MY_OBJ_DIR}/ncap.o ${MY_OBJ_DIR}/ncap_utl.o ${libnco}.a # ${YACC} --name-prefix=nco_ ifneq (${null},$(findstring ${PVM_ARCH},LINUXALPHALINUXAMD64LINUXARMFREEBSDWIN32SGIMP64)) ${CC} ${CFLAGS} -o ${MY_BIN_DIR}/$@ ${MY_OBJ_DIR}/$@.o ${MY_OBJ_DIR}/ncap_utl.o ${MY_OBJ_DIR}/$@_yacc.o ${MY_OBJ_DIR}/$@_lex.o ${LDFLAGS} else ${CC} ${CFLAGS} -o ${MY_BIN_DIR}/$@ ${MY_OBJ_DIR}/$@.o ${MY_OBJ_DIR}/ncap_utl.o ${MY_OBJ_DIR}/$@_yacc.o ${MY_OBJ_DIR}/$@_lex.o -ll -ly ${LDFLAGS} endif chmod 755 ${MY_BIN_DIR}/$@${BNR_SFX} ncap2 : -cd ../src/nco++; ${MAKE} -f Makefile.old DAP=${DAP} DBG=${DBG} GSL=${GSL} MPI=${MPI} NETCDF4=${NETCDF4} OMP=${OMP} OPTS=${OPTS} PNETCDF=${PNETCDF} SZ=${SZ} UDUNITS=${UDUNITS} all # /bin/rm -f ${MDL_NCAP} ${MY_OBJ_DIR}/$@_lex.o ${MY_OBJ_DIR}/ncap_yacc.h ${MY_OBJ_DIR}/ncap_yacc.c # Create dependency files only if they will not be immediately deleted INCLUDE_DPN := TRUE GOALS_WHICH_DELETE_DEPENDENCY_FILES := cln clean dir distclean dst_cln dpn_cln tags uninstall ifeq (${null},$(findstring $(MAKECMDGOALS),${GOALS_WHICH_DELETE_DEPENDENCY_FILES})) INCLUDE_DPN := TRUE else INCLUDE_DPN := FALSE endif ifeq (${INCLUDE_DPN},TRUE) -include ${MDL_DPN} endif nco-4.5.4/bld/ddd_mpd.py000077500000000000000000000137101264355130400150210ustar00rootroot00000000000000#!/usr/bin/env python # spawns a ddd session for each one found in mpilistjobs # nco-specific: sends SIGUSR1 to nodeid>0 processes # $Id$ # Usage: # ./ddd_mpd.py # -- spawn ddd sessions for each MPI process found via # mpdlistjobs for a particular MPI job. Before spawning, send SIGUSR1 # to the processes of rank > 0 (the non-manager nodes) to reduce user # tedium. If multiple jobs are found on MPD, prompt user to select # one of jobs. # -- If no jobs owned by the current user are found in mpd, # complain and exit. # # Prefer something else than ddd? Try changing the argument at the # call to mainthing(...). Support hasn't been checked for # command-line arguments other than ddd/gdb, so you may have to hack # spawnDebugger(...) as a short-term solution. # # Please direct feedback to the sourceforge forums for NCO. Thanks, -Daniel from os import environ, getuid, getpid, path, getcwd, popen3 import os class Job: pass def newJob(jid, username, host, pid, sid, rank, path): job = Job() job.jobid = jid job.username = username job.host = host job.pid = pid job.sid = sid job.rank = rank job.pgm = path return job def readJobInfo(jobtext): job = Job() #print "got job ", jobtext lines = jobtext.split("\n") for line in lines: pair = line.split("=") if len(pair) > 1: key,value = pair #print key.strip(),value.strip() exec "job."+key.strip()+"="+"\""+value.strip()+"\"" return job; def readJobListMPD(): joblist = [] jobI, jobO, jobE = popen3("mpdlistjobs") allinfo = jobO.read() for jobtext in allinfo.split("\n\n"): joblist.append(readJobInfo(jobtext)) return joblist def makeSampleJobList(): ## dummy for testing joblist = [] joblist.append(newJob( "21@dirt_3734", "wangd", "dirt", "11931", "11926", "0", "/home/wangd/nco/nco/mpi_bin/mpncwa")) joblist.append(newJob( "21@dirt_3734", "wangd", "dirt", "11929", "11927", "1", "/home/wangd/nco/nco/mpi_bin/mpncwa")) joblist.append(newJob( "21@dirt_3734", "wangd", "dirt", "11930", "11928", "2", "/home/wangd/nco/nco/mpi_bin/mpncwa")) # next two jobs should be culled joblist.append(newJob( "10@dirt_3734", "somebody", "dirt", "112", "110", "0", "/badpath/mpncbo")) joblist.append(newJob( "10@dirt_3734", "somebody", "dirt", "119", "111", "1", "/badpath/mpncbo")) joblist.append(newJob( "24@dirt_3734", "wangd", "dirt", "11951", "11946", "0", "/home/wangd/nco/nco/mpi_bin/mpncbo")) joblist.append(newJob( "24@dirt_3734", "wangd", "dirt", "11949", "11947", "1", "/home/wangd/nco/nco/mpi_bin/mpncbo")) joblist.append(newJob( "24@dirt_3734", "wangd", "dirt", "11950", "11948", "2", "/home/wangd/nco/nco/mpi_bin/mpncbo")) return joblist def cutoutJobs(joblist, jobids, paths): print "There seems to be more than one job in MPD. Which would you like?" pick = "" index = -1 while not pick in jobids: for i in range(len(jobids)): print i,jobids[i], paths[i] print "which would you like(0..",len(jobids)-1,")?", typed = raw_input() try: index = int(typed) except ValueError: pass if index not in range(len(jobids)): print "Sorry, bad choice: ",typed, " Try another." else: pick = jobids[index] print "Chose id:", pick, " path:",paths[index] # remove job objects that do not match joblist = filter((lambda j: j.jobid == pick), joblist) return joblist def spawnDebugger(progname, joblist, debug): shI, shO, shE = popen3("sh") children = filter(lambda j: j.rank != "0", joblist) for c in children: # resume the children first s = "kill -USR1 %s\n" % (c.pid) if not debug: shI.write(s) else: print s, print "Node 0 is pid:",filter(lambda j: j.rank == "0",joblist)[0].pid shI.write("\n") for job in joblist: try: #print job.jobid, job.pid, job.rank, job.pgm dummy = job.pgm dummy = job.pid s = "%s %s %s &\n" % (progname, job.pgm, job.pid) if not debug: shI.write(s) #else: print s, except AttributeError: continue shI.close() print shO.read().strip() print shE.read().strip() def mainthing(dbgprogname): joblist = readJobListMPD() #joblist = makeSampleJobList() # for simple testing # now, go ahead and spawn ddd jobs. # for now, just spit out the command line so we don't have to deal # with the process management. *sigh* ####print len(joblist) jobids = [] paths = [] joblist = filter(lambda j: hasattr(j, "jobid"), joblist) myname = os.popen("whoami").read().strip() joblist = filter(lambda j: j.username == myname, joblist) if len(joblist) < 1: print "No acceptable jobs found." return for job in joblist: ## check to see how many jobs there are if not job.jobid in jobids: jobids.append( job.jobid ) paths.append( job.pgm ) if len(jobids) > 1: joblist = cutoutJobs(joblist, jobids, paths) spawnDebugger(dbgprogname, joblist, False) #False for no debug ## ----------------- ## main program body ## ----------------- mainthing("ddd") # if you like gdb or dbx, you may wish to try something like: # # mainthing ("xterm -e gdb") # # You will probably want to spawn xterms for each gdb to avoid # managing multiple gdb sessions from a single terminal window. nco-4.5.4/bld/libnco_c++_tst.cc000066400000000000000000000026741264355130400161570ustar00rootroot00000000000000/* Purpose: Test NCO library libnco_c++ Usage: cd ~/nco/bld Linux: g++ -I../src/nco_c++ -o libnco_c++_tst libnco_c++_tst.cc -L${MY_LIB_DIR} -lnco_c++ AIX: All at once: xlC_r -bnoquiet -I../src/nco_c++ -I/usr/local/include -o libnco_c++_tst libnco_c++_tst.cc -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco_c++ -lnetcdf xlC_r -bnoquiet -I../src/nco_c++ -I/usr/local/include -o libnco_c++_tst -Wl,-blibpath:${MY_LIB_DIR}:/usr/lpp/xlopt:/usr/lib/threads:/usr/lib:/lib libnco_c++_tst.cc -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco_c++ -lnetcdf xlC_r -c -I../src/nco_c++ -I/usr/local/include -o libnco_c++_tst.o libnco_c++_tst.cc xlC_r -bnoquiet -o libnco_c++_tst libnco_c++_tst.o -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco_c++ -lnetcdf xlC_r -bnoquiet -o libnco_c++_tst libnco_c++_tst.o -L${NETCDF_LIB} -lnco_c++ -lnetcdf ld -o libnco_c++_tst libnco_c++_tst.o -L${MY_LIB_DIR},-lnco_c++ ld -o libnco_c++_tst libnco_c++_tst.o -L${MY_LIB_DIR},-lnco_c++ -L/usr/lpp/xlopt,-lxlopt,-lc libnco_c++_tst.o /lib/crt0_64.o */ #include // Standard C++ I/O streams cout, cin #include // Standard C++ string class #include // netCDF C interface #include // C++ interface to netCDF C library int main() { const nc_type nco_xtyp(nco_get_xtype(static_cast(1.0))); // [enm] External netCDF type std::cout << "INFO External netCDF type of prc_cmp variables will be " << nco_typ_sng(nco_xtyp) << std::endl; } nco-4.5.4/bld/libnco_tst.c000066400000000000000000000022101264355130400153460ustar00rootroot00000000000000/* Purpose: Test NCO library libnco Usage: cd ~/nco/bld Linux: gcc -I../src/nco -o libnco_tst libnco_tst.c -L${MY_LIB_DIR} -lnco AIX: All at once: xlc_r -bnoquiet -I../src/nco -I/usr/local/include -o libnco_tst libnco_tst.c -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco -lnetcdf xlc_r -bnoquiet -I../src/nco -I/usr/local/include -o libnco_tst -Wl,-blibpath:${MY_LIB_DIR}:/usr/lpp/xlopt:/usr/lib/threads:/usr/lib:/lib libnco_tst.c -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco -lnetcdf xlc_r -c -I../src/nco -I/usr/local/include -o libnco_tst.o libnco_tst.c xlc_r -bnoquiet -o libnco_tst libnco_tst.o -L${MY_LIB_DIR} -L${NETCDF_LIB} -lnco -lnetcdf xlc_r -bnoquiet -o libnco_tst libnco_tst.o -L${NETCDF_LIB} -lnco -lnetcdf ld -o libnco_tst libnco_tst.o -L${MY_LIB_DIR},-lnco ld -o libnco_tst libnco_tst.o -L${MY_LIB_DIR},-lnco -L/usr/lpp/xlopt,-lxlopt,-lc libnco_tst.o /lib/crt0_64.o */ #include #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main() { const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; (void)copyright_prn(CVS_Id,CVS_Revision); } nco-4.5.4/bld/nco.spec000066400000000000000000000252351264355130400145110ustar00rootroot00000000000000# Fedora RPMs are up-to-date! # http://cvs.fedoraproject.org/viewvc/devel/nco/nco.spec?view=co Name: nco Version: 4.5.4 Release: 1%{?dist} Summary: Programs that manipulate netCDF files Group: Applications/Engineering License: GPL3 URL: http://nco.sf.net/ # Obtain NCO version 4.5.4-1 tar.gz from Sourceforge using CVS: # cvs -d:pserver:anonymous@nco.cvs.sf.net:/cvsroot/nco login # cvs -z3 -d:pserver:anonymous@nco.cvs.sf.net:/cvsroot/nco co -r nco-4.5.4-1 -d nco-%{version} nco # tar czf nco-%{version}.tar.gz --exclude='nco-4.5.4/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude='ncap_yacc.[ch]' ./nco-%{version} Source0: nco-%{version}.tar.gz #Patch0: nco_install_C_headers.patch #Patch1: nco_find_udunits-dat.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: automake, autoconf, libtool BuildRequires: netcdf, netcdf-devel BuildRequires: udunits, udunits-devel # Required for ncap: BuildRequires: bison, flex # Required for ncap2: BuildRequires: gsl, gsl-devel #BuildRequires: antlr antlr-c++-devel # Following libraries required to DAP-enable NCO: BuildRequires: curl, curl-devel BuildRequires: libxml2, libxml2-devel BuildRequires: libdap, libdap-devel, libnc-dap, libnc-dap-devel %package devel Summary: Development files for NCO Group: Development/Libraries Requires: %{name} = %{version}-%{release} %description NCO is a suite of programs known as operators. The operators are stand-alone, command-line programs executable in a POSIX shell. Operators take one or more netCDF files as input, perform operations (e.g., averaging, hyperslabbing), and produce a netCDF output file. NCO was originally designed to manipulate and analyze climate data, though it works on any netCDF format datasets. %description devel This package contains NCO header files and static libraries. %prep %setup -q #%patch0 -p1 #%patch1 -p1 %build aclocal autoheader automake --foreign autoconf # Explicitly set system netCDF directories to override development netCDF # installations in, e.g., /usr/local export CPPFLAGS=-I%{_includedir}/netcdf-3 # Always put netcdf-3 on path and, for x86_64, add -L/usr/lib64, when present, to correctly resolve 32/64-bit libraries export LDFLAGS="-L%{_libdir}/netcdf-3 %( uname -m | egrep -q '_64$' && [ -d /usr/lib64 ] && echo '-L/usr/lib64' )" export CFLAGS="$RPM_OPT_FLAGS -fPIC" export CXXFLAGS="$RPM_OPT_FLAGS -fpermissive -fPIC" %configure --includedir=%{_includedir}/nco make %{?_smp_mflags} unset CPPFLAGS LDFLAGS CFLAGS CXXFLAGS %install rm -rf ${RPM_BUILD_ROOT} mkdir ${RPM_BUILD_ROOT} mkdir -p ${RPM_BUILD_ROOT}%{_includedir}/nco make install DESTDIR=${RPM_BUILD_ROOT} rm -f ${RPM_BUILD_ROOT}%{_libdir}/*.la rm -f ${RPM_BUILD_ROOT}%{_infodir}/dir rm -f ${RPM_BUILD_ROOT}%{_bindir}/mpnc* %clean rm -rf ${RPM_BUILD_ROOT} %post /sbin/ldconfig /sbin/install-info %{_infodir}/nco.info.gz \ %{_infodir}/dir 2>/dev/null || : %postun /sbin/ldconfig if [ "$1" = 0 ]; then /sbin/install-info --delete %{_infodir}/nco.info.gz \ %{_infodir}/dir 2>/dev/null || : fi %files %defattr(-,root,root,-) %doc doc/README doc/LICENSE doc/rtfm.txt %{_bindir}/* %{_mandir}/*/* %{_infodir}/* %{_libdir}/libnco*[0-9]*.so %files devel %defattr(-,root,root,-) %{_includedir}/nco %{_libdir}/libnco*.a %{_libdir}/libnco.so %{_libdir}/libnco_c++.so # %{_libdir}/libnco++.so %changelog * Thu Jan 07 2016 Charlie Zender - 4.5.4-1 - new upstream 4.5.4 * Sun Oct 18 2015 Charlie Zender - 4.5.3-1 - new upstream 4.5.3 * Sun Sep 06 2015 Charlie Zender - 4.5.2-1 - new upstream 4.5.2 * Fri Jul 10 2015 Charlie Zender - 4.5.1-1 - new upstream 4.5.1 * Thu Jun 11 2015 Charlie Zender - 4.5.0-1 - new upstream 4.5.0 * Thu May 21 2015 Charlie Zender - 4.4.9-1 - new upstream 4.4.9 * Mon Feb 09 2015 Charlie Zender - 4.4.8-1 - new upstream 4.4.8 * Wed Nov 26 2014 Charlie Zender - 4.4.7-1 - new upstream 4.4.7 * Wed Oct 01 2014 Charlie Zender - 4.4.6-1 - new upstream 4.4.6 * Tue Aug 26 2014 Charlie Zender - 4.4.5-1 - new upstream 4.4.5 * Thu May 29 2014 Charlie Zender - 4.4.4-1 - new upstream 4.4.4 * Thu Apr 02 2014 Charlie Zender - 4.4.3-1 - new upstream 4.4.3 * Thu Feb 20 2014 Charlie Zender - 4.4.2-1 - new upstream 4.4.2 * Thu Jan 29 2014 Charlie Zender - 4.4.1-1 - new upstream 4.4.1 * Thu Jan 09 2014 Charlie Zender - 4.4.0-1 - new upstream 4.4.0 * Wed Dec 06 2013 Charlie Zender - 4.3.9-1 - new upstream 4.3.9 * Wed Nov 06 2013 Charlie Zender - 4.3.8-1 - new upstream 4.3.8 * Thu Oct 17 2013 Charlie Zender - 4.3.7-1 - new upstream 4.3.7 * Fri Sep 27 2013 Charlie Zender - 4.3.6-1 - new upstream 4.3.6 * Fri Sep 20 2013 Charlie Zender - 4.3.5-1 - new upstream 4.3.5 * Thu Aug 01 2013 Charlie Zender - 4.3.4-1 - new upstream 4.3.4 * Wed Jul 24 2013 Charlie Zender - 4.3.3-1 - new upstream 4.3.3 * Fri Jul 05 2013 Charlie Zender - 4.3.2-1 - new upstream 4.3.2 * Wed May 01 2013 Charlie Zender - 4.3.1-1 - new upstream 4.3.1 * Thu Mar 28 2013 Charlie Zender - 4.3.0-1 - new upstream 4.3.0 * Tue Mar 19 2013 Charlie Zender - 4.2.6-1 - new upstream 4.2.6 * Mon Jan 28 2013 Charlie Zender - 4.2.5-1 - new upstream 4.2.5 * Mon Jan 21 2013 Charlie Zender - 4.2.4-1 - new upstream 4.2.4 * Tue Nov 13 2012 Charlie Zender - 4.2.3-1 - new upstream 4.2.3 * Mon Oct 29 2012 Charlie Zender - 4.2.2-1 - new upstream 4.2.2 * Thu Aug 02 2012 Charlie Zender - 4.2.1-1 - new upstream 4.2.1 * Mon Jun 11 2012 Charlie Zender - 4.2.0-1 - new upstream 4.2.0 * Thu Mar 29 2012 Charlie Zender - 4.1.0-1 - new upstream 4.1.0 * Mon Feb 13 2012 Charlie Zender - 4.0.9-1 - new upstream 4.0.9 * Fri Mar 21 2011 Charlie Zender - 4.0.8-1 - new upstream 4.0.8 * Fri Jan 21 2011 Charlie Zender - 4.0.7-1 - new upstream 4.0.7 * Fri Jan 14 2011 Charlie Zender - 4.0.6-1 - new upstream 4.0.6 * Thu Oct 13 2010 Charlie Zender - 4.0.5-1 - new upstream 4.0.5 * Fri Sep 24 2010 Charlie Zender - 4.0.4-1 - new upstream 4.0.4 * Thu Sep 02 2010 Charlie Zender - 4.0.3-1 - new upstream 4.0.3 * Sun Jun 27 2010 Charlie Zender - 4.0.2-1 - new upstream 4.0.2 * Mon Apr 05 2010 Charlie Zender - 4.0.1-1 - new upstream 4.0.1 * Tue Jan 05 2010 Charlie Zender - 4.0.0-1 - new upstream 4.0.0 * Tue Jul 14 2009 Charlie Zender - 3.9.9-1 - new upstream 3.9.9 * Mon Mar 23 2009 Charlie Zender - 3.9.8-1 - new upstream 3.9.8 * Wed Mar 18 2009 Charlie Zender - 3.9.7-1 - new upstream 3.9.7 * Thu Jan 22 2009 Charlie Zender - 3.9.6-1 - new upstream 3.9.6 * Thu Oct 30 2008 Charlie Zender - 3.9.5-2 - buildrequire GSL * Sun May 11 2008 Charlie Zender - 3.9.5-1 - new upstream 3.9.5 * Mon Mar 03 2008 Charlie Zender - 3.9.4-1 - new upstream 3.9.4 * Sat Dec 08 2007 Charlie Zender - 3.9.3-1 - new upstream 3.9.3 * Wed Aug 29 2007 Charlie Zender - 3.9.2-1 - new upstream 3.9.2 * Fri Jun 29 2007 Charlie Zender - 3.9.1-1 - new upstream 3.9.1 * Tue Jun 19 2007 Daniel L. Wang - 3.9.0-1 - fix LDFLAGS to detect lib64 usage (workaround buggy libtool) * Fri May 25 2007 Charlie Zender - 3.9.0-1 - new upstream 3.9.0 * Fri Apr 20 2007 Charlie Zender - 3.2.0-1 - new upstream 3.2.0 (includes rmssdn arithmetic bugfix) * Sat Mar 10 2007 Charlie Zender - 3.1.9-1 - new 3.1.9 to synchronize upstream, debs, and RPMs * Sat Mar 10 2007 Charlie Zender - 3.1.8-1 - clean up nco.spec - verify ncap2 is built and distributed - buildrequire libdap, libdap-devel, libnc-dap, libnc-dap-devel - new upstream 3.1.8 * Sat Nov 11 2006 Charlie Zender - 3.1.7-1 - Merge Fedora nco.spec UDUnits patch into upstream configure.in - new upstream 3.1.7 * Sat Sep 2 2006 Ed Hill - 3.1.5-3 - br bison as well * Sat Sep 2 2006 Ed Hill - 3.1.5-2 - buildrequire flex * Sat Sep 2 2006 Ed Hill - 3.1.5-1 - new upstream 3.1.5 * Fri Apr 21 2006 Ed Hill - 3.1.2-1 - update to new upstream 3.1.2 * Thu Feb 16 2006 Ed Hill - 3.0.2-2 - rebuild for new gcc * Mon Sep 5 2005 Ed Hill - 3.0.2-1 - update to new upstream 3.0.2 * Wed Aug 3 2005 Ed Hill - 3.0.1-4 - remove (hopefully only temporarily) opendap support * Thu Jul 21 2005 Ed Hill - 3.0.1-3 - add LICENSE file * Sat Jul 9 2005 Ed Hill - 3.0.1-2 - add BuildRequires: opendap-devel * Sun Jun 19 2005 Ed Hill - 3.0.1-1 - update to upstream 3.0.1 - comment & fixes for BuildRequires * Sat Apr 23 2005 Ed Hill - 3.0.0-2 - add BuildRequires and fix CXXFLAGS per Tom Callaway - add udunits patch per Tom Callaway * Sat Apr 16 2005 Ed Hill - 3.0.0-1 - update to ver 3.0.0 - devel package fixes per D.M. Kaplan and M. Schwendt - fix info post/postun * Sun Dec 5 2004 Ed Hill - 0:2.9.9-0.fdr.4 - sync with netcdf-3.6.0beta6-0.fdr.0 - split into devel and non-devel * Wed Dec 1 2004 Ed Hill - 0:2.9.9-0.fdr.3 - sync with netcdf-0:3.5.1-0.fdr.11 - added '-fpermissive' for GCC 3.4.2 warnings - added "Provides:nco-devel" for the headers and libs * Mon Oct 4 2004 Ed Hill - 0:2.9.9-0.fdr.2 - Add some of Michael Schwendts suggested INC/LIB path fixes and sync with the netcdf-3.5.1-0.fdr.10 dependency. * Thu Sep 23 2004 Ed Hill - 0:2.9.9-0.fdr.1 - add NETCDF_INC and NETCDF_LIB to work on systems where old versions of netcdf may exist in /usr/local * Wed Sep 8 2004 Ed Hill - 0:2.9.9-0.fdr.0 - updated to ver 2.9.9 * Sat Aug 7 2004 Ed Hill - 0:2.9.8-0.fdr.0 - updated to ver 2.9.8 * Sat Jul 17 2004 Ed Hill - 0:2.9.7-0.fdr.2 - removed unneeded %ifarch * Sat Jul 17 2004 Ed Hill - 0:2.9.7-0.fdr.1 - Add %post,%postun * Sat Jul 17 2004 Ed Hill - 0:2.9.7-0.fdr.0 - Initial working version * Wed Mar 1 2000 Charlie Zender - 1.1.45-1 - Added original nco.spec to bld directory nco-4.5.4/bld/nco_dst.pl000077500000000000000000000503511264355130400150440ustar00rootroot00000000000000#!/usr/bin/perl # Purpose: Perform NCO distributions # Script relies heavily on SSH connectivity between ${HOST}, ${CVSROOT}, and $www_mch # Usage: # Export tagged, public versions # /usr/bin/scp ${DATA}/nco-4.5.4.tar.gz zender,nco@web.sf.net:/home/project-web/nco/htdocs/src # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.5.4 # Build, do not release on SF # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --sf nco-4.5.4 # Build, release on SF # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --nst_all nco-4.5.4 # Install, do not build # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln --nst_all nco-4.5.4 # Build and install # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_cnt nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --acd_prs nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cgd_cnt nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --cray_prs nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --bbl_cnt nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --blk_cnt nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --dat_cnt nco-4.5.4 # ${HOME}/nco/bld/nco_dst.pl --dbg=2 --cln --ute_prs nco-4.5.4 # Export daily snapshot # ${HOME}/nco/bld/nco_dst.pl --dbg=2 # ${HOME}/nco/bld/nco_dst.pl --dbg=1 --cln --nst # Machines requiring interactive builds # cd ${HOME}/nco;cvs update;cd bld;make;make tst # scp ${HOME}/nco/bld/nco_dst.pl dust.ess.uci.edu:/home/zender/nco/bld/nco_dst.pl BEGIN{ unshift @INC,$ENV{'HOME'}.'/perl'; # Location of csz.pl and DBG.pm HaS98 p. 170 } # end BEGIN my $CVS_Header='$Header$'; # Specify modules use strict; # Protect all namespaces use Getopt::Long; # GNU-style getopt use File::Basename; # For parsing filenames # Personal modules use DBG; # Debugging constants require 'csz.pl'; # Contains date_time() # Set output flushing to help debugging on hard crashes # These options update filehandle after every output statement select((select(STDOUT),$|=1)[0]); # Camel book, p. 110 select((select(STDERR),$|=1)[0]); # Camel book, p. 110 # Timing information my ($lcl_date_time,$srt_usr_tm,$srt_sys_tm,$srt_child_usr_tm,$srt_child_sys_tm); ($lcl_date_time,$srt_usr_tm,$srt_sys_tm,$srt_child_usr_tm,$srt_child_sys_tm)=time_srt(); printf STDOUT ("Start user time %f\n",$srt_usr_tm); # Declare local variables my ($idx,$rcd); my ($prg_nm,$prg_dsc,$prg_vrs,$prg_date); my ($pth_in,$fl_sfx); my ($dst_vrs,$dst_fl,$doc_fl); my ($dst_fl_chg,$dst_fl_deb,$dst_fl_doc,$dst_fl_dsc,$dst_fl_tgz); my ($nco_vrs,$nco_vrs_mjr,$nco_vrs_mnr,$nco_vrs_pch); my ($dly_snp); my ($mk_cmd,$tar_cmd,$rmt_mch); my ($rsh_cmd,$rcp_cmd,$cp_cmd,$rm_cmd,$mkdir_cmd,$cvs_cmd); # Set defaults my $False=0; my $True=1; my $CVS_Date='$Date$'; my $CVS_Id='$Id$'; my $CVS_Revision='$Revision$'; my $CVSROOT='zender@nco.cvs.sf.net:/cvsroot/nco'; # CVS repository my $DATA=$ENV{'DATA'}; my $HOME=$ENV{'HOME'}; my $HOST=$ENV{'HOST'}; my $PVM_ARCH=$ENV{'PVM_ARCH'}; my $bld=$False; # Option bld; Whether to rebuild netCDF distribution my $cp_cmd='cp -p -f'; # Command that behaves like cp my $cvs_cmd='cvs'; # Command that behaves like cvs (Use cvs -t for verbose output) my $data_nm=$ENV{'DATA'}; my $main_trunk_tag='nco'; my $mkdir_cmd='mkdir -p'; # Command that behaves like mkdir my $mdl_sng='nco'; # Base of module name my $rm_cmd='rm -f'; # Command that behaves like rm my $rcp_cmd='scp -p'; # Command that behaves like rcp my $rcp_cmd_no_prs_prm='scp'; # Command that behaves like rcp and does not try to preserve permissions my $rsh_cmd='ssh'; # Command that behaves like rsh my $usr_nm=$ENV{'USER'}; my $vrs_tag=''; my $www_mch='dust.ess.uci.edu'; # WWW machine for package my $www_drc='/var/www/html/nco'; # WWW directory for package my $www_mch_mrr='web.sf.net'; # WWW machine for package mirror my $www_drc_mrr='/home/project-web/nco/htdocs'; # WWW directory for package mirror # Set defaults for command line arguments my $sf=$False; # Release tarball and update SourceForge my $cln=$True; # GNU standard Makefile option `clean' my $dbg_lvl=0; my $dst_cln=$False; # GNU standard Makefile option `distclean' my $nst_all=$False; # Option nst_all; Install version on all machines my $acd_cnt=$False; # Option acd_cnt; Install version in acd contrib my $acd_prs=$False; # Option acd_prs; Install version in acd personal my $bbl_cnt=$False; # Option bbl_cnt; Install version in babyblue contrib my $blk_cnt=$False; # Option blk_cnt; Install version in blackforest contrib my $bls_cnt=$False; # Option bls_cnt; Install version in bluesky contrib my $dat_cnt=$False; # Option dat_cnt; Install version in dataproc contrib my $ute_prs=$False; # Option ute_prs; Install version in ute personal my $cgd_cnt=$False; # Option cgd_cnt; Install version in CGD contrib my $cgd_prs=$False; # Option cgd_prs; Install version in CGD personal my $cray_prs=$False; # Option cray_prs; Install version in Cray personal # Derived fields if($PVM_ARCH =~ m/SUN/){ # See Camel p. 81 for =~ and m// $tar_cmd='gtar'; $mk_cmd='make'; }elsif($PVM_ARCH =~ m/CRAY/){ $tar_cmd='tar'; $mk_cmd='gnumake'; }else{ $tar_cmd='tar'; $mk_cmd='make'; } # endelse if($data_nm eq ''){$data_nm='/data/'.$usr_nm;} my $dst_pth_pfx=$data_nm; # Parent of build directory if($dst_pth_pfx eq $HOME){die "$prg_nm: ERROR \$dst_pth_pfx eq $dst_pth_pfx";} # This could be disastrous if($rm_cmd =~ m/( -r)|( -R)|( --recursive)/){die "$prg_nm: ERROR Dangerous setting \$rm_cmd eq $rm_cmd";} # This would be disastrous # $CVSROOT=':pserver:anonymous@nco.cvs.sf.net:/cvsroot/nco'; # CVS repository $prg_dsc='NCO distribution maker'; # Program description ($prg_nm,$prg_vrs)=$CVS_Id =~ /: (.+).pl,v ([\d.]+)/; # Program name and version $prg_vrs.='*' if length('$Locker$ ') > 12; # Tack '*' if it is not checked in into CVS. ($prg_nm,$pth_in,$fl_sfx)=fileparse($0,''); # $0 is program name Camel p. 136 if(length($CVS_Date) > 6){($prg_date)=unpack '@7 a19',$CVS_Date;}else{$prg_date='Unknown';} # Parse command line arguments: '!' means Boolean, '|' is OR, '=' specifies required argument: 'i' is integer, 'f' is float, 's' is string $rcd=GetOptions( # man Getopt::GetoptLong 'acd_cnt!' => \$acd_cnt, 'acd_prs!' => \$acd_prs, 'bld!' => \$bld, 'sf!' => \$sf, 'bbl_cnt!' => \$bbl_cnt, 'blk_cnt!' => \$blk_cnt, 'cgd_cnt!' => \$cgd_cnt, 'cgd_prs!' => \$cgd_prs, 'clean!' => \$cln, 'cln!' => \$cln, 'cray_prs!' => \$cray_prs, 'dat_cnt!' => \$dat_cnt, 'dbg_lvl=i' => \$dbg_lvl, 'distclean!' => \$dst_cln, 'dst_cln!' => \$dst_cln, 'nst_all!' => \$nst_all, 'ute_prs!' => \$ute_prs, ); # end GetOptions arguments # Parse positional arguments, if present if($#ARGV > 0){die "$prg_nm: ERROR Called with $#ARGV+1 positional arguments, need no more than 1\n";} elsif($#ARGV == 0){$vrs_tag=$ARGV[0];} # Version name is first positional argument, if present. if($nst_all){ $cgd_prs=$True; $cgd_cnt=$True; $acd_prs=$True; $acd_cnt=$True; $ute_prs=$True; $bbl_cnt=$True; $blk_cnt=$True; $dat_cnt=$True; $cray_prs=$True; } # endif # Print initialization state if($dbg_lvl >= 1){print ("$prg_nm: $prg_dsc, version $prg_vrs of $prg_date\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$vrs_tag = $vrs_tag\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$dbg_lvl = $dbg_lvl\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$bld = $bld\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$sf = $sf\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$cln = $cln\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$dst_cln = $dst_cln\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$nst_all = $nst_all\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$mk_cmd = $mk_cmd\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$tar_cmd = $tar_cmd\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$acd_cnt = $acd_cnt\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$acd_prs = $acd_prs\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$cgd_cnt = $cgd_cnt\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$cgd_prs = $cgd_prs\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$cray_prs = $cray_prs\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$bbl_cnt = $bbl_cnt\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$blk_cnt = $blk_cnt\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$dat_cnt = $dat_cnt\n");} # endif dbg if($dbg_lvl >= 2){print ("$prg_nm: \$ute_prs = $ute_prs\n");} # endif dbg if($vrs_tag eq $main_trunk_tag || $vrs_tag eq ''){$dly_snp=$True;}else{$dly_snp=$False;} # NCO is distributed using the `cvs export' command, so version tag to be distributed must be supplied to this script if($dly_snp){ # The version tag is blank or of the form `nco' $nco_vrs=YYYYMMDD(); $dst_vrs=$mdl_sng.'-'.$nco_vrs; }else{ # The version tag is of the form `nco-1_2_0' my ($tag_sng); my ($nco_psn); $tag_sng=$vrs_tag; $tag_sng=~s/_/./g; # Use =~ to bind $tag_sng to s/// Camel p. 81 $nco_vrs=substr($tag_sng,length($mdl_sng)+1,length($tag_sng)-length($mdl_sng)-1); # The +/- 1 accounts for the dash '-' ($nco_vrs_mjr,$nco_vrs_mnr,$nco_vrs_pch)=split(/\./,$nco_vrs); $dst_vrs=$mdl_sng.'-'.$nco_vrs; if($nco_vrs_mjr < 1 || $nco_vrs_mjr > 4){die "$prg_nm: ERROR $nco_vrs_mjr < 1 || $nco_vrs_mjr > 3"}; } # endelse $doc_fl="$HOME/nco/doc/nco.dvi $HOME/nco/doc/nco.html $HOME/nco/doc/nco.ps $HOME/nco/doc/nco.pdf $HOME/nco/doc/nco.txt $HOME/nco/doc/nco.xml"; # Derived documentation $dst_fl=$dst_vrs.'.tar.gz'; # Standard tarball distribution $dst_fl_chg=$mdl_sng.'_'.$nco_vrs.'-1_*.changes'; # Debian changes $dst_fl_deb=$mdl_sng.'_'.$nco_vrs.'-1_*.deb'; # Debian executables and libraries $dst_fl_doc=$mdl_sng.'-doc_'.$nco_vrs.'-1_all.deb'; # Debian documentation (deprecated) $dst_fl_dsc=$mdl_sng.'_'.$nco_vrs.'-1.dsc'; # Debian description $dst_fl_tgz=$mdl_sng.'_'.$nco_vrs.'.orig.tar.gz'; # Debian tarball my $dst_pth_bld=$dst_pth_pfx.'/'.$dst_vrs; # Build directory if($dbg_lvl >= 1){ print STDOUT "$prg_nm: Version to release: $vrs_tag\n"; print STDOUT "$prg_nm: Distribution version: $dst_vrs\n"; print STDOUT "$prg_nm: Distribution file: $dst_fl\n"; print STDOUT "$prg_nm: NCO version: $nco_vrs\n"; print STDOUT "$prg_nm: NCO major version: $nco_vrs_mjr\n"; print STDOUT "$prg_nm: NCO minor version: $nco_vrs_mnr\n"; print STDOUT "$prg_nm: NCO patch version: $nco_vrs_pch\n"; } # end if dbg # Build distribution from scratch if($bld){ cmd_prc("$rm_cmd -r $dst_pth_bld"); # Remove contents of current directory, if any # cmd_prc("$mkdir_cmd $dst_pth_bld"); # Create directory chdir $dst_pth_pfx or die "$prg_nm: ERROR unable to chdir to $dst_pth_pfx: $!\n"; # $! is system error string if($CVSROOT =~ m/pserver/){cmd_prc("$cvs_cmd -d $CVSROOT login");} # Login first if($dly_snp){ cmd_prc("$cvs_cmd -d $CVSROOT export -kkv -D \"1 second ago\" -d $dst_vrs nco"); # Export }else{ cmd_prc("$cvs_cmd -d $CVSROOT export -kkv -r $vrs_tag -d $dst_vrs nco"); # Export } # endelse cmd_prc("printf $nco_vrs > $dst_pth_bld/doc/VERSION"); # Stamp version in VERSION file in exported files cmd_prc("printf $nco_vrs > $HOME/nco/doc/VERSION"); # Stamp version in VERSION file in development directory # cmd_prc("ln -s $dst_pth_bld/bld/nco.spec $dst_pth_bld/bld/nco-$nco_vrs.spec"); # Stamp version in VERSION file # Make sure documentation files are up to date my $bld_pth=$dst_pth_pfx.'/'."$dst_vrs".'/bld'; chdir $bld_pth or die "$prg_nm: ERROR unable to chdir to $bld_pth: $!\n"; # $! is system error string cmd_prc("$mk_cmd doc"); cmd_prc("$mk_cmd clean"); # Set up FTP server chdir $dst_pth_pfx or die "$prg_nm: ERROR unable to chdir to $dst_pth_pfx: $!\n"; # $! is system error string cmd_prc("$cp_cmd $doc_fl ./$dst_vrs/doc"); # Copy derived documentation to source directory cmd_prc("$tar_cmd cvzf $dst_fl --exclude='nco-4.5.4/debian*' --exclude='.cvsignore' --exclude=ncap_lex.c --exclude=ncap_yacc.[ch] ./$dst_vrs"); # Create gzipped tarfile cmd_prc("$rsh_cmd $www_mch $rm_cmd $www_drc/src/$dst_fl"); # Remove any distribution with same name if($dly_snp){cmd_prc("$rsh_cmd $www_mch $rm_cmd -r $www_drc/src/nco-????????.tar.gz");} # Remove previous daily snapshots from WWW server cmd_prc("$rcp_cmd $dst_fl $www_mch:$www_drc/src"); # Copy local tarfile to WWW server cmd_prc("$rcp_cmd $DATA/$dst_fl_chg $DATA/$dst_fl_deb $DATA/$dst_fl_dsc $DATA/$dst_fl_tgz $www_mch:$www_drc/src"); # Copy Debian files to WWW server # Full release procedure (public releases only) includes update Web pages if(!$dly_snp){ cmd_prc("$rsh_cmd $www_mch $rm_cmd $www_drc/nco.tar.gz"); cmd_prc("$rsh_cmd $www_mch \"cd $www_drc; ln -s -f ./src/$dst_fl nco.tar.gz\""); cmd_prc("$rcp_cmd $dst_pth_bld/doc/index.shtml $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/nco.png $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/nco_news.shtml $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/nco.html $dst_pth_bld/doc/nco.info* $dst_pth_bld/doc/nco.dvi $dst_pth_bld/doc/nco.pdf $dst_pth_bld/doc/nco.ps $dst_pth_bld/doc/nco.texi $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/README $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/TODO $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/VERSION $www_mch:$www_drc"); cmd_prc("$rcp_cmd $dst_pth_bld/doc/ChangeLog $www_mch:$www_drc"); } # endif # Update SourceForge mirror # Use rcp_cmd_no_prs_prm because scp appears to quit without notice if too many warnings errors occur copying first files # Usually scp_cmd includes -p switch to preserve permissions and times, but sourceforge server does not allow this # Hence it generates warnings when used with -p, and is not properly updated if($sf){ cmd_prc("$rcp_cmd_no_prs_prm $dst_pth_bld/doc/index.shtml $dst_pth_bld/doc/nco.png $dst_pth_bld/doc/nco_news.shtml $dst_pth_bld/doc/README $dst_pth_bld/doc/TODO $dst_pth_bld/doc/VERSION $dst_pth_bld/doc/ChangeLog $usr_nm,nco\@$www_mch_mrr:$www_drc_mrr"); cmd_prc("$rcp_cmd_no_prs_prm $dst_pth_bld/doc/nco.html $dst_pth_bld/doc/nco.info* $dst_pth_bld/doc/nco.dvi $dst_pth_bld/doc/nco.pdf $dst_pth_bld/doc/nco.ps $dst_pth_bld/doc/nco.ps $dst_pth_bld/doc/nco.texi $usr_nm,nco\@$www_mch_mrr:$www_drc_mrr"); cmd_prc("$rcp_cmd_no_prs_prm $dst_pth_pfx/$dst_fl $usr_nm,nco\@$www_mch_mrr:$www_drc_mrr/src"); # Copy tarball to WWW server # 20140529: Disable Debian copying until .debs built again # cmd_prc("$rcp_cmd_no_prs_prm $dst_pth_pfx/$dst_fl $DATA/$dst_fl_chg $DATA/$dst_fl_deb $DATA/$dst_fl_dsc $DATA/$dst_fl_tgz $usr_nm,nco\@$www_mch_mrr:$www_drc_mrr/src"); # Copy Debian files to WWW server # Shell commands on SourceForge disabled 20081018 # cmd_prc("$rsh_cmd $www_mch_mrr \"cd $www_drc_mrr; ln -s -f ./src/$dst_fl nco.tar.gz\""); } # endif SourceForge # Housekeeping if($cln){cmd_prc("$rm_cmd $dst_pth_pfx/$dst_fl");} # Remove local tarfile if($dst_cln){cmd_prc("$rm_cmd -r $dst_pth_bld");} # Remove local distribution # Sanity check cmd_prc("$rsh_cmd $www_mch ls -l $www_drc"); } # endif bld if($acd_prs){ $rmt_mch='acd.ucar.edu'; print STDOUT "\n$prg_nm: Updating private NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"cd ~/nco;$cvs_cmd update\""); cmd_prc("$rsh_cmd $rmt_mch \"cd ~/nco/bld;make cln all tst\""); # Unfortunately, sudo does not work at all with rsh # cmd_prc("$rsh_cmd $rmt_mch \"sudo cp /gs/zender/bin/LINUX/nc* /usr/local/bin\""); print STDOUT "$prg_nm: Done updating private NCO binaries on $rmt_mch\n\n"; } # endif acd_prs if($acd_cnt){ $rmt_mch='garcia.acd.ucar.edu'; print STDOUT "\n$prg_nm: Updating private NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"cd ~/nco;/local/bin/$cvs_cmd update\""); cmd_prc("$rsh_cmd $rmt_mch \"cd ~/nco/bld;/local/bin/gmake cln all tst\""); # Unfortunately, sudo does not work at all with rsh # cmd_prc("$rsh_cmd $rmt_mch \"sudo cp /a1/zender/bin/ALPHA/nc* /usr/local/bin\""); print STDOUT "$prg_nm: Done updating private NCO binaries on $rmt_mch\n\n"; } # endif acd_cnt if($cgd_cnt){ $rmt_mch='sanitas.cgd.ucar.edu'; # $rsh_cmd $rmt_mch 'printf $PVM_ARCH' print STDOUT "\n$prg_nm: Updating contrib NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;gtar -xvzf nco.tar.gz;rm nco.tar.gz\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /contrib/nco-1.1/bin; setenv MY_LIB_DIR /contrib/nco-1.1/lib; setenv MY_OBJ_DIR /usr/tmp/$usr_nm/$dst_vrs/obj; gmake cln all test\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif cgd_cnt if($dat_cnt){ $rmt_mch='dataproc.ucar.edu'; # $rsh_cmd $rmt_mch 'printf $PVM_ARCH' print STDOUT "\n$prg_nm: Updating contrib NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;tar -xvzf nco.tar.gz;rm nco.tar.gz\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /contrib/nco-1.1/bin; setenv MY_LIB_DIR /contrib/nco-1.1/lib; setenv MY_OBJ_DIR /usr/tmp/$usr_nm/$dst_vrs/obj; gmake cln all tst\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif dat_cnt if($bbl_cnt){ $rmt_mch='babyblue.ucar.edu'; # $rsh_cmd $rmt_mch 'printf $PVM_ARCH' print STDOUT "\n$prg_nm: Updating contrib NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;gunzip nco.tar.gz;tar -xvf nco.tar;rm nco.tar\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /home/blackforest/$usr_nm/bin/AIX; setenv MY_LIB_DIR /home/blackforest/$usr_nm/lib/AIX; setenv MY_OBJ_DIR /home/blackforest/$usr_nm/obj/AIX; setenv NETCDF_INC /usr/local/include; setenv NETCDF_LIB /usr/local/lib32/r4i4; gmake cln all tst\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif bbl_cnt if($blk_cnt){ $rmt_mch='blackforest.ucar.edu'; # $rsh_cmd $rmt_mch 'printf $PVM_ARCH' print STDOUT "\n$prg_nm: Updating contrib NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;gunzip nco.tar.gz;tar -xvf nco.tar;rm nco.tar\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /home/blackforest/$usr_nm/bin/AIX; setenv MY_LIB_DIR /home/blackforest/$usr_nm/lib/AIX; setenv MY_OBJ_DIR /home/blackforest/$usr_nm/obj/AIX; setenv NETCDF_INC /usr/local/include; setenv NETCDF_LIB /usr/local/lib32/r4i4; gmake cln all tst\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif blk_cnt if($ute_prs){ $rmt_mch='utefe.ucar.edu'; # utefe and ute are cross-mounted, utefe is for interactive logins # $rsh_cmd $rmt_mch 'printf $PVM_ARCH' print STDOUT "\n$prg_nm: Updating personal NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;tar -xvzf nco.tar.gz;rm nco.tar.gz\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /home/ute/$usr_nm/bin/SGIMP64/bin; setenv MY_LIB_DIR /home/ute/$usr_nm/bin/SGIMP64/lib; setenv MY_OBJ_DIR /usr/tmp/$usr_nm/$dst_vrs/obj; gmake cln all tst\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif ute_prs if($cray_prs){ $rmt_mch='ouray.ucar.edu'; print STDOUT "\n$prg_nm: Updating private NCO on $rmt_mch...\n"; cmd_prc("$rsh_cmd $rmt_mch \"$rm_cmd -r /usr/tmp/$usr_nm/nco*\""); cmd_prc("$rsh_cmd $rmt_mch \"$mkdir_cmd /usr/tmp/$usr_nm/$dst_vrs/obj\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm;gunzip nco.tar.gz;tar -xvf nco.tar;rm nco.tar*\""); cmd_prc("$rsh_cmd $rmt_mch \"cd /usr/tmp/$usr_nm/$dst_vrs/bld; setenv MY_BIN_DIR /home/ouray0/$usr_nm/bin/CRAY; setenv MY_LIB_DIR /usr/tmp/$usr_nm/$dst_vrs/lib; setenv MY_OBJ_DIR /usr/tmp/$usr_nm/$dst_vrs/obj; gnumake cln all tst\""); print STDOUT "$prg_nm: Done updating contrib NCO on $rmt_mch\n\n"; } # endif cray_prs nco-4.5.4/bld/pbuilder-sid000077500000000000000000000016501264355130400153620ustar00rootroot00000000000000#!/bin/sh # Purpose: Use pbuilder to build packages in a chroot environment # Script from Jamin W. Collins BTS: #255165 # Name this script 'pbuilder-woody', 'pbuilder-sid', 'pbuilder-sarge', 'pbuilder-experimental' etc. OPERATION=$1 DISTRIBUTION=`basename $0 | cut -f2 -d '-'` PROCEED=false BASE_DIR="/chroot/pbuilder" case $OPERATION in create|update|build|clean|login|execute|dumpconfig ) PROCEED=true ;; esac if ( $PROCEED == true ) then shift pbuilder $OPERATION --distribution $DISTRIBUTION --debootstrap debootstrap --basetgz $BASE_DIR/$DISTRIBUTION/$DISTRIBUTION-base.tgz --override-config --configfile $BASE_DIR/$DISTRIBUTION/pbuilderrc --buildresult $BASE_DIR/$DISTRIBUTION/result $@ else echo "Invalid command..." echo "Valid commands are:" echo " create" echo " update" echo " build" echo " clean" echo " login" echo " execute" echo " dumpconfig" exit 1 fi nco-4.5.4/bld/pvmgetarch000077500000000000000000000157411264355130400151450ustar00rootroot00000000000000#!/bin/sh # $Id$ # Purpose: Generate PVM architecture string # Usage: # cp ~/sh/pvmgetarch ~/nco/bld/pvmgetarch # cp ~/sh/pvmgetarch ~/aer/pvmgetarch # scp ~/sh/pvmgetarch dust.ess.uci.edu:/var/www/html/dead/pvmgetarch # This is a heuristic thing that may need to be tuned from time # to time. I don't know of a real solution to determining the # machine type. # Notes: # 1. Local people mess with things. # 2. It's good to try a few things for robustness. # 3. Don't use test -x # 08 Apr 1993 Robert Manchek manchek@CS.UTK.EDU. # 24 Aug 1994 last revision # 28 Jul 1995 release 3.3.8 # # begin section that may need to be tuned ARCH=UNKNOWN # # determine the machine type from scratch # if [ -f /bin/uname -o -f /usr/bin/uname \ -o -f /bin/uname.exe -o -f /usr/bin/uname.exe ]; then if [ -f /bin/uname ]; then os="`/bin/uname -s`" ht="`/bin/uname -m`" ov="`/bin/uname -v`" elif [ -f /usr/bin/uname ]; then os="`/usr/bin/uname -s`" ht="`/usr/bin/uname -m`" ov="`/usr/bin/uname -v`" elif [ -f /bin/uname.exe ]; then os="`/bin/uname.exe -s`" ht="`/bin/uname.exe -m`" ov="`/bin/uname.exe -v`" else os="`/usr/bin/uname.exe -s`" ht="`/usr/bin/uname.exe -m`" ov="`/usr/bin/uname.exe -v`" fi case "$os,$ht" in SunOS,sun3* ) ARCH=SUN3 ;; SunOS,sun4* ) ARCH=SUN4 ;; SunOS,i86pc ) ARCH=X86SOL2 ;; ULTRIX,RISC ) ARCH=PMAX ;; ULTRIX,VAX ) ARCH=UVAX ;; AIX*,* ) ARCH=RS6K ;; *HP*,9000/[2345]* ) ARCH=HP300 ;; *HP*,9000/[78]* ) ARCH=HPPA ;; IRIX,* ) ARCH=SGI ;; IRIX64,* ) ARCH=SGI64 ;; *OSF*,alpha ) ARCH=ALPHA ;; # 20031116 csz++ Implement AMD Linux,x86_64 ) ARCH=LINUXAMD64 ;; # csz-- Linux,alpha ) ARCH=LINUXALPHA ;; CRSOS,smp ) ARCH=CRAYSMP ;; *,paragon ) ARCH=PGON ;; dgux,AViiON ) ARCH=DGAV ;; *,88k ) ARCH=E88K ;; *,mips ) ARCH=MIPS ;; *,CRAY-2 ) ARCH=CRAY2 ;; Linux,i[3456]86 ) ARCH=LINUX ;; Linux,sparc) ARCH=LINUXSPARC ;; BSD/OS,i[3456]86 ) ARCH=BSD386 ;; FreeBSD,i386 ) ARCH=FREEBSD ;; # 20020812 csz++ Implement MACOSX Darwin,Power* ) ARCH=MACOSX ;; # csz-- # 20100705 csz++ Implement OS X on PC chips Darwin,x86_64 ) ARCH=MACOSX ;; # csz-- # 20020812 csz++ deprecate SX3 in favor of NECSX # SUPER-UX,SX-3 ) ARCH=SX3 ;; SUPER-UX,SX-* ) ARCH=NECSX ;; # csz-- uts,* ) ARCH=UTS2 ;; realix,M88* ) ARCH=M88K ;; DomainOS,DN* ) ARCH=APOLLO ;; OS/2,i[3456]86 ) ARCH=OS2 ;; esac fi if [ "$ARCH" = UNKNOWN ]; then if [ -f /bin/arch ]; then case "`/bin/arch`" in ksr1 ) ARCH=KSR1 ;; sun2 ) ARCH=SUN2 ;; sun3 ) ARCH=SUN3 ;; sun4 ) ARCH=SUN4 ;; esac fi fi if [ "$ARCH" = UNKNOWN ]; then if [ -f /usr/etc/RELDEF ]; then ARCH=ATT; fi if [ -f /ultrixboot ]; then if [ -f /pcs750.bin ]; then ARCH=UVAX else ARCH=PMAX fi else if [ -f /pcs750.bin ]; then ARCH=VAX; fi fi if [ -d /usr/alliant ]; then ARCH=AFX8; fi if [ -f /usr/bin/cluster ]; then ARCH=BFLY; fi if [ -d /usr/convex ]; then ARCH=CNVX; fi #++csz # if [ -f /unicos ]; then ARCH=CRAY; fi #--csz if [ -f /hp-ux ]; then ARCH=HP300; fi if [ -f /usr/bin/getcube ]; then ARCH=I860; fi if [ -f /usr/bin/asm56000 ]; then ARCH=NEXT; fi if [ -f /etc/vg ]; then ARCH=RS6K; fi if [ -d /usr/include/caif ]; then ARCH=RT; fi #++csz # Move check for /unicos to after /bin/4d because Ouray=Unicos 10.0.0 has both if [ -f /bin/4d ]; then ARCH=SGI; fi if [ -f /unicos ]; then ARCH=CRAY; fi #--csz if [ -f /dynix ]; then ARCH=SYMM; fi if [ -f /bin/titan ]; then ARCH=TITN; fi if [ -f /netbsd ]; then case "`/usr/bin/machine`" in i386) ARCH=NETBSDI386 ;; amiga) ARCH=NETBSDAMIGA ;; hp300) ARCH=NETBSDHP300 ;; mac68k) ARCH=NETBSDMAC68K ;; pmax) ARCH=NETBSDPMAX ;; sparc) ARCH=NETBSDSPARC ;; sun3) ARCH=NETBSDSUN3 ;; esac elif [ -f /usr/bin/machine ]; then case "`/usr/bin/machine`" in i386 ) ARCH=BSD386 ;; esac fi if [ -f /usr/bin/uxpm ] && /usr/bin/uxpm ; then ARCH=UXPM fi if [ -f /usr/bin/uxpv ] && /usr/bin/uxpv ; then ARCH=UXPV fi fi if [ "$ARCH" = UNKNOWN ]; then if [ -f /bin/uname -o -f /usr/bin/uname ]; then if [ -f /bin/uname ]; then os="`/bin/uname -s`" ht="`/bin/uname -m`" rv="`/bin/uname -r`" else os="`/usr/bin/uname -s`" ht="`/usr/bin/uname -m`" rv="`/usr/bin/uname -r`" fi case "$os,$ht" in CYGWIN*,x86_64) ARCH=WIN32 ;; esac case "$os,$ht" in *,i[3456]86 ) case "$rv" in 4.*) ARCH=UWARE ;; #csz++ # 20020708: Change SCO to WIN32 # *) ARCH=SCO ;; *) ARCH=WIN32 ;; #csz-- esac esac fi fi # # update the machine type to derive subclasses # if [ "$ARCH" = SUN4 ]; then rel="`/bin/uname -r`" case "$rel" in 5.* ) ARCH=SUN4SOL2 ;; esac fi if [ "$ARCH" = SUN4SOL2 ]; then #++csz nproc="`/bin/mpstat | /bin/wc -l`" # nproc="`/bin/mpstat | wc -l`" # Omit requirement that PVM_SHMEM be set to return SUNMP # Keep requirement that /bin/mpstat return multiple lines # if [ $nproc -gt 2 -a "$PVM_SHMEM" = ON ]; if [ $nproc -gt 2 ]; #--csz then ARCH=SUNMP; fi fi if [ "$ARCH" = ALPHA ]; then rel="`/usr/bin/uname -r`" case "$rel" in *[34].*) nproc="`/usr/sbin/sizer -p`" if [ $nproc -gt 1 -a "$PVM_SHMEM" = ON ]; then ARCH=ALPHAMP; fi ;; esac fi if [ "$ARCH" = SGI ]; then rel="`/bin/uname -r`" case "$rel" in 5.* ) ARCH=SGI5 ;; 6.* ) ARCH=SGI6 ;; esac fi if [ "$ARCH" = SGI64 ]; then #++csz nproc="`/usr/sbin/mpadmin -n | /bin/wc -w`" # Omit requirement that PVM_SHMEM be set to return SGIMP64 # Do require that /bin/mpadmin return more procs than winterpark # if [ $nproc -gt 1 -a "$PVM_SHMEM" = ON ]; # if [ $nproc -gt 9 ]; # 20020606: Only require 4 processors so utefe qualifies if [ $nproc -gt 4 ]; then ARCH=SGIMP64; fi fi if [ "$ARCH" = SGI5 ]; then nproc="`/usr/sbin/mpadmin -n | /bin/wc -w`" if [ $nproc -gt 1 -a "$PVM_SHMEM" = ON ]; then ARCH=SGIMP; fi fi if [ "$ARCH" = SGI6 ]; then nproc="`/usr/sbin/mpadmin -n | wc -w`" if [ $nproc -gt 1 -a "$PVM_SHMEM" = ON ]; then ARCH=SGIMP6; fi fi if [ "$ARCH" = SUN4 -a -f /dev/cm ]; then ARCH=CM2; fi if [ "$ARCH" = SUN4 -a -f /dev/cmni ]; then ARCH=CM5; fi if [ "$ARCH" = CNVX ]; then if /usr/convex/getsysinfo -f native_default; then ARCH=CNVXN fi fi if [ "$ARCH" = PMAX -a -d /usr/maspar ]; then ARCH=MASPAR; fi if [ "$ARCH" = RS6K ]; then # csz++ # case "$os,$ov" in case "$os" in # AIX*,4 ) nproc="`/usr/sbin/lsdev -C -c processor | wc -l`" AIX ) nproc="`/usr/sbin/lsdev -C -c processor | wc -l`" if [ $nproc -gt 1 -a "$PVM_SHMEM" = ON ]; then ARCH=AIX4MP; else # Make ACD machines (e.g., gss1.acd.ucar.edu) return plain old AIX # ARCH=AIX46K; ARCH=AIX; # csz-- fi ;; esac fi if [ "$ARCH" = HPPA -a -f /bin/sysinfo ]; then ARCH=CSPP; fi if [ "$ARCH" = HPPA ]; then nproc="`/usr/bin/vmstat -n | wc -l`" if [ $nproc -gt 8 -a "$PVM_SHMEM" = ON ]; then ARCH=HPPAMP; fi fi # # ugh, done. # echo $ARCH exit nco-4.5.4/bm/000077500000000000000000000000001264355130400127045ustar00rootroot00000000000000nco-4.5.4/bm/NCO_benchmarks.pm000066400000000000000000000467721264355130400160760ustar00rootroot00000000000000package NCO_benchmarks; # $Header$ # Purpose: library module supporting nco_bm.pl benchmark and regression tests # File contains BENCHMARK code (as opposed to the REGRESSION tests in "NCO_rgr.pm") # Module contains following functions in approximate order of usage: # benchmarks().........Entire set of NCO benchmarks # NB: When adding tests, _be sure to use -O to overwrite files_ # Otherwise, script hangs waiting for interactive response to overwrite queries require 5.6.1 or die "This script requires Perl version >= 5.6.1, stopped"; use English; # WCS96 p. 403 makes incomprehensible Perl errors sort of comprehensible use Cwd 'abs_path'; use warnings; use strict; #use NCO_rgr qw( tst_rgr ); # module that contains tst_rgr() use NCO_bm qw(dbg_msg tst_run $drc_dat @fl_mtd_sct $opr_sng_mpi $opr_nm $dsc_sng $prsrv_fl $srv_sd $dodap ); require Exporter; our @ISA = qw(Exporter); #export functions (top) and variables (bottom) our @EXPORT = qw( benchmarks $srv_sd $dodap $fl_nbr $dbg_lvl $bm $mpi_prc $opr_sng_mpi $omp_flg $fl_fmt $nco_D_flg $fl_out $tw_prt_bm @tst_cmd $opr_nm $dsc_sng $nsr_xpc $fl_cnt %NCO_RC ); use vars qw( $drc_dat $f @fl_mtd_sct $in_pth $in_pth_arg $ipcc_dm_sz $ldz $lnk_fl_nme $MY_BIN_DIR $n $nd $fl_nbr $r $rel_fle $ssdwrap $var_pfx $var_sfx $var_sng @var_sz $wait $tw_prt_bm $srv_sd $opr_nm $dsc_sng $mpi_prc $fl_out $bm $dbg_lvl $dodap $fl_cnt @fl_mtd_sct $fl_fmt $fl_pth %NCO_RC $nco_D_flg $ncwa_scl_tst $notbodi $nsr_xpc $omp_flg $opr_sng_mpi @tst_cmd ); sub benchmarks{ print "\nINFO: Starting Benchmarks now:\n"; # "\t+serverside status = $srv_sd\n\t+dodap = $dodap\n\t+$drc_dat = $drc_dat"; # set up the input path and argument string $in_pth = ""; $in_pth_arg = ""; if ($dodap eq "FALSE") { $in_pth_arg = "-p $drc_dat"; } elsif ($dodap ne "" && $fl_pth =~ /http/ ) { $in_pth_arg = " -p $fl_pth "; } elsif ($dodap eq "") { $in_pth_arg = " -p http://sand.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata "; } # hardcode for now until we come up with a robut method for doing this if ($srv_sd ne "SSNOTSET") { $in_pth_arg = "-p dodsdata"; } ################### Set up the symlinks ################### if ($bm && $dodap eq "FALSE" && $srv_sd eq "SSNOTSET") { if ($dbg_lvl > 0) {print "\nINFO: Setting up symlinks for test nc files\n";} for (my $fl_idx=0; $fl_idx<$fl_nbr; $fl_idx++) { my $rel_fle = "$drc_dat/$fl_mtd_sct[$fl_idx][2]" . ".nc" ; my $ldz = "0"; # leading zero for #s < 10 if ($dbg_lvl > 0) {print "\tsymlinking $rel_fle\n";} for (my $n=0; $n<32; $n ++) { if ($n>9) {$ldz ="";} my $lnk_fl_nme = "$drc_dat/$fl_mtd_sct[$fl_idx][2]" . "_" . "$ldz" . "$n" . ".nc"; if (-r $rel_fle && -d $drc_dat && -w $drc_dat){ symlink $rel_fle, $lnk_fl_nme; } } } } # The general format for the benchmarks is the same as for the regressions: # #################### begin nces benchmark # $opr_nm='nco_name'; # $dsc_sng = 'unique descriptor string for this benchmark'; # #################### # #usually require the follow test to protect against MPI explosions # if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # # next, fill the $tst_cmd[] array with the nco commands that you want to test in order. # # You may use as many as you want, with the proviso that the output file variables are # # named uniquely using the ones described in nco_bm.pl: 336-350 (foo...). # # The last nco command is usually an ncks command that examines a single value generated # # from the preceding chain of commands # $tst_cmd[0] = "nces -h -O $fl_fmt $nco_D_flg $omp_flg -n $fl_cnt,2,1 $in_pth_arg stl_5km_00.nc $fl_out"; # if($dbg_lvl > 2){print "entire cmd: $tst_cmd[0]\n";} # $tst_cmd[1] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -y sqrt -a lat,lon $fl_out $fl_out"; # $tst_cmd[2] = "ncks -C -H -s '%f' -v d2_00 $fl_out"; # $tst_cmd[3] = "1.604304"; # $tst_cmd[4] = "NO_SS"; # tst_run(\@tst_cmd); # $#tst_cmd=0; # reset the array # if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} # } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} # # if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} # Note that that the last SERVERSIDE executable nco statement has to end with a '%stdouterr%' to # have it return data. For both benchmarks and regressions, this is added in the # SS_gnarly_pything() sub from tst_run() that handles the SS manipulations. # Also note that in order for Daniel's ssdwrap code to work at least for now, all the files passed in have # to be named differently in order to keep things straight. So we can't name everything $fl_out # (or %tmp_fl_00% and have it work. All output must be named differently in a script for the #script to work correctly. if (0) { # DEBUGGING to skip these } # [DEBUGGING to skip these] down to here #################### begin ncap2 benchmark $opr_nm='ncap2'; $dsc_sng = 'ncap2 long algebraic operation'; ################### dbg_msg(2,"mpi_prc = $mpi_prc\nopr_sng_mpi = $opr_sng_mpi"); if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # csz 20061024: Changed ncap to ncap2 with 40% speed penalty # Not sure why ncap2 is much slower at long arithmetic expressions $tst_cmd[0] = "ncap2 -h -O $fl_fmt $nco_D_flg -s \"nu_var1[time,lev,lat,lon]=d4_01*d4_02*(d4_03^2)-(d4_05/d4_06)\" -s \"nu_var2[time,lev,lat,lon]=(d4_13/d4_02)*((d4_03^2)-(d4_05/d4_06))\" -s \"nu_var3[time,lat,lon]=(d3_08*d3_01)-(d3_05^3)-(d3_11*d3_16)\" -s \"nu_var4[time,lat,lon]=(d3_08+d3_01)-((d3_05*3)-d3_11-17.33)\" $in_pth_arg gcm_T85.nc %tmp_fl_01%"; $tst_cmd[1] = "ncwa -O $omp_flg -y sqrt -a lat,lon %tmp_fl_01% %tmp_fl_02%"; $tst_cmd[2] = "ncks -C -H -s '%f' -v d2_00 %tmp_fl_02% "; # as noted above, for serverside prep, the final '%stdouterr%' il be added in SS_gnarly_pything() # note that the 2 additions to the list are the expected value and the indicator whether it # can be used as a server side operation: # "NO_SS" sez don't even try. "SS_OK" sez to try IF the --serverside flag is set $tst_cmd[3] = "4.024271"; # $tst_cmd[4] = "NO_SS"; $tst_cmd[4] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng]\n";} } else {print "Skipping Benchmark because $opr_nm does not support MPI\n";} if ($dbg_lvl >= 1) {print "paused after ncap2 - hit return to continue"; $wait = ;} #################### begin ncbo benchmark $opr_nm='ncbo'; $dsc_sng = 'ncbo differencing two files'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncbo -h -O $fl_fmt $nco_D_flg $omp_flg --op_typ='-' $in_pth_arg gcm_T85.nc gcm_T85_00.nc %tmp_fl_00%"; # $tst_cmd[0] = "ncbo -h -O $fl_fmt $nco_D_flg $omp_flg --op_typ='-' $in_pth_arg stl_sml.nc stl_sml_00.nc %tmp_fl_00%"; # smaller test file if($dbg_lvl > 2){print "entire cmd: $tst_cmd[0]\n";} $tst_cmd[1] = "ncks -C -H -s '%f' -v sleepy %tmp_fl_00% "; # $tst_cmd[1] = "ncks -C -H -s '%f' -v weepy %tmp_fl_00%"; # smaller test file $tst_cmd[2] = "0.000000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng]\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin nces benchmark $opr_nm='nces'; $dsc_sng = 'nces averaging 2^5 files'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { if ($dbg_lvl > 0) {print "\nBenchmark: \$fl_fmt = [$fl_fmt], \$nco_D_flg = $nco_D_flg, \$omp_flg = [$omp_flg], \$dsc_sng = $dsc_sng, \$fl_cnt = [$fl_cnt], \n";} $tst_cmd[0] = "nces -h -O $fl_fmt $nco_D_flg $omp_flg -n $fl_cnt,2,1 $in_pth_arg stl_5km_00.nc %tmp_fl_00%"; if($dbg_lvl > 2){print "entire cmd: $tst_cmd[0]\n";} $tst_cmd[1] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -y sqrt -a lat,lon %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2] = "ncks -C -H -s '%f' -v d2_00 %tmp_fl_01%"; $tst_cmd[3] = "1.604304"; $tst_cmd[4] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin ncecat benchmark $opr_nm='ncecat'; $dsc_sng = 'ncecat joining 2^5 files'; # tms_lng.nc * 32 = 1.51GB #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng, files=$fl_cnt\n";} $tst_cmd[0] = "ncecat -h -O $fl_fmt $nco_D_flg $omp_flg -n $fl_cnt,2,1 $in_pth_arg tms_lng_00.nc %tmp_fl_00%"; $tst_cmd[1] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2] = "ncks -C -H -s '%f' -v PO2 %tmp_fl_01%"; # following required due to shortened length of test under dap. if ($dodap eq "FALSE") { $tst_cmd[3] = "12.759310";} else { $tst_cmd[3] = "18.106375";} $tst_cmd[4] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin ncflint benchmark - needs to be verified and md5/wc sums created. $opr_nm='ncflint'; $dsc_sng = 'ncflint weight-averaging 2 files'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncflint -h -O $fl_fmt $nco_D_flg -w '0.5' $in_pth_arg gcm_T85_00.nc gcm_T85_01.nc %tmp_fl_00%"; if($dbg_lvl > 2){print "entire cmd: $tst_cmd[0]\n";} $tst_cmd[1] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -y sqrt -a lat,lon %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2] = "ncks -C -H -s '%f ' -v d1_00 %tmp_fl_01%"; $tst_cmd[3] = "1.800000 1.800000 1.800000 1.800000 1.800000 1.800000 1.800000 1.800000"; $tst_cmd[4] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin ncpdq benchmark - reversal $opr_nm='ncpdq'; $dsc_sng = 'ncpdq dimension-order reversal'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} #!!WARN - change back to testing the ipcc file after verify # !! this one is buggered by the current ssdwrap $tst_cmd[0] = "ncpdq -h -O $fl_fmt $nco_D_flg $omp_flg -a '-time,-lev,-lat,-lon' $in_pth_arg gcm_T85.nc %tmp_fl_00%"; # ~2m on sand for gcm_T85.nc $tst_cmd[1] = "ncks -C -H -s \"%f\" -v dopey %tmp_fl_00%"; #ipcc $tst_cmd[2] = "0.800000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### next ncpdq benchmark - re-ordering $opr_nm='ncpdq'; $dsc_sng = 'ncpdq dimension-order re-ordering'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncpdq -h -O $fl_fmt $nco_D_flg $omp_flg -a 'lon,time,lev,lat' $in_pth_arg gcm_T85.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s \"%f\" -v dopey %tmp_fl_00%"; #ipcc $tst_cmd[2] = "0.800000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### next ncpdq benchmark - re-ordering & reversing $opr_nm='ncpdq'; $dsc_sng = 'ncpdq dimension-order re-ordering & reversing'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncpdq -h -O $fl_fmt $nco_D_flg $omp_flg -a '-lon,-time,-lev,-lat' $in_pth_arg gcm_T85.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s \"%f\" -v dopey %tmp_fl_00%"; #ipcc $tst_cmd[2] = "0.800000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### next ncpdq benchmark $opr_nm='ncpdq'; $dsc_sng = 'ncpdq packing a file'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncpdq -h -O $fl_fmt $nco_D_flg $omp_flg -P all_new $in_pth_arg gcm_T85.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s \"%f\" -v dopey %tmp_fl_00%"; $tst_cmd[2] = "0.000000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin cz benchmark list #2 $opr_nm='ncra'; $dsc_sng = 'ncra time-averaging 2^5 (i.e. one month) ipcc files'; #################### if ($notbodi) { # too big for bodi if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncra -h -O $fl_fmt $nco_D_flg $omp_flg -n $fl_cnt,2,1 $in_pth_arg gcm_T85_00.nc %tmp_fl_00%"; # ~4m on sand. $tst_cmd[1] = "ncks -C -H -s '%f' -v d1_03 %tmp_fl_00% "; $tst_cmd[2] = "1.800001"; $tst_cmd[3] = "NO_SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} } if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} # the 1st and last lines of this stanza are commented for testing the benchmarks on the Gb net # but it's incredibly slow - order of several hours even if done on the same machine if ($dodap eq "FALSE") { # only if not being done by remote #################### begin ncrcat benchmark $opr_nm='ncrcat'; $dsc_sng = 'ncrcat joining 2^5 files'; # tms_lng.nc * 32 = 1.51GB #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncrcat -h -O $fl_fmt $nco_D_flg $omp_flg -n 22,2,1 $in_pth_arg tms_lng_00.nc %tmp_fl_00%"; # $tst_cmd[0] = "ncrcat -h -O $fl_fmt $nco_D_flg $omp_flg -n $fl_cnt,2,1 $in_pth_arg tms_lng_00.nc %tmp_fl_00%"; $tst_cmd[1] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2] = "ncks -C -H -s '%f' -v PO2 %tmp_fl_01%"; $tst_cmd[3] = "12.759310"; $tst_cmd[4] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else { print "Skipping Benchmark [$opr_nm] - not MPI-ready\n"; } } else { print "\nNB: ncrcat benchmark skipped for OpenDAP test - takes too long.\n\n"; } if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} #################### begin ncwa benchmark list #1a $opr_nm='ncwa'; $dsc_sng = 'ncwa averaging all variables to scalars - stl_5km.nc & sqrt'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -w lat -y sqrt -a lat,lon $in_pth_arg stl_5km.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s '%f' -v d2_02 %tmp_fl_00%"; $tst_cmd[2] = "1.673425"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} printf("paused @ [%s:%d] - hit return to continue\n", __FILE__, __LINE__); my $wait = ; # following fails on numeric cmp but why should the result the same? #################### begin ncwa benchmark list #1b $opr_nm='ncwa'; $dsc_sng = 'ncwa averaging all variables to scalars - stl_5km.nc & rms'; #################### if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -y rms -w lat -a lat,lon $in_pth_arg stl_5km.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s '%f' -v d2_02 %tmp_fl_00%"; $tst_cmd[2] = "2.800084"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array if($dbg_lvl > 0){print "\n[past benchmark stanza - $dsc_sng\n";} } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { if ($notbodi) { # ipcc too big for bodi #################### begin ncwa benchmark list #1c $opr_nm = 'ncwa'; $dsc_sng = 'ncwa averaging all variables to scalars - gcm_T85.nc & sqt'; #################### # if ($dbg_lvl > 0) {print "\nBenchmark: $dsc_sng\n";} $tst_cmd[0] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg -y sqrt -w lat -a lat,lon $in_pth_arg gcm_T85.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s '%f' -v skanky %tmp_fl_00%"; $tst_cmd[2] = "0.800000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array } } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} if ($dbg_lvl >= 1) {print "paused - hit return to continue"; $wait = ;} if ($ncwa_scl_tst) { if ($mpi_prc == 0 || ($mpi_prc > 0 && $opr_sng_mpi =~ /$opr_nm/)) { if ($notbodi) { # ipcc too big for bodi #my @ipcc_dm_sz = (8, 8, 16, 64, 32); # dims for d0-d4 # 3 -v descriptors that should reduce the total size to 1/2, 1/4, 1/8. my @var_sz = (" -v d1_0[0-3] -v d2_0[0-7] -v d3_[0-2][0-9] -v -d3_3[01] -v d4_0[0-9] -v d4_1[0-5]", " -v d1_0[01] -v d2_0[0-3] -v d3_0[0-9] -v d3_1[0-5] -v d4_0[0-3]]", " -v d1_00 -v d2_0[01] -v d3_0[0-7] -v d4_0[01]"); #################### begin ncwa benchmark list #1c $opr_nm='ncwa'; $dsc_sng = 'ncwa averaging at dif var sizes - gcm_T85.nc & sqt'; #################### # make vars in size of 1/2, 1/4, 1/8 of each one. # for (my $r=0; $r<5; $r++) { # my $var_pfx = sprintf("d%d_", $r); # for (my $nd=2; $nd<=8; $nd*2){ # my $var_sfx = sprintf("%2d", $ipcc_dm_sz[$r]); # my $var_sng = # } # } for (my $r=0; $r<2; $r++) { $tst_cmd[0] = "ncwa -h -O $fl_fmt $nco_D_flg $omp_flg $var_sz[$r] -y sqrt -w lat -a lat,lon $in_pth_arg gcm_T85.nc %tmp_fl_00%"; $tst_cmd[1] = "ncks -C -H -s '%f' -v skanky %tmp_fl_00%"; $tst_cmd[2] = "0.800000"; $tst_cmd[3] = "SS_OK"; tst_run(\@tst_cmd); $#tst_cmd=0; # reset the array } } # not bodi } else {print "Skipping Benchmark [$opr_nm] - not MPI-ready\n";} } # and summarize the benchmarks results NCO_bm::rsl_smr_rgr(); } 1; __END__ nco-4.5.4/bm/NCO_bm.pm000066400000000000000000001435501264355130400143470ustar00rootroot00000000000000package NCO_bm; # $Header$ # Purpose: Library for nco_bm.pl benchmark and regression tests # Module contains following functions: # bm_ntl().........initialization, set NCOs to be tested under different conditions # bm_usg().........dumps usage text # bm_vrb().........small fnc() to print to both screen and log # drc_dat_set()....figures out where to write output data # fl_mk()..........creates test files # fl_mtd_ntl().....Initialize meta-data used to create test files # rsl_chk_MD5_wc().checks output via md5/wc validation # rsl_smr_fl_mk()..summarize results of file creation tests # rsl_smr_rgr()....summarize results of both regression and benchmark tests # tst_run()........execute regressions and benchmarks in same format # tst_tm_hrz().....almost ready-to-delete test of HiRes fnc() on Opterons # vrs_sng_get()....create two-part release and date string e.g., "3.0.3 / 20051004" require 5.6.1 or die "This script requires Perl version >= 5.6.1, stopped"; use English; # WCS96 p. 403 makes Perl errors more comprehensible use Cwd 'abs_path'; #use NCO_benchmarks qw($tw_prt_bm); use strict; use NCO_rgr qw( tst_rgr $dodap $pfx_cmd $pfx_cmd_crr $opr_sng_mpi $opr_nm $dsc_sng $prsrv_fl $fl_out ); # $foo1_fl $foo_fl $foo_tst # module that contains tst_rgr() #use NCO_benchmarks; #module that contains the actual benchmark code # use warnings; require Exporter; our @ISA = qw(Exporter); #export functions (top) and variables (bottom) our @EXPORT = qw ( tst_run dbg_msg drc_dat_set bm_ntl $pfx_cmd $pfx_cmd_crr $drc_dat @fl_mtd_sct $opr_sng_mpi $opr_nm $dsc_sng %NCO_RC $prsrv_fl $srv_sd $hiresfound $dodap $bm $dbg_lvl $sock $udp_rpt $mpi_prc $pfx_mpi $mpi_fk $mpi_upx ); use vars qw( $aix_mpi_nvr_pfx $aix_mpi_sgl_nvr_pfx $bm $dbg_lvl $dodap $dot_fmt $dot_nbr $dot_nbr_min $dot_sng $dsc_fmt $dsc_lng_max $dsc_sng $pfx_fk $hiresfound $md5 $mpi_prc $pfx_mpi $mpi_fk $mpi_upx $MY_BIN_DIR %NCO_RC $nsr_xpc $opr_fmt $opr_lng_max @opr_lst @opr_lst_all @opr_lst_mpi $opr_nm $opr_rgr_mpi $opr_sng_mpi $os_nm $pfx_cmd $pfx_cmd_crr %real_tme $cmd_rsl $spc_fmt $spc_nbr $spc_nbr_min $spc_sng %subbenchmarks %success @sys_tim_arr $sys_time %sys_tme $timed %totbenchmarks @tst_cmd $tst_fmt $tst_id_sng %tst_nbr %usr_tme $wnt_log $timestamp $bm_drc $caseid $cmd_ln $drc_dat @fl_mtd_sct $fl_pth @fl_tmg $md5found %MD5_tbl $nco_D_flg $fl_nbr $pfxd $prsrv_fl $que $server_ip $sock $thr_nbr $dbg_sng $err_sng $tmr_app $udp_rpt %wc_tbl $pfxd $nvr_my_bin_dir $prg_nm $arg_nbr $tw_prt_bm $srv_sd @cmd_lst ); # $fl_out print "\nINFO: Testing for required modules\n"; BEGIN {eval "use Time::HiRes qw(usleep ualarm gettimeofday tv_interval)"; $hiresfound = $@ ? 0 : 1} #$hiresfound = 0; # uncomment to simulate not found if ($hiresfound == 0) { print "\nOoops! Time::HiRes (needed for accurate timing) not found\nContinuing without timing."; } else { print "\tTime::HiRes ... found.\n"; } # $hiresfound # bm_usg - informational blurb for script sub bm_usg { print << 'USAGE'; Usage: nco_bm.pl (options) [list of operators to test from the following list] ncap2 ncatted ncbo ncflint nces ncecat ncks ncpdq ncra ncrcat ncrename ncwa net (default tests all) where (options) are: --usage || -h ...dumps this help --debug {1-3) ...puts the script into debug mode; emits more and (hopefully) more useful info. Also inserts the comparable -D flag into the nco commandline. --caseid {short id string} this string can be used to identity and separate results from different runs. --dap {OPeNDAP url} ...retrieve test files from OPeNDAP server URL --opendap..............ditto. Both take a URL of the form: http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata (i.e., URL points points thru the cgi-bin to the data dir) --dust_user.....use this to define a user who CAN log into dust for testing --fl_fmt........sets the file type to test. One of: classic, 64bit, netcdf4, netcdf4_classic --log ..........requests that debug info is logged to 'nco_bm.log' as well as spat to STDOUT. --mpi_prc {#>0}..number of MPI processes to spawn --mpi_fake.......run mpi executable as single process for debugging. --fake_mpi.......ditto --udpreport.....requests that the test results are communicated back to NCO Central to add your test, timing, and build results. NB: This option uses udp port 29659 and may set off firewall alarms if used unless that port is open. --scaling.......Run ncwa benchmarks with 1/2, 1/4, 1/8 of the variables --serverside {server URL}..requests that benchmarks be run on server side points to dust.ess.uci.edu unless alternate URL is given [EXPERIMENTAL] --test_files....Test and excercise file creation script 'ncgen' and the Left Hand Casting ability of ncap. Currently gives the option to test 4 files of increasing size and complexity: 0 - none; skip this section 1 - example long skinny nc ~ 50MB ~few sec 2 - small Satellite data set ~100MB ~several sec 3 - 5km Satellite data set ~300MB ~min 4 - IPCC Daily T85 data set ~ 4GB ~several min A - All --thr_nbr {#>0}....Number of OpenMP threads to use --xdata.........Explicit data path set from command line (overrides DATA environment variable) --regress.......Perform regression tests --benchmark.....Perform benchmarks nco_bm.pl is a semi-automated script for testing the accuracy and robustness of the NCO (netCDF Operators), typically after they are built, using the 'make benchmark' command. This script can also collect benchmark statistics via sending test results to a UDP server. NB: When adding tests, use NCO's '-O' switch to overwrite files. Otherwise, the script hangs waiting for interactive responses. Also, unless history is required, use '-h' to inhibit appending history to file. This script is part of the netCDF Operators package: http://nco.sf.net Copyright 1995--2016 Charlie Zender USAGE exit(0); } # end bm_usg() # ' <-- to make emacs happy after the USAGE block # Initialize NCOs that need to be tested for particular conditions sub bm_ntl($$){ use vars qw($prg_nm %sym_link %failure); my $bch_flg; # [flg] Batch behavior my $dbg_lvl; # [flg] Debugging level ($bch_flg,$dbg_lvl)=@_; # Enumerate operators to test @opr_lst_all = qw( ncap2 ncdiff ncatted ncbo ncflint nces ncecat ncks ncpdq ncra ncrcat ncrename ncwa net); @opr_lst_mpi = qw( ncbo ncecat ncflint ncpdq ncra ncwa ncpdq ncra); $opr_sng_mpi = "ncbo ncdiff ncecat ncflint nces ncpdq ncra ncwa "; # ncpdq ncra MPI, but fail bench $opr_rgr_mpi = "ncbo ncdiff ncecat ncflint nces ncpdq ncra ncwa ncrcat"; # need all of them for regression if(scalar @ARGV > 0){@opr_lst=@ARGV;}else{@opr_lst=@opr_lst_all;} if(defined $ENV{'MY_BIN_DIR'} && $ENV{'MY_BIN_DIR'} ne ""){$MY_BIN_DIR=$ENV{'MY_BIN_DIR'}; }else{ # Set and verify MY_BIN_DIR $MY_BIN_DIR=abs_path("../src/nco"); dbg_msg(2, "ENV var 'MY_BIN_DIR' not specified, so using default [$MY_BIN_DIR]."); # if($bch_flg){ # die "unable to continue in batch mode without MY_BIN_DIR\n stopped\n"; # }else{ # !bch_flg # $MY_BIN_DIR=abs_path("../src/nco"); # printf "use $MY_BIN_DIR?\n['y' or specify] "; # my $ans = ; # chomp $ans; # $MY_BIN_DIR = $ans unless (lc($ans) eq "y" || lc($ans) eq ''); # } # !bch_flg } # !$MY_BIN_DIR dbg_msg(1,"$prg_nm: bm_ntl() reports:\n\t \$MY_BIN_DIR = $MY_BIN_DIR, \n\t \@opr_lst = @opr_lst\n\t \$opr_sng_mpi = $opr_sng_mpi\n\t \$opr_rgr_mpi = $opr_rgr_mpi\n"); # Die if this path still does not work if($opr_lst[0] ne 'ncap2'){ die "$MY_BIN_DIR/$opr_lst[0] does not exist\n stopped" unless (-e "$MY_BIN_DIR/$opr_lst[0]" || $opr_lst[0] eq "net"); } # Create symbolic links for testing # If libtool created shared libraries, then point to real executables # in ../src/nco/.libs my $dotlib = ''; $dotlib = ".libs/lt-" if `head -1 $MY_BIN_DIR/ncatted` =~ m/sh/; $sym_link{ncdiff}=$dotlib . "ncbo"; $sym_link{nces}=$dotlib . "ncra"; $sym_link{ncrcat}=$dotlib . "ncra"; foreach(keys %sym_link){ system("cd $MY_BIN_DIR && ln -s -f $sym_link{$_} $_ || (/bin/rm -f $_ && ln -s -f $sym_link{$_} $_)"); } # Go to data directory where tests are actually run my $drc_in_nc = "../data"; chdir $drc_in_nc or die "$OS_ERROR\n stopped"; # Make sure in.nc exists, make it if possible, or die # ncgen is not part of unless (-e "in.nc"){ system("ncgen -o in.nc in.cdl") if (`which ncgen` and -e "in.cdl"); } die "The netCDF file \"in.nc\" is necessary for testing NCO, however, it could not be found in \"$drc_in_nc\". Also, it could not be generated because \"ncgen\" could not be found in your path and/or the file \"$drc_in_nc/in.cdl\" does not exist.\n stopped" unless (-e "in.nc"); #create large files openMP testing if( !(-e "lrg_bm.nc") && (-e "lrg_bm.in") && (-e "$MY_BIN_DIR/ncap2") ){ # make lrg_bm.nc system("$MY_BIN_DIR/ncap2 -C -v -O -t1 -S lrg_bm.in in.nc lrg_bm.nc"); # make lrg_bm1.nc system("$MY_BIN_DIR/ncap2 -C -v -O -t1 -S lrg_bm.in lrg_bm.nc lrg_bm1.nc"); } # Initialize hashes for each operator to test foreach(@opr_lst) { $tst_nbr{$_}=0; $success{$_}=0; $failure{$_}=0; } } # end of bm_ntl() # Output string to either stdout, log, or both sub bm_vrb { my $dbg_lvl = shift; my $wnt_log = shift; my $ts = shift; # my $wnt_log; # why should this be required? if($dbg_lvl > 0){printf ("$ts");} if($wnt_log) {printf (LOG "$ts");} } # end of bm_vrb($dbg_lvl, $wnt_log, informational string to output ) sub fl_mtd_ntl { # Purpose: fl_mtd_ntl() initializes metadata for all test files my $fl_nbr=3; my $idx_stl_5km=0; my $idx_gcm_dly=1; my $idx_tms_lng=2; dbg_msg(1,"fl_mtd_ntl: \$fl_nbr = $fl_nbr"); if ($dbg_lvl > 2) { print "\nWaiting for keypress to proceed.\n"; my $tmp = ; } for (my $i = 0; $i < $fl_nbr; $i++) { $fl_tmg[$i][1] = $fl_tmg[$i][2] = " omitted "; } # $fl_mtd_sct[$idx_gn_xpr][0] = "example gene expression"; # option descriptor # $fl_mtd_sct[$idx_gn_xpr][1] = "~50MB"; # file size # $fl_mtd_sct[$idx_gn_xpr][2] = $fl_tmg[$idx_gn_xpr][0] = "gn_xpr"; # $fl_mtd_sct[$idx_gn_xpr][3] = "\'base[ge_atoms,rep,treat,cell,params]=5.67f\'"; # $fl_mtd_sct[$idx_stl_sml][0] = "Satellite small"; # option descriptor # $fl_mtd_sct[$idx_stl_sml][1] = "~100MB"; # file size # $fl_mtd_sct[$idx_stl_sml][2] = $fl_tmg[$idx_stl_sml][0] = "stl_sml"; # file name root # $fl_mtd_sct[$idx_stl_sml][3] = "\'d2_00[lat,lon]=16.37f;d2_01[lat,lon]=2.8f;d2_02[lat,lon]=3.8f;\'"; $fl_mtd_sct[$idx_stl_5km][0] = "Satellite 5km"; # option descriptor $fl_mtd_sct[$idx_stl_5km][1] = "~300MB"; # file size $fl_mtd_sct[$idx_stl_5km][2] = $fl_tmg[$idx_stl_5km][0] = "stl_5km"; # file name root $fl_mtd_sct[$idx_stl_5km][3] = "\'weepy=1.23456f;d2_00[lat,lon]=2.8f;d2_01[lat,lon]=2.8f;d2_02[lat,lon]=2.8f;d2_03[lat,lon]=2.8f;d2_04[lat,lon]=2.8f;d2_05[lat,lon]=2.8f;d2_06[lat,lon]=2.8f;d2_07[lat,lon]=2.8f;\'"; $fl_mtd_sct[$idx_gcm_dly][0] = "GCM T85"; # option descriptor $fl_mtd_sct[$idx_gcm_dly][1] = "~1.2GB"; # file size $fl_mtd_sct[$idx_gcm_dly][2] = $fl_tmg[$idx_gcm_dly][0] = "gcm_T85"; # file name root $fl_mtd_sct[$idx_gcm_dly][3] = "\'weepy=0.8f;dopey=0.8f;sleepy=0.8f;grouchy=0.8f;sneezy=0.8f;doc=0.8f;wanky=0.8f;skanky=0.8f;d1_00[time]=1.8f;d1_01[time]=1.8f;d1_02[time]=1.8f;d1_03[time]=1.8f;d1_04[time]=1.8f;d1_05[time]=1.8f;d1_06[time]=1.8f;d1_07[time]=1.8f;d2_00[lat,lon]=16.2f;d2_01[lat,lon]=16.2f;d2_02[lat,lon]=16.2f;d2_03[lat,lon]=16.2f;d2_04[lat,lon]=16.2f;d2_05[lat,lon]=16.2f;d2_06[lat,lon]=16.2f;d2_07[lat,lon]=16.2f;d2_08[lat,lon]=16.2f;d2_09[lat,lon]=16.2f;d2_10[lat,lon]=16.2f;d2_11[lat,lon]=16.2f;d2_12[lat,lon]=16.2f;d2_13[lat,lon]=16.2f;d2_14[lat,lon]=16.2f;d2_15[lat,lon]=16.2f;d3_00[time,lat,lon]=64.0f;d3_01[time,lat,lon]=64.0f;d3_02[time,lat,lon]=64.0f;d3_03[time,lat,lon]=64.0f;d3_04[time,lat,lon]=64.0f;d3_05[time,lat,lon]=64.0f;d3_06[time,lat,lon]=64.0f;d3_07[time,lat,lon]=64.0f;d3_08[time,lat,lon]=64.0f;d3_09[time,lat,lon]=64.0f;d3_10[time,lat,lon]=64.0f;d3_11[time,lat,lon]=64.0f;d3_12[time,lat,lon]=64.0f;d3_13[time,lat,lon]=64.0f;d3_14[time,lat,lon]=64.0f;d3_15[time,lat,lon]=64.0f;d3_16[time,lat,lon]=64.0f;d3_17[time,lat,lon]=64.0f;d3_18[time,lat,lon]=64.0f;d3_19[time,lat,lon]=64.0f;d3_20[time,lat,lon]=64.0f;d3_21[time,lat,lon]=64.0f;d3_22[time,lat,lon]=64.0f;d3_23[time,lat,lon]=64.0f;d3_24[time,lat,lon]=64.0f;d3_25[time,lat,lon]=64.0f;d3_26[time,lat,lon]=64.0f;d3_27[time,lat,lon]=64.0f;d3_28[time,lat,lon]=64.0f;d3_29[time,lat,lon]=64.0f;d3_30[time,lat,lon]=64.0f;d3_31[time,lat,lon]=64.0f;d3_32[time,lat,lon]=64.0f;d3_33[time,lat,lon]=64.0f;d3_34[time,lat,lon]=64.0f;d3_35[time,lat,lon]=64.0f;d3_36[time,lat,lon]=64.0f;d3_37[time,lat,lon]=64.0f;d3_38[time,lat,lon]=64.0f;d3_39[time,lat,lon]=64.0f;d3_40[time,lat,lon]=64.0f;d3_41[time,lat,lon]=64.0f;d3_42[time,lat,lon]=64.0f;d3_43[time,lat,lon]=64.0f;d3_44[time,lat,lon]=64.0f;d3_45[time,lat,lon]=64.0f;d3_46[time,lat,lon]=64.0f;d3_47[time,lat,lon]=64.0f;d3_48[time,lat,lon]=64.0f;d3_49[time,lat,lon]=64.0f;d3_50[time,lat,lon]=64.0f;d3_51[time,lat,lon]=64.0f;d3_52[time,lat,lon]=64.0f;d3_53[time,lat,lon]=64.0f;d3_54[time,lat,lon]=64.0f;d3_55[time,lat,lon]=64.0f;d3_56[time,lat,lon]=64.0f;d3_57[time,lat,lon]=64.0f;d3_58[time,lat,lon]=64.0f;d3_59[time,lat,lon]=64.0f;d3_60[time,lat,lon]=64.0f;d3_61[time,lat,lon]=64.0f;d3_62[time,lat,lon]=64.0f;d3_63[time,lat,lon]=64.0f;d4_00[time,lev,lat,lon]=1.1f;d4_01[time,lev,lat,lon]=1.2f;d4_02[time,lev,lat,lon]=1.3f;d4_03[time,lev,lat,lon]=1.4f;d4_04[time,lev,lat,lon]=1.5f;d4_05[time,lev,lat,lon]=1.6f;d4_06[time,lev,lat,lon]=1.7f;d4_07[time,lev,lat,lon]=1.8f;d4_08[time,lev,lat,lon]=1.9f;d4_09[time,lev,lat,lon]=1.11f;d4_10[time,lev,lat,lon]=1.12f;d4_11[time,lev,lat,lon]=1.13f;d4_12[time,lev,lat,lon]=1.14f;d4_13[time,lev,lat,lon]=1.15f;d4_14[time,lev,lat,lon]=1.16f;d4_15[time,lev,lat,lon]=1.17f;d4_16[time,lev,lat,lon]=1.18f;d4_17[time,lev,lat,lon]=1.19f;d4_18[time,lev,lat,lon]=1.21f;d4_19[time,lev,lat,lon]=1.22f;d4_20[time,lev,lat,lon]=1.23f;d4_21[time,lev,lat,lon]=1.24f;d4_22[time,lev,lat,lon]=1.25f;d4_23[time,lev,lat,lon]=1.26f;d4_24[time,lev,lat,lon]=1.27f;d4_25[time,lev,lat,lon]=1.28f;d4_26[time,lev,lat,lon]=1.29f;d4_27[time,lev,lat,lon]=1.312f;d4_28[time,lev,lat,lon]=1.322f;d4_29[time,lev,lat,lon]=1.332f;d4_30[time,lev,lat,lon]=1.342f;d4_31[time,lev,lat,lon]=1.352f;\'"; $fl_mtd_sct[$idx_tms_lng][0] = "Long timeseries"; # option descriptor $fl_mtd_sct[$idx_tms_lng][1] = "~52MB"; # file size $fl_mtd_sct[$idx_tms_lng][2] = $fl_tmg[$idx_tms_lng][0] = "tms_lng"; # file name root $fl_mtd_sct[$idx_tms_lng][3] = "\'time[time]=1.0f;hmdty[time]=98.3f;PO2[time]=18.7f;PCO2[time]=1.92f;PN2[time]=77.4f;w_vel[time]=14.8f;w_dir[time]=321.3f;temp[time]=23.5f;lmbda_260[time]=684.2f\'"; return @fl_tmg; }; # end of fl_mtd_ntl() sub fl_mk { # Purpose: Create files from CDL templates and populate them for benchmarks # Must be called after fl_mtd_ntl() my $idx = shift; my $fl_nbr = 3; $pfx_cmd = "$MY_BIN_DIR"; if ($dbg_lvl > 2) { print "\nWaiting for keypress to proceed.\n"; my $tmp = ; } my $t0; my $elapsed; my $fl_in = my $fl_out = "$drc_dat/$fl_mtd_sct[$idx][2].nc" ; $bm_drc = "../bm"; print "==== Creating $fl_mtd_sct[$idx][0] data file from template in [$bm_drc]\n"; print "Executing: $tmr_app ncgen -b -o $fl_out $bm_drc/$fl_mtd_sct[$idx][2].cdl\n"; if ($hiresfound) {$t0 = [gettimeofday()];} else {$t0 = time;} # File creation now timed system "$tmr_app ncgen -b -o $fl_out $bm_drc/$fl_mtd_sct[$idx][2].cdl"; if ($hiresfound) {$elapsed = tv_interval($t0, [gettimeofday()]);} else {$elapsed = time - $t0;} # log it to common timing array $fl_tmg[$idx][0] = "$fl_mtd_sct[$idx][2]"; # name root $fl_tmg[$idx][1] = $elapsed; # creation time if ($idx == 2) { # tms_lng needs extra massaging # tms_lng ready for ncap'ing if ($dbg_lvl > 0) {print "extra steps for tms_lng - ncecat...\n";} system "$pfx_cmd/ncecat -O -h $fl_in $fl_out"; # inserts a record dimension if ($dbg_lvl > 0) {print "ncpdq...\n";} system "$pfx_cmd/ncpdq -O -h -a time,record $fl_in $fl_out"; # swaps time and 'record' if ($dbg_lvl > 0) {print "ncwa...\n";} system "$pfx_cmd/ncwa -O -h -a record $fl_in $fl_out"; # averages 'record' } print "\n==== Populating $fl_out file.\nTiming results:\n"; if ($hiresfound) {$t0 = [gettimeofday()];} else {$t0 = time;} # csz 20061024: Changed ncap to ncap2 with no speed penalty (double-parsing works) print "Executing: $tmr_app $pfx_cmd_crr/ncap2 -h -O $nco_D_flg -s $fl_mtd_sct[$idx][3] $fl_in $fl_out\n"; system "$tmr_app $pfx_cmd_crr/ncap2 -O -h -s $fl_mtd_sct[$idx][3] $fl_in $fl_out"; if ($hiresfound) {$elapsed = tv_interval($t0, [gettimeofday()]);} else {$elapsed = time - $t0;} $fl_tmg[$idx][2] = $elapsed; # population time print "==========================\nEnd of $fl_mtd_sct[$idx][2] section\n==========================\n"; return @fl_tmg; } # end sub fl_mk # Summarize timing results of file creation tests sub rsl_smr_fl_mk { $fl_nbr = 3; # print " in rsl_smr_fl_mk, \$fl_tmg[1][0] = $fl_tmg[1][0] & \$fl_nbr = $fl_nbr\n"; if ($dbg_lvl > 0){print "Summarizing results of file creation\n";} my $CC = `../src/nco/ncks --compiler`; my $CCinfo = ''; if ($CC =~ /gcc/) {$CCinfo = `gcc --version |grep -i gcc`;} elsif ($CC =~ /xlc/) {$CCinfo = "xlc version ??";} elsif ($CC =~ /icc/) {$CCinfo = "Intel C Compiler version ??";} my $reportstr = ''; my $idstring = `uname -a` . "using: " . $CCinfo; chomp $idstring; my $udp_dat = "File Creation | $timestamp | $idstring | "; $reportstr .= "NCO File Creation Test Result Summary: [$timestamp]\n$idstring\n"; $reportstr .= " Test Total Wallclock Time (s) \n"; $reportstr .= "=====================================================\n"; for (my $fl_idx=0; $fl_idx<$fl_nbr; $fl_idx++) { $reportstr .= sprintf "Creating %15s: %6.4f \n", $fl_tmg[$fl_idx][0], $fl_tmg[$fl_idx][1]; $reportstr .= sprintf "Populating %15s: %6.4f \n", $fl_tmg[$fl_idx][0], $fl_tmg[$fl_idx][2]; $udp_dat .= sprintf "%s : %6.4f : %6.4f",$fl_tmg[$fl_idx][0], $fl_tmg[$fl_idx][1], $fl_tmg[$fl_idx][2]; } $reportstr .= sprintf "\n\n"; print $reportstr; if ($udp_rpt) { $sock->send($udp_dat); if ($dbg_lvl > 0) { print "File Creation: udp stream sent to $server_ip:\n$udp_dat\n";} } # and send it back separately } # end of rsl_smr_fl_mk # drc_dat_set(): figures out where to write data sub drc_dat_set{ $caseid = shift; my $tmp; my $umask = umask; # Does user have $DATA defined in his environment? # Bail with nasty message if it is not readable and writable # if ($caseid ne "") { # $caseid =~ s/[^\w]/_/g; # } if (defined $ENV{'DATA'} && $ENV{'DATA'} ne "") { # then is it readwritable? if (-w $ENV{'DATA'} && -r $ENV{'DATA'}) { if ($que == 0) {print "INFO: Using your environment variable DATA \n\t [$ENV{'DATA'}]\n\t as the root DATA directory for this series of tests.\n";} if ($caseid ne "") { $drc_dat = "$ENV{'DATA'}/nco_bm/$caseid"; my $err = `mkdir -p -m0777 $drc_dat`; if ($err ne "") {die "mkdir err: $drc_dat\n";} } else { # just dump it into nco_bm $drc_dat = "$ENV{'DATA'}/nco_bm"; my $err = `mkdir -p -m0777 $drc_dat`; if ($err ne "") {die "mkdir err: $drc_dat\n";} } } else { die "You have defined a DATA directory ($ENV{'DATA'}) that cannot be written to or read\nfrom or both - please try again.\n stopped"; } } elsif ($que == 0) { $tmp = 'notset'; print "You do not have a \$DATA directory defined and the test files are several GB. \nWhere would you like to write the test data? Data will be placed in the indicated directory,\nunder nco_bm, using the '--caseid' option to set the name of the subdirectory, if any. \n[$ENV{'HOME'}] or specify: "; $tmp = ; chomp $tmp; print "You entered [$tmp] \n"; if ($tmp eq '') { $drc_dat = "$ENV{'HOME'}/nco_bm/$caseid"; # if $caseid not set, then it decays to $ENV{'HOME'}/nco_bm/ if (-e "$drc_dat") { print "$drc_dat already exists - OK to re-use?\n[N/y] "; $tmp = ; chomp $tmp; if ($tmp =~ "[nN]" || $tmp eq '') { die "\nFine - decide what to use and start over again - bye! stopped"; } else { print "\n"; } } else { # have to make it print "Making $drc_dat & continuing\n"; my $err = `mkdir -p -m0777 $drc_dat`; if ($err ne "") {die "mkdir err: $drc_dat\n";} } } else { $drc_dat = "$tmp/nco_bm/$caseid"; # and now test it if (-w $drc_dat && -r $drc_dat) { print "OK - we will use [$drc_dat] to write to.\n\n"; } else { # must make it print "[$drc_dat] doesn't exist - will try to make it.\n"; my $err = `mkdir -p -m0777 $drc_dat`; if ($err ne "") {die "mkdir err: $drc_dat\n";} if (-w $drc_dat && -r $drc_dat) { print "OK - [$drc_dat] is available to write to\n"; } else { die "ERROR - [$drc_dat] could not be made - check this and try again.\n stopped";} } } } else { # que != 0 die "You MUST define a DATA environment variable to run this in a queue\n stopped"; } # !defined $ENV{'DATA'}) } # end drc_dat_set() ######################### subroutine tst_run () ############################## # tst_run() consumes @tst_cmd array and executes them in order ################################################################################# sub tst_run { my %fl_nm_lcl = ( # fl_nm_lcl = local_file_name '%stdouterr%' => "", # stdouterr has to be left to generate stderr '%tmp_fl_00%' => "$drc_dat/tmp_fl_00.nc", # Default replacement for $fl_out '%tmp_fl_01%' => "$drc_dat/tmp_fl_01.nc", '%tmp_fl_02%' => "$drc_dat/tmp_fl_02.nc", '%tmp_fl_03%' => "$drc_dat/tmp_fl_03.nc", '%tmp_fl_04%' => "$drc_dat/tmp_fl_04.nc", '%tmp_fl_05%' => "$drc_dat/tmp_fl_05.nc", # Currently no use for more than 05 '%tmp_fl_06%' => "$drc_dat/tmp_fl_06.nc", '%tmp_fl_07%' => "$drc_dat/tmp_fl_07.nc", '%tmp_fl_08%' => "$drc_dat/tmp_fl_08.nc", '%tmp_fl_09%' => "$drc_dat/tmp_fl_09.nc", '%tmp_fl_10%' => "$drc_dat/tmp_fl_10.nc", '%tmp_fl_11%' => "$drc_dat/tmp_fl_11.nc", '%tmp_fl_12%' => "$drc_dat/tmp_fl_12.nc", ); # If executign on client side, replace special purpose # filenames with names like $fl_nm_lcl{'%tmp_fl_00%'} # fxm: WTF do these vars require this treatment?!?? *dbg_lvl = *main::dbg_lvl; *fl_out = *main::fl_out; *mpi_prc = *main::mpi_prc; if($dbg_lvl > 0){ print "\n\n\n### New tst_run() cycle [$opr_nm: $dsc_sng] ###\n"; if($fl_nm_lcl{'%tmp_fl_00%'} eq ""){ print "fl_out undefined!\n"; } # else { print "\$fl_nm_lcl{'%tmp_fl_00%'} = [$fl_nm_lcl{'%tmp_fl_00%'}] \n";} } # tst_run() requires that regression tests provide expected values # If last element is not SS_OK, tst_run() pops off expected value and # processes commands same as it did previously my $arr_ref = shift; # Pass benchmark()'s @tst_cmd via reference to maintain coherence my @cmd_lst= @$arr_ref; # Dereference to new array name # Clear variables my $ssdwrap_cmd = $dbg_sng = $err_sng = $pfx_mpi = $pfx_fk = ""; my $cmd_rsl_is_nbr = 1; my $xpc_is_nbr = 1; # for extra return value checks # Twiddle $pfx_cmd to allow running mpnc* as non-MPI'd executable if ($mpi_fk) {$pfx_fk = "$MY_BIN_DIR/mp"; } $pfx_cmd = "$MY_BIN_DIR/"; # $pfx_mpi always has mpirun directive # AIX can run naked command as long as environment has been set up # NB: This is for regression testing on interactive node, # not for benchmarking under POE - intercepted and handled at startup # on AIX, non-MPI ops compiled with MPI will atttempt to run MP_PROCS. # To hold them to one process, must add explicit prefix ($aix_mpi_sgl_nvr), added below my $aix = 0; if ($os_nm =~ /AIX/) {$aix = 1;} # yafv for aix if($aix){$pfx_mpi=" $aix_mpi_nvr_pfx $MY_BIN_DIR/mp";} elsif($mpi_upx eq "") { # Assume Linux-like MPI $pfx_mpi = "mpirun -np $mpi_prc $MY_BIN_DIR/mp"; }else{ $pfx_mpi = " ". $mpi_upx . " $MY_BIN_DIR/mp"; } # use user-supplied prefix $pfxd = 1; $timed = 1; my $pwd=`pwd`; chomp $pwd; dbg_msg(1,"\$pwd=$pwd | \$pfx_cmd=$pfx_cmd | \$pfx_mpi=$pfx_mpi | \$pfx_fk=$pfx_fk"); # Delete everything in DAP subdir to force DAP retrieval # $drc_dat has by now been directed to $drc_dat/DAP_DIR # print "DEBUG[tst_run]:\$dodap = [$dodap], \$prsrv_fl = [$prsrv_fl]\n"; if ($dodap ne "FALSE" && !$prsrv_fl) { print "\nWARN: about to unlink everything in $drc_dat ! Continue? [Ny]\n"; my $wait = ; if ($wait !~ /[Yy]/){ die "Make sure of the commandline options!\n";} my $unlink_cnt = unlink <$drc_dat/*>; print "\nINFO: OK - unlinked $unlink_cnt files\n"; } # print "just past unlinking stage \n"; my $wait = ; if($dbg_lvl > 0){ for(my $cmd_idx=0; $cmd_idx <= $#cmd_lst; $cmd_idx++) {print "### cmd_lst[$cmd_idx] = $cmd_lst[$cmd_idx] ###\n";} } # Perform tests of requested operator; default is all if (!defined $tst_nbr{$opr_nm}) { #print "DEBUG: \$tst_nbr{\$opr_nm} not defined - going to exit!\n"; @cmd_lst=(); # Clear test array # and init the timing hashes $real_tme{$opr_nm}=0; $usr_tme{$opr_nm}=0; $sys_tme{$opr_nm}=0; return; }else{ #print "\$tst_nbr{\$opr_nm} = $tst_nbr{$opr_nm}\n"; } # print "DEBUG: for $opr_nm, \$tst_nbr{\$opr_nm} = $tst_nbr{$opr_nm}\n"; $subbenchmarks{$opr_nm} = 0; $tst_nbr{$opr_nm}++; my $cmd_lst_cnt = 0; my $t = 0; my $lst_cmd = @cmd_lst; my $elapsed; $lst_cmd--; dbg_msg(4,"\n nsr_xpc = $nsr_xpc\n dbg_lvl = $dbg_lvl\n wnt_log = $wnt_log\n cmd_lst = @cmd_lst"); &bm_vrb($dbg_lvl, $wnt_log, "\n\n============ New Test ==================\n"); # csz++ $dot_nbr_min=3; # Minimum number of dots between description and "ok" result $dot_sng='.....................................................................'; $dsc_lng_max=80; # Maximum length of description printed $opr_lng_max=7; # Maximum length of operator name $spc_nbr_min=1; # Minimum number of spaces between test ID and description $spc_sng=' '; $dot_nbr=$dot_nbr_min; # Number of dots printed $spc_nbr=$spc_nbr_min; # Number of spaces printed $opr_fmt=sprintf("%%.%ds",$opr_lng_max); if($opr_lng_max-length($opr_nm)>0){$spc_nbr+=$opr_lng_max-length($opr_nm);} $spc_fmt=sprintf("%%.%ds",$spc_nbr); $tst_id_sng=sprintf("$opr_fmt$spc_fmt",$opr_nm,$spc_sng).sprintf("test %02d: ",$tst_nbr{$opr_nm}); if($dsc_lng_max-length($dsc_sng)>0){$dot_nbr+=$dsc_lng_max-length($dsc_sng);} $dsc_fmt=sprintf('%%.%ds',$dsc_lng_max); $dot_fmt=sprintf("%%.%ds",$dot_nbr); $tst_fmt="$tst_id_sng$dsc_fmt$dot_fmt"; printf STDERR ($tst_fmt,$dsc_sng,$dot_sng); # csz-- # SS checks and balances # $ncks_chk = SS_gnarly_pything(\@cmd_lst) my $SS_nsr_xpc = 0; my $SS_OK = 1; if ($cmd_lst[$#cmd_lst] ne "SS_OK") {$SS_OK = 0;} # check on last el whether cmds can be SS'ed if ($SS_OK && $srv_sd ne "SSNOTSET" ) { SS_prepare(); # make sure things are init'ed # Send for processing and get back string or single value to check $SS_nsr_xpc=SS_gnarly_pything(\@cmd_lst); $cmd_rsl=$SS_nsr_xpc; # do this in one step later # and undef the last one to leave the expected value as last value delete $cmd_lst[$#cmd_lst]; $nsr_xpc=$cmd_lst[$#cmd_lst]; # pop last value to provide exepected answer # print "\n##DEBUG:\t$nsr_xpc (expt)\n\t\t$cmd_rsl (SS)\n"; } else { # delete SS value to leave "expected value" as last delete $cmd_lst[$#cmd_lst]; # regardless, pop the next value off to provide the 'expected value' $nsr_xpc = $cmd_lst[$#cmd_lst]; # pop the next value off \ delete $cmd_lst[$#cmd_lst]; # and now the $cmd_lst is the same as it ever was.. #print "\nDEBUG:in tst_run:613, \$mpi_prc=[$mpi_prc] \$pfx_mpi=[$pfx_mpi] \$mpi_fk=[$mpi_fk]\n"; foreach (@cmd_lst){ # print "\nforeach cmd_lst = $_\n"; my $md5_chk = 1; $dbg_sng .= "\nDEBUG: Full commandline for part $cmd_lst_cnt:\n"; if ($_ !~ /foo.nc/) {$md5_chk = 0;} my $opcnt = 0; my $md5_dsc_sng = $dsc_sng . "_$cmd_lst_cnt"; # Substitute real for fake file names (%*%) my $r = 0; my $N = my @L = split; while ($r <= $N) { if ($L[$r] =~ /\%.{8,9}\%/){ $L[$r] = $fl_nm_lcl{$L[$r]};} $r++; } $_ = ""; # zero and then reconstitute $_ for ($r=0; $r<= $N; $r++) {$_ .= $L[$r] . " ";} #print "DEBUG: reconstituted \$_ = $_\n"; # Add $pfx_cmd only to NCO operator commands, not things like 'cut'. foreach my $op (@opr_lst_all) { $pfx_cmd_crr=$pfx_cmd; if ($op eq 'ncap2'){ # 20100915 Hack fix for ncap2 with Chad if (defined $ENV{'MY_BIN_DIR'} && $ENV{'MY_BIN_DIR'} ne ""){ # $pfx_cmd_crr=$ENV{'MY_BIN_DIR'}; $pfx_cmd_crr=$MY_BIN_DIR.'/'; # $pfx_cmd_crr=$pfx_cmd; }else{ $pfx_cmd_crr='../src/nco++'.'/'; # $pfx_cmd_crr=$pfx_cmd; } } # endif ncap2 if ($_ =~ m/$op/ ) { # If op is anywhere in main list if ($mpi_prc > 0 && $opr_sng_mpi =~ /$op/) { $_ = $tmr_app . $pfx_mpi . $_; } # ...and in MPI list... elsif ($mpi_fk && $opr_sng_mpi =~ /$op/) { $_ = $tmr_app . $pfx_fk . $_; } # Fake prefix # Non-MPI applications compiled w/MPI need special prefix to hold them to single process elsif ($aix) {$_ = $tmr_app . $aix_mpi_sgl_nvr_pfx . $pfx_cmd_crr . $_;} else {$_ = $tmr_app . $pfx_cmd_crr . $_; } # Standard prefix dbg_msg(1, "URGENT:before execution, cmd_ln= $_ \n"); last; } } # end of foreach my $op (@opr_lst_all) $dbg_sng .= "DEBUG:$_\n"; # NB: May require ONLY HiRes timing since SERVERSIDE will be hard to do otherwise # timing code using Time::HiRes my $t0; if($hiresfound) {$t0 = [gettimeofday()];} else{$t0 = time;} # Execute command, split off stderr to file 'nco_bm.stderr' $cmd_rsl = `($_) 2> nco_bm.stderr`; # stderr contains timing info, if any # print "\nDEBUG: cmd = $_ \n and \$cmd_rsl = $cmd_rsl\n "; if ($dbg_lvl >= 1) {print "\nDEBUG: result of [$_]\n = [$cmd_rsl]\n";} chomp $cmd_rsl; # # still newlines in $cmd_rsl? -> a multiline result & only want the last one. # if ($cmd_rsl =~/\n/) { # my @rsl_arr = split(/\n/, $cmd_rsl); # $cmd_rsl = $rsl_arr[$#rsl_arr]; # take the last line # if ($dbg_lvl >= 1) {print "\nprocessed multiline \$cmd_rsl = [$cmd_rsl]\n";} # } # # figure out if $cmd_rsl is numeric or alpha # if ($cmd_rsl =~ /-{0,1}\d{0,9}\.{0,1}\d{0,9}/ && # $cmd_rsl !~ /[a-df-zA-DF-Z ,]/) { $cmd_rsl_is_nbr = 1;} # else { #print "DEBUG: \$cmd_rsl is not numeric: $cmd_rsl \n"; # $cmd_rsl_is_nbr = 0; # } # # figure out if $nsr_xpc is numeric or alpha # if ($nsr_xpc =~ /-{0,1}\d{0,9}\.{0,1}\d{0,9}/ && # $nsr_xpc !~ /[a-df-zA-DF-Z ,]/) { $xpc_is_nbr = 1;} # else { #print "DEBUG: \$nsr_xpc is not numeric: $nsr_xpc \n"; # $xpc_is_nbr = 0; # } if ($timed) { $sys_time = `cat nco_bm.stderr`; if ($sys_time ne "") { if ($sys_time =~ /ERR/ ) {last;} $sys_time =~ s/\n/ /g; # print "\$sys_time = [$sys_time]\n"; @sys_tim_arr = split(" ", $sys_time); # [0]real [1]0.00 [2]user [3]0.00 [4]sys [5]0.00 my @rev_sys_tim_arr = reverse @sys_tim_arr; # print"\@revsys_tim_arr = @rev_sys_tim_arr\n"; # this will fail if an error occurs which offsets the time info, so you have to step thru the list until hit 'real' which syncs the array. or do it from the back end. $real_tme{$opr_nm} += $rev_sys_tim_arr[0] + 0; # '+0 forces conversion to a nbr $usr_tme{$opr_nm} += $rev_sys_tim_arr[2] + 0; $sys_tme{$opr_nm} += $rev_sys_tim_arr[4] + 0; } } if($hiresfound) {$elapsed = tv_interval($t0, [gettimeofday()]);} else{$elapsed = time - $t0;} #print "inter benchmark for $opr_nm = $subbenchmarks{$opr_nm} \n"; $subbenchmarks{$opr_nm} += $elapsed; # $tst_idx = $tst_nbr{$opr_nm}-1; if($dbg_lvl > 3){print "\t$opr_nm subtest [$t] took $elapsed seconds\n";} $dbg_sng .= "DEBUG: Result = [$cmd_rsl]\n"; #and here, check results by md5 checksum for each step - insert guts of rsl_chk_MD5_wc() # have to mod the input string - suffix with the cycle# # follow check only if the MD5 module is present, there's a foo.nc to check ($fl_nm_lcl{'%tmp_fl_00%'} = 'foo.nc') # & non-terminal cmd (the terminal command is ncks which is expected to return a single value or string) # dbg_msg(3,"rsl_chk_MD5_wc(): \$md5 = $md5, \$md5_chk = $md5_chk, \$cmd_lst_cnt ($cmd_lst_cnt) < \$lst_cmd ($lst_cmd)"); # if ($md5 && $md5_chk && $cmd_lst_cnt < $lst_cmd) { # dbg_msg(2,"Entering rsl_chk_MD5_wc() with \$fl_nm_lcl{'%tmp_fl_00%'}=$fl_nm_lcl{'%tmp_fl_00%'}"); # rsl_chk_MD5_wc($fl_nm_lcl{'%tmp_fl_00%'}, $md5_dsc_sng); # } # if ($md5_chk == 0 && $dbg_lvl > 0) { $dbg_sng .= "WARN: No MD5/wc check on intermediate file.\n";} # else old-style check has already been done and results are in $cmd_rsl, so process normally $cmd_lst_cnt++; if ($dbg_lvl > 2) { print "\ntst_run: test cycle held - hit to continue\n"; my $wait = ; } } # end loop: foreach (@cmd_lst) } # end of client side 'else' $dbg_sng.="DEBUG: Total time for $opr_nm [$tst_nbr{$opr_nm}] = $subbenchmarks{$opr_nm} s\n"; $totbenchmarks{$opr_nm}+=$subbenchmarks{$opr_nm}; # Results comparison should not be necessary to validate whole file, # not just a single value. # chomp $cmd_rsl; # Remove trailing newline for easier regex comparison # Still newlines in $cmd_rsl? -> a multiline result & only want the last one. if($cmd_rsl =~/\n/){ my @rsl_arr = split(/\n/, $cmd_rsl); $cmd_rsl = $rsl_arr[$#rsl_arr]; # take the last line if($dbg_lvl >= 1){print "\nprocessed multiline \$cmd_rsl = [$cmd_rsl]\n";} } # Is $cmd_rsl numeric or alpha? if($cmd_rsl =~ /-{0,1}\d{0,9}\.{0,1}\d{0,9}/ && $cmd_rsl !~ /[a-df-zA-DF-Z ,]/) { $cmd_rsl_is_nbr = 1;} else{ #print "DEBUG: \$cmd_rsl is not numeric: $cmd_rsl \n"; $cmd_rsl_is_nbr = 0; } # Is $nsr_xpc numeric or alpha? if($nsr_xpc =~ /-{0,1}\d{0,9}\.{0,1}\d{0,9}/ && $nsr_xpc !~ /[a-df-zA-DF-Z ,]/) { $xpc_is_nbr = 1;} else{ #print "DEBUG: \$nsr_xpc is not numeric: $nsr_xpc \n"; $xpc_is_nbr = 0; } # Compare numeric results if($cmd_rsl_is_nbr && $xpc_is_nbr){ # && it equals the expected value #print "\n \$nsr_xpc [$nsr_xpc] considered a number\n"; $dbg_sng.="DEBUG: \$nsr_xpc assumed to be numeric: $nsr_xpc & actual \$cmd_rsl = [$cmd_rsl]\n"; if($nsr_xpc == $cmd_rsl){ $success{$opr_nm}++; printf STDERR (" SVn ok\n"); $dbg_sng .= "DEBUG: PASSED (Numeric output)\n"; }elsif(abs($cmd_rsl - $nsr_xpc) < 0.02){ $success{$opr_nm}++; printf STDERR (" SVn prov. ok\n"); $dbg_sng .= "DEBUG: PASSED PROVISIONALLY (Numeric output):[$nsr_xpc vs $cmd_rsl]\n"; }else{ printf STDERR (" FAILED!\n"); &failed($nsr_xpc); my $diff = abs($nsr_xpc - $cmd_rsl); $dbg_sng .= "DEBUG: !!FAILED (Numeric output) [expected: $nsr_xpc vs result: $cmd_rsl]. Difference = $diff.\n"; } }elsif(!$cmd_rsl_is_nbr && !$xpc_is_nbr){# Compare non-numeric tests dbg_msg(2,"DEBUG: expected value assumed to be alphabetic: $nsr_xpc\n\$cmd_rsl = $cmd_rsl\n"); #print "\n \$nsr_xpc [$nsr_xpc] considered a string\n"; # Compare $cmd_rsl with $nsr_xpc # if ($cmd_rsl =~ $nsr_xpc) { if(substr($cmd_rsl,0,length($nsr_xpc)) eq $nsr_xpc){ $success{$opr_nm}++; printf STDERR (" SVa ok\n"); $dbg_sng .= "DEBUG: PASSED Alphabetic output"; }else{ &failed($nsr_xpc); $dbg_sng .= "DEBUG: !!FAILED Alphabetic output (expected: $nsr_xpc vs result: $cmd_rsl) "; } }else{ # No result at all? print STDERR " !!FAILED\n \$cmd_rsl_is_nbr = $cmd_rsl_is_nbr and \$xpc_is_nbr = $xpc_is_nbr\n"; &failed(); $dbg_sng .= "DEBUG: !!FAILED - No result from [$opr_nm]\n"; } print $err_sng; if($dbg_lvl > 0){print $dbg_sng;} if($wnt_log){print LOG $dbg_sng;} @cmd_lst=(); # Clear test if(!$bm){$prsrv_fl = 0;} # reset so files will be deleted unless doing benchmarks if(-e $fl_nm_lcl{'%tmp_fl_00%'} && -w $fl_nm_lcl{'%tmp_fl_00%'}){unlink $fl_nm_lcl{'%tmp_fl_00%'};} } # end tst_run() #################### # %SSD : a hash/dict that contains (configurable) settings for server-side dap. # %SSD is used as a namespace in lieu of a package namespace. Quick measurements # of accessing by hash show a 2x exec time increase--> # 2 normal var access = 1 hash access, which is small (compare to C/C++ 100x? diff) our %SSD; # Initialize ssd variables. sub SS_init { # no params for SS_init now. use File::Spec; $SSD{"url"} = "http://dust.ess.uci.edu/cgi-bin/dods/nph-dods"; $SSD{"inpathfrom"} = "../data"; # inpathfrom ($in_pth) needs to match $in_pth in NCO_rgr.pm # and NCO_benchmarks.pm $SSD{"inpathto"} = "dodsdata"; # inpathto needs to match the server's path to benchmarking data # temp-script filename -- probably want to munge to prevent conflict $SSD{"tfname"} = File::Spec->catfile(".", "nco_rgr_tmp_4scriptwrap"); # path to scriptwrap.py (or equivalent) $SSD{"scrwrp_pth"} = File::Spec->catfile('..','src','ssdap','scriptwrap.py'); # remember that we got initialized $SSD{"initialized"} = 1; # now do a quick sanity check. if (my $errorstring = SS_sanity_check()) { die "SS sanity check failed.: \n$errorstring\n" ; } } # if SS_OK && the user requests a SS attempt .. # this needs to be functionized to: # - breathe in the cmd_lst, # - replace the fl_out with the %tmp_flile% params (most '$fl_out's -> '%temp_00%' # - change the in_pth arg to look for files in the dodsdata dir (replace -p xxx to -p dodsdata) # - write that block to disk, # - execute the scriptwrap cmd and breathe back in the returned value, currently just the ncks single value # $ncks_chk = SS_gnarly_thing(\@cmd_lst); sub SS_gnarly_pything { my $arr_ref = shift; # now passing in tst_run()'s cmd_lst via a ref to maintain NS separation my $tfname = $SSD{"tfname"}; SS_make_script($tfname, $arr_ref); #print "TF should be done - waiting for action\n"; #my $wait = ;#my $wait = ; # print "\n##SS cmd: $MY_BIN_DIR/scriptwrap.py $tfname $SS_URL\nand waiting for key to tst_run"; my $wait = ; # and finally EXECUTE it # FXM/FIXME : for now, look for scriptwrap.py in src/ssdap dir. my $xpct_val = SS_send_script($tfname, $SSD{"url"}); # and now (unfortunately), write it to disk and then execute the scriptwrap.py to get a value. #unlink "nco_rgr_tmp_4scriptwrap" or die "Can't unlink the temp file: 'nco_rgr_tmp_4scriptwrap'\n"; #print "returned value = $xpct_val \n"; #my $wait = ; return $xpct_val; } # $ncks_chk = SS_gnarly_thing($tfname, \@cmd_lst); sub SS_make_script { my $tfname = shift; # file to write script to. my $arr_ref = shift; # now passing in tst_run()'s cmd_lst via a ref to maintain NS separation my @sscmd_lst= @$arr_ref; # deref the ref to a new array name my $in_pth = $SSD{"inpathfrom"}; my $dodsdata = $SSD{"inpathto"}; # Write out array replacing each $fl_out with the %temp% spec # First command must specify starting datadir, but client may not know it, # so substitute any '-p URL' with '-p %datadir%' which may be escaped at # some level. # Further commands act on %fl_out%, so no '-p' substitution is necessary # Assume that '-p URL' is in first command, but check all commands for '-p' # because of mixed programming model, # Simplest to write to disk and send via pything. # File name can be re-useable: 'nco_regr_temp_4scriptwrap' # NB: Chew off extra bits before processing actual scripts # i.e., as above, ignore last two entries (return value and SS_OK status) # print "MY_BIN_DIR = $MY_BIN_DIR\n"; # print "DATA_DIR = $drc_dat\n"; my $lst_scrt_idx = $#sscmd_lst - 2; # last script index that has content to be sent to the server. local *TF; open(TF, "> $tfname") or die "\nUnable to open temp file '$tfname'.\n"; my $r = 0; my $sscl = ""; # 'server side cmd line' holds the SS version of the individual command lines while ($r <= $lst_scrt_idx) { #print "before chang'g line [$r]:\n$sscmd_lst[$r] \n"; my $skip = 0; local $_; foreach (split (/\s+/, $sscmd_lst[$r])) { if ($skip == 1) { $skip = 0; } elsif (/^\Q$in_pth/) { # this should be more robust s/\Q$in_pth/$dodsdata/; # substitute $in_pth with $dodsdata $sscl .= $_ . " "; } elsif ( /^\-\-mmr_cln/ ) { #don't pass --mmr_cln option to server # until server can gracefully drop this. } else { $sscl .= $_ . " ";} # copy each term over to ss cl } if ($r == $lst_scrt_idx && $sscmd_lst[$r] =~ /ncks/) { $sscl .= " %stdouterr% "; # SS needs this as the final term to return a value. } #print " cmd_ln [$r] munged for SS:\n$sscl \n"; #my $wait = ; # and write it to the temp files print TF "$sscl\n"; $r++; $sscl = ""; } close TF; #print `cat $tfname`; # for debugging. } # SS_send_script($filename, $url) sub SS_send_script { my $fname = shift; my $url = shift; my $scrwrp_pth = $SSD{"scrwrp_pth"}; my $xpct_val = `$scrwrp_pth $fname $url`; return $xpct_val; } # SS_sanity_check() returns an error string on failure; nothing if things are okay. # example: #if (my $errorstring = SS_sanity_check()) { # die "SS sanity check failed.: \n$errorstring\n" ; #} sub SS_sanity_check { local *F; my $fname = $SSD{"tfname"}; open(F, ">$fname") || return "Can't open $fname for writing script file."; print F "ncks --version %stdouterr%\n"; close(F); my $versionblock = SS_send_script($fname, $SSD{"url"}); if ($versionblock =~ m/ncks version/) { return ;} else { return $versionblock; } return "Unhandled code path"; } # call if we haven't been initialized. sub SS_prepare { SS_init() unless $SSD{"initialized"}; } #################### sub failed { $failure{$opr_nm}++; $err_sng .= " ERR: FAILURE in $opr_nm failure: $dsc_sng\n"; foreach(@cmd_lst) { $err_sng .= " $_\n";} $err_sng .= " ERR::EXPLAIN: Result: [$cmd_rsl] != Expected: [$nsr_xpc]\n\n" ; return; } sub rsl_smr_rgr { my $ansr=''; my $nco_vrs_sng = vrs_sng_get(); my $CC = `$MY_BIN_DIR/ncks --compiler`; my $idstring = ""; my $CCinfo = ''; if ($CC =~ /gcc/) {$CCinfo = `gcc --version |grep -i gcc`;} elsif ($CC =~ /xlc/) {$CCinfo = "xlc version ??";} elsif ($CC =~ /icc/) { my $icc_ver = `icc --version`; chomp $icc_ver; $CCinfo = "Intel C Compiler version $icc_ver"; } chomp $CCinfo; my $idstring = `uname -a`; chomp($idstring); my $reportstr = "\n\n" . $idstring . "; " . $CCinfo . "; " . $timestamp . "\n"; $reportstr .= "\n Test Results Seconds to complete\n"; $reportstr .= " -------------------------- ----------------------------------------\n"; $reportstr .= " Test Success Failure Total WallClock Real User System Diff"; # csz++ # *thr_nbr=*main::thr_nbr; # csz-- if ($thr_nbr > 0) {$reportstr .= " (OpenMP threads = $thr_nbr)\n";} else {$reportstr .= "\n";} my $udp_dat = $idstring . " using: " . $CCinfo . "|" . "NCO ver: $nco_vrs_sng" . "|" . $cmd_ln . "|"; foreach(@opr_lst) { my $total = $success{$_}+$failure{$_}; my $fal_cnt = ''; if ($failure{$_} == 0){ $fal_cnt = " "; } else {$fal_cnt = sprintf "%3d", $failure{$_};} #printf "$_:\tsuccess: $success{$_} of $total\n"; if ($total > 0) { my $io_tm = $real_tme{$_} - $usr_tme{$_} - $sys_tme{$_}; $reportstr .= sprintf "%10s: %3d %3s %3d %6.2f %6.2f %6.2f %6.2f %6.2f\n", $_, $success{$_}, $fal_cnt, $total, $totbenchmarks{$_}, $real_tme{$_}, $usr_tme{$_}, $sys_tme{$_}, $io_tm; $udp_dat .= sprintf "%s %3d %3d %6.2f %6.2f %6.2f %6.2f %6.2f:",$_, $success{$_}, $total, $totbenchmarks{$_},$real_tme{$_}, $usr_tme{$_}, $sys_tme{$_}, $io_tm ; # above line uses whitespace sep, with ':' separating test names. } } $reportstr .= sprintf "\nNB:MD5: test passes MD5 checksum on file(s) May be more than one intermediate file.\nSVx: test passes single terminal value check SVn=numeric, SVa=alphabetic\n"; chdir "../bld"; if ($dbg_lvl == 0) {print $reportstr;} else { &bm_vrb($dbg_lvl, $wnt_log, $reportstr); } my $skp_rpt = $ENV{'NCO_AVOID_BM_REPORT'}; #print "skp_rpt=", $skp_rpt; #print "udp_rpt=", $udp_rpt; if ($skp_rpt == 1){ $udp_rpt = 0; #print "udp_rpt=", $udp_rpt; } if ($udp_rpt == 1 ) { # set either explicitly (1st time) or set in ~/.ncorc after user agreed to it print "\n\nThe log-formatted result from this regression test is:\n$udp_dat\n\n"; print << "REQ_REGR_PACKET"; --== REQUEST for TEST RESULTS ==-- The NCO team would REALLY appreciate it if you would allow us to have the above results of this regression test. If you type 'yes' in response to this question, the results of this regression test will be sent verbatim as above, anonymously, to the NCO dev team via UDP on port 29659. If your institution has a firewall that prohibits this, it will simply fail silently. We want this info so we can fix failures, improve efficiency, mitigate global warming, and bring about world peace. If you DO NOT want to participate in this, type in anything OTHER than [y, Y, yes or YES]. will also decline sending the data. Do you allow the above regression data to be sent back to the NCO dev team? [default is No, y, Y, yes, YES to send it] REQ_REGR_PACKET print "Answer: "; $ansr = ; chomp $ansr; } if ($udp_rpt || $ansr eq "y" || $ansr eq "yes" || $ansr eq "Y" ||$ansr eq "YES") { $sock->send($udp_dat); print "\nUDP Data sent! The NCO dev team thanks you!!\nHave a good one, eh!?\n\n\n"; if ($dbg_lvl > 0) { print "Regression: udp stream sent to $server_ip:\n$udp_dat\n";} # and write this agreement to the ~/.ncorc file so user isn't bothered by this again. if (!-e "~/.ncorc") { #my $HOME = $ENV{'HOME'} open(RC, "> $ENV{'HOME'}/.ncorc") or die "can't create a .ncorc file in home dir!\n"; print RC "udp_report=yes\n"; close RC; } } else { print "\nOK - data NOT sent, thanks for using NCO anyway - bye!\n\n"; } } # end of sub rsl_smr_rgr sub rsl_chk_MD5_wc { # taken substantially from process_tacg_results (in testtacg.pl), hjm dbg_msg(3, "rsl_chk_MD5_wc()::\$fl_pth = $fl_pth"); my $file = shift; # 1st arg my $testtype = shift; # 2nd arg # my $md5found = shift; # 3rd arg my $pfx_cmd = "$MY_BIN_DIR/"; $pfxd = 1; # embed timer command and local bin directory my $cmd_ln = $_; my $return_value = $cmd_rsl; # return value of executing non-terminal commands my $hash = ""; my @wc_lst; my $wc = ""; if ($return_value != 0) { # nco.h:131:#define EXIT_SUCCESS 0 print LOG "NonZero return value = $cmd_ln\n"; } else { # 1st do an ncks dump on the 1st 111111 lines (will cause a sig13 due to the head cmd) system("$pfx_cmd/ncks -P $file |head -111111 > $fl_pth/wc_out"); @wc_lst = split(/\s+/, `wc $fl_pth/wc_out`); $wc = $wc_lst[1] . " " . $wc_lst[2] . " " . $wc_lst[3]; # however we can do an md5 fo the entire output file if ($md5found == 1) { open(FILE, "$file") or die "Can't open $fl_pth/wc_out\n"; binmode(FILE); $hash = Digest::MD5->new->addfile(*FILE)->hexdigest ; } else { $hash = "UNDEFINED"; } print LOG "\n\"$testtype\" => ", "\"$hash\", #MD5\n\"$testtype\" => ", "\"$wc\", #wc\n$cmd_ln\n\n"; } if ($md5found == 1) { if ( $MD5_tbl{$testtype} eq $hash ) { print " MD5"; bm_vrb " MD5"; } else { print " MD5 fail,"; bm_vrb " MD5 fail,"; # test: $testtype\n"; if ($dbg_lvl > 1) {bm_vrb "MD5 sig: $hash should be: $MD5_tbl{$testtype}\n";} if ($wc eq $wc_tbl{$testtype}) { print "WC PASS "; bm_vrb "WC PASS "; } else { print " WC fail,"; bm_vrb " WC fail,"; } my $errfile = "$file" . ".MD5.err"; # will get overwritten; halt test if want to keep it. system("cp $file $errfile"); } } else { if ($wc_tbl{$testtype} eq $wc) { print "passed wc \n"; bm_vrb "passed wc \n"; } else { print " WC fail,";bm_vrb " WC fail,"; my $errfile = "$testtype" . ".wc.err"; print "\n\ncp $fl_pth/out $fl_pth/$errfile\n\n"; system("cp $fl_pth/out $fl_pth/$errfile"); } } return $hash; } # end rsl_chk_MD5_wc() sub wat4inpt{ my $line = shift; my $msg = shift; if ($msg eq "") {$msg = "no additional info"} if ($dbg_lvl > 2) { print "\n\n-------------------------------\nExecution halted near line $line - hit a key to continue.\n[$msg]\n-------------------------------\n"; my $tmp=; } } # end wat4inpt() sub dbg_msg { my $okdbg = shift; my $msg = shift; if ($dbg_lvl >= $okdbg) { print "\nDEBUG[bm:$okdbg]: $msg\n\n"; } } # Grab NCO version and conmogrify it into something like: "3.0.1 / 20051003" # Requires a string variable to absorb returned string sub vrs_sng_get{ my @nco_vrs; my $tmp_sng = `ncks --version 2>&1 | grep version | head -2`; # long string sep by a newline. $tmp_sng =~ s/\n/ /g; my @tmp_lst = split (/\s+/, $tmp_sng); $nco_vrs[0] = $tmp_lst[4]; $nco_vrs[0] =~ s/"//g; $nco_vrs[1] = $tmp_lst[scalar(@tmp_lst) - 1]; # print "NCO release version: $nco_vrs[0], NCO date version: $nco_vrs[1]\n"; $tmp_sng = "$nco_vrs[0]" . "/" . "$nco_vrs[1]"; return $tmp_sng; } # Following two lines required to provide 'true' value at package end 1; __END__ nco-4.5.4/bm/NCO_rgr.pm000066400000000000000000010110241264355130400145320ustar00rootroot00000000000000package NCO_rgr; # $Header$ # Purpose: All REGRESSION tests for NCO operators # BENCHMARKS are coded in "NCO_benchmarks.pm" # NB: When adding tests, _be sure to use -O to overwrite files_ # Otherwise, script hangs waiting for interactive response to overwrite queries require 5.6.1 or die "This script requires Perl version >= 5.6.1, stopped"; use English; # WCS96 p. 403 makes incomprehensible Perl errors sort of comprehensible use Cwd 'abs_path'; use strict; use NCO_bm qw(dbg_msg tst_run $pfx_cmd $pfx_cmd_crr $drc_dat @fl_mtd_sct $opr_sng_mpi $opr_nm $dsc_sng $prsrv_fl $nsr_xpc $srv_sd ); require Exporter; our @ISA = qw(Exporter); our @EXPORT = qw ( tst_rgr $fl_out $dodap $dbg_lvl $pfx_cmd $pfx_cmd_crr $opr_sng_mpi $opr_nm $dsc_sng $prsrv_fl $nsr_xpc $foo1_fl $foo_fl $foo_tst $fl_out_rgn $foo_avg_fl $foo_x_fl $foo_y_fl $foo_yx_fl $foo_xy_fl $foo_xymyx_fl $pth_rmt_scp_tst $omp_flg $nco_D_flg %NCO_RC ); use vars qw( $dodap $dbg_lvl $drc_dat $dsc_sng $dust_usr $fl_fmt $fl_pth $foo1_fl $foo2_fl $foo_avg_fl $foo_fl $foo_tst $foo_x_fl $foo_xy_fl $foo_xymyx_fl $foo_y_fl $foo_yx_fl $mpi_prc $nco_D_flg $localhostname $nsr_xpc $omp_flg $opr_nm $opr_rgr_mpi $fl_out_rgn $fl_out $pth_rmt_scp_tst $prsrv_fl @tst_cmd $USER %NCO_RC ); sub tst_rgr { # Tests are organized and laid-out as follows: # Tests are in alphabetical order by operator name # $tst_cmd[] holds command lines for each operator being tested # Last two lines are the expected value and the serverside string, either: # "NO_SS" - No ServerSide allowed or (all regr are NO_SS still) # "SS_OK" - OK to send it ServerSide (request with '--serverside') # $dsc_sng still holds test description line # tst_run() is function which executes each test my $in_pth="../data"; my $in_pth_arg="-p $in_pth"; $prsrv_fl=0; # csz++ # fxm: pass as arguments or use exporter/importer instead? *dbg_lvl=*main::dbg_lvl; *dodap=*main::dodap; *fl_fmt=*main::fl_fmt; *fl_out=*main::fl_out; *localhostname=*main::localhostname; *nco_D_flg=*main::nco_D_flg; *omp_flg=*main::omp_flg; NCO_bm::dbg_msg(1,"in package NCO_rgr, \$dbg_lvl = $dbg_lvl"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$dodap = $dodap"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$fl_fmt = $fl_fmt"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$fl_out = $fl_out"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$localhostname = $localhostname"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$nco_D_flg = $nco_D_flg"); NCO_bm::dbg_msg(1,"in package NCO_rgr, \$omp_flg = $omp_flg"); # csz-- # in general, $fl_out -> %tmp_fl_00% # $foo_fl -> %tmp_fl_01% # $foo_tst -> %tmp_fl_02% # $foo_avg_fl -> %tmp_fl_03% # $foo1_fl -> %tmp_fl_01% # $foo2_fl -> %tmp_fl_02% if($dodap ne "FALSE"){ print "DEBUG: in tst_rgr(), \$dodap = $dodap \n"; if($dodap ne "" && $fl_pth =~ /http/) { $in_pth_arg = "-p $fl_pth"; } if($dodap eq "") { $in_pth_arg = "-p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata"; } } NCO_bm::dbg_msg(1,"------------- REGRESSION TESTS STARTED from tst_rgr() -------------"); print "\n"; my $RUN_NETCDF4_TESTS=0; my $RUN_NETCDF4_TESTS_VERSION_GE_431=0; #my $lbr_rcd_cmd=${pfx_cmd}."ncks --lbr_rcd"; my $lbr_rcd_cmd="ncks --lbr_rcd"; system($lbr_rcd_cmd); if($? == -1){ print "failed to execute: ncks --lbr_rcd: $!\n"; }else{ # system() runs command and returns exit status information as 16-bit value # Low 7 bits are signal process died from, if any, and high 8 bits are actual exit value my $exit_value=$? >> 8; # 20150619: nco_exit_lbr_vrs() deducts offset of 300 so rcd < 255 # Verify exit status in shell with "echo $?" # Library 4.3.3 should return $? = 133 $exit_value+=300; # nco_exit_lbr_rcd() returns codes: # 360 (for library 3.x) # 410 (for library 4.1.x) # 430 (for library 4.3.0) # 433 (for library 4.3.3) if($exit_value == 410){print "netCDF version 4.1.x detected\n";} if($exit_value == 431){print "netCDF version 4.3.1 detected\n";} if($exit_value == 432){print "netCDF version 4.3.2 detected\n";} if($exit_value == 433){print "netCDF version 4.3.3 detected\n";} if($exit_value == 440){print "netCDF version 4.4.0 detected\n";} if($exit_value >= 400){$RUN_NETCDF4_TESTS=1;} if($exit_value >= 431){$RUN_NETCDF4_TESTS_VERSION_GE_431=1;} } print "\n"; #################### #### ncap2 tests #### #################### $opr_nm='ncap2'; #################### # This stanza will not map to the way the SS is done - needs a %stdouterr% added but all the rest of them # have an ncks which triggers this addition from the sub tst_run() -> gnarly_pything. # this stanza also requires a script on the SS. # 20150617: ncap2.in has failed for years because time1 attribute bounds is passed with att_item.val=NULL # This is fixable (at least by Henry). But for now, omit this known-to-fail test. if(0){ $dsc_sng="running ncap2.in script in nco_bm.pl (failure expected)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -v -S ncap2.in $in_pth_arg in.nc %tmp_fl_00% %stdouterr%"; $tst_cmd[1]="ncks -C -H -v b2 --no_blank -s '%d' %tmp_fl_00%"; $tst_cmd[2]="999"; $tst_cmd[3]="NO_SS"; # $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # printf("paused @ [%s:%d] - hit return to continue\n", __FILE__, __LINE__); my $wait = ; } # endif false # ncap2 -O -v -s 'tpt_mod=tpt%273.0f' ~/nco/data/in.nc ~/foo.nc # ncks -C -H -v tpt_mod -s '%.1f' ~/foo.nc $dsc_sng="Testing float modulo float"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'tpt_mod=tpt%273.0f' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v tpt_mod -s '%.1f ' %tmp_fl_00%"; $tst_cmd[2]="0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0 "; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=log(e_flt)^1 (may fail on old AIX TODO ncap57)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'foo=log(e_flt)^1' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v foo -s '%.6f\\n' %tmp_fl_00%"; $tst_cmd[2]="1.000000"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=log(e_dbl)^1"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'foo=log(e_dbl)^1' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="1.000000000000"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=4*atan(1)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'foo=4*atan(1)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="3.141592741013"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=erf(1) (may fail on old AIX TODO ncap57)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'foo=erf(1)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="0.842701"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #fails - wrong result ??? $dsc_sng="Testing foo=gamma(0.5) (may fail on old AIX TODO ncap57)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'foo=gamma(0.5)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="1.772453851"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=sin(pi/2)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'pi=4*atan(1);foo=sin(pi/2)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v foo -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="1.000000000000"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Testing foo=cos(pi)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'pi=4*atan(1);foo=cos(pi)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v foo -s '%.12f\\n' %tmp_fl_00%"; $tst_cmd[2]="-1.000000000000"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array\ $dsc_sng="Casting variable with same name as dimension (ncap81 failed with netCDF4 until netCDF 4.3.x)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'defdim(\"a\",3);defdim(\"b\",4); a[\$a,\$b]=10;c=a(1,1);' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v c -s '%i' %tmp_fl_00%"; $tst_cmd[2]="10"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Casting variable with a single dim of sz=1 (ncap81 failed with netCDF4 until netCDF 4.3.x)"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -C -v -s 'defdim(\"a\",1); b[\$a]=10;c=b(0:0);' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncwa -h -O $fl_fmt $nco_D_flg -C -a a %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2]="ncks -C -H -v b -s '%i' %tmp_fl_01%"; $tst_cmd[3]="10"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncap2 -O -v -s 'lat_min=min(lat)' ~/nco/data/in.nc ~/foo.nc # ncks -C -H -v lat_min -s '%g' ~/foo.nc $dsc_sng="Verify non-averaging functions min/max on coordinate variables"; $tst_cmd[0]="ncap2 -h -O $fl_fmt $nco_D_flg -v -s 'lat_min=min(lat)' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -v lat_min -s '%g' %tmp_fl_00%"; $tst_cmd[2]="-90"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $USER=$ENV{'USER'}; if($USER eq 'zender'){ # Regridding regression tests # valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncks -O -D 5 --map=${DATA}/maps/map_ne30np4_to_fv129x256_aave.150418.nc ${DATA}/ne30/rgr/ne30_tst.nc ~/foo.nc > ~/foo 2>&1 # ncks -O -D 5 --map=${DATA}/maps/map_ne30np4_to_fv129x256_aave.150418.nc ${DATA}/ne30/rgr/ne30_tst.nc ~/foo.nc # ncwa -O -w area ~/foo.nc ~/foo2.nc # ncks -H -u -C -v FSNT ~/foo2.nc # ncwa -O -y ttl -v area ~/foo.nc ~/foo3.nc # ncks -H -u -C -v area ~/foo3.nc $dsc_sng="Regridding FSNT 1D->2D to test conservation (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/maps/map_ne30np4_to_fv129x256_aave.20150901.nc ."; $tst_cmd[1]="scp dust.ess.uci.edu:data/ne30/rgr/ne30_tst.nc ."; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg --map=map_ne30np4_to_fv129x256_aave.20150901.nc ne30_tst.nc %tmp_fl_00%"; # my $pwd=`pwd`; chomp $pwd; print $pwd; # $dsc_sng="Regridding FSNT to regridding conservation (uses wget to dust.ess.uci.edu)"; # $tst_cmd[0]="wget -c -P $drc_dat http://dust.ess.uci.edu/maps/map_ne30np4_to_fv129x256_aave.20150901.nc"; # $tst_cmd[1]="wget -c -P $drc_dat http://dust.ess.uci.edu/ne30/rgr/ne30_tst.nc"; # $tst_cmd[2]="ncks -h -O $fl_fmt $nco_D_flg --map=".$drc_dat."/map_ne30np4_to_fv129x256_aave.20150901.nc ".$drc_dat."/ne30_tst.nc %tmp_fl_00%"; $tst_cmd[3]="/bin/cp -f %tmp_fl_00% ne30_2D.nc"; $tst_cmd[4]="ncwa -O $fl_fmt $nco_D_flg -w area %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[5]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v FSNT %tmp_fl_01%"; $tst_cmd[6]="FSNT = 244.124 W/m2"; $tst_cmd[7]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding AODVIS 1D->2D to test missing value treatment"; $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v AODVIS %tmp_fl_01%"; $tst_cmd[1]="AODVIS = 0.151705"; $tst_cmd[2]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding area 1D->2D to test grid area integral/normalization"; $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg --map=${drc_dat}/map_ne30np4_to_fv129x256_aave.20150901.nc $drc_dat/ne30_tst.nc %tmp_fl_00%"; $tst_cmd[1]="ncwa -O $fl_fmt $nco_D_flg -y ttl -v area %tmp_fl_00% %tmp_fl_02%"; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v area %tmp_fl_02%"; $tst_cmd[3]="area = 12.5663706144 steradian"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding FSNT 1D->2D to test bilinear remapping (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/maps/map_ne30np4_to_fv257x512_bilin.20150901.nc ."; $tst_cmd[1]="scp dust.ess.uci.edu:data/ne30/rgr/ne30_tst.nc ."; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg --map=map_ne30np4_to_fv257x512_bilin.20150901.nc ne30_tst.nc %tmp_fl_00%"; $tst_cmd[3]="ncwa -O $fl_fmt $nco_D_flg -w gw %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[4]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v FSNT %tmp_fl_01%"; $tst_cmd[5]="FSNT = 244.237 W/m2"; $tst_cmd[6]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding FSNT 2D->1D to test conservation (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/maps/map_fv129x256_to_ne30np4_aave.20150901.nc ."; $tst_cmd[1]="ncks -O $fl_fmt $nco_D_flg --map=map_fv129x256_to_ne30np4_aave.20150901.nc ne30_2D.nc %tmp_fl_00%"; $tst_cmd[2]="ncwa -O $fl_fmt $nco_D_flg -w area %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[3]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v FSNT %tmp_fl_01%"; $tst_cmd[4]="FSNT = 244.124 W/m2"; $tst_cmd[5]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding FSNT 2D->2D to test conservation (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/maps/map_fv129x256_to_fv257x512_aave.20150901.nc ."; $tst_cmd[1]="scp dust.ess.uci.edu:data/ne30/rgr/ne30_2D.nc ."; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg --map=map_fv129x256_to_fv257x512_aave.20150901.nc ne30_2D.nc %tmp_fl_00%"; $tst_cmd[3]="ncwa -O $fl_fmt $nco_D_flg -w area %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[4]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v FSNT %tmp_fl_01%"; $tst_cmd[5]="FSNT = 244.124 W/m2"; $tst_cmd[6]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array $dsc_sng="Regridding FSNT 1D->1D to test identity mapping and conservation (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/maps/map_ne30np4_to_ne30np4_aave.20150603.nc ."; $tst_cmd[1]="scp dust.ess.uci.edu:data/ne30/rgr/ne30_tst.nc ."; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg --map=map_ne30np4_to_ne30np4_aave.20150603.nc ne30_tst.nc %tmp_fl_00%"; $tst_cmd[3]="ncwa -O $fl_fmt $nco_D_flg -w area %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[4]="ncks -O $fl_fmt $nco_D_flg -H -u -C -v FSNT %tmp_fl_01%"; $tst_cmd[5]="FSNT = 244.124 W/m2"; $tst_cmd[6]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncks -O --rgr grid=~/foo_grid.nc --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr ~/nco/data/in.nc ~/foo.nc # ncks -O -H -u -C -s %18.15f -d grid_size,0 -v grid_center_lat ~/foo_grid.nc # 20151205: using %tmp_fl_00% in arguments like "--rgr grid=%tmp_fl_00%" leads to epic fail, so hard-code filenames that are arguments $dsc_sng="Generate T42 gridfile"; $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg --rgr grid=foo_grid.nc --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr $in_pth_arg in.nc %tmp_fl_01%"; $tst_cmd[1]="ncks -O $fl_fmt $nco_D_flg -H -u -C -s %18.15f -d grid_size,0 -v grid_center_lat foo_grid.nc"; $tst_cmd[2]="-87.863798839232629"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncks -O -D 1 --rgr skl=~/foo_skl.nc --rgr grid=~/foo_grid.nc --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr ~/nco/data/in.nc ~/foo.nc # ncks -O -H -u -C -s %g -d lat,0 -v gw ~/foo_skl.nc $dsc_sng="Generate T42-grid skeleton file"; $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg --rgr skl=foo_skl.nc --rgr grid=foo_grid.nc --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr $in_pth_arg in.nc %tmp_fl_02%"; $tst_cmd[1]="ncks -O $fl_fmt $nco_D_flg -H -u -C -s %g -d lat,0 -v gw foo_skl.nc"; $tst_cmd[2]="0.00178328"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncks -O --rgr nfr=y --rgr grid=~/foo_grid.nc ~/nco/data/ne30_2D.nc ~/foo.nc # ncks -O -H -u -C -s %8.5f -d grid_size,256 -v grid_center_lat ~/foo_grid.nc # 20151205: using %tmp_fl_00% in arguments like "--rgr grid=%tmp_fl_00%" leads to epic fail, so hard-code filenames that are arguments $dsc_sng="Infer 129x256 FV gridfile (uses SSH/scp to dust.ess.uci.edu)"; $tst_cmd[0]="scp dust.ess.uci.edu:data/ne30/rgr/ne30_2D.nc ."; $tst_cmd[1]="ncks -O $fl_fmt $nco_D_flg --rgr nfr=y --rgr grid=foo_grid.nc ne30_2D.nc %tmp_fl_01%"; $tst_cmd[2]="ncks -O $fl_fmt $nco_D_flg -H -u -C -s %8.5f -d grid_size,256 -v grid_center_lat foo_grid.nc"; $tst_cmd[3]="-88.59375"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } # !zender if($dodap eq "FALSE"){ #################### #### ncatted tests # #################### $opr_nm="ncatted"; #################### #ncatted #1 # ncatted -h -O $nco_D_flg -a units,,m,c,'meter second-1' ~/nco/data/in.nc ~/foo.nc # ncks -C -m -v lev ~/foo.nc | grep units | cut -d ' ' -f 11-12 $dsc_sng="Modify all existing units attributes to meter second-1"; $tst_cmd[0]="ncatted -h -O $nco_D_flg -a units,,m,c,'meter second-1' $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -m -v lev %tmp_fl_00% | grep units | cut -d ' ' -f 11-12"; ## daniel:fixme cut/ncks but how to do grep? $tst_cmd[2]="meter second-1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #printf("paused @ %s:%d - hit return to continue", __FILE__ , __LINE__); my $wait = ; #ncatted #2 $dsc_sng="Change _FillValue attribute from 1.0e36 to 0.0 in netCDF3 file"; $tst_cmd[0]="ncatted -h -O $nco_D_flg -a _FillValue,val_one_mss,m,f,0.0 $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%g' -d lat,1 -v val_one_mss %tmp_fl_00%"; $tst_cmd[2]="0"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #3 $dsc_sng="Create new _FillValue attribute"; $tst_cmd[0]="ncatted -h -O $nco_D_flg -a _FillValue,wgt_one,c,f,200.0 $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%g' -d lat,1 -v wgt_one %tmp_fl_00%"; $tst_cmd[2]="1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #4 # Fragile: Test fails when command length changes, e.g., on MACOSX $dsc_sng="Pad header with 1000B extra for future metadata (failure OK/expected since test depends on command-line length)"; $tst_cmd[0]="ncatted -O --hdr_pad=1000 $nco_D_flg -a missing_value,val_one_mss,m,f,0.0 $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -M %tmp_fl_00% | grep hdr_pad | wc > %tmp_fl_01%"; $tst_cmd[2]="cut -c 14-15 %tmp_fl_01%"; ## Daniel:fxm cut/ncks, but how to do grep and wc??? $tst_cmd[3]="27"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #5 # ncatted -O $nco_D_flg -a nw1,'^three*',c,i,999 ~/nco/data/in.nc ~/foo.nc # ncap2 -v -C -O -s 'n2=three_dmn_var_int@nw1;' ~/foo.nc ~/foo1.nc # ncks -O -C -H -s '%i' -v n2 ~/foo1.nc $dsc_sng="Variable wildcarding (requires regex)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a nw1,'^three*',c,i,999 $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncap2 -v -C -O -s 'n2=three_dmn_var_int\@nw1;' %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2]="ncks -O -C -H -s '%i' -v n2 %tmp_fl_01%"; $tst_cmd[3]="999"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ####################################### #### Group tests (requires netCDF4) ### ####################################### if($RUN_NETCDF4_TESTS == 1){ #4.3.8 #ncatted #6 #ncatted -O -a purpose,rlev,m,c,new_value in_grp_3.nc ~/foo.nc $dsc_sng="(Groups) Modify attribute for variable (input relative name)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a purpose,rlev,m,c,new_value $in_pth_arg in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -m -g g3 -v rlev %tmp_fl_00%"; $tst_cmd[2]="rlev attribute 0: purpose, size = 9 NC_CHAR, value = new_value"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #7 $dsc_sng="(Groups) Modify attribute for variable (input absolute name)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a purpose,/g3/rlev,m,c,new_value $in_pth_arg in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -m -g g3 -v rlev %tmp_fl_00%"; $tst_cmd[2]="rlev attribute 0: purpose, size = 9 NC_CHAR, value = new_value"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #8 $dsc_sng="(Groups) Modify attribute for group (input relative name)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a g3_group_attribute,group,m,c,new_value $in_pth_arg in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -M %tmp_fl_00% | grep g3_group_attribute"; $tst_cmd[2]="Group attribute 0: g3_group_attribute, size = 9 NC_CHAR, value = new_value"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #9 $dsc_sng="(Groups) Variable wildcarding (requires regex)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a nw1,'^three*',c,i,999 $in_pth_arg in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -m -C -g g10 -v three_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="three_dmn_rec_var attribute 1: nw1, size = 1 NC_INT, value = 999"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #10 $dsc_sng="(Groups) Edit all variables"; $tst_cmd[0]="ncatted -O $nco_D_flg -a purpose,,m,c,new_value $in_pth_arg in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -m -g g3 -v rlev %tmp_fl_00%"; $tst_cmd[2]="rlev attribute 0: purpose, size = 9 NC_CHAR, value = new_value"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #11 # ncatted -h -O -a Conventions,group,m,c,new_value ~/nco/data/in_grp_3.nc ~/foo.nc # ncks -M ~/foo.nc | grep Conventions $dsc_sng="(Groups) Modify global attribute"; $tst_cmd[0]="ncatted -h -O $nco_D_flg -a Conventions,group,m,c,new_value $in_pth_arg in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -M %tmp_fl_00% | grep Conventions"; $tst_cmd[2]="Group attribute 0: Conventions, size = 9 NC_CHAR, value = new_value"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #12 # ncatted -h -O -a _FillValue,val_one_mss,m,f,0.0 ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%g' -d lat,1 -v val_one_mss ~/foo.nc $dsc_sng="Change _FillValue attribute from 1.0e36 to 0.0 on netCDF4 file"; $tst_cmd[0]="ncatted -h -O $nco_D_flg -a _FillValue,val_one_mss,m,f,0.0 $in_pth_arg in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%g' -d lat,1 -v val_one_mss %tmp_fl_00%"; ###TODO 665 $tst_cmd[2]="0"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } # $RUN_NETCDF4_TESTS #ncatted #13 # ncatted -O -a '.?_att$',att_var,o,i,999 ~/nco/data/in.nc ~/foo.nc # ncks -C -m -v att_var ~/foo.nc | grep float_att | cut -d ' ' -f 11 $dsc_sng="Attribute wildcarding (requires regex)"; $tst_cmd[0]="ncatted -O $nco_D_flg -a '.?_att$\',att_var,o,i,999 $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -m -v att_var %tmp_fl_00% | grep float_att | cut -d ' ' -f 11"; $tst_cmd[2]="999"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncatted #14 # ncatted -O -a ,att_var,d,, ~/nco/data/in.nc ~/foo.nc # ncks -C -m -v att_var ~/foo.nc | wc | cut -d ' ' -f 7 # Counting lines of output to verify no attributes remain $dsc_sng="Delete all attributes"; $tst_cmd[0]="ncatted -O $nco_D_flg -a ,att_var,d,, $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -m -v att_var %tmp_fl_00% | wc | cut -d ' ' -f 7"; $tst_cmd[2]="4"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } #dodap # printf("paused @ %s:%d - hit return to continue", __FILE__ , __LINE__); my $wait = ; #################### #### ncbo tests #### #################### $opr_nm="ncbo"; #################### # ncbo #1 $dsc_sng="Difference a packed variable and be sure everything is zero or _FillValue by average whole remainder and comparing to zero.) FAILS with netCDF4"; $tst_cmd[0]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg -v rec_var_dbl_mss_val_dbl_pck $in_pth_arg in.nc in.nc %tmp_fl_00%";; $tst_cmd[1]="ncwa $omp_flg -h -O $fl_fmt $nco_D_flg %tmp_fl_00% %tmp_fl_03%";; $tst_cmd[2]="ncks -C -H -s '%g' -v rec_var_dbl_mss_val_dbl_pck %tmp_fl_03%"; $tst_cmd[3]="0.0"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array - ok # ncbo #2 $dsc_sng="Whole file difference with broadcasting (OK to fail here fxm TODO nco757. Works with --mmr_drt, triggers segfault on OSs like FC Linux which have C-library armor. Harmless Failure caused by free'ing dangling pointer during memory cleanup.)"; $tst_cmd[0]="ncwa $omp_flg -h -O $fl_fmt $nco_D_flg -a time $in_pth_arg in.nc %tmp_fl_03%";; $tst_cmd[1]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg $in_pth/in.nc %tmp_fl_03% %tmp_fl_00%";; $tst_cmd[2]="ncks -C -H -d time,9 -s '%g' -v rec_var_flt %tmp_fl_00%"; $tst_cmd[3]="4.5"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array - ok # ncbo #3 # ncbo -h -O --op_typ='-' -v mss_val_scl -p ~/nco/data in.nc in.nc ~/foo.nc $dsc_sng="difference scalar missing value"; $tst_cmd[0]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg --op_typ='-' -v mss_val_scl $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v mss_val_scl %tmp_fl_00%"; $tst_cmd[2]="1.0e36"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array - ok # ncbo #4 $dsc_sng="difference with missing value attribute"; $tst_cmd[0]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg --op_typ='-' -d lon,1 -v mss_val $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v mss_val %tmp_fl_00%"; $tst_cmd[2]=1.0e36; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #5 $dsc_sng="difference without missing value attribute"; $tst_cmd[0]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg --op_typ='-' -d lon,0 -v no_mss_val $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%f' -v no_mss_val %tmp_fl_00%"; $tst_cmd[2]="0"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #6 $dsc_sng="_FillValues differ between files"; $tst_cmd[0]="ncks -h -O $fl_fmt $nco_D_flg -v mss_val_fst $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncrename -h -O $nco_D_flg -v mss_val_fst,mss_val %tmp_fl_00%"; $tst_cmd[2]="ncbo -C $omp_flg -h -O $fl_fmt $nco_D_flg -y '-' -v mss_val %tmp_fl_00% ../data/in.nc %tmp_fl_01% 2> %tmp_fl_02%"; $tst_cmd[3]="ncks -C -H --no_blank -s '%f,' -v mss_val %tmp_fl_01%"; $tst_cmd[4]="-999.000000,-999.000000,-999.000000,-999.000000"; $tst_cmd[5]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #7 $dsc_sng="_FillValue in one variable (not both variables)"; $tst_cmd[0]="ncrename -h $nco_D_flg -O -v no_mss_val,one_dmn_arr_with_and_without_mss_val $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncrename -h $nco_D_flg -O -v mss_val,one_dmn_arr_with_and_without_mss_val $in_pth_arg in.nc %tmp_fl_01%"; $tst_cmd[2]="ncbo $omp_flg -h -O $fl_fmt $nco_D_flg -y '-' -v one_dmn_arr_with_and_without_mss_val %tmp_fl_00% %tmp_fl_01% %tmp_fl_02% 2> %tmp_fl_03%"; $tst_cmd[3]="ncks -C -H -d lon,0 -s '%f' -v one_dmn_arr_with_and_without_mss_val %tmp_fl_02%"; $tst_cmd[4]=0.0; $tst_cmd[5]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #8 $dsc_sng="ncdiff symbolically linked to ncbo"; $tst_cmd[0]="ncdiff $omp_flg -h -O $fl_fmt $nco_D_flg -d lon,1 -v mss_val $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v mss_val %tmp_fl_00%"; $tst_cmd[2]=1.0e36; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #9 $dsc_sng="difference with missing value attribute"; $tst_cmd[0]="ncdiff $omp_flg -h -O $fl_fmt $nco_D_flg -d lon,1 -v mss_val $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v mss_val %tmp_fl_00%"; $tst_cmd[2]=1.0e36; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #10 $dsc_sng="Difference without missing value attribute"; $tst_cmd[0]="ncdiff $omp_flg -h -O $fl_fmt $nco_D_flg -d lon,0 -v no_mss_val $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%f' -v no_mss_val %tmp_fl_00%"; $tst_cmd[2]="0"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ok # ncbo #11 $dsc_sng="Difference which tests broadcasting and changing variable IDs"; $tst_cmd[0]="ncwa $omp_flg -C -h -O $fl_fmt $nco_D_flg -v rec_var_flt_mss_val_dbl $in_pth_arg in.nc %tmp_fl_03%"; $tst_cmd[1]="ncbo $omp_flg -C -h -O $fl_fmt $nco_D_flg -v rec_var_flt_mss_val_dbl $in_pth/in.nc %tmp_fl_03% %tmp_fl_00%"; $tst_cmd[2]="ncks -C -H -d time,3 -s '%f' -v rec_var_flt_mss_val_dbl %tmp_fl_00%"; $tst_cmd[3]="-1.0"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #12 $dsc_sng="Difference which tests 3D broadcasting"; $tst_cmd[0]="ncks -C -O $fl_fmt $nco_D_flg -v three_dmn_var_dbl $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncap2 -C -O $fl_fmt $nco_D_flg -v -s 'three_dmn_var_dbl[lon]={0.0,1,2,3};' $in_pth_arg in.nc %tmp_fl_01%"; $tst_cmd[2]="ncbo $omp_flg -C -h -O $fl_fmt $nco_D_flg %tmp_fl_00% %tmp_fl_01% %tmp_fl_02%"; $tst_cmd[3]="ncwa $omp_flg -C -h -O $fl_fmt $nco_D_flg -y ttl -v three_dmn_var_dbl %tmp_fl_02% %tmp_fl_03%"; $tst_cmd[4]="ncks -C -H -s '%f' -v three_dmn_var_dbl %tmp_fl_03%"; $tst_cmd[5]="2697"; $tst_cmd[6]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #13 $dsc_sng="Addition + 3D broadcasting+ MSA"; $tst_cmd[0]="ncks -C -O $fl_fmt $nco_D_flg -v three_dmn_var_dbl $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncap2 -C -O $fl_fmt $nco_D_flg -v -s 'three_dmn_var_dbl[lon]={0.0,1,2,3};' $in_pth_arg in.nc %tmp_fl_01%"; $tst_cmd[2]="ncbo $omp_flg -C -h -O $fl_fmt $nco_D_flg -d time,0,4 -d time,9 -d lon,0 -d lon,3 %tmp_fl_00% %tmp_fl_01% %tmp_fl_02%"; $tst_cmd[3]="ncwa $omp_flg -C -h -O $fl_fmt $nco_D_flg -y ttl -v three_dmn_var_dbl %tmp_fl_02% %tmp_fl_03%"; $tst_cmd[4]="ncks -C -H -s '%f' -v three_dmn_var_dbl %tmp_fl_03%"; $tst_cmd[5]="422"; $tst_cmd[6]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #14 $dsc_sng="Copy associated coordinates -v three_dmn_rec_var"; $tst_cmd[0]="ncks -O $fl_fmt $nco_D_flg -v three_dmn_rec_var $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncbo $omp_flg -O $fl_fmt $nco_D_flg -v three_dmn_rec_var %tmp_fl_00% %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[2]="ncks -C -H -v three_dmn_rec_var -d time,9,9,1 -d lat,1,1,1 -d lon,3,3,1 %tmp_fl_01%"; $tst_cmd[3]="time[9]=10 lat[1]=90 lon[3]=270 three_dmn_rec_var[79]=0"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncbo #15 #Operate on files containing same variable in different orders # ncks -O -v time,one ~/nco/data/in.nc ~/foo1.nc # ncks -O -a -v one,time ~/nco/data/in.nc ~/foo2.nc # ncbo -O -p ~ foo1.nc foo2.nc ~/foo3.nc # ncks -C -H -v one ~/foo3.nc $dsc_sng="Concatenate variables with different ID ordering"; $tst_cmd[0]="ncks -h -O $fl_fmt $nco_D_flg -C -v time,one $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -h -O $fl_fmt $nco_D_flg -C -a -v one,time $in_pth_arg in.nc %tmp_fl_01%"; $tst_cmd[2]="ncbo -h -O $fl_fmt $nco_D_flg %tmp_fl_00% %tmp_fl_01% %tmp_fl_02%"; $tst_cmd[3]="ncks -C -H -v one %tmp_fl_02%"; $tst_cmd[4]="one = 0"; $tst_cmd[5]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ####################################### #### Group tests (requires netCDF4) ### ####################################### if($RUN_NETCDF4_TESTS == 1){ # NCO 4.3.0: added support for groups; ncbo -g #ncbo #16 # ncbo -O -y add -g g4 -v one_dmn_rec_var ~/nco/data/in_grp.nc ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var ~/foo.nc # /g4/one_dmn_rec_var # time[0]=1 one_dmn_rec_var[0]=2 $dsc_sng="(Groups) Addition -y add -g g4 -v one_dmn_rec_var"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -y add -g g4 -v one_dmn_rec_var $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="2"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncbo #17 # ncbo -O -y add -g g4 -v one_dmn_rec_var ~/nco/data/in_grp.nc ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var ~/foo.nc # /g4/one_dmn_rec_var $dsc_sng="(Groups) Addition with limits -d time,1,1,1 -y add -g g4 -v one_dmn_rec_var"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -d time,1,1,1 -y add -g g4 -v one_dmn_rec_var $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="4"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncbo #18 # ncbo -O -v one_dmn_rec_var ~/nco/data/in_grp.nc ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var ~/foo.nc # /g4/one_dmn_rec_var $dsc_sng="(Groups) Subtraction -v one_dmn_rec_var"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -v one_dmn_rec_var $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -d time,1,1,1 -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="0"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncbo #19 # ncbo -O -y mlt -g g4 -v one_dmn_rec_var ~/nco/data/in_grp.nc ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var ~/foo.nc # /g4/one_dmn_rec_var $dsc_sng="(Groups) Multiplication with limits -d time,2,2,1 -y add -g g4 -v one_dmn_rec_var"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -d time,2,2,1 -y mlt -g g4 -v one_dmn_rec_var $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="9"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #ncbo #20 # ncbo -O -y mlt -g g4 -v one_dmn_rec_var ~/nco/data/in_grp.nc ~/nco/data/in_grp.nc ~/foo.nc # ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var ~/foo.nc # /g4/one_dmn_rec_var $dsc_sng="(Groups) Division with limits -d time,2,2,1 -y add -g g4 -v one_dmn_rec_var"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -d time,2,2,1 -y dvd -g g4 -v one_dmn_rec_var $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -d time,0,0,1 -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $tst_cmd[2]="1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # Following tests: Different objects in both files with groups (ensembles, not ensembles) # Absolute match test # Absolute match test # ncbo #21 # ncbo -O in_grp_1.nc in_grp_2.nc ~/foo.nc $dsc_sng="(Groups) Process absolute match variables -v var1 in_grp_1.nc in_grp_2.nc"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg $in_pth_arg in_grp_1.nc in_grp_2.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -v var1 %tmp_fl_00%"; $tst_cmd[2]="lon[3]=4 var1[3]=-1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #22 # ncbo -O -v var1 in_grp_1.nc in_grp_2.nc ~/foo.nc $dsc_sng="(Groups) Process absolute match variables -v var1 in_grp_1.nc in_grp_2.nc"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg -v var1 $in_pth_arg in_grp_1.nc in_grp_2.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C %tmp_fl_00%"; $tst_cmd[2]="lon[3]=4 var1[3]=-1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #23 #ncbo -O --op_typ=add mdl_1.nc mdl_2.nc ~/foo.nc #ncks -C -g cesm_01 -v tas1 ~/foo.nc # 544.4 = (file 1 tas1) 272.1 + (file 2 tas1) 272.3 $dsc_sng="(Groups) Process ensembles in both files mdl_1.nc mdl_2.nc"; $tst_cmd[0]="ncbo -O --op_typ=add $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc mdl_2.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g cesm_01 -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=544.4"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #24 #ncbo -O mdl_1.nc mdl_2.nc ~/foo.nc #ncks -g cesm_01 -v time ~/foo.nc $dsc_sng="(Groups) Process ensembles in both files mdl_1.nc mdl_2.nc (check fixed variables)"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc mdl_2.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -g cesm_01 -v time %tmp_fl_00%"; $tst_cmd[2]="time[3]=4"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #25 #ncbo -O --op_typ=add mdl_1.nc obs.nc ~/foo.nc #ncks -C -g cesm_01 -v tas1 ~/foo.nc # 544.1 = (file 1 tas1) 272.1 + (file 2 tas1) 273.0 $dsc_sng="(Groups) Process ensembles in file 1 with common variable at root in file 2"; $tst_cmd[0]="ncbo -O --op_typ=add $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc obs.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g cesm_01 -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=545.1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #26 #ncbo -O mdl_1.nc obs.nc ~/foo.nc #ncks -g ecmwf_01 -v time $dsc_sng="(Groups) Process ensembles in file 1 with common variable at root in file 2 (check fixed variables)"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc obs.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -g ecmwf_01 -v time %tmp_fl_00%"; $tst_cmd[2]="time[3]=4"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #ncbo -O --op_typ=add obs.nc mdl_1.nc ~/foo.nc #ncks -C -g cesm_01 -v tas1 ~/foo.nc # 544.1 = (file 1 tas1) 273.0 + (file 2 tas1) 272.1 #FXM ncbo group broadcasting, "time" dimension is created at root because conflicting logic in nco_prc_cmn() uses # both RNK_1_GTR and table flag of file 1 or 2 # result is time[3] instead of time[3]=4 if(0) { $dsc_sng="(Groups) Process ensembles in file 2 with common variable at root in file 1"; $tst_cmd[0]="ncbo -O --op_typ=add $fl_fmt $nco_D_flg $in_pth_arg obs.nc mdl_1.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g cesm_01 -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=545.1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } # ncbo #27 #ncbo -O cmip5.nc obs.nc ~/foo.nc #ncks -C -g ecmwf -v tas1 ~/foo.nc # obs.nc tas1=273, cmip5.nc giss tas1=274 $dsc_sng="(Groups) Process relative matches, first file greater (cmip5.nc obs.nc)"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg $in_pth_arg cmip5.nc obs.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g giss -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #28 #ncbo -O obs.nc cmip5.nc ~/foo.nc #ncks -C -g ecmwf -v tas1 ~/foo.nc # obs.nc tas1=273, cmip5.nc giss tas1=274 $dsc_sng="(Groups) Process relative matches, second file greater (obs.nc cmip5.nc)"; $tst_cmd[0]="ncbo -O $fl_fmt $nco_D_flg $in_pth_arg obs.nc cmip5.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g giss -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=-1"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # ncbo #29 #ncbo ensemble with 1 member #ncra -Y ncge -O mdl_3.nc ncge_out.nc #ncbo -O --op_typ=add ncge_out.nc mdl_3.nc ~/foo.nc #ncks -H -C -g cesm_01 -v tas1 ~/foo.nc #ncge_out.nc = #/cesm/tas1 #time[0]=1 tas1[0]=272.15 #mdl_3.nc = #/cesm/cesm_01/tas1 #time[0]=1 tas1[0]=272.1 #result = # 544.25 = 272.15 + 272.1 $dsc_sng="(Groups) Ensemble with 1 member (mdl_3.nc)"; $tst_cmd[0]="ncra -Y ncge -O $fl_fmt $nco_D_flg $in_pth_arg mdl_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncbo --op_typ=add -O $fl_fmt $nco_D_flg %tmp_fl_00% $in_pth/mdl_3.nc %tmp_fl_01%"; $tst_cmd[2]="ncks -H -C -g cesm_01 -v tas1 %tmp_fl_01%"; $tst_cmd[3]="time[3] tas1[3]=544.25"; $tst_cmd[4]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } # end RUN_NETCDF4_TESTS #################### #### nces tests #### - OK ! #################### $opr_nm='nces'; #################### #nces #01 $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -v one_dmn_rec_var -d time,4 $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -v one_dmn_rec_var %tmp_fl_00%"; $dsc_sng="ensemble mean of int across two files"; $tst_cmd[2]="5"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #02 $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -y ttl -v mss_val_scl $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v mss_val_scl %tmp_fl_00%"; $dsc_sng="ensemble sum of missing value across two files"; $tst_cmd[2]="1.0e36"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #03 $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -v rec_var_flt_mss_val_flt -d time,0 $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H --no_blank -s '%g' -v rec_var_flt_mss_val_flt %tmp_fl_00%"; $dsc_sng="ensemble mean with missing values across two files"; $tst_cmd[2]="1.0e36"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #04 $tst_cmd[0]="/bin/rm -f %tmp_fl_00%"; $tst_cmd[1]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -y min -v rec_var_flt_mss_val_dbl -d time,1 $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[2]="ncks -C -H -s '%e' -v rec_var_flt_mss_val_dbl %tmp_fl_00%"; $dsc_sng="ensemble min of float across two files"; $tst_cmd[3]="2"; $tst_cmd[4]="NO_SS"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #05 $tst_cmd[0]="/bin/rm -f %tmp_fl_00%"; $tst_cmd[1]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -C -v pck $in_pth_arg in.nc %tmp_fl_00%"; $tst_cmd[2]="ncks -C -H -s '%e' -v pck %tmp_fl_00%"; $dsc_sng="scale factor + add_offset packing/unpacking"; $tst_cmd[3]="3"; $tst_cmd[4]="NO_SS"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #06 $tst_cmd[0]="/bin/rm -f %tmp_fl_00%"; $tst_cmd[1]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -v rec_var_int_mss_val_int $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[2]="ncks -C -H --no_blank -s '%d ' -v rec_var_int_mss_val_int %tmp_fl_00%"; $dsc_sng="ensemble mean of integer with integer missing values across two files"; $tst_cmd[3]="-999 2 3 4 5 6 7 8 -999 -999"; $tst_cmd[4]="NO_SS"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #07 $tst_cmd[0]="/bin/rm -f %tmp_fl_00%"; $tst_cmd[1]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -C -d time,0,2 -d lon,0 -d lon,3 -v three_dmn_var_dbl $in_pth_arg in.nc in.nc %tmp_fl_00%"; $tst_cmd[2]="ncwa $omp_flg -C -h -O $fl_fmt $nco_D_flg -y ttl -v three_dmn_var_dbl %tmp_fl_00% %tmp_fl_01%"; $tst_cmd[3]="ncks -C -H -s '%3.f' -v three_dmn_var_dbl %tmp_fl_01%"; $dsc_sng="ensemble mean of 3D variable across two files with MSA"; $tst_cmd[4]="150"; $tst_cmd[5]="NO_SS"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #08 $tst_cmd[0]="/bin/rm -f %tmp_fl_00%"; $tst_cmd[1]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -C $in_pth_arg lrg_bm.nc lrg_bm1.nc %tmp_fl_00%"; $tst_cmd[2]="ncra -Y ncfe -t 1 -h -O $fl_fmt $nco_D_flg -C $in_pth_arg lrg_bm.nc lrg_bm1.nc %tmp_fl_01%"; $tst_cmd[3]="ncbo -C -h -O %tmp_fl_00% %tmp_fl_01% %tmp_fl_02%"; $tst_cmd[4]="ncwa -t 1 -O -C %tmp_fl_02% %tmp_fl_03% 2>%tmp_fl_05%"; $dsc_sng="Check op with OpenMP"; # $tst_cmd[5]="ncks -C -H -s '%d' -v R %tmp_fl_03%"; $tst_cmd[5]="ncap2 -t 1 -h -v -O -s 'n2= ((fabs(R)<0.01) && (fabs(S)<0.01) && (fabs(T)<0.01) && (fabs(U)<0.01) && (fabs(V)<0.01) && (fabs(W)<0.01) && (fabs(X)<0.01));print(n2)' %tmp_fl_03% %tmp_fl_04%"; $tst_cmd[6]="n2 = 1"; $tst_cmd[7]="NO_SS"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #09 $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -v pck_7 $in_pth_arg in.nc in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%f' -v pck_7 %tmp_fl_00%"; $dsc_sng="Ensemble mean of variable packed with netCDF convention across three files"; $tst_cmd[2]="7"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #10 $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg --hdf_upk -v pck_7 $in_pth_arg in.nc in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%f' -v pck_7 %tmp_fl_00%"; $dsc_sng="Ensemble mean of variable packed with HDF convention across three files"; $tst_cmd[2]="-8"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ####################################### #### Group tests (requires netCDF4) ### ####################################### if($RUN_NETCDF4_TESTS == 1){ #nces #11 # same as #nces #01 , with group $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -g g4 -v one_dmn_rec_var -d time,4 $in_pth_arg in_grp.nc in_grp.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -g g4 -v one_dmn_rec_var %tmp_fl_00%"; $dsc_sng="(Groups) ensemble mean of int across two files"; $tst_cmd[2]="5"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #12 # 2 groups, each one with a record (part 1) # ncra -Y nces -h -O -g g25g1,g25g2 -v one_dmn_rec_var -d time,4 in_grp_3.nc in_grp_3.nc ~/foo.nc $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -g g25g1,g25g2 -v one_dmn_rec_var -d time,4 $in_pth_arg in_grp_3.nc in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -g g25g1 -v one_dmn_rec_var %tmp_fl_00%"; $dsc_sng="(Groups) 2 groups ensemble mean of int across two files (part 1)"; $tst_cmd[2]="5"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #13 # 2 groups, each one with a record (part 2) # ncra -Y nces -h -O -g g25g1,g25g2 -v one_dmn_rec_var -d time,4 in_grp_3.nc in_grp_3.nc ~/foo.nc $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -g g25g1,g25g2 -v one_dmn_rec_var -d time,4 $in_pth_arg in_grp_3.nc in_grp_3.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -H -s '%d' -g g25g2 -v one_dmn_rec_var %tmp_fl_00%"; $dsc_sng="(Groups) 2 groups ensemble mean of int across two files (part 2)"; $tst_cmd[2]="5"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array } # #### Group File tests #nces #14 # TODO #for i in $(seq -w 0 999) ; do iii=$(printf "%03d" ${i}) ; ln in.nc foo${iii}.nc ; done # TO DO run bash script above by perl $tst_cmd[0]="ncra -Y ncfe $omp_flg -h -O $fl_fmt $nco_D_flg -v dgn_var $in_pth_arg in.nc in.nc in.nc %tmp_fl_00%"; $tst_cmd[1]="ncks %tmp_fl_00%"; $dsc_sng="Test file loop"; $tst_cmd[2]="dgn[0]=73 dgn_var[0]=73"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array ####################################### #### Group tests (requires netCDF4) ### ####################################### if($RUN_NETCDF4_TESTS == 1){ #nces #15 # ncra -Y ncge -h -O mdl_1.nc ~/foo.nc # ncks -g cesm -v tas1 ~/foo.nc $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g cesm -v tas1 %tmp_fl_00%"; $dsc_sng="(Groups) 1 file mdl_1.cdl ensemble"; $tst_cmd[2]="time[3]=4 tas1[3]=272.15"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #16 $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O --nsm_sfx=_avg $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g cesm_avg -v tas1 %tmp_fl_00%"; $dsc_sng="(Groups) 1 file mdl.cdl --nsm_sfx suffix ensemble"; $tst_cmd[2]="time[3]=4 tas1[3]=272.15 "; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #17 # ncra -Y ncge -h -O -G /gpe_grp mdl_1.nc ~/foo.nc $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O -G /gpe_grp $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g /gpe_grp/ecmwf -v tas1 %tmp_fl_00%"; $dsc_sng="(Groups) GPE 1 file mdl_1.cdl ensemble"; $tst_cmd[2]="time[3]=4 tas1[3]=273.15 "; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array #nces #18 #ncra -Y ncge -O mdl_1.nc mdl_2.nc ~/foo.nc $dsc_sng="(Groups) Two-file ensembles"; $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc mdl_2.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -C -g ecmwf -v tas1 %tmp_fl_00%"; $tst_cmd[2]="time[3]=4 tas1[3]=273.25"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # NEW NCO 4.4.2 #nces #19 (check coordinate variables) # ncra -Y ncge -h -O mdl_1.nc ~/foo.nc # ncks -g cesm -v time ~/foo.nc # NB: This test succeeds when it fails, i.e., the NCO command fails as it should because the input files do not conform $dsc_sng="(Groups) Ensemble record coordinate variables"; $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O $fl_fmt $nco_D_flg $in_pth_arg mdl_1.nc %tmp_fl_00%"; $tst_cmd[1]="ncks -m --cdl -g cesm -v time %tmp_fl_00% | grep UNLIMITED"; $tst_cmd[2]=" time = UNLIMITED ; // (4 currently)"; $tst_cmd[3]="SS_OK"; NCO_bm::tst_run(\@tst_cmd); $#tst_cmd=0; # Reset array # NEW NCO 4.4.3 #nces #20 (error checking of ensemble variable dimensions) # ncra -Y ncge -O in_grp_4.nc in_grp_5.nc ~/foo.nc $dsc_sng="(Groups) Invalid input, expect ERROR because dimensions do not conform between ensemble variables"; $tst_cmd[0]="ncra -Y ncge $omp_flg -h -O $fl_fmt $nco_D_flg $in_pth_arg in_grp_4.nc in_grp_5.nc %tmp_fl_00%"; $tst_cmd[1]="ncge: ERROR Variables do not conform: variable has dimension // ID=1 index [1]: // ID=2 index [0]: // ID=3 index [1]: // ID=4 index [1]: // // group: g3 { dimensions: rlev=3; variables: :g3_group_attribute = "g3_group_attribute"; //coordinate variable (/g3/rlev) float rlev(rlev); rlev:purpose = "Monotonically decreasing coordinate pressure"; float rz(rlev); float scl; data: rz=0,5000,17000; scl=1.3; rlev=1000.,500.,100.; group: g3g1 { variables: float prs(rlev); prs:long_name="reverse pressure"; data: prs=1.0,10.0,100.0; } // end g3g1 } // end g3 // //g5 // group: g5 { // Level 1 dimensions: rlev=3; variables: //coordinate variable (/g5/rlev) float rlev(rlev); data: rlev=10.,5.,1.; group: g5g1 { // Level 2 variables: float rz(rlev); data: rz=1,2,3; } //end g5g1 } // end g5 // //g8 test ncwa in groups // group: g8 { dimensions: lon=2,lev=3,vrt_nbr=2; variables: //coordinate variable (/g8/lon) float lon(lon); //coordinate variable (/g8/lev) float lev(lev); lev:bounds = "lev_bnd"; //coordinate variable (/g8/vrt_nbr) float vrt_nbr(vrt_nbr); float lev_bnd(lev,vrt_nbr); float lev_wgt(lev); data: lon=-180,0; lev=100,500,1000; lev_bnd=0,300,300,750,750,1013.25; vrt_nbr=1,2; lev_wgt=9,2,1; } // end g8 // //g16 // // Test variables and dimensions in and out of scope // Use case of variable in scope of dimension: // dimension /lon // variable /g1/lon(lon) // Use case of variable NOT in scope of dimension: // variable /lon // dimension /g1/lon // // Test dimensions with no associated coordinate variable // group: g16 { dimensions: lat=2; lon1=4; //dimension that has a coordinate variable down in scope at /g16/g16g1/lon1(lon1) lon2=4; //dimension that does NOT have a coordinate variable anywhere lon3=4; //dimension that has a coordinate "out of scope" (with group depth greater than the variable that uses the coordinate, g16g3g3) lon4=2; //dimension that has several intermediate "in scope" coordinates variables: float lat1(lat); float lon2_var(lon2); //variable with no associated coordinate variable data: lat1=0.,1.; lon2_var=0.,1.,2.,3.; group: g16g1 { dimensions: lat1=2; //dimension that has a variable /lat1 down in *illegal* scope variables: // MSA test -v lon1_var -d lon1,3.0, result is 3. float lon1(lon1); //coordinate variable /g16/g16g1/lon1 that has dimension (/g16/lon1) in scope float lon1_var(lon1); // variable /g16/g16g1/lon1_var that has dimension (/g16/lon1) in scope *and* coordinate (/g16/g16g1/lon1) in scope data: lon1=0.,1.,2.,3.; lon1_var=0.,1.,2.,3.; } // end g16g1 group: g16g2 { dimensions: variables: //coordinate variable (/g16/lon1) float lon1(lon1); // MSA test -v lon1_var -d lon1,3.0, result is 0.,1.,2.,3. float lon1_var(lon1); // data: lon1=3.,4.,5.,6.; lon1_var=0.,1.,2.,3.; } // end g16g2 group: g16g3 { variables: float lon3_var(lon3); data: lon3_var=0.,1.,2.,3.; group: g16g3g1 { variables: //coordinate "out of scope" (with group depth greater than the variable that uses the coordinate, in g16g3) float lon3(lon3); data: lon3=7.,8.,9.,10.; } // end g16g3g1 } // end g16g3 group: g16g4 { variables: //intermediate "in scope " coordinate float lon4(lon4); data: lon4=1.,2.; group: g16g4g1 { variables: //intermediate "in scope " coordinate float lon4(lon4); data: lon4=3.,4.; group: g16g4g1g1 { variables: //variable that uses one of the intermediate "in scope " coordinate float lon4_var(lon4); data: lon4_var=0.,1.; } // end g16g4g1g1 } // end g16g4g1 } // end g16g4 } // end g16 // //g18 // group: g18 { :Conventions = "CF-1.0"; dimensions: time=unlimited; // NB: no coordinate for this dimension gds_crd=8; variables: double lat_gds_1(gds_crd); lat_gds_1:long_name = "Latitude"; lat_gds_1:standard_name = "latitude"; lat_gds_1:units="degree"; lat_gds_1:purpose = "1-D latitude coordinate referred to by geodesic grid variables"; double lon_gds_1(gds_crd); lon_gds_1:long_name = "Longitude"; lon_gds_1:standard_name = "longitude"; lon_gds_1:units="degree"; lon_gds_1:purpose = "1-D longitude coordinate referred to by geodesic grid variables"; float gds_crd(gds_crd); gds_crd:long_name = "Geodesic coordinate"; gds_crd:units = "degree"; gds_crd:purpose = "enumerated coordinate like those that might define points in a geodesic grid"; gds_crd:coordinates = "lat_gds_1 lon_gds_1"; float gds_3dvar(time,gds_crd); gds_3dvar:long_name = "Geodesic variable"; gds_3dvar:units = "meter"; gds_3dvar:coordinates = "lat_gds_1 lon_gds_1"; gds_3dvar:purpose = "Test auxiliary coordinates like those that define geodesic grids"; data: gds_crd=0,1,2,3,4,5,6,7; gds_3dvar=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8, 274.1,274.2,274.3,274.4,274.5,274.6,274.7,274.8, 275.1,275.2,275.3,275.4,275.5,274.5,275.7,275.8, 276.1,276.2,276.3,276.4,276.5,276.5,276.7,276.8, 277.1,277.2,277.3,277.4,277.5,277.5,277.7,277.8, 278.1,278.2,278.3,278.4,278.5,278.6,278.7,278.8, 279.1,279.2,279.3,279.4,279.5,279.9,279.7,279.8, 280.1,280.2,280.3,280.4,280.5,280.9,280.7,280.8, 281.1,281.2,281.3,281.4,281.5,281.9,281.7,281.8, 282.1,282.2,282.3,282.4,282.5,282.9,282.7,282.8; lat_gds_1=-90, -30, -30, 0, 0, 30, 30, 90; lon_gds_1= 0, 0, 180, 0, 180, 0, 180, 0; group: g18g1 { //test -X with "lat_gds lon_gds" in scope :Conventions = "CF-1.0"; variables: float gds_3dvar(time,gds_crd); gds_3dvar:long_name = "Geodesic variable"; gds_3dvar:units = "meter"; gds_3dvar:coordinates = "lat_gds_1 lon_gds_1"; gds_3dvar:purpose = "Test auxiliary coordinates like those that define geodesic grids"; data: gds_3dvar=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8, 274.1,274.2,274.3,274.4,274.5,274.6,274.7,274.8, 275.1,275.2,275.3,275.4,275.5,274.5,275.7,275.8, 276.1,276.2,276.3,276.4,276.5,276.5,276.7,276.8, 277.1,277.2,277.3,277.4,277.5,277.5,277.7,277.8, 278.1,278.2,278.3,278.4,278.5,278.6,278.7,278.8, 279.1,279.2,279.3,279.4,279.5,279.9,279.7,279.8, 280.1,280.2,280.3,280.4,280.5,280.9,280.7,280.8, 281.1,281.2,281.3,281.4,281.5,281.9,281.7,281.8, 282.1,282.2,282.3,282.4,282.5,282.9,282.7,282.8; group: g18g2 { variables: double lat_gds_2(gds_crd); lat_gds_2:long_name = "Latitude"; lat_gds_2:standard_name = "latitude"; lat_gds_2:units="degree"; lat_gds_2:purpose = "1-D latitude coordinate referred to by geodesic grid variables"; double lon_gds_2(gds_crd); lon_gds_2:long_name = "Longitude"; lon_gds_2:standard_name = "longitude"; lon_gds_2:units="degree"; lon_gds_2:purpose = "1-D longitude coordinate referred to by geodesic grid variables"; data: lat_gds_2=-90, -30, -30, 0, 0, 30, 30, 90; lon_gds_2= 0, 0, 180, 0, 180, 0, 180, 0; } // end g18g2 } // end g18g1 } // end g18 // //g19 test cases for ncpdq; same variables as ncpdq netCDF3 tests // group: g19 { dimensions: lat=2; lev=3; lon=4; time=unlimited; variables: float lat(lat); float lon(lon); float lev(lev); float lev_wgt(lev); double time(time); data: lat=-90,90; lon=0,90,180,270; lev=100,500,1000; lev_wgt=10,2,1; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; group: g19g1 { variables: float two_dmn_var(lat,lev); two_dmn_var:long_name = "two dimensional variable"; two_dmn_var:units = "fraction"; data: two_dmn_var=1.5,5.5,9.5,13.5,17.5,21.5; } // end g19g1 group: g19g2 { variables: float two_dmn_rec_var(time,lev); two_dmn_rec_var:long_name = "two dimensional record variable"; two_dmn_rec_var:units = "watt meter-2"; data: two_dmn_rec_var=1.,2.0,3., 1.,2.1,3., 1.,2.2,3., 1.,2.3,3., 1.,2.4,3., 1.,2.5,3., 1.,2.6,3., 1.,2.7,3., 1.,2.8,3., 1.,2.9,3.; } // end g19g2 group: g19g3 { variables: double three_dmn_var_dbl(time,lat,lon); three_dmn_var_dbl:long_name = "three dimensional record variable of type double"; three_dmn_var_dbl:units = "watt meter-2"; three_dmn_var_dbl:_FillValue = -99.; data: three_dmn_var_dbl= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, -99,-99,-99,-99,-99,-99,-99,-99, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, -99,74,75,76,77,78,79,-99; } // end g19g3 group: g19g4 { variables: short rec_var_dbl_mss_val_dbl_pck(time); rec_var_dbl_mss_val_dbl_pck:long_name = "record variable, double, packed as short, with double missing values"; rec_var_dbl_mss_val_dbl_pck:purpose = "Packed version of rec_var_dbl_mss_val_dbl_upk"; rec_var_dbl_mss_val_dbl_pck:_FillValue = -999s; rec_var_dbl_mss_val_dbl_pck:missing_value = -999.; rec_var_dbl_mss_val_dbl_pck:scale_factor = -9.15541313801785e-05; rec_var_dbl_mss_val_dbl_pck:add_offset = 5.; double upk; upk:long_name = "Unpacked scalar variable"; upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)."; data: upk=3.; rec_var_dbl_mss_val_dbl_pck=-999,32767,21845,10922,0,-10922,-21845,-32767,-999,-999; } // end g19g4 } // end g19 // //g20 test cases for ncwa; same variables as ncwa netCDF3 tests // group: g20 { dimensions: lat=2; variables: float lat(lat); float lat_wgt(lat); data: lat=-90,90; lat_wgt=1.,2.; group: g20g1 { variables: float lat_cpy(lat); float lat_wgt(lat); data: lat_cpy=-90,90; lat_wgt=1.,0.; } // end g20g1 } //g20 // // prototype problem from ACCESS // group: g21 { dimensions: lat=2; lon=4; variables: float lat(lat); lat:units = "degrees_north"; float lon(lon); lon:units = "degrees_east"; float snc(lat,lon); snc:long_name = "Snow Cover"; data: lat=-45,45; lon=0,90,180,270; snc=1,2,3,4,5,6,7,8; } // end g21 // // prototype problem from ACCESS // group: g22 { dimensions: lat=3; lon=3; variables: float lat(lat); lat:units = "degrees_north"; float lon(lon); lon:units = "degrees_east"; float snc(lat,lon); snc:long_name = "Snow Cover"; data: lat=-60,0,60; lon=0,120,240; snc=1,2,3,4,5,6,7,8,9; } // end g22 group: g90 { dimensions: dim90=2; variables: int g9(dim90); data: g9=1,2; } // end g90 // // ncra test case // group: g23 { dimensions: lat=2; lon=3; time=unlimited; variables: float lat(lat); lat:units = "degrees_north"; float lon(lon); lon:units = "degrees_east"; double time(time); float snd(time,lat,lon); snd:long_name = "Snow Depth timeseries"; data: lat=-60,0; lon=0,120,240; time=1,2; snd=1,2,3,4,5,6,7,8,9,10,11,12; } // end g23 // // ncra test case // group: g24 { dimensions: lat=2; lon=3; time=unlimited; variables: float lat(lat); lat:units = "degrees_north"; float lon(lon); lon:units = "degrees_east"; double time(time); float snd(time,lat,lon); snd:long_name = "Snow Depth timeseries"; data: lat=-60,0; lon=0,120,240; time=4; snd=1,2,3,4,5,6; } // end g24 // // ncra test cases // group: g25 { //g25g1, g25g2: same data group: g25g1 { dimensions: time=unlimited; variables: double time(time); int one_dmn_rec_var(time); data: time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; one_dmn_rec_var=1,2,3,4,5,6,7,8,9,10; } // end g25g1 group: g25g2 { dimensions: time=unlimited; variables: double time(time); int one_dmn_rec_var(time); data: time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; one_dmn_rec_var=1,2,3,4,5,6,7,8,9,10; } // end g25g2 //g25g3: record (time) is not coordinate variable group: g25g3 { dimensions: time=unlimited; variables: int one_dmn_rec_var(time); data: one_dmn_rec_var=1,2,3,4,5,6,7,8,9,10; } // end g25g3 } // end g25 //ncwa: test weight and hyperslab group: g26 { dimensions: lat = 3 ; lon = 3 ; variables: float a(lat, lon) ; a:_FillValue = -999.f ; float gw_lat(lat) ; float gw_lon(lon) ; data: a = 45.123, 2.21029, 67.219, 87.19, 12.8974, 3.98, 20, 22.234, _ ; gw_lat = 0.1, 0.9, 0.9 ; gw_lon = 1, 1, 1 ; } // end g26 group: g27 { //test flatenning with paralell variables: ncks -3 -G : -g /g27g1/ group: g27g1 { dimensions: delta_time_start=2; variables: float delta_time_start(delta_time_start); data: delta_time_start=1,2; } group: g27g2 { dimensions: delta_time_start=1; variables: float delta_time_start(delta_time_start); data: delta_time_start=1; } } // end g27 group: g28 { //test CF extraction ( "delta_time_stop" has a CF attribute to "delta_time_start") dimensions: delta_time_start=1; variables: float delta_time_start(delta_time_start); float delta_time_stop(delta_time_start); delta_time_stop:coordinates = "delta_time_start"; data: delta_time_start=1; delta_time_stop=1; } // end g28 group: g29 { //test standard_name = "longitude" dimensions: time29=unlimited; lat29=2; lon29=2; variables: int time29(time29); int lat29(lat29); lat29:standard_name = "latitude"; lat29:units="degree"; int lon29(lon29); lon29:standard_name = "longitude"; lon29:units="degree"; int var3d(time29,lat29,lon29); data: time29=1; lat29=1,2; lon29=1,2; var3d=1,2,3,4; } // end g29 group: g30 { //test cell_methods attribute group: g30g1 { dimensions: time301=unlimited; variables: float time301(time301); time301:long_name = "time301"; data: time301=1,2; }// end g30g1 group: g30g2 { dimensions: time302=unlimited; variables: float time302(time302); time302:long_name = "time302"; time302:cell_methods = "time302: mean"; data: time302=1,2; }// end g30g2 } // end g30 } // end root group nco-4.5.4/data/in_grp_4.cdl000066400000000000000000000026261264355130400154120ustar00rootroot00000000000000// Purpose: Generate test case for nces average members whose hyperslabs resolve to the same size; pair of files are in_grp_4.cdl and in_grp_5.cdl // Generate netCDF files with: // ncgen -k netCDF-4 -b -o ~/nco/data/in_grp_4.nc ~/nco/data/in_grp_4.cdl netcdf in_grp_4 { group: cesm { group: cesm_01 { dimensions: lat=2; lon=4; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180,270; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; } // cesm_01 group: cesm_02 { dimensions: lat=2; lon=3; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180; time=1.,2.,3.,4.,5.,6.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7,8,9,10,11,12, 13,14,15,16,17,18, 19,20,21,22,23,24, 25,26,27,28,29,30, 31,32,33,34,35,36; } // cesm_02 } // cesm } // root group nco-4.5.4/data/in_grp_5.cdl000066400000000000000000000026451264355130400154140ustar00rootroot00000000000000// Purpose: Generate test case for nces average members whose hyperslabs resolve to the same size; pair of files are in_grp_4.cdl and in_grp_5.cdl // Generate netCDF files with: // ncgen -k netCDF-4 -b -o ~/nco/data/in_grp_5.nc ~/nco/data/in_grp_5.cdl netcdf in_grp_5 { group: cesm { group: cesm_03 { dimensions: lat=2; lon=3; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180,270; time=1.,2.,3.,4.,5.,6.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7,8,9,10,11,12, 13,14,15,16,17,18, 19,20,21,22,23,24, 25,26,27,28,29,30, 31,32,33,34,35,36; } // cesm_03 group: cesm_04 { dimensions: lat=2; lon=4; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180,270; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; } // cesm_04 } // cesm } // root group nco-4.5.4/data/in_grp_6.cdl000066400000000000000000000027551264355130400154170ustar00rootroot00000000000000// Purpose: Generate test case for nces ensembles // Generate netCDF files with: // ncgen -k netCDF-4 -b -o ~/nco/data/in_grp_6.nc ~/nco/data/in_grp_6.cdl netcdf in_grp_6 { group: cesm { group: cesm_01 { dimensions: lat=2; lon=4; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180,270; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; } // cesm_01 group: cesm_02 { dimensions: lat=2; lon=4; time=unlimited; variables: double time(time); float lat(lat); float lon(lon); float three_dmn_rec_var(time,lat,lon); data: lat=-90,90; lon=0,90,180,270; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; three_dmn_rec_var=1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; } // cesm_02 } // cesm } // root group nco-4.5.4/data/in_grp_7.cdl000066400000000000000000000062031264355130400154100ustar00rootroot00000000000000// Purpose: Generate test case for nces ensembles // Generate netCDF files with: // ncgen -k netCDF-4 -b -o ~/nco/data/in_grp_7.nc ~/nco/data/in_grp_7.cdl // separated from in_grp_3.cdl dur to netCDF 4.1 repeated dimensions IDs bug netcdf in_grp_7 { // //g19 test cases for ncpdq; same variables as ncpdq netCDF3 tests // group: g19 { dimensions: lat=2; lev=3; lon=4; time=unlimited; variables: float lat(lat); float lon(lon); float lev(lev); float lev_wgt(lev); double time(time); data: lat=-90,90; lon=0,90,180,270; lev=100,500,1000; lev_wgt=10,2,1; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; group: g19g1 { variables: float two_dmn_var(lat,lev); two_dmn_var:long_name = "two dimensional variable"; two_dmn_var:units = "fraction"; data: two_dmn_var=1.5,5.5,9.5,13.5,17.5,21.5; group: g19g1g1 { //test full name --cnk_dmn dimensions: lev=3; variables: float two_dmn_var(lat,lev); two_dmn_var:_DeflateLevel=1; data: two_dmn_var=1.5,5.5,9.5,13.5,17.5,21.5; } // end g19g1g1 } // end g19g1 group: g19g2 { variables: float two_dmn_rec_var(time,lev); two_dmn_rec_var:long_name = "two dimensional record variable"; two_dmn_rec_var:units = "watt meter-2"; data: two_dmn_rec_var=1.,2.0,3., 1.,2.1,3., 1.,2.2,3., 1.,2.3,3., 1.,2.4,3., 1.,2.5,3., 1.,2.6,3., 1.,2.7,3., 1.,2.8,3., 1.,2.9,3.; } // end g19g2 group: g19g3 { variables: double three_dmn_var_dbl(time,lat,lon); three_dmn_var_dbl:long_name = "three dimensional record variable of type double"; three_dmn_var_dbl:units = "watt meter-2"; three_dmn_var_dbl:_FillValue = -99.; data: three_dmn_var_dbl= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, -99,-99,-99,-99,-99,-99,-99,-99, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, -99,74,75,76,77,78,79,-99; } // end g19g3 group: g19g4 { variables: short rec_var_dbl_mss_val_dbl_pck(time); rec_var_dbl_mss_val_dbl_pck:long_name = "record variable, double, packed as short, with double missing values"; rec_var_dbl_mss_val_dbl_pck:purpose = "Packed version of rec_var_dbl_mss_val_dbl_upk"; rec_var_dbl_mss_val_dbl_pck:_FillValue = -999s; rec_var_dbl_mss_val_dbl_pck:missing_value = -999.; rec_var_dbl_mss_val_dbl_pck:scale_factor = -9.15541313801785e-05; rec_var_dbl_mss_val_dbl_pck:add_offset = 5.; double upk; upk:long_name = "Unpacked scalar variable"; upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)."; data: upk=3.; rec_var_dbl_mss_val_dbl_pck=-999,32767,21845,10922,0,-10922,-21845,-32767,-999,-999; } // end g19g4 } // end g19 } // root group nco-4.5.4/data/in_nomismatch.cdl000066400000000000000000001253351264355130400165440ustar00rootroot00000000000000// -*-c++-mode-*- // Purpose: CDL file to generate netCDF test file for NCO // in_nomismatch.cdl is a modified version of in.cdl // This file contains no variables that trigger the ncgen "_FillValue type mismatch" error // scp ~/nco/data/in_nomismatch.cdl dust.ess.uci.edu:/var/www/html/nco // scp ~/nco/data/in_nomismatch.cdl zender,nco@web.sf.net:/home/project-web/nco/htdocs // Some versions (I have lost track of which) of ncgen are too strict // to build CDL files that violate netCDF metadata guidelines. // The NCO in.cdl file intentionally includes corner cases which do this. // The result is ncgen "_FillValue type mismatch" errors. // The easiest workaround I can think of is to copy the (new) // in_nomismatch.cdl file over the in.cdl file distributed with NCO. // Substitute this file into normal NCO build procedure with: // cd ~;wget http://dust.ess.uci.edu/nco/in_nomismatch.cdl . // cp ~/in_nomismatch.cdl /path/to/nco/data/in.cdl // Usage: // netCDF4: ncgen arguments depend on version: // "-k netCDF-4" for netCDF >= 3.6.3, "-k hdf5" for netCDF < 3.6.3 // "-k netCDF-4 classic model" for netCDF >= 3.6.3, "-k hdf5-nc3" for netCDF < 3.6.3 // /usr/local/bin/ncgen -k netCDF-4 -b -o in_4.nc in_nomismatch.cdl // /usr/local/bin/ncgen -k netCDF-4 -b -o ${HOME}/nco/data/in_4.nc ${HOME}/nco/data/in_nomismatch.cdl // URL: // http://dust.ess.uci.edu/nco/in.nc // http://dust.ess.uci.edu/nco/in_4.nc // netCDF3: // ncgen -b -o in.nc in_nomismatch.cdl // ncgen -b -o ${HOME}/nco/data/in.nc ${HOME}/nco/data/in_nomismatch.cdl // scp ~/nco/data/in_nomismatch.cdl ~/nco/data/in_4.nc dust.ess.uci.edu:nco/data // scp ~/nco/data/in.nc ~/nco/data/in_4.nc dust.ess.uci.edu:/var/www/html/nco // scp ~/nco/data/in.nc ~/nco/data/in_4.nc dust.ess.uci.edu:/data/home/www/html/dodsdata // mswrite -t 365 ~/nco/data/in.nc /ZENDER/tmp/in.nc // mswrite -t 365 ~/nco/data/in.nc /ZENDER/tmp/h0001.nc // mswrite -t 365 ~/nco/data/in.nc /ZENDER/tmp/h0002.nc // mswrite -t 365 ~/nco/data/in.nc /ZENDER/tmp/h0003.nc // mswrite -t 365 ~/nco/data/in.nc /ZENDER/tmp/h0004.nc // msrcp -period 365 ~/nco/data/in.nc mss:/ZENDER/tmp/in.nc // msrcp -period 365 ~/nco/data/in.nc mss:/ZENDER/tmp/h0001.nc // msrcp -period 365 ~/nco/data/in.nc mss:/ZENDER/tmp/h0002.nc // msrcp -period 365 ~/nco/data/in.nc mss:/ZENDER/tmp/h0003.nc // msrcp -period 365 ~/nco/data/in.nc mss:/ZENDER/tmp/h0004.nc // WARNING: Changing values of variables below, especially coordinate variables, affects outcome of nco_tst.pl test script // Other programs, e.g., ~/f/fff.F90, ~/c++/ccc.cc, ~/c/c.c may also break // In particular, do not change number of elements in record coordinate, time, without simultaneously changing number of data in all record variables // My (and NCO's) convention is that the _FillValue, if any, of any packed variable should be of the same type as the expanded variable. Hence _FillValue, add_offset, and scale_factor should all be of the same type. Variables that do not adhere to this convention are not supported. // CDL Data constants: // byte: 'a' // char: "a" // short: 1s // int: 1 (no decimal point) // float: 1.f (decimal point is required, f is required to distinguish from double) // double: 1.0, 1.d, 1.0e-20 (decimal point is required, d is not required) // // NCL usage: // id_in=addfile("/home/zender/nco/data/in.nc","r") // print(id_in) // list_filevars(id_in) netcdf in { dimensions: dgn=1,bnd=2,lat=2,lat_grd=3,lev=3,rlev=3,lon=4,lon_grd=5,char_dmn_lng80=80,char_dmn_lng04=4,fl_dmn=3,lsmlev=6,wvl=2,time_udunits=3;lon_T42=128,lat_T42=64,lat_times_lon=8,gds_crd=8,vrt_nbr=2,lon_cal=10,lat_cal=10,time=unlimited; variables: :Conventions = "CF-1.0"; :history = "History global attribute.\n"; :julian_day = 200000.04; :RCS_Header = "$Header$"; float lat(lat); lat:long_name = "Latitude (typically midpoints)"; lat:units = "degrees_north"; lat:bounds = "lat_bnd"; float lat_bnd(lat,vrt_nbr); lat_bnd:purpose = "Cell boundaries for lat coordinate"; float lat_grd(lat_grd); lat_grd:long_name = "Latitude grid (typically interfaces)"; lat_grd:units = "degrees_north"; float lat_cpy(lat); float lev_cpy(lev); float lat_var(lat); float lat_wgt(lat); float lon_T42(lon_T42); float lat_T42(lat_T42); float lat_1D_rct(lat_times_lon); lat_1D_rct:long_name = "Latitude for 2D rectangular grid stored as 1D arrays"; lat_1D_rct:units = "degrees_north"; float lon_1D_rct(lat_times_lon); lon_1D_rct:long_name = "Longitude for 2D rectangular grid stored as 1D arrays"; lon_1D_rct:units = "degrees_east"; float lat_1D_rrg(lat_times_lon); lat_1D_rrg:long_name = "Latitude for 2D irregular grid stored as 1D arrays"; lat_1D_rrg:units = "degrees_north"; float lon_1D_rrg(lat_times_lon); lon_1D_rrg:long_name = "Longitude for 2D irregular grid stored as 1D arrays"; lon_1D_rrg:units = "degrees_east"; int lat_times_lon(lat_times_lon); lat_times_lon:long_name = "Element index (i.e., C-based storage order) for 2D coordinate grids stored as 1D arrays"; float lat_2D_rct(lat,lon); lat_2D_rct:long_name = "Latitude for 2D rectangular grid stored as 2D array"; lat_2D_rct:units = "degrees_north"; float lon_2D_rct(lat,lon); lon_2D_rct:long_name = "Longitude for 2D rectangular grid stored as 2D array"; lon_2D_rct:units = "degrees_east"; float lat_2D_rrg(lat,lon); lat_2D_rrg:long_name = "Latitude for 2D irregular grid stored as 2D array"; lat_2D_rrg:units = "degrees_north"; float lon_2D_rrg(lat,lon); lon_2D_rrg:long_name = "Longitude for 2D irregular grid stored as 2D array"; lon_2D_rrg:units = "degrees_east"; int lat_times_lon_nbr; lat_times_lon_nbr:long_name = "Number of elements in 2D coordinate grids. Rectangular and irregular test grids have this many total elements. The coordinates and elements are stored as 1D or 2D arrays for grid types 1D and 2D respectively."; float lev(lev); lev:purpose = "Monotonically increasing coordinate pressure"; lev:units = "hybrid_sigma_pressure"; lev:positive = "down"; lev:A_var = "hyam"; lev:B_var = "hybm"; lev:P0_var = "P0"; lev:PS_var = "PS"; lev:bounds = "ilev"; float ilev(lev,vrt_nbr); ilev:purpose = "Cell boundaries for lev coordinate"; float rlev(rlev); rlev:purpose = "Monotonically decreasing coordinate pressure"; float lon(lon); lon:long_name = "Longitude (typically midpoints)"; lon:units = "degrees_east"; double lond(lon); lond:long_name = "Longitude (typically midpoints), double precision"; lond:units = "degrees_east"; float lonf(lon); lonf:long_name = "Longitude (typically midpoints), single precision"; lonf:units = "degrees_east"; float lon_grd(lon_grd); lon_grd:long_name = "Longitude grid (typically interfaces)"; lon_grd:units = "degrees_east"; double time(time); time: long_name = "time"; time: units = "days since 1964-03-12 12:09:00 -9:00"; time: calendar = "gregorian"; time: bounds = "time_bnds"; float time_bnds(time,vrt_nbr); time_bnds:purpose = "Cell boundaries for time coordinate"; double lon_cal(lon_cal); lon_cal: long_name = "lon_cal"; lon_cal: units = "days since 1964-2-28"; lon_cal: calendar = "365_day"; double lat_cal(lat_cal); lat_cal: long_name = "lat_cal"; lat_cal: units = "days since 1964-2-28"; lat_cal: calendar = "360_day"; float lsmlev(lsmlev); lsmlev:purpose = "Homebrew level coordinate for LSM"; lsmlev:long_name = "Soil depth"; lsmlev:units = "meter"; float wvl(wvl); wvl:long_name = "Wavelength"; wvl:units = "meter"; int od(time); float area(lat); area:long_name = "area"; area:units = "meter2"; float hyam(lev); hyam:long_name = "hybrid A coefficient at layer midpoints"; float hybm(lev); hybm:long_name = "hybrid B coefficient at layer midpoints"; float P0; P0:long_name = "reference pressure"; P0:units = "pascal"; float cnv_CF_crd(gds_crd); cnv_CF_crd:long_name = "test CF coordinates conventions"; cnv_CF_crd:coordinates = "lat_gds lon_gds "; cnv_CF_crd:reason = "Test whether coordinates attribute strings that end with a space break after nco_var_lst_crd_ass_add() call to nco_lst_prs_2d()"; float PS(time,lat,lon); PS:long_name = "surface pressure"; PS:units = "pascal"; char fl_dmn(fl_dmn); fl_dmn:long_name = "Character coordinate"; fl_dmn:units = "[chr]"; double lat_gds(gds_crd); lat_gds:long_name = "Latitude"; lat_gds:standard_name = "latitude"; lat_gds:units="degree"; lat_gds:purpose = "1-D latitude coordinate referred to by geodesic grid variables"; double lon_gds(gds_crd); lon_gds:long_name = "Longitude"; lon_gds:standard_name = "longitude"; lon_gds:units="degree"; lon_gds:purpose = "1-D longitude coordinate referred to by geodesic grid variables"; float gds_crd(gds_crd); gds_crd:long_name = "Geodesic coordinate"; gds_crd:units = "degree"; gds_crd:purpose = "enumerated coordinate like those that might define points in a geodesic grid"; gds_crd:coordinates = "lat_gds lon_gds"; float gds_var(gds_crd); gds_var:long_name = "Geodesic variable"; gds_var:units = "meter"; gds_var:purpose = "Test auxiliary coordinates like those that define geodesic grids"; gds_var:coordinates = "lat_gds lon_gds"; float gds_3dvar(time,gds_crd); gds_3dvar:long_name = "Geodesic variable"; gds_3dvar:units = "meter"; gds_3dvar:coordinates = "lat_gds lon_gds"; gds_3dvar:purpose = "Test auxiliary coordinates like those that define geodesic grids"; int nbdate; nbdate:long_name = "base date as 6- or 8-digit integer (YYMMDD or YYYYMMDD)"; int date(time); date:long_name = "current date as 6- or 8-digit integer (YYMMDD or YYYYMMDD)"; float lon_wgt(lon); lon_wgt:long_name = "Gaussian weights"; lon_wgt:purpose = "Gaussian weights which sum to two for n = 4. These weights are all have floor of 0.0 so should cause SIGFPE when applied to integer types in weighted average."; float msk_prt_mss_prt(lon); msk_prt_mss_prt:long_name = "partial mask, partial missing value example"; msk_prt_mss_prt:_FillValue = 1.0e36f; float mss_val(lon); mss_val:long_name = "partial missing value example"; mss_val:_FillValue = 1.0e36f; float mss_val_scl; mss_val_scl:long_name = "scalar missing value"; mss_val_scl:_FillValue = 1.0e36f; float mss_val_fst(lon); mss_val_fst:long_name = "offset partial missing value example"; mss_val_fst:_FillValue = -999.0f; float fll_val(lon); fll_val:long_name = "_FillValue example"; fll_val:_FillValue = -999.0f; float fll_val_mss_val(lon); fll_val_mss_val:long_name = "_FillValue example"; fll_val_mss_val:_FillValue = -999.0f; fll_val_mss_val:missing_value = -999.0f; float nm_spc; nm_spc:long_name = "Variable name with space (invalid)"; float nm_pnd; nm_pnd:long_name = "Variable name with pound symbol (invalid)"; float no_mss_val(lon); no_mss_val:long_name = "no missing value"; float val_one_mss(lat); val_one_mss:long_name = "one regular value, one missing value"; val_one_mss:_FillValue = 1.0e36f; short rec_var_pck_scale_factor_only(time); rec_var_pck_scale_factor_only:long_name = "Array packed with scale factor only"; rec_var_pck_scale_factor_only:note = "Original packed value was 1s..10s with scale_factor = 10.0d no add_offset. Unpacked value should be 10.0 = 10.0d*1s + 0.0d through 100 = 10.0d*1s + 0.0d. Average value should be 55."; rec_var_pck_scale_factor_only:scale_factor = 10.0d; short pck; pck:long_name = "Scalar variable, double, packed as short"; pck:note = "Original packed value was 1s with scale_factor = 2.0d and add_offset = 1.0d. Unpacked value should be 3.0 = 2.0d*1s + 1.0d. NCO algorithms would pack this variable as scale_factor = 0.0d and add_offset = 3.0d."; pck:scale_factor = 2.0d; pck:add_offset = 1.0d; short pck_arr(lon); pck_arr:long_name = "Array variable, double, packed as short"; pck_arr:note = "Packed value is -32767s, 0s, 1s, 32767s, unpacked is same in double"; pck_arr:scale_factor = 1.0d; pck_arr:add_offset = 0.0d; double upk; upk:long_name = "Unpacked scalar variable"; upk:note = "Unpacked value is 3.0d0, upk=unpack(pck)= 2.0d0*1s + 1.0d0 = 3.0d0. Packing this variable should create an NC_SHORT scalar = 0s with packing attribute add_offset=3.0d and either no scale_factor (ncap) or scale_factor = 0.0d (ncpdq)."; double upk_arr(lon); upk_arr:long_name = "Unpacked array"; upk_arr:note = "Unpacked value is -32767.d, 0.d, 1.d, 32767.d, packed is same in short. Packing algorithm should yield an NC_SHORT array = [] with packing attributes scale_factor=1.0d, add_offset=0.0d"; int val_one_int; val_one_int:long_name = "scalar equal to 1"; val_one_int:_FillValue = -99l; int val_one_one_int(lat); val_one_one_int:long_name = "1, 1"; val_one_one_int:_FillValue = -99l; short val_max_max_sht(lat); val_max_max_sht:long_name = "17000, 17000"; val_max_max_sht:_FillValue = -99s; int val_one_mss_int(lat); val_one_mss_int:long_name = "1, mss_val"; val_one_mss_int:_FillValue = -99l; float val_half; val_half:long_name = "Scalar with value 0.5"; val_half:_FillValue = 1.0e36f; float val_half_half(lat); val_half_half:long_name = "0.5,0.5"; val_half_half:_FillValue = 1.0e36f; float wgt_one(lat); wgt_one:long_name = "all values are one"; float mss_val_all(lon); mss_val_all:long_name = "all missing values example"; mss_val_all:_FillValue = 1.0e36f; float scalar_var; scalar_var:long_name = "scalar variable"; scalar_var:units = "fraction"; float float_var; float_var:long_name = "float"; double double_var; double_var:long_name = "double"; double double_var2; double_var2:long_name = "double"; double_var2:_FillValue = 1.0e36; double pi; pi:long_name = "Pi"; pi:units = "fraction"; int int_var; int_var:long_name = "int"; short short_var; short_var:long_name = "short"; char char_var; char_var:long_name = "char"; char char_var_space; char_var_space:long_name = "Character variable with whitespace on ends"; char char_var_nul; char_var_nul:long_name = "Character variable containing one NUL"; char char_var_multinul(lev); char_var_multinul:long_name = "Character variable containing multiple NULs"; char fl_nm(char_dmn_lng80); fl_nm:long_name = "Variable contains a file name"; char fl_nm_arr(fl_dmn,char_dmn_lng80); fl_nm_arr:long_name = "Variable that contains a short array of file names"; fl_nm_arr:units = "[sng]"; char non_nul_trm_char_one_dmn(char_dmn_lng04); non_nul_trm_char_one_dmn:long_name = "Variable contains a one-dimensional array of characters that is not NUL-terminated"; non_nul_trm_char_one_dmn:units = "[chr]"; char non_nul_trm_char_two_dmn(fl_dmn,char_dmn_lng04); non_nul_trm_char_two_dmn:long_name = "Variable contains a two-dimensional array of characters that are not NUL-terminated"; non_nul_trm_char_two_dmn:units = "[chr]"; byte byte_var; byte_var:long_name = "byte"; byte byte_var_neg; byte_var_neg:long_name = "negative byte"; float zero; zero:long_name = "zero"; float one; one:long_name = "one"; float two; two:long_name = "two"; double e_dbl; e_dbl:long_name = "e, natural logarithm base"; float e_flt; e_flt:long_name = "e, natural logarithm base"; float three; three:long_name = "three"; float four; four:long_name = "four"; float negative_one; negative_one:long_name = "negative one"; float lev_var(lev); lev_var:long_name = "lev_var"; float lev_wgt(lev); lev_wgt:long_name = "lev_wgt"; float g; g:long_name = "g"; float dps_dry; dps_dry:long_name = "Dry Deposition"; float dps_wet; dps_wet:long_name = "Wet Deposition"; float dps_ttl; dps_ttl:long_name = "Total Deposition"; float z(lev); z:long_name = "Height"; z:units = "meter"; z:purpose = "Height stored with a monotonically increasing coordinate"; float rz(rlev); rz:long_name = "Height"; rz:units = "meter"; rz:purpose = "Height stored with a monotonically decreasing coordinate"; float one_dmn_var(bnd); int one_dmn_int_val_one(lat); int one_dmn_int_val_two(lat); float att_var; att_var:byte_att = '\000','\001','\002','\177','\200','\201','\376','\377'; att_var:char_att = "Sentence one.\nSentence two.\n"; att_var:short_att = 37s; att_var:int_att = 73l; att_var:float_att = 73.0f,72.0f,71.0f; att_var:double_att = 73.0d; int bnd_var(lev,bnd); bnd_var:byte_att = '\0'; bnd_var:char_att = "Sentence one.\nSentence two.\n"; bnd_var:short_att = 37s; bnd_var:int_att = 73; bnd_var:float_att = 73.f; bnd_var:double_att = 73.d; float three_dmn_var(lat,lev,lon); three_dmn_var:long_name = "three dimensional variable with CCM coordinate convention C=[lat,lev,lon], Fortran=(lon,lev,lat)"; three_dmn_var:units = "fraction"; float three_dmn_var_crd(lev,lat,lon); three_dmn_var_crd:long_name = "three dimensional variable with COORDS coordinate convention C=[lev,lat,lon], Fortran=(lon,lat,lev)"; three_dmn_var_crd:units = "fraction"; float prs_sfc(time,lat,lon); prs_sfc:long_name = "Surface pressure"; prs_sfc:units = "pascal"; float H2O; float H2OH2O; float H2SO4; float H2O_lqd; float H2O_ice; float Q; float Q1; float AQ01; float QQ01; float QA01; float Q01Q; float Q01; float Q02; float Q03; float Q04; float Q05; float Q06; float Q07; float Q08; float Q09; float Q10; float Q11; float Q12; float Q13; float Q14; float Q15; float Q16; float Q17; float Q18; float Q19; float Q20; float Q21; float Q22; float Q23; float Q24; float Q25; float Q26; float Q27; float Q28; float Q29; float Q30; float Q31; float Q32; float Q33; float Q34; float Q35; float Q36; float Q37; float Q38; float Q39; float Q40; float Q41; float Q42; float Q43; float Q44; float Q45; float Q46; float Q47; float Q48; float Q49; float Q50; float Q51; float Q52; float Q53; float Q54; float Q55; float Q56; float Q57; float Q58; float Q59; float Q60; float Q61; float Q62; float Q63; float Q64; float Q65; float Q66; float Q67; float Q68; float Q69; float Q70; float Q71; float Q72; float Q73; float Q74; float Q75; float Q76; float Q77; float Q78; float Q79; float Q80; float Q81; float Q82; float Q83; float Q84; float Q85; float Q86; float Q87; float Q88; float Q89; float Q90; float Q91; float Q92; float Q93; float Q94; float Q95; float Q96; float Q97; float Q98; float Q99; float Q100; float two_dmn_var(lat,lev); two_dmn_var:long_name = "two dimensional variable"; two_dmn_var:units = "fraction"; float var_msk(lat,lon); var_msk:long_name = "Float field for testing masks and wheres"; var_msk:units = "fraction"; float mask(lat,lon); mask:long_name = "Purpose is to mask a variable like ORO"; mask:units = "fraction"; float ORO(lat,lon); ORO:long_name = "Orography, an enumerated yet continuous type: ocean=0.0, land=1.0, sea ice=2.0"; ORO:units = "fraction"; float weight(lat); weight:long_name = "Gaussian weight"; weight:units = "fraction"; float gw(lat); gw:long_name = "gw variable like gw"; gw:units = "fraction"; float gw_T42(lat_T42); gw_T42:long_name = "gw variable like gw_T42"; gw_T42:units = "fraction"; float rec_var_flt(time); rec_var_flt:long_name = "record variable, float"; double rec_var_dbl(time); rec_var_dbl:long_name = "record variable, double"; int one_dmn_rec_var(time); one_dmn_rec_var:long_name = "one dimensional record variable"; one_dmn_rec_var:units = "second"; float one_dmn_rec_var_missing_value(time); one_dmn_rec_var_missing_value:long_name = "One dimensional record variable with missing data indicated by missing_value attribute only. No _FillValue attribute exists."; one_dmn_rec_var_missing_value:missing_value = 1.0e36f; float one_dmn_rec_var__FillValue(time); one_dmn_rec_var__FillValue:long_name = "One dimensional record variable with missing data indicated by _FillValue attribute only. No missing_value attribute exists."; one_dmn_rec_var__FillValue:_FillValue = 1.0e36f; int RDM(time); float tpt(time); tpt:long_name = "Temperature"; tpt:units = "kelvin"; tpt:hieght = "Leave hieght mispelled for NCO User's guide example"; double rec_var_dbl_mss_val_dbl_upk(time); rec_var_dbl_mss_val_dbl_upk:long_name = "record variable, double, with double missing values"; rec_var_dbl_mss_val_dbl_upk:purpose = "This variable is used to generate the packed variable rec_var_dbl_mss_val_dbl_pck, so its _FillValue should not be out of range, i.e., it should be representable by a short. However, the _FillValue should itself be the same type as the unpacked variable, NC_DOUBLE in this case."; rec_var_dbl_mss_val_dbl_upk:_FillValue = -999.; rec_var_dbl_mss_val_dbl_upk:missing_value = -999.; short rec_var_dbl_mss_val_sht_pck(time); rec_var_dbl_mss_val_sht_pck:long_name = "record variable, double, packed as short, with short missing values"; rec_var_dbl_mss_val_sht_pck:purpose = "Packed version of rec_var_dbl_mss_val_sht_upk"; rec_var_dbl_mss_val_sht_pck:_FillValue = -999s; rec_var_dbl_mss_val_sht_pck:missing_value = -999s; rec_var_dbl_mss_val_sht_pck:scale_factor = -9.15541313801785e-05; rec_var_dbl_mss_val_sht_pck:add_offset = 5.; short scl_dbl_pck; scl_dbl_pck:long_name = "scalar variable, double, packed"; scl_dbl_pck:purpose = "Packed version of number with ncdiff subtraction bug"; scl_dbl_pck:scale_factor = -9.15541313801785e-05; scl_dbl_pck:add_offset = 5.; float rec_var_flt_mss_val_flt_all(time); rec_var_flt_mss_val_flt_all:long_name = "record variable, float, with float missing values in every position"; rec_var_flt_mss_val_flt_all:_FillValue = 1.0e36f; float rec_var_flt_mss_val_flt_all_but_one(time); rec_var_flt_mss_val_flt_all_but_one:long_name = "record variable, float, with float missing values in every position but one"; rec_var_flt_mss_val_flt_all_but_one:_FillValue = 1.0e36f; float rec_var_flt_mss_val_flt_all_but_two(time); rec_var_flt_mss_val_flt_all_but_two:long_name = "record variable, float, with float missing values in every position but two"; rec_var_flt_mss_val_flt_all_but_two:_FillValue = 1.0e36f; short rec_var_flt_pck(time); rec_var_flt_pck:long_name = "record variable, float, packed into short"; rec_var_flt_pck:purpose = "Demonstrate that rounding of means of packed data are handled correctly"; rec_var_flt_pck:scale_factor = 0.1f; rec_var_flt_pck:add_offset = 100.0f; short rec_var_dbl_pck(time); rec_var_dbl_pck:long_name = "record variable, double, packed into short"; rec_var_dbl_pck:purpose = "Demonstrate that rounding of means of packed data are handled correctly"; rec_var_dbl_pck:scale_factor = 0.1; rec_var_dbl_pck:add_offset = 100.0; short non_rec_var_flt_pck(lon); non_rec_var_flt_pck:long_name = "regular variable, float, packed into short"; non_rec_var_flt_pck:purpose = "Demonstrate that non-rec dim packed vars are handled correctly"; non_rec_var_flt_pck:scale_factor = 0.1f; non_rec_var_flt_pck:add_offset = 100.0f; float rec_var_flt_mss_val_dbl(time); rec_var_flt_mss_val_dbl:long_name = "record variable, float, with double missing values"; rec_var_flt_mss_val_dbl:_FillValue = 1.0e36f; rec_var_flt_mss_val_dbl:missing_value = 1.0e36f; rec_var_flt_mss_val_dbl:note = "The correct average of this variable is 5.0"; float rec_var_flt_mss_val_int(time); rec_var_flt_mss_val_int:long_name = "record variable, float, with integer missing values"; rec_var_flt_mss_val_int:_FillValue = -999.f; rec_var_flt_mss_val_int:missing_value = -999.f; int rec_var_int_mss_val_int(time); rec_var_int_mss_val_int:long_name = "record variable, integer, with integer missing values"; rec_var_int_mss_val_int:_FillValue = -999; char one_dmn_rec_var_sng(time); one_dmn_rec_var_sng:long_name = "one dimensional record variable of string"; float time_lon(time,lon); time_lon:long_name = "Record variable of longitude coordinate"; char two_dmn_rec_var_sng(time,lev); two_dmn_rec_var_sng:long_name = "two dimensional record variable of string"; float two_dmn_rec_var(time,lev); two_dmn_rec_var:long_name = "two dimensional record variable"; two_dmn_rec_var:units = "watt meter-2"; float three_dmn_rec_var(time,lat,lon); three_dmn_rec_var:long_name = "three dimensional record variable"; three_dmn_rec_var:units = "watt meter-2"; double three_dmn_var_dbl(time,lat,lon); three_dmn_var_dbl:long_name = "three dimensional record variable of type double"; three_dmn_var_dbl:units = "watt meter-2"; three_dmn_var_dbl:_FillValue = -99.; int three_dmn_var_int(time,lat,lon); three_dmn_var_int:long_name = "three dimensional record variable of type int"; three_dmn_var_int:units = "watt meter-2"; three_dmn_var_int:_FillValue = -99; short three_dmn_var_sht(time,lat,lon); three_dmn_var_sht:long_name = "three dimensional record variable"; three_dmn_var_sht:units = "watt meter-2"; three_dmn_var_sht:_FillValue = -99s; int th(time,lat,lon); th:long_name = "three dimensional record variable"; th:units = "watt meter-2"; th:_FillValue = -99; float td(time,dgn); td:long_name = "two dimensional record variable stored in td (time,dgn) order (dgn means degenerate, i.e., of size 1)"; float tx(time,lon); tx:long_name = "two dimensional record variable stored in tx (time,lon) order"; float ty(time,lat); ty:long_name = "two dimensional record variable stored in ty (time,lat) order"; float tz(time,lev); tz:long_name = "two dimensional record variable stored in tz (time,lev) order"; float txyz(time,lon,lat,lev); txyz:long_name = "four dimensional record variable stored in txyz (time,lon,lat,lev) order"; float four_dmn_rec_var(time,lat,lev,lon); four_dmn_rec_var:long_name = "four dimensional record variable"; four_dmn_rec_var:units = "watt meter-2"; // double three_double_dmn(time,lon,lon); double time_udunits(time_udunits); time_udunits:units = "hours since 1900-01-01 00:00:0.0"; time_udunits:delta_t = "0000-00-00 06:00:0.0"; float u(time); u:long_name = "Zonal wind speed"; u:units = "meter second-1"; float v(time); v:long_name = "Meridional wind speed"; v:units = "meter second-1"; float var_1D_rct(lat_times_lon); var_1D_rct:long_name = "Variable for 2D rectangular grid stored as 1D arrays"; float var_1D_rrg(lat_times_lon); var_1D_rrg:long_name = "Variable for 2D irregular grid stored as 1D arrays"; float var_2D_rct(lat,lon); var_2D_rct:long_name = "Variable for 2D rectangular grid stored as 2D array"; float var_2D_rrg(lat,lon); var_2D_rrg:long_name = "Variable for 2D irregular grid stored as 2D array"; float var_nm-dash; var_nm-dash:long_name = "Variable and attribute names include dash characters"; var_nm-dash:att_nm-dash = 1.0e36f; float var_nm.dot; var_nm.dot:long_name = "Variable and attribute names include dot characters"; // 20070102: Periods in attribute names choke OPeNDAP from FC7 RPM TODO nco911 // 20091105: Periods in attribute names choke ncgen from RHEL5 TODO nco911 // var_nm.dot:att_nm.dot = 1.0e36f; float wnd_spd(time,lat,lon); wnd_spd:long_name = "wind speed"; wnd_spd:units = "meter second-1"; wnd_spd:_FillValue = -999.0f; data: att_var=10.; area=10.,10.; bnd_var=1,2,3,4,5,6; byte_var='z'; byte_var_neg=-122; char_var="z"; char_var_multinul="\b\n\0"; char_var_nul='\0'; char_var_space=" "; cnv_CF_crd=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8; double_var=10.; double_var2=10.; dps_dry=73; dps_wet=73; dps_ttl=73; e_dbl=2.71828182846; e_flt=2.71828182846; // 20100809: Single quotes around NC_CHAR coordinates required as of 4.1.2-beta1-snapshot2010080820 // 20100809: Double quotes cause "String constant too long" error in ncgen fl_dmn='a','b','3'; fl_nm="/home/zender/nco/data/in.cdl"; float_var=10.; four=4.; g=9.8; gw=10.,10.; gw_T42=-87.863799,-85.096527,-82.312913,-79.525607,-76.736900,-73.947515,-71.157752,-68.367756,-65.577607,-62.787352,-59.997020,-57.206632,-54.416200,-51.625734,-48.835241,-46.044727,-43.254195,-40.463648,-37.673090,-34.882521,-32.091944,-29.301360,-26.510769,-23.720174,-20.929574,-18.138971,-15.348365,-12.557756,-9.767146,-6.976534,-4.185921,-1.395307,1.395307,4.185921,6.976534,9.767146,12.557756,15.348365,18.138971,20.929574,23.720174,26.510769,29.301360,32.091944,34.882521,37.673090,40.463648,43.254195,46.044727,48.835241,51.625734,54.416200,57.206632,59.997020,62.787352,65.577607,68.367756,71.157752,73.947515,76.736900,79.525607,82.312913,85.096527,87.863799; hyam=0.0802583,0.0438226,0.0; hybm=0.0187849,0.457453,0.992528; P0=100000; gds_crd=0,1,2,3,4,5,6,7; gds_var=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8; gds_3dvar=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8, 274.1,274.2,274.3,274.4,274.5,274.6,274.7,274.8, 275.1,275.2,275.3,275.4,275.5,274.5,275.7,275.8, 276.1,276.2,276.3,276.4,276.5,276.5,276.7,276.8, 277.1,277.2,277.3,277.4,277.5,277.5,277.7,277.8, 278.1,278.2,278.3,278.4,278.5,278.6,278.7,278.8, 279.1,279.2,279.3,279.4,279.5,279.9,279.7,279.8, 280.1,280.2,280.3,280.4,280.5,280.9,280.7,280.8, 281.1,281.2,281.3,281.4,281.5,281.9,281.7,281.8, 282.1,282.2,282.3,282.4,282.5,282.9,282.7,282.8; lat_gds=-90, -30, -30, 0, 0, 30, 30, 90; lon_gds= 0, 0, 180, 0, 180, 0, 180, 0; lat=-90,90; lat_bnd=-90,0,0,90; lat_cal=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; lon_cal=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; lat_times_lon=0,1,2,3,4,5,6,7; lat_times_lon_nbr=8; lat_1D_rct=-90, -90, -90, -90, 90, 90, 90, 90; lon_1D_rct= 0, 90, 180, 270, 0, 90, 180, 270; lat_1D_rrg=-90, -30, -30, 0, 0, 30, 30, 90; lon_1D_rrg= 0, 0, 180, 0, 180, 0, 180, 0; lat_2D_rct=-90, -90, -90, -90, 90, 90, 90, 90; lon_2D_rct= 0, 90, 180, 270, 0, 90, 180, 270; lat_2D_rrg=-90, -30, -30, 0, 0, 30, 30, 90; lon_2D_rrg= 0, 0, 180, 0, 180, 0, 180, 0; lat_grd=-90,0,90; lat_cpy=-90,90; lat_var=1.,2.; lat_wgt=1.,2.; // lat_T42=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63; lat_T42=-88.240089,-85.092445,-82.311981,-79.525253,-76.736732,-73.947418,-71.157700,-68.367722,-65.577576,-62.787331,-59.997005,-57.206619,-54.416191,-51.625729,-48.835236,-46.044724,-43.254192,-40.463646,-37.673088,-34.882519,-32.091942,-29.301357,-26.510769,-23.720173,-20.929573,-18.138969,-15.348364,-12.557755,-9.767145,-6.976533,-4.185921,-1.395307,1.395307,4.185921,6.976533,9.767145,12.557755,15.348364,18.138969,20.929573,23.720173,26.510769,29.301357,32.091942,34.882519,37.673088,40.463646,43.254192,46.044724,48.835236,51.625729,54.416191,57.206619,59.997005,62.787331,65.577576,68.367722,71.157700,73.947418,76.736732,79.525253,82.311981,85.092445,88.240089; lsmlev=0.05,0.1,0.2,0.5,1.0,3.0; lev=100,500,1000; ilev=0,300,300,750,750,1013.25; lev_cpy=100,500,1000; lev_var=100.,500.,1000.; lev_wgt=10,2,1; lon=0,90,180,270; lond=0,90,180,270; lonf=0,90,180,270; lon_grd=-45,45,135,225,315; lon_wgt=0.347855,0.652145,0.652145,0.347855; // lon_T42=0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127; lon_T42=0.000000,2.812500,5.625000,8.437500,11.250000,14.062500,16.875000,19.687500,22.500000,25.312500,28.125000,30.937500,33.750000,36.562500,39.375000,42.187500,45.000000,47.812500,50.625000,53.437500,56.250000,59.062500,61.875000,64.687500,67.500000,70.312500,73.125000,75.937500,78.750000,81.562500,84.375000,87.187500,90.000000,92.812500,95.625000,98.437500,101.250000,104.062500,106.875000,109.687500,112.500000,115.312500,118.125000,120.937500,123.750000,126.562500,129.375000,132.187500,135.000000,137.812500,140.625000,143.437500,146.250000,149.062500,151.875000,154.687500,157.500000,160.312500,163.125000,165.937500,168.750000,171.562500,174.375000,177.187500,180.000000,182.812500,185.625000,188.437500,191.250000,194.062500,196.875000,199.687500,202.500000,205.312500,208.125000,210.937500,213.750000,216.562500,219.375000,222.187500,225.000000,227.812500,230.625000,233.437500,236.250000,239.062500,241.875000,244.687500,247.500000,250.312500,253.125000,255.937500,258.750000,261.562500,264.375000,267.187500,270.000000,272.812500,275.625000,278.437500,281.250000,284.062500,286.875000,289.687500,292.500000,295.312500,298.125000,300.937500,303.750000,306.562500,309.375000,312.187500,315.000000,317.812500,320.625000,323.437500,326.250000,329.062500,331.875000,334.687500,337.500000,340.312500,343.125000,345.937500,348.750000,351.562500,354.375000,357.187500; mask=0.,1.,0.,0.,1.,1.,0.,2.; var_msk=0.,1.,0.,0.,1.,1.,0.,2.; ORO=0.,1.,0.,0.,1.,1.,0.,2.; // mask=0.,0.,0.,0.,0.,0.,0.,0.; // mask=1.,1.,1.,1.,1.,1.,1.,1.; fll_val=73,-999,73,-999; fll_val_mss_val=73,-999,73,-999; msk_prt_mss_prt=0.5,1.0e36,1.5,1.0e36; mss_val=73,1.0e36,73,1.0e36; mss_val_all=1.0e36,1.0e36,1.0e36,1.0e36; mss_val_fst=-999,73,-999,73; mss_val_scl=1.0e36; negative_one=-1.; nm_pnd=1; nm_spc=1; no_mss_val=73,1.0e36,73,1.0e36; non_nul_trm_char_one_dmn='a','b'; non_nul_trm_char_two_dmn="abcd","efgh","ijkm"; one=1.; one_dmn_rec_var=1,2,3,4,5,6,7,8,9,10; one_dmn_rec_var_missing_value=1,2,3,4,5,6,7,8,9,1.0e36; one_dmn_rec_var__FillValue=1,2,3,4,5,6,7,8,9,1.0e36; RDM=1,9,36,84,126,126,84,36,9,1; one_dmn_rec_var_sng="Hello Wor"; one_dmn_var=1.,10.; one_dmn_int_val_one=1,1; one_dmn_int_val_two=2,2; pck=1; rec_var_pck_scale_factor_only=1,2,3,4,5,6,7,8,9,10; pck_arr=-32767,0,1,32767; pi=3.1415926535897932384626433832795029; upk=3.; upk_arr=-32767.,0.,1.,32767.; H2O=1.0; H2OH2O=1.0; H2SO4=1.0; H2O_lqd=1.0; H2O_ice=1.0; Q=1.0e36; Q1=1.0e36; AQ01=1.0e36; QQ01=1.0e36; QA01=1.0e36; Q01Q=1.0e36; Q01=1; Q02=2; Q03=3; Q04=4; Q05=5; Q06=6; Q07=7; Q08=8; Q09=9; Q10=10; Q11=11; Q12=12; Q13=13; Q14=14; Q15=15; Q16=16; Q17=17; Q18=18; Q19=19; Q20=20; Q21=21; Q22=22; Q23=23; Q24=24; Q25=25; Q26=26; Q27=27; Q28=28; Q29=29; Q30=30; Q31=31; Q32=32; Q33=33; Q34=34; Q35=35; Q36=36; Q37=37; Q38=38; Q39=39; Q40=40; Q41=41; Q42=42; Q43=43; Q44=44; Q45=45; Q46=46; Q47=47; Q48=48; Q49=49; Q50=50; Q51=51; Q52=52; Q53=53; Q54=54; Q55=55; Q56=56; Q57=57; Q58=58; Q59=59; Q60=60; Q61=61; Q62=62; Q63=63; Q64=64; Q65=65; Q66=66; Q67=67; Q68=68; Q69=69; Q70=70; Q71=71; Q72=72; Q73=73; Q74=74; Q75=75; Q76=76; Q77=77; Q78=78; Q79=79; Q80=80; Q81=81; Q82=82; Q83=83; Q84=84; Q85=85; Q86=86; Q87=87; Q88=88; Q89=89; Q90=90; Q91=91; Q92=92; Q93=93; Q94=94; Q95=95; Q96=96; Q97=97; Q98=98; Q99=99; Q100=100; non_rec_var_flt_pck=1,2,3,4; rec_var_dbl=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; rec_var_dbl_mss_val_dbl_upk=-999.,2.,3.,4.,5.,6.,7.,8.,-999.,-999.; rec_var_dbl_mss_val_sht_pck=-999,32767,21845,10922,0,-10922,-21845,-32767,-999,-999; rec_var_dbl_pck=1,2,3,4,5,6,7,8,9,10; rec_var_flt=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; rec_var_flt_mss_val_dbl=1.0e36,2.,3.,4.,5.,6.,7.,8.,1.0e36,1.0e36; rec_var_flt_mss_val_flt_all=1.0e36,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36; rec_var_flt_mss_val_flt_all_but_one=1.0e36,1.0e36,1.0e36,1.0e36,5.0,1.0e36,1.0e36,1.0e36,1.0e36,1.0e36; rec_var_flt_mss_val_flt_all_but_two=1.0e36,1.0e36,1.0e36,1.0e36,5.0,1.0e36,1.0e36,1.0e36,1.0e36,10.0; rec_var_flt_pck=1,2,3,4,5,6,7,8,9,10; rec_var_int_mss_val_int=-999,2,3,4,5,6,7,8,-999,-999; rlev=1000,500,100; rz=0,5000,17000; scl_dbl_pck=10922; scalar_var=10.; short_var=10; three=3.; three_dmn_var=0.,1.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.,19.,20.,21.,22.,23.; three_dmn_var_crd=0.,1.,2.,3.,12.,13.,14.,15.,4.,5.,6.,7.,16.,17.,18.,19.,8.,9.,10.,11.,20.,21.,22.,23.; time=1.,2.,3.,4.,5.,6.,7.,8.,9.,10.; time_bnds=0.5,1.5,1.5,2.5,2.5,3.5,3.5,4.5,4.5,5.5,5.5,6.5,6.5,7.5,7.5,8.5,8.5,9.5,9.5,10.5; od=20,22,24,26,28,30,32,34,36,38; tpt=273.1,273.2,273.3,273.4,273.5,273.6,273.7,273.8,273.9,274.0; two=2.; two_dmn_var=1.5,5.5,9.5,13.5,17.5,21.5; u=1.,0.,1.,0.,1.,0.,1.,0.,1.,0.; v=0.,1.,0.,1.,0.,1.,0.,1.,0.,1.; val_half=0.5; val_half_half=0.5,0.5; val_max_max_sht=17000,17000; val_one_int=1; val_one_mss=1.,1.0e36; val_one_mss_int=1,-99; val_one_one_int=1,1; var_nm-dash=1.0; var_nm.dot=1.0; var_1D_rct=0.,1.,0.,0.,1.,1.,0.,2.; var_1D_rrg=0.,1.,0.,0.,1.,1.,0.,2.; var_2D_rct=0.,1.,0.,0.,1.,1.,0.,2.; var_2D_rrg=0.,1.,0.,0.,1.,1.,0.,2.; weight=10.,10.; wgt_one=1.,1.; wvl=0.5e-6,1.0e-6; z=17000,5000,0; zero=0.; // date=640312,640313,640314,640315,640316,640317,640318,640319,640320,640321; date=640224,640225,640226,640227,640228,640301,640302,640303,640304,640305; int_var=10; nbdate=640224; fl_nm_arr="/data/zender/dstccm04/dstccm04_8589_01.nc", "/data/zender/dstccm04/dstccm04_8589_02.nc", "/data/zender/dstccm04/dstccm04_8589_03.nc"; time_lon=0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0, 0.0,90.0,180.0,270.0; two_dmn_rec_var_sng="abc", "bcd", "cde", "def", "efg", "fgh", "ghi", "hij", "jkl", "klm"; two_dmn_rec_var=1.,2.0,3., 1.,2.1,3., 1.,2.2,3., 1.,2.3,3., 1.,2.4,3., 1.,2.5,3., 1.,2.6,3., 1.,2.7,3., 1.,2.8,3., 1.,2.9,3.; three_dmn_rec_var= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; prs_sfc= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, 73,74,75,76,77,78,79,80; PS= 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325, 101325,101325,101325,101325,101325,101325,101325,101325; three_dmn_var_dbl= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, -99,-99,-99,-99,-99,-99,-99,-99, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, -99,74,75,76,77,78,79,-99; three_dmn_var_int= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, -99,-99,-99,-99,-99,-99,-99,-99, 25,26,27,28,29,30,31,32, 33,34,35,36,37,38,39,40, 41,-99,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,-99,62,63,64, 65,-99,67,68,69,70,71,72, -99,74,75,-99,77,78,79,80; three_dmn_var_sht= 1, 2, 3, 4, 5, 6, 7, 8, -99,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32, -99,34,35,-99,37,38,39,40, 41,42,43,44,-99,46,47,48, 49,50,51,52,53,54,55,56, 57,58,59,-99,61,62,63,64, 65,66,67,68,69,70,71,72, -99,-99,-99,-99,-99,-99,-99,-99; th= 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, -99,-99,-99,-99,-99,-99,-99,-99, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, -99,74,75,76,77,78,79,-99; four_dmn_rec_var= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108, 109,110,111,112,113,114,115,116,117,118,119,120, 121,122,123,124,125,126,127,128,129,130,131,132, 133,134,135,136,137,138,139,140,141,142,143,144, 145,146,147,148,149,150,151,152,153,154,155,156, 157,158,159,160,161,162,163,164,165,166,167,168, 169,170,171,172,173,174,175,176,177,178,179,180, 181,182,183,184,185,186,187,188,189,190,191,192, 193,194,195,196,197,198,199,200,201,202,203,204, 205,206,207,208,209,210,211,212,213,214,215,216, 217,218,219,220,221,222,223,224,225,226,227,228, 229,230,231,232,233,234,235,236,237,238,239,240; td= 1,2,3,4,5,6,7,8,9,10; tx= 1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30, 31,32,33,34,35,36,37,38,39,40; ty= 1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20; tz= 1,2,3,4,5,6,7,8,9,10, 11,12,13,14,15,16,17,18,19,20, 21,22,23,24,25,26,27,28,29,30; txyz= 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108, 109,110,111,112,113,114,115,116,117,118,119,120, 121,122,123,124,125,126,127,128,129,130,131,132, 133,134,135,136,137,138,139,140,141,142,143,144, 145,146,147,148,149,150,151,152,153,154,155,156, 157,158,159,160,161,162,163,164,165,166,167,168, 169,170,171,172,173,174,175,176,177,178,179,180, 181,182,183,184,185,186,187,188,189,190,191,192, 193,194,195,196,197,198,199,200,201,202,203,204, 205,206,207,208,209,210,211,212,213,214,215,216, 217,218,219,220,221,222,223,224,225,226,227,228, 229,230,231,232,233,234,235,236,237,238,239,240; // three_double_dmn= 1, 2, 3, 4, 5, 6, 7, 8, // 9,10,11,12,13,14,15,16, // 17,18,19,20,21,22,23,24, // -99,-99,-99,-99,-99,-99,-99,-99, // 33,34,35,36,37,38,39,40, // 41,42,43,44,45,46,47,48, // 49,50,51,52,53,54,55,56, // -99,58,59,60,61,62,63,64, // 65,66,67,68,69,70,71,72, // -99,74,75,76,77,78,79,-99, // 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, // 9.5,10.5,11.5,12.5,13.5,14.5,15.5,16.5, // 17.5,18.5,19.5,20.5,21.5,22.5,23.5,24.5, // -99.5,-99.5,-99.5,-99.5,-99.5,-99.5,-99.5,-99.5, // 33.5,34.5,35.5,36.5,37.5,38.5,39.5,40.5, // 41.5,42.5,43.5,44.5,45.5,46.5,47.5,48.5, // 49.5,50.5,51.5,52.5,53.5,54.5,55.5,56.5, // -99.5,58.5,59.5,60.5,61.5,62.5,63.5,64.5, // 65.5,66.5,67.5,68.5,69.5,70.5,71.5,72.5, // -99.5,74.5,75.5,76.5,77.5,78.5,79.5,-99.5; time_udunits = 876012, 876018, 876024; wnd_spd= -999,0.5,1.5,0.5,1.5,0.5,1.5,0.5, 0.5,-999,0.5,0.5,0.5,0.5,0.5,0.5, 0.5,1.5,-999,1.5,0.5,1.5,0.5,1.5, 0.5,0.5,0.5,-999,0.5,0.5,0.5,0.5, 1.5,1.5,1.5,1.5,-999,1.5,1.5,1.5, 0.5,0.5,0.5,0.5,0.5,-999,0.5,0.5, 2.5,2.5,2.5,2.5,2.5,2.5,-999,2.5, 0.5,0.5,0.5,0.5,0.5,0.5,0.5,-999, 0.5,0.5,0.5,0.5,0.5,0.5,0.5,0.5, 0.5,0.5,2.5,0.5,0.5,2.5,0.5,0.5; } nco-4.5.4/data/in_rec_zero.cdl000066400000000000000000000015271264355130400162060ustar00rootroot00000000000000// ncgen -b -o ~/nco/data/in_rec_zero.nc ~/nco/data/in_rec_zero.cdl netcdf in_rec_zero { dimensions: lon = 4 ; time = UNLIMITED ; // (10 currently) variables: float lon(lon) ; lon:long_name = "Latitude" ; lon:units = "degrees_north" ; float one ; one:long_name = "one" ; double time(time) ; time:long_name = "record variable of size zero (no data yet)"; // global attributes: :Conventions = "NCAR-CSM" ; :history = "Thu May 4 17:30:29 2006: ncks -v one,lon,time /home/zender/nco/data/in.nc /home/zender/foo.nc\n", "History global attribute.\n", "" ; :julian_day = 200000.04 ; :RCS_Header = "$Header$" ; data: lon = 0, 90, 180, 270 ; one = 1 ; } nco-4.5.4/data/lrg_bm.in000066400000000000000000000023361264355130400150150ustar00rootroot00000000000000// Script for creating Large nc file for // testing OpenMp threading. // one is 1 always in in.nc if(one == 1){ print("First Run\n"); defdim("west_east",120); defdim("south_north",100); defdim("bottom_top",10); // Create synthetic variables // short R[time,south_north,west_east,bottom_top]=time.short(); R( :,:,:,::2)=48s; R( ::4,8:89:2,:,::3)=33s; // int S[time,south_north,west_east]=100; S(:,0:30:8,:)=-100; S(0:9,::2,::3)=23; // int T[time,south_north,west_east]=10; T(:,0:30:8,:)=5; T(0:9,::2,::3)=1; T.set_miss(1); //float U[time,south_north,west_east]=time.float(); U(:,:,::3)=10.1f; U( ::10,:,::20)=20.2f; //float V[time,south_north,west_east]=time.float()/9.99f; V( :,:,::4)=4.4f; V( ::10,:,::8)=8.1f; // double W[time,south_north,west_east,bottom_top]=time/100.0; W( :,:,:,::2)=0.23d; W( ::4,8:89,:,0:8:3)=0.44d; W.set_miss(0.44d); //double X[time,south_north,west_east,bottom_top]=time/100.0; X( :,:,:,::2)=37.5d; X( ::4,8:89:2,:,::3)=3.3124d; } if(one==0) { print("Second run\n"); R++; where(S >22) S=-22; S+=100; T*=100; T(0:4,0:4,:)=999; where(U>20) U=888f; U(:,:20,::4)=8.2f; V/=0.99; V( ::10,:,::4)=1.1f; W*=0.99; W( :,:,:30,::4)=0.001; X-=2.001; X( ::4,8:89:10,:,::3)=2.71828; } one=0;nco-4.5.4/data/mdl_1.cdl000066400000000000000000000040221264355130400146750ustar00rootroot00000000000000// -*-C++-*- // Generate netCDF file with: // ncgen -k netCDF-4 -b -o ~/nco/data/mdl_1.nc ~/nco/data/mdl_1.cdl netcdf mdl_1 { :Conventions = "CF-1.5"; group: cesm { group: cesm_01 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "CESM"; :Realization = "1"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); float gw(time); //test CF fixed variables (using time as dimension, usually dimension is lat) data: tas1=272.1,272.1,272.1,272.1; tas2=272.1,272.1,272.1,272.1; time=1.,2.,3.,4.; gw=1.,1.,1.,1.; } // cesm_01 group: cesm_02 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "CESM"; :Realization = "2"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); float gw(time); data: tas1=272.2,272.2,272.2,272.2; tas2=272.2,272.2,272.2,272.2; time=1.,2.,3.,4.; gw=2.,2.,2.,2.; } // cesm_02 } // cesm group: ecmwf { group: ecmwf_01 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "ECMWF"; :Realization = "1"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); data: tas1=273.1,273.1,273.1,273.1; tas2=273.1,273.1,273.1,273.1; time=1.,2.,3.,4.; } // ecmwf_01 group: ecmwf_02 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "ECMWF"; :Realization = "2"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); data: tas1=273.2,273.2,273.2,273.2; tas2=273.2,273.2,273.2,273.2; time=1.,2.,3.,4.; } // ecmwf_02 } // ecmwf } // root group nco-4.5.4/data/mdl_2.cdl000066400000000000000000000026441264355130400147060ustar00rootroot00000000000000// -*-C++-*- // Generate netCDF file with: // ncgen -k netCDF-4 -b -o ~/nco/data/mdl_2.nc ~/nco/data/mdl_2.cdl netcdf mdl_2 { group: cesm { group: cesm_03 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "CESM"; :Realization = "1"; dimensions: time=4; variables: float tas1(time); float tas2(time); double time(time); data: tas1=272.3,272.3,272.3,272.3; tas2=272.3,272.3,272.3,272.3; time=1.,2.,3.,4.; } // cesm_03 } // cesm group: ecmwf { group: ecmwf_03 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "ECMWF"; :Realization = "1"; dimensions: time=4; variables: float tas1(time); float tas2(time); double time(time); data: tas1=273.3,273.3,273.3,273.3; tas2=273.3,273.3,273.3,273.3; time=1.,2.,3.,4.; } // ecmwf_03 group: ecmwf_04 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "ECMWF"; :Realization = "2"; dimensions: time=4; variables: float tas1(time); float tas2(time); double time(time); data: tas1=273.4,273.4,273.4,273.4; tas2=273.4,273.4,273.4,273.4; time=1.,2.,3.,4.; } // ecmwf_04 } // ecmwf } // root group nco-4.5.4/data/mdl_3.cdl000066400000000000000000000026651264355130400147120ustar00rootroot00000000000000// -*-C++-*- // Generate netCDF file with: // ncgen -k netCDF-4 -b -o ~/nco/data/mdl_3.nc ~/nco/data/mdl_3.cdl netcdf mdl_3 { group: cesm { group: cesm_01 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "CESM"; :Realization = "1"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); data: tas1=272.1,272.1,272.1,272.1; tas2=272.1,272.1,272.1,272.1; time=1.,2.,3.,4.; } // cesm_01 group: cesm_02 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "CESM"; :Realization = "2"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); data: tas1=272.2,272.2,272.2,272.2; tas2=272.2,272.2,272.2,272.2; time=1.,2.,3.,4.; } // cesm_02 } // cesm group: ecmwf { group: ecmwf_01 { :Conventions = "CF-1.5"; :history = "yada yada yada"; :Scenario = "Historical"; :Model = "ECMWF"; :Realization = "1"; dimensions: time=unlimited; variables: float tas1(time); float tas2(time); double time(time); data: tas1=273.1,273.1,273.1,273.1; tas2=273.1,273.1,273.1,273.1; time=1.,2.,3.,4.; } // ecmwf_01 } // ecmwf } // root group nco-4.5.4/data/mrd.cdl000066400000000000000000000012661264355130400144720ustar00rootroot00000000000000// -*-C++-*- // Purpose: Test Multiple Record Dimensions // Generate netCDF file with: // ncgen -k netCDF-4 -b -o ~/nco/data/mrd.nc ~/nco/data/mrd.cdl // Reproduce bug 20140815: ncrcat (not ncks) fails on variables with multiple record dimensions reported by rmla 20140619 // ncrcat -O -d parameter,0,0 -d time,1,1 -d run,0,1 -d step,0,1 -d number,0,1 -d ngr,0,1 ${DATA}/hdf/71355.ecmf.1.nc ~/mrd.nc // ncrcat -O -h -d time,0 ~/nco/data/mrd.nc ~/foo.nc // ncdump ~/foo.nc netcdf mrd { dimensions: time = UNLIMITED ; // (2 currently) step = UNLIMITED ; // (2 currently) variables: int var_mrd(time, step) ; int time(time) ; data: var_mrd = {1, 2}, {3, 4} ; time = 1, 2 ; } nco-4.5.4/data/ncap.in000066400000000000000000000173521264355130400145000ustar00rootroot00000000000000// $Header$ -*-C-*- // Purpose: ncap netCDF Arithmetic Processor Demonstration/Test Script /* Format of valid ncap script: Syntax is C-like, and C++ comments also valid Mathematical expressions use forward algebraic notation Statements in scripts are terminated with semi-colons Command-line definitions should omit semi-colons, e.g., -s "foo=bar" Whitespace (blank lines, tabs) is ignored Nested files allowed with #include file syntax */ //#include ncap.in2 /* Usage: ncap -O -D 1 -v -S ${HOME}/nco/data/ncap.in ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -d lat,0 -d lon,0 -d lev,0 -s "a9=three_dmn_var" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -v -s "upk=pck*pck@scale_factor+pck@add_offset" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -v -s "upk=pck" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -v -s "pck=pack(three_dmn_var)" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -s "prs_mdp[time,lat,lon,lev]=P0*hyam+hybm*PS" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncks -H -m ${HOME}/nco/data/foo.nc | m */ /* ncap is a handy attribute editor: Define new attribute: ncap -O -v -s "one@new=2*att_var@double_att;one@test=two@long_name;" in.nc foo.nc Re-define existing attribute in terms of itself: ncap -O -v -s "att_var@double_att=att_var@double_att^2.0" in.nc foo.nc Computation is performed at highest precision of RHS expression: ncap -O -v -s "one@new=att_var@short_att * att_var@double_att - att_var@double_att" in.nc foo.nc Use math functions (default result is of type double): ncap -O -v -s "one@new=cos(1.0e-4) - 1" in.nc foo.nc Result is now of type float: ncap -O -v -s "one@new=cos(1.0e-4f)^2+sin(1.0e-4f)^2" in.nc foo.nc Assign string to attribute (use \" to escape quote from shell): ncap -O -v -s "one@new=\"hello world\"" in.nc foo.nc Add strings, and use C escape characters: ncap -O -v -s "one@new=\"Hello\t\"+\"World\n\"" in.nc foo.nc Set an attribute equal to a 0-dimensional variable: ncap -O -v -s "one@new=one" in.c foo.nc Set an attribute equal to a 1-dimensional variable: ncap -O -v -s "one@new=mss_val" in.nc foo.nc /* The ncap operators works with netCDF variables and attributes Multiply an existing co-ordinate variable by 20: ncap -O -v -s "lat=20*lat" in.nc foo.nc Average variables of mixed types (result is of type double): ncap -O -v -s "average=(three_dmn_rec_var+three_dmn_var_dbl+three_dmn_var_int)/3" in.nc foo.nc Take log (to base e) of absolute value of variable: ncap -O -v -s "abslog=log(abs(three_dmn_var_dbl))" in.nc foo.nc The available maths functions are: acos(), asin(), atan(), cos(), exp(), erf(), erfc(), gamma(), log(), log10(), sin(), sqrt(), tan(); If argument precision is "less" than type float then result is type float If argument is type double then result is also double This also applies to pow() function, e.g, pow(var1,3.5) or var1^3.5, e.g., ncap -O -v -s "modulus=pow(sin(three_dmn_rec_var),2)+cos(three_dmn_rec_var)^2 - 1" in.nc foo.nc */ /* Modulus operator % can also be used with attributes and variables Attributes are converted to variable's type prior to operation Result of modulus is of type float: ncap -O -v -s "mod=three_dmn_rec_var % 4.0" in.nc foo.nc Result of modulus is of type int: ncap -O -v -s "testa=three_dmn_var_int % 1.0f" in.nc foo.nc Unary +/- signs work intuitively with attributes and variables: ncap -O -v -s "sign=-three_dmn_rec_var" in.nc foo.nc */ /* Packing and unpacking: Manual unpacking is relatively straightforward but works only with -D 3 because automatic unpacking is now default on ncap. It is now broken because ncap_var_write() tries to write bogus attributes automatically because pck_ram is set in pck_dsk_inq() ncap -D 3 -O -v -s "upk=pck*pck@scale_factor+pck@add_offset" -s "upk_arr=pck_arr*pck_arr@scale_factor+pck_arr@add_offset" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc Automatic unpacking works for scalars, not for arrays ncap -D 1 -O -v -s "upk=pck" -s "upk_arr=pck_arr" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc Automatic packing does not yet work ncap -D 1 -O -v -s "pck=pack(ORO)" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -D 1 -O -v -s "pck=pack(upk)" -s "pck_arr=pack(upk_arr)" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -D 1 -O -v -s "pck=pack(pck)" -s "pck_arr=pack(pck_arr)" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -D 1 -O -v -s "upk=unpack(pack(unpack(pack(pck))))" -s "upk_arr=unpack(pack(unpack(pack(pck_arr))))" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncks -H -m ${HOME}/nco/data/foo.nc | m ncks -H -v pck,pck_arr -m ${HOME}/nco/data/foo.nc | m ncks -H -v upk,upk_arr -m ${HOME}/nco/data/foo.nc | m */ // Charlie's Tests: // p=hyam*PO+hybm*PS a2=(1*(three_dmn_var-three_dmn_var+1)-1)^1; a3[lat,lon,lev]=one; a4[lat,lon,lev]=1.0f-one; a5=time; a6=time+one_dmn_rec_var; prs_mdp[time,lat,lon,lev]=P0*hyam+hybm*PS; // Works because prs_mdp in LHS cast //prs_mdp=P0*hyam+hybm*PS; // Fails because prs_mdp dimension ordering is ambiguous //prs_mdp=(four_dmn_rec_var-four_dmn_rec_var+1)*P0*hyam+(four_dmn_rec_var-four_dmn_rec_var+1)*hybm*PS; // Works because prs_mdp is typecast on RHS a7=erf(1.0); a8=erfc(1.0); a9[time,lat,lev]=3.141d; // Henry's tests: one@one=10+30; one@two=sin(3.141/2); one@three=cos(3.1415926)+one@one+one@two; // Redefine attributes one@one=23/4; one@two=one@one+one@two; one@eight=25.0%4.99; one@nine=1.e10; one@ten=val_half_half@_FillValue%1000; /* Standard netCDF postfix operators are used to typecast attributes/numbers floats and doubles must include decimal point or exponent to be recognized */ one@byte=10b; one@short=10s; one@float=100.e2f; one@double=2e3; /* Type conversion follows C rules: expression is converted to highest type Following expression is of type float: */ one@add=one@byte+one@short/one@float; // Can create 0 dimensional variables (scalars) nine=10000e2f; one=10; two=4; val_half_half@_FillValue=21; // Can use modulus operator with attributes and variables twenty=four_dmn_rec_var % 8; twentyone=sin(twenty)^2+cos(twenty)^2; twentytwo=10*9; twentythree=1.0e9%2; twentyfour=two_dmn_var@units; twentyfive=three_dmn_var_dbl/4; twentysix=pck; /* Below multiplication is of individual elements in variables AND NOT a matrix multiplication. Resulting matrix is of type double. */ twentyseven=three_dmn_var_int * three_dmn_var_dbl; // Function atostr() evaluates an attribute and stores the result as a string twenty@one=atostr(1.e10); twenty@two=atostr(1/7.0); // Function atostr() accepts an optional C-format twenty@three=atostr(1/7.0,"\t%15f\n"); // Add two strings together twenty@four="Hello"+"\t World\n"; // Put a 0 or 1 dimensional variable into an attribute twenty@five=fl_nm; twenty@six=mss_val; twenty@seven=one; //Put an attribute/number into a variable thirty=1.e19f; thirtyone=one@one; // With a string ONLY the first char is put into varible thirtytwo="Hello world"; // use varibles defined in output thirtythree=twentyfive*4.001; // Use UNARY -/+ and brackets three=(-two_dmn_var+5)^3; testa=pow(sin(four_dmn_rec_var),2)+cos(four_dmn_rec_var)^2; /* Conversion functions are available for variables AND attributes Standard C type conversion rules are used Converting "down" produces interesting results! byte(),char(),short(), int(), float(), and double() */ // Convert float to byte ex_byte=byte(two_dmn_var); // Convert int to short ex_short=short(three_dmn_var_int/5); // Convert short to float ex_float=float(three_dmn_var_sht); // Convert float to double ex_double=double(weight); // Convert attribute to double bnd_var@att_double=double(bnd_var@float_att); // Convert double attribute to int bnd_var@att_int=double(4*bnd_var@float_att); nco-4.5.4/data/ncap.in2000066400000000000000000000002451264355130400145530ustar00rootroot00000000000000// $Header$ -*-C-*- // Purpose: ncap script #include'd by ncap.in to demonstrate file nesting a1 = one; a1@a1 = global@history; a1@julian_day = global@julian_day; nco-4.5.4/data/ncap2.in000066400000000000000000000143161264355130400145570ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: Sample input script for ncap2 /* Usage: ncap2 -O -v -S ~/nco/data/ncap2.in ~/nco/data/in.nc ~/foo.nc ncks ~/foo.nc | /bin/more */ a1=three_dmn_var_dbl+three_dmn_var_int; a2=sin(three_dmn_var_dbl)^2.0 + cos(three_dmn_var_dbl)^2.0; if(a2 > 0.99) a3=1.00; a4[$time,$lat,$lon]=time*2; a1@one=four; a5=a1@one; // check if thens if( 0 ) a6=0; else {{ a7=1; a8=2; }} if(1) {a9=1; a10=2;} if( 0.0 ) a6=0; else if(0) {a11=1; a12=2;} else if( 3>2) a13=3; // check dangling else if(1) if(0) a14=1; else a15=1; a20[$time]=666; a21[$time,$lat]=a1@one; //Check casting a22[time,lat,lon,lev]=P0*hyam+hybm*PS; // Works because prs_mdp in LHS cast b2=999; b2@one=2222.0d; b2@zero=three_dmn_var_dbl@_FillValue; b2@two=sin(3.14); b2@three=cos(3.14); b2@four=!sin(3.14); b3=b2@zero; // Check bare numbers are being parsed OK c1@byte=10b; c1@short=20s; c1@int=30; c1@int2=23L; c1@int3=24l; c1@float=40f; c1@double=50d; c1@double2=25.; c1@exp=21e2; c1@exp2=21.1e10f; c1@exp3=2e-2d; c1@exp4=2.e3; c1@zero=0.0; c1@zero1=.0; c1@zero2=0.0e2; c1=four*c1@byte; d1=three_dmn_var_int*c1@double; // put var "into" an attributte d1@one=three_dmn_var_dbl; // Multiply two attributes one sz=1 d1@two=d1@one*c1@int; // multiply attribute and var of the same size ! e1=d1@one*three_dmn_var_int; // check global attributtes // Read global e1@test=global@history; // write global global@test=999; global@test2=global@Conventions; // Mask examples --grab only values <= 20 from three_dmn_var_dbl mask_out= (three_dmn_var_dbl <= 20) *three_dmn_var_dbl; // check var/att casting; e1@test=three_dmn_var_int; e1@test2=e1@test*c1@int; e1@three=10d; // plain numbers are created as vars -- // mixed expression -resultant type=double e1@four=1.001d*e1@three; // resultant expression resultant type=int e1@five=e1@three*199; e1@six=e1@three*e1@three; // below op not done -- att must conform to var //e1@seven=e1@test*100; // below op valid att size= var size e1@eight=e1@test*three_dmn_var_dbl; //e2[time]=0.99; e2=11111.0; //Check hyperslabbing //Create some vars th=three_dmn_var_dbl; f1[$time,$lat]=666; f2[$time,$lat,$lon]=time*2; f3[$lon]=time(3); time1=time; // hyperslab with RHS a scalar f2(9,:,:)=.99; f2(7,,)=.77; f2(5,::,0)=.55; f2(1,:,::2)=1111; f4=th(0,0,0)+th(9,1,3); time1(0:4)=.4444; time1(5:9)=.5555; // Create attributes and derive attributes from variables f2@one=time(::3); f2@two=1000.0; f2@three=f2@one*f2@two; // hyperlslab on the LHS & RHS // Empty brackets indicate the entire variable // is to be hyperslabbed. f3()=time1(0:6:2); th(9,,)=th(2,,); // Check attribute propagation // LHS-variable inherits attributes from left-most RHS-variable g1=999.00; g1@a=10; g1@b=20.0; g1@c=30.0; // Above attributes are copied to g2 g2=g1; // g3 will get attributes for rz // 20110318: NB triggers regression failure TODO nco111 g3=rz*four; // Check attribute propagation with mod and pow g4= (g1@c * g1@a) % 2.0 ^ three_dmn_var_dbl; // Check att propagation with a LHS hyperslab g4(2,0,0)=987654.0; // Check attribute inheritance // z in output should inherit atts from z in input // z=1000; // Attribute string handling h1=10.0; h1@units="microns"; h1@long_name="Tesla\t"; // variable string handling // Create a variable string (currently painful) h2[char_dmn_lng04]="a"; // string is now "aaa" h2()="hell"; // string is now "hell" // hyperslab a variable string; h3=two_dmn_rec_var_sng; h3(1,0:2)="ccc"; h4=fl_nm; h4(6:11)="henrys"; // If hyperslabbing a var in the input // then the var is first copied to output e.g weight(0)=weight(0)+10; // Increment and decrement operators // Deceptively complex expression // time is read from the input file // its elements are incremented by one and then the result is // written to the output file and subsequently then assigned to i2 // i2 is then written to file i2=++time; // time in the output is now decremented by one // and ALL elements of of i2 & i3 are equal i3=time--; if(i2==i3) i2@equal=1; else i2@equal=0; // can string together operators i4=i5=i6=0; // below the result is i4=10, i5=10,i6=0 i4+=i5+=i6+10; // below the result is i4=80 i5=8 i6=2 i4*=i5-=i6=2; // can use assign in an if then i7=0,0,0,0,0,0,0,0,0,0 if( 0==(i7=i3-i2) ) i7@equals=1; else i7@equals=0; // all elements of i7 now 10 i7()=10; // all elements of i7 now 11 i7+=1; // ternary operator -similar to the one in C // in below attribute is assigned the string "true" i7@test = ( i7 >9 ? "true" : "false"); i8=0; // Side effects j1=0; // Unlike C there is no short circuiting with AND/OR // so in the below statement the result is that // j1=1 and j1@bool is undeclared if(0 && j1++) j1@bool="true"; // similarly after below j1=0 j1@bool is still undeclared if( 1 || --j1 ) j1@bool="true"; j2=10; j3=1; // There are no side effects with the ternary operator, e.g., // the result is that j2=10, j3=2, j4=2. j4= (i7<9 ? ++j2 : ++j3); // Defining Dimensions // use the defdim function. Dimensions in the input file CANNOT // be redefined in the output. Dimensions are imutable and // once defined in cannot be redefined // (NB: defdim should return a bool value indicating success or failure) defdim("x",1); defdim("y",4); defdim("z",9); // LHS Cast a new variable with new dimensions k1[$x,$y,$z]=1.01d; // Dimension size can be used in an expression by postfixing it with "size" e.g., if($x.size==1 && $y.size < 5 && $z.size==9) k1@max=9; // k1@size=$x.size*$y.size*$z.size; // hyperlsab with dim values k1(0,0,0:($z.size-3))=2.01d; // k2=4.0; k3=k2+=10; // // quoting of vars/atts/dims ie names which contain '.' or '-' defdim("a--list.A",10); defdim("a..---",20); 'b..m1'['$a--list.A']=100.1; 'b..m1'(0)=90.1; 'b..m1@c--lost'=23; var_double=1.0; var_float=1.0f; var_int=1; var_short=1s; var_byte=1b; var_char[char_dmn_lng04]="Hell"; /* Following lines _require_ netCDF4: Uncommenting them in ncap2.in is not recommended since we cannot assume that ncap2 was built with netCDF4 */ /* var_ubyte=1ub; var_ushort=1us; var_uint=1u; var_int64=1ll; var_uint64=1ull; */ // function reverse m1=three_dmn_var_sht; // reverse the data -- can specify positional args as well m2=m1.reverse($0,$2); m3=m1.reverse($lon); // permute dims --nb for permute MUST specify all dims // record dim must be the first dim in list m4=m1.permute($0,$2,$1); m5=a22.permute($time,$lev,$lon,$lat); nco-4.5.4/data/ncap2_tst.nco000066400000000000000000000333761264355130400156310ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: Test script for ncap2 /* Usage: ncap2 -O -v -S ~/nco/data/ncap2_tst.nco ~/nco/data/in.nc ~/foo.nc ncks ~/foo.nc | /bin/more */ // Check methods first // Count number of errors nbr_err=0; nbr_err_ttl=0; { a1=three_dmn_var_dbl.avg(); a2=three_dmn_var_dbl.avgsqr(); a3=three_dmn_var_dbl.max(); a4=three_dmn_var_dbl.min(); a5=three_dmn_var_dbl.rmssdn(); a6=three_dmn_var_dbl.total(); // Join operands together b1=three_dmn_var_dbl.avg($0).total(); b2=three_dmn_var_dbl.avgsqr($1).rmssdn(); b3=three_dmn_var_dbl.max($2).min(); b4=three_dmn_var_dbl.min($0).max(); b5=three_dmn_var_dbl.rmssdn($1).avgsqr(); b6=three_dmn_var_dbl.total($2).avg(); // Check that total handles missing values correctly // two missing values b10[time]={1,2,3,4,5,6,7,8,9,1}; b10.set_miss(1L); // all missing values b11[time]=1s; b11.set_miss(1s); // various missing values b12=three_dmn_var_dbl; // set all values to 2.0 b12=2.0; b12.set_miss(1.0); // sprinkle a few missing values about b12(:,:,0:1)=1.0; if(fabs(a1-40.609d) > 0.01){ print("ERROR: a1:method test\n"); nbr_err++; } if(fabs(a1-40.609d) >0.01){ print("ERROR: a1:method test\n"); nbr_err++; } if(fabs(a2-2208.145d) > 0.01){ print("ERROR: a2:method test\n"); nbr_err++; } if(a3 != 79L){ print("ERROR: a3:method test\n"); nbr_err++; } if(a4 != 1L){ print("ERROR: a4:method test\n"); nbr_err++; } if(fabs(a5-47.336d) >0.01){ print("ERROR: a5:method test\n"); nbr_err++; } if(a6 !=2802L){ print("ERROR: a6:method test\n"); nbr_err++; } if(fabs(b1-322.714d)>0.01){ print("ERROR: b1:method test\n"); nbr_err++; } if(fabs(b2-3095.591d)>0.01){ print("ERROR: b2:method test\n"); nbr_err++; } if(b3 !=4L){ print("ERROR: b3:method test\n"); nbr_err++; } if(b4 !=8L){ print("ERROR: b4:method test\n"); nbr_err++; } if(fabs(b5-4149.576d)>0.01){ print("ERROR: b5:method test\n"); nbr_err++; } if(fabs(b6-155.667d)>0.01){ print("ERROR: b6:method test\n"); nbr_err++; } if(b10.total() !=44L){ print("ERROR: b10:method test\n"); nbr_err++; } if(b11.total() !=1s){ print("ERROR: b11:method test\n"); nbr_err++; } if(fabs(b12.total() -80.0d) >0.01){ print("ERROR: b12:method test\n"); nbr_err++; } print("RESULTS block a,b: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // End Method test // Scott's wind speed test { bin_nbr=3; defdim("bin",bin_nbr); // [nbr] Bin dimension wnd_min[bin]={0,1,2}; // [m s-1] Minimum speed wnd_max[bin]={1,2,3}; // [m s-1] Maximum speed results[lat,lon,bin]={ 7, 1, 1, 6, 2, 1, 5, 2, 2, 6, 2, 1, 7, 1, 1, 5, 2, 2, 7, 2, 0, 6, 2, 1 }; // Regular Vars bin_cnt[lat,lon,bin]=0s; // [nbr] Wind speeds in bin bin_flg[time,lat,lon]=0s; // [flg] Wind speed within current bin set_miss(bin_cnt,wnd_spd@_FillValue); for(bin_idx=0;bin_idx= wnd_min(bin_idx) && wnd_spd < wnd_max(bin_idx)); bin_cnt(:,:,bin_idx)=bin_flg.total($time); // [nbr] Wind speeds in bin } if((bin_cnt-results).total() !=0){ print("ERROR: c1:Scotts test - regular vars\n"); nbr_err++; } // Repeat exercise with RAM vars *bin_ram_cnt[lat,lon,bin]=0s; *bin_ram_flg[time,lat,lon]=0s; set_miss(bin_ram_cnt,wnd_spd@_FillValue); for(bin_idx=0;bin_idx= wnd_min(bin_idx) && wnd_spd < wnd_max(bin_idx)); bin_ram_cnt(:,:,bin_idx)=bin_ram_flg.total($time); } if((bin_ram_cnt-results).total() !=0){ print("ERROR: c2:Scotts test - ram vars\n"); nbr_err++; } ram_delete(bin_ram_cnt); ram_delete(bin_ram_flg); print("RESULTS block c: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // End Scott's Test // More RAM var Testing { *d1[$time,$lat,$lon]=three_dmn_var_dbl; // Value list on RHS d1(0,0,:)={10d,20d,30d,40d}; // Attribute on RHS d1@n1={2d,4d,8d,16d}; d1(0,1,:)=d1@n1; // Scalar on RHS d1(:,:,3)=88.0; // RAM Var on RHS *d2[$lon]={1d,4d,9d,16d}; d1(2,0,:)=d2; ram_write(d1); if(fabs(d1.total()-3800d)>0.01){ print("ERROR: d1:ram test\n"); nbr_err++; } //Repeat exersise with ints; *d3[$time,$lat,$lon]=three_dmn_var_int; // Value list on RHS d3(0,0,:)={9,11,13,15}; // Attribute on RHS d3@n1={2,4,8,16}; d3(0,1,:)=d1@n1; // Scalar on RHS d3(:,:,3)=100L; // RAM Var on RHS *d4[$lon]={1,3,27,81}; d3(2,0,:)=d4; // Regular var On RHS d5[$lon]={1,2,3,4}; d3(8,1,:)=d5; if(d3.total() !=3716L){ print("ERROR: d3:ram test\n"); nbr_err++; } print("RESULTS block d: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; ram_delete(d3); ram_delete(d4); } // Test LHS casting - Regular var { // Var on RHS e1[$time]=time; // Value list on RHS e2[$lon]={1,2s,3L,4f}; // Attribute on RHS e3@tst={5,25,50,100}; e3[$lon]=e3@tst; // Bare number on RHS e4[$lon]=99d; // Real-life casting e5[time,lat,lon,lev]=P0*hyam+hybm*PS; if(fabs(e1.avg()-5.5d) > 0.01){ print("ERROR: e1: LHS cast test\n"); nbr_err++; } if(fabs(e2.avgsqr()-7.5f) > 0.01){ print("ERROR: e2: LHS cast test\n"); nbr_err++; } if(e3.rmssdn() != 66L){ print("ERROR: e3: LHS cast test\n"); nbr_err++; } if(fabs(e4.total()-396d)>0.01){ print("ERROR: e4: LHS cast test\n"); nbr_err++; } if(fabs(e5.min()-9929.21f) > 0.001f || fabs(e5.avg()-53743.6f) > 0.01f){ print("ERROR: e5: LHS cast test\n"); nbr_err++; } print("RESULTS block e: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check var/att/dim quoting { 'u---u'=10L; 'v...v'=20L; 'w...w'='u---u'*'v...v'; 'u---u@kill'=10L; 'v...v@o.one'=30L; f1='v...v@o.one' *100; f2='u---u'+40; defdim("t..t",5); f3['$lon','$lat','$t..t']=1.1d; f4='$t..t'.size; if(f1 !=3000L){ print("ERROR: f1: ID quoting\n"); nbr_err++; } if(f2 != 50L){ print("ERROR: f2: ID quoting\n"); nbr_err++; } if(fabs(f3.total()-44.0) > 0.01){ print("ERROR: f3: ID quoting\n"); nbr_err++; } if(f4 != 5L){ print("ERROR: f4: ID quoting\n"); nbr_err++; } print("RESULTS block f: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } //end ID quoting // Check Loops { *idx=0L; *jdx=0L; *g1=0; *g2=0.0; while(idx++ <20){ jdx=0; while(jdx++<10){ if(jdx>5) continue; g1+=jdx; } if(idx==12) break; } if(g1 !=180L){ print("ERROR: g1: LHS loop test\n"); nbr_err++; } for(idx=0 ; idx<10 ; idx++){ for(jdx=10.0 ; jdx<15.0; jdx++) g2+=(idx+jdx); } if(fabs(g2-825d)>0.01){ print("ERROR: g2: LHS loop test\n"); nbr_err++; } ram_write(g2); ram_delete(idx); ram_delete(jdx); ram_delete(g1); print("RESULTS block g: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check missing value functions and masking { h1=txyz; // Change all values less than 20 or greater than 80 to 2; *hmask= h1<20 || h1>80; h1=hmask*2 +!hmask*h1; change_miss(h1,2f); h2=h1.total($time,$2).max(); h3=h1.avgsqr($x,$3).min(); // check get_miss method h4=fll_val.get_miss(); if(fabs(h2-315f)>0.01){ print("ERROR: h2: masking test\n"); nbr_err++; } if(fabs(h3-420.5f)>0.01){ print("ERROR: h3: masking test\n"); nbr_err++; } if(fabs(h4-(-999.0f))>0.01){ print("ERROR: h4: get_miss() test\n"); nbr_err++; } ram_delete(hmask); print("RESULTS block h: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check hyperslab normalization // NB: This is where a limit in a hyperslab collapses to a single index // or the slab specified is equal to all the indices in the dimension // e.g., three_dmn_var_dbl(1,:,:), three_dmn_var_dbl(0:9,:,1), three_dmn_var_dbl(:,0,:) { i1=three_dmn_var_int(0,:,:)+three_dmn_var_int(1,:,:).reverse($lat,$lon); i2=three_dmn_var_int(0,0,0)+three_dmn_var_int(1,1,3); // NB: RHS is cast correctly i3[$time,$lat,$lon]=three_dmn_var_int(1,:,:); i4=i3.avg($time); //nb i4 has dims $lat,$lon // Check that missing value is preserved in a hyperslab i5=three_dmn_var_sht(:,:,:); // Check size of an un-normalizable hyperslab i5@size=three_dmn_var_sht(0,:,0:1).size(); // Check min and max i6=three_dmn_var_sht(:,1,3); if(fabs(i1.avg()-17L)>0.001){ print("ERROR: i1: hyperslab normalization test \n"); nbr_err++; } if(i2 != 17L){ print("ERROR: i2: hyperslab normalization test \n"); nbr_err++; } if(i4.min()!=9 || i4.max()!=16){ print("ERROR: i3: hyperslab normalization test \n"); nbr_err++; } if(i5.total()-three_dmn_var_sht.total() !=0){ print("ERROR: i5: hyperslab normalization test \n"); nbr_err++; } if(i5@size-4 !=0){ print("ERROR: i5a: hyperslab size test \n"); nbr_err++; } if(i6.min()!=8 || i6.max()!=72){ print("ERROR: i6: hyperslab min/max test \n"); nbr_err++; } print("RESULTS block i: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check "where" structure { // start simple j1=time; where(time > 6) j1=10; elsewhere j1=5; j1_ttl=j1.total(); if(fabs(j1_ttl-70.0)>0.01){ print("ERROR: j1: simple where test\n"); nbr_err++; } j2=three_dmn_var_int; j3[$time,lat,lon]=1; j4=three_dmn_var_dbl; where(three_dmn_var_dbl >40){ j2=j3; j4=10.0; } elsewhere{ j3=-1.0; j4=j3; } j2_ttl=j3.total(); j4_ttl=j4.total(); // nb j2 type integer if(j2_ttl+6L !=0){ print("ERROR: j2: where test with blocks\n"); nbr_err++; } if(fabs(j4_ttl-338d)>0.01){ print("ERROR: j4: where test with blocks\n"); nbr_err++; } print("RESULTS block j: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check if /else construct { k1=0; k2=0; k3=0; k4=0; k5=0; k6=time.int(); k7=0; if(one==0) {k1=10; } else{k1=5;} if(k1!=5){ print("ERROR: k1: if/else test with blocks\n"); nbr_err++; } if(0){k2=1;} else if(1) k2=10; if(k2!=10){ print("ERROR: k2: if/else test with blocks\n"); nbr_err++; } if(one==0) k3=1; else if(one==0) k3=2; else k3=3; if(k3!=3){ print("ERROR: k3: if/else test with blocks\n"); nbr_err++; } if(one==0) {k4=1; } else{if(one==0) k4=2; else k4=3; } if(k4!=3){ print("ERROR: k4: if/else test with blocks\n"); nbr_err++; } // dangling else if(four==0) k5=1; else if(one==0) k5=2; else k5=3; if(k5!=3){ print("ERROR: k5: if/else test with blocks\n"); nbr_err++; } if(four==4) where(time>5) k6=10; elsewhere k6=1; if(k6.total()!=55){ print("ERROR: k6: if/else test with blocks\n"); nbr_err++; } if(one==1) {k7=7;} else{k7=-7;} if(k7!=7){ print("ERROR: k7: if/else test with blocks\n"); nbr_err++; } print("RESULTS block k: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check irregular hyperslabs on RHS { m1=three_dmn_var_int(:,0,0:1).max(); //74 m2=three_dmn_var_int(:,0,0:1).min(); //1 m3=three_dmn_var_int(0:1,0,0:1).total(); //22 m4=three_dmn_var_dbl; m4(:,0,0:1)=4*three_dmn_var_int(:,0,0:1); // hyperslab with an attribute on RHS m5=three_dmn_var_dbl; m5@tst1=three_dmn_var_int(:,0,0:1); m5(:,0,0:1)=m5@tst1; // hyperslab with a RAM var on RHS m6=three_dmn_var_dbl; *m6a=three_dmn_var_int; m6(:,0,0:1)=4*m6a(:,0,0:1); // hyperslab a RAM var *m7=three_dmn_var_int; m8=m7(0:1,0,0:1).total(); //22 ram_delete(m7); ram_delete(m6a); if(m1 != 74L){ print("ERROR: m1: Irregular hyperslab test \n"); nbr_err++; } if(m2 != 1L){ print("ERROR: m2: Irregular hyperslab test \n"); nbr_err++; } if(m3 != 22L){ print("ERROR: m3: Irregular hyperslab test \n"); nbr_err++; } if(fabs(m4.total() -4141.0d)>0.01d){ print("ERROR: m4: Irregular hyperslab test \n"); nbr_err++; } if(fabs(m5.total() -2710.0d)>0.01d){ print("ERROR: m5: Irregular hyperslab test \n"); nbr_err++; } if(fabs(m6.total() -4141.0d)>0.01d){ print("ERROR: m6: Irregular hyperslab test \n"); nbr_err++; } if(m8 != 22L){ print("ERROR: m8: Irregular hyperslab test RAM var\n"); nbr_err++; } print("RESULTS block m: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Check sorting functions // At present only two sort functions: sort(var_exp,&sort_map), dsort(var_exp,sort_map) { // Check basic sort n1[lat,lon]={200L,100,3,8,-10,-5,0,-9L}; n1_st=n1.sort(); // Create map from first row of elements sort(n1(0,:),&n1_map); n2[lat,lon]={-1.0,0.0,2.0,3.0,10.0,20.0,30.0,40.0}; n2=remap(n2,n1_map); // Create map larger variable n3=remap(three_dmn_var_dbl,n1_map); if(n1.min() != n1_st(0,0) || n1.max()!=n1_st(7)){ print("ERROR: n1: Basic sort test\n"); nbr_err++; } *n_tmp[lon]={3,2,0,1L}; if(n1_map != n_tmp){ print("ERROR: n2: Create mapping sort test\n"); nbr_err++; } ram_delete(n_tmp); if(n2(0,0)!=2.0 || n2(1,3)!=10.0){ print("ERROR: n3: Apply mapping sort test\n"); nbr_err++; } if(n3(9,1,0)!=79.0 || n3(9,1,3)!=77.0){ print("ERROR: n4: Apply mapping sort test\n"); nbr_err++; } print("RESULTS block n: Num errors="); print(nbr_err,"%d"); nbr_err_ttl+=nbr_err; nbr_err=0; } // Results summany print("RESULTS SUMMARY: total errors=");print(nbr_err_ttl,"%d"); nco-4.5.4/data/nccf000077500000000000000000000205311264355130400140570ustar00rootroot00000000000000#!/bin/sh # Purpose: CF-check netCDF3/netCDF4/HDF4/HDF5 files # Dismember them first if necessary or requested # Dismembering places each input file group in separate netCDF3 output file # Described in NCO User Guide at http://nco.sf.net/nco.html#nccf # Originally incarnated as ncdismember in NCO 4.3.6, September 2013 # Re-incarnated with getopt as nccf in NCO 4.5.1, July 2015 # Requirements: NCO 4.3.x+, UNIX shell utilities awk, grep, sed # Optional: Decker CFchecker https://bitbucket.org/mde_/cfchecker # Usage: # nccf -c cf_chk -f fl_in -i drc_in -o drc_out -n nco_opt -v cf_vrs # where fl_in is input file/URL to check/dismember, drc_in/out are # input and output directories, respectively # CF-compliance check is performed by default, unless -c 'no' is given # Default checker is Decker's cfchecker installed locally # Specify cf_chk=nerc for smallified uploads to NERC checker # Option cf_vrs is CF version to check # Option nco_opt passes straight-through to ncks # Arguments must not use shell expansion/globbing # NB: nccf does not clean-up output directory, so user must # chmod a+x ~/sh/nccf # Examples: # nccf ~/nco/data/mdl_1.nc /data/zender/tmp # nccf http://dust.ess.uci.edu/nco/mdl_1.nc /tmp # nccf http://thredds-test.ucar.edu/thredds/dodsC/testdods/foo.nc /tmp # nccf ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf # nccf ~/nco/data/mdl_1.nc /data/zender/nco/tmp nerc # nccf ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf 1.3 # nccf ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf 1.5 --fix_rec_dmn=all # Set script name spt_nm=`basename ${0}` # [sng] Script name # Set fonts for legibility fnt_nrm=`tput sgr0` # Normal fnt_bld=`tput bold` # Bold fnt_rvr=`tput smso` # Reverse # Command-line argument defaults fl_in="${HOME}/nco/data/mdl_1.nc" # [sng] Input file to dismember/check drc_in='' # [sng] Input directory drc_out="${DATA}/nco/tmp" # [sng] Output directory #cf_chk='dck' # [sng] Checker cf_chk='nerc' # [sng] Checker cf_flg='Yes' # [flg] CF-check files? cf_vrs='1.5' # [sng] Compliance-check this CF version (e.g., '1.5') opt='' # [flg] Additional ncks options (e.g., '--fix_rec_dmn=all') # Use single quotes to pass multiple arguments to opt=${5} # Otherwise arguments would be seen as ${5}, ${6}, ${7} ... function fnc_usg_prn { # Print usage printf "\nQuick documentation for ${fnt_bld}${spt_nm}${fnt_nrm} (read script for more thorough explanation)\n\n" printf "${fnt_rvr}Basic usage:${fnt_nrm} ${fnt_bld}$spt_nm -c cf_chk -f fl_in -o drc_out${fnt_nrm}\n\n" echo "Command-line options:" echo "${fnt_rvr}-c${fnt_nrm} ${fnt_bld}cf_chk${fnt_nrm} CF checker to use (empty means none) (default ${fnt_bld}${cf_chk}${fnt_nrm})" echo "${fnt_rvr}-d${fnt_nrm} ${fnt_bld}dbg_lvl${fnt_nrm} Debugging level (default ${fnt_bld}${dbg_lvl}${fnt_nrm})" echo "${fnt_rvr}-f${fnt_nrm} ${fnt_bld}fl_in${fnt_nrm} Input file (default ${fnt_bld}${fl_in}${fnt_nrm})" echo "${fnt_rvr}-i${fnt_nrm} ${fnt_bld}drc_in${fnt_nrm} Input directory ${fnt_bld}drc_in${fnt_nrm} (default ${fnt_bld}${drc_in}${fnt_nrm})" echo "${fnt_rvr}-n${fnt_nrm} ${fnt_bld}nco_opt${fnt_nrm} NCO options (empty means none) (default ${fnt_bld}${nco_opt}${fnt_nrm})" echo "${fnt_rvr}-o${fnt_nrm} ${fnt_bld}drc_out${fnt_nrm} Output directory (default ${fnt_bld}${drc_out}${fnt_nrm})" echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}cf_vrs${fnt_nrm} Version of CF to use (default ${fnt_bld}${cf_vrs}${fnt_nrm})" printf "\n" printf "Examples: ${fnt_bld}$spt_nm -c ${caseid} -s ${yyyy_srt} -e ${yyyy_end} -i ${drc_in} -o ${drc_out} ${fnt_nrm}\n" printf "\n\n" exit 1 } # end fnc_usg_prn() # Check argument number and complain accordingly arg_nbr=$# #echo -e \\n"dbg: Number of arguments: ${arg_nbr}" if [ ${arg_nbr} -eq 0 ]; then fnc_usg_prn fi # !arg_nbr # Parse command-line options: cmd_ln="${@}" while getopts :c:d:f:hi:n:o::v: OPT; do case ${OPT} in c) cf_chk=${OPTARG} ;; # Checker to use d) dbg_lvl=${OPTARG} ;; # Debugging level f) fl_in=${OPTARG} ;; # Input file i) drc_in=${OPTARG} ;; # Input directory n) nco_opt=${OPTARG} ;; # NCO options o) drc_out=${OPTARG} ;; # Output directory v) cf_vrs=${OPTARG} ;; # CF Version h) fnc_usg_prn ;; # Help \?) # Unrecognized option echo -e \\n"Option -${fnt_bld}$OPTARG${fnt_nrm} not allowed." fnc_usg_prn ;; esac done shift $((OPTIND-1)) # Advance one argument # Derived variables chk_dck='n' chk_nrc='n' if [ ${cf_chk} = 'nerc' ]; then chk_nrc='y' fi # chk_nrc if [ ${cf_chk} != '0' ] && [ ${cf_chk} != 'nerc' ]; then chk_dck='y' hash cfchecker 2>/dev/null || { echo >&2 "Local cfchecker command not found, will smallify and upload to NERC checker instead"; chk_nrc='y'; chk_dck='n'; } fi # !cf_chk # Print initial state if [ ${dbg_lvl} -ge 1 ]; then printf "dbg: chk_dck = ${chk_dck}\n" printf "dbg: chk_nerc = ${chk_nerc}\n" printf "dbg: cf_chk = ${cf_chk}\n" printf "dbg: cf_flg = ${cf_flg}\n" printf "dbg: cf_vrs = ${cf_vrs}\n" printf "dbg: dbg_lvl = ${dbg_lvl}\n" printf "dbg: drc_in = ${drc_in}\n" printf "dbg: drc_out = ${drc_out}\n" printf "dbg: mdl_nm = ${mdl_nm}\n" printf "dbg: nco_opt = ${nco_opt}\n" fi # !dbg # Human-readable summary echo "Checking and/or dismembering file ${fl_in}" if [ ${dbg_lvl} -ge 1 ]; then printf "${spt_nm} invoked with command:\n" echo "${spt_nm} ${cmd_ln}" fi # !dbg date_srt=$(date +"%s") printf "Started at `date`.\n" # Prepare and move-to output directory fl_stb=$(basename ${fl_in}) drc_out=${drc_out}/${fl_stb} mkdir -p ${drc_out} cd ${drc_out} # Obtain group list grp_lst=`ncks --cdl -m ${fl_in} | grep '// group' | awk '{$1=$2=$3="";sub(/^ */,"",$0);print}'` IFS=$'\n' # Change Internal-Field-Separator from to for grp_in in ${grp_lst} ; do # Replace slashes by dots for output group filenames grp_out=`echo ${grp_in} | sed 's/\///' | sed 's/\//./g'` if [ "${grp_out}" = '' ]; then grp_out='root' ; fi # Tell older NCO/netCDF if HDF4 with --hdf4 switch (signified by .hdf/.HDF suffix) hdf4=`echo ${fl_in} | awk '{if(match(tolower($1),".hdf$")) hdf4="--hdf4"; print hdf4}'` # Flatten to netCDF3, anchor, no history, no temporary file, padding, HDF4 flag, options cmd="ncks -O -3 -G : -g ${grp_in}/ -h --no_tmp_fl --hdr_pad=40 ${hdf4} ${opt} ${fl_in} ${drc_out}/${grp_out}.nc" # Use eval in case ${opt} contains multiple arguments separated by whitespace eval ${cmd} if [ ${chk_dck} = 'y' ]; then # Decker checker needs Conventions <= 1.6 no_bck_sls=`echo ${drc_out}/${grp_out} | sed 's/\\\ / /g'` ncatted -h -a Conventions,global,o,c,CF-${cf_vrs} ${no_bck_sls}.nc else # !chk_dck echo ${drc_out}/${grp_out}.nc fi # !chk_dck done if [ ${chk_dck} = 'y' ]; then echo 'Decker CFchecker reports CF-compliance of each group in flat netCDF3 format' cfchecker -c ${cf_vrs} *.nc fi if [ ${chk_nrc} = 'y' ]; then # Smallification and NERC upload from qdcf script by Phil Rasch (PJR) echo 'Using remote CFchecker http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl' cf_lcn='http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl' for fl in ${drc_out}/*.nc ; do fl_sml=${fl} cf_out=${fl%.nc}.html dmns=`ncdump -h ${fl_in} | sed -n -e '/dimensions/,/variables/p' | grep = | sed -e 's/=.*//'` hyp_sml='' for dmn in ${dmns}; do dmn_lc=`echo ${dmn} | tr "[:upper:]" "[:lower:]"` if [ ${dmn_lc} = 'lat' ] || [ ${dmn_lc} = 'latitude' ] || [ ${dmn_lc} = 'lon' ] || [ ${dmn_lc} = 'longitude' ] || [ ${dmn_lc} = 'time' ]; then hyp_sml=`echo ${hyp_sml}" -d ${dmn},0"` fi # !dmn_lc done # Create small version of input file by sampling only first element of lat, lon, time ncks -O ${hyp_sml} ${fl} ${fl_sml} # Send small file to NERC checker curl --form cfversion=1.6 --form upload=@${fl_sml} --form press="Check%20file" ${cf_lcn} -o ${cf_out} # Strip most HTML to improve readability cat ${cf_out} | sed -e "s/<[^>]*>//g" -e "/DOCTYPE/,/\]\]/d" -e "s/CF-Convention//g" -e "s/Output of//g" -e "s/Compliance Checker//g" -e "s/Check another//g" -e "s/CF-Checker follows//g" -e "s/Received//g" -e "s/for NetCDF//g" -e "s/NetCDF format//g" -e "s/against CF version 1//g" -e "s/\.\.\.//g" echo "Full NERC compliance-check log for ${fl} in ${cf_out}" done fi # !nerc date_end=$(date +"%s") printf "Completed climatology generation for model-run ${caseid} at `date`.\n" date_dff=$((date_end-date_srt)) echo "Elapsed time $((date_dff/60))m$((date_dff % 60))s" exit 0 nco-4.5.4/data/ncl.ncl000066400000000000000000000011421264355130400144670ustar00rootroot00000000000000; $Header$ ; Purpose: NCL script to compare to NCO scripts for speed ; time ncl < /home/zender/nco/data/ncl.ncl ; load "/home/zender/nco/data/ncl.ncl" begin ; begin ncl() ; Examine stride-slowdown on netCDF4 datasets ; time ncks -O -d time,0,0,12 ~/ET_2000-01_2001-12.nc ~/foo.nc # borken after 6m13s, numerous HDF errors ; NCL produces same HDF errors as NCO when striding fl_nm="/home/zender/ET_2000-01_2001-12.nc" fl_in=addfile(fl_nm,"r") ET_1km=fl_in->ET_1km(0::12,:,:) ;ET_1km=fl_in->ET_1km(0:0,:,:) fl_nm_out="/home/zender/foo.nc" fl_out=addfile(fl_nm_out,"w") fl_out->ET_1km=ET_1km end ; end ncl() nco-4.5.4/data/nco_bnch.sh000077500000000000000000000037211264355130400153320ustar00rootroot00000000000000#!/bin/sh # $Header$ # Purpose: Benchmark NCO performance # Usage: # Create file with dimension sizes ncgen -b -o ~/nco/data/big.nc ~/nco/data/big.cdl # Create file with decadal differences in dimension sizes ncap -D 3 -O \ -s "wvl_1e0[wvl_1e0]=1.0f" \ -s "wvl_1e1[wvl_1e1]=1.0f" \ -s "wvl_1e2[wvl_1e2]=1.0f" \ -s "wvl_1e3[wvl_1e3]=1.0f" \ -s "wvl_1e4[wvl_1e4]=1.0f" \ -s "wvl_1e5[wvl_1e5]=1.0f" \ -s "wvl_1e6[wvl_1e6]=1.0f" \ -s "wvl_1e7[wvl_1e7]=1.0f" \ -s "wvl_1e8[wvl_1e8]=1.0f" \ ~/nco/data/big.nc ${DATA}/tmp/big.nc # Verify big file dimensionality ls -l ${DATA}/tmp/big.nc ncks -M -m ${DATA}/tmp/big.nc # Benchmarks for ncwa # ncwa_b1: # Average 1-D arrays of multiple sizes timex ncwa -O -a wvl_1e8 -v wvl_1e8 ${DATA}/tmp/big.nc ${DATA}/tmp/foo.nc;ncks -H ${DATA}/tmp/foo.nc date;ncwa -O ${DATA}/tmp/big.nc ${DATA}/tmp/foo.nc;date;ncks -H ${DATA}/tmp/foo.nc date;ncwa -O -a wvl_1e8 -v wvl_1e8 ${DATA}/tmp/big.nc ${DATA}/tmp/foo.nc;date;ncks -H ${DATA}/tmp/foo.nc # Results: # elnino gcc 3.3.4 with restrict keyword 20040719: 11m31s # elnino gcc 3.3.4 without restrict keyword 20040719: 10m20s # esmf04m xlc 6.x with restrict keyword 20040719: 25s # esmf04m xlc 6.x without restrict keyword 20040719: 25s # 2^32=4294967296 # 2^31=2147483648 # 10^9=1000000000 # 10^8= 100000000 # Benchmarks for ncra # Create file with multiple long record arrays ncap -D 3 -O \ -s "one[wvl_1e7]=1.0f" \ -s "two[wvl_1e7]=2.0f" \ -s "three[wvl_1e7]=3.0f" \ -s "four[wvl_1e7]=4.0f" \ ~/nco/data/big.nc ${DATA}/tmp/big.nc # ncra_b1: # Running average with one thread date;ncra -O -t 1 -p ${DATA}/tmp big.nc ${DATA}/tmp/foo.nc;date # Running average with multiple threads date;ncra -O -t 4 -p ${DATA}/tmp big.nc ${DATA}/tmp/foo.nc;date # ncea_b1: # Running average with one thread date;ncea -O -t 1 -p ${DATA}/tmp big.nc big.nc big.nc big.nc ${DATA}/tmp/foo.nc;date # Running average with multiple threads date;ncea -O -t 4 -p ${DATA}/tmp big.nc big.nc big.nc big.nc ${DATA}/tmp/foo.nc;date nco-4.5.4/data/nco_gsl.cdl000066400000000000000000000014501264355130400153270ustar00rootroot00000000000000// ncgen -b -o ~/nco/data/nco_gsl.nc ~/nco/data/nco_gsl.cdl netcdf nco_gsl { //purpose: test nco_gsl_fit_linear() //usage: ncap2 -O -S ~/nco/data/nco_gsl.nco ~/nco/data/nco_gsl.nc out.nc //case 1; vx,vy double arrays with no fill value and dim=N //case 2; fx,fy double arrays one fill value in fy and dim=N //case 3; vxr,vyr double arrays with no fill value and dim=N-1, index a fill value case 2 removed //case 2 and case 3 must return the same values for: &c0,&c1,&cov00,&cov01,&cov11,&sumsq dimensions: dim=4; dimr=3; variables: double vx(dim); double vy(dim); double fx(dim); double fy(dim); fy:_FillValue = -99.0; double vxr(dimr); double vyr(dimr); data: vx=2.0,3.0,2.0,3.0; vy=4.0,6.0,6.0,8.0; fx=2.0,3.0,2.0,3.0; fy=4.0,-99.0,6.0,8.0; vxr=2.0,2.0,3.0; vyr=4.0,6.0,8.0; } nco-4.5.4/data/nco_gsl.nco000066400000000000000000000016641264355130400153530ustar00rootroot00000000000000//usage: ncap2 -O -S ~/nco/data/nco_gsl.nco ~/nco/data/nco_gsl.nc out.nc //case 1; vx,vy double arrays with no fill value and dim=N //case 2; fx,fy double arrays one fill value in fy and dim=N //case 3; vxr,vyr double arrays with no fill value and dim=N-1, index a fill value case 2 removed //case 2 and case 3 must return the same values for: &c0,&c1,&cov00,&cov01,&cov11,&sumsq nco_gsl_fit_linear(vx,1,vy,1,$dim.size,&c0,&c1,&cov00,&cov01,&cov11,&sumsq); print("Values for vx,vy:\n"); print(c0); print(c1); print(cov00); print(cov01); print(cov11); print(sumsq); nco_gsl_fit_linear(fx,1,fy,1,$dim.size,&c0,&c1,&cov00,&cov01,&cov11,&sumsq); print("Values for fx,fy:\n"); print(c0); print(c1); print(cov00); print(cov01); print(cov11); print(sumsq); nco_gsl_fit_linear(vxr,1,vyr,1,$dimr.size,&c0,&c1,&cov00,&cov01,&cov11,&sumsq); print("Values for vxr,vyr:\n"); print(c0); print(c1); print(cov00); print(cov01); print(cov11); print(sumsq); nco-4.5.4/data/ncremap000077500000000000000000001055601264355130400146010ustar00rootroot00000000000000#!/bin/bash # Purpose: Regrid (subsets of) variables from netCDF files # Regrids all input files (possibly on different grids) to a single specified output grid # Copyright (C) 2015-2016 Charlie Zender # This file is part of NCO, the netCDF Operators. NCO is free software. # You may redistribute and/or modify NCO under the terms of the # GNU General Public License (GPL) Version 3. # As a special exception to the terms of the GPL, you are permitted # to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits # libraries and to distribute the resulting executables under the terms # of the GPL, but in addition obeying the extra stipulations of the # HDF, netCDF, OPeNDAP, and UDUnits licenses. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the GNU General Public License for more details. # The original author of this software, Charlie Zender, seeks to improve # it with your suggestions, contributions, bug-reports, and patches. # Please contact the NCO project at http://nco.sf.net or write to # Charlie Zender # Department of Earth System Science # University of California, Irvine # Irvine, CA 92697-3100 # Source: https://github.com/nco/nco/tree/master/data/ncremap # Prerequisites: Bash, NCO, ESMF_RegridWeightGen # Script could use other shells, e.g., dash (Debian default) after re-writing function definition and looping constructs # Script could use other weight-generators, e.g., TempestRemap by re-writing map-file command # Script runs in one of four modes: # 1. Free-will: Infer source and destination grids to generate map-file, then regrid # 2. Old Grid: Use known-good destination grid to generate map-file then regrid # 3. New Grid: Generate source-grid from ncks parameter string # 4. Pre-Destination: Apply supplied map-file to all input files # By default, ncremap deletes any intermediate grids and map-file that it generates # Use Free-Will, Old-Grid, or New-Grid mode to process Swath-Like-Data (SLD) where each input may be a granule on a new grid, yet all inputs are to be regridded to the same output grid # Use Pre-Destination mode to post-process models or analyses where all files are converted from the same source grid to the same destination grid so the map-file can be pre-generated and never change # Additional Documentation: # Configure paths at High-Performance Computer Centers (HPCCs) based on ${HOSTNAME} if [ -z "${HOSTNAME}" ]; then if [ -f /bin/hostname ] && [ -x /bin/hostname ] ; then export HOSTNAME=`/bin/hostname` elif [ -f /usr/bin/hostname ] && [ -x /usr/bin/hostname ] ; then export HOSTNAME=`/usr/bin/hostname` fi # !hostname fi # HOSTNAME # Default input and output directory is ${DATA} if [ -z "${DATA}" ]; then case "${HOSTNAME}" in cooley* | cc* ) DATA="/projects/HiRes_EarthSys/${USER}" ; ;; # ALCF cooley compute nodes named ccNNN edison* | hopper* | nid* ) DATA="${SCRATCH}" ; ;; # NERSC edison compute nodes named nidNNNNN pileus* ) DATA="/lustre/atlas/proj-shared/cli115/${USER}" ; ;; # OLCF CADES rhea* ) DATA="/lustre/atlas/proj-shared/cli115/${USER}" ; ;; # OLCF rhea compute nodes named rheaNNN * ) DATA='/tmp' ; ;; # Other esac # !HOSTNAME fi # DATA # Test cases (examples for Charlie's machines): # ls ${DATA}/sld/raw/*.nc | ncremap -a conserve -D 0 -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr # ncremap -a conserve -v FSNT -I ${DATA}/ne30/raw -s ${DATA}/grids/ne30np4_pentagons.091226.nc -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr # ls ${DATA}/essgcm14/essgcm14*cam*0007*.nc | ncremap -a conserve -M -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr # ncremap -a conserve -v FSNT -I ${DATA}/ -s ${DATA}/grids/ne30np4_pentagons.091226.nc -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr # ncremap -i AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.hole.nc -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr # ncremap -v TSurfAir -i ${DATA}/hdf/AIRS.2015.01.15.001.L2.RetStd.v6.0.11.0.G15015142014.hdf -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -v CloudFrc_A -i ${DATA}/hdf/AIRS.2002.08.01.L3.RetStd_H031.v4.0.21.0.G06104133732.hdf -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/hdf/MOD04_L2.A2000055.0005.006.2014307165927.hdf -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/hdf/OMI-Aura_L2-OMIAuraSO2_2012m1222-o44888_v01-00-2014m0107t114720.h5 -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -v T -i ${DATA}/hdf/wrfout_v2_Lambert_notime.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -v StepTwoO3 -i ${DATA}/hdf/OMI-Aura_L2-OMTO3_2015m0731t0034-o58727_v003-2015m0731t080836.he5.nc -d ${DATA}/hdf/cam_time.nc -O ~/rgr # ncremap -v TSurfStd -i ${DATA}/sld/raw/AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.hole.nc -G "--rgr grd_ttl='Default internally-generated grid' --rgr grid=~/rgr/ncremap_tmp_grd_dst.nc --rgr latlon=100,100 --rgr snwe=30.0,70.0,-130.0,-90.0" -O ~/rgr # ncremap -x TSurfStd_ct -i ${DATA}/sld/raw/AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.hole.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/hdf/cice_hi_flt.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/hdf/cam_time.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # CESM & ACME: # ncremap -i ${DATA}/ne120/raw/b1850c5_m2a.cam.h0.0060-01.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/ne120/raw/b1850c5_m2a.clm2.h0.0060-01.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/ne120/raw/b1850c5_m2a.cice.h.0060-01.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/ne120/raw/b1850c5_m2a.pop.h.0060-01.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ncremap -i ${DATA}/ne120/raw/b1850c5_m2a.rtm.h0.0060-01.nc -g ${DATA}/grids/180x360_SCRIP.20150901.nc -O ~/rgr # ACME benchmarks: # ncremap -v FSNT,AODVIS -i ${DATA}/ne30/raw/famipc5_ne30_v0.3_00003.cam.h0.1979-01.nc -m map_ne30np4_to_fv129x256_aave.150418.nc -O ~/rgr # ncremap -v FSNT,AODVIS -i ${DATA}/ne30/raw/famipc5_ne30_v0.3_00003.cam.h0.1979-01.nc -m map_ne30np4_to_fv129x256_aave.20150901.nc -O ~/rgr # ncremap -v FSNT,AODVIS -w esmf -i ${DATA}/ne30/raw/famipc5_ne30_v0.3_00003.cam.h0.1979-01.nc -s ${DATA}/grids/ne30np4_pentagons.091226.nc -g ${DATA}/grids/129x256_SCRIP.20150901.nc -O ~/rgr # ncremap -v FSNT,AODVIS -w tempest -i ${DATA}/ne30/raw/famipc5_ne30_v0.3_00003.cam.h0.1979-01.nc -s ${DATA}/grids/ne30np4_pentagons.091226.nc -g ${DATA}/grids/129x256_SCRIP.20150901.nc -O ~/rgr # Debugging and Benchmarking: # ncremap -D 1 -i ${DATA}/sld/raw/AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.hole.nc -d ${DATA}/dstmch90/dstmch90_clm.nc -O ~/rgr > ~/ncremap.out 2>&1 & # dbg_lvl: 0 = Quiet, print basic status during evaluation # 1 = Print configuration, full commands, and status to output during evaluation # 2 = As in dbg_lvl=1, but _do not evaluate commands_ # 3 = As in dbg_lvl=1, and pass debug level through to NCO/ncks # thr_nbr: Thread number to use in NCO regridder, '-t 1' for one thread, '-t 2' for two threads... # Set script name and run directory drc_pwd=${PWD} spt_nm=$(basename ${0}) # [sng] Script name nco_version=$(ncks --version 2>&1 >/dev/null | grep NCO | awk '{print $5}') # Set fonts for legibility fnt_nrm=`tput sgr0` # Normal fnt_bld=`tput bold` # Bold fnt_rvr=`tput smso` # Reverse # Defaults for command-line options and some derived variables # Modify these defaults to save typing later alg_typ='conserve' # [nbr] Algorithm for ESMF interpolation (bilinear|patch|neareststod|nearestdtos|conserve) dbg_lvl=0 # [nbr] Debugging level #drc_in="${drc_pwd}" # [sng] Input file directory drc_in='' # [sng] Input file directory drc_in_xmp='~/drc_in' # [sng] Input file directory for examples drc_out="${drc_pwd}" # [sng] Output file directory drc_out_xmp="~/rgr" # [sng] Output file directory for examples dst_fl='' # [sng] Destination file dst_xmp='dst.nc' # [sng] Destination file for examples #esmf_opt='--src_regional --dst_regional --ignore_unmapped' # [sng] ESMF_RegridWeightGen options esmf_opt='--ignore_unmapped' # [sng] ESMF_RegridWeightGen options #fml_nm='' # [sng] Family name (e.g., 'amip', 'control', 'experiment') fl_nbr=0 # [nbr] Number of files to remap gaa_sng="--gaa rgr_script=${spt_nm} --gaa rgr_hostname=${HOSTNAME} --gaa rgr_version=${nco_version}" # [sng] Global attributes to add grd_dst='' # [sng] Destination grid-file grd_dst_glb="${DATA}/grids/180x360_SCRIP.20150901.nc" # [sng] Grid-file (destination) global grd_dst_xmp='grd_dst.nc' # [sng] Destination grid-file for examples grd_sng='' # [sng] Grid string grd_src='' # [sng] Source grid-file grd_src_xmp='grd_src.nc' # [sng] Source grid-file for examples hdr_pad='1000' # [B] Pad at end of header section in_fl='' # [sng] Input file #in_fl='AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.hole.nc' # [sng] Input file in_xmp='in.nc' # [sng] Input file for examples map_fl='' # [sng] Map-file map_xmp='map.nc' # [sng] Map-file for examples mlt_map_flg='Yes' # [sng] Multi-map flag mpi_flg='No' # [sng] Parallelize over nodes msh_fl='' # [sng] Mesh-file (for Tempest) nco_opt='-O --no_tmp_fl' # [sng] NCO defaults (e.g., '-O -6 -t 1') nco_usr='' # [sng] NCO user-configurable options (e.g., '-D 1') out_fl='' # [sng] Output file out_xmp='out.nc' # [sng] Output file for examples par_typ='' # [sng] Parallelism type rgr_opt='--rgr lat_nm_out=lat --rgr lon_nm_out=lon' # [sng] Regridding options (e.g., '--rgr col_nm=lndgrid') tps_opt='' # [sng] TempestRemap options thr_nbr=2 # [nbr] Thread number for regridder #var_lst='FSNT,AODVIS' # [sng] Variables to process (empty means all) tmp_out_fl='ncremap_grd_tmp.nc' # [sng] Temporary output file var_lst='' # [sng] Variables to process (empty means all) var_xmp='FSNT' # [sng] Variable list for examples wgt_gnr='esmf' # [sng] Weight-generator program xtn_var='' # [sng] Extensive variables (e.g., 'TSurfStd_ct') function fnc_usg_prn { # NB: dash supports fnc_nm (){} syntax, not function fnc_nm{} syntax # Print usage printf "\nQuick documentation for ${fnt_bld}${spt_nm}${fnt_nrm} (more at http://nco.sf.net/nco.html#ncremap)\n\n" printf "${fnt_rvr}Basic usage:${fnt_nrm} ${fnt_bld}$spt_nm -i in_fl -d dst_fl -o out_fl${fnt_nrm}\n\n" echo "Command-line options:" echo "${fnt_rvr}-a${fnt_nrm} ${fnt_bld}alg_typ${fnt_nrm} Algorithm for ESMF weight generation (default ${fnt_bld}${alg_typ}${fnt_nrm})" echo "${fnt_rvr}-d${fnt_nrm} ${fnt_bld}dst_fl${fnt_nrm} Data file to infer destination grid from (empty means none, i.e., use grd_fl, grd_sng or map_fl)) (default ${fnt_bld}${dst_fl}${fnt_nrm})" echo "${fnt_rvr}-D${fnt_nrm} ${fnt_bld}dbg_lvl${fnt_nrm} Debugging level (default ${fnt_bld}${dbg_lvl}${fnt_nrm})" echo "${fnt_rvr}-E${fnt_nrm} ${fnt_bld}esmf_opt${fnt_nrm} ESMF ESMF_RegridWeightGen options (default ${fnt_bld}${esmf_opt}${fnt_nrm})" # echo "${fnt_rvr}-f${fnt_nrm} ${fnt_bld}fml_nm${fnt_nrm} Family name (empty means none) (default ${fnt_bld}${fml_nm}${fnt_nrm})" echo "${fnt_rvr}-g${fnt_nrm} ${fnt_bld}grd_dst${fnt_nrm} Grid-file (destination) (empty means none, i.e., infer from dst_fl or use grd_sng or map_fl) (default ${fnt_bld}${grd_dst}${fnt_nrm})" echo "${fnt_rvr}-G${fnt_nrm} ${fnt_bld}grd_sng${fnt_nrm} Grid generation argument string (empty means none) (default ${fnt_bld}${grd_sng}${fnt_nrm})" echo "${fnt_rvr}-I${fnt_nrm} ${fnt_bld}drc_in${fnt_nrm} Input directory (empty means none) (default ${fnt_bld}${drc_in}${fnt_nrm})" echo "${fnt_rvr}-i${fnt_nrm} ${fnt_bld}in_fl${fnt_nrm} Input file (empty means use stdin or drc_in) (default ${fnt_bld}${in_fl}${fnt_nrm})" echo "${fnt_rvr}-M${fnt_nrm} Multi-map-file toggle (unset means generate one map-file per input file)" echo "${fnt_rvr}-m${fnt_nrm} ${fnt_bld}map_fl${fnt_nrm} Map-file (empty means generate internally) (default ${fnt_bld}${map_fl}${fnt_nrm})" echo "${fnt_rvr}-n${fnt_nrm} ${fnt_bld}nco_opt${fnt_nrm} NCO options (empty means none) (default ${fnt_bld}${nco_opt}${fnt_nrm})" echo "${fnt_rvr}-O${fnt_nrm} ${fnt_bld}drc_out${fnt_nrm} Output directory (default ${fnt_bld}${drc_out}${fnt_nrm})" echo "${fnt_rvr}-o${fnt_nrm} ${fnt_bld}out_fl${fnt_nrm} Output-file (regridded file) (empty copies Input filename) (default ${fnt_bld}${out_fl}${fnt_nrm})" echo "${fnt_rvr}-p${fnt_nrm} ${fnt_bld}par_typ${fnt_nrm} Parallelism type (default ${fnt_bld}${par_typ}${fnt_nrm})" echo "${fnt_rvr}-R${fnt_nrm} ${fnt_bld}rgr_opt${fnt_nrm} Regridding options (empty means none) (default ${fnt_bld}${rgr_opt}${fnt_nrm})" echo "${fnt_rvr}-s${fnt_nrm} ${fnt_bld}grd_src${fnt_nrm} Grid-file (source) (empty means infer or use map_fl) (default ${fnt_bld}${grd_src}${fnt_nrm})" echo "${fnt_rvr}-t${fnt_nrm} ${fnt_bld}thr_nbr${fnt_nrm} Thread number for regridder (default ${fnt_bld}${thr_nbr}${fnt_nrm})" echo "${fnt_rvr}-T${fnt_nrm} ${fnt_bld}tps_opt${fnt_nrm} TempestRemap GenerateOfflineMap options (default ${fnt_bld}${tps_opt}${fnt_nrm})" echo "${fnt_rvr}-v${fnt_nrm} ${fnt_bld}var_lst${fnt_nrm} Variable list (empty means all) (default ${fnt_bld}${var_lst}${fnt_nrm})" echo "${fnt_rvr}-w${fnt_nrm} ${fnt_bld}wgt_gnr${fnt_nrm} Weight-generator (default ${fnt_bld}${wgt_gnr}${fnt_nrm})" echo "${fnt_rvr}-x${fnt_nrm} ${fnt_bld}xtn_var${fnt_nrm} Extensive variables (empty means none) (default ${fnt_bld}${xtn_var}${fnt_nrm})" printf "\n" printf "Examples: ${fnt_bld}$spt_nm -i ${in_xmp} -m ${map_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -i ${in_xmp} -d ${dst_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -i ${in_xmp} -g ${grd_dst_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -a bilinear -i ${in_xmp} -d ${dst_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -a conserve -i ${in_xmp} -d ${dst_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -w tempest -i ${in_xmp} -d ${dst_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -v ${var_xmp} -i ${in_xmp} -m ${map_xmp} -o ${out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -I ${drc_in_xmp} -m ${map_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -M -I ${drc_in_xmp} -d ${dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -M -I ${drc_in_xmp} -g ${grd_dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -I ${drc_in_xmp} -s ${grd_src_xmp} -d ${dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -I ${drc_in_xmp} -s ${grd_src_xmp} -g ${grd_dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -I ${drc_in_xmp} -d ${dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}$spt_nm -I ${drc_in_xmp} -g ${grd_dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}ls mdl*2005*nc | $spt_nm -m ${map_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" printf " ${fnt_bld}ls mdl*2005*nc | $spt_nm -d ${dst_xmp} -O ${drc_out_xmp} ${fnt_nrm}\n" exit 1 } # end fnc_usg_prn() function dst_is_grd { # Is destination grid specified as SCRIP grid-file? # Usage: dst_is_grd ${fl} fl=${1} flg='Yes' #flg='No' } # end dst_is_grd() # Check argument number and complain accordingly arg_nbr=$# #printf "\ndbg: Number of arguments: ${arg_nbr}" if [ ${arg_nbr} -eq 0 ]; then fnc_usg_prn fi # !arg_nbr # Parse command-line options: # http://stackoverflow.com/questions/402377/using-getopts-in-bash-shell-script-to-get-long-and-short-command-line-options # http://tuxtweaks.com/2014/05/bash-getopts cmd_ln="${@}" while getopts :a:D:d:E:f:g:G:h:I:i:Mm:n:O:o:p:R:s:T:t:v:w:x: OPT; do case ${OPT} in a) alg_typ=${OPTARG} ;; # Algorithm D) dbg_lvl=${OPTARG} ;; # Debugging level d) dst_fl=${OPTARG} ;; # Destination file E) esmf_opt=${OPTARG} ;; # ESMF options # f) fml_nm=${OPTARG} ;; # Family name g) grd_dst=${OPTARG} ;; # Destination grid-file G) grd_sng=${OPTARG} ;; # Grid generation string I) drc_in=${OPTARG} ;; # Input directory i) in_fl=${OPTARG} ;; # Input file M) mlt_map_flg='No' ;; # Multi-map flag m) map_fl=${OPTARG} ;; # Map-file n) nco_usr=${OPTARG} ;; # NCO options O) drc_out=${OPTARG} ;; # Output directory o) out_fl=${OPTARG} ;; # Output file p) par_typ=${OPTARG} ;; # Parallelism type R) rgr_opt=${OPTARG} ;; # Regridding options s) grd_src=${OPTARG} ;; # Source grid-file T) tps_opt=${OPTARG} ;; # Tempest options t) thr_usr=${OPTARG} ;; # Thread number v) var_lst=${OPTARG} ;; # Variables w) wgt_usr=${OPTARG} ;; # Weight-generator x) xtn_var=${OPTARG} ;; # Extensive variables \?) # Unrecognized option printf "\nERROR: Option ${fnt_bld}-$OPTARG${fnt_nrm} not allowed" fnc_usg_prn ;; esac done shift $((OPTIND-1)) # Advance one argument # Derived variables grd_dst_dfl="${drc_out}/ncremap_tmp_grd_dst.nc" # [sng] Grid-file (destination) default grd_src_dfl="${drc_out}/ncremap_tmp_grd_src.nc" # [sng] Grid-file (source) default tmp_out_fl="${drc_out}/${tmp_out_fl}" # [sng] Temporary output file if [ ${alg_typ} = 'bilinear' ] || [ ${alg_typ} = 'bln' ] ; then # ESMF algorithms are bilinear|patch|neareststod|nearestdtos|conserve alg_opt='bilinear' elif [ ${alg_typ} = 'conserve' ] || [ ${alg_typ} = 'conservative' ] || [ ${alg_typ} = 'cns' ] ; then alg_opt='conserve' elif [ ${alg_typ} = 'nearestdtos' ] || [ ${alg_typ} = 'nds' ] || [ ${alg_typ} = 'dtos' ] ; then alg_opt='nearestdtos' elif [ ${alg_typ} = 'neareststod' ] || [ ${alg_typ} = 'nsd' ] || [ ${alg_typ} = 'stod' ] ; then alg_opt='nearestdtos' elif [ ${alg_typ} = 'patch' ] || [ ${alg_typ} = 'pch' ] || [ ${alg_typ} = 'ptc' ] ; then alg_opt='patch' fi # !alg_typ if [ -z "${drc_in}" ]; then drc_in="${drc_pwd}" else # !drc_in drc_in_usr_flg='Yes' fi # !drc_in if [ ${dbg_lvl} -ge 2 ]; then nco_opt="-D ${dbg_lvl} ${nco_opt}" fi # !dbg_lvl if [ -n "${nco_usr}" ]; then nco_opt="${nco_usr} ${nco_opt}" fi # !var_lst if [ -n "${gaa_sng}" ]; then nco_opt="${nco_opt} ${gaa_sng}" fi # !var_lst if [ -n "${hdr_pad}" ]; then nco_opt="${nco_opt} --hdr_pad=${hdr_pad}" fi # !hdr_pad if [ -n "${var_lst}" ]; then nco_var_lst="-v ${var_lst}" fi # !var_lst if [ -n "${xtn_var}" ]; then rgr_opt="${rgr_opt} --xtn=${xtn_var}" fi # !var_lst if [ -n "${par_typ}" ]; then if [ "${par_typ}" != 'bck' ] && [ "${par_typ}" != 'mpi' ] && [ "${par_typ}" != 'nil' ]; then echo "ERROR: Invalid -p par_typ option = ${par_typ}" echo "HINT: Valid par_typ arguments are 'bck', 'mpi', and 'nil'" exit 1 fi # !par_typ fi # !par_typ if [ "${par_typ}" = 'bck' ]; then par_opt=' &' elif [ "${par_typ}" = 'mpi' ]; then mpi_flg='Yes' par_opt=' &' fi # !par_typ if [ -n "${out_fl}" ]; then out_usr_flg='Yes' fi # !out_fl if [ -n "${thr_usr}" ]; then thr_nbr="${thr_usr}" fi # !thr_usr if [ -n "${wgt_usr}" ]; then wgt_gnr="${wgt_usr}" fi # !wgt_usr if [ "${wgt_gnr}" != 'esmf' ] && [ "${wgt_gnr}" != 'tempest' ] ; then echo "ERROR: Invalid -w wgt_gnr option = ${wgt_gnr}" echo "HINT: Valid wgt_gnr arguments are 'esmf' and 'tempest'" exit 1 fi # !wgt_gnr if [ -n "${in_fl}" ]; then # Single file argument fl_in[${fl_nbr}]=${in_fl} let fl_nbr=${fl_nbr}+1 else # !in_fl # Detecting input on stdin: # http://stackoverflow.com/questions/2456750/detect-presence-of-stdin-contents-in-shell-script # ls ${DATA}/ne30/raw/famipc5*1979*.nc | ncremap -D 1 -m ${DATA}/maps/map_ne30np4_to_fv129x256_aave.20150901.nc -O ~/rgr if [ -t 0 ]; then if [ "${drc_in_usr_flg}" = 'Yes' ]; then for fl in "${drc_in}"/*.nc "${drc_in}"/*.nc3 "${drc_in}"/*.nc4 "${drc_in}"/*.cdf "${drc_in}"/*.hdf "${drc_in}"/*.he5 "${drc_in}"/*.h5 ; do if [ -f "${fl}" ]; then fl_in[${fl_nbr}]=${fl} let fl_nbr=${fl_nbr}+1 fi # !file done else # !drc_in echo "ERROR: Must specify input file with -i or with stdin" echo "HINT: Pipe file list to script via stdin with, e.g., 'ls *.nc | ${spt_nm}'" exit 1 fi # !drc_in else # Input awaits on unit 0, i.e., on stdin while read -r line; do # NeR05 p. 179 fl_in[${fl_nbr}]=${line} let fl_nbr=${fl_nbr}+1 done < /dev/stdin fi # stdin fi # !in_fl if [ -n "${dst_fl}" ]; then if [ ! -e "${dst_fl}" ]; then echo "ERROR: Unable to find specified destination-file ${dst_fl}" echo "HINT: Supply the full path-name for the destination-file" exit 1 fi # ! -e dst_usr_flg='Yes' fi # !dst_fl if [ -n "${grd_dst}" ]; then if [ ! -e "${grd_dst}" ]; then echo "ERROR: Unable to find specified destination grid-file ${grd_dst}" echo "HINT: Supply the full path-name for the destination grid, or generate one automatically with -G" exit 1 fi # ! -e grd_dst_usr_flg='Yes' else grd_dst=${grd_dst_dfl} # [sng] Grid-file default fi # !grd_dst if [ -n "${grd_src}" ]; then if [ ! -e "${grd_src}" ]; then echo "ERROR: Unable to find specified source grid-file ${grd_src}" exit 1 fi # ! -e grd_src_usr_flg='Yes' else grd_src=${grd_src_dfl} # [sng] Grid-file default fi # !grd_src if [ -z "${grd_sng}" ]; then grd_sng_dfl="--rgr grd_ttl='Default internally-generated grid' --rgr grid=${grd_dst_dfl} --rgr latlon=100,100 --rgr snwe=30.0,70.0,-130.0,-90.0" # [sng] Grid string default grd_sng="${grd_sng_dfl}" else grd_sng_usr_flg='Yes' fi # !grd_sng if [ -n "${map_fl}" ]; then if [ ! -e "${map_fl}" ]; then echo "ERROR: Unable to find specified regrid map ${map_fl}" echo "HINT: Supply the full path-name for the regridding map" exit 1 fi # ! -e map_usr_flg='Yes' else if [ "${wgt_gnr}" = 'esmf' ]; then map_fl_dfl="${drc_out}/ncremap_tmp_map_${wgt_gnr}_${alg_opt}.nc" # [sng] Map-file default fi # !esmf if [ "${wgt_gnr}" = 'tempest' ]; then map_fl_dfl="${drc_out}/ncremap_tmp_map_${wgt_gnr}.nc" # [sng] Map-file default msh_fl_dfl="${drc_out}/ncremap_tmp_msh_ovr_${wgt_gnr}.g" # [sng] Mesh-file default msh_fl=${msh_fl_dfl} fi # !tempest map_fl=${map_fl_dfl} fi # !map_fl # Print initial state if [ ${dbg_lvl} -ge 2 ]; then printf "dbg: alg_opt = ${alg_opt}\n" printf "dbg: dbg_lvl = ${dbg_lvl}\n" printf "dbg: drc_in = ${drc_in}\n" printf "dbg: drc_out = ${drc_out}\n" printf "dbg: dst_fl = ${dst_fl}\n" # printf "dbg: fml_nm = ${fml_nm}\n" printf "dbg: gaa_sng = ${gaa_sng}\n" printf "dbg: grd_dst = ${grd_dst}\n" printf "dbg: grd_sng = ${grd_sng}\n" printf "dbg: grd_src = ${grd_src}\n" printf "dbg: hdr_pad = ${hdr_pad}\n" printf "dbg: in_fl = ${in_fl}\n" printf "dbg: map_fl = ${map_fl}\n" printf "dbg: mlt_map = ${mlt_map_flg}\n" printf "dbg: mpi_flg = ${mpi_flg}\n" printf "dbg: nco_opt = ${nco_opt}\n" printf "dbg: nd_nbr = ${nd_nbr}\n" printf "dbg: out_fl = ${out_fl}\n" printf "dbg: par_typ = ${par_typ}\n" printf "dbg: thr_nbr = ${thr_nbr}\n" printf "dbg: var_lst = ${var_lst}\n" printf "Asked to regrid ${fl_nbr} files:\n" for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do printf "${fl_in[${fl_idx}]}\n" done # !fl_idx fi # !dbg if [ ${dbg_lvl} -ge 2 ]; then if [ ${mpi_flg} = 'Yes' ]; then for ((nd_idx=0;nd_idx<${nd_nbr};nd_idx++)); do printf "dbg: nd_nm[${nd_idx}] = ${nd_nm[${nd_idx}]}\n" done # !nd fi # !mpi fi # !dbg # Create output directory mkdir -p ${drc_out} # Human-readable summary if [ ${dbg_lvl} -ge 1 ]; then printf "NCO regridder invoked with command:\n" echo "${spt_nm} ${cmd_ln}" fi # !dbg date_srt=$(date +"%s") if [ -f 'PET0.RegridWeightGen.Log' ]; then printf "${spt_nm}: Removing PET0.RegridWeightGen.Log file from current directory before running\n" /bin/rm -f PET0.RegridWeightGen.Log fi # !PETO printf "Started processing at `date`.\n" printf "NCO version is ${nco_version}\n" if [ "${map_usr_flg}" = 'Yes' ] && [ -n "${wgt_usr}" ] ; then printf "${spt_nm}: ERROR Specifying both '-m map_fl' and '-w wgt_gnr' is not allowed (the weight-generator is unnecessary)\n" exit 1 fi # wgt_usr if [ "${grd_src_usr_flg}" = 'Yes' ]; then if [ "${map_usr_flg}" = 'Yes' ]; then printf "${spt_nm}: ERROR Specifying both '-s grd_src' and '-m map_fl' is ambiguous and forbidden\n" exit 1 fi # !map_usr_flg fi # !grd_src_usr_flg if [ "${dst_usr_flg}" = 'Yes' ]; then if [ "${map_usr_flg}" = 'Yes' ]; then printf "${spt_nm}: ERROR Specify either '-d dst_fl' or '-m map_fl' not both\n" exit 1 fi # !map_usr_flg if [ "${grd_dst_usr_flg}" = 'Yes' ]; then printf "${spt_nm}: ERROR Specify either '-d dst_fl' or '-g grd_dst' not both\n" exit 1 fi # !grd_dst_usr_flg else # !dst_usr_flg if [ "${grd_dst_usr_flg}" = 'Yes' ]; then if [ "${map_usr_flg}" = 'Yes' ]; then printf "${spt_nm}: ERROR Specify either '-g grd_dst' or '-m map_fl' not both\n" exit 1 fi # !map_usr_flg else if [ "${map_usr_flg}" != 'Yes' ] && [ "${grd_sng_usr_flg}" != 'Yes' ] ; then printf "${spt_nm}: ERROR Must use one of '-d dst_fl', '-g grd_dst', '-G grd_sng', or '-m map_fl'\n" exit 1 fi # !map_usr_flg fi # !grd_dst_usr_flg fi # !dst_usr_flg # Generate destination grid, if necessary, once (only) before loop over input files # Block 1: Destination grid # Unlike source grid, same destination grid is used for all files # Generate destination grid at most one-time # Eventually we will allow destination grid to be provided as grid-file, map-file, or data-file # Currently we require user to know (and specify) means by which destination grid is provided if [ "${map_usr_flg}" = 'Yes' ]; then printf "Source and destination grids will both be read from supplied map-file ${map_fl}\n" else # !map_usr_flg fl_idx=0 # [idx] Current file index if [ "${dst_usr_flg}" = 'Yes' ]; then # Block 1 Loop 1: Generate, check, and store (but do not yet execute) commands # Infer destination grid-file from data file printf "Destination grid will be inferred from data-file ${dst_fl} and stored as ${grd_dst}\n" cmd_dst[${fl_idx}]="ncks ${nco_opt} --rgr nfr=y --rgr grid=${grd_dst} ${dst_fl} ${tmp_out_fl}" else # !dst_usr_flg if [ "${grd_dst_usr_flg}" = 'Yes' ]; then printf "Destination grid supplied by user as ${grd_dst}\n" else if [ "${grd_sng_usr_flg}" = 'Yes' ]; then printf "Destination grid will be generated from NCO grid string ${grd_sng}\n" cmd_dst[${fl_idx}]="ncks ${nco_opt} ${grd_sng} ${fl_in[0]} ${tmp_out_fl}" else printf "${spt_nm}: ERROR Grid string grd_sng not provided\n" exit 1 fi # !grd_sng_usr_flg fi # !grd_dst_usr_flg fi # !dst_usr_flg if [ "${dst_usr_flg}" = 'Yes' ] || [ "${grd_dst_usr_flg}" != 'Yes' ]; then # Block 1 Loop 2: Execute and/or echo commands if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_dst[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_dst[${fl_idx}]} if [ $? -ne 0 ]; then printf "${spt_nm}: ERROR Failed to generate destination grid. Debug this:\n${cmd_dst[${fl_idx}]}\n" exit 1 fi # !err if [ "${grd_sng_usr_flg}" = 'Yes' ]; then /bin/rm -f ${tmp_out_fl} fi # !grd_sng_usr_flg fi # !dbg fi # !dst_usr_flg || grd_dst_usr_flg printf "Weight-generation type: ${wgt_gnr}\n" if [ "${wgt_gnr}" = 'esmf' ]; then printf "ESMF's ESMF_RegridWeightGen will generate map-file internally and store it as ${map_fl}\n" printf "Algorithm used to generate weights in map-file is: ${alg_opt}\n" fi # !esmf if [ "${wgt_gnr}" = 'tempest' ]; then printf "TempestRemap's GenerateOverlapMesh and GenerateOfflineMap will generate map-file internally and store it as ${map_fl}\n" fi # !tempest if [ ${fl_nbr} -ge 2 ]; then if [ "${mlt_map_flg}" = 'Yes' ]; then printf "Input files assumed to use unique input grids, one map-file will be generated per input file\n" else # !mlt_map_flg printf "Input files assumed to use same input grid, only one map-file will be generated\n" fi # !mlt_map_flg fi # !fl_nbr fi # !map_usr # If user provides source gridfile, assume it applies to every input file # Do not infer source gridfiles from input files within file loop # Generate map-file once outside of file loop, and re-use it for every input file if [ "${grd_src_usr_flg}" = 'Yes' ]; then printf "Source grid supplied by user as ${grd_src}\n" fl_idx=0 if [ "${wgt_gnr}" = 'esmf' ]; then cmd_map[${fl_idx}]="ESMF_RegridWeightGen -s ${grd_src} -d ${grd_dst} -w ${map_fl} --method ${alg_opt} ${esmf_opt} > /dev/null" fi # !esmf if [ "${wgt_gnr}" = 'tempest' ]; then cmd_msh[${fl_idx}]="GenerateOverlapMesh --a ${grd_src} --b ${grd_dst} --out ${msh_fl} > /dev/null" cmd_map[${fl_idx}]="GenerateOfflineMap --in_mesh ${grd_src} --out_mesh ${grd_dst} --ov_mesh ${msh_fl} --out_map ${map_fl} ${tps_opt} > /dev/null" # 20160101: TempestRemap programs have false positive error returns (failures reported as successes) so remove old map/mesh before generating new /bin/rm -f ${msh_fl} ${map_fl} if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_msh[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_msh[${fl_idx}]} if [ $? -ne 0 ] || [ ! -f ${msh_fl} ] ; then printf "${spt_nm}: ERROR Failed to generate mesh-file. Debug this:\n${cmd_msh[${fl_idx}]}\n" exit 1 fi # !err fi # !dbg fi # !tempest if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_map[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_map[${fl_idx}]} if [ $? -ne 0 ] || [ ! -f ${map_fl} ] ; then printf "${spt_nm}: ERROR Failed to generate map-file. Debug this:\n${cmd_map[${fl_idx}]}\n" if [ "${wgt_gnr}" = 'esmf' ]; then printf "${spt_nm}: HINT When ESMF fails to generate map-files, it often puts additional debugging information in the file named PET0.RegridWeightGen.Log in the invocation directory (${drc_pwd})\n" fi # !esmf exit 1 fi # !err fi # !dbg # Set map_usr_flg to 'Yes' here to avoid re-generating map within file loop map_usr_flg='Yes' fi # !grd_src_usr_flg # Begin loop over input files for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do in_fl=${fl_in[${fl_idx}]} if [ "$(basename ${in_fl})" = "${in_fl}" ]; then in_fl="${drc_pwd}/${in_fl}" fi # !basename if [ "${out_usr_flg}" = 'Yes' ]; then if [ ${fl_nbr} -ge 2 ]; then echo "ERROR: Single output filename specified with -o for multiple input files" echo "HINT: For multiple input files use -O option to specify output directory and do not use -o option. Output files will have same name as input files, but will be in different directory." exit 1 fi # !fl_nbr else # !out_usr_flg out_fl="${drc_out}/$(basename ${in_fl})" # [sng] Output-file default fi # !out_fl if [ "${in_fl}" = "${out_fl}" ]; then echo "ERROR: Input file = Output file = ${in_fl}" echo "HINT: To prevent inadvertent data loss, ${spt_nm} insists that Input file and Output filenames differ" exit 1 fi # !basename # Generate new map unless map-file was supplied or already-generated (as indicated by map_usr_flg) if [ "${map_usr_flg}" != 'Yes' ]; then # Block 2: Source grid # Block 2 Loop 1: Source gridfile command if [ ! -e "${in_fl}" ]; then echo "${spt_nm}: ERROR Unable to find Input file ${in_fl}" echo "HINT: All files implied to exist must be in the directory specified by their filename or in ${drc_in} before ${spt_nm} will proceed" exit 1 fi # ! -e # Infer source grid-file from input data file cmd_src[${fl_idx}]="ncks ${nco_opt} --rgr nfr=y --rgr grid=${grd_src} ${in_fl} ${tmp_out_fl}" # Block 2 Loop 2: Execute and/or echo commands if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_src[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_src[${fl_idx}]} if [ $? -ne 0 ]; then printf "${spt_nm}: ERROR Failed to generate source grid. Debug this:\n${cmd_src[${fl_idx}]}\n" exit 1 fi # !err fi # !dbg # Block 3: Source->destination maps # Block 3 Loop 1: Map-file commands printf "Grid(src): ${grd_src}\n" printf "Grid(dst): ${grd_dst}\n" printf "Map-File : ${map_fl}\n" if [ "${wgt_gnr}" = 'esmf' ]; then cmd_map[${fl_idx}]="ESMF_RegridWeightGen -s ${grd_src} -d ${grd_dst} -w ${map_fl} --method ${alg_opt} ${esmf_opt} > /dev/null" fi # !esmf if [ "${wgt_gnr}" = 'tempest' ]; then printf "Mesh-File: ${msh_fl}\n" cmd_msh[${fl_idx}]="GenerateOverlapMesh --a ${grd_src} --b ${grd_dst} --out ${msh_fl} ${tps_opt} > /dev/null" cmd_map[${fl_idx}]="GenerateOfflineMap --in_mesh ${grd_src} --out_mesh ${grd_dst} --ov_mesh ${msh_fl} --out_map ${map_fl} ${tps_opt} > /dev/null" # 20160101: TempestRemap programs have false negative error returns (failures reported as successes) so remove old map/mesh before generating new /bin/rm -f ${msh_fl} ${map_fl} if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_msh[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_msh[${fl_idx}]} if [ $? -ne 0 ] || [ ! -f ${msh_fl} ] ; then printf "${spt_nm}: ERROR Failed to generate mesh-file. Debug this:\n${cmd_msh[${fl_idx}]}\n" exit 1 fi # !err fi # !dbg fi # !tempest # Block 3 Loop 2: Execute and/or echo commands if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_map[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_map[${fl_idx}]} if [ $? -ne 0 ] || [ ! -f ${map_fl} ] ; then printf "${spt_nm}: ERROR Failed to generate map-file. Debug this:\n${cmd_map[${fl_idx}]}\n" if [ "${wgt_gnr}" = 'esmf' ]; then printf "${spt_nm}: HINT When ESMF fails to generate map-files, it often puts additional debugging information in the file named PET0.RegridWeightGen.Log in the invocation directory (${drc_pwd})\n" fi # !esmf exit 1 fi # !err fi # !dbg # Prevent creating new source gridfile and map-file after first iteration if [ "${mlt_map_flg}" = 'No' ] && [ ${fl_idx} -eq 0 ] ; then map_usr_flg='Yes' fi # !mlt_map_flg fi # !map_usr_flg # Block 4: Regrid printf "Input : ${in_fl}\n" printf "Output: ${out_fl}\n" cmd_rgr[${fl_idx}]="ncks -t ${thr_nbr} ${nco_opt} ${nco_var_lst} ${rgr_opt} --map=${map_fl} ${in_fl} ${out_fl}" # Block 4 Loop 2: Execute and/or echo commands if [ ${dbg_lvl} -ge 1 ]; then echo ${cmd_rgr[${fl_idx}]} fi # !dbg if [ ${dbg_lvl} -ne 2 ]; then eval ${cmd_rgr[${fl_idx}]} if [ -z "${par_opt}" ]; then eval ${cmd_rgr[${fl_idx}]} if [ $? -ne 0 ]; then printf "${spt_nm}: ERROR Failed to regrid. cmd_rgr[${fl_idx}] failed. Debug this:\n${cmd_rgr[${fl_idx}]}\n" exit 1 fi # !err else # !par_typ eval ${cmd_rgr[${fl_idx}]} ${par_opt} rgr_pid[${fl_idx}]=$! fi # !par_typ fi # !dbg done # !fl_idx # wait() for parallel regridding, if any, to finish if [ -n "${par_opt}" ]; then for ((fl_idx=0;fl_idx<${fl_nbr};fl_idx++)); do wait ${rgr_pid[${fl_idx}]} if [ $? -ne 0 ]; then printf "${spt_nm}: ERROR Failed to regrid. cmd_rgr[${fl_idx}] failed. Debug this:\n${cmd_rgr[${fl_idx}]}\n" exit 1 fi # !err done # !fl_idx fi # !par_typ date_end=$(date +"%s") printf "Completed processing of ${fl_nbr} file(s) at `date`.\n" date_dff=$((date_end-date_srt)) echo "Quick plots of results from last regridded file:" echo "ncview ${out_fl} &" echo "panoply ${out_fl} &" echo "Elapsed time $((date_dff/60))m$((date_dff % 60))s" exit 0 nco-4.5.4/data/netcdf4.nco000066400000000000000000000042431264355130400152520ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: Sample input script for netCDF4-enabled ncap2 // Stress-test netCDF4 atomic types and features /* URL: http://dust.ess.uci.edu/nco/netcdf4.nc */ /* Usage: ncap2 -4 -O -v -S ~/nco/data/netcdf4.nco ~/nco/data/in.nc ~/nco/data/netcdf4.nc ncks ~/nco/data/netcdf4.nc | /bin/more scp ~/nco/data/netcdf4.nc dust.ess.uci.edu:/var/www/html/nco */ global@Conventions_NC_CHAR = "CF-1.0"; // NC_CHAR global@Conventions_NC_STRING = "CF-1.0"s; // NC_STRING var_foo=1.0; var_foo@units="meters"s; // NC_STRING var_foo@units2="meters"; // NC_CHAR // Make sure netCDF3 commands work var_double=1.0; var_float=1.0f; var_int=1; var_int_max=2147483647; var_short=1s; var_byte=1b; var_char[char_dmn_lng04]="Hell"; // Array of NC_CHAR // Following lines _require_ netCDF4: var_ubyte=1ub; var_ushort=1us; var_uint=1u; var_int64=1ll; var_uint64=1ull; var_string="Hell"s; // Single NC_STRING var_string_arr1[char_dmn_lng04]="one"s; // Array of NC_STRING var_string_arr2[char_dmn_lng04]={"one"s,"two"s,"three"s,"four"s}; // Array of NC_STRING var_string_arr[char_dmn_lng04]={"Hello, World!"s,"Same to you.\nPunctuation may be in strings"s,"Ça va bien?\nForeign characters, too."s,"Oui, c'est trés bien\nEven their lengths may differ"s}; // Array of NC_STRING // Test arithmetic ranges var_short_max=32767s; var_short_ttl=var_short+var_short; var_short_ttl_max=var_short_max+var_short_max; // 20090504: -2 overflow OK var_int64_ttl=var_int64+var_int64; var_int64_max=9223372036854775807ll; var_int64_ttl_max=var_int64_max+var_int64_max; // 20090504: -2 overflow OK var_uint_max=4294967295u; var_uint_ttl=var_uint+var_uint; var_uint_ttl_max=var_uint_max+var_uint_max; var_uint64_max=18446744073709551615ull; var_uint64_ttl=0ull+var_int64+var_int64; var_uint64_ttl_max=var_uint64_max+var_uint64_max; // 20090504: 18446744073709551614ull overflow OK? var_uint64_prd=2*9223372036854775807ull; var_uint64_dff=var_uint64_max-1; var_ushort_ngt=-var_ushort; // 20080512: = 65535 overflow OK var_ushort_ngt_2=-1us; // 20080512: = 65535 overflow OK var_ushort_max=65535us; var_ushort_ttl=var_ushort+var_ushort; var_ushort_ttl_max=var_ushort_max+var_ushort_max; // 20090504: 65534 overflow OK nco-4.5.4/data/obs.cdl000066400000000000000000000004041264355130400144640ustar00rootroot00000000000000// Generate netCDF file with: // ncgen -k netCDF-4 -b -o ~/nco/data/obs.nc ~/nco/data/obs.cdl netcdf obs { dimensions: time=4; variables: float tas1(time); double time(time); data: tas1=273,273,273,273; time=1.,2.,3.,4.; } // end root group nco-4.5.4/data/pdf.nco000066400000000000000000000030041264355130400144660ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: Compute PDF of timeseries at each spatial point // /* Usage: // ncap2 -O -v -S ~/nco/data/pdf.nco ~/nco/data/in.nc ~/foo.nc // ncap2 -D 1 -O -v -S ~/nco/data/pdf.nco /scratch2/scratchdirs/zender/ne30/clm/prect.nc ~/foo.nc // ncks -v 'bin.?' ~/foo.nc | /bin/more */ // Declare various flags as RAM variable or they will clutter output file *flg_dbg=0s; // [flg] Debug mode if(flg_dbg) *bin_nbr=3; else *bin_nbr=100; defdim("bin",bin_nbr); // [nbr] Bin dimension defdim("bin_grd",bin_nbr+1); // [nbr] Bin grid dimension *var_max_max=max(PRECT); *var_min_min=0.0; // Set bin boundaries var_grd=array(0.0f,var_max_max/bin_nbr,$bin_grd); var_min[bin]=var_grd(0:bin_nbr-1); // [m s-1] Minimum value in bin var_max[bin]=var_grd(1:bin_nbr); // [m s-1] Maximum value in bin // Initialize loop variables as RAM variables *bin_cnt[lat,lon,bin]=0s; // [nbr] Number of values in bin *bin_flg[time,lat,lon]=0s; // [flg] Value is within current bin // bin_cnt is RAM variable so use set_miss() to set missing value set_miss(bin_cnt,-32768s); for(*bin_idx=0;bin_idx= var_min(bin_idx) && PRECT < var_max(bin_idx)); bin_cnt(:,:,bin_idx)=bin_flg.total($time); } // !bin_idx ram_write(bin_cnt); if(flg_dbg){ // Write bin_flg and bin_idx only in debug mode ram_write(bin_flg); ram_write(bin_idx); }else{ // Delete RAM variables to conserve memory if script grows (good practice, not required) ram_delete(bin_flg); ram_delete(bin_idx); } // end if dbg nco-4.5.4/data/psd.nco000066400000000000000000000107061264355130400145120ustar00rootroot00000000000000// $Header$ -*-C-*- // Purpose: ncap script for particle size distributions // Produces Table~\ref{tbl:lgn_stt_anl} in http://dust.ess.uci.edu/facts/psd/psd.pdf /* Usage: ncap2 -v -O -D 1 -S ${HOME}/nco/data/psd.nco ${HOME}/nco/data/in.nc ~/foo.nc ncks -C -H -u -v dmt_nwa,dmt_saa,dmt_vaa ~/foo.nc ncks -C -H -u -v SSA_cgs,nbr_vts,dmt_vts_mm ~/foo.nc */ pi=3.1415926535897932384626433832795029L; // (3.1415926535897932384626433832795029L) [frc] 3 pi@long_name="Pi"; pi@units="fraction"; defdim("dmt",13); // [nbr] Diameter dimension dmt_nma[dmt]={0.1,0.1861,0.2366,0.3009,0.3825,0.4864,0.5915,0.6185,0.7864,0.8281,1.0,1.183,2.366}; // [um] Number median diameter analytic // Find dmt_nma for which dmt_saa=1.0: // ncap -v -O -s "gsd=2.0;dmt_saa=1.0;dmt_nma=dmt_saa*exp(-1.0*(ln(gsd))^2.0);" ${HOME}/nco/data/in.nc ~/foo.nc;ncks -H -C -u ~/foo.nc // Find dmt_nma for which dmt_vaa=1.0: // ncap -v -O -s "gsd=2.0;dmt_vaa=1.0;dmt_nma=dmt_vaa*exp(-1.5*(ln(gsd))^2.0);" ${HOME}/nco/data/in.nc ~/foo.nc;ncks -H -C -u ~/foo.nc // Set coordinate equal to number median diamter for now dmt[dmt]=dmt_nma; // [um] Diameter coordinate // Compute fraction of lognormal distribution that lies between two endpoints gsd=2.0; // [frc] Geometric standard deviation gsd@long_name="Geometric standard deviation"; gsd@units="fraction"; dmt_naa=dmt_nma*exp(0.5*(ln(gsd))^2.0); // [um] Number mean diameter analytic dmt_nwa=dmt_nma*exp(0.5*(ln(gsd))^2.0); // [um] Number weighted mean diameter analytic dmt_saa=dmt_nma*exp(1.0*(ln(gsd))^2.0); // [um] Surface area mean diameter analytic dmt_vaa=dmt_nma*exp(1.5*(ln(gsd))^2.0); // [um] Volume mean diameter analytic dmt_sma=dmt_nma*exp(2.0*(ln(gsd))^2.0); // [um] Surface area median diameter analytic dmt_swa=dmt_nma*exp(2.5*(ln(gsd))^2.0); // [um] Surface area weighted mean diameter analytic dmt_vma=dmt_nma*exp(3.0*(ln(gsd))^2.0); // [um] Volume median diameter analytic dmt_vwa=dmt_nma*exp(3.5*(ln(gsd))^2.0); // [um] Volume weighted mean diameter analytic dmt_naa@long_name="Number mean diameter analytic"; dmt_naa@units="micron"; dmt_nma@long_name="Number median diameter analytic"; dmt_nma@units="micron"; dmt_nwa@long_name="Number weighted mean diameter analytic"; dmt_nwa@units="micron"; dmt_saa@long_name="Surface area mean diameter analytic"; dmt_saa@units="micron"; dmt_sma@long_name="Surface area median diameter analytic"; dmt_sma@units="micron"; dmt_swa@long_name="Surface area weighted mean diameter analytic"; dmt_swa@units="micron"; dmt_vaa@long_name="Volume mean diameter analytic"; dmt_vaa@units="micron"; dmt_vma@long_name="Volume median diameter analytic"; dmt_vma@units="micron"; dmt_vwa@long_name="Volume weighted mean diameter analytic"; dmt_vwa@units="micron"; dmt_min[dmt]=5.0; // [um] Minimum diameter dmt_min@long_name="Minimum diameter"; dmt_min@units="micron"; dmt_max[dmt]=10.0; // [um] Maximum diameter dmt_max@long_name="Maximum diameter"; dmt_max@units="micron"; // ncap2 -v -O -s "gsd=2.0;dmt_vma=2.5;dmt_min=5.0;dmt_max=10.0;ovr_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd))))));" ${HOME}/nco/data/in.nc ~/foo.nc;ncks -H -C -u ~/foo.nc ovr_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd)))); // [frc] Fraction of lognormal distribution between endpoints ovr_frc@long_name="Fraction of lognormal distribution between endpoints"; ovr_frc@units="fraction"; // Compute equal-V/S approximation for TDS07 depth hoar crystal Figure 1: dns=917.0; // [kg m-3] Density hgt=130.0e-6; // [m] Thickness of hoar crystal wall dmt_xsx=2.41e-3; // [m] Diameter of sphere with same cross-sectional area as hoar crystal xsx=0.25*pi*dmt_xsx^2; // [m2] Cross-sectional area of hoar crystal sfc_prt=4*xsx; // [m2] Surface area of hoar crystal (assumes convex shape) sfc_sht=2*xsx; // [m2] Surface area of infinite sheet (explanation in TDS07) vlm_sht=xsx*hgt; // [m3] Volume mss_sht=vlm_sht*dns; // [kg] Mass SSA=sfc_sht/mss_sht; // [m2 kg-1] Specific surface area SSA_cgs=SSA*10.0; // [cm2 g-1] Specific surface area rds_vts=3.0*vlm_sht/sfc_sht; // [m] Radius of sphere with equal V/S ratio dmt_vts=2.0*rds_vts; // [m] Diameter of sphere with equal V/S ratio dmt_vts_mm=1000.0*dmt_vts; // [mm] Diameter of sphere with equal V/S ratio sfc_vts=4*pi*rds_vts^2; // [m3] Volume of equal V/S spheres vlm_vts=(4.0/3.0)*pi*rds_vts^3; // [m3] Volume of equal V/S spheres nbr_vts=sfc_prt/sfc_vts; // [#] Number of equal V/S spheres /* foo=; // foo@long_name=""; foo@units=""; */ nco-4.5.4/data/psd_wrf.nco000066400000000000000000000221631264355130400153700ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: ncap script for WRF particle size distributions // Based on psd.nco /* Usage: ncap2 -v -O -D 1 -S ${HOME}/nco/data/psd_wrf.nco ${HOME}/nco/data/in.nc ~/foo_psd.nc ncks -C -H -F -u -v ovr_mss_frc,ovr_mss_frc_ttl,ovr_mss_frc_nrm,ovr_mss_frc_nrm_ttl ~/foo_psd.nc ncks -C -H -F -u -v ovr_nbr_frc,ovr_nbr_frc_ttl,ovr_nbr_frc_nrm,ovr_nbr_frc_nrm_ttl ~/foo_psd.nc ncks -C -H -F -u -v mss_rsl,nbr_rsl,nbr_spc_rsl ~/foo_psd.nc ncks -C -H -F -u -v dmt_nwa,dmt_saa,dmt_vaa ~/foo_psd.nc */ /* Ancillary simulations: # 20061117: Compute mass fractions for eight size bins in WRF-Chem model: dead --dbg=1 --time_nbr=451189 ${DATA}/esh/paws_Ptr_19910101_20031231.nc ${DATA}/esh/dead_psd_wrf_paws_Ptr.nc > ~/foo 2>&1 & dead --dbg=1 --time_nbr=451189 ${DATA}/esh/paws_Ptr_19910101_20031231.nc ${DATA}/esh/dead_psd_cam_paws_Ptr.nc > ~/foo 2>&1 & ln -s -f ${DATA}/esh/dead_psd_wrf_paws_Ptr.nc ~/foo.nc # Normalize mass fractions after imposing CAM mass fractions for largest two bins (which are identical between CAM and WRF) ncap2 -v -D 1 -O \ -s 'flx_mss_vrt_dst_avg=flx_mss_vrt_dst.avg($time,$lon)' \ -s 'flx_mss_vrt_dst_ttl=flx_mss_vrt_dst_avg.total()' \ -s 'flx_mss_vrt_dst_nrm=flx_mss_vrt_dst_avg/flx_mss_vrt_dst_ttl' \ -s 'flx_mss_vrt_dst_nrm_ttl=flx_mss_vrt_dst_nrm.total()' \ -s 'defdim("x",6);flx_mss_vrt_dst_nrm_trc[$x]=flx_mss_vrt_dst_nrm(0:5)' \ -s 'flx_mss_vrt_dst_nrm_trc_nrm=flx_mss_vrt_dst_nrm_trc*(1.0-(0.17+0.67))/flx_mss_vrt_dst_nrm_trc.total()' \ -s 'flx_mss_vrt_dst_nrm_crc=flx_mss_vrt_dst_nrm' \ -s 'flx_mss_vrt_dst_nrm_crc(0:5)=flx_mss_vrt_dst_nrm_trc_nrm' \ -s 'flx_mss_vrt_dst_nrm_crc(6)=0.17' \ -s 'flx_mss_vrt_dst_nrm_crc(7)=0.67' \ -s 'flx_mss_vrt_dst_nrm_crc_ttl=flx_mss_vrt_dst_nrm_crc.total()' \ ~/foo.nc ~/foo_wrf.nc # Normalize mass fractions ncks -C -F -v flx_mss_vrt_dst_nrm,flx_mss_vrt_dst_nrm_ttl,flx_mss_vrt_dst_nrm_crc,flx_mss_vrt_dst_nrm_crc_ttl ~/foo_wrf.nc # Answers ncks -C -F -s "%8.3e, " -v flx_mss_vrt_dst_nrm,flx_mss_vrt_dst_nrm_crc ~/foo_wrf.nc # Answers formatted */ pi=3.1415926535897932384626433832795029L; // (3.1415926535897932384626433832795029L) [frc] 3 pi@long_name="Pi"; pi@units="fraction"; /* NB: "Scalar" quantities are those which _could_ be size-dependent, though are size-indenpendent (hence "scalar") in the default DEAD implementation */ psd_cam=0s; // [flg] CAM size grid psd_wrf=1s; // [flg] WRF size grid // Choose PSD psd_typ=psd_wrf; // [enm] Size grid type if(psd_typ==psd_cam){ sz_nbr=4; // [nbr] Number of particle size bins defdim("dmt",sz_nbr); // [nbr] Diameter dimension dmt_min_mcr[dmt]={0.1, 1.0, 2.5, 5.0}; // [um] Minimum diameter dmt_max_mcr[dmt]={1.0, 2.5, 5.0, 10.0}; // [um] Maximum diameter }else if(psd_typ==psd_wrf){ sz_nbr=8; // [nbr] Number of particle size bins defdim("dmt",sz_nbr); // [nbr] Diameter dimension dmt_min_mcr[dmt]={0.0390625, 0.078125, 0.15625, 0.3125, 0.625, 1.25, 2.5, 5.0}; // [um] Minimum diameter dmt_max_mcr[dmt]={0.078125 , 0.15625 , 0.3125 , 0.625, 1.25 , 2.5 , 5.0, 10.0}; // [um] Maximum diameter } // !psd_typ dmt_min=1.0e-6*dmt_min_mcr; // [m] Minimum diameter dmt_min@long_name="Minimum diameter"; dmt_min@units="meter"; dmt_max=1.0e-6*dmt_max_mcr; // [m] Maximum diameter dmt_max@long_name="Maximum diameter"; dmt_max@units="meter"; dmt_vma_mcr_scl=3.5; // [um] Volume median diameter analytic, scalar dmt_vma_scl=1.0e-6*dmt_vma_mcr_scl; // [m] Volume median diameter analytic, scalar dmt_vma[dmt]=dmt_vma_scl; // [m] Volume median diameter analytic dns_prt_scl=2500.0; // [kg m-3] Density of particle, scalar dns_prt[dmt]=dns_prt_scl; // [kg m-3] Density of particle dns_prt@long_name="Density of particle"; dns_prt@units="kilogram meter-3"; cnc_nbr_ttl=1.0; // [# m-3] Number concentration analytic cnc_nbr_ttl@long_name="Number concentration analytic"; cnc_nbr_ttl@units="number meter-3"; // Set coordinate equal to number median diamter for now dmt_ctr=0.5*(dmt_min+dmt_max); // [m] Diameter at bin center dmt=dmt_ctr; // [m] Diameter coordinate dmt@long_name="Diameter coordinate"; dmt@units="meter"; // Compute fraction of lognormal distribution that lies between two endpoints gsd_scl=2.0; // [frc] Geometric standard deviation, scalar gsd=gsd_scl; // [frc] Geometric standard deviation gsd@long_name="Geometric standard deviation"; gsd@units="fraction"; dmt_nma=dmt_vma*exp(-3.0*(ln(gsd))^2.0); // [m] Number median diameter analytic dmt_naa=dmt_nma*exp(0.5*(ln(gsd))^2.0); // [m] Number mean diameter analytic dmt_nwa=dmt_nma*exp(0.5*(ln(gsd))^2.0); // [m] Number weighted mean diameter analytic dmt_saa=dmt_nma*exp(1.0*(ln(gsd))^2.0); // [m] Surface area mean diameter analytic dmt_vaa=dmt_nma*exp(1.5*(ln(gsd))^2.0); // [m] Volume mean diameter analytic dmt_sma=dmt_nma*exp(2.0*(ln(gsd))^2.0); // [m] Surface area median diameter analytic dmt_swa=dmt_nma*exp(2.5*(ln(gsd))^2.0); // [m] Surface area weighted mean diameter analytic //dmt_vma=dmt_nma*exp(3.0*(ln(gsd))^2.0); // [m] Volume median diameter analytic dmt_vwa=dmt_nma*exp(3.5*(ln(gsd))^2.0); // [m] Volume weighted mean diameter analytic dmt_naa@long_name="Number mean diameter analytic"; dmt_naa@units="meter"; dmt_nma@long_name="Number median diameter analytic"; dmt_nma@units="meter"; dmt_nwa@long_name="Number weighted mean diameter analytic"; dmt_nwa@units="meter"; dmt_saa@long_name="Surface area mean diameter analytic"; dmt_saa@units="meter"; dmt_sma@long_name="Surface area median diameter analytic"; dmt_sma@units="meter"; dmt_swa@long_name="Surface area weighted mean diameter analytic"; dmt_swa@units="meter"; dmt_vaa@long_name="Volume mean diameter analytic"; dmt_vaa@units="meter"; dmt_vma@long_name="Volume median diameter analytic"; dmt_vma@units="meter"; dmt_vwa@long_name="Volume weighted mean diameter analytic"; dmt_vwa@units="meter"; // ncap2 -v -O -s "gsd=2.0;dmt_vma=2.5;dmt_min=5.0;dmt_max=10.0;ovr_mss_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd))))));" ${HOME}/nco/data/in.nc ~/foo.nc;ncks -H -C -u ~/foo.nc ovr_mss_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd)))); // [frc] Fraction of lognormal mass distribution between endpoints ovr_mss_frc@long_name="Fraction of lognormal mass distribution between endpoints"; ovr_mss_frc@units="fraction"; ovr_mss_frc_ttl=ovr_mss_frc.total(); // [frc] Sum of mass overlap fractions ovr_mss_frc_ttl@long_name="Sum of mass overlap fractions"; ovr_mss_frc_ttl@units="fraction"; ovr_mss_frc_nrm=ovr_mss_frc/ovr_mss_frc_ttl; // [frc] Normalized mass overlap fractions ovr_mss_frc_nrm@long_name="Normalized mass overlap fractions"; ovr_mss_frc_nrm@units="fraction"; ovr_mss_frc_nrm_ttl=ovr_mss_frc_nrm.total(); // [frc] Sum of normalized mass overlap fractions ovr_mss_frc_nrm_ttl@long_name="Sum of normalized mass overlap fractions"; ovr_mss_frc_nrm_ttl@units="fraction"; // ncap2 -v -O -s "gsd=2.0;dmt_nma=2.5;dmt_min=5.0;dmt_max=10.0;ovr_nbr_frc=0.5*(erf(log(dmt_max/dmt_nma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_nma)/(sqrt(2.0)*log(gsd))))));" ${HOME}/nco/data/in.nc ~/foo.nc;ncks -H -C -u ~/foo.nc ovr_nbr_frc=0.5*(erf(log(dmt_max/dmt_nma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_nma)/(sqrt(2.0)*log(gsd)))); // [frc] Fraction of lognormal number distribution between endpoints ovr_nbr_frc@long_name="Fraction of lognormal number distribution between endpoints"; ovr_nbr_frc@units="fraction"; ovr_nbr_frc_ttl=ovr_nbr_frc.total(); // [frc] Sum of number overlap fractions ovr_nbr_frc_ttl@long_name="Sum of number overlap fractions"; ovr_nbr_frc_ttl@units="fraction"; ovr_nbr_frc_nrm=ovr_nbr_frc/ovr_nbr_frc_ttl; // [frc] Normalized number overlap fractions ovr_nbr_frc_nrm@long_name="Normalized number overlap fractions"; ovr_nbr_frc_nrm@units="fraction"; ovr_nbr_frc_nrm_ttl=ovr_nbr_frc_nrm.total(); // [frc] Sum of normalized number overlap fractions ovr_nbr_frc_nrm_ttl@long_name="Sum of normalized number overlap fractions"; ovr_nbr_frc_nrm_ttl@units="fraction"; // Compute resolved absolute quantities dmt_nma_scl=dmt_vma_scl*exp(-3.0*(ln(gsd))^2.0); // [um] Number median diameter analytic, scalar dmt_nma_scl@long_name="Number median diameter analytic, scalar"; dmt_nma_scl@units="meter"; vlm_anl_scl=cnc_nbr_ttl*(pi/6.0)*(dmt_nma_scl^3.0)*exp(4.5*(ln(gsd))^2.0); // [m3 m-3] Volume concentration analytic vlm_anl_scl@long_name="Volume concentration analytic"; vlm_anl_scl@units="meter3 meter-3"; mss_anl_scl=dns_prt_scl*vlm_anl_scl; // [kg m-3] Mass concentration analytic mss_anl_scl@long_name="Mass concentration analytic"; mss_anl_scl@units="kilogram meter-3"; nbr_anl_scl=cnc_nbr_ttl; // [# m-3] Number concentration analytic nbr_anl_scl@long_name="Number concentration analytic"; nbr_anl_scl@units="number meter-3"; // NB: Multiply by absoluted (not normalized) mass fraction mss_rsl=ovr_mss_frc*mss_anl_scl; // [kg m-3] Mass concentration resolved mss_rsl@long_name="Mass concentration resolved"; mss_rsl@units="kilogram meter-3"; nbr_rsl=ovr_nbr_frc*nbr_anl_scl; // [# m-3] Number concentration resolved nbr_rsl@long_name="Number concentration resolved"; nbr_rsl@units="number meter-3"; nbr_spc_rsl=nbr_rsl/mss_rsl; // [# kg-1] Specific concentration resolved nbr_spc_rsl@long_name="Specific concentration resolved"; nbr_spc_rsl@units="number kilogram-1"; nco-4.5.4/data/rgr.nco000066400000000000000000000122141264355130400145120ustar00rootroot00000000000000// $Header$ -*-C++-*- // Purpose: Linear and non-linear data regressions /* Usage: Debug: ncap2 -v -O -D 1 -S ${HOME}/nco/data/rgr.nco ${HOME}/nco/data/in.nc ~/foo_rgr.nc Production: ncap2 -v -O -S ${HOME}/nco/data/rgr.nco ${HOME}/nco/data/in.nc ~/foo_rgr.nc /bin/mv ~/foo_rgr.nc ~/rgr_vsb.nc /bin/mv ~/foo_rgr.nc ~/rgr_nir.nc ncap2 -O -s 'measurement=1.515;prediction=fst+slp*measurement;' ~/rgr_vsb.nc ~/rgr_vsb.nc # 20071207b ncap2 -O -s 'xpt_nbr=5;defdim("xpt",xpt_nbr);measurement[xpt]={1.516,1.40,1.513,1.536,1.526};prediction=fst+slp*measurement;' ~/rgr_vsb.nc ~/rgr_vsb.nc # 20071206e (profund porte echantillon) ncap2 -O -s 'xpt_nbr=6;defdim("xpt",xpt_nbr);measurement[xpt]={1.455,1.449,1.528,1.495,1.548,1.438};prediction=fst+slp*measurement;' ~/rgr_vsb.nc ~/rgr_vsb.nc # 20071206d (peu profund porte echantillon) ncap2 -O -s 'measurement=1.545;prediction=fst+slp*measurement;' ~/rgr_vsb.nc ~/rgr_vsb.nc # 20071206c2 ncap2 -O -s 'measurement=8.36;prediction=fst+slp*measurement;' ~/rgr_vsb.nc ~/rgr_vsb.nc # ncap2 -O -s 'measurement=2.95;prediction=fst+slp*measurement;' ~/rgr_nir.nc ~/rgr_nir.nc ncks -C -H -F -v slp,fst,crr_cff ~/rgr_vsb.nc ncks -C -H -F -v slp,fst,crr_cff,measurement,prediction ~/rgr_vsb.nc */ /* Helpful discussion at: http://mathworld.wolfram.com/LeastSquaresFitting.html */ /* Ancillary simulations: ncap2 -v -D 1 -O \ -s 'abc_nbr=5' \ -s 'defdim("sgn",abc_nbr)' \ -s 'sgn_mV[sgn]={4.52,8.90,15.66,22.41,37.86}' \ -s 'rfl[sgn]={9.43,25.68,46.67,65.23,98.5}' \ -s 'abc=sgn_mV;ord=rfl' ~/foo.nc ~/foo_rgr.nc # Normalize mass fractions ncks -C -F -v slp,fst ~/foo_rgr.nc # Answers ncks -C -F -s "%8.3e, " -v slp,fst ~/foo_rgr.nc # Answers formatted */ pi=3.1415926535897932384626433832795029L; // (3.1415926535897932384626433832795029L) [frc] 3 pi@long_name="Pi"; pi@units="fraction"; mss_val=1.0e36; // [frc] Missing value rgr_lnr=1s; // [flg] Linear fit rgr_qdr=0s; // [flg] Quadratic fit chn_vsb=1s; // [flg] Visible channel chn_nir=0s; // [flg] NIR channel // Choose PSD rgr_typ=rgr_lnr; // [enm] Regression type // Choose channel chn_typ=chn_vsb; // [enm] Channel //chn_typ=chn_nir; // [enm] Channel if(rgr_typ==rgr_lnr){ abc_nbr=6; // [nbr] Number of abscissae defdim("sgn_mV",abc_nbr); // [nbr] Measurement dimension if(chn_typ==chn_vsb){ // Visible Channel 635 nm print("Regressing VSB 635 nm channel calibration measurements...\n"); rfl_pct[sgn_mV]={0.28,10.875,30.885,52.12,70.12,98.7}; // [pct] Reflectance // Signal in mV // sgn_mV[sgn_mV]={0.449,1.002,2.664,4.783,6.878,11.257};global@caseid="20071207a: pre-dirty snow"; sgn_mV[sgn_mV]={0.455,0.996,2.653,4.785,mss_val,mss_val};global@caseid="20071206f: post-dirty snow"; // sgn_mV[sgn_mV]={0.412,0.955,2.563,4.655,6.675,10.875};global@caseid="20071206a: pre-dirty snow"; // sgn_mV[sgn_mV]={0.067,0.086,0.140,0.205,0.266,0.388};global@caseid="20071004a: chambre froid -15C"; // sgn_mV[sgn_mV]={mss_val,0.715,2.12,3.91,5.71,9.45};global@caseid="20071001a: warm lab"; } if(chn_typ==chn_nir){ // NIR Channel 1310 nm print("Regressing NIR 1310 nm channel calibration measurements...\n"); rfl_pct[sgn_mV]={mss_val,9.43,25.68,46.67,65.23,98.5}; // [pct] Reflectance sgn_mV[sgn_mV]={4.551,7.070,13.82,24.18,34.60,58.27};global@caseid="20071207c: NIR calibration for dirty snow"; // sgn_mV[sgn_mV]={4.68,7.12,13.83,24.19,34.6,mss_val};global@caseid="20071004: chambre froid -15C"; // sgn_mV[sgn_mV]={2.95,4.52,8.90,15.66,22.41,37.86};global@caseid="20071001: warm lab"; } // print("ERROR: Invalid channel\n"); set_miss(sgn_mV,mss_val); // Missing value set_miss(rfl_pct,mss_val); // Missing value print(global@caseid); // Assign generic names for mathematics abc=sgn_mV; ord=rfl_pct; }else if(rgr_typ==rgr_qdr){ abc_nbr=5; // [nbr] Number of abscissae } // !rgr_typ abc_avg=abc.avg(); // [] Abscissa average ord_avg=ord.avg(); // [] Ordinate average ss_xx=((abc-abc_avg)^2).total(); // [] Sum of squares of deviations from mean abscissa ss_yy=((ord-ord_avg)^2).total(); // [] Sum of squares of deviations from mean ordinate ss_xy=((abc-abc_avg)*(ord-ord_avg)).total(); // [] Covariance var_x=ss_xx/abc_nbr; // [] Variance of abscissae var_y=ss_yy/abc_nbr; // [] Variance of ordinates slp=ss_xy/ss_xx; // [] Slope fst=ord_avg-slp*abc_avg; // [] Offset crr_cff_sqr=ss_xy*ss_xy/(ss_xx*ss_yy); // [] Variance explained crr_cff=sqrt(crr_cff_sqr); // [] Correlation coefficient ord_prd=fst+slp*abc; // [] Ordinates predicted by regression ss_xx@long_name="Sum of squares of deviations from mean abscissa"; ss_yy@long_name="Sum of squares of deviations from mean ordinate"; ss_xy@long_name="Covariance"; var_x@long_name="Variance of abscissae"; var_y@long_name="Variance of ordinates"; slp@long_name="Slope"; fst@long_name="Offset"; crr_cff_sqr@long_name="Variance explained"; crr_cff@long_name="Correlation coefficient"; rfl_pct@long_name="Reflectance"; rfl_pct@units="percent"; rfl=1.0e-2*rfl_pct; // [fraction] Reflectance rfl_pct@long_name="Reflectance"; rfl_pct@units="fraction"; sgn_mV@long_name="Signal in millivolts"; sgn_mV@units="millivolt"; sgn=1.0e-3*sgn_mV; // [V] Signal sgn@long_name="Signal"; sgn@units="volt"; nco-4.5.4/data/snc.cdl000066400000000000000000000171131264355130400144710ustar00rootroot00000000000000netcdf snc { dimensions: time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-04-06T21:56:45Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "a905e243-27f1-4172-93f0-820be7cbecf0" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155645.062" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:56:48Z" ; :history = "Wed Aug 28 15:35:58 2013: ncks -4 -O -v snc snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snc.nc\nSun Dec 30 18:36:26 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:56:48Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20130828" ; :nco_openmp_thread_number = 1 ; data: lat = 0 ; lon = 179.375 ; snc = 61.37692, 60.05015, 58.4291, 52.22442, 45.59546, 38.34413, 33.19439, 32.58879, 36.96843, 46.77308, 55.4712, 60.32861, 61.04955, 60.44368, 57.63164, 52.03623, 44.6402, 37.95646, 33.34058, 32.47639, 35.50756, 46.31984, 53.72991, 58.95955, 60.95681, 61.11084, 57.52742, 51.32803, 45.14587, 40.29467, 33.73788, 32.70026, 37.01862, 45.55758, 54.71373, 59.162, 60.49402, 60.44479, 58.98337, 52.96589, 45.39301, 38.34033, 33.43645, 33.21604, 36.51387, 46.52538, 54.32355, 58.58232, 60.87978, 61.41938, 57.53942, 51.85412, 45.21275, 39.17278, 34.27933, 33.29999, 38.14444, 45.14943, 53.41065, 59.09114, 60.27861, 59.60844, 56.82986, 51.97681, 45.15635, 39.0167, 33.56191, 32.95903, 37.38646, 46.47746, 55.41323, 58.8252, 60.78623, 60.38117, 57.39877, 51.70517, 45.06911, 38.33918, 33.48069, 32.87983, 35.75778, 45.74866, 54.30301, 59.07576, 61.49643, 60.46125, 58.06967, 52.55259, 45.21442, 38.55085, 33.19324, 32.48174, 36.98698, 45.74392, 54.11422, 59.98495, 61.07553, 60.54321, 57.67136, 52.29048, 45.42659, 38.75619, 34.01928, 33.5902, 36.57975, 46.28279, 53.94093, 59.1823, 59.90117, 60.60514, 58.14232, 51.95426, 45.31351, 38.22518, 33.69085, 32.81738, 36.91416, 45.93295, 53.72042, 58.92241, 60.5704, 59.9584, 57.54922, 51.54271, 44.41114, 37.51797, 33.28756, 32.99597, 34.97438, 43.05939, 53.61963, 58.91531, 60.3945, 61.40278, 57.09048, 48.77563, 43.52256, 36.93203, 33.11032, 32.41613, 35.42476, 46.7383, 54.30549, 59.32918, 61.34241, 60.01548, 57.78593, 51.88309, 44.22643, 36.99844, 32.54312, 32.08076, 35.33289, 43.7334, 52.8833, 59.13483, 60.68259, 59.88637, 56.71269, 50.60006, 44.79, 38.0248, 32.8781, 32.3756, 36.24483, 44.34415, 54.8398, 59.24604, 60.13624, 60.5146, 57.35886, 51.2986, 44.53012, 38.94698, 32.69814, 32.66948, 36.62969, 45.27304, 53.99754, 57.90419, 61.03916, 59.86766, 55.66969, 51.11906, 44.3401, 38.34132, 33.50579, 32.66288, 36.10672, 46.07471, 53.37682, 59.08301 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; } nco-4.5.4/data/snc_grp.cdl000066400000000000000000000615301264355130400153430ustar00rootroot00000000000000netcdf snc_grp { // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "a905e243-27f1-4172-93f0-820be7cbecf0" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155645.062" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:56:48Z" ; :history = "Wed Aug 28 15:34:34 2013: ncecat --gag snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc snc_grp.nc\nSun Dec 30 18:36:26 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:56:48Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; :nco_openmp_thread_number = 1 ; group: snc_LImon_CCSM4_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-04-06T21:56:45Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "a905e243-27f1-4172-93f0-820be7cbecf0" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155645.062" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:56:48Z" ; :history = "Sun Dec 30 18:36:26 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:56:48Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 61.37692, 60.05015, 58.4291, 52.22442, 45.59546, 38.34413, 33.19439, 32.58879, 36.96843, 46.77308, 55.4712, 60.32861, 61.04955, 60.44368, 57.63164, 52.03623, 44.6402, 37.95646, 33.34058, 32.47639, 35.50756, 46.31984, 53.72991, 58.95955, 60.95681, 61.11084, 57.52742, 51.32803, 45.14587, 40.29467, 33.73788, 32.70026, 37.01862, 45.55758, 54.71373, 59.162, 60.49402, 60.44479, 58.98337, 52.96589, 45.39301, 38.34033, 33.43645, 33.21604, 36.51387, 46.52538, 54.32355, 58.58232, 60.87978, 61.41938, 57.53942, 51.85412, 45.21275, 39.17278, 34.27933, 33.29999, 38.14444, 45.14943, 53.41065, 59.09114, 60.27861, 59.60844, 56.82986, 51.97681, 45.15635, 39.0167, 33.56191, 32.95903, 37.38646, 46.47746, 55.41323, 58.8252, 60.78623, 60.38117, 57.39877, 51.70517, 45.06911, 38.33918, 33.48069, 32.87983, 35.75778, 45.74866, 54.30301, 59.07576, 61.49643, 60.46125, 58.06967, 52.55259, 45.21442, 38.55085, 33.19324, 32.48174, 36.98698, 45.74392, 54.11422, 59.98495, 61.07553, 60.54321, 57.67136, 52.29048, 45.42659, 38.75619, 34.01928, 33.5902, 36.57975, 46.28279, 53.94093, 59.1823, 59.90117, 60.60514, 58.14232, 51.95426, 45.31351, 38.22518, 33.69085, 32.81738, 36.91416, 45.93295, 53.72042, 58.92241, 60.5704, 59.9584, 57.54922, 51.54271, 44.41114, 37.51797, 33.28756, 32.99597, 34.97438, 43.05939, 53.61963, 58.91531, 60.3945, 61.40278, 57.09048, 48.77563, 43.52256, 36.93203, 33.11032, 32.41613, 35.42476, 46.7383, 54.30549, 59.32918, 61.34241, 60.01548, 57.78593, 51.88309, 44.22643, 36.99844, 32.54312, 32.08076, 35.33289, 43.7334, 52.8833, 59.13483, 60.68259, 59.88637, 56.71269, 50.60006, 44.79, 38.0248, 32.8781, 32.3756, 36.24483, 44.34415, 54.8398, 59.24604, 60.13624, 60.5146, 57.35886, 51.2986, 44.53012, 38.94698, 32.69814, 32.66948, 36.62969, 45.27304, 53.99754, 57.90419, 61.03916, 59.86766, 55.66969, 51.11906, 44.3401, 38.34132, 33.50579, 32.66288, 36.10672, 46.07471, 53.37682, 59.08301 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CCSM4_historical_r1i1p1_199001-200512 group: snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-18T15:38:52Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-CAM5_historical_r0i0p0.nc areacella: areacella_fx_CESM1-CAM5_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-CAM5" ; :model_id = "CESM1-CAM5" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 2. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Neale, R., et.al. 2012: Coupled simulations from CESM1 using the Community Atmosphere Model version 5: (CAM5). See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2ee6c8fd-9752-4455-bed3-576a01e9fed6" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. This research used resources of the Oak Ridge Leadership Computing Facility, located in the National Center for Computational Sciences at Oak Ridge National Laboratory, which is supported by the Office of Science (BER) of the Department of Energy under Contract DE-AC05-00OR22725." ; :cesm_casename = "b40_20th_1d_b08c5cn_138j" ; :cesm_repotag = "cesm1_0_beta08" ; :cesm_compset = "B20TRC5CN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120518 -093852.130" ; :processing_code_information = "Last Changed Rev: 776 Last Changed Date: 2012-05-17 09:36:52 -0600 (Thu, 17 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-18T15:38:54Z" ; :history = "Sun Dec 30 19:53:35 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-CAM5_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc\n2012-05-18T15:38:54Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-CAM5 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 62.07145, 60.97509, 57.9104, 53.65452, 46.13708, 39.71951, 34.45684, 33.34816, 36.30897, 45.20145, 54.7042, 60.06191, 61.81068, 61.57235, 58.69954, 53.0875, 44.43778, 38.41296, 33.89512, 33.16334, 35.38866, 44.20527, 55.24973, 60.42582, 61.78408, 60.30222, 57.74767, 51.87217, 45.43856, 39.859, 34.65273, 33.69739, 35.79815, 45.94585, 55.98174, 60.11427, 62.11591, 61.35354, 58.43501, 52.39944, 45.27255, 38.83994, 34.82337, 33.47124, 35.81379, 46.57481, 54.41116, 60.62625, 62.25172, 61.1827, 58.42628, 52.6358, 45.15274, 38.88607, 33.73675, 33.29869, 35.76462, 43.97408, 55.61646, 60.97946, 62.00888, 60.70457, 57.56046, 51.62181, 45.01118, 38.69769, 33.83691, 33.11338, 35.41447, 44.51177, 54.35133, 59.83762, 61.02993, 61.28046, 58.4234, 52.3585, 45.51928, 39.02513, 34.5911, 33.34881, 35.93228, 45.4144, 53.66666, 59.19072, 62.61044, 60.99728, 58.37831, 53.53175, 46.06737, 38.39714, 34.13896, 33.22199, 35.57574, 45.33149, 55.18364, 60.08348, 62.00661, 60.72526, 58.49016, 52.98635, 45.39072, 39.37619, 34.2319, 33.21686, 35.65197, 46.41065, 54.66462, 60.34342, 61.5855, 60.53594, 58.07879, 53.05131, 45.6369, 38.99934, 33.72679, 33.10427, 34.7771, 44.55233, 55.62511, 59.83138, 61.37432, 60.32346, 57.32902, 52.26272, 45.0841, 38.28241, 33.7456, 33.1823, 35.83283, 45.20584, 54.09948, 60.86015, 62.31863, 61.09036, 58.49607, 52.52017, 45.4707, 39.66387, 34.60744, 33.46476, 36.29692, 47.46539, 54.06594, 59.21001, 61.56113, 61.5031, 58.06651, 52.88129, 45.14191, 38.97267, 33.80598, 33.34988, 36.13751, 45.83525, 54.13206, 59.95444, 61.17745, 60.35199, 58.45913, 52.94626, 45.55574, 38.65861, 33.37043, 32.96347, 35.39613, 46.5092, 55.11117, 58.78823, 61.00055, 60.24277, 57.43545, 52.00771, 45.43082, 39.07673, 33.98228, 32.92905, 35.72621, 45.6367, 55.0639, 60.17884, 62.44907, 61.56859, 58.70348, 51.78551, 44.38303, 38.12561, 34.06507, 32.99229, 35.49913, 46.25829, 54.67482, 61.06555 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 } nco-4.5.4/data/snc_ncwa.cdl000066400000000000000000002123121264355130400154770ustar00rootroot00000000000000netcdf snc_ncwa { // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "a905e243-27f1-4172-93f0-820be7cbecf0" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155645.062" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:56:48Z" ; :history = "Tue Aug 27 14:54:01 2013: ncecat --gag snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snc_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512.nc snc_LImon_CESM1-BGC_historical_r1i1p1_199001-200512.nc snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc snc_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512.nc snc_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512.nc snc.nc\nSun Dec 30 18:36:26 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:56:48Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; :nco_openmp_thread_number = 1 ; group: snc_LImon_CCSM4_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-04-06T21:56:45Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "a905e243-27f1-4172-93f0-820be7cbecf0" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155645.062" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:56:48Z" ; :history = "Sun Dec 30 18:36:26 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:56:48Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 61.37692, 60.05015, 58.4291, 52.22442, 45.59546, 38.34413, 33.19439, 32.58879, 36.96843, 46.77308, 55.4712, 60.32861, 61.04955, 60.44368, 57.63164, 52.03623, 44.6402, 37.95646, 33.34058, 32.47639, 35.50756, 46.31984, 53.72991, 58.95955, 60.95681, 61.11084, 57.52742, 51.32803, 45.14587, 40.29467, 33.73788, 32.70026, 37.01862, 45.55758, 54.71373, 59.162, 60.49402, 60.44479, 58.98337, 52.96589, 45.39301, 38.34033, 33.43645, 33.21604, 36.51387, 46.52538, 54.32355, 58.58232, 60.87978, 61.41938, 57.53942, 51.85412, 45.21275, 39.17278, 34.27933, 33.29999, 38.14444, 45.14943, 53.41065, 59.09114, 60.27861, 59.60844, 56.82986, 51.97681, 45.15635, 39.0167, 33.56191, 32.95903, 37.38646, 46.47746, 55.41323, 58.8252, 60.78623, 60.38117, 57.39877, 51.70517, 45.06911, 38.33918, 33.48069, 32.87983, 35.75778, 45.74866, 54.30301, 59.07576, 61.49643, 60.46125, 58.06967, 52.55259, 45.21442, 38.55085, 33.19324, 32.48174, 36.98698, 45.74392, 54.11422, 59.98495, 61.07553, 60.54321, 57.67136, 52.29048, 45.42659, 38.75619, 34.01928, 33.5902, 36.57975, 46.28279, 53.94093, 59.1823, 59.90117, 60.60514, 58.14232, 51.95426, 45.31351, 38.22518, 33.69085, 32.81738, 36.91416, 45.93295, 53.72042, 58.92241, 60.5704, 59.9584, 57.54922, 51.54271, 44.41114, 37.51797, 33.28756, 32.99597, 34.97438, 43.05939, 53.61963, 58.91531, 60.3945, 61.40278, 57.09048, 48.77563, 43.52256, 36.93203, 33.11032, 32.41613, 35.42476, 46.7383, 54.30549, 59.32918, 61.34241, 60.01548, 57.78593, 51.88309, 44.22643, 36.99844, 32.54312, 32.08076, 35.33289, 43.7334, 52.8833, 59.13483, 60.68259, 59.88637, 56.71269, 50.60006, 44.79, 38.0248, 32.8781, 32.3756, 36.24483, 44.34415, 54.8398, 59.24604, 60.13624, 60.5146, 57.35886, 51.2986, 44.53012, 38.94698, 32.69814, 32.66948, 36.62969, 45.27304, 53.99754, 57.90419, 61.03916, 59.86766, 55.66969, 51.11906, 44.3401, 38.34132, 33.50579, 32.66288, 36.10672, 46.07471, 53.37682, 59.08301 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CCSM4_historical_r1i1p1_199001-200512 group: snc_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-09T19:56:59Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-BGC_esmHistorical_r0i0p0.nc areacella: areacella_fx_CESM1-BGC_esmHistorical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "esmHistorical" ; :source = "CESM1-BGC" ; :model_id = "CESM1-BGC" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD\n See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "c763c1db-4d63-4268-aa34-b1a9ca11cb75" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.coup.001" ; :cesm_repotag = "unknown" ; :cesm_compset = "unknown" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120509 -135659.177" ; :processing_code_information = "Last Changed Rev: 757 Last Changed Date: 2012-05-09 13:01:12 -0600 (Wed, 09 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "ESM historical" ; :frequency = "mon" ; :creation_date = "2012-05-09T19:57:12Z" ; :history = "Sun Dec 30 18:37:17 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-BGC_esmHistorical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512.nc\n2012-05-09T19:57:12Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-BGC model output prepared for CMIP5 ESM historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 60.42937, 60.64738, 57.30071, 51.4353, 45.43332, 39.52806, 34.66951, 33.13662, 36.25096, 46.04024, 53.33717, 59.30924, 60.99267, 59.43881, 57.94574, 51.67841, 44.91564, 39.39613, 34.42404, 33.53218, 36.72351, 47.10626, 54.4623, 58.49553, 59.56153, 59.97334, 57.89266, 52.57605, 45.66745, 38.9083, 34.23455, 34.08851, 38.44006, 47.2091, 55.48892, 60.75134, 61.30203, 61.29112, 60.0729, 54.08234, 46.12404, 38.92447, 34.04529, 33.68865, 37.31947, 45.64073, 55.82588, 60.10115, 61.4198, 59.77499, 56.8927, 51.5806, 45.45844, 38.9374, 34.54553, 33.49256, 36.34779, 46.30656, 53.9354, 58.88356, 60.45415, 60.14672, 57.57286, 52.50472, 46.36785, 39.8609, 33.63399, 33.20422, 35.44655, 44.78173, 53.92061, 59.74142, 60.50524, 60.10552, 58.04763, 51.95174, 45.57401, 39.92517, 34.07393, 33.18673, 36.03875, 46.52081, 54.78568, 59.38622, 60.48057, 59.2347, 56.71712, 52.24715, 46.07843, 38.27985, 33.38749, 33.0439, 35.73171, 45.55057, 53.66148, 58.66822, 61.14587, 61.68203, 57.431, 50.35966, 44.36692, 38.19395, 33.53297, 33.26769, 35.39089, 45.34281, 54.08255, 59.35721, 61.94003, 60.47675, 56.81584, 51.78187, 45.66067, 39.36295, 33.72239, 33.26345, 36.18309, 44.39331, 52.50751, 59.50554, 61.95173, 60.64665, 57.34688, 51.2981, 45.21524, 38.18364, 33.42353, 32.79172, 35.11573, 43.63971, 53.21791, 58.21271, 59.6288, 61.27858, 56.47172, 50.35821, 43.80642, 37.97486, 33.80445, 33.41068, 35.89848, 46.58085, 54.50834, 59.01017, 61.5377, 60.76017, 57.91518, 51.82125, 43.89352, 38.06473, 33.38121, 32.91643, 35.2864, 45.38606, 53.46272, 59.2138, 60.37124, 59.06458, 55.75334, 50.40107, 44.48877, 38.5047, 33.78501, 33.20532, 36.02801, 43.41591, 53.39999, 58.97802, 60.57231, 59.36517, 55.10088, 49.68346, 44.11604, 38.80204, 33.5981, 32.79944, 36.32286, 44.73896, 53.55066, 58.98016, 60.80568, 59.11828, 55.20478, 50.08527, 44.43622, 38.27273, 33.41451, 32.98672, 35.45163, 44.04631, 52.83684, 59.77518 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512 group: snc_LImon_CESM1-BGC_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-09T19:57:50Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-BGC_historical_r0i0p0.nc areacella: areacella_fx_CESM1-BGC_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-BGC" ; :model_id = "CESM1-BGC" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD\n See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "1b9bc30c-5957-4e3f-999f-0a28b5f60139" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.bdrd.001" ; :cesm_repotag = "unknown" ; :cesm_compset = "unknown" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120509 -135750.546" ; :processing_code_information = "Last Changed Rev: 757 Last Changed Date: 2012-05-09 13:01:12 -0600 (Wed, 09 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-09T19:58:05Z" ; :history = "Thu Jan 24 16:59:20 2013: ncks -d time,1990-01-01 00:00:0.0, snc_LImon_CESM1-BGC_historical_r1i1p1_185001-200512.nc snc_LImon_CESM1-BGC_historical_r1i1p1_199001-200512.nc\n2012-05-09T19:58:05Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-BGC model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20130125" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 60.81151, 60.83581, 57.40618, 50.77258, 45.05299, 38.55186, 33.70737, 33.04415, 35.72379, 47.15994, 53.97527, 58.59232, 62.0451, 60.02757, 57.57421, 52.67574, 45.38245, 38.96038, 33.7025, 33.30761, 36.09553, 45.33242, 53.43705, 59.69139, 60.2207, 59.44222, 57.08393, 51.60577, 45.91001, 40.35986, 35.51391, 33.55119, 37.95975, 46.05239, 55.25557, 60.17647, 61.67732, 61.58868, 57.89724, 51.44344, 45.45924, 39.27931, 33.92011, 33.49309, 37.62573, 45.77045, 54.64713, 60.00785, 62.98378, 60.98982, 57.44807, 53.21042, 45.43661, 38.67152, 33.94413, 33.15783, 35.94777, 44.61528, 54.27599, 58.80817, 61.2307, 59.79439, 57.08263, 50.52497, 44.07899, 38.27042, 33.51943, 32.94697, 35.40871, 45.28115, 53.79686, 59.03689, 60.84576, 59.65984, 57.90582, 52.30964, 45.07834, 39.25048, 33.8819, 33.14655, 35.57959, 44.89124, 54.50274, 58.59656, 60.65822, 59.59388, 56.29368, 50.73042, 43.93979, 37.35862, 33.44497, 32.98347, 36.43193, 44.7622, 54.04124, 58.71893, 59.85044, 60.0969, 57.5133, 51.66403, 45.28492, 38.6044, 34.07675, 33.54704, 36.35543, 43.59683, 52.81324, 59.19917, 62.49909, 59.65298, 55.79979, 51.49189, 46.20795, 39.5049, 34.17224, 33.11736, 37.46117, 44.75187, 53.72094, 59.15183, 61.0971, 59.81115, 56.52975, 51.89294, 45.86815, 38.33873, 33.06678, 32.81318, 35.49161, 45.98712, 53.63966, 59.74233, 61.00092, 61.10449, 57.47633, 51.74292, 45.13937, 37.65129, 33.35644, 33.50973, 35.10047, 44.06165, 54.06438, 60.30418, 61.70724, 61.21657, 58.94371, 52.51987, 45.48262, 38.52264, 33.92553, 32.91373, 35.71524, 46.23709, 53.22155, 58.81511, 59.43888, 59.1026, 56.43563, 50.23117, 43.67832, 37.89594, 33.47663, 32.65866, 35.80147, 45.50639, 52.66769, 58.6243, 60.40725, 59.98502, 57.12119, 51.65089, 45.57036, 38.15372, 32.98792, 32.49368, 35.69475, 45.33248, 52.4259, 57.92989, 60.0364, 59.07898, 56.09073, 50.74621, 43.55686, 37.64441, 33.23428, 32.99554, 36.66736, 44.9342, 54.54264, 58.61319 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-BGC_historical_r1i1p1_199001-200512 group: snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-18T15:38:52Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-CAM5_historical_r0i0p0.nc areacella: areacella_fx_CESM1-CAM5_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-CAM5" ; :model_id = "CESM1-CAM5" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 2. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Neale, R., et.al. 2012: Coupled simulations from CESM1 using the Community Atmosphere Model version 5: (CAM5). See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2ee6c8fd-9752-4455-bed3-576a01e9fed6" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. This research used resources of the Oak Ridge Leadership Computing Facility, located in the National Center for Computational Sciences at Oak Ridge National Laboratory, which is supported by the Office of Science (BER) of the Department of Energy under Contract DE-AC05-00OR22725." ; :cesm_casename = "b40_20th_1d_b08c5cn_138j" ; :cesm_repotag = "cesm1_0_beta08" ; :cesm_compset = "B20TRC5CN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120518 -093852.130" ; :processing_code_information = "Last Changed Rev: 776 Last Changed Date: 2012-05-17 09:36:52 -0600 (Thu, 17 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-18T15:38:54Z" ; :history = "Sun Dec 30 19:53:35 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-CAM5_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc\n2012-05-18T15:38:54Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-CAM5 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 62.07145, 60.97509, 57.9104, 53.65452, 46.13708, 39.71951, 34.45684, 33.34816, 36.30897, 45.20145, 54.7042, 60.06191, 61.81068, 61.57235, 58.69954, 53.0875, 44.43778, 38.41296, 33.89512, 33.16334, 35.38866, 44.20527, 55.24973, 60.42582, 61.78408, 60.30222, 57.74767, 51.87217, 45.43856, 39.859, 34.65273, 33.69739, 35.79815, 45.94585, 55.98174, 60.11427, 62.11591, 61.35354, 58.43501, 52.39944, 45.27255, 38.83994, 34.82337, 33.47124, 35.81379, 46.57481, 54.41116, 60.62625, 62.25172, 61.1827, 58.42628, 52.6358, 45.15274, 38.88607, 33.73675, 33.29869, 35.76462, 43.97408, 55.61646, 60.97946, 62.00888, 60.70457, 57.56046, 51.62181, 45.01118, 38.69769, 33.83691, 33.11338, 35.41447, 44.51177, 54.35133, 59.83762, 61.02993, 61.28046, 58.4234, 52.3585, 45.51928, 39.02513, 34.5911, 33.34881, 35.93228, 45.4144, 53.66666, 59.19072, 62.61044, 60.99728, 58.37831, 53.53175, 46.06737, 38.39714, 34.13896, 33.22199, 35.57574, 45.33149, 55.18364, 60.08348, 62.00661, 60.72526, 58.49016, 52.98635, 45.39072, 39.37619, 34.2319, 33.21686, 35.65197, 46.41065, 54.66462, 60.34342, 61.5855, 60.53594, 58.07879, 53.05131, 45.6369, 38.99934, 33.72679, 33.10427, 34.7771, 44.55233, 55.62511, 59.83138, 61.37432, 60.32346, 57.32902, 52.26272, 45.0841, 38.28241, 33.7456, 33.1823, 35.83283, 45.20584, 54.09948, 60.86015, 62.31863, 61.09036, 58.49607, 52.52017, 45.4707, 39.66387, 34.60744, 33.46476, 36.29692, 47.46539, 54.06594, 59.21001, 61.56113, 61.5031, 58.06651, 52.88129, 45.14191, 38.97267, 33.80598, 33.34988, 36.13751, 45.83525, 54.13206, 59.95444, 61.17745, 60.35199, 58.45913, 52.94626, 45.55574, 38.65861, 33.37043, 32.96347, 35.39613, 46.5092, 55.11117, 58.78823, 61.00055, 60.24277, 57.43545, 52.00771, 45.43082, 39.07673, 33.98228, 32.92905, 35.72621, 45.6367, 55.0639, 60.17884, 62.44907, 61.56859, 58.70348, 51.78551, 44.38303, 38.12561, 34.06507, 32.99229, 35.49913, 46.25829, 54.67482, 61.06555 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 group: snc_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-17T14:29:14Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-FASTCHEM_historical_r0i0p0.nc areacella: areacella_fx_CESM1-FASTCHEM_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-FASTCHEM" ; :model_id = "CESM1-FASTCHEM" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 0. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "6b2ee7c3-9fd1-41e8-81d3-363f5f40b846" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.fschem.002" ; :cesm_repotag = "ccsm4_0_beta55" ; :cesm_compset = "B20TRCNCHM" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120517 -082914.590" ; :processing_code_information = "Last Changed Rev: 774 Last Changed Date: 2012-05-16 16:39:53 -0600 (Wed, 16 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-17T14:29:16Z" ; :history = "Sun Dec 30 18:44:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/atmos-his/snc_LImon_CESM1-FASTCHEM_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/atmos-his/snc_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512.nc\n2012-05-17T14:29:16Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-FASTCHEM model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snc = 61.35922, 60.11757, 56.77606, 51.86809, 44.5789, 38.14515, 33.07576, 33.10382, 36.08701, 44.22195, 53.31831, 58.38189, 61.49045, 61.94424, 57.49084, 51.4422, 45.94965, 39.01295, 33.63499, 32.85659, 37.11253, 44.66447, 53.68621, 59.86607, 60.47795, 60.76228, 56.93726, 51.28774, 44.71006, 38.61081, 33.86168, 33.20221, 36.73127, 47.33617, 56.14992, 59.57047, 61.68317, 60.56863, 57.71325, 52.03714, 45.42717, 37.95629, 34.18681, 33.22436, 37.29691, 46.26162, 54.90151, 60.79268, 61.64498, 61.18701, 58.2198, 51.28855, 44.98966, 38.63614, 33.35585, 32.91083, 36.14466, 44.34061, 55.25936, 59.61454, 60.81066, 59.89703, 56.78886, 51.34318, 44.89197, 37.97543, 33.65519, 32.92331, 34.96158, 46.80618, 54.58622, 60.04884, 62.42439, 61.58648, 58.25958, 52.32566, 44.83265, 37.18033, 33.52879, 33.03136, 36.15388, 46.12405, 53.96253, 59.95536, 60.54895, 58.84748, 56.34169, 50.48568, 43.52483, 38.12297, 33.95269, 33.15511, 35.92193, 43.6329, 54.4885, 58.7534, 59.50955, 59.38222, 56.4384, 50.68229, 44.19793, 37.82106, 33.37074, 33.17641, 36.68989, 44.85901, 53.11116, 57.75417, 60.42802, 59.57334, 56.00442, 50.08305, 43.97726, 38.49365, 33.53299, 32.87168, 35.67901, 45.14764, 53.06521, 58.36853, 60.57628, 59.72157, 56.75367, 50.25916, 43.97816, 38.27824, 33.78714, 33.07768, 35.71507, 43.82384, 53.86621, 59.8281, 62.98288, 60.35318, 56.95187, 50.56234, 44.47134, 37.65242, 33.04737, 32.78938, 35.73754, 45.56456, 53.15977, 58.71597, 59.50213, 59.8814, 57.11369, 51.297, 45.74558, 38.31946, 33.30605, 32.88755, 35.60548, 43.45373, 53.75446, 58.68278, 59.57464, 59.02721, 56.63763, 51.11911, 43.58306, 36.49274, 33.1369, 32.70171, 35.42366, 45.84877, 52.81328, 58.69426, 60.35154, 58.81255, 56.24924, 51.00918, 44.1529, 38.16121, 33.06249, 32.81034, 35.65083, 44.37822, 52.15639, 59.87329, 61.16865, 60.83504, 56.66895, 51.41212, 43.97941, 37.59834, 33.35089, 32.66173, 34.87273, 44.44268, 52.47154, 58.85749 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512 group: snc_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snc(time) ; snc:standard_name = "surface_snow_area_fraction" ; snc:long_name = "Snow Area Fraction" ; snc:comment = "FSNO, CMIP5_table_comment: Fraction of each grid cell that is occupied by snow that rests on land portion of cell." ; snc:units = "%" ; snc:original_name = "FSNO" ; snc:cell_methods = "time: mean (interval: 30 days)" ; snc:cell_measures = "area: areacella" ; snc:history = "2012-05-31T13:28:20Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snc:missing_value = 1.e+20f ; snc:_FillValue = 1.e+20f ; snc:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-WACCM_historical_r0i0p0.nc areacella: areacella_fx_CESM1-WACCM_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-WACCM" ; :model_id = "CESM1-WACCM" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Marsh, D., et.al. 2012: WACCM4 simulations of atmospheric trends from 1850 to present. See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "ef93cac6-c5d8-4b32-9ff0-9cbd27d8e66a" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.2deg.wcm.007" ; :cesm_repotag = "ccsm4_0_beta52" ; :cesm_compset = "BW20TRCN" ; :resolution = "f19_g16 (1.9x2.5_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on mirage3 at 20120531 -072820.637" ; :processing_code_information = "Last Changed Rev: 820 Last Changed Date: 2012-05-30 15:07:51 -0600 (Wed, 30 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-31T13:28:21Z" ; :history = "Sun Dec 30 18:44:48 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/atmos-his/snc_LImon_CESM1-WACCM_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/atmos-his/snc_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512.nc\n2012-05-31T13:28:21Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-WACCM model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.9375, 0.9375 ; lon = 178.75 ; lon_bnds = 177.508680555556, 180 ; snc = 58.30264, 57.57164, 55.40315, 51.30324, 44.92303, 38.5704, 34.73244, 33.40054, 36.39927, 44.70775, 52.15816, 56.68031, 58.03102, 57.54689, 55.26139, 50.4637, 43.77814, 37.38792, 33.62425, 33.55622, 36.64553, 45.27554, 52.15833, 58.00319, 60.39744, 60.92056, 57.63554, 49.88797, 43.92668, 38.43521, 34.53812, 33.3124, 35.9039, 44.06456, 52.36027, 57.0512, 58.79975, 58.51964, 56.20938, 51.16467, 44.37978, 36.94592, 33.22895, 33.14706, 36.17453, 45.27049, 52.18351, 57.12118, 59.51681, 58.67272, 55.35041, 49.88683, 44.25735, 38.44041, 33.5755, 32.74223, 35.94821, 45.38294, 52.94146, 57.9625, 59.15063, 58.10602, 55.73347, 50.96825, 44.56723, 38.10284, 33.3599, 32.98213, 35.90267, 43.69198, 53.58926, 58.14558, 59.82616, 58.78763, 56.74655, 51.95066, 45.35992, 36.72455, 32.72494, 32.69721, 35.77222, 44.46194, 52.06679, 56.87531, 59.6659, 58.29536, 54.9007, 49.42334, 43.95756, 36.97405, 33.28221, 32.84733, 35.55394, 44.29796, 52.48971, 57.30995, 58.13997, 57.98017, 55.87465, 50.05117, 43.26404, 36.44524, 33.10003, 32.76156, 35.33764, 43.94565, 51.96738, 57.09196, 58.89738, 58.25306, 56.59516, 52.6945, 44.78914, 37.78814, 32.69427, 32.55199, 36.63308, 45.10502, 52.95998, 58.76827, 60.31608, 58.63898, 56.55276, 51.78586, 44.54252, 37.68716, 33.18846, 32.67733, 35.96641, 44.42927, 52.38469, 57.34024, 58.62802, 58.19473, 54.8047, 48.94669, 42.90043, 37.16561, 33.53363, 32.7061, 35.18901, 43.03574, 51.86749, 57.74329, 60.09589, 60.36689, 57.27032, 50.42865, 44.00283, 37.74604, 33.42166, 32.72996, 35.66089, 43.93026, 51.86792, 56.20585, 59.0007, 56.74605, 55.26267, 50.96566, 44.89715, 39.17544, 33.97953, 33.06948, 35.02919, 41.76595, 51.58342, 57.55459, 59.76404, 59.17727, 56.35314, 51.4416, 44.05042, 37.53273, 33.42004, 33.01108, 35.84677, 44.90015, 52.5538, 57.30947, 60.00209, 59.43186, 55.75416, 50.16666, 42.99211, 37.32963, 33.30409, 32.98776, 34.92936, 42.45069, 51.19328, 58.13653 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snc_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512 } nco-4.5.4/data/snd.cdl000066400000000000000000000177101264355130400144750ustar00rootroot00000000000000netcdf snd { dimensions: time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-04-06T21:57:06Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2d733abb-3a88-4669-8961-fa994c714e0f" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155706.724" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:57:07Z" ; :history = "Wed Aug 28 15:36:35 2013: ncks -4 -O -v snd snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snd.nc\nSun Dec 30 18:37:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:57:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20130828" ; :nco_openmp_thread_number = 1 ; data: lat = 0 ; lon = 179.375 ; snd = 0.2724146, 0.2805385, 0.2834768, 0.2745424, 0.2557565, 0.2344869, 0.2219715, 0.2190395, 0.2220945, 0.2319131, 0.2463375, 0.2607701, 0.2692722, 0.2770566, 0.2791537, 0.270516, 0.2546696, 0.2335674, 0.2220806, 0.2187323, 0.2211094, 0.2305807, 0.245944, 0.2600244, 0.271029, 0.279032, 0.2794289, 0.2702961, 0.2552496, 0.237448, 0.2218089, 0.2197413, 0.2226625, 0.2303976, 0.2442853, 0.2594771, 0.2717321, 0.2789153, 0.2786778, 0.2703565, 0.2531038, 0.2326569, 0.2209008, 0.219136, 0.2223255, 0.2321512, 0.2464486, 0.2593269, 0.2708381, 0.2783013, 0.2802042, 0.2727805, 0.2562031, 0.2376942, 0.2238919, 0.220717, 0.2240804, 0.2324936, 0.2460135, 0.2600223, 0.2709923, 0.2776637, 0.2802023, 0.2731161, 0.257625, 0.2380173, 0.2234037, 0.2204858, 0.2234626, 0.2327554, 0.2484348, 0.2632856, 0.2738608, 0.2827595, 0.2846874, 0.2719233, 0.2554669, 0.2337054, 0.2223311, 0.219457, 0.2217831, 0.2305832, 0.2449607, 0.2592558, 0.2693018, 0.2794678, 0.2849715, 0.2747917, 0.2536268, 0.2352346, 0.2220949, 0.2188839, 0.221791, 0.2320456, 0.2468438, 0.2612689, 0.2724337, 0.2812943, 0.2816801, 0.2718139, 0.2545425, 0.2339947, 0.2233207, 0.220883, 0.2228399, 0.2329358, 0.2485441, 0.262383, 0.2728364, 0.2801743, 0.2834518, 0.2755635, 0.2572154, 0.23524, 0.2241858, 0.2201564, 0.2231563, 0.2329302, 0.2466877, 0.2606887, 0.2712987, 0.2797104, 0.280265, 0.270669, 0.2512513, 0.2314375, 0.2210067, 0.2190172, 0.2205743, 0.2274242, 0.2413106, 0.2553834, 0.2651053, 0.2752735, 0.2759885, 0.2626066, 0.2487948, 0.2309431, 0.2209402, 0.2188502, 0.2205875, 0.2297206, 0.2438147, 0.2585448, 0.2680849, 0.2761216, 0.2784539, 0.2673648, 0.2469543, 0.2282923, 0.2180633, 0.2160996, 0.2179174, 0.2250961, 0.2379094, 0.2522934, 0.264903, 0.272292, 0.2732264, 0.265145, 0.2500148, 0.2297041, 0.2185939, 0.2163664, 0.2192902, 0.2271949, 0.2400659, 0.2554764, 0.266905, 0.2749299, 0.2785495, 0.2679975, 0.2518781, 0.2328067, 0.2180953, 0.2168675, 0.2205294, 0.2292409, 0.2434324, 0.2566255, 0.2681567, 0.2755063, 0.2762004, 0.2689444, 0.2509382, 0.232049, 0.2202254, 0.2178997, 0.2200232, 0.2298912, 0.2441406, 0.2583995 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; } nco-4.5.4/data/snd_grp.cdl000066400000000000000000000631321264355130400153440ustar00rootroot00000000000000netcdf snd_grp { // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2d733abb-3a88-4669-8961-fa994c714e0f" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155706.724" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:57:07Z" ; :history = "Wed Aug 28 15:34:50 2013: ncecat --gag snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc snd_grp.nc\nSun Dec 30 18:37:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:57:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; :nco_openmp_thread_number = 1 ; group: snd_LImon_CCSM4_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-04-06T21:57:06Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2d733abb-3a88-4669-8961-fa994c714e0f" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155706.724" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:57:07Z" ; :history = "Sun Dec 30 18:37:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:57:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.2724146, 0.2805385, 0.2834768, 0.2745424, 0.2557565, 0.2344869, 0.2219715, 0.2190395, 0.2220945, 0.2319131, 0.2463375, 0.2607701, 0.2692722, 0.2770566, 0.2791537, 0.270516, 0.2546696, 0.2335674, 0.2220806, 0.2187323, 0.2211094, 0.2305807, 0.245944, 0.2600244, 0.271029, 0.279032, 0.2794289, 0.2702961, 0.2552496, 0.237448, 0.2218089, 0.2197413, 0.2226625, 0.2303976, 0.2442853, 0.2594771, 0.2717321, 0.2789153, 0.2786778, 0.2703565, 0.2531038, 0.2326569, 0.2209008, 0.219136, 0.2223255, 0.2321512, 0.2464486, 0.2593269, 0.2708381, 0.2783013, 0.2802042, 0.2727805, 0.2562031, 0.2376942, 0.2238919, 0.220717, 0.2240804, 0.2324936, 0.2460135, 0.2600223, 0.2709923, 0.2776637, 0.2802023, 0.2731161, 0.257625, 0.2380173, 0.2234037, 0.2204858, 0.2234626, 0.2327554, 0.2484348, 0.2632856, 0.2738608, 0.2827595, 0.2846874, 0.2719233, 0.2554669, 0.2337054, 0.2223311, 0.219457, 0.2217831, 0.2305832, 0.2449607, 0.2592558, 0.2693018, 0.2794678, 0.2849715, 0.2747917, 0.2536268, 0.2352346, 0.2220949, 0.2188839, 0.221791, 0.2320456, 0.2468438, 0.2612689, 0.2724337, 0.2812943, 0.2816801, 0.2718139, 0.2545425, 0.2339947, 0.2233207, 0.220883, 0.2228399, 0.2329358, 0.2485441, 0.262383, 0.2728364, 0.2801743, 0.2834518, 0.2755635, 0.2572154, 0.23524, 0.2241858, 0.2201564, 0.2231563, 0.2329302, 0.2466877, 0.2606887, 0.2712987, 0.2797104, 0.280265, 0.270669, 0.2512513, 0.2314375, 0.2210067, 0.2190172, 0.2205743, 0.2274242, 0.2413106, 0.2553834, 0.2651053, 0.2752735, 0.2759885, 0.2626066, 0.2487948, 0.2309431, 0.2209402, 0.2188502, 0.2205875, 0.2297206, 0.2438147, 0.2585448, 0.2680849, 0.2761216, 0.2784539, 0.2673648, 0.2469543, 0.2282923, 0.2180633, 0.2160996, 0.2179174, 0.2250961, 0.2379094, 0.2522934, 0.264903, 0.272292, 0.2732264, 0.265145, 0.2500148, 0.2297041, 0.2185939, 0.2163664, 0.2192902, 0.2271949, 0.2400659, 0.2554764, 0.266905, 0.2749299, 0.2785495, 0.2679975, 0.2518781, 0.2328067, 0.2180953, 0.2168675, 0.2205294, 0.2292409, 0.2434324, 0.2566255, 0.2681567, 0.2755063, 0.2762004, 0.2689444, 0.2509382, 0.232049, 0.2202254, 0.2178997, 0.2200232, 0.2298912, 0.2441406, 0.2583995 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CCSM4_historical_r1i1p1_199001-200512 group: snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-18T15:39:16Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-CAM5_historical_r0i0p0.nc areacella: areacella_fx_CESM1-CAM5_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-CAM5" ; :model_id = "CESM1-CAM5" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 2. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Neale, R., et.al. 2012: Coupled simulations from CESM1 using the Community Atmosphere Model version 5: (CAM5). See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "76783d9a-c5da-46c0-bc92-51c6cc1be100" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. This research used resources of the Oak Ridge Leadership Computing Facility, located in the National Center for Computational Sciences at Oak Ridge National Laboratory, which is supported by the Office of Science (BER) of the Department of Energy under Contract DE-AC05-00OR22725." ; :cesm_casename = "b40_20th_1d_b08c5cn_138j" ; :cesm_repotag = "cesm1_0_beta08" ; :cesm_compset = "B20TRC5CN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120518 -093916.416" ; :processing_code_information = "Last Changed Rev: 776 Last Changed Date: 2012-05-17 09:36:52 -0600 (Thu, 17 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-18T15:39:18Z" ; :history = "Sun Dec 30 19:53:37 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-CAM5_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc\n2012-05-18T15:39:18Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-CAM5 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.256985, 0.2632169, 0.2638666, 0.2571382, 0.2397551, 0.2226972, 0.2117357, 0.2092562, 0.2110159, 0.2187275, 0.232471, 0.2451041, 0.25559, 0.262308, 0.263666, 0.2530842, 0.2354192, 0.219715, 0.2109925, 0.2091601, 0.2101545, 0.2170589, 0.2314613, 0.2463234, 0.2565176, 0.2618284, 0.2628052, 0.2544692, 0.2387005, 0.2239094, 0.2126885, 0.2100891, 0.2110389, 0.2183972, 0.2327309, 0.2458724, 0.256275, 0.2631488, 0.2623489, 0.2537029, 0.238484, 0.2220767, 0.2126471, 0.2098042, 0.211005, 0.2187067, 0.2322753, 0.2455713, 0.2557092, 0.2640642, 0.2651167, 0.2535568, 0.2382084, 0.2209739, 0.2110021, 0.2091861, 0.2104682, 0.217094, 0.2318764, 0.2454598, 0.2558737, 0.262004, 0.2621183, 0.251463, 0.2369802, 0.2199399, 0.2108326, 0.2090928, 0.2101073, 0.2165558, 0.2288471, 0.2424463, 0.2511085, 0.2579598, 0.259104, 0.2501604, 0.2355066, 0.2208411, 0.212263, 0.2098267, 0.2107716, 0.2182428, 0.2311743, 0.2435891, 0.2561887, 0.2622698, 0.263788, 0.2558271, 0.2375138, 0.219795, 0.2111067, 0.2092032, 0.2103797, 0.2178221, 0.2317605, 0.2452588, 0.2536525, 0.2633139, 0.2622121, 0.2538035, 0.2367099, 0.2219658, 0.2114051, 0.2088391, 0.2098973, 0.2176176, 0.2312553, 0.2448709, 0.2537117, 0.2602636, 0.2637344, 0.255207, 0.2373102, 0.2211185, 0.2105945, 0.2085426, 0.2093321, 0.2157642, 0.230161, 0.2424657, 0.2527601, 0.2596833, 0.2605767, 0.251743, 0.2345774, 0.2186949, 0.2102133, 0.208804, 0.2099326, 0.2175232, 0.2300847, 0.2435895, 0.2554428, 0.2614534, 0.2630322, 0.2531208, 0.2380999, 0.2227041, 0.2116546, 0.2091951, 0.2100595, 0.2192327, 0.2322452, 0.2459539, 0.2574637, 0.2654756, 0.2652414, 0.2546236, 0.2371593, 0.2209351, 0.2105269, 0.2089383, 0.2106287, 0.2186315, 0.2323946, 0.2462126, 0.256966, 0.2630634, 0.2635241, 0.2521529, 0.2369699, 0.2197802, 0.2101604, 0.2086898, 0.2099109, 0.2181743, 0.2330967, 0.245994, 0.2564292, 0.2634324, 0.2634153, 0.2549918, 0.237323, 0.2208854, 0.2105953, 0.2081383, 0.2095932, 0.2168244, 0.2312412, 0.244787, 0.2550615, 0.2624009, 0.2624273, 0.2522097, 0.2344595, 0.2187714, 0.2107309, 0.208405, 0.2093614, 0.2174629, 0.2313699, 0.246277 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 } nco-4.5.4/data/snd_ncwa.cdl000066400000000000000000002166661264355130400155200ustar00rootroot00000000000000netcdf snd_ncwa { // global attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2d733abb-3a88-4669-8961-fa994c714e0f" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155706.724" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:57:07Z" ; :history = "Tue Aug 27 14:55:01 2013: ncecat --gag snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512.nc snd_LImon_CESM1-BGC_historical_r1i1p1_199001-200512.nc snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc snd_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512.nc snd_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512.nc snd.nc\nSun Dec 30 18:37:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:57:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; :nco_openmp_thread_number = 1 ; group: snd_LImon_CCSM4_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-04-06T21:57:06Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CCSM4_historical_r0i0p0.nc areacella: areacella_fx_CCSM4_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NCAR" ; :experiment_id = "historical" ; :source = "CCSM4" ; :model_id = "CCSM4" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 937. ; :contact = "cesm_data@ucar.edu" ; :references = "Gent P. R., et.al. 2011: The Community Climate System Model version 4. J. Climate, doi: 10.1175/2011JCLI4083.1" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "2d733abb-3a88-4669-8961-fa994c714e0f" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.1deg.008" ; :cesm_repotag = "ccsm4_0_beta43" ; :cesm_compset = "B20TRCN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120406 -155706.724" ; :processing_code_information = "Last Changed Rev: 677 Last Changed Date: 2012-04-05 11:56:11 -0600 (Thu, 05 Apr 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-04-06T21:57:07Z" ; :history = "Sun Dec 30 18:37:33 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CCSM4_historical_r1i1p1_199001-200512.nc\n2012-04-06T21:57:07Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CCSM4 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.2724146, 0.2805385, 0.2834768, 0.2745424, 0.2557565, 0.2344869, 0.2219715, 0.2190395, 0.2220945, 0.2319131, 0.2463375, 0.2607701, 0.2692722, 0.2770566, 0.2791537, 0.270516, 0.2546696, 0.2335674, 0.2220806, 0.2187323, 0.2211094, 0.2305807, 0.245944, 0.2600244, 0.271029, 0.279032, 0.2794289, 0.2702961, 0.2552496, 0.237448, 0.2218089, 0.2197413, 0.2226625, 0.2303976, 0.2442853, 0.2594771, 0.2717321, 0.2789153, 0.2786778, 0.2703565, 0.2531038, 0.2326569, 0.2209008, 0.219136, 0.2223255, 0.2321512, 0.2464486, 0.2593269, 0.2708381, 0.2783013, 0.2802042, 0.2727805, 0.2562031, 0.2376942, 0.2238919, 0.220717, 0.2240804, 0.2324936, 0.2460135, 0.2600223, 0.2709923, 0.2776637, 0.2802023, 0.2731161, 0.257625, 0.2380173, 0.2234037, 0.2204858, 0.2234626, 0.2327554, 0.2484348, 0.2632856, 0.2738608, 0.2827595, 0.2846874, 0.2719233, 0.2554669, 0.2337054, 0.2223311, 0.219457, 0.2217831, 0.2305832, 0.2449607, 0.2592558, 0.2693018, 0.2794678, 0.2849715, 0.2747917, 0.2536268, 0.2352346, 0.2220949, 0.2188839, 0.221791, 0.2320456, 0.2468438, 0.2612689, 0.2724337, 0.2812943, 0.2816801, 0.2718139, 0.2545425, 0.2339947, 0.2233207, 0.220883, 0.2228399, 0.2329358, 0.2485441, 0.262383, 0.2728364, 0.2801743, 0.2834518, 0.2755635, 0.2572154, 0.23524, 0.2241858, 0.2201564, 0.2231563, 0.2329302, 0.2466877, 0.2606887, 0.2712987, 0.2797104, 0.280265, 0.270669, 0.2512513, 0.2314375, 0.2210067, 0.2190172, 0.2205743, 0.2274242, 0.2413106, 0.2553834, 0.2651053, 0.2752735, 0.2759885, 0.2626066, 0.2487948, 0.2309431, 0.2209402, 0.2188502, 0.2205875, 0.2297206, 0.2438147, 0.2585448, 0.2680849, 0.2761216, 0.2784539, 0.2673648, 0.2469543, 0.2282923, 0.2180633, 0.2160996, 0.2179174, 0.2250961, 0.2379094, 0.2522934, 0.264903, 0.272292, 0.2732264, 0.265145, 0.2500148, 0.2297041, 0.2185939, 0.2163664, 0.2192902, 0.2271949, 0.2400659, 0.2554764, 0.266905, 0.2749299, 0.2785495, 0.2679975, 0.2518781, 0.2328067, 0.2180953, 0.2168675, 0.2205294, 0.2292409, 0.2434324, 0.2566255, 0.2681567, 0.2755063, 0.2762004, 0.2689444, 0.2509382, 0.232049, 0.2202254, 0.2178997, 0.2200232, 0.2298912, 0.2441406, 0.2583995 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CCSM4_historical_r1i1p1_199001-200512 group: snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-09T19:57:47Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-BGC_esmHistorical_r0i0p0.nc areacella: areacella_fx_CESM1-BGC_esmHistorical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "esmHistorical" ; :source = "CESM1-BGC" ; :model_id = "CESM1-BGC" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD\n See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "4a0d95f4-418e-4b2f-bd18-25d83dd02599" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.coup.001" ; :cesm_repotag = "unknown" ; :cesm_compset = "unknown" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120509 -135747.834" ; :processing_code_information = "Last Changed Rev: 757 Last Changed Date: 2012-05-09 13:01:12 -0600 (Wed, 09 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "ESM historical" ; :frequency = "mon" ; :creation_date = "2012-05-09T19:57:54Z" ; :history = "Sun Dec 30 18:38:21 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512.nc\n2012-05-09T19:57:54Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-BGC model output prepared for CMIP5 ESM historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.2680996, 0.2774232, 0.2773497, 0.2678236, 0.2523736, 0.2353036, 0.2241789, 0.2202552, 0.222204, 0.2306893, 0.2446921, 0.2576785, 0.2682439, 0.2751035, 0.277965, 0.2696223, 0.2531217, 0.2362053, 0.2236448, 0.2213705, 0.223623, 0.2329047, 0.2455211, 0.2591642, 0.2693312, 0.2794877, 0.2825508, 0.2744004, 0.254947, 0.2357145, 0.2242698, 0.2229662, 0.2258033, 0.2355103, 0.2489066, 0.2639475, 0.2739551, 0.282854, 0.285384, 0.2742695, 0.2558796, 0.2363208, 0.2251717, 0.2235664, 0.2253847, 0.2336286, 0.2477256, 0.262718, 0.273165, 0.2797343, 0.280659, 0.2718306, 0.2566107, 0.2371835, 0.2254015, 0.2228705, 0.2243886, 0.2328582, 0.247127, 0.2616663, 0.2728699, 0.2804817, 0.2821359, 0.2728669, 0.2567041, 0.2372598, 0.2235135, 0.2211705, 0.2232186, 0.2304765, 0.2452655, 0.2588243, 0.2686609, 0.2770467, 0.28127, 0.2719267, 0.2565492, 0.2370524, 0.2241652, 0.2221043, 0.2240341, 0.232785, 0.2474582, 0.2619536, 0.271959, 0.2789219, 0.2804725, 0.2712795, 0.2545575, 0.2343643, 0.2228464, 0.2208607, 0.222697, 0.2307697, 0.2453604, 0.2603765, 0.270963, 0.2783473, 0.2791822, 0.2671294, 0.2513891, 0.2327273, 0.2230895, 0.2215021, 0.2227538, 0.2310819, 0.2444584, 0.2590207, 0.269716, 0.2776413, 0.2770783, 0.269074, 0.2532291, 0.2348496, 0.2231196, 0.2215401, 0.2229901, 0.2301446, 0.2427478, 0.2571933, 0.2685693, 0.2760618, 0.2773207, 0.2689409, 0.2521003, 0.2327903, 0.2218084, 0.2191039, 0.2212152, 0.2275012, 0.2422791, 0.2555068, 0.2664767, 0.2757832, 0.2764494, 0.2647938, 0.2490902, 0.2317704, 0.2224389, 0.2204234, 0.2224246, 0.2305548, 0.2446094, 0.2598239, 0.2725414, 0.2792821, 0.2792836, 0.2694865, 0.2504343, 0.2331266, 0.2226404, 0.2204186, 0.2220359, 0.2297373, 0.2448198, 0.2600302, 0.270699, 0.2782437, 0.2768129, 0.2677913, 0.2520528, 0.2336722, 0.2226274, 0.2207537, 0.2224943, 0.2297986, 0.2440405, 0.2572867, 0.2677648, 0.2762023, 0.2748129, 0.2662947, 0.2533411, 0.2347853, 0.2230045, 0.2207553, 0.2227484, 0.230375, 0.2443826, 0.2584139, 0.2697071, 0.2758932, 0.2760971, 0.2664725, 0.2526272, 0.2326955, 0.2209367, 0.2194094, 0.2209915, 0.228255, 0.2412456, 0.2555254 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512 group: snd_LImon_CESM1-BGC_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-09T19:58:41Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-BGC_historical_r0i0p0.nc areacella: areacella_fx_CESM1-BGC_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-BGC" ; :model_id = "CESM1-BGC" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD\n See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "71321285-8e0d-4615-87db-35dd436c1ca7" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.bdrd.001" ; :cesm_repotag = "unknown" ; :cesm_compset = "unknown" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120509 -135841.391" ; :processing_code_information = "Last Changed Rev: 757 Last Changed Date: 2012-05-09 13:01:12 -0600 (Wed, 09 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-09T19:59:01Z" ; :history = "Thu Jan 24 16:59:53 2013: ncks -d time,1990-01-01 00:00:0.0, snd_LImon_CESM1-BGC_historical_r1i1p1_185001-200512.nc snd_LImon_CESM1-BGC_historical_r1i1p1_199001-200512.nc\n2012-05-09T19:59:01Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-BGC model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20130125" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.2679237, 0.2765716, 0.2792061, 0.269538, 0.2549225, 0.2356643, 0.2239816, 0.2214208, 0.2232746, 0.2330443, 0.2482322, 0.2618538, 0.2718751, 0.2784872, 0.2816284, 0.2744199, 0.2547633, 0.2358269, 0.2238155, 0.2212213, 0.2229176, 0.2314795, 0.2445377, 0.2586936, 0.2689886, 0.2767572, 0.2793723, 0.2701983, 0.2571563, 0.2410009, 0.2276393, 0.2232079, 0.2254889, 0.2328709, 0.246804, 0.2621065, 0.2749951, 0.2822544, 0.2840958, 0.2735372, 0.2571335, 0.2369379, 0.2245413, 0.2230619, 0.2254388, 0.2328702, 0.2470193, 0.2612281, 0.273309, 0.2807706, 0.2803822, 0.2722653, 0.2537876, 0.2356591, 0.2237536, 0.221576, 0.2239067, 0.2312796, 0.2460659, 0.2598847, 0.2710848, 0.2802893, 0.2828076, 0.2704725, 0.2541187, 0.2350643, 0.2240993, 0.2223159, 0.2238365, 0.2320055, 0.2454544, 0.2591887, 0.2701084, 0.2796279, 0.2826913, 0.2736143, 0.2549144, 0.2370585, 0.2247572, 0.2223565, 0.2238854, 0.231767, 0.2443522, 0.2578636, 0.2712161, 0.2780971, 0.2755284, 0.2660622, 0.2495453, 0.2318953, 0.2233751, 0.2216059, 0.223766, 0.23187, 0.246279, 0.2603699, 0.2707274, 0.2787572, 0.2818029, 0.2734509, 0.2564729, 0.2358576, 0.2246435, 0.2225418, 0.2250151, 0.231232, 0.2457517, 0.2608106, 0.2720586, 0.2782162, 0.2794435, 0.2731014, 0.2584612, 0.2379365, 0.2251921, 0.2220701, 0.2250715, 0.2343054, 0.2491052, 0.2627716, 0.2734136, 0.279099, 0.2794518, 0.2727314, 0.2575629, 0.2346312, 0.2223997, 0.2212141, 0.2226047, 0.2319023, 0.2452941, 0.258326, 0.2698498, 0.2775199, 0.2788604, 0.2690693, 0.252148, 0.232261, 0.2235355, 0.2229979, 0.2245945, 0.2310091, 0.2443134, 0.2585285, 0.2701935, 0.2781954, 0.2802249, 0.2686754, 0.2521832, 0.2358972, 0.2247827, 0.2217561, 0.2242245, 0.2330889, 0.2470436, 0.2605419, 0.2706355, 0.2782127, 0.2791632, 0.2685546, 0.2515925, 0.2346935, 0.2236731, 0.2211577, 0.2231798, 0.230194, 0.2433317, 0.257083, 0.2682059, 0.2764317, 0.2791491, 0.2723773, 0.255015, 0.2332694, 0.2229499, 0.2207035, 0.2225349, 0.2303905, 0.2440189, 0.2581901, 0.2682388, 0.2741917, 0.2765204, 0.267206, 0.2482102, 0.232184, 0.2224177, 0.2212571, 0.2237087, 0.2322933, 0.2465013, 0.260654 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-BGC_historical_r1i1p1_199001-200512 group: snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-18T15:39:16Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-CAM5_historical_r0i0p0.nc areacella: areacella_fx_CESM1-CAM5_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-CAM5" ; :model_id = "CESM1-CAM5" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 2. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Neale, R., et.al. 2012: Coupled simulations from CESM1 using the Community Atmosphere Model version 5: (CAM5). See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "76783d9a-c5da-46c0-bc92-51c6cc1be100" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. This research used resources of the Oak Ridge Leadership Computing Facility, located in the National Center for Computational Sciences at Oak Ridge National Laboratory, which is supported by the Office of Science (BER) of the Department of Energy under Contract DE-AC05-00OR22725." ; :cesm_casename = "b40_20th_1d_b08c5cn_138j" ; :cesm_repotag = "cesm1_0_beta08" ; :cesm_compset = "B20TRC5CN" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120518 -093916.416" ; :processing_code_information = "Last Changed Rev: 776 Last Changed Date: 2012-05-17 09:36:52 -0600 (Thu, 17 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-18T15:39:18Z" ; :history = "Sun Dec 30 19:53:37 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-CAM5_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/historical-exp/snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc\n2012-05-18T15:39:18Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-CAM5 model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.256985, 0.2632169, 0.2638666, 0.2571382, 0.2397551, 0.2226972, 0.2117357, 0.2092562, 0.2110159, 0.2187275, 0.232471, 0.2451041, 0.25559, 0.262308, 0.263666, 0.2530842, 0.2354192, 0.219715, 0.2109925, 0.2091601, 0.2101545, 0.2170589, 0.2314613, 0.2463234, 0.2565176, 0.2618284, 0.2628052, 0.2544692, 0.2387005, 0.2239094, 0.2126885, 0.2100891, 0.2110389, 0.2183972, 0.2327309, 0.2458724, 0.256275, 0.2631488, 0.2623489, 0.2537029, 0.238484, 0.2220767, 0.2126471, 0.2098042, 0.211005, 0.2187067, 0.2322753, 0.2455713, 0.2557092, 0.2640642, 0.2651167, 0.2535568, 0.2382084, 0.2209739, 0.2110021, 0.2091861, 0.2104682, 0.217094, 0.2318764, 0.2454598, 0.2558737, 0.262004, 0.2621183, 0.251463, 0.2369802, 0.2199399, 0.2108326, 0.2090928, 0.2101073, 0.2165558, 0.2288471, 0.2424463, 0.2511085, 0.2579598, 0.259104, 0.2501604, 0.2355066, 0.2208411, 0.212263, 0.2098267, 0.2107716, 0.2182428, 0.2311743, 0.2435891, 0.2561887, 0.2622698, 0.263788, 0.2558271, 0.2375138, 0.219795, 0.2111067, 0.2092032, 0.2103797, 0.2178221, 0.2317605, 0.2452588, 0.2536525, 0.2633139, 0.2622121, 0.2538035, 0.2367099, 0.2219658, 0.2114051, 0.2088391, 0.2098973, 0.2176176, 0.2312553, 0.2448709, 0.2537117, 0.2602636, 0.2637344, 0.255207, 0.2373102, 0.2211185, 0.2105945, 0.2085426, 0.2093321, 0.2157642, 0.230161, 0.2424657, 0.2527601, 0.2596833, 0.2605767, 0.251743, 0.2345774, 0.2186949, 0.2102133, 0.208804, 0.2099326, 0.2175232, 0.2300847, 0.2435895, 0.2554428, 0.2614534, 0.2630322, 0.2531208, 0.2380999, 0.2227041, 0.2116546, 0.2091951, 0.2100595, 0.2192327, 0.2322452, 0.2459539, 0.2574637, 0.2654756, 0.2652414, 0.2546236, 0.2371593, 0.2209351, 0.2105269, 0.2089383, 0.2106287, 0.2186315, 0.2323946, 0.2462126, 0.256966, 0.2630634, 0.2635241, 0.2521529, 0.2369699, 0.2197802, 0.2101604, 0.2086898, 0.2099109, 0.2181743, 0.2330967, 0.245994, 0.2564292, 0.2634324, 0.2634153, 0.2549918, 0.237323, 0.2208854, 0.2105953, 0.2081383, 0.2095932, 0.2168244, 0.2312412, 0.244787, 0.2550615, 0.2624009, 0.2624273, 0.2522097, 0.2344595, 0.2187714, 0.2107309, 0.208405, 0.2093614, 0.2174629, 0.2313699, 0.246277 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512 group: snd_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-17T14:29:34Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-FASTCHEM_historical_r0i0p0.nc areacella: areacella_fx_CESM1-FASTCHEM_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-FASTCHEM" ; :model_id = "CESM1-FASTCHEM" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 0. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "TBD" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "1a30898b-bd4c-455f-998d-eb85be033c6a" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.1deg.fschem.002" ; :cesm_repotag = "ccsm4_0_beta55" ; :cesm_compset = "B20TRCNCHM" ; :resolution = "f09_g16 (0.9x1.25_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on silver.cgd.ucar.edu at 20120517 -082934.541" ; :processing_code_information = "Last Changed Rev: 774 Last Changed Date: 2012-05-16 16:39:53 -0600 (Wed, 16 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-17T14:29:36Z" ; :history = "Sun Dec 30 18:45:12 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/atmos-his/snd_LImon_CESM1-FASTCHEM_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/atmos-his/snd_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512.nc\n2012-05-17T14:29:36Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-FASTCHEM model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.46875, 0.46875 ; lon = 179.375 ; lon_bnds = 178.752170138889, 180 ; snd = 0.2750264, 0.2827012, 0.2836201, 0.2763774, 0.2556965, 0.2349145, 0.2234712, 0.2218066, 0.2237734, 0.2314995, 0.2457788, 0.2601142, 0.2716116, 0.2805784, 0.2814254, 0.2727282, 0.2564223, 0.2354449, 0.223776, 0.2213256, 0.2240499, 0.2317501, 0.2467353, 0.2610167, 0.272912, 0.2800703, 0.2806183, 0.2709811, 0.2541679, 0.2351057, 0.2241215, 0.2218101, 0.2238038, 0.2330264, 0.2465664, 0.2609607, 0.2734672, 0.2807797, 0.2816935, 0.2728434, 0.2560812, 0.2344272, 0.2257501, 0.2231447, 0.2256618, 0.2338017, 0.2485296, 0.2631541, 0.2738454, 0.2821576, 0.2848077, 0.2726309, 0.25622, 0.2365833, 0.2243394, 0.2223225, 0.2245991, 0.2321757, 0.247523, 0.261483, 0.270463, 0.2779397, 0.2782156, 0.2700277, 0.2551512, 0.2355088, 0.2250358, 0.2232409, 0.224447, 0.2324292, 0.2463789, 0.260181, 0.2702854, 0.2781136, 0.2786251, 0.2687235, 0.2518046, 0.2330264, 0.2247491, 0.2227924, 0.2249915, 0.232993, 0.2472644, 0.2602928, 0.2687927, 0.2750922, 0.2785683, 0.2708525, 0.2517959, 0.235072, 0.2242447, 0.221228, 0.2225715, 0.2302298, 0.2436894, 0.2583888, 0.2672615, 0.274336, 0.2765679, 0.2675373, 0.252947, 0.2337484, 0.223468, 0.2225862, 0.2247808, 0.2328842, 0.2476225, 0.2629686, 0.2737435, 0.2814075, 0.2808386, 0.2706385, 0.2559216, 0.2358668, 0.2237674, 0.2215497, 0.2237885, 0.2306668, 0.2450456, 0.2596844, 0.2692972, 0.2774424, 0.2796294, 0.2698047, 0.2524751, 0.2342875, 0.2246875, 0.2223008, 0.2244863, 0.231443, 0.246162, 0.2601232, 0.2702578, 0.2776871, 0.2774735, 0.2698084, 0.2528532, 0.2328277, 0.2224298, 0.2205528, 0.2226472, 0.2315841, 0.2467164, 0.2583822, 0.2682005, 0.2759511, 0.278217, 0.2702186, 0.2537842, 0.2342858, 0.2223947, 0.2199988, 0.2225848, 0.229691, 0.2416748, 0.255105, 0.2672125, 0.2748722, 0.2774377, 0.2681693, 0.2483882, 0.2303857, 0.222295, 0.219738, 0.2214673, 0.2295648, 0.242586, 0.2567997, 0.2672747, 0.2748377, 0.2768176, 0.2680204, 0.2507775, 0.2316573, 0.2215038, 0.2195645, 0.2214504, 0.2289246, 0.2421537, 0.2563136, 0.2659799, 0.2741868, 0.2763584, 0.2664885, 0.2485915, 0.2309204, 0.2217642, 0.2195142, 0.2208287, 0.2281606, 0.2420237, 0.2576153 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-FASTCHEM_historical_r1i1p1_199001-200512 group: snd_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512 { dimensions: bnds = 2 ; time = 192 ; variables: double lat ; lat:bounds = "lat_bnds" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; double lat_bnds(bnds) ; double lon ; lon:bounds = "lon_bnds" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; double lon_bnds(bnds) ; float snd(time) ; snd:standard_name = "surface_snow_thickness" ; snd:long_name = "Snow Depth" ; snd:comment = "SNOWDP unchanged, CMIP5_table_comment: where land over land, this is computed as the mean thickness of snow in the land portion of the grid cell (averaging over the entire land portion, including the snow-free fraction). Reported as 0.0 where the land fraction is 0." ; snd:units = "m" ; snd:original_name = "SNOWDP" ; snd:cell_methods = "time: mean (interval: 30 days) area: mean where land" ; snd:cell_measures = "area: areacella" ; snd:history = "2012-05-31T13:28:31Z altered by CMOR: replaced missing value flag (1e+36) with standard missing value (1e+20)." ; snd:missing_value = 1.e+20f ; snd:_FillValue = 1.e+20f ; snd:associated_files = "baseURL: http://cmip-pcmdi.llnl.gov/CMIP5/dataLocation gridspecFile: gridspec_landIce_fx_CESM1-WACCM_historical_r0i0p0.nc areacella: areacella_fx_CESM1-WACCM_historical_r0i0p0.nc" ; double time(time) ; time:bounds = "time_bnds" ; time:units = "days since 1850-01-01 00:00:00" ; time:calendar = "noleap" ; time:axis = "T" ; time:long_name = "time" ; time:standard_name = "time" ; double time_bnds(time, bnds) ; // group attributes: :institution = "NSF/DOE NCAR (National Center for Atmospheric Research) Boulder, CO, USA" ; :institute_id = "NSF-DOE-NCAR" ; :experiment_id = "historical" ; :source = "CESM1-WACCM" ; :model_id = "CESM1-WACCM" ; :forcing = "Sl GHG Vl SS Ds SD BC MD OC Oz AA LU" ; :parent_experiment_id = "piControl" ; :parent_experiment_rip = "r1i1p1" ; :branch_time = 1. ; :contact = "cesm_data@ucar.edu" ; :comment = "CESM home page: http://www.cesm.ucar.edu" ; :references = "Marsh, D., et.al. 2012: WACCM4 simulations of atmospheric trends from 1850 to present. See also http://www.cesm.ucar.edu/publications" ; :initialization_method = 1 ; :physics_version = 1 ; :tracking_id = "6e463115-a801-48c5-9545-b48c3a7a180c" ; :acknowledgements = "The CESM project is supported by the National Science Foundation and the Office of Science (BER) of the U.S. Department of Energy. NCAR is sponsored by the National Science Foundation. Computing resources were provided by the Climate Simulation Laboratory at the NCAR Computational and Information Systems Laboratory (CISL), sponsored by the National Science Foundation and other agencies." ; :cesm_casename = "b40.20th.track1.2deg.wcm.007" ; :cesm_repotag = "ccsm4_0_beta52" ; :cesm_compset = "BW20TRCN" ; :resolution = "f19_g16 (1.9x2.5_gx1v6)" ; :forcing_note = "Additional information on the external forcings used in this experiment can be found at http://www.cesm.ucar.edu/CMIP5/forcing_information" ; :processed_by = "strandwg on mirage3 at 20120531 -072831.809" ; :processing_code_information = "Last Changed Rev: 820 Last Changed Date: 2012-05-30 15:07:51 -0600 (Wed, 30 May 2012) Repository UUID: d2181dbe-5796-6825-dc7f-cbd98591f93d" ; :product = "output" ; :experiment = "historical" ; :frequency = "mon" ; :creation_date = "2012-05-31T13:28:32Z" ; :history = "Sun Dec 30 18:45:22 2012: ncks -d time,1990-01-01 00:00:0.0, /media/grele_data/wenshan/cesm/atmos-his/snd_LImon_CESM1-WACCM_historical_r1i1p1_185001-200512.nc /media/grele_data/wenshan/cesm/atmos-his/snd_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512.nc\n2012-05-31T13:28:32Z CMOR rewrote data to comply with CF standards and CMIP5 requirements." ; :Conventions = "CF-1.4" ; :project_id = "CMIP5" ; :table_id = "Table LImon (12 January 2012) 429410275cb5466e41180ad9466db1bf" ; :title = "CESM1-WACCM model output prepared for CMIP5 historical" ; :parent_experiment = "pre-industrial control" ; :modeling_realm = "landIce land" ; :realization = 1 ; :cmor_version = "2.8.1" ; :NCO = "20121231" ; data: lat = 0 ; lat_bnds = -0.9375, 0.9375 ; lon = 178.75 ; lon_bnds = 177.508680555556, 180 ; snd = 0.2741823, 0.2824234, 0.2835466, 0.2758278, 0.2592108, 0.2445476, 0.2362207, 0.2327209, 0.2339729, 0.2415667, 0.254081, 0.2668318, 0.2776704, 0.2833323, 0.2829214, 0.2750239, 0.2579146, 0.2433279, 0.2357496, 0.2334602, 0.2348245, 0.2426183, 0.2551862, 0.2685837, 0.2790258, 0.2836361, 0.285545, 0.275064, 0.2617241, 0.2459763, 0.2361272, 0.2328044, 0.2343751, 0.2408614, 0.252481, 0.26551, 0.2758977, 0.2821526, 0.2819755, 0.2731315, 0.258273, 0.2410503, 0.233101, 0.231459, 0.2328015, 0.2411605, 0.2531981, 0.2657311, 0.2766429, 0.2822783, 0.2826326, 0.2742737, 0.2595432, 0.2434109, 0.232832, 0.23026, 0.2317569, 0.2397589, 0.2518112, 0.2638411, 0.2744505, 0.2813324, 0.2845167, 0.2752372, 0.2618941, 0.2432088, 0.2331954, 0.2315808, 0.2335714, 0.2393669, 0.2510756, 0.2645056, 0.2758176, 0.2837704, 0.2843393, 0.2761432, 0.261086, 0.2405482, 0.2322877, 0.2305892, 0.232166, 0.2392834, 0.2511204, 0.2637244, 0.273531, 0.2796766, 0.278335, 0.2708297, 0.2571437, 0.2404203, 0.2339079, 0.2320844, 0.2327563, 0.2394752, 0.25227, 0.263505, 0.2719481, 0.2777592, 0.2775739, 0.2676228, 0.2544996, 0.2402884, 0.233513, 0.2325867, 0.2333694, 0.2403591, 0.2521506, 0.265958, 0.2759033, 0.2837518, 0.2859447, 0.2791762, 0.2582048, 0.2420362, 0.2324883, 0.2315544, 0.2337006, 0.2415399, 0.2543033, 0.2681247, 0.2802576, 0.286882, 0.2876555, 0.2765487, 0.2582408, 0.2420035, 0.2330316, 0.231646, 0.2335648, 0.2413843, 0.2534434, 0.265111, 0.2754072, 0.2803425, 0.2803829, 0.2729563, 0.2566476, 0.2419513, 0.2342586, 0.2317768, 0.2327354, 0.2401332, 0.2524537, 0.2648278, 0.2770981, 0.2830914, 0.2829121, 0.2730316, 0.2579781, 0.2424567, 0.2336262, 0.231944, 0.2337552, 0.2398906, 0.2512689, 0.2645685, 0.2760909, 0.2815068, 0.2858039, 0.2779543, 0.2627673, 0.24641, 0.2342154, 0.2320748, 0.2330589, 0.2381751, 0.2505077, 0.2635954, 0.275107, 0.2803818, 0.2799959, 0.2725537, 0.2562479, 0.2409138, 0.2329532, 0.2315231, 0.2334719, 0.2396966, 0.2507728, 0.2636725, 0.2738827, 0.2803729, 0.2779124, 0.2681367, 0.2545889, 0.2406674, 0.2332186, 0.2320741, 0.233371, 0.2389776, 0.2515268, 0.2643626 ; time = 51115.5, 51145, 51174.5, 51205, 51235.5, 51266, 51296.5, 51327.5, 51358, 51388.5, 51419, 51449.5, 51480.5, 51510, 51539.5, 51570, 51600.5, 51631, 51661.5, 51692.5, 51723, 51753.5, 51784, 51814.5, 51845.5, 51875, 51904.5, 51935, 51965.5, 51996, 52026.5, 52057.5, 52088, 52118.5, 52149, 52179.5, 52210.5, 52240, 52269.5, 52300, 52330.5, 52361, 52391.5, 52422.5, 52453, 52483.5, 52514, 52544.5, 52575.5, 52605, 52634.5, 52665, 52695.5, 52726, 52756.5, 52787.5, 52818, 52848.5, 52879, 52909.5, 52940.5, 52970, 52999.5, 53030, 53060.5, 53091, 53121.5, 53152.5, 53183, 53213.5, 53244, 53274.5, 53305.5, 53335, 53364.5, 53395, 53425.5, 53456, 53486.5, 53517.5, 53548, 53578.5, 53609, 53639.5, 53670.5, 53700, 53729.5, 53760, 53790.5, 53821, 53851.5, 53882.5, 53913, 53943.5, 53974, 54004.5, 54035.5, 54065, 54094.5, 54125, 54155.5, 54186, 54216.5, 54247.5, 54278, 54308.5, 54339, 54369.5, 54400.5, 54430, 54459.5, 54490, 54520.5, 54551, 54581.5, 54612.5, 54643, 54673.5, 54704, 54734.5, 54765.5, 54795, 54824.5, 54855, 54885.5, 54916, 54946.5, 54977.5, 55008, 55038.5, 55069, 55099.5, 55130.5, 55160, 55189.5, 55220, 55250.5, 55281, 55311.5, 55342.5, 55373, 55403.5, 55434, 55464.5, 55495.5, 55525, 55554.5, 55585, 55615.5, 55646, 55676.5, 55707.5, 55738, 55768.5, 55799, 55829.5, 55860.5, 55890, 55919.5, 55950, 55980.5, 56011, 56041.5, 56072.5, 56103, 56133.5, 56164, 56194.5, 56225.5, 56255, 56284.5, 56315, 56345.5, 56376, 56406.5, 56437.5, 56468, 56498.5, 56529, 56559.5, 56590.5, 56620, 56649.5, 56680, 56710.5, 56741, 56771.5, 56802.5, 56833, 56863.5, 56894, 56924.5 ; time_bnds = 51100, 51131, 51131, 51159, 51159, 51190, 51190, 51220, 51220, 51251, 51251, 51281, 51281, 51312, 51312, 51343, 51343, 51373, 51373, 51404, 51404, 51434, 51434, 51465, 51465, 51496, 51496, 51524, 51524, 51555, 51555, 51585, 51585, 51616, 51616, 51646, 51646, 51677, 51677, 51708, 51708, 51738, 51738, 51769, 51769, 51799, 51799, 51830, 51830, 51861, 51861, 51889, 51889, 51920, 51920, 51950, 51950, 51981, 51981, 52011, 52011, 52042, 52042, 52073, 52073, 52103, 52103, 52134, 52134, 52164, 52164, 52195, 52195, 52226, 52226, 52254, 52254, 52285, 52285, 52315, 52315, 52346, 52346, 52376, 52376, 52407, 52407, 52438, 52438, 52468, 52468, 52499, 52499, 52529, 52529, 52560, 52560, 52591, 52591, 52619, 52619, 52650, 52650, 52680, 52680, 52711, 52711, 52741, 52741, 52772, 52772, 52803, 52803, 52833, 52833, 52864, 52864, 52894, 52894, 52925, 52925, 52956, 52956, 52984, 52984, 53015, 53015, 53045, 53045, 53076, 53076, 53106, 53106, 53137, 53137, 53168, 53168, 53198, 53198, 53229, 53229, 53259, 53259, 53290, 53290, 53321, 53321, 53349, 53349, 53380, 53380, 53410, 53410, 53441, 53441, 53471, 53471, 53502, 53502, 53533, 53533, 53563, 53563, 53594, 53594, 53624, 53624, 53655, 53655, 53686, 53686, 53714, 53714, 53745, 53745, 53775, 53775, 53806, 53806, 53836, 53836, 53867, 53867, 53898, 53898, 53928, 53928, 53959, 53959, 53989, 53989, 54020, 54020, 54051, 54051, 54079, 54079, 54110, 54110, 54140, 54140, 54171, 54171, 54201, 54201, 54232, 54232, 54263, 54263, 54293, 54293, 54324, 54324, 54354, 54354, 54385, 54385, 54416, 54416, 54444, 54444, 54475, 54475, 54505, 54505, 54536, 54536, 54566, 54566, 54597, 54597, 54628, 54628, 54658, 54658, 54689, 54689, 54719, 54719, 54750, 54750, 54781, 54781, 54809, 54809, 54840, 54840, 54870, 54870, 54901, 54901, 54931, 54931, 54962, 54962, 54993, 54993, 55023, 55023, 55054, 55054, 55084, 55084, 55115, 55115, 55146, 55146, 55174, 55174, 55205, 55205, 55235, 55235, 55266, 55266, 55296, 55296, 55327, 55327, 55358, 55358, 55388, 55388, 55419, 55419, 55449, 55449, 55480, 55480, 55511, 55511, 55539, 55539, 55570, 55570, 55600, 55600, 55631, 55631, 55661, 55661, 55692, 55692, 55723, 55723, 55753, 55753, 55784, 55784, 55814, 55814, 55845, 55845, 55876, 55876, 55904, 55904, 55935, 55935, 55965, 55965, 55996, 55996, 56026, 56026, 56057, 56057, 56088, 56088, 56118, 56118, 56149, 56149, 56179, 56179, 56210, 56210, 56241, 56241, 56269, 56269, 56300, 56300, 56330, 56330, 56361, 56361, 56391, 56391, 56422, 56422, 56453, 56453, 56483, 56483, 56514, 56514, 56544, 56544, 56575, 56575, 56606, 56606, 56634, 56634, 56665, 56665, 56695, 56695, 56726, 56726, 56756, 56756, 56787, 56787, 56818, 56818, 56848, 56848, 56879, 56879, 56909, 56909, 56940 ; } // group snd_LImon_CESM1-WACCM_historical_r1i1p1_199001-200512 } nco-4.5.4/data/swamp.sh000077500000000000000000000022721264355130400147100ustar00rootroot00000000000000# $Header$ # Purpose: Demonstrate SWAMP usage # Usage: # Using SWAMP requires two steps # First, identify the SWAMP server with access to your data, e.g.: # export SWAMPURL='http://sand.ess.uci.edu:8081/SOAP' # export SWAMPURL='http://pbs.ess.uci.edu:8081/SOAP' # Second, call your script as an argument to SWAMP's invocation: # python ~/nco/src/ssdap/swamp_client.py ~/nco/data/swamp.sh # Whitespace-separated list of directories in sand:${DATA}/swamp_include is exported # to PBS (pbs.ess.uci.edu) for processing by SWAMP server there. # Remember to set all environment variables locally within the script # SWAMP cannot read your environment on the server export caseid='cssnc2050_02b' flg_tst='1' # [flg] Test mode flg_prd='0' # [flg] Production mode flg_typ=${flg_prd} # [enm] Run type if [ "${flg_typ}" = "${flg_tst}" ] ; then ncra -O ~/nco/data/in.nc ~/foo.nc elif [ "${flg_typ}" = "${flg_prd}" ] ; then for mm in 01 02 03 04 05 06 07 08 09 10 11 12; do ncra -O /data/zender/${caseid}/${caseid}.cam2.h0.????-${mm}.nc ~/${caseid}_clm${mm}.nc done # end loop over mm ncra -O ~/${caseid}_clm??.nc ~/${caseid}_clm.nc ncwa -O ~/${caseid}_clm.nc ~/${caseid}_clm_txy.nc fi # !prd nco-4.5.4/data/tst.nco000066400000000000000000000056501264355130400145400ustar00rootroot00000000000000// $Header$ -*-C-*- // Purpose: ncap script for geophysical computations /* Usage: ncap -v -O -D 1 -S ${HOME}/nco/data/tst.nco ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncks -C -H -u -v mxdgr_lcl ${HOME}/nco/data/foo.nc */ rds_earth=6.370e+06; // (6.370e+06) [m] Radius of sphere of same volume as Earth rds_earth@long_name="Radius of sphere of same volume as Earth"; rds_earth@units="meter"; pi=3.1415926535897932384626433832795029L; // (3.1415926535897932384626433832795029L) [frc] 3 pi@long_name="Pi"; pi@units="fraction"; lat_lcl_dgr=16.75; // [dgr] Local latitude lat_lcl_dgr@long_name="Local latitude"; lat_lcl_dgr@units="degree"; lat_lcl=lat_lcl_dgr*(pi/180.0); // [rdn] Local latitude lat_lcl@long_name="Local latitude"; lat_lcl@units="radian"; rds_lcl=rds_earth*cos(lat_lcl); // [m] Distance from axis of rotation at local latitude rds_lcl@long_name="Distance from axis of rotation at local latitude"; rds_lcl@units="meter"; crc_lcl=2.0*pi*rds_lcl; // [m] Circumference of earth along local latitude crc_lcl@long_name="Circumference of earth along local latitude"; crc_lcl@units="meter"; mxdgr_lcl=crc_lcl/360.0; // [m dgr-1] Meters per degree at local latitude mxdgr_lcl@long_name="Meters per degree at local latitude"; mxdgr_lcl@units="meter degree-1"; // Compute fraction of lognormal distribution that lies between two endpoints gsd=2.0; // [frc] Geometric standard deviation gsd@long_name="Geometric standard deviation"; gsd@units="fraction"; dmt_vma=2.5; // [m] Volume median diameter analytic dmt_vma@long_name="Volume median diameter analytic"; dmt_vma@units="meter"; dmt_min=5.0; // [m] Minimum diameter dmt_min@long_name="Minimum diameter"; dmt_min@units="meter"; dmt_max=10.0; // [m] Maximum diameter dmt_max@long_name="Maximum diameter"; dmt_max@units="meter"; // ncap -v -O -s "gsd=2.0;dmt_vma=2.5;dmt_min=5.0;dmt_max=10.0;ovr_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd))))));" ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc;ncks -H -C -u ${HOME}/nco/data/foo.nc ovr_frc=0.5*(erf(log(dmt_max/dmt_vma)/(sqrt(2.0)*log(gsd)))-erf(log(dmt_min/dmt_vma)/(sqrt(2.0)*log(gsd)))))); // [frc] Fraction of lognormal distribution between endpoints ovr_frc@long_name="Fraction of lognormal distribution between endpoints"; ovr_frc@units="fraction"; // Compute specific extinction coefficient of dust from bin-resolved mixing ratios mss_frc_ttl=2.09e-09+9.13e-09+8.18e-09+1.58e-09; // [kg kg-1] Total dust mixing ratio mss_frc1=2.09e-09/mss_frc_ttl; mss_frc2=9.13e-09/mss_frc_ttl; mss_frc3=8.18e-09/mss_frc_ttl; mss_frc4=1.58e-09/mss_frc_ttl; ext_cff_mss1=2.893e3*mss_frc1; ext_cff_mss2=8.350e2*mss_frc2; ext_cff_mss3=3.825e2*mss_frc3; ext_cff_mss4=1.961e2*mss_frc4; ext_cff_mss_ttl=ext_cff_mss1+ext_cff_mss2+ext_cff_mss3+ext_cff_mss4; // This command is placed here for consistency with NCO User's Guide ncap example a=3;b=4;c=sqrt(a^2+b^2); /* foo=; // foo@long_name=""; foo@units=""; */ nco-4.5.4/data/udunits.dat000066400000000000000000000404651264355130400154150ustar00rootroot00000000000000# $Id$ # # The first column is the unit name. The second column indicates whether or # not the unit name has a plural form (i.e. with an 's' appended). # A 'P' indicates that the unit has a plural form, whereas, a 'S' indicates # that the unit has a singular form only. The remainder of the line is the # definition for the unit. # # '#' is the to-end-of-line comment-character. # # NB: When adding to this table, be *very* careful to distinquish between # the letter 'O' and the numeral zero '0'. For example, the following two # entries don't do what one might otherwise expect: # # mercury_0C mercury_32F # millimeter_Hg_0C mm mercury_OC # # BASE UNITS. These must be first and are identified by a nil definition. # ampere P # electric current count P # dimensionless decimal number candela P # luminous intensity kelvin P # thermodynamic temperature kilogram P # mass meter P # length mole P # amount of substance second P # time radian P # plane angle # # CONSTANTS # percent S 0.01 PI S 3.14159265358979323846 bakersdozen S 13 pair P 2 ten P 10 dozen S 12 score S 20 hundred P 100 thousand P 1.0e3 million P 1.0e6 % S percent pi S PI # # NB: All subsequent definitions must be given in terms of # earlier definitions. Forward referencing is not permitted. # # # The following are non-base units of the fundamental quantities # bit P count # unit of information # # UNITS OF ELECTRIC CURRENT # A S ampere amp P ampere abampere P 10 ampere # exact gilbert P 7.957747e-1 ampere statampere P 3.335640e-10 ampere biot P 10 ampere # # UNITS OF LUMINOUS INTENSITY # cd S candela candle P candela # # UNITS OF THERMODYNAMIC TEMPERATURE # degree_Kelvin P kelvin degree_Celsius S kelvin @ 273.15 degree_Rankine P kelvin/1.8 degree_Fahrenheit P degree_Rankine @ 459.67 #C S degree_Celsius # `C' means `coulomb' Celsius S degree_Celsius celsius S degree_Celsius degree_centigrade S degree_Celsius # approx. was just `centigrade' degC S degree_Celsius degreeC S degree_Celsius degree_C S degree_Celsius degree_c S degree_Celsius deg_C S degree_Celsius deg_c S degree_Celsius degK S kelvin degreeK S kelvin degree_K S kelvin degree_k S kelvin deg_K S kelvin deg_k S kelvin K S kelvin Kelvin P kelvin degF S degree_Fahrenheit degreeF S degree_Fahrenheit degree_F S degree_Fahrenheit degree_f S degree_Fahrenheit deg_F S degree_Fahrenheit deg_f S degree_Fahrenheit F S degree_Fahrenheit Fahrenheit P degree_Fahrenheit fahrenheit P degree_Fahrenheit degR S degree_Rankine degreeR S degree_Rankine degree_R S degree_Rankine degree_r S degree_Rankine deg_R S degree_Rankine deg_r S degree_Rankine #R S degree_Rankine # `R' means `roentgen' Rankine P degree_Rankine rankine P degree_Rankine # # UNITS OF MASS # assay_ton P 2.916667e-2 kilogram # was 2.916667e2 (typo!) avoirdupois_ounce P 2.834952e-2 kilogram avoirdupois_pound P 4.5359237e-1 kilogram # exact carat P 2e-4 kilogram grain P 6.479891e-5 kilogram # exact gram P 1e-3 kilogram # exact kg S kilogram long_hundredweight P 5.080235e1 kilogram metric_ton P 1e3 kilogram # exact pennyweight P 1.555174e-3 kilogram short_hundredweight P 4.535924e1 kilogram slug P 14.59390 kilogram troy_ounce P 3.110348e-2 kilogram troy_pound P 3.732417e-1 kilogram atomic_mass_unit P 1.66054e-27 kilogram # was 1.66044e-27 tonne P metric_ton apothecary_ounce P troy_ounce apothecary_pound P troy_pound pound P avoirdupois_pound metricton P metric_ton gr S grain scruple P 20 grain apdram P 60 grain apounce P 480 grain appound P 5760 grain atomicmassunit P atomic_mass_unit amu P atomic_mass_unit t S tonne lb P pound bag P 94 pound short_ton P 2000 pound long_ton P 2240 pound ton P short_ton shortton P short_ton longton P long_ton # # UNITS OF LENGTH # angstrom P decinanometer astronomical_unit P 1.495979e11 meter fermi P 1e-15 meter # exact m S meter metre P meter light_year P 9.46073e15 meter # was ASTM's 9.46055e15 meter micron P 1e-6 meter # exact mil P 2.54e-5 meter # exact nautical_mile P 1.852000e3 meter # exact parsec P 3.085678e16 meter printers_point P 3.514598e-4 meter # God help us! There's an international foot and a US survey foot and # they're not the same! # US Survey foot stuff: US_survey_foot S (1200/3937) meter # exact US_survey_feet S US_survey_foot # alias US_survey_yard P 3 US_survey_feet # exact US_survey_mile P 5280 US_survey_feet # exact US_statute_mile P US_survey_mile # alias rod P 16.5 US_survey_feet # exact pole P rod # alias perch S rod # alias perches S perch # alias furlong P 660 US_survey_feet # exact fathom P 6 US_survey_feet # exact # International foot stuff: international_inch S 2.54 cm # exact international_inches S international_inch # alias international_foot S 12 international_inches # exact international_feet S international_foot # alias international_yard P 3 international_feet # exact international_mile P 5280 international_feet # exact # Alias unspecified units to the international units: inch S international_inch # alias foot S international_foot # alias yard P international_yard # alias mile P international_mile # alias # The following should hold regardless: inches S inch # alias in S inches # alias feet S foot # alias ft S feet # alias yd S yard # alias mi S mile # alias chain P 2.011684e1 meter printers_pica P 12 printers_point # exact astronomicalunit P astronomical_unit au S astronomical_unit nmile P nautical_mile nmi S nautical_mile pica P printers_pica big_point P inch/72 # exact barleycorn P inch/3 arpentlin P 191.835 foot # # UNITS OF AMOUNT OF SUBSTANCE # mol S mole # # UNITS OF TIME # day P 8.64e4 second # exact hour P 3.6e3 second # exact minute P 60 second # exact s S second sec P second shake P 1e-8 second # exact sidereal_day P 8.616409e4 second sidereal_hour P 3.590170e3 second sidereal_minute P 5.983617e1 second sidereal_second P 0.9972696 second sidereal_year P 3.155815e7 second # Interval between 2 successive passages of sun through vernal equinox # (365.242198781 days -- see # http://www.ast.cam.ac.uk/pubinfo/leaflets/, # http://aa.usno.navy.mil/AA/ # and http://adswww.colorado.edu/adswww/astro_coord.html): tropical_year P 3.15569259747e7 second lunar_month P 29.530589 day common_year P 365 day # exact: 3.153600e7 seconds leap_year P 366 day # exact Julian_year P 365.25 day # exact Gregorian_year P 365.2425 day # exact sidereal_month P 27.321661 day tropical_month P 27.321582 day d S day min P minute hr P hour h S hour fortnight P 14 day # exact week P 7 day # exact jiffy S 0.01 second # believe it or not! jiffies S jiffy # assumed plural spelling year P tropical_year yr P year a S year # "anno" eon P 1e9 year # fuzzy month P year/12 # on average # # UNITS OF PLANE ANGLE # #rad P radian # `rad' means `grey' circle P 2 pi radian angular_degree P (pi/180) radian turn P circle degree P angular_degree degree_north S angular_degree degree_east S angular_degree degree_true S angular_degree arcdeg P angular_degree angular_minute P angular_degree/60 angular_second P angular_minute/60 grade P 0.9 angular_degree # exact degrees_north S degree_north degreeN S degree_north degree_N S degree_north degreesN S degree_north degrees_N S degree_north degrees_east S degree_east degreeE S degree_east degree_E S degree_east degreesE S degree_east degrees_E S degree_east degree_west S -1 degree_east degrees_west S degree_west degreeW S degree_west degree_W S degree_west degreesW S degree_west degrees_W S degree_west degrees_true S degree_true degreeT S degree_true degree_T S degree_true degreesT S degree_true degrees_T S degree_true arcminute P angular_minute arcsecond P angular_second arcmin P arcminute arcsec P arcsecond # # The following are derived units with special names. They are useful for # defining other derived units. # steradian P radian2 hertz S 1/second newton P kilogram.meter/second2 coulomb P ampere.second lumen P candela steradian becquerel P 1/second # SI unit of activity of a # # radionuclide standard_free_fall S 9.806650 meter/second2 # exact pascal P newton/meter2 joule P newton.meter Hz S hertz sr S steradian force S standard_free_fall gravity S standard_free_fall free_fall S standard_free_fall lux S lumen/meter2 sphere P 4 pi steradian luxes S lux watt P joule/second gray P joule/kilogram # absorbed dose. derived unit sievert P joule/kilogram # dose equivalent. derived unit conventional_mercury S gravity 13595.10 kg/m3 mercury_0C S gravity 13595.1 kg/m3 # was 13595.065 mercury_60F S gravity 13556.8 kg/m3 # was 13556.806 conventional_water S gravity 1000 kg/m3 # exact water_4C S gravity 999.972 kg/m3 # was 999.97226 water_60F S gravity 999.001 kg/m3 # was 999.00072 g S gravity # approx. should be `local' volt P watt/ampere mercury_32F S mercury_0C water_39F S water_4C # actually 39.2 F mercury S conventional_mercury # was mercury_32F water S conventional_water # was water_4C farad P coulomb/volt ohm P volt/ampere siemens S ampere/volt weber P volt.second Hg S mercury hg S mercury H2O S water h2o S water tesla P weber/meter2 henry P weber/ampere # # The following are compound units: units whose definitions consist # of two or more base units. They may now be defined in terms of the # preceding units. # # # ACCELERATION # gal P 1e-2 meter/second2 # exact # # Area # are P 1e2 m2 # exact barn P 1e-28 m2 # exact circular_mil P 5.067075e-10 m2 darcy P 9.869233e-13 m2 # permeability of porous solids hectare P 1e4 m2 # exact acre P 160 rod2 # exact b S barn # # ELECTRICITY AND MAGNETISM # abfarad P 1e9 farad # exact abhenry P 1e-9 henry # exact abmho P 1e9 siemens # exact abohm P 1e-9 ohm # exact abvolt P 1e-8 volt # exact C S coulomb e S 1.60217733-19 coulomb # was 1.6021917e-19 chemical_faraday P 9.64957e4 coulomb physical_faraday P 9.65219e4 coulomb C12_faraday P 9.648531e4 coulomb gamma P 1e-9 tesla # exact gauss S 1e-4 tesla # exact H S henry maxwell P 1e-8 weber # exact oersted P 7.957747e1 ampere/meter S S siemens statcoulomb P 3.335640e-10 coulomb statfarad P 1.112650e-12 farad stathenry P 8.987554e11 henry statmho P 1.112650e-12 siemens statohm P 8.987554e11 ohm statvolt P 2.997925e2 volt T S tesla unit_pole P 1.256637e-7 weber V S volt Wb S weber mho P siemens Oe S oersted faraday P C12_faraday # charge of 1 mole of # # electrons # # ENERGY (INCLUDES WORK) # electronvolt P 1.602177e-19 joule erg P 1e-7 joule # exact IT_Btu P 1.05505585262e3 joule # exact, was 1.055056e3 EC_therm P 1.05506e8 joule # exact thermochemical_calorie P 4.184000 joule # exact IT_calorie P 4.1868 joule # exact J S joule ton_TNT S 4.184e9 joule US_therm P 1.054804e8 joule # exact watthour P watt hour therm P US_therm Wh S watthour Btu P IT_Btu calorie P IT_calorie electron_volt P electronvolt thm S therm cal S calorie eV S electronvolt bev S gigaelectron_volt # # FORCE # dyne P 1e-5 newton # exact pond P 9.806650e-3 newton # exact, was 1.806650e-3 (typo) force_kilogram S 9.806650 newton # exact force_ounce S 2.780139e-1 newton force_pound S 4.4482216152605 newton# exact poundal P 1.382550e-1 newton N S newton gf S gram force force_gram P 1e-3 force_kilogram force_ton P 2000 force_pound # exact lbf S force_pound ounce_force S force_ounce kilogram_force S force_kilogram pound_force S force_pound ozf S force_ounce kgf S force_kilogram kip P 1000 lbf ton_force S force_ton gram_force S force_gram # # HEAT # clo P 1.55e-1 kelvin.meter2/watt # # LIGHT # lm S lumen lx S lux footcandle P 1.076391e-1 lux footlambert P 3.426259 candela/meter2 lambert P (1e4/PI) candela/meter2 # exact stilb P 1e4 candela/meter2 # exact phot P 1e4 lumen/meter2 # exact nit P 1 candela/meter2 # exact langley P 4.184000e4 joule/meter2 # exact blondel P candela/(pi meter2) apostilb P blondel nt S nit ph S phot sb S stilb # # MASS PER UNIT LENGTH # denier P 1.111111e-7 kilogram/meter tex P 1e-6 kilogram/meter # exact # # MASS PER UNIT TIME (INCLUDES FLOW) # perm_0C S 5.72135e-11 kg/(pascal second meter2) perm_23C S 5.74525e-11 kg/(pascal second meter2) # # POWER # voltampere P volt ampere VA S volt ampere boiler_horsepower P 9.80950e3 watt shaft_horsepower P 7.456999e2 watt metric_horsepower P 7.35499 watt electric_horsepower P 7.460000e2 watt # exact W S watt water_horsepower P 7.46043e2 watt UK_horsepower P 7.4570e2 watt refrigeration_ton P 12000 Btu/hour horsepower P shaft_horsepower ton_of_refrigeration P refrigeration_ton hp S horsepower # # PRESSURE OR STRESS # bar P 1e5 pascal # exact standard_atmosphere P 1.01325e5 pascal # exact technical_atmosphere P 1 kg gravity/cm2 # exact inch_H2O_39F S inch water_39F inch_H2O_60F S inch water_60F inch_Hg_32F S inch mercury_32F inch_Hg_60F S inch mercury_60F millimeter_Hg_0C S mm mercury_0C footH2O S foot water cmHg S cm Hg cmH2O S cm water Pa S pascal inch_Hg S inch Hg inch_hg S inch Hg inHg S inch Hg in_Hg S inch Hg in_hg S inch Hg millimeter_Hg S mm Hg mmHg S mm Hg mm_Hg S mm Hg mm_hg S mm Hg torr P mm Hg foot_H2O S foot water ftH2O S foot water psi S 1 pound gravity/in2 ksi S kip/in2 barie P 0.1 newton/meter2 at S technical_atmosphere atmosphere P standard_atmosphere atm P standard_atmosphere barye P barie # # RADIATION UNITS # Bq S becquerel curie P 3.7e10 becquerel # exact rem P 1e-2 sievert # dose equivalent. exact rad P 1e-2 gray # absorbed dose. exact roentgen P 2.58e-4 coulomb/kg # exact Sv S sievert Gy S gray Ci S curie R S roentgen rd S rad # # VELOCITY (INCLUDES SPEED) # c S 2.997925e+8 meter/sec knot P nautical_mile/hour knot_international S knot international_knot S knot kt P knot # # VISCOSITY # poise S 1e-1 pascal second # absolute viscosity. # # exact stokes S 1e-4 meter2/second # exact rhe S 10/(pascal second) # exact St S stokes # # VOLUME (INCLUDES CAPACITY) # acre_foot S 1.233489e3 m3 # but `acre foot' is 1233.4867714897 meters^3. Odd. board_foot S 2.359737e-3 m3 bushel P 3.523907e-2 m3 UK_liquid_gallon P 4.546090e-3 m3 # exact. was 4.546092e-3 Canadian_liquid_gallon P 4.546090e-3 m3 # exact US_dry_gallon P 4.404884e-3 m3 US_liquid_gallon P 3.785412e-3 m3 cc S cm3 liter P 1e-3 m3 # exact. However, from 1901 to # # 1964, 1 liter = 1.000028 dm3 stere P 1 m3 # exact register_ton P 2.831685 m3 # was 3.831685 (typo!) US_dry_quart P US_dry_gallon/4 US_dry_pint P US_dry_gallon/8 US_liquid_quart P US_liquid_gallon/4 US_liquid_pint P US_liquid_gallon/8 US_liquid_cup P US_liquid_gallon/16 US_liquid_gill P US_liquid_gallon/32 US_fluid_ounce P US_liquid_gallon/128 US_liquid_ounce P US_fluid_ounce UK_liquid_quart P UK_liquid_gallon/4 UK_liquid_pint P UK_liquid_gallon/8 UK_liquid_cup P UK_liquid_gallon/16 UK_liquid_gill P UK_liquid_gallon/32 UK_fluid_ounce P UK_liquid_gallon/160 UK_liquid_ounce P UK_fluid_ounce liquid_gallon P US_liquid_gallon fluid_ounce P US_fluid_ounce #liquid_gallon P UK_liquid_gallon #fluid_ounce P UK_fluid_ounce dry_quart P US_dry_quart dry_pint P US_dry_pint liquid_quart P liquid_gallon/4 liquid_pint P liquid_gallon/8 gallon P liquid_gallon barrel P 42 US_liquid_gallon # petroleum industry definition quart P liquid_quart pint P liquid_pint cup P liquid_gallon/16 gill P liquid_gallon/32 tablespoon P US_fluid_ounce/2 teaspoon P tablespoon/3 peck P bushel/4 oz P fluid_ounce floz S fluid_ounce acre_feet S acre_foot board_feet S board_foot Tbl P tablespoon Tbsp S tablespoon tbsp S tablespoon Tblsp S tablespoon tblsp S tablespoon litre P liter L S liter l S liter tsp S teaspoon pk S peck bu S bushel fldr S floz/8 dram P floz/16 bbl S barrel firkin P barrel/4 # exact but barrel is vague pt S pint dr S dram # # COMPUTERS AND COMMUNICATION # baud S 1/second # exact bps S bit/second cps S hertz Bd S baud # # MISC # kayser P 1e2/meter # exact rps S hertz rpm S hertz/60 geopotential S gravity work_year P 2056 hours work_month P work_year/12 gp S geopotential dynamic S geopotential nco-4.5.4/data/xmp_500mb_hgt.nco000066400000000000000000000036111264355130400162720ustar00rootroot00000000000000// $Header$ -*-C++-*- /* Purpose: Compute 500mb height using CCSM output fields: Z3 [m] (Geopotential Height), PS [Pa] (surface pressure, not sea level pressure), hyam and hybm (CCSM hybrid coefficients) */ /* Usage: ncap2 -O -v -S ~/nco/data/xmp_500mb_hgt.nco ~/cam_h0.nc ~/foo.nc */ /* Compute pressures from hybrid coordinates for k=1,26 p(k)=hyam(k)*p_0 + hybm(k)*PS PS(time,lat,lon) */ p_0=100000.0f; // Pascals *prs_mdp[time,lev,lat,lon]=hyam*p_0+hybm*PS; *height[time,lat,lon]=0.0f; /* We now know atmospheric pressure at model mid-layers. Next, we use this data along with the geopotential height to determine the height of 850mb, 700mb, 500mb, 300mb and 250mb pressure levels. */ // FOR TESTING PURPOSES: START WITH JUST 850mb=85000.Pa for(tm_idx=0;tm_idx<$time.size;tm_idx++){ for(lat_idx=0;lat_idx<$lat.size;lat_idx++){ for(lon_idx=0;lon_idx<$lon.size;lon_idx++){ for(lev_idx=0;lev_idx<$lev.size-2;lev_idx++){ // // Pressure decreases monotonically with height // We are coming down from the top of the model (lev_idx=0->25) // Linearly interpolate between levels if(prs_mdp(tm_idx,lev_idx+1,lat_idx,lon_idx)>85000.0f && prs_mdp(tm_idx,lev_idx,lat_idx,lon_idx)<85000.0f){ // Our pressure exists between two levels -> caculate slope slope=(Z3(tm_idx,lev_idx,lat_idx,lon_idx)-Z3(tm_idx,lev_idx+1,lat_idx,lon_idx))/((prs_mdp(tm_idx,lev_idx,lat_idx,lon_idx)-prs_mdp(tm_idx,lev_idx+1,lat_idx,lon_idx))); // Calculate y-int yint=Z3(tm_idx,lev_idx,lat_idx,lon_idx)-slope*prs_mdp(tm_idx,lev_idx,lat_idx,lon_idx); // Calcuate height of specified pressure height(tm_idx,lat_idx,lon_idx)=slope*(85000.0)+yint; }else if(prs_mdp(tm_idx,lev_idx,lat_idx,lon_idx)==85000.0){ // Pressure is at hybrid level -> height equal to Z3 height(tm_idx,lat_idx,lon_idx)=Z3(tm_idx,lev_idx,lat_idx,lon_idx); } } } } } ram_write(height); ram_write(prs_mdp); nco-4.5.4/data/xmp_flx_spc.nco000066400000000000000000000011551264355130400162440ustar00rootroot00000000000000// -*-C-mode-*- /* Demonstrate processing of spectral/broadband flux data on non-linear wavelength grid Input data use naming conventions from SWNB2 radiative transfer model */ // ncap2 -O -v -S ~/nco/data/xmp_flx_spc.nco -p ${DATA}/icr swnb_sas_Smm_clr_csza1.0.nc ~/foo.nc dmn_sz_gcnet=915; defdim("gcnet",dmn_sz_gcnet); flx_spc_dwn_gcnet[gcnet]=flx_spc_dwn_snw(708:1622); flx_spc_upw_gcnet[gcnet]=alb_spc_snw(708:1622)*flx_spc_dwn_snw(708:1622); flx_bb_dwn_snw_gcnet=flx_spc_dwn_gcnet.total(); flx_bb_upw_snw_gcnet=flx_spc_upw_gcnet.total(); alb_bb_snw_gcnet=flx_bb_upw_snw_gcnet/(flx_bb_dwn_snw_gcnet+1.0e-36); nco-4.5.4/data/xmp_wnd_msk.nco000066400000000000000000000102011264355130400162400ustar00rootroot00000000000000// $Header$ -*-C++-*- /* Usage: ncap2 -O -S xmp_wnd_msk.nco in.nc out.nc */ *rho80m=1.215f; // [kg m-3] Air Density at 80m (assume to be a function of height only with US standard atmosphere rho=1.225-(1.194e10-4)*80.0 // Instantiate arrays and fill with missing values *wnd_dns[time,lat,lon]=wnd_spd_80m@_FillValue; *wnd_dns_tot[lat,lon]=wnd_spd_80m@_FillValue; *cnt_3_45[lat,lon]=wnd_spd_80m@_FillValue; *cnt_0_60[lat,lon]=wnd_spd_80m@_FillValue; *wnd_msk_3_45[time,lat,lon]=wnd_spd_80m@_FillValue; *wnd_msk_0_60[time,lat,lon]=wnd_spd_80m@_FillValue; *wnd_msk_3_45_pct[lat,lon]=wnd_spd_80m@_FillValue; *wnd_msk_0_60_pct[lat,lon]=wnd_spd_80m@_FillValue; *wnd_spd_avg[lat,lon]=wnd_spd_80m@_FillValue; *wnd_spd_sdn[lat,lon]=wnd_spd_80m@_FillValue; *wnd_spd_shp[lat,lon]=wnd_spd_80m@_FillValue; *wnd_pwr_dns[lat,lon]=wnd_spd_80m@_FillValue; *wnd_spd_80m_0_60[time,lat,lon]=wnd_spd_80m@_FillValue; *wnd_spd_80m_3_45[time,lat,lon]=wnd_spd_80m@_FillValue; *time_cnt[lat,lon]=wnd_spd_80m@_FillValue; // Set missing value attributes set_miss(wnd_dns,wnd_spd_80m@_FillValue); set_miss(wnd_dns_tot,wnd_spd_80m@_FillValue); set_miss(cnt_3_45,wnd_spd_80m@_FillValue); set_miss(cnt_0_60,wnd_spd_80m@_FillValue); set_miss(wnd_msk_3_45,wnd_spd_80m@_FillValue); set_miss(wnd_msk_0_60,wnd_spd_80m@_FillValue); set_miss(wnd_msk_3_45_pct,wnd_spd_80m@_FillValue); set_miss(wnd_msk_0_60_pct,wnd_spd_80m@_FillValue); set_miss(wnd_spd_avg,wnd_spd_80m@_FillValue); set_miss(wnd_spd_sdn,wnd_spd_80m@_FillValue); set_miss(wnd_spd_shp,wnd_spd_80m@_FillValue); set_miss(wnd_pwr_dns,wnd_spd_80m@_FillValue); set_miss(wnd_spd_80m_0_60,wnd_spd_80m@_FillValue); set_miss(wnd_spd_80m_3_45,wnd_spd_80m@_FillValue); set_miss(time_cnt,wnd_spd_80m@_FillValue); wnd_spd_80m_0_60=wnd_spd_80m; wnd_spd_80m_3_45=wnd_spd_80m; // Only want non-missing value winds between 3 and 45m/s where more than 10% of timeseries is available // Wind Power for speeds between 3 and 45 m/s wnd_msk_3_45=(wnd_spd_80m > 3.0f && wnd_spd_80m < 45.0f); // Speeds between 0 and 60 m/s wnd_msk_0_60=(wnd_spd_80m >= 0.0f && wnd_spd_80m <= 60.0f); // Count number of speeds between 3 and 45m/s cnt_3_45=(wnd_msk_3_45.total($time)); // Count number of speeds between 0 and 60m/s cnt_0_60=(wnd_msk_0_60.total($time)); time_cnt(:,:)=$time.size; wnd_msk_3_45_pct(:,:)=(cnt_3_45(:,:)/time_cnt(:,:) > 0.10f); wnd_msk_0_60_pct(:,:)=(cnt_0_60(:,:)/time_cnt(:,:) > 0.10f); // Set zeros to missing value where(cnt_3_45==0) cnt_3_45=wnd_spd_80m@_FillValue; where(wnd_msk_3_45_pct==0 || wnd_msk_3_45==0) wnd_spd_80m_3_45=wnd_spd_80m@_FillValue; // set zeros to missing value where(cnt_0_60==0) cnt_0_60=wnd_spd_80m@_FillValue; where(wnd_msk_0_60_pct==0 || wnd_msk_0_60==0) wnd_spd_80m_0_60=wnd_spd_80m@_FillValue; // Wind Speed Average for winds between 0 and 60m/s wnd_spd_avg=wnd_spd_80m_0_60.avg($time); // Wind Speed Standard Deviation for winds between 0 and 60 m/s wnd_spd_sdn=(wnd_spd_80m_0_60-wnd_spd_avg).rmssdn($time); // Wind Speed Weibull Shape for winds between 0 and 60 m/s where(wnd_spd_sdn==0.0f) wnd_spd_sdn=0.1f; wnd_spd_shp=((wnd_spd_avg/wnd_spd_sdn)^1.086f); // Wind Power Density for winds between 3 and 45m/s wnd_dns=((wnd_spd_80m_3_45^3.0f)*rho80m); wnd_dns_tot=(wnd_dns.total($time)); wnd_pwr_dns=(wnd_dns_tot/(2.0f*cnt_3_45)); // Assign attributes wnd_spd_avg@long_name="80m mean wind speed"; wnd_spd_sdn@long_name="80m wind speed standard deviation"; wnd_spd_shp@long_name="80m wind speed Weibull Shape Param"; wnd_pwr_dns@long_name="80m wind power density (3 and 45m/s)"; cnt_3_45@long_name="Number of 80m winds between 3 and 45 m/s"; cnt_0_60@long_name="Number of 80m winds between 0 and 60 m/s"; wnd_spd_avg@units="m/s"; wnd_spd_sdn@units="m/s"; wnd_spd_shp@units="dimensionless"; wnd_pwr_dns@units="W/m2"; // Write these to netCDF file ram_write(wnd_pwr_dns); ram_write(cnt_3_45); ram_write(cnt_0_60); ram_write(wnd_spd_avg); ram_write(wnd_spd_sdn); ram_write(wnd_spd_shp); // Cleanup your mess ram_delete(rho80m); ram_delete(wnd_dns); ram_delete(wnd_dns_tot); ram_delete(wnd_msk_3_45); ram_delete(wnd_msk_0_60); ram_delete(wnd_msk_3_45_pct); ram_delete(wnd_msk_0_60_pct); ram_delete(wnd_spd_80m_0_60); ram_delete(wnd_spd_80m_3_45); ram_delete(time_cnt); nco-4.5.4/debian/000077500000000000000000000000001264355130400135305ustar00rootroot00000000000000nco-4.5.4/debian/changelog000066400000000000000000000573541264355130400154200ustar00rootroot00000000000000nco (4.5.4-1) unstable; urgency=low * new upstream version ncremap fix ncpdq nfr cap, XML _Unsigned, crv dateline, GSL2 -- Charlie Zender Thu, 07 Jan 2016 12:25:12 -0700 nco (4.5.3-1) unstable; urgency=low * new upstream version nfr skl crv snwe frc_out bugs airs ncecat gag ncatted del -- Charlie Zender Sun, 18 Oct 2015 12:25:11 -0700 nco (4.5.2-1) unstable; urgency=low * new upstream version ncra --wgt nrm, --grid, --glb, Newton Gaussian -- Charlie Zender Sun, 06 Sep 2015 12:25:10 -0700 nco (4.5.1-1) unstable; urgency=low * new upstream version ncra --wgt=wgt_nm, ncap2 mibs/mabs/mebs, Tempest -- Charlie Zender Fri, 10 Jul 2015 12:25:09 -0700 nco (4.5.0-1) unstable; urgency=low * new upstream version --map, --rnr=wgt, -A provenance, [date/time]_written, ncdismember -- Charlie Zender Thu, 11 Jun 2015 12:25:08 -0700 nco (4.4.9-1) unstable; urgency=low * new upstream version (git, -x warn, crd att, cnk nco lfp, shuffle on, MM3->MM4 off, ncecat fix, climatology, ncra wgt) -- Charlie Zender Thu, 21 May 2015 12:25:07 -0700 nco (4.4.8-1) unstable; urgency=low * new upstream version (-A warn, PPC, cnk nco=rew+lfp, mabs/mebs/mibs()) -- Charlie Zender Mon, 09 Feb 2015 12:25:05 -0700 nco (4.4.7-1) unstable; urgency=low * new upstream version (-0->-1, rename bug, cnk xst, cnk_min, -X, rew, cnk_in) -- Charlie Zender Wed, 26 Nov 2014 12:25:04 -0700 nco (4.4.6-1) unstable; urgency=low * new upstream version (ncks -V, ncap2 -s -S, DAP cnf, ncra pck/mss/prm, HDF4, ncrename, NC4_SRD, -0) -- Charlie Zender Wed, 01 Oct 2014 12:25:03 -0700 nco (4.4.5-1) unstable; urgency=low * new upstream version (https DAP, gxvx, mk, ncl_var, dmn_cmn, ncpdq, C:) -- Charlie Zender Tue, 26 Aug 2014 12:25:02 -0700 nco (4.4.4-1) unstable; urgency=low * new upstream version (-x tolerance, --rad orphans, CERES, mmr, ncwa msk) -- Charlie Zender Thu, 29 May 2014 12:25:01 -0700 nco (4.4.3-1) unstable; urgency=low * new upstream version (DAP srd fix, nsm brd, rgr wrk) -- Charlie Zender Thu, 02 April 2014 12:25:00 -0700 nco (4.4.2-1) unstable; urgency=low * new upstream version (ncra.c mmr 4 LLVM/clang, -X, rx nsx, cll_mth, ncwa sng) -- Charlie Zender Thu, 20 Feb 2014 12:24:59 -0700 nco (4.4.1-1) unstable; urgency=low * new upstream version (-X grp, cnk_dmn grp, ncra_no_fl_close bugfix) -- Charlie Zender Wed, 29 Jan 2014 12:24:58 -0700 nco (4.4.0-1) unstable; urgency=low * new upstream version (hash, dyn mmr, ncra.c fixes, hdf4, autocnv, hdn, cnk) -- Charlie Zender Thu, 09 Jan 2014 12:24:57 -0700 nco (4.3.9-1) unstable; urgency=low * new upstream version (nces, XML, ncatted NaN) -- Charlie Zender Wed, 06 Dec 2013 12:24:55 -0700 nco (4.3.8-1) unstable; urgency=low * new upstream version (ncatted groups, -7, namespace safety) -- Charlie Zender Wed, 06 Nov 2013 12:24:54 -0700 nco (4.3.7-1) unstable; urgency=low * new upstream version (--mrd, --hdf4, --xml, ncrename groups) -- Charlie Zender Thu, 17 Oct 2013 12:24:53 -0700 nco (4.3.6-1) unstable; urgency=low * new upstream version (--flt, ncpdq/ncecat 1 rec dmn, ncwa/ncea fixes) -- Charlie Zender Fri, 27 Sep 2013 12:24:52 -0700 nco (4.3.5-1) unstable; urgency=low * new upstream version (ncea/ncra/ncrcat groups, --dbl, ncwa hyp/avg, ncpdq rvr) -- Charlie Zender Fri, 20 Sep 2013 12:24:51 -0700 nco (4.3.4-1) unstable; urgency=low * new upstream version (CDL legibility, ncpdq -U fix, --hdf_upk) -- Charlie Zender Thu, 01 Aug 2013 12:24:50 -0700 nco (4.3.3-1) unstable; urgency=low * new upstream version (CDL, XML, ncrename/ncwa groups) -- Charlie Zender Wed, 24 Jul 2013 12:24:48 -0700 nco (4.3.2-1) unstable; urgency=low * new upstream version (-X aux, ncflint/ncpdq -g -G --unn) -- Charlie Zender Fri, 05 Jul 2013 12:24:47 -0700 nco (4.3.1-1) unstable; urgency=low * new upstream version (ncbo -G, --unn, symmetric, grp_brd) -- Charlie Zender Wed, 01 May 2013 12:24:46 -0700 nco (4.3.0-1) unstable; urgency=low * new upstream version (ncbo -g, ncatted NULs, ncap2 rounding) -- Charlie Zender Thu, 28 Mar 2013 12:24:45 -0700 nco (4.2.6-1) unstable; urgency=low * new upstream version (--rec_apn, non-atomics, --fix_rec_crd, scope) -- Charlie Zender Tue, 19 Mar 2013 13:23:36 -0700 nco (4.2.5-1) unstable; urgency=low * new upstream version (fix ncks mk/fix_rec_dmn bugs, metadata printing) -- Charlie Zender Tue, 29 Jan 2013 11:30:42 -0800 nco (4.2.4-1) unstable; urgency=low * new upstream version (ncks & ncecat new xtr API, ncra bugfix, ncrename) -- Charlie Zender Mon, 21 Jan 2013 14:15:53 -0800 nco (4.2.3-1) unstable; urgency=low * new upstream version (GPE, ncecat fix, group atts.) -- Charlie Zender Tue, 13 Nov 2012 16:00:42 -0700 nco (4.2.2-1) unstable; urgency=low * new upstream version (ncks groups, hdr_pad, NULs, _'s, ncecat GAG) -- Charlie Zender Mon, 29 Oct 2012 16:00:42 -0700 nco (4.2.1-1) unstable; urgency=low * new upstream version (no_tmp_fl, NC_DISKLESS, -'ve -d, DRN/MRO) -- Charlie Zender Thu, 02 Aug 2012 16:00:42 -0700 nco (4.2.0-1) unstable; urgency=low * new upstream version (ncra -y ttl, %i fmt, ncwa NaN, nc__open, MVS) -- Charlie Zender Mon, 11 Jun 2012 16:00:42 -0700 nco (4.1.0-1) unstable; urgency=low * new upstream version (sorts/maps, MD5, chmod, NaNs, MM3) -- Charlie Zender Thu, 29 Mar 2012 21:45:15 -0800 nco (4.0.9-1) unstable; urgency=low * new upstream version (array(), revert NO_FILL, rounding) * debian/rules - remove CPPFLAGS += -DHAVE_NETCDF4_H hack -- Charlie Zender Mon, 13 Feb 2012 21:45:15 -0800 nco (4.0.7-1.1) unstable; urgency=low * Non-maintainer upload. * Don't ship .la files (Closes: #622527). -- Luk Claes Sun, 26 Jun 2011 09:34:27 +0200 nco (4.0.8-1) unstable; urgency=low * new upstream version (HPSS, NOFILL, CF bounds & noleap, ncatted, NC_BYTE) -- Charlie Zender Thu, 21 Apr 2011 12:06:41 -0800 nco (4.0.7-1) unstable; urgency=low * new upstream version (fix bug_hyp_dgn) * debian/control - require libcurl4-gnutls-dev as per Ivan Shmakov -- Charlie Zender Mon, 21 Feb 2011 11:30:56 -0700 nco (4.0.6-1) unstable; urgency=low * new upstream version (clang, YYYYMMDD-averaging, xtr ass crd) * debian/rules - build with dap-netcdf netcdf4 udunits2 by default -- Charlie Zender Fri, 14 Jan 2011 11:30:56 -0700 nco (4.0.5-1) unstable; urgency=low * new upstream version (fix ncks hyp NC4 bug, ncra CF crd bug) * debian/control - require libudunits2-0, libudunits2-dev * debian/rules - build with DEB_BUILD_OPTIONS='dap-netcdf netcdf4 udunits2' -- Charlie Zender Thu, 13 Oct 2010 11:30:56 -0700 nco (4.0.4-1) unstable; urgency=low * new upstream version (chunking everywhere, ncrename bugfix, ncks -m) -- Charlie Zender Thu, 02 Sep 2010 20:34:38 -0700 nco (4.0.3-1) unstable; urgency=low * new upstream version (cf_date() bug, ncbo bug, configure tweaks) * Switch to dpkg-source 3.0 (quilt) format -- Charlie Zender Thu, 02 Sep 2010 18:05:48 -0700 nco (4.0.2-1) unstable; urgency=low * new upstream version (namespace, ncatted NUL, ncap2 1-d arrays) -- Charlie Zender Sun, 27 Jun 2010 11:04:41 -0700 nco (4.0.1-1) unstable; urgency=low [ Charlie Zender ] * new upstream version (fix_rec_dmn, mk_rec_dmn, .ncrename) * debian/copyright - remove John Burkhardt * debian/control - add ${misc:Depends} [ Francesco Paolo Lovergine ] * Policy bumped to 3.8.4. * Debhelper level set to 7. * Added me as uploaders. * Removing top dir info file. -- Francesco Paolo Lovergine Mon, 26 Apr 2010 22:51:21 +0200 nco (4.0.0-1) unstable; urgency=low * new upstream version (fitting, calendar, bilinear interp) -- Charlie Zender Tue, 05 Jan 2010 12:06:24 -0800 nco (3.9.9-1) unstable; urgency=low * new upstream version (chunking, NC_STRING, GSL stats/interp, rebasing) * debian/control - Standards-Version: 3.8.2 * debian/copyright - includes everyone now * debian/compat - change from 4 to 5 -- Charlie Zender Tue, 14 Jul 2009 18:31:07 -0700 nco (3.9.8-1) unstable; urgency=low * new upstream version (DAP-netCDF, sort(), array(), GSL RNG) * debian/control - BR libnetcdf-dev - debhelper > 5 * debian/rules - remove --disable-rpath -- Charlie Zender Wed, 29 Apr 2009 13:28:07 -0700 nco (3.9.7-1) unstable; urgency=low * new upstream version (improves GSL builds, ncap2 threading) -- Charlie Zender Wed, 18 Mar 2009 16:43:24 -0700 nco (3.9.6-1) UNRELEASED; urgency=low * new upstream version (fixes MSA bug, adds GSL) -- Charlie Zender Thu, 22 Jan 2009 13:27:19 -0800 nco (3.9.5-1) UNRELEASED; urgency=low * new upstream version (MSA everywhere) -- Charlie Zender Sun, 11 May 2008 17:39:52 +0200 nco (3.9.4-1) UNRELEASED; urgency=low * new upstream version (-3, -X, --msa_usr_rdr, ncap2 mask, WIN32) -- Charlie Zender Mon, 03 Mar 2008 14:03:30 +0100 nco (3.9.3-1) UNRELEASED; urgency=low * new upstream version (SWAMP, ncecat -u, wget, ncap OpenMP, GCC 4.2) -- Charlie Zender Sat, 08 Dec 2007 15:26:47 +0100 nco (3.9.2-1) UNRELEASED; urgency=low * new upstream version (GPL3, _FillValue, UDUnits2, ncap2 printing) -- Charlie Zender Wed, 29 Aug 2007 09:01:52 -0700 nco (3.9.1-1) UNRELEASED; urgency=low * new upstream version (supports netCDF4/HDF deflation) -- Charlie Zender Fri, 29 Jun 2007 11:46:16 -0700 nco (3.9.0-1.1) unstable; urgency=low * Non-maintainer upload. * debian/rules - fixed FTBFS if build twice in a row (Closes: #442685) * debian/doc-base - changed section * debian/watch - added * debian/control - added Homepage field -- Sandro Tosi Sat, 19 Apr 2008 16:28:04 +0200 nco (3.9.0-1) unstable; urgency=low * new upstream version (includes netCDF4 atomic types) -- Charlie Zender Tue, 22 May 2007 19:04:54 -0700 nco (3.2.0-1) unstable; urgency=low * new upstream version (includes rmssdn arithmetic bugfix) -- Charlie Zender Thu, 19 Apr 2007 22:19:00 -0700 nco (3.1.9-1) unstable; urgency=low * new upstream version -- Charlie Zender Sat, 10 Mar 2007 18:47:03 -0800 nco (3.1.8-2) UNRELEASED; urgency=low * Bump version for upload to Debian unstable -- Charlie Zender Wed, 24 Jan 2007 10:03:48 -0800 nco (3.1.8-1) experimental; urgency=low * ncap2 methods work, nascent _FillValue support * Add psd.nco example for ncap2 * Fix in.nc and tst path issues in make check * Change long description * Remove unused make command in control * Change section from "math" to "science" in control and doc-base * Remove ncap_lex.c, ncap_yacc.[ch] from tarball * Remove pgiCC OpenMP threading on ncap2 * Exclude all .cvsignore's * Replace 'unstable' with 'UNRELEASED' from 3.0.0-3.1.7 * Change debian/nco.doc-base to debian/doc-base * Create non-native debian packages * Add @dircategory netCDF to nco.texi * Removed debian/docs, alphabetize control, less precise debhelper version, refine copyright history, remove debian/doc, de-comment debian/rules, * Remove debian/[postinst,prerm, postrm]. These only contained instructions for handling *.info files. Rely on dh_installinit to automagically create these instructions. * Include ncap2 executable and man page * Add package dependencies on antlr, libantlr-dev * Kludge HTML documentation location in nco.doc-base * Compile-time determination of _Fillvalue vs. missing_value -- Charlie Zender Wed, 6 Dec 2006 08:22:22 -0800 nco (3.1.7-1) UNRELEASED; urgency=low * ncap2 double-parsing, incorporate downstream debian nco_2.9.9-3 patches * Most NCO bug-fixes and features from 2.9.9--3.1.7: - ncap2 not incorporated yet because antlr dependencies not handled - libnco_c++ and lib_nco++ not build yet -- Charlie Zender Fri, 10 Nov 2006 21:32:19 -0800 nco (3.1.6-1) UNRELEASED; urgency=low * Support stride in all dimensions for all hyperslabbing operators -- Charlie Zender Mon, 18 Sep 2006 13:08:36 -0700 nco (3.1.5-1) UNRELEASED; urgency=low * Improved Pathscale/PGI/Intel compiler support, ncap2 arrays -- Charlie Zender Tue, 29 Aug 2006 10:48:55 -0700 nco (3.1.4-1) UNRELEASED; urgency=low * fix ncbo memory bug, timers, implement --clean and --dirty -- Charlie Zender Wed, 7 Jun 2006 21:24:03 -0700 nco (3.1.3-1) UNRELEASED; urgency=low * ncap2 attribute propagation, CF coordinates, ncwa -b -B, ncra 0 records -- Charlie Zender Tue, 30 May 2006 12:57:44 -0700 nco (3.1.2-1) UNRELEASED; urgency=low * packed data fixed, ncap2 in configure, ncra/ncea/ncwa behavior -- Charlie Zender Fri, 21 Apr 2006 17:46:30 -0700 nco (3.1.1-1) UNRELEASED; urgency=low * C++ builds work again, ssdap, nco++, 4.0-alpha11-compatible -- Charlie Zender Mon, 30 Jan 2006 22:23:53 -0800 nco (3.1.0-1) UNRELEASED; urgency=low * MPI ZKB, configure netcdf4/mpi, ncwa MRV, ncap rnd_nbr(), netcdf4-alpha10 -- Charlie Zender Fri, 2 Dec 2005 20:37:09 -0800 nco (3.0.3-1) UNRELEASED; urgency=low * icc9, netCDF4, configure MPI and netCDF4, better SMP -- Charlie Zender Fri, 28 Oct 2005 12:38:14 -0700 nco (3.0.2-1) UNRELEASED; urgency=low * icc, OPeNDAP, ftp, sftp, .netrc, hdr_pad, cf, bm for MPI + OPeNDAP -- Charlie Zender Mon, 22 Aug 2005 23:49:39 -0700 nco (3.0.1-1) UNRELEASED; urgency=medium * Memory purification, ncap exponentiation bugfix, threading bugfix -- Charlie Zender Fri, 10 Jun 2005 10:46:09 -0700 nco (3.0.0-1) UNRELEASED; urgency=low * 1. ncap bugfix 2. Add benchmarking 3. libnco_c++ implements nco_var_puta() -- Charlie Zender Thu, 24 Mar 2005 12:46:10 -0800 nco (2.9.9-3) unstable; urgency=low * QA upload. * Add missing build dependencies on flex and bison. * debian/rules: Add (empty) binary-indep target. Closes: #395719. * Conforms to Standards version 3.7.2. -- Matej Vela Sat, 28 Oct 2006 16:22:58 +0200 nco (2.9.9-2) unstable; urgency=medium * QA upload. * Remove unnecessary build dependency on netcdfg3; let netcdfg-dev pull in the appropriate library package. Closes: #352026. * Move libnco from /usr/lib to /usr/lib/nco. Providing a public library would require a separate libnco-2.9.9 package, which is overkill ATM. * data/udunits.dat: Used only with UDUnits, which is not packaged for Debian; remove. * debian/copyright: - Update FSF address. - Remove outdated (and no longer required) list of changes. * debian/nco.doc-base: - Word-wrap description. - Change section to Apps/Math. - Add a stanza for info files. * debian/postinst, debian/prerm, debian/info: Invoke install-info manually with a section argument as nco.info doesn't specify one. * debian/postrm: Remove cruft. * debian/rules: - Pass CFLAGS to configure. - When DEB_BUILD_GNU_TYPE and DEB_HOST_GNU_TYPE are the same, pass only --build to configure (otherwise it enters cross-compile mode). - Let dh_strip handle DEB_BUILD_OPTIONS=nostrip. * Conforms to Standards version 3.6.2. -- Matej Vela Sun, 12 Feb 2006 10:21:06 +0100 nco (2.9.9-1) unstable; urgency=medium * QA upload integrating long due changes due to Charlie Zender and Rorik Peterson. (closes: #254627,#254625,#265106) * Maintainer set to QA team. [ Rorik Peterson ] * 1. ncbo threading 2. ncpdq -P packing -- Francesco Paolo Lovergine Sat, 25 Sep 2004 12:14:26 +0200 nco (2.9.8-1) unstable; urgency=low * 1. ncpdq, 2. ncwa --msk_sng consolidated mask switch, and 3. C99 -- Charlie Zender Sat, 7 Aug 2004 14:12:51 -0700 nco (2.9.7-1) unstable; urgency=low * MFO input files from stdin, OpenMP threading in ncra -- Charlie Zender Tue, 6 Jul 2004 13:49:28 -0700 nco (2.9.6-1) unstable; urgency=low * Add -o fl_out option, change ncwa -o meaning, AMD64 build tweaks -- Charlie Zender Tue, 15 Jun 2004 09:44:15 -0700 nco (2.9.5-1) unstable; urgency=low * ncflint interpolation is commutative, libnco_c++ *.hh headers installed -- Charlie Zender Wed, 2 Jun 2004 22:15:49 -0700 nco (2.9.4-1) unstable; urgency=low * ncecat works on scalar files, AIX GCC, improved nco_tst.pl -- Charlie Zender Fri, 21 May 2004 10:52:29 -0700 nco (2.9.3-1) unstable; urgency=low * ncra/ncea arithmetic works when missing_value equals zero or any intermediate sum -- Charlie Zender Tue, 13 Apr 2004 17:18:37 -0700 nco (2.9.2-1) unstable; urgency=medium * Fix S/V, S%V, S^V, workaround broken UDUnits installations -- Charlie Zender Tue, 23 Mar 2004 07:16:59 -0800 nco (2.9.1-1) unstable; urgency=low * prp_sei, fix ncwa unpacking bug -- Charlie Zender Thu, 4 Mar 2004 17:03:18 -0800 nco (2.9.0-1) unstable; urgency=low * CF convention behaves like CSM, ncap corner cases, workaround GCC stack limitation -- Charlie Zender Wed, 25 Feb 2004 15:51:29 -0800 nco (2.8.8-1) unstable; urgency=low * --enable-[optimize/debug]-custom works again on GCC -- Charlie Zender Fri, 30 Jan 2004 15:31:09 -0800 nco (2.8.7-1) unstable; urgency=low * Default GCC builds work again, ncap packing works again -- Charlie Zender Tue, 13 Jan 2004 11:43:47 -0800 nco (2.8.6-1) unstable; urgency=low * Add -Werror to GCC compiles, fix AIX and SGI builds -- Charlie Zender Mon, 12 Jan 2004 12:12:48 -0800 nco (2.8.5-1) unstable; urgency=low * DODS support, configure.in rewrite, ncap attribute assignment fix -- Charlie Zender Wed, 7 Jan 2004 14:27:38 -0800 nco (2.8.4-1) unstable; urgency=high * Fix bug with index-based hyperslabs introduced near 2.7.4 -- Charlie Zender Tue, 25 Nov 2003 11:53:04 -0800 nco (2.8.3.5-1) unstable; urgency=low * Special version halfway to 2.8.4 for ncap bugtesting -- Charlie Zender Fri, 21 Nov 2003 14:47:14 -0800 nco (2.8.3-1) unstable; urgency=low * Fix ncap memory leak, nco_tst.sh regressions -- Charlie Zender Fri, 14 Nov 2003 17:17:23 -0800 nco (2.8.2-1) unstable; urgency=medium * missing_value fix for ncbo -- Charlie Zender Sun, 9 Nov 2003 23:28:25 -0800 nco (2.8.1-1) unstable; urgency=low * Variable wildcarding -- Charlie Zender Wed, 27 Aug 2003 11:51:16 -0700 nco (2.8.0-1) unstable; urgency=low * update sources, new operator 'ncbo' replaces 'ncdiff' -- Rorik Peterson Mon, 4 Aug 2003 10:38:58 -0800 nco (2.7.2-1) unstable; urgency=low * updated sources, changed control to build using 'configure', made nco-doc package for documentation -- Rorik Peterson Sat, 29 Mar 2003 21:09:48 -0900 nco (2.2.0-3) unstable; urgency=low * Eliminated building of dvi, postscript, and pdf documentation due to bugs in texinfo. (Closes: Bug#164977) -- Brian Mays Wed, 16 Oct 2002 09:30:31 -0400 nco (2.2.0-2) unstable; urgency=medium * Modified postinst to ignore an existing /usr/doc/$package directory. -- Brian Mays Wed, 20 Mar 2002 11:18:29 -0500 nco (2.2.0-1) unstable; urgency=low * New upstream version. -- Brian Mays Thu, 7 Feb 2002 05:42:36 -0500 nco (2.0.0-4) unstable; urgency=low * Fixed symlink /usr/doc -> ../share/doc. * Fixed reference to GPL. * Improved stripping of binaries. -- Brian Mays Fri, 1 Feb 2002 15:58:40 -0500 nco (2.0.0-3) unstable; urgency=low * Enabled building on all architectures. (Closes: Bug#121461, Bug#124105) * Fixed symlink /usr/doc -> ../share/doc. -- Brian Mays Sun, 27 Jan 2002 15:08:56 -0500 nco (2.0.0-2) unstable; urgency=low * Added build dependency on tetex-extra. (Closes: Bug#106770) -- Brian Mays Fri, 27 Jul 2001 09:09:49 -0400 nco (2.0.0-1) unstable; urgency=low * New upstream version. * Removed "-g" gcc option as per policy. -- Brian Mays Mon, 9 Jul 2001 11:26:24 -0400 nco (1.2.2-2) unstable; urgency=low * Added nettcdf-bin to Build-Depends. (Closes: Bug#87094) -- Brian Mays Thu, 22 Feb 2001 15:58:00 -0500 nco (1.2.2-1) unstable; urgency=low * New upstream version. * Updated man pages. -- Brian Mays Fri, 16 Feb 2001 16:21:26 -0500 nco (1.2.1-3) unstable; urgency=low * Fixed "Build-Depends". (Closes: Bug#85668) -- Brian Mays Mon, 12 Feb 2001 09:45:12 -0500 nco (1.2.1-2) unstable; urgency=low * Added patch from Christopher C. Chimelis to allow NCO to build on the alpha architecture. (Closes: Bug#71225) -- Brian Mays Sun, 10 Sep 2000 21:24:58 -0400 nco (1.2.1-1) unstable; urgency=low * New upstream version. -- Brian Mays Fri, 1 Sep 2000 10:46:01 -0400 nco (1.2-1) unstable; urgency=low * New upstream version. * Added more source dependencies. -- Brian Mays Fri, 4 Aug 2000 17:13:16 -0400 nco (1.1.48-1) unstable; urgency=low * New upstream version. -- Brian Mays Fri, 19 May 2000 10:23:19 -0400 nco (1.1.47-1) unstable; urgency=low * New upstream version. * Changed the control file to accurately reflect the supported architectures for this package (alpha, arm, i386, and sparc). (Closes: Bug#63943) -- Brian Mays Mon, 15 May 2000 12:42:19 -0400 nco (1.1.46-1) unstable; urgency=low * New upstream version. -- Brian Mays Sun, 12 Mar 2000 11:37:11 -0500 nco (1.1.45-2) unstable; urgency=low * Added patch from Jim Studt to port nco to ARM. (Closes: Bug#59095) -- Brian Mays Thu, 2 Mar 2000 14:55:03 -0500 nco (1.1.45-1) unstable; urgency=low * New upstream version. * New license. (It is now GPL!!) -- Brian Mays Fri, 28 Jan 2000 11:32:14 -0500 nco (1.1.43-2) non-free; urgency=low * Added build-time dependencies. (Closes: Bug#55158) -- Brian Mays Mon, 17 Jan 2000 14:14:47 -0500 nco (1.1.43-1) non-free; urgency=low * New upstream version. -- Brian Mays Fri, 31 Dec 1999 10:49:09 -0500 nco (1.1.42-1) non-free; urgency=low * New upstream version. -- Brian Mays Sun, 12 Dec 1999 16:15:13 -0500 nco (1.1.41-1) non-free; urgency=low * New upstream version. -- Brian Mays Tue, 2 Nov 1999 10:43:35 -0500 nco (1.1.39-1) non-free; urgency=low * Initial release. -- Brian Mays Fri, 8 Oct 1999 13:25:40 -0400 nco-4.5.4/debian/compat000066400000000000000000000000021264355130400147260ustar00rootroot000000000000007 nco-4.5.4/debian/control000066400000000000000000000016221264355130400151340ustar00rootroot00000000000000Source: nco Section: science Priority: optional Maintainer: Charlie Zender Uploaders: Francesco Paolo Lovergine Build-Depends: debhelper (>= 7), antlr, bison, flex, gsl-bin, libgsl0-dev, libantlr-dev, netcdf-bin, libnetcdf-dev, libcurl4-gnutls-dev, texinfo, libudunits2-0, libudunits2-dev Standards-Version: 3.8.4 Homepage: http://nco.sf.net/ Package: nco Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: command-line operators to analyze netCDF files NCO is a suite of programs known as operators. The operators are stand-alone, command-line programs executable in a POSIX shell. Operators take one or more HDF or netCDF files as input, perform operations (e.g., averaging, hyperslabbing), and produce a netCDF output file. NCO was originally designed to manipulate and analyze climate data, though it works on any netCDF format datasets. nco-4.5.4/debian/convert000066400000000000000000000044211264355130400151340ustar00rootroot00000000000000#!/bin/sh # Script to convert texinfo style man pages to groff style man pages. # sed -e '/@cindex/d /^$/s/^/.PP/ s/\\/\\\\/g s/"/@"/g s/@dots{}/.../g s/@noindent//g s/@code{\([^ }]*\)}\([^ ][^ ]*\) */ .BR \1 \2 /g s/@code{\([^}]*\)}\([^ ][^ ]*\) */ .BR "\1" \2 /g s/@code{\([^ }]*\)}\([^ ][^ ]*\)$/ .BR \1 \2/g s/@code{\([^}]*\)}\([^ ][^ ]*\)$/ .BR "\1" \2/g s/@code{\([^ }]*\)} */ .B \1 /g s/@code{\([^}]*\)} */ .B "\1" /g s/@code{\([^ }]*\)}$/ .B \1/g s/@code{\([^}]*\)}$/ .B "\1"/g s/@command{\([^ }]*\)}\([^ ][^ ]*\) */ .BR \1 \2 /g s/@command{\([^}]*\)}\([^ ][^ ]*\) */ .BR "\1" \2 /g s/@command{\([^ }]*\)}\([^ ][^ ]*\)$/ .BR \1 \2/g s/@command{\([^}]*\)}\([^ ][^ ]*\)$/ .BR "\1" \2/g s/@command{\([^ }]*\)} */ .B \1 /g s/@command{\([^}]*\)} */ .B "\1" /g s/@command{\([^ }]*\)}$/ .B \1/g s/@command{\([^}]*\)}$/ .B "\1"/g s/@file{\([^ }]*\)}\([^ ][^ ]*\) */ .BR \1 \2 /g s/@file{\([^}]*\)}\([^ ][^ ]*\) */ .BR "\1" \2 /g s/@file{\([^ }]*\)}\([^ ][^ ]*\)$/ .BR \1 \2/g s/@file{\([^}]*\)}\([^ ][^ ]*\)$/ .BR "\1" \2/g s/@file{\([^ }]*\)} */ .B \1 /g s/@file{\([^}]*\)} */ .B "\1" /g s/@file{\([^ }]*\)}$/ .B \1/g s/@file{\([^}]*\)}$/ .B "\1"/g s/@var{\([^ }]*\)}\([^ ][^ ]*\) */ .IR \1 \2 /g s/@var{\([^}]*\)}\([^ ][^ ]*\) */ .IR "\1" \2 /g s/@var{\([^ }]*\)}\([^ ][^ ]*\)$/ .IR \1 \2/g s/@var{\([^}]*\)}\([^ ][^ ]*\)$/ .IR "\1" \2/g s/@var{\([^ }]*\)} */ .I \1 /g s/@var{\([^}]*\)} */ .I "\1" /g s/@var{\([^ }]*\)}%/ .I \1/g s/@var{\([^}]*\)}$/ .I "\1"/g s/@dfn{\([^ }]*\)}\([^ ][^ ]*\) */ .IR \1 \2 /g s/@dfn{\([^}]*\)}\([^ ][^ ]*\) */ .IR "\1" \2 /g s/@dfn{\([^ }]*\)}\([^ ][^ ]*\)$/ .IR \1 \2/g s/@dfn{\([^}]*\)}\([^ ][^ ]*\)$/ .IR "\1" \2/g s/@dfn{\([^ }]*\)} */ .I \1 /g s/@dfn{\([^}]*\)} */ .I "\1" /g s/@dfn{\([^ }]*\)}$/ .I \1/g s/@dfn{\([^}]*\)}$/ .I "\1"/g s/@samp{\([^ }]*\)}\([^ ][^ ]*\) */ .BR \1 \2 /g s/@samp{\([^}]*\)}\([^ ][^ ]*\) */ .BR "\1" \2 /g s/@samp{\([^ }]*\)}\([^ ][^ ]*\)$/ .IR \1 \2/g s/@samp{\([^}]*\)}\([^ ][^ ]*\)$/ .IR "\1" \2/g s/@samp{\([^ }]*\)} */ .B \1 /g s/@samp{\([^}]*\)} */ .B "\1" /g s/@samp{\([^ }]*\)}$/ .B \1/g s/@samp{\([^}]*\)}$/ .B "\1"/g s/@\*//g s/@item */.TP .B / s/``/\\(lq/g s/'"''"'/\\(rq/g /^[A-Z][A-Z]/s/^/.SH / s/@acronym{\([^}]*\)}/\1/g /@table/d /@end table/d s/@example/.RS/ s/@end example/.RE/' | sed 's/ /\ /g' | grep -v '^ *$' nco-4.5.4/debian/copyright000066400000000000000000000071431264355130400154700ustar00rootroot00000000000000This is the Debian GNU/Linux prepackaged version of the netCDF Operators (NCO). This package was originally assembled by Brian Mays from software obtained from ftp://ftp.cgd.ucar.edu/pub/zender/nco NCO package modifications for Debian GNU/Linux made from 1999--2002 are Copyright (C) Brian Mays and were released under the GPL (on Debian systems see "/usr/share/common-licenses/GPL"). Beginning March, 2003, Charlie Zender and Rorik Peterson took over NCO Debian package maintenance and merged the code back upstream. More information at package homepage http://nco.sourceforge.net On June 15, 2003, Charlie Zender changed the NCO license, except where explicitly noted otherwise, from GPL to GPL version 2 (not any later version). Also at this time the explicit exceptions to the GPL for compatibility with the HDF, netCDF, OPeNDAP, and UDUnits licenses were formally introduced. On July 22, 2007, Charlie Zender changed the NCO licenses, except where explicitly noted otherwise, from GPL2 to GPL3 (for code) and from FDL 1.1 (or any later version) to FDL 1.2 (or any later version) for documentation. On January 20, 2009, Charlie Zender changed the NCO license for documentation, except where explicitly noted otherwise, from FDL 1.2 (or any later version) to FDL 1.3 (or any later version). On July 15, 2009, Charlie Zender added Benjamin Sittler and John Burkhardt to this copyright file to reflect their copyrights. Both retain copyright to their work which is licensed BSD-style (freely redistributable so long as copyright notices are maintained). On July 15, 2009, Charlie Zender received copyright assignments from Henry Butowsky and Karen Schuchardt. Their names were removed from the copyright statements in the files where they had been listed: nco_msa.c, nco_msa.h, and nco_aux.c. On January 26, 2010, Charlie Zender removed John Burkhardt from this copyright file after removing his gamma function code (nco_gmm.c) from the source. NCO is copyright (C) 1995--2011 Charlie Zender Portions of the following NCO files are copyright by others: nco_getopt.c: Copyright 1997, 2000, 2001, 2002, Benjamin Sittler nco_getopt.h: Copyright 1997, 2000, 2001, 2002, Benjamin Sittler License: GNU General Public License (GPL) Version 3 The full license text is at http://www.gnu.org/copyleft/gpl.html and in the file nco/doc/LICENSE in the NCO source distribution. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 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. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 On Debian GNU/Linux systems, the complete text of the GNU General Public License can be found in "/usr/share/common-licenses/GPL". nco-4.5.4/debian/doc-base000066400000000000000000000007541264355130400151360ustar00rootroot00000000000000Document: nco Title: NCO User's Guide Author: zender@uci.edu Abstract: This manual describes the netCDF Operators, NCO. NCO is a suite of programs, or operators, that take netCDF files as input, perform an operation (e.g. averaging or hyperslabbing) and produce an output netCDF file. Section: Science/Data Analysis Format: info Index: /usr/share/info/nco.info.gz Files: /usr/share/info/nco.* Format: HTML Index: /usr/share/doc/nco/html/index.html Files: /usr/share/doc/nco/html/*.html nco-4.5.4/debian/files000066400000000000000000000000431264355130400145520ustar00rootroot00000000000000nco_4.2.0-1_i386.deb math optional nco-4.5.4/debian/info000066400000000000000000000000161264355130400144030ustar00rootroot00000000000000doc/nco.info* nco-4.5.4/debian/rules000077500000000000000000000106411264355130400146120ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- # Purpose: debian/rules file for NCO # Copyright (C) 1999--2002 by Brian Mays # Copyright (C) 2003--2011 by Charlie Zender # Usage: # scp ~/nco/debian/rules givre.ess.uci.edu:nco/debian # Sample debian/rules that uses debhelper # GNU copyright 1997 to 1999 by Joey Hess # Modified to make a template file for a multi-binary package with separated # build-arch and build-indep targets by Bill Allombert 2001 # Uncomment this to turn on verbose mode #export DH_VERBOSE=1 # Export this to make some magic below work export DH_OPTIONS # These are used for cross-compiling and for saving the configure script # from having to guess our platform (since we know it already) DEB_HOST_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE) DEB_BUILD_GNU_TYPE ?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE) ifeq ($(DEB_BUILD_GNU_TYPE), $(DEB_HOST_GNU_TYPE)) confflags := --build=$(DEB_BUILD_GNU_TYPE) else confflags := --build=$(DEB_BUILD_GNU_TYPE) --host=$(DEB_HOST_GNU_TYPE) endif export CFLAGS := -Wall -g ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS))) CFLAGS += -O0 else CFLAGS += -O2 endif # 20110114 Enable dap-netcdf netcdf4 udunits2 build options by default # Allow them to be turned off by putting disable-XXX in DEB_BUILD_OPTIONS ifneq (,$(findstring disable-dap-netcdf,$(DEB_BUILD_OPTIONS))) confflags += --disable-dap-netcdf else confflags += --enable-dap-netcdf endif ifneq (,$(findstring disable-netcdf4,$(DEB_BUILD_OPTIONS))) confflags += --disable-netcdf4 else confflags += --enable-netcdf4 endif ifneq (,$(findstring disable-udunits2,$(DEB_BUILD_OPTIONS))) confflags += --disable-udunits2 else confflags += --enable-udunits2 endif # Make Debian-default netCDF directories override development netCDF installations in, e.g., /usr/local # 20070721: This may inadvertently cause libtool to set set rpath # In turn this generates linda warnings about hard-coded rpath # Since their Debian packages exist, always enable GSL and ncap2 # Environment variables NETCDF*, defined in Zender's bashrc, often confuse Debian # Debian requires that libraries are known by package-manager # Thus environment variables that point, e.g., to /usr/local, are unhelpful config.status: configure dh_testdir # 20140413 call dh_autoreconf before calling configure (in build or configure target) per Debian Bug #744476 dh_autoreconf LD_LIBRARY_PATH='' LDFLAGS='' NETCDF_INC='/usr/include' NETCDF_LIB='/usr/lib' NETCDF_ROOT='/usr' NETCDF4_ROOT='/usr' \ ./configure $(confflags) \ --prefix=/usr \ --infodir=/usr/share/info \ --libdir=/usr/lib/nco \ --mandir=/usr/share/man \ --enable-gsl \ --enable-ncap2 \ --disable-dap-opendap \ --disable-nco_cplusplus \ --disable-udunits \ --disable-static # Architecture build: build-arch build-arch: build-arch-stamp build-arch-stamp: config.status $(MAKE) cd doc && $(MAKE) html cd doc && $(MAKE) nco.info # Documentation to distribute in future # cd doc && $(MAKE) nco.ps # cd doc && $(MAKE) nco.dvi clean: dh_testdir dh_testroot rm -f build-arch-stamp build-indep-stamp config-stamp [ ! -f Makefile ] || $(MAKE) distclean rm -f data/big.nc # 20140413 call dh_autoreconf_clean before dh_clean in the clean target per Debian Bug #744476 dh_autoreconf_clean dh_clean install: install-arch install-arch: dh_testdir dh_testroot dh_clean -a dh_installdirs -a # Commands to install architecture part of package into debian/tmp $(MAKE) install DESTDIR=$(CURDIR)/debian/nco rm `find $(CURDIR)/debian -name '*.la'` # NCO installs header files by default, which Debian does not want (yet) dh_install -a --exclude="*.h *.hh" # Must not depend on anything # This is to be called by binary-arch/binary-multi in another 'make' thread binary-common: dh_testdir dh_testroot dh_installchangelogs doc/ChangeLog dh_installdocs install -d debian/nco/usr/share/doc/nco/html install -m 644 doc/nco.html/*.html debian/nco/usr/share/doc/nco/html rm -f debian/nco/usr/share/info/dir dh_installinfo dh_installman dh_link dh_strip dh_compress dh_fixperms dh_installdeb dh_shlibdeps dh_gencontrol dh_md5sums dh_builddeb # Build architecture independant packages using the common target binary-indep: build install # Build architecture dependant packages using the common target binary-arch: build-arch install-arch $(MAKE) -f debian/rules DH_OPTIONS=-a binary-common binary: binary-indep binary-arch .PHONY: build clean binary-indep binary-arch binary install install-arch nco-4.5.4/debian/source/000077500000000000000000000000001264355130400150305ustar00rootroot00000000000000nco-4.5.4/debian/source/format000066400000000000000000000000141264355130400162360ustar00rootroot000000000000003.0 (quilt) nco-4.5.4/debian/watch000066400000000000000000000000741264355130400145620ustar00rootroot00000000000000version=3 http://dust.ess.uci.edu/nco/src/nco-(.*)\.tar\.gz nco-4.5.4/doc/000077500000000000000000000000001264355130400130535ustar00rootroot00000000000000nco-4.5.4/doc/.gitignore000066400000000000000000000003201264355130400150360ustar00rootroot00000000000000# Git-ignore patterns for ~/nco/doc /Makefile /nco.html /nco.info* /nco.ps.gz /nco.ps /nco.pdf /nco.txt /nco.xml /nco.aux /nco.cp /nco.cps /nco.dvi /nco.fn /nco.ky /nco.log /nco.pg /nco.toc /nco.tp /nco.vr nco-4.5.4/doc/.htaccess000066400000000000000000000000201264355130400146410ustar00rootroot00000000000000Options Indexes nco-4.5.4/doc/ANNOUNCE000066400000000000000000000221461264355130400142110ustar00rootroot00000000000000$Header$ -*-text-*- The netCDF Operators NCO version 4.5.4 are ready. http://nco.sf.net (Homepage, Mailing lists) http://github.com/nco (Source Code, Releases, Developers) We are pleased to introduce ncremap, a new operator for regridding. ncremap is a shell script that wraps ncks to produce a friendly interface to regridding features. Without any external dependencies, ncremap applies weights from a pre-exisiting mapfile to a source data file to produce a regridded dataset. Source and destination datasets may be on any Curvilinear, Rectangular, or Unstructured Data (CRUD) grid. When necessary ncremap calls ESMF_RegridWeightGen or TempestRemap to generate weights and uses those to regrid. ncremap hides the complexity of regridding from the user, who can know next-to-nothing about regridding. Work on NCO 4.5.5 has commenced and will better support eliciting latitude/longitude coordinates using the CF "coordinates" convention and regridding variables whose horizontal dimensions are not the most-rapidly-varying, and ncremap support for calling TempestRemap. Enjoy, Charlie NEW FEATURES (full details always in ChangeLog): A. ncremap: A new netCDF operator for regridding. ncremap is a shell script that wraps ncks to produce a friendly interface to regridding features. Without any external dependencies, ncremap applies weights from a pre-exisiting mapfile to input data file(s) to produce a regrided dataset(s). Source and destination datasets may be on any Curvilinear, Rectangular, or Unstructured Data (CRUD) grid. ncremap will also, when necessary, use external programs (ESMF's ESMF_RegridWeightGen (ERWG), or TempestRemap's GenerateOverlapMesh/GenerateOfflineMap) to generate weights and mapfiles and use those to regrid. ERWG is distributed in binary format with NCL, which many (most?) users already have on their system. Or ERWG and TempestRemap may be installed from source. Please try ncremap and send us your feedback and suggestions. Examples: ncremap -i src.nc -d dst.nc -o out.nc ls gcm14*cam*0007*.nc | ncremap -a conserve -M -d dst_1x1.nc -O ~/rgr http://dust.ess.uci.edu/smn/pst_nco_agu_201512.pdf # AGU Poster http://nco.sf.net/nco.html#ncremap B. ncks prints XML "_Unsigned" attribute for unsigned attribute types. Formerly, ncks did not preserve the signedness of attributes. Thanks to Aleksandar Jelenak and Ed Armstrong for this suggestion. % ncks -v att_var --xml ~/nco/data/in_4.nc | grep Unsigned http://nco.sf.net/nco.html#xml C. ncap2 now accepts [] and () syntax interchangeably. Expressions which formerly had to use one or the other can now use either. Brought to you by Henry. D. ncap2 now conforms arrays by hyperslabbed dimension size rather than by dimension name. This mean, e.g., that hyperslabs from one dimension can be used to fill-in other dimensions. A prototypical example is determining pressure thickness of layers as the difference between interface pressure levels. For hybrid coordinate system models like CAM, this is now a (relatively) simple two-step command with a mixture of different dimensions on the LHS and RHS: prs_ntf[time,lat,lon,ilev]=P0*hyai+PS*hybi; // Interface pressures prs_dlt[time,lat,lon,lev]=prs_ntf(:,:,:,1:$ilev.size-1)-prs_ntf(:,:,:,0:$ilev.size-2); http://nco.sf.net/nco.html#pdel Thanks to Philip Cameron-Smith for suggesting and to Henry Butowsky for implementing this new feature. E. NCO now treats variables named wgt_* as weights and avoids performing math on them when possible. E.g., ncbo will preserve (and not difference) the variable wgt_1. This is the same behavior that NCO uses for coordinates, "gw", and masks (named with msk_*.) The idea is that weights are a property of the grid and should not be differenced, averaged, etc., unless necesssary. http://nco.sf.net/nco.html#prc_xcp F. ncap2 now accepts "sum" as a synonym for "total" in its methods. Additionally, ncap2 has a new function, ncap_stats_wvariance(var,wgt) to computed weighted standard deviations where missing values may be present. Additionally, ncap2 now builds with GSL 2.x. All thanks to Henry. http://nco.sf.net/nco.html#ncap2 BUG FIXES: A. ncks -V in (at least) versions 4.5.1--4.5.3 could segfault. NB: This is the "-V" (uppercase) not "-v" (lowercase) option. The workaround is not to use -V, solution is to upgrade to 4.5.4. Thanks to Patrick Nichols for reporting the problem. B. After dimension reduction operations, ncra and ncwa excise the reduced dimensions from the CF "coordinates" attribute, if any. Versions 4.4.9--4.5.3 could, under certain circumstances involving multiple dimensions, retain extra whitespace in "coordinates". A workaround is to dump (ncks --cdl in.nc > out.cdl) then regenerate (ncgen -b out.nc out.cdl) the file. The solution is to upgrade to 4.5.4. Thanks to Richard Strub for reporting the problem. KNOWN PROBLEMS DUE TO NCO: This section of ANNOUNCE reports and reminds users of the existence and severity of known, not yet fixed, problems. These problems occur with NCO 4.5.3 built/tested with netCDF 4.4.0-development (20160101) on top of HDF5 hdf5-1.8.13 with: cd ~/nco;./configure # Configure mechanism -or- cd ~/nco/bld;make dir;make allinone # Old Makefile mechanism A. NOT YET FIXED (NCO problem) Correctly read arrays of NC_STRING with embedded delimiters in ncatted arguments Demonstration: ncatted -D 5 -O -a new_string_att,att_var,c,sng,"list","of","str,ings" ~/nco/data/in_4.nc ~/foo.nc ncks -m -C -v att_var ~/foo.nc 20130724: Verified problem still exists TODO nco1102 Cause: NCO parsing of ncatted arguments is not sophisticated enough to handle arrays of NC_STRINGS with embedded delimiters. B. NOT YET FIXED (NCO problem?) ncra/ncrcat (not ncks) hyperslabbing can fail on variables with multiple record dimensions Demonstration: ncrcat -O -d time,0 ~/nco/data/mrd.nc ~/foo.nc 20140826: Verified problem still exists 20140619: Problem reported by rmla Cause: Unsure. Maybe ncra.c loop structure not amenable to MRD? Workaround: Convert to fixed dimensions then hyperslab KNOWN PROBLEMS DUE TO BASE LIBRARIES/PROTOCOLS: A. NOT YET FIXED (netCDF4 or HDF5 problem?) Specifying strided hyperslab on large netCDF4 datasets leads to slowdown or failure with recent netCDF versions. Demonstration with NCO <= 4.4.5: time ncks -O -d time,0,,12 ~/ET_2000-01_2001-12.nc ~/foo.nc Demonstration with NCL: time ncl < ~/nco/data/ncl.ncl 20140718: Problem reported by Parker Norton 20140826: Verified problem still exists 20140930: Finish NCO workaround for problem Cause: Slow algorithm in nc_var_gets()? Workaround #1: Use NCO 4.4.6 or later (avoids nc_var_gets()) Workaround #2: Convert file to netCDF3 first, then use stride B. NOT YET FIXED (netCDF4 library bug) Simultaneously renaming multiple dimensions in netCDF4 file can corrupt output Demonstration: ncrename -O -d lev,z -d lat,y -d lon,x ~/nco/data/in_grp.nc ~/foo.nc # Completes but file is unreadable ncks -v one ~/foo.nc 20150922: Confirmed problem reported by Isabelle Dast, reported to Unidata 20150924: Unidata confirmed problem 20151221: Verified problem still exists in netCDF library Bug tracking: https://www.unidata.ucar.edu/jira/browse/fxm More details: http://nco.sf.net/nco.html#ncrename_crd C. NOT YET FIXED (would require DAP protocol change?) Unable to retrieve contents of variables including period '.' in name Periods are legal characters in netCDF variable names. Metadata are returned successfully, data are not. DAP non-transparency: Works locally, fails through DAP server. Demonstration: ncks -O -C -D 3 -v var_nm.dot -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc # Fails to find variable 20130724: Verified problem still exists. Stopped testing because inclusion of var_nm.dot broke all test scripts. NB: Hard to fix since DAP interprets '.' as structure delimiter in HTTP query string. Bug tracking: https://www.unidata.ucar.edu/jira/browse/NCF-47 D. NOT YET FIXED (would require DAP protocol change) Correctly read scalar characters over DAP. DAP non-transparency: Works locally, fails through DAP server. Problem, IMHO, is with DAP definition/protocol Demonstration: ncks -O -D 1 -H -C -m --md5_dgs -v md5_a -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc 20120801: Verified problem still exists Bug report not filed Cause: DAP translates scalar characters into 64-element (this dimension is user-configurable, but still...), NUL-terminated strings so MD5 agreement fails "Sticky" reminders: A. Reminder that NCO works on most HDF4 and HDF5 datasets, e.g., HDF4: AMSR MERRA MODIS ... HDF5: GLAS ICESat Mabel SBUV ... HDF-EOS5: AURA HIRDLS OMI ... B. Pre-built executables for many OS's at: http://nco.sf.net#bnr nco-4.5.4/doc/AUTHORS000066400000000000000000000005441264355130400141260ustar00rootroot00000000000000Charlie Zender CZ holds all copyright on NCO code. All other contributors have assigned their copyright to Zender, or did not make contributions that are legally significant for copyright purposes. These contributors are all listed under "Contributors" in the Users Guide documentation (nco.texi) at http://nco.sf.net/nco.html#ppl nco-4.5.4/doc/ChangeLog000066400000000000000000016477261264355130400146540ustar00rootroot000000000000002016-01-07 Charlie Zender * NCO 4.5.4 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4 final changes';git push git tag -a 4.5.4 -m 'Version 4.5.4 new features: ncremap fix ncpdq nfr cap, XML _Unsigned, crv dateline, GSL2';git push --tags 2016-01-04 Charlie Zender * Change copyright year to 2016 2016-01-04 Henry Butowsky * Add sum() as synonym for total() in ncap2 aggregate methods * ncap2 method ncap_stats_wvariance(var,weight) conforms wgt to var 2016-01-03 Henry Butowsky * First-cut of custom method weighted variance for Christine smit v=ncap_stats_wvariance(var,weight) 2016-01-01 Charlie Zender * Complete ncremap documentation, including limitations * ncremap recover gracefully from Tempest failures (false negative return codes) * Implement -E and -T for ESMF and TempestRemap options * Remove --src/dst_regional switches from ESMF default * Change default ESMF interpolation algorithm from bilinear to conserve 2015-12-31 Charlie Zender * Add ncremap TempestRemap option with -w 'tempest' * NCO 4.5.4-beta04 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-beta04 final changes';git push git tag -a 4.5.4-beta04 -m 'Version 4.5.4-beta04 new features: ncremap solidity';git push --tags * Barrage of tweaks to give ncremap sensible defaults on non-CSZ machines * Add ncremap -M mlt_map_flg toggle switch, clean-up examples, finish documentation 2015-12-30 Charlie Zender * Support specifying source grid instead of inferring from source file * Re-arrange ncremap options again, use -i for in_fl, -s for src_grd * Add MODIS L2 coordinate information to usual suspects database * Introduce basic background parallelism and PID-based status checking into ncremap * Note that inferred ACME grids are unusable by ERWG due to lack of corner information 2015-12-29 Charlie Zender * Treat variables named wgt_* like coordinates (and gw and msk_*): avoid math when possible 2015-12-28 Charlie Zender * Restructure ncremap to use -m map_fl and allow stdin 2015-12-24 Charlie Zender * Improve ncremap documentation in nco.texi * Fix mebs formula in nco.texi 2015-12-23 Charlie Zender * NCO 4.5.4-beta03 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-beta03 final changes';git push git tag -a 4.5.4-beta03 -m 'Version 4.5.4-beta03 new features: ncremap in autotools;ncpdq bug;netCDF 4.4.0 tokens';git push --tags * Finish minimal ncremap.1 man page * Note ncra test #39 is expected to fail due to TODO nco1126 * Add ncremap script to bin directory in data/Makefile.am, bld/Makefile, man/Makefile.am, man/man1 * Simplify broken ncpdq handling of dimension reversal list. Change dmn_rvr_rdr from static to dynamic array. Prevent writing past end of dmn_rvr_rdr. Index dmn_rvr_rdr same as dmn_rdr. Fixes Feng Ding's command: ncpdq -O -a StdPressureLev,GeoTrack,GeoXTrack ${DATA}/hdf/AIRS.2014.10.01.202.L2.RetStd.v6.0.11.0.G14275134307.hdf.nc ~/foo.nc Breaks regression test ncpdq #41 2015-12-22 Charlie Zender * Backward-compatible definitions of new tokens in netCDF 4.4.0 including NC_FORMATX_* tokens and NC_FORMAT_64BIT_[DATA/OFFSET] for CDF5 * Add XLAT_M, XLONG_M coordinates to regridder database of usual suspects * Re-assign some ncremap switches to be more heuristic * Add ncremap to documentation 2015-12-21 Charlie Zender * Compare grid spans and interfaces in single-precision (e.g., to 180.0f, 360.0f) to be more error-tolerant * ncremap pass through dbg_lvl >= 3 to ncks, enable user-defined thr_nbr 2015-12-20 Charlie Zender * NCO 4.5.4-beta02 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-beta02 final changes';git push git tag -a 4.5.4-beta02 -m 'Version 4.5.4-beta02 new features: fix nfr lon 180; free nc_string patch';git push --tags * Check for lon == -180 not lon == 180 when inferring longitude grid-type lon_typ 2015-12-18 Charlie Zender * Use ignore environment to protect comments from PDF documentation (which ignores @c comment sentinels!) 2015-12-17 Charlie Zender * Free var.val.sngp[:] before freeing var.val.vp in nco_prn.c (patch from Pedro) 2015-12-16 Charlie Zender * NCO 4.5.4-beta01 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-beta01 final changes';git push git tag -a 4.5.4-beta01 -m 'Version 4.5.4-beta01 new features: fix nfr cap grd; ncremap';git push --tags * Move grid-span check from curvilinear code to work for all grids * Restrict inferred rectangular lat boundaries to [-90.0,90.0] when extrapolating from grid centers * Propagate 20151214 commit *.g changes into *.[ch]pp files 2015-12-14 Charlie Zender * Fix typo in AIRS HDF dimension name 2015-12-14 Henry Butowsky * Fix assign when var is in input but not read during assign action e.g., time=10; ncap2 -O -v -s 'one_dmn_rec_var=0' in.nc foo.nc;ncks -v one_dmn_rec_var -C -m -H foo.nc 2015-12-08 Charlie Zender * sld_nco.sh now infers destination grid from -d dst_fl * Ignore masked values diagnostic grid span for curvilinear grids 2015-12-07 Charlie Zender * NCO 4.5.4-alpha04 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-alpha04 final changes';git push git tag -a 4.5.4-alpha04 -m 'Version 4.5.4-alpha04 new features: nfr POP CICE, nfr 1D, XML _Unsigned att, ncap2';git push --tags * Print XML "_Unsigned" attribute to denote unsigned attribute types as per Aleksandar Jelenak and Ed Armstrong * Patches to correctly infer grids for POP, CICE, CLM2 files * Allow corners not to be inferred for unstructured grids * Define M_LN10 and M_LN2 for Cygwin so PPC compiles. Update M_PI. 2015-12-06 Charlie Zender * Account for missing values in curvilinear coordinate center and mask grids when diagnosing extrapolation issues and grid span * In nco_grd_nfr(), convert input mask values that are missing value to integer zero for output 2015-12-05 Charlie Zender * Improve nco_grd_mk() and nco_grd_nfr() regression tests, and make them passable, finally * Regression tests for ncpdq now work for netCDF4 in.nc by checking answers independent of chunking text 2015-12-04 Henry Butowsky * Modify where statment such that the assign statment in where body is NOT missing value aware 2015-12-04 Henry Butowsky * Parser can now cast variables with (): temp($time,lev,$lat,$lon)=0.0; is equivalent to temp[$time,lev,$lat,$lon]=0.0 * In the conflict between a function call and a cast the function call wins e.g., tally=three_dmn_var_int.total($time,$lat,$lon) is valid and total($time,$lat,$lon)=1.0d is invalid 2015-12-01 Charlie Zender * Allow input masks of any type in nco_grd_nfr() (CICE has tmask as NC_FLOAT) and always convert output to NC_INT * Add tmask as usual suspect for mask in nco_grd_nfr() * NCO 4.5.4-alpha03 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-alpha03 final changes';git push git tag -a 4.5.4-alpha03 -m 'Version 4.5.4-alpha03 new features: nfr crv dateline swaths';git push --tags 2015-11-29 Charlie Zender * Restrict grid to real latitudes and to the 360-degree range detected from input cell-centers * nco_grd_nfr() sanity-check for extrapolated corners outside [-90.0,90.0], [-180.0,360.0] 2015-11-19 Charlie Zender * NCO 4.5.4-alpha02 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-alpha02 final changes';git push git tag -a 4.5.4-alpha02 -m 'Version 4.5.4-alpha02 new features: crd xcs, skl bug, GSL2';git push --tags * Correct whitespace when excising dimension names from "coordinates" attribute in nco_cnv_cf_cll_mth_add() after dimension reduction operations 2015-11-18 Charlie Zender * Expose interpolation algorithm to sld_nco.sh with -a (bilinear|patch|neareststod|nearestdtos|conserve) * Only pass variable list to ncks in regridding phase of sld_nco.sh * Add nTimes and nXtrack to usual suspect list for lat/lon to support OMI L2 data 2015-11-17 Charlie Zender * Merge Wenshan's patch to accept CICE dimensions TLAT,ULAT,TLONG,ULONG * Add latt_bounds, latu_bounds, lont_bounds, lonu_bounds to regrid exclusion list (for CICE) as per Wenshan * Initialize lat/lon/col_nm_out in nco_grd_mk() skeleton code (broken in 4.5.3?) 2015-11-12 Charlie Zender * Remove "l" suffix from NC_LONG integer constants (which are deprecated) so buggy ncgen 4.4.0 can parse in.cdl 2015-11-09 Charlie Zender * Thoroughly run autoconf to propagate GSL changes 2015-11-08 Charlie Zender * Add hyai, hybi to in.cdl and prs_dlt example to manual 2015-11-08 Henry Butowsky * Support GSL library version 2.x. Modify configure.ac, config.h.in. Add tokens: #define NCO_GSL_VERSION = 100 * NCO_GSL_MAJOR_VERSION + NCO_GSL_MINOR_VERSION * Downstream GSL mods in fmc_gsl_cls.cc, fmc_gsl_cls.hh 2015-10-30 Charlie Zender * Add stdin infrastructure for passing regridding file list * NCO 4.5.4-alpha01 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.4-alpha01 final changes';git push git tag -a 4.5.4-alpha01 -m 'Version 4.5.4-alpha01 tag: 100% Geometry';git push --tags * Check-for and if found, retain, record dimension property during regridding 2015-10-27 Charlie Zender * Ensure dim[idx].val.vp is NULL-initialized (and thus not inadvertently free'd) when PRN_DMN_IDX_CRD_VAL is False Fixes GitHub issue #18 reported by Pat Nichols 2015-10-21 Charlie Zender * Change ncap2 token names to, e.g., NCAP_FLOAT, NCAP_INT, etc to prevent namespace clashes with FLOAT, INT, ... in MSVC windef.h 2015-10-20 Charlie Zender * NCO 4.5.3 release procedure: Changes since nco-4.5.2: nfr skl crv snwe frc_out bugs airs ncecat gag ncatted del cd ~/nco;git commit -a -m 'Version 4.5.3 release final changes';git push git tag -d 4.5.3;git push origin :refs/tags/4.5.3 git tag -a 4.5.3 -m 'Version 4.5.3 tag: Mad Men';git push --tags * Hardwire 'make tst' in nco_c++ to build in.nc before running nco_c++/tst... 2015-10-18 Charlie Zender * NCO 4.5.3-beta01 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-beta01 final changes';git push git tag -a 4.5.3-beta01 -m 'Version 4.5.3-beta01 tag: nfr skl crv snwe frc_out bugs airs ncecat gag ncatted del';git push --tags * NCO 4.5.3-alpha08 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha08 final changes';git push git tag -a 4.5.3-alpha08 -m 'Version 4.5.3-alpha08 tag: frc_out nrm bugs';git push --tags * Index frc_out by grd_sz_out not var_sz_out to prevent accessing out-of-range values This bug affected non-conservative regridding of multi-level fields It was present in 4.5.2 though only for flg_frc_nrm, whose truth condition was quite narrow In 4.5.2 it might affect multi-level fields that have no missing values * Sometime post 4.5.2, I inadvertently changed the flg_frc_nrm block from only operating when !has_mss_val to only operating when has_mss_val. Block had no missing_value checks so missing_values could be used arithmetically, and then converted to non-missing_values, and then renormalized in the regular normalization loop for missing_values. This only affected non-conservative interpolation maps, i.e., bilinear maps. Users reported NC_ERANGE errors. Once this and above problem (which was logically separated, but compounded issues) were fixed, valgrind was clean and all tests pass. 2015-10-16 Charlie Zender * Automake stopped building *.nc files in data before compiling src, causes breakage on tests * Deprecate WIN32_LEAN_AND_MEAN, move MSC_VER headers to nco_fl_utl.h * Hard-code GeoTrack and GeoXTrack dimension names (DAP translations of longer originals) * Provide defaults for HOSTNAME and DATA in sld_nco.sh 2015-10-14 Charlie Zender * Implement --rgr tst=val as a generic key for testing, use it to test climo failure mode 2015-10-13 Charlie Zender * Use lat_nm_out,lon_nm_out instead of "lat","lon" in cell_methods 2015-10-12 Charlie Zender * Add infrastructure for non-MRV regridding 2015-10-11 Charlie Zender * Fix lvl_nbr for 1D output grids (underestimated lvl_nbr by factor of last non-spatial dimension) * Allow non-MRV variables to be defined in output and sent to regridding * NCO 4.5.3-alpha07 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha07 final changes';git push git tag -a 4.5.3-alpha07 -m 'Version 4.5.3-alpha07 tag: lat/lon/col_nm_in/out, min/max_index(), ';git push --tags * Disambiguate lat/lon/col_nm into lat/lon/col_nm_in, lat/lon/col_nm_out (so regridded output need not use, e.g., GeoTrack as name) 2015-10-11 Henry Butowsky * First cut methods min_index() & max_index() return indices in variable min or max attribute 2015-10-10 Charlie Zender * Warn in all situations when horizontal spatial dimensions are not last dimensions of input file 2015-10-09 Charlie Zender * Hard-code AIRS L2 dimension names: Geo[X]Track:L2_Standard_atmospheric&surface_product * Hard-code AIRS L3 dimension names: [XY]Dim:location * Fix new logic bug in nco_grd_nfr() 2015-10-05 Charlie Zender * NCO 4.5.3-alpha06 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha06 final changes';git push git tag -a 4.5.3-alpha06 -m 'Version 4.5.3-alpha06 tag: curvilinear regridding';git push --tags * Regridded WRF looks OK---range and location are good. Still need precise evaluation. * Wow, curvilinear grids now actually run, though flg_grd_out_crv only reaches half-way to the end of nco_rgr_map() * Introduce flg_grd_out_crv in nco_rgr_map() * Update maps to 20150901 versions in NCO regression tests, everything passes on dust 2015-10-04 Charlie Zender * Saw "The Maritan". Psyched to do NASA work. nco_grd_nfr() now correctly infers WRF. 2015-10-02 Charlie Zender * Re-establish dust.ess.uci.edu as regression test server for scp * Add ncrename regression test simultaneously renaming multiple dimensions * NCO 4.5.3-alpha05 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha05 final changes';git push git tag -a 4.5.3-alpha05 -m 'Version 4.5.3-alpha05 tag: ncatted, mk crv, lon_crv, sph_plg';git push --tags * Fix (relatively bad) bug introduced in 4.5.1 where blank attribute names dump core rather than expanding into all attribute names * Add ncatted regression test for deleting all attributes 2015-10-01 Charlie Zender * nco_grd_mk() constructs correct degenerate SLD grids (verified area, corners) * Apply nco_sph_plg_area() to SLD * Functionalize spherical polygon area calculation into nco_sph_plg_area() 2015-09-30 Charlie Zender * Corrected UL corner, but SCRIP file still appears to be invalid 2015-09-29 Charlie Zender * Hand-correcting curvilinear algorithm... * ERWG and Tempest flag problems with inferred curvilinear SCRIP grids * nco_rgr_map() tests output grid for curvilinearity * Document regridding skl and nfr switches 2015-09-28 Charlie Zender * Fix compiler diagnosis for gcc/g++ * NCO 4.5.3-alpha04 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha04 final changes';git push git tag -a 4.5.3-alpha04 -m 'Version 4.5.3-alpha04 tag: nfr SLD, skl, disable-doc, MPAS-O, snwe, wesn';git push --tags * nco_grd_nfr() appears to correctly infer SLD grids from grid centers, cannot verify until nco_rgr_map() reads SLD files * Add idx_dbg point-debugging feature for SLD 2015-09-27 Charlie Zender * Temporarily change regression scp location from givre to glace * First stab at inferring curvilinear grid from input file * Change sense of normalization when frac_b contains non-unity elements (could interfere with flg_rnr?) * Automatically add frc_out (i.e., frac_b) to output when remapping is conservative and frac_b contains non-unity elements * Verified that MPAS-O regridding is not yet conservative--masking problem? 2015-09-25 Charlie Zender * Regridding appears to work on MPAS-O fields once nCells is last dimension * Apply Tempest src_grid_dims workaround to faulty MPAS-O src_grid_dims (solves MPAS Ocean problem) 2015-09-22 Charlie Zender * Implement configure --enable_doc option, attempt and fail to override this if makeinfo version < 4.8 2015-09-20 Charlie Zender * Change auxiliary coordinate input from float to double * Add SNWE and WESN input options for bounding boxes 2015-09-20 Henry Butowsky * Modify ncap_var_var_op() so that missing values in both operands are equal This is expensive when all the missing values in one operand must be replaced So for example if v1 and v2 have different mss_val then diff1=diff2 where diff1=total((v1-v2)^2) and diff2=total((v2-v1)^2)) 2015-09-17 Charlie Zender * Add skeleton output grid capability with --rgr skl=fl_skl * Document regional features NSEW in nco.texi * round() integer-type extensive variables 2015-09-16 Charlie Zender * NCO 4.5.3-alpha03 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha03 final changes';git push git tag -a 4.5.3-alpha03 -m 'Version 4.5.3-alpha03 tag: --xtn --extensive, ncks HINT, ncecat --gag fix';git push --tags * Add regression test (the first one!) for ncecat --gag * Reset rcd in ncecat after checking for group existence. Caused ncecat --gag to die. Problem introduced in 4.4.9 on 20150515, and reported by Huan Wu. * ncks exit with error when regridding specified without output file 2015-09-15 Charlie Zender * Implement SLD stubs in nco_grd_nfr() * Check return codes in sld_nco.sh * Fix grid infer problem caused by segregating lat_typ from grd_typ 2015-09-14 Charlie Zender * Diagnosed lat, lon, 2D grid-types now self-consistent for regional grids * Clean-up sld_nco.sh, better segregate nco_2d_grd_typ from nco_lat_grd_typ 2015-09-11 Charlie Zender * Add sld_nco.sh script for Swath-Like Data processing to nco/data 2015-09-11 Henry Butowsky * mods to ncap_var_lgcl() - original version convered all var type to NC_SHORT and then evaluated boolean problem with this is that when reducing precision say from float to short a large _FillValue say 9.9e20f would be converted to 0s. This leads propblems in if(). New version evaluates for each type 2015-09-10 Charlie Zender * NCO 4.5.3-alpha02 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha02 final changes';git push git tag -a 4.5.3-alpha02 -m 'Version 4.5.3-alpha02 tag: SLD regrid sort-of works for AIRS';git push --tags * nco_grd_nfr() produces reasonable numbers for AIRS test case! * Fix area output and improve metadata output in nco_grd_nfr() 2015-09-09 Charlie Zender * nco_grd_nfr() produces useful gridfile from AIRS test-data 2015-09-08 Charlie Zender * Add regression test for MSA averages in ncra problem reported by Christine Smit * Add infrastructure for NASA AXS/SLD project in nco_grd_nfr() * Change remote scp repository for regridding from givre to glace 2015-09-06 Charlie Zender * NCO 4.5.3-alpha01 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.3-alpha01 final changes';git push git tag -a 4.5.3-alpha01 -m 'Version 4.5.3-alpha01 tag: bump versions';git push --tags * NCO 4.5.2 release procedure: Changes since nco-4.5.1: ncra --wgt nrm, --grid, --glb, Newton Gaussian cd ~/nco;git commit -a -m 'Version 4.5.2 release final changes';git push git tag -d 4.5.2;git push origin :refs/tags/4.5.2 git tag -a 4.5.2 -m 'Version 4.5.2: Parenthood';git push --tags * Change grid descriptions to match final 4.5.2 nomenclature 2015-09-05 Charlie Zender * Remove constraint that FV grids must have odd-number of latitudes 2015-09-03 Charlie Zender * Add hackish sixth argument 'yyyymm' to -n option to generate filenames in YYYYMM format 2015-08-31 Charlie Zender * Change from spherical law of cosines to haversine formula for great circle arc length 2015-08-30 Charlie Zender * Change output grid area name from "area" to "grid_area" for ESMF_RegridWeightGen 2015-08-27 Charlie Zender * NCO 4.5.2-beta2 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-beta2 final changes';git push git tag -a 4.5.2-beta2 -m 'Version 4.5.2-beta2 tag: New metadata names for climo, new typenames for grid generation, Gaussian fix, GitHub relocation';git push --tags * Add regional grid-generation capability (lon_wst,lon_est,lat_sth,lat_nrt) 2015-08-25 Charlie Zender * Fix ncdiff typo in manual thanks to Dave Allured * Allow user input of lon_srt, lon_end, lat_srt, lat_end * Fix off-by-one error in nco_bsl_zro() that broke spectral grids when lat_nbr > 100 * Change rgr metadata mapping_file -> map_file and source_file -> input_file 2015-08-24 Charlie Zender * Transfer ownership to new NCO GitHub Organization http://github.com/nco/nco.git * NCO 4.5.2-beta1 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-beta1 final changes';git push git tag -a 4.5.2-beta1 -m 'Version 4.5.2-beta1 tag: Diagnose area on bilinearly-interpolated 1D grids with LHuillier's formula';git push --tags * Areas of random gridcell (ncol=0) from NCO diagnosis and raw native grid output are 4.396773732788860e-05 and 4.396773732840130e-05, respectively. Relative agreement is 0.99999999998833917706 within tolerance of 1.0e-10. * NCO-diagnosed ne30 global area exactly equals original (native grid) ne30 global area = 12.5663706144 sr These global areas equal 4*pi within fractional tolerance of 1.0e-13. * Optimize area calculation to recycle information from previous triangles 2015-08-23 Charlie Zender * Diagnose area on bilinearly-interpolated 1D grids with L'Huillier's formula 2015-08-21 Charlie Zender * Start infrastructure to diagnose area on bilinearly-interpolated 1D grids * Fix interface latitudes for offset grids * Change polar offset grid latitude weights from continuum formula (cos(lat)) to exact discretized formula, same as polar centered grid * NULL-initialize lat_sin in nco_grd_mk() to prevent invalid free() 2015-08-18 Charlie Zender * Install on hopper.nersc.gov * Replace #ifndef ${FOO} with #ifndef FOO in bld/Makefile so make data works on hopper * NCO 4.5.2-alpha9 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha9 final changes';git push git tag -a 4.5.2-alpha9 -m 'Version 4.5.2-alpha9 tag: Work with 2D grids in either lon/lat or lat/lon (old Tempest) src/dst_grid_dims order';git push --tags * nco_rgr_map() determines Tempest 2D grid ordering with [src/dst]_grid_dims "name0" attribute 2015-08-03 Charlie Zender * NCO 4.5.2-alpha8 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha8 final changes';git push git tag -a 4.5.2-alpha8 -m 'Version 4.5.2-alpha8 tag: fix missing value normalizaion with ncra -w wgt';git push --tags * Re-tag 4.5.2-alpha8 * Normalize wgt_sum by tally * Add new normalization test case * Test against actual ne30 data found that wgt_avg_scl normalization not needed 2015-08-02 Charlie Zender * Add var->wgt infrastructure for running sum of per-file valid weights in ncra 2015-07-25 Charlie Zender * NCO 4.5.2-alpha7 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha7 final changes';git push git tag -a 4.5.2-alpha7 -m 'Version 4.5.2-alpha7 tag: Generate exact Gaussian grids';git push --tags * Gaussian grids now have lat_ctr=Legendre zeros, and lat_ntf that define spherical zones that reproduce Gaussian weights * Newton-Raphson iterate latitude interface location to agree with spherical zone area * Use Gaussian angles as latitude centers rather than bisecting interfaces * Show that SCRIP and NCAR T42 grid/map files accurate to 8 decimal places (NCO to 16) * Verify NCO Gaussian weights/angles accuracy to 16 decimal places 2015-07-24 Charlie Zender * "mask" _is_ the mask for each point, not "whether to mask" each point. Change default from 0 to 1. * NCO 4.5.2-alpha6 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha6 final changes';git push git tag -a 4.5.2-alpha6 -m 'Version 4.5.2-alpha6 tag: create 2D rectangular SCRIP grids';git push --tags * Incorporate self-diagnostics (lat_wgt) in nco_grd_mk() * Verify ACME FV-scalar SCRIP grids are missing meridional strip next to Greenwich * Eliminate GSC gridtype (obscure name for FV-scalar), treat FV and ngl_eqi_pol identically, leave names distinct * nco_grd_mk() has fancy metadata annotations and generates correct FV-scalar grids 2015-07-23 Charlie Zender * Hook-up nco_grd_mk() to rgr front-end 2015-07-22 Charlie Zender * Implement nco_grd_mk() to generate SCRIP grid files * NCO 4.5.2-alpha5 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha5 final changes';git push git tag -a 4.5.2-alpha5 -m 'Version 4.5.2-alpha5 tag: ncra -N, diagnose area if possible when area_out == 0.0 (bilinear interpolation)';git push --tags * Diagnose (possibly approximate) area_out when area_out == 0.0 due to bilinear remapping * Decriminalize mapfiles with area_out == 0.0, e.g., ESMF bilinear remapping (broken since 4.5.2-alpha1) * Add bilinear remapping to regression test 2015-07-21 Charlie Zender * Change meaning of NORMALIZE_BY_WEIGHT to NORMALIZE_WEIGHTS * NCO 4.5.2-alpha4 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha4 final changes';git push git tag -a 4.5.2-alpha4 -m 'Version 4.5.2-alpha4 tag: ncra -N';git push --tags * Document -N in man pages, nco.texi 2015-07-20 Charlie Zender * Add -N = --no-normalize-by-weight = --no_nrm_by_wgt to ncra 2015-07-18 Charlie Zender * Migrate nco_rgr_esmf2() to user-specified destination grid * Add structures for user-specified destination grid 2015-07-16 Charlie Zender * NCO 4.5.2-alpha3 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha3 final changes';git push git tag -a 4.5.2-alpha3 -m 'Version 4.5.2-alpha3 tag: --glb_att_add';git push --tags * Implement glb_att_add (gaa) in all remaining operators * Document --glb_att_add 2015-07-15 Charlie Zender * Change --glb_mtd_spp to --no_glb_mtd so --glb can refer to --gaa * Implement glb_att_add (gaa) in ncra * Eliminate small leak in kvm loop in nco_glb_att_add(), nco_rgr_ini() 2015-07-14 Charlie Zender * Implement glb_att_add (gaa) in ncks 2015-07-13 Charlie Zender * NCO 4.5.2-alpha2 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha2 final changes';git push git tag -a 4.5.2-alpha2 -m 'Version 4.5.2-alpha2 tag: Displaced-pole support, fracarea/destarea';git push --tags * Completed (though did not verify) first regridding to/from POP displaced-pole grid with SCRIP mapfile * Valgrind emits "uninitialized value" warnings at first cosine cos() function in nco_lat_wgt_gss()---why? * Implement true "destarea" normalization, support more aspects of dst_frac and dst_mask * Ensure double normalization (with --rnr and "none" = imask) does not occur * Convert input coordinates from radians to degrees if necessary, handle POP grids * Allow SCRIP "fracarea" normalization which is, in my terminology, no normalization just weights "fracarea" is what NCO actually did before, although technically all ESMF fields tested were "destarea" But their dst_frac = frac_b was uniformly 1.0, so no difference from "destarea" 2015-07-12 Charlie Zender * Add sanity checks to ensure mapfile grid matches input data file grid 2015-07-11 Charlie Zender * NCO 4.5.2-alpha1 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.2-alpha1 final changes';git push git tag -a 4.5.2-alpha1 -m 'Version 4.5.2-alpha1 tag: bump to alpha1';git push --tags * NCO 4.5.1 release procedure: Changes since nco-4.5.0: ncra --wgt=wgt_nm, ncap2 mibs/mabs/mebs, Tempest cd ~/nco;git commit -a -m 'Version 4.5.1 release final changes';git push git tag -d 4.5.1;git push origin :refs/tags/4.5.1 git tag -a 4.5.1 -m 'Version 4.5.1: Maxine';git push --tags * Cause nco_var_get_wgt_trv() to die when weight/mask not found, re-jigger weight testing to be more thorough * Found bug where ncwa proceeded without complaining when weights were not found * Regridding works on Tempest RRM conus grid * Manually normalize polar offset grid latitude weights to sum to 2.0 for global extent, less for regional * Create area_out from analytic function when area_b has zeros in mapfile 2015-07-10 Charlie Zender * Implement regional destination grid capability * Turn-off ncra and ncwa threading for dbg_lvl >= 3 for 4.5.1 release * Revert back to old _FillValue trick when netCDF library <= 4.4.0 because Unidata NCF-187 fix does not help NCO 2015-07-07 Charlie Zender * NCO 4.5.1-beta2 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-beta2 final changes' git tag -a 4.5.1-beta2 -m 'Version 4.5.1-beta2 tag: ncra --wgt=wgt_nm works';git push --tags * Fix weighting with ncra --wgt=wgt_nm, allow for full pathnames in wgt_nm 2015-07-06 Charlie Zender * Round-up to one rather than round-down to zero in cnk_map=lfp * Fix history_of_appended_files attribute 2015-07-01 Charlie Zender * Add mibs/mabs/mebs to ncap2 * NCO 4.5.1-beta1 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-beta1 final changes' git tag -a 4.5.1-beta1 -m 'Version 4.5.1-beta1 tag: ncap2 fix for min/max on cordinates';git push --tags * Verify ncap2 min/max bug reported by Maxim Petrenko. Add regression test and fix bug. * NCO 4.5.1-alpha8 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha8 final changes' git tag -a 4.5.1-alpha8 -m 'Version 4.5.1-alpha8 tag: Regridder workaround for Tempest 1D grids';git push --tags * Diagnose problem (incorrect Tempest dst/src_grid_dims variable) and implement workaround * Change ncol to col in code for symmetry with lat/lon 2015-06-29 Charlie Zender * NCO 4.5.1-alpha7 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha7 final changes' git tag -a 4.5.1-alpha7 -m 'Version 4.5.1-alpha7 tag: ncatted rx att_nm, no duplicate cell_methods ';git push --tags * Added attribute wildcarding to ncatted 2015-06-28 Charlie Zender * Introduce routine nco_aed_prc_wrp() to expand attribute regular expressions 2015-06-26 Charlie Zender * Prevent not only duplicates, but sub-string duplicates in nco_cnv_cll_mth_add() 2015-06-25 Charlie Zender * Warn when non-standard "cell_method" attribute is detected * Prevent nco_cnv_cf_cll_mth_add() from repeating existing cell_methods attribute * Move aed_prc functions to nco_att_utl.c to prepare for RX feature 2015-06-22 Charlie Zender * Bump thr_nbr_max_fsh to 16 for ncks, to 8 (with -D >= 3) for ncwa * Version = 'git describe --abbrev=7 --dirty --always --tags', e.g., 4.5.1-alpha6-1-gaa4fe2b-dirty 2015-06-21 Charlie Zender * NCO 4.5.1-alpha6 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha6 final changes' git tag -a 4.5.1-alpha6 -m 'Version 4.5.1-alpha6 tag: Works on Travis and with OpenMP when compiled with g++ 4.6.3-5.1.1';git push --tags * Code now passes Travis build when compiled with g++ * Remove assert() from within OpenMP parallel regions for g++ 4.6.3 on Travis * Use older OpenMP shared() statement for g++ < 4.8.0 (for Travis) * Diagnose and discriminate g++ from gcc compiler * Code compiles warning-free with clang and g++ (without ESMF) * Isolated all ESMF library calls in nco_sld.c 2015-06-19 Charlie Zender * NCO 4.5.1-alpha5 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha5 final changes' git tag -a 4.5.1-alpha5 -m 'Version 4.5.1-alpha5 tag: Revert some broken doc build changes, patch handling of library return codes by regression tests';git push --tags * Remove autobld/mdate-sh, a testimonial to wasted time * Add [int,long,NULL]_CEWI to quiet maybe-uninitialize warnings with GCC 4.8.2 * Fix treatment of exiting with library as return code for regression tests * NCO 4.5.1-alpha4 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha4 final changes' git tag -a 4.5.1-alpha4 -m 'Version 4.5.1-alpha4 tag: More regridding regression tests. Fix possibly uninitialized destination pointer that may have caused writing zeros to output files with clang on MacOS X';git push --tags 2015-06-18 Charlie Zender * Fill-in var_nm for tedious mss_val warning * Add 2D->1D and 2D->2D regression tests * Ensure lat/lon_psn_dst are not used uninitialized * One-size fits all pre-allocation for dimension IDs and cnt/srt * firstprivate() to preserve NULL on pointers that could inadvertently be free()'d * clang on linux with debugging produced troves of useful warning messages clang messages are more thorough than gcc/icc for finding sometimes uninitialized memory clang is about as unforgiving as AIX xlc at strictly enforcing initialization clang would be my default development compiler if it supported OpenMP That being said, had to suppress annoying clang sometimes uninitialized memory warnings :) 2015-06-17 Charlie Zender * Add topology and modulo metadata to longitude * NCO 4.5.1-alpha3 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha3 final changes' git tag -a 4.5.1-alpha3 -m 'Version 4.5.1-alpha3 tag: Add regridding regression tests. Fix strcat() buffer overrun that may have caused writing zeros to output files.';git push --tags * Introduce CEWI_unused() to prevent unused warnings on variables used only in assert() macros 2015-06-16 Charlie Zender * Add regridding regression tests based on AODVIS, FSNT, and area as ncap2 regression test only for USER=zender * Clean-up ncap2.in test in preparation for adding regridding regression tests * Travis CI builds now pass on gcc and clang. Yay! Only regressions are due to old netCDF library. * Work on Travis CI YAML .travis.yml file syntax with http://lint.travis-ci.org 2015-06-15 Charlie Zender * Variables used only in assert() statements flag "unused" warnings with GCC < 4.9.x. Change logic to prevent some of these warnings. * Fix off-by-one memory overwrite in nco_cnv_cf_cll_mth_add() (symptom was heap corruption bug in ncwa) * NCO 4.5.1-alpha2 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha2 final changes' git tag -a 4.5.1-alpha2 -m 'Version 4.5.1-alpha2 tag: Regrid from Tempest-generated map-files';git push --tags * Patch Makefiles so ncap2.cc is passed ENABLE_NETCDF4 flag (solves Heather Aldridge's report) 2015-06-14 Charlie Zender * Verified NCO is regression-free with GCC 5.1.1 * NCO 4.5.1-alpha1 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.1-alpha1 final changes' git tag -a 4.5.1-alpha1 -m 'Version 4.5.1-alpha1 tag: Regrid from Tempest-generated map-files';git push --tags * Regridder works on bds output files with Tempest-generated map-files * Omit extensive-seeming 1D variables on 2D input grids (e.g., grd_rds_rth, grd_mrd_lng, grd_znl_lng, lat_sz, lon_sz) 2015-06-13 Charlie Zender * Reverse ordinal number of lat and lon dimensions in src_grid_rank, dst_grid_rank for Tempest * Modify routines to accept TempestRemap-generated maps 2015-06-11 Charlie Zender * NCO 4.5.0 release procedure: Changes since nco-4.4.9: --map, --rnr=wgt, -A provenance, [date/time]_written, ncdismember cd ~/nco;git commit -a -m 'Version 4.5.0 release final changes' git tag -d 4.5.0;git push origin :refs/tags/4.5.0 git tag -a 4.5.0 -m 'Version 4.5.0: Even Keel';git push --tags * Always cast latitudes to float before diagnosing grid type to avoid failures with strangely-off grids 2015-06-10 Charlie Zender * Make renormalize algorithm consider number of valid inputs when wgt_thr = 0.0, weight of valid inputs when wgt_thr > 0.0. * Reduce thr_nbr_max_fsh from 8 to 1 for ncwa stability with 4.5.0 release * Verify OpenMP with ncwa is flaky * Add nco_open_mem() prototype introduced in netCDF 4.4.0-rc1 * NCO 4.5.0-beta9 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta9 final changes' git tag -a 4.5.0-beta9 -m 'Version 4.5.0-beta9 tag: --rnr, kvm clean-up, date_written/time_written handling';git push --tags * Complete --rnr/--rgr_rnr/--renormalization implementation 2015-06-09 Charlie Zender * Implement infrastructure to renormalize destinations affected by missing values * Remove extraneous last character from history_of_appended_files * Do not attempt date_written/time_written update when var_sz != 8 * Fix buffer overwrite in nco_xcp_prc(), and double-free caused by nco_rgr() * Allow allow all grid dimension/variable names to be command-line specified * Re-do rgr_nfo creation and destruction routines to facilitate kvm arguments * Fix kvm infrastructure 2015-06-08 Charlie Zender * Update time-stamps of date_written, time_written during all output * Document regridding * Change time-stamp update from localtime() to gmtime() * Broke kvm infrastructure by simplifying nco_sng2kvm() prototype 2015-06-06 Charlie Zender * Update time-stamps of date_written, time_written during regridding 2015-06-04 Charlie Zender * NCO 4.5.0-beta8 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta8 final changes' git tag -a 4.5.0-beta8 -m 'Version 4.5.0-beta8 tag: history_of_appended_files';git push --tags * Add history_of_appended_files global attribute to improve provenance 2015-06-03 Charlie Zender * NCO 4.5.0-beta7 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta7 final changes' git tag -a 4.5.0-beta7 -m 'Version 4.5.0-beta7 tag: Supports 1D->1D, 1D->2D, 2D->1D, and 2D->2D regridding for any unstructured 1D grid and any rectangular 2D grid';git push --tags * Write coordinates attribute after all others, fix lat metadata * Do second sweep for associated CF variables when creating extraction list * Correct bounds names to vertices for 1D output grids * Verified ne30->ne120 works and perfectly conserves FSNT * Verified fv129x256->fv257x512 works and perfectly conserves FSNT * Complete grid description and metadata decoration for 2D->2D mappings * Annotate lat and lon variables with "axis = X/Y" attributes * Annotate variables with "coordinates" attribute for auxiliary coordinate variables lat and lon * Complete grid description for 2D->1D remappings, use nv and vertices instead of nbnd and bounds 2015-06-02 Charlie Zender * Dogfood? * NCO 4.5.0-beta6 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta6 final changes' git tag -a 4.5.0-beta6 -m 'Version 4.5.0-beta6 tag: Gaussian and equiangular offset grids';git push --tags * Verified ne30->T42 works and conserves perfectly * Gaussian grid diagnosis works * Fix numerical bugs in nco_lat_wgt_gss(): fabs() != abs() 2015-06-01 Charlie Zender * Reverse latitudes and weight generated for Gaussian grids from N->S to S->N 2015-05-31 Charlie Zender * Add Gaussian grid detection and required functions nco_lat_wgt_gss() and nco_bsl_zero() * Improve ncdismember documentation * Fuzzy test for latitude weight normalization * Move bitmask() and around() routines from nco_var_rth.[ch] to nco_ppc.[ch] * Infrastructure for detecting correct type of latitude grid 2015-05-30 Charlie Zender * Clarify Conventions warnings * Activate OpenMP on ncwa, thr_nbr_max=8 * Diagnose input and output grid sizes and conversion type for dogfood logic * Activate OpenMP in autoconf/configure NCO builds (clang does not yet support OpenMP) * Verified that regridding works on MACOSX---ne30 ~5x faster on aerosol than roulee 2015-05-29 Charlie Zender * Document threading * NCO 4.5.0-beta5 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta5 final changes' git tag -a 4.5.0-beta5 -m 'Version 4.5.0-beta5 tag: OpenMP and area cell_methods';git push --tags * Verified threading works with netCDF4 output with netCDF 4.3.3.1 (rhea has 4.1.3) * Use firstprivate(tally) and now multiple threads work (exactly) on roulee * Added regrid report to summarize variables regridded, copied, omitted, created * Demonstrated that four threads can produce exactly correct answers * Allow up to eight threads for ncks only * All regressions still pass but only one-thread used * Clean-up threading in ncks.c and nco_rgr() * Carry per-thread file IDs in trv_tbl 2015-05-28 Charlie Zender * Surprisingly, all regressions still pass. Probably because thr_nbr is prescribed to be one :) * Update ncra OpenMP threading infrastructure to compile * Add OpenMP threading infrastructure to ncks and nco_rgr() in specific * Add cell_methods = sum attribute to area variable during regridding * NCO 4.5.0-beta4 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta4: final changes' git tag -a 4.5.0-beta4 -m 'Version 4.5.0-beta4: Deprecate missing value warning. Fix cnk_map_xst handling.';git push --tags * Fix typo bug in nco_cnk_ini() reported by ocehugo. Caused existing chunk maps to be ignored. * NCO 4.5.0-beta3 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta3: final changes' git tag -a 4.5.0-beta3 -m 'Version 4.5.0-beta3: Missing values work. Fix gw bug in beta2.';git push --tags * Fix gw problem introduced in beta2 2015-05-27 Charlie Zender * Handle missing values in regridding. Be liberal: Any valid input points make valid output * NCO 4.5.0-beta2 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta2: final changes' git tag -a 4.5.0-beta2 -m 'Version 4.5.0-beta2: Correct output grid bounds, precision';git push --tags * Fix output grid bounds (internal bounds were stored with weird memory layout that did not write to disk as expected) * Change dgr2rdn from float (oops!) to double to prevent precision loss * NCO 4.5.0-beta1 release procedure: cd ~/nco;git commit -a -m 'Version 4.5.0-beta1: final changes' git tag -a 4.5.0-beta1 -m 'Version 4.5.0-beta1: Correct area output variable';git push --tags * Read and output area variable directly from remap file rather than regridding it 2015-05-25 Charlie Zender * NCO 4.5.0-alpha1 release procedure: Changes since nco-4.4.9: --map cd ~/nco;git commit -a -m 'Version 4.5.0-alpha1: final changes' git tag -d 4.5.0-alpha1;git push origin :refs/tags/4.5.0-alpha1 git tag -a 4.5.0-alpha1 -m 'Version 4.5.0-alpha1: Regridding with external mapfile';git push --tags * Reorganize global attribute writing, catenate history attribute * Verified NCO gives identical results as Taylor/Truesdale NCL script for 2-D & 3-D variables * Handle lefter aka leftmost aka vertical and time dimensions in regridding * Optimize row/column access by pre-subtracting one to account for Fortran index offset relative to C * Clean-up debugging output * Skip date_written and time_written variables when regridding * Document (sort of) --map, --rgr_map * Re-plumb I/O to regrid straight to fl_out (ignore --rgr_out) * Add NCO version to global metadata of regridding * Exempt /lat and /lon from regridding * Regridding appears to work for 2D variables! Yay! * Weight variables and copy values to regridded file 2015-05-24 Charlie Zender * Define regridded-variables in and copy their metadata to regridded file * Copy global and fixed-variable metadata to regridded file * Define fixed-variables in and copy their data to regridded file * Set new flg_rgr for input variables that contain "ncol" dimension * Complete grid metadata for output file * Add equi-angle latitude weights (also named "gw") to nco_rgr_map() * Add nco_vrs_att_cat() to all operators (was only in ncks, ncbo) 2015-05-22 Charlie Zender * Output destination grid and coordinate metadata looks good in nco_rgr_map() * Bump to 4.5.0-alpha1. Undo crippling of ncra --wgt wgt_nm for further debugging * NCO 4.4.9 release procedure: Changes since nco-4.4.8: git, -x warn, crd att, cnk nco lfp, shuffle on, MM3->MM4 off, ncecat fix, climatology, ncra wgt cd ~/nco;git commit -a -m "Version 4.4.9 release: " git tag -d nco-4.4.9;git push origin :refs/tags/nco-4.4.9 git tag -d 4.4.9;git push origin :refs/tags/4.4.9 git tag -a 4.4.9 -m 'Version 4.4.9: Final Release';git push --tags * Cripple ncra. Re-tag. Re-release with new tag format so GitHub tarball naming conventions work. 2015-05-21 Charlie Zender * NCO 4.4.9 release procedure: Changes since nco-4.4.8: git, -x warn, crd att, cnk nco lfp, shuffle on, MM3->MM4 off, ncecat fix, climatology, ncra wgt cd ~/nco;git commit -a -m "Version nco-4.4.9 release: " git tag -d nco-4.4.9;git push origin :refs/tags/nco-4.4.9 git tag -a nco-4.4.9 -m 'Version 4.4.9: ';git push --tags * Put nco_sng2kvm() in nco_sng_utl.c where it belongs. Fixes configure link problems. 2015-05-20 Charlie Zender * Allow wgt_nm to not be in extraction list * Implement main logic for --wgt wgt_nm per-record weighting * Per-file weighting with --wgt wgt_arr works fine 2015-05-19 Charlie Zender * Add some infrastructure to accept weight names, e.g., ncra --wgt=time_dlt * Correct normalization in ncra --wgt and combine into multiplication by one pre-normalized factor * Treat climatology variables as pseudo-coordinates like bounds variables * Re-base climatology variables in ncra/ncrcat 2015-05-18 Charlie Zender * Apply per-file weights/normalization to averaged non-coordinate variables * ncra reads optional per-file weights with new command line -w, --wgt switch 2015-05-17 Charlie Zender * Obtain destination grid interfaces/boundaries and remap matrix from mapping file 2015-05-15 Charlie Zender * All regression tests pass, 4.4.9 release once configure-builds work on yellowstone and rhea * Recent rhea upgrade uses szip in icc netcdf, so (re-)add SZ and SZ_LIB flags to Makefile, Makefile.old * Rhea icc 13.1.3 (gcc version 4.4.7 compatibility) requires -D_BSD_SOURCE on files that #include nameser.h * Fix ncecat --gag mode use of uninitialized file pointers 2015-05-14 Charlie Zender * Shuffle never, to my knowledge, increases filesize, so shuffle by default when manually deflating * LFP chunking uses "reasonable defaults" when var_sz < cnk_sz_ttl * Turn-off MM3 workaround for MM3->MM4 copying to speed-up compression induced chunking * Choose output chunking map/policy = rew/all rather than xst/xst for netCDF3 input 2015-05-13 Charlie Zender * Split Tempest library calls into separate function, nco_rgr_tps() 2015-05-12 Charlie Zender * Improve error message when nco_lmt.c encounters hyperslab requests on 2-D "coordinates" 2015-05-11 Charlie Zender * Crude version of nco_rgr_map() 2015-05-07 Charlie Zender * Describe SCRIP remapping in nco_rgr.c 2015-05-06 Charlie Zender * Segregate parts of nco_sld.[ch] into nco_ppc.[ch] and nco_rgr.[ch] 2015-05-05 Charlie Zender * Situate nco_rgr_ctl() between main() and all regridding routines 2015-05-04 Charlie Zender * Tidy string functions by DYW and PVN * Makefile generates LINUX_C?? compiler defaults for MACOSX 2015-04-30 Charlie Zender * Introduce special variable handling with --rgr_var * Wait until after ESMC_Finalize() to free dynamic memory provided to ESMF 2015-04-27 Charlie Zender * Improve nco_rgr_esmf() genericity 2015-04-26 Charlie Zender * Refine MACOSX linking for libesmf.a * Fix bug in call to ESMC_GridCreateFromFile(). Simple ESMF regridding works. 2015-04-23 Charlie Zender * Annotate ESMF variables and calls * Add regression test for unchunking variables with _Shuffle set 2015-04-21 Charlie Zender * Utilize extensible functions to format/access Tempest regridding commands * Enumerate Tempest (tps) rename commands 2015-04-20 Charlie Zender * Add dummy call to Tempest remap GenerateRLLMesh 2015-04-19 Charlie Zender * Eliminate borken nco_sng2array() (which failed on single-element lists) in favor of nco_lst_prs_2D() * Merge rgr (formerly dyw) branch back into master 2015-04-17 Charlie Zender * Use generic NC_SHUFFLE and NC_NOSHUFFLE tokens 2015-04-15 Charlie Zender * Set shuffle to false before unchunking variables. Fixes bug #74 reported by Dave Allured. 2015-04-13 Charlie Zender * Support GCC under MacPorts on MacOSX using export LINUX_CC='gcc-mp-4.9' export LINUX_CXX='g++-mp-4.9 -std=c++11' So far compiling works but library archiving and linking does not so may need export LINUX_AR='gcc-ar-mp-4.9' * Fix MacOSX Yosemite LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn) issues: 'register' storage class specifier is deprecated [-Werror,-Wdeprecated-register] 2015-04-08 Charlie Zender * Changed name of dyw branch to rgr (for "regrid") * Add to configure: -lesmf -lrt -lgfortran -ldl -lnetcdff -lnetcdf_c++ Most are found but -lesmf does not link on MACOSX due to clang/gfortran cross-compilation * Merge changes from master into dyw branch: git checkout dyw;git merge master 2015-04-06 Charlie Zender * Quiet printing extended filetype for dbg_lvl=2 * Revamp regridding command-line interface, initialization, and deallocation 2015-04-06 Charlie Zender * Makefile/ESMF appears to pass regression tests * Fix memory issues with rgr_arg 2015-04-01 Charlie Zender * Re-built MACOSX with XTools 6.2 clang 6.0 LLVM 3.5 for OS 10.10 Yosemite: No problems * Add regression test for changing _FillValue in netCDF4 file * Turn-off flg_netCDF4_rename_trick in nco_att_utl.c if NC_LIB_VERSION >= 434 2015-03-25 Charlie Zender * Add cf2.cdl to test different approaches to CF group extension questions 2015-03-24 Charlie Zender * Various typo corrections to documentation 2015-03-19 Charlie Zender * Add --enable_esmf option to configure * Add EMSF option to Makefile * Move ESMF functions to nco_sld.[ch] 2015-03-18 Charlie Zender * Fix bugs in dyw branch 2015-03-10 Charlie Zender * Tag nco-4.4.9-alpha to test new release procedure cd ~/nco;git commit -a -m "Version nco-4.4.9-alpha" git tag -d nco-4.4.9-alpha;git push origin :refs/tags/nco-4.4.9-alpha git tag -a nco-4.4.9-alpha -m 'Version 4.4.9-alpha: git, -x warn, crd att, cnk nco';git push --tags * Build on rhea.ccs.ornl.edu * Finish cnk_plc=nco implementation so plc/map=nco/nco means all/rew * Document "coordinates" attribute modification 2015-03-09 Dingying Wei * Test git change as dyw 2015-03-09 Charlie Zender * Quiet printing of extended filetype for dbg_lvl=2 2015-03-09 Charlie Zender * Created remote upstream branches dyw, hmb, and pvn * Change on master by csz * Refine .gitignore's for configure-make * Fix regression tests to account for new "coordinates" attributes * Eliminate dimensions from "coordinates" attribute after collapsing them 2015-03-08 Charlie Zender * Tighten new -x warning WARNING 2015-03-07 Charlie Zender * Warn when coordinate variables intended to be excluded by -x and -C was not invoked 2015-02-26 Charlie Zender * Add .gitignore's to clean up git status output 2015-02-25 Charlie Zender * Create csz branch for local work on 4.4.9 2015-02-24 Charlie Zender * Replace SF source addresses with GitHub source addresses * Document Git transition procedure * Remove CVS keyword expansions by copying un-expanded originals over from CVS tree * Create README.md for Github * Clean-up ChangeLog * Worked on CVS->SVN-->Git migration all week. Preserving tags is hard. * Final procedure was something like: # Generate dumpfile cvs2svn -v --encoding=ascii --encoding=latin_1 --dumpfile=/home/zender/nco_20150216_dumpfile -s /home/zender/svn > ~/cvs2svn.txt rsync -aiv nco_20150216_dumpfile zender,nco@web.sf.net: ssh -t zender,nco@shell.sourceforge.net create mv /home/project-web/nco/nco_20150216_dumpfile . # Initialize SF SVN repository svnadmin create /home/project-web/nco/svn # Do hard work svnadmin load /home/project-web/nco/svn < /home/project-web/nco/nco_20150216_dumpfile # Check-out (failed) svn checkout --username=zender svn+ssh://zender@svn.code.sf.net/p/nco/svn/ ~/nco-svn # Initialize local SVN repository cd;mkdir svn;svnadmin create svn # Do hard work svnadmin load svn < nco_20150216_dumpfile # Check-out svn checkout file:///home/zender/svn/trunk/nco ~/nco_svn # Create local Git repository /bin/rm -r -f ~/nco mkdir -p ~/nco cd ~/nco # Convert SVN to Git with git svn (actual command used, ~18.6 MiB compressed to clone) # http://git-scm.com/book/en/v2/Git-and-Other-Systems-Migrating-to-Git git svn clone file:///home/zender/svn/trunk/nco --authors-file=/home/zender/nco_authors.txt --ignore-paths='^CVSROOT' --no-metadata # Move tags to be proper Git tags, move other references to be local branches /bin/cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/ /bin/rm -Rf .git/refs/remotes/origin/tags /bin/cp -Rf .git/refs/remotes/* .git/refs/heads/ /bin/rm -Rf .git/refs/remotes # Convert SVN to Git with svn2git (ultimately not used) # https://github.com/nirvdrum/svn2git sudo aptitude install git-core git-svn ruby rubygems sudo gem install svn2git # Loses all tags, produces small (~19 MiB compressed to clone) repository svn2git file:///home/zender/svn/trunk/nco --trunk / --authors ~/nco_authors.txt --verbose # Maintains tags but takes forever (ETA ~6 days) svn2git file:///home/zender/svn --authors ~/nco_authors.txt --exclude '^CVSROOT.*' --trunk trunk/nco --nobranches --verbose # Push new local Git repository to GitHub git remote add origin https://github.com/czender/nco.git git push origin --all git push origin --tags git push --set-upstream origin master # Clone from GitHub git clone https://github.com/czender/nco.git ~/nco 2015-02-16 Charlie Zender * NCO 4.4.8 release procedure: Changes since nco-4_4_7: -A warn, PPC, cnk nco=rew+lfp, mabs/mebs/mibs() cd ~/nco;cvs tag -d nco-4_4_8;cvs tag -d nco-4_4_8-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.8 release" cvs tag -c nco-4_4_8;cvs tag -c nco-4_4_8-1 * One week of documentation improvements while SF was down 2015-02-09 Charlie Zender * More inclusive definition of "coordinate variables" to avoid quantizing * Never quantize upwards floating point values of zero 2015-02-08 Charlie Zender * Implement PPC in ncecat, ncflint (revert ncbo) * Correctly format brackets on indices of missing_values in nco_prn.c * Rewrite tables with new less-lossy NSD algorithm * Implement rounding (DSD) on integer types * Prevent bitmasking (NSD) on integer types * Prevent bitmasking when desired precision exceeds representable precision * Preserve one extra bit for NC_DOUBLE, based on empirical tests results with ppc=array(1.234567,1.e-6,$dmn) 2015-02-07 Charlie Zender * Add pure float version of nco_var_around() * Bitmask-up to ones instead of down to zeros every other element to avoid bias in rounded mean 2015-02-06 Charlie Zender * Document mabs/mebs/mibs * Add nco_op_typ=mabs, mebs, mibs for maximum, mean, minimum absolute value 2015-02-05 Charlie Zender * Increase prc_bnr_xpl_rqr by 2 so prc_bnr_xpl_rqr=prc_bnr_ceil. Fixes NSD=1 for Q?? in in.nc * Reduce verbosity of dbg_lvl_std * Implement PPC in ncwa.c, ncra.c * Use -O3 not -O4 on clang 2015-02-04 Charlie Zender * Document PPC efficacy in tbl_ppc_nc * Fix ppc used in ncpdq 2015-02-03 Charlie Zender * Explicit cast instead of implicit coercion to squelch many MSVC warnings * Put string.h headers in nco_cln_utl.h * Add isblank() for MSVC * Fix nco_var_lst_add() call in ncap_lex.l to restore g++ compilation capability * Fix compiling problems on MSVC 2015-02-02 Charlie Zender * Implement cnk plc_nco and cause it and map_rew to do map_rew for 3-D otherwise map_lfp * Optimize nco_ppc_set_var(), fail on invalid variable names * Fully document PPC, NSD, DSD 2015-01-31 Charlie Zender * Specifying PPC triggers dfl_lvl=1 on netCDF4 if not otherwise set * Allow PPC on netCDF3 2015-01-30 Charlie Zender * Warn on incorrect NSD input 2015-01-29 Charlie Zender * Change generic name from LSD to PPC (precision-preserving compression) * Implement threshold precision that turns-off LSD on per-variable basis 2015-01-28 Charlie Zender * DSD and NSD compression both appear to work and pass all regressions * Zero two additional bits from significand in nco_var_bitmask() * Fix missing value treatment in nco_var_bitmask() * Change nco_var_around() from lrint() to rint() (duh!) * Dynamically allocate dimension string info in nco_prn_var_dfn() so NCO works on AIRS files with loooong dimension names 2015-01-26 Charlie Zender * Functionalize NSD algorithm into nco_var_bitmask() * Prototype NSD algorithm compiles, runs, and appears to work as expected 2015-01-25 Charlie Zender * Demonstrate LSD failure on lsd_bgr, need real precision algorithm * Add LSD to ncpdq, document in nco.texi, regression tests * Move nco_lsd_att_prc() from main.c into nco_xtr_dfn() for maintainability 2015-01-22 Charlie Zender * DYW added least_significant_digit attribute 2015-01-20 Charlie Zender * Move DYW functions to new nco_sld.[ch] files * Use tgamma() instead of gamma() on MacOSX * Tidy --enable-custom warnings on clang * Fix automake error on in_4c.nc 2015-01-19 Charlie Zender * Fix LSD on MM3 codepath by using brute force instead of hash table in trv_tbl_var_nm_fll() 2015-01-18 Charlie Zender * Clean-up rx code for LSD by DYW 2015-01-16 Charlie Zender * Deprecate -D_BSD_SOURCE -D_POSIX_SOURCE in favor of -D_DEFAULT_SOURCE in configure * Fix nco_var_typ_trv() prototype for C++ compilers 2015-01-14 Charlie Zender * LSD implementation in MM3 code compiles cleanly yet has problem finding traversal objects * Introduce nco_var_around() calls in MM3 write/copy code * Patch nco_mss_val_get() to avoid invalid free()---now nco_var_around() can work * Regressions now fixed. Failures may have been due to excessive .tmp files in regression directory. 2015-01-12 Charlie Zender * Do not call nco_var_around when lsd == NC_MAX_INT, ensure lsd always initialized * Implement multiple LSD options by Dingying Wei (DYW). Currently broken. * Improve ISO8601 functionality with nco_cln_sng_rbs() 2015-01-09 Charlie Zender * Quiet CEWIs exposed by GCC 4.9.2 * Verify recent (20150109+) netCDF library snapshots fix coordinate renaming problems yet break attribute renaming * Introduce -D_DEFAULT_SOURCE in place of deprecated (as of gcc 4.9.2) -D_BSD_SOURCE -D_POSIX_SOURCE Include -O optimization when OPTS=X to quiet warning messages Whether these Makefile changes introduce compile problems on older GCCs is TBD * Add --lbr, --library to ncap2 to facilitate link-path debugging 2015-01-08 Charlie Zender * New ncecat regression test to verify concatentated coordinates do not gain new record dimension * Implement temporary fix for autoconf issues * Discovered that NCO autotools do not follow autoconf guidelines This only matters in practice for ncap2 which uses multiple additional libraries Incorrect usage of CPPFLAGS and friends can lead to wrong precedence in ncap2 linking Will be hard to fix correctly---thorough rewrite of configure.ac *.am required 2015-01-07 Charlie Zender * Add autobld/compile: Wrapper for compilers which do not understand '-c -o'. Required by autoconf/configure on FC21. * NCO_CHECK_FUNCS() for nc_rename_grp() and nc_inq_format() in configure Oversight---configure builds have only used stub versions of these functions so far! 2014-12-30 Charlie Zender * Change copyright year to 2015 and tweak LICENSE from "can" to "may" * Introduce stubs to print calendar "time since"dates in more human-readable format 2014-12-18 Charlie Zender * Impose nco_*() namespace convention on var_scv_*() and scv_var_*() routines 2014-12-08 Charlie Zender * --lsd ready-to-go except needs per-variable option and needs to avoid coordinates * Add nco_var_around() to enhance zlib compression by making it lossy up to specified precision 2014-12-08 Henry Butowsky * defdim() now accepts an additional optional arg UNLIMITED or LIMITED 2014-12-01 Charlie Zender * Warn when appended output type differs from input type (legal yet sketchy with -A) 2014-11-26 Charlie Zender * NCO 4.4.7 release procedure: Changes since nco-4_4_6: -0->-1, rename bug, cnk xst, cnk_min, -X, rew, cnk_in cd ~/nco;cvs tag -d nco-4_4_7;cvs tag -d nco-4_4_7-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.7 release" cvs tag -c nco-4_4_7;cvs tag -c nco-4_4_7-1 2014-11-25 Charlie Zender * Regression tests show no failures on gcc and clang Linux and MacOS One non-fatal failure on icc Linux (yellowstone) ncecat#9 Output file is chunked differently than expected. Mysterious. * Initialize input chunksize defaults correctly for ncwa, ncecat, ncpdq 2014-11-24 Charlie Zender * Replace strncpy() in sng_trm_trl_zro() with explicit loop to prevent valgrind complaining about, and Mac OS X crashing on, overlapping source and destination buffers * Support passing (int *)NULL to nc_inq_format_extended() stub * Fix GSL and UDUnits flags in Makefile (fixes yellowstone builds) 2014-11-15 Charlie Zender * Use new NC_HAS_HDF4 to report HDF4 support with ncks -r 2014-11-12 Charlie Zender * Document new chunking features 2014-11-11 Charlie Zender * cnk_rew appears to work for rank = 3. Need larger datasets to be sure. * Tidy nco_bld_crd_aux() 2014-11-10 Charlie Zender * Add regression test for non-coordinate dimension auxiliary coordinate variables 2014-11-05 Charlie Zender * Almost finished implementing cnk_rew * cnk_min=0 sets minimum size of variables to chunk as twice blocksize * Using -X now imposes CNV_CCM_CCSM_CF=True regardless of Conventions attribute 2014-11-03 Charlie Zender * Add regression for auxiliary coordinates * First regression-free version in three weeks * Now that nco_cnk_sz_set_trv() always called, allow it to work when ncecat creates new record dimension * Fix long-time bug where nco_cpy_var_dfn_trv() incorrectly sets dmn_cmn[].is_rec_var for record dimensions affected by --fix_rec_dmn or --mk_rec_dmn invocation (always set incorrectly except on first variable affected) 2014-10-31 Charlie Zender * Adjust regression tests to work with --cnk_min. Document --cnk_min. 2014-10-31 Henry Butowsky * ncap_cst_mk() in ncap2_utl.cc checks that record dim is the first dim in list ONLY if nc3 file and nc4 file. This also allows users to define vars with multiple record dims. 2014-10-30 Henry Butowsky * Add hidden feature to defdim(): when dim_sz < 0 then dim is defined as unlimited 2014-10-22 Charlie Zender * Replace NETCDF4_ROOT by NETCDF_ROOT in configure 2014-10-17 Charlie Zender * Add --cnk_min to specify minimum size (default 8kB) in bytes of variable to chunk 2014-10-15 Charlie Zender * Change configure.ac --enable-dap-netcdf to --enable-dap * Add cnk.cdl to test chunking algorithms * Add cnk_map=nco to assign to current NCO-recommended map 2014-10-13 Charlie Zender * Always call chunking * Stubs for cnk_map = nc4 for default netCDF4 chunking (same as unchunking for now?) * Change links to online discussion forums from, e.g., https://sf.net/projects/nco/forums/forum/9830 to https://sf.net/p/nco/discussion/9830 to eliminate new circular reference errors from sf webserver 2014-10-12 Charlie Zender * Rationalize regression tests with new chunking defaults (xst, xst) * Ensure user-specified full chunking paths take precedence over relative paths * Simplify nco_cnk_sz_set_trv() 2014-10-10 Charlie Zender * Fix ncrename regression tests * Build in_4.nc from in.nc (not in.cdl due to ncgen chunksize problems and bugs) for regression tests * Add numerous regression tests to evaluate nc_rename_var/dim() behavior. * Avoid nc_rename_var/dim() bug in netCDF4 files by avoiding nc_redef()/nc_enddef(). No dice. 2014-10-09 Charlie Zender * Improve hdr_pad, ncrename documentation 2014-10-08 Charlie Zender * Add NCO_VERSION for consistency with NC_VERSION * Document newly discovered ncrename problems due to netCDF4 bugs http://nco.sf.net/nco.html#bug_nc4_rename * Check more error return codes in ncrename.c. Verifies NCO does not ignore any netCDF errors. 2014-10-07 Charlie Zender * Add regression checks for valid values in renamed coordinates in netCDF4 files 2014-10-02 Charlie Zender * Change to real Python convention where -1 is last element, e.g., -2 is penultimate element, -N is first element 2014-10-01 Charlie Zender * NCO 4.4.6 release procedure: Changes since nco-4_4_5: ncks -V, ncap2 -s -S, DAP cnf, ncra pck/mss/prm, HDF4, ncrename, NC4_SRD, -0 cd ~/nco;cvs tag -d nco-4_4_6;cvs tag -d nco-4_4_6-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.6 release" cvs tag -c nco-4_4_6;cvs tag -c nco-4_4_6-1 * Add negative zero syntax to select last element of hyperslab 2014-09-30 Charlie Zender * Avoid void arithmetic in USE_NC4_SRD_WORKAROUND * Change important nco_calloc() to nco_malloc() for speed * Fix ncwa handling of packed variables for minimization/maximization * Implement strncasecmp() for Windows and MSVC compilers * Fix count bug in USE_NC4_SRD_WORKAROUND 2014-09-29 Charlie Zender * Implement USE_NC4_SRD_WORKAROUND by default in all applicable cases, i.e., for singly strided hyperslab access to netCDCF4 files. 2014-09-26 Charlie Zender * Implement workaround to nc_get_vars() slowdown for netCDF4 in netCDF library Workaround avoids nc_get_vars() and instead loops through calls to nc_get_vara() Workaround implemented in nco_msa_get_var_trv() and activated, for now, by -D 6 * Finish ncrename rewrite. All capabilities work. No regressions. Some debugging, syntax, and documentation remains to be done 2014-09-24 Charlie Zender * Use netcdf_meta.h in nco.h to enable chunking/deflation calls for HDF4 * ncrename now builds and works again for all but attributes 2014-09-23 Charlie Zender * Print extended file format as _SOURCE_FORMAT with ncks --hdn * Remove nco_dmn_usr_sng() and nco_obj_usr_sng() due to flawed algorithms * Finish ncrename re-write for variables, groups, and dimensions NCO versions 4.3.3-4.4.5 broke "." support and did not fully support groups Those versions renamed first and ignored subsequent instances of old_nm Now ncrename fails as intended when required objects are not present Attributes are more complex and are still broken 2014-09-22 Charlie Zender * Support netCDF 4.3.3 netcdf_meta.h in nco_netcdf.h so NC_HAVE_RENAME_GRP is found * Add regression tests to make ncrename die when required entities not present 2014-09-20 Charlie Zender * Fix bug with ncra --dbl on packed variables with missing values 2014-09-18 Charlie Zender * Add debugging statements to track netCDF4 stride slowdown * Note locations which assume record dimension is in first position 2014-09-17 Charlie Zender * Start to generalize ncra.c so single record dimensions can occupy any position 2014-09-16 Charlie Zender * Add regression test to demonstrate bug with ncra --dbl on packed float variables with missing values. * Implement missing getopt() line for file_format switch 2014-09-15 Charlie Zender * ./configure now checks for daperror() instead of nc__opendap() * Add NC_EIO error clarifications 2014-09-11 Charlie Zender * Create -V = --var_val = -Q --no_nm_prn for ncks to print only variable values * Document -Q and -V and switch --quiet to -Q (not -q) and synonomize -q with --quench 2014-09-02 Charlie Zender * Clarify WARNING when record dimension size changes 2014-09-02 Henry Butowsky * ncap2 command-line and script arguments can now both be specified AND executed Command-line args are executed before script: ncap2 -v -s "lon=longitude" -S in_4.nc out.nc 2014-08-26 Charlie Zender * NCO 4.4.5 release procedure: Changes since nco-4_4_4: https DAP, gxvx, mk, ncl_var, dmn_cmn, ncpdq, C: cd ~/nco;cvs tag -d nco-4_4_5;cvs tag -d nco-4_4_5-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.5 release" cvs tag -c nco-4_4_5;cvs tag -c nco-4_4_5-1 2014-08-25 Charlie Zender * Specify correct dmn_cmn[] information to nco_cnk_sz_set_trv() 2014-08-22 Charlie Zender * Sanitize filenames prior to shell use with nm2sng_fl() instead of nm2sng_cdl() Fixes bug in MS Windows handling volume names like "C:\foo" 2014-08-21 Charlie Zender * Fix false negative regressions due to new chunking defaults * Fix ncpdq mis-handling of dimension reversal arguments (introduced between 4.3.2--4.3.6) * Fix inadvertent omission of --cnk_map switch in ncecat 2014-08-15 Charlie Zender * Change default chunking policy/map from g2d/rd1 to xst/xst (fxm: breaks some regressions) * Add mrd.cdl to check compliance/performance for files/variables with Multiple Record Dimensions 2014-08-14 Charlie Zender * Add cnk_plc_r1d to only change chunking of specified 1-D record variables 2014-08-13 Charlie Zender * Tweak Makefile for rhea.ccs.ornl.gov 2014-07-14 Charlie Zender * Tidy ncks.c and nco_grp_utl.c for MPI work * Clarify ncrcat packing issues in man page 2014-07-11 Charlie Zender * Change FL_LST_IN_MAX_LNG from 10 MB to 504576001 B per request of Christine Smit Use case: 30 years of hourly data files each 192 characters long 2014-07-10 Charlie Zender * Deprecate ENABLE_PNETCDF from meaning exposed PnetCDF API Soon it will mean that netCDF4 was built with --enable-pnetcdf 2014-07-08 Charlie Zender * Handle CF ancillary_variables like, well, ancillary variables 2014-07-06 Charlie Zender * Integrate netCDF4 MPI I/O calls in library, begin conversion with ncks * Clean-up nco_get_prg_info(), make consistent with newer netCDF regression tests 2014-07-05 Charlie Zender * Remove Makefile cruft to simplify building parallel NCO 2014-07-04 Charlie Zender * Use -5 --fl_fmt=pnetcdf to create NC_FORMAT_CDF5 files * Build simply when PNETCDF=Y 2014-07-01 Charlie Zender * Improve CF-compliance checking infrastructure for mabel/ICESat2 2014-06-17 Charlie Zender * Implement i18n in ncks, extend to es and fr 2014-06-15 Charlie Zender * Apply copyright notice changes to most source files 2014-06-13 Charlie Zender * Update and streamline project homepage 2014-06-12 Charlie Zender * Improve ncrename diagnostics, fix unset pointer de-reference 2014-06-11 Charlie Zender * Document --grp_xtr_var_xcl 2014-06-10 Charlie Zender * Utilize @verbatim environment in all nco.texi @examples 2014-06-06 Charlie Zender * Improve NCO compliance with NASA Reuse-Readiness Levels (RRLs) Reorganize documentation on citation, authorship, copyright, and licensing * Document NARR example of SLD statistics 2014-06-05 Charlie Zender * nc_set_log_level(nco_dbg_lvl) to quiet HDF logging messages for ncdismember 2014-06-04 Charlie Zender * Add pnetCDF token stubs. Build pnetCDF-enabled netCDF4 in /usr/local/parallel. * Filenames that begin with https:// now trigger DAP access code path 2014-05-31 Charlie Zender * Mac OS X compatibility with bld/Makefile complete. No regressions! Using MacPorts netCDF 4.3.1, Xcode 5.1, GNU coreutils (for cut) 2014-05-29 Charlie Zender * NCO 4.4.4 release procedure: Changes since nco-4_4_3: -x tolerance, --rad orphans, CERES, mmr, ncwa msk cd ~/nco;cvs tag -d nco-4_4_4;cvs tag -d nco-4_4_4-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.4 release" cvs tag -c nco-4_4_4;cvs tag -c nco-4_4_4-1 2014-05-28 Charlie Zender * Update --mask_condition documentation 2014-05-27 Charlie Zender * Regression test for negative-valued ncwa --mask_condition works * Isolated bug: ncap_ncwa_scn() lexing ignores msk_val minus sign in conditions Notes in ncap_lex.l near rules for parsing doubles and long doubles Does same problem exist in ncap2 treatment of conditions with negative numbers? 2014-05-26 Charlie Zender * Start using NC_FILL_STRING * Leave ncap (not ncap2) bug found by clang in ncap_lex.l because ncap is deprecated * Fix units bug found by clang in nco_aux.c:nco_find_lat_lon() * Tidy to quiet clang warnings 2014-05-23 Charlie Zender * ncdismember handles whitespace in group names in ncatted phase 2014-05-21 Charlie Zender * Change ncdismember to use eval so ${opt}=${5} may contain multiple whitespace-separated arguments * Implement --grp_xtr_var_xcl for ncdismember. Fixes problems for TES, SMAP data. 2014-05-20 Charlie Zender * Improve ncks -b --bnr --fl_bnr documentation 2014-05-19 Charlie Zender * Tweak chunking for 1D record variables 2014-05-15 Charlie Zender * netCDF 4.3.2 default chunksize of record variables is 1048576 not 1 Alter regression tests to not fail with this, eliminate false negatives 2014-05-06 Charlie Zender * Improve HDF4 documentation accuracy and clarity 2014-05-05 Charlie Zender * Free hash table with nco_trv_hsh_del(tbl) 2014-05-04 Charlie Zender * Fix indexing error with flg_dne, flg_dne2 2014-04-23 Charlie Zender * Attempt regular expression parsing in nco_dmn_avg_mk() only when user explicitly specifies dimensions to process. This allows ncwa to work on files with crazy HDF names for dimensions. * Clean-up warnings for crazy HDF names 2014-04-22 Charlie Zender * Finish hacks to nco_netcdf.c nco_inq_varid() and nco_def_dim() that allow file translation to work with crazy HDF names. 2014-04-20 Charlie Zender * Update bld/Makefile for Yellowstone configuration changes 2014-04-16 Pedro Vicente * nco_prc_cmn_nsm_att() Process (define, write) variables belonging to ensembles in both files (ncbo); special "attribute lookup" ensemble version 2014-04-16 Charlie Zender * Restore former tolerance of -x EXCLUDE_INPUT_LIST for non-existent elements Tolerance was lost in 4.2.x when nco_xtr_mk() replaced older method Thanks to Keith Oleson for this bug report * CDL mode prints orphaned dimensions with --rad flag 2014-04-15 Pedro Vicente * ncks --rad, --orphan, --rph: Retain all (including orphaned) dimensions * nco_rad() Retain all dimensions. 2014-04-13 Charlie Zender * Address Debian bug #744476 by utilizing dh_autoreconf in rules * Write nm2sng_nc() to netCDF-ize problematic HDF4 names Replaces slash and leading special characters by underscore 2014-04-12 Charlie Zender * Fix nco_trm_trl_zro() bug which used last zero, if any, in exponent instead last zero after decimal point before exponent. This caused CDL and XML mode to truncate trailing zeros of exponent Hence all CDL and XML printing prior to 4.4.4 mis-prints floating point numbers with exponents +/- 10, 20, 30 ... 200, 210, 220... * Hunt for ncks --cdl formatting bug that truncates e-10 exponents... 2014-04-07 Pedro Vicente * nco_nsm_att() Inquire if ensemble parent group has "ensemble_source" attribute (ncbo only) This attribute is saved in ncge 2014-04-06 Pedro Vicente * Add /doc/README_msvc.txt, Microsoft Windows Visual Studio 2010 (MSVC) build instructions 2014-04-01 Charlie Zender * NCO 4.4.3 release procedure: Changes since nco-4_4_2: DAP srd fix, nsm brd, rgr wrk cd ~/nco;cvs tag -d nco-4_4_3;cvs tag -d nco-4_4_3-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.3 release" cvs tag -c nco-4_4_3;cvs tag -c nco-4_4_3-1 2014-04-01 Pedro Vicente * Data file in_grp_7.cdl with group previously in in_grp_3.cdl, to avoid netCDF 4.1 repeated dimension IDs bug * Regression script NCO_rgr.pm detects return code made by function nco_get_prg_info() * nco_get_prg_info() Make return code 41 for netCDF version 4.1x linkage and return code 43 for netCDF version 4.3.1.x linkage 2014-03-27 Pedro Vicente * ncge: Detect NCAR CCM/CCSM/CF conventions for handling fixed variables * nco_var_is_fix() Variable should be treated as a fixed variable * nces #21 Test CF fixed variables 2014-03-26 Pedro Vicente * ncwa #58-62: Cell methods regressions * ncwa #63: Cell methods test with repeated dimension names (test absolute dimension name) * nco_cnv_cf_cll_mth_add() Use absolute dimension name to match dimensions 2014-03-19 Pedro Vicente * ncbo #29: Process cases where both an absolute path variable exists in 2 files and a relative variable match exists as a result of processing ncge with 1 ensemble member 2014-03-13 Pedro Vicente * nces #20: Checking of conforming dimensions between ensemble variables * nco_chk_nsm() Check if ensembles dimensions are valid 2014-03-12 Pedro Vicente * Add test files in_grp_4.cdl, in_grp_5.cdl; generate test case for nces average members whose hyperslabs resolve to the same size 2014-03-10 Charlie Zender * Build NCO on rhea at ORNL 2014-03-10 Pedro Vicente * ncbo #29. Process relative matches, second file greater (obs.nc cmip5.nc) 2014-03-09 Pedro Vicente * ncbo #27. Process ensembles in file 2 (obs.nc) with common variable at root in file 1 (mdl.nc) Check fixed variables * ncbo #28. Process relative matches, first file greater (cmip5.nc obs.nc) * nco_prc_rel_cmn_nm(). Process relative matches. 2014-03-06 Pedro Vicente * ncbo #26. Process ensembles in file 2 (obs.nc) with common variable at root in file 1 (mdl.nc) * nco_prc_nsm(). Process ensembles in file 2 with common variable at root in file 1 2014-03-05 Pedro Vicente * ncbo #25. Process ensembles in file 1 (mdl.nc) with common variable at root in file 2 (obs.nc) * nco_prc_nsm(). Process ensembles in file 1 with common variable at root in file 2 2014-03-04 Pedro Vicente * ncbo #24. Process variables belonging to ensembles in both files * nco_prc_cmn_nsm(). Process variables belonging to ensembles in both files 2014-03-04 Charlie Zender * User reported extreme slowdown accessing 3-D data with strides from DAP server Info from R. Signell and J. Whitaker suggests using nco_get_vars() instead of nco_get_varm() All NCO hyperslab code uses nco_get_varm() instead of nco_get_vars(), and supplies NULL * as mapping vector Replacing all instances of nco_get_varm() with nco_get_vars() solves access speed problem on DAP 2014-03-03 Charlie Zender * Add NCOpy by Joe Hamman to homepage 2014-02-27 Charlie Zender * Document HDF Group H4CF tool h4tonccf 2014-02-26 Charlie Zender * Warn about record chunk sizes only after records have been written 2014-02-25 Charlie Zender * Diagnose/fix ncwa/ncpdq dimension-matching algorithm Old algorithm matched any dimension that contained specified string 2014-02-20 Charlie Zender * NCO 4.4.2 release procedure: Changes since nco-4_4_1: ncra.c mmr 4 LLVM/clang, -X, rx nsx, cll_mth, ncwa sng, cnk cd ~/nco;cvs tag -d nco-4_4_2;cvs tag -d nco-4_4_2-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.2 release" cvs tag -c nco-4_4_2;cvs tag -c nco-4_4_2-1 * Slightly simplify logic in calling/utilizing nco_inq_format_extended() * Restore explanatory messages for new ncrename regression failures * Remove test group with hidden attributes from in_grp.cdl to prevent build failures with netCDF 4.1.1- Isolate this group in new file hdn.cdl so that in_grp.nc builds and regressions pass 2014-02-19 Charlie Zender * Turn-off OpenMP by setting thr_nbr_max_fsh == 1. Revisit when thoroughly tested. * Fix bad initialization of dmn_cmn in nco_cnk_sz_set_trv() * Clean-up compiler warnings for GCC 4.4.3- and for netCDF3-only builds (i.e., tephra) * Clarify nces behavior with coordinates 2014-02-19 Pedro Vicente * Print error message for ncge, when second file contains ensembles not in first file 2014-02-18 Pedro Vicente * nces regressions #18 Ensemble fixed variables * nco_nsm_def_wri() Define OR write ensemble fixed variables 2014-02-18 Charlie Zender * Fix four crazy/busted ncrename regression tests. They only passed with netCDF < 4.3.1 because of library bug that renamed whole coordinates (variables + dimensions) instead of only dimensions. 2014-02-17 Charlie Zender * Re-implement cell_methods from scratch 2014-02-13 Charlie Zender * Change duration (drn) to subcycle (ssc), a more descriptive keyword 2014-02-12 Charlie Zender * Workaround double-free() bug with ncwa min/max and string arrays Temporarily do not free string memory in nco_var_free() unless dbg_lvl=6 * nco_var_rdc_[min|max|ttl]() copies first element of NC_CHAR and NC_STRING Previously, these routines did nothing with those variable types * Set only flg_mch (not flg_xtr) in nco_trv_rx_search() * Always call nco_def_var_deflate() with valid dfl_lvl in ncap2 * Tidy configure.ac 2014-02-11 Charlie Zender * Flag objects associated with both explicit _and_ rx-matched objects Now rx-matched groups have associated variables flagged in intersection mode * Call nco_cnk_ini() iff fl_out_fmt is netCDF4 2014-02-10 Pedro Vicente * ncwa regressions #61, #62, #63 cell_methods CF attribute convention 2014-02-10 Charlie Zender * ncks expand smr_sng to accomodate longer filenames, summaries (fixes SMAP breakage) 2014-02-07 Pedro Vicente * ncra regression #32 cell_methods CF attribute convention (create) 2014-02-07 Charlie Zender * Make JSON look decent * Change cell_methods to agree with actual method used for coordinates * Change ncwa behavior to comply with longstanding intent & documentation that coordinate variables always return averages, never extrema or other statistics. ncra and nces have long-implemented this convention. 2014-02-06 Pedro Vicente * Add test data for cell_methods CF attribute convention * ncwa regression #58, #59, #60 cell_methods CF attribute convention 2014-02-06 Charlie Zender * Start node printing for JSON 2014-02-05 Pedro Vicente * Add ncks regression #89 -X and associated coordinates 2014-02-05 Charlie Zender * Add W10N/JSON stubs * Improve documentation build rules in ./configure * Explicitly add -Wuninitialized -Wmaybe-uninitialized to GCC in bld/Makefile 2014-02-04 Charlie Zender * Pass same Make arguments to clang/LLVM as to gcc/GCC * Add byte/ubyte-valued nco_var_avg_rdc_ttl()/_min()/max() Was bug in native-byte arithmetic but NCO usually promotes to double... * Fix Clang/LLVM compiler warnings: nco_fl_blocksize() and nco_cnk_ini() prototypes, self-assign CEWI compiler warnings (now add zero). 2014-02-04 Pedro Vicente * Add ncks regression #88 -X writing and associated coordinates 2014-02-02 Pedro Vicente * Add ncks regression #90 -X writing and associated coordinates 2014-02-01 Pedro Vicente * Add ncks regression #83 Test 'standard_name' attribute for "longitude" and "latitude" values 2014-01-31 Charlie Zender * Crude implementation of cnk_map=rew 2014-01-31 Pedro Vicente * nco_cnv_cf_cll_mth_add() Add cell_methods attributes (create mode) * Add ncwa regression #58 Add cell_methods attributes (create mode) 2014-01-30 Pedro Vicente * nco_chk_dmn(): Check valid input dimension name (used for --fix_rec_dmn) Make group table construction function return NCO_CHK_NOERR or NCO_CHK_ERR 2014-01-30 Charlie Zender * Improve REC_APN documentation 2014-01-29 Pedro Vicente * Add ncks regressions #86 Change record dimension to fixed dimension --fix_rec_dmn 2014-01-29 Charlie Zender * NCO 4.4.1 release procedure: Changes since nco-4_4_0: -X grp, cnk_dmn grp, ncra_no_fl_close bugfix cd ~/nco;cvs tag -d nco-4_4_1;cvs tag -d nco-4_4_1-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.1 release" cvs tag -c nco-4_4_1;cvs tag -c nco-4_4_1-1 * Verified ./configure works on Intel compilers on greenplanet, and bld/Makefile works on Intel compilers on yellowstone, and all regressions pass * Revert nco_close() and nco_fl_rm() to intended location within ncra.c file loop Fixes important bug since multi-file operator was not closing/removing input files Bug committed in ncra.c revision 1.430 on 20131107 thus affects NCO 4.3.9-4.4.0. * Remove expected return value from free() in strcasecmp() for Mac OS 10.9 LLVM compatibility 2014-01-27 Pedro Vicente * Add ncrcat regressions #28,29,30 Record appending for a group with one record, for a group with 2 records 2014-01-26 Charlie Zender * Remove early exit from nco_cnk_sz_set(). Revert some changes. * Tidy nco_cnk.c * NB: Unidata renamed netCDF 4.3.1-rc7 as 4.3.1. Some NCO notes still say 4.3.1-rc7. 2014-01-23 Pedro Vicente * nco_dmn_malloc() Inquire about number of dimensions in group and return dynamic array of dimension IDs 2014-01-22 Pedro Vicente * nco_prs_aux_crd() Parse auxiliary coordinates limits directly into traversal table 2014-01-21 Pedro Vicente * Add nco_var_scp(). Check if one variable is in scope of another. 2014-01-21 Charlie Zender * ncgen breaks on hidden attributes in CDL with netCDF 4.1.1- (201111) Hence NCO 4.4.0 has many regressions on older netCDF Need to move in_grp.cdl hidden attributes group g13 into its own "safe" file * Performed autoreconf --force to update config.{sub,guess} for Debian AArch64 * Add nces.1 manpage to automake instructions 2014-01-20 Pedro Vicente * Add ncks regressions #81,#82,#83,84 --cnk_dmn full names 2014-01-17 Charlie Zender * Turn-off shuffle when uncompressing otherwise chunking requests may fail * Add nco_def_var_fletcher32() wrapper and stub 2014-01-17 Pedro Vicente * Add ncks regressions #81,#82 --cnk_dmn full names * Add ncks regressions #83 Chunking and shuffle filter 2014-01-16 Pedro Vicente * Add test data for --cnk_dmn full names in_grp_3.cdl * Add ncks regression #80 Chunking and uncompression (-L 0) * Add utility functions nco_strrstr(), nco_is_fll_pth() 2014-01-16 Charlie Zender * Fix to allow uncompressing files at the same time as chunking files 2014-01-14 Pedro Vicente * Add test data for -X option in in_grp_3.cdl 2014-01-12 Pedro Vicente * -X support for associated variables located anywhere in file hierarchy * Add ncks regression #70: -X for associated variables located anywhere in file hierarchy 2014-01-09 Charlie Zender * Fix cnk lfp map bug, re-release 4.4.0 2014-01-08 Charlie Zender * NCO 4.4.0 release procedure: Changes since nco-4_3_9: hash, dyn mmr, ncra.c fixes, hdf4, autocnv, hdn, cnk cd ~/nco;cvs tag -d nco-4_4_0;cvs tag -d nco-4_4_0-1 cd ~/nco;cvs commit -m "Preparing nco-4.4.0 release" cvs tag -c nco-4_4_0;cvs tag -c nco-4_4_0-1 * Add hack to help convert empty variables with multiple record dimensions to all fixed dimensions and netCDF3 output * Fix subtle bug when overwriting attributes during autoconversion 2014-01-07 Charlie Zender * Verify yellowstone build is clean, improve chunking error-tolerance 2014-01-07 Pedro Vicente * Add ncpdq regression #46: Chunking -a lon,lat --cnk_dmn lat,1 --cnk_dmn lon,2 -v lat_2D_rct * Add ncecat regression #12: Chunking -v four_dmn_rec_var --cnk_dmn lat,2 --cnk_dmn lon,4 * Add ncwa regression #57: Chunking with --rdd 2014-01-06 Pedro Vicente * Add ncwa regression #55: Chunking -a time --cnk_dmn lon,4 -v byt_3D_rec * Add ncwa regression #56: Chunking -a /time --cnk_dmn /time,1 -v time 2014-01-06 Charlie Zender * Use "_ChunkSizes" (plural) not "_ChunkSize" (singular) in NcML output * Add cnk_map argument to some executables that were missing it * Fix recidivist bug where if(sng_cnv_rcd) used instead of if(*sng_cnv_rcd) 2014-01-05 Pedro Vicente * Add ncecat regression #11: Chunking --cnk_plc=all 2014-01-05 Charlie Zender * Base default cnk_sz_byt on output filesystem blocksize * Add chk_sz_byt/cnk_byt input to all netCDF4 writers 2014-01-03 Charlie Zender * Implement map_lfp and begin accounting for type size and chunk size in bytes * Implement plc_xst and map_xst * Implement plc_xpl and correct detour when must_be_chunked * Add stubs for two new (and not-yet-supported) chunking maps: map_xst and map_lfp * Verified nccopy does not preserve pre-set _Chunksizes when copying variables * Revert to completing nco_cnk_sz_set_trv() only when user-specified * Fix bug where nco_var_lst_dvd_trv() was called with cnk_map, cnk_plc instead of pck_map, pck_plc 2014-01-02 Charlie Zender * Add nco_op_typ_cf_sng() for cell_methods functionality * Refactored chunking code. Exposed old bug in is_chunked flag. Many regressions. * Fixed nco_cnk_sz_set_trv() bug where nco_cnk_dsk_inq() was called with output not input ID * Replace cnk_sct with cnk_dmn, cnk with cnk_dmn in preparation for new chunk structure * Add nco_[get/set]_chunk_cache() prototypes * Tidy nco_cnk_sz_set_trv() 2013-12-31 Charlie Zender * Prevent printing hidden attributes on netCDF3 files * Fix error when new nco_inq_var_fill() stub used on netCDF3 files * XML mode deprecate emulation of toolsUI 4.3 _FillValue behavior for unsigned types (present in NCO 4.3.7-4.3.9) 2013-12-30 Charlie Zender * ncks document --hdn, autoconversion, --fix_rec_dmn changes * Update copyright year to 2014 * Verified snapshot passes tests on Yellowstone * NCO snapshot fails all ncra on tephra/netCDF3-only. No obvious valgrind issues. * Add regressions tests for ncra/ncrcat issues fixed at AGU including incorrect treatment of missing values with MRO, and detection of input_complete when stride skips user-specified idx_end_max 2013-12-29 Charlie Zender * Print hidden attributes with --hdn, --hidden * ncks --fix_rec_dmn=all fixes all record dimensions * ncdismember put groups in per-file directory, call cfchecker in batch mode 2013-12-28 Charlie Zender * Add HINT for NC_ECANTWRITE * ncdismember overwrite Conventions with version used by cfchecker * ncdismember match .hdf only as filename suffix for --hdf4 switch * Refine nco_xtr_grp_mrk() to check that marked groups match beginning/end of path boundaries. nco_xtr_mk() already does this. 2013-12-27 Charlie Zender * Failed attempt to convert NC_STRING to NC_CHAR variables Would require implementing (possibly thousands of) dummy dimensions * Correctly handle output filenames that contain whitespace * ncdismember: Works with group names that contain whitespace * CDL-mode: print terminal group name comments in CDL-valid syntax to protect whitespace * Fix diagnostic INFO message for mk_rec_dmn/fix_rec_dmn in nco_cpy_var_dfn_trv(), nco_dmn_msa_tbl() * Autoconvert: fix when converting _FillValue, and restore defaults. MODIS works! * nco_att_cpy() autoconverts all netCDF4->netCDF3 types when appropriate in ncks * nco_msa_cpy_var_val_mlt_lmt_trv() use nco_var_cnf_typ() to autoconvert netCDF4->netCDF3 * nco_msa_cpy_var_val_mlt_lmt_trv() use one code path for scalars and arrays 2013-12-25 Pedro Vicente * Add ncks regression #78: CF extraction of in-scope variables 2013-12-25 Charlie Zender * Replace harmless continue with more efficient break 2013-12-24 Pedro Vicente * Add ncks regressions #75, #76: Default datasets (no options) * Add ncks regression #77: flatten with parallel variables (-3 -G : -g) 2013-12-23 Charlie Zender * Add autoconvert stubs to nco_xtr_dfn() and nco_cpy_var_val_mlt_lmt_trv() * Clean-up nco_cpy_var_dfn_trv() before implementing autoconvert feature * Add HINT before exit() on NC_EBADTYPE 2013-12-22 Pedro Vicente * Add ncks regression #74: -c option, extract all coordinate variables 2013-12-22 Charlie Zender * ncks ~/nco/data/hdf.hdf now works! * Document new HDF4 capabilities * Eliminate need for --hdf4 switch if linked to netCDF 4.3.1-rc7+ * Change from nco_hdf_cnv to nco_fmt_xtn enum/tokens * Add nco_inq_format_extended() stubs * Add hdf.cdl to generate HDF4 files for testing * Fix/change --nsm_fl, --nsm_grp switches to not expect arguments 2013-12-19 Pedro Vicente * Fix -X bug, where extra array elements were being printed. * Add use case for -X in scope variables, in in_grp_3.cdl. 2013-12-19 Charlie Zender * Document "group" option to ncatted * Tweak ncdismember to append specified CF Convention to each dataset * Add dsm.cdl to test ncdismember in ICESat-2 and Mable-like cases * Print metadata only groups in all desired cases 2013-12-18 Charlie Zender * Print only extracted groups for prn_flg->trd in old format * Print group closing braces for prn_flg->trd in new format * Print metadata-only groups when all ancestors have extracted variables * Rely on nco_xtr_grp_mrk() and remove duplicate code from nco_xtr_mk() * Copy metadata-only groups. Introduce flg_mtd and use flg_xcl to handle group exclusion. * Tidy nco_grp_utl.[ch] before addressing metadata-only leaf-group extraction bug 2013-12-17 Charlie Zender * Regression test for copy/print metadata-only leaf group * Better document ncrename behavior with coordinates and groups 2013-12-16 Pedro Vicente * ncwa weights/masks names can be absolute names (start with '/') * Add regressions #52, #53 for ncwa weights/masks names with absolute names 2013-12-16 Charlie Zender * Clarify ncrename coordinate documentation * Use target-specific rule to filter-out -Wcast-qual on files with uthash in prototypes 2013-12-12 Pedro Vicente * Dimensions in hyperslabbing arguments are once again checked for validity prior to processing and invalid (i.e., non-existant) dimensions once-again cause operators to abort. 2013-12-11 Charlie Zender * Stop writing global attributes twice in ncra.c * Re-enable history attribute in ncra.c 2013-12-10 Charlie Zender * Tentative fix to mss_val/MRO bug: use mss_val from var_prc_out not var_prc in nco_opr_nrm() * Whitespace changes while attacking ncra mss_val/MRO bug * Fix ncra/ncrcat bug where extra record used when superfluous input files provided and stride places first index of superfluous files beyond user-specified last index. * Clean-up hash usage. Try different approaches prior to widespread implementation. 2013-12-10 Pedro Vicente * Replace static dimensions arrays with dynamic. Causes a one order-of-magnitude speedup. * Limit structures are now contained in the traversal table build function Information about valid limit names is exported to main programs 2013-12-09 Charlie Zender * Fix ncra/ncrcat bug where file loop exited after first record dimension completed * Whitespace changes while debugging MRO/DRN bug * Revert one-line CVS version 1.59->1.60 change in nco_omp.c committed on 20131029 which caused many OpenMP-enabled operators to die when dbg_lvl > 2. * Prepare to attack ncra/ncrcat MRO/DRN bug 2013-12-09 Pedro Vicente * Enable hash table lookup 2013-12-08 Pedro Vicente * ncrename: Regression #22 Allow input syntax of new name as full path 2013-12-04 Charlie Zender * Patch ncap2 format string vulnerability to prevent FTBFS error with -Werror=format-security Patch provided by Orion Poplowski * Turn-off deflate filter when dfl_lvl == 0 * Fix many ncap2 compiler warnings 2013-12-04 Pedro Vicente * Function that checks for invalid input dimensions * ncks: Regression #72 Invalid dimension input 2013-12-04 Charlie Zender * De-compressing netCDF4 files/variables to level 0 works 2013-12-03 Charlie Zender * Add g13 to in_grp.cdl to test compression and other hidden attributes 2013-12-02 Charlie Zender * NCO 4.3.9 release procedure: Changes since nco-4_3_8: nces, XML, ncatted NaN cd ~/nco;cvs tag -d nco-4_3_9;cvs tag -d nco-4_3_9-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.9 release" cvs tag -c nco-4_3_9;cvs tag -c nco-4_3_9-1 * ncatted: Replace isnormal() with isfinite() macro to treat zero "normally" * nces: Clean-up nco_grp_utl.c, nco_grp_trv.c, ncra.c * Document nces and group mode in nco.texi, man pages, internally 2013-12-01 Charlie Zender * Rename old ncea program to nces (netCDF ensemble statistics) * Rename old ncea-mode to ncfe-mode (netCDF file ensemble) * Rename old nces-mode to ncge-mode (netCDF group ensemble) 2013-11-23 Charlie Zender * Add nco_srm.[ch] for streams 2013-11-22 Pedro Vicente * nces: Regression #4 multi file ensembles 2013-11-22 Charlie Zender * XML mode add informational comments like CDL with -D 1 * XML mode isolate toolsui/ncgen/XML bugginess in buggy.cdl so in_grp.cdl "just works" * XML mode add precise multi-dimensional NC_CHAR warnings when dbg_lbl > 0 * XML mode change default and backup string separator to "*" and "*|*" respectively NB: Buggy NcML toolsui breaks on long separators like "foobar" * XML mode add ugly shape="" attribute to scalars for fuller NcML compliance 2013-11-21 Charlie Zender * XML mode ensure string variables and attributes do not contain string separator 2013-11-20 Charlie Zender * XML mode never print blank (underscore) for missing values * Workaround NcML limitations on uint64 types by removing max(uint64) values from input CDL files other than buggy.cdl 2013-11-19 Charlie Zender * XML mode print non-whitespace separators for 1D character array attributes * XML mode print non-whitespace separators for scalar strings for brain-dead programs 2013-11-18 Charlie Zender * Neaten XML indentation * Add more backwards-incompatible members to buggy.cdl * XML mode use stub-name not full name in group name element 2013-11-16 Charlie Zender * Omit XML default _FillValue when variable already has _FillValue * Eliminate all quotes from elements * XML mode add default _FillValue attribute for unsigned variable types * XML mode add _Unsigned attribute for unsigned variable types * XML mode use xml_typ_nm() instead of cdl_typ_nm() 2013-11-15 Pedro Vicente * nces: Regression #3 file ensemble with GPE 2013-11-15 Charlie Zender * Add XML non-whitespace separator to multi-dimensional NC_CHAR variables 2013-11-13 Charlie Zender * Numerous XML fixes spurred by Aleksandar Jelenak report: * Make XML separator configurable via ncks --xml_spr_chr, --xml_spr_nmr * Fix printf() format string for NC_INT64 in nco_typ_fmt_sng_att_xml() * Close content-less elements with "/>" not ">" (in contrast to ncdump -x, toolsui) * Add separator=", " attribute for non-whitespace separators * Add type="cdl_typ_nm" attribute to non-string attribute elements * XML print in metadata mode 2013-11-13 Pedro Vicente * nces: Regression #1, #2. 1 file ensembles, with --nsm_sfx 2013-11-10 Charlie Zender * nces first stab at --nsm_sfx switch. Must place in nco_xtr_mk() too. 2013-11-06 Charlie Zender * NCO 4.3.8 release procedure: Changes since nco-4_3_7: ncatted groups, -7, namespace safety cd ~/nco;cvs tag -d nco-4_3_8;cvs tag -d nco-4_3_8-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.8 release" cvs tag -c nco-4_3_8;cvs tag -c nco-4_3_8-1 * Add example of removing "bounds" variable * Add -7 synonym switch for fl_fmt=netcdf4_classic 2013-10-31 Pedro Vicente * ncatted: Regressions #6 to 11. Groups, for single variable, all variables, wildcard variables, group attributes, relative and absolute variable names, global attriutes. 2013-10-25 Charlie Zender * Update config.[guess,sub] to enable builds on ARM64 (AArch64) machines * Add missing --op_typ/--operation switches to ncra.c 2013-10-23 Pedro Vicente * Add option to configure --enable-openmp (default yes), disable with --disable-openmp 2013-10-23 Charlie Zender * Update autobld/missing with missing from automake 1.13 * Add GNU-required AUTHORS file to quiet autoreconf warnings 2013-10-21 Charlie Zender * Rename most external symbols to have nco_ prefix This changes prg,prg_nm,dbg_lvl to nco_prg_id,nco_prg_nm,nco_dbg_lvl and prg_get(),prg_nm_get(),dbg_lvl_get() to nco_prg_id_get(),nco_prg_nm_get(),nco_dbg_lvl_get() This should considerably reduce chances of namespace pollution Other changes include prg_prs()->nco_prg_prs() Remaining namespace violators will be changed in the course of time This partially addresses external symbol conflicts with NCO 4.3.7 on yellowstone.ucar.edu 2013-10-20 Charlie Zender * Add hashing to trv_tbl_mrk_xtr(). More regressions. * Document hash table behavior. Play with -Wcast-qual * Tidy group routines. Verify no regressions before implementing hashes. 2013-10-18 Charlie Zender * Supplant strcmp() with hash table in trv_tbl_var_nm_fll() Works on all operators except ncbo * #define NCO_HSH_TRV_OBJ token to use hashes instead of strcmp() loops * Hash all objects in traversal table and store resultant hash table Use string-keyed hash based on full object name * Add uthash hash table functionality stubs and nco_uthash.h BSD-licensed code by Troy D. Hanson http://troydhanson.github.com/uthash * Warn about excessive malloc()-size requests. Namespace pollution caused request for 18446744073709551608 B = 16 EB * Move ncga enum to nces enum and place at end to workaround namespace pollution Pollution tainted shared libraries on Yellowstone at NWSC. To prevent recurrence must prefix all external symbols with nco_, and remove all global variables. 2013-10-17 Charlie Zender * NCO 4.3.7 release procedure: Changes since nco-4_3_6: --mrd, --hdf4, --xml, ncrename groups cd ~/nco;cvs tag -d nco-4_3_7;cvs tag -d nco-4_3_7-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.7 release" cvs tag -c nco-4_3_7;cvs tag -c nco-4_3_7-1 2013-10-16 Pedro Vicente * Add ncrename regressions #1 to #21: attributes, dimensions, variables, groups. 2013-10-16 Charlie Zender * Add --xml_no_location 2013-10-15 Charlie Zender * Handle control characters slightly better XML mode * Add CDL tags , isUnlimited, . XML dumping is mostly complete. 2013-10-10 Charlie Zender * Document -m -M -H * Treat PRN_VAR_DATA as CPY_VAR_DATA in ncks in.nc out.nc * Treat PRN_[GLB,VAR]_METADATA as CPY_[GLB,VAR]_METADATA in ncks in.nc out.nc 2013-10-09 Charlie Zender * Document HDF4, --hdf4 switch * Add ncecat regression test of concatenating variables with different IDs * Re-add nco_var_mtd_refresh() to ncecat main loop * Fix cppcheck error using sng_val_sng as sprintf() parameter and destination 2013-10-08 Charlie Zender * Clear garbage from stdin with safe method, not fflush(stdin) * Close fp_in file resource for MFOs reading fl_in lists from files * Received cppcheck static analysis check from dcb314 Fixed three fprintf() formatting problems, one resource leak, one undefined behavior, one misuse of C++ vector .empty(), one potential NULL-deference. 2013-10-06 Charlie Zender * Too many special cases so copy Unidata escaped_name() list * Fix ncpdq regression failures caused by --hdf being interpreted as --hdf4 (a new option) not --hdf_upk (the intended option). * CDL-mode prints CDL-compatible group/variable/dimension/attribute names Special characters in these names are now backslash-protected 2013-10-05 Charlie Zender * Wrote nm2sng_cdl() to CDL-ize variable/dimension/attribute names * ncrename and ncatted do not work on HDF4 files because they attempt to modify the file on disk. netCDF4 cannot directly modify an HDF4 file. Rather, netCDF4 can read HDF4 files through the API. All other operators work because they construct the output file through the API. They never directly modify the HDF4 file. ncrename and ncatted, on the other hand, always attempt to directly modify the HDF4 file. The solution would be to make the --hdf4 switch trigger an API-based copy in ncrename and ncatted. * All operators with --hdf4 (except ncrename and ncatted) appear to work with HDF4 files * Add arithmetic functions for NC_BYTE and NC_UBYTE 2013-10-04 Charlie Zender * Add --hdf4 switch to all operators except ncrename and ncatted * ncbo --hdf4 does arithmetic on (some) HDF4 files correctly! * ncks --hdf4 prints and writes (some) HDF4 files correctly! * Add --hdf4 flag to prevent NCO from interrogating compression/chunking on HDF4 files * First builds with --enable-hdf4 * Skeleton nces loops * Support CF versioning in ncdismember 2013-10-03 Charlie Zender * Add nces stubs to ncra.c * Tidy ncra.c * Document --mrd * Add --mrd = --multiple_record_dimension switch to allow ncecat, ncpdq to increase number of record dimensions in a variable as a natural or incidental consequence of processing netCDF4 files 2013-10-02 Charlie Zender * cd ~/nco;cvs commit -m "Snapshot after move to Allura" cvs tag -c nco-4_3_7_postallura * Move SF NCO repository to Allura * cd ~/nco;cvs commit -m "Snapshot before move to Allura" cvs tag -c nco-4_3_7_preallura 2013-09-27 Charlie Zender * NCO 4.3.6 release procedure: Changes since nco-4_3_5: --flt, ncpdq/ncecat 1 rec dmn, ncwa/ncea fixes cd ~/nco;cvs tag -d nco-4_3_6;cvs tag -d nco-4_3_6-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.6 release" cvs tag -c nco-4_3_6;cvs tag -c nco-4_3_6-1 * Add mdl_1.cdl 2013-09-26 Pedro Vicente * ncwa: Add support for weights and masks per group. Regressions #49, #50 2013-09-26 Charlie Zender * Document ncdismember and CF-compliance checker 2013-09-24 Pedro Vicente * Add ncwa test #29 Weights and hyperslabs 2013-09-24 Charlie Zender * Add dismember example to manual * Add --flt option to ncra.c (had forgotten it before) 2013-09-23 Pedro Vicente * Add ncra test #29 Group with 2 record dimensions made with ncecat, reverted to 1 record with ncpdq 2013-09-23 Charlie Zender * Change test DAP server from http://motherlode.ucar.edu:8080/thredds/dodsC/testdods/ to http://thredds-test.ucar.edu/thredds/dodsC/testdods/ * Add reference list of publications acknowledging NCO 2013-09-22 Charlie Zender * No 4.3.5 Ubuntu packages built because mysterious bug where nc_rename_grp() symbol cannot be found in library. Stumped me. * NCO 4.3.5 release procedure: Changes since nco-4_3_4: ncea/ncra/ncrcat groups, --dbl, ncwa hyp/avg, ncpdq rvr cd ~/nco;cvs tag -d nco-4_3_5;cvs tag -d nco-4_3_5-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.5 release" cvs tag -c nco-4_3_5;cvs tag -c nco-4_3_5-1 * This is the second release tagged as 4.3.5 and fixes the ncecat problem and a memory problem with -X. * Releasing late on Friday actually worked well because we found and fixed the problem Saturday. Able to re-release on Sunday before people got back to work Monday. Sourceforge reported no downloads from Friday-Sunday. 2013-09-20 Charlie Zender * NCO 4.3.5 release procedure: Followed but WW found ncecat problem next day * Move nc_rename_grp() stub prototype * Reminder that some time about a week ago Pedro fixed a bug in how ncpdq performs dimension reversal. Apparently dimension reversal was broken in group files since 4.3.2? * Write random walk description of precision degradation 2013-09-18 Pedro Vicente * Add ncra regressions #27,28 2 records to process in 2 groups (do record and variables in group) 2013-09-18 Charlie Zender * Add --flt and --rth_flt switches for symmetry to --dbl and --rth_dbl 2013-09-17 Pedro Vicente * Add ncra regressions #25,26 2 records to process in 2 groups (do record in group only) 2013-09-17 Charlie Zender * GPE operations allow netCDF3 output from netCDF4 input when groups are not required in the output file. This allows GPE flattening to directly create netCDF3 classic files for backward compatibility. 2013-09-12 Charlie Zender * Finish documentation on type conversion, precision, and --dbl 2013-09-11 Pedro Vicente * Add ncra regression #24 (records, group case) 2013-09-10 Charlie Zender * Document groups for ncea, ncra, ncrcat * Stop nco.texi from triggering texinfo.tex bug just fixed by Karl Berry Bug not present in texinfo.tex version 2008-04-18.10 (used by Ubuntu 13.04) Bug present in texinfo.tex version 2013-02-01.11 (used by FC19) Real fix: install texinfo.tex version 2013-09-11+ (committed by Karl) Workaround is to remove apostrophe from manual title in "User's Guide" Workaround done to preserve build compatibility with broken texinfo.tex nco/autobld/texinfo.tex is now fixed version 2013-09-09 Charlie Zender * Move table of contents from bottom to top of documentation 2013-09-08 Charlie Zender * Verify new --dbl switch solves thermonuclear ncwa issue reported by Lori Sentman, Mark Flanner, and Gary Strand. Proof is in ~/netcdf_examples/bugs/ncwa_3528514/tst_gavg_nco.sh 2013-09-07 Pedro Vicente * Add ncks regression #70, #71 (limits, group case) 2013-09-06 Charlie Zender * Document Arithmetic Convention * Add new global variable nco_rth_cnv for Arithmetic Convention 2013-09-05 Pedro Vicente * Add ncrcat regression #22 (group case) * Add ncea regression #11 (group case) 2013-09-05 Charlie Zender * Get ncra.c OpenMP to compile. netCDF4 group traversal OpenMP needs testing. * ncra.c whitespace changes 2013-09-04 Pedro Vicente * Add ncra regression #23 (group case) 2013-09-04 Charlie Zender * Add tpt_flt and tpt_dbl to in.nc to demonstrate precision issues 2013-08-29 Charlie Zender * nco_xtr_mk() correctly matches variable names that are proper subsets of ancestor group names 2013-08-28 Pedro Vicente * Add in_grp_3.cdl group data for ncra testing 2013-08-27 Pedro Vicente * Add ncwa test #41 Retain degenerate dimensions (one variable) * Add ncwa test #42 Retain degenerate dimensions (all variables) * nco_dmn_avg_mk() Build dimensions to average array from input dimension names * nco_dmn_out_mk() Build dimensions array to keep on output * nco_dmn_id_mk() Mark flag average for all dimensions that have the input ID 2013-08-27 Charlie Zender * Restore history attribute to ncwa, consolidate global attribute copying * Build and successfully test GIT-tree versions of libnetcdf.a and libnetcdff.a * Fix memory leak in strcasecmp.c * Never build private version of strcasecmp() with g++ 2013-08-11 Charlie Zender * Verify that mysterious ncks whitespace printing bug related to shared libraries 2013-08-08 Charlie Zender * Cleanup ncflint * Ensure all @item's have text on same line for texi2dvi backwards compatibility 2013-08-07 Charlie Zender * Edit Wenshan's CMIP5 documentation * Print file summary in CDL-mode when dbg_lvl >= 1 2013-08-06 Charlie Zender * Integrate Wenshan's CMIP5 documentation into nco.texi * Add missing semi-colon to nco_mmr.c line 520 so Cygwin can build * Tweak attribute indentation with -5 printing and prn_flg->trd 2013-08-05 Charlie Zender * Add g3 and g5 to mimic CMIP5 problems in in_grp.cdl 2013-08-02 Charlie Zender * Compound dimension functionality 2013-08-01 Charlie Zender * Add stubs for printing braces for compound variables * Document ncrename -g * Document ncks -5 option for PRN_NEW_FORMAT * FC19 will not build current nco.texi, but Ubuntu will. Not sure why. Until fixing this, all documentation must be built on Ubuntu. 2013-07-31 Charlie Zender * NCO 4.3.4 release procedure: Changes since nco-4_3_3: CDL legibility, ncpdq -U fix, --hdf_upk cd ~/nco;cvs tag -d nco-4_3_4;cvs tag -d nco-4_3_4-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.4 release" cvs tag -c nco-4_3_4;cvs tag -c nco-4_3_4-1 * Document and test --hdf_upk in all other applicable operators * Add ncpdq regression test to re-pack 1D variable from HDF convention to netCDF convention * Move header information from nco_netcdf.c to nco_netcdf.h * Tidy UDUnits parsing/handling code * Standardize UDUnits code on opaque return values, not shell return values 2013-07-29 Charlie Zender * ncpdq unpacking is broken in 4.3.2-4.3.3 because packing attributes are still written * Explode CDL printing of NC_CHAR attributes that contain embedded newlines * --hdf_upk flag uses HDF unpack convention: unpacked=scale_factor*(packed-add_offset) 2013-07-26 Charlie Zender * Document MSA user-ordering --msa_usr_rdr with longitude rotation example 2013-07-25 Charlie Zender * Update old cruft in index.shtml * Fix nco_md5_ini() prototype * Fix const'ness of nco_cmp_crd_dpt() * Apparently C++ (or at least g++) always provides strcasestr() * Restore rnd_nbrf() prototype in nco_rth_flt.h * Tighten prototypes in nco_sng_utl.h 2013-07-24 Charlie Zender * Conceal math float definitions in nco_rth_flt.h from LINUXAMD64 to allow yellowstone g++ to build ncap2 * NCO 4.3.3 release procedure: Changes since nco-4_3_2: CDL, XML, ncrename/ncwa groups cd ~/nco;cvs tag -d nco-4_3_3;cvs tag -d nco-4_3_3-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.3 release" cvs tag -c nco-4_3_3;cvs tag -c nco-4_3_3-1 * Modernize configure.ac and Makefile.am as per automake/autoconf recommendations * Rename configure.in to configure.ac * Add autobld/test_driver (created with automake --add-missing) * Rewrite MD5 infrastructure the right way, i.e., like GPE: use/pass dynamic structures 2013-07-24 Pedro Vicente * Add in_grp_3.cdl group data for ncwa testing * Add ncwa test #41 (Groups) Dimension reduction with min flag on type float variable * Add ncwa test #42 (Groups) Dimension reduction on type double variable with max switch and missing values * Add ncwa test #43 (Groups) Dimension reduction on type double variable * Add ncwa test #44 (Groups) rms with weights 2013-07-24 Charlie Zender * Adhere to hdr_pad option when using ncpdq for packing * Place MD5 flags in md5_flg structure * Get ncwa OpenMP to compile. netCDF4 group traversal OpenMP needs testing. * Document new ncatted, ncrename, ncks, ncwa features in man pages, nco.texi 2013-07-23 Charlie Zender * ncrename -g works when linked to new libnetcdf nc_rename_grp() function * ncks now writes MD5 attributes with --md5 -D 6+ to netCDF4 files * CDL mode prints NC_STRING's and arrays of NC_STRING correctly, in both attributes and data sections. CDL mode appears to be ready. * ncatted: Works with single NC_STRING's (previous versions of ncatted completely and utterly fail with all NC_STRINGs). Still fails on NC_STRING arrays because parser is not smart. * ncatted: Fix ambigous interpretation of type specifications * ncatted: Clarify netCDF4 atomic type specifications * CDL mode prefix NC_STRING attributes with "string " * CDL mode add double quotes to printing NC_STRING attributes 2013-07-22 Charlie Zender * Add ncrename stubs and docs for libnetcdf version of nc_rename_grp() 2013-07-22 Pedro Vicente * nco_dmn_trv_msa() Update dimension with hyperslabed size * nco_dmn_trv_msa_tbl() Update all GTT dimensions with hyperslabed size * nco_dmn_msa_tbl() Update GTT dimension with hyperslabed size * nco_prn_var_dfn() Print variable metadata; modified to use hyperslabed sizes 2013-07-19 Charlie Zender * XML mode (with --xml) prints all test cases at least as well as ncdump -x * Fix bad memory dereference in nco_prn_var_val_trv() 2013-07-19 Henry Butowsky * Added custom masking function for 2D vars: mask_out=imask_make(var_in,lat,lon) mask_out is a 0/1 mask of grid points whose value in var_in is missng_value but have an adjacent neighbour whose value is NOT missing var_out=imask_fill(var_in.mask_out,lat,lon) Points in var_in are filled if they are missing AND are specified in mask_out. Fill value is average of nearest neigbours in input, but if neighbour was just been filled then its value is NOT used in the calculation of the average. 2013-07-18 Pedro Vicente * nco_dmn_avg_tbl() Transfer averaged dimensions information into GTT (-a for ncwa) 2013-07-18 Charlie Zender * CDL mode prints all test cases at least as well as ncdump * Switch attribute NC_CHAR printing to chr2sng_cdl() infrastructure * Added chr2sng_cdl() so CDL mode prints control sequences visibly * CDL mode works on zero and one-dimension arrays of NC_CHAR strings * CDL mode works with GPE transformations with constant group level, e.g., ncks --cdl -O -G f1:1 -g g1 ~/nco/data/in_grp.nc GPE transformations that alter group level are incorrectly sorted, indented, and braced * Create nco_gpe_evl_stb() to easily print GPE-transformed group stubs * Move GPE to pre-fl_out code so CDL mode can use it * Fix string and string-array printing for NC_STRING * Ooops, CDL mode always prints on-disk dimension sizes even when hyperslabbing 2013-07-17 Charlie Zender * Document ncks --cdl switch. texi2dvi nco.texi works on Ubuntu, fails on Fedora * Change DDRA to print to stderr not stdout to simplify CDL mode * Fix dimension name printed in compact lists due to mis-nested indices * Implement CDL user switch --cdl * CDL output is more compact (less unnecessary information) than ncdump * Successful CDL output by ncks and conversion by ncgen * Tidy ncoGrammer.g 2013-07-16 Charlie Zender * Mark extracted dimensions with nco_xtr_dmn_mrk() * Isolate nco_xtr_grp_mrk() from nco_xtr_dfn() * New MSVC macros for isinf(), isfinite(), isnan()" * CDL mode prints all floating point values correctly * Variable number of trailing zeros implemented with sng_trm_trl_zro() * Isolate MSVC definitions and macros in nco_rth_flt.h 2013-07-15 Charlie Zender * sng_trm_trl_zro() trims trailing zeros * CDL mode works for non-char variables for attributes, dies for float attributes 2013-07-15 Pedro Vicente * Add in_grp_3.cdl group data for ncwa testing * nco_var_get_trv() Fill-in variable structure for weighting variable "var_nm" 2013-07-12 Charlie Zender * CDL mode for variable shape and attributes mostly works * Implement CDL mode in variable header in nco_prn_var_dfn() * Fix printing so only extracted sub-groups show up * Remaining issues include self-consistent group flg_xtr, also broken with old method 2013-07-11 Charlie Zender * Debian Mayhem project reported five bugs due to unsanitized input: 716127 (ncflint), 716128 (ncap), 716129 (ncap2), 716506 (ncbo), and 716602 (ncecat) Each bug causes a core dump rather than a clean exit(EXIT_FAILURE) Fixed four of these by checking return values on strchr() ncap2 bug triggered _inside_ strtoul() so hard to fix * New indentation works well enough. Begin implementing CDL option. * Strip all tabs and extra vertical space, ready to design new indentation * New print format almost glitch-free, old format intact, regressions all pass 2013-07-10 Charlie Zender * nco_grp_prn() prints variables by group, with OK formatting * Tidy ncbo.c, nco_grp_utl.c * Introduce print flag structure prn_sct prn_flg in ncks 2013-07-09 Charlie Zender * netCDF3 stubs for nco_inq_grp_parent(), nco_inq_grp_parent_flg() return NC_ENOGRP rather than NC_NOERR or assert(0) * Eliminate nc_id argument to nco_prn_att() * First version of group-recursive printer nco_grp_prn() Routine is cornerstone of more flexible print output formatting 2013-07-06 Pedro Vicente * Add in_grp_3.cdl group data for ncpdq testing * Add ncpdq test #40 (Groups) Pack and then unpack scalar * Add ncpdq test #41 (Groups) Unpack 1D variable with MSA 2013-07-05 Charlie Zender * NCO 4.3.2 release procedure: Changes since nco-4_3_1: -X aux, ncflint/ncpdq -g -G --unn cd ~/nco;cvs tag -d nco-4_3_2;cvs tag -d nco-4_3_2-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.2 release" cvs tag -c nco-4_3_2;cvs tag -c nco-4_3_2-1 * Implement/fix GPE in ncflint, ncpdq, ncecat * Implement --union, --intersection, GRP_VAR_UNN in ncflint, ncpdq 2013-07-04 Pedro Vicente * Add in_grp_3.cdl group data for ncpdq testing * Add ncpdq test #39 (Groups) Re-order 2D variable with record (no -C, MSA) 2013-07-03 Pedro Vicente * Add ncpdq test #38 (Groups) Re-order 2D variable with record (-C, MSA) 2013-07-02 Pedro Vicente * Add in_grp_3.cdl group data for ncpdq testing * Add ncpdq test #36 (Groups) Re-order 2D variable with record (-C, no MSA) * Add ncpdq test #37 (Groups) Re-order 2D variable with record (no -C, no MSA) 2013-07-01 Pedro Vicente * Add in_grp_3.cdl group data for ncpdq testing * Add ncpdq test #32 (Groups) Re-order 2D variable (-C, no MSA) * Add ncpdq test #33 (Groups) Re-order 2D variable (no -C, no MSA) * Add ncpdq test #34 (Groups) Re-order 2D variable (no -C, MSA) * Add ncpdq test #35 (Groups) Re-order 2D variable (-C, MSA) 2013-06-29 Charlie Zender * Add -G, --gpe, --unn to ncpdq documentation 2013-06-28 Pedro Vicente * nco_lst_dmn_mk_trv() Build Name-ID array from input dimension names * nco_var_dmn_scp() Variable has dimensions in scope of GTT dimension 2013-06-27 Pedro Vicente * Add ncpdq test #24 Re-order several variables 2013-06-27 Pedro Vicente * Add group use case for ncpdq in in_grp_3.cdl. 2013-06-25 Charlie Zender * Mention implications of type promotion in memory requirements * Add Yellowstone default /ncar/opt/hpss/hsi to list of HSI search paths * Add NCO_MMR_DBG infrastructure for nco_malloc() Does not (yet) report requests made with nco_malloc_flg() and nco_malloc_dbg() export NCO_MMR_DBG=1;ncea -O -D 3 -d time,0,2 -p ~ big_bug5.nc ~/big_avg.nc * Replace many hardcoded dbg_lvl's with symbolic names 2013-06-24 Charlie Zender * Prevent overwriting global attributes (like history) in ncecat, ncflint, ncpdq 2013-06-23 Charlie Zender * Add nco_prc_stt_get() and nco_prc_stm_get() to poll /proc/PID/stat and /proc/PID/statm 2013-06-23 Pedro Vicente * nco_var_dmn_rdr_mtd_trv() Determine and set new dimensionality in metadata of each re-ordered variable * nco_var_dmn_rdr_val_trv() Change dimension ordering of variable values 2013-06-22 Pedro Vicente * Add ncpdq test #24 Reverse/Re-order 4D variable -a lev,time,-lon,-lat -v four_dmn_rec_var (MSA) * Add ncpdq test #25 Re-order all variables -a lat,time (MSA) 2013-06-21 Pedro Vicente * Add ncpdq test #19 Reverse/Re-order 3D variable -a -lat,-time -v three_dmn_var_dbl * Add ncpdq test #20 Re-order several variables -a lat,time -v ty,three_dmn_rec_var (no MSA) Test 1 * Add ncpdq test #21 Re-order several variables -a lat,time -v ty,three_dmn_rec_var (no MSA) Test 2 * Add ncpdq test #22 Re-order several variables -a lat,time -v ty,three_dmn_rec_var (MSA) Test 1 * Add ncpdq test #23 Re-order several variables -a lat,time -v ty,three_dmn_rec_var (MSA) Test 2 2013-06-19 Pedro Vicente * Add ncpdq test #6 Re-order 3D variable with MSA -C -a lat,lon,time -v three_dmn_var_dbl * Add ncpdq test #7 Re-order 3D variable with MSA (stride) -a lat,lon,time -v three_dmn_var_dbl 2013-06-19 Charlie Zender * Fix /proc/self/stat read types and add human-readable sizes for failed memory requests 2013-06-18 Pedro Vicente * Add ncpdq test #13 Re-order 2D variable with record (-C, no MSA) -v two_dmn_rec_var -C -a lev,time * Add ncpdq test #14 Re-order 2D variable with record (no -C, no MSA) -v two_dmn_rec_var -a lev,time * Add ncpdq test #15 Re-order 2D variable with record (-C, MSA) -v two_dmn_rec_var -a lev,time * Add ncpdq test #16 Re-order 2D variable with record (no -C, MSA) -v two_dmn_rec_var -a lev,time 2013-06-17 Pedro Vicente * Add ncpdq test #10 Re-order 2D variable (no -C, no MSA) -v two_dmn_var -a lev,lat * Add ncpdq test #11 Re-order 2D variable (-C, MSA) -v two_dmn_var -a lev,lat -d lat,1,1 -d lev,1,1 * Add ncpdq test #12 Re-order 2D variable (no -C, MSA) -v two_dmn_var -a lev,lat -d lat,1,1 -d lev,1 * nco_var_prc_msa_trv() Transfer MSA sizes from GTT to processed variables * nco_dmn_rdr_trv() Transfer dimension structures to be re-ordered (ncpdq) into GTT * nco_dmn_rdr_xtr() Form list of re-ordering dimensions from extracted input dimensions (ncpdq) * nco_dmn_lst_ass_var_trv() Create list of all dimensions associated with input variable list (ncpdq only) * nco_dmn_lst_ass_var_nbr_trv() Find number of dimensions associated with variables to be extracted (ncpdq only) 2013-06-17 Charlie Zender * Implement robust Linux memory usage by polling /proc/self/stat with ncks --sysconf * Include in nco_mmr.h for accessing sysconf() to get page size 2013-06-07 Charlie Zender * Changes for Fedora Core 18 RPM compatibility 2013-06-05 Charlie Zender * Tidy/fix ncflint OpenMP build. Tidy ncpdq. 2013-05-29 Pedro Vicente * Add data/in_1.cdl, data/in_2.cdl CDL files to test 2 input file operators 2013-05-15 Pedro Vicente * nco_cpy_fix_var_trv() Copy fixed variables from input to output file 2013-05-08 Pedro Vicente * nco_var_trv() Fill-in variable structure for a named GTT variable 2013-05-09 Pedro Vicente * ncflint test #6,7 --fix_rec_crd 2013-05-08 Pedro Vicente * trv_tbl_mrk_typ() Mark output netCDF type in GTT 2013-05-07 Pedro Vicente * ncflint test #5 Group weight 1D variable * nco_get_typ() Obtain netCDF type to define variable from NCO program ID 2013-05-07 Charlie Zender * Document new ncflint, ncbo capabilities 2013-05-06 Pedro Vicente * nco_fll_var_trv() Fill-in variable structure list for all extracted variables 2013-05-03 Pedro Vicente * nco_bld_aux_crd() Parse auxiliary coordinates * ncks test #69 Parse auxiliary coordinates 2013-05-01 Charlie Zender * Add byte arrays to in.cdl * NCO 4.3.1 release procedure: Changes since nco-4_3_0: ncbo -G, --unn, symmetric, grp_brd cd ~/nco;cvs tag -d nco-4_3_1;cvs tag -d nco-4_3_1-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.1 release" cvs tag -c nco-4_3_1;cvs tag -c nco-4_3_1-1 * Update Makefiles to build without failing new CDL files 2013-04-29 Charlie Zender * Move buggy CDL code from in_grp.cdl to buggy.cdl 2013-04-28 Charlie Zender * Use realistic temperatures in obs.cdl, cmip5.cdl * GCC 4.7.3 finally includes strcasestr() in string.h, I think 2013-04-26 Charlie Zender * Document new ncbo, ncecat, group broadcasting features 2013-04-24 Charlie Zender * ncrcat: Fix false positives on non-monotonicity checks in rec_crd_chk() by only checking monotonicity of first record coordinate encountered. * ncecat: Tidy OpenMP 2013-04-24 Pedro Vicente * trv_tbl_mrk_prc_fix() Mark fixed/processed flag in table * ncecat test #6,7,8 Concatenate variables/groups: 1D,2D variables 2013-04-23 Pedro Vicente * ncecat test #4,5 Concatenate variables/groups: scalars 2013-04-22 Charlie Zender * ncecat: Tidy OpenMP * Document new ncbo, ncecat features * Document group broadcasting 2013-04-19 Charlie Zender * ncatted: Fix passing NULL to strcmp() in netCDF4 code path. Bug identified and fix provided by Etienne Tourigny. 2013-04-17 Pedro Vicente * nco_prc_cmn_nm() Process common objects * nco_cmn_nm_prt() Print list of common objects (same absolute path) * trv_tbl_mch() Match 2 tables (find common objects) and export common objects; previously object processing was done in this function, but now the list of common names is exported for use in operators other than ncbo 2013-04-16 Pedro Vicente * nco_get_rec_dmn_nm() Return array of record names 2013-04-11 Pedro Vicente * Add cmip5_1.cdl obs_1.cdl * ncbo test #22; Process relative match from model to observations cmip5_1.nc -> obs_1.nc * ncbo test #23; Process relative match from observations to model obs_1.nc -> cmip5_1.nc 2013-04-10 Pedro Vicente * trv_tbl_rel_mch() Relative match of object in table 1 to table 2 * ncbo test #21; Relative match of object in table 1 to table 2 2013-04-09 Pedro Vicente * gpe_chk() Check valid GPE new name * pck_cpy_attr() Inquire about copying attributes "scale_factor", "add_offset" 2013-04-08 Charlie Zender * Add in_grp_[12].nc 2013-04-06 Pedro Vicente * trv_tbl_prc() Match different types for processed objects * ncbo test #20; Match different types for processed objects 2013-04-03 Pedro Vicente * trv_tbl_prc() Process common objects * trv_tbl_fix() Copy processing type fixed object * Add ncbo test #19; Copy associated coordinates as non processed 2013-03-29 Charlie Zender * ncbo: now almost commutative w/r/t variable rank fixes TODO nco552 2013-03-28 Charlie Zender * Clarify DAP server errors * ncbo: document GPE and --union * ncbo: Implement GPE * ncbo: Implement --union/--intersection switch * Fix ncbo bug: unswap CNV_CCM_CCSM_CF and FIX_REC_CRD arguments to trv_tbl_mch() http://nco.sf.net#bug_ncbo_ccm_ccsm_cf * NCO 4.3.0 release procedure: Changes since nco-4_2_6: ncbo -g, ncatted NULs, ncap2 rounding cd ~/nco;cvs tag -d nco-4_3_0;cvs tag -d nco-4_3_0-1 cd ~/nco;cvs commit -m "Preparing nco-4.3.0 release" cvs tag -c nco-4_3_0;cvs tag -c nco-4_3_0-1 * Document one-hundred thousand file ncecat example 2013-03-28 Pedro Vicente * Add ncbo test #15,16,17,18; Group addition, subtraction, multiplication, division, with limits 2013-03-27 Charlie Zender * nco.texi: clarify why -O --no_tmp_fl in.nc in.nc _does not work_ * Replace ?lround?() with ?lrint?() in internal NCO rounding Halfway cases that were rounded away from zero will now round to nearest even integer * Add lrint(), lrintf(), llrint(), llrintf() definitions * Fix/revert ncatted to not NUL-terminate attributes 2013-03-27 Pedro Vicente * Enable nearbyint(), rint(), round(), trunc() for MSVC * Add ncbo test #14; Group addition 2013-03-26 Charlie Zender * ncks: always copy group and variable metadata (fixes bug introduced in 4.2.6) * Re-activate ncap/ncap2 rounding functions: nearbyint(), rint(), round(), trunc() * Implement source code for nearbyint(), rint(), round(), trunc() * Add configure checks for nearbyint(), rint(), round(), trunc() 2013-03-22 Pedro Vicente * ncbo: nco_var_op_typ() Find operation type on variable, fixed or processed * ncbo: nco_msa_var_get_trv() Get variable data from disk taking account of multihyperslabs * ncbo: trv_tbl_mch() Match 2 tables (find common objects) and process common objects 2013-03-20 Charlie Zender * ncecat: insert stubs for netCDF4 RECORD_AGGREGATE 2013-03-19 Pedro Vicente * ncbo: nco_dmn_ass_var_trv() creates list of dimensions associated with input variable list by marking flg_ass_var in unique dimension list 2013-03-19 Charlie Zender * NCO 4.2.6 release procedure: Changes since nco-4_2_5: --rec_apn, non-atomics, --fix_rec_crd, scope cd ~/nco;cvs tag -d nco-4_2_6;cvs tag -d nco-4_2_6-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.6 release" cvs tag -c nco-4_2_6;cvs tag -c nco-4_2_6-1 2013-03-16 Pedro Vicente * ncks -O -v two_dmn_rec_var ~/nco/data/in_grp.nc ~/foo.nc;ncks ~/foo.nc exposes TODO nco1091, a possible netCDF/HDF bug---duplicate dimension IDs are generated Seems to occur if dimension the same name when defined in a group and its ancestor group C program that reproduces it, using only netCDF API calls, in http://glace.ess.uci.edu/libs/netcdf/257980 2013-03-13 Pedro Vicente * configure: detect Mac OS MacPorts netCDF library 2013-03-11 Charlie Zender * ncecat remove lmt_all structure code from GAG branch * ncecat warn when automatically generated GPE paths conflict during GAG * Verify ncks dumps many NASA HDF5 and HDF-EOS5 files, though no HDF4 or HDF-EOS2 files * Clarify NC_ENOTNC and NC_ENOTBUILT errors 2013-03-10 Pedro Vicente * Regression tests for order coordinates by group depth and "out of scope" coordinate * nco_cmp_crd_dpt() Compare coordinate structures by group depth 2013-03-08 Pedro Vicente * Add regression tests for creation of variables with ancestor group dimensions (GPE, non-GPE) * nco_bld_var_dmn() Assign variable's dimensions to either coordinates or dimension structures Handle "out of scope" cases as non-assigned coordinate * Regression test for coordinate "out of scope" (group depth greater than variable that uses coordinate) 2013-03-08 Charlie Zender * Implement and test ncflint --fix_rec_crd 2013-03-07 Charlie Zender * Add hooks for ncflint --fix_rec_crd 2013-03-06 Pedro Vicente * nco_scp_var_crd() Return in scope coordinate for variable * nco_bld_var_dmn() Assign variables dimensions to either coordinates or dimension structs * nco_get_sls_chr_cnt() Get number of slash characters in a string path * nco_get_str_pth_sct() Get full name token structure (path components) * Add regression tests for "parallel" scope 2013-03-05 Pedro Vicente * nco_dmn_fll_nm_id() Return unique dimension full name from unique ID * nco_dmn_trv_sct() Return unique dimension object from unique ID 2013-03-05 Charlie Zender * Add record character variables to in.cdl 2013-03-04 Pedro Vicente * nco_bld_dmn_ids_trv() Build dimension info for all variables using unique dimension IDs * nco_has_crd_dmn_scp() Is there a variable with same name in dimension's scope? 2013-03-02 Pedro Vicente * nco_xtr_crd_add() Add all coordinates to extraction list re-written for GTT instead of using netCDF API calls 2013-02-27 Pedro Vicente * nco_cpy_msa_lmt() Copy MSA structs GTT to local function (print or write) * nco_prn_var_dfn() re-written for GTT * nco_cnk_sz_set_trv() re-written for GTT 2013-02-26 Charlie Zender * Add nco_dbg_grp between nco_dbg_scl and nco_dbg_var * Improve epitaph from NC_ENOTNC to include diskless/RAM errors * ncrename dies more gracefully when required attributes do not exist 2013-02-26 Pedro Vicente * rewrote nco_xtr_cf_prv_add() Add specified CF-compliant coordinates of specified variable to extraction list this fixes nco1086, deprecated functions used nco_aux_grp_id(), trv_tbl_fnd_var_nm() add regression test ncks#60 * nco_prt_grp_nm_fll() Debug function to print group full name from ID 2013-02-25 Pedro Vicente * nco_msa_wrp_splt_cpy() Split wrapped dimensions (make deep copy of new wrapped limits) * nco_msa_prn_var_val_trv() Print variable data; use GTT to get coordinates; this fixes nco1088 * nco_cpy_var_val_mlt_lmt_trv() Copy variable data from input to output file 2013-02-25 Charlie Zender * #define NCO_USE_FILL_VALUE before not after #ifdef NCO_USE_FILL_VALUE 2013-02-24 Pedro Vicente * nco_bld_var_dmn() Build variables dimensions information (coordinate variables) 2013-02-23 Pedro Vicente * nco_blb_crd_var_trv() Detect coordinate variables into GTT * nco_lmt_evl_dmn_crd() Parse user-specified limits into hyperslab specifications Can be used for dimensions or coordinate variables * nco_bld_lmt() Assign user specified dimension limits to GTT (Group Traversal Table) * ncks: regression test for limits with dimension/non coordinate case 2013-02-22 Charlie Zender * Implement new nco_cpy_var_dfn() API which uses GPE and nco_inq_dmn_grp_id() New routines only called when dbg_lvl=5. Still buggy. Old routines, invoked when dbg_lvl != 5, work fine. 2013-02-21 Pedro Vicente * ncks, ncbo, ncecat: aggregate building of GTT (Group Traversal Table) into a function nco_bld_trv_tbl(); allocate elements as needed 2013-02-21 Charlie Zender * Tighten and complete algorithm to identify ancestor groups in nco_xtr_dfn() 2013-02-20 Pedro Vicente * ncks eliminate lmt_all array and replace with GTT (Group Traversal Table) nco_cnk_sz_set_trv() set chunksize parameters using object variable 2013-02-20 Charlie Zender * Die with graceful hint on NC_EFILLVALUE/NC_ELATEFILL errors 2013-02-19 Charlie Zender * ncrename requires presence of attributes in all variables when attribute is not prefixed with dot, unless attribute is a global or group attribute. 2013-02-16 Pedro Vicente * ncks eliminate lmt_all array and replace with GTT (Group Traversal Table) structure that stores full path names for dimensions and coordinate variables. nco_xtr_wrt_trv() writes extracted data to output file nco_xtr_dfn_trv() defines extracted groups, variables, and attributes in output file nco_prn_var_val_trv() prints variable data * ncks limits are stored in the GTT dimension structure and MSA is applied. Distribute these to variables when writing with nco_msa_prn_var_val_trv(). nco_bld_lmt_trv() assigns user specified dimension limits to traversal table dimensions. 2013-02-14 Pedro Vicente * ncks ncks eliminate lmt_all array and replace with GTT (Group Traversal Table) nco_bld_crd_var_trv() builds dimension information for all variables nco_var_dmn_scp() checks if variable is in dimension scope * ncks parses limits from dimension object associated functions: nco_bld_lmt_trv() Assign user specified dimension limits to traversal table dimensions 2013-02-13 Charlie Zender * Copy grp_id_in and grp_id_out elements of traversal table variables into nm_id structure to enable MM3->MM4 and MM4->MM3. 2013-02-10 Charlie Zender * Improve error message when appending variable with rank mismatch 2013-02-09 Charlie Zender * Reformat metadata printing, include more max. depth, number variable attributes 2013-02-08 Charlie Zender * Fix overcount of record dimensions * Match rx containing slashes to full path not to stub This allows rx's like /g11/uint_.+ to succeed Previously, rx's only worked on stubs (last components of full names) * Re-format global metadata output * Add all coordinates necessary to make in_grp.cdl well-defined CF file (i.e., squelch CF warnings) * Code to ignore non-atomic types appears to work * Add non-atomic types to in_grp.cdl. Initializations break ncgen from netCDF prior to ~201211. What to do? * Update to netCDF 20130208 snapshot * Add support for ignoring (instead of failing on) non-atomic types 2013-02-04 Charlie Zender * Split ncks dimension report into unique fixed and record dimensions 2013-02-01 Charlie Zender * Add --rec_apn documentation to nco.texi 2013-01-31 Charlie Zender * Add --rec_apn regression tests * Add --rec_apn to ncra and ncrcat. Makes possible direct appends. 2013-01-29 Charlie Zender * NCO 4.2.5 release procedure: Changes since nco-4_2_4: fix ncks mk/fix_rec_dmn bugs, metadata printing cd ~/nco;cvs tag -d nco-4_2_5;cvs tag -d nco-4_2_5-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.5 release" cvs tag -c nco-4_2_5;cvs tag -c nco-4_2_5-1 2013-01-27 Charlie Zender * Update documentation to refect new --fix_rec_dmn syntax * Fix 4.2.4 bug that broke --fix_rec_dmn * Add --fix_rec_dmn regression tests, including netCDF3 test with MM3 workaround * Remove tm2_tm3 from in_grp.cdl since ncgen netCDF 4.2.1- chokes on it * Allow for --fix_rec_dmn corner case in nco_cpy_rec_var_val(), i.e., when variable is record in input but not in output * Parse --fix_rec_dmn by prefixing dimension name with "fix_". Kludgy? Yes. 2013-01-26 Charlie Zender * Remove all record-dimension handling from, and thus dramatically simplify, nco_xtr_dfn() * Test and merge nco_cpy_var_dfn() changes to nco_cpy_var_dfn_lmt() * ncks only copies global metadata once * ncks prints multiple root record dimensions * nco_prn_var_dfn() handles multiple record dimensions * Add tm2_tm3 to allow netCDF4 regression tests on variables with multiple record dimensions * Fix 4.2.4 bug that broke --mk_rec_dmn * Smarten nco_cpy_var_dfn() to allow multiple netCDF4 record dimensions * Add --mk_rec_dmn regression tests * New API: pass rec_dmn_nm to nco_cpy_var_dfn*() only when user-specified 2013-01-25 Charlie Zender * Remove ENABLE_NETCDF4 from nco_cpy_var_val_lmt() 2013-01-23 Charlie Zender * Prepare to implement --mk_rec_dmn functionality in nco_xtr_dfn() 2013-01-21 Charlie Zender * NCO 4.2.4 release procedure: Changes since nco-4_2_3: ncks & ncecat new xtr API, ncra bugfix, ncrename cd ~/nco;cvs tag -d nco-4_2_4;cvs tag -d nco-4_2_4-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.4 release" cvs tag -c nco-4_2_4;cvs tag -c nco-4_2_4-1 * Harmonize printing of netCDF3 and netCDF4 metadata * Re-add --mk_rec_dim as synonym for preferred --mk_rec_dmn 2013-01-20 Charlie Zender * Only print fully-qualified name of variables in non-root groups This preserves traditional printing format for netCDF3 files 2013-01-19 Charlie Zender * Pass CPY_GRP_METADATA _and_ CPY_VAR_METADATA to nco_xtr_dfn() * Systematize extraction list function names * Remove cruft from nco_grp_utl.[ch] * Implement new extraction list API in ncecat * Restructure nco_xtr_dfn() to isolate variable from group definitions Group metadata now handled by separate block executed iff PRN_VAR_METADATA This give user ability to turn-off all metadata copying Group metadata now copied for empty ancestors of all extracted variables Previously group metadata were only written to groups containing variables New algorithm: 1. Ensures group metadata written only once. 2. Creates consistent state for group and variable extraction with flg_xtr 3. Handles corner cases where groups introduced after nco_mk_xtr() by, e.g., associated coordinates and CF conventions, now have flg_xtr. Overall, groups now more equal in treatment to variables This may be useful in extending future functionality 2013-01-18 Charlie Zender * Remove cruft from nco_grp_utl.[ch] * Rename functions for clarity and to facilitate cruft removal * Move MM3 code into nco_xtr_wrt() * Split nco_grp_var_mk_trv2() into nco_xtr_dfn() and nco_xtr_wrt() * Add (uninitialized) group ID members to trv_obj structure * Delete ncks -B switch and require -b fl_bnr instead This simplifies logic---now use fp_bnr instead of NCO_BNR_WRT 2013-01-15 Charlie Zender * Place explicit netCDF3 path in nco_inq_grp_full_ncid_flg() * Safeguard potential illegal memory access in nco_mk_xtr() string manipulation 2013-01-14 Charlie Zender * Fix bug introduced in 4.2.1 that causes ncea to break when handling files that do not contain a record dimension. Thanks to Martin Otte for reporting the bug and providing a working fix. http://nco.sf.net#bug_ncea_rec_var * Memory error in nco_mk_xtr() triggers segfaults in autoconf build * Remove new regression tests that are fragile, i.e., whose answers change as in.cdl and in_grp.cdl change 2013-01-13 Charlie Zender * Document union-mode and intersection-mode in nco.texi, and give examples with simultaneous anchoring and recursion * Add --ram_all to remaining usage strings in nco_ctl.c * Reorganize nco_grp_var_mk_trv2() * Rework details of NCO GSL code: use mss_val as argument name, eliminate C99/C++ "//" comment syntax, and attribute copyrights in original GSL code 2013-01-12 Charlie Zender * Set is_crd_var to True in nco_var_fll() when variable referenced in either CF "bounds" or "coordinates" attributes. Effectively, the only consequence of this is that the arithmetic operators now treat CF coordinates like basic coordinates in all ways. More consistent to have time_bnds be an average, like time, rather than a total when -y ttl is specified. This simplifies nco_var_lst_dvd() which no longer separately checks for CF coordinates. * All regression tests pass on netCDF4-enabled NCO. * Enable new extraction maker nco_mk_xtr() version of ncks. This removes most explicit dependencies on netCDF format from main.c. MM3 temporarily disabled. * Tweak regression tests to work with intersections, non-recursive requests 2013-01-11 Charlie Zender * Commit changes to all but source code files 2013-01-10 Charlie Zender * Finish initializing flags. Implement unions/intersections. 2013-01-08 Pedro Vicente * Add Qt/MSVC GSL 1.8d; to use add environment variables LIB_GSL and HEADER_GSL 2012-12-18 Charlie Zender * More work on flags * Dupe netCDF4 stubs to present a fake library for manipulating netCDF3 files with the netCDF4 API 2012-12-17 Charlie Zender * Use new extraction list checker nco_mk_xtr() 2012-12-16 Charlie Zender * Fix bug introduced in 4.2.1 that caused ncra to skip writing results of final normalization if trailing files were superfluous. In the most common case, all zeroes appeared in the output file. 2012-12-14 Charlie Zender * Document ncrename changes * ncrename -a global@old_att,new_att works for global attributes 2012-12-12 Charlie Zender * ncrename -a @old_att,new_att works for global attributes * Start re-vamp of ncrename global attribute handling * Add NCO_NOERR and NCO_ERR tokens for generic success/failure return codes * Change strcmp("global") to strcasecmp("global") in ncatted 2012-12-07 Charlie Zender * Change FL_LST_IN_MAX_LNG from 1 MB to 10 MB per user request 2012-12-06 Pedro Vicente * bm: ncks #54 Extract CF 'coordinates' variables (netCDF4 file) * bm: ncks #55 Extract CF 'coordinates' variables (netCDF3 file) * bm: ncks #56 Extract CF 'bounds' variables (netCDF4 file) * bm: ncks #57 Extract CF 'bounds' variables (netCDF3 file) 2012-12-05 Pedro Vicente * bm: ncks #51-53 Extract associated coordinates test 2-4 (netCDF3/4 file) 2012-12-04 Pedro Vicente * bm: ncks #50 Extract associated coordinates test 1 (netCDF3 file) 2012-12-01 Pedro Vicente * deprecate grp_nm member of nm_id_sct; use full group name to get name as needed 2012-11-30 Pedro Vicente * bm: ncks #39 2D variable definition (netCDF4 file) * bm: ncks #40-49 Variable/Group extraction test 1-8 * deprecate grp_id member of nm_id_sct; use full group name to get ID as needed 2012-11-29 Pedro Vicente * bm: ncks #39 exclude variables (netCDF3 file) * deprecate nco_var_lst_xcl and use nco_var_lst_xcl_trv for both netCDF3 and netCDF4 * Qt: allow Win32 build with netCDF3; define environment $(HEADER_NETCDF3) and $(LIB_NETCDF3) and use CONFIG += netcdf3 in /qt/nco.pri 2012-11-28 Pedro Vicente * Add --get_file_info option * bm: ncks #33 --get_grp_info option (netCDF3 file) * bm: ncks #34 --get_grp_info option (netCDF4 file) * bm: ncks #35 --get_file_info option (netCDF3 file) * bm: ncks #36 --get_file_info option (netCDF4 file) * bm: ncks #37 exclude all variables (netCDF3 file) * bm: ncks #38 exclude all variables (netCDF4 file) 2012-11-27 Pedro Vicente * Add --get_grp_info option 2012-11-27 Charlie Zender * Create nco-bugs@lists.sourceforge.net address for AC_INIT() 2012-11-20 Pedro Vicente * bm: NCO_AVOID_BM_REPORT avoids prompt to send benchmark results * bm: Detect ENABLE_NETCDF4 and HAVE_NETCDF4_H in config.h and run tests accordingly 2012-11-20 Charlie Zender * Document anchoring and recursion at http://nco.sf.net/nco.html#rcr * Implement logic for anchoring and recursion in nco_chk_trv() 2012-11-18 Charlie Zender * rx seems to work for both variables and groups in nco_chk_trv() * Move rx #ifdef logic from nco_chk_trv() down into nco_trv_rx_search() * Implement additional checks for variables in nco_chk_trv() * Implement rx for groups in nco_chk_trv() * Re-organize and rename nco_grp_trv structures * Functionalize nco_hash2comma() 2012-11-17 Charlie Zender * Tidy nco_grp_utl.[ch] * Add NCO spiral logos in Scalable Vector Graphic and GIMP format, logo_srl.svg and logo_srl.xcf, respectively. Contributed by Andrea Cimatoribus A.Cimatoribus@uu.nl * Fix nco_chk_trv() off-by-one error on end boundary * Fix nco_chk_trv() for -g '' and -v '' 2012-11-16 Charlie Zender * nco_chk_trv() allows multi-component user-supplied paths 2012-11-15 Pedro Vicente * ncks regression test #32: Sort output alphabetically 2012-11-15 Charlie Zender * Start multi-component path work in nco_chk_trv() * Change var and grp to obj where usage is generic * Change nc_typ to nco_obj_typ 2012-11-13 Charlie Zender * ncunits filter * NCO 4.2.3 release procedure: Changes since nco-4_2_2: GPE, ncecat fix, group atts. cd ~/nco;cvs tag -d nco-4_2_3;cvs tag -d nco-4_2_3-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.3 release" cvs tag -c nco-4_2_3;cvs tag -c nco-4_2_3-1 2012-11-11 Pedro Vicente * ncks regression test #31: Group dimension hyperslabs 2012-11-09 Charlie Zender * GPE documentation * Change most "Global" to "Group" attributes when printing metadata 2012-11-08 Charlie Zender * NCO 4.2.3 release procedure: Changes since nco-4_2_2: GPE, ncecat fix, group atts. cd ~/nco;cvs tag -d nco-4_2_3;cvs tag -d nco-4_2_3-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.3 release" cvs tag -c nco-4_2_3;cvs tag -c nco-4_2_3-1 2012-11-08 Pedro Vicente * ncks: GPE group attribute extraction * ncks regression test #30: GPE group attribute extraction 2012-11-07 Pedro Vicente * ncks: nco_att_cpy_trv: Copy group attributes 2012-11-06 Pedro Vicente * ncks: Handle GPE redundancy 2012-11-05 Charlie Zender * ncks/ncecat: Complete and test GPE infrastructure * ncecat: Fix 4.2.2 bug that skips first input file in RECORD_AGGREGATE mode with NINTAP 2012-11-05 Pedro Vicente * ncks regression test #29: Extract a 'bounds' variable 2012-11-02 Pedro Vicente * ncks regression test #28: Extract coordinate variables * ncks: nco_var_lst_crd_add_trv: Add all coordinates to extraction list 2012-11-02 Charlie Zender * Call nco_prs_gpe_arg() to parse GPE argument into GPE structure * Add Group Path Editing (GPE) structures 2012-11-01 Pedro Vicente * ncks regression test #26: Extract group attributes * ncks regression test #27: Extract global attributes * ncks: nco_grp_var_mk_trv: Create groups/write variables in output file 2012-10-31 Charlie Zender * ncflint: verify output type is float when interpolating between two packed floats 2012-10-29 Charlie Zender * NCO 4.2.2 release procedure: Changes since nco-4_2_1: ncks groups, hdr_pad, NULs, _'s, ncecat GAG cd ~/nco;cvs tag -d nco-4_2_2;cvs tag -d nco-4_2_2-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.2 release" cvs tag -c nco-4_2_2;cvs tag -c nco-4_2_2-1 2012-10-28 Pedro Vicente * ncks regression test #24: Hyperslabs (test -d with -v and -g) * ncks regression test #25: Dimensions (test -v dimension) 2012-10-27 Pedro Vicente * ncks regression test #22: Extract variables in groups (test -g with -v) * ncks regression test #23: Create variables in groups (test -G with -v and -g) 2012-10-26 Charlie Zender * ncecat: Copy global attributes of first file to root of output file * Place nco_hst_att_cat() after nco4_grp_lst_mk() so appending history command works 2012-10-25 Pedro Vicente * nco_def_grp_flg() used in nco4_grp_lst_mk_itr() for append mode 2012-10-24 Pedro Vicente * xtr_lst_fnd() finds full variable name in extraction list * nco_aux_grp_id() returns group ID given variable full name * Add to in_grp.cdl for CF tests: add gds_var, gds_crd, lat_gds, lon_gds * nco_fnd_var_trv() finds variable by relative name and exports to "nm_id" * nco_var_lst_crd_ass_add_cf() adds to extraction list all coordinates associated with CF convention; regression test ncks #21 2012-10-23 Pedro Vicente * ncks: chunking in nco4_grp_lst_mk() (define output file recursively); regression test ncks #20 * ncks: nco_dmm_trv() and nco_var_lst_crd_ass_add_trv() implement extraction of associated coordinate variables; regression test ncks #19 * ncks: nco_prn_att_trv() implements recursive output of global (group) attributes 2012-10-23 Charlie Zender * Adopt new naming convention in hand-written netCDF4 CDL files: g4g1g1 is the first subgroup of g4g1 which is the first subgroup of g4 which is the fourth subgroup of /. The level of the group can be determined by counting the g's. 2012-10-22 Charlie Zender * Built netCDF library patch for real nc_rename_grp() function: http://dust.ess.uci.edu/tmp/nc_rename_grp.tar.gz Function currently dies in H5Gmove() for unknown reasons Details nc_rename_grp() in nco_netcdf.c * Wrote nc_rename_grp() stubs for distribution now with NCO * Call nco_rename_grp() from ncrename * Implement library stubs for nc_rename_grp()/nco_rename_grp() * Modify in_grp.cdl to allow for new tests 2012-10-21 Charlie Zender * Prepare ncrename for -g group renaming arguments * ncks/ncecat -G accepts extended (depth > 1, multi-component) group names 2012-10-20 Charlie Zender * Implement nco_def_grp_full() to define root group for extracted variables * Remake ncks -G --gag grp_out as root group for ouput à la ncecat * Deprecate ncks -G into ncks --get_grp_info 2012-10-19 Charlie Zender * Add Debian hardening tokens to bld/Makefile * Add ncecat -G regression test * ncecat -G appears to work on netCDF3 and netCDF4 files * Add in_grp.cdl -> in_grp.nc rules to configure and bld/Makefile 2012-10-18 Charlie Zender * ncecat -G makes it through first file but nco4_var_lst_mk() needs re-initialization * Make nco4_inq_trv() return values only if pointers non-NULL 2012-10-16 Charlie Zender * Merged ncks group code into ncecat GROUP_AGGREGATE code 2012-10-15 Charlie Zender * Bifurcate ncecat logic into GROUP_AGGREGATE and RECORD_AGGREGATE * Initiate ncecat -G option for group aggregation * Stop printing variable and dimension IDs, since these cluttered the printed output and were only used for development purposes long ago. 2012-10-09 Charlie Zender * Deprecate ncra2.c * Fix TODO nco1075 where ncpdq was broken for re-arrangements like ncpdq -O -C -v PS,time_lon -a lat,lon,time ~/nco/data/in.nc ~/foo.nc Eliminate pre-emptive check in nco_var_dmn_rdr_mtd() for condition which was not illegal yet led to exit() anyway. All that was necessary was to eliminate the exit() call. False-postive errors were produced for variables that were record in input, fixed in output, and themselves lacked the record dimension, i.e., they became fixed (were neutered?) because record dimension had to be fixed to satisfy re-ordering of other variables. 2012-10-07 Charlie Zender * Die when user attempts --mk_rec_dmn with non-existent dimension * Fix mistaken handling of return values from nc_inq_unlimdim() which caused ncks --fix_rec_dmn to fail. Bug introduced 20111130 but caught only now because fix_rec_dmn was never regression-tested. 2012-10-06 Charlie Zender * Use nco_fmt_sng_printf_subst() to replace user-specified string when missing values encountered. rx needs work. * Add --no_blank switch to fix borken regression tests * ncks: print underscore ("_") instead of missing value 2012-09-28 Pedro Vicente * ncks: do not create empty groups 2012-09-22 Pedro Vicente * ncks: print variable's data for recursively nested netCDF4 files 2012-09-19 Pedro Vicente * ncks: -G option prints extra dimension information with -D 4 2012-09-11 Charlie Zender * Remove unused nbr_dmn_fl from nco_cnk_sz_set() * Tweak i18n machinery 2012-09-10 Charlie Zender * Add median filter ncmdn * Refine DRN/MRO documentation 2012-09-09 Charlie Zender * Improve diagnostics in nco_dfl_case_nc_type_err() error message 2012-09-07 Charlie Zender * Add filters ncmax, ncavg, ncrng 2012-09-05 Pedro Vicente * ncks: implement -c (extract coordinate variables) for group hierarchies 2012-09-04 Charlie Zender * nco_att_cpy() now attempts to copy array-valued missing values Attempt will likely fail, but some old files have these arrays, and older versions of netCDF allow it to succeed. Since this is a metadata convention, and NCO is convention-agnostic, NCO will attempt it and allow the netCDF layer, not NCO, to cause the failure. 2012-09-03 Charlie Zender * Restore trailing NUL to append mode, yet overwrite previous trailing NUL 2012-09-02 Charlie Zender * Add trailing NUL character to ncatted in create/modify/overwrite modes * Add --hdr_pad to man pages 2012-09-01 Charlie Zender * Add --hdr_pad to all remaining operators 2012-08-30 Pedro Vicente * ncks: implement -x (convert extraction to exclusion list) for group hierarchies 2012-08-27 Henry Butowsky * Fix insidious bug with ram_delete() now working!! 2012-08-24 Pedro Vicente * ncks stdout handling of full hierarchy netCDF4 traversal; -g and -v control specific groups and variables 2012-08-23 Charlie Zender * Remove -r option from wget. Behavior of -r may have changed. Thought it meant clobber existing file. It now means recursive. * Restrict wget to --tries=1 to fix "recursive" wgetting when DAP fails to NOAA NOMADS 2012-08-21 Henry Butowsky * Add semi-intelligent handling of missing values in bilinear interpolation functions bilinear_interp() bilinear_interp_wrap() 2012-08-20 Charlie Zender * Windows MSVC builds ncwa without parser/lexer and -B option support 2012-08-17 Charlie Zender * Distinguish between regular expressions for variable wildcarding, and filename expansion by shell globbing 2012-08-16 Charlie Zender * Print filenames in errors when open() and create() calls fail 2012-08-15 Henry Butowsky * Modify ncoGrammer to support negative srt/end index convention 2012-08-12 Charlie Zender * Replace logo request on homepage with software stack image logo_nco_stk.png 2012-08-10 Charlie Zender * Prune headers for strings.h and ctype.h 2012-08-07 Pedro Vicente * ncks -G prints number of group's subgroups, dimensions, attributes, variables 2012-08-03 Charlie Zender * Ensure netCDF3-only versions see prototypes for NCO netCDF4 functions, e.g., nco_inq_grp* * NCO 4.2.1 release procedure: Changes since nco-4_2_0: no_tmp_fl, NC_DISKLESS, -'ve -d, DRN/MRO cd ~/nco;cvs tag -d nco-4_2_1;cvs tag -d nco-4_2_1-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.1 release" cvs tag -c nco-4_2_1;cvs tag -c nco-4_2_1-1 * Patch 4.2.1 tarball to work with netCDF3-only installs by replacing nc_inq*() with nco_inq*() 2012-08-02 Charlie Zender * Swap ncra2.c with ncra.c so default ncra/ncrcat now has DRN/MRO * Fix ncra2.c bug #11: use flg_ntl_rth to correctly initialize nco_opr_drv 2012-08-01 Pedro Vicente * Add a ncks -z option to iterate input netCDF file tree 2012-07-31 Charlie Zender * Document DRN/MRO in nco.texi, man pages, and usage 2012-07-31 Pedro Vicente * Re-base record bounds variables (e.g., time_bnds) in ncrcat/ncra 2012-07-31 Charlie Zender * Warn in ncrcat/ncra when re-basing possibly necessary but UDUnits not installed 2012-07-30 Charlie Zender * Add level_2_group_1 to in_grp.cdl 2012-07-27 Charlie Zender * Add --mro option to ncra * Set rcd_stt after DAP success to correctly mimic stat() returns * Improve DRN/MRO warning/error messages 2012-07-26 Charlie Zender * ZKB in DRN/MRO of ncra2.c and it is fully tested and passes all tests * Fix ncra2.c bug #10: correct idx_end_max_abs by rec_in_cml when lmt_typ_crd * Tighten-up DRN/MRO option error/warning/info-handling * Die if Fortran (1-based) index equals zero * Fix ncra2.c bug #9: end index in last file was corrupted by sloppy user arguments * Useful error message when --open_ram attempted on netCDF4 input * Add netCDF4 atomic types to in_4.cdl 2012-07-24 Charlie Zender * Fix ncra2.c bug #8: maintain rec_rmn_prv_drn across files * Fix ncra2.c bug #7: pass initialization indicator not rec_usd_cml to nco_opr_drv() * Fix ncra2.c bug #6: reset LAST_RECORD_OF_CURRENT_GROUP appropriately * Fix ncra2.c bug #5: write MRO to idx_rec_out not always to index 0L * Fix ncra2.c bug #4: limit srd increments to when current stride is not last stride * Re-write diagnostic rec_nbr_rqs arithmetic to account for DRN groups 2012-07-23 Pedro Vicente * Configure support for UDUnits2 for MacOSX using MacPorts package 2012-07-23 Charlie Zender * ncra2.c: Do not bother to open trailing superfluous files * Implement new master while loop in ncra2.c * Add #inline max_int(), min_int() functions * Limit parsing, evaluation now rewritten, bug-free, and ready for DRN extensions * Correctly account for rec_skp_vld_prv in determining new start index 2012-07-22 Charlie Zender * Update limit code. Introduce off-by-one error on stride. Will fix tomorrow. 2012-07-21 Charlie Zender * De-conflate rec_skp_ntl_spf from rec_in_cml 2012-07-20 Charlie Zender * Add regression test for and fix concatenation of record coordinate-bounded variable across non-monotonic files * Fix segfault parsing coordinate value hyperslabs where max specified and min omitted (TODO nco1062) * Initialize sng_cnv_rcd with NULL_CEWI instead of CHAR_CEWI 2012-07-19 Charlie Zender * #include for strcasecmp() prototype * Add Multi-record Output (MRO) flag handling * Differentiate indices necessary to implement multi-record outputs * Rename idx_rec_out as rec_usd_cml, and idx_rec as idx_rec_crr_in, and add new idx_rec_out that means what it says. * Remove superfluous OpenMP headers from some library files * Functionalize ncea/ncra normalization in nco_opr_nrm() * Restructure initialize/compute/normalize/write logic of ncra2 2012-07-19 Pedro Vicente * Configure support for UDUnits2 in recent RPM systems (Fedora 17) 2012-07-18 Charlie Zender * Legalize drn in nco_lmt_prs(), nco_lmt_evl(), nco_msa_lmt_all_int() * Add drn to lmt structures * Rework error reporting in nco_aed_prs(), nco_lmt_prs(), nco_lmt_evl() * Branch ncra.c into ncra2.c to develop hyperslab duration (drn) option * Add filters ncdmnsz and ncrecsz 2012-07-18 Pedro Vicente * Add a new Windows installer; avoids the need for the winzip utility 2012-07-16 Pedro Vicente * Detect presence of netCDF library in configure; exit if not present 2012-07-15 Charlie Zender * ncks: Print "Coordinate" or "Record Coordinate" instead of "(CRD)(REC)" * Add srandom() seed to UNIX to match MSVC implementation of rnd_nbr() * Document diskless/RAM and --no_tmp_fl options, and -'ve -d args 2012-07-13 Charlie Zender * ncks: only add NCO version attribute when HISTORY_ATT_CAT == True * Add data/hdr_pad.sh to check metadata header size. Add --hdr_pad to man pages. 2012-07-13 Pedro Vicente * Qt/MSVC add projects for ncrcat and ncea 2012-07-11 Pedro Vicente * ncpdq unpack coordinate variables (nco1030) 2012-07-11 Charlie Zender * Work on allowing inherited att_typ when aed_mode = modify * Add --hdr_pad, --bfr_sz, --no_tmp_fl, --ram_all to man pages * Remove 'convert' and nco.png from tags 2012-07-10 Pedro Vicente * Qt/MSVC changes for strcasestr(); enable NEED_STRCASECMP in Qt project 2012-07-09 Charlie Zender * Negative integer as min or max element of hyperslab specification indicates offset from end Fulfills 2008 feature request of Nick Bower 2012-07-09 Pedro Vicente * Set configure option --enable-netcdf4 to yes by default 2012-07-08 Charlie Zender * Update man pages with related commands * Enable --fl_fmt switch synonym to --file_format on all applicable operators * Apply bugfix from Roux so ncra always averages coordinate variables 2012-07-06 Charlie Zender * Use strcasestr() instead of strstr() for fl_fmt conversions (i.e., netCDF4 = netcdf4) * Die when netCDF4 output explicitly requested from netCDF3-only NCO * Fix [-? ...] command line option help in nco_ctl.c 2012-07-05 Pedro Vicente * Build doc/Makefile (and thus documentation) if 'makeinfo' program is installed 2012-07-05 Charlie Zender * Update man pages 2012-07-03 Charlie Zender * Document --ram and --no_tmp_fl switches * Un-break strtoll() compatibility function for AIX xlC * Make MSVC file opening Sleep() for same duration as UNIX sleep() * Write MSVC lround(),llround(),llround(),llroundf() definitions to obey standard prototypes Move their definitions/declarations to nco_rth_flt.[ch] 2012-07-02 Pedro Vicente * Print $prefix (NCO installation path) in configure output 2012-07-02 Henry Butowsky * Add exists(var_nm/att_nm) function to return 1 if "var" or "att" exist in Input or Output 2012-07-01 Pedro Vicente * Test for presence of antlr in configure, and if not found, do not build ncap2 2012-06-30 Charlie Zender * Use nco_fl_open() instead of nco_open() in ncap2 2012-06-28 Charlie Zender * Harmonize _FillValue with variable type in in.cdl (backwards compatibility with netCDF 4.1.1) * Remove NaN values from in.cdl for backwards compatibility (netCDF 4.1.1 does not support) * Fix ncks netCDF4 backwards compatibility problem by using #ifdef ENABLE_NETCDF4 * Tidy Invoke.cc and make ncap2 debug printing systematically quieter * --no_tmp_fl appears to work * Do not check for existence of temporary file when bypassing temporary file 2012-06-28 Pedro Vicente * Add /qt/ncwa.pro Unix project (uses flex/bison); NCO Unix Qt build now includes all operators 2012-06-27 Charlie Zender * Tidy nco_fl_utl.c for MSVC compilation * Add stubs for netCDF4 group routines. Fixes all known problems compiling NCO without netCDF4. Realized compilation without netCDF4 may have been broken since ~201108, i.e., NCO 4.0.9! * Add is_miss() to return number of missing values in expr/var 2012-06-26 Pedro Vicente * Remove NO_TMP_FL from Qt/MSVC projects, to match WRT_TMP_FL variable (ensure/cancel temporary files) * Add /qt/nco.pri file with common compiler and dependency libraries for Qt/MSVC build * Use -L -l syntax for library dependencies in Qt Unix projects 2012-06-26 Charlie Zender * RAM_OPEN and RAM_CREATE now appear to work * Add WRT_TMP_FL and wrt_tmp_fl/no_tmp_fl switches to ensure/cancel temporary files * Add NC_ECANTREAD, NC_EDAPSVC, and NC_EBADGRPID backward-compatibility error codes to nco.h 2012-06-25 Charlie Zender * Add Qt directories to 'make tags' sources * Handle NaNs better in in.cdl * Work on the most- and longest-requested NCO feature: avoiding temporary files. This feature, no_tmp_fl, responds to TODO nco326, nco567, nco781, and nco1014. * Do not mv/cp in nco_fl_mv()/nco_fl_cp() when files are identical * Change nco_fl_out_open() logic to define bfr_sz_hnt_lcl before use on MSVC 2012-06-24 Charlie Zender * Propagate RAM_OPEN to nc_open() for all input files * Propagate RAM_CREATE to nc_create() for all new output files 2012-06-22 Charlie Zender * Pass RAM_CREATE, RAM_OPEN flags to all operators via ram_all, create_ram, open_ram and diskless_all switches * Implement NC_DISKLESS in nco_open() in ncks.c via --ram_all switch 2012-06-21 Charlie Zender * Successfully built and tested with netCDF 4.2.1-rc1 2012-06-14 Charlie Zender * Replace sourceforge.net with sf.net * Clean-up contributors on homepage 2012-06-12 Charlie Zender * NCO 4.2.0 release procedure: Changes since nco-4_1_0: ncra -y ttl, %i fmt, ncwa NaN, nc__open, MVS cd ~/nco;cvs tag -d nco-4_2_0;cvs tag -d nco-4_2_0-1 cd ~/nco;cvs commit -m "Preparing nco-4.2.0 release" cvs tag -c nco-4_2_0;cvs tag -c nco-4_2_0-1 2012-06-11 Charlie Zender * Within last week Pedro committed Qt/MVS files and changes * ncap2: Added RAM variables: double: nan, inf; float: nanf, inff Problem may be with macro call double nan(const char *tagp) 2012-05-22 Charlie Zender * ncap2 regression tests 10 and 11 fail only on givre, roulee, pass on all other computers, indicating...OpenMP issues? 2012-05-22 Charlie Zender * All operators except ncap2 now pass all regression tests * Systematic overhaul of var list divide logic so that "coordinates" and "bounds" attributes are treated consistently. * Fix (do not process) variables listed in "bounds" attributes of size- and rank-preserving operators. Previsouly this exception was made for variables listed in "coordinates" attributes but this was insufficient. Variables like time_bnds were slipping through and causing problems. Now "coordinates" and "bounds" variables are treated equivalently in list-division. This fixes TODO nco1049. 2012-05-21 Charlie Zender * Invoke nco_var_tll_zro_mss_val() again as post-processing step for ttl functions. Not terribly elegant solution to TODO nco1052. * Eliminate two false negative in regression tests cause by, respectively, new rounding behavior and new integer print format. * Realized this fix introduced a new regression because now pure missing value variables sum to zero rather than missing value. Need to ensure at end that when tally is zero, value is missing. * ncra -y ttl now works when first element is missing value nco_var_copy_tll() now sets accumulator to zero in this case Fixes TODO nco1051 and a regression. * ncra does not recognize first value of hyperslab as missing value This is TODO nco1051. * Change answer of ncra regression test #02 from 5 to 6 to reflect integer rounding behavior implemented on 20111020 for NCO 4.0.9. Fractions in [0.5) are rounded upward on conversion to integers. Fixes TODO nco1050. * Add newer regression test failures to TODO list 2012-05-20 Charlie Zender * Quiet INFO and side effects from nco__open() and nco__create() * Prevent overwriting user-specified bfr_sz_hnt in nco_fl_open() and nco_fl_out_open(). These include all uses of nco__open() and nco__create(). * Open and then close TODO nco1047 generated by not re-setting a return code * Clean-up TODO lists * Annotate Contributors section of manual * Place ut_free_system() after all other ut_*() cv_*() calls This fixes double-free() error TODO nco1022 and nco1044 reported independently by Andrew Wittenburg and Peter Campbell. 2012-05-19 Charlie Zender * Add ncattget example to documentation 2012-05-18 Charlie Zender * Henry committed ncap2 code that fixes TODO nco7310: ncap2 append mode breaks when dimension already exists ncap2 -O -v -s 'time2=time' ~/nco/data/in.nc ~/foo.nc ncap2 -A -v -s 'foo=time' ~/nco/data/in.nc ~/foo.nc 2012-05-16 Charlie Zender * ncecat no longer glues a record dimension to any auxiliary coordinate variables (latixy, longxy, ...) or bounds (lat_bnds, lon_bnds, ...). These are variables specified in the "coordinates" or "bounds" attribute, respectively. Note that regular (1D) coordinate variables (lat, lon, time) may also be listed as auxiliary coordinate variables. But ncecat never added a record dimension to "normal" 1D coordinates. Thanks to Patrick Brockmann for this suggestion. 2012-05-14 Charlie Zender * Add scrutable hint for ncap2 -A append errors, and note in docs 2012-04-15 Charlie Zender * Pass NC_SIZEHINT_DEFAULT as initialsz to nco__create() * Replace all nco_create() calls with nco__create() 2012-04-14 Charlie Zender * Replace all nco_open() calls with nco_fl_open() * Document --bfr_sz_hnt * Functionalize nc__open() clause as nco_fl_open() 2012-04-04 Charlie Zender * Deprecate nco_open() in ncks in favor of nco__open() since latter is equivalent to former with default arguments. 2012-04-03 Charlie Zender * Add --bfr_sz_hnt option and nco__open() to ncks 2012-03-30 Charlie Zender * ncks now prints variables of type NC_INT with %i instead of %li formatting. This fixes TODO nco1040. * Fix fundamental mistake in use of memset() in nco_set_long() Buggy method tried to fill tally array with ones quickly Revert to slower but obviously correct array deferencing to fill tally Hard to believe this bug did not cause more errors This fixes TODO nco1039. Thanks to Ken5746 for reporting this. * Modify and test NC_FLOAT portion of nco_var_avg() for NaN-compatibility Verify that ncwa will work with missing value = NaN with this algorithm * Clean-up nco_var_avg.c to prepare for NaN-handling 2012-03-29 Charlie Zender * NCO 4.1.0 release procedure: Changes since nco-4_0_9: sorts/maps, MD5, chmod, NaNs, MM3 cd ~/nco;cvs tag -d nco-4_1_0;cvs tag -d nco-4_1_0-1 cd ~/nco;cvs commit -m "Preparing nco-4.1.0 release" cvs tag -c nco-4_1_0;cvs tag -c nco-4_1_0-1 2012-03-23 Charlie Zender * Add nclist shell alias/function examples to manual 2012-03-21 Charlie Zender * Clean-up nco_msa.c * Place MM3 stubs in ncecat * nco_use_mm3_patchset() returns True for MM3->MM4 copies (i.e., case 3) * Rename LBF-patchset to MM3-patchset (Multi-record Multi-variable netCDF3 files) 2012-03-13 Charlie Zender * Verified MM3-workaround appears to work Subsetting is now close to raw /bin/cp speed on NCAR GLADE filesystem /glade/home/zender/bin/LINUXAMD64/ncks -O -D 3 -x -v TH ~/gary.nc ~/out3_mrg_4.1.0.nc /glade/home/zender/bin/AIX/ncks -O -D 3 -x -v TH ~/gary.nc ~/out3_blf_4.1.0.nc 2012-03-12 Charlie Zender * Implement nco_cpy_rec_var_val() to finish ncks MM3-workaround 2012-03-11 Charlie Zender * For unknown reasons, regression tests started passing again (!) * Implement nco_var_lst_fix_rec_dvd() as part of MM3 workaround 2012-03-09 Charlie Zender * Add stubs to ncks for faster copies on Large Blocksize Filesystems (LBFs) 2012-03-08 Charlie Zender * Allow ncatted to change missing value's that are NaNs Arithmetic operators will still treat NaNs incorrectly, but this allows users to get rid of all NaNs first * Add some NaNs to in.nc for testing 2012-03-07 Charlie Zender * Try hooks to determine filesystem blocksize in prep for Rew workaround 2012-03-06 Charlie Zender * Merge aux and lmt_all changes from ncpdq.c, ncra.c to mpncpdq.c mpncra.c 2012-03-01 Charlie Zender * Clean-up ncap2.cc * Clean-up CPP token scope * Sub-routine-ize nco_fl_overwrite_prm() to cleanup ncatted.c, ncrename.c * Port new file copy/chmod code from ncrename to ncatted * Replace multiple instances of hard-coded limit with CPP token NCO_MAX_NBR_USR_INPUT_RETRY * Allocate tally array for degenerate averages in nco_var_avg() This fixes ncap2 problem. Not sure why ncwa never failed. * Add degenerate variables to in.nc for testing nco_var_avg() * nco_var_avg() crashes on degenerate arrays sent by ncap2 not ncwa ncap2 -O -v -s 'dgn_max=dgn.max()' ~/nco/data/in.nc ~/foo.nc # Fails ncwa -O -v dgn_var ~/nco/data/in.nc ~/foo.nc # Succeeds 2012-02-29 Charlie Zender * Use chmod() C-library call instead of chmod shell-command * Fix stat() and chmod() logic in ncrename * Increase ncrename diagnostics consistency and verbosity 2012-02-28 Charlie Zender * Implement chmod so ncrename succeeds when output file is specified and input file is read-only 2012-02-23 Charlie Zender * Update documentation to include/use new sort/map routines 2012-02-21 Henry Butowsky * Modified/added following sort functions: sort(), asort() -sort ascending with/without map dsort() sort descending with/without map remap() apply sort map to variable unmap() return variable that produced current variable using sort map invert_map() invert the mapping 2012-02-20 Charlie Zender * Implement MD5_DIGEST in nco_msa_prn_var_val() so MD5 now active in all forms of ncks. * Clean-up nco_md5.[ch], mark TODO nco1027 and nco485 as done * MD5 optionally enabled (with --md5) for input on ncks, ncrcat, ncecat When so enabled, MD5 comparisons to output are automatic with ncrcat, ncecat 2012-02-19 Charlie Zender * MD5 is now done for input side. Need to add read loop to check output. * Finish implementatation for MSA writes and verify hyperslabs are correctly digested by showing that the digest of the hyperslab from "abc" to "a" yields the same as the digest of "a" directly. * Verify NCO MD5 implementation works for LPD's test cases * Implement MD5 algorithm on all ncrcat record writes, and on ncks non-hyperslab writes * Add MD5 test variables to in.nc * Incorporate MD5 digest code by L. Peter Deutsch (LPD) Code is under separate BSD-like license. Compiles though not used yet. * Add nco_md5.[ch] for MD5 digests 2012-02-14 Charlie Zender * Tested 4.0.9 on bluefire to find, of course, massive breakage * Update AIX options to netCDF 4.1.3 on bluefire 2012-02-13 Charlie Zender * NCO 4.0.9 release procedure: Changes since nco-4_0_8: array(), revert NO_FILL, rounding cd ~/nco;cvs tag -d nco-4_0_9;cvs tag -d nco-4_0_9-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.9 release" cvs tag -c nco-4_0_9;cvs tag -c nco-4_0_9-1 * Put #ifdef HAVE_CONFIG_H clauses in nco_mmr.h,nco_var_lst.h,nco_lst_utl.h * Linux GCC 4.6 regex.h also now, like Mac OS X, depends on sys/types.h * Clean-up set-but-unused variables for GCC 4.6 * Document improved ncap2 array() function 2012-02-08 Charlie Zender * Document ncap2 array() function * Clean-up prs_cls.cc 2012-02-06 Charlie Zender * Build with netCDF 4.2 snapshots. No more regressions than with 4.1.3 so 4.2 is new default. 2011-12-31 Charlie Zender * Update NCO homepage to announce ACCESS and deprecate SDO 2011-12-24 Charlie Zender * Change copyright year to 2012 2011-12-23 Charlie Zender * Warn when number of attributes exceeds NC_MAX_ATTRS * Learned NASA will fund ACCESS proposal! 2011-12-10 Charlie Zender * Print helpful hint with NC_EVARSIZE errors 2011-12-07 Charlie Zender * Tidy nco_cln_utl.c * Fix TODO nco1025: Warn when catting files with different scale factors * Tidy ncra.c 2011-12-06 Charlie Zender * Document hyperslabbing irregular regions based on variable values 2011-12-01 Charlie Zender * Fixed TODO nco1029: warn on ncks -A when dim(old_record) != dim(new_record) 2011-11-29 Charlie Zender * Quiet set-but-not-used warnings appearing since GCC 4.6+ 2011-11-22 Charlie Zender * Update to Ubuntu 11.10 build chain and GCC 4.6 * Re-base libtool using autoreconf -f -i This fixes some configure compile errors reported by Henry 2011-11-14 Charlie Zender * Realized that ncwa was working on asymmetric weighting Added new test cases, also working. Unable to replicate Sentman bug. 2011-11-12 Charlie Zender * Add test cases to NCO_rgr.pl to detect TODO nco1026 * Verify ncwa weighted average bug reported by Lori Sentman TODO nco1026 2011-10-25 Charlie Zender * Make another backwards compatibility change to in_nomismatch.cdl 2011-10-20 Charlie Zender * Implement l[l]round[f]() rounding patch suggested by Neil Davis Convert floating points to integers with lround(), lroundf(), llround(), and llroundf() Fixes unintended bias in packing with unrounded numbers Requires introducing dependency in nco_cnf_typ.h and nco_rth_utl.h Causes unintended regressions in ncra, ncrcat 2011-10-09 Charlie Zender * Tidy NCO_rgr.pl 2011-10-05 Henry Butowsky * Fixed long standing problem with attribute propagation. scale_factor and add_offset were being propgated to the LHS. This caused problems when packed vars were on the RHS. These atts are now never propagated to the RHS. 2011-09-09 Charlie Zender * Change "RAM size" to "size (in RAM)" 2011-09-07 Charlie Zender * Burning Man! Rites of Passage! Wow. 2011-08-23 Charlie Zender * Transitional nco4_inq() in ncks.c backwards compatible with nco_inq() 2011-08-22 Charlie Zender * Insert crucial "else" in patch! * Verify patch appears to fix ncea -y ttl bug * Write nco_copy_var_tll() and nco_set_long() as better squasher for ncea bug * Write nco_var_tll_zro_mss_val() to squash ncea bug * Add regression test for ncea -y ttl treatment of missing values * Verify ncea -y ttl treats missing values incorrectly. ttl seems to be the only operation with this problem. 2011-08-05 Charlie Zender * Add in_nomismatch.cdl to work around strict ncgen errors 2011-08-02 Charlie Zender * Prototype nco4_inq() function to replace nco_inq() * Add grp_id to nm_id_sct * Fix NUL-termination problem with var_nm_fll in loop * Fix offset of group variables into global array * Fix function name in nc_inq_grpname_len() 2011-08-01 Charlie Zender * Fix incorrect pointer in nco_grp_stk_pop() * Fix ininite recursion in stack memory cleanup * Fix off-by-one error in nco_inq_grps_full() * Fix incorrect reference to grp_id instead of grp_id_crr * Fix off-by-one error in nco_grp_stk_pop() * Add in_grp.cdl to test group functionality 2011-07-31 Charlie Zender * Finish group iterators and nco_var4_lst_mk() compiles * Finish dynamic array implementation of group stack 2011-07-28 Charlie Zender * Embed include within #ifdef HAVE_GETRUSAGE for older GNU compilers, e.g., gcc 3.4.x. 2011-07-25 Charlie Zender * Finished implementing NCO wrappers for group API * Group patches read/write (but do not populate) selected groups * Group stubs compile, build, and cause no regressions 2011-07-24 Charlie Zender * Integrate nco_grp_utl.[ch] into build system * Revert to using NC_NOFILL on all writes, thus presuming netCDF 4.1.3 * Add nco_grp_utl.[ch] and get to compile 2011-07-22 Charlie Zender * Add secret hooks to ncks -g flag for group sub-setting 2011-07-15 Charlie Zender * Remove last known USE_FORTRAN_ARITHMETIC token 2011-07-14 Charlie Zender * More clean-up of ncap2 documentation 2011-06-27 Charlie Zender * Clean-up UDUnits in preparation for solving TODO nco1022 * Verify dpkg-buildpackage produces netCDF4-, UDUnits2-, DAP-enable NCO against current daily snapshot of netCDF 4.1.3, HDF 1.8.7. * Verify pbuilder produces netCDF4-, UDUnits2-, DAP-enable NCO against current debian Sid * Incorporate more useful hints from Denis Heimbigner when DAP fails 2011-06-26 Charlie Zender * Remove UDUNITS section of configure.in because it was overly complex to maintain with UDUNITS2 which supercedes it * Remove DAP-OPENDAP section of configure.in because it was overly complex to maintain with DAP-NETCDF which supercedes it * Re-introduce ENABLE_NETCDF4 * Remove MPI section of configure.in because it was nasty and unsupported * Remove non-working CPPFLAGS += -DHAVE_NETCDF4_H hack from debian/rules * Use AC_CHECK_DECL() instead of AC_EGREP_HEADER() to find NC_CHUNKED in test to define HAVE_NETCDF4_H. Suggested by anonymous poster on Bug tracker, may improve netCDF4 configure problems considerably. * Add lat_bnd, time_bnds to in.cdl to improve CF "bounds" handling * Do not ship .la files in Debian (Closes: #622527) by Luk Claes 2011-06-10 Charlie Zender * #define NCO_XLC_LIKELY when xlC compiler probably used 2011-06-08 Charlie Zender * #define NCO_XLC_LIKELY when xlc compiler probably used 2011-06-02 Charlie Zender * Add include ncra -Y, --pseudonym to ncks --secret output 2011-05-20 Charlie Zender * configure.in modifications as per ocehugo suggestions 2011-05-10 Charlie Zender * Webpage updates * NB: Debian pbuilder has been broken on Ubuntu Natty Narwhal for weeks This prevents serious work on a 4.0.9 release, improving configure, etc. 2011-04-28 Charlie Zender * NCO 4.0.8 release procedure: Changes since nco-4_0_7: HPSS, NOFILL, CF bounds & noleap, ncatted, NC_BYTE cd ~/nco;cvs tag -d nco-4_0_8;cvs tag -d nco-4_0_8-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.8 release" cvs tag -c nco-4_0_8;cvs tag -c nco-4_0_8-1 2011-04-27 Charlie Zender * Report netCDF error strings on DAP-failures in fl_mk_lcl() 2011-04-26 Charlie Zender * Simplifying configure.in to work with netCDF4 on neige Assume that nc-config exists and is findable * Lots of small changes related to NOFILL bug * Disable NC_NOFILL mode until netCDF 4.1.3 released 2011-04-22 Charlie Zender * Test disabling NC_NOFILL mode 2011-04-20 Charlie Zender * Built NCO on NCAR Mirage and GLADE filesystem. Seems OK. * Fix NC_BYTE and NC_UBYTE printing for attributes 2011-04-19 Charlie Zender * Tweak NC_BYTE printing routines (again!) * Migrate to netCDF 4.1.2. Test suite passes. * Append -lexpat to -ludunits2 to satisfy netCDF 4.1.2 libudunits2.so dependencies in Debian/Ubuntu systems * Remove msrcp, msread, nrnet functionality * Implement and document 'hsi get' command * Prepare nco_fl_mk_lcl() for HPSS access using 'hsi get' command 2011-04-11 Charlie Zender * Kludgy fixes to bld/Makefile for AIX which lacks nc-config 2011-04-03 Charlie Zender * Alter bld/Makefile link line to use nc-config --libs 2011-03-21 Charlie Zender * Change "no_leap" to "noleap" for CF-compliance 2011-03-18 Charlie Zender * Fix netCDF4/_FillValue/overwrite-create code path in nco_aed_prc() Solves TODO nco1011 * Fix nco_aed_prc() so that it does not attempt nco_att_rename() on non-existent netCDF4 missing value attributes. Helps, though does not fix, TODO nco1011 reported by Kyle Wilcox. Bug still triggered elsewhere in the code. * Clarify code path in nco_aed_prc() 2011-03-11 Charlie Zender * Include instructions for beta-releases of executables for AIX 2011-03-05 Charlie Zender * Change prerelease.txt to beta.txt and update it for TAGS 2011-03-04 Charlie Zender * NB: "bounds" support re-exposes bug TODO nco111 triggered by ncap.in test script * Document CF "bounds" support, including -c and -C compliance * Implement CF "bounds" support, including -c and -C compliance * Add CF "bounds" support to TODO and add some bounds infrastructure 2011-03-03 Charlie Zender * Complete debian-required change from libcurl3-dev to libcurl4-gnutls-dev * Tag first 4.0.8 beta version 2011-03-01 Charlie Zender * Use %zu instead of %li for printf() format of size_t 2011-02-22 Charlie Zender * NCO 4.0.7 release procedure: Changes since nco-4_0_6: fix bug_hyp_dgn cd ~/nco;cvs tag -d nco-4_0_7;cvs tag -d nco-4_0_7-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.7 release" cvs tag -c nco-4_0_7;cvs tag -c nco-4_0_7-1 * Add libcurl4-gnutls-dev to debian/control * Still need to update MPI executables mpncpdq, mpncra, mpncwa to the same feature set as the normal, non-MPI executables so that all MPI executables are feature-equivalent to serial codes. * Mark nco1007 as fixed and opening nco1010 specifically for degenerate auxiliary hyperslabs * Yet more nco_aux.c clean-up * Exit with error when nco_aux_evl() finds no coordinates in bounding-box This fixes most the rest of TODO nco1007. Only remaining task is to (like regular hyperslabs) return nearest point when lat_min=lat_max and/or lon_min=lon_max. * Clean-up nco_aux.c and most of its functional interfaces 2011-02-21 Charlie Zender * TODO nco1007 now mitigated so that failure occurs only with auxiliary coordinates * Remove two ncks tests from NCO_rgr.pm. Should add them back once script allows error exit to be intended result. * Threaded needle with new fix so wrapped hyperslabs work as before * Added partial fix to TODO nco1007 that now breaks double-wrapped hypserslab test * Replace nco_get_vara() with nc_get_vara_double() in nco_lmt_evl() * Clean-up, add diagnostics to nco_lmt_evl() while working to fix TODO nco1007 2011-02-17 Charlie Zender * Change scp paths from greenplanet to gplogin2 2011-02-12 Charlie Zender * Migrate from old sourceforge (SF) paths, e.g., /home/groups/n/nc/nco/htdocs/index.shtml to new paths, e.g., /home/project-web/nco/htdocs/index.shtml 2011-02-03 Charlie Zender * Change ndrv from 65534 to 65532 as per Griffith Young 2011-01-18 Charlie Zender * Fix NC_MAX_BYTE typo in nco.h which affected nco_pck.c 2011-01-16 Charlie Zender * Tidy ncatted.c, ncrename.c * Add helpful debugging output to nco_aed_prc() 2011-01-14 Charlie Zender * NCO 4.0.6 release procedure: Changes since nco-4_0_5: clang, YYYYMMDD-averaging, xtr ass crd cd ~/nco;cvs tag -d nco-4_0_6;cvs tag -d nco-4_0_6-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.6 release" cvs tag -c nco-4_0_6;cvs tag -c nco-4_0_6-1 * Debian rules: Build with dap-netcdf netcdf4 udunits2 by default * Update NCO ANNOUNCE to clarify outstanding bugs 2011-01-03 Charlie Zender * Define and document, but do not solve, degenerate hyperslabbing bug reported by Jeff Daily. * Be excruciatingly precise about variable list merging * Tidy error messages in nco_dmn_utl.c and nco_var_lst.c prior to fixing false positive WARNING with ncbo operating on a coordinate and the scalar-average of the coordinate. 2010-12-31 Charlie Zender * Fix nco_var_lst_crd_ass_add() to reset rcd inside loop. This fixes TODO nco1006: associated coordinates not found. Symptom was that associated coordinates were not added to extraction list if they were declared after any non-coordinate dimensions. 2010-12-28 Charlie Zender * Tidy help messages 2010-12-21 Charlie Zender * Update copyright to 2011 2010-12-06 Charlie Zender * Change comment line 866 of nco_pck.c to not break PGI pgcc From "If max-min = 0 then variable is constant..." to "If max-min == 0 then variable is constant..." pgcc is garbage. pgCC is too (cannot compile ncap2). 2010-11-30 Charlie Zender * Subtract two from ndrv to leave room in packing for missing_value * Warn when missing value outside pack range 2010-11-29 Charlie Zender * Quiet lengthy missing_value != _FillValue message * Clean-up and fix order of operations * Work to guarantee that _FillValue is within packing range * Quiet lengthy thread messages * Merge ncflint.c (including MSA, AUX) from 4.0.5 into mpncflint.c * Merge ncecat.c (including MSA, AUX) from 4.0.5 into mpncecat.c * Merge MSA aspects of ncbo.c from 4.0.5 into mpncbo.c * Change URLs of NCO forums to, e.g., http://sourceforge.net/projects/nco/forums/forum/9830 2010-11-23 Charlie Zender * Merge ncbo.c from 4.0.5 into mpncbo.c Code compiles and links. Behavior is untested. 2010-10-27 Charlie Zender * Fix clang C++ warnings about missing parentheses in while loops "while result of assignment is true" (not an equality comparison) Many more of these need fixing, need automated method. * Rename nco_is_rnk_prv_rth_opr() to nco_is_sz_rnk_prv_rth_opr() to reflect actual usage as preserving both size and rank. This makes explicit that ncra is not such an operator. 2010-10-26 Charlie Zender * Change nco_cnv_ccm_ccsm_cf_date() to handle date variable in output var list as either NC_INT or NC_DOUBLE. Necessitated because nco_cnv_ccm_ccsm_cf_date() is called when "date" may be stored as double to facilitate averaging. This has been the case for many years, since packing introduced? So TODO nco998 appears to be an _old_ bug. Now seems to work. Test with ncra -O -v nbdate,date,time -p ~/nco/data in.nc ~/foo.nc ncks -H -m -v 'date.*' ~/foo.nc * Change date in in.cdl to better test YYMMDD averaging * Change ncra from rank preserving arithmetic operator to not one This allows ncra to average date and helps fix TODO nco998 * NCO compiles and executes error-and-warning-free with clang * Small syntax changes for clang-compliance 2010-10-19 Charlie Zender * Merge first half of ncbo.c 4.0.5 into mpncbo.c 2010-10-17 Charlie Zender * Fix typos and missing semi-colons in ncap2 docs 2010-10-13 Charlie Zender * Revert comment mangled by rx in nco_netcdf.c * NCO 4.0.5 release procedure: Changes since nco-4_0_4: fix ncks hyp NC4 bug, ncra CF crd bug cd ~/nco;cvs tag -d nco-4_0_5;cvs tag -d nco-4_0_5-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.5 release" cvs tag -c nco-4_0_5;cvs tag -c nco-4_0_5-1 * Make buildpackage and pbuilder scripts use DEB_BUILD_OPTIONS * Revert to pre-20101007 behavior to NOT-translate two-character user-input string "\0" to NUL. 2010-10-12 Charlie Zender * Change bld/Makefile defaults to NETCDF4=Y, UDUNITS2=Y 2010-10-11 Charlie Zender * Alter builds to use Debian-supplied UDUnits2 * Verify Debian builds netCDF4 and DAP-enabled NCO with libnetcdf6 * Change from Debian libnetcdf4 to libnetcdf6 thanks to Maverick Meerkat * Fix (perhaps) HDF5_LIB_DIR handling in configure.in * Daily-build libnetcdf4 fixes problem writing ushort_max=65535us 2010-10-08 Charlie Zender * Improve debugging messages in nco_lmt.c * Fix typos in comments * Improve in.cdl diagnostics for packed variables and _FillValue 2010-10-07 Charlie Zender * Translate two-character user-input string "\0" to NUL. This allows ncatted and ncap2 users to insert NUL into strings and to NUL-initialize strings with, e.g., sng_new[lat,sng_lng]="\0"; 2010-10-06 Charlie Zender * Fix bug where ncra incorrectly treats record variable as a fixed variable if it is specified in the "coordinates" attribute of any variable in a file being processed under CCM/CCSM/CF metadata conventions. This bug caused core dumps. And even weirder behavior like creating imaginary time slices. 2010-10-05 Charlie Zender * Fix ncks chunking bug http://nco.sf.net#bug_ncks_cnk 2010-09-29 U-neige\zender * Add informative message when using DAP 2010-09-24 Charlie Zender * NCO 4.0.4 release procedure: Changes since nco-4_0_3: chunking everywhere, ncrename bugfix, ncks -m cd ~/nco;cvs tag -d nco-4_0_4;cvs tag -d nco-4_0_4-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.4 release" cvs tag -c nco-4_0_4;cvs tag -c nco-4_0_4-1 * Use longer but more bullet-proof and less warning-prone netcdf.h backwards compatibility token definitions in nco_typ.h * Finish handling strtod()/strtol() returns Corner case where sng_cnv_rcd == NUL not handled? 'man strtol' has convoluted description using errno for this * Henry fixed ncap2 dsort() bug * Clean-up calendar types and acronyms so building with CC=g++ works 2010-09-23 Charlie Zender * Document that ncecat does not process coordinate variables * Adding string conversion checking to nco_lmt.c, nco_att_utl.c caused one ephemeral new ncrcat regression? Which has mysteriously disappeared.... * Fix harmless problem that valgrind flagged where ncap2 relied on an uninitialized value of dmn->cid in nco_var_fll(). * Rebuild ncap2...seems to work fine * Sort dmn_sct, var_sct in nco.h, change var_sct.is_fix_var flag from int to short * Cleanup chunking/deflation initialization 2010-09-19 Charlie Zender * Note that ncks 4.0.3 and earlier suffer from a bug Henry caught in nco_cpy_var_dfn_lmt() where the shuffle and deflate arguments to nco_def_var_deflate() were reversed. This would cause propagation of deflate and shuffle attributes from in.nc to out.nc to go awry when shuffle or deflate, but not both, were true. * Continue error handling of string-conversion, now strtod() 2010-09-18 Charlie Zender * Begin codebase-wide error handling of string-conversion to int with nco_sng_cnv_err(), and error handling of string-conversion to float with nco_sng_cnv_err(). Many problems encountered. Using ncflint.c to prototype strtod() handling and ncpdq.c to prototype strtol() handling. 2010-09-17 Charlie Zender * Make ncpdq follow same rules as ncbo, ncra, etc. in whether to pack grid properties. Accomplish this by adding ncpdq (packing, not permuting) to list of operators that return true in call to nco_is_rnk_prs_rth_opr(). 2010-09-16 Charlie Zender * Prevent ncpdq from packing coordinate variables Coordinate variables are 1D, so packing saves little space, and makes resulting files hard to read. If users wish to pack coordinate variables, we should implement new packing policies that explicitly pack coordinate variables. * Add synonym/pseudonym section to nco.texi * Update notes on propagating dfl_lvl and cnk_sz into ncap2 2010-09-15 Charlie Zender * Add DMG file info to homepage 2010-09-14 Charlie Zender * Document chunking better in nco.texi * Clean-up ncflint.c, ncwa.c, ncra.c 2010-09-14 Henry Butowsky * Enabled chunking in ncwa 2010-09-13 Charlie Zender * Fix erroneous error exit in ncrename when no attributes were renamed Code was working and writing correct file then exiting as if error had occurred since the return code was not handled properly. * Implement nco_inq_var_packing() in ncks printing * Change metadata print format to be more Englishy 2010-09-08 Charlie Zender * Maintain input deflation level where identifiable (fixes TODO nco990) * Create test case to diagnose TODO nco990: ncks maintains input deflation level, other operators do not * Implement nco_sng_cnv_err() for strtol()-type calls, fixes TODO nco987 * Use NCO_SNG_CNV_BASE10 instead of naked 10 2010-09-06 Charlie Zender * Add chunking options to user-visible documentation * Add (finally) chunking infrastructure to all operators Exception is ncwa which does not yet use lmt_all_sct (why?) Capability not yet vetted, yet regression tests all pass 2010-09-03 Charlie Zender * Remove SDO from most of homepage since name never stuck 2010-09-02 Charlie Zender * NCO 4.0.3 release procedure: Changes since nco-4_0_2: nco_cnv_ccm_ccsm_cf_date() bug, ncbo bug, configure tweaks cd ~/nco;cvs tag -d nco-4_0_3;cvs tag -d nco-4_0_3-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.3 release" cvs tag -c nco-4_0_3;cvs tag -c nco-4_0_3-1 * Document ncra date bug at http://nco.sf.net#bug_ncra_date 2010-09-01 Charlie Zender * Belatedly removed nco_cal.[ch] (subsumed into nco_cln_utl.[ch]) * Document UDUNITS_PATH and UDUNITS2_XML_PATH in nco.texi 2010-08-31 Charlie Zender * Add protective #ifndef clauses to netCDF4 token definitions in nco_utl.hh #ifndef ; #define in Makefile.old * Change conditions on compatibility token definitions from #ifdef ENABLE_NETCDF4 to #ifndef ; #define in Makefile.old since that more precisely determines when token definitions are needed * Document TODO nco986, clean up ncbo.c patch 2010-08-30 Charlie Zender * Document TODO nco986, an ncbo bug exposed by AIX xlC compilers. No fix yet. * Clean-up nco_cal.c 2010-08-09 Charlie Zender * NCO fails dpkg-buildpackage configure-build with shared netCDF4 in /usr/local This may be expected and OK because buildpackage checks, with dh_shlibdeps, that shared library dependencies are resolvable within the dpkg universe which does not include /usr/local. Thus, this builpackage problem may vanish with netCDF .debs that include libnetCDF4.so. * NCO seems to configure-build fine with shared netCDF4 in /usr/local * Finally built recent netCDF with shared libs in /usr/local to facilitate testing NCO configure mechanism with shared libs. * Relax configure rule that netCDF4 must be built static 2010-08-05 Charlie Zender * Revised M4 definition of NCO_CHECK_FUNCS provided by Eric Blake of RedHat * NB: configure is currently broken due to NCO_CHECK_FUNCS m4 macro * Make ncks --data synonymous with ncks -H 2010-07-29 Charlie Zender * Ensure CPP validity of NCO_CHECK_FUNCS tokens with AS_TR_CPP * Add whitespace to clarify conditional #include config.h, getopt.h and nco_getopt.h * Look for udunits2.xml in /usr/local/share/udunits/ * Correct nco_getopt.[ch] handling by autotools * Using M4 definition of NCO_CHECK_FUNCS provided by Eric Blake of RedHat 2010-07-28 Charlie Zender * Allow DEB_BUILD_OPTIONS to Debian rules for netCDF4/UDUnits2 * Fix compiler error warning initialization (CEWI) problems in nco_cln_utl.c * Do not write to NULL-pointer for date in nco_cnv_ccm_ccsm_cf_date() 2010-07-27 Charlie Zender * Add more complicated build instructions for ./configure to homepage * Configure now works with ncap2, netCDF4, UDUnits2, netCDF-DAP on givre * Always include -lcurl when building with DAP * Place configure GSL switches after netCDF switches * Change configure defaults to enable-dap-netcdf=yes and enable-dap-opendap=no 2010-07-09 Charlie Zender * Add prerelease.txt and point to from homepage * Fix definition of nco_udunits2_xml in configure.in 2010-07-05 Charlie Zender * Add -lresolv to MACOSX links in Makefile.old * Add x86_64 to MACOSX possibilities in pvmgetarch 2010-06-28 Charlie Zender * Make ncatted man page lint-compliant by removing complex example 2010-06-27 Charlie Zender * Add debian/source/format to Debian build procedures * NCO 4.0.2 release procedure: Changes since nco-4_0_1: namespace, ncatted NUL, ncap2 1-d arrays cd ~/nco;cvs tag -d nco-4_0_2;cvs tag -d nco-4_0_2-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.2 release" cvs tag -c nco-4_0_2;cvs tag -c nco-4_0_2-1 2010-06-22 Charlie Zender * Fix ncap2 to correctly cast variables with single dimension of size one Formerly, ncap2 wrote these as scalars in certain situations Thanks to Hugo for pointing this out and to Henry Butowsky for fixing it 2010-06-21 Henry Butowsky * Fixed bug with casting a variable of size one. This NOW works 'defdim("one",1);irmax[$one]=20L;' 2010-05-24 Charlie Zender * Mark Hadfield reports that my Cygwin ncap2 build works fine His machines have working java setup, mine do not Either way, all NCO-caused issues with Cygwin have been resolved 2010-05-20 givre zender * Makefile fixes for netCDF4 on AIX (bluefire) 2010-05-19 givre zender * Fix Makefile.old for libnco_c++.a build on Cygwin 2010-05-03 Charlie Zender * Upgrading to Kubuntu 10.04 Lucid Lynx failed, so spent day to get NCO running on Cygwin 1.7.5-1 under Vista. Everything was supplied by Cygwin: GSL, or compiled fine from source: netCDF4/HDF5 and Antlr (actually antlr-2.7.7 needs #include patch to CharScanner.hpp). So NCO with DAP, UDUnits2, netCDF4, ncap2 built fine! Amazing. Only problem is executing ncap2, which cannot find java. 2010-05-02 Charlie Zender * Generate autoconf/libtool sources with Ubuntu 10.04 Lucid Lynx stack 2010-04-29 Charlie Zender * Clean-up nco_aux.[ch] to work better with WRF files 2010-04-27 Charlie Zender * Merge Francesco Paolo Lovergine's downstream Debian changes 2010-04-27 Henry Butowsky * Added to manual chapter on GSL Random Number generation 2010-04-18 Charlie Zender * Allow deflation and chunking on both netCDF4 filetypes * Warn when attempting to deflate or chunk either netCDF3 filetype 2010-04-09 Charlie Zender * Fix off-by-one error in ncatted appends for type NC_CHAR (TODO nco985) Extra NULs are no longer inserted with each append Thanks to A.T. Wittenburg for this bug report * Clean-up ncatted to address NUL-append problem 2010-04-08 Charlie Zender * Namespace patches seem to work with bld/Makefile and with configure. * Apply patches from Denis Nadeau to prevent namespace clashes between NCO symbols generated by Flex/Bison, and those symbols generated by other programs (MPI, netCDF) that also use Flex/Bison. 2010-04-06 Charlie Zender * Oops! VERSION file released with 4.0.1 may say version is 4.0.0? * NCO 4.0.1 release procedure: Changes since nco-4_0_0: fix_rec_dmn, mk_rec_dmn, .ncrename cd ~/nco;cvs tag -d nco-4_0_1;cvs tag -d nco-4_0_1-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.1 release" cvs tag -c nco-4_0_1;cvs tag -c nco-4_0_1-1 2010-04-05 Charlie Zender * Revert change to libnetcdf-dev (>= 1:4.0.0) in control since Ubuntu does not yet support newer version. 2010-04-04 Charlie Zender * Change Debian to libnetcdf4 with libnetcdf-dev (>= 1:4.0.0) in control 2010-03-29 Charlie Zender * Cleanup and document '--mk_rec_dmn' switch 2010-03-22 Henry Butowsky * Add '--mk_rec_dmn' switch to ncks: Allows user to (re-)define the record dimension. If the redefined record dimension is not the first dimension of a given variable, then ncks fails with an error message. 2010-03-15 Charlie Zender * Remove consti-fication of return values in global functions 2010-03-13 Charlie Zender * Comment-out "\input texinfo" from my-bib-macros.texi to prevent that string from appearing in printed output. 2010-03-11 Charlie Zender * Fix ncrename.c to not die after skipping non-existent targets (variables/dimensions/attributes) preceded by '.'. Longstanding bug! * Supercede NO_REC_DMN with FIX_REC_DMN * Various cleanups of ncoGrammer.g, nco_mss_val.c, ncks.c, nco_var_utl.c 2010-03-11 Henry Butowsky * Add '--no_rec_dmn' switch to ncks: causes record dimension in input to be converted to a regular dimension in output. 2010-03-01 Henry Butowsky * Added to manual chapter on Re-basing Time Coordinate 2010-02-16 Charlie Zender * Cleanup nco_lmt.c 2010-02-16 Henry Butowsky * Add ncrcat tests for modifications below 2010-02-15 Henry Butowsky * Hyperslab limits of type lmt_crd_val/lmt_udu_sng with stride > 1 now work with multifile operators, e.g., ncrcat -v time -d time,3.0,30.0,8 t1.nc t2.nc out.nc 2010-02-09 Charlie Zender * Remove MPI print line from non-MPI code in mpncra.c to fix build bug reported by Mark Van Moer 2010-02-05 Charlie Zender * Cleanup ncbo.c 2010-01-29 Henry Butowsky * Tidy-up value_list action in tree parser. Added value_list_string for NC_STRING * Added ncap_typ_hgh() to libnco 2010-01-26 Charlie Zender * As of 20091030 NCO_TYP_INT defaults to int rather than long Following changes bring nomenclature into alignment with this * Change NC_INT variable names from *_lng to *_ntg * Change ptr_typ union for NC_INT from lp to ip * Change val_typ union for NC_INT from l to i * Remove nco_gmm.[ch] to avoid Burkardt copyright Gamma functions now supplied by GSL. * Replace " != NULL" and " != NULL_CEWI" with "" This is just code cleanup which is always valid When pointer values are evaluated as boolean conditions, it is identical to comparing the pointer to NULL. Hence code now has, e.g., if(cmd_ln) ... instead of if(cmd_ln != NULL) Could/should also replace "foo == NULL" with !foo? 2010-01-19 Charlie Zender * Workaround ncoGrammer.g dependence on NC_MAX_INT which DNE in netcdf.h until ~2009 2010-01-19 Henry Butowsky * Add chapter on "GSL Least-Squares Fitting" to ncap2 manual 2010-01-18 Charlie Zender * Fix out of range index in fmc_gsl_cls.c 2010-01-14 Charlie Zender * Patch configure.in for broken GSL installations like bluefire's, where GSL exists though gsl-config does not * Only attempt duplicating netCDF4 settings when output is netCDF4 Do not rely on no-ops from netCDF3 and netCDF4-classic files 2010-01-08 Charlie Zender * Patch --enable-netcdf-4 implementation 2010-01-05 Charlie Zender * configure: make --enable-netcdf-4 synonym for --enable-netcdf4 * Add ${misc:Depends} to Depends rule in debian/control * NCO 4.0.0 release procedure: Changes since nco-3_9_9: bilinear, fitting, chunking cd ~/nco;cvs tag -d nco-4_0_0;cvs tag -d nco-4_0_0-1 cd ~/nco;cvs commit -m "Preparing nco-4.0.0 release" cvs tag -c nco-4_0_0;cvs tag -c nco-4_0_0-1 * Change HAVE_NEW_CHUNKING_API to NC_HAVE_NEW_CHUNKING_API to leverage information now in netcdf.h about correct API. Required for successful .deb builds with netCDF3. 2009-12-10 Henry Butowsky * Added initialization to NULL of chunk sizes prs_arg.cnk_sz in ncap2.cc. This was causing a bug on CentOS builds. 2009-11-20 Henry Butowsky * Added to manual chapter on bilinear_interp_wrap() 2009-11-16 Henry Butowsky * Tidy ups in main() ncpdq/ncecat/ncflint/ncra/ncbo 2009-11-09 Henry Butowsky * Modify 'dsort(var,&var_mp)' if output file is netcdf4 then the created map is of type NC_UINT64 else it is of type NC_INT * Refactor all gsl_stats code -hnd_fnc_stat? So that the 'size_t n' argument is user input to functions 2009-11-07 Charlie Zender * Verify nco_is_spc_in_crd_att() implementation on NARCCAP file * Add nco_is_spc_in_crd_att() to test whether variable is specified in "coordinates" attribute * Change sprintf() and scanf() formatting for nco_int from long to int * Implement empirical list of N-D coordinate "fixed" variables: lat, lon, lev, longxy, latixy * Change fixed variable exclusion condition from is_ncbo to is_rnk_prs_rth_opr() 2009-10-30 Charlie Zender * #define NCO_INT NCO_TYP_INT instead of NCO_TYP_LONG Longs are 8-bytes on 64-bit systems, and NCO_INTs are always 4 bytes. Stuffing the 4 bytes into 8 bytes of RAM is harmless locally, and ensures the NCO code is robust in other ways. However, it also seems to confuse/break DAP-handling of ints. 2009-10-29 Charlie Zender * Add short option -6, and better document -6, --64, --64bit options 2009-10-21 Henry Butowsky * Ensure ncap2 compiles with NCO_INT==NCO_TYP_INT. Affects fmc_all_cls.cc msk_cls srt_cls fmc_gsl_cls.cc, map_srt_tmp.hh, ncoGrammar.g 2009-10-15 Henry Butowsky * Tidy-up sort methods srt_cls 2009-10-13 Henry Butowsky * Add secret flag tst_udunits option to ncks. Usage: --tst_udunits,'units_in','units_out','calendar type' 2009-09-30 Charlie Zender * Remove attempt to set chunking in ncap2 writes 2009-09-26 Charlie Zender * Add CNK option to Makefile to set HAVE_NEW_CHUNKING_API to handle netCDF 4.0.x vs. netCDF 4.1+ chunking API differences * Fix library flags for parallel HDF/netCDF4 2009-09-24 Henry Butowsky * Add manual sub-section on calendar CF support in UDUnits node 2009-09-21 Charlie Zender * Implement Intel mpicc/mpiCC compilers on greenplanet with lustre 2009-09-11 Henry Butowsky * Committed first cut of nco_cal.{c,h} * These are calendar functions for hyperslabbing coordinate variables with CF attribute "calendar". Currently supported are "360_day","no_leap","365_day". Other values for date evaluation default to "standard", the UDUnits1/2 calendar functionality. NB: regardless of the chosen calendar type all date strings are parsed by UDUnits1/2 2009-08-28 Charlie Zender * Add spiral logo by Andrea Cimatoribus to bakeoff 2009-08-26 Henry Butowsky * Change nco_lmt_udu_cnv() UDUnits1 code branch Parse bare date with utScan() instead of manually 2009-08-25 Charlie Zender * Add numeric cog logo by Rob Hetland to the bakeoff 2009-08-21 Henry Butowsky * Tidy-up of srt_cls---functions for sorting vars 2009-08-21 Henry Butowsky * Fix spline interpolation with gsl-1.12 * Tidy-up gsl_spl_cls() 2009-08-19 Henry Butowsky * Add first cut of GSL least squares fitting to fmc_gsl_cls 2009-08-17 Henry Butowsky * Modify nco_lmt_typ() to recognize plain dates of form "%d-%d-%d" as valid UDUnits strings 2009-08-10 Charlie Zender * Define chunking compatibility tokens in nco_netcdf.c * Verify WIN32 build on neige 2009-08-07 Charlie Zender * Chunking passes all regression tests and makes sense at last * Ensure that record, compressed, and checksummed variables are chunked, stay chunked, and are not subject to unchunking attempts. Passes regression tests. * Only fill in shuffle, deflate, dfl_lvl when pointers are non-NULL in netCDF3 nco_inq_var_deflate() * Add nco_inq_var_fletcher32() 2009-07-26 Charlie Zender * More man page tweaks for ellipses 2009-07-24 Charlie Zender * Fix small memory leak in nco_vrs_att_cat() 2009-07-23 Charlie Zender * Remove NULL-dereferencing, segfault-causing problem in nco_netcdf.c 2009-07-21 Henry Butowsky * Add first cut of bil_cls - functions for bilinear interpolation of gridded 2D data 2009-07-16 Charlie Zender * Replace ellipsis ("\.\.\.") to better ROFF ellipsis ("\ .\|.\|.\ ") Found this hack by examining /usr/share/man/man1/nroff.1.gz * Convert ROFF hyphens ("-") to ROFF minuses ("\-") * Examined Debian build logs and cleaned up minor problems * Correct ROFF hypens to minuses, and format ellipsis in man pages * NCO is once again C++-compliant, compiles/runs/tests fine with g++ * Explicitly set ddra_info.flg_ddra=False in g++-compiled code since C++ does not allow structure-member initialization * Satisfy C++ by explicitly casting (void *) to (lmt_sct *) and to (char *) (rather than relying on implicit conversion) 2009-07-15 Charlie Zender * Thank all packagers in nco.texi * Barry deFreese uploaded 3.9.9 to Debian Sid. Hallelujah! * NCO 3.9.9 release procedure: Changes since nco-3_9_8: chunking, NC_STRING, GSL stats/interp, rebasing cd ~/nco;cvs tag -d nco-3_9_9;cvs tag -d nco-3_9_9-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.9 release" cvs tag -c nco-3_9_9;cvs tag -c nco-3_9_9-1 * Cleaned up and annotated copyright history in copyright file * Added Benjamin Sittler and John Burkhardt to copyright file * Received copyright assignment and removed Henry Butowsky from copyright headers in nco_msa.c, nco_msa.h * Received copyright assignment and removed Karen Schuchardt from copyright headers in nco_aux.c 2009-07-14 Charlie Zender * Henry fixed UDUnits1 code to pass all UDUnits2 regression tests 2009-07-13 Charlie Zender * Cleanup and annotate nc_def_var_chunking() API problems * Fix HAVE_NETCDF4_H test when enable_netcdf4=yes * Change Debian tgz file suffix from erroneous '-1.tar.gz' to '.orig.tar.gz' * Upgrade debhelper compatibility by changing debian/compat from 4 to 5 * Fix configure.in bug in HAVE_NETCDF4_H test 2009-07-12 Charlie Zender * 20090712: For unknown reason autobuild sees netCDF4 netcdf.h header when it should not. Moreover, autobuild thinks "const nco_string *sng" conflicts with "const char **sng" in all nc_put_var?_string() and nc_put_att_string() functions. Even though nco_string = char * = should be synonymous Implement kludge workaround to latter until former is solved * Fix prototype error for NCO_GET_VAR[1ASM]_USHORT, NCO_GET_ATT_USHORT Buffer had erroneously been set to nco_ubyte in these functions * Introduce HAVE_NETCDF4_H to indicated presence of netCDF4 headers but not necessarily netCDF4 libraries. Use HAVE_NETCDF4_H instead of ENABLE_NETCDF4 in some checks ENABLE_NETCDF4 now refers to presence of netCDF4-enabled library Thus ENABLE_NETCDF4 implies HAVE_NETCDF4_H The converse is not true * Clean-up, de-space NCO_rgr.pm 2009-07-07 Charlie Zender * Add Rich Signell's "cog" logos to homepage and doc directory 2009-06-26 Henry Butowsky * New GSL class gsl_spl_cls provides GSL spline interpolation wrappers * LHS hyperslabs of multidimensional variables with a single index three_dmn_var_dbl(1,1,2)=10.0 is equivalent to three_dmn_var_dbl(14)=10.0 2009-06-15 Charlie Zender * Restrict gsl_stats_correlation() to NCO_GSL_MINOR_VERSION >= 10 2009-06-14 Charlie Zender * Only unchunk chunked variables 2009-06-11 Charlie Zender * Clean-up re-basing code 2009-06-09 Charlie Zender * Chunking works: plc=all for map=rd1,dmn Chunking fails : plc=g?d for map=rd1,dmn Chunking fails : plc=uck * Allow cnk_map=dmn to work with record hyperslabs, e.g., ncks -O -4 -D 4 --cnk_map=dmn -d time,0,3 ~/nco/data/in.nc ~/foo.nc * Improve chunking corner-case logic * Restore precedence of explicitly specified chunking for record dimension over that implicitly specified by chunking map rd1 * Discriminate between BASIC_DMN and non BASIC_DMN * Fix chunking to look at dmn_sz_org for record variables 2009-06-05 Henry Butowsky * nco_lmt_udu_cnv() supports UDUnits2 for parsing timestamps in user specified co-ordinate limits * Added hnd_fnc_stat4() method to gsl_cls to handle gsl_stats_covariance/gsl_stats_correlation gsl_stats_pvariance/gsl_stats_ttest 2009-06-02 Charlie Zender * Add CUDA options to Makefile 2009-05-29 Charlie Zender * Improve chunking diagnostics when copying files with ncks * ncks and ncecat chunksize implementations seem to perform identically * Implement new chunksize API into ncecat.c for testing * Remove old chunksize API from non-ncks operators 2009-05-29 Henry Butowsky * Tidy up nco_lmt_udu_cnv() into three functions 1) for no udunits 2) for udunits1 3) for udunits2 2009-05-26 Charlie Zender * Change rcd_one to rd1 * Add chunksize usage to ncks in nco_ctl.c, nco.texi, ncks.1 * Improve cnk_map/cnk_plc defaults, minimize their main.c footprints * ncks copies original deflation and chunking parameters by default 2009-05-25 Charlie Zender * Per-dimension chunksizes in nco_prn() * nco_cnk_sz_set() beta works well, still need uck * Draft nco_cnk_sz_set() ready for testing * Add nco_vrs_att_cat() for later use * Harmless nco_cnk_sz_get() implemented for ncks 2009-05-22 Charlie Zender * Comment lmt_all_lst handling * Adapt chunksize infrastructure from limit parsing * bin_cnt.nco documentation * nco_typ_sgn() infrastructure 2009-05-17 Charlie Zender * Add nco_cnk.[ch] for chunking functions 2009-05-19 Henry Butowsky * Committed first cut of GSL statistical functions 2009-05-08 Charlie Zender * Begin chunking documentation in nco.texi 2009-05-07 Charlie Zender * Add autogen.sh from Magnus Hagdorn * Patch configure.in for antlr detection and netcdf.h (Magnus Hagdorn) * Clean up NC_STRING handling and add printed ncks info. 2009-05-05 Charlie Zender * Need test for whether installed netCDF is version 3 or 4 * Re-do netCDF4 configure: Remove redundants tests, new features: enable-netcdf4 is default true disable-netcdf4 should work when only netCDF4 installed? * Configure allows --enable-shared with netCDF4-enabled NCO 2009-05-05 Henry Butowsky * Tidy up user error messages in fmc_all_cls.cc 2009-05-04 Charlie Zender * Create/diagnose more complete netcdf4.nc files from netcdf4.nco * Verify that netCDF4 problems in netcdf4.nco as of 20080512 have been fixed (by updating to snapshot netCDF4) as of 20090504. One remaining problem is that NCO silently succeeds on overflows. Should it? * Improve logic/warnings/info for DAP-wget fall-throughs 2009-05-03 Charlie Zender * Some chunking parameters work, some cause "Bad chunk sizes" errors * libnco builds cleanly on gcc and icc with netCDF3/4 * Cast NC_TYPE naked tokens to nc_type to finesse icc compiler warnings * Link to libnsl.a only for Solaris and HPUX * Tweak NCO wrappers to isolate all weak prototype compiler warnings (caused by netCDF4 prototypes) in nco_netcdf.[ch] 2009-05-02 Charlie Zender * Verify cnk_sz stubs pass all regression tests * Allow DAP_NETCDF with ENABLE_NETCDF4 in Makefile's * Add cnk_sz to var_sct, dmn_sct, var_dfl_set(), nco_var_free(), and nco_var_dpl() * Add chunking section to manual * Change cnk_sz from int * to size_t * * Include newer nco++ files in "make tags" * Improve in_4.cdl availability, conversion, documentation * Print chunking parameters, when used, with ncks -m 2009-05-01 Charlie Zender * Enable command-line chunking arguments to ncks only Generic chunking requires dimension/variable-specific routines similar to dimension limits for hyperslabbing, something like rcd=nco_cnk_sz_set(cnk_sz_lst,cnk_nbr) nco_cnk_sz_get(dmn_lst,chk_sz) * Add NCO-wide chunking infrastructure 2009-05-01 Henry Butowsky * Rewrite RHS hyperslabbing routine var_lmt() in grammar file * More hyperslabbing tests in ncap2_tst.nco 2009-04-30 Charlie Zender * Output GCC compiler version from nco_cmp_get() 2009-04-29 Charlie Zender * Changes since nco-3_9_7: DAP-netCDF support, sort(), GSL distributions, chunksize cd ~/nco;cvs tag -d nco-3_9_8;cvs tag -d nco-3_9_8-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.8 release" cvs tag -c nco-3_9_8;cvs tag -c nco-3_9_8-1 * man pages tweaks for nroff * UDUnits2 build tweaks for Debian * Change debian files per Barry deFreese's instructions 2009-04-29 Henry Butowsky * Add array function usage: var_out=array(srt,ncr,$dim); * Add more GSL handler functions for _ran and _pdf 2009-04-23 Henry Butowsky * Add total() regression test for missing_values to ncap2_tst.nco 2009-04-22 Henry Butowsky * Added unary functions abs(), sqr(), fabs(): abs()=absolute value for any type; fabs()=absolute value for float/double types; sqr()=square of number for any data type 2009-04-21 Charlie Zender * Add COPYING and INSTALL to top-level directory to make autoreconf, and FSF, happy 2009-04-20 Charlie Zender * ncks --secret lists hidden/unsupported functions * UDUnits2 supported by configure --enable_udunits2 2009-04-18 Charlie Zender * NCO_GSL_MINOR_VERSION >= 8 for select GSL *_cdf_* and *_ran_* functions * Add abs() as synonym for fabs() in ncap2 2009-04-16 Charlie Zender * Add nco_def_var_chunking() and stubs for chunk-size patch 2009-03-27 Charlie Zender * Add ncap2 threading to all docs: .texi, .man, ncap2 -r * Restrict other operators to maximum four threads by default * Turn-off ncap2 threading (until ANTLR threading issues resolved?) * Clean-up ncap2 2009-03-26 Charlie Zender * Place new NCO logo candidate, logo_pch, by Tony Freeman, on homepage 2009-03-25 Henry Butowsky * Change assign action to redefine non-scalar variable with RHS scalar: e.g., n1=three_dmn_var_dbl;n1=20; fills 3-D array n1 with 20 and retains missing value, if any 2009-03-21 Charlie Zender * More attempts to configure DAP-netCDF 2009-03-20 Charlie Zender * Introduce full DAP-netCDF block to configure 2009-03-19 Charlie Zender * Changes since nco-3_9_6: improve GSL-builds, ncap2 threading cd ~/nco;cvs tag -d nco-3_9_7;cvs tag -d nco-3_9_7-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.7 release" cvs tag -c nco-3_9_7;cvs tag -c nco-3_9_7-1 * Remove archaic TEST_DAP * Finally get gsl-config to work in automake * Cleanup compiler warnings in fmc_gsl_cls.cc 2009-03-18 Charlie Zender * Dummy stub function so fmc_gsl_cls.o not empty when GSL unavailable 2009-03-17 Charlie Zender * Convert DAP to DAP_OPENDAP, add stub for DAP_NETCDF in configure.in * Eliminate obsolete ${DAP_ROOT} lines from configure.in * Rename DAP option to DAP_OPENDAP in preparation DAP_NETCDF option * More GSL tidying 2009-03-06 Charlie Zender * Yet another GSL configure patch 2009-03-05 Charlie Zender * GSL configure patch 2009-02-27 Henry Butowsky * Add srt_cls to fmc_all_cls.cc Only one method at the moment var_expr.sort() 2009-02-26 Charlie Zender * GSL build tweaks for NCO_GSL_MINOR_VERSION * Adding texinfo bibliography to nco.texi 2009-02-25 Charlie Zender * Edit ncap2 GSL documentation 2009-02-24 Henry Butowsky * Add basic macro to the spreadsheet doc/nco_gsl.ods Macro outputs selection in texi @multitable format 2009-02-24 Charlie Zender * Add doc/.htaccess file to copy to sourceforge to re-enable directory index display 2009-02-24 Henry Butowsky * Add chapter on ncap GSL functions 2009-02-23 Charlie Zender * Use native float prototypes for math functions if __INTEL_COMPILER 2009-02-13 Henry Butowsky * Global ncap_gsl_mode_prec initialized from environment $GSL_PREC_MODE This sets the precision of the Airy & elliptical functions: GSL_PREC_DOUBLE=0 GSL_PREC_SINGLE=1 GSL_PREC_APPROX=2 2009-02-12 Henry Butowsky * Made gsl_cls aware of GSL library version Add pre-processor token NCO_GSL_MINOR_VERSION Token is initialized in nco++/Makefile.old 2009-02-09 Charlie Zender * Added sym_cls.[cc,hh] and fmc_all_cls.[cc,hh] to configure 2009-02-03 Charlie Zender * Tweak ./configure for GSL 2009-02-02 Charlie Zender * Add variable wildcarding in ncatted example * Use nco_lst_prs_sgl_2D() not nco_lst_prs_2D() to avert TODO nco944 in nco_var_lst_crd_add(). Fixes crash on 'ncks -c ~/nco/data/in.nc' separately listed as TODO nco963. * ncks --no_dmn_var_nm implements naked printing requested in TODO nco962 2009-01-28 Charlie Zender * Specify Szip library in bld/Makefile[.old] with SZ and SZ_LIB * automake now builds src before doc in case makeinfo not present * Allow specification of Szip library in bld/Makefile with SZ and SZ_LIB * Allow configure to work when GSL_ROOT specified and when gsl-config is not necessarily on path * Eliminate GSL references from libnco++ when GSL not present * Tweak configure.in for GSL 2009-01-27 Charlie Zender * Prefix GSL header file search path with 'gsl/' 2009-01-22 Charlie Zender * cd ~/nco;cvs tag -d nco-3_9_6;cvs tag -d nco-3_9_6-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.6 release" cvs tag -c nco-3_9_6;cvs tag -c nco-3_9_6-1 Changes since nco-3_9_5: fix MSA bug, add GSL * Added m4 directory * Updated m4, libtool, autoconf macros with autoreconf -f -i 2009-01-20 Charlie Zender * Separate HDF5_ROOT from NETCDF4_ROOT in bld/Makefile * Update copyright year to 2009 2009-01-20 Henry Butowsky * Removed gmm_inc_cls() and associated code from ncap2_utl.cc. Superceded by GSL library gamma functions. 2009-01-16 Charlie Zender * Add warning about MSA threading bug 2009-01-13 Charlie Zender * Tweaked bld/Makefile to incorporate Russ Rew's modifications 2009-01-08 Henry Butowsky * Added gsl wrapper functions fmc_gsl_cls.cc, fmc_gsl_cls.hh. Added test script data/gsl_sf.in 2008-12-10 Charlie Zender * Check for external (rather than internal) netCDF4 function nc4_enddef_netcdf4_file() in libnetcdf.a 2008-12-03 Charlie Zender * Implement --enable-gsl in configure * Add ENABLE_GSL functionality to configure and to most source code Still needs correct propagation into fmc_cls.cc, maybe ncoGrammar.g 2008-11-04 Charlie Zender * Document new ncatted rx capabilities for var_nm 2008-11-04 Henry Butowsky * Added variable wildcarding to ncatted -a arg -a att_nm,var_nm,mode,type,type,val var_nm can now be a regular expression 2008-10-30 Charlie Zender * Add GSL functionality to nco++/Makefile.old 2008-10-29 Charlie Zender * Update to build on NCAR bluefire 2008-10-17 Charlie Zender * Add ncdump -k method to learn file format. Revise NCO method. * Implement new SF shell access through web.sf.net 2008-10-08 Henry Butowsky * Added indexing to ncap2 section 2008-10-05 Henry Butowsky * Added to manual chapter on ID Quoting, include files & general tidy up 2008-10-02 Henry Butowsky * Reversed out new var/att/dim quoting * Tidy up of fmc_cls.cc 2008-09-29 Charlie Zender * Clean-up ncap_var_var_gmmi() */ 2008-09-27 Charlie Zender * Prototype ncap2 supports for incomplete gamma functions: gamma_inc_regular(a,x), gamma_inc_complement(a,x), gamma_inc_upper(a,x), gamma_inc_lower(a,x), 2008-09-25 Charlie Zender * Added nco_gmm.[ch] for incomplete gamma function. Source from http://people.scs.fsu.edu/~burkardt/cpp_src/asa032/asa032.html 2008-09-24 Charlie Zender * Added Invoke.hh 2008-09-24 Henry Butowsky * ncap2 supports #include files, syntax is #include "pi.nco" 2008-09-22 Henry Butowsky * Added get_miss() method to utility class returns the missing value of a variable in Input/Oytput 2008-09-18 Charlie Zender * make lib_cln now removes NCO C++ libraries libnco++.a and libnco_c++.a 2008-09-17 Charlie Zender * --version ported to rest of operators * --version only calls nco_vrs_prn() in ncks, rest to follow 2008-09-15 Henry Butowsky * New rules for variable/attribute/dimension quoting * Can now do 'var_nm'@att_nm or 'var_nm'@'att_nm' or var_nm@'att_nm' * Dimension quoting now $'dim_nm' * Quoting supports the following characters: 'a..z'|'A..Z'|0..9|'_'|'-'|'+'|'.'|'('|')'|':'|'@' 2008-09-12 Henry Butowsky * Added convert(nctype) method 2008-09-02 Charlie Zender * Add ncks --library to print library version and exit * Split nco_cnf_prn() out of nco_lbr_vrs_prn() 2008-09-02 Henry Butowsky * Re-enabled -f switch in ncap2. Prints methods available to user. 2008-08-18 Charlie Zender * Fix/cleanup nco_att_cpy() when _FillValue is global attribute 2008-08-14 Henry Butowsky * Deleted from parser nonsense NCL-style operators "<<=" ">>=" 2008-08-05 Charlie Zender * More nco_aed_prc() cleanup 2008-07-31 Charlie Zender * nco_aed_prc() cleanup 2008-07-28 Henry Butowsky * Permanent fix for TODO nco944: New parsing function nco_lst_prs_sgl_2D() Returns only non-zero length strings unlike nco_lst_prs_2D() 2008-07-25 Charlie Zender * Applied 20080718 patch to nco_cnv_csm.c and deferred permanent fix to TODO nco944: handle redundant whitespace "coordinates" attributes before calling nco_lst_prs_2D() 2008-07-23 Charlie Zender * Notes and cleanup on TODO nco941 kludge 2008-07-22 Charlie Zender * "ill-defined" warning in nco_var_lst_dvd() uses correct var_typ_fnk 2008-07-18 Charlie Zender * Allow spaces at the end of CF-convention coordinate attribute strings in nco_var_lst_crd_ass_add() call to nco_lst_prs_2d(). 2008-07-07 Charlie Zender * Verify bug TODO nco941 where ncra tries to average nc_char variables Reported by Alberto Corbi Bello 2008-06-17 Charlie Zender * Limit OpenMP thr_nbr_rqs=1 for netCDF4-enabled operators. TODO nco939. 2008-06-02 Charlie Zender * Patch ./configure for Solaris gcc 2008-05-30 Charlie Zender * Add Scott's example ncap2 script for 500mb heights * Remove _POSIX_SOURCE from ./configure on Solaris 2008-05-26 Henry Butowsky * mods to ncatted so it works with _FillValue in NETCDF4 2008-05-26 Charlie Zender * Change test version to 3.9.6 * Make NCO_NETCDF4_AND_FILLVALUE available in all source files 2008-05-12 Charlie Zender * cd ~/nco;cvs tag -d nco-3_9_5;cvs tag -d nco-3_9_5-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.5 release" cvs tag -c nco-3_9_5;cvs tag -c nco-3_9_5-1 Changes since nco-3_9_4: MSA everywhere * Correct -X documentation * Clean-up nco_aux.c * Add -X to ncecat, ncflint, ncpdq 2008-05-11 Charlie Zender * Add -X to ncbo * Add -X to more man pages * Improve -X and ncap2 documentation 2008-05-02 Charlie Zender * Cleanup ncbo, ncecat, ncflint, ncks, ncpdq, ncra *.c files 2008-04-23 Charlie Zender * Replace H5LT_open_id with H5LT_find_attribute in configure.in Fixes cygwin build problem with netCDF4. Thanks to Mark Hadfield. 2008-04-21 Charlie Zender * Merge recent 3.9.0-1.1 Debian NMU patches into upstream * Un-DOS-ify files 2008-04-10 Henry Butowsky * Added multi-hyperslabbing code to ncra 2008-04-04 Henry Butowsky * Added multi-hyperslabbing code to ncecat 2008-04-02 Charlie Zender * Prevent copying global metadata with ncecat -M * Print netCDF4-dependent switches only if netCDF4 is enabled 2008-04-01 Charlie Zender * Add rule to post-process ANTLR-files with broken tokens: nco_antlr_pst_prc.pl < ncoParserTokenTypes.hpp > ncoEnumTokenTypes.hpp This should fix build problems on Solaris 2008-03-13 Charlie Zender * Improve error messages 2008-03-06 Charlie Zender * Add new author's note 2008-03-04 Charlie Zender * Add man pages to tags * cd ~/nco;cvs tag -d nco-3_9_4;cvs tag -d nco-3_9_4-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.4 release" cvs tag -c nco-3_9_4;cvs tag -c nco-3_9_4-1 Changes since nco-3_9_3: -3, -X, --msa_usr_rdr, ncap2 mask, WIN32 * Make netCDF4 changes to libnco_c++ back-compatible with netcdf 3.6.1 still widely used including by FC DAP RPMs. * Add netCDF4 put_varx_string() functions to nco_c++ 2008-03-02 Charlie Zender * Compiler warning message cleanup for ncks.c, nco_msa.c, nco_aux.c * Change malingering GPL2 files to GPL3 2008-02-22 Charlie Zender * Add auxiliary coordinate test variables to in.cdl * Document lon_min,lon_max,lat_min,lat_max ordering * Plug auxiliary coordinate memory leaks (aux=malloc(),aux_arg[]=strdup()) * -X now implies --msa_usr_rdr 2008-02-21 Charlie Zender * Use 64-bit fill values for uint and long long types * Make compatible with hdf-1.8.0 final and netcdf-4.0-snapshot2008022009 * Transplant chunks of nco_typ.h into nco_utl.hh to make libnco_c++ forward-backward compatible with netCDF3/netCDF4 * Rely on netcdf4 netcdf.h for NCO_FILL_STRING 2008-02-20 Charlie Zender * Preliminary -X documentation 2008-02-19 Charlie Zender * Add flg_ddd stub to ncwa to delete degenerate dimensions * MSA miscellania 2008-02-18 Charlie Zender * ncks --msa_usr_rdr causes MSA to leave hyperslabs in user order 2008-02-13 Henry Butowsky * First cut of NCL-style operators "<<", "<<=", ">>", ">>=" 2008-02-06 Henry Butowsky * Added functions "mask" & "mask_clip" 2008-01-22 Henry Butowsky * Work-arounds related NCO_NETCDF4_AND_FILL_VALUE changes to ncap_var_write_omp(). Added NCAP4_FILL property to prs_cls. 2008-01-17 Charlie Zender * Re-define NCO_NETCDF4_AND_FILLVALUE to workaround CPP problems 2008-01-16 Charlie Zender * nco.h now #defines NCO_NETCDF4_AND_FILLVALUE when NCO is netCDF4-enabled and nco_mss_val_sng_get() returns "_FillValue" * Finish -3 option implementation, add --3 too 2008-01-15 Charlie Zender * Add -3 option to produce CLASSIC files for symmetry with -4 option that produces NETCDF4 files 2008-01-11 Charlie Zender * Add nco_create_mode_prs() functionality to libnco_c++ 2008-01-07 Charlie Zender * Fix OpenMP builds of ncap2 with pgCC 2008-01-06 Charlie Zender * xlC needs to search /usr/vacpp/include to find atan2() * Autoconf builds with AIX fail because unable to find atan2() * Use nco_inq_attlen() to avoid pointer warning in nco_aux.c * Update copyright year to 2008 2008-01-05 Charlie Zender * Mark TODO nco852 as done (Henry fixed some time ago) 2007-12-29 Charlie Zender * Put nco_sng_utl.h in headers that may reference strdup() compatibility function * Add math.h definitions to nco_aux.c to resolve M_PI on WIN32 * Fix strdup()-compatibility function prototype * Cleanup some WIN32 warnings 2007-12-22 Henry Butowsky * Work-arounds for NCO_NETCDF4_AND_FILL_VALUE changes to ncap_var_write_omp(). Added NCAP4_FILL property to prs_cls. 2007-12-20 Charlie Zender * Use NCO_GET_ATT_CHAR() instead of nc_get_att_text() * Change lenp from size_t to long in nco_aux.c 2007-12-19 Charlie Zender * Verified no new regressions * Merged nco_aux patch by Karen Schuchardt * Tagged nco-20071219_pre_nco_aux_patch prior to adding nco_aux.c * Fix mpncrcat to work with netCDF4 (thanks to Takeshi Enomoto) 2007-12-16 Charlie Zender * Add ncecat -u mods to mpncecat TODO nco918 2007-12-14 Charlie Zender * Add ncecat -u example to manual 2007-12-14 Henry Butowsky * Added new functions atan2(y,x) and pow() 2007-12-13 Charlie Zender * Add hint for NC_ENOTNC errors * Make nco_inq_var_deflate() wrapper support netCDF3 and netCDF4 2007-12-12 Charlie Zender * Fix output/input file consanguinity (TODO nco836) 2007-12-11 Charlie Zender * ncks prints netCDF4 LZ compression information to stdout TODO910 * ncap2 calls nco_thr_att_cat() to archive nco_openmp_thread_number 2007-12-11 Henry Butowsky * Added print attributes function e.g., print(global@history) 2007-12-10 Charlie Zender * Fix ncks.1 typos reported by Rich Signell * CVS rm ssdap 2007-12-09 Henry Butowsky * ncap2 now uses ncap_lmt_evl() instead of nco_lmt_evl() This fixes problems with record dimension in limits 2007-12-08 Charlie Zender * Add hooks to nco_prn_var_dfn() to print compression state * cd ~/nco;cvs tag -d nco-3_9_3;cvs tag -d nco-3_9_3-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.3 release" cvs tag -c nco-3_9_3;cvs tag -c nco-3_9_3-1 Changes since nco-3_9_2: SWAMP, ncecat -u, wget, ncap2 OpenMP, GCC 4.2 * Update documentation for SWAMP, AGU, and IJHPCA 2007-11-29 Henry Butowsky * First cut of OpenMP for ncap2 * ncap2 processes ncap2.in in parallel on LINUX & AIX platforms 2007-11-27 Henry Butowsky * Added "hyperslab normalization" to the parser 2007-11-16 Charlie Zender * Add NcapVar.cc to distribution to fix native AIX ncap2 bug 2007-11-13 Charlie Zender * Propagate Makefile OPTS argument to children * Allow specification of record dimension name with ncecat -u dmn_nm 2007-11-11 Charlie Zender * Add packing caveat to ncrcat and ncecat documentation 2007-10-31 Charlie Zender * Update man page ncwa.1 * Add -t thr_nbr to applicable man pages * Remove (temporarily?) deprecated ncwa -n and -W options from nco.texi 2007-10-24 Charlie Zender * OpenMP-enabled, gcc-compiled NCO passes regression test * Enable OpenMP with GCC 4.2 gcc, g++, gfortran * Change MUST_CONFORM from private() to shared() in ncflint 2007-10-22 Charlie Zender * Add Makefile support for GCC OpenMP 2007-10-21 Charlie Zender * Tweak nco_cmp_get() to work with GCC on AIX 2007-10-02 Charlie Zender * Periods in attribute names choke OPeNDAP Temporarily removed att_nm.dot from var_nm.dot in in.nc 2007-09-18 Charlie Zender * xlC and SGI CC no longer search for in nco_var.hh 2007-09-17 Charlie Zender * Add big.nc to CLEANFILES to (hopefully) fix Debian FTBFS problem with two consecutive builds 2007-09-12 Charlie Zender * Add helpful hint for DAP -l mis-users 2007-09-03 Charlie Zender * Finish implementing and testing wget capability. Looks good. * Use wget -r: re-download file (clobber existing file of same name, if any) * Remove leading slash from derived local path for HTTP_URL retrievals 2007-09-02 Charlie Zender * wget retrieval works iff -l used, regardless of -p use * More exhaustive debugging and local file searches prior to wget attempt * Implement nco_close() to pair with nco_open() in DAP probe. Not doing this previously probably means that NCO via DAP left lots of open files dangling on the DAP server. This may have caused noticeable drag on large jobs. * Finish wget draft code, introduce nco_open_flg() for DAP attempts * Add stubs to retrieve non-DAP HTTP files with wget 2007-09-01 Charlie Zender * Fix #ifdef NEED_NC_INQ_FORMAT to have else so NCO/netCDF3 build with OPeNDAP DAP=Y option so long as NEED_NCO 2007-08-31 Charlie Zender * cd ~/nco;cvs tag -d nco-3_9_2;cvs tag -d nco-3_9_2-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.2 release" cvs tag -c nco-3_9_2;cvs tag -c nco-3_9_2-1 Changes since nco-3_9_1: GPL3, UDUnits2, _FillValue, ncap2 printing * Support nco_put/get_att_string/ubyte() now in netCDF4 * Update to netCDF4 daily snapshot 20070822 * Abandon TKN2SNG(x) method for nco_mss_val_sng Use direct global variable to get rid of superfluous double quotes This fixes all regressions with _FillValue<->missing_value switch 2007-08-29 Charlie Zender * Regressions with _FillValue<->missing_value switch * Supplant missing_value with _FillValue in documentation 2007-08-29 Henry Butowsky * First cut of user functions permute() & reverse() see examples in ncap2.in. 2007-08-23 Charlie Zender * Implemented Henry's new ncap2 files, smaller ncoGrammer.g 2007-08-22 Charlie Zender * Quiet UDUnits "override" messages to stderr unless dbg_lvl >= 9 2007-08-21 Charlie Zender * UDUnits2 finds default database, obeys UDUNITS2_XML_PATH 2007-08-07 Charlie Zender * Simple UDUnits2 test works with many TODOs for me, Unidata * Complete compilable UDUnits2 implementation for all units except (I think) time = time since ... units * Splice udunits2 functionality stubs inside HAVE_UDUNITS2 tokens 2007-07-24 Charlie Zender * pbuilder successfully built an NCO deb in a sid chroot! 2007-07-23 Charlie Zender * Add pbuilder-sid to build NCO in a chroot environment 2007-07-22 Charlie Zender * Add license text to nco++ source files * Change licenses from GPL2 and FDL1.1 to GPL3 and FDL1.2 for code and documentation, respectively * Try to prevent debian rules configure/libtool from invoking RPATH 2007-07-19 Charlie Zender * Add ncap2_tst.nco, Henry's ncap2 test script, to distribution 2007-07-18 Henry Butowsky * Turned prs_sct into class. It has four methods: contructor, ncap_var_init(), ncap_var_write(), ncap_def_ntl_scn() 2007-07-14 Charlie Zender * Add failsafe NC_FORMAT_CLASSIC definition so tst.cc builds with OPeNDAP netcdf.h, which lacks pre-netCDF 3.6.1 tokens 2007-07-09 Henry Butowsky * First cut of print function can do the following print(var_id),print(var_id,"format_string") 2007-07-04 Charlie Zender * Warn when nbr_xtr_1 < nbr_xtr_2 in ncbo * Note ncap2 type-conversion support 2007-06-30 Charlie Zender * Add -4 and -L dfl_lvl to man pages 2007-06-29 Charlie Zender * cvs tag -c nco-3_9_1-2 * Define NC_64BIT_OFFSET no-matter-what so FC6 RPMs build with OPeNDAP * cd ~/nco;cvs tag -d nco-3_9_1;cvs tag -d nco-3_9_1-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.1 release" cvs tag -c nco-3_9_1;cvs tag -c nco-3_9_1-1 Changes since nco-3_9_0: netCDF4 deflation support, ncap2 loops, build improvements on many platforms * Finish deflation in ncap and ncap2 2007-06-28 Charlie Zender * Beef up deflation documentation * Add deflation to low-level ncap, ncap2 routines * Put deflation in ARM convention routine * Implement deflate command-line switches in all applicable (i.e., variable-defining) operators * Allow ncbo to subtract files with more processed variables in file_2 This is done by excluding file_2 variables that are not in file_1 2007-06-27 Charlie Zender * Polish deflate functionality and documentation 2007-06-26 Charlie Zender * Describe deflation in nco.texi * Request variable deflation iff dmn_nbr > 0 This works around netCDF4/HDF5 limitation where deflating a scalar crashes 2007-06-19 Charlie Zender * nco.spec patch by Daniel to always put netcdf-3 on path and, for x86_64, add -L/usr/lib64, when present, to correctly resolve 32/64-bit libraries * Define some netCDF tokens for really old versions of libnetcdf.a still in use on enterprise distributions like RHEL/CentOS. These tokens need are defined both in nco.h and nco_netcdf.c to enforce code firewall to keep netCDF wrappers separate from NCO. 2007-06-18 Charlie Zender * Remove configure.in rule to add -DNC_64BIT_OFFSET even when DAP version > 3.6.1 * Add SWAMP test template ~/nco/data/swamp.sh * Place DAP netcdf.h path ahead of system netcdf.h path in configure.in 2007-06-14 Charlie Zender * Fix flukey ncks %s printing * Alter bin_cnt.nco to use loops 2007-06-14 Henry Butowsky * Commited the first cut of while loops and for loops Can use "break" & "continue" in both. Can have any level of nesting. These are vanilla unoptimized loops. Optimization to come!! 2007-06-07 Charlie Zender * Add [put/get]_string functions now in netcdf4 daily snapshots In particular, synchronize with snapshot2007060701 2007-06-05 Charlie Zender * Remove stdint.h from xlC and SGI builds of ncap2 stdint.h "helps" g++ builds (by defining [U]LLONG_MAX) stdint.h is required by icpc builds (by defining int64_t) 2007-06-03 Charlie Zender * Switch to daily snapshot 20070603 for development 2007-06-01 Charlie Zender * Unable to get compression working. Generates HDF5 errors. * Implement --dfl_lvl to set HDF Lempel-Ziv deflation level Always turn shuffle on, since it is inexpensive and improves compression * Allow user-specified down-conversion of netCDF4->netCDF3 * Include stdint.h where "long long" types are used This should fix build problems with icpc * Add nco_var_def_deflate() and stub to libnco 2007-05-31 Charlie Zender * Fix typos spotted by donor Kevin Raeder 2007-05-25 Charlie Zender * NC_64BIT_OFFSET patch in configure.in causes beaucoups de RPM warnings * Fix version in nco.spec * cd ~/nco;cvs tag -d nco-3_9_0;cvs tag -d nco-3_9_0-1 cd ~/nco;cvs commit -m "Preparing nco-3.9.0 release" cvs tag -c nco-3_9_0;cvs tag -c nco-3_9_0-1 Changes since nco-3_2_0: netCDF4 atomic type support, ncks attributes * Fix nco_prn_att() to handle netCDF4 atomic types * Use type-appropriate conversion to read ncatted attribute values * Document netcdf4 ncatted features * Add netcdf4 atomic type functionality to ncatted nco837 2007-05-24 Charlie Zender * Include NC_UBYTE and NC_STRING as funky variable types in var_lst_dvd() * Add better ncdiff regression for packed subtraction * Change put_var(var_prc_out[idx]->type) to var_prc_out[idx]->typ_upk in arithmetic operators to output inflated variables to disk. This should fix TODO nco862, a regression introduced sometime between 2.7.1 and 3.2.0 and noticed by Remik Ziemlinski. * Postpone 3.9.0 release until ncdiff/packing bug TODO nco862 is fixed 2007-05-23 Charlie Zender * Add nco_inq_format() compatibility stubs for pre-netCDF3.6.1 libraries 2007-05-22 Charlie Zender * Added netCDF4 support section: http://nco.sf.net/nco.html#nco4 * Decided to release as 3.9.0 rather than 3.2.1 * cvs tag -c nco-3_2_1_beta2 Changes since last tag: NCO builds and tests fine from both netCDF3 and netCDF4! Candidate is releasable. ncap2 NC_UBYTE problem is not solved. * Testing with ~/c++/ccc.cc shows that NC_UBYTE support is non-trivial No need to hold up release to finish this * antlr 2.7.6 fails on mpc64.nacs.uci.edu with pgCC This does not seem to be an NCO problem * NCO builds and tests fine from both netCDF3 and netCDF4! * Verified sng2nbr() handles cross-platform strtoll(), strtoull() issues with AIX xlC and PGI pgCC compilers. * Typecast CEWI variables in nco.h for safety * Added sng2nbr() from ~/c++/utl.hh to sdo_utl.hh 2007-05-20 Charlie Zender * AIX xlC has ncap2 build problem: "std::strtoll" is not declared. * Cast all naked nc_type tokens being thrown around in ncap2 code In addition to being bad programming style, these naked tokens trigger the netCDF3/netCDF4 nc_type incompatibility bug. The bug is that the nc_type NC_TYPE tokens are enumerated (enums) in netCDF3 and are simple pre-processor tokens in netCDF4. * cvs tag -c nco-3_2_1_beta1 Changes since last tag: netCDF3 build works again and tests fine. Huzzah. Candidate is releasable except for ncap2 NC_UBYTE problem * Add empty netCDF3 forward compatibility stubs for all netCDF4 new atomic type I/O functions * cvs tag -c nco-3_2_1_alpha4 Changes since last tag: netCDF4 works fine with all operators and regression tests. Exceptions are that ncap2 does not work with ubyte and that netCDF3 does not build because ncoGrammer.g lacks netcdf4 #ifdef's * Add netcdf4.nco test script for netCDF4-enabled ncap2 * Add netCDF4 casting functions ushort(), int64(), etc. to ncap_lex.l * Verified ncap ll,LL,ull,ULL,us,ui, etc. parsing works * Finished netCDF4'ing ncap_lex.l, ncap_yacc.y, ncap_utl.c 2007-05-19 Charlie Zender * Verified that ddra.nco works with int64 types so storing large counts as floats no longer necessary! * cvs tag -c nco-3_2_1_alpha3 Changes since last tag: After netCDF4'ing most files. netCDF4 references in ncoGrammer.g break netCDF3 ncap2 * Success at creating all netCDF4 atomic types with ncap2 except NC_UBYTE * Add netCDF4 atomic types (except NC_STRING) ncoGrammer.g 2007-05-18 Charlie Zender * Add netCDF4 atomic types (except NC_STRING) ncap2_utl.cc, ncap_yacc.y * Replace nc_type with nco_rth_prc_rnk() in ncap2.cc * Fix type spaghetti in nco_lst_utl.c * Create nco_rth_prc_rnk(nc_type) to determine relative precision * Add netCDF4 atomic types (except NC_STRING) to ncap_lex.l * Add netCDF4 atomic types to nco_rec_var.c, nco_rth_utl.c * Commit working build with netCDF4 atomic types in previously listed files * Add netCDF4 atomic types to mpncwa.c, nco_lmt.c, nco_lst_utl.c, nco_pck.c * Define fl_in_fmt before using in ncap.c, ncap2.cc * Working build with netCDF4 atomic types in nco_var_rth.c, nco_var_scv.c * Working build with netCDF4 atomic types in nco_var_avg.c * Use -Wno-switch to quiet GCC enum warnings on netCDF4 case labels * Introduce nco_short in nco_var_scv.c, nco_var_rth.c, nco_var_avg.c * cvs tag -c nco-3_2_1_alpha2 Changes since last tag: Prior to adding netCDF4 atomic types to: nco_var_scv.c, nco_var_rth.c, nco_var_avg.c * Resolve forward-compatibility issues and stub for nc_inq_format() 2007-05-15 Charlie Zender * Add netCDF4 atomic types to nco_scl_utl.c * Add netCDF4 atomic types to nco_mss_val.c * Add netCDF4 atomic types to nco_att_utl.c * Add netCDF4 atomic types to nco_cnf_typ.c * cvs tag -c nco-3_2_1_alpha1 Changes since last tag: Working subset of netCDF4 atomic type features with no regressions * Regression tests all fine except for known netCDF4/HDF defects * Make fl_out_fmt>=fl_in_fmt ("consanguinity") NCO-wide TODO nco836 * This seemed to introduce ncap2 regression in both netCDF3/4 * Use ISO standard strto(l,d,ul) not ato(f,i) to parse ncap2 atomic types 2007-05-14 Charlie Zender * Support NC_STRING in ncks functions, nco_prn.c, nco_msa.c, libnco_c++ * Temporarily make fl_out_fmt>=fl_in_fmt ("consanguinity") in ncks * Fix fl_out_fmt bug for NC_FORMAT_CLASSIC * Add all new netcdf4 atomic data types (except string) to libnco_c++ * Implement NC_STRING support stubs in nco_typ.h * Support NC_INT64 in nco_c++ * Complete netCDF4 type support (except NC_STRING) in nco_prn.c, nco_msa.c ncks now prints netCDF4 atomic types correctly 2007-05-13 Charlie Zender * Support netCDF4 types in nco_typ_fmt_sng() * Make tst.cc produce netCDF4 files when compiled with netCDF4 * Printing changes fix many netcdf4 regressions * Commit major changes to ncks printing 2007-05-12 Charlie Zender * ncks does not copy scale_factor and add_offset to output files! * ncks reports input file type, e.g., NC_FORMAT_CLASSIC, NC_FORMAT_NETCDF4 2007-05-11 Charlie Zender * Explain ncwa memory usage in nco.texi 2007-05-09 Charlie Zender * Comment out unused variables. These caused noisy compiles. Retain some for future use in cases where they might help in debugging or where their presence enhances code symmetry or would be non-trivial to re-introduce. Mark such variables as CEWI RUVICFFU = Retain Unused Variables In Comments For Future Use * Re-format error messages to print error code if available, and to always print msg, if any * Changed prototype and disambiguated ncap_sclr_var_mk() This allows g++ 4.1.2 to compile ncap2 again. 2007-05-08 Charlie Zender * Remove OpenMP and thr_nbr references from ncrename.c * Fix regressions stemming from passing --fl_fmt to ncatted * Put ${NETCDF_INC} before ${ANTLR_INC} in CPPFLAGS in nco++ Makefile This ensures netCDF4 in /usr/local/netcdf4 is searched before ANTLR in /usr/local (which often contains netCDF3 as well). * Add "copy global attributes" example to ncks documentation * Add "growing dimensions" example to ncap2 documentation * Use ncks -G to avoid copying global metadata during appends 2007-05-05 Charlie Zender * Working on 2D grid descriptions and ncap2 documentation 2007-04-24 Charlie Zender * Add "build-from-source" requirements to homepage * Backport settings (e.g., -c99) for SGI IRIX 6.5 compilers 2007-04-19 Charlie Zender * cd ~/nco;cvs tag -d nco-3_2_0;cvs tag -d nco-3_2_0-1 cd ~/nco;cvs commit -m "Preparing nco-3.2.0 release" cvs tag -c nco-3_2_0;cvs tag -c nco-3_2_0-1 Changes since nco-3_1_9: rmssdn normalization bugfix, exclusion list handling more flexible, RAM variables. 2007-04-18 Charlie Zender * Remove obsolete NR indexx*() routines * nco_var_nrm_sdn() returns mss_val when N=0 or 1 * Allow absent variables with EXCLUDE_INPUT_LIST in nco_var_lst_mk() 2007-04-18 Henry Butowsky * Tested nco_put_var_mem() & nco_get_var_mem() Can now hyperslab RAM variables on the RHS RAM hyperslabs on the LHS to follow shortly 2007-04-17 Charlie Zender * Remove obsolete -d hyperslab options from ncap, ncap2 code and docs * Insert computation of anomaly in ncap2 standard deviation examples 2007-03-31 Charlie Zender * Change -s "" to -s '' in most all examples to prevent unintended ncap2 behavior 2007-03-30 Charlie Zender * Implement all GCC custom switches in nco++, nco_c++ directories nco directory and configure.in have all cust switches except -Werror -Werror still triggers problems with ncap_lex.c * Add wildcards to end of all compiler tests in configure.in so that, e.g., CC='gcc' tests same as CC='gcc -std=c99' 2007-03-29 Charlie Zender * Fix ncap2 comparison between signed/unsigned integer expression warnings * Fold in Daniel's nco.spec change required for 64-bit builds on hybrid 32/64-bit systems, e.g., RHEL, CentOS 2007-03-29 Henry Butowsky * first cut of RAM variables new syntax works with assign operators (=,-=,+=,/=, *=) and post increment & post decrement operators 2007-03-24 Charlie Zender * Update configure.in for Mac OS X on Intel 2007-03-10 Charlie Zender * cd ~/nco;cvs tag -d nco-3_1_9;cvs tag -d nco-3_1_9-1 cd ~/nco;cvs commit -m "Preparing nco-3.1.9 release" cvs tag -c nco-3_1_9;cvs tag -c nco-3_1_9-1 Changes since nco-3_1_8: nc[wre]a normalization, ncap2 qutoes variables, quieter output, RPMs support ncap2, ncecat does per-file hyperslab expansion * NCO 3.1.8 RPM builds/installs/removes properly with FC6 Resulting executables work fine on local files DAP access is enabled, but broken. Unsure why. * enable-optimize-custom and -Wall are close to working on ncap2 Should be possible to get this working again by 3.2.0 * Cryptographically sign RPMs with GPG during BFS * Tweak nco.spec * Change to CFLAGS to -Wno-shadow so ncoLexer.cpp compiles 2007-03-09 Charlie Zender * Un-shadow variables in ncoGrammar.g 2007-03-08 Charlie Zender * Avoid FC6 redefinition of yy_flex_realloc() in ncap_lex.l Note sure if this will bite me on another platform 2007-03-06 Charlie Zender * Fix [mp]ncwa so normalization occurs and mean coordinates are returned when totals with weighting are requested. Regression test caught this error I re-introduced 20070223. 2007-03-03 Charlie Zender * Add ANTLR_ROOT to simultaneously set ANTLR_BIN, ANTLR_INC, ANTLR_LIB 2007-03-01 Charlie Zender * Document new ncea/ncecat per-file record dimension hyperslabs * Add #include to NcapVector.hh to provide STL binary_function routines * Add C_INC option to configure.in to disambiguate C-library headers from antlr headers and thus fix AIX/ESMF ncap2 build * Start new dedication 2007-02-28 Charlie Zender * Link with -lC on all xlc_* compiles * Re-work configure.in to accept ANTLR_INC, be friendlier on AIX 2007-02-27 Charlie Zender * Change configure.in to check for ASTFactory() in libantlr.a 2007-02-24 Charlie Zender * Finished (I think) quieting all non-fatal INFO/DEBUG/WARNINGS in main() routines, and converted from naked numbers to consistent and descriptive enums 2007-02-23 Charlie Zender * Add sys target to nco++ Makefile.old for ncap2 * Do not normalize coordinates by tallys/weights when no tallys exist (i.e., minimization, maximization, totals). Fixes TODO nco810. * Add nco_dbg_typ_enm to nco.h and implement in ncwa.c * Add ncwa coordinate-minimization bug to regression test 2007-02-15 Henry Butowsky * Changed prefix of parser generated vars from '_' to '~'. Attribute propagation & inheritance should now work correctly with vars prefixed by '_'. Can now quote vars and atts '--u@..-v' 2007-02-14 Charlie Zender * Declare in ncap2_utl.cc and std::-qualify functions 2007-01-30 Daniel L. Wang * Changed names in ssdap/ to reflect name change from SSDAP to SWAMP 2007-01-24 Charlie Zender * Committing nco-3_1_8-2 for upload to Debian unstable 2007-01-21 Charlie Zender * Change copyright year to 2007 * Built and tested with libdap-3.7.3 and libnc-dap-3.7.0 2007-01-12 Charlie Zender * Add variables and attributes with dashes and dots to in.cdl 2007-01-05 Charlie Zender * Add missing #xmp_ncecat link to nco.texi 2006-12-08 Charlie Zender * nco-3_1_8-1 is in Debian experimental 2006-12-06 Charlie Zender * cvs tag -c nco-3_1_8 Changes since nco-3_1_7: ncap2 methods work, nascent _FillValue support 2006-12-03 Henry Butowsky * Commited second cut of variable methods & var/att properties 2006-12-02 Charlie Zender * Noticed that configure;make;make test breaks because ncap2 is not available in ../src/nco like all other executables * Link nco_c++/in.nc to ../../data/in.nc * Fix all rule in data so *.nc are always built 2006-11-29 Charlie Zender * NB: psd.nco uncovered a bizarre scanner error with ncap2 comment fields * Add equal-V/S approximation for Tallandier depth hoar to psd.nco * Print _FillValue WARNING only when dbg_lvl > 0 2006-11-27 Charlie Zender * Re-format long description in debian/control * Remove unused $(MAKE) -f debian/rules DH_OPTIONS=-i binary-common * Change Debian section from "math" to "science" in control and doc-base * Remove pgiCC OpenMP threading on ncap2 (compiler limitation) 2006-11-24 Charlie Zender * Change 'redhat' to 'rpm' and 'rpm -ba' to 'rpmbuild -ba' in bld/Makefile * Merge Fedora nco.spec UDUnits patch into configure.in * Update bld/nco.spec to Fedora Core 6 spec for nco-3.1.5 * Change ORO values in in.cdl * Change ncap to ncap2 in nco.texi * Remove *lex.c, *yacc.c, .cvsignore, and debian from _all_ tarballs 2006-11-23 Charlie Zender * Fix typo now use _FillValue not _Fillvalue * Fix nco_bm.pl success test for ncap2 reading ncap2.in * Regression/benchmarks now use ncap2 everywhere 2006-11-22 Charlie Zender * Exclude all .cvsignore's from tarballs * Replace 'unstable' with 'UNRELEASED' from 3.0.0-3.1.7 * Change debian/nco.doc-base to debian/doc-base * Update bld/Makefiles for DAP build for ncap2 * More precise language for interactive o/a/e command * Created non-native debian packages 2006-11-21 Charlie Zender * Add @dircategory netCDF to nco.texi * Patch ncap2 with ncap_sclr_var_mk() prototypes to re-enable builds * More package fixes suggested by Daniel Baumann: * Removed debian/docs, alphabetize control, less precise debhelper version, refine copyright history, remove debian/doc, de-comment debian/rules * Remove debian/[postinst,prerm, postrm]. These only contained instructions for handling *.info files. Rely on dh_installinit to automagically create these instructions. 2006-11-20 Charlie Zender * Alter documentation rules to not-split * Include ncap2 in debian distribution * Remove compiler-preference list arguments to AC_PROG_CC and AC_PROG_CXX in configure.in. Presence was breaking builds on virga where broken icpc compiler was automatically selected. Henceforth non-default compilers must be specified as environment variables as in configure.eg 2006-11-19 Charlie Zender * Create ncap2 manpage for debian compatibility * Update debian build-dependencies to include antlr * Make missing_value implementation generic and allow compile-time override with Makefile variable cd ~/nco/bld;make USR_TKN='-DNCO_MSS_VAL_SNG=_FillValue';cd - 2006-11-18 Charlie Zender * Warn when _FillValue defined and missing_value not. Fixes TODO nco682 2006-11-16 Charlie Zender * Added new demonstration ncap2 script data/psd_wrf.nco 2006-11-12 Charlie Zender * Update copyright year in man pages * Do not create mpncdiff,mpncea,mpncrcat links when enable_mpi=false 2006-11-10 Charlie Zender * Tweak configure.in to work with pure Debian assumptions * Fix --disable-netcdf4 handling in configure.in * Merged Debian nco_2.9.9-3.diff into upstream sources * Removed UDUnits support from Debian build * Update debian/convert, copyright, prerm, rules, nco.doc-base, postinst * Added udunits.dat for eventual Debian compatibility (a mistake?) 2006-10-24 Charlie Zender * Replace ncap by ncap2 in all benchmarks and in regression tests ncap1 is still used in non-ncap regression tests 2006-10-21 Charlie Zender * Include srd argument in all hyperslab documentation * Fixed parenthetical notation for hyperslab arguments in nco.texi 2006-10-20 Charlie Zender * Die gracefully with HINT rather than segfault with hyperslab limits of form -d dimension, (i.e., dangling comma with no minimum value) 2006-10-19 Charlie Zender * Add hdr_pad documentation to nco_ctl.c, nco.texi as per TODO nco650 2006-10-16 Charlie Zender * Test for find_nc4_file() not nc_check_for_hdf5() in configure.in as per patch from Simon Wood 2006-09-18 Charlie Zender * Confirmed psd.nco works correctly * Add psd.nco, an ncap2 script for particle size distributions * Make ncap2 read 3.14L as float not erroneous int as per C++ 2006-09-15 Charlie Zender * Change ncbo type difference from warning to level 1 info message 2006-09-14 Charlie Zender * Fix ncecat/mpncecat regressions caused by new stride capability 2006-09-12 Charlie Zender * Remove trunc() symbol (which AIX lacks) from ncap2 to simplify AIX builds * Revise stride documentation in nco.texi and usage strings * Stride now works on non-ncks non-record dimensions, fixes TODO nco773 * Set stride = 1 in nco_var_srt_srd_set(), formerly nco_var_srt_zero() * Implement stride in nco_var_val_cpy() 2006-08-31 Charlie Zender * Try not to invoke mpncpdq in regression tests on pbs * Add link to mpirun to $MY_BIN_DIR when building MPI executables with bld/Makefile 2006-08-30 Daniel Wang * Added --mpi_upx option to nco_bm.pl to allow job-scheduler mpi directives like -machinefile 2006-08-26 Charlie Zender * icc/icpc autoconf build/link succeeds but C++ executables segfault 2006-08-25 Charlie Zender * icc improvements to get icpc working * Direct autoconf to build nco_c++ prior to nco++ * pathcc and pathCC now work with autotools 2006-08-24 Charlie Zender * Add pgcc, pathcc support to autotools builds * Only add GCC flags when sure compilers are gcc and g++ * Re-arrange compiler ordering to AC_PROC_CC * Prototype nco_var_lst_crd_xcl() in nco_var_lst.h * Prototype rnd_nbr() in nco_rth_utl.h * Fix cast-qual warnings in newer qsort()-compatible comparison routines nco_cmp_chr() and nco_cmp_int() in nco_lst_utl.c * Eliminate un-utilized variable warnings in nco_ddra(), cnv_ccsm* * Correct OPeNDAP version test in configure.in * Utilize ncap2 incremental operators in ddra.nco * Quiet ncap2 informational messages * Add sdo_utl.cc sdo_utl.hh to libnco++ 2006-08-23 Charlie Zender * Change default to CCACHE=N because ccache interacts so poorly with OpenMP switches during builds * Re-fix NCO_rgr.pm to directly access main:: variables fl_fmt, omp_flg, nco_D_flg, fl_out * Kludge for pgcc compiler to workaround C99 designated initializers Timers should be OK but DDRA answers for ncbo, ncwa should not be trusted with pgcc (or any C++ compiler). 2006-08-22 Charlie Zender * Verified that pathcc OpenMP problems have disappeared and were likely due to ccache inadvertently mixing OpenMP-enabled and dis-abled object code. Must be more careful about that in future. This resolves TODO nco765 and 766 * Add more informative OpenMP diagnostics * Fix OpenMP flag-passing in Makefile for Intel icc compilers 2006-08-14 Charlie Zender * More benchmark cleanup * Fix specialized nco_bm.pl file processing for tms_lng.nc This resolves TODO nco767. 2006-08-10 Charlie Zender * pgcc -c9x currently fails to handle C99 designated initializers * Update PGI compiler options in Makefile 2006-08-01 Charlie Zender * Add stubs for znetcdf support 2006-07-19 Henry Butowsky * First cut of C like it iteration operators * these are +=,-=,*=,/= --,++ (pre & post) * New code checked out OK with valgrind * Need to add code to check that first operand is valid Lvalue -also need some new regression tests to fully test this new feature 2006-07-12 Charlie Zender * Improve, add, clarify, rx examples in nco.texi, in.cdl 2006-07-10 Charlie Zender * Add pathcc/pathCC to MPI handling in bld/Makefile 2006-07-03 Charlie Zender * Clean-up ncra.c file INFO messages 2006-06-30 Charlie Zender * OpenMP with pathcc segfaults with ncra fxm TODO nco764 * Regressions tests pass as expected with native pathcc on ipcc * Change to gettimeofday() to avoid strict Perl errors in NCO_bm.pl * Tweak bld/Makefile to work with pathcc compiler on ipcc.ess.uci.edu 2006-06-26 Charlie Zender * Replace some WARNINGs with less-paranoid INFOs when -A appending 2006-06-22 Charlie Zender * Support AIX runantlr=antlr in Makefile.old for ncap2 on AIX 2006-06-17 Charlie Zender * Add data/ddra.nco to compute DDRA statistics * Add nco++/*.[ch]pp files to repository to bring ncap2 one step closer to users. Still requires many antlr-distribution *.hpp files. * Update MANIFEST, add nco++ entries * Clean up nco_bm file create routine * Rename IPCC_dly_T85 to gcm_T85, sml_stl to stl_sml, skn_lgs to tms_lng 2006-06-12 Charlie Zender * Write initial and final timers to stdout not stderr 2006-06-08 Charlie Zender * Re-release this as 3.1.4 * Always initialize flg_ddra=False in ddra_info Fixes spurious TIMER info on compilers (like xlc) which do not zero data * Re-release this as 3.1.4 * Take mtd timer out of loop in ncra.c and ncecat.c 2006-06-07 Charlie Zender * cvs tag -c nco-3_1_4 Changes since nco-3_1_4: timers, clean/dirty switches * Add timer start and end calls to all operators * Make --clean memory exits default in regression tests * Make --dirty memory exits default in operators * Add cln,drt,mmr_cln,mmr_drt,dirty flags to all operators * Quiet MRV verbosity, stylize TIMER output * Make ddra_info firstprivate() * Add flg_ddra to ddra_info * Change timers to enumerated type * Add metadata portion timer call 2006-06-02 Charlie Zender * Put --disable-shared everywhere for AIX * Add operator-specific speeds to nco_ddra() * Add fractional time diagnostics to nco_ddra() 2006-05-30 Charlie Zender * cvs tag -c nco-3_1_3 Changes since nco-3_1_2: ncap2 attribute propagation, CF coordinates, ncwa -b -B, ncra 0 records * Daniel fixed nco_bm.pl * Document retain-degenerate-dimensions option in nco.texi This finishes TODO nco739 and allows nco738 to be possible 2006-05-29 Charlie Zender * Implement mask_condition as -B and document in nco.texi * retain-degenerate-dimensions implementation works in [mp]ncwa * Update opendap.sh to DAP 3.6 download/build procedures 2006-05-27 Charlie Zender * Improve rx examples in nco.texi * Add flg_rdd hooks to retain degenerate dimensions in ncwa TODO nco739 * Add Q00--Q100 to in.cdl to text regex functionality 2006-05-26 Charlie Zender * Correct regular expressions in nco_bm_hyp.sh * All previous ncwa benchmarks which used variable subsetting on the IPCC dataset were incorrect due to significantly wrong regular expressions in nco_bm_hyp.sh. Incorrect regular expressions did not affect satellite dataset because there were fewer than ten variables. * Correct max variable name for var_4d in nco_bm_hyp.sh * Give wgt_brd_flg correct sign so not miscounted by nco_ddra() 2006-05-24 Charlie Zender * Correct lon attributes in in.cdl 2006-05-22 Charlie Zender * Avoid designated initializers to build ncbo and ncwa in C++ * Add nco.1 man page which Sourceforge caused me to lose 2006-05-20 Charlie Zender * Improve help message in nco_usg_prn() 2006-05-19 Charlie Zender * Return 1 early from nco_omp_ini() on compilers without OpenMP * Put CNV_CCM_CCSM_CF back in nco_var_lst_crd_ass_add(), and add it into nco_var_lst_crd_add(). CF coordinates now handled correctly with -C/-c switches. * Move some nm_id_sct var_lst routines from nco_var_utl.c to nco_var_lst.c * Split CF coordinate convention nco_cnv_cf_crd_add() out of nco_var_lst_ass_crd_add() so it can be called based on other command line switches. * Update documentation to new CVS and ViewCV URLs 2006-05-18 Charlie Zender * Old-style Makefiles now assume ccache is installed on LINUX* builds to speed up compilations. Disable with CCACHE=N 2006-05-16 Charlie Zender * Found bug in libnco_c++: library does incorrectly initializes function parameters which default to CPP macros, e.g., NC_NOERR. These parameters cannot be over-ridden by non-default values. Same problems occurs whether passing rcd_opt as reference or not. Attempting to fix bug by creating named constant with global library visibility. 2006-05-14 Charlie Zender * Master code repository is now on nco.cvs.sf.net Old code at nco.sf.net is a hodgepodge of erratic commits over past week. * Finished hand-merging one week's patches from development on multiple machines due to sourceforge.net outage. Master code is now on ashes. Everything from about 20060506--20060512 was originally "out-of-tree" during outage. 2006-05-13 Charlie Zender * Out-of-sync commits from ashes to new sourceforge repository 006-05-11 Charlie Zender * Fix syntax error in data/Makefile.am so .nc's build correctly * Fix syntax errors in configure.in 2006-05-09 Charlie Zender * Add CF coordinate convention to documentation * Add regression test for CF "coordinate" convention * CF "coordinates" convention is fully implemented * Add C++ directory contents to TAGS source list * CF "coordinates" convention is semi-working 2006-05-08 Charlie Zender * Change in.cdl Conventions from NCAR-CSM to CF-1.0 * Implement nco_cnv_ name convention in ARM routines * Support OPeNDAP on AIX in bld/Makefile 2006-05-07 Charlie Zender * Change from --dbg_lvl=73 to --ddra or --mdl_cmp for computational model = DDRA diagnostic output * Add nco_ddra() to ncbo * Create stand-alone NCO(1) man page * Allow zero-record record variables in nco_var_val_cpy() This should allow copying metadata in most NCOs * Make zero-record record variables always fixed in arithmetic operators This ensures airthmetic loops to not encounter empty variables 2006-05-06 Charlie Zender * Improve warning messages in ncra for size 0 records * Build in_rec_zero.nc from in_rec_zero.cdl in Makefiles 2006-05-04 Charlie Zender * Fix ncks to work with record dimensions of size zero * Added data/in_rec_zero.cdl for torture testing This file contains a record coordinate of length zero 2006-05-02 Charlie Zender * Remove obsolete -Z option from help strings * Get MRV_flg, dmn_avg_nbr, lmn_nbr_avg from nco_var_avg(), use in nco_ddra() 2006-05-01 Charlie Zender * Update configure.in for Cray compatibility 2006-04-30 Charlie Zender * Some cleanup of nco_bm suite * Add missing NCO_bm:: scope to functions in nco_bm.pl * Change from time_t=time() to clock_t=clock() timers * Add observed time to diagnostics * Filter noisy INFO messages in main ncwa loop * Modify DDRA diagnostics to work with long long's = int64 sizes * Add MRV_flg, rnk_avg, and lmn_nbr_avg outputs to nco_var_avg() * Hooked-in call to nco_ddra() with estimates for some inputs Calculations should be more accurate than ddra scripts. 2006-04-29 Charlie Zender * Added nco_ddra() to estimate computation time. Not invoked yet. Still need to functionalize rnk_avg computations. 2006-04-28 Charlie Zender * Change $sz_wgt_blk to $sz_avg_blk in ddra.theory_model.pl * Autoconf-conditions for getpagesize(), getrusage() in nco_mmr.c This should cure build failures on Cray platforms, and make nco_mmr.c bulletproof (though still not perfect) for other esoteric platforms. 2006-04-27 Charlie Zender * Remove superfluous semi-colons from some ncbo/ncflint comments This should fix Solaris builds 2006-04-26 Charlie Zender * Re-order PVM_ARCH compatibility portion of configure.in so it follows not precedes $host definition. This should fix cygwin (and other) build problems introduced in NCO version 3.1.2. 2006-04-25 Charlie Zender * Note in nco_var_cnf_dmn() how to turn off weight re-use 2006-04-21 Charlie Zender * cvs tag -c nco-3_1_2 Changes since nco-3_1_1: packed data fixed, ncap2 in configure, ncra/ncea/ncwa behavior * Change documentation to reflect new ncra/ncea/ncwa behavior * Add new ncra/ncea/ncwa regression tests to verify this * Change ncra/ncea/ncwa to always average coordinate variables 2006-04-14 Charlie Zender * Constify srd in nc_put/get_varm() calls and prototypes * Correct type of srd in nc_put/get_vars() calls and prototypes * Add put_vars() routines to nco_netcdf.[c/h] for completeness 2006-04-13 Henry Butowsky * The first iteration of hyperslabing in ncap2 * Can hyperslab on LHS with scalar on RHS eg time(5:9)=.4; or var on RHS. * Can also hyperslab on RHS eg three_dmn_var(1,,)=three_dmn_var(9,,); 2006-04-06 Charlie Zender * Change bool's to nco_bool's in nco.h 2006-03-17 Charlie Zender * Un-botch ncatted regression test, fixing TODO nco691 * NECSX does not support getpagesize() in nco_mmr.c 2006-03-17 Harry Mangalam * spiffin' config/make to bypass nco++ politely if antlr not available also now forces regeneration of hpp files - 1st .cc file triggers rebuild. Builds (or doesn't) on a clean checkout. * 'make install' installs ncap2 to bindir if it's built. * mod configure to skip nco++ if trying to build for MPI (nco++ fails on the MPI build - a concern at this point?) * autoconf/automake patches to allow nco++ and MPI to co-exist and mods to allow MPI regressions and benchmarks to (mostly) work. 2006-03-15 Henry Butowsky * Fix NUMBER lexer. Can now lex number like 23. or 111. etc * Fix NcapVar.hh -- Code was crashing when var->nm was set equal to s_va_nm * Start code for slab indices added lmt_peek() & lmt_init() to ncoTree.hpp 2006-03-14 Harry Mangalam * nco++ dir now works with autoconf/automake, altho only tested with simple cases (only gcc/g++ compilers, etc). Original Makefile renamed to Makefile.old. Tested under --enable-nco++=yes (default) & --enable-nco++=no. Added more logic as per CZ request on 3.15 - now checks for runantlr, libantlr, antlr headers, 2006-03-13 Harry Mangalam * all but 1 benchmark work server-side. When trying to execute the ncrcat bench, the serverside fails when doing the ncwa command. It uses a very large amount of mem (~1.3G when it dies - de to an apache limitation?) Daniel and I are giving up for now - marked as TODO 692. * failing regressions tested and some resolved to bad handling by benchmark script. Remaining ones are marked in the failure message. Only new one is TODO691 - looks like a problem with ncatted returning mysteriously null values. Total of 3 regressions failing - 2 ncap, 1 ncatted. 2006-03-09 Harry Mangalam * namespace cleanup on benchmark code and added rc capability to the code, first capability just records whether users said yes to send UDP data and then uses that answer to bypass the question from then on. Other info can be added in NAME=VALUE pairs and the detection routine reads them all into a global hash %NCO_RC that can be used to set various things. 2006-03-09 Charlie Zender * Added regression test to make sure nco686 stays fixed. * Re-work nco_mss_val_cnf() to handle all cases of var1 and var2 having/not having missing values. Fixes TODO nco686. Probably fixed analogous latent bug in ncflint. * Remove bogus const prototype on return value of nco_typ_fmt_sng() Apparently gcc 4.0.3 actually pays attention to intended const-ness of return values in these situations * Fix TODO nco687 so unequal missing values are formatted correctly in warning messages. This should help debug nco686. 2006-03-09 Harry Mangalam * nco_bm_benchmarks.pl converted to NCO_benchmarks.pm with a good bit of namespace cleanup. There are still some inexplicable explicit declarations that are needed but only about 2-3. * both benchmark and regression code support both serverside and clientside execution. There are still some remaining conflicts, but most benchmarks and most regressions run identically. * the go() routine was rewritten to be a bit more coherent. Again, there is a bit more cleanup to do, but it's time to get it into cvs * Daniel's ss code changes have tracked the benchmarking code, so both sides work with each other. There are some unfortuneately primitive hacks to get them working together, but while it's ugly (perl writes data to file and executes python to pick it up, it's simpler than bringing swig into the picture. 2006-02-25 Charlie Zender * Hunt for double-free() in ncap, cleanup var_ycc-related operations 2006-02-20 Charlie Zender * Change more internal bool's to nco_bool's so g++ builds libnco.a (again) 2006-02-19 Charlie Zender * Re-arrange packing/unpacking documentation to describe default handling by arithmetic operators. 2006-02-18 Charlie Zender * Add tst target to ncap2 Makefile * Verified regression test results unaltered * Change argument bool's to nco_bool's throughout libnco and frontends NB: I may have missed non-front-end bools in libnco. * ncap2 now compiles, links, and runs when libnco built with g++ * Change ncap2 argument bool's to nco_bool's which are typedef's to int's 2006-02-17 Charlie Zender * ncap2 compiles, links, and fails when libnco built with gcc * ncap2 compiles, links, and runs when libnco built with g++ * Change to int yywrap() from bool yywrap() to work with g++ * Begin to clean up libnco++ usage/headers * Add libnco++.hh to store all libnco++ headers * Add ncap2 target to bld/Makefile for convenience * Re-make libnco (when necessary) before linking ncap2 * Add ncap2 to prg_prs() * Add doc/ncap2.in to test ncap2 * ncap2 builds within tree now! * Add udunits libraries, remove dat target 2006-02-16 Harry Mangalam * Corrected BM code to account for error strings being eval'ed as 0 when compared as numeric and a number of other error-checking improvements. 2006-02-16 Charlie Zender * This fixes TODOs nco672, nco673, nco402 * Modify regression test to expect packed fixed data * Check is_var_fix flags in nco_var_dfn() to handle packed fixed data * Add is_var_fix to var_sct so nco_var_dfn() can use it to identify variables to pass through packed straight to output 2006-02-15 Charlie Zender * Same problem exists with all other non-processed data. TODO nco673. * Add test whether non-record data is unpacked in ncra output file. ncra currently fails this test. Reported by Martin Dix. TODO nco672. 2006-02-14 Charlie Zender * Temporarily add ncap2 object files directly to link line 2006-02-07 Charlie Zender * Remove redundant antlr actions. Add -lnco to LDFLAGS. 2006-02-06 Charlie Zender * Fix nco++ library definition 2006-02-03 Charlie Zender * Move Henry's Makefile to Makefile.orig and Makefile.old to Makefile * nco++ build mechanism appears to work. Dies in VarOp.hh due to syntax error. Not understood yet. 2006-02-02 Charlie Zender * Progress on build mechanism but nothing working * Avoid name clashes between nco++ and nco code by changing file names from ncap* to ncap2* 2006-01-31 Charlie Zender * Created nco++/Makefile.old from nco_c++/Makefile.old Made progress toward in-tree nco++ build 2006-01-30 Charlie Zender * cvs tag -c nco-3_1_1 Changes since nco-3_1_0: C++ builds work again, ssdap, nco++, 4.0-alpha11-compatible * Changed copyright to 2006 * Daniel added server side extensions to ssdap * nco++ still has Henry's hardcoded paths---will fix in nco-3_1_1 * Committed Henry's C++ ncap2 antlr-based code to nco++ 2006-01-20 Charlie Zender * Verified regular NCO builds with gcc-4.0.3 on dapper drake dirt * netcdf 4.0-alpha11 (still) fails regression tests as per TODO nco658 * Make nco_lbr_vrs_prn() work with netcdf 4.0-alpha11-style values * Added integration example to ncwa in manual 2006-01-04 Harry Mangalam * Fixes to the BM code to force the retrieval of DAP-requested files and a variable ($prsrv_fl) to allow a regression test to maintain files if a previously downloaded file is needed for a successive test. * noted in the TODO as well, but there is a difference between the opendap code running on sand (which passes all server-side regression tests) and the code running on hiperstore, which fails a number of them, many with OpenDAP errors emitted from the lib. Still figuring this out. * mods to nco_fl_utl.c: in nco_fl_mk_lcl() to make ncatted and ncrename fail gracefully when asked to DAP-retrieve a file on which to operate. 2005-12-29 Charlie Zender * Add xbitmap icon to homepage 2005-12-19 Harry Mangalam * mod bm code to make a new dir for dap data and explicitly delete everything in it for each new DAP test to force the network transfer. 2005-12-13 Charlie Zender * Modify `make test` to automatically run regression test * Remove old nco_tst.pl references from Makefile.am `make test` * Fix yyunput argument type in ncap_lex.l * Reference prs_sct in yyerror to fix CEWI with g++ -Werror 2005-12-11 Charlie Zender * C++-compatibility tweaks to nco_lmt.c, nco_omp.c, and configure.in Current code causes g++ ICE TODO nco662 2005-12-09 Charlie Zender * Strip -std=c99 from CC and CFLAGS if CC is gcc* in order to support to support using CC=g++ within configure. Ditto for -Wmissing-prototypes, and analogous procedures for xlC* and icpc*. 2005-12-08 Harry Mangalam * fixed passive/active ftp problem exhibited on soot by making 'ftp' explicitly '/usr/bin/ftp' (it was a kerberos'ed ftp on soot for some reason - /usr/kerberos/bin/ftp). For linux and esmf, the system ftp supports passive ftp (-p flag). The kerberos ftp supports it as well but not as a flag which casued problems in the 'here' script. 2005-12-05 Charlie Zender * Today's modifications allow G++ to build NCO limited by make non_ncap UDUNITS=N This NCO passes all regression tests ncap and UDUNITS linkage remain C++ problems and prevent closing TODO nco656 * Hacked nco_malloc_*() to remove errno references with G++ Presence triggers G++ error: undefined reference to `__errno_location()' This is TODO nco659 * Set #define YYDEBUG 0 in ncap_yacc.y so C++ compiles ncap_yacc.c * Fix type conversions in nco_mss_val_cnf() This fixed a latent bug that was probably never expressed * Explicitly coerce pointers in implicit conversions to make C++ happy in nco_cmp_chr(), nco_cmp_int(), ncpdq.c * Correct const-ness of string list arguments with prototypes in nco_prs_rnm_lst(), nco_fl_nm_prs() * Add doc/netcdf4.sh to install latest netcdf4 and HDF libraries for NCO 2005-12-02 Charlie Zender * cvs tag -c nco-3_1_0 Changes since nco-3_0_3: MPI ZKB, configure netcdf4/mpi, ncwa MRV, ncap rnd_nbr(), netcdf4-alpha10 * Preparing for NCO 3.1.0 release 2005-11-30 Harry Mangalam * Changed ncap.c to allow MACOSX to use erf, erfc, gamma * changed configure.in to accept a more flexible OS/arch string to be able to set AMD64 (reason for previous failing the erf() tests in ncap). * changed the ncap benchmark scripts to correct syntax errors and change dimensions to correspond to the casting dimension order. 2005-11-29 Charlie Zender * bld/Makefile accepts FL_FMT for netCDF4 testing 2005-11-29 Harry Mangalam * Changed configure.in to use NETCDF4_ROOT rather than renaming to libnetcdf4. 2005-11-28 Charlie Zender * Remove nco_open_par() again. Seems to require parallel mode in netCDF4 configure to appear in library, possible hardware dependency 2005-11-28 Harry Mangalam * Spiffing configure/makefiles to make sure that netcdf4 works as expected; adding dependencies into configure rather than requiring the full set to be run at the commandline. Still a question about the specification tho (--fl_fmt vs --netcdf4). 2005-11-26 Charlie Zender * Test for averaging dimensions being MRV dimensions 2005-11-25 Charlie Zender * Change "long missing_value" to "nco_int missing_value" 2005-11-23 Charlie Zender * Place operation count stanzas in expensive routines for paper: nco_var_cnf_dmn(), nco_var_avg() 2005-11-19 Charlie Zender * Synchronize with netCDF4 alpha10, verified passes regression tests * Expose new types in attribute function calls * Change _int64/_uint64 to _longlong/_ulonglong in function names * Change NC_STRICT_NC3 to NC_CLASSIC_MODEL 2005-11-15 Charlie Zender * Added cheesy random number generator function rnd_nbr() to ncap ncap -O -v -s 'x=rnd_nbr(lat)' ~/nco/data/in.nc ~/foo.nc;ncks ~/foo.nc for generating fake data. Search source for TODO nco652 and improve! 2005-11-14 Harry Mangalam * retired following TODOs bld68. hjm Verify configure with minimal options works with MACOSX bld53. hjm Add --fl_fmt option to nco_bm.pl (see ncks.c for fl_fmt values) bld62. hjm Make regressions fail when input file not created but re-used from previous test etc bld71. hjm Mac OS X: remove false positive regressions in ncwa (cut?) bld72. hjm nco_bm: ensure "foo" (intermediate files) accessed locally not over DAP bld46. Is DAP_ROOT (or DODS_ROOT) an obsolete variable in DAP 3.5+? if so obsolete it 2005-11-14 Harry Mangalam * corrected Benchmark code for opendap access. 2005-11-11 Harry Mangalam * fixed net tests to test only returned value, not entire msg * Added UDP reporting query to regression and benchmark runs if users explicitly agree, to capture failures in regressiions automatically for better profiling. Queries users if they will allow data to be returned UNLESS the --udpreport is already set * Changes to Makefile.am in src/nco to enable MPI binaries to be built. * Notes about problems with old aclocal, automake posted have to assure that new versions are manually updated in *ubuntu anyway. * back on track with updating Makefiles the right way(c) * updated MANIFEST to include new bm scripts and the breakup of nco_bm.pl. 2005-11-09 Charlie Zender * Omit -lstdc++ from AIX xl* DAP builds * Add CVS Header and -*-makefile-*- to all Makefile.am's This automatically invokes Emacs Makefile-mode syntax/highlighting 2005-10-31 Harry Mangalam * Changes to mk_bm_plots to scriptify the last of CZ's requests * Changes to configure/make to straighten out build protocols for netcdf4 (NETCDF4_ROOT to be defined, needs to be named libnetcdf4, not libnetcdf). Automatic paths for -I, -L based on the NETCDF4_ROOT) 2005-10-28 Harry Mangalam * Changes to the configure/make chain to start to resolve autobuild issues with MPI / netcdf4 / DAP / etc * now builds serial NCOs cleanly on Linux (x86,AMD64) and also MPI on Linux (x86,AMD64). Suports Rich Lowry's mpich2 debs (no additional flags) and MPICH2 from src if given MPICH_ROOT. * added checks for -lf95, more error checking 2005-10-27 Charlie Zender * Tried ncwa memory free()'ing technique to avoid freeing dangling pointers in mpncra/mpncea. Does not fix hanging processes. 2005-10-26 Charlie Zender * More unused prototyping of MPI-IO access code. Implementing calls in mpncecat.c for testing, and wrappers in nco_netcdf.c 2005-10-25 Charlie Zender * Support pnetCDF in bld/Makefile * Deprecate nco_fl_typ (never-used) from nco_netcdf.c wrappers * Add ncompi_open(), first pnetCDF interface wrapper 2005-10-25 Harry Mangalam * Changes to support MacOSX better: - configure detects Darwin and inserts -fno-common - bits added to configure.eg to describe other dependencies of this flag for libnetcdf (3.x) - nco_bm.pl detects Darwin and tests for bad cut. 2005-10-24 Daniel Wang * Implement barrier in mpncra.c, which should fix TODO nco593. 2005-10-24 Charlie Zender * Initialize var->nc_id in ncpdq. Fixes TODO nco638. * Initialize dangling in_id in ncra, ncwa. Fixes TODO nco637. * Support netCDF4 NC_UBYTE,NC_USHORT,NC_UINT,NC_INT64,NC_UINT64 in nco_netcdf.c wrapper functions for libnetcdf.a library * Support netCDF4 NC_UBYTE,NC_USHORT,NC_UINT,NC_INT64,NC_UINT64 in metadata and some structures. Still need to add read/write and conversion/promotion functions. 2005-10-22 Charlie Zender * Eliminate small [mp]ncra leak with -Y pseudonym * Fixed all known bugs with parallelization over in_id MPI (except for known problems) and MPI_FAKE regression tests all passed This resolves TODO nco611 and is opportune time to re-benchmark SMP to check for any performance boost due to parallelization over in_id * #ifdef ENABLE_MPI spinlock -S switch so MPI_FAKE executables build * Finished re-parallelization of front-ends over in_id SMP operators appear to work, pass all tests on soot and ESMF 2005-10-21 Harry Mangalam * configure[.in], Makefile[.in], src/nco/Makefile[.in] in good enough shape to commit. Still some shakiness, but time to check clean checkouts on other platforms. Now supports --enable-mpi, --enable-netcdf4 * configure supports MacOSX build (detects OSX and deletes POSIX flag). 2005-10-21 Charlie Zender * Clean up old aborted attempt to parallelize ncecat over files * Verfied that parallelizing use of in_id in SMP code allows parallel read access to file data with nco_get_var*() in ncra. Hence, removed last critical read region from libnco.a SMP on other (non-ncra) operators temporarily broken until I parallelize their front end use of in_id. * Re-wrote nco_omp_ini() logic to use stubs outside of #ifdefs Now UP and SMP execute virtually same code in nco_omp_ini() * Prototype and declare OpenMP stub functions in nco_omp.c/h 2005-10-20 Charlie Zender * Replaced many instances of var->nc_id with function parameter nc_id to possible parallelization over nc_id in calling routine. Most code was already written this way. * Realized that TODO nco28 is bogus and deleted it: "Use var.nc_id as file ID from now on and rewrite old routines to do so" Bad idea because it would prevent parallelizing over nc_id in SMP code * Improve warning message for non-monotonicity in rec_crd_chk() to better distinguish inter-file from intra-file non-monotonicity. 2005-10-19 Charlie Zender * Mark all routines containing nco_put_var*() calls as OpenMP critical regions. Most nco_put_var*() calls occur in top level routines and were already enclosed in critical regions. Routines newly marked tended to be "under the radar" exceptions present only in programs which were not parallelized (e.g., ncks). These include: nco_cpy_var_val_mlt_lmt(), However, at least one routine, arm_time_install(), contained a write statement which I had forgotten all about. * Mark all routines containing nco_get_var*() calls as potential OpenMP critical regions (they are critical when called with identical nc_id's). These include: arm_base_time_get(), nco_cnv_ccm_ccsm_cf_date(), nco_prn_var_val_lmt(), nco_msa_rec_calc(), nco_var_get() * Mark nco_var_mtd_refresh() as non-OpenMP Critical Based on discussions with Unidata, metadata access (as opposed to data access) is thread-safe because all metadata is cached when file is opened. 2005-10-17 Harry Mangalam * Updated index.shtml to include Benchmark info 2005-10-16 Charlie Zender * Verify netcdf4 features work on Ubuntu AMD64 (sand) and Libranet x86 (elnino) 2005-10-14 Charlie Zender * Alphabetize lists in Makefile.am * Add nco_mpi.h to HEADER_SOURCE in Makefile.am 2005-10-13 Charlie Zender * Re-working SMP code to open files in parallel mode * Update MANIFEST * Attempt to add -U_POSIX_SOURCE token to MACOSX in configure build * Change MACOSX to include sys/time.h rather than time.h so that struct timeval is defined before use in struct rusage 2005-10-12 Charlie Zender * Insert stub for MPI documentation * Finish netCDF4 documentation in manual * Commit netCDF4 output support for all operators New options -4,--4,--64bit,--fl_fmt,--netcdf4 control file format * ncks: Eliminate --fmt,--format synonyms to avoid netCDF4 confusion Change --sng to --sng_fmt 2005-10-12 Harry Mangalam * added --enable-netcdf4 to configure, configure.in to find the bits necessary (libhdf5, libhdf_hl) to build the netcdf4 version of NCOs (TODO bld52) * mods to mk_bm_plot.pl to zero time axis (TODO bld56), compute regression and place on plots (TODO bld57), 2005-10-08 Charlie Zender * netCDF4 causes a regression in ncpdq packing/unpacking TODO nco615 2005-10-07 Charlie Zender * Remove USE_FORTRAN_ARITHMETIC from bld/Makefile * Support netCDF4 in bld/Makefile * nco_create_mode_prs() interprets user-specified file format * nco_create_mode_mrg() merges clobber mode with user-specified file format 2005-10-06 Charlie Zender * Add netCDF4 file writing capability to ncks Compatibility tokens are in nco.h so netCDF3 libraries do not complain * Change NETCDF4 to ENABLE_NETCDF4 2005-10-03 Charlie Zender * Add hooks to move ncra.c threading to embrace file opens 2005-09-30 Daniel Wang * Branch mpncra.c to reorganize and understand nco593 2005-09-29 Charlie Zender * Clean up mpncra.c by removing barriers, adding comments * Remove superfluous close/open fl_in for MPI mpncra/mpncrcat/mpncea 2005-09-28 Harry Mangalam * Added --dust_user to allow setting a user that can log into dust for testing (hmangalm@esmf -> hjm@dust) * Fixed file tests broken in nco_bm.pl re-org. * Fixed udp reporting as per ditto. 2005-09-27 Charlie Zender * Implement static executable option to bld/Makefile with STC=Y 2005-09-25 Charlie Zender * Move final worker open/close calls to with ncra/ncea block * Change NC_WRITE to NC_WRITE|NC_SHARE in MPI codes 2005-09-24 Charlie Zender * Include Daniel's signal suspend code (-S switch) in mpncra * Use nco_set_fill() prior to each worker write 2005-09-23 Charlie Zender * Remove nco_tst.pl from distribution 2005-09-23 Harry Mangalam * Check for IP#/hostname conflicts, LAM/lamd, and MPICH/mpd in nco_bm.pl to help debug MPI errors. 2005-09-22 Charlie Zender * Change remaining NCAR_CCSM references to CCM_CCSM_CF 2005-09-21 Charlie Zender * Filter garbage files from bld/Makefile tags target * Tokenize/variable-ize various static MPI-related constants This is intended to improved readability and literate programming-ness Replaced naked constants with following compile-time tokens/enums: mgr_id,WORK_ALLOC,WORK_REQUEST,TOKEN_ALLOC,TOKEN_REQUEST,TOKEN_RESULT, NO_MORE_WORK,TOKEN_WAIT,TOKEN_ALLOC * Create new header nco_mpi.h for all MPI-specific header information Currently this header is only accessed by main() MPI programs Hence it is not (yet) part of libnco.a Header assumes its inclusion is already conditional on ENABLE_MPI This is currently a header mostly for pre-processor tokens with few odd file scope constants needed by MPI routines There are no functions yet Adding functions would require creating a corresponding *.c file Adding *.c file requires including it in libnco.a or separately linking MPI executables to it, i.e., slightly complicating the build procedure. I'm not yet sure I want _any_ MPI link dependencies in libnco.a Cross-platform link weirdness (e.g., AIX) makes this something to avoid as long as possible 2005-09-20 Harry Mangalam * added --xdata to nco_bm.pl to allow commandline data path to be entered (to allow benchmarking on different filesystems without resetting DATA env var). 2005-09-18 Charlie Zender * Tweak ncatted expected answer to pass hdr_pad test with new nco_bm.pl * Hack nco_bm* to pass thr_nbr,omp_flg,nco_D_flg * Re-remove prohibition on mpi_prc and thr_nbr simultaneously defined * Add mpi_fake_cp target to overwrite nc* with mpnc* (for AIX tests) * SMP mpncwa fails regression test 4 when thr_nbr > 1. TODO nco604. * All SMP mpnc*.c codes now compile cleanly * Fix SMP mpncpdq TODO nco598 by calling nco_close() once not twice 2005-09-17 Charlie Zender * SMP mpncpdq fails ncpdq regression test 4. This is TODO nco598. * Add mpi_cln target to bld/Makefile to remove MPI executables This makes it simple to build/erase all MPI_FAKE executables * Yesterday's MPI_FAKE mpncea fix broke MPI mpncea regression test 1 Today's fix works with SMP and MPI mpncea/mpncra/mpncrcat Testing shows this fix does nothing about ncrcat hanging TODO nco593 * Add $HOME/nco/bm to Perl @INC so nco_bm.pl runs from directories (e.g., bld) from which bm is ../bm * Verify icc 9.0-compiled NCO works in UP/SMP/MPI modes * Add '/' to $prefix so nco_bm.pl works when executables in $MY_BIN_DIR NB: nco_bm.pl does not run for me unless $MY_BIN_DIR is defined Probably same for other bld/Makefile users. 2005-09-16 Harry Mangalam * added --mpi_fake (aka -mpi_fke aka --fake_mpi) to allow running of the mpi executables as single processes. Since my laptop cannnot yet generate valid MPI apps, I can't tell what the real reulst of running them is but the commandlines look right. 2005-09-16 Charlie Zender * Move mpncra.c nco_var_srt_zero() from MPI to common code so UP/SMP executables zero start vectors. Fixes mpncea bug TODO nco594. 2005-09-16 Harry Mangalam * Re-org of regression and benchmarking script. nco_bm.pl has been broken into 5 files: - nco_bm.pl - now does initialization and calls control scripts for benchmarking and regression - NCO_bm.pm - a Perl module that contains most of the functions except the regression tests. - NCO_rgr.pm - a Perl Module that contains only the regression tests to isolate them and make it easier to find the right one. - nco_bm_benchmarks.pl - the code chunk which is do-included that contains all the benchmark code. - nco_bm_md5wc_tbl.pl - the code chunk that contains all the md5 & wc checksums. (currently NOT working - see below) * the error/debug messages have been cleaned up considerably and now are pumped out (mostly) at the end of each test if asked for. * a LOT of cruft was stripped out. There was quite a bit of duplicate code, commented out code, code that didn't seem to be perl code. It's not all gone, but a lot of it is. * the only thing that definitely does not work at this point is the MD5 checking due to some particulary hairy namespace problems. * the MPI versions of the checks have not been tested yet either, altho the commandlines it generates are correct. * I belive it is up to date with the latest regression tests and benchmarks. The relevant bits were diffed against the current code and they appear to be in sync. 2005-09-15 Charlie Zender * Port ncwa 20050608 bugfix for DO_CONFORM_[MSK,WGT] to mpncwa * mpncea hangs on ncea regression test 4 (on sand with LAM) TODO nco597 * Use fake end scopes to correct Emacs indentation in mpncra.c, mpncpdq.c * Test all FAKE_MPI mpnc* operators in place of nc* counterparts FAKE_MPI mpncea fails one test (TODO nco594) (regardless of thr_nbr) * Implement/fix OpenMP in MPI_FAKE portions of all mpnc*.c codes * Use icc ncecat bld/Makefile compilation fix for mpicc too * Use nco_mpi_get() to return MPI implementation information Invoke with undocumented ncks --mpi switch This (unwisely?) introduces mpi.h into libnco.a via nco_ctl.h Formerly, mpi.h only appeared in front-end codes Still no MPI _calls_ are in libnco.a, just header information * Allow MPI and OpenMP to both be true Now MPI_FAKE tests OpenMP so that MPI_FAKE operators are plug-compatible replacements for UP/SMP operators. No code actually takes advantage hybrid MPI/OMP since the MPI and OpenMP implementations are currently orthogonal in mpnc*.c level. This may change if benchmarks uncover good reasons to hybridize * Accomodate LAM MPI environment No difference between regressions with LAM and with MPICH2 2005-09-14 Charlie Zender * Remaining MPI bugs do not appear to be NCO-caused memory problems * valgrind.txt suppressions are complete for default MPI configurations on ashes (mpich2, valgrind 2.2, gcc 4.0.0) and elnino (mpich2, valgrind 3.0.1, icc 8.1) * Make LAST_RECORD shared in OpenMP portion of mpncra.c * ncea regression test 3 is bizarre: ncea and MPI mpncea pass it, MPI_FAKE mpncea fails it. This is TODO nco594. * Verify UP and SMP mpncra execute successfully while MPI mpncra still hangs just before writing output file * Clean up mpncra.c to build cleanly with MPI_FAKE * Fix mpncecat (same ole' strlen(fl_out_tmp) bug) * Change all valgrind suppressions examples to use ${HOME}/nco/doc/valgrind.txt, a direct copy of ${HOME}/c++/valgrind.txt * New MPICC, MPICXX logic in Makefile simplifies OS-specific sections AIX MPI builds must be done from scratch, i.e., make cln;make MPI=Y AIX MPI builds break non-MPI operators Hence a complete set of AIX executables requires two makes * Add valgrind suppressions for MPICH2 to ~/c++/valgrind.txt With these suppressed, valgrind finds no NCO-caused leaks in mpncbo MPID_* appears to cause a few harmless leaks * Move nco_free(cmd_ln) from master processor code to NCO-generic memory clean-up to avoid small leak in MPI'd operators * Regression test shows mpncbo commutivity modifications work! Same two-file framework should be implemented in ncflint/mpncflint * Only allow master MPI process to strlen(fl_out_tmp) This fixes nasty regressions which I introduced into Gayathri's codes Still need to understand why it caused the bug in the first place 2005-09-13 Charlie Zender * Move TOKEN_FREE=True to after nco_close() after nco_var_val_cpy() * Declare all MPI-specific variables in one place in mpncbo.c This removes all warnings when spoofing MPI with MPI_FAKE * Clean up bld/Makefile header * Rename FAKE_MPI switch to MPI_FAKE in bld/Makefile 2005-09-12 Charlie Zender * Change $caseid and $xpt_dsc to traditional meanings in nco_bm.pl * Add MPI CMD_LN's to nco_bm.sh for MPI regressions/bm's in loadleveler * Change pvmgetarch location from ~/bin/sh to ~/sh everywhere 2005-09-11 Charlie Zender * Update bld/Makefile to work with MPICH2 rather than MPICH * Add doc/mpi.txt to document MPI environments for NCO 2005-09-10 Charlie Zender * Pruned chapter/section/node titles * Found that many/most MPI tests complete successfully on soot (fedora) MPI failures on debian may be temporary/unreliable Documented different test results in MPI section of TODO * Committed recent mpncbo.c commutivity changes 2005-09-09 Charlie Zender * Complete and clean-up NCO MPI synonyms in prg_prs() 2005-09-08 Charlie Zender * Change CPP consistently with CC for Linux MPI compiles This ensures CPP finds mpi.h's hidden in strange directories * Add FAKE_MPI switch to compile MPI executables without MPI * Fix sundry compiler warnings with MPI front end codes * Port ncbo commutivity changes to mpncbo.c Resulting SPMD executable mpncbo hangs where previous mpncbo works Refrain from committing new mpncbo.c until it works 2005-09-07 Charlie Zender * Add ncrcat to regression test. Test chosen hangs with MPI. * Make mpncra regression first ncra test for faster failure * Change sftp regression test to succeed by breaking into two steps so that automatic sftp "Fetching..." string does not confuse tester * Allow mpncbo regression test to fail TODO 579 2005-09-06 Charlie Zender * mpncra.c: Correct printf arguments for type * Change bld/Makefile MPI handling so CFLAGS gets used 2005-08-22 Charlie Zender * cvs tag -c nco-3_0_2 Changes since nco-3_0_1: icc, OPeNDAP, ftp, sftp, .netrc, hdr_pad, cf, bm for MPI + OPeNDAP * Plug two small leaks in ncks when printing and fl_out=NULL * Plug double-free() error when fl_out=NULL in ncatted Double-free() errors cause operator failure on Fedora, which has a security-hardened glibc. Hence this was probably an unreported headache for many Fedora NCO users since 3.0.0 or 3.0.1. Recommend they upgrade and this spurs release of 3.0.2. * Add regression tests for ncatted mss_val and hdr_pad features * Remove duplicate nc_enddef() from ncatted and ncrename 2005-08-19 Charlie Zender * ncbo status: Works better than ever as far as I can tell. Now it: 1. Correctly handles cases where input variable orders are different 2. Correctly diagnoses (and attempts to broadcast) mis-matched dimensions 3. Can serve as template for similar [mp]ncflint re-write (TODO 578) 4. Improved logic needs to be merged into mpncbo.c so mpncbo passes (currently deprecated) regression test ncbo #8 (TODO 579). 5. Works well when nbr_var_fix_1>nbr_var_fix_2 so long as discrepant variables are type fix not type prc but needs list merge to work when nbr_var_fix_1 rank(var_2), not rank(var_2) > rank(var_1) Pre-compute broadcast size before var_def(out_id,var_out) (TODO 552) * Completely fixes TODO 550. Serial NCO regression test is spotless again. * Plug memory leak caused by ncbo two list re-write 2005-08-19 Harry Mangalam * Mods to nco_bm.pl to include but skip flaky mpi versions of ncpdq ncra * added alias line to accept mpncra 2005-08-19 Charlie Zender * Invert order of operands given to nco_var_sbt() by ncbo This fixes numerics of ncbo regression TODO 550 However, operand order to nco_var_[sbt,dvd,...] is non-intuitive and should be reversed NCO-wide in the future (now TODO 576) 2005-08-18 Charlie Zender * Add SFTP and .netrc-based password-protected FTP (to ESG) regression tests * Add stub for wget-based regression test * Fix ncbo regression to fail for right reason * Re-work nco_bm.pl net tests to all (potentially) pass for anyone 2005-08-17 Harry Mangalam * Add MPI bits to nco_bm.pl to test the MPI'ed operators. 2005-08-17 Charlie Zender * Add MPI_PRC option for bld/Makefile to pass through to nco_bm.pl * Add --hdr_pad/--header_pad options to ncatted and ncrename * Document --hdr/--header options 2005-08-14 Charlie Zender * Implement --hdr/--header options to ncks with nco__enddef() * Add hooks for output file-mode specification to ncks.c This may break compatibility with netCDF nersion 3.5.x and hence OPeNDAP Currently shrouded by #ifdef NETCDF4 tokens 2005-08-12 Harry Mangalam * small mods to nco_bm.pl to track diff in wall vs (sys+user) to get idea of how much time is lost to I/O (theoretically) 2005-08-13 Charlie Zender * Finished ncbo heart transplant: Symmetric subtraction still not working Regression tests appears to be no worse than before (ncbo causes 2 fails) Valgrind indicates new code is leak-proof except for one double-free() caused by ncap_var_cnf_dmn() Code appears to be commit-able since it's cleaner and extensible * Extended dual list method into heart of ncbo Saved last known working version as ~/ncbo.last_known_working.c * Change NCAR_CCSM_FORMAT to CNV_CCM_CCSM_CF, ARM_FORMAT to CNV_ARM 2005-08-11 Charlie Zender * Implement -Z/--64-bit-offset switch in ncatted and ncrename * Deprecate ctime_r() code from ncatted, put it (deprecated) into ncra * Add -4, --hdf, --netcdf4 switches to request HDF storage format 2005-08-08 Harry Mangalam * change nco_fl_utl.c to use passive ftp rather than active (many ftp servers no longer work with active requests) * change nco_bm.pl to do net tests (except for those requiring a specific login or location). Tests ftp (see 1st change) and DODS if compiled with DODS/DAP. 2005-08-08 Harry Mangalam * final updates to nco_bm.pl for testing DAP (reduced number of files requested under DAP (also becasue of bug in DAP that refuses > 30 files at once in some cases. * changed Makefile.in to work with 'make test' & 'make devtest' 2005-08-05 Harry Mangalam * cleaned out refs to '-n' in ncflint.c (doesn't support it) * major mods to nco_bm.pl to add DODS support to testing * may be a bug in DODS server code that doesn't allow >30 files in one session - posted. 2005-08-03 Charlie Zender * Added msk_* to ncbo's do not touch list for CF 2005-08-02 Charlie Zender * Added area, lat_bnds, lon_bnds to ncbo's do not touch list for CF * Re-wrote Conventions section in terms of CF rather than CCSM 2005-07-25 Charlie Zender * Re-coded so NCO uses .netrc, if present, only when .netrc is read-able and contains remote host name. Anonymous FTP is automatically invoked if .netrc does exist or does not contain remote host name. Henceforth NCO access to password protected FTP sites (like ESG) is scriptable! * FTP uses .netrc, if present, in all cases instead of anonymous FTP This essentially breaks anonymous FTP 2005-07-22 Charlie Zender * Finished SFTP support in nco_fl_mk_lcl() Syntax is sftp://hostname:/filename Updated manual accordingly * Add Gayathri's latest mpncra.c to distribution and Makefile 2005-07-21 Charlie Zender * Change test1.sh to use CWD ncks so cygwin works We should deprecate the FTP and DODS tests and move to nco_bm.pl 2005-07-18 Charlie Zender * Add .netrc information to FTP description in manual * Add hooks for sftp support in nco_fl_utl() * Improve OPeNDAP examples in manual 2005-07-15 Harry Mangalam * Change UDP log format from nco_bm.pl to make for better parsing * Add new script to bm dir (mk_bm_plots.pl) to convert UDP data to postscript plots for each operator (currently wall, real, sys, user time) but can add output of rusage if it looks useful as well. 2005-07-14 Charlie Zender * MPI NCO with icc 9.0 appears to work on dual Opterons! * OpenMP NCO with icc 9.0 passes regression tests on dual Opterons! * Change nco_mmr_typ to enumerated type to fix icc warning on Opteron * Put more icc flags in configure.in * MPI NCO with icc 8.1 successfully compiles and execute on Fedora It failed to execute with message "lamd not running" until "lamboot" command was executed first to setup LAM/MPI environment. Debian machines need no such initial setup. After logging out and in once, MPI NCO ran fine without having to run lamboot first. Apparently it's just a one-time setup (per machine? or per user?) * Verified that MPI NCO works with GCC on dual opteron machines * Add -D_POSIX_SOURCE to default gcc and icc flags to fix compiler warnings in ncap_lex.l * Add -D_BSD_SOURCE to default icc flags to fix MPI with icc 2005-07-10 Charlie Zender * Verified icc passes regressions tests and icpc-compiled libnco_c++.a works as intended. Have not tried with autotools yet. Have not yet tested MPI programs with icc. * -axW flag causes icc 8.1 to die compiling ncecat This appears to be an icc bug Implement target-specific workaround in bld/Makefile * Implement Intel 8.1 compiler compatibility 2005-07-07 Charlie Zender * Fix small leak in ncap_var_stretch() TODO ncap74 ncap now appears to be leak-proofed! * Added lots or mirror fl_1=fl_2 code to ncbo in preparation for attempted solution to subtraction problems related to asymmetry. In plain English: copied lots of code, didn't solve any problems yet. * Add td,tx,ty,tz,txyz variables to in.cdl * Match limit with dimension based on name not ID so nco_dmn_lmt_mrg() works with single limit list on any input file 2005-07-03 Charlie Zender * Realized that ncbo bug is longstanding/systemic and may require re-writing approach to determining confmormality of var_2. Current code is expected to break when second file has same name but different-sized dimensions, or has same-sized dimensions in different order, i.e., all sort of corner-cases. 2005-07-02 Charlie Zender * Remove thr_nbr argument from ncatted in nco_bm.pl * DAP 3.5.1 triggers reproducible double-free() memory error in ncbo step of ncra regression test 16. Problem occurs regardless of OpenMP (soot,elnino) and compiler (gcc,icc) ncra -O -C -v rec_var_flt_mss_val_dbl ~/nco/data/in.nc ~/foo_avg.nc ncbo -O -C -v rec_var_flt_mss_val_dbl ~/nco/data/in.nc ~/foo_avg.nc ~/foo.nc free(): invalid pointer 0x80e4a98! * Verified DAP 3.5.1 works with both build mechanisms with gcc NCO/gcc DAP (Debian elnino), and with icc NCO/gcc DAP * Report NC_64BIT_OFFSET rather than old-fashioned LARGEFILE test with -r option in nco_lbr_vrs_prn() * Change 'DODS' to 'DAP' or 'OPeNDAP' where possible in codbase, e.g., 'enable-dap', make DAP=Y, ENABLE_DAP * Support OPeNDAP 3.5.x in bld/Makefile * Re-write dods.sh for OPeNDAP 3.5.x terminology and save in new file opendap.sh 2005-06-30 Charlie Zender * Critical region on OpenMP reads nco_get_vara() are still necessary Want to establish if this is NCO or netCDF problem Testing for reproducibility, following regressions on soot, esmf: Run ncra ncwa soot 1 01 01,13 soot 2 02,06,10,11 none soot 3 01,04 01 esmf 1 01,02,11,12 none esmf 2 04,05,06,07,10,11,12,16 none esmf 3 02,03,04,09,15,16 13 Regressions are non-reproducible, characteristics of threads over-writing eachother due to random timing conflicts. Hard to debug because of irreproducibility Q: NCO calls nco_get_vara() in many routines---why is the call in nco_var_get() the only one that needs to be critical? A: Probably because it is that most important, done on every variable Options: 1. Ask Unidata whether they have tested SMP robustness of netCDF reads under demanding battery of conditions? 2. Scrutinize uninitialized data reported by icc/valgrind? 3. Write own SMP on read test? 4. ??? * Finish making opaque types nco_byte, nco_char, nco_int self-consistent 2005-06-30 Charlie Zender * Change nco_long to nco_int to allow for future 64-bit type called nco_long * Abstract opaque types into new header nco_typ.h 2005-06-29 Charlie Zender * Explicitly cast NC_CHAR type as "char" (rather than "unsigned char") in nco_netcdf.c and nco.h. Previously, there were a mixture of "char" and "unsigned char" occurances. Not sure if this helps anything except consistency * Removed two of three critical regions in nco_var_utl.c Removing these causes no regressions with SMP on icc/x86 or xlc/Power4 Final critical region is, well, critical Region contains the nco_get_vara()/nco_get_var1() calls themselves 2005-06-28 Charlie Zender * Conditionally free both $1 and $3 in var,var addition in ncap_yacc.y * Try and fail to free input variables if they were promoted in ncap_var_cnf_dmn(). Not sure what prevents this from working. 2005-06-27 Charlie Zender * Merge CCSM data processing example into nco.texi 2005-06-25 Charlie Zender * Un-constify cvs_Name to workaround gcc-4.0+ warnings 2005-06-22 Charlie Zender * Fix bld/Makefile indent that caused make to treat ncap: as command not rule 2005-06-21 Charlie Zender * Make LINUX_CC more MPI-friendly for both gcc and icc 'make MPI=Y' just works on my Debian machines now when MPICH_CC=gcc and fails when MPICH_CC=icc * Set OMP=N when MPI=Y in bld/Makefile * Add ${MDL_BIN_TRG} to .PHONY in bld/Makefile to solve problems with building MPI executables * Change configure.in 'case' statement from sparc-sun-solaris2 to sparc-sun-solaris2* to handle newer solaris triplets 2005-06-21 Harry Mangalam * fixed Makefile.in and nco_bm.pl to work with: make test does regression test with no debug info make devtest does regression test with debug info and udpreporting make benchmark runs benchmark with udpreporting make files creates the benchmark files * nco_bm.pl now defaults to /src/nco as MY_BIN_DIR (if no environment var set) instead of going thru the dialog. 2005-06-20 Charlie Zender * Add sys target to bld/Makefile. 'make sys' installs executables in $MY_BIN_DIR to /usr/local/bin 2005-06-17 Charlie Zender * Verified that nco_var_refresh() change does not introduce any memory errors on any operator. Marking TODO nco543 as closed. * Re-name nco_var_refresh() to nco_var_mtd_refresh() to better describe functionality (metadata, not data, is refreshed). * Refresh variable type in nco_var_refresh() Previously, only ID, nbr_dims, and mss_val were refreshed Now type is also refreshed. Was not sure full implications of this. It appears to work and causes no regressions Hence back out previous fix for nco543 and handle this way This is cleaner and more robust to varying variable types with each input file * Revert ncra input variable structure to unpacked type at end of record loop Reverting input values is not necessary since those are free()d next However, type member of structure must be unpacked value so that cast of new missing_value in nco_mss_val_get() in next nco_var_refresh() call (i.e., next file) This solves TODO nco543 but will break when variables are different unpacked types between files and both files contain missing values. Better solution is to refresh variable type in nco_var_refresh()? Will commit this first then try that next Best solution is to carry missing_value type in variable structure? 2005-06-17 Harry Mangalam * Tested NCO with new (3.5.1) version of DAP/NC-DAP, with netcdf 3.6. Seems to work for small transfers but hangs with large transfers from sand's DODS server. Still testing. Brought configure and Makefile and .in's up to date with new DAP. May have to drop back to netcdf 3.5 tho. 2005-06-17 Gayathri Venkitachalam * Cleaned up mpncflint 2005-06-17 Charlie Zender * Convert var_prc[idx]->mss_val back to on-disk type after every record _except_ the last record in ncra. This fixes valgrind memory error associated with TODO nco543 Regression test still not passed, though no new regressions introduced 2005-06-16 Charlie Zender * Added ncea regression test similar to current failing ncra TODO nco543 * Remove call to nco_typ_cnv_rth() for var_prc[idx] in ncra and ncea Call appears redundant since variable is converted to output type with nco_var_cnf_typ() two lines later anyway. Removing nco_typ_cnv_rth() for var_prc[idx] causes no new failures in regression tests. * Set default packing policy for all potential MPI ncpdq operators 2005-06-16 Gayathri Venkitachalam * Added new operators mpncwa, mpncpdq, mpncecat * Modified mpncbo so that all processes do the final clean-up * Modified nco_ctl.c and nco_pck.c to accommodate new MPI operators 2005-06-15 Gayathri Venkitachalam * Added a couple of tests for ncra (average (i)rec_var_int_mss_val_int (ii)rec_var_int_mss_val_flt across 2 identical input files) in nco_bm.pl which seem to fail 2005-06-15 Harry Mangalam * MD5 version of nco_bm.pl checked in - works on SV (Single Values) on x86-32, x86-64, esmf. Passes benchmarks on all these platforms. on x86-32, passes all regressions except for funny-wrap-on-Intel regression, passes all MD5 & WC tests for regression (except noted above) passes all benchmarks with MD5, WC, SV on x86-64, passes all regressions except ncap funny business (fails 3) passes all but 4 MD5 checks (makes sense in terms of what fails) passes all benchmarks on SV but fails all MD5 checks on AIX-64 passes all regressions but 4 of the ncaps tests passes all MD5 & WC tests for regression (except noted above) passes all benchmarks on SV but fails all MD5 checks * pick up DATA and MY_BIN_DIR correctly * reduce debugging cruft, tho in debug mode, it still burps text in ugly ways 2005-06-15 Charlie Zender * Add MD5 and SHA1 digests of nco.tar.gz to index.shtml 2005-06-13 Charlie Zender * Improve threading code intention comments in nco_omp.c * Still need to tweak run and data directories in nco_bm.pl and nco_bm.sh * nco_bm.pl and nco_bm.sh appear to work with loadleveler Solution is not general yet because unable to pass environment variables (except DATA and HOME) through scripts for now * nco_bm.sh: Never pass strings with whitespace through Perl Getopt * nco_bm.pl: Print many arguments when dbg_lvl=1 2005-06-12 Charlie Zender * Noticed that regression tests in nco_bm.pl report some apparent successes as failures on SUNMP, e.g., Result: [1e+36] != Expected: [1e+36] always recorded as failure. Seems like any "Expected's" containing "+" string may fail. Perl problem? * Ran benchmarks on laptop (elnino), desktop (soot), supercomputer (esmf). Noted that file creation is sickeningly slow on laptop and desktop, takes thousands of seconds. Fast on ESMF. Same on benchmarks: very slow on laptop and desktop, fast on ESMF interactive node. * Add -t thr_nbr to nco_usg_prn() and nco.texi for newly threaded operators * Do not call ncap with threads in nco_bm.pl fl_cr8() * Allow nco_bm.pl to run locally from bld/Makefile 2005-06-10 Charlie Zender * cvs tag -c nco-3_0_1 Changes since nco-3_0_0: 1. ncap exponentiation 2. ncwa threading 3. intel icc compatibility 4. Improved benchmarking * Simplify treatment of math symbol table C99 mandates support for erf(), erfc(),tgamma(), acosh(), asinh(), atanh(), cosh(), sinh(), tanh() Some OS's, like Linux, Solaris, provide these without C99. Many others (AIX, SGI*, WIN32) do not. Complicating things, many C99 implementations, e.g., AIX xlc, do not yet support these functions. Hence, ncap only supports them on Linux machines. 2005-06-09 Charlie Zender * Change default AMD64 compiler to gcc-4.0 * Revert patches to known working state (i.e., make reads critical) * Temporarily un-revert critical region patches in nco_var_get.c With icc and xlc_r, this causes variable numbers of ncra and ncwa regressions. Usually many more ncra than ncwa. icc/valgrind combination gives capability to narrow down causes. 2005-06-08 Charlie Zender * Change thr_nbr_max_fsh from 1 to 2 for ncrcat * Change thr_nbr_max_fsh from unlimited to 2 for ncecat * Change thr_nbr_max_fsh from 1 to unlimited for ncwa * Change thr_nbr_max_fsh from 4 to unlimited for ncbo * Marked TODO nco325, nco345, nco523, nco189, nco214 as resolved * Re-ran all valgrind tests on soot with two threads enabled All operator appear memory clean in NCO portions except ncwa ncwa may have a few unfree()d buffers but hard to tell with valgrind version 2.2 which does not have good tracebacks. Threading library has plenty of unfree'd memory which apparently is harmless and there's nothing to be done about that anyway. * ncbo memory problems disappeared * Add calls to nco_omp_ini() and nco_thr_att_cat() in ncecat This fixes problem where thr_nbr was being set but not used * Use icc warnings to improve printf() formatting in nco_prn.c * Optimize bld/Makefile icc switches for OPTS=O,R,D,X * Do not pass --thr_nbr to ncatted in nco_bm.pl * Change DO_CONFORM_MSK,DO_CONFORM_WGT from private to firstprivate and make sure both always have default values This fixed all ncwa regressions with threads! * icc-compiled version passes regression test perfectly on soot only when threading is disabled at compile time, e.g., OMP=N. With threading enabled, code fails many tests (1 ncra and 22 ncwa) ....regardless of thread number! Not requesting any threads, (i.e., -t 0 or no -t specification), requesting one thread (-t 1), or requesting more threads breaks regression tests. Interesting that AIX version passes all, and icc fails many, regressions when threading enabled with one thread. icc fails _most_ ncwa calls. Averaging a single variable fails! Lots of juiciness in error messages! icc will help to isolate any problems because it is so much more sensitive than xlc_r. Moreover, valgrind appears to work fine with icc-compiled OpenMP code on Xeon. * Code compiles as clean as possible with icc 8.1 and gcc 4.0 * Prohibit double definition of cmp_nm with icc * Updated bld/Makefile and configure.in to work better for icc by making -std=c99 standard switch * Changed default compiler on Ubuntu to GCC-4.0 Fixed new CEWI warnings resulting from change Testing shows no new regressions * Reverting the 20050519 critical region patches fixes ncra regressions on AIX OpenMP. Hypothesis that libnetcdf.a is not thread-safe on reads (or writes) gains considerable weight, since all the patches do, I think, is make reads critical. * Reverted 20050519 critical region patches * About to revert patches of 20050519 which removed critical regions from NCO read routines * Added nco.texi example on changing non-record to record dimensions 2005-06-07 Charlie Zender * Noticed that many ncra regression tests fail on AIX When did this begin? What causes it? Results from date-stamped-version tests 20050605: Fail; 20050524: Fail; 20050521: Fail; 20050520: Fail; 20050519: Succeed; 20050517: Succeed; 20050510: Succeed; 2005-06-06 Charlie Zender * Add THR_NBR option to bld/Makefile to pass to nco_bm.pl * Learned that Linux gamma() function is just plain broken and obsoleted, at least in C99, by tgamma() function. Linking gamma() symbol to tgamma() intrinsic solves Linux problem Note that tgamma() is a C99 feature Referencing tgamma() in the code is the second C99 feature, after the restrict type keyword. 2005-06-05 Charlie Zender * gamma() function appears broken in ncap regression test 07 * Added ncap regression tests for modulo, exponentiation, sin, cos, atan operations 2005-06-02 Charlie Zender * Henry implemented ncap exponentiation bugfix. Versions < 3.0.1 incorrectly handle exponentiation of a variable to a variable power (V^V). 2005-05-29 Charlie Zender * Account for typesize in allocation of ncap_ln_nbr_crr and ncap_fl_spt_glb in glb_init_free(). Fixes memory read/write error. * Began purifying ncap memory * ncks appears to be memory-pure! * Leak-proofed nco_msa.c 2005-05-26 Hary Mangalam * finally brought in ncecat in OMP form * changed configure.in configure scripts to reflect sync with bld/Makefile flags; (again) noted problem with static/shared and DODS in configure.eg * accepted CZ's peculiar variable naming in bm script. 2005-05-26 Charlie Zender * More fully initialize lmt_all_crr->lmt_dmn[0] to enable subsequent free()ing with nco_lmt_free() * Tidy up nco_cpy_var_dfn_lmt() prototype and use lmt_all rather than lmt to designate lmt_all rather than lmt structures 2005-05-26 Henry Butowsky * Changed in ncks.c lmt_all_lst from a 1D to a 2D variable also changed associated functions in nco_msa.[ch] 2005-05-24 Charlie Zender * Changed from ctime() to re-entrant ctime_r() with ncatted Does not help reduce unfree()'d system memory according to valgrind 3.0 development branch. Does not hurt, either. How portable is ctime_r()? SUS, yes, but POSIX? 2005-05-23 Charlie Zender * Touch parameter rusage_who for CEWI in nco_mmr_rusage_prn() * Fix double-free() problem in ncrename 2005-05-22 Charlie Zender * Add memory cleanup to sng_lst_cat() * Nearly purified ncatted memory * Purified ncrename memory * Began ncks memory cleanup * Fix union type-casting in nco_var_cnf_typ() 2005-05-21 Charlie Zender * Debug statements for TODO nco523, vexing SMP OpenMP thread bug * Execute free(var_prc[idx]) sooner in ncwa * Re-tweak print formatting in nco_bm.pl 2005-05-19 Charlie Zender * Change nco_get_var*() routines in nco_var_get() from SMP critical to non-critical. Not sure why they were originally critical. * Change nco_var_upk*() routine in nco_var_get() from SMP critical to non-critical. Not sure why it was originally critical. * Make nco_var_refresh() routine from SMP non-critical. Not sure why it was originally critical. 2005-05-18 Charlie Zender * All arithmetic operators except ncap now have no known memory leaks or errors * Finished memory cleanup on ncwa 2005-05-17 Charlie Zender * Appear to have fixed all leaks in nco_var_avg() * Fix problem with dangling pointers in var_out caused by destruction/creation of var_prc_out in nco_var_avg(). Solution adopted is somewhat hackish: rearranging nco_var_lst_free()s Perhaps better solution would be to copy new var_prc_out pointers into var_out, the free() memory normally. * Plug leak when nco_var_avg() called with variables without averaging dimensions (i.e., fixed variables). When this occurs, return copy of original input instead of NULL (old method). * Add cleanup_and_exit branch to nco_var_avg() * Never allocate tally array for var_prc[idx] in ncwa, since it is never used and caused double free() problems when it share the var_prc_out[idx] tally buffer 2005-05-16 Charlie Zender * Stop cross-referencing fix with var->xrf->xrf=fix in nco_var_avg() * Make nco_bm.pl output format for regression test look like configure 2005-05-07 Charlie Zender * Reduced default verbosity of nco_bm.pl * Fixed ncap_var_init() prototype and nco_cnf_typ() to compile cleanly 2005-05-06 Henry Butowsky * Cleaned up double parsing in ncap.c,ncap_*.[hc] now passes basic tests 2005-05-05 Charlie Zender * Comment out three_double_dmn from in.cdl to avoid triggering errors in DODS server and/or netCDF client library 2005-05-03 zender * Threaded ncflint. Not tested yet. 2005-04-29 Gayathri Venkitachalam * Cleaning up mpncbo.c prior to replacing ncbo.c 2005-04-27 Charlie Zender * Cleaning up mpncbo.c prior to replacing ncbo.c 2005-04-25 Gayathri Venkitachalam * Updated mpncbo to compile with and without MPI. Compiling without MPI=Y will result in identical executables mpncbo and ncbo * Updated Makefile to reflect the same * Added mpncflint, the MPI version of ncflint 2005-04-23 Charlie Zender * Clean up main.c headers a little 2005-04-20 Charlie Zender * cd to bm for all bm targets in bld/Makefile 2005-04-19 Charlie Zender * Changed/added 'make tst' targets in bld/Makefile to use nco_bm.pl instead of nco_tst.pl * Finished ncecat cleanup 2005-04-19 Gayathri Venkitachalam * (Apparently) fixed the bug in mpncbo while hyperslabbing 2005-04-19 Charlie Zender * Initial ncecat memory cleanup---still one problem with dimension list 2005-04-19 Harry Mangalam * Large cleanup of benchmark code integrated file build, benchmark, and regression testing udp reporting only by request * added --queue to denote submission to queue (loadleveller, etc) which kills off script if the proper env vars aren't set. If --queue isn't set, and env vars aren't set, script will prompt for correct paths added Failure column to summary output to make it easier to see which ones failed. * added nco commandline to UDP report so can verify timing exactly. * added --thr_nbr to option list to set # of threads to use (not implemented internally yet tho) * finished adding those benchmarks that CZ wants added: 1 - ncwa averaging all variables to scalars 2 - ncra time-averaging 2^5 (i.e., one month) files (using symlinks) 3 - ncea averaging 2^5 files 4 - ncbo differencing two files (using '-' as operator) 5 - DEFERRED (Martin Schultz multi-slabbing test) 6 - ncap long algebraic operation 7 - ncpdq packing the file 8 - ncpdq dimension-order reversal the file * above benchmarks complete cleanly on sand and on those that can be done on bodi 2005-04-18 Charlie Zender * With following six modifications, mpncbo compiles, runs and gives apparently correct results on my laptop with default run. However, mpncbo exits with errors when hyperslabs are specified, e.g., mpncbo -d lon,1 ... * Synchronize mpncbo memory clean-up with latest ncbo * Fix lmt handling in mpncbo as per 20050416 changes * Add prototype for nco_mpi_att_cat() to nco_att_utl.h * Add mpncbo synonym for ncbo in prg_prs() and nco_op_typ_get() * Remove #ifdefs around nco_mpi_att_cat() which requires no additional MPI-specific headers so is always safe to compile * Change MPI attribute to nco_mpi_task_number 2005-04-18 Gayathri Venkitachalam * Checked in mpncbo.c & nco_att_utl.c after updating them to compile with MPI=Y. Compiling with MPI=N still behaves the way it used to. 2005-04-18 Charlie Zender * Memory status: The only commonly used code which has leaks/errors in the arithmetic operators (excluding ncap) appears to be the dimension conformance code, i.e., broadcasting. ncwa highlights these problems. ncbo, ncea, ncflint, ncpdq, ncra, ncrcat are either memory-clean or causes of problems are known and await resolution. ncecat has yet to be examined but is expected to respond well to same treatment given to ncea/ncra/ncrcat. Problem #1: Promotion of char->double (and byte->double?) uses uninitialized memory. This may be a C-language or libc problem, ultimately, which we can do nothing about. Not sure. It is not serious because promotion of char->double for arithmetic is intrinsically ill-defined and rarely used. It would be helpful to document this problem in the manual, and possibly give users some control over code paths, e.g., --disable_promote_char_double. Problem #2: nco_var_cnf_dmn(), in its various incarnations and uses, leaks worse than Harry's roof. The upside is that it is memory-efficient and fast. This problem is serious and needs careful fixes. Problem #3: ncap. I have not examined ncap since fixing the huge ncap_var_stretch() leak. There seem to be many tiny leaks in the flex and bison-generated code, which surprises me. If these really are leaks, not sure what we can do beyond creating a valgrind suppression file for them. 2005-04-17 Charlie Zender * Clean up leaks in file name code when abbreviation lists used Solving leak in nco_fl_nm_prs() was rather contorted but appears to work * Fix off-by-two error in memmove() in ncwa 2005-04-16 Charlie Zender * Initial memory work on ncflint * Currently, memory in ncpdq and ncbo appears faultless memory in ncra has one problem when up-converting char to double for averaging * Tighten up memory in ncwa by free()ing dimension lists * Changed limit (lmt) memory paradigm from 1D to 2D structure list in accord with all string, variable, and dimension lists. This makes handling limits easier, at the expense of more indirect referencing in metadata routines. Replace lmt[idx]. with lmt[idx]-> All lmt-related memory leaks appear to be gone 2005-04-15 Charlie Zender * Gayathri noted problem with missing_value inconsistency between var_prc and var_prc_out for identical input files on both packed and unpacked variables. Still investigating. * Case where var2 did and var1 did not have missing_value was treated incorrectly in ncbo.c and inconsistently in nco_mss_val_cnf(). Fixed. 2005-04-14 Charlie Zender * Noticed that Fedora core 2 glibc automatically warns about double free()s etc and that regression test doesn't look so hot when all these are printed. More reasons to fix the remaining memory problems... * Fixed AIX regression for printing bytes by moving from non-standard %hhi format (which printed all bytes as "hi" on AIX) to standard %c format, which is lame and does not print signed integer values for bytes. Now it should not trigger regressions. * Added mpncbo.c as MPI-enable ncbo alternative Builds only with bld/Makefile using make MPI=Y switch and requires MPI packages (e.g., mpich) and access to mpi.h Has not been verified not to break autotools builds yet 2005-04-13 Charlie Zender * Fixed all memory leaks in simplest ncbo calls 2005-04-12 Charlie Zender * Free() dmn_lst in all applicable operators * Free() xtr_lst in all applicable operators * Free() cmd_ln in all operators * NULL'ify var_prc_out[idx]->tally when free'ing var_prc[idx]->tally in ncra. This fixes double free() condition caused because these both point to same buffer. 2005-04-10 Charlie Zender * Implement preliminary memory free routines in ncra Fairly straightforward---best place to start now that ncpdq is done * Implement preliminary memory free routines in ncwa Clear that limit structures will need some deep work Genuine memory errors do occur and give hope that ultimately ridding all ncwa problems may be possible by fixing leaks * Implement preliminary memory free routines in ncap and immediately give up due to size and scope of job * Move list free functions to respective utility routine files * Changed names of ncap routines that maniputlated nm_id structures These routines used the *_var_* nomenclature, e.g., nco_var_lst_free(), even though they manipulated lists of nm_id_sct structures. Changed *_var_* to *_nm_id_* in these functions so that routines are named after structure types which they manipulate, rather than what their contents are * Created new routines to free lists of lmt, dmn, var structures * ncpdq is officially leak-free! The first leak-free operator * var_nm is finally free'd, takes care of TODO nco224 * Fixed bug in nco_var_cnf_dmn() and nco_var_stretch() where var->nm pointer was being copied instead of deep-copying This appears to have fixed ncwa regression TODO nco490 * Verified that var->nm freeing is last obstacle to perfect memory releases in ncpdq 2005-04-09 Charlie Zender * Simplify nco_lmt_udu_cnv() because of new lst_prs_2D() list processing * Transition all of NCO from lst_prs_1D() to lst_prs_2D() All operators still pass regression test * Use nco_sng_lst_free() to free fl_lst_in in ncpdq * Transition ncpdq from lst_prs_1D() to lst_prs_2D() All operators still pass regression test 2005-04-08 Charlie Zender * Patch nco_mmr.h to include time.h. Fixes Mac OS X build for struct rusage * Change default printing behavior of ncks again using suggestion of Takeshi Enomoto. ncks in.nc : Prints all data and metadata ncks -M in.nc : Prints only global metadata ncks -m in.nc : Prints only variable metadata ncks -H in.nc : Prints only variable data 2005-03-27 Charlie Zender * Create lst_1D_to_2D() to replace lst_prs(), which is responsible for much craziness and was renamed lst_prs_old(). Unfortuneately, immediately switching showed many regressions lst_1D_to_2D() needs more extensive testing * Implement nco_sng_lst_free() to free string lists * More fixes to ncpdq memory management...only one leak remains! 2005-03-26 charlie * Introduced unknown regression into ncwa nco_var_cnf_dmn() * Pared ncpdq unfree'd memory down to three, final, hard-to-understand, problem malloc's totaling ~150 B. * Free dmn_rdr_lst_in() in ncpdq * Fix inherent leak in prg_prs() * Deep-copy nm in nco_var_dpl(); free nm in nco_var_free() Ditto with dmn->nm, nco_dmn_dpl(), and nco_dmn_free() * Implement nco_dmn_free() to free dimensions * Guaranteed system memory (optarg) reaches no further than command-line parsing in all operators. This has side effect of temporarily increasing un-free'd memory in programs, because, formerly, valgrind would not count that memory against NCO because it was system memory (optarg). Now NCO owns it and needs to free it. * Planning to eliminate all remaining memory leaks from NCO Un-free'd strings cause the most memory leaks (I think) When NCO originated in 1993-1994 I was zealous about memory usage. I chose to use the system memory allocated to optarg rather than duplicate that memory in NCO. As NCO grew and became more object-oriented, being able to create structures (e.g., variables) dynamically but not able to free all their elements (e.g., names), some of which referenced system memory (from optarg), lead to today. Here are four examples (from ncks.c) of memory that NCO cannot free(): fl_pth_lcl=optarg; fl_pth=optarg; dlm_sng=optarg; var_lst_in=lst_prs(optarg,",",&nbr_xtr); The first two or three lines do no cause much problem because those strings are not duplicated much or contained in structures and so never lead to situations that valgrind count against NCO Using system memory for var_lst_in, however, causes problems Strategy: 1. Replace all such fragments in NCO by strdup()'d memory 2. Follow their code paths and free() these strings when possible 3. Add block to free all pointers at end of code (already in ncpdq) 4. Modify destructors (e.g., nco_var_free()) to free strings Initial work to free memory will be conducted in ncpdq Implement same methods in other operators once ncpdq is leak-free... 2005-03-25 charlie * Documented and fixed some small ncap memory leaks with valgrind 2005-03-24 Harry Mangalam * added bm dir for benchmarking; initial files are: gne_exp.cdl template -> ~54MB file of gene expression data ipcc_dly_T85.cdl template -> ~1GB file with 4D,3D,2D,1D,scalar variables ipcc_dly_T85.sh shell file that creates & populates the above file nco_bm.pl the perl benchmarking script (derived from bld/nco_tst.pl) sml_fls.sh script to generate both small files: gne_exp.cdl & sml_stl.cdl sml_stl.cdl template for a small sat data file stl_5km.cdl template for ~300MB sat data file stl_5km.sh script to generate and ncap the above file 2005-03-24 Charlie Zender * cvs tag -c nco-3_0_0 Changes since nco-2_9_9: 1. ncap bugfix 2. Add benchmarking 3. libnco_c++ implements nco_var_puta() 2005-03-23 Charlie Zender * Fix gaping memory leak in ncap_var_stretch() 2005-03-22 Charlie Zender * Implement nco_mmr_rusage_prn() for memory diagnostics 2005-03-21 charlie * Implemented Harry's suggestion to use memset(vp,0,size) to initialize float and integer buffers to zero. Previously, this was done in a loop over each index value Presumably this old method was slower because of pointer de-referencing New algorithm implemented in nco_var_zero() and nco_zero_long() * Set NC_NOFILL in ncap_var_write() * The call to nco_aed_prc() (a metadata writing call) was un-necessarily late in ncap.c. I moved it to just after nco_var_dfn(). This takes advantage of the netCDF feature that metadata (not data) can be manipulated before it is flushed to disk (with nc_enddef()). You can learn/use a variable's ID before populating the variable's data section. Now ncap ends after writing in data mode and avoids the heavy disk penalty of moving variables to accomodate the increased metadata from the nco_aed_prc() call. * Turns out the only NC_NOFILL in ncap.c was done in data mode after the variables were defined. Not sure why this did not cause an error. ncap was probably doing redundant data filling for the non-processed variables defined. Fixed that. 2005-03-20 Charlie Zender * Apply same optimization to nco_var_cnf_dmn() * Handle expansion of scalar variable as special case in ncap_var_stretch() to speed up important cases of variable synthesis. This speeds up user-time ipcc_dly_T85 benchmark by ~300%. 2005-03-14 Charlie Zender * Modified big.cdl to facilitate benchmarks 2005-03-04 Harry Mangalam * RE-Fixed configure, configure.in to find test for and add ssl to LIBS 2005-03-02 Harry Mangalam * RE-Fixed configure, configure.in to find nc-dods lib AND also to treat UDUnits correctly if it's built and used from a local directory. 2005-02-24 Harry Mangalam * Fixed configure, configure.in to find nc-dods lib 2005-02-24 Charlie Zender * Long options --prn --print now point to -P instead of -H * Introduced -P as abbreviation for -C -H -M -m -u * Restored -H -m -M functionality to old behavior mostly * Change -u to toggle switch 2005-02-13 Harry Mangalam * used cz's ncks --compiler flag to grab compiler info * hires timer & udp reporting work on aix with perl >= 5.6.1 2005-02-13 Harry Mangalam * added hires timing to test script bld/nco_tst.pl * using udpserver2 collector modified from tacg project * added udp reporting " * more debugging for " * cleaned up and strictified code 2005-02-10 Harry Mangalam * added the getopt & usage section to test script bld/nco_tst.pl * added the logging and more debug 2005-02-13 Charlie Zender * Added --cmp, --compiler switch to ncks to report compiler name with new function nco_cmp_get() 2005-02-04 Charlie Zender * Polished up ncap intrinsic math function definition examples 2005-01-13 Charlie Zender * Added -DABORT_ON_ERROR to Makefile.am for libnco_c++ only 2005-01-12 Charlie Zender * ncks prints units, when present, by default (-u now turns this off) 2005-01-09 Charlie Zender * Make ncks -q switch a true quiet switch that stops all printing to screen. Make new -Q switch handle old -q job. Make ncks -R automatically invoke -q so that remote files may be downloaded without attempting to print them. * Remove -Wmissing-prototypes from g++ options * Fixed g++-3.4.2 prototype warnings with nco_c++ * Added return to about five void functions to squelch erroneous gcc-3.4.2 warnings (and hopefully allow enable-custom-* to work) 2004-11-30 Charlie Zender * Updated config.guess to timestamp 20040611 * Updated config.sub to timestamp 20040312 2004-11-05 Charlie Zender * Use S_IFLNK instead of S_ISLNK for NEC SX in nco_fl_utl.c * Change test -e to more restrictive test -f in configure.in. Makes sense and allows NEC SX to build. * Add docs on how to build NCO >= 3.0.0 with netCDF < 3.6 to homepage * Change so ncks in.nc out.nc does not print global metadata 2004-10-16 Charlie Zender * Add -Z, --64-bit-offset switch for FORCE_64BIT_FST mode * Prevent printing global metadata on ncks file copies 2004-10-13 Charlie Zender * Put in commented version of netCDF 64-bit file format support * Added 32-bit/64-bit distinction discussion to LFS support 2004-09-23 Charlie Zender * Remove extra carriage returns from ncks global metadata printing in nco_prn_att() * Declare nco_pck_map as shared in OpenMP loop 2004-09-12 Charlie Zender * ncks: Print data to screen when only input file is specified * Add NC_BYTE to types of variables with known ndrv in nco_var_pck() 2004-09-08 Charlie Zender * cvs tag -c nco-2_9_9 Changes since nco-2_9_8: 1. ncbo threading 2. ncpdq -P packing * Fix problems with building --enable-*-custom * Fully merge packing policy/map decisions into nco_var_lst_dvd() This should mean that fix/prc distinction is fully integrated 2004-09-07 Charlie Zender * Finish packing map documentation. Ready to release. * Cause ncpdq in.nc out.nc to default to pck_plc=all_new rather than aborting * Re-arrange debugging info verbosity levels to be sane * Fix erroneous triggering of PURE_MSS_VAL_FLD in nco_var_pck() 2004-09-06 Charlie Zender * Verified that all packing except NC_XXX->NC_CHAR works pretty well * Add new nco_pck_map types hgh_byt and flt_byt to nco_pck_plc_typ_get() * Showed packing three_dmn_var_dbl to NC_BYTE works better than packing to NC_CHAR * Verified packing/unpacking for: NC_INT->NC_SHORT, NC_DOUBLE->NC_INT, NC_DOUBLE->NC_BYTE, NC_INT->NC_BYTE, NC_SHORT->NC_BYTE, * Allow add_offset, scale_factor to be any type but NC_BYTE and NC_CHAR in nco_pck_dsk_inq(). This fixes NC_INT->NC_SHORT unpacking. * Learned that NC_INT->NC_SHORT does not work. Presumably all non-floating point packing is suspect until verified * Verified each pack map works without memory problems for all_new policy * Allow packing to NC_INT in nco_var_pck() * Successfully segregated var_fix from var_prc * Change nco_pck_typ to nco_pck_plc for "Packing Policy" * Incorporated packing policy decisions in nco_var_lst_dvd() to segregate var_fix from var_prc. Still not working but infrastructure in place. * Deprecated nco_is_packable() in favor of more flexible nco_pck_plc_typ_get() which accounts for policy desired by nco_pck_map * Eliminated all memory problems in ncpdq Verified no excess large blocks remain at program end Valgrind rules! * Update missing value in nco_var_upk_swp() * Handle all nco_pck_typ cases in nco_var_dfn() and end clause of ncpdq * Remove dangling pointer from ncpdq all_xst clause * Update ncpdq man page. Document -M most everywhere. 2004-09-05 Charlie Zender * Create nco_pck_map_get() to parse nco_pck_map arguments to ncpdq -M option * Introduce nco_pck_map to nco_typ_pck_get() Only default type nco_pck_map_hgh_sht currently works * Move high level packing routines from ncpdq.c to nco_pck.c * Finished initial ncpdq packing documentation * Verified unpacking complete missing values works, with both scalars and arrays * Fixed packing pure missing values fields in nco_var_pck() * Replaced duplicated noisy text branches in packing routines with ugly goto's and single blocks of code * Add ncpdq packing/unpacking test to nco_tst.pl * Fix unpacking variables with only add_offset in nco_pck_dsk_inq() 2004-09-04 Charlie Zender * Do not attempt unpacking unless variable already packed * Replace USE_EXISTING_PCK in nco_var_pck() with PCK_VAR_WITH_NEW_PCK_ATT * Implement synonyms ncpack, ncunpack, and option -U and xst_new * More robust handling of cases when only one packing attribute defined * Cast missing_value to double before double comparisons in nco_var_pck() 2004-09-03 Charlie Zender * NULLify dangling pointer to Fix double-free()'d value buffer problem 2004-09-02 Charlie Zender * Finished implementing packing types: all_new, all_xst, upk 2004-09-01 Charlie Zender * Worked on re-packing already packed variables. Almost working. 2004-08-25 Charlie Zender * Added nco.css contributed by Alper Ersoy of the TeXInfo project Does not quite work yet, but points the right direction for XML compatibility 2004-08-22 Charlie Zender * Include sys/types.h prior to regex.h on Mac OS X 2004-08-15 Charlie Zender * ncpdq all_new packing seems to work. Next need to get unpacking working. * Alter nco_var_dfn() to define dummy scale_factor, add_offset for ncpdq 2004-08-14 Charlie Zender * Cleanly segregate pack from re-order functionality in ncpdq Assume both are not performed in same ncpdq invocation * Pass nco_pck_typ from all operators to nco_var_lst_dvd() 2004-08-11 Charlie Zender * Create nco_pck_mtd() to off-load metadata manipulation 2004-08-10 Charlie Zender * Copy packing infrastructure from ncra to ncpdq * Finished thr_nbr documentation * Threaded main variable loop of ncbo 2004-08-08 Charlie Zender * Changed some formats from %e to %g in nco_tst.pl so that Solaris cc executables will pass tests 2004-08-07 Charlie Zender * Added first ncatted test to nco_tst.pl * Added lots more yummy ncpdq documentation * cvs tag -c nco-2_9_8 Changes since nco-2_9_7: 1. ncpdq, 2. ncwa --msk_sng consolidated mask switch, and 3. C99 * Fixed bug where nco_var_dmn_rdr_mtd() returned before reversal flag list created for 1-D arrays. This cause reversal of 1-D arrays to fail (do nothing). * Made valiant stab at ncpdq documentation. Ran out of steam. 2004-08-06 Charlie Zender * split ncpdq var list into var_fix and var_prc like in ncwa All tests appear to work * Fixed last known ncpdq problem caused by indexing var_prc_out list with var_out index * Added duplicate dimension flag has_dpl_dmn to var_sct * Handling situations where re-order list caused non-record variables to become record variables was completely broken. Inserted mucho logic which implements new policies: 1. First record variable change request is honored 2. All subsequent requests are ignored and produce warnings 2004-08-04 Charlie Zender * Fix ncpdq bug where record coordinate matching was done with strstr() instead of strcmp() * Fix ncpdq dimension reversal list processing * Make all error exits go through nco_err_exit() so that error exits uniformly call exit(EXIT_FAILURE) or abort() * Fixed diagnostic bug in nco_var_dfn() which would dump core when dbg_lvl=3 and prg=ncwa * Fix ncwa bug introduced in nco_var_dmn() last week. nco_tst.pl completes successfully again. * Improved/updated man_end.txt and catenated onto end of all man pages * Wrote ncap man page ncap.1 * Added ncpdq.1 man page View with nroff -man ~/nco/man/ncpdq.1 2004-08-02 Charlie Zender * Implemented dimension reversal with negative signs in ncpdq * Changed dimension re-order switch from -z to -a like ncwa * Fixed NCO-wide bug where I used strstr(sng1,sng2) as boolean instead of !strcmp(sng1,sng2) This bug occurred in: nco_var_cnf_dmn() three times nco_var_stretch() three times ncbo.c() once time When used as a boolean strstr(sng1,sng2) is approximately interchangeable with !strcmp(sng1,sng2). Exceptions occur where sng1 is a substring of sng2, in which case the dimensions would be different but strstr() would return a match. In all locations, the bug appears to have caused extra work, or to have incorrectly allowed the above exception where one dimension is a substring of another, but in no location does the bug appear to have caused wrong answers. 2004-07-29 Charlie Zender * Eliminate ostensibly wrong memmove() in ncwa/ncpdq avg/rdr list processing * Rewrote appropriate ncpdq routines to handles record dimension re-definitions correctly 2004-07-28 Charlie Zender * Broke nco_var_dmn_rdr() into two sequential functions nco_var_dmn_rdr_mtd() for metadata and nco_var_dmn_rdr_val() for values. Calling routine (ncpdq) now holds required intermediate information in dmn_idx_out_in. * Implement -DNCO_ABORT_ON_ERROR in nco_err_exit() so developers can perform easy tracebacks * Add AX_CFLAGS_GCC_OPTION(-D_BSD_SOURCE) so default build works * Added ncpdq to autoconf build machinery * Finish first theoretically working version of ncpdq. Of course, it crashes. 2004-07-27 Charlie Zender * Merge ncwa dmn_avg list handling into ncpdq for dmn_rdr * Removed un-used dimension nbr_dmn_avg == 0 branch from ncwa 2004-07-26 Charlie Zender * ncpdq now copies files perfectly, just like ncks No re-order routines have been turned on---that is next Tagged this ncpdq version (1.1) with ncpdq_perfect_do_nothing_template User ncpdq.c version 1.1 as template for future new operators * Require default clauses for switch(prg_id) * Created ncpdq.c from stripped version of ncwa.c 2004-07-25 Charlie Zender * Installed hooks to call nco_var_dmn_rdr() in ncks May need to create new operator to use this capability * Added skeleton nco_prs_rdr_lst() * First complete draft of nco_var_dmn_rdr() compiles warning-free 2004-07-21 Charlie Zender * Implement infrastructure for dimension re-ordering routine nco_var_dmn_rdr() 2004-07-19 Charlie Zender * Create nco_bnch.sh to benchmark big file operations * Implement preprocessor method in nco.h to disable restrict * big.nc "restrict" test with yields incorrect answers with AIX xlc * Implement restrict in nco_var_cnf_dmn() * Change default xlc from -qlanglvl=extended to -qlanglvl=extc99 to support C99 features like restrict. This does not seem to bother xlC, which appears to ignore the -qlanglvl=extc99 switch. * Implement restricted pointers throughout arithemetic routines * Introduced restrict type qualifier into pointer unions * cvs tag -c nco-2_9_7_pre_restrict Last tag prior to implementing C99 features * const'ify arithmetic counters used only for normalization * Standardized arithmetic prototypes in preparation for implementing restricted pointers 2004-07-08 Charlie Zender * nco.texi: Correct mix-up of -T and -t options in documentation 2004-07-06 Charlie Zender * cvs tag -c nco-2_9_7 Changes since nco-2_9_6: Read MFO input files from stdin, add more attribute functionality to nco_c++, turn threading on in ncra * Updated Makefile to use sophisticated make depends rules that handle plusses and slashes in filenames better * Added libtest, libtst targets to Makefile * Change from C++ to CXX in Makefile * Finished replacing %zu's with %lu's with casts to (unsigned long) * Provide definitions of fabsf(), sqrtf() in nco_var_rth.c from nco_flt_rth.h rather than from special #ifdefs 2004-07-04 Charlie Zender * Changed some %zu's back to %lu's with (unsigned long) casting Will I have to do this everywhere since %zu is non-ISO? 2004-07-03 Charlie Zender * Add undocumented -Y, --pseudonym, or --prg_nm switch to ncra to force it to behave as ncea or ncrcat 2004-07-02 Charlie Zender * Change default from OMP=N to OMP=Y in old Makefile 2004-07-01 Charlie Zender * Changed configure.eg to enable OpenMP on AIX. 'make' and 'make install' now work but 'make test' fails with zillions of linker errors: rtld: 0712-001 Symbol omp_get_num_threads was referenced from module /u/zender/nco/src/nco/.libs/libnco.so(), but a runtime definition of the symbol was not found. * AIX xlc does not activate OpenMP unless -qsmp=omp argument used * Fixed AIX xlc_r compiler pragma warnings by removing /usr/vacpp/include from CPPPATH in configure.eg. I think nco_c++ used to need this to find , but that no longer seems to be the case. Simpler is better. * Improve LFS test in big.cdl. Created version that creates large files (> 4 GB) on small-RAM (< 4 GB) systems, and NCO seem OK to deal with resulting files. * Added $dbg_lvl variable to print nco_tst.pl tests during execution * Fixed nco_tst.pl test hanging while waiting for interactive response to overwrite query * Fix brokenness in nco_fl_utl:nco_fl_lst_mk() which triggered segfaults in non-multi-file-operators when no input filename was offerred, i.e., when there were no positional arguments * Fix brokenness in nco_tst.pl caused by renaming -o to -T * Changed old (only since 2.9.6) ncwa -t to ncwa -T so can use -t for threads consistently everywhere * Pass thr_nbr on command line * Added LFS stub to nco.texi, pass LFS info from configure.in * Added large file support LFS to custom Makefiles. Rorik added it to autoconf. 2004-06-30 Charlie Zender * Add nco_openmp_thread_number global attribute to threaded programs if HISTORY_APPEND is true * nco_openmp_ini() is now mandatory for any program using OpenMP * Fixed "variable "_iob" has undefined data scope" compiler warnings by passing stdout/stderr filehandles as local variables scoped shared in OpenMP parallel clauses 2004-06-29 Charlie Zender * Update OpenMP directives in ncra in preparation for adding robust OpenMP diagnostics 2004-06-28 Charlie Zender * Remove configure.in AC_CHECK_LIB check for cosf() in libC.a. NCO used to get the float functions from this library but it turns out that all of these system-supplied float functions are broken on AIX. NCO now uses it's own version of these functions. Fixes TODO ncap57. 2004-06-25 Charlie Zender * Added ln() as synonym for log() in ncap * Fix size_t format printing in memory allocation routines 2004-06-23 Charlie Zender * Never solved problem with reading o/a/e response after using stdin for filenames. 2004-06-19 Charlie Zender * Reworked stdin to avoid mixing string and character input. Interactive responses to "overwrite (o/a/e)?" questions must now be terminated with carriage return (and are case-insensitive) * Add nco_put_att functions * Add nco_fl_info_get() to nco_fl_mk_lcl() * Add readfile, realpath, canonicalize_file_name to AC_CHECK_FUNCS 2004-06-18 Charlie Zender * Added new -H section to documentation * Change FORTRAN_STYLE to FORTRAN_IDX_CNV 2004-06-17 Charlie Zender * Added nco_fl_lst_att_cat() to add input file list global attribute * nco_fl_ls_mk() reads input file list from stdin when appropriate for multi-file operators. For some reason it no longer pauses for manual stdin, however. 2004-06-16 Charlie Zender * Fixed numerous errors in xargs example * Change nco_lib_tst.c to libnco_tst.c and add libnco_c++_tst.cc 2004-06-15 Charlie Zender * Check for strdup() and strcasecmp() with NCO_CHECK_FUNCS rather than AC_CHECK_FUNCS so they are protected by NEED_* rather than HAVE_* tokens. This improves portability of libnco by reducing number of tokens non-NCO programs need to define in order to link to libnco.a. This make nco_lib_tst simpler. * Add bld/nco_lib_tst.c to test libnco offline * cvs tag -c nco-2_9_6 Changes since nco-2_9_5: Add -o fl_out option, change ncwa -o meaning, AMD64 build tweaks 2004-06-14 Charlie Zender * Move old ncwa -o switch to -t, add synonyms --truth_condition, --msk_cmp_typ, delete old synonyms --op_cmp, --compare, --cmp. * Change warning size for large filenames from 80 to 255 characters * Modify nco_fl_lst_mk() so operators accept output filename specified with -o (or --fl_out or --output), or as last positional argument (traditional behavior). Finished TODO#58. 2004-06-13 Charlie Zender * Added demonstration script to handle large numbers of input files to nco.texi 2004-06-06 Charlie Zender * Implement -m64 option for ABI=64 on LINUXAMD64 2004-06-02 Charlie Zender * cvs tag -c nco-2_9_5 Changes since nco-2_9_4: ncflint interpolation is commutative, libnco_c++ *.hh headers installed * Install libnco_c++ *.hh headers in include directory. * Explicitly restrict license of libnco_c++.h to GPL version 2 * Change behavior of ncflint and nco_var_add_tll_ncflint() to return missing_value when either input is missing 2004-06-01 Charlie Zender * nco.texi: Documented funny ncflint behavior when one variable is missing * Implement nco_mss_val_cnf() in ncflint to handle corner cases where same variable has different missing values in each file 2004-05-22 Charlie Zender * Print shared/static configuration with -r * Support newer AC_INIT syntax * Default configure.in AIX GCC ABI is 64-bit with -maix64 Fixes TODO bld31. 2004-05-21 Charlie Zender * cvs tag -c nco-2_9_4 Changes since nco-2_9_3: ncecat works on pure scalar files * Allow AIX builds with GCC in bld/Makefile * Rearranged nco_tst.pl, added ncecat test, activated ncbo, ncea, ncflint tests. Fixes TODO nco332. 2004-05-20 Charlie Zender * Patched ncecat to address scalar file concatenation problem Fixes TODO nco331. * Set rec_dmn->is_rec_dmn=True; in ncecat.c This appears to have been a bug that never triggered any failures 2004-05-13 Charlie Zender * Move blurb from nmn_get to last info message 2004-05-05 Charlie Zender * Implement AMD64 pgcc/pgCC support in build mechanism 2004-05-04 Charlie Zender * Change cvs.nco.sourceforge.net to cvs.sf.net in accord with new SourceForge BIND 9-induced policy 2004-04-19 Charlie Zender * Build NCO on sand.ess.uci.edu, SuSE Linux 9.0 dual opteron with GCC 3.1.1 for x86-64 * Put CEWI's in nco_lmt.c to allow builds with GCC and --enable-*-custom when UDUnits not installed 2004-04-13 Charlie Zender * cvs tag -c nco-2_9_3 Changes since nco-2_9_2: ncra/ncea arithmetic works when missing_value equals zero or any intermediate sum * Closed bugs nco121 and nco325 * Segregate nco_var_add_tll() into nco_var_add_ncra() (which checks only current record against missing_value) and nco_var_add_ncflint() (which checks both arguments against missing_value). This fixes bug where record averages were zero when missing_value=0.0. * Switch argument order in nco_opr_drv() for clarity/consistency 2004-04-06 Charlie Zender * Updated News & Announcements section 2004-03-23 Charlie Zender * cvs tag -c nco-2_9_2 Changes since nco-2_9_1: Fix S/V, S%V, S^V, workaround broken UDUnits installations * Correctly implement non-commutative ncap S%V modulo * Correctly implement non-commutative ncap S^V empowerment * Document promotion for empowerment (sounds more political than it is) in nco.texi 2004-03-17 Charlie Zender * Change nco_lmt.h from HAVE_UDUNITS_H to ENABLE_UDUNITS to make bld/Makefile builds work again when udunits is not installed. 2004-03-16 Charlie Zender * Correctly implement non-commutative ncap S/V division 2004-03-12 Charlie Zender * Verify Solaris does autobuild correctly with up-to-date bison and when UDUnits workaround is installed. 2004-03-11 Charlie Zender * Re-do UDUnits logic in configure.in to ignore broken UDUnits installations and build successfully (with UDUnits, of course). * Print variable names when writes and reads fail in nco_c++ 2004-03-10 Charlie Zender * Handle corner case in nco_lmt.c where HAVE_UDUNITS_LIB is defined but HAVE_UDUNITS_H is not 2004-03-07 Charlie Zender * Tweaked DODS library logic in configure.in to support AIX Link to -lC on AIX instead of -lstdc++ as on Linux 2004-03-04 Charlie Zender * cvs tag -c nco-2_9_1 Changes since nco-2_9_0: prp_sei, fix packing bug with ncwa 2004-02-29 Charlie Zender * Described pending NCO proposals in NUG * Described how to donate in NCO User's Guide (NUG) * Added/explained OPeNDAP vs. DODS in documentation * Rorik modified nco_cnf_typ.c: nco_typ_cnv_rth() to fix bug with arithmetic on packed data in ncwa. Probably fixed same bug with other artithmetic operators (besides ncap) as well. 2004-02-25 Charlie Zender * cvs tag -c nco-2_9_0 Changes since nco-2_8_8: CF convention, ncap corner cases, Deactivate non-ANSI __GNUC__ extensions, make check nco_c++ * Implement CEWI workarounds so tst.cc builds warning-free and make check works again with --enable-*-custom * Deactivate __GNUC__ extensions for rank reduction in nco_var_avg.c Replace #ifndef __GNUC__ with #define FXM_NCO315 1; #ifdef FXM_NCO315 Will change back to original code only when stack memory problem is fully understood/solved/benchmarked to improve on ANSI code branch 2004-02-10 Charlie Zender * Make Convention CF-1.0 behave same as existing CSM convention 2004-02-08 Charlie Zender * Make TODO list easier to understand to facilitate contributions * Systematically "symmetrize" all ncap arithmetic operations so var OP var, var OP scv, and scv OP var are handled for all operations. * ncap handles var % scv, scv % var * ncap handles scv / var * Add nco_var_var_pwr() and nco_var_pwr() functions to allow empowerment of two variables = var_1^var_2 and scv^var * Change CSM to CCSM most everywhere 2004-01-30 Charlie Zender * cvs tag -c nco-2_8_8 Changes since nco-2_8_7: --enable-[optimize/debug]-custom works again * Remove -fshort-enums from GCC switches as per Rorik. It breaks ABI and caused mysterious failures because libnetcdf.a must be compiled with same size enums as NCO apparently. 2004-01-20 Charlie Zender * Implement DODS 3.4 switches as default in bld/Makefile 2004-01-19 Charlie Zender * Use valgrind 2.1 to identify and fix small leaks: Free prg_nm in nco_exit_gracefully() 2004-01-16 Charlie Zender * nco_netcdf.c: Do not initialize rcd unless not doing so might cause CEWI 2004-01-15 Charlie Zender * Change dods.sh from RC6 to 3.4 final, and pre-clean * Correct documentation of covariance procedure 2004-01-13 Charlie Zender * Change AIX xlC enable-optimized-debug from -O5 to -O3 so shared libraries work again * cvs tag -c nco-2_8_7 Changes since nco-2_8_6: Default GCC builds work again, ncap packing works again * Fix GCC compiles when enable-*-custom is not specified. This should fix reported Cygwin build problem. * nco_pck() uses tally-free arithmetic. Fixes ncap packing bug introduced in 2.8.4. 2004-01-12 Charlie Zender * Only manually prototype lexer function in ncap_lex.l if enable-*-custom build option specified with GCC. Fixes build problems with cygwin * Document make install-strip in doc/README as per Rorik * cvs tag -c nco-2_8_6 Changes since nco-2_8_5: Add -Werror to GCC compiles, fix AIX and SGI builds * Wrap new ncap_lex.l content in ifdef __GNUC__ since breaks on AIX, SGI. AIX and SGI now build again. 2004-01-11 Charlie Zender * NCO compiles warning free again so add -Werror to GCC custom flags * Add and elaborately comment on multiple yylex() prototypes required to build ncap warning-free with pedantic debugging flags. * Use correct token, NCO_MSA_H, instead of NCO_VAR_UTL_H, in nco_msa.h This fixes all remaining implicit function declaration warnings Until now, no routines in nco_msa.c had prototypes known outside of that file unit. Unlikely that this caused problems since no known casts were employed in prototypes. This demonstrates the usefulness of -Werror. Without it, this bug would still be there. 2004-01-10 Charlie Zender * Conjoin setting GCC flags in configure.in, avoid duplication * Systematize header file names * Improved dods.sh documentation 2004-01-09 Charlie Zender * Unconditionally include nco_lst_utl.h and nco_sng_utl.h in nco_att_utl.h (now that nco_prs_aed_lst() is there). * Moved system headers from nco_lmt.c to nco_lmt.h 2004-01-08 Charlie Zender * Give DODS example in -R documentation * Add -R to correct -R examples in documentation 2004-01-07 Charlie Zender * cvs tag -c nco-2_8_5 Changes since nco-2_8_4: DODS support, configure.in rewrite, ncap attribute assignment fix * Remove -Dinline= so gcc CFLAGS may be reused for g++ This fixes make install problem with --enable-optimize-custom 2004-01-06 Charlie Zender * Improved type conversion documentation 2004-01-04 Charlie Zender * Qualify GPL license as Version 2 everywhere * Prototype main.c functions prior, rather than post, definition in nco.h * prefix ncap global and file scope variables with ncap_ to reduce namespace pollution * De-linted nco_c++ library by adding rcd+=0 CEWI statements 2004-01-03 Charlie Zender * Fix bug where nco_put_varm() called nc_get_varm_float() instead of nc_put_varm_float() * Replace nco_netcdf.h prototypes with type-safe const'ified prototypes 2004-01-02 Charlie Zender * Use sqrtf() where appropriate * Preserve const'ness of string literal assignments and returns * Use trigraph return in qsort() comparison functions nco_cmp_*() to completely avoid arithmetic and overflows 2004-01-01 Charlie Zender * Improve qsort() comparison functions nco_cmp_*() based on responses to comp.lang.c thread 20040101: 1. Avoid overflow conditions by not performing subtraction 2. Preserve const-ness by using comparison rather than using casting and subtraction 2003-12-29 Charlie Zender * De-lint code with --enable-debug-custom Fixed sloppy casts, signed/unsigned comparisons, missing const's in nearly all source code. * make dst_cln cleans volatile autotools build files in root directory * Add top-level file descriptions to MANIFEST * Expand GNU triplet names to specific architectures tested (i.e., use more restrictive triplets) * Add correct compiler and OS criteria for custom compiler switches * Make --enable-debug-custom set --enable-debug-symbols * Replaced deprecated AC_HELP_STRING with AS_HELP_STRING 2003-12-28 Charlie Zender * Update copyright years to 2004, tweak GPL license message 2003-12-27 Charlie Zender * Perform extensive self-diagnostic check of compile-time pre-processor configuration settings in nco_ctl.c:nco_lbr_vrs_prn(). Check results displayed with -r, e.g., ncks -r 2003-12-26 Charlie Zender * Add new tokens to config.h: ENABLE_[OPTIMIZE,DEBUG,EXTREME] * Clean up and comment configure.in 2003-12-23 Charlie Zender * Modified Rorik's script and added to distribution as doc/dods.sh * Updated/improved DODS section in manual 2003-12-01 Charlie Zender * Document hyperslab bug in 2.7.3--2.8.3 on homepage * Document NCAR SCD TCG support on homepage 2003-11-26 Charlie Zender * Rorik fixed install to remove links before install. Fixes install on Solaris. 2003-11-25 Charlie Zender * Squelch "declared but never referenced" warnings on IRIX in nco_utl.cc * cvs tag -c nco-2_8_4 Changes since nco-2_8_3: Fix index-based hyperslab bug, reduce ncap memory usage to 2*sizeof(var) for binary operations * Sourceforge made debian/rules executable fixes TODO #280 * Rorik fixed index-based hyperslabbing bug introduced in 2.7.3 Fixes TODO #286, #289 * Specify success correctly for ncap T42 test 2003-11-24 Charlie Zender * Add ncks test 14 to check for hyperslabbing problems 2003-11-23 Charlie Zender * Change cerf to erfc in documentation. Dyslexia strikes again. * Add example documentation of intrinsic ncap math functions 2003-11-21 Charlie Zender * Henry reduced ncap memory usage in binary operations to 2*sizeof(var). Also removed superfluous (for now) tally allocation in ncap_var_init(). * Beefed up memory usage section in nco.texi 2003-11-20 Charlie Zender * Implement nco_malloc_err_hnt_prn() * Implemented nco_malloc_dbg() in ncap_utl * Created nco_malloc_dbg() for alternative to nco_malloc_flg(). This simplifies calling routines by moving most diagnostic handling to nco_malloc_dbg(). * Remove two more overly scary packing warnings 2003-11-19 Charlie Zender * Rorik replaced nco_tst.sh with nco_tst.pl, completing TODO #202 2003-11-16 Charlie Zender * Add LINUXAMD64 to support AMD Opteron * Update Sourceforge documentation 2003-11-14 Charlie Zender * cvs tag -c nco-2_8_3 Changes since nco-2_8_3: memory leaks, regressions fixed * Fixed ncwa, ncbo regressions in nco_tst.sh * Rorik found and I fixed little nco_var_lst() memory leak * Rorik and Henry found and fixed huge ncap memory leak 2003-11-11 Charlie Zender * Add nco_mmr_stt() hook call to all memory routines 2003-11-10 Charlie Zender * Add debian docs to make tags target * Remove qualifying warning about packed variables from nco_pck.c 2003-11-09 Charlie Zender * cvs tag -c nco-2_8_2 Changes since nco-2_8_1: missing_values handled better * Applied nco_mss_val_cnf() to ncbo to fix TODO #274 * Wrote nco_mss_val_cnf() to change missing_value of var2, if any, to missing_value of var2, if any, before arithmetic operation. 2003-11-05 Charlie Zender * Remove ncap_lex.c, ncap_yacc.[ch] from .tar.gz file created by nco_dst.pl 2003-11-04 Charlie Zender * Moved DODS problem note to homepage 2003-10-11 Charlie Zender * Add section on union of two files * Complete named HTML sections for each node in nco.texi 2003-09-16 Charlie Zender * Add URLs to named sections in HTML comments in nco.texi * Add verbose errror message and HINT for NC_ERANGE errors 2003-09-03 Charlie Zender * Makefile (ABI): Change default ABI to 64 2003-09-02 Charlie Zender * Change default HTML production from texi2html to makeinfo 2003-09-01 Charlie Zender * Clean up nco.texi * Expand regex documentation 2003-08-31 Charlie Zender * Correct some regex example errors in nco.texi 2003-08-29 Charlie Zender * nco.texi: Added #sections in English to nco.html for easy direct referencing of man pages 2003-08-28 Charlie Zender * Add section on ncbo portability 2003-08-27 Charlie Zender * Improve ncbo documentation * cvs tag -c nco-2_8_1 Changes since nco-2_8_0: variable wildcarding 2003-08-21 Charlie Zender * Quote backslash character with backslash in nco_var_lst.c * Add skeleton ncap.1 man page to satisfy autotools 'make install' * Bring bld/Makefile up-to-date with wildcarding, getopt changes 2003-08-20 Henry Butowsky * Rolled out variable wildcarding to all operators. Configure script checks for presence of regular expressions lib regex.h 2003-08-16 Charlie Zender * Verified autotools builds fine again on SGI, AIX * Straighten out getopt_long() preprocessor logic to work with architectures with getopt.h but no getopt_long() (SGI, AIX) 2003-08-15 Charlie Zender * Rorik synchronized shared library numbering with NCO version number * Document wildcarding in nco.texi 2003-08-14 Henry Butowsky * Added wildcarding of variables to ncks 2003-08-13 Charlie Zender * Make nco_malloc_flg() return NULL when malloc() returns ENOMEM * cvs tag -c nco-2_8_0 Changes since nco-2_7_4: ncbo, Debian integration * Add Debian package uploads to nco_dst.pl * Add Debian packages homepage * Add developer autoconf-automake-configure-make example to configure.eg 2003-08-03 Charlie Zender * Finish first cut at ncbo documentation in nco.texi 2003-08-02 Charlie Zender * Rename val_conform_type() to val_cnf_typ() * All regressions due to introduction of ncbnr appear to be fixed * Correct nco_tst.sh procedure for ncap * Restore nco_op_avg inadvertently removed from nco_op_typ_get() 2003-08-01 Charlie Zender * Fix ncbnr case statement and verifiy ncbnr works for +-*/ 2003-07-29 Charlie Zender * Verify ncdiff and ncbnr -y sbt work as expected but problems exist with add, mult, and, presumably, divide. * Make ncdiff symbolic link to ncbnr for backward compatibility 2003-07-27 Charlie Zender * Create ncbnr operator * Rename nco_var_add_no_tally() to nco_var_add() * Rename nco_var_add() to nco_var_add_tll() 2003-07-20 Charlie Zender * Changed math table printing from -r to -f in ncap so that -r is consistent among all operators. Documented this in nco.texi. 2003-07-06 Charlie Zender * Removed FTP requirement from make tst. Create nco_tst.sh creates foo.nc from scratch without needing to FTP nco_tst.nc. Test involving FTP is now called make tst_ftp. 2003-07-04 Charlie Zender * cvs tag -c nco-2_7_4 Changes since nco-2_7_3: Better AIX autotools support, UDUnits fix 2003-07-01 Charlie Zender * Add --Mtd switch for global metadata, update nco.texi accordingly 2003-06-24 Charlie Zender * Added PayPal donation button, updated homepage 2003-06-23 Charlie Zender * Rorik fixed UDUnits handling of hyperslab specifications in floating point format, e.g., 1.23e-7. 2003-06-15 Charlie Zender * Update copyright headers * Change GPL version 2 or later license to version 2 only. * Clean up some MSA namespace * Document supported non-ANSI functions (e.g., acosh(), trunc()) in nco.texi * Changed --nocoords to --no-coord or --no-crd. Decided all disabling actions will have same keyword as enabling action except switch will start with --no-XXX 2003-05-30 Charlie Zender * Add CPP_TKN_OS += -I/usr/vacpp/include for nco_c++ on AIX * AIX autotools modifications by Jim * Jim Edwards completed Autoconf TODO 17. Fix CXX valarray to work on AIX 2003-05-21 Charlie Zender * Replaced malloc() with nco_malloc_flg() in about 10 locations where malloc() ENOMEM errors are handled directly by the calling code for additional diagnostics. 2003-05-06 Charlie Zender * Move RPM-wishlist off high-priority list, add restrictive MSA parsing to list as per Shultz request 2003-04-06 Charlie Zender * Added numerous long option synonyms in CSZ abbreviation format documented in abb.sty 2003-03-30 Charlie Zender * cvs tag -c nco-2_7_3 Changes since nco-2_7_2: UDUnits support for "units" attributes * Clean up nco_lmt * Documented UDUnits feature in User's guide 2003-03-27 Charlie Zender * Add UDUNITS_LIB, UDUNITS_INC CLI args to bld/Makefile 2003-03-26 Charlie Zender * Remove TODO 95. Satisfactorily addressed by Rorik's UDUnits work. 2003-03-25 Charlie Zender * Made --op_rlt, --cmp, --op_cmp, --compare synonymous with -o for ncwa * Re-arrange output from --usage, --help options 2003-03-24 Charlie Zender * Put UDUnits stuff on homepage * Added bld/Makefile support for UDUnits when UDUNITS=Y * Rorik committed UDUnits support for time coordinate limits in hyperslabs 2003-03-19 Charlie Zender * Remove TODOs 138, 139, 140, 141, 142---all solved or made obsolete by Henry's MSA printing algorithm. 2003-03-18 Charlie Zender * General honing of nco.texi * Implemented TeX and TeXInfo macros to keep math variables consistent with LaTeX sources. Mostly successful, except Info does not like macros inside or macros, e.g., @var{@wndznl{}} * cvs tag -c nco-2_7_2 Changes since nco-2_7_1: disk-based, MSA printing indices work 2003-03-17 Charlie Zender * Replaced examples in nco.texi with output from MSA printing 2003-03-09 Charlie Zender * Modifying debian/* files to build with 2.7.x as zender 2003-03-07 Charlie Zender * Remove -ansi flag from gcc builds because it is (apparently) equivalent to -std=c89 and thus conflicts with -std=c99. 2003-03-02 Charlie Zender * Began Debian-ization of upstream source by populating debian directory with nco-2.2.0 Debian package files by Brian Mays NB: Files in debian/ are for 2.2.0 (i.e., way out of date) We are trying to Debian-ize upstream source for NCO ~2.8.0 Expect some hiccups when that finally happens * Insert LINUXARM in Linux portion of bld/Makefile * Synchronize Debian nco/doc/man with CVS nco/man * Add Debian files by Brian Mays to CVS repository: debian: changelog control convert copyright postinst prerm rules bld: linux1 linux2 (appear obsolete and may soon be removed) 2003-02-25 Charlie Zender * Builds cleanly on LINUX, IRIX, AIX * Remove unused variables from ncap.[cl], nco_msa.c * Clean up nco_att_cpy() 2003-02-05 Charlie Zender * Change from WARNING to level 1 INFO when wrapped limits processed in nco_lmt_evl() 2003-01-29 Charlie Zender * Documented procedure for computing covariance of two variables using http://jisao.washington.edu/data/nco/ as template 2003-01-20 Charlie Zender * cvs tag -c nco-2_7_1 Changes since nco-2_7_0: long options on all platforms, packing fix for ncap * Initiate HPPA support in bld/Makefile 2003-01-19 Charlie Zender * Fix inconsistent storing of fixed variables that are packed in ncap Packed values were being saved in unpacked type without packing attributes 2003-01-18 Charlie Zender * Clean up some ncap_utl prototypes 2003-01-14 Charlie Zender * Updated nco_c++ build instructions and documentation to refer to Makefile.old * Changed copyright end year to 2003 2003-01-08 Charlie Zender * Rorik added conditional compilation of Sittler's getopt_long() where necessary, removed *_GETOPT_LONG tokens from all source code. 2003-01-03 Charlie Zender * Successfully built NCO 2.7.0 on Redhat 8.0 at HP Testdrive site spe141.testdrive.compaq.com. The HP Testdrive site has virtually every imaginable combination of hardware and OS, so now NCO may be tested on all of these machines. My first test with a new architecture, HP-UX (HPPA), failed because of lack of C++ compiler. Thus Testdrive computers do not appear to be fully loaded with reliable compilers. 2003-01-02 Charlie Zender * cvs tag -c nco-2_7_0 Changes since nco-2_6_6: long options and multislabbing 2002-12-29 Charlie Zender * Add rudimentary tests of multislabbing to nco_tst.sh * Switch from ~ to @w{} for unbreakable spaces in nco.texi 2002-12-28 Charlie Zender * Document multislabbing in user's guide * Document long options in user's guide * Implement more long options in TLA format * Henry changed arithmetic in nco_msa to char * arithmetic to remove warnings * Clean up ncap_utl.c some 2002-12-27 Charlie Zender * Clean up nco_msa.[ch]. Still need to fix void * arithmetic 2002-12-19 Charlie Zender * Moved multi-slabbing algorithm to nco_msa.[ch] 2002-12-19 Henry Butowsky * First version of multi-hyperslabbing along a single dimension for ncks 2002-12-14 Charlie Zender * Took advantage of NEED_FNC to remove MACOSX kludge in nco_rth_flt.h * Merged Rorik's long options mods 2002-11-04 Charlie Zender * Restore ./configure file from 2.6.5 and re-tag as 2.6.6 2002-10-25 Charlie Zender * cvs tag -c nco-2_6_6 Changes since nco-2_6_5: ncrename fixes, ncap type conversion * Use '.' consistently in .var@.att renaming * Changed variable-attribute delimiter in ncrename from ":" to "@" to be consistent with ncap * Fixed ncrename to not fail when . specified and variable does not contain attribute 2002-09-24 Henry Butowsky * Added type conversion functions for attributes and variables byte, char, short, int, float, and double 2002-09-22 Charlie Zender * info-friendly changes to nco.texi 2002-09-20 Charlie Zender * cvs tag -c nco-2_6_5 Changes since nco-2_6_4: CRAY and SUN builds * Fix SunOS builds in bld/Makefile 2002-09-19 Charlie Zender * Patches from Len Makin for CRAY 1. Cray patch for ncap symbol table 2. Makefile fixes for Cray 3. nco_tst.sh tweaks Applied the Makefile flags to configure.in as well 2002-09-17 Charlie Zender * cvs tag -c nco-2_6_4 Changes since nco-2_6_3: MACOSX builds, SGI, NEC tweaks * Match SX-* with NECSX architecture in pvmgetarch * Correct some dependencies for string compatibility functions * Adapt for missing with SGI CC 2002-09-14 Charlie Zender * Added esoteric math functions to MACOSX using float<-->double coercion method * Implement compatibility strdup() and strcasecmp() Comeau should now work but have not tested it * cvs tag -c nco-2_6_3 Changes since nco-2_6_2: Numerous build improvments and removal of PVM_ARCH ifdefs MACOSX builds with bld/Makefile, documentation fixes * MACOSX builds appear to work * Add ranlib to bld/Makefile libnco.a target for MACOSX builds * Get rid of inline qualifier on nco_rth_flt function definitions * Move function definitions from nco_rth_flt.h to nco_rth_flt.c * Verified that bison 1.29 on MACOSX screws up ncap_yacc.y translation. Installed bison 1.35 on compile farm MACOSX system, and builds work fine. * Remove ncap_utl.o from libnco.a * #include in nco_rth_flt.h * Do not look for in MACOSX 2002-09-09 Charlie Zender * Added preliminary MACOSX support to bld/Makefile Everything appears to work but ncap, which has numerous problems on MACOSX because of bison, float functions, and ranlib. * Code compiles with gcc -ansi -pedantic -D_BSD_SOURCE Switches -std=c99 and -std=gnu99 both work too -D_BSD_SOURCE tells GCC nameser.h is ANSI-compliant * Moved float math function definitions to nco_rth_flt.h, created declarations for MACOSX in nco_rth_flt.c 2002-09-08 Charlie Zender * Implemented pre-processor macros CST_X_PTR_CST_PTR_CST_Y, X_CST_PTR_CST_PTR_Y to be as const-correct as possible for the language the source code is treated as. If treated as C++, full const-correct prototypes are implemented, else if treated as C, a const is dropped here or there to make things compile warning-free. Fixes TODO #213. 2002-09-06 Charlie Zender * Clean up ncap section of nco.texi, polish documentation builds, add XML, txt formats from makeinfo * Fixed nco.texi problems, generating docs at compile farm 2002-09-03 unknown * Typecast return value of strdup() to char * 2002-09-02 Charlie Zender * #include in all headers which reference strdup() * Crude but workable HAVE_STRCASECMP support, include config.h headers to allow future HAVE_STRDUP handling * Implement some Comeau support, but presence of non-ANSI functions strdup(), strcasecmp() makes full Comeau support unlikely anytime soon 2002-08-27 Charlie Zender * Tweak CC list in configure.in, remove c89, xlc_r * cvs tag -c nco-2_6_2 Changes since nco-2_6_1: Improvements to autotools builds Initial ncap handling of user-defined dimensions * Replace PVM_ARCH token with HAVE_GETOPT_H for getopt.h handling * Remove Fortran files nco_cal_utl.F, nco_fortran.F, nco_fortran.h since it is unlikely anyone will step forward to maintain fortran support. Of course these can be resurrected if necessary. * Add instructions for using compile farm, modify AIX, MACOSX builds 2002-08-22 Charlie Zender * Define var_in_typ before using in nco_cnv_mss_val_typ() * Began using HAVE_CONFIG_H, config.h in source files (nco_scm.[ch],tst.cc) 2002-08-21 Charlie Zender * cvs tag -c nco-2_6_1 Changes since nco-2_6_0: Unpacking is now supported for all arithmetic operators * Improved regression testing in configure.eg * Eliminate unnecessary type conversion to typ_dsk in ncra, ncea, ncwa This could reduce precision of answers Thanks to Martin Dix for pointing this out 2002-08-20 Charlie Zender * cvs tag -c nco-2_6_0 Changes since nco-2_5_6: Unpacking support is now beta for all arithmetic operators * Print attributes with same formatting as variables * Added hooks for packing support in arithmetic operators: Code was changed in locations marked with "pck_dbg" 1. Change type of output in nco_def_var() from var->type to var->typ_upk when is_rth_opr() is true 2. Unpack variable in nco_var_get() when is_rth_opr() is true 3. nco_att_cpy() does not copy attributes "scale_factor", "add_offset" for unpacked output variables 4. nco_att_cpy() ensures "missing_value" is converted to unpacked type before copying 5. nco_var_get() refreshes var->pck_ram on each read 6. Use nco_cnv_mss_val_typ() to keep type of missing_value in sync Unpacking appears to be working for all arithmetic operators! 2002-08-19 Charlie Zender * Added .cvsignore to dirs affected by autoconf * Added autoconf-specific list to doc/TODO * Added configure.eg to keep track of autoconf problems * Changed bld/Makefile to work with ncap_lex.l and ncap_yacc.y Removed ncap.l and ncap.y. 2002-08-18 Charlie Zender * cvs tag -c nco-2_5_6 Changes since nco-2_5_5: fixed processing of missing_values for integer variables in ncra, initial auto build tools * Merged Rorik's autobuild infrastructure. New (autobuild) and old (bld/Makefile) systems both appear to work but there may be some interference on ncap since ncap.l had to be renamed ncap_lex.c and ncap.y is ncap_yacc.c. * Altered pck_dsk_inq() to set var->typ_upk=var->type by default so that nco_cnv_mss_val_typ_upk() has something to work with * Fixed problem in nco_cnf_typ.c which caused failure for ncra when variable had missing_value attribute and needed to be promoted before arithmetic (e.g., int to float). Freeing variable each record but leaving mss_val the promoted type resulted in mss_val being overwritten (usually to value of 0.0) in all records but first for each file. Problem was ncra-specific and is described in more detail in header of nco_cnv_mss_val_typ_upk() routine. Better fix would be to carry type of missing_value as separate element of var structure. 2002-08-14 Charlie Zender * cvs tag -c nco-2_5_5 Changes since nco-2_5_4: Global "history" attribute fix * Fix bug in nco_hst_att_cat() introduced in 2.4.2 which left att_nm undefined when global history attribute did not exist 2002-08-13 Charlie Zender * cvs tag -c nco-2_5_4 Changes since nco-2_5_3: NECSX support * Extensive support for NECSX architecture contributed by Len Makin 2002-08-10 Charlie Zender * Make Rorik Peterson a developer. Add sourceforge logo to homepage. 2002-07-28 * Updated to cygwin-gcc-3.1.1-4 and build problems appear to have gone away, but syslimits.h is still not found so GSL cannot build 2002-07-08 Charlie Zender * Correct ncap symbol table to build on SGI6, SGI64 platforms * Add ncap to nco_tst.sh test suite 2002-07-08 * All operators build with cygwin gcc-3.1.1 as long as -I/usr/include is given first (fixes weird syslimits.h problem), non-kludge fix may require updated gcc and mingw packages. * Modify Makefile for cygwin-1.3.x compatibility. Everything appears to build except ncap.l/ncap_lex.c which needs syslimits.h which current cygwin gcc-3.1.1 does not appear to support 2002-07-03 Charlie Zender * cvs tag -c nco-2_5_2 * conditionally added acosh, asinh, atanh, cosh, sinh, tanh to ncap * unconditionally added floor(), ceil() to ncap * Print double precision numbers with 12 digits of precision * conditionally added erf(), erfc() to ncap * Document ncks -b, -B switches in manual * Fix size of extracted dimension list for wgt and var calls to nco_var_fll(). Print error and hint when encountering TODO #111 problems rather than dumping core. 2002-07-01 Charlie Zender * cvs tag -c nco-2_5_1 * Modified ncatted to delete all attributes for specified variable when no specific attribute name is given for that variable. 2002-06-16 Charlie Zender * cvs tag -c nco-2_5_0 * Added man pages for NCO operators to man directory. Source of man pages is Debian distribution by Brian Mays, which automatically generates man pages from texinfo source. Thus man pages are moderately out of date, currently for version 2.2.0. 2002-06-15 Charlie Zender * Make namespace safe by prefixing all functions with nco_ or ncap_ 2002-06-09 Charlie Zender * cvs tag -c nco-2_4_6 * Changes since nco-2_4_5: Sorting routines * Replace indexx* routines with system qsort()-based routines 2002-06-08 Charlie Zender * Lexer/parser changes to implement conditional, clean up rx's 2002-06-07 Charlie Zender * cvs tag -c nco-2_4_5 * Changes since nco-2_4_4: Arithmetic routines use const. More warning messages during compilation due to size_t printf * Fixed bug where mss_val_sht was dereferenced into long in one arithmetic routine. * Made as many parts of arithmetic routines const as possible and implemented const instantiaion outside of loops to reduce dereferencing wherever possible. If NCO suddenly seems faster, this is why. 2002-06-06 Charlie Zender * Noticed that GCC gives warnings when printf'ing size_t with %lu format flag since type of size_t is non-portable. GNU offers non-portable %z workaround. Recommended solution is to typecast all size_t's to unsigned longs before printf'ing. * Worked on 64-bit clean issues identified by AIX -qwarn64 flag The only possible non-functioning code found was date conversion code which could break on YYYYMMDD dates. Converted int's to longs where necessary to solve this. Used size_t instead of int or long where possible. Used ptrdiff_t instead of int where warranted. Most of remaining warnings could be solved by using size_t instead of int or long for counters, but mismatches are unavoidable at some point since type nco_long variables (i.e., netCDF data)a needs to interact with size_t variables on occasion. * cvs tag -c nco-2_4_4 * Changes since nco-2_4_3: Build system 2002-06-05 Charlie Zender * Allow 64 bit mode ABI (addresses are all 64 bits) on AIX when compiled with ABI=64. This should allow NCO to work on files larger than 2--4 GB The default for SGI was already 64 bits. 2002-06-04 Charlie Zender * Make flex/bison default on AIX 2002-05-31 Charlie Zender * cvs tag -c nco-2_4_3 Changes since nco-2_4_2: History attribute handling * Added target non_ncap to Makefile in attempt to prevent NCAR AIX breakage * Fixed hst_att_cat() to handle non-standard "History" attribute same as standard "history" attribute 2002-05-23 Charlie Zender * cvs tag -c nco-2_4_2 Changes since nco-2_4_1: #include file mechanism works, AT&T lex-compatibility broken by using flex rules * Documented ncap file insertion * Fixed #including file mechanism, generalized line counting and file name storage 2002-05-22 Charlie Zender * Realized that AIX lex does not support like flex * Ported to NPACI environment 2002-05-20 Charlie Zender * cvs tag -c nco-2_4_1 Changes since nco-2_4_0: minor bugfix which should fix use of operators in scripts where return code is checked 2002-05-19 Charlie Zender * More ncap work to prepare for dimension list structures which are going to be implemented correctly by tokenizing each element of dimension list and assembling full list in parser and letting scanner pass in each token. 2002-05-18 Charlie Zender * Added nco_op_typ element to prs_sct for handling dimension reduction functions 2002-05-15 Charlie Zender * Fixed bug where nco_exit always returned EXIT_FAILURE 2002-05-14 Charlie Zender * Added skeleton code to read #include'd files. Not yet working. 2002-05-13 Charlie Zender * cvs tag -c nco-2_4_0 Changes since nco-2_3_1: Builds out of box on all Unices * Surround fabsf and fmodf prototypes with ifndef __GNUG__ since g++ linking fails when prototypes explicitly specified in header _and_ in function. This is a kludge to a kludge to enable full g++ compilation. * Version now builds on AIX (even ncap.y with pure_parser) as long as cc compiler, not xlc or xlC, is used. Prototype warnings similar to gcc prototype warnings can be ignored. All major platforms are once again working out of the box. 2002-05-11 Charlie Zender * cvs tag -c nco-2_3_1 Changes since nco-2_3_0: New design, same functionality Appears to work on Linux, IRIX but compile problems on AIX * gcc compiles with spurious errors but links and tests fine * g++ compiles fine but unable to link with fabsf fmodf * Code builds and test correctly when compiled with icc * New code compiles completely warning-free with icc 6.0 2002-05-08 Charlie Zender * Added ability to write unformatted binary output to ncks using -B switch. Seems to work 2002-05-07 Charlie Zender * cvs tag -c nco-2_3_0 Changes since nco-2_2_4: Completely unstable version with new modular design. Library does build cleanly. * Redesigned libnco.a as modular library Split into ~20 smaller source files each with private header Used const wherever possible 2002-04-27 Charlie Zender * Finished name cleanup in ncap. Still need to break large files into smaller granules and const'ify prototypes * cvs tag -c nco-2_2_4 Changes since nco-2_2_3: Packing and unpacking functions now both work in ncap * Reducing ndrv number of discretely representable values by 1 appears to fix the rounding problems. Will probably have to reduce it by one more to make room for a missing value. 2002-04-26 Charlie Zender * Packing appears to be working, but not recursively, and there are still issues of speed and rounding problems * Automatically call var_upk() in var_get() in ncap only * Improved pck/upk values in in.cdl * Make var_pck() alter typ_pck, typ_upk elements when finished packing 2002-04-24 Charlie Zender * Put warnings on some arbitrary limits in ncap * Modify ncap and Makefile to link to -lC AIX C++ library to access float intrinsics cosf()... AIX does not support gammaf() (nor does SGI). 2002-04-23 Charlie Zender * cvs tag -c nco-2_2_3 Changes since nco-2_2_2: Support unpacking variables in ncap * Altered ncap algorithm so that now binary var/att expressions take highest precision type rather than always using var type. This allows unpacking algorithm to work straightforwarly using scale_factor and add_offset convention. 2002-04-18 Charlie Zender * cvs tag -c nco-2_2_2 Changes since nco-2_2_1: fix rare ncwa weight bug * make tst gets test file from dust.ps.uci.edu rather than CGD * Avoid wgt portion of ncwa when DO_CONFORM_WGT = False This section was superfluous in this situation anyway. Avoiding it by testing for DO_CONFORM_WGT appears to fix some hard to identify bug when lon was being averaged with gw as weight. The two did not conform, but a problem occured anyway. This appears to cure the three mysterious ncwa crashes present in the TODO list so mark those as fixed too. 2002-04-02 Charlie Zender * Switch back to using pure_parser to prevent Linux core dumps on 2002-03-30 Charlie Zender * Prototype fabsf() where used to help Sun compilation 2002-03-27 Charlie Zender * Quiet output by only printing CONVENTION when dbg > 0 2002-03-21 Charlie Zender * Remove %pure_parser from ncap.y to preserve yacc compatibility 2002-02-27 Charlie Zender * Described LHS casting in manual 2002-02-24 Charlie Zender * ncap variable division had numerator and denominator swapped! * Removed ncap_lex.c ncap.tab.c ncap.tab.h because they are not portable across platforms so it is best to let these be generated on user's machine until portable x-platform versions can be generated. Immediate problem is that IRIX and Linux versions are interfering with eachother. * ncap -r does not require argument 2002-02-18 Charlie Zender * Began documenting ncap in nco.texi 2002-02-11 Charlie Zender * Remove ncap dependency on getopt.o, getopt1.o since getopt_long() is not currently used (but using it is on the TODO list). Re-implementing getopt_long() will be done eventually, but now just make ncap easier to build to facilitate more beta testing. 2002-02-04 Charlie Zender * cvs tag -c nco-2_2_0: Changes since nco-2_1_3: Henry made subscripts lexer tokens and improved dimension list handling so LHS casting works regardless of precedence or presence of LHS expressions. * Small ANSI fixes in ncap.c for AIX * Replace math float prototypes required for AIX, Solaris builds These are not required on Linux or IRIX, which keep them in math.h * Documentation changes 2002-02-02 Charlie Zender * Quieted output by removing verbose printing from debug level = 0 Execution is now silent except for WARNINGS and INFOs. 2002-01-30 Charlie Zender * Added some Compile Farm procedures to nco_src_frg.txt * Add FREEBSD support to Makefile, and allow environment to override CC and C++ compiler variables 2002-01-29 Charlie Zender * cvs tag -c nco-2_1_3 Changes since nco-2_1_2: LHS casting really works as long as dimensions are already in output file. Replaced var_add() in ncap, no known parser bugs, just missing features. * Created var_add_no_tally() by copying var_subtract() and changing minuses to pluses. This routine does not use tally, and does handle missing values appropriately. Changed ncap_var_var_add() to use var_add_no_tally() rather than var_add(). This fixed segfaults with prs_mdp definition, which now works as expected. * ncap variable addition scripts break in var_add() Possibly because not all ncap routines malloc() tally array Possibly because missing values handling is not failsafe in var_add() (although I believe it is fine for other NCO operators) * Allocate tally using sizeof(long) rather than nco_typ_lng(NC_INT) 2002-01-28 Charlie Zender * Move LHS_cst cleanup to statement_list rule so cleanup does not occur before last expression in statement is evaluated * Added ncap_var_stretch() to out_var_exp = att_exp action * Spread out debug levels to create more uniform distribution of diagnostics as dbg_lvl increases * LHS casting is semi-working, semi-broken. Seems to work when all required dimensions are already in input file and RHS is variable, not attribute. Thus a3[lat,lon,lev] = one works but a3[lat,lon,lev]=1.0 does not. Still thinking about how to stretch attributes. 2002-01-27 Charlie Zender * cvs tag -c nco-2_1_2 Changes since nco-2_1_1: ncap warning cleanups, icc conformance, plug most non-ncap leaks detected by insure++ * Move yylex() so only called once in ncap_initial_scan() 2002-01-26 Charlie Zender * Use to get INT_MIN, INT_MAX * Changed from gcc to icc on Intel, seems to work fine * Cast char to unsigned char and visa versa where necessary to prevent icc warnings. This solved all icc warnings on ncap, and solved all IRIX cc warnings for ncap too. Since unsigned char pointer and char pointer are same size, there should be no problem casting between them. However, casting between unsigned char value and char value could change answers. String operations should be checked to ensure they still work. 2002-01-23 Charlie Zender * Fix read overflow in ncks.c:prn_var_val_lmt() where non-NUL-terminated character array was being printed with %s format 2002-01-22 Charlie Zender * Fix non-NUL-terminated strings in hst_att_cat() * Added nco/doc/purify.txt to track memory problems reported by purify 2002-01-21 Charlie Zender * Remove templates for math functions from ncap.c * Implement CCOMMENT start state to recognize C comments /* */ * Explicitly declare yy_scan_string() to remove compiler warnings * Implement/use nco_set_fill() wrapper Remove architecture-dependent wrapper on usage Pass pointer to valid fll_md_old since NULL is not safe because nc_set_fill() may try to write to it 2002-01-17 Charlie Zender * Initialize RHS to False, add global LHS_cast 2002-01-16 Charlie Zender * Enable assertion macros in ncap * Changed Makefile default to OMP=N until further testing * Began implementation of lexer for subscripted variables with x[dmn1,dmn2,...dmnN] syntax. Currently creates list of dimension structures but does nothing with it. 2002-01-13 Charlie Zender * Verified ncap script gives same answers as odxc.ncl script * var_free() superceded variable in ncap_var_conform_dim() causes core dump (why?), but not free'ing must cause memory leak * Realized var_conform_dim() has bug of omission: does not abort when variables do not conform because dimension list of one is subset of other but ORDER of dimensions differs, e.g., a(lat,lev,lon) !~ b(lon,lev). NCO probably returns incorrect answers silently in this case! 2002-01-12 Charlie Zender * Added variable/variable division (which had been overlooked) * Created ncap_var_stretch() which generalizes var_conform_dim() by including convolution of variables. ncap_var_stretch() appears to work as drop in replacement for var_conform_dim(). Convolution is just a stub which does not do anything yet. Realized that expansion might work by creating arbitrary variable of convolution size and then separately calling var_conform_dim() with that as var and both vars as wgt. * First build of ncap on LINUXALPHA architecture 2001-12-31 Charlie Zender * More ncap.* cleanup. Alter some variable names to conform to rest of NCO. 2001-12-29 Charlie Zender * Succeeded in building ncap on 64 bit machines: SGI, Alpha, Sun All of these machines have bison installed Some of these builds require building getopt.o separately Build fails on IBM because yacc does not understand pure_parser 2001-12-28 Charlie Zender * More CEWI initializations * Changed copyright to 2002 * Remove C++ comment characters that crept into various routines Using // comments causes default to compilation to break on many architectures (Linux being an exception) * cvs tag -c nco-2_1_1 Changes since nco-2_1_0: ncap uses @ for attributes Mixed rank handling improved but still broken * Fix '@' handling for global attributes * Make handling of attribute indicator @ consistent in warnings * ncap.l: cast void to ptr_aed->type not undefined type * Begin clean up of ncap code, eliminate compiler warnings 2001-12-11 Henry Butowsky * Changed ncap.l so attributes now use the @ symbol rather than : i.e var_nm@att_nm rather than var_nm:att_nm * Changed ncap.y So that 1-D variables can be saved in an attribute * Attempted to fix the rank problem. Added ncap_var_conform_dim() to ncap_utl.c, Its not working correctly at the mo. * Added att_lst_max to ncap.c * Updated ncap.in 2001-12-02 Charlie Zender * cvs tag -c nco-2_1_0 Changes since nco-2_0_3: ncrename interactive query limiter ncap extravaganza * Move Henry's tests into ncap.in script * Allow global:att_nm to signify global attributes in ncap * Removed file query cruft from ncrename and added maximum response count short circuit mechanism to prevent batch jobs from going bonkers when -O not specified and output file exists * Added hybrid coordinate info to in.cdl 2001-11-10 Charlie Zender * Added three_dim_var_crd to check COORDS storage convention ordering 2001-10-30 Charlie Zender * Fixed getopt dependencies and included nco_netcdf.h nco.h in ncap stuff 2001-10-28 Charlie Zender * cvs tag -c nco-2_0_3 Changes since nco-2_0_2: ncks bugfixes for units printing, and version information * Use NC_REC_DMN_UNDEFINED instead of -1 where appropriate * Fix argument list to nco_inq_varid() call in ncap * Fix netCDF3 migration bug that could cause core dumps because non-coordinate dimensions where being interpreted as coordinate dimensions in ncks due to changed nature of nc_inq_varid returns 2001-10-15 Charlie Zender * Added VERSION infrastructure for recording build information in executable * Check rcd before Exit_Gracefully() in main() routines so rcd does not generate "set but not used warnings" 2001-10-07 Charlie Zender * cvs tag -c nco-2_0_2 Changes since nco-2_0_1: No user-visible changes All changes are in netCDF3 compliant function semantics for the nco_netcdf wrappers. Altered many routines to call information-specific versions of inquire functions where possible. * Verified nco-2_0_2 passes test suite * nco_typ_sng(): NC_CHAR is unsigned char, moved nco_typ_sng(), c_type_nm(), fortran_typ_nm() to nco_netcdf library so that library may take advantage of these routines in printing useful diagnostics, yet still be independent of the rest of NCO. * Attempted to replace netCDF2-style use of -1 return codes by rcd and comparison to NC_NOERR everywhere. This is not exactly straightforward because there are many valid reasons to have literal constant -1 in the code. I think I did this correctly. However the use of -1, instead of NC_GLOBAL, for global attributes and, for ncatted, to indicate that attribute changes should apply to all variables, should be changed to NC_GLOBAL so code is more clear. * Change functions to implement netCDF 3.X interface Meaning pass answer holder as pointer and pass back return code nco_open(), nco_create(), nco_inq_[var,dim,att]*() * ncks.c prn_var_val_lmt(): Handle nco_inq_attid() correctly 2001-10-01 Charlie Zender * Build is clean and successful with g++/Linux, xlC/AIX * Return (int)0 instead of (int)NULL from nco_typ_lng() * Initialize nc_type variables with new netCDF 3.5 token NC_NAT This requires building NCO > 2.0.1 with netCDF >= 3.5 This change also permits successful builds with g++ again, which complained about initializing nc_type with non nc_type enums * cvs tag -c nco-2_0_1 Changes since nco-2_0_0: Cleaner separation of netCDF wrappers into nco_netcdf.c,.h Appearance of error messages slightly changed since prg_nm_get() no longer invoked by wrappers * ncap uses nco netCDF3 interface * Structure nco_netcdf.h as standard library header * Forbid multiple includes of nco_netcdf.h * Changed nc.h to nco.h for namespace consistency * Removed prg_nm_get() from all nco wrappers so wrappers have no external dependencies * Changed nc_err_exit() to nco_err_exit() * Removed superfluous headers from nco_netcdf.c 2001-08-10 Charlie Zender * Changed storage location of remotely accessible in.nc to .../nco/in.nc * Various Makefile changes for exotic NCAR platforms * Changed band to bnd in in.cdl 2001-07-25 Charlie Zender * TODO: Rearranged TODO list and put ~15 high-priority items up on the top 2001-05-28 Charlie Zender * Added HDF5 interface to nco_create(), using HDF5 preprocessor token to isolate native HDF code currently 2001-05-07 Charlie Zender * cvs tag -c nco-2_0_0 * This netcdf3 branch is now merged into the main trunk. The netcdf2 branch is now in maintenance mode. * cvs tag -c nco-1_3_4 2001-04-04 Charlie Zender * Changed to using nco_inq_att_flg() in ncar_csm_inq() 2001-03-26 Charlie Zender * cvs tag -c nco-1_3_3 * nco_tst.sh runs as expected when compiled with OPTS=D and OPTS=O on both Linux 32 bit and Irix 64 bit * Removed make options for NETCDF2_ONLY flag which is no longer supported with NCO 1.3 branch * Default build now compiles with -DNO_NETCDF_2 flag and tests successfully. * Replaced nclong with nco_long = long. There's no need to remove nco_long just yet until a long term strategy for dealing with long, size_t, int issues is decided upon. netCDF 3.x deprecates the whole nclong issue, but it might be useful to have reminders of where the issue was important, e.g., in the fortran arithmetic routines. * Changed in.cdl to use int rather than deprecated long and removed deprecated "l", "L" suffices to numeric constants * Added i18n headers to ncra.c and to Makefile with default being no internationalization. Hooks appear to work fine. * Changed NC_LONG to NC_INT to adhere closer to standard. Type NC_LONG is currently synonymous with NC_INT and will continue to be represented by native type long. 2001-03-07 Charlie Zender * Added Makefile option to disable OpenMP support on compilers that automatically support it: OMP=N 2001-03-06 Henry Butowsky * fixed ncdiff problem. There was a conversion error in dmn_dfn * fixed ncrename problem. There was a typo error in nco_rename_var ( it was calling itself) This is the third such error in nco_netcdf.c. 2001-03-02 Charlie Zender * Code fails to compile with -DNO_NETCDF_2 * Code compiles but is buggy. This command fails: ncdiff -O -C -v three_dmn_rec_var in.nc in.nc foo.nc;ncks -H foo.nc As does ncdiff -O -C -v PS nco_tst.nc nco_tst.nc foo.nc * Removed NETCDF2_ONLY code 2001-02-16 Charlie Zender * cvs tag -c nco-1_3_2 * After many minor tweaks, made commits and retagged nco-1_2_2 and this is the version that will be merged into 1_3_1 to create 1_3_2 * Tagged changes until today as nco-1_3_1 and will merge with nco-1_2_2 2001-02-11 Charlie Zender * Figured out that texi2dvi --pdf really does work nicely and am now using it rather than ps2pdf * Tagged and released nco-1_2_2 2001-01-02 Charlie Zender * Clean up some function prototypes, removed crud from nc.h, implemented extern keyword on all functions * Changed ncks print formatting of NC_BYTE data (i.e., signed char) to print as unsigned char data to facilitate printing HDF4 datasets. 2000-12-29 Charlie Zender * Added make NETCDF2=Y to compare netCDF2 behavior with/without HDF libraries. HDF libraries cause ncwa to fail certain tests that work fine with Unidata netcdf2 libraries. All other operators appear fine with HDF libraries. * Added default statements to switch(type) constructs which emitted warnings when compiled with -DNETCDF2_ONLY since, apparently, there are a whole bunch of things besides numeric types in the old nctype enum and gcc warns about enums that are not exhaustively considered in switch() statements. All these default statements can be removed with netCDF3 interface so perhaps these should be surrounded with #ifdef NETCDF2_ONLY constructs, but they actually do make sense for netCDF3 as well so I have implemented a uniform error function, dfl_case_nctype_err(), to be called by all routines which emit errors only when compiled with NETCDF2_ONLY. This makes the behavior easy to modify or remove in the future. * Fixed echoing of Makefile diagnostics * Added HDF4 option to Makefile to facilitate compiling with HDF version of netCDF libraries 2000-11-25 Charlie Zender * Added -q ("quiet") switch to ncks to suppress printing of dimension indices and coordinate values 2000-11-04 Charlie Zender * Created netcdf3 branch with tag netcdf3 and additional version tag nco-1_3. This branch will hold the netcdf3 implmentation while it is in development. When it is ready it will become the main trunk of nco. 2000-10-29 Charlie Zender * Implemented new @command{}, @env{}, and @acronym{} keywords in nco.texi 2000-10-26 Charlie Zender * Fixed makeinfo problem with nco.texi 2000-10-15 Charlie Zender * Implemented Henry's ncrename and nco_tst patches: Former allows renaming of attribute for a single variable, latter cleans up nco_tst.sh and allows easier function-specific testing. 2000-10-01 Charlie Zender * Cast results of sqrt() to LHS type to eliminate new gcc 2.96 warnings. g++ 2.96 is less forgiving than gcc 2.2 * Fixed some miscast missing values in arithmetic routines for doubles, shorts, and longs. Odd that I had not noticed these miscasts before. g++ 2.96 flagged them. 2000-09-21 Charlie Zender * Fixed one-line bug where ncwa min,max,ttl cases fell through to error exit rather than doing nothing with weights * Adding critical regions about netCDF library calls appeared to work. ncwa and ncra/ncea now give repeatable, correct answers when multithreaded. Speedups appear to be about ~30--40% on small numbers of typical GCM files when using 4 threads. Performance appears to level out by 4 threads, although more timing is necessary. For example, ncwa is now spending about 50% on I/O and 50% on computation. 2000-09-20 Charlie Zender * Added OpenMP critical regions to var_get() and var_refresh() * Added OpenMP critical regions around thread-unsafe netCDF write calls in ncwa and ncra/ncea. * Finally removed 1995--1996-era SGI enum workarounds from nc.h SGI compiler on dataproc seems to behave sanely now * Jim Rosinski and Stacy Walters have both pointed out that netCDF is not thread-safe. Therefore the OpenMP implementation is bound to fail until critical locks are added. 2000-09-19 Charlie Zender * Added OpenMP pragmas to ncea,ncra,ncrcat. They probably don't work either. * Multi-threaded version of ncwa averages variables in T42 file correctly sometimes, but also incorrectly. Currently unpredictable what causes discrepancy. * Removed arg_cnt from ncwa.c. ncwa.c now uses standard fl_mk_lst() to diagnose incorrect argument counts 2000-09-18 Charlie Zender * Got OpenMP compiling but not completely working on ncwa under IRIX 2000-09-17 Charlie Zender * Added full OpenMP directives to ncwa. If this works then ncra is next. 2000-09-13 Charlie Zender * Contrary to the documentation, ncflint has always processed coordinate variables. Perhaps fixing coordinate variables is a better idea? Patched var_lst_divide() to fix all non-record coordinate variable to ncflint. Not sure if I will release this though. Perhaps it should be a switch? * Improved ncflint documentation, including its ability to add files 2000-08-31 Charlie Zender * Changed handling of netCDF convetions to search for "Conventions" attribute rather than "convention" attribute Not sure why I ever used "convention" in the first place! This should fix things like gasussian weights being subtracted 2000-08-30 Charlie Zender * Updated var_dup(), var_free() to handle scl_fct.vp, add_fst.vp, srd. That's right, these routines were not handling srd pointer correctly. 2000-08-29 Charlie Zender * Removed tally array from var_avg_reduce_max/min() routines * Added some clarifications to memory handling in the manual, and additional examples provoked by John Sheldon's GFDL netCDF website. * Integrated ncvarid_or_die() and ncdimid_or_die() into ncrename 2000-08-28 Charlie Zender * Tagged nco-1_2_1 * Will all previous changes to nco_malloc(), nco_realloc(), and memory management in general, make tst now seems to be well behaved with Electric Fence, and duplicates answers without Electric Fence. * Another nco_realloc() tweak to satisfy Electric Fence: Now realloc() is never called when size == 0 2000-08-27 Charlie Zender * Automatic type conversions for arithmetic now work in ncwa, ncea, ncra. Don't think ncflint would benefit from the capability. 2000-08-26 Charlie Zender * Changed meaning and name of typ_prv to typ_dsk in var_sct * Moved target dat_cln from cln to dst_cln, opposite for lib_cln * Simplified internals of nco_opr_drv() * Fixed nco_realloc() so it does not call realloc() when ptr==NULL and size==0. Allowing a realloc() call in this situation is ANSI-legal but triggers Electric Fence. 2000-08-25 Charlie Zender * Merged Makefile refinements by Ethan Davis to better support DODS compilations and less redundant building 2000-08-23 Charlie Zender * Functionalized type conversion routines nco_cnv_var_dbl() and nco_cnv_dbl_var() * Fixed x:y bug in opt arg of ncra.c introduced in 1.2 2000-08-14 Charlie Zender * Added this text to the license, provided by Steven G. Johnson "As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the NetCDF and HDF libraries and distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the netCDF and HDF library licenses." This is intended to allow NCO to link to the non-GPL licenses of netCDF and HDF and avoid the "KDE problem". Apparently binaries are considered derived works of any libraries they are statically linked to, i.e., netCDF and/or HDF. This means both licenses must be obeyed, but that is impossible because no license except the GPL is compatible with the GPL. So we the developers of NCO must explicitly grant permission to all users to redistribute NCO under both licenses. 2000-08-03 Charlie Zender * Tagged nco-1_2 * Altered homepage * Added PDF version of manual 2000-07-31 Charlie Zender * Added mathematical definitions of all new operations to manual * Rearranged order of operations in ncwa so that non-linear operations may employ weighting correctly. Weighting is not well-defined for some operations (rmssdn) but I did my best. 2000-07-28 Charlie Zender * Applied final min/max/ttl patch so min/max/ttl capabilities should now work as expected on ncwa,ncea,ncra 2000-07-16 Charlie Zender * Added ncwa min/max/ttl patch 2000-07-09 Charlie Zender * Added section on Contributing/contributors to nco.texi * Fixed case when missing value is first in min and max operators * Added min, max, ttl cases to nco_tst.sh * Added temporary variable to all low-level arithmetic routines (e.g., var_add()) to store missing value in order to reduce dereferencing of pointers to missing values. This may result in measurable speedups for all arithmetic operators. 2000-07-08 Charlie Zender * Applied minmaxttl03 patch 2000-07-02 Charlie Zender * Added nco_op_typ to SGI enum section of nc.h * Update nco/doc/nco_src_frg.txt to include release instructions * Released nco-1.1.48.tar.gz on sourceforge * Switched all memory management to nco_malloc(), nco_realloc() * Implemented min/max/ttl patch (min and ttl not working yet) 2000-06-20 Charlie Zender * Implemented Schweitzer's 'make DODS=Y' patch in Makefile Only works on Linux as configured but that's a start * Added ncvarid_or_die() to replace simple ncvarid() on calls where failure to find variable is an error and a dianostic of which variable is missing would be nice. 2000-06-05 Charlie Zender * Changed ~/nc/nco paths to ~/nco 2000-06-02 Charlie Zender * Added explicity coercion to all lines which generated assignment errors under g++ C++ compiler. This might affect speed of conversions to long, short, char, and byte types from double and float types. These conversions are rare and considered unimportant so any performance penalty is acceptable. * Small changes to make code compile cleanly with g++ C++ compiler * Changed fl_mk_lcl() to try scp instead of rcp. scp should fall through to rcp is sshd is not running on remote machine. * Add Schweitzer's HTTP patch for DODS compatibility to fl_mk_lcl(). Will probably alter implementation in the future so fl_mk_lcl() works without netcdf library as before. NCO should now be DODS compliant when linked to DODS libraries. This allows reading, but not writing, of remote files using HTTP protocol. * Tagged nco1_1_49 as clean new version to start work from sourceforge without any overlaps with 1_1_48 * Had to re-tag nco1_1_48 because sourceforge CVS repository was slightly out of sync with CGD repository * Moved CVS repository to sourceforge 2000-05-16 Charlie Zender * Tagged this as nco1_1_48 * Found and fixed ncdiff bug in TODO #155. Bug had been inserted in ncdiff 1.5 (nco-1.1.15, November 1998) when I switched from using dimension IDs to using dimension names to identify and compare dimensions in var_conform_dim(). Problem was that there are two locations in var_conform_dim() where this needed to be done and I only changed the first location. Then I turned off dimension remapping code in ncdiff which used to take care of the problem. Fortunately I had left that code commented out in ncdiff() so I was able to check that turning it back on solves the problem. Now I have removed old commented-out block from ncdiff (because it was confusing) and all logic is now local to var_conform_dim(). This fix increases the number of strstr() comparisons of dimension names because names must now be compared twice in var_conform_dim() for each variable being expanded. Oh well. 2000-05-12 Charlie Zender * Fixed bug in -d dmn,,,srd case where lmt.end was incorrect 2000-05-10 Charlie Zender * Finished testing of feature allowing skipping of initial files when lmt_typ = dim_idx. Seems to work. Now dim_idx and crd_val hyperslabs may have arbitrary numbers of superfluous files at beginning and end. * Added rec_skp_nsh member to lmt structure to support keeping track of records skipped in superfluous initial files for lmt_typ = dim_idx on multi-file operators 2000-05-09 Charlie Zender * Altered behavior of single point hyperslabs so that single point hyperslabs in the record coordinate (i.e., -d time,1.0,1.0) may be treated differently than single point hyperslabs in other coordinates. Multifile operators will skip files if single point hyperslabs in record coordinate lays outside record coordinate range of file. For non-record coordinates (and for all operators besides ncra and ncrcat on record coordinates), single point hyperslabs will choose the closest value rather than skip the file (I believe). This should be verified. * Switched NCO from atof(), atol() to strtod(), strtol() * Added ability to skip superfluous trailing files to lmt_evl() when limits are coordinate values. Needs testing but appears to work. Had to use a goto statement, icky. Fixes TODO #157? 2000-05-04 Charlie Zender * More fixes to fix problems with Electric Fence 2000-04-18 Charlie Zender * Added ncra ncea to RPM 2000-03-22 Charlie Zender * Added code to prevent malloc'ing 0 bytes because, although it is perfectly legal, Electric Fence complains 2000-03-06 Charlie Zender * Added target rpmnet to Makefile. Usage is sudo make NCO_VRS=1.1.46 rpmnet This downloads specified NCO version, builds RPMs from it, and uploads the RPMs back to NCO FTP site 2000-03-01 Charlie Zender * Added nco.spec to bld directory * Adding rpm target to Makefile 2000-01-27 Charlie Zender * Tagged this as nco-1_1_45 * Fix to PID length bug in fl_out_open() on SGIs Now use dynamically allocated string to hold PID Kudos to Juliana Rew for finding this bug 2000-01-16 Charlie Zender * Changed all addresses except website to UCI ESS * Changed license to GNU GPL (!) 2000-01-14 Charlie Zender * Calling ncwa without arguments now causes operator to print usage and exit successfully * Print error message and hint when ncwa called with -a dim1 -a dim2 instead of -a dim1,dim2 2000-01-10 Charlie Zender * ncks now puts string values inside double quotes, character values inside single quotes, other slight formatting changes too 1999-12-26 Charlie Zender * Tagged this as nco1_1_44 * Documented record coordinate-stride capability for ncra, ncrcat in nco.texi examples and command-line usage routines * Added support for printing all character arrays as strings in ncks 1999-12-14 Charlie Zender * Tagged this as nco1_1_43 * Merged all SGI builds (SGI5,SGI64,SGIMP64) into single makefile block * Added support for C-language escape sequences to ncatted Moved all this code from ncks to new sng_ascii_trn() function 1999-12-06 Charlie Zender * Tagged this as nco1_1_42 * Fixed so that consecutive delimiter strings work, e.g., ncatted -O -a history,global,o,c,"hi,,,hi" in.nc 1999-12-04 Charlie Zender * Fixed bug where ncatted neglected string values after first comma, e.g., would drop ", NCAR" from test attribute in ncatted -O -h -a test,global,o,c,"NREL, NCAR" in.nc because the new attribute value followed the comma delimiter used internally by ncatted to delimit list elements * Fixed so that setting strings to zero length with ncatted works, e.g., ncatted -O -a history,global,o,c,"" in.nc * Fixed attribute printing of lists in ncks: terminal delimiter is no longer appended 1999-11-02 Charlie Zender * Fixed some problems with AIX build environment, switched to -DAIX on the IBM SP cluster environment 1999-10-21 Charlie Zender * Defined MY_BLD_DIR in Makefile before it is used Re-tagged this as nco1_1_41 1999-10-17 Charlie Zender * Tagged this as nco1_1_41 * Added dir to targets which do not rebuild *.d dependencies Doing this and installing latest make-3.78.1 fixes build on dataproc 1999-10-15 Charlie Zender * Tagged this as nco1_1_40 * Added two more ncwa test cases to nco_tst.sh * Fixed another bug in ncwa reported by Keith Lindsay. The denominator in normalized averages did not always account for missing values in the variable being averaged. This bug may have been introduced sometime during ncwa rewrites around 19981201. I'm sure it has not always been there. 1999-10-03 Charlie Zender * Tagged this as nco1_1_39 * Added test target in bld/Makefile. Now `make test' automatically downloads a small (66 kb) file on which it performs a small battery of tests (bld/nco_tst.sh). * Revamped build procedure to use GNU make dependencies rather than makdep perl script. * All *.c files now build cleanly with gcc -Wall * Fixed Makefile bug where Fortran routines were compiled when they were not needed and visa versa * Moved NETCDF_INC and NETCDF_LIB out of architecture specific portions of Makefile 1999-08-31 Charlie Zender * Tagged this as nco1_1_38 * ncwa now averages over all dimensions when none are specified with -a * Patched avg_reduce...() to fix set averages equal to zero when tally is zero. This fixes Keith's problem. * Added ncwa test #12 to nco_tst.sh. This tests for a bug reported by Keith Lindsay where ncwa averaged a variable which is completely missing_value to a value of 0.0 rather than missing_value. * Removed C_ONLY token and made builds completely C-based by default. Introduced new token USE_FORTRAN_ARITHMETIC to build old style NCO with fortran arithmetic routines. Seems to work fine. Translated Fortran date routines newdate() and days2eom() to C as part of this. 1999-08-04 Charlie Zender * Tagged this as nco1_1_37 * Implemented first attempt to use msrcp, seems to work * Tagged this as nco1_1_36 * Improved patch to fl_mk_lcl() so it "does the right thing" when determining whether to try to rcp files 1999-08-03 Charlie Zender * Patched fl_mk_lcl() to exit gracefully on filenames with multiple colons (which are legal in UNIX). Files with single colons in their names, as opposed to rcp requests, still cause core dumps and will continue to do so until I write a routine which determines whether to treat the filename as an rcp request based on some sort of valid hostname recognition algorithm. 1999-07-29 Charlie Zender * Tagged this as nco1_1_35 * Changed WARNING message to print in ncra only when insufficient records have been found and last file has been processed 1999-07-03 Charlie Zender * Tagged this as nco1_1_34 * Altered ncatted behavior to replace missing data values with new missing_value when missing_value attribute changes 1999-05-12 Charlie Zender * Tagged this as nco1_1_33 * Using the new lmt_evl() dim_idx code for operators besides ncra and ncrcat, e.g. ncks, causes problems with wrapped and wrapped stride limits. One line fix to lmt_evl() restored old lmt_evl() dim_idx code to all operators except ncra and ncrcat. The new lmt_evl() code simply will not (and should not) handle wrapped coordinates for the record dimension in multi-file operators. 1999-05-11 Charlie Zender * Tagged this as nco1_1_31 * Fixed ncks problem caused by not initializing all boolean flags of lmt structures in lmt_prs(). Changed lim to lmt. * Tagged this as nco1_1_30 * Tentatively fixed record hyperslab problems introduced in 1_1_29 by extensively generalizing and rewriting lim_evl() * Clarified in User's Guide that default behavior of stride is that -d time,,,srd is syntactically equivalent to -d time,0,,srd * Realized new record dimension features of nco1_1_29 were buggy when min and max limits were not both user-specified because then total number of records cannot be not known a priori 1999-05-10 Charlie Zender * Tagged this as nco1_1_29 * Cleaned up files for a clean compile with gcc -Wall 1999-05-09 Charlie Zender * Toggled behavior of `ncks -a' so that default is now to alphabetize output * Fixed error (missing comma) in stride documentation in User's Guide * Implemented stride for the record dimension in ncra and ncrcat, e.g., ncra -d time,1,100,12 in1.nc in2.nc ... out.nc should now work correctly across files. Currently stride only works on the record dimension of ncra and ncrcat, however, not the rest of the dimensions. * Implemented index-based hyperslabbing across files in the record dimension in the multi-file operators ncra and ncrcat, e.g., ncra -d time,1,100 in1.nc in2.nc ... out.nc. The User's Guide said this feature had already been implemented, but that, apparently, was not true. The symptom was an "index out of range error" from netCDF. 1999-04-27 Charlie Zender * Tagged and released this as nco1_1_28 * Isolated build procedure in nco_dst.pl with --bld option, off by default * Added --dat_cnt to nco_dst.pl to support dataproc.ucar.edu * Added SGIMP64 architecture to Makefile to support dataproc.ucar.edu. Default netCDF lib is r4i4 rather than r4i8 as on winterpark so I am avoiding the whole issue by using C_ONLY defaults and spoofing SGI64. nco_tst.sh executed without errors. 1999-04-20 Charlie Zender * Tagged and released this as nco1_1_26 * Fixed so arguments to log10() are reasonable * Tagged and released this as nco1_1_25 * New version requires -lm for log() and ceil() functions Added -lm to Makefile for some architecture which were missing it * Tagged and released this as nco1_1_24 * Fixed bug where ncrcat and ncra omitted the last slice of the record dimension when -F (Fortran indexing) was user-specified AND user-specified hyperslab information was provided for some dimensions BUT not for the record dimension. This bug only affected ncrcat and ncra and only under these conditions. Thanks to John Sheldon for pointing this out. 1999-04-04 Charlie Zender * Tagged and released this as nco1_1_22 * Added -a switch to ncks for alphabetizing the output list. Added index_alpha() and changed lst_heapsort() to accept an boolean switch argument to accomplish this. 1999-02-25 Charlie Zender * Added partial diagnostic message and workaround for TODO #116 1999-01-29 Charlie Zender * Added nco_dst.pl to distribution * Changed ALPHA makefile to support native compilers (untested) * Added NETCDF2_ONLY option to circumvent ncdiff nc_inq_vartype() call. 1999-01-24 Charlie Zender * Moved index.shtml to NCO doc directory Thu Jan 21 15:23:02 1999 Charlie Zender * Tagged and released this as nco1_1_20 * Updated various portions of User's Guide * Added NETCDF2_ONLY token to eliminate nc_inq_libvers() call 1999-01-13 Charlie Zender * Fixed bug in var_def() where wrong branch was executed when called by ncwa for files with no output dimensions. Symptom was a core dump or "ncvardef: ncid 4: Invalid dimension id or name" error. Wed Jan 6 17:55:26 1999 Charlie Zender * Tagged and released this as nco1_1_18 * Added kludge to ncwa to workaround bug in var_conform_dim() where var_conform_dim() sometimes allows the returned weight not to have same size tally array as the template variable. This caused core dumps in ncwa. Fri Dec 4 15:06:23 1998 Charlie Zender * Tagged and released this as nco1_1_16 * Added new logic switch DO_CONFORM to var_conform_dim() to allow ncwa to tell when to mask variables. Reran test cases, everything seems to be working. Documentation seems up-to-date. 1998-12-03 Charlie Zender * Tagged and released this as nco1_1_15 * Disabled ncwa -n and -W normalization options until I think of better way to implement them. -N option now causes ncwa not to divide by the denominator. Disabled -n and -W tests in nco_tst.sh (tests #2 and #3). 1998-12-02 Charlie Zender * Changed ncwa to default to weighting coordinates just like variables, i.e., toggle default value of -I switch * Added more exhaustive ncwa tests to nco_tst.sh * Rewrote ncwa section of User's Guide 1998-12-01 Charlie Zender * Made sure ncwa weights were being masked when normalization was invoked. Formerly, they were not. This was a bug. The bug is now fixed. * Rearranged normalization logic of ncwa * Removed special treatment of "gw" from ncwa 1998-11-25 Charlie Zender * Allow hyperslab coordinate specification in exponential format even when decimal point is missing, e.g., "-d lon,36e1" is valid * var_conform_dim() now checks dimension names rather than IDs Mon Nov 23 17:29:02 1998 Charlie Zender * Added -I switch to ncwa to enable weighting and masking of coordinates. Rewrote var_conform_dim() to allow mutually exclusive dimensions in ncwa. 1998-11-01 Charlie Zender * Added wrapped coordinate caveats to hyperslabe section of manual, and implemented warning message whenever wrapped coordinates are used. Sat Oct 31 14:56:33 1998 Charlie Zender * Tagged and released this as version nco1_1_10 1998-10-29 Charlie Zender * Fixed bug in ncra which only occured when NC_CHAR and NC_BYTE types also had a record dimension. var_lst_divide() decided these should be fixed variables, thus the output file size included the record dimension. The timecom variable in LSM history files was triggering this bug. Solution was to make ncra, like ncrcat, simply process ALL record variable even NC_CHAR and NC_BYTE, though the averaging operation on these types is still ill-defined. Wed Aug 26 16:30:27 1998 Charlie Zender * Fixed bld/nco_tst.sh to work again at NCAR. `make test' now performs non-trivial tests of ncwa and ncdiff. Only works at NCAR (a necessary input file is rather large). Wed Aug 19 11:26:25 1998 Charlie Zender * Fixed bug where pvmgetarch returned "SGI" on UNICOS 10.0.0. * Improved Makefile fortran switches and added convenience housekeeping targets. * Fixed bug where cvs_vrs_prs() crashed with -kkv exports 1998-08-18 Charlie Zender * Added nco_vrs_prs() to parse NCO versions. NCO version is now always printed with -r option. * Fixed bug where -n NINTAP list did not recognize `.cdf' suffixes. Mon Aug 10 21:53:34 1998 Charlie Zender * Split ncks -m option into -m and -M so now global metadata can be avoided if desired. * Fixed bug in ncrename where fl_in could be free()'d before it was malloc()'d in fl_nm_prs(). * Fixed bug in ncdiff where variables of same rank but different types would cause core dump when being subtracted. Improved diagnostics for failures with ncdiff. 1998-07-07 Charlie Zender * Added -h option (suppresses history concatentation) to all operators. Changed existing ncks -h option to -m (for metadata). Sun Jun 7 17:45:20 1998 Charlie Zender * Added more descriptive error diagnostics to ncvarid() calls to var_lst_mk() ncks to report the names of user-specified variables which do not exist in input files. 1998-05-16 Charlie Zender * Improved nc_lib_vers_prn() 1998-05-08 Charlie Zender * Added improved error diagnostics to ncks when -A fails. Added improved error diagnostics to fl_out_close() and fl_mv(). -r now prints library version for all operators. -r and usg_prn() now prints NCO homepage URL. Wed Mar 11 11:16:39 1998 Charlie Zender * Removed warning message for processed text fields in ncecat. Mon Mar 2 22:00:59 1998 Charlie Zender * Added nc_inq_libvers() call to ncwa to diagnose SGI problems. This is the first netCDF 3.x call in NCO. There's no stopping the avalanche now, so user's must install netCDF3.x Mon Feb 9 09:50:26 1998 Charlie Zender * Merged all three ncwa loops that access output and tally buffers so that these buffers can be allocated and deleted inside the main loop over variables. This reduces peak memory consumption by a factor of three and sustained memory by a factor of two to three. ncwa performance should be noticeably enhanced by this. This problem affected, and this fix improves, only the ncwa operator. Sun Feb 8 21:50:32 1998 Charlie Zender * Downloaded and altered pvmgetarch from pvm3.4b6. This version was returning SGI instead of CRAY on Ouray (=Cray J90 Unicos 10.0.0) because pvmgetarch thinks machines with /bin/4D are SGI. Distributing this customized version of pvmgetarch with NCO. Also changed new pvmgetarch so it returns SUNMP on any Sun multiprocessor, regardless of whether PVM_SHMEM is set to ON. Mon Jan 19 13:13:08 1998 Charlie Zender * Added HTML keywords and section on large numbers of files to the NCO User's Guide. * Eliminated compiler warnings caused by type--format mismatches from all source code. Should now compile without warnings on SGI. * Removed -ansi switch from Linux CFLAGS in order to support glibc2. glibc2 considers resolv.h non ANSI so that using the -ansi swithc results in unresolved tokens in system #include files. Tue Dec 2 21:35:19 1997 Charlie Zender * Added fl_nm_nbr_max and fl_nm_nbr_min as optional arguments 4 and 5, respectively, to the -n switch on the multi-file operators. This allows the NINTAP automatic filename generation feature to handle input sets of cyclic filenames whose suffixes grow to fl_nm_nbr_max and then wrap back to fl_nm_nbr_min. Now, e.g., DJF files may be specified with -n 3,2,1,12,1. Fri Nov 14 14:20:23 1997 Charlie Zender * Added additional diagnostics concerning record dimensions to ncra and ncrcat. ncra and ncrcat now exit when called to operate on files without record dimensions. * Made ncar_csm_date() more fault tolerant for files which do not adhere to de facto atmospheric model time conventions involving date, time, nbdate. 1997-11-04 Charlie Zender * Added error diagnostics for large malloc()'s in ncwa and var_dup in nc_utl.c. These should aid in identifying causes for core dumps when running with extremely large files or insufficient memory. Fri Oct 17 12:53:54 1997 Charlie Zender * Deprecated checking for "gw" for NCAR CSM conformance and replaced it with comparing global attribute "convention"'s value to "NCAR-CSM". Fixed up ncar_csm_date accordingly and rewrote warning messages. * Improved usg_prn for ncatted. 1997-10-12 Charlie Zender * Fixed fl_out_open() to abort after receiving more than 10 incorrect user responses. This fixes a bug where NCO would crash in non-interactive shells when the -O or -A options were omitted. 1997-10-07 Charlie Zender * Finished ncatted documentation. Cleaned up code to avoid compilation errors with SGI on memcpy(). Touched up manual. Releasing this as NCO Version 1.1. Sun Sep 21 15:08:49 1997 Charlie Zender * Merged WIN32 modifications into distribution. Added WIN32 and C_ONLY tokens to code. Relinked with netCDF 3.3.1, had no problems. Tue Sep 16 23:53:44 1997 Charlie Zender * Wrote ncatted. * Fixed ncks to omit trailing commas after printing scalar attribute values. Thu Aug 28 17:07:50 1997 Charlie Zender * Rewrote ncdiff documention, which had many errors and omissions. Sat Jun 28 23:26:40 1997 Charlie Zender * Fixed bug in cpy_var_val_lim() in ncks.c which caused core dumps when hyperslabbing on multiple coordinates where at least one of the coordinates was wrapped. Tue Jun 17 14:15:53 1997 Charlie Zender * Changed Makefile compile rules for f90 on CRAY to explicitly preprocess *.F files. This had stopped working, perhaps when I switched CRAY default from f77 to f90. Fri May 30 13:12:25 1997 Charlie Zender * Improved mss_val_get to allow any NC_TYPE for missing_value attribute. This was needed for ARM files which store missing_value as an NCCHAR. Converting NCCHAR to short, long, float, or double now uses strdod() instead of implicit type conversion. * Added routines to process time variables in ARM files. * Added hyam,hybm,hyai,hybi to list of variables which will not be differenced by ncdiff. * ncdiff now chooses mss_val from either file where it's valid, and from fl_1 when it's valid in both. This fixed the last known bug in NCO. Tue May 27 00:08:23 1997 Charlie Zender * Moved var_refresh() out of inner loop to file loop level in ncra.c. This should speed things up a little because var_refresh() can be an expensive call since it calls mss_val_get(). * Altered mss_val_get to accomodate missing_value attributes whose type did not match their variable's type. Also made allowance for missing_value's of type NC_CHAR, as in ARM data files. Added three routines, arm_inq(), arm_time_mk(), and arm_time_install(), which implemente the ARM convention time=base_time+time_offset convention in ncrcat. Fri May 16 16:28:02 1997 Charlie Zender * Fixed bug in srt vector in ncdiff. Now ncdiff should be working with hyperslabs. Mon May 5 17:55:00 1997 Charlie Zender * Implemented nclong fix for SGI64. This involved very slight changes: made defs.h:ptr_unn->lp point to nclong rather than long cast_void_nctype():ptr->lp evaluates to (nclong *). Sun Mar 30 15:26:10 1997 Charlie Zender * added and removed some return() statements to nc_utl.c to stop compiler warnings from SGI cc. * fixed small memory leak and bug in var_srt_zero() where var->srt was being allocated twice, and the xrf sct was pointing to the copy that had not been zeroed. Thu Mar 27 15:13:18 1997 Charlie Zender * Removed ncap from target all in Makefile * Added section describing differences between ncra, ncea, ncrcat, and ncecat to nco.texi. * Fixed memory leak in ncecat in which memory never seemed to be deallocated until the end of the file loop. Wed Mar 26 21:13:09 1997 Charlie Zender * Added nco.ps, nco.dvi, nco.html, texi2html, texi2dvi to distribution * Changed ncks -s option to accept full printf() style format strings * Fixed memory leak in var_get() in nc_utl.c which caused memory to be allocated twice. This also fixed longstanding performance problem where ncrcat() allocated memory for entire array not just current record. Thanks to jps@GFDL.GOV (John Sheldon) for discovering this bug. * General release of nco-0.9 on netCDF and CCM mailing lists Thu Feb 8 23:01:04 MST 1996 Charlie Zender * First internal CGD release of operator set known as ncz-0.9 Sat May 15 23:01:04 MST 1993 Charlie Zender * First RCS snapshot of ncks.c in directory nc. ncks.c began life as c_template.c nco-4.5.4/doc/LICENSE000066400000000000000000000015271264355130400140650ustar00rootroot00000000000000All source code created by the NCO project and distributed with NCO is re-distributable under the terms of the GNU General Public License (GPL) Version 3. The full license text is at http://www.gnu.org/copyleft/gpl.html and in the file COPYING. Copyright information is in the file COPYRIGHT. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. nco-4.5.4/doc/MANIFEST000066400000000000000000000362501264355130400142120ustar00rootroot00000000000000$Header$ -*-text-*- This file enumerates the files in the NCO distribution and, where appropriate, describes the purpose of the file. Files with a (v) indicator are volatile Volatile files are created automatically (e.g., by invoking ./configure) and may not be present in pristine source trees. Top-level files: AUTHORS Whom to praise and blame CITATION How and why to cite NCO in your work COPYING GNU General Public License GPL3 COPYRIGHT Copyright information INSTALL Boilerplate instructions for ./configure LICENSE License details acinclude.m4 NCO M4 macro definitions used by aclocal to generate aclocal.m4 aclocal.m4 M4 macros generated from acinclude.m4 by aclocal autogen.sh Gather all autotools necessary to run autoconf config.h.in(v) Template header file generated from configure.ac by autoheader config.h NCO header file generated from configure.ac by autoconf config.guess(v) config.log(v) config.status(v) config.sub(v) configure.eg Example ./configure invocations by architecture and compiler configure.ac Template used by autoconf to generate configure script configure NCO configuration script generated by autoconf from configure.ac conftest(v) Directory used by configure to perform tests libtool(v) Makefile Top-level Makefile created by configure from Makefile.in Makefile.am NCO directory structure used by automake to create Makefile.in Makefile.in Makefile template created from Makefile.am by automake and used by autoconf README.md GitHub Repository description in markdown format stamp-h1(v) Time-stamp .gitignore Git ignore .travis.yml Travis automated test-builds Top-level directories: nco/autobld Files related to and used by autotools: autoconf/automake/autolib nco/bin Binary directory for NCO binary executable nco/bld Build directory for Makefile and ancillary scripts nco/bm Benchmark directory and related plot scripts nco/debian Scripts for Debian GNU/Linux .deb builds nco/data Sample I/O datasets nco/doc Documentation and logos nco/m4 M4 macros for libtool nco/man Man pages nco/obj Object files nco/qt Qt and Visual Studio project files nco/src Source files Autotools directory: nco/autobld/compile Wrapper for compilers which do not understand '-c -o' nco/autobld/fxm Many files need documentation here (nco/autobld/mdate-sh) (Formerly needed by TeXInfo for version.texi, could be installed by automake --add-missing) Binary directory: nco/bin/README Description of binary directory Benchmark directory: nco/bm/gcm_T85.cdl CDL template files for ncgen nco/bm/tms_lng.cdl CDL template files for ncgen nco/bm/stl_5km.cdl CDL template files for ncgen nco/bm/nco_bm.pl Core perl app that calls rest of BM pieces nco/bm/nco_bm_benchmarks.pl Benchmark tests nco/bm/nco_bm_md5wc_tbl.pl Hash table for MD5 and wc values nco/bm/NCO_bm.pm Common code for nco_bm.pl nco/bm/NCO_rgr.pm Regression tests. nco/bm/mk_bm_plots.pl Perl script to autoplot benchmark data nco/bm/nco_bm.sh Script to run nco_bm.pl for various platforms Build directory: nco/bld/Makefile Hand-crafted Makefile to create NCO executables nco/bld/nco_dst.pl Perl script to build NCO distributions nco/bld/pbuilder-sid Use pbuilder to build NCO in a chroot environment nco/bld/pvmgetarch Script used by Makefile to determine native machine type nco/bld/libnco_c++_tst.cc Simplest front end to exercise libnco_c++.a nco/bld/libnco_tst.c Simplest front end to exercise libnco.a Data Directory: nco/data/Makefile(v) Autotools-generated Makefile nco/data/Makefile.am Automake instructions nco/data/Makefile.in(v) Autotools-generated Makefile nco/data/big.cdl CDL file to test huge netCDF files nco/data/bin_cnt.nco ncap2 sample script that bins wind speeds nco/data/cf2.cdl CDL file to test CF group extensions nco/data/cmip5.cdl CDL file to test ncbo functionality on groups nco/data/cnk.cdl CDL file to test chunking nco/data/ddra.nco Sample ncap2 script that computes DDRA statistics nco/data/dsm.cdl CDL file to test ncdismember nco/data/hdn.cdl CDL file to test hidden attributes nco/data/hdr_pad.sh Utility to check size of metadata header nco/data/in.cdl CDL file to generate netCDF test file in.nc nco/data/in_1.cdl CDL file to test 2 input file operators nco/data/in_2.cdl CDL file to test 2 input file operators nco/data/in_4.cdl CDL file to generate netCDF4 test file in_4.nc nco/data/in_grp.cdl CDL file to test netCDF4 group functionality nco/data/in_grp_1.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_2.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_3.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_4.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_5.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_6.cdl CDL file to test ncbo functionality on groups nco/data/in_grp_7.cdl CDL file to test ncbo functionality on groups nco/data/in_rec_zero.cdl CDL file to test zero-record files nco/data/mdl_1.cdl CDL file to test ensemble operations nco/data/mdl_2.cdl CDL file to test ensemble operations nco/data/mrd.cdl CDL file to test multiple record dimensions nco/data/ncap.in Sample ncap input script nco/data/ncap.in2 ncap script to demonstrate #include capabilities nco/data/ncap2.in Sample ncap2 input script nco/data/ncap2_tst.nco ncap2 self-printing test script nco/data/ncl.ncl NCL script to compare to NCO scripts for speed nco/data/nco_bnch.sh Old (deprecated) NCO benchmark script nco/data/ncremap ncremap operator nco/data/netcdf4.nco Sample input script for netCDF4-enabled ncap2 nco/data/obs.cdl CDL file to test group broadcasting nco/data/psd.nco Sample ncap2 script that computes particle size distributions nco/data/psd_wrf.nco Sample ncap2 script that computes WRF particle size distributions nco/data/sld_nco.sh NCO script to process (regrid) Swath-Like Data (SLD) nco/data/swamp.sh Demonstrate SWAMP usage nco/data/tst.nco Sample ncap script that computes geophysical quantities nco/data/udunits.dat UDUnits database for Debian compatibility nco/data/xmp_500mb_hgt.nco ncap2 script to compute 500 mb height field Documentation directory: nco/doc/ANNOUNCE Announcement to accompany release notifications nco/doc/ChangeLog Chronological log of NCO changes nco/doc/LICENSE License and legal information nco/doc/MANIFEST This file. Describes all files in distribution nco/doc/README Description of NCO nco/doc/README_Fedora Short instructions for Fedora users nco/doc/TAG CVS tag for this version nco/doc/TODO List of tasks for future releases nco/doc/VERSION NCO version nco/doc/beta.txt Availability of beta- or pre-release Debian packages nco/doc/build_hints.shtml Hints to build from source nco/doc/debian.txt Creating and updating Debian NCO .deb packages nco/doc/dir Example Info file to load nco.info nco/doc/dods.sh Install OPeNDAP 3.4.X for NCO DAP-enabled clients nco/doc/doe.jpg DOE logo (JPG format) nco/doc/endorsements.txt Statements of support for NCO nco/doc/help.txt Advertisement for help with NCO (outdated---from 2000) nco/doc/highlights_old.shtml Short summaries of old releases nco/doc/index.shtml NCO website homepage nco/doc/logo_srl.png NCO spiral logo PNG raster format nco/doc/logo_srl.svg NCO spiral logo Scalable Vector Graphic format nco/doc/logo_srl.xcf NCO spiral logo GIMP format nco/doc/milestones_old.shtml Milestones in old releases nco/doc/mpi.txt MPI Environments for NCO nco/doc/my-bib-macros.texi TeXInfo bibliography macros for nco.texi nco/doc/nasa.png NASA logo (PNG format) nco/doc/ncap.txt Description of the ncap operator (not yet used) nco/doc/nco.dvi(v) NCO User's Guide: DVI format nco/doc/nco.html(v) NCO User's Guide: HTML format nco/doc/nco.info(v) NCO User's Guide: Info format nco/doc/nco.pdf(v) NCO User's Guide: Portable Document Format nco/doc/nco.png NCO Webpage icon (PNG format) nco/doc/nco.ps(v) NCO User's Guide: Postscript format nco/doc/nco.texi NCO User's Guide: TeXInfo format nco/doc/nco_news.shtml NCO news archive nco/doc/netcdf.h.3.6.3 Version 3.6.X of netcdf.h for backward compatibility nco/doc/netcdf4.sh Install latest netcdf4 and HDF libraries for NCO nco/doc/nsf.png NSF logo (PNG format) nco/doc/opendap.sh Install OPeNDAP 3.5.X for NCO DAP-enabled clients nco/doc/problems_old.shtml Summaries of old bugs nco/doc/surfit.txt Summer research project advertisement for UCI nco/doc/tags_doc.sh Generate Emacs tags for all NCO documents nco/doc/valgrind.txt Valgrind suppressions file for debugging NCO Man-page Directory: nco/man/Makefile(v) Autotools-generated Makefile nco/man/Makefile.am Automake instructions nco/man/Makefile.in(v) Autotools-generated Makefile nco/man/ncap.1 ncap man page nco/man/ncatted.1 ncatted man page nco/man/ncbo.1 ncbo man page nco/man/nces.1 nces man page nco/man/ncecat.1 ncecat man page nco/man/ncflint.1 ncflint man page nco/man/ncks.1 ncks man page nco/man/nco.1 NCO man page nco/man/ncpdq.1 ncpdq man page nco/man/ncra.1 ncra man page nco/man/ncrcat.1 ncrcat man page nco/man/ncremap.1 ncremap man page nco/man/ncrename.1 ncrename man page nco/man/ncwa.1 ncwa man page Object directory: nco/obj/README Description of object directory Portable Object Template directory: nco/po/nco.pot Portable Object Template file for NCO Portable Object Spanish directory: nco/po/es/nco.po Portable Object Spanish translations for NCO Portable Object French directory: nco/po/fr/nco.po Portable Object French translations for NCO Source code directories: nco/src/nco Source for base NCO library and operators nco/src/nco_c++ Source for libnco_c++ C++ interface to netCDF API nco/src/nco++ Source for NCO C++ operators (ncap2) and libnco++ NCO base library and operators source directory: nco/src/nco/Makefile(v) Autotools-generated Makefile nco/src/nco/Makefile.am Automake instructions nco/src/nco/Makefile.in(v) Autotools-generated Makefile nco/src/nco/libnco.h All-inclusive libnco header nco/src/nco/mpncbo.c mpncbo main() MPI-enabled nco/src/nco/mpncecat.c mpncecat main() MPI-enabled nco/src/nco/mpncflint.c mpncflint main() MPI-enabled nco/src/nco/mpncpdq.c mpncpdq main() MPI-enabled nco/src/nco/mpncra.c mpncra/mpnces/mpncrcat main() MPI-enabled nco/src/nco/mpncwa.c mpncwa main() MPI-enabled nco/src/nco/ncap.c ncap main() MPI-enabled nco/src/nco/ncap.h nco/src/nco/ncap_lex.c(v) Generated by ncap_lex.l nco/src/nco/ncap_lex.l nco/src/nco/ncap_utl.c nco/src/nco/ncap_yacc.c(v) Generated by ncap_yacc.y nco/src/nco/ncap_yacc.y nco/src/nco/ncatted.c ncatted main() nco/src/nco/ncbo.c ncbo main() nco/src/nco/ncecat.c ncecat main() nco/src/nco/ncflint.c ncflint main() nco/src/nco/ncks.c ncks main() nco/src/nco/nco.h NCO library low-level header nco/src/nco/nco_att_utl.c nco/src/nco/nco_att_utl.h nco/src/nco/nco_aux.c nco/src/nco/nco_aux.h nco/src/nco/nco_bnr.c nco/src/nco/nco_bnr.h nco/src/nco/nco_cln_utl.c nco/src/nco/nco_cln_utl.h nco/src/nco/nco_cnf_dmn.c nco/src/nco/nco_cnf_dmn.h nco/src/nco/nco_cnf_typ.c nco/src/nco/nco_cnf_typ.h nco/src/nco/nco_cnk.h nco/src/nco/nco_cnk.c nco/src/nco/nco_cnv_arm.c nco/src/nco/nco_cnv_arm.h nco/src/nco/nco_cnv_csm.c nco/src/nco/nco_cnv_csm.h nco/src/nco/nco_ctl.c nco/src/nco/nco_ctl.h nco/src/nco/nco_dbg.c nco/src/nco/nco_dbg.h nco/src/nco/nco_dmn_utl.c nco/src/nco/nco_dmn_utl.h nco/src/nco/nco_fl_utl.c nco/src/nco/nco_fl_utl.h nco/src/nco/nco_getopt.c nco/src/nco/nco_getopt.h nco/src/nco/nco_grp_trv.c nco/src/nco/nco_grp_trv.h nco/src/nco/nco_grp_utl.c nco/src/nco/nco_grp_utl.h nco/src/nco/nco_lmt.c nco/src/nco/nco_lmt.h nco/src/nco/nco_lst_utl.c nco/src/nco/nco_lst_utl.h nco/src/nco/nco_md5.h nco/src/nco/nco_md5.c nco/src/nco/nco_mmr.c nco/src/nco/nco_mmr.h nco/src/nco/nco_mpi.h nco/src/nco/nco_msa.c nco/src/nco/nco_msa.h nco/src/nco/nco_mss_val.c nco/src/nco/nco_mss_val.h nco/src/nco/nco_netcdf.c NCO-independent C wrappers for libnetcdf nco/src/nco/nco_netcdf.h NCO-independent C wrappers for libnetcdf nco/src/nco/nco_omp.c nco/src/nco/nco_omp.h nco/src/nco/nco_pck.c nco/src/nco/nco_pck.h nco/src/nco/nco_ppc.c nco/src/nco/nco_ppc.h nco/src/nco/nco_prn.c nco/src/nco/nco_prn.h nco/src/nco/nco_rec_var.c nco/src/nco/nco_rec_var.h nco/src/nco/nco_rgr.c nco/src/nco/nco_rgr.h nco/src/nco/nco_rth_flt.c nco/src/nco/nco_rth_flt.h nco/src/nco/nco_rth_utl.c nco/src/nco/nco_rth_utl.h nco/src/nco/nco_scl_utl.c nco/src/nco/nco_scl_utl.h nco/src/nco/nco_scm.c nco/src/nco/nco_scm.h nco/src/nco/nco_sld.c nco/src/nco/nco_sld.h nco/src/nco/nco_sng_utl.c nco/src/nco/nco_sng_utl.h nco/src/nco/nco_srm.c nco/src/nco/nco_srm.h nco/src/nco/nco_typ.h nco/src/nco/nco_uthash.h nco/src/nco/nco_var_avg.c nco/src/nco/nco_var_avg.h nco/src/nco/nco_var_lst.c nco/src/nco/nco_var_lst.h nco/src/nco/nco_var_rth.c nco/src/nco/nco_var_rth.h nco/src/nco/nco_var_scv.c nco/src/nco/nco_var_scv.h nco/src/nco/nco_var_utl.c nco/src/nco/nco_var_utl.h nco/src/nco/ncra.c ncra/nces/ncrcat main() nco/src/nco/ncrename.c ncrename main() nco/src/nco/ncwa.c ncwa main() NCO C++ interface to netCDF directory: nco/src/nco_c++/ChangeLog nco/src/nco_c++/INSTALL nco/src/nco_c++/Makefile(v) Autotools-generated Makefile nco/src/nco_c++/Makefile.am Automake instructions nco/src/nco_c++/Makefile.in(v) Autotools-generated Makefile nco/src/nco_c++/Makefile.old Hand-edited Makefile for developers nco/src/nco_c++/README nco/src/nco_c++/TODO nco/src/nco_c++/tst.cc Front-end program to test libnco_c++ nco/src/nco_c++/libnco_c++.hh All-inclusive libnco_c++ header nco/src/nco_c++/nco_att.cc C++ wrappers for libnetcdf attribute routines nco/src/nco_c++/nco_att.hh C++ wrappers for libnetcdf attribute routines nco/src/nco_c++/nco_dmn.cc C++ wrappers for libnetcdf dimension routines nco/src/nco_c++/nco_dmn.hh C++ wrappers for libnetcdf dimension routines nco/src/nco_c++/nco_fl.cc C++ wrappers for libnetcdf file routines nco/src/nco_c++/nco_fl.hh C++ wrappers for libnetcdf file routines nco/src/nco_c++/nco_hgh.cc High-level C++ routines to control libnco_c++ nco/src/nco_c++/nco_hgh.hh High-level C++ routines to control libnco_c++ nco/src/nco_c++/nco_utl.cc Low-level C++ routines used by libnco_c++ nco/src/nco_c++/nco_utl.hh Low-level C++ routines used by libnco_c++ nco/src/nco_c++/nco_var.cc C++ wrappers for libnetcdf variable routines nco/src/nco_c++/nco_var.hh C++ wrappers for libnetcdf variable routines NCO C++ operators (ncap2) and libnco++ directory: nco/src/nco++/Makefile(v) Autotools-generated Makefile nco/src/nco++/Makefile.am Automake instructions nco/src/nco++/Makefile.in(v) Autotools-generated Makefile nco/src/nco++/Makefile.old Hand-edited Makefile for developers nco/src/nco++/Invoke.cc nco/src/nco++/libnco++.hh All-inclusive libnco++ header nco/src/nco++/ncap2.cc ncap2 main() nco/src/nco++/ncap2.hh nco/src/nco++/Ncap2.hh nco/src/nco++/ncap2_utl.cc nco/src/nco++/NcapVar.cc nco/src/nco++/NcapVar.hh nco/src/nco++/NcapVarVector.cc nco/src/nco++/NcapVarVector.hh nco/src/nco++/NcapVector.hh nco/src/nco++/ncoGrammer.g ncap2 ANTLR grammer nco/src/nco++/ncoLexer.cpp(v) nco/src/nco++/ncoLexer.hpp(v) nco/src/nco++/ncoParser.cpp(v) nco/src/nco++/ncoParser.hpp(v) nco/src/nco++/ncoParserTokenTypes.hpp(v) nco/src/nco++/ncoParserTokenTypes.txt nco/src/nco++/ncoEnumTokenTypes.hpp(v) Derived from ncoParserTokenTypes.hpp nco/src/nco++/ncoTree.cpp(v) nco/src/nco++/ncoTree.hpp(v) nco/src/nco++/nco_antlr_pst_prc.pl Perl script to post-process ANTLR files nco/src/nco++/sdo_utl.cc Stand-alone C++ utilities C++ code nco/src/nco++/sdo_utl.hh Stand-alone C++ utilities header, templates nco/src/nco++/VarOp.hh nco-4.5.4/doc/Makefile.am000066400000000000000000000024031264355130400151060ustar00rootroot00000000000000# $Header$ -*-makefile-*- # fxm: 20150923 Allow for building documentation (man pages) without TeXInfo info_TEXINFOS = nco.texi EXTRA_DIST = nco nco.dvi nco.html nco.pdf nco.ps nco.xml VERSION # csz 20061120 override default MAKEINFOHTML defaults: # --ifinfo: Treat HTML branches same as info branches # --output=html: Output to html directory # Unfortunately, autoconf overrides --output # AM_MAKEINFOHTMLFLAGS = --ifinfo # Create single HTML file instead of file-per-node AM_MAKEINFOHTMLFLAGS = --ifinfo --no-split ## Automake manual section 14: ## If configure built it, 'distclean' should delete it ## If make built it, 'clean' should delete it #CLEANFILES = nco nco.dvi nco.info* nco.pdf nco.ps nco.txt nco.xml # ## Additions for NCO; automake may support these later on ## .PHONY tells make to remake the following non-file targets #.PHONY: html_docs pdf_docs txt_docs xml_docs #html_docs = nco.html #.texi.html: # $(MAKEINFO) --html --ifinfo --no-split --output=$@ $< ## $(MAKEINFO) --html --no-split $< #pdf_docs = nco.pdf #.texi.pdf: # $(TEXI2DVI) --pdf $< ##ps_docs = nco.ps ##.texi.ps: ## dvips -o $@ $< #txt_docs = nco.txt #.texi.txt: # $(MAKEINFO) --no-headers --output=$@ $< #xml_docs = nco.xml #.texi.xml: # $(MAKEINFO) --xml --ifinfo --no-split --output=$@ $< nco-4.5.4/doc/Makefile.in000066400000000000000000000615141264355130400151270ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = doc ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = AM_V_DVIPS = $(am__v_DVIPS_@AM_V@) am__v_DVIPS_ = $(am__v_DVIPS_@AM_DEFAULT_V@) am__v_DVIPS_0 = @echo " DVIPS " $@; am__v_DVIPS_1 = AM_V_MAKEINFO = $(am__v_MAKEINFO_@AM_V@) am__v_MAKEINFO_ = $(am__v_MAKEINFO_@AM_DEFAULT_V@) am__v_MAKEINFO_0 = @echo " MAKEINFO" $@; am__v_MAKEINFO_1 = AM_V_INFOHTML = $(am__v_INFOHTML_@AM_V@) am__v_INFOHTML_ = $(am__v_INFOHTML_@AM_DEFAULT_V@) am__v_INFOHTML_0 = @echo " INFOHTML" $@; am__v_INFOHTML_1 = AM_V_TEXI2DVI = $(am__v_TEXI2DVI_@AM_V@) am__v_TEXI2DVI_ = $(am__v_TEXI2DVI_@AM_DEFAULT_V@) am__v_TEXI2DVI_0 = @echo " TEXI2DVI" $@; am__v_TEXI2DVI_1 = AM_V_TEXI2PDF = $(am__v_TEXI2PDF_@AM_V@) am__v_TEXI2PDF_ = $(am__v_TEXI2PDF_@AM_DEFAULT_V@) am__v_TEXI2PDF_0 = @echo " TEXI2PDF" $@; am__v_TEXI2PDF_1 = AM_V_texinfo = $(am__v_texinfo_@AM_V@) am__v_texinfo_ = $(am__v_texinfo_@AM_DEFAULT_V@) am__v_texinfo_0 = -q am__v_texinfo_1 = AM_V_texidevnull = $(am__v_texidevnull_@AM_V@) am__v_texidevnull_ = $(am__v_texidevnull_@AM_DEFAULT_V@) am__v_texidevnull_0 = > /dev/null am__v_texidevnull_1 = INFO_DEPS = $(srcdir)/nco.info TEXINFO_TEX = $(top_srcdir)/autobld/texinfo.tex am__TEXINFO_TEX_DIR = $(top_srcdir)/autobld DVIS = nco.dvi PDFS = nco.pdf PSS = nco.ps HTMLS = nco.html TEXINFOS = nco.texi TEXI2DVI = texi2dvi TEXI2PDF = $(TEXI2DVI) --pdf --batch MAKEINFOHTML = $(MAKEINFO) --html DVIPS = dvips am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__installdirs = "$(DESTDIR)$(infodir)" 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__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/autobld/mkinstalldirs \ $(top_srcdir)/autobld/texinfo.tex AUTHORS ChangeLog NEWS \ README TODO DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # fxm: 20150923 Allow for building documentation (man pages) without TeXInfo info_TEXINFOS = nco.texi EXTRA_DIST = nco nco.dvi nco.html nco.pdf nco.ps nco.xml VERSION # csz 20061120 override default MAKEINFOHTML defaults: # --ifinfo: Treat HTML branches same as info branches # --output=html: Output to html directory # Unfortunately, autoconf overrides --output # AM_MAKEINFOHTMLFLAGS = --ifinfo # Create single HTML file instead of file-per-node AM_MAKEINFOHTMLFLAGS = --ifinfo --no-split all: all-am .SUFFIXES: .SUFFIXES: .dvi .html .info .pdf .ps .texi $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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 .texi.info: $(AM_V_MAKEINFO)restore=: && backupdir="$(am__leading_dot)am$$$$" && \ am__cwd=`pwd` && $(am__cd) $(srcdir) && \ rm -rf $$backupdir && mkdir $$backupdir && \ if ($(MAKEINFO) --version) >/dev/null 2>&1; then \ for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ if test -f $$f; then mv $$f $$backupdir; restore=mv; else :; fi; \ done; \ else :; fi && \ cd "$$am__cwd"; \ if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $@ $<; \ then \ rc=0; \ $(am__cd) $(srcdir); \ else \ rc=$$?; \ $(am__cd) $(srcdir) && \ $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ fi; \ rm -rf $$backupdir; exit $$rc .texi.dvi: $(AM_V_TEXI2DVI)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2DVI) $(AM_V_texinfo) --build-dir=$(@:.dvi=.t2d) -o $@ $(AM_V_texidevnull) \ $< .texi.pdf: $(AM_V_TEXI2PDF)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ $(TEXI2PDF) $(AM_V_texinfo) --build-dir=$(@:.pdf=.t2p) -o $@ $(AM_V_texidevnull) \ $< .texi.html: $(AM_V_MAKEINFO)rm -rf $(@:.html=.htp) $(AM_V_at)if $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ -o $(@:.html=.htp) $<; \ then \ rm -rf $@ && mv $(@:.html=.htp) $@; \ else \ rm -rf $(@:.html=.htp); exit 1; \ fi $(srcdir)/nco.info: nco.texi nco.dvi: nco.texi nco.pdf: nco.texi nco.html: nco.texi .dvi.ps: $(AM_V_DVIPS)TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ $(DVIPS) $(AM_V_texinfo) -o $@ $< uninstall-dvi-am: @$(NORMAL_UNINSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(dvidir)/$$f'"; \ rm -f "$(DESTDIR)$(dvidir)/$$f"; \ done uninstall-html-am: @$(NORMAL_UNINSTALL) @list='$(HTMLS)'; test -n "$(htmldir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -rf '$(DESTDIR)$(htmldir)/$$f'"; \ rm -rf "$(DESTDIR)$(htmldir)/$$f"; \ done uninstall-info-am: @$(PRE_UNINSTALL) @if test -d '$(DESTDIR)$(infodir)' && $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ if install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ then :; else test ! -f "$(DESTDIR)$(infodir)/$$relfile" || exit 1; fi; \ done; \ else :; fi @$(NORMAL_UNINSTALL) @list='$(INFO_DEPS)'; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ (if test -d "$(DESTDIR)$(infodir)" && cd "$(DESTDIR)$(infodir)"; then \ echo " cd '$(DESTDIR)$(infodir)' && rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]"; \ rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ else :; fi); \ done uninstall-pdf-am: @$(NORMAL_UNINSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pdfdir)/$$f'"; \ rm -f "$(DESTDIR)$(pdfdir)/$$f"; \ done uninstall-ps-am: @$(NORMAL_UNINSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(psdir)/$$f'"; \ rm -f "$(DESTDIR)$(psdir)/$$f"; \ done dist-info: $(INFO_DEPS) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; \ for base in $$list; do \ case $$base in \ $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$base; then d=.; else d=$(srcdir); fi; \ base_i=`echo "$$base" | sed 's|\.info$$||;s|$$|.i|'`; \ for file in $$d/$$base $$d/$$base-[0-9] $$d/$$base-[0-9][0-9] $$d/$$base_i[0-9] $$d/$$base_i[0-9][0-9]; do \ if test -f $$file; then \ relfile=`expr "$$file" : "$$d/\(.*\)"`; \ test -f "$(distdir)/$$relfile" || \ cp -p $$file "$(distdir)/$$relfile"; \ else :; fi; \ done; \ done mostlyclean-aminfo: -rm -rf nco.t2d nco.t2p clean-aminfo: -test -z "nco.dvi nco.pdf nco.ps nco.html" \ || rm -rf nco.dvi nco.pdf nco.ps nco.html maintainer-clean-aminfo: @list='$(INFO_DEPS)'; for i in $$list; do \ i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ done tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-info check-am: all-am check: check-am all-am: Makefile $(INFO_DEPS) installdirs: for dir in "$(DESTDIR)$(infodir)"; 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-aminfo clean-generic clean-libtool mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: $(DVIS) html: html-am html-am: $(HTMLS) info: info-am info-am: $(INFO_DEPS) install-data-am: install-info-am install-dvi: install-dvi-am install-dvi-am: $(DVIS) @$(NORMAL_INSTALL) @list='$(DVIS)'; test -n "$(dvidir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(dvidir)'"; \ $(MKDIR_P) "$(DESTDIR)$(dvidir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(dvidir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(dvidir)" || exit $$?; \ done install-exec-am: install-html: install-html-am install-html-am: $(HTMLS) @$(NORMAL_INSTALL) @list='$(HTMLS)'; list2=; test -n "$(htmldir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p" || test -d "$$p"; then d=; else d="$(srcdir)/"; fi; \ $(am__strip_dir) \ d2=$$d$$p; \ if test -d "$$d2"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(htmldir)/$$f'"; \ $(MKDIR_P) "$(DESTDIR)$(htmldir)/$$f" || exit 1; \ echo " $(INSTALL_DATA) '$$d2'/* '$(DESTDIR)$(htmldir)/$$f'"; \ $(INSTALL_DATA) "$$d2"/* "$(DESTDIR)$(htmldir)/$$f" || exit $$?; \ else \ list2="$$list2 $$d2"; \ fi; \ done; \ test -z "$$list2" || { echo "$$list2" | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(htmldir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(htmldir)" || exit $$?; \ done; } install-info: install-info-am install-info-am: $(INFO_DEPS) @$(NORMAL_INSTALL) @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(infodir)'"; \ $(MKDIR_P) "$(DESTDIR)$(infodir)" || exit 1; \ fi; \ for file in $$list; do \ case $$file in \ $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ esac; \ if test -f $$file; then d=.; else d=$(srcdir); fi; \ file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ if test -f $$ifile; then \ echo "$$ifile"; \ else : ; fi; \ done; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(infodir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(infodir)" || exit $$?; done @$(POST_INSTALL) @if $(am__can_run_installinfo); then \ list='$(INFO_DEPS)'; test -n "$(infodir)" || list=; \ for file in $$list; do \ relfile=`echo "$$file" | sed 's|^.*/||'`; \ echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ done; \ else : ; fi install-man: install-pdf: install-pdf-am install-pdf-am: $(PDFS) @$(NORMAL_INSTALL) @list='$(PDFS)'; test -n "$(pdfdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(pdfdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(pdfdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(pdfdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(pdfdir)" || exit $$?; done install-ps: install-ps-am install-ps-am: $(PSS) @$(NORMAL_INSTALL) @list='$(PSS)'; test -n "$(psdir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(psdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(psdir)" || exit 1; \ fi; \ for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; \ done | $(am__base_list) | \ while read files; do \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(psdir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(psdir)" || exit $$?; done installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-aminfo \ maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-aminfo mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: $(PDFS) ps: ps-am ps-am: $(PSS) uninstall-am: uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-aminfo clean-generic \ clean-libtool cscopelist-am ctags-am dist-info 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-aminfo maintainer-clean-generic mostlyclean \ mostlyclean-aminfo mostlyclean-generic mostlyclean-libtool pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am \ uninstall-dvi-am uninstall-html-am uninstall-info-am \ uninstall-pdf-am uninstall-ps-am .PRECIOUS: Makefile #CLEANFILES = nco nco.dvi nco.info* nco.pdf nco.ps nco.txt nco.xml # #.PHONY: html_docs pdf_docs txt_docs xml_docs #html_docs = nco.html #.texi.html: # $(MAKEINFO) --html --ifinfo --no-split --output=$@ $< #pdf_docs = nco.pdf #.texi.pdf: # $(TEXI2DVI) --pdf $< #txt_docs = nco.txt #.texi.txt: # $(MAKEINFO) --no-headers --output=$@ $< #xml_docs = nco.xml #.texi.xml: # $(MAKEINFO) --xml --ifinfo --no-split --output=$@ $< # 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: nco-4.5.4/doc/NEWS000066400000000000000000000016231264355130400135540ustar00rootroot00000000000000NCO NEWS -- history of user-visible changes. -------- * Changes in NCO version 1.2: ** Fortran compatibility has been dropped ** DODS support ** New operations: min,max,ttl,rms,rmssdn... ^L * Changes in NCO version 1.1: ^L ** New operator ncatted--netCDF Attribute Editor ** Windows NT supported ** Improved documentation ** ncrcat support for DOE ARM-style time=base_time+time_offset records ^L * Changes in NCO version 1.0: ^L ** All known bugs in version 0.9 have been fixed. ** The manual is nearly complete, and describes all operators. ** All operators should now work on machines with sizeof(long) > sizeof(int). ** Implemented ARM time=base_time+time_offset convention in ncrcat. ** Improved support for NCAR CSM conventions ** ncks allows specification of hyperslab stride ** ncks works with wrapped coordinates (e.g., longitude) ^L Local variables: mode: outline paragraph-separate: "[ ^L]*$" end: nco-4.5.4/doc/README000066400000000000000000000072241264355130400137400ustar00rootroot00000000000000# $Header$ -*-text-*- # Purpose: NCO README file What is NCO? The netCDF Operators, NCO, are a suite of programs known as operators. The operators facilitate manipulation and analysis of self-describing data stored in the freely available netCDF and HDF formats (http://www.unidata.ucar.edu/packages/netcdf and http://hdfgroup.org, respectively). Each NCO operator (e.g., ncks) takes netCDF or HDF input file(s), performs an operation (e.g., averaging, hyperslabbing, or renaming), and outputs information, usually a processed netCDF file Although most users of netCDF and HDF data are involved in scientific research, these data formats, and thus NCO, are generic and are equally useful in fields from agriculture to zoology. The NCO User's Guide illustrates NCO use with examples from the field of climate modeling and analysis. The NCO homepage is http://nco.sf.net. Installation: NCO runs on all major UNIX systems and MS Windows. NCO (except ncap2) requires only an ANSI-compliant C99 compiler. NCO can be built and installed with the standard GNU autotools ./configure mechanism or with a custom Makefile. ncap2 requires an C++ compiler and can be hard to build. Please submit patches to help simplify the build system! Newer Autotools Configure Build Procedure: Try the newer ./configure mechanism first by using the configure command in the top-level NCO directory: `cd ~/nco;./configure;make;make install' or `cd ~/nco;./configure;make;make install-strip' if you to strip the executables and libraries. In this case, NCO will run at the same speed, but consume less memory and only about half the disk space since all debugging information is "stripped". If autotools do not work, please look at the slightly more complex (and realistic) examples that we use to test your machine architecture. These are in the configure.eg file in the top-level NCO directory. The output of these commands from our test machines is available at http://dust.ess.uci.edu/nco/rgr Please send us any modifications to the configure.ac script that might benefit other NCO users. Older Manual Makefile Build Procedure: If configure does not work for you, try the older build mechanism: `cd ~/nco/bld;make dir;make' `cd ~/nco/src/nco_c++;make -f Makefile.old dir;make -f Makefile.old' You must use GNU make, which reads `Makefile' by default. Makefile has some hardcoded switches which may be only valid at UCI or NCAR, but which can serve as a template for your environment. First, be sure to define NETCDF_INC and NETCDF_LIB variables either within your environment, or at the top of Makefile. Within Makefile, locate the block of code which corresponds to your machine type as defined by $PVM_ARCH and the pvmgetarch command. Within this block you may need to edit the CC, CPPFLAGS, and LDFLAGS arguments so they reflect the names of the compilers and linkers. Read ./bld/Makefile for useful user-specified switches. Compile with `make OPTS=D' to build debugging versions. Environment variables MY_OBJ_DIR, MY_INC_DIR, MY_LIB_DIR and MY_BIN_DIR control locations of object files, include files, libraries, and executables. Documentation and Bug Reports: Please read the NCO manual before you submit a bug report! It is supplied in many formats: Postscript (nco.ps), Texinfo (nco.texi), Info (nco.info), HTML (nco.html), and DVI (nco.dvi). If you got NCO from a CVS snapshot, you must generate these formats yourself with 'make nco.html', 'make nco.pdf', 'make nco.ps', etc. from within the doc/ directory. Sending me questions whose answers aren't in the manual is the best way to motivate me to write more documentation. Let me also accentuate the contrapositive of that suggestion. Good luck! Charlie nco-4.5.4/doc/README_Fedora.txt000066400000000000000000000003731264355130400160340ustar00rootroot00000000000000NCO on Fedora and Red Hat ========================= NCO provides bld/nco.spec for building Fedora RPMs. It has been tested on FC1--FC6 for both the i386 and x64_64 architectures. For pre-built binaries and SRPMs, please see: http://nco.sf.net#rpm nco-4.5.4/doc/README_msvc.txt000066400000000000000000000036731264355130400156120ustar00rootroot00000000000000Microsoft Windows Visual Studio 2010 (MSVC) build instructions: Building the NCO source code from within Visual Studio is an easy process, consisting of 2 steps: 1) Define environment variables. 2) Build the solution. 1) Define environment variables The Visual Studio NCO solution file (located at /qt/nco.sln) uses 2 types of environment variables: a) C source file header paths. b) NCO dependency libraries. The minimal requirement to build NCO is the netCDF library. These 2 symbols are defined in the MSVC solution and must be defined as enviroment variables HEADER_NETCDF LIB_NETCDF HEADER_NETCDF defines the location (path) where the netCDF header file is located on your local hard drive. This file is called netcdf.h. Note that only the path (without the file name) is defined. Example HEADER_NETCDF J:\netcdf-c-4.3.1.1\include LIB_NETCDF defines the absolute name (with path) of the netCDF library (the file is called netcdf.lib), located on your local hard drive. Note that here, the file name is included Example LIB_NETCDF J:\netcdf-c-4.3.1.1\build\liblib\Debug\netcdf.lib Note: To define an enviroment variable in Microsoft Windows, do: 1) Go to menu “Start” 2) Go to menu “Computer” 3) Right click menu "Properties" 4) Choose option “Advanced System Settings” 5) Choose option “Environment Variables” 6) Choose "New" button on the section "System Variables" 7) Enter a pair name, value From the previous example, a name would be HEADER_NETCDF with value J:\netcdf-c-4.3.1.1\include Note: You’ll have to exit Visual Studio and open the project again so that these values are detected by MSVC. Building ncap2 ncpa2 requires 2 additional libraries, Antlr, and gsl. Define these environment variables (examples follow) HEADER_ANTLR J:\antlr-2.7.7\lib\cpp LIB_ANTLR J:\antlr-2.7.7\lib\cpp\debug\antlr.lib HEADER_GSL J:\gsl-1.8\src\gsl\1.8\gsl-1.8 LIB_GSL J:\gsl-1.8\src\gsl\1.8\gsl-1.8\VC8\libgsl\Debug-StaticLib\libgsl_d.lib nco-4.5.4/doc/TAG000066400000000000000000000000071264355130400134060ustar00rootroot00000000000000$Name$ nco-4.5.4/doc/TODO000066400000000000000000002212331264355130400135460ustar00rootroot00000000000000$Header$ # Purpose: TODO items for NCO ftr=do-able feature (low-hanging fruit) # URL: http://nco.sf.net/TODO # Usage: Upload to homepage: /usr/bin/scp ~/nco/doc/TODO nco.sf.net:/home/project-web/nco/htdocs /usr/bin/scp ~/nco/doc/TODO dust.ess.uci.edu:/var/www/html/nco ****************************************************************************** NCO Wish list: Numbers were assigned in chronological order in three categories: Building (bldXXX), ncap-related (ncapXXX), and generic NCO (ncoXXX): bldXXX: Items specifically related to building and installation. ncapXXX: These items do not affect rest of NCO ncoXXX: 15 high priority items are shown first, then another ~100 items Question marks indicate items or implementations are debatable Please help out wherever your experience allows. ****************************************************************************** ************************************************************************ Begin precision paper ************************************************************************ Precipitated by questions from Lori Sentman, Mark Flanner, Gary Strand ncwa and ncra issues only: ncks -O -v PS,gw ${DATA}/dstmch90/dstmch90_clm.nc ~/dstmch90_ps.nc ncrename -O -v PS,ps_flt ~/dstmch90_ps.nc ncap2 -O -s 'ps_dbl=double(ps_flt)' ~/dstmch90_ps.nc ~/dstmch90_ps.nc ncwa -O -w gw ~/dstmch90_ps.nc ~/dstmch90_ps_xyt.nc ncks -H -C ~/dstmch90_ps_xyt.nc ncks -m -C ~/dstmch90_ps.nc ************************************************************************ End precision paper ************************************************************************ ************************************************************************ Begin ncoXXX TODOs ************************************************************************ Highest priority NCO-wide items that You can help with: nco59. Add "averaged over dimension x from y to z" attribute to ncwa-processed variables nco97. Add x_op=average... attributes to averagers for ncar_csm nco124. Use `install' program and mkdir -p in bld/Makefile method nco128. Ensure target 'dir' is made before *.d dependency files nco152. Change make or nco_dst.pl to add docs to /usr/doc in RPM nco164. Spiff up NCO homepage web page (Logo?) nco165. Create Makefile dependency to do 'make dir' if lib, obj, bin directories do not exist nco212. Ensure structures are always passed by reference (default is pass by value) nco312. Make TODO list more legible (change to, e.g., Emacs list/outline mode, LaTeX, Wiki?) nco313. Redo TODO subject categorization by discriminating based on skills required to tackle. Initial cateogorization might be e.g., autotools, bison, C, C++, Debian, flex, HTML, Perl, RPM, www, TeXInfo nco356. ncwa benchmark yields incorrect answers for arrays exceeding 10^7 elements with xlc and gcc, why? is this related to nco354? zender@esmf04m:~/nco/data$ date;ncwa -O ${DATA}/mie/big.nc ${DATA}/mie/foo.nc;date;ncks -H ${DATA}/mie/foo.nc Mon Jul 19 16:58:22 PDT 2004 ncwa: INFO No dimensions specified with -a, therefore reducing (averaging, taking minimum, etc.) over all dimensions Mon Jul 19 16:58:47 PDT 2004 wvl_1e0 = 1 wvl_1e1 = 1 wvl_1e2 = 1 wvl_1e3 = 1 wvl_1e4 = 1 wvl_1e5 = 1 wvl_1e6 = 1 wvl_1e7 = 1 wvl_1e8 = 0.167772 (NB: this is approximately 1/6) nco405. Modify multi-slabbing so that it places the output slabs in the order in which they were specified rather than the order they appear in the input file (Martin Schultz) NCO-wide items of lesser priority: nco50. Allow user-specified scalar weights to ncwa nco51. Make getopt() a shared subroutine? nco53. Add wall clock timer options? (to provide more info than, e.g., timex()) nco55. nco_var_cnf_dmn() should be able to expand (x,64,128) array into (nx,64,128) array (maybe) nco60. Make something that can mask field without having to average over dimension nco66. Make history attribute get appended, rather than overwritten, when in append mode nco69. ncks option for file/field summary: var name list,var min,max,avg,mss_val,# mss_val, nco75. Add warning to ncwa triggered by averaging over lat without weighting by gw with NCAR_CSM_FORMAT nco79. Allow ncrename .$var_nm syntax to work on all operators (so variables not present cause warning, not error) nco82. Make libnco namespace-safe by prefixing all library subroutines with nco_ nco86. Extend stride/wraparound capability to all operators possible nco92. ncrcat -O -v base_time,time_offset arm.cdf arm.cdf foo.nc;ncks -H -C -h foo.nc | m gives bad time_offset on LINUX not SUNMP (problem with LINUX adding record coordinate to open file?) nco99. Allow ncatted to dump file in ncatted format nco103. Implement trapezoidal rule option in ncra, nces nco105. Add easy-to-read tabular display option for file contents for ncks, i.e, allow ncks -s to print multiple variables in column format nco106. Add switch to remove degenerate dimensions from ncra nco111. Investigate whether using ncwa to average files where variables of type NC_CHAR have a record dimension causes core dumps or other problems. i.e., LSM variable timecom caused subtle ncra problems for awhile. Problem caused when weight or mask has dimension not in dimension extraction list ncwa -O -C -D 5 -v fl_nm -w gw ~/nco/data/in.nc ~/foo.nc fails because fl_nm has dimension char_dmn_lng but gw has dimension lat call to nco_var_fll() for gw requires that lat be in dmn_lst nco113. Rethink normalization switch options in ncwa nco114. Fix nco_var_cnf_dmn() so that returned weight always has same size tally array as template variable nco115. SIGFPE when sum of denominator in ncwa (i.e., sum of weight) is zero Users should not be doing weighted averages if denominator sums to zero, but... Desired fix here is graceful exit instead of core dump nco143. Add -W or -q switch to turn off squelch most warning messages in ncra, ncrcat (especially warnings about non-monotonicity) nco144. Add option(s) to select all N-D variables where N=0,1,2... nco145. Implement later netCDF and CF conventions, e.g., time_op in ncra nco146. Allow proxies for coordinate variables so that, e.g., hyperslabs may be specified for "date" even though "time" is the coordinate. Proxies must be one dimensional and monotonic, of course. nco147. Use builtin mkstemp() so file is built in fast directory rather than, say, NFS-mounted directory like /fs/cgd nco148. Put in more useful error diagnostics for Schweitzer's data holes These only appear in ncra/ncrcat because ncks treats same hyperslab as a wrap! Define a convention consistent between ncks and ncra! cd ~/nco/data ncks -O -C -d lon,10.0,80.0 -v time_lon in.nc foo.nc;ncks -H foo.nc ncrcat -O -C -d lon,10.0,80.0 -v time_lon in.nc foo.nc;ncks -H foo.nc nco149. Add ncks hyperslab tests to nco_tst.pl to catch inconsistencies like #148 nco151. Dynamically modify web pages so files with changing version numbers can be directly linked nco158. Add policy for hyperslabbing single level values to User's Guide Multi-file operators with record coordinate treat single point hyperslabs differently than single file operators or than any operators with single point cuts on non-record coordinates. See explanatory notes in nco_lmt_evl(). nco166. Document 'make test' so people know it exists and use it nco173. Add switch to ncra which allows user to remove degenerate time dimension from result nco174. Setup ncra,nces,ncwa to do standard deviations sdn with one call nco182. Add -L, --license switch to print license terms (as suggested by GNU coding style) nco190. Make typ_pck et al. use nc_type enum or something sane for default nco192. ncdiff sometimes subtracts files of incommensurate size without complaint ncks -O -v one_dmn_rec_var -d time,0,1 in.nc foo1.nc ncks -O -v one_dmn_rec_var -d time,0,2 in.nc foo2.nc ncdiff -O foo1.nc foo2.nc foo3.nc This may make sense, e.g., for 1-D record variables of different lengths, but not for multidimensional variables Former case should print warning, latter case should exit with error nco193. Convert dimension sizes from type "long int" to type "size_t"? nco199. Internationalize (i18n) NCO with gettext() nco203. Perform benchmarking tests to quantify arithmetic performance improvements, I/O bottlenecks, etc. nco209. Add rules to automagically make MANIFEST and update Sourceforge download area nco215. nco_var_cnf_dmn() does not abort when variables do not conform because dimension list of one is subset of other but ORDER of dimensions differs, e.g., a(lat,lev,lon) !~ b(lon,lev). Attempting this will return incorrect answers! nco225. Pass aed by reference in nco_aed_prc() nco226. Is xrf in nco_var_cnf_dmn() is really necessary? If not, remove it and make wgt arg const var_sct * const nco228. g++ linking requiring #ifndef GNUC++ around fabsf,fmodf defs in nco_var_scv.c nco230. Keep track of type of _FillValue field in variable structure for reasons described in nco_cnf_var_typ()/nco_cnv_mss_val_typ() nco232. Warn when arithmetic operators encounter packed variables? nco233. Makefile.old rule for make tst appears broken for long FTP rule nco237. Break down nco.texi into bite-size chunks, e.g., one file per section nco238. Replace y=(typ *)nco_malloc(nbr*sizeof(typ)) with y=(typ *)nco_malloc(nbr*sizeof(*y))? nco239. Create one global compatibility file (nco_xpf.[ch]?) activated by HAVE_ or NEED_ actions so do not have multiple platform dependent #includes as is case now with HAVE_STRCASECMP, HAVE_STRDUP requiring nco_sng_utl.h nco241. Add run-time switch which requests that output be _FillValue where ANY input field is _FillValue. NCO discussion forum 20021212. nco245. Eliminate all instances of passing naked constants nco246. Deprecate USE_FORTRAN_ARITHMETIC from Makefile nco250. ncks -s should refuse to print strings formatted with %s unless they contain NUL-terminator. This will avoid segfaults like ncks -C -H -s "%s" -v fl_nm ~/nco/data/in.nc nco251. Does ncks -B correctly write packed variables in binary format? nco255. Desktop icon for NCO gui interface nco258. Develop syntax/procedure for specifying lists of hyperslabs for single pass, low memory consumption MSA jobs like Martin Schultz's in Discussion forum on 20030506 nco259. Variadic function extension to nco_malloc() to support printing debugging messages? nco260. Warn (but work) when coordinate variable has more than two dimensions nco261. Switch from toggling defaults to --no-option format for all Booleans. e.g., --abc should ensure alphabetization is True, and --no-abc should ensure it is false, rather than toggling. nco266. ncbo: Finish ncbo.1 manpage nco270. Automate uploading of tagged .deb builds to ftp://ftp.debian.org nco275. Use nco_mss_val_cnf() in ncflint nco276. Use nco_mss_val_cnf() in ncap nco277. Use nco_mss_val_cnf() in ncwa nco287. Develop dianostics for OMP OpenMP implementation in ncra nco292. nco_fl_utl.c: Use autoconf HAVE_NETWORK instead of WIN32 nco293. nco_fl_utl.c: Use autoconf HAVE_MKDIR_M instead of SUN4 nco294. Globals variable in NCO operators are prg, prg_nm, nco_dbg_lvl If possible, modify so that shared-library (rather than main.c) holds and returns thread-specific values for each, set with, e.g., prg_set(). Make prg, prg_nm, and nco_dbg_lvl local to main(), not global to main.c nco295. Understand/maintain re-entrant behavior of shared library. nco298. Localize ncap's three globals: ncap_ncl_dpt_crr, ncap_ln_nbr_crr, ncap_fl_spt_glb? nco299. Prefix prg,nco_prg_nm,nco_dbg_lvl globals with nco_ for namespace cleanliness nco300. Activate ccmalloc libdl into configure.ac for enable-debug-custom nco301. Unable to use DDD on autotools NCO executable with --enable-debug-custom nco302. Add speedy GCC optimization flags to --enable-optimize-custom nco303. Make test suite more comprehensive nco309. Free memory allocated in nco_fl_utl.c: fl_lst_in=(char **)nco_malloc(sizeof(char *)); /* fxm: free() this memory sometime */ nco310. Add ENABLE_DEBUG_CUSTOM, ENABLE_OPTIMIZE_CUSTOM, ... to bld/Makefile nco311. Automatically convert int,short to float in nco_var_pwr() nco315. GNUC non-ANSI rank reduction methods in nco_var_avg.c fail on large files. Problem with stack memory allocation? nco316. Change offending nco_malloc() to nco_malloc_flg() calls for #315 nco317. Understand stack memory problem. ulimits? compiler switches? nco318. Solve stack memory problem and benchmark vs. ANSI code branch nco320. LaTeX-like hyphens in TeXInfo? nco321. Do not promote NC_FLOAT to NC_DOUBLE in ncra/nces(?) nco322. Implement integer empowerment in var_scv_pwr() with, e.g., GSL nco323. Collect all past ANNOUNCE files and place in reverse chronological order in ANNOUNCE file nco324. Add release date to "Version Summary" section on homepage nco328. Ability to reverse specified dimensions (use negative stride?) nco333. Clean up preprocessor symbols with cd ~/nco/src/nco;ifnames *.c nco335. ncflint: implement interpolation/mss_val algorithms two and three as options? nco336. Allow input file lists to be specified in a text file and to supercede command line arguments. This will be useful on platforms with limited buffers for command line arguments and globbing expansions (e.g., AIX) nco337. When input file is a symbolic link, print name of linked-to-file as debugging information nco340. o/a/e stdin is overwritten when stdin input method used cd ~/nco/data;echo "in.nc" | ncecat -D 3 -o foo.nc nco342. Get canonicalize_file_name() working in nco_fl_info_get() nco344. Create sophisticated etags regular expressions for change version number in all documentation tags_doc.sh nco352. Probably related to 351: OpenMP directive must appear in main() or ldd will not associate /usr/lib/libxlsmp.a(smprt_64.o) with executable so rtld errors occur on AIX ************** Important *************************** nco354. ncwa dumps core on AIX ESMF on large files regardless of OpenMP: fxm: Does this show need to use "long long" instead of "long" for counts/buffers? ncwa -D 5 -O -a wvl -v ss_co_alb ${DATA}/mie/mie_1000000.nc ${DATA}/mie/foo_avg_1000000.nc (works) ncwa -D 5 -O -a wvl -v ss_co_alb ${DATA}/mie/mie_10000000.nc ${DATA}/mie/foo_avg_10000000.nc (fails) fails with Segmentation fault (core dumped) nco359. Allow spaces between variables names in -v var_lst arguments (assuming list whitespace is quoted, of course) nco362. mmr: reduce memory during run by free()'ing var_fix[idx],var_fix_out[idx],var_prc[idx],var_prc_out[idx] after writes nco363. ncpdq: document netCDF limitations in nco.texi nco375. Do something more consistent with: nco_exit(EXIT_FAILURE) nco385. ncpdq: dynamically allocate arrays in nco_var_dmn_rdr_mtd(), nco_var_dmn_rdr_val()? nco386. Remove purely diagnostic arrays from nco_var_dmn_rdr_mtd(), nco_var_dmn_rdr_val()? nco389. ncpdq: Single dimension in re-order list with no negative sign is always identity transformation, warn? exit? nco390. ncpdq: make -a optional? (all switches are optional in all other operators) nco392. OpenMP: thread main loop of ncatted nco395. ncpdq: document rdr shr lists nco396. free() memory at end of each operator nco397. make ncpack symbolic link to ncpdq? Re-order/pack are completely independent yet need same structure of program nco404. Does Ersoy's XML stylesheet nco.css work? nco406. Add advantages/disadvantages of NCO (compared to e.g., ANTS) description? nco421. ncpdq: Make packing offer to move missing value to inside range nco425. ncpdq: Make unpacking offer to unpack missing value to preserve its usefulness nco426. ncpdq: Make packing offer to pack missing value to the packed type to preserve its usefulness nco427. ncpdq, ncra: Fix pck_dbg problems in nco_var_get() which automatically down-convert missing value to typ_dsk. How to reconcile with nco457? nco441. Packing NC_DOUBLE->NC_CHAR, NC_INT->NC_CHAR, or NC_SHORT->NC_CHAR and then unpacking, places 0.0 instead of 1.0 in first element, why? implicit conversion of NUL byte when value = 0. ncpdq -D 5 -O -C -P all_new -M flt_chr -v three_dmn_var_dbl ~/nco/data/in.nc ~/foo.nc ncks -m -H -v three_dmn_var_dbl ~/foo.nc ncpdq -D 3 -O -C -P upk ~/foo.nc ~/foo_upk.nc ncks -m -H -v three_dmn_var_dbl ~/foo_upk.nc nco453. Re-think handling of dangling pointers in nco_pck_val()? nco454. ncpdq: Combine nco_pck_map,nco_pck_typ into new nco_pck_sct to avoid proliferation of argument passing nco457. ncpdq: _FillValue is not converted to variable type when variable is not packed three_dmn_var_dbl. How to reconcile with nco427? nco461. Always plenty of great ideas for new NCO functionality in http://tinyurl.com/6pzqd nco462. ncpdq: pack/unpack missing_data just like variable data? The reason I did not do this originally is because I did not want the _FillValue to contribute to the dynamic range of values which need packing. Since my _FillValues are always huge (1.0e36), packing _FillValues would greatly diminish the precision of the valid packed data. Best solution appears to be to check if _FillValue distorts valid_range, and, if so, pack _FillValue to default value of packed type. nco463. add optional scale_factor, add_offset arguments to ncap pack()? nco464. ncpdq: convert _FillValue to packed type ncpdq -O -D 4 -C -P all_new -v mss_val ~/nco/data/in.nc ~/foo.nc ncpdq -O -C -U -v mss_val ~/foo.nc ~/foo_upk.nc ncks -C -m -H ~/foo_upk.nc nco467. Keep track of CDO "Climate Data Operators" http://www.mpimet.mpg.de/~cdo/ nco469. Use default _FillValue e.g., NC_FILL_FLOAT, or values from , ? nco474. Incorporate alternative "chunking" for ncrcat when data are one-dimensional, to avoid high disk/network access incurred by retrieving one float at a time nco477. Make default to copy but not to print associated coordinate variables? nco479. netCDF/L from Loci: http://loci.cs.utk.edu/modules.php?name=News&file=article&sid=40 nco480. Add boxcar averaging option (average in groups of n records) to ncra nco482. Remove return's from void functions dated 20050109 once gcc-3.4.2 behavior fixed or gcc upgraded on i386 platforms nco483. Compiling with ABORT_ON_ERROR and calling without an option dumps core Fix so inputting 0 filenames merely prints usage, does not abort? nco487. Add ncks option to suppress over-writing attributes in output file by attributes of source file#1 nco494. Implement gzip library wrapper library build option for znetCDF? nco514. MPI builds call superfluous linker steps: make MPI=Y > foo 2>&1 nco516. Implement SDO-wide data pipes, e.g., ncra in*.nc | ncwa | ncrename t,tpt foo.nc This would bring us one step closer to grid services, too nco527. Purify ncatted memory: valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncatted -D 5 -O -a float_att,,c,f,74 -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncatted -D 5 -O -a char_att,att_var,a,c,"and appended Sentence three,with,lots,of,commas" -a short_att,att_var,c,s,37,38,39 -a float_att,att_var,d,,, -a long_att,att_var,o,l,37 -a new_att,att_var,o,d,73,74,75 -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncatted -D 5 -O -a float_att,,a,f,74,75,76 -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 # Commas at end of following aed_sct appear never to be free()'d, are responsible for three unfree'd bytes valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncatted -D 5 -O -a float_att,att_var,d,,, -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 nco533. Implement C99 mathematical special functions: lgamma_r, j0, j1, jn, y0, y1, yn nco542. Put batch scripts, executables in ${DATA}/nco_bm/CASEID? Where to put created files nco546. Use makeatletter command in CCSM example in nco.texi? nco547. doc: Format CCSM example in nco.texi nco548. Hyper-link all switches to explanatory sections? nco560. Change FTP access script to facilitate mget *? NCO cannot process files obtained this way unless mget feeds information on files obtained back to main() Script modification would be simple: ftp -i climate.llnl.gov << END bin cd sresa1b/atm/mo/tas/ncar_ccsm3_0/run2 lcd /data/zender/sresa1b/atm/mo/tas/ncar_ccsm3_0/run2 mget * quit END nco565. bm: Add ncatted bm to quantify nc__enddef() tuning improvements nco564. Implement --64bit switch in ncatted? nco566. Implement --64bit switch in ncrename? nco568. bm: test NC_SHARE in ncatted/ncrename? nco576. Re-order arguments so var_sbt computes op2:=op1-op2 rather than op2:=op2-op1 nco577. ncbo: remove dangling pointers in var_1, var_2 after ncap_var_cnf_dmn() nco578. ncbo: Use ncbo.c as template for [mp]ncflint re-write nco599. mpi: Allow targets to determine Makefile variables so, e.g., 'make mpi' automagically defines MPI=Y nco607. mpi: mpnc*: Define structures (rather than int arrays) for MPI messages nco609. mpi: Tune (or remove?) sleep interval in MPI operators nco612. ncks ncdump-like features for netCDF4 files structures nco616: netCDF4 breaks assumption that range/precision increases with nc_type enum nco622. NULL'ify opt_crr unless opt_lng detected? nco624. mpi: Document MPI in users guide/manual nco630. Change if thr_nbr > 0 to if thr_nbr > 1 for nco_thr_att_cat()? nco631. Change usleep() to nanosleep() nco635. ncwa: MACOSX "regressions" caused by broken FREEBSD/MACOSX 'cut' binary Solution may be to install GNU textutils? cd ~/nco/bm;~/nco/bm/nco_bm.pl --dbg=0 --regress --udpreport ncwa ncwa -h -O -D 0 -y min -v three_dmn_var_dbl -a lon -p ~/nco/data in.nc ${DATA}/nco_bm/foo.nc ncks -C -H -s '%f,' -v three_dmn_var_dbl ${DATA}/nco_bm/foo.nc > ${DATA}/nco_bm/foo cut -d, -f 7 ${DATA}/nco_bm/foo # (breaks on MACOSX,FREEBSD? fine on AIX, LINUX) nco636. mpi: Try pnetcdf: http://www-unix.mcs.anl.gov/parallel-netcdf/ nco639. Fix packing code to be parallel over in_id without requiring extra var->nc_id initialization everywhere nco640. mpi: Naming: mpnc* (as currently implemented) or ncmpi* (as in pnetcdf)? nco641. mpi: Use netCDF4 MPI I/O hooks in nco_open/nco_create (mpncecat.c is testbed) nco642. mpi: Create nco_pnetcdf.h, nco_pnetcdf.c wrapper replacements? nco643. bld/Makefile fails with netCDF4 and MPI simultaneously enabled make NETCDF4=Y MPI=Y ends with error in first compile (nco_att_utl.o) /usr/include/mpi.h:95: error: two or more data types in declaration specifiers /usr/include/mpi.h:278: error: two or more data types in declaration specifiers nco645. mpi: Does wrapping MPI-IO routines for netCDF4 and pnetCDF require ENABLE_MPI? Perhaps same MPI must be used to build netCDF4 as is used for NCO? nco648. mpi: Does mpncra create dangling pointers when it packs/unpacks variables? nco649. Add ncks --prn_cln switch to print coords/vars naked (no names, indices) nco651. Use hdr_pad standard to add documentation for long switches without short counterparts, e.g., --cmp, --mpi nco653. mpi: Segregate MPI from non-MPI builds completely in bld/Makefile on AIX nco655. Incorporate BLAS if possible? nco658. netCDF4 regression in ncrename test #1: Regression re-verified 20060924, 20070831, 20080220, 20080512 PBN4 make NETCDF4=Y FL_FMT=netcdf4 tst ncks -O --fl_fmt=netcdf4 -v lat_T42 ~/nco/data/in.nc ~/foo.nc;od -An -c -N4 ~/foo.nc ncrename -O -d lat_T42,lat -v lat_T42,lat ~/foo.nc nco664. dap: ncatted & ncrename will not work with DAP because there is not any way currently to retrieve the DAP files to local files for them to operate on. see nco_fl_utl.c:~813 in nco_fl_mk_lcl(). Currently just fails semi-gracefully. nco666. Grid regridding/interpolation operator ncrebin? nco668. Prefix nco.png fractal icon with text "NC" to look like "NCO" nco669. Command-line switch for float->double math-promotion to avoid underflow? nco675. ncap2: Makefile generates redundant antlr runs nco683. Convert to subversion http://sf.net/docs/E09/ nco685. Run static analysis tool on NCO codebase nco689. bug: Multislabs (multiple limits on same dimension) fail in arithmetic operators. Currently, arithmetic operators silently ignore all limit specifications after the first. Solution: Diagnose and fail with informative warning until nco690 implemented. ncwa -O -a lat,lon -w area -d lat,30.,90. -d lon,345.,360. -d lon,0.,195. isccpd_0112_clm_landmask.nc foo4.nc nco690. ftr: Implement multislabs in arithmetic operators (no reason not to!) nco694. Change nco_bool to C99 standard bool as per Wikipedia? nco702. ncwa: How to mix new ncwa behavior with -I wgt_msk_crd_var? nco705. ncwa: Add lmn_nbr_wgt and DID_BROADCAST outputs to nco_var_cnf_dmn()? nco706. ncwa: Add DID_REDUCE outputs to nco_var_avg_reduce()? nco709. ncwa: Change wgt_brd_flg (may have wrong meaning) nco717. Averaging empty record variable creates an element in output!: ncwa -O ~/nco/data/in_rec_zero.nc ~/foo.nc ncwa -O -a lon ~/nco/data/in_rec_zero.nc ~/foo.nc This seems unavoidable since variable must be a scalar in output, and scalars automatically have one element of space reserved, whereas zero-record arrays have not elements of space reserved. Scalar is ill-defined of course. Hence averaging the file increases the data storage. What to do? Nothing. nco722. mpncwa: DDRA diagnostics should work in MPI mode, not just SMP mode nco725. rgr: Add attribute propagation regression test ncap2 -v -O -s 'cnv_CF_crd2=cnv_CF_crd' -s 'lon2=lon(0)' -p ~/nco/data in.nc ~/foo.nc nco737. rgr: Add regression for regex'ing consecutive Q's? ncks -O -v 'Q[0-1][0-9]|2[0-3]' ~/nco/data/in.nc ~/foo.nc;ncks -H ~/foo.nc ncks -O -v 'Q[0-9][0-9]$' ~/nco/data/in.nc ~/foo.nc;ncks -H ~/foo.nc nco738. nco_cnv_cf_cll_mth_add() CF cell methods nco744. ncra: Add option to eliminate degenerate dimensions in ncra (like ncwa -b) nco745. rgr: Add regression test for ncwa --rdd nco747. Change lat to -45,45 and add lat_grd = -90,0,90 in in.cdl nco754. thr: Make sure private/firstprivate aspects of ddra_info are correct nco755. Test timers on ESMF under openmp nco756. thr: Make nco_ddra() thread-safe nco757. ncbo bug: works with --mmr_drt, fails with --mmr_cln ncwa -O -a time -p ~/nco/data in.nc ~/foo_avg.nc ncbo --mmr_cln -O -D 1 ~/nco/data/in.nc ~/foo_avg.nc ~/foo.nc valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncbo --mmr_cln -O ~/nco/data/in.nc ~/foo_avg.nc ~/foo.nc > ~/foo 2>&1 valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncbo --mmr_cln -O -v one_dmn_rec_var ~/nco/data/in.nc ~/foo_avg.nc ~/foo.nc > ~/foo 2>&1 nco757. Make sure above ncbo bug is not in ncflint nco759. Document --mmr_cln flag nco761. mpi: Merge timer srt/end calls to MPI codes nco763. Access IPCC AR4 database via OPeNDAP: http://www-pcmdi.llnl.gov/software-portal/esg_data_portal/dapserver Sample datasets look like: http://climate.llnl.gov/cgi-bin/dap-cgi.py/ipcc4/sresa1b/ncar_ccsm3_0/pcmdi.ipcc4.ncar_ccsm3_0.sresa1b.run1.atm.mo.xml.html ncks -M -p http://zender:password@climate.llnl.gov/cgi-bin/dap-cgi.py/ipcc4/sresa1b/ncar_ccsm3_0 pcmdi.ipcc4.ncar_ccsm3_0.sresa1b.run1.atm.mo.xml ncks -M -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc nco768. Change some common flags from toggles to hard-coded true/false to avoid weird behavior when toggle switches accidentally passed twice, e.g., ncks -O -O in.nc foo.nc nco772. ncpdq: fails MPI regression tests on pbs, possibly others nco776. ncecat: Minor, fixable memory leaks, fix with valgrind nco778. ncrename: allow renaming dimensions to existing dimensions so long as dimension size does not change. Problem is that netCDF nc_rename_dim() disallows this. ncks -O -v lev,lat_grd -p ~/nco/data in.nc ~/foo.nc ncrename -O -d lev,lat_grd ~/foo.nc ~/foo.nc nco779. rgr: Add non-record stride checks to regression tests e.g., ncks -O -v three_dmn_rec_var -d lon,,,2 -p ~/nco/data in.nc ~/foo.nc ncrcat -O -v three_dmn_rec_var -d lon,,,2 -p ~/nco/data in.nc in.nc ~/foo.nc ncks -C -v three_dmn_rec_var ~/foo.nc nco784. Build NCO on NMI test lab http://nmi.cs.wisc.edu/ nco789. rgr: Add regression test for behavior when _FillValue defined and missing_value not ncwa -O -a lon -v fll_val,mss_val ~/nco/data/in.nc ~/foo.nc ncks -H -C ~/foo.nc nco794. Automagically use missing_value when _FillValue not present nco796. pgCC does not support exception handling with codes compiled with OpenMP (-mp) switch so ncap2/antlr files must be built serially nco799. Extend -n 3,4,1 NINTAP switch to handle regular expressions nco800. Extend -n 3,4,1 NINTAP switch to -n 3,4,1,offset to work with CCSM patterns nco803. prp: Link to UCSD proposal by Kraig Winters /data/zender/prp/prp_winters.pdf nco807. mpi: Merge ncra.c v.1.192-1.193 changes (per-file record limit checks) into mpncra.c nco808. ftr: Dave Allured request on 20070213 for nces to resolve hyperslab indices for all dimensions on each file so this works: nces -d time,"2010-1-1 0:0:0","2020-12-31 0:0:0" run*.nc output.nc nces -O -d time,"2010-1-1 0:0:0","2020-12-31 0:0:0" ~/giss*.nc ~/output.nc nces -O -D 5 -v one_dmn_rec_var -d time,1.,5. -p ~/nco/data in.nc in.nc ~/foo.nc nco809. Implement --quiet option to suppress WARNINGs and INFOs nco814. rgr: Add regression test for forgiving exclusion list handling ncks -O -D 2 -x -v not_present ~/nco/data/in.nc ~/foo.nc nco816. rgr: Add regression tests for rmssdn when N=0, N=1, N=2 ncra -O -y rmssdn -v '^rec_var_flt_mss_val_flt_all.?' ~/nco/data/in.nc ~/foo.nc ncks -H -m ~/foo.nc nco817. Document how to work with 1D/2D coordinate grids ncks -H -v '.?_[0-9]D.?' ~/nco/data/in.nc nco821. ncrename netCDF4 regression cd ~/nco/bm;./nco_bm.pl --fl_fmt=netcdf4 --regress --udpreport ncks ncks -O -C --fl_fmt=classic -v lat ~/nco/data/in.nc ~/foo.nc ncrename -O -D 1 -d lat,new_lat -v lat,new_lat ~/foo.nc # works ncks -O -C --fl_fmt=netcdf4 -v lat ~/nco/data/in.nc ~/foo.nc ncrename -O -D 1 -d lat,new_lat -v lat,new_lat ~/foo.nc # fails nco822. ncap2 netCDF4 regressions with nco_bm.pl: cd ~/nco/bm;./nco_bm.pl --fl_fmt=netcdf4 --regress --udpreport ncap2 ncap2 -O --fl_fmt=netcdf4 -D 5 -v -S ~/nco/data/ncap2.in ~/nco/data/in.nc ~/foo.nc # fails, causes ncap2 regression with nco_bm.pl Script dies with: ncap2: ERROR dimension lev is not in list of dimensions available to nco_var_fll() ncap2: HINT This could be a symptom of TODO nco1045. Workaround is avoid use of append mode (i.e., -A switch) in ncap2. ncap2: ERROR exiting through nco_exit() which will now call abort() Abandon (core dumped) nco826. ncwa: optimization---do not allocate tally when var_sz=var_avg since this this always indicates a no-op, e.g., removing a degenerate dimension. nco828. ncks: returns file ID = 65536 = 2**16 on netCDF4 files: why? ncks -O --fl_fmt=netcdf4 ~/nco/data/in.nc ~/nco/data/in_4.nc ncks -m ~/nco/data/in_4.nc od -An -c -N4 ~/nco/data/in_4.nc nco834. Add atomic type string NC_STRING to nco_c++ get/put var nco835. ncks: uint64_var(ULLONG_MAX) = int64_var(LLONG_MAX) (problem with libnetcdf4?) PBN4 ccc ncks -v '.?_var$' ~/c++/foo.nc nco845. Add -Wno-switch to quiet GCC enum warnings on netCDF4 case labels? nco846. netCDF4: switch to long long array offsets everywhere? e.g., can long tally hold > 2 GB array? nco847. switch sz, tally to type (unsigned long), perhaps size_t, and perhaps (unsigned long long int) nco848. rgr: Add regression to demonstrate breakage on variables with 2--4 GB elements nco853. Enable arithmetic for NC_BYTE and NC_UBYTE everywhere? nco854. Use NC_BYTE instead of NC_SHORT for logical in ncap2? nco855. nco_netcdf.c netCDF4 forward compatibility stubs generate beaucoups 'unused parameter' warnings (only when compiled with netCDF3) nco865. Re-cast output variable to original type in ncbo.c (like in ncflint.c)? ncbo -O -v '.?pck.?' -p ~/nco/data in.nc in.nc ~/foo.nc ncbo -O -v rec_var_dbl_mss_val_dbl_pck -p ~/nco/data in.nc in.nc ~/foo.nc ncks -O -C -d time,0,3 -v rec_var_dbl_mss_val_dbl_pck -p ~/nco/data in.nc ncks ~/foo.nc nco866. Why don't ncra and ncwa make NC_BYTE etc. as fix var in var_lst_dvd()? nco871. rgr: Add compression regression test for compression ncks -O --dfl_lvl=0 ~/nco/data/in.nc ~/foo.nc ls -l ~/foo.nc ncks -O --dfl_lvl=9 ~/nco/data/in.nc ~/foo.nc ls -l ~/foo.nc ncks -O -4 --dfl_lvl=0 ~/nco/data/in.nc ~/foo.nc ls -l ~/foo.nc ncks -O -4 --dfl_lvl=9 ~/nco/data/in.nc ~/foo.nc ls -l ~/foo.nc ncks -O -4 --dfl_lvl=9 -v one ~/nco/data/in.nc ~/foo.nc nco873. ncks remik bug: ncks BUG: coords are zero after 2 var ext intel compiler only, possibly only ia64 "superficially injecting "nc_sync(out_id);" into ncks.c:559 at the end of the "Copy variable data" for-loop the output is correct, although this isn't a solution we'd want. nco874. Implement CDL abbreviations for netCDF4 atomic types (when known) nco875. Squelch compiler warnings like: ../src/nco/nco_pck.c:819:39: warning: integer constant is so large that it is unsigned that are triggered by OK statements like case NC_UINT64: mss_val_dfl_dbl=NC_FILL_UINT64; break; nco880. ncpdq: netCDF4 problem _only_ with fll_val/mss_val variables: PBN4 ncpdq -O -D 4 ~/nco/data/in.nc ~/foo.nc # works fine ncpdq -O -C -v fll_val -D 4 ~/nco/data/in.nc ~/foo.nc # works fine ncpdq -O -4 -x -v fll_val -D 4 ~/nco/data/in.nc ~/foo.nc # borken ncpdq -O -4 -C -v fll_val -D 4 ~/nco/data/in.nc ~/foo.nc # borken nco_err_exit(): ERROR Short NCO-generated message (usually name of function that triggered error): nco_copy_att() nco_err_exit(): ERROR Error code is -36. Translation into English with nc_strerror(-36) is "NetCDF: Invalid argument" nco885. ncpdq: netCDF4 problem with CAM datasets variable AERASM_v. AERASM_v does have a _FillValue attribute---is this a clue? ncpdq -D 6 -4 -v AERASM_v -O sncpd05_ts_ANN.nc -p $DATA/anl_sncpd05 ~/foo_5.nc nco_err_exit(): ERROR Short NCO-generated message (usually name of function that triggered error): nco_copy_att() nco_err_exit(): ERROR Error code is -36. Translation into English with nc_strerror(-36) is "NetCDF: Invalid argument" nco886. ppr: Decide next project: SWAMP? paper on...ncap2? SWAMP? IPCC benchmarks? nco891. dbn: fix lintian RPATH messages like Binary /usr/bin/ncwa compiled with an RPATH of /usr/lib/nco libtool error: libtool --finish /usr/lib nco901. mss_val in code and comments now (usually) refers to _FillValue (except in nco_mss_val.c). Change mss_val to fll_val? nco905. TKN2SNG technique for "_FillValue" adds extra quotes in nco.h but not c.c! The work-around is an extra function of global scope (nco_mss_val_sng_get()) that is worth getting rid of. nco906. rgr: Add regression test for DAP via THREDDS server: ncks -m http://eclipse.ncdc.noaa.gov:8080/thredds/dodsC/isccp-d1/2001/ISCCP.D1.1.GLOBAL.2001.01.01.0000.GPC nco911. Periods in attribute names choke OPeNDAP (had to remove att_nm.dot): ncks -O -D 7 -v var_nm.dot -p ~/nco/data dap_dot_bug.nc ~/foo.nc # works fine ncks -O -D 7 -v var_nm.dot -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata dap_dot_bug.nc ~/foo.nc # borken nco_err_exit(): ERROR Short NCO-generated message (usually name of function that triggered error): nco_copy_att() nco_err_exit(): ERROR Error code is -43. Translation into English with nc_strerror(-43) is "Attribute not found" nco912. ncks: print '_' or '_FillValue' instead of numeric values à la ncdump? nco913. nco_cmp_get() fails on _AIX with different compiler nco915. GCC OpenMP support in configure.ac nco917. GCC OpenMP with autoconf nco919. 'make check' (i.e., nco_bm.pl) breaks when ncap2 disabled (i.e., --disable-nco++) reported by Tim Hoar nco920. Add ncwa (ncks?) capability to remove all degenerate dimensions --delete-degenerate-dimensions (ncl-talk 20071205) (assign to hmb?) nco922. ncbo with OpenMP on netCDF4 files fails (not with netCDF3 in.nc): ncbo -O -t 1 -D 4 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc # works ncbo -O -t 2 -D 4 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc # works ncbo -O -t 1 -D 4 -p ${HOME}/nco/data in_4.nc in_4.nc ~/foo.nc # works ncbo -O -t 2 -D 4 -p ${HOME}/nco/data in_4.nc in_4.nc ~/foo.nc # fails ncbo -O -t 1 -D 4 -p ${HOME}/aca swnb.nc swnb.nc ~/foo.nc # works ncbo -O -t 2 -D 4 -p ${HOME}/aca swnb.nc swnb.nc ~/foo.nc # fails nco923. OPTS=D and OPTS=R should not do -O4 optimization on nco++ nco924. Document ncks --msa_usr_rdr nco929. drop ncap, or, rather, link it to ncap2, next release ? nco931. nco_c++ nc_put_var1_string wrapper currently kludged and untested nco932. ncwa and packed data: help forum 20080214: When using ncwa to calculate a weighted average from a packed file (NC_SHORT, scale_factor=0.1, _FillValue=32766), the data in the resulting file is in double precision. However, the _FillValue attribute is not changed to the double precision value (3276.6)....it is left at 32766. Shouldn't ncwa writeout the new _FillValue attribute? nco934. Add ncecat -M option (CPY_GLB_METADA) to other operators? nco935. Make single-file operators (SFOs) default out.nc to in.nc ? nco938. ncks -m problem: cd ~/Desktop;ncks -m NCEP-NAM-CONUS_80km_best.ncd.nc nco_err_exit(): ERROR Short NCO-generated message (usually name of function that triggered error): nco_inq_varid_flg() nco_err_exit(): ERROR Error code is -36. Translation into English with nc_strerror(-36) is "NetCDF: Invalid argument" nco_err_exit(): ERROR NCO will now exit with system call abort() nco939. Enable netCDF4-NCO OpenMP iff HDF5 configured with --enable-threadsafe? nco941. ncra (now? when was regression?) tries to average NC_CHAR record variables: Reported by Alberto Corbi Bello ncra -O -v two_dmn_rec_var_sng ~/nco/data/in.nc ~/foo.nc;ncks -H ~/foo.nc 20080723: HMB kludged ncra to work for NC_CHAR What about NC_STRING? that seems to be "handled" by ignoring it in nco_var_cnf_typ()... What about other operators, e.g., nces? Is better fix to never promote/demote to/from NC_CHAR? (like NC_STRING?) That would move fix from ncra.c to nco_var_cnf_typ() Would that break ncpdq packing to NC_CHAR? nco943. rgr: Add regression test for ncks -m -v cnv_CF_crd ~/nco/data/in.nc nco949. Make --no-clobber option for all operators nco953. ncatted: Add -v -C -c infrastructure to allow easy modification of attributes of variable lists, rather than all-or-nothing selections nco954. ncinsert functionality request posted to help forum 20081116 nco960. Warn when attempted hyperslab on 2-D (or more) coordinates, e.g., https://sf.net/forum/message.php?msg_id=6282324 nco969. nco: do not automatically try wget when DAP access fails ? nco970. nco: do not create really long paths with (especially failed) wget attempts nco971. wget: both following commands create and write mutilated directory cd ~;ncks -M -R -p http://dust.ess.uci.edu/nco in.nc cd ~;ncks -M -R http://dust.ess.uci.edu/nco/in.nc ls -lR ~/nco/in.n ncks: INFO Retrieved files will be stored in directory ./nco/in.n stores correctly in local directory but also creates ./nco/in.n /bin/rm -r ~/nco/in.n ~/nco/in.nc nco972. NC_STRINGs support: ncatted, nco_put_var_mem/nco_get_var_mem instead of memcpy, sort, ncatted nco973. ncks: allow for printing "units" attributes stored as NC_STRINGs nco975. add NCO global attribute to output files like :NCO = "netCDF Operators version 1.1.1 (http://nco.sf.net)" ; nco976. clean-up mess caused by eliminating nco_dmn_lmt_mrg in ncra, ncecat, ncpdq, ncflint (but not (why?) ncap,ncbo,ncwa)! nco977. fix -d syntax spec or nco_lmt_prs() as per https://sf.net/forum/message.php?msg_id=7486118 ? nco979. UDUnits1: time zone at end of user-specified limit string is ignored (bad) but time zone within units attribute of variable is parsed (good) UDUnits2: handles time zone correctly in both locations (good) nco980. UDUnits: offsets/scalefactors in re-basing to handle differences between files like "hours since 1965-010-01 12:00" and "minutes since 1968-02-01 12:32" nco983. change default to netCDF3 64bit? or compile-time option to do so ? nco991. ncap2 functions to return all variable and dimension names nco995. chunking in ncap2 nco999. nco: replace a character array without RHS padding? ncks -v fl_nm ~/nco/data/in.nc ncap2 -O -s 'fl_nm(:)="01234567890123456789012345678901234567890123456789012345678901234567890123456789"' ~/nco/data/in.nc ~/foo.nc ncap2 -O -s 'fl_nm[char_dmn_lng80]="01234567890123456789012345678901234567890123456789012345678901234567890123456789"' ~/nco/data/in.nc ~/foo.nc ncap2 -O -s 'fl_nm(0:8)="Hi Dennis"' ~/nco/data/in.nc ~/foo.nc ncap2 -O -s 'fl_nm(0:actual_len-1)="01234567890123456789012345678901234567"' ~/nco/data/in.nc ~/foo.nc ncap2 -O -s 'defdim("string_size",10);fl_nm2[$string_size]="0123456789"' ~/nco/data/in.nc ~/foo.nc ncap2 -O -s 'fl_nm="new string"' ~/nco/data/in.nc ~/foo.nc ncks -v fl_nm ~/foo.nc nco1000. mpi: build/test mpi executables again cd ~/nco/bld;make MPI=Y nco1001. ncpdq packing _FillValue cat > ~/foo.cdl << EOF netcdf foo { dimensions: dmn = 4 ; variables: float var(dmn) ; var:_FillValue = 1.0e36f ; data: var = -1, 0, 1, 1.0e36 ; } EOF cat > ~/foo.cdl << EOF netcdf foo { dimensions: dmn = 4 ; variables: float var(dmn) ; var:_FillValue = -999s ; data: var = -1, 0, 1, -999 ; } EOF ncgen -b -o ~/foo.nc ~/foo.cdl ncks -m -H ~/foo.nc ncpdq -D 1 -O ~/foo.nc ~/foo_pck.nc ncks -m -H ~/foo_pck.nc ncpdq -O -U ~/foo_pck.nc ~/foo_upk.nc ncks -m -H ~/foo_upk.nc nco1002. andx (from ARM) does ncks-like multiple column printing (window$ only? needs "dislin" package) http://science.arm.gov/~cflynn/ARM_Tested_Tools/html/alltools.html#andx http://science.arm.gov/~cflynn/ARM_Tested_Tools/src/andx.tar andx ~/nco/data/in.nc -o ASCII -delim TAB -time Hh two_dmn_rec_var -zf 2 tz nco1004. nco: ncpdq force _FillValue to be inside range of packed type ? nco1008. nco: ncap2 ismissing() and isvalid() methods nco1009. nco: replace allocations of NC_MAX_NAME by NC_MAX_NAME+1 to allow for NUL character nco1010. nco: support degenerate auxiliary hyperslabs. Related to nco1007 posted by Jeff Daily. Requires lots of code to compute minimum distance of each point to specified point. And what if both lat and lon are degenerate? PITA ncks -O -v gds_3dvar -X 0.,180.,20.,20. ~/nco/data/in.nc ~/foo.nc # broken---exits with domain error but should return only value nearest lat=20 ncks -H ~/foo.nc nco1012. nco: nco_aed_prc() is called (too?) often (by nco_att_cpy()) to copy _FillValue attributes ncks -O -D 5 ~/nco/data/in.nc ~/foo.nc nco1020. nco: re-base record bounds variables (e.g., time_bnds) in ncrcat nco1021. nco: use owner axes for printing CF-time in bounds attributes nco1023. nco: ncap2 overwrites arrays with scalars (and changes type!) without asking, e.g., ncap2 -O -v -s 'one_dmn_rec_var=0' ~/nco/data/in.nc ~/foo.nc ncks -v one_dmn_rec_var -C -m -H ~/foo.nc nco222. nco: Warn when nces/ncra operate on scaled variables ("Results will be meaningless if scale_factor and add_offset are not identical in each file") nco1025. nco: ncrcat/ncecat warn/die when concatenating files with different scale factors nco1028. ncap2: create maintainable list of reserved words and put in manual nco1033. ncrcat: warn when first file has more variables than subsequent files nco1035. rewrite nco_var_cnf_typ() to use default rather than truncated missing values nco1036. ncks: implement rew's copy workaround in nco_cpy_var_val() nco1037. nco: support NaN's in math, comparison, averagers following template in NC_FLOAT in nco_var_avg() using isfinite() ncwa -O -v nan_arr ~/nco/data/in.nc ~/foo.nc;ncks -C -m -H -v nan_arr ~/foo.nc ncatted -O -D 3 -a _FillValue,nan_arr,o,f,1.0e36 ~/nco/data/in.nc ~/foo.nc;ncks -C -m -H -v nan_arr ~/foo.nc ncks -C -H -v nan_arr,nan_scl ~/nco/data/in.nc nco1041. nc__open() with NC_SIZEHINT_DEFAULT for MM3 problems or general switch? nco1043. Modify nco.spec to build on RHEL and Fedora nco1048. ncrcat Generates warnings like "ERROR: Conversion between user specified unit "days" and file units "" is meaningless" test case in crr.txt nco1053. nco: ncap2 rgr 10 Casting variable with same name as dimension (failure expected on netcdf4 ncap81) works for Henry not me. OS version related? e.g., app-armor-triggered? ncap2 -O -C -v -s 'defdim("a",3);defdim("b",4); a[$a,$b]=10;c=a(1,1);' ~/nco/data/in.nc ~/foo.nc nco1054. nco: ncap2 rgr 11 Casting variable with a single dim of sz=1. works for Henry not me. OS version related? e.g., app-armor-triggered? ncap2 -O -C -v -s 'defdim("a",1);b[$a]=10;c=b(0:0);' ~/nco/data/in.nc ~/foo.nc nco1014. nco: option to eliminate ncap2 intermediate tmp file writing ncap2 -s 'time=time+999999' ~/nco/data/in.nc nco1059. nco: ncatted keep type same by default when modifying/overwriting attribute nco1063. use '--with-nc-config=path' in configure when possible (rich signell idea) nco1065. ncra2.c move input_complete break to precede record loop but remember to close open filehandles nco1067. stat() fails on ~30 GB file on windows? fix workaround nco1068. nco: optimize so ncra writes straight to output when ssc==1, MRO=Yes (i.e., no nrm) maybe not, what about rms? verify ncra2 -O -C -d time,0,,1,1 --mro -v time -p ~/nco/data in.nc in.nc ~/foo.nc # nco1070. nco: rx add windows equivalent to variable wildcarding regex.h nco1071. nco: rx add windows equivalent to filename expansion (globbing) nco1072. nco: clang breaks (gcc is fine) on ncra rgr #20 record average of cell-based geodesic data Problem also that ddd does not work with clang. Try qt debugger? ncra -D 5 -O -X 0.,180.,-30.,30. -v gds_3dvar -p ~/nco/data in.nc ~/foo.nc ncks -C -H -s '%8.1f' -v gds_3dvar ~/foo.nc nco1074. nco: wget: add -p option to enable clobber? nco1076. ncpdq: change number of dimensions by unrolling ncpdq --unroll lat,lon # Unroll lat and lon in all multi-dimensional (R > 1) arrays nco1077. wnd: utilize netCDF CMake for linking so DAP/UDUNITS support is automatic nco1079. ncap2: add option to return index of max/min/etc. kevin raeder suggestion nco1084. ncks feature: allow multiple specifications of mk_rec_dmn and fix_rec_dmn nco1093. ncks: print attribute function lynnes (NB: windows does not use filters) ncks -v var_lst -a att_lst (--abc=abc_md --alphabetize=abc_md) in.nc nco1097. ncatted: rx attributes lynnes and 1 other 20130702 and 1 other 20150625 nco1094. ncks: print statistics function lynnes (NB: windows does not use filters) nco1095. ncap2: user-defined functions (UDFs) lynnes nco1096. ncecat: --playnice, recognize, e.g., "latitude" variants lynnes nco1099. ncflint: make following statement true A. ncflint now always works when input files are interchanged, i.e., (ncflint -w 0.5 fl_1.nc fl_2.nc) = (ncflint -w 0.5 fl_2.nc fl_1.nc). Formerly, ncflint broadcast variables in fl_2 to match the rank of variables in fl_1 when necessary, but would fail rather than broadcast in the opposite direction. Hence one could interpolate zonal averages, e.g., to full fields but not the reverse. Now ncflint broadcasts variables both ways. If v1 is larger rank in fl_1 than in fl_2 then both these work: ncflint -v v1 -w 0.5 fl_1.nc fl_2.nc out.nc # Now works too! ncflint -v v1 -w 0.5 fl_2.nc fl_1.nc out.nc # Always worked nco1102. ncatted handle arrays of NC_STRINGs with embedded delimiters ncatted -D 5 -O -a new_string_att,att_var,c,sng,"list","of","str,ings" ~/nco/data/in_4.nc ~/foo.nc nco1104. ncrename and ncatted copy through API with --hdf4 nco1106. autoconvert netCDF4 string variable to netCDF3 nc_char type. requires dummy dimension for NC_CHAR array length ncks -O -G : -g /g11/ -v string_var -3 ~/nco/data/in_grp.nc ~/foo.nc nco1109. broadcast degenerate dimensions in nco_var_cnf_dmn()/ncap_var_cnf_dmn(): helps ncap/ncwa/ncbo/ncflint nco1110. ncap2: allow type specification as per christine smit (GSFC) request 20140407 nco1111. ncrcat/ncecat check consistency of packing attributes across files (requested by ocehugo 20140522) nco1112. nco: nintap double iterator rqs by dave allured 20140813 nco1113. nco: rsp parker norton help srd slowdown issue help 20140718 completely fixed 201411 Slowdown occurs only when using srd time ncks -O ~/ET_2000-01_2001-12.nc ~/foo.nc # works 1m38s time ncks -O -d time,0 ~/ET_2000-01_2001-12.nc ~/foo.nc # works 0m03s time ncks -O -d time,0,0,12 ~/ET_2000-01_2001-12.nc ~/foo.nc # borken after 6m13s, numerous HDF Errors time ncks -O -L 0 -d time,0,0,12 ~/ET_2000-01_2001-12.nc ~/foo.nc # borken after 6m13s, numerous HDF Errors time ncks -O -d time,0,,12 ~/ET_2000-01_2001-12.nc ~/foo.nc # borken after 6m13s, numerous HDF Errors nco1114. ncrcat fails when single record dimension is not first dimension nco1116. --add_bnds for creating bounds variables nco1117. ncks human-readable times nco1120. brendan discussion 20150312 autoconf requires both --enable-netcdf4=no --and enable-netcdf-4=no to get "ENABLE_NETCDF4....... no" and avoid the "configure: Bad news: Simple program does not compile and link with netCDF4 library" message. nco1121. ncap2 attribute propagation occurs for re-defined input variables Christine Smit https://sourceforge.net/p/nco/discussion/9829/thread/142457da/?limit=25 nco1122. cnk slowdown Barry McInnes 3/9 # Severe slowdown in record loop of nco_cpy_rec_var_val() (MM3 workaround) for cnk_sz time != 1 ncks -O -v huss --fl_fmt=netcdf4_classic -L 5 ${DATA}/hdf/huss_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc ~/foo.nc # hangs ncks -O -v huss --cnk_plc=r1d --fl_fmt=netcdf4_classic -L 5 ${DATA}/hdf/huss_Amon_ACCESS1-0_historical_r1i1p1_185001-200512.nc ~/foo.nc # works nco1123. ESGF access ncks -M http://esgf-data2.ceda.ac.uk/thredds/dodsC/cmip5.output1.MOHC.HadGEM2-ES.rcp85.mon.ocean.Omon.r1i1p1.uo.20111014.aggregation.1 nco1124. ncra fix ncra --wgt_nm to work (i.e., correctly normalize) with missing values nco1125. ncpdq add option for user-specified scale_factor/add_offset nco1126. ncra segfault with MSA christine smit regardless of presence of scale_factor, add_offset. appears that ncra does not play well with MSA on record dimension. leads to free() error. ncra -O -d time,1,1 -d time,3,3 ~/christine.nc ~/foo.nc # borken ncra -O -C -v one_dmn_rec_var -d time,0,0 -d time,2,2 ~/nco/data/in.nc ~/foo.nc # borken ncra -O -C -v one_dmn_rec_var -d time,0,0 -d time,1,1 ~/nco/data/in.nc ~/foo.nc # works nco1127. qrk ************************************************************************ End ncoXXX TODOs ************************************************************************ ************************************************************************ Begin bug examples ************************************************************************ Sent 20120709: What I find is that the first command below succeeds and the second fails: ncap2 -v -O -s 'valid=0*time;where(time< 7) valid=time;' \ ~/nco/data/in.nc ~/foo.nc # works ncap2 -v -O -s 'valid=0*time;time2=time;where(time2< 7) valid=time;' \ ~/nco/data/in.nc ~/foo.nc # fails Can you please verify this and explain why the second command fails? Is it not possible to use "new" variables in the masking condition for the where() statement? Sent 20120209: Hi Henry, Is there an overloaded version of array() that works on multi-dimensional arrays? The first array() call below works for 1-D, and the next two fail for the 3-D case. If array() were defined to populate the multi-dimensional output as if it were an unfolded 1-D array, then it would be more useful. cat > ~/ncap2_foo.nco << 'EOF' //var_out=array(1,1,$time); // 1,2,3,4,5,6,7,8,9,10 var_out=array(1,1,$time,$lat,$lon); var_out=array(1,1,&three_dmn_var); print(var_out); EOF ncap2 -O -v -S ~/ncap2_foo.nco ~/nco/data/in.nc ~/foo.nc Sent 20120209: Hi Henry, Any idea why running the first script below works fine and the second script fails yet the only difference is an extra print statement? cat > ~/ncap2_foo.nco << 'EOF' time=10.0*gsl_rng_uniform(time); // Replace time coordinate with random values var_rnd[$time,$lat,$lon]=0.0; // Initialize multi-dimensional array print(time); EOF ncap2 -O -v -S ~/ncap2_foo.nco ~/nco/data/in.nc ~/foo.nc cat > ~/ncap2_foo.nco << 'EOF' print(time); time=10.0*gsl_rng_uniform(time); // Replace time coordinate with random values print(time); var_rnd[$time,$lat,$lon]=0.0; // Initialize multi-dimensional array EOF ncap2 -O -v -S ~/ncap2_foo.nco ~/nco/data/in.nc ~/foo.nc Thanks! c ************************************************************************ End bug examples ************************************************************************ ************************************************************************ Begin valgrind section ************************************************************************ Valgrind: Archive of valgrind tests which are memory-error and leak-free vg1. ncap valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncap -O -S ${HOME}/nco/data/ncap.in -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 ncap2 valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncap2 -O -D 1 -S ~/nco/data/ncap2_tst.nco ~/nco/data/in.nc ~/foo.nc > ~/foo 2>&1 vg2. ncbo valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncbo -t 2 -O -C -d lon,1 -p ${HOME}/nco/data -l /tmp in.nc in.nc ~/foo.nc > ~/foo 2>&1 vg3. nces valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck nces -t 2 -O -C -D 3 -d lon,1 -n 3,4,1 -v one -p ${HOME}/nco/data -l ${HOME}/nco/data h0001.nc ~/foo.nc > ~/foo 2>&1 vg4. ncecat valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncecat -t 2 -O -C -D 3 -d lon,1 -n 3,4,1 -p ${HOME}/nco/data -l ${HOME}/nco/data h0001.nc ~/foo.nc > ~/foo 2>&1 vg5. ncflint valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncflint -t 2 -O -C -d lon,1 -p ${HOME}/nco/data -l /tmp in.nc in.nc ~/foo.nc > ~/foo 2>&1 vg6. ncks valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncks -O -C -d lat,1,1 -d lev,2,2 -d lon,0,3 -d lon,1,3 -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 vg7. ncpdq (re-order) valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncpdq -t 2 -O -D 3 -a lat,lev,lon -v three_dmn_var ~/nco/data/in.nc ~/foo.nc > ~/foo 2>&1 vg8. ncpdq (pack) valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncpdq -t 2 -O -D 3 -P all_new -v three_dmn_var ~/nco/data/in.nc ~/foo.nc > ~/foo 2>&1 vg9. ncra valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncra -t 2 -O -C -D 3 -d lon,1 -n 3,4,1 -v one_dmn_rec_var_sng -p ${HOME}/nco/data -l ${HOME}/nco/data h0001.nc ~/foo.nc > ~/foo 2>&1 vg10. ncrcat valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncrcat -t 2 -O -C -D 3 -d lon,1 -n 3,4,1 -v one_dmn_rec_var_sng -p ${HOME}/nco/data -l ${HOME}/nco/data h0001.nc ~/foo.nc > ~/foo 2>&1 vg11. ncrename valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncrename -O -D 3 -d lon,new_lon -v scalar_var,new_scalar_var -a long_name,new_long_name -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 vg12. ncwa valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck ncwa -D 3 -t 2 -O -C -a lat,lon,time -w gw -m gw -v PS -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 callgrind ncwa -D 3 -t 2 -O -C -w gw -m gw -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 valgrind --suppressions=${HOME}/nco/doc/valgrind.txt --tool=callgrind ncwa -D 3 -t 2 -O -C -a lat,lon,time -w gw -m gw -v PS -p ${HOME}/nco/data -l /tmp in.nc ~/foo.nc > ~/foo 2>&1 kcachegrind ncwa & ************************************************************************ End valgrind section ************************************************************************ ************************************************************************ Begin MPI section ************************************************************************ MPI: Archive of quickie MPI tests NB: mpirun requires explicit path to executable Status 20050920: 1. LAM-MPI, MPICH, MPICH2 all work fine Currently recommend running with MPICH2, though LAM is easier since it's in Ubuntu See ~/doc/mpi.txt for installation details. 2. Charlie's default compilation/testing environments: ashes: Ubuntu, x86, LAM-MPI, gcc-4.0 elnino: Libranet, x86, MPICH2, icc-9.0 sand: Ubuntu, dual x86_64, LAM-MPI, gcc-4.0 0. MPI with valgrind example mpirun -np 3 /usr/bin/valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/nco/doc/valgrind.txt --tool=memcheck mpirun -np 3 ${MY_BIN_DIR}/mpncbo -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 1. mpncbo mpirun -np 3 ${MY_BIN_DIR}/mpncbo -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 2. mpnces mpirun -np 3 ${MY_BIN_DIR}/mpnces -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 3. mpncecat mpirun -np 3 ${MY_BIN_DIR}/mpncecat -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 4. mpncpdq mpirun -np 3 ${MY_BIN_DIR}/mpncpdq -O -D 3 -a lat,lev,lon -p ${HOME}/nco/data in.nc ~/foo.nc > ~/foo 2>&1 mpirun -np 3 ${MY_BIN_DIR}/mpncpdq -O -D 3 -P all_new -p ${HOME}/nco/data in.nc ~/foo.nc > ~/foo 2>&1 5. mpncra mpirun -np 3 ${MY_BIN_DIR}/mpncra -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 6. mpncrcat (hangs just before write) mpirun -np 3 ${MY_BIN_DIR}/mpncrcat -O -D 3 -p ${HOME}/nco/data in.nc in.nc ~/foo.nc > ~/foo 2>&1 7. mpncwa mpirun -np 3 ${MY_BIN_DIR}/mpncwa -O -D 3 -p ${HOME}/nco/data in.nc ~/foo.nc > ~/foo 2>&1 ************************************************************************ End MPI section ************************************************************************ ************************************************************************ Begin OPeNDAP section ************************************************************************ OPeNDAP: Archive of quickie DAP tests: ncks -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata -l . in.nc ncks -p https://srb.npaci.edu/mysrb331all.shtml/home/zender.uci-esmf/zender/nco/data -l . in.nc http://sasa.sdsc.edu:8003/cgi-bin/nph-dods/data/nccoos-duck-codar-latest.nc.html http://orion.sdsc.edu:8003/cgi-bin/nph-dods/data/nccoos-duck-codar-latest.nc.html ************************************************************************ End OPeNDAP section ************************************************************************ ************************************************************************ Begin hpctoolkit section ************************************************************************ /bin/rm -r ~/nco/bm/hpctoolkit # Remove old profiles mkdir -p ~/nco/bm/hpctoolkit lsmod | grep oprofile # Make sure oprofile module is not loaded sudo opcontrol --deinit # Unload oprofile iff it is loaded modprobe perfctr # Load perfctr module # Do not monitor more than one function per hardware counter, e.g., PAPI_FP_OPS and PAPI_FP_OPS cat > ~/nco/bm/prf_ncbo.sh << EOF cd ~/nco/bm/hpctoolkit hpcrun -r -o ~/nco/bm/hpctoolkit -e PAPI_TOT_CYC:32767 -e PAPI_FP_OPS:32767 -e PAPI_TOT_INS:32767 -e PAPI_L2_DCM:32767 -- ${MY_BIN_DIR}/ncbo -O --op_typ='-' -p ${DATA}/nco_bm stl_5km.nc stl_5km.nc ${DATA}/nco_bm/prf_ncbo.nc EOF chmod a+x ~/nco/bm/prf_ncbo.sh ~/nco/bm/prf_ncbo.sh hpcquick -I ~/nco/src/nco -P ~/nco/bm/hpctoolkit/ncbo.PAPI_TOT_CYC-etc.clay.ess.uci.edu.14169.0 hpcviewer ~/nco/bm/hpctoolkit/hpcquick.db/hpcquick.hpcviewer & ************************************************************************ End hpctoolkit section ************************************************************************ ************************************************************************ Begin oprofile section ************************************************************************ cd ~/nco/bm xosview & # To enable idle cycle counts, add 'idle=poll' to kernel spec in /boot/grub/menu.lst: # kernel /boot/vmlinuz.old root=/dev/hda1 ro console=tty0 idle=poll quiet splash sudo opcontrol --vmlinux=/usr/src/linux-2.6.11/vmlinux # sudo opcontrol --separate=cpu # Use this on SMP machines sudo opcontrol --start # Start profiling sudo opcontrol --shutdown cat > ~/nco/bm/prf_ncbo.sh << EOF cd ${DATA}/nco_bm sudo opcontrol --reset time ${MY_BIN_DIR}/ncbo -O --op_typ='-' -p ${DATA}/nco_bm gcm_T85.nc gcm_T85_00.nc ${DATA}/nco_bm/prf_ncbo.nc opreport --demangle=smart --exclude-dependent --symbols > ~/nco/bm/prf_ncbo.txt EOF chmod a+x ~/nco/bm/prf_ncbo.sh ~/nco/bm/prf_ncbo.sh cat > ~/nco/bm/prf_ncwa.sh << EOF cd ${DATA}/nco_bm sudo opcontrol --reset time ${MY_BIN_DIR}/ncwa -O -a lat,lon,lev,time -w lat -p ${DATA}/nco_bm gcm_T85.nc ${DATA}/nco_bm/prf_ncwa.nc opreport --demangle=smart --exclude-dependent --symbols > ~/nco/bm/prf_ncwa_avgall.txt EOF chmod a+x ~/nco/bm/prf_ncwa.sh ~/nco/bm/prf_ncwa.sh cat > ~/nco/bm/prf_ncwa.sh << EOF cd ${DATA}/nco_bm sudo opcontrol --reset time ${MY_BIN_DIR}/ncwa -O -a lat,lon,lev,time -w lat -z "lat!=1.0" -p ${DATA}/nco_bm gcm_T85.nc ${DATA}/nco_bm/prf_ncwa.nc opreport --demangle=smart --exclude-dependent --symbols > ~/nco/bm/prf_ncwa_avgall_msk.txt EOF chmod a+x ~/nco/bm/prf_ncwa.sh ~/nco/bm/prf_ncwa.sh cat > ~/nco/bm/prf_ncwa.sh << EOF cd ${DATA}/nco_bm sudo opcontrol --reset time ${MY_BIN_DIR}/ncwa -O -F -d lat,,64 -d lon,,128 -d lev,,16 -d time,,4 -a lat,lon,lev,time -w lat -p ${DATA}/nco_bm gcm_T85.nc ${DATA}/nco_bm/prf_ncwa.nc opreport --demangle=smart --exclude-dependent --symbols > ~/nco/bm/prf_ncwa_hlf.txt EOF chmod a+x ~/nco/bm/prf_ncwa.sh ~/nco/bm/prf_ncwa.sh ************************************************************************ End oprofile section ************************************************************************ ************************************************************************ Begin ncapXXX TODOs ************************************************************************ ncap-specific items: ncap07. Combine binary operations into binary_op_var_var and binary_op_var_att types to reduce number of functions ncap09. Add outer loop over files so script may apply to each file ncap12. Ensure lexer does not perform un-necessary work during initial_scan (e.g., LHS casting...) ncap13. Test that LHS casting works regardless of value of LHS template. If true, remove value initialization block ncap15. Link to GSL functions, especially gsl_sf_* (special functions) ncap16. Get ncap build working with pure_parser turned off so lex/yacc builds work ncap17. Start in console mode if no script and no output file specified, e.g., nco> ncap19. Make all binary operators handle ordering of operands consistently, e.g., divide(1,2)=1/2 not 2/1 ncap20. Print out contents of each non-comment statement when nco_dbg_lvl==1 ncap21. Add two-argument functions like fmodf to ncap_sym_init() (using va_args?) ncap25. Turn arbitrarily fixed size array tokens NCAP_ATT_LST_NBR_MAX, NCAP_SPT_NBR_MAX into dynamically allocatable arrays ncap26. Make sym_tbl_nbr dynamic by implementing sym_add(), sym_rm() functions or linked list ncap28. Make provision for pack() and unpack() to copy all attributes except scale_factor and add_offset from disk into new variable on disk? ncap29. Rewrite nco_var_pck() to use var_scv() arithmetic operations rather than more complex var_var() operations ncap30. Allow -S to specify multiple input scripts to be sequentially parsed ncap31. Put globals fl_spt_crr,ncl_dpt_crr,ln_nbr_crr in prs_arg or remove fl_spt from it ncap32. Need filename expander and $NCO_DATA_PATH handling so #include's may be generic ncap34. Make parse errors always print current line to terminal rather than silently failing ncap36. cygwin builds of ncap.l and netCDF fail because of dependence on syslimits.h. non-kludge fix may require updated gcc and mingw packages ncap37. Implement float function definitions in nco_rth_flt.c as inline to improve speed for MACOSX builds (inline is OK in C99 but will it break C89?) using AC_C_INLINE ncap38. Finish dimension-reducing operations (min/max/avg) ncap41. Make ncap function prototypes consistent with rest of NCO (ncap.h mainly) ncap42. Add switch allowing derived variable to take on all attributes of specified variable ncap43. Alphabetize ncap function list prior to printing it with -f ncap46. Define YYMALLOC/FREE/REALLOC etc so lexer/parser use nco_malloc() etc. ncap48. Search ncap_yacc.y for non-symmetric arithmetic operations, implement symmetric operations ncap49. Cause "**" in arithmetic context to cause error, print HINT to Fortran syntax users ncap52. Combine pow() with ^ parsing in parser ncap_yacc.y ncap53. Bug in ncap pack() on Alpha/Tru64: ncap -O -D 10 -s 'hsig=pack(hsig)' foo.nc foo2.nc details on sourceforge ncap54. Add option (true by default?) to retain variable attributes when variable re-defined or defined in terms of single other variable or perhaps always retain attributes of left-most variable on RHS of definition? ncap -v -O -s "one=one*1" -s "two=one*2" -s "pck=pack(upk)" ~/nco/data/in.nc ~/foo.nc ncks -m -H -v one,two,pck ~/foo.nc ncap55. Add pre-defined named_constants, e.g., nco_pi, nco_e, to make math easier ncap56. Introduce way of making function synonyms, e.g., ln=log, without growing symbol table? ncap57. Raising transcendental functions of NC_FLOATs to powers fails on AIX AIX thinks it has the trancendental float functions, so NCO uses system-supplied versions. Symptoms are consistent with breakage of system-supplied logf, sinf, etc. # Fails on AIX ncap -D 1 -O -v -s "foo=log(e_flt)^1" ~/nco/data/in.nc ~/foo.nc ncap -D 1 -O -v -s "foo=sin(e_flt)^1" ~/nco/data/in.nc ~/foo.nc ncap -D 1 -O -v -s "foo=log(e_flt+0.01f)^1" ~/nco/data/in.nc ~/foo.nc # Works on AIX ncap -D 1 -O -v -s "foo=log(e_dbl)^1" ~/nco/data/in.nc ~/foo.nc ncap -D 1 -O -v -s "foo=sin(e_dbl)^1" ~/nco/data/in.nc ~/foo.nc ncap59. ncap always gives points in first quadrant for ncap -O -v -s 'water_dir=(180/4*atan(1))*(atan(water_v/water_u) + 4 * atan(1) * ((water_u-abs(water_u))/(-2*water_u)))' ncap60. Add capability to create character string variables that contain any string, given only a pre-existing dimension size capable of holding the string ncap66. make ncap errors fatal, either in yyerror(), or call nco_error_exit() ncap70. gamma() function broken on AIX ncap71. Remove erf and gamma functions from AIX build ncap72. Stop linking to -lC on AIX. Get all float math functions by casting double versions ncap79. make abs() synonym for fabs() and pow() and ** synonyms for ^ ncap80. ncap2+openmp+netCDF4 - script only works with threads>1 if there are no atts in input file ncap81. (20150616: fixed by netCDF4.3.x) script 'defdim("a",3);defdim("b",4);a[$a,$b]=10;' works on netCDF3 not netCDF4. Known bug with netCDF4. (Why? what causes it?) ncap82. Unable to average single/multi dimensional var of total size 1 var in ncap2 e.g., defdim("X",10);defdim("Y",1); m[X,Y]=10; m.avg();- fails with seg fault ************************************************************************ End ncapXXX TODOs ************************************************************************ ************************************************************************ Begin bldXXX TODOs ************************************************************************ Build items: bld14. Replace #ifdef tokens in NCO code with autoconf-style tokens, e.g., #ifdef HDF5 -> #ifdef HAVE_HDF5, etc. Other tokens to consider are WIN32, _OPENMP, USE_FORTRAN_ARITHMETIC (deprecated). Of course must modify bld/Makefile to pass these style tokens as well so that config.h is not _required_, and that token use is consistent. bld23. Implement ncra i18n support I18N with autotools: Add .po files, update doc/i18n.txt bld30. Search for libstdc++ with AIX/DODS/GCC breaks NCO build bld32. Why have --enable-shared and --enable-static both default true? override one? bld33. Use PACKAGE_BUGREPORT, PACKAGE_NAME, PACKAGE_STRING, PACKAGE_TARNAME, PACKAGE_VERSION? bld35. Add pgcc, pgCC switches to configure.ac bld36. Improve precision/wording of nco_ctl.c tokens on shared/static libraries bld37. Ensure C99 used by compilers with AX_CFLAGS_SUN_OPTION AX_CFLAGS_HPUX_OPTION AX_CFLAGS_AIX_OPTION AX_CFLAGS_IRIX_OPTION bld38. Use OPeNDAP opendap-config script to ease build process, e.g., `opendap-config --cxx --cflags --libs` -o sample sample.c bld39. Fix autoconf build warnings (from including ncap_yacc in ncwa?): Makefile:472: warning: overriding commands for target `ncap_yacc.h' Makefile:440: warning: ignoring old commands for target `ncap_yacc.h' bld40. Automate splicing trailer ~/nco/doc/man_end.txt to man pages bld41. Add configure check for libssl functionality, if not found (Fedora) to explicitly adding libssl bld42. Adopt orphaned Debian NCO http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=273322 bld43. Implement Martin Schmidt's suggestion for AIX autoconf builds posted to developer's forum 20050201: {$CC} is not tested for xlc* but for (arbitrary_path/xlc*) bld44. Add support for autopackage format? http://www.wildgardenseed.com/apkg/ bld45. Replace ENABLE_LARGEFILE with test for 64-bit offset support (i.e., netCDF 3.6) in configure.ac and nco_ctl.c bld47. Add regression test for 64bit file format capability bld61. Verify netCDF4 benchmarks work for Ed Hartnett bld70. hjm nco_c++ on Mac OS X: Get "make check" working (add -lstdc++, remove -lnco) bld74. hjm Do not pass -std=c99 unless GCC=gcc rather than g++ bld76. Add SMP support switches to configure.ac for pathcc, pgicc, icc bld77. Make sure C99 switches like -std=c99 do not get passed to CXX bld78. Fix CXXFLAGS for icc enable-custom-optimize bld79. ************************************************************************ End bldXXX TODOs ************************************************************************ ************************************************************************ Begin bnchXXX TODOs - benchmarking & analysis/presentation of same ************************************************************************ Benchmark items: bnch01. hjm make benchmark script return remote benchmark data as netcdf data, or re-write server side to convert returned data into netcdf variables and append to a netcdf file. bnch02. hjm add code to analysis/plotting script (at least until bnch01 is ready) to filter data points that vary more than 1 SD from mean to remove bad data. bnch03. hjm should plotting script use linear regression or a log() transform to analyze the relationship? Check with other MPI analyses. ************************************************************************ End bnchXXX TODOs ************************************************************************ ************************************************************************ Begin dlwXXX plan ************************************************************************ 1. one or two operator complete server side DAP script server side only 2. CVS. write client wrapper script which parses regular command line(s) and feeds complex script to server (shell) wrapper_script ncra -n 100,1,2 model_01.nc model_avg.nc 3. Complete SS CGI script to work with all operators 4. Complete client side to work with all operators 5. Make sure wildcards/globbing works Milestone: regression tests can work in nco_bm.pl Check if design decisions/interfaces seem good ncra -n 100,1,2 -p http://server/foo/model_01.nc model_avg.nc Goal: end of February 6. Multiple sequential commands with SS intermediate output files and one output file to client 7. SS intermediate filename magic allow deterministic chaining of output files so sequential command may depend on previous commands 8. SS and client side mods to send back multiple output files 8.1 db-backed job control 8.1a. client-side multi-file wrapper first iteration 8.1b. server-side file-waiting (block-until-send) first iteration 8.1c. client-side real async: job status, etc. 8.1d. server-side wakeup/signalling for scalability Milestone: Mark's climate model analysis script "works" Check if design decisions/interfaces/initial parser seems good 9. SS understand dependencies (i.e., dependence of commands within script) 10. Smarter scheduling of operations (i.e., non-sequential script execution) 11. Basic security: file path validator (configurable?) 12. Basic security: argument validator (watch for backticks, pipes and other shell constructs) 13. Docs about security concerns 14. Charlie xml filefetch test. Random cleanup items: 1. Rework/consolidate tests in src/ssdap for less redundancy, less clutter, more simplicity, and understandability. 2. Create simple SSDAP functionality test so a user can verify the ability to use SSDAP scripts. Want to call this script from the bm script during regression testing. 3. Modularize parser (clear place to add new operators) 4. Modularize executor (clear interface to build new frontend) ************************************************************************ End dlwXXX plan ************************************************************************ ************************************************************************ End NCO Wish list ************************************************************************ nco-4.5.4/doc/VERSION000066400000000000000000000000061264355130400141170ustar00rootroot000000000000004.5.4 nco-4.5.4/doc/abs_igrid_2005.txt000066400000000000000000000116631264355130400162140ustar00rootroot00000000000000Purpose: Abstract submitted to iGrid2005 http://www.startap.net/igrid2005 9/26-9/29 (A) REAL-TIME DEMONSTRATIONS (Organizer: Maxine Brown) 1. Demonstration title. OptIPuter-enabled Distributed Climate Data Reduction and Analysis 2. Primary contact person\u2019s name, institution, e-mail address. Charlie Zender Department of Earth System Science UC Irvine zender@uci.edu 3. Contact information for collaborators (name, institution, e-mail) Gayathri Venkitachalam Department of Electrical Engineering and Computer Science UC Irvine gvenkita@uci.edu Harry Mangalam Department of Earth System Science UC Irvine hjm@tacgi.com 4. Project Description a. One-paragraph summary of your project and its significance. Reduction and analysis of distributed climate data is a significant domain challenge facing geophysics researchers. Climatologists typically use the central server data analysis paradigm---they copy all required data to local storage for analysis. Recent enhancements to the Scientific Data Operators (SDO) middleware allow users to access specific hyperslabs of geographically distributed netCDF data in a network-transparent fashion. Using grid services in conjunction with the high-bandwidth OptIPuter, we will demonstrate SDO operations which dramatically reduce barriers to analyzing distributed geophysical data. In particular, we will demonstrate rapid and flexible intercomparison and analysis of two future climate simulations stored on geographically disparate clusters connected by the OptIPuter. b. URL for further project documentation. http://nco.sf.net#prp_sei c. A graphical image (not logo) of your application (JPEG or TIFF) is encouraged. http://dust.ess.uci.edu/esmf/ipcc_ccsm_ddra.pdf d. How does your project utilize advanced networking? Why is this important? The Scientific Data Operator (SDO) project currently utilizes advanced networking primarily by transferring large amounts of data from remote servers to local clients for analysis. Without high-bandwidth networks, data distributed at geographically disparate locations are never intercompared and so expensive numerical experiments (e.g., climate change simulations) are usually not fully exploited, or worse, are re-run multiple times so that the data can be analyzed locally. SDO reduces distributed data analysis barriers, data storage redundancy, and time-to-discovery. 5. Hardware/Software requirements: Do you need to place any special hardware (e.g., disk stores or clusters) at GLIF sites? Required hardware is already in place at UCI/UCSD, ESG, and NCAR Do you need computer accounts at participating sites? What software do you need on these machines? While the project could pre-store and access data at GLIF sites in other countries, the combined software/hardware/account requirements for new remote machines would overwhelm our group this year. We would prefer to demonstrate the project using data stored on reliable networks and locations, such as UCI/UCSD, ESG, and NCAR. All required accounts and software exist at these locations. All we require for the presentation is a Linux laptop from which to run the demonstration. 6. Network requirements: What networks (locally/nationally/internationally) will you access? (Note: If these networks are not yet in place, when are they expected to be operational? And, at what speeds?) Earth System Grid, UCSD<->UCI OptIPuter, NCAR 7. Network usage: How much bandwidth does your application use? The application utilizes high bandwidth between the computational clusters. However, the demonstration will like just show a text-based metric of the remote application progress and so the bandwidth needed to the conference hall is minimal. (B) SYMPOSIUM PRESENTATIONS (Organizer: Tom DeFanti) 1. Type of presentation a. Tutorial, workshop, or lecture? b. For a beginner, intermediate or advanced networking audience? c. If a tutorial or workshop, is it a half day or full day? NOTE: Lectures will be 30 minutes to 1 hour. Actual times will be determined once the Symposium\u2019s schedule is finalized. 2. Presentation title. 3. Presenter\u2019s name, institution, e-mail address. 4. Contact information for other presenters (name, institution, e-mail) if a tutorial or workshop 5. Presentation description a. One-paragraph abstract. b. URL for further presentation documentation. c. A graphical image of your presentation (JPEG, TIFF, PPT) is encouraged. 6. Audio/visual requirements: Projectors for PPT presentations will be provided. Do you have any special A/V needs? Submit Real-Time Demonstration and Symposium Presentation proposals via email by 1 February 2005 for full consideration to: Maxine Brown Proposals will be reviewed by the iGrid 2005 Program Committee. Further input may be requested. Results from the Program Committee will be distributed by mid-March 2005. nco-4.5.4/doc/acme.png000066400000000000000000003172211264355130400144740ustar00rootroot00000000000000‰PNG  IHDR Œ“J çtEXtSoftwareAdobe ImageReadyqÉe<xiTXtXML:com.adobe.xmp ò&IDATxÚìÝ ØU}?ðI«¬#(((VDA¢¨ ·5€+Z VÿPwÔŽ ­TêE\°U°Z‚¸PŒˆéЂ"”"U((.²\v-ùÿÆ{©²dyÏ;sÏý|žçûœ—$äNΜ;ç¾ïÌŒE‹äk¦)È›Â(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€Ì)ŒdNa s £™SÈœÂ(@æF2§0 9…Q€ÌÍ2¤0cÆ “°ʪ^-†GFÖ‹¬Y{4®1ïýzõÑ×3G¿¦¹Ð®5úç5G¿Ý*£Üߪ‘•"·Dî¹ßÏݹmôõ‘ÛGi¾¾5rWäæÈ"7rã(7-–"× ú½kUX>‹-2 L¹I–Â(0Áʪ~T MÙ`”æëu‹a9´×}½Jfü…‘ëË5‘kGãå‘«"WŒrՠ߻ӊ€ûÒë#…QÒ,,…Q S£;‚nyü(‹½adýÈŠfj‰5EÒ¦DúÛÈoî?ú½«L“F¯FI³°F1VVõ:1lyòh|RdÓÈŠá]A™>wÃòè/"—ŒÆ‹G_ÿvÐïÝcŠÈ^)(Œ’fa)Œc ¬êÇŰù(O‹lV ‹¡¥Ù wE~ùyäÂQ~¹hÐïÝfzWz}¤ 0Jš…¥0 tHYÕMt«È–ŰzoIt ³“ççæbøXû¦<Ú”HùI1,’º#)§×G £¤YX £@KFw Ýê~ÙÈÌþPü©RP%ÍÂR–SYÕM!qûÈs#;âèª:×D~¹*rÝ(W~üÞ¾¶@ÿXíò2ãÜ6åÒ¦8ZŽòÈQÖ]ìë&‰¬Ù RÛôÛÈ™‘DΈ\s¼Ð;€ôúHAa”4 KaXJeU¯ÃŽ‘çÃ’èV‘&à~eä7£4¥Ä+FùÝèç®ô{wX\÷–G›ñq£<~±¯×šÆCjй?Œœ©#çÅyºÇ;€© ×G £¤YX £ÀÃ(«º¹[ès"/噑™þQ›ÇÀ_2ÊE‘_*‡^ª :¥kªyä}S}Bd“Qžyb1,–¦, ß95ò‘ü4έY,½>RP%ÍÂRî§¬ê¦ ºudçÈ "ÏŽ¬œÑñ²È…£\ùy1,‰^®8؉õ·b GžÙ4ò´Èf‘Í‹4w&½¶–G¿ß$ÖÀåÎKJ¯FI³°Fâ%½GÆ0;òâbX]/ƒ?ÖÕ‘ÿŽ\°X~6è÷nrÆÇv>¦–G›éÓ#[޾^u _ægŰRP%ÍÂR…±5º;â+‹ñ*‰6í>#rJ¤Žü—‚(~­T ¤ÍûkÇbx7Ò•–â·¸·RP%ÍÂR…N)«z•^Ù3ò‚.Þ‰œ9¾É ßû¹³÷y/oÜbX}vdæÃü+wG¾9"r’Ò5ÀxÐë#…QÒ,,…Q脲ªŸQ K¢s#kwô0ï,†š?!râ ß»Ê™ƒ%z?*†—Ò<º~ÖÃü+WGމ|)ÞgšA€îÒë#…QÒ,,…QhMYÕkİG1,ŠnÝÑÃlJ¢ "ß(†%Ñ9X®÷}ÃK#»Gz‘Uæ_9#òÅÈ7ãý÷3Ð-z}¤ 0Jš…¥0 Ó®¬ê§Å°oä ‘Õ;xˆÍ£±O)†%ÑU…dׂæýß<²þu‘EV|ˆ_>ˆùb¼'/6{Ý ×G £¤YX £0-ʪ^©>Žú-‘çuñóKäôȼȷýÞÀYƒi½F4w}e䵑š-ú!~ùi‘Êa¡û.³Ð½>RP%ÍÂR…¤ÊªÞ0†½#ytñ¢ÈÑ‘cýÞ¥Îtâºñ˜bøÈú¹‘g>Ä/½¢G÷ïÕf`úéõ‘‚Â(i–Â($QVõ³bد–¾fuìðšbÙ±‘yƒ~ï?-èôµdóÞÙ#²þƒü²;#_‹ïésÍÀôÑë#…QÒ,,…Q˜2eU¯Ãn‘wGžÓ±Ã»'ò½È—"ßô{w;c0v×—¿(†åÑ—EV~_ú£Èg‹áãê½ÏÓë#…QÒ,,…QXneU¯Þ‘wF6îØáý2ò/‘#ýÞÎdqÍY;†×EÞÙòA~Ù¥‘OG¾ïý[Ì@z}¤ 0Jš…¥0 ˬ¬ê ŠaItŸÈZ:´;"ÇE¾9uÐïÙ@ ßëгŠaqô/#«?À/¹!ò…ÈçâZp¥˜Zz}¤ 0Jš…¥0 K­¬ê'Æð7‘¿Š¬Ò¡Cûu1,†1è÷®u¦`¢®KÍŽ›ÒèÞ‘­à—Ü9:ò©¸>\`Ʀ†^)(Œ’fa)ŒÂ+«ú1¼?òªÈ ]ùÜù^äóÍ8è÷:S0ñת殣o¼&²òü’"ëÅÙf `ùèõ‘‚Â(i–Â(<¬²ªŸÃ";wè°‘/Eô{¿v–€¸v­Ã^‘}#=À/ù~äârªÙX6z}¤ 0Jš…¥0 ª¬êcøHäù:¬‹#ŸŽ=è÷ns–€%¸–ÍŠa—È;";>À/9#ò÷qM9Ùl,½>RP%ÍÂR…ÿ££EÑ:ò™ÈIƒ~φ,ëõm‹ÞymdÅûýô¹‘âs‚™X2z}¤ 0Jš…¥0 ÿ«ƒEÑ;#ÇD>=è÷~ê Sx½{L oìYû~?ýãæZ莣O¯FI³°F¡)NmÃAEwŠ¢7G¾ùÌ ß»Ò^ÿVá‘wGžp¿ŸnŠ£ûÇuè3ðÀôúHAa”4 Ka” 6z4ó‘]:rH×ÃÇÎ~ÐïÝà Óx=\!†WG>Ùâ~?}Z1¼ãè©f à¾ôúHAa”4 Ka” TVõ&1|4ò—ÍÛ ‡ô›ÈÁ‘#ýÞíÎÐâõ±¹&¾$²dûûýô¿EÞשóÌÀ^)(Œ’fa)Œ2AÊªÞ †EöŠÌêÀ!ý²ÞátÞ ß»Û:vÍÜ1†÷G^´øßu"ÇFþ.®[¿2KÀ¤Óë#…QÒ,,…Q&@YÕkÄð¾È{"«tàþ'òñÈ×E1¸†n] Ëö»-öÃwE×±«Í0©ôúHAa”4 Ka”Œ•UÝÜE´¹›hóøùGuàš¢èÇ"ßô{ !`Ì®©ÃGŠûÞqôÖÈÁ‘Câºv‹Y&^)(Œ’fa)Œ’©²ª_Z KLOéÀá\T K«Š¢@××*Ž^Ù?ò×9`’èõ‘‚Â(i–Â(™)«zˉ¼°‡sY1,UåÑó@†×Û¦8z@¤·ØŸÙ/®y§™!`èõ‘‚Â(i–Â(™(«ºyäüA‘75K»åù.r`ä ƒ~ïgÈüúû‚ÑõwÛÅ~øÛ‘*®—˜! gz}¤ 0Jš…¥0ʘ+«zV o+†|_³åù)ò©È!ƒ~ïg˜ kqóâåŰ,ÿ”Ñßùl䀸&Þd–€éõ‘‚Â(i–Â(c¬¬êæ1ÈMió–¥)E}.rР߻֙&øºÜ”ø÷(†%þF?üûH9:®‘>ÐYÑë#…QÒ,,…QÆPYÕÇpHä8œ¼oÐïýÒ™øßëô*1¼#²ñ§»?Ÿyk\/Ï7C@.ôúHAa”4 Ka”12* 5w©û@d•–ç¬È{ýޙΠÀƒ^·×‹á#‘½#+DF‹üm\?¯7CÀ¸Óë#…QÒ,,…QÆÄèñóŸ<©åCùMäý‘ox´2À_Ã7‹áàÈœÑ]3º–áZ Œ3½>RP%ÍÂR¥ãʪ~t ŸŠ¼®åC¹%r`ä3ƒ~ïg`™®é/ŒáÈ–£:#²w\W/4;À8Òë#…QÒ,,…Q:ª¬ê™1¼9rPdí–ç˜H5è÷®pf–ûú¾Âèúþ÷‘u"wEú‘ã:û3Œ½>RP%ÍÂR¥ƒÊªÞ"†/F¶kùP~yÛ ß;ÓY˜òk}Y K£My´ù&_Dökî)fz}¤ 0Jš…¥0J‡”U½r м/²B‹‡r]dÿÈ?ú½…Î @Òkÿ3bø\d‡ÑyO\¯1;@×éõ‘‚Â(i–Â(QVõŸÇpDd³6÷ðÈá‘ú½ë€iÛš$¯‹ytäÚÈ;âZ|¬ÙºL¯FI³°FiYYÕ«ÅðñÈ;š%Ù⡜ÙgÐï嬴¶'¬ÃAÍõx´'œ0º6_ev€.Òë#…QÒ,,…QZTVõN1|9ò„ãÖȇ#Ÿô{w;+ض-†w|nWCd¿¸Fif€®Ñë#…QÒ,,…QZPVõšÅð±Ã{µ|(ÍëÞ>è÷.sV:·WÌj®Ñ‘EVœÙ7®Ù¿5;@Wèõ‘‚Â(i–Â(Ó¬¬êÄpdd£ãw‘· ú½€ÎïÆð‘Ý"7GÞ×ï13@èõ‘‚Â(i–Â(Ó¤¬êUbøDä-Ê—"ïô{79+cµ¼&†ÏEÖ‹|'²W\˯63@›ôúHAa”4 Ka”iPVõ³b˜Ù´ÅÃøudÏA¿÷ÎÀØî'Œá3‘¹‘k#×õãÍ Ð½>RP%ÍÂR%¡²ªgŰäo#³ÚÚ—#‡F>8è÷nsV²Ø_^Ãa‘"GFÞéÎÑ@ôúHAa”4 Ka”DʪÞ,†£"Û´xEÞ4è÷ÎrF²ÛgÖŒ¡Ù;riäq½?ÕÌÓI¯FI³°FI ¬ê}c8$²jK‡°0rpäÃ~ïg ë=gv GDÖ|"ò¡¸ößmf€é ×G £¤YX £L¡²ªË¾yy‹‡ñ«ÈýÞ™ÎÀÄì?kÇphdHsWé×Ç>ð+3¤¦×G £¤YX £L‘²ªwˆá«‘Z<Œ/FÞ3è÷nqF&r/zY ÿY)²OìÇš %½>RP%ÍÂRe9•U½B ûG>™ÙÒa\ÙkÐï}טø}i½/†w»þJäm¾‘HE¯FI³°FYeUoX ï*úÜã¸bx¹ëœÛ£öŠá3‘+#»Ç>qžY¦š^)(Œ’fa)Œ²ŒÊªÞ-†#"ë´tÍÝâÞ:è÷Žr6x½êÉÅðžyW쇙`*éõ‘‚Â(i–Â(K©¬êY1yo‹‡qn䵃~ïg€‡Ù·VŒá€HU Ë£ûxD=0UôúHAa”4 Ka”¥PVõ1|½h÷ôŸŒì?è÷îtFXŠ=l§ŽŽÜyUì#˜`yéõ‘‚Â(i–Â(KhT´96òè–áêÈýÞ÷ –q/+cøJä‘·Äžò³,½>RP%ÍÂRåa”UÝ,’÷GŒÌlé0òèï¦`_{Oä È‘‘·Åþr‡™–…^)(Œ’fa)Œòʪ^'†£"sZ:„{"Œ<è÷\˜Ê=nû¾¹2òŠØg~gV€¥¥×G £¤YX £<ˆ²ª·ˆáøÈZ:„«"¯ô{§;$Úëî}Dý6£=ç4³, ½>R˜i €éRVõ«bøQÑ^YôÔÈVÊ¢¤ûÌ †]#ŸŒ|/ö¿·›Ú棤YXî0ÊbʪnÊé‹ìßâaüCäoýÞ=ÎÓ¸>7†oFDöŽ}èv³<½>RP%ÍÂRe¤¬ê5cøjä¥- ‘7 ú½ï8´´nÃq‘U"»Åžt¹YŠ^)x$=LYÕ›ÅpvÑ^Yô¼ÈÖÊ¢´)ö¡+cØ)òÃÈ9±?nkV˜nî0Jš…壯¬ê91Ì‹¬ÕÒ!ÙÓ£èØþ87†ÏFÞ{Ô1fx z}¤ 0Jš…¥0:ÑʪÞ/†OíÜÅxaä}ƒ~ï“ÎÝ'·ˆá„bøÍ ûÇžå9pz}¤ 0Jš…¥0:‘ʪžÃç"û´t×G^;è÷8t|Ï\7† "scïºÕ¬÷Òë#…™¦˜ eU7žÿnÑ^Yô‚ȶʢŒƒØ¯®á/"¿œûècÍ )¹Ã(i–;ŒN”²ª7Žá¤ÈSZ:„ã#oô{7;Œá>úÖÞyYìeç›@¯ÜaX.eUoËöÊ¢¼BY€q{Ø?ŰgäÛ±¯Î6#¤à£¤YXî0:ʪÞ=†¯DViáåïŠì5è÷Žr&Èd_}b1¼kö§cû3“K¯FI³°F³WVõ~1|ª¥—D^>è÷Nw&Èl-cøv¤Ùã>{ë0ôúHAa”4 Ka4[eU7'÷“‘w·t?Ìô{¿p6Èt¯])†/5©"{Æžw§Y€É¢×G 3M°¤F–cŠöÊ¢§F¶W g£‚è_EšýîÄØaVX^î0Jš…å£Ù)«z­Ž‹ôZ:„¯DÞì.kLØþ;7†}"/=ð3“A¯ÜaxXeUoP ïîÙVYôÀÈ›”E˜4±÷Í‹aÿÈüØgFXVî0Jš…å£Ù(«úI1,ˆlÜÂË/Œ¼mÐï}Á™`Â÷ã-bøçÈÿ‹}ñ3yÓë#…QÒ,,…Ñ,”Uýôþ=²n /{dî ßû–3Ü—ñ‘÷ÆþøC3ùÒë#…QÒ,,…ѱWVõvÅð΢k¶ðò×Gvô{g8pŸý¹ù&ޝG>ûä3yÒë#…™¦¸¿²ª_Ãí”E/ì , ÿWìׯ°Kdߨ¯w5#,)…Qà>Få““#«¶ðòD¶ô{:ðÀbŸ¼-†WEv‹}ûõf€%¡0 ü¯QéäÛ‘[xùs#; ú½Ë xh±_ÞÃ^‘mbÿþk3ÀÙ±hÑ"³ÀÔ/¬3L˜)«zß>ßÒËÿ ²Ë ß»Ñ™€¥ÞÃˆášØG5½>Rp‡Q )š¼­h¯,zrdgeQX6±‡þ] +Ç~þ>³ÀƒQ… WVõûcø\K/\d·A¿w›3Ë.öÒƒc¸!öõ¿1<…Q˜`£²èA-½ü‘×ú½; X~±§ÃJ£<…Q˜P-—E‹ì9è÷îq&`êÄÞzL —Å>ÿn³ÀâFau ,ú–A¿·È™€©{ì×b¸Di€Å)ŒÂ„i¹,úéBY’‹½öÄBi€ÅÌX´Ho‹ kÆ “ÐA-—E?1è÷Þï,À´îý»Æ°IìÁŸ20>ôúHAa”4 Ka´sʪ~W1¼Ãg”E ½ÏMitãØ‹50ôúHAa”4 Ka´SʪÞ7†Ï·ôòÊ¢Ðþg]bxTìÉ_6Ð}z}¤ 0Jš…¥0ÚeU¿>†y-½¼²(tç3AS}DìÍ_3Ðmz}¤0Ó@¾ÊªÞ=†£Zzù/(‹@wľüÑçƒWš €É£0 ™*«z×bxgÑ6ÞçÍãnßê,@·Œî.:3>'¼ÔlL…QÈPYÕ/Œá¸ÈŠ-¼üW#{ú=÷Å€Š=ú›1¬Ÿv2“Ca2SVõ61_´S=!ò†A¿w3Ý{õ‘1lŸži6&ƒÂ(d¤¬êMc8)²z /??²»²(Œ‡Ø³ŠaÛøü°‰ÙÈŸÂ(d¢¬ê cXY·…—?=òšA¿w§3ã#öî/Ä0'>G<ÆlämÆ¢E‹ÌS¿°fÌ0 Ó¨¬ê²–6ŸÚÂËŸyþ ß»Ñ™€±üÑ|p{oä‹össçÏ~D kGÖ÷fÅÈZ‘•#«ûÚÏZìŸ×üXó Š·/öc #7Ýï×ݹ#rËèëÛF¹q±¯›¿nÞœ·8;À¤Ðë#…QÒ,,…ÑiSVõj1Ô‘í[xù_Fvô{W90ÖŸ'šÒß~‘Š}ý63’Ÿ¹óg¯ÃF‹¥¹«ìº£q½Èú‘GEY K ]ÔÜÍþºQ®^ìë{ÿùÊÈe£\5o΂{œy`\éõ‘‚Â(i–Âè´(«ºùÿÇG^ÜÂËÿ¾–E/q& ‹ÏÍ7¡ì94öwE»14wþìÇÆ°É(OåÑ6Ín¾©éòbX mÆßF~¹8ò›ysÜeÕ]¥×G £¤YX £Ó¢¬ê#bxc /ÝRP%ÍÂRM®¬êÅðÑ^ú‘ýÞiÎdù£¹Kåsc¯ÿšÙh×Üù³WŽa‹È3#[G¶*†åÐUÍNRÍ#îÏ4ßõߣ¯/œ7gÁ¦˜.z}¤ 0Jš…¥0šTYÕ{ÄpT /½0òêA¿÷-g²þ¬Ñܵò±±çÿ›Ù˜sçÏn>@oyvdûÈ6Ű:ËìtÂÝÅðn¤çDΊü°–Hš ½>RP%ÍÂRM¦¬êbø~dÅ^þ]ƒ~ï³ÎLÄgŽíš¿‡ÆÞ¶Ù˜zsçÏ^)†fŽŸÙaôuifÆÊÍŰÜn6–úú¼q /¥¹Küêfe¢ÜùQ1,69ÛõŸKÉí:§Ï„^ëšoäö?'ËÝq½»eL×ëš1Ìt »=®±w˜€¦×G ³Lt_YÕ«ÅðÝ¢²è9‘×+‹B7Í?{“.Œ¬h6&Æó#§›¦K|8Á,,ñ5¹¹ïyiäE‘ÍÌÊDkÖÃóFùXä¦X#ß/†ßŒõÝysÜhŠÈìØ”Q®(”ã'IS†ÿ ÓÀ„]ëžëïci^d1\¯Í7q\YÍ)º|¹Šc`ú(ŒBÇ•UÝܱà¨ÈÖ-¼üo"sýÞmÎtÖ§ eÑIóäÂÿ „Θ;vSŒÚ9ò²bX]۬𠚻;½z”»cíœZ Ë£'Ì›³àrÓCš’¼²èdÙÈ0þÁL¤éq?µPºï\SÓKaºïÑW¶ðº×G^<è÷®v  ›æÎŸ=;†]ÌÄÄÙÜ@ë×ßæ1¤»Fv/†wV[Ù¬° ïò±¦þ3ÆoE¾1o΂_šÆÔ¶¦`â<Ö0aŸ›¿?ÛLL¤sìÍIܹØ4ÀôR…+«º)!|¸…—n?¿û ß»ÈY€nš;v³‡ÚLL¤'›h庻j1,é¿&ò’È*f…)ô¬Q>k­¹ƒÕ±‘¯Ï›³à*SÃQJ™<«Ç5k¸VÝl*˜€Ï‚3›}ÚLL¤;#?ãϘ]vn|–\d`z)ŒBG•UÝ<‚þÈ–^þ]ƒ~¯v ÓÞR¸Óä¤zŠ)€é1*ìycä‘G˜¦Áv£kðäÑß ¾3o΂;L §0:™6Œüi`¼>ò4Ó0‘ÎãÏaÛ8}@Çy=´`¦)€î)«zýNˆ¬ÚÂË>è÷þÑY€îš;ö#cø¨™˜XÇðøkH{}bäcñå¯"§Dö(”E™~+D^ùfäÊX“Ÿ‰øfºzÝl¥™˜Hš&à·R 3ëœ1]·Í7ØÂé\c€ûs‡Q蘲ª›ÿÑv|ÑÎÿt9-òvg:ï€ÈÚ¦ab5ßðÓ<–þ§¦¦Î¨ðªÈ›#Ï7#tÌ:‘w6‰µzFŒ‡G¾1o΂;M ñŒÂcšT1L€}"›†‰uÖ˜÷Vöf` ü§)€éç?@÷|±>‚rºý:òÊA¿w—SÝ5wþì§Ã2“Ma¦îºúg1ìySd=3ÂØa”æ‘õ‡Åxؼ9 ®4-´l;S0±k Èü³âê1ìo&&Ú¸Þýî™NÐq×Çßee`ú)ŒB‡”UÝÜÝs^úæÈ.ƒ~ï:g:ï³ÅðµL¶§˜XvsçÏžÃÎÅð޳#3Ì cèQ‘E>kúk1YÓ4L´±,3ÅÞ¼FáMî;×@;F¡eeU7%ÑoFÖoáå¿ùˆ³ca¿ÿÏÞ€IV•w¯É ûj³33€€3(ëÀ°©¨mibÅ-V\¢÷¸¶l"«b»B\’˜äK´ŒùM\*ÑÔ×n11Î 8£(¢Ž,*Š ²/ß{ÖŒØUÓ]Û½çÖï÷<ïsFœé{ûºnÝêz뜨ýÄÀŒe"€Í«7«Ùus"êQ[K„’í^ð™x ¬Îî÷5Ž2`V0mKD@Iï#÷‰áe’y«=ï•Q LPp¶¤€œüŽ wïˆ:1‡ãnˆzöôäø}¦Š­Þ¬fÛ<ž! 6±Cü\xsÚ_7ŽúpüñꨗV4‹2ºVU66Ž~)ê‘â`@lG?ÚvëËb „ÎŽÚJ #oM¢ç½ÒÔ÷“F­u V…ML='†Wåpè;£ž>=9>m Fm'$[eô:1ÀÿÊEc8+êäŠu`SŠúÏxŒü[ŒZër‘ÐG«D0Ò²çÛ½¢¼áOÙî)Ÿ+‰‘w}Ü3ý(Ñs÷a è¬. 9Ò0 9›˜zD •Óáÿtzr|Y€â«7«ÇÆðÇ’`+¢>/øåµ2k >·¢Q6çIQOŒÇÌ߯xV£Öú±Hè[Ò³¸¢a”r9?j¡FÞW>w+ŒEw© ?F!cSÙJÿµm‡ÿôäø‡Ì_½YÍšž.’m¬®“Õý*· ­W¼©s•=VN‰zV<†²F답Ö=b¡‡ëðî’yKD@‰®kÙªÉO“am¢?ûŰŸé\c€v~G‹÷UòiôùZÔkÅÉÈVµíhedÕ›Õ±¨wƯŒz^E³(tc‡¨·G]§ª8è’{U2‹E@‰\(f¬Iô¼­ü ¤@Ã(äÈ £0dcSϯlll¶[¢Nžž¿Ë,@ñÕ›Õí+Þ¨¢³å"`¯ÛÄðЍ3¢v’ôíùä?âñõc|µmê™'M)dö%¹×Ì>@q’$÷G]’è¹ÛŽ(ºzÝ ù²Â( ÑØÄÔ!•«‹æá…Ó“ãß5 Œ¬j/1ÐÁ>õfu;10 âg}AÔ3ãߎš¬h…Aøåc,k/Ésâ`ŽV‰€°T”á~³âC›ü¯o7j­[=7 Ä¥"€|i…!›˜Êšzþ)jÛÿ¾éÉñ™HC½YÝ?†×H‚9X&Fàšxx _ŠúǨ}$•5c êóñØ{¨8ØÌõya GI‚Š-é)‡“£Ž3V'|îž›×X #[ÒÃðüyÔÁ9÷ëQ¯?$åQ[‰9XµN ”Q½YÝ5† ¢^TñA7¶“¢.‹Çác|£Öz@$Ì"ÛAc[1P±%=éßwf¿#?_lbM¢?ËÙìö0}@ÁYaræW‚±‰©çÄð‚}[ÔNOŽße õfõ±1µC‡oLOŽÔ,@R²•ô.æÁ £”B½YͶ4ÎÞ¨­×(PÌ—6QÿÕ÷ÅøºF­e2VeSÙJÄ7н*j/1°‰uq¯so¢ç®a(º5"€üYaëô¨ãs8î÷£^.~HG½YÍ1Γó´,~vÜÏ‘úõïQ•+øLT4‹BÑe¯1VÇãöa¢ùk÷v1" 6±X$x-Û9†Ó$Áƒ¬IôçyA +MPp¶£€Ð`261ul%Ÿ-­îúãéÉñ[Ì$åìÊÆÕ»`>²í÷)ª7«ÛϬVø¥¨%É8,êÒxü>E#툨…b`KE@‚Þµ“xÕ‰žw¶Éަ(8 £PFaÆ&¦¶¡QÉç ´ ¦'ÇÿÛ,@:êÍj¶:ÓË$A—lKOŠ×½ñ.síƒdíõ‰x,Ÿg¥ë‘e;zÌ £¤v?šmCÿjI0‹µ‰ž÷Q¦pæÂ;0GÃq³OÀŸ+~Hλ+Vh¢{+D@*êÍêÖQÙ}Òÿ‹ÚO"¼3£>k«YžcDÀƒì-sVÔÖbàA¦µÖÕ‰ž»sEwu\coäOÃ(ôÙØÄÔÄð‚ý‹¨çLOŽßk 3Û¹>^ô@Ã(©\ï²í‹¿õJi@©ü^ÔWâ1¾Ÿ(FІQl‰Hè¾ôÀN‘³X“ð¹mú€‚³=„†Q裱‰©Ýbø‹œÿšéÉñïšHG½YÝ2†wJ‚i¥è׺…Q§U6¾ùzD ”ÉãñX?^#q]Ï^÷î' DÃ()9¿b—f—dÃh<7/ŠápÓÜ%"€bÐ0 ýõ¨]s8î¿Gýµø!9¯‰:@ ôh¹(ªz³šmO;õ–¨ERËš§âqÿTQ”žÕE™-éIåþ4[õþ™’ TW}DÔÖ¦pæBÃ(ôÉØÄÔsbøƒýó¨OOŽ?` õfuÏÎ}°Wü<í$ x{b ë£N’ŒŒm¢>ÿ—Š¢Ô4Œ2›±xìkV"Š€RmfZiꀂËÞ¿Z'( £ÐcSYã×Å9þÕÓ“ã×›HÎ[£v}b•Q £Þ¬n•½ÿ™ÊÆÑ’ýžáýqx“(Jk•hc©(ø}êI1T%AµÖO=wæŠîª¸ÆÞ*( £Ð5–Ãq?==9þw⇴ԛգcxž$è£"  ×·l;Ú/F½Q0òÎkÂdÔQ”ÎÑ"  ÛÒSäûÔìùÈê¢t²:ás·Â(PtkEÅ¡az461õüž’á§£^l -3oR]¥y‚~Ò0J®oŠákQÇK˜ñ†ÊÆÕFÝ÷”çZ`%ŸK’ £Yö»;+$ÓI’ÍLñܼM 0}€k,0WF¡cS‹cxON‡ÕôäøÍ$碎}¦a”\Õ›Õ×Äð¹¨=¤<ÈK*šFËÄ–·t²(è½êÂÞ" 6#ÕFˆZhú€‚»TP‹D=yÔN9÷SÓ“ã?¤¥Þ¬nä$€e" §ëÚ¶1üMÔ³¤tð’™kÆËµÖâHš†Q:±Â(EõܨƒÄ@÷U6î–"ÛÑ)\c׋ŠÃ £Ð¥±‰©?ˆáÉ9úÖ¨—›HÒ©Q‹ÅÀ,«7«>ÄPÅÏÜ’þ³¢Y˜›¬iô"1$OÃ(h¥ˆ÷¬[ÅpŽ$ØŒo6j­Û=÷U¦(¸Ëãû 1@qh….ŒMLíÃ{s:ü©Ó“ã×™HK½YÝ/†×K‚Ù"j?10ÄkZÖ0´6ê(ióðʸ~œ'†d¯ýÙ‡SŽ,ô2?›ÌÁš„ÏÝk2 è.‹†QèÎÛ£öÌá¸_‰ú ñC²×­ÅÀÙb‘¡¨7«ÏŽáK9Ý é;3®#¯C’s?ËfØM¢Ý·îÃ’`Ö$ú3¾S ËMPp—ŠŠEÃ(ÌÓØÄÔ£cxQ‡¾;ê”éÉñûͤ¥Þ¬f×gH‚ó&øžÃG*†€Þ¼c¦ùœ´-6cÏxlû]#E’íò±‹˜ƒÕ‰ž÷JS$` Xüæalb*kŽø«œáôäøåfÒRoVÆp‘$+Œ2ÈkÙQL Á20õfuÇšQ/ÐG[D}"®1‡ˆ"«DÀ,‘mE¿˜ƒKµÖ}‰ž»†Q è.‹kì]b€bÑ0 s461up 9þ¥Ó“ã^TCbêÍêÎ1œ/ †Ä £ â:¶W ÿU•0YCú§ãZc»àâ?ìà^ƒ9Ú[àšµ_ /•s´:ás×0 Ý%"€âÑ0 s061µ †÷V6n¯6lžžÿ’Y€$½9jW10$»h¸¡ŸâçéÀ¾\±J20Xúx\s¶E¡­ŒZ æ`±(€s+W²†¹X“èëµ=cXjú€‚[+( £07ÏŽzLǽ%ê â‡ôÔ›Õ1¼B ™•¿è×5ì•Í¢H‚GG]$†B;FÌ‘æ%ò¾}x6H‚yX“èyeê€\*( £°cSÙ6‰ïÈéðgNOŽß` Iï®ä³*1£m™èU½Y=>†ÿŠÚSÀ½$®?ÏCaÙò–¹²%=y{KÅŠÈÌÝOµÖ=÷U¦(¸»£.†Qؼl«<&ÖG½_üžz³ú¤ž( rp°èñúõئ¢v”ƒÄuèH1Ò±"`ŽlIOž÷²ÙŸ~_ÌÚ„Ï}¥é n]£ÖºG P<F¡ƒ±‰©Ã*ùm)ý²éÉñṳ̂¥Þ¬nYÙ¸º(äÁ £ôrýÊÞ\oFm# '[Gýs\vE¡žöªhdî–ˆ€](æiuÂçnõo èlG¥aÚ›˜Ê¶¯z_ÔÂÿ7Ó“ãÿc I¯Œz˜ÈÉ Ðz³úä>^Ñ, äoÿ¨¿C¡#æAs1yÝÏf;}÷Êá¸ß‰z¯ø!=õfõÈ^( `¹˜ãu+ký˜×@Amõá¸V-E®Ï *šR˜¿%"`ˆ×©l‡…s$AÖ&|îVŠn}£ÖºO PLÞ†›˜Ú/†×ætø×OOŽßm -3o¤_µ@ÀA"`×­jÅ6ô@ñe[¡Ÿ&†\eD±‚>óe…Q†é”¨Ä@V'úZ.{OGÃ(Pt—ŠŠKÃ(ü¶·EmÃq§¦'Ç?%~HÒÉQ'Š‚°Â(Õ›ÕÇÆð‰ŠfQ gÅuëbÈíèéÆÞ"`H÷µÛÇp¦$èÒšDÏ{EÔö¦(¸Õ"€âÒ0 ››˜Ê¾NÎáÐÙÖ¯5žz³šm—úvIP +D@‡kV¶Z_ö•m¤$"Û’þoãúµP¹8Vta©’?‹ÚS táÞ¨u‰ž»ÕEXa LÃ(Ì›˜ÊåtøNOŽ_f Io¬xC”b±Â(³ª7«ÇÐŒÚN@b²ÆˆW‹!V¥¶¤g÷¶»ÄðIÐ¥õZë®DÏ}•é «ÄÅ¥aþ×ó£ŽÌḷF%~HO½YÝ'† IP0;ÅÏæ^b`–ëU+jWi‰:/®eûŠa¨Ï[Åp˜$肆Q†á´ìµèÒÚ„Ïý(ÓÜ¥Zë~1@qi…Ê/WÝ6† r:üäôäøOÍ$émÛ:SLVå×êÍên1LU4oiËî¹.ÃPµ¥è‚{}»$†—K‚¬Nôg‹Ž0}@Á­›†QØè5Q{æpÜG½[üžz³zb Ï’µBÌ\«²Å|:êaÒJà)q]{’†Ævôtk™¦&”³£¶=X“èyZña ø.›†QFÞØÄT¶5ër:ü9Ó“ã¿0 –z³š=^, LÃ(Ùµja ‰Z%  D.Žë›F‰áðüA/öºÇÍvSx¾$èÁ­QW&zî>̤@Ã(œ†Q¨TΈÚ)‡ã^õ×â‡$ýIÅ`›-éɼ'ê©bJfÿ¨?ÃPhJ¡F” ¢Š¬iÔZ÷{nˆ›âû1@±-£llbj¿^žÓáOŸž¿×,@ZêÍjÖ`~$(8+ŒºV½>†WH(©3â:÷wZë§¢ØóÈÎ@¡7K£þG ôùÚ”5Ëý$èÑÚ„Ï]Ãèì²àâÞð6QÀæYa”Qw^Ô9wMÔ¿ˆ’tfÔîb àö­7«Ûˆa4ÅÜ?%†II%–}€çl1 ”†zµX À[E@¬IôuÞv1búfõmÍ¢0wFYcS‡ÇðœœÿÆéÉñ̤¥Þ¬.«Ø•4,ˆZ&†‘¼NÃGf~Ê씸æ(†9FôÈ–ôôû>w<†ÇI‚>X“èyg¿Ëö~ÎìV‹æÎ/eÙªy4S|nzrü‹â‡$½«’ϪÄÐ ÛÈŽ˜z³š­~ü©¨í¤Œ€ìžì1 Œ†QzµDôñ>7ûýÕEé‡6j­ë=÷U¦¯­µ"€¹Ó0ÊH›˜zd OÌéðgšHO½YÍ®O’ 9H#uÚ2†‰ÚWÀù£™••é?M)ôJÃ(ýôQ+Å@¤¼¥Ç@{—ˆæNÃ(£ê¼œŽûÓ“ã_?¤¥Þ¬.ŠáÝ’ 1V-ï:A ÀˆÉVœ;W }¿÷]Ã’ G¶¤§Ÿ¯Ç/}²&ás?ÚôÍêî¨õb€¹Ó0ÊÈ›˜:)†Gçtø³Í$éQ+Ä@büÌŽˆz³zJ /”0¢ž×ÁƒÅÐWV¥‹€>y~Ô21Ð'In]÷:c1húfµ¾QkÝ#˜; £Œ¢sr:î'­. é©7«»ÅðfI åñó»@ ¥¿FÃ{%Œ°ì¹î,1ô•Ì臭f^KA/÷ºÛT|øšþy ’î £G™¾¶lGó¤a”‘261õÄ•ÓáÏ1¤ó¢v Ú6j©ʫެîÃÇ£¶”0âNŽkâr1ôFéÛÒÓ«l·«ÕÒ/ßnÔZ·&zîǘ¾¶V‹æGÃ(£æìœŽ›­.ºNü–z³zX §H‚„Ùº±¼×§…1|4j‰4~¹ÊèëÄз竘Ñ/Féåz”}póTIÐGk>÷•¦¯­µ"€ùÑ0ÊȘY]4¯•R¬. iºÈs%‰;X¥õ¦¨ÇŠà×þxfåez³"j{1Ð'ûˆ€¼!jL ôQÊ+QZatvÙŠ±WŠæG £äÜœŽûY«‹BzêÍê3bx´$HœFËy}z\ecÃ(ÿkëÊÆ­‹éͱ" ¬0J·÷»{Åðg’ ÏÖ&üxp=Ý%Zë~1Àühe$̬.ztN‡?ß @ZêÍê61¼]”ÀA"(ÝõiÏ>â>`V/‰ëäVbèÉÑ" 48Ñ­3£¶}tWÔ×=7—ÎÀüy£™QqjNÇýÒôäø‹’óº¨ýÄ@ ,AyÔ›ÕìÞ=kÝC³Ú-êd1ôÄ–·ôÓRÐÅ=ï1œ" úl}£Öº'Ñs_eúÚºD0F)½±‰©+ùm+ýV3i©7«‹c8M”Äâø™ÞA ¥1õX1td[úîUö•ý¼]8'j 1Ðg«>÷£L_[V€.heœ™Óq/™žÿñCr&£¶%²Lé«7«Ù›„çI`³Ž™¹f2GD-}dKzæ{Ï{x $  åÆB«Ïî†F­u`þ4ŒRjcSÙ^OÈéð˜HK½Y=.†gK‚’9HÉ_›¶‹á¢I`N^$‚®Øò–~›Y¹æ*û]Ú10I6ŒÆ5ô€búfe;zè’7)»3r:î·£>)~HG½YÍ>Dq‘$(¡å"HÞ»*VŠ%_?ŠúAÔ7©é¨[£nŽº%êþ¨;¢îÚäßeÍοÚRvç¨7©]£öŠÚsfÜ7jkQÓ'ÏŽ{»×5j­ÛE1/V0c–D}G Ìá5ù£bø=I07E]è¹múÚ²=tIÃ(¥561up OÏéðïšžÀ,@Rž[ñ‹xÊÉ £ «7«OŠáÅ’`î‹úVÔ77³7ֿרµîÒÏûâöÊVRzxÔ¡Q‡Eínz˜§¬)ùQż¸f²mé5Œ2Š€Y÷³©þžÖss‡ytGÃ(eö†J>ÛXý4êÃâ‡tÔ›Õ*Þœ¢¼¬L™îµi—þZ ÈQ_Šú¯¨µQ_kÔZwäyBqüëcÈêËz,d«u\Ô Q++ÿ»r)´óüІÑù<çd«þ `±˜Ã5èÉ3Ïó0k>w £íÙ’º¤a”R›˜Ê¶µ|NN‡ïôäøf’rFÔb ¤–×›Õ…Zë>Q$çâÊÆíº¡²­â¿õ™¨ÏG}+••–â<ÿÌTÖT²} ªV6n]ûPÓË,NÊV­iDfó4¤0(KE@'q­þÞ" hu¢…1eúf•í‚p£ ;F)«WTòYu(k}¿ø!õf5[Ié5’ Ä¶ŒÚ7ê{¢HêÚôÔž- ztKÔ§¢þ9jªQkÝ^†o*¾Ûf¾¯OÍ<^²7ÒŸ^Ù¸¹U•ù•3×Ñ·‹bNŽAW~83î-жdÃfo}£CGWV6®Ö»½(º’êÖå+¢¶5}³Z+螆QJglbj»^šÓáÿ~zrܧ›!-ï¬ll¨ƒ2ËÞhÒ0šˆ™mÿJtéî¨OF}8ªÕ¨µî*û7ßã¥1duF<~²­ë_urES›4ŒÎ†Ñî¼/~HC½Y‹á\I0BAÎÚO t5Šf«cïרµ^õ=‘ÌMÖlõ±øã¡Q/ºI*#ãȸ÷{¨:²‚YwÖÏ\_îá‡âhkaÔbàA¯É³U_/‰Ž>×—©™?Ÿ(Ž®¤¼evϺ…)œ•íè GF)±‰©lU”ãs:üû¦'Ç0 Œó¢"FÈnõfÕÏ|Åüd«þ™$h#kFzÔþZë5Q7ˆ¤;YcWT–åQ#‘‘ñû"èèXteý&Þ ŽŽ–Š€ɶ¢ß^ :ó:aëÊÆ•Ò™¿o%¼¥Õ¿Û[+è†QÊäå9÷¶¨¿?¤¡Þ¬>"†?•#h… {]ÊîÉ?àÞœ6>uH£ÖzyÔÄÑ‘åtÔ‹âO¨hô5´}ZÃ’èʦ £×ˆ££½EÀ&×}bx™$:úxܧ\2ó磢¶IWV'|î+M_[F GÞ”¦Æ&¦v‹áY9þï§'Ço5 Œl+ß…b`-Aa½°b~ÛQkÔZO‰ºJƒÙ¶bÈ>Lòi”Ú£ëÍêb˜Õã¶üÝuù&ÿ{ƒH:Z,6qNEd'÷U6®Àú+'ˆ¤k)o]îõáìîŠú† 7F)‹lu ¼~Ùü>ñCêÍêScx¬$Q‰ ×¥]cx«$ØÄQ§EÖ¨µ>/ŽÁ‹œo‹ªÇO‰ºS"¥”½V|¼f¥!¥;Ù6Ç÷lò¿­0ÚÙ0sï{p Ï•DG×—+7ùßF»·&ÑÇÉö;„´³þAÏ¿@4Œ’¼±‰©l ½—ætøÏOOŽ_a øêÍêV1¼KŒ0+ŒSÖ,º‹˜ñÅÊÆíç/ôFèðEæÉQ?’F)‹`VF»³þAÿ{ƒH:²Â(¿ò–ŠßGw’}påìý·ãÅÒ•Û£¾•è¹éqÒÖ@ïüâ2øý¨¥9ûýâ‡d¼6ê¡b`„Y¡¤`êÍêÊÊÆíèáQ¯ˆzl£Öú¾8òù_ÃÑQë¤Q:UÌj•ºòà†Q+Œv¦a”ìÞ÷Øž"‰ŽÞ÷"×m’Ù²vKW¾YÞë¹¹t4Œ@h¥ ^™Óqoˆú”ø¡øêÍêÞ1œ. FÜñXØB …¹.-ˆá=Q ¤1òÖFÞ¨µ²Ä‘¿˜‡ëcxLe㊯”ëyЇ‡~ó¹h»–DW¬0:?FÉ\(‚Ž~^Ù¸ûÀ¦lGß½Õ ŸûQ¦¯­KD½Ó0JÒÆ&¦²7·“Óáÿ~zrÜV¡†lÛ»íÅÀˆ[µ¿ ãäŠ7€G]Öš5œÐ¨µ®G±ÄœdMOŠúŒ4Jåq"ø ÙJ×~/ÔõºfdÛHß –¶–ˆ`´Õ›Õ'ÄðhItôö¸–üìAÿí8±tmmÂç~Œé›Õ-QWŠzçR÷’ýAñCñÕ›ÕìíÏ“ü’mé‹q]Ú&†·Ib¤eͿרµNò¤‚й¹=†§E}A¥¡Yé7iHéÎ÷âúpË,ÿݶôím÷?;‰adï}³õ­.ÚÙ£.šå¿Ÿ(š®­Iôñ²K VDŸÝZ;2@h%YcS[ÇPÏéð_šž·ÜÌSK~MÃh1¼6j_1Œ¬ìÍë#µÖgEQ|1OwÅðäJ¢Mü–GŠà7híÎú6ÿ}ƒh:Ú[#ë™Q‡‹¡£óãžã¶MÿC½Y}H ‰¦+?<¿Ÿè¹múÚ²=ô‰†QRöŒ¨‡ätl«‹B²¦òUb€_Ó0š÷E©YÝ=†Ó$1²>õèF­eº„Ì4pdÛÓoFòöëð>bø5 £Ýi×0êÚÞÙRŒä½ï¢ΗDGß«Ìþ{FÛÑw/åíèWš¾¶|€ úDÃ(){QNǽ)êãâ‡b«7«ÛWl{¶\¹;+j;1ŒœlëÄSµV=êNq¤'æíÆjQ·J#y¶÷Ýx¯¼G šg»c…Ñî,ÁH:%ê1t~}÷w{¾ê«Õ Ÿ»s´§aúDÃ(I›˜zX Îéðžž÷F?_¶‚Ÿmá7ÙÒ0GõfõÀ^,‰‘“Ý7žÜ¨µÞ&Š´Å~+†çI"yVlÛHCJ÷ÖµùïVíÌk³Ñ»÷ݦ²ñÃR´÷¨¶ùÿŽO×Rn,ôü<»â^ü:1@h%U§äxìÿ#~(¶z³úÐ^' ø-;Ïl‰N>.ˆÚB #e:êñZëc¢(‡˜Ëá½’HÚ*È¡?ëа²A<-ÁÈyuÔžbèèô¸¦Üÿàÿ¯ÙU4ö"Ɇј÷l%æ=L_yæŠJÃ(É›˜Ê-òZÙç›Ó“ãëÍÞ;¢¶Ìj…†¯Þ¬®ŒádIŒ”ë£NjÔZÿ%ŠÒy}Ô×ŬÃãšì>±R9Z]éôû+Œv¦at´î}wŽá’èèËqŸøomþ¿#£¶QW®Ž\§=wæhoµ 4Œ’¢'Gåµ:Ú‡ÅÅVoVÃÓ%miÍÇù")ßzt£ÖºLåózW /ŒºOIÊ>€xĈß//¨X¹®[ë;\nŽáç"jË–ô£å´¨Ä°ÙŒÚ9N<][›ð¹¯4}m]"è £¤èOr:n¶ETCüP\õfua I:Ò0:ükSö†ï$12²fÑleÑ¼b~/áí’HÖá#þý?,jg?]Y·™ÿÿ"jk±FæÞ7k~•$:útÜKüw‡ÿÿu-å•(­þÝÞZ@ÿh%)cS{ÄPÍé🛞ÿ¡Y€B{qÔ#Ä-ÁнU#ãW͢׉b$œu­’tĈÿRº·~3ÿ¿†Ñöö¨7«[Ša$¼9jk1´õ@Ô›ù;F»·&Å“žYýÛóó쮎×WÓb€þÑ0Jjþ(jQNÇþø¡¸êÍêCb8O°Y‹`¨×¦“bx´$F‚fÑs}G o”D’F½at•®ÜuåfþކÑÎöAéï}³Œ_(‰Î·qqY‡ ÷ao1uåÞÊæû‹êÀ¨Lá¬lG}¦a”ÔüqNÇýEÔ¿Š íì¨]Ä›µo½YÝJ C½6Q~×G=N³èHúÇJ¢+Y¸GÄsáÂþþñ#ЕoÆuþÞÍü £i‚+¿ó£Š¡­{*W`íÄê¢ÝûÆÌz<7—‹íè Ï4Œ’Œ±‰©Cb82§ÃlzrüfŠ©Þ¬f+&¾\0çû?ÛÒçÚtRÅê¢£àÆ¨Ç6j-MB#(æ=ÛVöÍ’HN¶Uòþ#úÜ´EÅ «ÝšËªuž :ÛG¥¾¾d¿³;YýEÜ;|3GÃh÷RþÏJÓ×Öj@i%%ÏÍñØÿ(~(´wW¬bó±\Cq†Jïö¨ßmÔZW‰btÅü¶âì2¢ß÷áQ[šþ®híFËíBt”}ýü9ü½ãEÕµ”F­0:»ûæøü ̃†Q’061•ý¬Ös:üMQŸ3 PLõfõ÷c¨Jæå  üÚtl ã’(µìÍËg4j­KDAx›’3ª £G›ú®­›ÃßÑ0Ú™†ÑòÞû>&†ÇK¢£wÅ}ãO6“ãö1*ª®­Iôñ³¨²ñü¶Ëãqc×/è3 £¤âq•üÞXø×éÉñ{LO½YÍVGz—$`ÞlI?x§‹ ô^Ö¨µ>#f|*jƒ’²bD¿ïU¦¾+D}cs)žnˆá.qµµT¥|]¾ buÑÍùYÔ;æð÷Ž«ø}}·n‹º"Ñs?8j[S8+«øÀø©xNŽÇþ¨ø¡°^u `Þ¬0:@õfõ°~_¥–­õWbàWâç![qö}’Hʨ6ŒÚò¶;WÇãü¶9þÝ âjk±Jéi®-›õ–¸†Ü2‡¿wœ¨º¶62¾?Ñs÷aŽó*è? £ÞØÄÔV•¿|ÎÃO£¾` xêÍê1œ) èÊr ÔDPjͨ 10‹GÝ+†dŒÜ‡ŽâþyG÷][?¿k[úölI_¾ëJ¶•öù’èèÚ¨÷Ïñïž ®®­IøÜ2}mi€Ð0J ªQ;æt왞¿Ï@!½5j1@W¶¯7«KÄБk¶Õê3%QZWE=gf5Iø 3[Qÿ‡$’±s\³w±ïù訦¾+ëæñw5Œ¶çþ³|ž[±{Áæœ÷wÎáuÄŠF{‘rc¡zg—=n.ôŸ†QRprŽÇþ¿â‡â©7«Ùê Ï—ôd™âÏ¢‰¡”²­ˆŸ6ÇíD] $å€û~5¤tÏ £ý±e¼–ÛM ¥y]¾u gK¢£+¢>4Ç¿{HŇb{ñÕ„G0}³Z¯½¬Þ a”B›˜Ú&†§ætøŸD}É,@±Ô›ÕlU¤‹+VG‚^,‚¾_ŸvŠáÅ’(­4j­ËÅÀfü[ÔÝbH††QæJÃhÿ,Ai¼,j©::c o¶£ïÞ"çë=÷Ã+>pØŽíè`@4ŒRt¿µ}NÇþäôäøý¦ çYQÇ‹zf…ÑþËšE­ TNÞ¨µ>&6'~Nnás’Hƾ#öýjíÎOâ±ý£yü} £í-‚ôÍ|PêtIt´&êóøûF{Ë:U+M_)ç MÃ(E÷‡9ûâ‡b©7«ÛÆðvI@_¬A_¯O cx¹$J)[Ùæõb`þ]ÉØg„ž§²U5êugý<ÿ¾†ÑάHY¯‹ÚE Ú¨µ˜Çß÷ÁØî¥ÜXèÃ_‡ a”›˜ÊÃj9þ¶Š• ˆÞX±…!ô‹†ÑþzreôVªÙ=á5j-[Œ3^G¤cŸú^W™î®­›çß϶E¾Olmy=—¸z³ºG ¯•DGÿ/î¿0L÷Šá¡b뚆ÑòùyÔwă¡a”"{RÔv9û3Ó“ãw™(Žz³š5bMHúfi<®¶Cß¼J¥ôŠF­õ]10ñ3sE 7H"çÂú^5¤toý<¯Y³èubkËJ·é;£’ßïëRqê<ÿ¾ÕE»—­âšäJ”ñz|‡–™ÂY­ç ½À?Œ×c׋GÃ(…361•ýòù)9žÂ¿›(†z³š­4|¾$``¬0Ú»‹ TnŒz­èU£ÖÊ~–¦%‘„ÝGà{Ô0Ú½õ]þ» ¢ëh©’{m~b 5Ittq<ÿÿ°‹w¼èºvwÔ×}Le+œïk geuQ0 £QöéêÅ9ûªéÉñï™(Œ7WFc›PÈËòz³ê~°K‘]Ö€cäry•­èé£ËE„±ø5Œv¯Û†Q+Œvf[úô¼Uý<êÂ.ÿí âëÚº¸w¿Ûsséh€Ó @å¹ýgÄÅPoV³•_) ¨­£öC×þT¥ÒjÔZ}´AI(uÃhÜSgÏõ>ÜÐû£.ëòßþ@|-ARבleÑ%ÑÑÛâ>ò¦.²ÍvY:N|]K¹±p¥ékk`°4ŒRDFÌ{¢‰n…æ¯Þ¬îó$Q÷D½J ôÙu"H®%ÿþwOݵ+µÖíÝüÃøwwÅpƒÛZ"‚dîy³ß_ ‰Ž~uQ—ÿ6û ì."ìÚê„ÏÝ £í]", £ÊØÄÔ~1”Óáïˆú’Y€üÕ›Õßቒ€¡Ð0Ú?ŒÚV ¥ñ®F­u¥è3[R'ò2´äߟ†”î­ïñßoa[VMdz£CGçvÛ\Ž_O¬0Z>Ww³Z/0?F)šßÍñØŸŸž¿Ó@¾êÍê•«‹ñ\]y¾Jã‡+g1?Av,ù÷·Êw­×†QÛÒ·§a4׿[Æp®$:únÔ{ø÷'ˆ°k7G]•èckŸv7…³²= †QŠ&φÑÏŠ á•QËÄCc…Ñyª7«ÄðHI”ÆëµÖ­b`¬Ž”†²7ŒZa´{FGÃh^õP1tô¦¸¼·‡¯a´{k#û<7—o^Eƒ§a”›˜Ú*†Çåx F!gõf5[aáÍ’€¡Ò0:ÏAiügÔ?ŠÑ0š†Ò6ŒÆ½õX šâ®Ù’~p–ˆ ð×íc8S›½FücïR±ÛC/lG_NV€!Ð0J‘d+um›Ó±¯™ž¿Ú@îΫ”•'(š=ëÍêNb˜›ÈjA Ï•Di¼&ᕉ(¾›E„íKü½mz»öÃx~øI_ã1v¼ÿ\(†B{uÔbèèôï#aO¾šð¹[atv÷E­ ž†QŠä÷r<öçÅùª7«‡ÇpŠ$ V¶™»lÛÈ}ÅP ÿÔ¨µ¾&è~$a»oF»·¾_cƒÛÊšEwCa_›ïÃë%ÑÑ—â>ò3=~ £½Y›èã+{?æ(Ó7«Ëâqu‡`ð4ŒR$¿›ã±?'~ÈÝÅQ Ĺ8Hsöl”½QgˆÓ0š†27Œkz»Ö†Q+Œv¶T…uZ”:;µ_ã1víÚF­õãDÏ}YÅÎ:í¬ ‡†Q albj¿Väx F!Gõfõ™1÷•¦¯- £0$F)ŠjŽÇ¾bzrüG¦òQoV·‰aR«"˜“ÇEí&†äeM|ç‰!Ø^IØ¡¤÷ØûVlùÝ‹õ}ú:VmooÒÙQ[‹¡­¢NïÃ×9RÎ=Y“ð¹cúJ9¯ £Åãr<öçŹzCÔ>b€\i›çˆ ÞÓ¨µ|X(»U"èÚmQýZ…zƒ8ÛZ"‚b©7«ÅðwD}K 0‹D@ÞÆ&¦ÄðØOaÊ,@>êÍjö&á©’HÞÍQ_Ù¸uáâHÒñx\Ô¨µîEÛëÕV1}-+Œ¶§a´xÎZ(†¶î‰:«O_ëxqvíþ¨K}M™½s˜)œÕ:¿€áÑ0JµkŽÇÿ²)€ÜdM;Ûˆ!yokÔZÖ›Õ§ÄŸ÷G’¶˜™»«EÑV5jG1$ïq½ºY Cü¬MÇðjI+Œvo}¿Öq¶eKú‰×rÙª‡O—DGïçö~5[a´{WÄ<Ü–è¹g¿ßÚÎÊvô0D¶¤§ò\]ôòéÉñŸ™¾z³š½Aò,I$÷Îüù:q$í`tôT$ïΨwˆûìl…À£$ѵ~6Œþ@œm-A¡¼Ue Šç÷é½ {Š´k_MøÜWš¾¶4ŒÀi¥—ã±­. 9¨7«Ùó-ZËáÂMV÷Ð0š¶e"h{ÍÊV`}š$’÷—q½ºQ ÀÈ>²­º¦at8–Š 0÷º¯äûaî¼³÷‘lj³'k>÷£M_[—ˆ†GÃ(¹›˜Zãs<…ÿ2 ‹çW¬zT×FýÅ&ÿû‘$í ´õ˜¨‡ˆ!i÷T¬. ŒŽcEеû¢.ëã×Ó0ÚÞ¶õfu'1ä+æ`A J¢£û|y¢H{’òJ”FgwS£ÖúŽ`x4Œ’·c¢¶ÏñøFaÈêÍêŽÛÝ•ÅZëÎMþ·†Ñ´-A[VMß߯õÊ*ÈÀ¨ÐÒ½+âùâ®~}±øZ?á±¶e[úü=#êH1löuïm}üzÇ‹´kÙõô²O¼Þ¬nÃÃMá¬ÖІKÃ(y;)Çc_?=9¾ÁÀе»’÷ݨ¿yÐÓŒ•6+ŒÎbfÕ¥'K"iT¬. Œ–cDеõøšVm϶ôùÞçf»þ\ ‰Ž²E¾¿™g Õ4ؽuZëÞDÏ=kÌ^h ge;z2 £äí‘9Ûê¢0dõfõa1¼Z¥pÎ,oÔhMÛX2Ë×0š>«Œþ¶ßAò.0BލXÁ¬ëð57ˆµ-[Òçdf{ì³%ÑÑåQêó×´}oÖ$|îVÿnÏ–ô0dFÉÓ#¢vÌñø_50<õfõ Weqf£ÖºÿÁÿ1þÛ 1Ü-ž¤-ÁoqÝJÛ7£>/`„¬AO±Âè5bmk‰róÊŠ^7çôÙ^÷öHÃhoRnµÂèì~³‰†KÃ(yÊs;ú;£¾a `8êÍê¢Þ-‰RÈÞDÿ×ÿ¿UFÓf…Ñß¼veM GJ"i7j­ÄŒ£Eеkã9cz_wƒhÛ²Âh>÷¸;Çpª$:új\>Ùçܳ՟m×nŒ9ù^¢¹bXf ge;zȆQòtbŽÇ^?=9~)€¡yyE#ZYœ¶™æ«kE”4obý¦'Š iYÓOC Àˆ±Âh÷Öèëþ@´miÍÇDÔCÄÐÑ jÚ^´]KyÛræ(ç¼@²4Œ’§»™¿£a4m‹à7hMÛ_Å5ë1#tß½[ ûI¢kF‡OÃèð¯{Åðg’èè³qù¥|ÝãDÛÛÑ—“†QȆQr161õÐöÎñ4ŒÂ𜵳JáŒ9ü[Ò§m¿z³º¥~½eäã$‘´¿0bŽAOÕ0úè{Å;«ÝÝ{Ý›¢¶C[Ùn§èkŸ(Þž¤¼u¹ççö4Œ@4Œ’—r>¾†Q‚z³šm¹vŠ$JaªQk}qïQ%-k’

WÆãíçb€áÓ0J^ŽÍñØ7E]m `(.ªll@#}ošãß³ÂhúVˆà—ž ‚¤Y]E«Dе[µÖ÷øõmKßž†Ñá97j‘Úºw¯{ç¥Þ¬f?çûˆ¸kß‹kô)žxÌýž1,1…³ºD £ä%ÏOV¯žÀÀ`Õ›Õ?ˆá$I”Â'µÖWçøw5Œ¦OÃèFA²²ý‹¯³™‡õþúFÛ[*‚¡¼>?"†gI¢£ÆëÞA}ÀÜvô½Iy§¨•¦¯”ó IÓ0ÊÐMLmÃá9žÂ×Ì V½YÝ:†wH¢²û³çñ÷m·™¾å®aÕ*šnRÖhÔZwбç®l«é1ItMÃh~‹`(Þµ@ mÝuÞ¿þñ"îIʅǘ¾RÎ+$MÃ(y8,jË¿ÞÀÀ½6j?1”Â?5j­9_7g¶‰Ó¨•¶ƒDPydÔB1$ëƒ"F:ôfÝ€¿¾†ÑölI?`õfõÑ1PÕž†ÑŠûú§Äp¬$:zk¼î½y€_?[aÒîÝûFª…ñøÛ?†]Má¬lG9Ò0Jò|#ë›Ó“ã÷™Œz³š½U—D)ÜuV—ÿVÃhúFv•ѸŽÅp¨$=PÑ0 Œæs×¢ŽD×¾Õ¨µîð1®™yžâ·Ù’~p׆ì÷¾o‘DGÙ6ô>àcœ 枤ÜXhuÑö.äGÃ(C561µc%ß&”õf£Þ¬.ˆábI”ƵV·+!iMßA#ü½?2j$ýW\·®0‚‹ÚZ ][7èÄóÓÝ1üXÔ³Z,‚ynÔÁbèèì!¬^y¢˜{²6ás?ÚôµµZ £ [¶êIžM_700Ù›Q~^wFßÿװ•¾å#ü½{C7]ÿ `D¹ïͰ>XºAÔ³Ú²Þ¬î.†þŠL·ŒáItô¨¿ð¾F¡êÍjöòI”Æ£ÞÛǯ—5Œ.kÒF±aôhÓž¤Oˆaž»z3̆ÑkÄÝ–†Ñþ¼Fß7†—I¢£mÔZÃjB´ºhonˆ¹º6ÑÇb¶ËÖá¦pVÛF>ëŽßÃÆ5òùbº¥a”a:,çãÛ@_ýiÔÃÅPokÔZ·õñëYa4}#Õð;óû¦=IFQv¬z2´¦•ì^;î7~ÜEì¿e‰ú✨-ÄÐÖ}Qg ñxF{“òê¢ÙïÀ·4…³Úº’ÿ{Pÿ# ¶¤g˜òþeзLôG½Y‹á‡cZa´½¥"èú5úq1ì a´7V-–½EÐÕµàwcx”$:zgÜ3Þ8äc/öž¤¼ýï¹®‘@ÁùåÃrHÎÇ¿Ú@oêÍj¶Ú;%Q*g4j­ûñ…ãëþ<†ÛDœ¼e#ò}aª“ôY#lyŇzqwe㇧†mƒèÛ²%ýü_£g¿×}‹$:úIÔ»r8®F{³:ás÷a`Ð.Ð+ £ Ëòœo…QèÝ«+Wá£ÖE}bÀǰ‚RúFe+= £iú#ìhôä²F­uoÇýèÛ²%ýü=3êp1tt~<Ö‡úAÆz³z@ »‹¾'k=?”ò „†Q†åá9ß £Ðƒz³ºg gJ¢TNoÔZ ø׊9y£²Â¨7ÚÓó¸†}_ À;V=Éc;úlþŸÅð ñÏÊ–ôó{¾E çI¢£ Q™Ãq­.Ú›»óºF÷ÉJS P¶£“÷º€žieàÆ&¦¶ŽaßOáÓ“ã7˜ èÉ…QÛ‹¡4þ»Qk c+g £é[\oVwïSÃhz>/`ÄYÁ¬7y6#YetvKD0/§D †ŽÎŠ×½wçp\ £½ùzÌÛ])žx¼v‹á@S ÐÚ!,Œ £ Ã9ÿ¬}×@÷êÍê11¾†%èÞ³£ŽC©œåúË<-+ù÷÷pSœœï6j­ëÅŒ°cDÐóóÈ­9_Ãèì²fÑ=ÄÐÙÌ–×’èè+ñÿtNÇ>¶â·½Jy…Q £À ]" 4Œ2 y¯0z)€ù«7«ÛÅ0)‰Rùd£ÖZ=Äãy3¼¬0JÑ|QÀˆ[%‚ž¬ÏùøLA[KE°Y§Fí$†Íf”—Äß“[¢®Løü5ŒƒtC£Öò^ÐF†s>¾ÑÐÓ¢öCid[ož5äc^+öRX^òïÏ £éù¢€§!¥7y7ŒúE{^vPoVÇðJItôoZëË9ÿxSГ51$úøÜÛ5 °KEô‹†Q†!ïFm‰ óToVÃë$Q*ÿÔ¨µ¾1ÌÆñ~ÃÍ¢OÞ²¸&,,ñ÷w)N΋áûô+åÿ0Ç Ya´¸‹ £7Gm-†¶²FÃ3r¼>/ªXºW¶£ho€~Ñ0Ê@MLe &ûå|Faþ²­è½U÷E½É5˜.mµo¿±z³ºC {šâ¤d[°}_ ÀÓÒ»¼Fui˜Õ´½o]ßH¢£ˆûįçxüâ¶3 =Yð¹cú€»D@¿heÐö‰Z”ãñ³Õ®7 0wõfõ¤ž!‰Rùp£ÖúNNÇÖ0Z—ôûZfj“³ZÀˆÓÒ›ŸÆ}q®¿#ˆãß_±-};Vm…bh+kÂ~sÎç`;úÞ¥¼zÞJÓ ØZý¢a”AÛ?çãß0=9~·i€¹™Ùvú"I”JÞoœy3¼–ù¾( £À¨Ó0Ú›õ9˜ŠYiýuúQêÜœ¿jÔZßÍùN0 =¹>æðG Ÿ¿ÀAº6®‘?Ð/F´}ò~!m `^N‰:T ¥’½q–gÓ¦FËaEI¿/ £éY#`Äií†ÑbÓ0:» EÐÑ/*W`Í›F{óÕTO¼Þ¬ÃCL!0@>< ô•†QmIÎÇ¿ÑÀÜÔ›Õì—ÛçI¢Tî¬äÿÆ™FË¡¬ £3µIy ¢aíûõ¥1ì)‰žh-¶%"ø­Çýcc—DGïÉ{eÊ™ëóRSÑ“”·Z¶=0h—Šè' £ ZÞ¿ìÿ‘)€9˶-ßU ¥òçØÒÍ £åPÖ†ÑMmR¾×´[ÄŒ°U"èÙº‚œ‡†ÑÙm[oVwÃF‘Å‚ŠÕE7çgQï(ÀyX]´w)0ÌêßÀ ­ÐOF´¼·¤ÿ©)€Í«7«ÅðrI”ÊmQ“8 £å°ÛÌ*Äe³¿©MÊ%"FÜÑ"èÉQWä\4Œ¶··~íé÷›ua£Öº¹çq‚©èÉý‰ßë{œƒæ÷!@_ieÐòn½ÁÀœ¼;j‘JåZëÆœ‡-éËã 2}3õfuÛv3­IY'`ÄYa´7—Åýñ}9 £íÙÖ{ã½jöúü|It”}8ñ}9 £½Év¸5ÑÇêÂŽ4…À]×ÈŸ‹è' £ ZÞ[Òk…ͨ7«µž ‰R™ŽzON¤QkÝ1s>¤oyɾŸ‡šÒä|CÀß³g )GI¢'ë t.×F=`JfµX¿ô¼¨bè蜙כy_Ÿ·‹á0ÓÑ“Õ Ÿ{öÁÊmM!0@VúNÃ(361µC ;æ|¶¤‡êÍê–1¼K¥óö‚lË÷+¶¥/‡²½a­a4=ëEŒøóðöbèIaVªŽ{õ{bø¡)™ÕÈoI¯Ó·‰ál? ]õw9—lõç…¦¤'k>÷cL0`kEô›†QiIÎÁ0ÐÙ«¢&†RùqÔŸ윮5-¥P¶F÷3¥I¹¾QkýL À³}ïŠöÁƒ ¦dVKDPy™6ë̸7¼· çr¼éèYÊÍPG›>À5H†Q©¿Ü¾Ñ4ÀìêÍê1¼I¥ó¶F­õ‹‚“†Ñr8¨dßÏRSš«‹£Î f½¹?겂Ó5¦eV#Ý(¯ÓwŽá4?e[ó~¼@çs‚)éÉQ_OøüWšB`€î«ø}0F¤Ý p7™h남ÅP*Ycæû x^Þ /‡ýëÍê%ú~ö1¥Iù†€§a´7ß)à‡ª6˜–Yú–ô¯‹ÚÅAG§Æãù"œH¼>Ê~·~œ)éɺ­;ßùß*†ÃM!0@—ð( £ Òž9ÿŽéÉñ»Mü¶z³zd "‰Ò9¯Qkñºw©)…EQ”èûYlJ“r¹€¾wß&†C%Ñ“"®ÌäCUîÑüXÏ~ö?}.^ó~®@ç“í°“iéÉš„Ïý°™×Ƀb;z` 4Œ2H»ç||«‹Â,êÍê‚.ŽZ RùnÔÿ)è¹i-%ú^4Œ¦å #숨…bèIF7˜–Yí¯Y·Ñïý̨íüttjÁÎçDSÒ³Õ ŸûѦ0 £À@heöÈùø7›˜Õ3£NCéœUàmÜ4Œ–Çò}/FÓr¥€¶J=[WÀsúiikä¶¥¯7«ûÇðbSßÑÇã5ï%;'¿[é]ÊÍPFA»TÀ heònµÂ(}QYe4/jLb5¹ “(؈ ñ9¾ j%51¾T*רÏÄØÝ4 ‚Šx™Z†fîá}‡{CÄ[}{¨SuÏÞç÷[k¯Ó+1qŸÿwêÔ©[_í Ô™íè·ªÂs›Tž¾jÓ0ÏÖÏŽÃÿTòY}8>óVñó¤†ÑÁ¥Ü0êý¶‹D ‹†Q†bl|bç8l?ÇÓ¸G%`Êô—P'J";ßî´z_Md®FóqhçðeLÊODÔ˜†”ÁUy…Ñë”§¯:­0z¶rÏêÎçTtnÇ+ÏÀRn]¤|€{$* £ Ëc+0‡û•n-îõçK"Kg$4×ë•+ 28‡½•1)“"jLÃèàªÜ0ê=®¿ýkòYýך7åÜN«w{kWìÞr”ò vÿ‹ÚÞšðüVB`ˆîq…€aÑ0ʰìQ9Ü© ð°ß‰q„²óµN«÷Í„æ«a4 38‡½”1)׈¨1 £ƒ)v¹ªÂó³Âhûä~‚Ó?ì|¯RÏêæFuüZ4‹n¯DY–ðëwÏ8¬ðüŽU¢Û,_œðüý ¶•"†IÃ(ÃR…FmIOÝ}0ÆvbÈÎç:­Þe©Mzú˾[”/›çljŸÃ˜2&cR@-ÁÀ.I`ŽVí/ˆÑv·¹kNSÞY]ãï*\ÃâǹvrÌåV/å¡ü ¦ŸÇ¸J À0ieXª°r×=Ê@]µ»ÍÄá…’ÈN± GÊ_.Ú–>ó=§0"7‹¨éóü¶q8R?;_žÀ<'•ª¯ý3=¯·ÆØ[yguj§Õ[_áù§DKv«åxÞ/WB`ˆVÆûà1äa”a©Â £>TSKín³XUôƒ’ÈÒ§;­^Ê¿0ÿ©fãЄï‘;ÆaG%LÆ"jêð;‰a ?Šgçû˜çµJÕ×¾~Vß3oSÚY};^·ÿ\ñ9jÜò„çn;z`ØVˆ6 £ K1îTjêéoÍLÅxgâç`…Ñ|¤|yŒò%å&5¥!ep«™§†ÑþrÜ’þ”»+í¬ÞžÀOP¦-Kxî¶£†í"æa”aÙY0zíns¯FúM…ô÷ñN«w]âç a4‡&<÷]”/)¶¤êJÃèà.IdžFûÛ/³ÏêÄá÷”uVÿŸyÿ½âu|l*Õ@îñƒ„ç¿H ![.`Ø4Œ2,VL€¹qVÃêy9º?Æ{38 £ù˜ï…¹A@M-ÁÀ4Œ¦m¿ÌÎçjìÆSUS+°Vݱ1æ)×@VvZ½u)N¼Ýmµ·Â(0L·Ä=ò§b†MÃ(òCæ°V¨“v·ùÌ8¼^Yº Óêå°-³†Ñ|ì÷œT¿Ä×0šŽ{ãÞ·F @ Ÿë‹Õ°“ÄÀRiTª¾öÉè5]¼žKIgÕ‰ç¾Ë˜§íè—òvôOiø‘60\+DŒ‚†Q†¥ Û½j0 n>侞¥»cœ›É¹ø…|^xFaÈnPSGy®Ø Vï¶DæzKŒ•l†=ÚÝæÎ™œK±È6JºQÅ8#‘¹«\Ky«e«‹æa _@0,»ŠF§Ým¾<Ï‘D–>Зݛrccj«Aòph¢óÖ0šŽÛEÔ”íè·*•‰Æ³~ñ|l[úþöÏà³zñz~‰RÎêcñ:˜L –Ûº?—BÃ(ÀÆiFBÃ(ò£`4ÚÝæN|V äÑŠf©ær2V¯X9æeÍÆüDçíG-éX- ¦ŽÁÀ.Il¾×)Y_9lK¶2ÎêžÆÔ ¬)8"ÆNJ6ŸuZ½”ä5ŒÃv‘€QÐ0ʰhÆ€ÑùÓŠ!Kïï´zwfvNVOÊÇa‰Î{{¥K††Q ®4Œ.µ†ÑI%ëkß”'ßî6›qxž2ΪØQãg‰Ìõ8åØò„_ÏÅ ³G(!0Dׯ{â­bFAÃ(@ÂÚÝæ~q8YYº9Æùž×õJ›TWÝYé’¡a¨ãóýããp€$–ZèUõ·_¯åyq8G gUì¨ñþ„æ«atpËžûSV˜†ËvôÀÈheX#‰÷54?åêìN«w_†çõS¥ÍÆþíns—ç½­Ò%CÃ(PGVÜ]1®IlÎFûKy…Ñ—7¬F¸)ï‰Ï¼w%4ß”l`)7Cy†ÍvôÀÈheX扆«Ým«[¼JY*VáüX¦ç¦a4/ œó®Ê–ŒŸ‹¨¡Å"Ø¥VoCbsÖ0Ú_’ £Ó[W¿Gù6ù™÷£ ÕôÀ8ì£l[žðÜ)0dVFFÃ(@‚ÚÝfqÿ>_ÙzW§Õ{0ÓsÓ0š—… ÎÙZÒq¿€:Z»$Á9kí/ÕF'Æ!Ê7«wÄgÞ”žõlG?¸GÍSþA˜÷g`˜Š;­0*¶ädX4#Ãp½¶auƒ\]ãSŸßuJœ•W}Œ²%c€:iw›Å4¤ .ņÑâGUëþ–òËöKðu¼SÞ¡t³úaŒÏ$6gÛÑ.Ù•ó¦_×OS¾ž þ,Øiõî0*F–Ý*0‡í”µ»ÍÝãp¶$²uz§Õ[›ñù]¯ÄY9T ÑÝ"jæ)1+†%×0Z<ÿÇç¼âŸû+ߣÁéÕnRêlÌû’çI†å^5³XûA¯Iìùw.¼;>óÞ—ø9§Œ[–øü5Œöw‘ mF–»*0+Œ’¤v·Yl·wª$²õPŒw‹AÃhfRZaô^åJÆ®"jðì¿o£šÛm§&—†ÑI¥ìkŸ ½fwðyn“®ŽñÉÄïÍ;ÅáH¥Øò„¯â°—öe…QHœ†Q†e]æ a”Tc1dë£VO³¤-éssH»ÛLe5È• € ±ºh9Ver>'ô·o…æòû1öW’YŸy×&~‹bl§”K¹±p±òõu[¼¾'ÅiÓ0ʰÜ]9h%9ín³øƒôk$‘­bK¾sÄð0 £y)¾L=8‘¹Þ£\Éðã  4¤”#‹F;­Þq¸S9g¨Dƒf|^ß­a7Íy-~6ƒó8^)¶¡‘𠣩¦af²=d@Ã(Ãb…QØBíns^ΗDÖ.è´z7‰áaFó³0‘y>¤TɰªPG‹``Åêá?Ìè|¬2:SU¶¤ÿÓSŽY½=>ónÈà<ŽSÊ]×ÂÝ Ïßûs¶£€ heXªðÁ=”Ä+‹Za(_ÅJAïÃ#®Avæ'2Ï5J•ŒDä¬Ým“Ñ2¸ïwZ½œ~2©¤3ìS×ë^qx›RÌê[ñZüj÷æâǼF·<ák x¶ÂhV€ heXÖV`V} íns׆­Ês÷¡N«w›qKÃJ¹9,‘y>¨TÉØA@æÄØM »$³ó±ÂèL{Çgæ¹~.8-Æ.J1«“3º7û›âà–%<÷ùÞŸ7j¹ }F–*¬ÞµãØø„?擊Sb«51ÎÊ윎WÖR¤Ü0j;úþ®ŽÏÒ«ÅyÐ0ʰؒfÑî6‹UÓÎ’DÖ®Žñi1ÌÊ £ùYÈ<ïPª$Œ‰ÈØb”â’LÏë:¥a¤ £ñ™ý…qx¶Øgu^§Õ»-³sÒ0:¸ŸÇ¸*áù/R¾¬. Ñ0ʰÜY‘y«¢Qôý9PÔ};÷æR,ï´zž¿ÀûÓ0 Ñ0ʰT¥at¥ jÚÝæSãðû’ÈÚå1>'†ÙuZ½[ãð€$²rPÜã¶O`žFÓ°§€L??{Š$?çÉŸfznVißþw½2Æ3D>«÷ÄëoMfçtdŒ•v`+~Þ9OU¾–‹ò¡a”a©JÃèþJA} Æ6bÈÚéVo½6‹UFóRÜÛæ'0Ï[”* {·»Íyb2d»r¬ÊøÜ&•w†íâ¹àñÃþ/™þñÓ»Ä=«¢¡ù#ž—íè˱,á¹Ñð÷º~Ögþž µ£a”a¹µ"ó°Â(•Òî6_‡¦$²V¬¦ñ%1l¶ŸŠ ;)4ŒZa4 ÛÆØ[ @†4Œ–ã’ŒÏÍ £ýâo“é¹ ¼»¶Óêý,áùkío¥ /FŠÕK—܇û*2ýT„ŠxKÃJ%¹ûV§Õûª¶ˆ-éó“BÃèmÊ”Œ'ŠÈ†”räÜ0zCŒuJ<ðÿ¾ó'1ž æYŸy×çvRínóIj_Šå‰ÏßûsËDyÑ0Ê0Ue[ú}•‚¹Öî6‹/N•DöNÁ³Ýf~Rh½I™’±¿€Ì>‡½%1°ûcü(דë´zE³¨•øgÚwˆ¯ÍÇÅáÏD<«ïƵù¥LÏí8å-ÅŠ„ߟ‡§(a_V€Ìhe˜ª²‘­L©‚÷ÆØM YûZ§Õû¶¶˜Fó³ 9Þ LÉx’€Ì#‚R\ÏÞk3?Çk•y†aþ øäñ&3ÊÕñÊ[ŠïzÎNñ^{‰ /ÛŠ€!ªÊv¯(s©Ým.ŠÃë$‘½ÇG­ÿQ [lLÙÙ=^ ûtZ½+<Ç›•)‹€9|†ûHÃÏRpK¼çünBóÕRŽ:4¯hi( £q¿/¶º³xgõÕ¸×~+ãóÓ0:¸õ1.Nxþ‹”°¯â÷‹ò¢a”aº½"óÐhÀœiw›óâpAŒyÒÈÞ3§0µÊh•Fmñš+Œ2WÏp{ÆáMžá’pabó]¬d¥Ð0ZOû éÿï;cì(ÞÚ㔌ßówÃáÊ<°ïwZ½{žÿÑJØ× @~lIÏ0ÝR‘yh4`.½2Ʊbjfa•'×iõîÃÝÊ”?üa®<¯¡Y4ßLe¢íns›8¥d¥Ð0ZOûáuYüÐéu¢ÕgãùyUÆç÷¬†¿‘—aYâó·x‰òãa ÓÏ*2 £Ì‰v·¹K–J¨¡ ÌñFeJÂX¼Ÿ>N Ì%"HÆ7šëa1vV²«~¯ç©at¦ÇLÎ.Ó{bl#ÚZãŒÌÏÑvôåXžêÄã¾ò„ÆÒ3a…QȆQ†é†ŠÌcÿ±ñ‰m•ƒ9pRÜz:49^§LÉxª˜/AŸ9;­Þ Í÷YJVŠGÝ×Ôà<5ŒöWÚ¶ôínsQ^*ÒY}2^oWe~Žv…)Çò„çn;úþîq¹ ?F¦ª¬ÜU4‹î§ŒR»Û<(&  ¦RXatR™’±PŒø9îˆ8ì/‰$|3±ùjH)Ç%59O £ý•ù£ÌsÄ9«ûbœ™ù{~±º¬†ÑÁÝãû ÏßûóFÞo;­ÞZ1@~4Œ2L7Th.+#VlE¿£€š: ÝmV}ËÝIeJÆa"`Ä^$‚d|3±ù£d¥¨EÃh§Õ{ ·(÷ ¥4ŒÆ³ê’8üš8gõ¡¸oÊüŸcW¥ØÅ‰7zîÏvô) £ ÓO+4—ƒ”ƒQiw›Ï‰ÃË%ÔØ¼ó+>ÇIeJÆÓEÀˆý†’ñÍ„>#?¤8\ÉJqIÎÕóÊLû–ðz,žUÏå¬îhLý6wÇ)u)–%>ÿEJØ—†QÈ”†Q†fõÒ%÷ÄᮊLçaÚÝfq_=_•ß–~R‰’q„á³ÜÂ8ÿvñÍê⟯Ñù¯ä¥XžðÜ‹彩}Ya2¦a”a»¦BsY  C»Û|aþ‡$’{ïý±%£h]$†èuÓ×iørbóÕ0ZŽ{5[¼Óê݇Ÿ+ý ûmÅÿÍŸÅݬNŽknCN´Ým?n;BÉK‘rÃèÑÊ××íq/¸F / £ Ûd…æb…QJ×î6·oL­. ÀL +>?+Œ¦åWEÀžçŠíHÿXɸµ1µ ^J4Œ–ã{Vo} Ïû:¥Ÿa‹Fã>ÿD÷ùMúF¼¾þ¥Fç[4 Ú%fpWÅu³:ñ뀙¬. ™Ó0ʰý4ÆC™‹F†?Œ1_ }U½aôGJ””ÿ.†ä%1C2¾’`Ó †Ñr\RÓóžTúöÙÂÿüi1vÛ¬N®ÙùÚŽ¾+Ÿ¿†Ñþ4Œ@æ4Œ2T«—.)¾È»¶"ÓyºŠP¦v·¹wÎÀFUºa´ÓêÝÙ°jWJNˆ÷^Í Ã[E”¤¶£ûÖ! Û`—¥® £žUfÚw ^ƒOŽÃD6«/Æsñòš³†Ñr,KuâqoØ.ÏP¾–‹ò¦a”QøIEæ±ûØøÄÊA‰ÞS\WbبV`¾L™’Q|©û\1P¦v·Y\SÇJ"Å{‰ÍÙêeåYUÓóžTúöß‚ÿì»§Ÿ!èo]ŒSköÞ?Ï{iRn,|fŒí•°/+Œ@æ4Œ2 ?©Ð\¬2J)ÚÝæqøIÌj߸_V½±^ÃhZ^ JöN$å›Vïç‰Íy±²•b}ß³­0:ÓfmIÏ¡ECØ+Å5«OÇ}õ‡5;çb„Ç*ýÀÖ6Ò^ùy‘öucÜnäMÃ(£pu…æ¢a”M¯Fq~ŒyÒØ¤ª¯2ªa4-/š~†2žéž‡çH")_LpÎÇ([)~Ôiõî«é¹O*ÿ ûlæî=>·ÏêþF=8q‚Ò—â{‰ß—­ÞŸÕE 4Œ2 WVh.F)É1ž-€ÍrhÅç§a4-Å´š¯Øtãñ{%‘” 1þ!±ëlÛ8¡t¥¸¤Æçn…љ،×߯Æá…¢šÕG:­^¯/ÛÑ—cyâó÷™"Ϻ›AÃ(£P¥­­4Œ2v·¹SΕÀf[ÀsÊýÊ””—ˆ€üfCÃHj¾“à©ÅçÏ•®µmëþgq¸Ï%ð(;ÆgóMm)~¶˜fuW3:^ùK‘lcaÜ?viTÿ‡se¥ F…kb¬­È\æOøÂŽAŒ7¦V7`óTú‹¸N«W<£\ªLIy¹méÄôª‰Òc;úz[Uóó·ÊèLûÌrŸQŽѬÞÏÁ·Õð`¯8ÌWþR¤¼å‘ ß‹lÌ @þüa„¡[½tÉC©¦Ñª\óOU¶F»Û,EO’ÀIá Y«¨¤åà†•¡ÌÅxŠ’óùç¬a´<—Ôüü']3ì¿‘ÏíÅß}Þ+žY«Ö~°¦çnuñr¬iTkG©-u´öõ“N«w» F•+*4dk-±“¶Èüv·¹MÅçx‘2%çµ"`kÄýè‰qx§$’³²ÓꥸÂâb¥+ÅQÿ[kžÁ¤Ë`†}7v«oø¡ð¦œ¯©55=w?:*ÇŠ¸†Ö'<?èØH]Eõ a”QùQ…ær”r°¥ÚÝæ qx…$¶Øö1ªø—+SrNŒ÷f?â`k¼?ÆnbHÎüüP\g •®—ˆÀ–ô}ìÓçuWÒò²x¿>D Ìò“è¼}Þ,Ï*<â:̰oÜëhXEzSþ9žu¿]óg‚'7ìS–å _ÅÊÄû(a_F F4Œ2JUj]06>1¦$lL»Û|~Z’(M «ŒÚ–>Ñ·m«Œ²oõ<—´¢‘¿›èÜ5Œ–çI$íÂN«÷@¢s×0Z £ÿåZÌð'1šb˜Õ߯½T#X£qœJqe\Ow&< £ý}/êzŸ >4Œ2JWƨÒ~'( ñæF+á¤äÐæøÍÆÔª9¤ç·ÚÝæ‘b 0½Ýè…©fbÒõéD¯¿y £e)V<»\ Ð0Ê–z(Æbx˜F˱,ñùkío¥ ^4Œ22«—.Y‡VhJþXÌ íns¯8¼C¥«ü £Vï¶FõVDgó Zñ,·Kþ)ÆÞÒHZñcÃÿHøýnw%,Å^ev4Œ²¥>¯¡k<4‡§ºJ±<ñù/R¾VˆêEÃ(£V¥m°ŽŸØ^Iø%‡J—ÊÊͶ¥O×sÚÝæoŠ¡¾¢þÅŠ¢ãi$ïcV/ÕŸ­^VžU"x £l‰{bœ%†‡Û˜úqƒK¶a4žŸ‡Ç*a_‰êEÃ(£V¥_,ïÃÖ¥<¢Ým>=o”ÀP÷Ùí˜ç7”*iÄufe¿úzŒ‹!y÷ÇøTÂó_¬„¥¹DrØê´z7‹áav*ǃj-°¥¬.ºñç®ËÄõ¢a”Q[Y±ùø£1¿è÷E€¡Ù6Æ! Ìó_cØþ6]ûÆxŸê§Ýmž‡?‘D.ì´z«žÿ1JX £¿ ^E³ÖM’`3ÜÞ˜úSŽA)VM߇Reðþ.º>$¨QŒZñKôµš†QÖî6_‡çH`¨T}‚VïÞ8|K©’ö¦x_¶jõW¬ÿId㣠_‹;ÄáJX £3Ù–žÍqN<ÓÞ!†‡ïËÅÖ¬ü\މÏß:ú³=Ô†QFjõÒ%÷5ªµÍͯŽOxÔ\»ÛÜ)çJ`è&2ϯ(Uò>ïïC-žã^ÝH¸ÁŠU®–%<ÿ¢Yt{e,Åõ‰¯4;,FÙ”ŸÆøßbxÄÓcì"†R$ûþÏ‹ÛÄá%ìk¹ ~4Ê1ª´-ýãS<¦ÞÞã 1 ]* £]¥JÞ1>)†¼M7‹~ÚçÚ¬|$ñù[½¬<«DÐפØ„wvZ½ûÄð; •'åF‹±³öe…Q¨!_¬1ªöËåç)I}µ»Í}ãpŠ$FbA “ì´zWÅájåJÞKã}þMbÈöî·šEsswŒ¿Mül{\ÛÑ÷g…Qfó£Ÿã'‚RÜãÊ„ç´öµ&Æb€úñåsaeÅæókJRkïkXe`T&4×/)W.hw›'ˆ!/QÓbuøOù<›OwZ½5‰Ÿƒ†”òhíOÃ(³95î£kÅð(V-ÇŠ¸¶6$<+€÷wqÔu½ ~|ÁÆ\¸,ÆýšÏ³ÇÆ'¶Q–úiw›ÇÆáÕ’™=âÞûøDæúEåÊÂv1þ!®»ƒD‘ųۼçÄ?Ï“FvŠ&” ¿>ÓHd%íDhíOÃ(Sl+ýbxÔ}y¿8ì/‰R¬H|þ‹”°¯å"€zÒ0ÊÈ­^ºä¡Fµ¾üÙ½a%˜Ú)âp¾$F.•UF¿ãåÊÂ^1ºÓÍ\¤ûì¶C>ã$id©Ûiõ®Lü¬^Vž»âzø‰úÒ0ÊÆœœø Ã`uÑò|7ñgÈg(a_+Eõ¤a”¹òo›Ïs•¤v^ÛÐ( 0’X}mzk¾T®l<5ÆWÛÝæÎ¢HOÔmï8|£aeøœ} ƒsÐ0ZžU"ØèóÉš8¬–¿äëqm|] 3h-OÊ+Œ>3ƶJØ—F ¦4Œ2W¾S±ù,Q’úhw›»ÅálỈCš«méóò¬ÆÔJ£;‰"©ç¶#S_f+l]Üiõ¾™Áyh-íègg•Q~ÙÉ"èë8”âúxŸ¾9áùÛŽ¾¿ŸG]¯Ô“†QæÊ¿Wl>ÇOh¨Sc¯íã¯ãŸŸŒ±ƒD²vuŒ/dpÍîßðƒ´2i†QþÓº§‰¡¯Å1¶C)Ro,´ÂhÍ Æ4Œ2—ª¶Êè ”¤΋±½æÌAínsÇ„æû·J–¥b‹Òoǵ¸¯(ª%jR¬µ*Æk¥Q ïï´zë28ÅJYšâÇßì&EÀ´¿Š{èÄÐ×±"(M²+ŒÆsånq8T û²Â(Ô˜†Qæ’†QFªÝm.‰Ã‹%0§æÅ˜ŸÐ|ÿ-ÆõÊ–¥Ãc,ç^ÕxNÛ.Æé©-è‘H-ÜãS™œËÑÊYšïO¯ðÍÆ]'Âý1Þ%†:A¥XceÂó?júó'3i€Ó0Ê\ªZÃè!cã+KžÚÝæ¶qø$*!™†ÑN«W|IúY%ËÖ>©•Fß(Š9}N+¶ -¾´~wÃö±uò¾¸Çޗɹ£œ¥±ý¦MŠ€ðḇþT }Ÿ+Š¿w?K¥øa\gkž¿tôwsÔõ1@}ie.ÛfÝ^±9½PY²õ¦O@%–Ø|?£dYÛ.ÆÇÛÝæ_ÅØ]£SlãýñÏïÆx†DjåÖâu—Éu\49/RÒÒhÝ4+ŒrgŒsİQÅä{ˆ¡ßM|þFû³º(Ôœ†QæÌê¥K6Äá[›ÖÿP™ü´»Í±ÆÔŠUTCJ[Ò«Œ^‡‹”-{¯‹qi<7‹•´TF7UFëëæìŽAi–'ü̹Wž¤„}i€šÓ0Ê\û׊Íg§ÏS–|´»ÍÃãð»’¨” Îù³1îWºZ˜ãOb\Y¬‚Y¬†)’RžÉžãÿ6¦šE•H­½§Óê­Éè|ŽQÒÒü$®;ŰY&EP[gÅëÄ ³³Ó0ZŽb%ðËžÿQJ¸Q+Eõ¦a”9µzé’Äá–ŠMë7T&+Åʶ9¨–]ÚÝæþ)M¸Óê݇¿WºZyBcjÌoÇõú,qlÈîˆÆ?/ñ멽b|<³sÒ0Z«‹n>+ŒÖÓÕ1>)†YŸ;öŽÃ!’(Ūø ´ÖûsvŠgÜ*¨7 £TAÕVýõ±ñ ¯ ´»Í¢ù÷×$PIóœóÇ”­–Žññ\ñU£[ôöœ_Ž^ãÄÆÔÊ­P¬Œw_F×y±CÅÓ•µ4F7ߤjéq}P ›|n£ËŸ¿†Ñþ¬. 4¶P4Œ¾²BóybŒ£éÿa´ÖÚÝæqø€$*ëÐ_OiÂVïßâýå{ ÍAuõübÄ5Ћãc|-®‰ byÔó×ÎÓÏõäuBWÅø‹ÌÎéˆ†Ý Ê¤atóMŠ vŠ•ºÿN ›t¬J³<ñù/RÂ,ë ”@Ã(Uð ΩX™RÃhÚÞãIb¨¬‰Îû# +Ö]sz\Õî6?Ç¿ê´zwÕ9È¡øBþ·c¼*Æ.6âíñZy(³s²zY¹V‰`³Ù’¾~N{èz1lÒ "(ÍŠ„ŸM÷Ãã•°/+ŒF™{«—.¹zl|âÚøçšVÑ0úvÕIS»Û,V‰=U•vh¢óîÄXcw%¬½Cb|(Æ9ñìñS«~}¥Óê=P“ç­âü_Vü3ÆS]lBñc¼¿Ïð¼+myˆûçõbØl“"¨•oÇëãŸÅ°Ég“ãp”$Jq[\sW'<ÿ£•°¯bw„‹Äh¥*Šmé»BóY86>1õÒ%W*M’ÎŽ±«*m~Š“î´z÷´»Í¿Šþ±2­hN8qzÜ×ÇãX4uLÄõrG.'çõ+©í·ÿgŒ—Ç8\éÙ¯‡ ž—†”òØŽ~ËÜ£X±w;QÔÂÉ"Ø,GÆØ^ ¥X‘øü­Þß•uߘ¢a”ªør£Z £…b•Ñ¥J“–v·YüQøµ’¨¼ýãž½k§Õ[“àÜÏñæÛ(#¿ä11^7=ÖÅ5þ8~5Æÿ‹±2®÷û{®:8¿ã×b¯ 5Þ|ÇŠ 4©o[îý¹¿ïÇ=å>1…_RüÊù–ŠÍéȱñ‰'+Mµµ»Í'Åám’H΂”'ßiõ¾‡•Ê0ÃDÜ#?›ùç=•¹4¶£ß:VÍW±šøYbØ"Ç‹ 4©7ŒZa4Ϻ%Ò0Je¬^º¤ØrókœÚËU§òÎmØb E ÚÝfêÏ£¾Ìx´bå?Ìü+s©l‘»u&E­ó:­ÞÏİENAi’m,ŒÏ–ÅnjG*a_~èÆ1dçöç‰aóµ»ÍÇÆa¡$J±.ÆÅ Ïÿð;*c_V¡a”ªùJŒµ›ÓÓÇÆ'üṂÚÝæ6q¸@IKú=¶ÓêïRF€‡]ã=58O+Œ–§xýž¶ê¤XÍ÷FIdç=QۻİEŽ1O ¥¸,®¿ûž¿tô÷`Q[1ÿIÃ(•²zé’;âðÍ NíªSIoŒñ41$mAçP¬2j‹?€x>ï´z÷ç|‚¶»-ÝÕqÍÜ-†­v­²R¬ûQ1l±ãEPše‰Ï_Ãh«¦dð0 £TÑ—*8§ßŸ°ZA…Lo9v¦$’whê'0½Êè)J ÔÜ'ã~ø­œg±ÝíNÊ]ÛÑFÃh^Þ‘{Óý'‚Ò¬H|þ‹”°/?nEÃ(UTņÑ'5¬XP5ïˆñ81$/‡F‹¦Ñ^£š«¤ŒB±*ÞŸÖä\QîR­Á@4Œæã‡1>#†-3½ê³ûry–%|-?æxºöµBÀ/Ò0Jå¬^º¤ø²ñâ Ní·T§ÚÝf±Ý›%……ËÉÊ ÔÔë;­Þ]59WÛÝ–Ë £ƒÑ0šSã>ºV [ìˆ;‹¡kSË©zFŒm”±/ £À£h¥ªþ±‚s:ql|bG¥©„5ü ow›{äp"V¯X‘çsJ ÔÌÿ™^e¹.ž¥ä¥Ò0:˜Id¡x†üG1lÛÑ—ge¼Ÿ¯KxþVšíïžWˆøEF©ª*nKÿ˜/Rš¹Õî6=MIdeAFçrRŒû•¨‰ŸÄxk>‹ì‡Ã”½4·vZ½Å0ëD…·Çkaƒ¶Š†Ñò,O|þFû»8ñF``4ŒRI«—.ù^cêËǪyêÌv·¹}> €ìd³-}§Õ›lL­„ »õÅ磸ïÝ]£s>ªáï(e²ºèà&E¼^ÜG¿!†­v‚J“zÃè"%ìËvôÀ ¾è Ê¾XÁ9ý±ñ‰½•fÎüqŒCÄ…™Ï{cÜ¢¬@æÎî´zÿ^³s^¬ì¥Z%‚ÁÄkðÞ8Ü&‰¤½][§Ým‡}$Qše _ Å®Pó•°/ £À F©²ÏWpNÛ6¬2:'ÚÝæããpº$²”UÃèôj{ª¬@ÆŠUÈÞUÃó>ZéKe…Ñr\+‚d}.ž/ÃV;^¥¹%®Åëž±ø1 ì𻋡4©70yRðóx¸Z @UØ’žTtS[!VÍ+ÆÆ'öRžrµ»Í_É’¨µ1Nq²÷ظÿï™õÃL«÷¯qø R‰(¶ ÿ_qïÚ ŠÆb”j•J7)‚Ê+šDþJqœJóàôû}’¦w'ÚSØŽ¨ £$aõÒ%ÅÊrÿ¯‚S+¶G~ƒ •gzk±ó%QKŸè´zW‰Ð0Z‡Öà‹Æø(5PqŶÉ/Žg³{Eñ0«—•ëxV®¡Ó➺V ¥8^¥¹4®Ë¼? †Q R4Œ’’OWt^oŸØVyJóúÏCí[Rž)fáKðzXû vZ½ûãðª(7PQÅvÉ­¸_yïm<üƒ¶í|>)†ÑòMŠ ò×ü…b(FË“úvôG+!ˆå"ªDÃ()ùBŒû+8¯ýc¼Xy×î6‡³$QKè´z7‹YhZ©‡:¬0Z4^‡·(7PAëc¼*îSVÀù/E³èb(•†QÏÊuóö¸¯nÃàÚÝæâp°$J³,ñù/RB ‰¨ £$cõÒ%wÅá‹Þ›U¨—jç¶çŠMð%x=̯ˉvZ½Æá˜·ÆýéÅð(V/+×MqÝ"†ÒMŠ ²¾×üWÅPÛÑ—+ÙïÚÝæ¯xq›Ý€ªÑ0Jj>SÑy=wl|âiʳõÚÝf± ±ÆÛz:³ÓêÝ-6ÁVëáКïïÄø‰²ñ¾x&;_ 3#‚RY]t8®Ae,‚RÙŽ¾<Åó”ðü‹@Vˆ¨ £¤¦£ªÛVÿò äƒ1¶CíR›AÃh=<©Ýmn_—“í´zwÆá7cܯôÀûTŒ·‹¡/ £åÒ0:ÅßICå|)ž÷¾+†RYa´<ËãúÜàý`èlGTކQ’²zé’uê®2úÚ±ñ‰=Ui˵»ÍÄá’¨¥Ó;­ž/6Ù¤¸NˆƒíKëñl:¿f×vÑ8óF¥æÐ?÷¡Ä›F†õ9e÷8,”D©4Œçy¢xýZe´ZÖÇ8E ¥Þ“wŒÃ‘’(Mê+ÞiR¡a¨ £¤è“Wñ‡k«Œn¡v·Y¬*ú!IÔRñeñ߉-`•Ñz˜_·î´zÅaþ\é9ð'úÏFcžJµJž•kâ3qoýJ¿'Û™¦<ËŸÿ"%¡a¨ £$gõÒ%?ŽÃ·*:½7Oì¤J[–Y£†ÍA<ì¤N«·^ l_‚×Ãa5=ï·UøùÈÓò/Šç±ûE±QG‹ Tkb\-†¡™AeMøgˆ¡tlj ôç€$Mÿøü™J$àÆø¼u£€ªÑ0Jª>QÑy[Ò¿Vy6O»ÛÜ;ïD-ýk§Õë‰-¤a´jù#‚¸'>‡ßŒq•K¢I¤÷ž5¢˜Õb”ê{~0æY¹&>׺z”ïx”憸FoJxþO‹±ƒ2 X) Š4Œ’ª¿ñóŠÎí­cã^[›çÌC-$¶‚/]ëaa]O¼Óê­ŽC+Æ.`ˆþ³YôNQlÒ1"(Õ%"ªITBш–ÊÕî6ç5¬0Z¦ïz ÛÑ•¤©$­^ºä8|º¢Ó{JŒ«ÒìÚÝf±uÔ$QKŸï´zþXÆÖÐ0Z ë|òqüQ^ã!—0—Åx¾fÑÍú¼²oö‘D©4ŒzV®ƒ÷Ç=ö61”®Ø…àqb(ÍŠÄç”î·[OÃ()ûd…çö§Ê³IĘ'†ÚYã1°•| ^»µ»ÍZ7ètZ½¯Çá¹€’+‹>;î1V1Þ*†¡±Âhy~÷‹»žÿ3cl£Œ@lGT–†QRwacj˯*zÁØøÄJ4ßÅ8P µt^§Õ»E èZÔÂ<â-1þZ ÀŸ—Zñ v¯(6_»Û,þVr´$Je;zÏʹ;#a(÷äÇÅa¡$J³,ñùûA £@ei%i«—.)V(ùd…§xº*ý—v·¹_N–D-Ûïœ+J`[úzð…ð´N«WlùúŸ“°…þ<Æ+50m•⇠»‰¡TFGCÃèÜøAŒÏˆahž%‚R-O|þ‹”HÄJU¥a”|,ƺŠÎí7ÆÆ'S¢G[Ñï$†Z:³Óê­%Ð0ZVýqÿ,žs^㟤l¦SãÞñGÓMçl¹Å"(Ý*Œ„†Ñ¹qJÜo׋ahNA©R_ñÎ £@*4Œ•¥a”ä­^º¤húRE§7/ƪôðê¢ÇÅá•’¨¥kb|\ ”DÃh=ï;‹á¿L¯ø²†¦Q`vŽâUqÏx¯(¢¥|V ££÷qÏý’†êx”¦Ø©éÒT'Ÿ÷ˆÃ!Ê$àêx>X- ª4Œ’‹Wxn/Ÿ¨õ3ÛÝfq¯¹ÀeZ[§Û •i­ù"x4M£À&ü<Æ’¸Wü(v´JõÓ¸.oÃHh½·‹`xÚÝæv [—iUÜ×zº‹DT™†Q²°zé’oÄáòŠNo›§Õ¼D¯‹q”+µ–Š­'5-P& £õ±P3i6⊋ãñmQ ¦Ýmî‡gJ¢TV ££õ•¸ï~K CudŒÄPšå‰Ï_Ã( ÛÑ•¦a”œüï ÏíUcã×±(íns÷8œíò¬­“:­Þ1P" £õ¡at#¦›F_ão¤„/ÇxVÜ~,ŠRc[1”JÃèèLŠ`dŠÏ¹§ŠaèŽA©–%>«Í©°Â(PiFÉÉgbÜQѹ[hQÓº_ ìíò¬¥¯wZ½%Ó0Z D°qq}(¯iTû3ÀðãEqO¸S¥9F¥[%‚‘=܇[%1Ÿ¼]Ûça´\+Ÿÿb%Pü¨DÃ(PiFÉÆê¥Kî‰ÃÇ+<ÅöØøD­VKkw›‡Äá-®ÎÚ:I”­Óê=‡[$Q VÝôëaCŒ7Ç?Ï’ÔΚ/{ÀxŒuâ(•f”òYat´&E0tkõýQð¨/‚Ò¬Žg†«R|»Û|BöQF WÆýön1U¦a”Ü\㡊Îm›ï¬Y=>ИZ]•ú¹°Óê­Cb•ÑzXÐî6ç‰aÓâ~{z~7Æzi@-\ã˜xíACq´JuWŒŸˆa¤®ÁÐ}2寻TÄg'Åቒ(Mê«‹ZH…¿‰•§a”¬¬^ºäÆ8üM…§xâØøÄ3ëP‹v·ùü8üº«²–ЦíÓÄÀi­‡b †ÍÓiõ>1ý¾{¯4 kÅg£ã5ÿCQ å3ÌXž"‰R]Z¬ˆ-†‘Ò0:\ų֙b ÛÑ—kYâó÷ƒ ËET†Qrt^…çV¬”öÎÜ Ðî6·Ã]еõ «­0dFëc6_Ü{¿‡_q“4 ;EƒÒëãuÞŽ±FC£¥|¶£= £Ãu~܇=k†íèË•z“÷h ‰¨: £dgõÒ%—Çá+žâ‹ÇÆ'g^†ßq¨«±–îiXm…áÓ0ZÞK¶P§Õ+¶>[ÔHËIà¿|¯1µý_ˆbè4£”o•FNÃèðü<ÆR1ŒŒ†Ñri¾õ ?˜ a”\Wñù½+×àÛÝæãr>?6ýÚë´z·ˆ!Ó0ZVÝ q¾1ωñYi@ò>Иjý¾(Fb±Jç óÑÓ0:<çÄýø1 _»ÛÜ-‡K¢4“qíÞšðõppÆ”HÀq¿½G @Õi%K«—.ùz.®ðŸ?6>ñß2ÿ¬{¸ k©øòá\10Fëc¡¶N§Õ»/¯Šñ§1ÖI’s}Œ%ñZ~[ŒÄ12Lj Tkchv= £ÃQü çÏÅ02Ç6üݺL˼?¸ßü'x#gU_eôܱñ‰y9Þî6Ÿ‡7¸ôjëÌN«·F Œ€†ÑúÐ0:€¸'oˆQ<-‰ñ3‰@2>ãðxý~]#ý,s`ö–D©~×ñƒbùû±æ]’(Ý»¦Ãh'‚R­H|þG)!ˆ•"R a”œ}.ÆÕžß‘1^YæбK¯–®‰ñq10 V¯h|³ÚZ=<±Ýmî.†_3ßœ~îøwi@¥«×µâ5ûºš½FÏêeå³ýܱÊh¹~ã/Å0RFË•úŠw‹•H„†Q FÉÖê¥KŠíïήø4ÏŸØ1‡¼ÛÝæoÆáy®¼Ú:ÝêAŒ˜/Áëc¾÷èâðœ^"P)b|,Æ¡ñZýgqÌ £å[%ÏÊ™85îÏkÅ0ín³ø!ò±’(ͺ'~=©Œ@Šg?˜’ a”Ü}&Æõž_±íá›S¹ÝmM¯ç¹Üj«ø"øïÄÀˆÙ–¾>A9:­Þº§Å?›1n’TÂbœ¯Íß³ªèœ³zYù|a>w4Œ–§h´û‚Fêi1vCi.gŒ{žÿ»(#€Ëâ~{¿€h%k«—.)V<<§âÓ+¯qyÕÖ…VÏV;Ì £õ1z«`†$îå×Åx~üó·cÜ)(Ý­1ÞÔ˜Ú~~B•¤¥|¶£÷¬œº/Æ={¹F+žû÷‰ÃA’(ͽ1~ðõ°}ž®Œ@Š#. £ÔÂê¥KÖ4ªßù’±ñ‰_K%Óv·9/绺jë¡§‰9äKðú(~Tq†¯ÓêýuÆø¼4 E“Æ{c¯¯ÇX'’ÊÒ0Z> £sûž~sÄV+î×§ŠaN/‚R­Lüùã1¶WF ß‹ûíCbR¡a”:ùp£Ú«ŒÎŸØ6‘<«á‹Õ:ûD§Õ»J Ì! £õr¨F£h0‰qbüó1®‘l•¢1ãc©FÑScÜ%’êjw›;ÇápI”NÃèÜ»V[íSqïþ¡æÄq"(Õ²Äç´‰°= £ÔÆê¥KîŽÃû+>Í§Æø½ªgÙî6w‹ÃÙ®ªÚº'Æ™b`.uZ½ûãð3IÔÆŒü5öÕÆTÕ»cÜ/Ø,ëc|*ÆÂx ý^Œ›D’„#cl#†Rý<®ÍŠsO ¶NñÜó.1Ì £åZžøü)!ˆ‹D¤DÃ(uSl¡~sÅçøî±ñ‰=+>ÇSb<ÑåT[çuZ½[Ä@Xe´>¬0:â^_ŒwLçÿ‰ÀFmˆqaŒ§ÅkæuVaOÎb”Îê¢Õ atë|$îã>gÌ韔D©Roõ ¤BÃ( £ÔÊê¥Kî‹Ã9Ÿæ1ΪêäÚÝæÁqx‹«©¶nq®¨_äÖÇ|ÌN«7ãåñÏçÅX)xD±õ|±¢èSã5òŠ?I’lw[> £Õ atËÝÕ°›Ê\ß·Ci~–òjÏíns—8,TF ÅwN> IÑ0J}4ÆõŸãÆÆ'žYѹc—QmÙiõÖˆŠÐ0Z‡‰`îÅýÿ›©/ò_cR"ÔX±]ñGb<½¢èE’´cDP: £Õà½z˽?îé·‰aÎØŽ¾\©¯.zTÃw@VÅóÃZ1)ñGjgõÒ%6*¼‚ç/¼6?<6>1¯J“jw›¿‡ßpÕÖ51>.*DÃh}<.ÞƒÆÄ0÷:­Þ†ÿ\ИZqüf©P#?‹ñŽûÇëàlYœ¾xoÙ+O’Dé4ŒzVNõÿA1Ì©DPªe‰Ïß à@*ìÄ$GÃ(uõ—1®®øñ¿ª2™v·Yl ö!—N­ÞiõâKðz±a…ï1Šç‚ƒcœãv©±Ëb¼!ÆqÝ¿ÛêsY±ºhùŠÏ VÝ­†Il‘³ì¦1wÚÝfñƒégI¢T+Ÿ¿†Q ‰H†QjiõÒ%Å!ïJ`ªïŸØ³"sycŒÃ]=µµ*Æß‰ŠÑ0Z/F+¨ÓêÝã}ñσbœÔ°â(ù(>/|>ÆsãzŒÿã~±dGÃhù.×ÊCb¨„c¬ÃfùIÃnUxÖ·£@¹4Œ¸ßô¥a”:û›ÆÔjAUö¸çÎõ$¦·>Ó%Sk'Û‹ŠÑ0Z/F+¬X‘+ÆÒÆÔŠ£ìõIâï-gÄ8(®éc|K$YÓ0Z>ÛÑWç½¹h|ÿ©$6Ë;ì¦1çŽA©~×ôêT'?ýwȃ•H@±:ùĤFÃ(µµzé’õ©•°ªîucãÏžã9«±Z顾¾ÞiõþE TM\—·ÄáIÔÆ$ñº,V½ þù䯎q±Tþ?{÷eIUÞ üô€ˆ  % EPP‰†‹10”5 ˆp¢Ž„\hL”ò‚*¥x#zAåøETB#¤)#†ðK… †(à%xKy˳ïWžÃ ‹Ëc˜éê®]ç÷[ë¿vãr˜ýâì=ð*Ð< ñ[‘7D6‰=|XäFÓ2ŒÎ=£Ýâ O¬ù"ñWMÂ{)˜S©?íÎù ¤â²ø³ãƒ¦HÍš¦€qV—ùYQ?îÜñ®~.ú¹MôwÞ_í·dzòåÑ`·Œµ˜:¬ùà/6 cᥦ £§š}­IÜ%vŠö=‘]¾°F·4Å_Ž|=öì/LÇx‰Ï¦Í¾×£Ýr}dÓð¸>¨Ð£^´dzò)ñ™tŸ©HK¬Ù÷¢ù^¬ß Ã/¡¼3²¡™aü$rb䫱7d:ÆÚ¶¦  F»wWæ±gÁi¦aaÅqƒh^b&æÔE‰÷;K$BÁ($OøaìÕe~Ù ×}8+ªMæó7\2=¹[4¹]2¶š¢¬™:ÎÍ—63 éZ>5ó‘ÿ?>/²Wä³Â<ùYäS‘mcnùbQ^wÛ†ë⟭ÛMC§\o ×Á¦ ¼Ž~n5Oú¿,ñ1üžeáA @’Ù3²v‡ûø´È²¢š¬Ë|¶íßlÉôäS£9ÊÖk_X>5s­i ãŒŽ—Í#мg˽ќÔ$î›6׎Q3—®Ž|;rJä’Øw³¦„Gðô²¹çé¢Ýó¦à1gÃLC'xýÇÞ¾'ÕÎÇŸ6Žæ¹–HÀmÿîH’‚Qüæ)£?ÍŠê3ƒáë黬yÚgó×eóð{½7²©Ý1¶îŒfH€‚ÑñòÒÈwLC,Ÿš¹.š¿k²dzrûÁ°p´yúè³ÍOÒƒ‘ó"ÓƒaÐM %>ošò»fbÎ)í£®ùÁ!¦¡3îŽZ>5s³i  FÇËæ¦ ¿âܹ š âÒ|iå‘}Fízf‡ÇðóÈY‘3›Äú¥)a%m=èöÛ%R¥`´{Œ>º¯Å™q¥iXxqï[+šmÍÄœZ‘xÿ½ŽH…×ÑÉR0 #u™ÿ*+ªCãÇ£;ÞÕõ#ÇDvkñ÷x}äl»blÝù„i Í+‡O5 cãFSÐ˧fî‹æ›,™ž|j´‹#oŽìÙÈ µæ èÍSD›"ѳû°žéþЊ‹MAçÎÔ{â,ýÊÀ—/é#¦ 3~{0üâsç‰÷ÿ.g4笉ÙYoL …51‘d¿³¢jЍ›§¢¼<îîS—ù‰v0–LO.Šf»Èîƒañ¨'Îöß­‘ #çŽrñò©™ûM 0ÔõÑ£´³±-mdEµs4U]­#/¯ËüÿØqÀ¸Y2=ùüÁð©èù¨ÝÀ¬$­ùƒé#ÿ2‰6í—OÍ>ÙÅ`X ºbùÔ̯L Àº>Ú `”v6Vú£›Dó£ÈSèîŸ×e¾Ì®½¾þe‘ß¼f0, }±™Y÷F~¹b”+›vùÔÌ/L ÀcS×GŒÒÎÆJ¼`´‘ÕáÑ|0®ÞÙº.óëí<€G·dzò9ÑlùÝÈ6£lbfæÌm‘k#ÿ{”æËWMqhóZùûMÀ“£®6(¥Õ‚Ñu£¹:²qÝ=7²s]æÚ}+gÉôäúƒá«ì›âÑ­"/‰lù-³ó¨š§‚þ,r]äšÁ°@´ÉÕ˧fþÓôÌu}´AÁ(íl¬Œ6²¢Ú;š¯%Ò݃ê2ÿ¤Ý°zF…¤Í+ì_:j7üNäy£¬Ù³!ßù¿‘F¹qÔþìá½|jæ×vÀüP×GŒÒÎÆêOÁh3s";&ÐÝ{#¯®Ëü2; K¦'E³Ñ`X@úüÈsFÙ0²Á(ÍJŸyzäóЭæ•ïwFnܹk0|E|ó¿Ý1ƒ6¹åa?7ižú‹åS3·[Y€nQ×GŒÒÎÆêIÁh#+ªæÉRWDž’@wyU]æwۅݰdz²)]w”æçæ²¼þÃþ/Mêz£Ÿõˆ_ÞÞû°¿nžÚ‚>8…Þ±|jæ~³ Ð/êúhƒ‚QÚÙX=*mdEuD4‡$ÒÝcë2—]iR×G™X)‡G~’H_ÈŠjKÀCŒÂJ½âýÀ„º||VT¿måh(…•T—ùÑœœHw7ˆ,ÏŠj +€‚Qxrþ*r{"}Ý)rˆ%@Á(< u™ß͇êò¡YQí`寛‚Qxò>¹(¡ÆOÌŠêÙ– ÆWÜ63 ãmbvvÖ,0÷kb¢×ãËŠjËh.‰¬•H—¿™ªËÜ?ð0fâÞ²ÅèÞrqäÝq¸Ò¬@·©ë£ ž0 « .ó«¢9"¡.¿)r°•€ñ’ÕÚÑ|#²Näu‘KãûLäYf`¼(…U÷±HJOè:,+ªÅ– ÆÊQ‘­ö×kDŒ\÷‚#kš"€ñà•ô´³±zþJú‡dEõ{Ñ\8_¤àæÈ+ë2¿É.€ÞßSvæ[Oð»&RÄÝàT3Ý¡®6(¥5&£¬¨ŽŒ¦H¨Ë?ˆ,®Ëü~;z{?ya4—FVöÕóÿù@Ü.4{°ðÔõѯ¤‡Õ÷·ƒáÓ¹R±Cäc– ú)+ªµ¢9i°òÅ¢×E.ˆ_ûÈÖf ŒÂjªËü×Ñüy$¥²þ÷^S ôϧ"Û®â¯Ý-ryÜNŒlf*úÃ+éigcÑ+é’Õ'£y_B]¾#²}]æWٱЛûÈ^Ñ|}Žþv †O*=<î ?4»0ÔõÑ£´³±Æ³`tíh.޼<¡n_Ù¶.ó_Úµü]dóÑ]äésýgÑÁ°pô£qg¸ÒL@ûÔõÑ£´³±Æ°`´‘Õ6ÑükdÍ„º}fdª.óì\HöÒ‰®ˆ¼¬åß껑OĽá\³íQ×GŒÒÎÆÓ‚ÑFVT‡DsDbÝn ? ;’¼{4¯oFö˜Çß¶ù‚Ì'"ßò¥˜{êúhÃ"SsîÈÈ…‰õù ¬¨ö²t¤ƒó[,ÚØv0|Mýuq‡xäY– ÛÚ `”v6–‚Ѧˆ£™„Ó#oL¬ëÍFw¨Ëü.;:{ÏxF4ÿÙ²Ãݬ#_Šœ÷гj°òÔõÑ£´³±ŒþFVTωæŠÈF‰uýÛ‘=ê2÷Ý»_,Õ»&ÔíK"_Œ|5î¿´ŠðøÔõцE¦ÚS—ùFó¶æ3<±®ïù˜€N:|V±hãU‘ÏDÞiù†‚QhY]ægEsd‚]ÿ@VTK­ tGœÍ{Gsp¢Ý?3ò)«°0ŒÂüøHdE‚ýþ|VT;Y>Xxq&oÍñ‰vÿç‘·×eî½ dbvÖ³¥…51a!+ªEsYd½Äº~[d‡ºÌ¯´Š°`÷ˆMÃ/Ÿl˜`÷Œ¼>îçXIX9êúhƒ'ŒÂ<©Ëü'Ñüe‚]o \¿›Õó­"Ì¿8ƒŸÙœÅƒ4‹EU, °ðŒÂ<ªËüÄhNH°ëGάó$ÎÞµ¢9%²E¢C8/r¨•Xx Faþ¹*Á~¿,rê¨phYœ¹Ñ|.²8Ñ!Ô‘½ë2Àj,<£0Ïê2¿+š="w$Øý×E– X€vYšhßg#o{Ï – ŒÂ¨ËüšAº 9Ú*@{²¢Ú/š$<„Ãâ¾s¦•裰@ê2?9šO'Úý³¢ú;«s/ÎØ©ÁðUô©š‰¸'tŒ‚QXXE.L´ïÉŠê½–æNœ­¯Žæ¤„ïé?ìS—ùƒV [&fggÍs¿±&&LÂJÊŠêyÑ\Ù Ñ!¼£.ó/YIXí;Á–Ñ|¿ù1Ñ!ÜÙ!îYMX=êúhƒ'ŒÂ«Ëü†hÞIõI\ÇgEõf+ «.ÎÒFsæ ÝbÑÆ{‹t—‚Q耺Ìg¢ùPŸ#ßÈŠj±•€'/ÎÐ £©"'<Œ/Ç}æX« Ð] F¡;>9)Ѿ¯™ÎŠj'Ë+/ÎÎõ£9+²iÂø8²¿Õ趉ÙÙY³ÀÜo¬‰ “° ²¢Z7šó#¯Ht·E&ë2_a5à Ïýu¢9;òꄇqsäUqößhE`î¨ë£ ž0 R—ùѼ¹ù1Ñ!¬™ÉŠj;« mT,:=H»Xô¾ÈîŠEÒ `:¦.óë£Ù3ò@¢Cx¨ht« ÿ¿8#׊æ¤ÈN‰倸·\`EÒ `:¨.óïE󾄇О•ÕVVþKœk †Å¢”øP>÷•eV  F¡£ê2ÿt4_JxDÎQ4 C£bÑ/GvK|(çFþÆŠ¤EÁ(tÛþ‘óîÿCE£¯´”Œ³‡‹î“øP®ìY—ù}V -³³³f¹ßX&aŽdEµa4+"›$<ŒÛ"“u™¯°¢ŒáYÞ—bÑ_F¶óüj« íR×G†§D¾™ÕRË @ŸŒŠE§#oìÁp.Œ¼½.óY+ >£˜ºÌ _o{A>ŽÏŠêo¬*}gÚúÑT‘z0œk"»Æ½ã.+ Ð F!A£â]#W÷`8GeEu˜U eq–mÍy‘í{0œ›#oˆûÆ-V ?&fg½a’6ÖÄ„I˜YQ½p0|ÒèF=Î1‘÷Ôeþ€• ±óøEÑÌD6íÁpnüAœÇ—YYX8êúhƒ'ŒBÂê2¿>š7FnëÁpÞùFVTk[YRçÖVÑüó Å¢÷EöT, ÐO F!qu™_̓a‘GêšqTYQeV€®‹óê÷£97²qO†ôθWÌXY€~R0 =P—yÍÛ{2œ¦øæü¬¨^`eèª8§væ¬æÇž é ¸O,·²ý¥`z¢.ó£y_O†³E䂬¨¶±²tMœODsräi=Ò‘qø¤•è7£Ð#u™*šÃ{2œçF¾ŸÕ¤•  âLšˆ?Ó£{ôç#[]€þ›˜5 ÌýÆš˜0 (+ª££ywO†säÀºÌ?oeXÀ³u­hþWäÏz4¬æéägìVºE]mP0J;KÁè‚jž€Í ‘·÷hXÿ#r¢à\Í¢ùväu=Ötd8WïµÂÐ=êúhƒ‚QÚÙX F\VTkDsRä-=VSܲw]æwXaæé<Ý,šÓ#/éѰÎüQœ§wYaè&u}´AÁ(íl,£0z}îi‘É ëŠÈ®u™ÿÔ Ðò9úÚh¾yv†uQs/ˆsôV+ Ý¥®6,2Ð_£×Ìî9¿GÃzEdEVTÿÍ Ж8gÞÍÙƒ~‹^™R, 0žÙ1rqVTÛXež¬8?¦¢ù×AÿŠE¯‹ì¤X€†'ŒÒÎÆò„ÑNËŠjÃhΉlÙ³¡Ýù‹ºÌ—[eVâÚ `”v6–‚Ñ$ô¼h´yµðŸÔe~½•àçßVÑœyq‡wUäãü»ÉJ@ºÔõцE¦ÆW]æ·D³cä¢oÛÈ¥YQ½ÉJð8ÞÍ…ƒþ‹.V, À£ñ„QÚÙXž0š”ÑkyψlßÓ!9´.ó¬6ÀØžuO‹æ3‘}{:ÄæËS£/ƒ‰S×GŒÒÎÆR0šœ¬¨Ö‰f:²SO‡øýÈ’ºÌo°ÚcwÆ5O=9²uO‡Ø‹NÆw«Õ€~P×G¼’øºÌïŠf*rzO‡ø‘˳¢ÚÅjŒøÜß'šKý-m¾¡X€'ä £´³±Ô¿óêo­8´tßý¶Šæ°ÕüÛ{²ãþÉlB/>š¢˜ƒWá—^Ÿ2ƒóöyÝ|ámñ*üÒeñy}š|ܹmŠDóÁð JSƒÕ/]ÿ™Ž|5ÖgEæà9Ñ|a~éÑÿ·Îóäßã÷ük;`¥>k·ŒæðþÖ§Ågñ²„çeUïU­œ‰ôþŸÃU½g bO½Ù ÎÙ:üi4:ŸŸwþ ÇBP×GÖ4Àã©Ëü°¬¨nŽ,êé0w‹lãÜ7Æ;mÕÒŸß»Ds|dƒžõ½qN}ÚŠóöÝiVǺ£ÐÏ]ÅÏ„gš:€yõÊUü¼>×Ô=º¥ûî·Ñèn¼ÿè<œOÍëíßÝ$úqm´'D>w²ãꚎuVqݺw+ì^€•¶Á`õÿУi Q“,}Q¤ùÂÂFsü·¾ÕvcŽïYÌ­-Vq®÷g8`Ü-2À©Ë¼ù†ÔŸDîëñ0›o‚–Õç#O·êÝŸ×ëDމÿqÐïbÑæü}›bQËÒ}÷[;š¹xÚÁÎñ÷z Á;ñïD>7>åóÐÁü‹>Òf‘#"?~}ºéŸU ã6=):E;æ¾X ·Œ+¥.óSÃ×üÞÖó¡þE䲬¨¶·êÝŸÓ¯ŽæòÈ=êí‘©8‡¿bÕy»ææ©€‘w˜NR±tßýÖ‹|4~¼z0|ªèÚëbóÿ浕WG?ˆø¢:]¶w¢ýÞËÒ¬¼ÿ'{gžW‘½ñ)” Vî…ÅÝ] ‡âRZ–†Íâ‡`»8„BiñeqËB‹k¡hñBq nEúßÞ ÿPšä»3Wæ~ßû{žóÜP¾¹wî¹#gΑÁ¨¢dZªÀeÈ'eþªôðHU}ËÙô^§’Bˆp@¿ÜB/-B)ó×ý².¾¿÷©äEÔ&x¯ššÚ:Í…B!Dð`ܺ .¯˜(m¯À³Ëü yùÞN¥'„"Pv¶áÝ‹4˜—TtB!„¥Ó]*BÄ¡µ¡úYëÕínÈâeüª4”8 ²5Þw¼÷Ã*}!„ÈôÇËâr5d¹ xÝW!›âûóžJ^t† !¿A‚·äý6„Ü/í !„úæö3Q¨Ë¸<ßÜÔø_iPˆDÛ㌸\ XÀìϹïÐŒë?Ð?|«BؾÞVwH:}ÉHiP$ús©HëBÕ™UtB!„¥#ƒQ!DlZªÇUÕ·¬‰?o¬Wæ¯Ko££ð¾çãz4ÞýÕ!„ÈôÁ<%~´•ðÊA¶Æ7ç+•¾(Á& %Ÿ$ôX*ƒQ!„âÏôƒœàî*ˆ F…HˆšÚ:$äšäBEȺô’ÚÜÔø’JVh0úÇ´#¥>‘ »šb­ íª"B!„ˆ‡B !œhm¨þ—!Ã+àui„Á…š1Uõ-ë©ô…";ÐﮌËÓ!¦2ŒE¯‡l$cQQ 6t|M ·Þ÷®’†…B!D`ãßíqyÜßX´¿ñ}ð^›¨t…BÄvø6õ*ÈØ€ùì¯"B!„ˆ‡ F…δ6TOÀe7È©òÊô6:²ª¾å ˆŒ(„"EÐÏö‚œŽ?Ÿ0•‚žœ `¿¯B”C„-Â}iœ=PêB!„¡PS[ÇÃÜ7@¦-³W›r;ÞOÆ.B!BaFÈÉë6¿B!„"2BxÑÚP=r,þÜòk…¼6ô¾ZUߢ0B‘è_i7r$dê xå_ ƒñ==’ßUÕsL’{H½B!„"jjë87ü—)ßýŒi 73<½J[!D eÿkG•B!D|d0*„H„Ö†ê&ä«”º³C†WÕ·ÜYH5@!üA:;dþüdÑ yí/ à;z•j€ˆCMmÝL¸l›â#–Ç3V”¦…B!DÎãÞÃq9=£Çýùò®•!ßgôìîxß5UêB!`K|“ú>F —î­UTB!„ñé.!’¢µ¡ú¾ªú–Õñçm¦r }6¼„÷‚ëyÐÁ/ª Bô¡<ÄDOÕ É>S½ú«-ðíxGµ@8Àñ=S~½ŒŽ–ª…B!DÔÔÖ Æå¬”nÏCï@…<yòasSãÄ)äc\€, YR Y6…<õ†üÏ[ùx_5@!DŽô€l¹2à{©_!„B¤AMm]o\Nñ¼Í¯íš›_èÕx€òÏ{pü¿›j‰BˆYßê•3Ìm¢ýE!„Bá F…¹ÐÚPý$.+BFU°†\yºª¾¥ZµBQdÐ- ¹ÝD›a+V°*€ïÜSª"IlˆÎ‡¤Ü8¿¡ÝpÌÂ6ÈÃ,* !„B‘û˜È«½ÿlnjÒK!?¿ã²ägÏ[ ²ó!„—×Ó…âÕsgÿ05ׯÞQÑ !„Bü?2BäFkCõ'¸ÐPòœ WÅJû«ê[(+ªf!Šú­ù!ô¤ùdË V7‚l…ï[«j†H~…ÒÝÓÜÔøGÄ߯Úö—*!„B‘$5µu½p©÷¼ .žâûaüý. ž·Y²šj‹Bˆ¸òƒCºøf‡`W°³Cš{MJ!„BXºKBˆ ]Ðëè±ÐÍ›ª!BˆPA_5‡‰ $÷5‘!Y%ódúíQª"E\CÂOÉ£(ÃÒ/ëp¯ZÈùå¬äšÚº>¸L éiÿ‰›(ß775~_‰•ú˜ÖêczûO¿X}|U¡ú˜Áꢭ~üù úøM]Tfe05.,¶Õ6¯2_¢ ¾–vþ¤§YÛµ[òMûÃ9æk[vÓOö¿¾·åø«J/¨zDƒ€­´|rú²¿…ÓY!ßq|=ü Z’‡Ìé‘~d?”ÉÄ€ßñ\ÈA¶t…ë†O¨ºÕ?p,2k»þáûÍý6€ñóÕ»Ý?³Ïú y›PæeÒÓ¶³i'û_ßÚ±Æïª¹A•Ww;.œ©Ý?‘wª8–¹ÕÄ÷:—‰3?cq=@1ÌDkØåÞ¦¦±ß¤¶ñûÛÿø8)íù ûö7¿ÙïÁ7út©;~Kg0ÿoKÄ9ûç•XĤú0‹­mp îÛr_ÃÁ{÷°ïM™hß[ý‡(+d0*„‚Ö†êÛ«ê[–7‘Ú®žÜúàIÏSd8*„ ôM\Ä¥÷nvM'LZ$ˆ¾úc©B¤…]¤ÛÞ!)ón›Â¿Óˆôt‡û-‹¼¬ÔÜÔølÁõÉE®5 «@†,j¯3u’æG\Þ‡¼ yòäQÈØ¢/–ÚMUz¼_²„ÕeÞNÒp3üSyèkõñ¥6¡ñ~óà²d«“ÅM'arñ{~8fò4d$ô pw~e0µ­—ëÛ2XÒ–Ã ü~‚­ô¢ü¼‰ jB9|Wºâ&ØZ­!ëZ]M×A»Ùzy-Åüð›ÅÈËA–†ô…,`"c°é»Hû•Í#½ñ1ÏÚ~å]µŠÔëÐò¶½-eÛ¥O'߀ñ¶Œžƒ< U†Ûx7ÖÕul[¢.ÌÖÁo¿³}ÿ›¶ßU.ßÁ8Ð3ý™iökIÀÃ6¨3—?Oªý §¨ºä:f^ÏÊÊv\ÂñòTô“#¿b¿e-¨Ï¥˜/ö[L–¯nü¾ÕöáœÓ¼`×4FéÞa¶vc%íXc~6OÛEÚ/ì˜ñívåó4ÞÿCÕòÔÇö«µ«RëhlˆßÿŒË8Èë¶Œ8¶X‡5…”.!æw59Œ7ï¢4äÚØ¾eÔ¦hmÛþÍD‰xíÙÅ\ë-+oØvõX ü®bû™Õ­>¸¶5%GñûñvÏ1äcG ‹qØ?s¾ÃCIËšÿ_ÿš£ƒŸÿŽß`ëÏ­=½}¢.µ¬êÇU›Ú>fYû½îÑA}àzè;¶>Œ¶cÞw øÎSÛþcÃÉÆ)½;øýx;Öçxú¼÷ª=¢ˆt›8QD «[7)A8QUßBCv.~þSÚ˜뮀œÖÚP­Bˆ<ûg.âÒH”\}¤‘I!èipwúgy–©RS[·7.—:$½¶¹©q×îIcG—C:ãžûP‡\ÝÒßDFhIMX>‡Ü¹rWQ‡ zõß²­‰6—{'tkzÜdݺ r+ôñQê7œB¶0Ñ /c­®ÉÈï³ .·8$¥ÑW¿œÊ€<[šh¾Ñ'h¬ÁÍÌ 7fí©ïCO&.Þ¡/A^.áþ4žå¦'ûäùcÜÜÿùß“ýéj¶OaBCë¤CU¾cûÚ!&iÔbë]©›ÇÜ4ÙÄá1ÜH3Íí6ŒuZõsû>ü6nl"Ot¾k£l]W$OÔнe ²ºXÑóvl»#!ŒsC)Êñü¡¸ìîð¬Cpÿ•Á8—†nyÜ‚oç/»ùú¶Ç8”ãÌ>x×_b>Óå =‘Íäøž4ÐØÊ!)½¶w|æÆã··ð¼ÛK¸÷Jö[»£éâàC°ì¯„\†ç~ž@}ZÅ~¿v0¨‰A«í·šB<h7ñ9>åø¶ípCÒ¼jÇÔÃãI ´®Kü9çgë:<†á¶ï‰™f8Þó³Ë­—‰4ílLj¾k‰<ñ ‰ŽÜX鯣Ðo?«\¡á×ìq¿9J™¯¤ôÞœÇ,3ÙPä·i9F[/Ëob‚ïÝÝΑ9^åáÖ¹º5û:Ïó{8ïùbÁÚA7«v>:£ç-ÇAþcuñl Ïwgñ0Q·uFCÀ]í|°o·mçü®ŒÏá†àr‚CÒ#¿g8ö$£\á™.y½Ï{¥„{óÀ £>p k•ÆTÓ7‡| Çœe¿Zk×D|úy®‡ßg"{Ž;;ó@s êO\yÅå…Ÿÿ‹ð‡Q!DPØõGÚõ<å8K…«„ b4Ù:ᢢ G…™b=Šî9\}òpAuúã‘R…È×pôm¸ºzuXS[wXsSãO¡+Í.üpÃ^«ÖKé14°`å[<³׋ Ÿ×Õ =Èq‘› =Sx77´r1žÇM‡‹ ÷‡è‰ÕÖnþsÃlµ„oO¯ ÇRìÆTä…ïšb9°ýÃÎ{fKðÖ4ˆÛÄÊ¿ñœ«p=+CoUóÒ 5‘ÑYGúâ‘‹ËCò›!sÛ2«1xàM†žÜËʧÖKß% ¥÷v,§8¬bâoºŒ3‘÷Ÿ¤Ëcûlš;Á[³^n`å\<‡c”Ñ÷=ô0ÎÃp·ýEôœ¬ßá†Ñ¹ÐÃûêí;d°gúó‹âMš^«P'¸ÞÙÏ£¿â!¨WÕeûÕ1]Ì_:ƒFq ¯ŽùöNúzÉ>²yBz¡÷7:I8 ÷¦~Nw1x³¬gÚñv’c~öÅýixøOämLý4i¬;(á1â”hó®ÍƒÒïâÙãÚ=|™À½çÉ`¬Ñöí‰ç(Ÿ¥PnsÙ±}­[IÑc²oì•úÆz}“~…¯³u>}l¿xK}çØË9$^Ôr²ý Ëh@Jý —²r$žGoy¿6e}à2¦^º[üÓ${ˆ /äP žñ × 7•CøiZ›sw® .žðíW´r*žs«>QæÝ¨ËØ“pýÑÕë¼ËX¢¦³¹ƒ=ÜÁõ#MrëKKØ1ï‰vîDÔ‡÷k ûÙ¾uÁ„nK=ö·ò*žq4Þù¿Ìé\Ç…2‰3•T „‘Ö†ê»MíicܼàfÜ›Uõ-—Bþ&•!Ò„†¢!&Ú¬>ÝÈX´ .z,+cQ‘v£rU‡¤ µw_'ÿŸ÷\<¹9°CôFCQ†I§‡Çõ2z,=ûp±i,ž?Â.쇢%í¢-%¹ Ù3ƒÇrã eÜt~Öž¾©Žp“‹Þ3¸I¶ZÊë¹ ò8ž»¶z¶?Ê`zÈIv¬AãÚ4 èŒoà™X#Õ"ꌆB —wA^c3äaHþ¤áíñ&}cÑÉ¡¤ãXos UjM%•[/ÈQ¶½l’5n€ìi¢’+¬áHHº˜r®‰6ÎèMdš”ÅqÁ!¶ß9Ãzm. ŽGvô¸튶ivƒgúETsR¯—SCN°ãæÍSxÄtvÜó"ž³ZŒ|M ¡G@z­Þ0ElbÇî§ÚC*y”Á¢z*{Ãö£³eœ…Ld”;ù82ZFÉß×3LäM—F\iŽÑúغñ–άpÂÇH?vqHCïv°=-fûÁƒ2ìi|yžíÿ†„Øÿ!O\㣧٫M:§ÛXÙD^§GÛgµož ÂuÀ7M½jñ×vpŸk_wp-RÝlÐuƒ^Û¹vNÃè4Ö—8ޤŒ×ñ¬#¬¡wžïÛ òwÛ¯²Ÿ[0¥GÑ`öÛæRM¡#ƒQ!D°´6Tóth?-¢ý*L¢Ípôµªú–k p !ýʬ6ã n’(ü|½)î‡oÓ6V©Cdˆ«wÑ›: W‰ÿ÷).-ç)uh¤ a(A†Z"§lÐP’ž^µ­=sÔ7–ÏÆŸ/˜Èx3/¢ú^»X6OÎu„Æn<å}§I&ô|hð0½áX/ Þ kÑð/ËM(Χè=a¬](.’Îb¡ÞVÍéùÝ!ǘh£‰ß¼£Ñ+½¿Ðo' :-»¶ Ó2Ûsƒ¨Ö¶·}møÃ¼uÁà ¯™ÈÈ$+C(z¡áÌË:4ðX>¡´oÀ˜ö«‚½óžéVµIµàøŒ‡†dð[ÈŽ •/ŽYw;×È¢ÿ>šõÏî“¡þ{µ3èß!£wí ŽQO´óºjµNËn{û}ý§ýîe=äXcg•D<ð } —è([Ò@8‡,»ŒŽ(’wHÛÒqC:ʱdßÏ}zíˆnzÛƒ‹#Mº†¢“C¯¶#ñìK™‡‚õÍ?Ð)ÓP“ýAO®ùŒANËs]TL±^Lmû™ÿA²pvÀògÔ¥<7¯ƒÏ4}B§óg؞ó×R­!#ƒQ!Dд6Tÿ9òƒú¦4ò\¸y©ª¾åÈÊR‰Âô#óBhT4ÎDÆ2ý¸Á¾2¾G—H"KjjëhØ´›còR§ç³Ï§gS†ë˜zè½êzkˆÝC£‡?#ì¡zUÊÓë5 Ú÷.äg¶œtÁM±!ø“ÑlæÌI}M´Ù|€jçl㙾±h/lÃ1r<´­£Ü«j“Z?AÖ›t½wNi¾0¬³±1þóó¸I×#XGÐÛè³ðlç.ô—¥A©pÌz?+B8üX»™Î†›½)Çï+aû½yÎ(*™X¸xíe¿IYÖ5í-–ÑûåÕžV²ë ʼ†Q ®EÞnÉ3²žÍ²§sžØéÈç äe¾‚Ô'2ášà9fƒ‡oåâ)ägq#B¨ÓÝnû™¬Ç4ôÔû$ò0oÆï¼cæá)x;†ÜLµO„Jw©@QZªŸªªo¡g"†šª•Fþ€:v¶~èM‹®ã[ ¯‰R¢¬§âÃMtjyiä/0äÛèW’*Dlq ›<ÞD'È»âÈeÆm!šoÇ… $kX˶ºW åHcQ.*lnj¼-#0D=/ô P:ù-}pÌÌÌǤ.>HC@èàâJèЬwYzw é°½!-‹¼õG9Œ ToôštNŽÏçÓmŽß£L³ YÞkQ–?TúÂfÒxcÝ€²µ)änØ ŒžËP猰í=ohuò47tp´†º“ê„+ïB‡ñ¥‘ï»TôÁõ™üÆ4ùE(hFÆ£n<4Y¾úÛ¾<ϵš~vθ[Šú§5Ãþ†úÆŒh±+ÊêWµ›IÞºn…,P¶8^ÎŽíßVïVטȓ®‹®¯Ê0ŸÒ¼Œzð|AÚÓ>¸œoÂ]›çäÊÈçÖÐéèŒu³®†àÜbY…[ï=¼h]â܇ëƒÊõö”ý~Þ¡n7·ºÁÈ÷AVÏ1<ÈÊC”k£.|œÁ;sìvzΪ§g⛑—ðΪ&ŠÐ‡Q!Dahm¨þ²§‰ùø¯ld{cªê[v‡È»Š¢CÐG¬ ái—M´Á.cÑ?ó!d|w”±¨Èדó×675vyx¿ùÚD^þ\\S[—û|²ÝÉè½/Kz9¹% ÏšxЋF¯ÀuÂ|^M¯o)ëƒcbnd xˆ÷"äñÔrï̬—Ý'LXÆ¢m,yy\-@½1ÔzžÆ¢˜(LÙ¬©jý ÿ©tO£í<®`öþm”­[Yè‚uÆVÛ¦‡£·#*¼žò»0·Ç-nÕTA$ØOð@Ë9fƒë1×´ÿŽ¿ééFÆZÍ { - ýs~DC é Rev„\QéžFñþËØ±Æ2fß—Ç­·FÑÖ°öq‡¤ÕÐñÕ7¶·’+@[êá|ïþÚü¼vÞ¼eÆóÑ{LX‘Ðx–‡ç °>QOt,4(ÀúCcÅ[‘Ç:õ¼¹ŽwW ;4½.ƒõà3LþÆ¢m´Î¥Ú(BC£BˆÂÑÚPýHj‘6¦j†BÆUÕ· ™Y*BôÝ!ÛC¸¨ËPk[J+S„ˆ–Â÷æ>©Bä=Oá²™G.•ëŸÁ…âsÖ "iðºIæß4¢Nxrú¬UõI^IÒÚpÅ}iIC¡Ý×ÃÑÈëyeÜŸq~2Òö¡Âõ÷…d4jC¶]™ãó9ç¦AVï‚U9~*xüÀÍz¨[8àlr³ðŽ´FíÁ Ø*P=œÊµ îSw¨>ÑX”{ë\Øo\޼î«n7sØ×lP~x0ê¨Û£Lý3°2à!‹+TEˆ³BŽÖ†êLd¤pä{idŠð¤ OÏŒ¯ªo¹²¸T"DeBÃqH=þd¨ά!­Lùó٠ߘ¯¤‘3»;Î×^injã÷ÜlÿÖ1µy)§ÈúœƒMÃ( ÷¬5᜜޽ “‚>¸ùÂ…¸­ ¢‡ƒ‘çÊ­#Ã;-€Ëݦ*g„Ük \óÖ=-Ð3ît9=Ÿ}7›È;rùÞaÃJ8X/O÷šÈëMèpã—F£iz89 ²Càc…Wª—‘5=ÒN0ÑH!|ûM†|ß/ ,`Ã|Óe¦ÀÔEãÀƒÔ=HòðbQ£Ýœ˜1‡6³ˆkel—ͳèœ ¿:¤Û5£ü¹x}¨¹©q|àzç…} X_8WžæÁ'ë…/tïӜǜHßÜÓDMV-Hº8‹LâúÁCôµfí»f˜ôû2b󱂾­U+EHÈ`TQXZª'B.2‘GÍQÒH‡pREÃÚW«ê[îƒl Qÿ/D€¶¾äRüù>äLÈÒJ‡Üe"¯¢7J"o¬¡›k8úXš›4î!=û#¯ymqQv»‚ñ¤ð¸ÐÝ, Ö™uL¬¨œˆwØ(á{Òu÷‚éaHZá>sêË&y4Å0^kƒ^9hÄ6{ÎùlòÝìá¸qá‚WÁ³+)\¬Ý$ä÷üoÊ6FoMi“hS“Âa„àføÆ¦2ñ <cØŸ4kžp=ùÊÀòÄyÂ&Ь"û؃{Ipd¶×–ÕY•Ô`PöŒbv§)†±hÌë]6ï¢ðMýÂDë¢qYÍzDN³Þ±ÏÙÅ!é5·'î×ý£ÀÕ†Æþ7¦a8oOŽ0Å8TÊúM#¤_Ѻ”õZFd1ß¼ м1rX¢çQ§–7‘7Õ9[ÕR„„ †„…§µ¡ú¹R?ò£4Ò)܈çI³·èmR%•Q^ ]O éOqüç+½!ÓJ3BÏŠ{á[²äc©CCtºê\ëf¸ã³¸I–ù‰ðšÚ:†Nê¤ðo&:xD£’M­Þ§mnjìfçË4[òw-À~˜Ðs¾êì„ôÁM°ëMrÞyøí8×D^<–æ§…ú°:¡ ½Öo9 ò\‚kW$æÒÖ‘“¸Õïÿ™(LR5¤/uÐNôµäTÈ é¢©Œ¼5Ú:ä 70ém“Vµí’ÆqÜHª²mtwû›/xÞüëìFUð¹ÇçUhxï%íø1 ècRùoYÂDÊÚúYnÐX„†1[Ú¾˜†IDYÞöU•¿M®Ó—¯í¸`/E%˜Ã–ûi[,g¿ýMOxÛ3QôH°3ŸCÖïg&2,ÛÓöCÜx›ÎÖã>ö{Ðf¤ú _ˆŽË¨§O¸ò¸´(`!H)¸>7ÑÆóö“ͦµmû{9¡|•zh¥ÕöÅ»ÙoçÝmÞØ.j"Oûg@Æ&”7Ž‘6J èg¿ûIðäv;?ÜÚ¾7uØ»]9ñ¿W´ãÎî‡$at¾I¥„<·‡p®†$á­óS[w9~_ÙŽ9ènÛ$ 6‘Áß× <ívX%$rÄu]h@ÊùZÛÄ7ürcÀí‰^ÖÏKð–ß™ÈKìþ&¦çéÛ}ø½ÛÜ®k³ò¼‰6™h0³™‰Ú}Ç›ƒq¿«ðœ‘ž÷áIq_Ï |×aó‘Ÿg;úþ7"^³BOv ´®‡™È¨ÖÇÀŽÐ\˜¬÷¬#³Øwñš^X½^Šwþ¸]PÆÙïɱx67h,´­Ç³¹KcÅ•Šì= ùŒËΞ·yÊDž›n….~éà7_Za½Ï¥þè†F>ÞnÖ·uñôÔ·…myÁvè{ÀœÞíϰû²“>…›R?ÛoЋ&2eý¡çI†?²¤ç÷ô–.~ó‰ ~J›—.ž€¸iqxÌ4ŸÆho4€ñ5òcÛÛM¶\¦ÄWVh ?Ïå& ¨¸ùº„dzi,¬&T‡i5GB÷zØö÷A/¿uP¿±õˆß†é=͆ZæÜŒ®}Œ˜œ…=Ç ÏK…">´ãºáS‡ØH ã¬ðp=Åsžp¾I×K÷Gö[}uGý5þ½­¿~ÃDžÓ¶snzûümaû:ß~Ú—7M´¶}-Þ÷ûNÆ,§íœî9;‡á·“†NƒìXÃÇÓ5ÇOwñ›WbŒ5øM­qÈÇ¿mùÆ­ã¥BC4_#ßÇí7õn”˯ÌÃ(£9ŽD9Ñàw€­óóyÖÛmûSæv;ž‰küǃD§¤˜/Ž·£Ž}¢’íšs“°ÏxÕŽßG”ð= Ó»Ùÿ"sØö°Ÿ‰ '}àœûB»”„~æ3Éþm›ç1Ï…ÐÃûü†¿°Â~ç»îÇÃGØkÈë.KÚy·4Š;ÛÎÝ¿îb¾Ãq„i4¸¡ýf­ãñì9l_¿¹]ƒÉÓÕœ‹sÜ¡”Áë¬Û|`…óãó¬wiöý»xæk ƒžd"y_FÙ{=ØA½ü­]¿Áµ‘ë¸N¬mçÿÛ©Ú‰"!ƒQ!DYÑÚPýFU}Ëz&:åÂÓݽ¥•N¡~xšwwèí% =¶J5B„ÚmÛx¶4~›nõ¹€Œ¾n˜T!BÆpÞÉ1¹“Gn€â¹7áÏ}’/ƒ´+ãÏd¤"Žï|#9Þ9Â.œÇÕ)݉w¦ 7F.2ñ7TÚ3ÄxxN@>ø ð]œ£è`¼ÛKŽõ‡Þ”ö@^¸IÉ~ÕÇ;æ¸Ï¹i– }Â[^ 9ʱ~P—Ûá8j¢CZ.pÑŸ ïG´›Ã–ƒ+4”;úáP4²Š<Œ°ú£¡‡ëÚ ?h¬úJÆ*tiÓÜäyÀDFT<8À·Ðk/˃¨\8§±Â”íè™+½ýàzkÜA#}zÍ>Êöý.^¡6æw÷û¶‹~}\‰uû+ÇWúÏ—R{›Ñ~‹\¡A/£›ânÒYªëì‚#ÜÜuõæq8îóÜóIO}Ðkemªåwh_ä翎u˜F8'"?<|ÐPžÊ‰<Ó• EÊpL{€5ˆÓöﶈØw¬ŸB¾xß=:;ŒÑA¾Ø¿3,77ùyˆÁÇKèfžý4½aûxÄæ&=:9PTŠNxðëRä‡cvžäx«íqýíx¢£gMˆ1ÖøÆ1_¥8Ö ×i·à7ñ äïf‡râx’®±ãAp¹l¢¡ÜއlËŽ¿¡–Q\ƒåÅ‘n¤.…ºÇunÛá«ú4u‚?ævž{QGšº(kF àWz9=˸©·g7οqß{ÐOR{ºŒÂs òô™ƒ~ØŸó È}x/zZäâ|¡U$kØÊ¨.®‘~±õñŒ¸‡•í¸‚^&[®aÓ0×5š%£4pz¨zâÌmÇ•cÚÉ[¸ @ùßnËÎ'êûù3<Û=Éè©dÞïæä¡éÁå»&|¹‰¼ò <2B”­ Õœ$UUßò\/3ÑI'Ñ5t©Îͽ3¡»í€æèS'»„ ´Qnæóä.½‰.(ĂڠoûDªB|Ó:¤ã‚æõÏ¥qÕ>ŽiÙ¥n0ZS[ÇÅ>‹?4@ÚÍe£jrìâ(=Ð"½4¸ž`^÷X÷{ÈA\¾ÐóUhÈrh'^âèdŒÝæfžëijz‡¤¿#ëHµq÷lÁÍÙAxÛÐÅ(ä…¡A9¦vÝ?÷ ç¨"ÅÐxØÕS Xwô4nÛ˜§Á'CCs^è²yÁ6Æ´ý2Ö_©†œ÷Ò åR_#»vÐÞ5\'¿C4>Oì@Ží›NF9Ò ¶Ù± *ö27pcenÇ´Ü Úz~7r: å4ÒDa ]BÊqÃó{Å'L&7=}ѱÚùø<:̃j{â½èï*£CÍmøzQ–Á¨Hz8ͣ݃6ÏÐèô:¹X‚ùbRëbÔ.oß"o§?YÊñ6 ã}<¼÷ùx¡ûÑöÏ÷&¥Tk$C¯PìóOr¸ªÑ£ìëeÜ&x0eÇ´Œf²‹ï7Õz7;åô€c¹Úìmç¿[¨›ëŽã]Œéô¹ò³‘‰”õw…¨\Ô_†/ÞÏó6ŒöÒ¿#O€1Û½ãñð/×´†·µÈ6.À}–ðY[BzîOö|-Aîƒ|\™Ð7â>»I#äÍ«RŒ0±¦cÚ÷ìºËS èèèˆã ®¥-ëx›³íaÝ/È Öé=}#ñ 7ÊŽßè›Bƒ†‹ãýj4%>‹OÒXt²rj"CV*׃ Aèú ¡1õ:¾Æ¢“•£’ðÇ[¬`"ï2®úà&󶞯q§í‡>O¸Ó¸…‡¾ÕPw}=Ò¶Æõú(D Nô1m׿ÙÖ÷N0_œ«íåc,Ú.oßy|;Ú÷×.ý4¥øx2ß=IcÑÉ`XÕÇ´+–ñXƒãè­“ÓSüæI~Si¼e¢ý×ïÀæÖc ˜2£Çqì|ø8Ê#Ûç'±Þ>h€J#ï¸~úL’*.,ƒåÒ1Ìá¦.!˜JÐ7ª¸@èZ÷6·˜Ebˆcº‘ÔU›{¸ç‹&2Þu½÷i)m€º@CzZÞ ïõfÂýl\–sLÎÆÿÊ n¹D¿˜·Œ‡Ç·MÕgM´™úC ííMÛ‡çx‹­möõÌþcü–¤ed€û>f¿ ¿áãaôS©O¤=$Ÿ˜`›e¿¾p3¿&ɾɆÌôÉÛÂŽé8ßÍ1íס%êd¢Ç8vþ2n§:¦ãa÷ÝRÛ?e×\¿§'Ñ‘n¹¦á²¶4‰ %97éiÇMq¢ní¼¾¿Ç-èýnïÎ]•=!rÏágÛ0Ì}oGýÌnüAÖ¨< ýp¾»íÛBà&2²ŒË‡j¼Ïû)èˆu“^XǹÎåPæROœ:ôÔ½Ÿ÷$½6áã!v´'x¤ýÌDëk­)õô¬ÿ ª!*‚Ö†êO!L´Q8^‰ 7¡xB‡a?®ªoÙ2T#Dò mý r,„‹A\°áæçLÒLlx:p]ôÿµ…4EÀõ4>7“0ˆ¾Ö#í)ëæHãîiàôæ¦ÆTuí¦ë%ŽÉéu³˜ih û7Çç=9YãŸ=&¥<µ/Ãq& ¡—²CÛƒ;9$e_´uÆ¢íÊê%\ötL>ŸqØ,†>x°Õ'Ì1õ²sšz±ºá&¶¼çø…<ýXê)@ïa{§ð-KÂpé2äëÞù´s;¦[Û1Ëå„´+ôü¨cÓ§LÇ×»„;~Ç~SK±¬h}ŒcòÕðnë‘tß°kÂù 'Øc¦á|á±@õz„GZzªÛÆzºL³äAWŸuÔs6ÂõPŸ½Æó=eýÐH{̹î/£ÿšÑ±>±Ofúñ)êè ­¹ô÷2îk6¢4¸?60ï³q¹Ç-rlK™(ª+µIz‚^~³ý¢=Š`‘Á¨¢¢hm¨fx1n¬œgÈ">\ØgÈú»!VÕ·\ Y¢oŠ  Í ù„‹3ôÌð"‹K3NР‚ž÷–G¿ÿ°Ô!Š€ Á½›cò;’͉{Ðç5ÇäýðKI7Ü€sõ4ð²IÐSPÐûŠk8Ÿõcþ¾Îñ9“N7£¬I[ÖH×ÕsQÜ <†O[Âá97"Ÿ#2н„».|÷G˜¯ ]ÙŽéjíÆBÚ\f¢0‹Y¾[RpÃeÇð’eÓ½cæ³à‡4eiÄa뤋ïþ(¯ÒΞA¯å·dØÞ¶Lï£Ï4<ítÀYÇ+|èëcÈýµ"yxÀ, cdßCk4”rHÇu¥]Ô§ÂÛ+Rn/ÚºæB•÷‚ë¥®Ææ\§8*Ã~ƒë OªŠ‘Á¨¢bim¨f˜4z/ÚÝÈxÌe¢EzÊx·ª¾åßu!SK5B´›ùÔ·ÌÙÒb¢NÔª5.ó†1; oß2NêÄõD,qïJ0>ƒíbMÒ rL÷lsSã—£k¬%cxãØÕñ›Á µ“3ÖÇm&òúì ¥üÈ*nãpÿæ4Ãýåa‘±âIŽÉw3áÃ<º”e&QÏãr«CRˆ˜“n¹!uNÏqõdûb†º(W^qa(úÒ˜q{{˸oÜ—üíÇw€†K> Çgí Ï{Ê~#+Ÿô¿ª  3m2MCä±iÓözä]Âõ{¬±Fqì0眘õ|ÓzËkqHÊu %uÒ/·CvI…¥ïïПA}¨>wòH{dãTú—áûúüzù½+‡2=.Š„yÏ*¸,çôlèé‡ ëŸuvÚó@‹‹Q.YÌ£Íp~¸¦‰ŒŒ]Çÿïd\'©Š‘a‚¢¢im¨ž¹òO“ÿ.­$2Ñ Èªê[!›AzJ5¢AÝŸr„§ì¹èr‰‰¼Ãu—v¼ái@†u¤WÑ›¥QDlxªÍ“ß”äIzÜ‹›†£“ÓCÇÆ ë†a–ÖvL~IÅù€‰ 3]ææ}KüífŽy»=‹0Ä“Õ'zñt U½P‰¿£ç‘iî~õƒo»Œ­ÑV ¼+sñ.ú(êȳ9äÕµì·Î!¯ ûf´IHƒØ™¤1C},¡QÃ$¶sHó êQKy½À1]œƒk÷pô£¡—r*Çó*¸ë`±‰ÿ¤|ÿ÷=Ò¦í©q¼cºiÓmà8Ö¸3Ãú ±†ûX£%ãhmü;ƒ±FEa½#t™/aÞ:}Yp1°¢.m䔥“ß²x"§¬3 šëaЏÞa}~S¡3¢ûrxô¶ih¼Ù”C^é$Ååùzh73«'N®' ËèY/;¦s9»¹G>óXft¥÷TEhÈHA!Ì$ÃѯqÙ¿ª¾…ƒXŽ®.­$Æl=­|ßk¢…¾;¡÷Ï¥QŽ žÓð‡a·4Ñ)Ù奕T¸r0ú’×¥ Qpvó˜›H!?¼§«qZ­m›I±¾q3*à¢äµY$OÑ×ÔÖ=cÜÂiñÀM§ýîÍ×k9f¯)§úMïó«:¤›«Äß¹x£‡÷<ów”!Û×±Éi¬8Úˆõòº†CÒ¼6õx¨íCÈÜ1Ó­€w?KÏ´&ò„ûFFõ3è0ÏÐ=û„Õ*}À`CtV;$Í%D'êÕsÈ3GâàôEºå~L ¿]Õ#‹WäU–x·‘xG"X¨«òoFˆ0 §¥´2ðÈÛó)çíËŒû½oB® 6ŒòkL Gﲎ™W8pî5´šøál×ĻΎz©Ès—çú1Óô2‘AÛ0úÇCÃq€èæº@õ¸¥GÚ‹s§~…²àšZCò¥‘¶/î1®„òæÊ*ŽÙüÌä뱿Ù$|h¾¶rHÃÃãßæP‡¾Aù²|vŽ™”ëã[äøM)GžÈð[çêµÓeíßÕØ|,ô1:‡6Á5a:0;VUR„„ F…¢­ ÕÏUÕ·Ð9Ãgœi"OY"9f„ìhe"tý¤‰ŒG.v =¾JE¢¨ >3TÎFvâÎIíÒJjÐp‚†¢wI¢L¨uLGŦŸëMä¹·›CÚþ4knjLêPÈFŽéþ—e¸¥öà¹iΨ=ð í2®}GŽeq«‘Á¨ …¤BˆÉ°aê‡ÛÉʉÆÍm¾è.ÄÑ âdÈsñUõ-M] ³J="tPO»A–ƒ¹ßD§Ùoìad,š< Ë Õ¥e,*Ê…šÚ:TYÌ1ùõ4|J:O6ü˜ëbÃþ=Áì¸Ü]¦UÆUd°žË·ÅùQ9æy´ýžÅ…Þ-§ ´\¼ÞŽ/ÅãHŠŒÊ¸ ºptô®¾”“¾•ǘ(b…pkoôèöBŽyé˜n•„79£µæ\žwTh=þÙ#mou"A²ˆVòµcº,ÆI2ÆôjŰæ›I“XÛ! ½u}VÀ±ý**î)ƒòdßu»CÒjznõxô‡4ÃV¥k„„ÛP¿æœw:{ùÀ1íÊ ÿ.¸q4Êç{yŽ k:¦{8G5=à˜nU#’äù ŸõuFÏázðÔŽiïϱ,ž5Ñ>²Á ƒQ!„è€Ö†ê CLd8ª“¦éCo®4´c¨‹O«ê[FC΀lé%õˆ@]œ òw¢>¶“­Hï! ¥ÊUìÑ/7@&H¢ŒØÃ#mšã“9½ÓØ»¥“?R¦õeyÇt•©>\‘_Ê+ÃÍM Ãû¢CRŽ3– ´\6Z_Ì9ÏÏe\ç\¸ºÒ?ø¬iÁŸ§h¸àÕÞ^Jã€Ií õcZ\æu¼ÿý”çS¦2)û¼ólêD‚ŒËà®Ñ”>Ï o¿WzÀw„ëyO@Tsðk¼sž]CËÊ(©s†;¤aD€Ûc•‰A„F{·Ú¿pÌ2Ÿcò;óÎ?æü~¹:lX©Äß-áxî <@1g¹öèÒ_}›çA]<ûCÇñÌbh?}Ô'ÆÛ>+«};×õñŸì¸/Ï~õIUI å$„]ÐÚPM/[«ê[.Àõ_ÆýT (z]Á ½ þýÓÐa¤•gP.?IM"mP︰Ãð¿ý¬,%­dÃm×£Í?#Uˆr£¦¶ŽžwvLþfsSãÓ)fï&ÈŽsÆ¥häƒüù.€ÐóªË¡.N½Z¦ÕÆÕ`pt™êÃe3óÇÂÕ½fܼCplÔ÷mmtY‡¤ïäœõ7LdÀÑÍ¡ë‰:ôsÊù£Ç=ø]¤—~n„­Ùʸ(Wýtsì÷rmoh/Ÿ ïôr7ÜäüH7 ÒÑÙo<²öDÞeŠw›€w|θ{ **Ÿz¤S½H×ñ*o)¬nûÝ­! I+Ò tuHúvÎYwõ¼"ÇWÖ€Cü ÒZUÌtMÎ>.Û›økP·¢ü¾ TËz¤ å4½SÖ¥øî®cùPî? ŸÇ3|–Ë<ðítÄõ/—ˆ’4:~Àˆ$ø¤ ßÉuü6&ïÍô2*¯ö"d0*„%ÒÚPýDU} 7®v1‘‡-(eCŽmh…üŒ²àæÎH$|‚a¥&á ê7ŸúY¡¡èâÒJn¼ 9mû©B”1;A¦wL›ª÷󿦯ÏkjëèyËuƒ^F“0užÔ~)·Ê‚ò ‡É“¿P¦mÈå;ý-t¹|Aßw¡@óä²¶4uåðdæ¸ù6‘7÷RÎÛ3èÇÊ2L,Ê}n\úZaŸ¶p;‘!XçÌ™Á!ÝT´·Ò±Žtf0Ú×#OÏR®¯˜Ê3}×#í2î ÷M¡’EHÏŸË­@Ñ?0ªâ<öûÑ6Öø›Î/gQµOeÞ+€±ësϸùæwÅDQ¤Ädp]åz=þÜ7fÒ5nA¤{hi‡l†ŽÞuœÊâŸò®ëz½yǺø«Áh(i³ŒœâÒ?O ov=œ³€za÷Rè;^ ﯫJŠÁ¨BÄ µ¡š Ò×VÕ·ÜŒëÞãŒÂaåÖ³B~E™Œ1‘‡z"¥éÛR“è ÔŽƒ8anó,Àë‚ÒLî|lûÖ¡hÇ¿J¢Ì 5}×wƒÑ5µu‡xžøŸÇ1ݸ2­/®ú˜€rø LuÒ×!ÍìÆ=ãÚæ¦ÆßÊpÞŒ÷9êý0³,áœÆ Ouñ›™³ÒXžki{¯Ö2BZª¿Ååøªú–‹y…ìe¢0…"èÕfk+“@9qqƒÆ£Ès«˜4Ì<Î!÷È^(¡ýÓåZ1ïý¾‡¡{†uõ€÷y`ïáê oÆ~Ó#ã<¥Á<£÷ºtXDt†«[kä²=eј„BLÖ†jD ªªo9ÍDGéyE†£a3—•ÚýÛï(C†ÚxÅDÞ}( òÊXîâ3eÁ6Ä…#†o^Ü^yªu)S ƒ)ñg&Bn€kûL!*‘ÍLåxî¨ã˜ÖÕkûweªKWÉ_ÊT•¸™b˜ï^F¤AÞkj븷·‰6ˆåáCý^L•’NB:\ò[…Öç1uÓ®^ðw§þ“Ó6AöTw(Êf²X[GtCŽ0¥‰0çœEf&{ç475¾†¶JãÌUb&Ý鎢—Ò.~·“C¶®)€ê\çÊ¡yŸ›à˜®Gý¿dHë~Y õ6Bˆ$æÐ?KuBüŒ !D ´6TÓÐp—ªú–Sq=Ù´ ‹. 7¥¶ò'P¦œ¾n…aÔÆÙ+å}”ý¯R_| Wnô-ék…ž`±BÏ2F(n5‘¡¨<¢ˆJg z×Á5µuÇ775º,ä¸zR+×ÅWÏ åê¦7öBô°0]–Cêéè3sïÇÐw¯ˆËÕ&:¤•7ôÀð¤_…¦¯ÀwNks4¤Mæï*´>?aÜ F¤—Nô•ôÝôHû±¢L@;^—¡&:$ž7m뽫j¬Qqü®ÖXô2×`t>ÈÚ‡»øÝÇü„NÏ2©“ÓuÕŸø8Úù¥ÂÚŸ¼? Q>È\… F…"EZªÞ|›ªú–p=ÁÈp´ qªfÊ ˆ¿¡¬Z{œ‰ÂHRÞ7‘‡ ¶ÿþ¸ÒŒJ¡{Ò(½éÍk¯sÛ¿ûZ™KU«¬¹×D†¢ÏH¢Ò©©­£‡¶­*è•Ùßo ¹3Ãgþ¢šö'Êuì« ,Ë/ÌÓ*‡ÄÉÝx ß*l¸Ìä¿nHëm^¶42ý^íí/”ÃܺO…ÖçÇ<Óo¹¢ ï¾˜GÚ4´e2/>ÖDNòæyÈU&2\¥§ÓJ7­ÄC _¨E–ĵsLüH0M'£è è°cŸcˆæ¦Æw  3×C€={WÃήÖl¾öÈSHë\YÌ™'˜Ê£ç¾"^ÿ²€CºÉ£¾ Œ !D´6T?g"ÃÑ•qå‚X£PõåL4{‹˜ˆz𙉣>µÂ¿ùoŸØ¿¿ž\P‡¾ á‘wÌö±ƒÚ6©‚Ìn¢0•³X™Ã^g·WQ™Ð£è‰¶BDìVó0†Ýt1u],W¯(¿H¢½º‡¸™Y‰­)ß?×ðÔ ‰Ëi9<šª¯š(L5=ŽlnjÛ._AT戮ú=WÖzÇZŸ2Ñf¿«÷lÀ*œÁ(ú2®-ïq‹m€ëáBöËáñœ_¾bÇÚ±Æ85þ2ÓXCü´•OÑFî7Ñà8ì€t"}GãXï¢×Dmå0N%®6&tQ§&zô»ô¸ùc úÉÂø«ê¶!:æ'Çt!ÖœUÅ'BB£B‘å7ò®GÃÑ%q=²‹‰*S.ŒÎne‰R¡Î0ôÇ7V~µ× v²ÈO.ºÐ¸´}ˆßÍ”ÃÐN=……‡^VzÛ 7ËNc×ÓN|gPñ‰`¼rú¼W¤!þÂøÎ[ÕÔÖÍÎ †˜é\ c¦-S=Ê€öÏÈûM|Såðy¹¾újîØ–²îè5ôMÈ[wÚɇÜ4Ô0¡SäYù¯¸¶LÐ;ÎV‰•íýKô9OãÏÕo±ÒOûm<°”çXõ%u…¢à 1é‹~hÇmcq·9Ö@ñ‰Ôß%?Và;Ë(©t†™ø£t$±±éøñN1ïÇu¢ë ¢/×Õ³ös;¦+ÅÈ‘ûY.\347Êb,_‰£Ÿ!:æ#Çts÷ùT|"$d0*„9`¨UÕ· ÁõpL#͈Nèf'Ï}¤ (ô†ÅÞ§ {Sêâ¯ÔÔÖqC|© wÒ³ê91Ó}éø¼9ËT® ÄåzrÙ5|ÙxȲ}ç eT§C Zß–cƒÂ7jq\.Hð–ôú ä9+o475~mDuïX-"]ºnÍÐ;Î[ÁušÆ#®£<ìº3¤©`Agð¶ºBQà±Æ:¸—à-é)”ÞŠŸ±¿‰±†BØúá:?ÚŽ74¶/oIŠm,îÁ›f £è–Áeé˜÷º í¼(F¾®oóö®ãæÏJÔQÇ<½WpýÄÁuÍùøvío*ñƒ(×C@ ÷ET|"$d0*„9bªö©ªo9×# ôè2­4#„( ÿÐ 9}Ú»R‡²G…¿{\ƒQ×ÅŸr=©ûcºÊQÖ3 ‰âzP펴_‘ï;¦ûEå&Š,à[.‡ kâUäÞÞ~-ãöæj0Ò·qÑ ®Ó·@NòH¿§)žÁè&iÇȳ(*·÷°cnž·âZúÅëÐ>’fg¼cº‰Û—?4ÈF[æ·{P̤ý;𠾓C6†He®ëä‹Ôw3"]_Çä¥t~lÜŒ§æ‡<ˆ~æÏàQ®Æ±S©oeʇŽé ï˨øDHL%!Dþ´6T9ØDÇÚ‰’B„ CŠa¿…þk?‹ Ñ95µu<²K«`Iè`õ˜i\û•…ËT‡® ijB÷åê¡ÜÅxjV#B¨—sHuA}£&rm[Ð3Ó››O–±hpímö2Ö‰ëaŠEQïCY_²R+4ú †WÅã«£W,P_˰¼>FŸV7( Ì|Œ è©Ž^ EßqžŒESÃÕ`Ts¬Êá‡4ôHÚ ÿ¾kÌû|¹½ÆîKôKw[’RÞßu,¿d@úé–Ás¸_ü‹æBüÁëŽéV 﫨øDHÈ`T!¢µ¡ºrª‰¼]Ð×KÒŠ"0èÍa?Èüè¯N„|.•QÛCf¬pÔÆü½«'µejj뺕¡þ¸)ú»cÚeË´NsH3 ꇌ“Ãul©.(÷Hûd…æ¦Æ‹ ¿J•A¶·ryþÄÅã"ÙçîÙÓŽWV­ðz}•gúã ô®ô¤æñí^uƒ¢Àæ‘–!ç—Á8c„¼ì¦Žë¡Íù¤ºŠ¡Å¸9;8ÙˆF; żÇè~*®ÞvL7'ô³` ï°†cº¯QV¥„QÓñþË¢ŸÕ²xˆýö¹¬‘jÝE”+cÓ-‚þu¶çÿôHÜWÅ'BB!é…"@Zª'pPUß2Wz{á^µ4#„È‘ÇMNúôQ¿KBÄf©Àì\S[w0Ø•øû—ŸCošô^36—Ä;ž‡‹ËâþIÐÍèŽþ' ±pož v ŸÃEì‡sÒ½†¸„š» ï|y¿ÙÔáÞôñ‰š¤?(£PÆ<<׫ВÒ^ üXv®ïØŽú¡¼/MfÒÞ”›ªq=i/Uæ:¡ÑèBÉ×Ék¬0Ù÷¨ªÂ«ö0È)iÓo:@£õçïki¼ŸÇ-~„ŒRO( :ÖXÎcì÷¤ºDÃ#áý™Vc{ÑÁØë7´éëðçÁ1“nLOÛHÿ…ýï^0u½`¢C¿.λ8N}'€wXÏ1]©^Ñ_t¼ÿZ”ñÚ>ëy­qF´»y5_eÈXþu3ÈÕ9å{3 Œ !DÀ´6Tóä=Ü[Uß²¬ˆs2ÝKÚBd½DÝ 9ýÑcR‡nÔÔÖý —~·X¢¹©ql ïr.C“ÏÙÁ”èI ïü6žÇA—pê뛌@lxÛ½Lü 6ò~CƒRƒQÖ¿³sª6Û@¶vHw ¿yÞ1O _;R½Sb°ân[íe&´ó¯¤¾ÜÙ¸G Ú[›O™C£¸¸£3ÑKÊê2Õ 7š] FÙo5Ðþ*†•FýüþÜÙã6çáëîyõÍ'ÄìÈ‚yU¢=[:¦c›ÞMÆ¢™öÉ4äØ~͘IGºÞHÿ£´X0,}\ƒQÚ#ì¹Ô¢ˆ{¨”sŽQkO<ØÄu)ƒêþ&?ƒ¦I ï<̳©cògKük„ÅÙx:“£~¦öÐë*ªI¸öÇÛW×8¤Yßêù›WñaÕÓýŽé¸^±KÎyßÓ1Ýï¥ö#ríÇuk=”“{dü<®þê®â#ˆ²ÅuÏ`þ͇ƒ ÝTl"4’^! JkC5'^·Sªê[¸¿¿‰ R´¸%„ˆÃÏë! _yFê"q6†Ì똖!ø® ð¸q·ªGz.ªUâoï‚ïðŒ&Z\¿$cÝl¥ÄßÑ£Àg—“Ѓ!7d¬íÓ=Éðm%þößs-7_‚(ƒìšÚº Mü°´@''ÚÏ14 ÃOöŽÛ^ ‹ýð^?çPܨt Au˜õ¨SN,ê˜î‘Œó9§†“ —¢/L|o6ô¢1êïW9´7æõ&sä䷔УO9öAdŸ¾mì¯êü'†?à³ò»Žú¶C*‡òRÖ{Í¿=os-ÞéUQDÐ}a‚Œ5æQ‰ý17¥QRÜýãQÞ‡Z°¬ëa\æ”s‘WTäNp.}ŠCºÝLš>/ œ^*¨žî6‘¥‹¯Q·¯Ä»OÌi¾ìzèøQä¹5ÎZ‡q‹D‡:ô‚zúá¸3ÓÐÒÐé7xî£&ò¬k¾t«äá±Û:Qà<°*fÒ¡ÈïPu³¢ Øö'˜h .‡¡~^€zö]Fmk"{«ÈDˆÈèB”­ Õ¯Cþ?ç†üÝd¿ &„(\hã©¶¹Ñì.cQ!R£Ö#íƒÍMøN4bõ 6¸¦¶®Ôͧ6ñ‹“™`7©ÖrLþ¿R~dC°ÝíøŒÍÇ%3Ô ƒ;&o‰ñÛ»ŸqPÇzØÝÏD‹üq¤Õ êåOÆÍQ;wɃ}Ê€a6_/ÃïÔ¬ŽéÞÉ8Ÿ«Ñö¸Ç!)7QöÊq,Ôϡͽ^¢N&wohë£_^=‡o=aÖ©Fÿ©é!æÏÛÐÓûy¡¼“ ]™ÃóV—¨†ˆ3“cºr˜ ¯¤âŠŒ’pyÔ!éì&ò¨œ.ó+Ž-ßR‰;דqÆmêx‡ïâ5ÖS«c{"Ë™ü¼ámÜŽÅÏùDP<&'ýnÜ«ùâºxPNz¢…múçŒ]÷¯_›×Ó§À,¶ŸË °˜A¥&BD£BQF´6TÿYÿ¹8ä\y¡BB¯$WBÖD?± „^E[¥!ÒÁž8÷ ><Ä÷jnjüÄÄ3è›z‰Û¬ÄgÑ0æ?ŽÏ¡aÞ€ UsˆcºLä9´T|B’—¡>6…,æ˜6Ž( §¾uxƪh£Õ94!z”s At¿ W}ÿD9ôÈ2£x7v\ŒùGŸô­)# ‹é=’‘a>¹©¬ÐÝþí)¦Ë¸Žq£y_‡¤/¡½}ã÷×{dó´ÊðH/Uå¿päÏ{Ð×Ѽ¶ñ¼Ç½h cT5DqÝÿ&ãïÕ²¸,T`='=žvk]NÃx¶Æ!éCyD:(3®É ®Ò»æˆ ÔS§£Ž÷̸M-cÜ¿s ïÚ8 Ð_Àå5Çç­Gïòëg>Ž7sªK7:¦Ûù^8‡üºè‰ý²"‰R¹É#íávü—vŸA{½TT"Td0*„eJkCõkÃLwgm2O”f„¨HhˆÄÓös¡_¨…<.•‘ »÷z˺9àwó]°ß#Æo¯ðxΙYÇà Æ|§öÜh cK…Æ”9>k»P•¶>¸Öpªcò·¡§Jý± ÑêZÿ…¼N“U£± .!ˆh8õš .ÒºS2ŒÜÁç•›³9¤»Ù”Ý=ÒöÉ0Ÿûyæ5o’Ö¿;¤ã¬½ððÛØ7ƒöö_ÈOŽy¤—Ñ̼[¦Ú0šò7},.ç$p«S¡çcó|<Ÿ†Ò''p«T3DÁqõÀ6cÆù<¨àzNZ_#¿«K›ìC®Ö7Ãä›Õ<½¡ñÚ„”ŸÁÈ;E÷6HJ×°Çt sd†ã|_æ1÷º å5Þ!ÏùKï,b]™6§±òÛlŽóþL½ð£LÖÄes‡¤wâ=T÷*J„G]q=øfÔÕRl³Ù1•lòD°¨r !D™ÓÚP=r„îÿ0‘›õ±ÒŒeÏ'v!`´ÿ• —@¾‘Z„ÈŸpô·ÛÐ*¡B¯Ÿ?y¤ßÒzŒëk<ø’ãsæ1Ù,Š^j¢…&âz_ø—¡y½ÒÓ«`)Ð‹æ Ži]6 \Š—‚œ”a»áÆ‚ËFưÐ;;OÃÝ­“ÔÁs8:Þ!鯦øžm¦„ÏFÌò• ò D_¿9¦›-áöæó¨‡N×ȨìšötÇä×ÄÔ ÖoñÈî¿‘ß…2ÐÉÌö;×͈¿ ÆÝËT{N†¾¯ÈÚ+—-gL¸8[Ý„ºý¤ª„(8®ëPÓ¢--’Q›]Ù¸y¨ ‰Yk|eܽv5dXvŒhQï”ìnPóô®'ŒZuWʹ¦ ôô­ç\ò8Ôõu3‡ùÌ.wLÇñ±«³BÍÄå°.[ç\¥šÓqvŒôÄõÑK“3B”Þ¿~oüÖÈéy÷VÔÙiSh<8̨Xóª¤DÈÈ`T!*ˆÖ†êñÓ!Kà?W5ѦõçÒŒe·®ƒl™mýPÈóR‹ÙSS[·.>aM‚6L² Þ·yÜ‚§Ûw‹ñ{oSuizýÅecÇäÏA—O8¤£ªkÈV.†5!ßÝRÒÇr¸48&§1V“C}|—QŽÏdHôí3èhDë²±ÀÍÌ« ÒõoÜ êhD{“=yŸfÐã3½¸x¦ÿ§åö­²a8]û’Ú ÚÍ´e–_9¦[2…¼\`ÜnÐkÐ Ðí¼)—ŸÃ þ*‡äô$õ¦Cºs=²<仩“fÄÍð…Œè¬_úÉö/¿%p;Þç1è~ñŒÆÿ= Ûï¡/4è?\5B”>—k2h·³Ù±F({¥®!Ò—J!/®ßUŽÛþ“æ7u²q¢ËÁ€? [$†§xoŽ ÊÅìY&:„èBÛø}á”ÛÔ@ã€{w:Žÿè9Óçð×>Èÿž)ëg}\þ@]¢gßñŽi/Ä{¬šA¹&è²&þ¡Iß]”xÎÙ¶ïFÛ¨J°¿˜ÛDÞ€WTñˆÐ‘Á¨BT(­ ÕOCn‡n^óÔðiFˆBò¤2'ÚõÈ]ߤ!rÅçÔ67Õî,À;úµÆ16¢ÑÉ[Ï¢‡©­’Vî¹­‰þ]qZlnnj|Ïøy®ÚÉDáØ»%¬lÝu v3Þí]Ç´CÓQ#÷ÍÒj(¸w\þí˜|(tòI:=äóãîfQÖ´ŒF­ñ=U¬æx‹ÓMùòºcºÐk¿Û ®\ Fg¶ÆôI¶7n¦]昜Ƣ÷ Oó¤TvìWy°a#Ç[œá¨é‘unjÞ—†‹5åÁ¾ÍŒ(¥,5É…bç&Ýó(ƒSÒô°n7ßGCöMè–G{Œ‰„©=ÓQ«aÞ¡h[K¥ØnçÄåãoÈß=Ál9NIz²{—[“34ý]ÈÓL)•]ÛA0×ñÕj‰q»GïŠÛPË"Z–= Õäq F艺¿hJmj\®ö¼ÍñxÏß=ÒŸãùüËðƒRÒëÿ׸¨']—¸‡{šcòÞ&ZwI͈ ÷æžóÁ®uÀ¾Ÿqû×+=oC/ÎO'áÍ÷Ø®M¬ ÒE@£BQá´6Tÿ¹ ²#þ“!ãè‹s˜ 6ÜŒ: Òíw=ÈŽ"jjëh,7Ðã7Z¯o¡s7äKô‹—׆ß=ÙãY ‡D/'u –3‚}¼ÑÐà:,œiüÂIswXR¡ZqÚ< ™Çóœ@iÜ …¸áx¶S0¢¥a4fMíœãñS,N1îžShøXÒáéq¿M´¹³“k_‡úõt¶^qLǶrKáÍqO†»§÷åõ¸]’† >cí¦Pv>ßà<]¯’pÙÑÛ”¸zøyíí>,œèù 4ú{<ÉÍxÜ‹ü4HÚV£äXÐP?©TëÐcÖ8”ÇÑY,_i]gû¬¤ Û8žº@U@”/{´Ý{ÑÆ–Ha¬Á17ó—NàvU fÍu¬Á9éa)”݈« ¬µaã“,;ê›{[:Þâ{ÐM$€]»º1¥Û_Sfê:Åø­áÌcÇï%Øž¦‚oËÐÇfä1Ô…Û=ëÒc¸´xÜ‚ùç×É|¯u4ÈŽåg ¨.Ñ8Îõ`ÇÁ£ìx“p]:ɸ–þ r¹zUá1^ùÉó Ù¶1ÌåÀÒ¬áAö…s©HDQÁ¨Bˆ? ±dd+; á&ϽÆ}ÓW‘,/Aކ,Œvºä ˆ¼ŽÛA|¼S(ÂKÚSß¾q¼ŒÒÛÁÃÏ¢ç—ËkjëÊkv×›pƒ Òl"ïÓxäçhŸ“óHû‘ñ7Œ¡aó³xŸÕ<ô15äJÌç‘—kñN£=ßg?ã~è‰ë#\ؾ'‰Ðµ¸Ç\Ö€ä zrž ÍVìÉ~¯» ³÷ tw ¤wå°1.ôŽäº¡ÌyP¹‡~Ð#-1é鿨„ÊkN¤h ›Té$CQî‘v€õpØ=ÁöÆï€Fz¥qä©(¿uLd|³‹ã-&wo4m:iüÂY&ÆûæS^<€á\J­¥áq첤ҮW¼í,S!ï£lnfèUãQÛWÕ@FÚòÝÙDFôIðß﯈!BcH=‰ö¶oßPÜ£/„óÊŒßA·ö$éñï ´GàÝLÒP }CL_èq‹%9Gž·k}Ë‘Æw/æ4n· ×}ª¿škW ôÍ<ð?Èq·9ïõºSáØ&åø„nG#ñ—P¯µã—µìAôÉëý¬jÝC^äÚ ¤¿JCîRBˆ)ÑÚPÝj"Cˆ¦ªú.ªÓéö~ú~‘)Ü€¢»Ñ.ÇJBŸpô4þY w¥që^éw®©­ûGsSã÷]ý¿™h=„rƒÈg±–cšÍq/†t¿´Tƒ<ë!Œïzˆ‰é}x rmúgÈ.æ,ïq6/s<MC?z†˜X‚>zZ]ÖC|=BÒËÆÑ¾Ê@¾_E¾škˆÇmh`È…A~{îùáRôÑN/Ütá¡+ÖUŸMÑ÷L䤈ЫCÚ-☾‡}÷ Ï‹X´(ƒb”ëææ&Úlò 'u^x ºÛ3=Ë‹ ÷ƒîééd¨5.µ¼ºÛ9æn¶?ë‘ðûÍA/<ÈÓý ÜË×€›wG~hÐø§Ý&òÔ=c³Ï˜ÛDÞήDž)¥ŽB÷pgSÛþwoû]äsÇÅ(¿il¿y½úÀg?™@9nûŸ±ËälÈþxÇs9ÞAÞZKÔ 7`·³ßÇ¥Œðù®}nb¢Í·y¼uO[FÛÙ2{E½á÷†Æá?˜È`a:;î›Ï~×V†,–Ò+óy;Zƒ!ʉ»ì7Ðjà7Š‘<ŒuU̱a/ûÚ²µqóüß+r€<½À½ÞôHKCÑóùM¶c ®!Òèîk«C¾÷´¶?ãXãÄÇl,»mûáÀÞvžyÛ³ü>ŽQ~L¿•køÀ8Ï~GM2qx°w¼ñ;@:97 ¬~)C]q\É=¶U=ï³7dWŽâzy©ó/kP¾6ä¶]'qàå<LBc¿—í;íïy+z8~÷ú®ÿâX²ÔukhJØÏ5´ÇÉ<ìÌ5Ù]=nÃ9øŽ¸÷㔣ÎC=ïcç£>ßVŽõ‡ª+ ô¯ÛØz™k¶¿êüvLŵ: q]»:ߎi„ü!„è’Ö†j..q¢viU} ½Èla^›™hñ\‘\¼àF)C§Þ*#Q!Š=–à²Ç-FXJEÁwc€F Ý\Ê¡›×èÉÎøy04vür„‰6éÕr”‰ Qéµ™‹?,,`"cHÑsZÞZèÕdp#ÄNôñ+=\™È»§¯Çƒ­­|„{Ò€Œ†c­>è½€‹Á4Ö † æ¦kR!¹ŽŒc Ôg˜èD÷Š÷àB÷®V>…>è)õ„% “õƒÕ96f»§¡èz¿%𬃊ê]ùþÉÖËQÆoÓ`N"ž„û±÷ãAnòÒÈîW[ïYgµus5Û^§OàUøÌãL™Ã¶gëø†ž·¢gÐ;ì[öû@/ üû…›Ê¶™¹lߺœ‰àÓïw­ µÈ(dõ°yx+ŽA0pÎgñÈ ½zXÂïn‹ùxÒó;0‹­ïÇá~lgÚöö–mo¿X½ÍhËö¶Ší÷ú$PFÜä>8¡:ý6ÃŽ›èP…/ š(4ø¿pχm¢AÐGæÿÃÓgvûXÕŽ{‘T5ÞŽ´}},j’õèÊ^xßUê¢ yÜÎ+|½~³O¦—`zÆkdž¯ÚoÈgvž5kÌcûååíÜ¥wŠïÇyÁíÈÓ vÎ0•ý0Ï¢]¿ã^cí\ÀgÞ¹°ëvEIßIÎIðnŒ rg¾æ³sµÓíü!;Öà¼ÕŽÑzÚqûûÅìØ~“Ìþöþˆä¿Õ¿£L‡s^Ÿàm‡•©®8vç:Ã3¶¯òa†vëZ/Ù±RÛüëk;~ŸÖ¶©¥l¸±·&ÇÇIt=ÊDû}=ïõˆ­p‹Ÿ³ß¯ìü´‡ÕÏ"ö›±¡q?øšÛù˜ÏÁ*ÅÒ@—åØÿÏÎw^·}óOV—mó@–ËJ&:ô™DØío!»l-\„Ù¿þ†:¼»í_û¤ðˆi­øÀqÞéF£" d0*„"­ ÕœLq`xU} 'Õ&2åÆülÒNL°“q‰ÞŽvö‘T"Da¡Ñ†Ï ýEzY»1@O™õ·áæSsŒßsc‹¶Nè5V4~Æ…q9Šž0,ƒçmHøÆ„nÉß=2ÔÃA^ >~†>h„L/®U Ü’›)¬dÅ x‡‹Ü"ÿ ÝTo’1ØbŸº¼ñó¤—o »°>UÈ·‹^W6Lð~3ÉO'7¶.šÂ¿Óct\²46Ø"°ö6†¡zñç• Ýr)“­gÌm{û.á:Ípµ›&t?n’ö³’4m^Jt·ã:NoS4Ä¥±ÒÜeúš^©ÒeÚ†)âßøó’o»¸ñ7@M’ù;˜ÓÒƒß{1tõ½ kº\`ex?ò5ÄD‘’Û¯d%+hô4Æzj‘©Á°ôIŒ¾eÇÜåÚ'¾…ö4Þn’9”L–¶’%<<¾SÒí ÷ûÖÕòPÀ4 Ý–ë\·’4™d ']tõ™]ÿ™®xh~Œ_ƒ¦ÞR*jo¢MpýöŽûפàú"ûþŸTR"$¦’ „B¸ÒÚPýäÃnÒ7xR÷9iGˆ.¡w"_sR?+ÚÑæËe,*Dq±¡{Üâµæ¦ÆÑ|õážéׂîJíi=sr¥ˆº¢Að¿’¾)tÂÐŒçPã ;'ámu2}p±™›³ ¨“«M™x¾A9°N^QÀ¬ÓËöÈÅxyÇ»r1}”¾ä%qw eH#•³ ¨Oz’¡G™gÖÇ$OÍ7  ß|®¦Õe™Ò€Š¡ˆ_+Ã×û'Þï •²(s8&TÒ¸+Ð|Ñ‹à5Ô' 4¶¦rU­T¿Óô;&¡Û Oz @}±ï[àWà§Í!%ýÐ3õÐç&òœœg]z —= ZŽCþ¯S*n\³© 0k{tßG”92B‘­ Õ¿C… ¡—®6ïT7›ÿÕ&D%ÃMKžŽfˆ*†*œmeäFÈ·Re=Íˆ›/\ˆa¨¢—=o³GÌg~o"¯a/HU\ð®MqããpHSôѶÁðyJõ’!zì—é„FêÊlslS,ÏÉ …9eÐRß0†¡“§ƒ®¹Ñ„kŒN¯¾—H—ìë@{»9¥ïèmù8`ÐPö|5«’Ët.kBî/“WúÅŽ Tº¢Ú/=ÐÑ8J!g»fx eÈïv­³©Ÿ¥ÄGT­2ášrn)´©Ëq9´€YçZÎ&ÈÿK)ëç2\N \4jý&€ºÄƒÇE q}ò}ŠºM‘R›`䆧ÿ-,mÛ©Á!ƒQ!„©ÐÚPý1¤²þsVÈzÓM´!¢ÅAQ)|b"Oa £BÑ5 'Až¦‘µÔ#DÙQë™þÚ¿»ï‚þî5µuÝã$`è%éÁ³9Ëo†<§fŒe7ðx‚úÂèƒF¢ë ϯ¦ùÜÿ6\¶1Q¸ãСQåÈóSFà}¸8˰oW »ÔývÈóSX¯@”ù·& =}j}¶ßý  Êµy½$e¼‰ËÆÔÁW »LVx3yNÍqìF C/*¬ýŽÄåäÀ¿M× 'ŽÉBõhÎñ2×ú¯/@•ãp+;'ÙÍi}¿ÍO¡Ì^¯ ~ñ<­%e<ø‰ÖržÌH?Çàrf º¸ù»! ºÄ9à>Ÿüd„H·Mp_v ;ïÎF“8]%"BE£B!R§µ¡úWÈC£!+›È€”aB/‚¼* ‰2‚'JyÒþÈò¹Pçw‡\ ùBê¢|©©­›Ù~Û\y†Ñ.*¾Vs˜È X,¬Ñè:[Ö C=oм¦îqÆBz8 —ŠßÕÇ8Èú6´¬É@' õ¶¶‰66BåDÈ r3mW¬‹5nö„ºyAc²u+}CïO/Å!rpÃ7yˆø*€üËin e8Ñn¾QBÝxæ¡jäsxF:yÑŽÆV§·EÞÞÐ(Úí»b 6°ãŠ¢ñ× ð£Tš¢á¸7DCé/í|t¿@Æ«œÏéùÝÎY@N ¸ž½ Y y½WM.Óºñ¡ýÆù0¼õÆ>‘œ> <« }¾JVk9íôs$.G¶–@o÷ûX—蕵¿ Àëiül"ïúG©Çµ Ž5O㌎¶‹¢IˆÐ‘Á¨BˆÌim¨þò_È%ñOs›hžZÆIC¢@üh8Ée˜ù*ÔéþAÆ@&JEBT !==ÒzQ¼¹©‘2zÞ¦ÖñÙ\€Ùr˜‰CßnˆöGȸ<襂Fã«*üf®”vè²)èc´‰rܘ>>‚lü )³0ôS*±ÑÜ&& ,á8ùºÆß€Žèet'…9 µéafÝç×#m{{0c}¼Ëj›Ð7p·´žö„_¹Òàr)ÈÙ!·Çv|k"OÎÕÖ¨FˆJl·óî¹8 l=Y‘FŽ>€žxÈ¡.ð±=Ðl ù4°ìÝjÇÏ©Åå‚ÏÚ;]W‰J³cãå ÷˜=ÎÁh ¾Þÿ±wà“eâ€{–œ3 H” ¢ˆ E‚·FTDÉêÉ8Ž\PÏüŸça<Óé™`†dÅxHV‘œóÂ’–œ÷ÿ•Óë­œÀþjRÏÌû>Ï÷Ô°üª»ºªº'}Sí¼yHýó…òzs{ú#ý(ü-UýÁo´+}î•äªöùÆe[[]Ÿ!œ×D±]ù>lP?@>»|-r´ ê$Œ0tsœysÄQ{E¬ÿ´VÑù¥rZ4}A(éŽÊL×òC” šV©Y!æìk">[Þfþ1]ëÝ]ÔM׎cÆ ºMz}C­ÞX#§bù…Õ—ŠÎ‡¢¿ª@_\\t>Z"`ì7õÃs‹Î—±Ã^‰!%H¤Õz^[ÞJvýq{Dú‚!Ý}Ø_j¦9‘>$߬\ubÄñžTt’{šxŸVp©E›RÒîlOc1Ni•Ñ”9ÌÕ<ÓªÌûUlL2ÿlQ”£M'Õ^½%µñ·Q=ßµ#žmýú¸ÿHâ¼M«§ç„¿/:?Ä–ôú/%¯ní¹vÿLEúé¨ò½ËCËŸ—×ß#*М4ž»E›R"—»< ϱEþê¸'–?ÌšÔkãͯ/Ïû›+Ò¬ô~"ýxïß"rÿW¾·Öë½yå{Ñ· úGá}•î`õŠˆ‰¸wÈÍI‰µéÇÃiuýs\"âkÏ”oò>ÑÇÏÒk‘¿‹Ø*öw™žgH ræ8sVÄ÷ÊHÓjPé6¿é¶@$ûõreÑùÐ3}€œVÃ]%æä›ÊÑ_G<¬‹€Z½‘VØ¢‹MŒË‡â)éµ›-:+Žg‹~L‰šÛE¤„K†Ð郡jÎö€”É1éËØ”H;Œ[m§Õ¾Ò-±6‰v|³ ц#£Ø¨è|@xÏšV Ù"Ú‘nÃuW1ÒqG¼·œ—Ç ¡ é “OGlí8̳ؓŽÓ÷‹NÀ¼ë¹åù¹n´áó<¡]iÅ­ý+ÒGé|N_Zþ¸ÂãxoÄËv¦±ôu8%}1býhÇ7*ò<ÎûgG|­ܪ”i?ŸxÑ WÙž kÖåo-Ÿ[ÒJ²Uø1gjÃwÓµ4Úön?N€ÿsÞ~«|}òÞ³¥ç¦æŸ›Ê•þ¾U‘>:²¼®ý²Âãx[Ä»ŠÎJÞ' ¡ éµãÇ"6ŒvãÌú|¸§‹×ÆGêÁ?Ÿ÷éµjZ°bXÉÏEìTt~ètn…úfvùzïuç p×é=èöéVêå]/Fa¥¹/–sé›ÅàWãOý”Ø8ÚñшÝTà¼HŸG~¼è,Zõ·åë–^œçB¥×–EôcáßEÓ‹êªnÎ3Ó?Ç•Q¬´ïI‹ä½ôAÔ‹‹Î­ÀÓ`‹è-ºniòûˆß•qV̽[t °ê]Öÿö8tBZÅ£Voü"îÐe_~¾Ëv¤/ü~mI‰1o*:Iÿ¯éóûß”üÑŠH =PÁ±I+¶ï}’^/¥[ð¤•Wèã.Ó—‡G|eX+É=M¤?ýñå(ßñ®òµd¿ÜWtª¿û¾À%óÏã¾àI+ o^ÎË]úì*}ù”VˆûØç•®*Ût â]blÓ—€{G¼#bÝ7ãæòuÐAOXµø¿çlZ}ifœ³iU½ý"¶íÓ®Ò÷'–¯5~¼‰+(_—î^>úÓ"£Òjq{E¼¥ÏÏá¹íL·_}m´óEEçîé5Ñr}Üå¥åkûvúŒ³©RŽÊ8wÒ{æŸèº?ŸOiN6Χ¯–¯eÒg/ïónÓuñgéýrÑùaû¼ ÷Ï/¢oR¢×›Ê÷„Û÷iWWÏ(ÛÃ^aµ‹¾J¯Kÿ!ú+ÝE$%´½³Ï¯ç”ϵÿåu0>/Òg÷)9ÿÈ87Òk•í"Òç^)ï`ÓˆgOo0ÿ»ä´ÀÕOô£ÐŒý a€‘SÞöû‚2ÒØ”DºdÑùÅõKÊòùå ;Ïuü5wÿ›šn…qNÌ«kt )}!ÜÍ lgQ_¤/†Öïfµzc±v«Ùõ¯fË_ó¦/~Û\µè$Ǥ[’oUôæ‹«”„™~Ìò£ò˱Ê+“÷ŽþH_€¦Ä¯ô%ÞvEo’›Ò‡Ðiµ½ôÃÏ{1†èô£¤´âÂËdÚ=#^±eÑý‘ÒíÎO.çàO‡p˲_y_šÜ5„qH¿ÄoŒÁû£|}9/·‰X§GçéIGÇ~~7àC›9Vð\Ióé1F•çIJ:߬Ëͦ/AÓ ^é‡ÿû¸f íI_^~0Ú“nëý¹ò}ßTÜYt’F~ÕÃ>JsíŸRD»6,:?nÜ8"=^¥ŒÅ#–.«¤¤ØËkEš+é‡j³Êki*/ìÓX¦äŠ÷EÓÊj¯.:‰ÚÛtûÜ]ºxþùñÛQ¸ív´ñÆ(öþøXyý™¿bѪ]l6}^qfѹ]æQ±…ùbJªXbŠû‘€úôcû±Û/_ûíXt~Ôôœ>íòÚòý@÷3ú´ªÌ¨<å¾é&á+Ý"ö°Œzƒ8R»N˨wãÚv|æXÝÞ‡söO ”?ÀØ£|~êö¹éÎòõxÚöñ±›¦Ðž”ð¿G´ç¢LI6Ïšâ¾o-÷{Aûè7Qü&ÚôÞòZ–Þ³¤‚¬[>oÍ­±dYeî¯5n~Âk}¹#GyËáwG;Óg)™k§òµF·ï9ÓëŠóÊ׎ǔ?˜dçùIrý¾öѶ¹xÏœ s~ 8´÷geŸœ"ΩuÊëãÌòµÍÒ=zÞýwÑùlkd’¯Ë÷éN:?¾IÏó?ó{YÑÝvg—s8ý¸ÿ¤…xMw|Ñ¿„Õ^öWºîÿ{ôÕþåüIýõªòù¤Û…^‘Þ›§UþO|â]BÆôµÖ0^{æÎ³Až×W#ö9XùƒòŸ Ü™+}7Ååu6Å2 ¼¾¹ËÅæþP~®wùôôyóæéz?±¦MÓ ÀЭ´ïIéC²ôEæ Êx~Y.¯w&Æãå›”ômú÷ü2®sàL/‚&P­ÞH‰€éÖ‡iå“ ŠN2Oú0­,–>Z*"}0”V¸H¿ÞMÈÜPt>HL+à¤/¦ÎM·Þ£>Y7Š´bͳËþH¶¯ZöÅRåk§Ô–åì²O®.û#ÅU£´ý‘>L ?·ì4OÖ.çÇreŸ¤c}¨è$}ÝTFZÁ2}q—nÙvɸôÇçeú²gãr R¬Vt¾_¦‹ôÁnJꣃ4//._÷ýnœÎÓ ŽOúð|Ûò=Vú’)­æ—–(Ç'}¹ùp9Féš‘Vœ¼®|-ž®—õâv~ÑŽéåõ+}9øÂòœ]±Ç/ì畯 ¯.çþ¿)TÞ¿ܺ|­±Yù:ãå{µåÊkðCåk›Ë××–¯ÇS\Ù‹×ãÑŽE'ùa‡²-ë—ûOÏ‘w•¯5./_k¤ýžmUé¿Úë—¯5ž]öá†å{Î%xŸuwùž3½Ö˜U^o/*_Ãý:GOŸΧôºe‹2æf‘JW.Ï©ùï™ç¿^MŸmÝZ¾~IïÒ5êÌ8§®þIÇýÒ>ÏIïoÖ,ûcùòz“úã¾²®-_˧Hw½¸p’>ˉþZ©|?~„¹Qy}~Fñ¿Ÿ.U¾¯O׿;‹ÿý<ðòòÚüûqœGÐÇs.½ÍùAûo=äà­õ ½&a”þL, £@…­´ïIéÍófå›Åô忯åÈõÎÈJ/h®[àÍ}Z‘'%‰^8çÀ™÷ëà‰Ê¤‹”Ÿ’¤S¢Eúb<ý[JK w•eú’üÚQXE€Ê½÷|Kѹ+ÅT}÷ÐCÞSÒknÓ ÀÄ™sàÌô‹óÇ/øï+í{RúUsJ M‰¤é×tóWØJ¿Ð\RÏUBú¢&ý6­dsYY¦_3^ãú îV»ÕL+&ÝX æàL¦çfÖ»Z×ÑF 4çÀ™é–•§•ñVÚ÷¤tÛ£ùÉ£)Ö+:·-K«•¦ÿ7CöDº•Ô5Oˆ«ç?Ž1ºK0"^šYï<]G?¸%=ý™XnIL•ö=)]ôÒ­Ëæ'®UFJ$]%b͈U˘>¡Ý”Vì¸=bvÄMEgåŽYO|<çÀ™w˜QŠgeT=»Ýj^<„ö.Eú|éŒêkzÈÁîˆAÏYaº4çÀ™é×³ËøÝ“ýÝJûž”’ESÒhJ"}FY®XÆ OR.±xæ È~¸{˜û„ÿ¾³è$…¦¼·,ðøV+ƒÐ¥·F¼/£Þá{ ¡½o.ò¾ë¿©ÝjÞxè!qzNÂ( Èœg>^t)S\4Õú+í{Ò2E'ytÙˆ¥"–ˆX®üß‹•ÿ6ß’åß>•û#^à¿ï‹xdòÞ¢³2è=©ŒöÏ5Š É•™õv¨Õ3Ú­æ#nïû2ëýÌPÓ/F`DÌ9pfJàLá¶íLš‹2륻îñÝA5´Vo¼!Šm2«ÿÐPÓ/Óu÷›ˆ‡2ëî_«7D#c?+Dñ­Ìê·Eœj¨é £TZ»Õ| Š_eVß8â€~·±Vo,űkgnâëqœmúEÂ(£àð.ê~°Vo|¸_ ‹m¯Å/"^•¹‰#¾aˆé' £Œ‚ïGÜÚEýkõÆaåmã{&¶÷Æ(.ˆØ®‹Í|£ÝjÞfˆé§ióæÍÓ ô~bM›¦€žªÕûDñå.73'â+‡´[Í›2Û±x;F¼?bë.ÛsKĦі;çÿƒ¼>úAÂ(ý™XF€«Õ3¢8?b“l.%Ïý1â̈ßG\qCÄ܈ûø»¥#ÖˆX+bóˆ—[Ï/Õ£ÃÚ¹Ýjû “×GH¥?KÂ(еzã¥Qœ1c 'ÝŠþŸøòúè‡éº€QÑn5ÏŠâƒcp('Éq0"$Œ0RÚ­æ×£øÜÂÙoãxØh2(F9íVó#Q||›~|ÄöÑþ»"ƒ$a€‘Ôn5?Å.÷H“Óª¨oŒvßoô´ióæÍÓ ô~bM›¦€¨ÕëEqPÄ«+ÚÄK"ön·š§/ÌËë£$ŒÒŸ‰%a°Z½±kѹMý¦iÒíFüg»Õ|da+Éë£$ŒÒŸ‰%a‚Z½1=Š”8ú¯R3®ŒøZÄÁíVó©V–×G?H¥?KÂ(0dµzc“(v)ãy}ÞÝu?‹8ªÝjžÕ͆äõÑFéÏÄ’0 TH­ÞX#Ší"¶ŠxAÄæ+dnnnÄEœqR»Õ¼¶Wm•×G?H¥?KÂ(Pqµzc¥(ÖHɤ+—‘¤DÒû#ŽH·”¿/ⶈY·´[ÍÛúÙ.y}ôƒ„Qú3±$Œd‘×G?L×ãMÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æÕ£¡Vo¬Å’KE,qOÄcGÌm·šsõ™«—suÍŠsñ6³¨ £T«76âu/‹H׉˜ñ4uRqkÄõ—Gœñv«ùˆeÀŽŽxþ„û#þÓªFÂ(@EÔêôm¯ˆŠxnæfV+ãE{Fq—Þ€É&a jõÆ–Q±©Þzmº.®Z½ñö(~[HúÄ £CT«7öˆâˆÂú€>ò…$ÀÔêçDqˆ÷f@¿ùR`jõÆ´(ŠXJoý&a`8Þñ Ý ‚„Q€áø .EÂ(À€ÕêgE±­žEÂ(ÀàíØãí=ªK€§²¨.¸íº¬ÿûˆoFü*âêv«ùXúÇZ½‘Þã­±VÄf/‹xDwFïE]ÔÝ?âÓíVóñ'þø·´Òèì2Ή8BW‰„Q€ªÕËG±vfõï¶[ÍOêEÆÜÏ"þ}„Û?ËU$a`°Öê¢îº 0§Ýjž§zkº.¨ÜÕEoj·šè> ‡„Q€ÁZ1³Þ•ºÈ%a`°Ϭw§®rI¬¥u0hFk†.MÂ(À˜“0 0æÕôJ­ÞX3Š ÊX;b…ˆ%#–.ÿäáˆû#æFÜqeÄU×µ[ÍG&¸ßÖˆbëˆÍ"žYö×£åÿ¾+bvĵ?ˆ~zÔL£‹¹¶T/ŒxNĺ«F,1/â±r¾¥só†ˆË".Œ9÷àÿjQlZÆå5jÙ²Òñ§c½­<þ+Êã¿mçIúÌðEe¬±RÄ"e=qGÄõ§Eÿ\:€ö,R¶#Û&e{–)Ç.ÍÝ{ÊHmº¸·9Îx€¿$a€lµzc‹(^Ut’S¬’¹©‡b[çDùëˆ_FœÒn5ó¾[9ŠzÄnE'oa_tú`*s-%Fî±cÄË‹©}ôXÔÿC9÷~çåÙ#vì)Aôµ¯.cŒm\Å©e}pï˜Î“iQüMzñ梓ùt>ññ>µg£(ÞPŽßvEçÇS©a?øiŒÙ®E1mÞ¼yzÞO¬iÓt¥VoœÅ: ñ§‹G,‘±‹´ªä}Søûï´[ÍèÓ±>;ŠwDì±QŸºôîˆF|/âÄ8–Ç<ž;Dñí)V›í|ÖBl;­èøÑˆ½3æÂб»Fà|8/ŠçgV?<Žq¯ ºv¤DÎoôi®¥„îý"v.:«CöÂE_‹84ÚðpEû4kJxü»ˆ™Ó{¸ù"މøVÿ™>®Ó£xÞ«ýC´ó;O³Ýô!Î[">UtVžŠOÄö?ÞÃc\¬œ¯ïض‡ÝwIÄG=Õ*ͱÿÜëëæ±ÝëŸd›+ÕzËÜöcÛí!žO)qøÊÌ×.ÇGÛw÷* ¼>úÁ £½±\Äò}~ÿ6•í/ÕëÔêíŠNòÙëÔŸ{•qUìû Å`Ôfôz<ˤ¬”ÀöÙòø Y¬s-­¢ùùˆ·Gôú)¡ð›ÿûùÈÓ%#Ryõw„ì ú´›´Êå»R” œÿ}pÚ€qÙŒ¹²ØÓôYJú?(bû!Ýô²_ÓŠ¥k÷aéVö)ér¿ØWJ¢=õIþ.÷\|Ò¤äØ×±Ï´zöN™Û~gÙöaycÄê™uäÕ2]ðTjõÆs"~QtnÉüº!4!%~¥µ+¢»—‰—£Ö‡iUÑãŠÎJ’’Eéç\K«ù]ZtVîç¹’’ú¾ûûyÄÊ8îí¢H+ÛZô/Yô‰^™®‹±ïŸD¿1c€‡yhu·‹¶>cˆC´Kf½´RøO\• Z$ŒðW¥[G¤[§„¢×T IëD|7â„h׺#Ô›Eñ»ˆ×šUôqž-ñÕòY~€»~Cšßå<Æq/‘VÈL íÏR÷¿9â¢hÇ{Gh®|¹è¬Z¹ÔÛ1#â€xxúÆnŸˆãbÿƒJà?>bvfÝ”ø½ûÆhÙòÏqt»Õ|ÐÕªEÂ(ÿG­ÞX?Š3"þ-bÑŠ5ofÄ£;@?>?Š_F<ˬ¢ól‰¢sëç÷© ë¥yíØtÀÇýì(ÎŽ¨B¢æÒE›ŽNI¬ž+‹DqDÑI˜f;Òª´'D|¤èïJ¸Oåo"޶ô=i¶Ýj>Zö{®Ý‡ÔGo‰X"³îP9Fø µzcÛ¢³"æ–nfZîûÑÖÏTõõÑ®¢8)b³Š>γŢ8&âMCnJšçiõßÕtÜé6ê)Yt³Š É®¿Žö­YÑ)óˆ=‡£"s%%±8ä6¬XtnC¿AÇë€hßzØÏ¡]Ô}û€ûä­‹eÖu;z¨( £¤DžWDqt1zÉ¢óýmÄéË×Fñ³Š>ϳM¢ørE›—’ï–éÃ1oÅGè:•#ëG_L±ßÒç‡ ³ßÊ„þoGlZѱZ2â ØOzž} ³îÆÑ[ °Ovˬ÷ëv«yµ«4TÓ¢º`²ÕêgFqlÄ=ÞôµŒ¸1bnÄ#+D¬ñœ¢“8´X÷·_ËùíVó;CìË”õ9³Š>KÉmGF,>…:×—çãus"æ•ÛY«<7X¤GíKçxºõù—zxn­ÅOÊ6÷Âe\qGÄÃå¶W/¯OÏ/z“`™úõˆhÿÛ†x‹î”ø·åçì¿F¼¾‡Û›WŽÝ7•Ï1Éré9m³¢sÛû©Ìé·ö»bÜs!­ûÎÌM¤ÛÒÿaÏe+Eñ7™Õ­. &a 7ÒmfWZˆ¿K«ƒm“±ý´Z×Ϧð÷g/ÌÕê”LóÝ¢“$Õ i¿‡Eü¤ÝjÞô4ûNÉYéöÕ»–Ñ‹ä¬fl÷œØ÷åCš3‹N¢ôSJ´~ÑBü]JM+K~7Ή«žæ|LÉÜ;FüSyêÖb›_îE’d™ˆ}TÑIìÆ-E'™í{çEÛŠ}.Åë"åuª;E¼?â«Cš/æd¾Lsõ“=ÚÜYé:ñ£¿9 1§ÓØ¥äÌ7FL«Èù{X‘Ÿ0º{×~H>Nɳ9Ÿ?qŒK4T—„Q€h·š • S«7ö)òF/ˆ}ìÓ‡¦§m¾²Û9'âÃÑÆÓ¦Ðgé¶¼?Mýòÿ¢ü·¢“œÕMRÏREg5¿—?U2XýmugG\qoùßé6Ök g8˘‚´ÚbZÑñ8^Èóñ®(sçÈò<üÏ¢»U‡ŸñÒˆ3{pyIÙ[uцc;'Äv/ð\H«¥æ&?qeÄíåu)]“V.:‰»+.äs^úQÂAÓ»<ŽË"þ1úïä)<ÇܵÀnå#ÞTóóÔ¢³÷ºu׎Ø:âô>·qÌzéÇ"s]‚ º$ŒL¨Z½±NÑýªoE¤dÏ/µ[ÍÇr7uoˆbïhÓáEgÅÓuºhSJRû»ˆo ¸KS²ê›§ð÷)ë‡?Š8%úàŽ'§”p•´Ö¸o¦æÎqÌÛP{oŒ±ÛºBí9#b×hÓ¬Ìs1%Zcp^”'F,ÛÍX]&ŒF;ÖŒâs]lâøˆ½â¸néâútv´#%Ö¤¼fæ$?.^tV@ÞfÀ·¦ŸêJ–Õ\Oˆ8ÿÉ®ëqËG±ÞB\“Òµø…]Cº–(Úò`cxEº>G»w‹²±ô°NÐ4þÑŽvÑIbαgÑÇ„ÑhÛjQä^ƒ÷ê ªMÂ(ÀäJ‰OKuQÿîˆÚ­æ)½jPlëŒZ½ñ⢓HùŠ.6õñØÎ±½{ØŸ3Š…[ 4%=}%âóO–$ú„>I [×—1 –.†˜Ì5â~±ó®*ú4óî¬8‡ÞUž‹¹z±zqZrù̺_ˆØ¯« —çág¢O.Žòè"oÕß”X¼{ÑIŠ”ÕòïÎŽøHç© ÙiÉóžêo¢¯–,:+Gw#­\ý…>Çíº$¦•JW⹚+?^ä­¨’ê?ÇòHŸÚ–nGŸ“VÉ>Áeªmº.˜<µzcÓ(ÞÑÅ&R²èkz™,:_lóÖ(v(: L¹Vا‚]ÿ›ˆÍã?²0É¢0'=J]à\L«ßÝÅ&¶ˆkÍâ]\§6+: –9>íÿp/’EÿJŸì‘»ÝOÅq-V¡ysÄû"^¶°É¢S°wÄ]Ôÿt/“EÃó£xUÄ]ÃêôhÃuQä>¦D×™}l^îíè¿ÝÍJãÀ`H˜L‹X¤‹úoO+ö«qåêu¯¸®‹ÍüK­ÞX¶B}~HÄöå­‘¡—nˆØ­—É¢ øxDî-ÔÓ*œu±ïÿ(òV`üvÄþ}¼>ý8ŠfVß ˜úmâûåæˆWÆñ|=Ý&½—Žkoz~ù—.6ñóˆïã^PŽÃ¼!öÿ¡]Ôݳ Šq{F‘¿2ð.ÅP}F&L­ÞX-Š»ØÄíVó¿ûÝÎØÇœ²fn"ÝÆzŠtûWãx}¼…0“íïÊó¥çá¥QœÖÅ&ÖͼNmÅŽU¯*û£ß‰€Ÿë¢_Þ_9sSÄ6ÑOçöiû)áÿ™™u÷{ Ë籃†8iµÚ¹™uwŠsdÉ>´émE^’öË•[€Š“0 0yjEgå¿—G|bP m·šçDñÅ.6ñwèïc"ö1íè“â<ùŸ>ïãG]Ô]'³Þ{3ëýcôǽ¸6Í+¯/9·à~~­ÞØzˆs&݆þ q Wöqõ.ê~*ÚvË€úâ#w câˆâ{™Õ—ŽxSšµ[f½Ã]Š`4H˜<Ý$òìÓn5p{?1;³îµzãCìë”õž¬vÈäúÌöqjuŸj…8gSweìëä8×~1¨Ž}]VäßV|ï!Ι÷EÛÿØ¯Çø-Å™ÕgE|}€c˜VøüÂÇ¢›ÛÒïÑãqKÉÝ¯È¨š’¦¿ãR £AÂ(À©Õ›D±Qfõ³Ú­æqƒnsì3­†÷¹.6±ã»|ïhÿ=f}ri̯_ `?—Dä&Š/ŸQ'ÝÎ|åŒza ¾”YïÍq=ž1„öžs¦Ýç}¼ºÈ_Åú¿¢}¸O¾QtV]¸8Ö³£¸(³úb-ßÃæì’Yï\è’„Q€ÉÒÍ-l??Äv17³î‡Ôæ´[ÍSL9ú9DZ“˜ÇiÁË+~º!â¤A@ôÍ¥Qü:£êrÛ¸¹iß7€ýä®.úxêÒ!ŒáÝEþ­á{Ò„Ìz‹EìÜÃvä&Œº=Œ £“åõ™õÒêa?V£ËUF̬þ¢Z½±ÚšýÓ>;a€ûš5ˆÄ¹š>«ÊI8<6®i¾ŸYïÍngJbDâï6™õNŠöÝ:¤1ÅÙC<Ÿͬ—>ÛÝ¥ûw;z˜‹ê€‰ñ¢ÌzieÑ_»ñévÓµzãÔx¸kFõ-ØÔÔ_?6ݲ¥Õö.¡öÎÒ~oðþÐ~rFïŒëÃì!σó#^9Å:‹DlqÆÚwô€úa“Ìz÷D\2ä1<+bÛ!í;­0zkÄju÷ŒøjîŽãyuƒ(^˜QõªÍ] ‡$ŒLŽ2ëS¡[ΦÄÕ]xì9~ýué–íøè¿½tÃÓš;¦Çõ‚Œ:·T Ý³2ëmV &énP«w®“Yï¼8ïç y ‡–°ÇþH­Þ82~(£úKSÒglãªÌÝï™YïÈ Œ0EF&Gn"Ïù:†Ü¶.Œkßc:žÕ3ë]]±˜=ÌÇ]çÀïâá‹3ª§UB?“qÎmÅs3ö÷«hï5®Z0z¦ë€‰±ff½ë«ríVó¶(ʬ¾Æ€šy©YÖ™ÀcDÂè W‰^<³Þ­‹;*ІC3ëmV«76Ϩ·{æþ¬. #JÂ(ÀäX"³ÞìŠÇÍ™õ–Pûn0Õ ËrxÌ‹`ƒLú_*³^’5çV  ß‹x0³îžurFSû¾ïr£IÂ(ÀäÈMƺ·bÇ‘›Ô3ˆÄ¬[Û­æÃ¦dYBôŬhãГ5ãÚ=¯m¸+ŠfVߣVoL[Ø?Ž¿}^gìçGÑλV0š$ŒLŽ™õª–0úHf½A¬^8×4ƒlËOà1/2€}Ì~˜gúÿY;³Þ:[MáïwÍÜÛÑÀ“0 09ˬ7­bÇ‘›øúèÚv¿iÙ¦Mà1âºôàçþQûZ½±BEæÄ)×gÖݳO;ßìˆ]ª`tI˜eÖ«Úª¹‰EƒHæ|À4ƒlwMà1ß>€} 2at”ŸgVªÂ„h·šGqxfõ]kõÆÓ®Z³eëglÿ¨hßc0²$ŒLŽÜdÆå*v«eÖ»wm{È4ƒlNà1ϳã¹-³ÞªhûªêÇvÇðê…ø»]2·ïvô0âÕãžÌzkVåjõFúácnRÛÅCµÝYïæˆcFô˜O³1ÌM]£mß°*Øn5¯‰ç»SãáöÕ÷ˆ8þ)žGÓ*Ý»el÷¼h×.S0Ú$ŒLŽYÏͨ·^…ŽaˆE2ëÞ` @¥Ý’YïÖv«¹î«„›2ë=»mvÅú2­2š“0ú–Z½±dœO¶ªøK#ÖÍØîá¦7Œ>·¤˜×eÖÛ¬Bǰif½»Ú­æ=¦TWœ£)aôጪK꽑žy^Úþ¢Šõå±EÞÊàËE¼á)þÎíèø®é £OÂ(Àä¸>³Þ–:†fÖ³º(Œ†œsu-ÝVgÖ{^­ÞXfX.oÓþ’*ud»Õ¼?Š£3«ïùÇ™“0ú‹2¡qF&Ç%™õ6­Õ+Uä^™YïbÃ#áòŒ:KÅ5j5]W —eÖKŸQn=Ävo±JûóÐÌz;Ä9±ü_ù÷ÔÇkglïSƃ„Q€Éqvf½´"ÙÌa7¾Vo¤ÛNç&cøa$ü!³ÞæºnøÚ­æ}Q\‘YýÍClú›*ÚŸ¿-ò’pØé¯üû®Ûšñ³ƃ„Q€ Ñn5oŒ"÷–²o©À!¤¤Õ¥3ëžmÀHø}f½—ëºÊøuf½·ÖêCjó;*ÜŸ¹«Œî±àDߦÏß–±£ãõÃC¦5Œ £“åŒÌz;Öêå†ÜöwfÖ{¸ÈOBë¬Ìz3u]eä&Œ®^ a•ÑxnÛ>Š +ÜŸévðåœql«-ðßÛD¬™±ÃMi‹ê€‰òóâ¯ß¦öé,UtV`ûÆ0]&½ä®rzZy›d ââ\çûEñð9S¬ºuÔ{fª?¤kÔ ¢XaŠÕfG{/Ãa<¹‹ºŽ8vÀíýpÅωÙ1¿Ž‡;L±jZ(`·ˆÿ*ÿ{÷ŒÝ_û?£Æ†F&KJ—Y÷Ÿkõư~xøÏ¹·*þoÃ#wšªi{ £±åêËiUÍS§;ãàµ[Íë¢87³úK£?ß4À±K«n¾~ºµ«ÛÒÇq.Å[3êárãEÂ(ÀI+•EñÛÌêCHȪÕkDñ¾Ìê)9öÇFFJn’÷ûãz±äÚ[‹X:£Þ‰c<†?ê¢îW1ޱô#„¯ŽÐ9q{F½­â8×r»ˆU3êérãEÂ(ÀäivQ÷³µzc•·÷?‹¼d¬äøv«yƒ!‡‘’Vë¼*£ÞêdCãz¸XȨzK‘¿ ç(øN‘¿šõzåu¿ß>ñüQèÌx{8Š£2«§[Ñï™Qï—±ßk]Ž`¼H˜<ÇDÌͬ»rÄ7ÕÐZ½ñ¶(vëbn-íV3%æÞ‚û£qÝØp€ÍMÉ¢ëgÔûnçãc<†WGq\›xoŒc½Ï-)‰òã֭™õÞ±SF=·£€1$a`´[Íû£hu±‰kõƇúÝÎØÇÆQÖÅ&®-òom W:÷ɨ·TÄ÷tKóÍ¢ødfõÃ'` ¿Þeýƒ£ßчqKÉ“)rÚˆ=wŸÅï3ªn±âë<ñ—!?F&Ó÷uQÿÀZ½ñö~5.¶Vì;9b™.6ó‰v«ù¨¡†ÑçîMQ|+³ú–߉ëÈ"}¼F­ű9‰©§Åñ7ØVý}õÓç–GF_ï1½c6-â_ŠN"äŒíÓôŸÇ½Û•ÆÏ¢º`ò´[ÍÛkõÆ—ãá¿en"%ïÛX9¶õÕ^¶-¶¹E?Žxf›¹$âH#=’¶Ž9p؈ÃWã¼8×Pv-%¶7"–Ȩû–t‰¹´[¹ªr/¯Q«dÈMº8®Ixž™}µ_<<©ËM}<âu±­¿ÏM´ºÏâ›éú2âÝúíˆ/F,ÖçýL ¸0‘$ŒL®ÏGÔ#Ö̬Ÿ’F¿R«7^å>íVóŽnS® ÷Þˆ/y«ö-è_¢=â‘´A£,%îææ¢û$_ ¢$ŒL¨t»ÙZ½ññð‡]nêEgõ·OFyhlwÊ·ºº¯):«ÈmÕƒCû^´áŒ0Œ…t]Ù%bÃÌú›Fœ]®Zûé¸6\›³‘¨¿n-:IöÓ2Û’’Øß?c˜6/ŠX¾ÛÚ¡ŒûcL~å‹N‚ãÜ¢ó#†´gDU¥øÛ¢Ø6b§¢³Bæô.'%¬^Vtn3þ†n3%„¾pm¿>b·ù.þ>bˆ™k×¹±¾<¬èO¨ÕE`ÌM×´[Íë¢xMÄí#zŠc8ÒHÂØ^£R²ångXÓÓêÊoˆößl ›G±cÄ©jÖ©MѶF¬/¯Œâôo6­þWoFø“v«yA¯Š¸eÄš¾O´ýKFÆþ•n!ŸÛG%i4%àoí¾Èèýy ïâ?­@sfElmºqD»óÐoïøè‹[ÍRoFø³2it«ˆ G ¹iE¸]£Í_1r01ר¹Eç–æ?¯xS¯ŠØ6ÚûG£öÆ0%îñɈLJԌ‹#^Y®Ô9ª¾qo·w¸Ù ãOÂ(¡Ýj^St’Fªp3/xi´õûF &îuOѹµùg"æU°‰ÇE¼8Úy±ÑzÒ1|×xÄE=ÞÅìˆý"6ŒýÛ§ÃV²åo"®èÁvŽ0`2,ª x*íVóî(>\«7ÒÊžûD¼7b…í>%^ý$âsÑŽ3ðW®QiuÇýãõµ(?TtVùÄ5ꑈï•×§‹ŒD×ãxoi ¿cùÂ(wŒxmÄ–ÅÔ?ÃL?*8!âÛ?MI©}nþÝCê³yÑWíxø]læŠØÎoÍ@˜ FëÆˆ_fÔ»pØ o·š7G±_­ÞØ?Ê"ö(Ë%ú°»³‹N"Öѱߛ†p¸·gŽÓy¦øŸœq×ÿíSøÛÙ#rM¸2³×ðu[‰kÔ'ŠN²áž¯/zÿù×¹åõéÈØçì8¯Fî\Œ~=·ì甼d”—±IÄ3#–.#%?1§<—.ø}ê«©&‰Æ~Ïlîc±¯Ç‡Ø]iõínF­. dÚ¼yî’E&Ö´i:&@­ÞH ;[E¼2bëˆÍ#V™âfÒê€)É猈_EüºÝjÞ¨w\£V(¯MÛ”±YIJSØDJ¼¬è$/žqR\Ÿ®Õ³c9WV/:I§S5+æÄZCl÷¢øJfõôÁðúæ4@5É룬0 @¶v«y_'•ñ'µz#%cm±vÄŠK–1£è$‡¦ÛßqKÄÕCZA˜ŒkTZ]ó¿Ë˜Z5Š #žQt’G—-¯Q–qWy}º!âšò–÷Œ¿53ë]?ävïÒEÝ_I€É"a€žj·š)ô¼ÂíÙj^£Ò­ëoÓ<ÁF™õ®VƒËUQ_ÑÅ&7ì0Y¦ë`½ ³Þ%ClóNÓ2ë¦Õ¾`Ø`²H&Ýö™õÎb›»¹ýÑåŠàÀqKz gjõÆ'¢xWFÕÃÛ­æþChïQ¼4³úÙCêãբخ‹Ml¦Àä‘0 ôÒ]Ïʨ—VÌÜíݫȻÓíVsÎúx×"ÿîQŒvŸmšÀäqKz —®È¬·i­Þxá û[&Š}2«ÿ`ˆ}¼wu2E`2Izé̈y™u÷p[ÓŠ¦«gÖýÑ0:·Vo¼>ŠçfV¿;âHS&“„Q gÚ­æíQü!³ú®µzã5ƒhgìç Qüsfõ³â8/tßF›â³]lâ°h÷½f)L& £@¯ý¸‹ºGÕê ûÙ¸ØþvQ]ä>úÅ!õë›gÖM«¾~ÍԀɵ¨.zìˆEÌȨ»jÄ/kõÆ[Ú­æïzÙ¨Øæ´(þ!âK‹enæªbÀ·£v§~LÉ¢êb3ÇE^ajÀäš6oÞ<½@ï'Ö´i:`‚Õ꣢x{›x´è¬äy`»ÕœÓƒölÅg"^Ñå¦vö|¿Ë¶¬StW/ŠH·¶¿,¶ùÀ_ù»gD±cÄ?ElÜe»_ûø­™ 0äõÑFéÏÄ’0 0ÑʤÈK#–ìrS÷Gü0âgg´[ÍrÿéîJéöí¯Ø3â¹=8¬ãcÿ¯ïAß¼ Š?<áŸo‰¸5⑈e"V‰X©GÃqr´{¦Y 0:äõÑnIô\»Õ¼¾Vo|ºè¬êÙ¥"ÞQFJ¶LI•×FÌŠ¸;â®þvù¢“h¹VĦ‹÷ð÷±ËV/£ö3# £@¿|."Ý þ5=Üæje ÒcEçVô7àíþ½©L×@?´[Í”h™nÕˆJ=Žå”l÷í…ÕE€’„Q oÚ­fº•ûvÅh&>ñî8†ÃG´ûSÛo7 €DÂ(ÐWíVóÆ(^qÚ5ûîˆ7FÛÛ#Úퟋ¶ÿÌìæ“0 ô]¹Òå«#ˆx¬âÍ==âÑæãF´»¿ñÿÌ:`AF€h·šFük<|IÄ™l✈÷Dlí¼fD»ùЈwEûç™qÀ‚$ŒÕn5Ïâå;Eœ[&¥ÕOS"ëѶֈ&[>ñÏï‰ö?f–O4mÞúAÂ(ý™XFèR­ÞX¶è$n±aĺψX)båˆE"–,:·cO·a¿'⡈[#R2èìˆ+#.Џ ÝjήÈq-Åë"ÖX/bˆ5#–ˆX!bFÄÒ‹•ÇvwÄWD\ñ«ˆßÄñÜo–Œ'y}ôƒ„Q€17]Œ7 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(À˜“0 0æ$ŒŒ9 £cNÂ(ðÿÛµ€AþÖ÷øŠ#æ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜Fæ„Q€9a`N˜ ac “_¶ÏðIEND®B`‚nco-4.5.4/doc/beta.txt000066400000000000000000000053201264355130400145270ustar00rootroot00000000000000************************************************************************ Begin NCO numbering and pre-release explanation: Posted to NCO groups in Spring 2010; Updated March 2011, Updated February 2014 ************************************************************************ Users who want the latest NCO features before official releases, without building from source, take heed: Bleeding-edge NCO features are available before official releases. New features are built into pre-release .deb packages as the features are introduced. Once an (arbritrary) number of new features seems stable, we simply announce that the current pre-release code is the official (stable) release code. For example, .deb packages with the 4.2.5 release name have been at the expected location http://nco.sf.net/src/nco_4.2.5-1_amd64.deb for many months, but the NCO homepage for binary package download only points to this location once the release is official. Until then, they are rebuilt and replaced as each new feature is added. When the release is official, the package is frozen and a package with the next version number http://nco.sf.net/src/nco_4.2.5-1_amd64.deb is created. This is announced once it stabilizes a few months later. And so on. With judicious use of dpkg, Debian/Ubuntu users can easily track NCO feature development more closely than official releases. Just remove your existing NCO package and replace it with the latest (unannounced) package that has the feature you want with, e.g., wget http://nco.sf.net/src/nco_4.2.5-1_amd64.deb . sudo dpkg --remove nco sudo dpkg --install nco_4.2.5-1_*.deb or, for AIX, wget http://nco.sf.net/src/nco-4.2.5.aix53.tar.gz . tar xvzf nco-4.2.5.aix53.tar.gz . Caveats: 1. .debs for amd64 (my development machine) are available early. Savvy users can build the binary .deb for any architecture using the other files (.changes, .diff.gz, .dsc, and .tar.gz) found there. 2. We encourage users to try pre-release packages because getting feedback on features from those who most need the features is immensely valuable to stabilizing the code for the final release. However, pre-release packages are not for the meek. A pre-release NCO may crush one's puppy or eat one's cat. That's probably the worst that could happen. 3. These .debs do not yet support netCDF4 (they soon will). For netCDF4 support, one must still build NCO from source. Or one can use NCO with netCDF4 in RPMs (e.g., from Fedora) though those are not built until after official NCO releases so one cannot preview features with pre-built RPMs. ************************************************************************ End Debian/Ubuntu pre-release explanation ************************************************************************ nco-4.5.4/doc/build_hints.shtml000066400000000000000000000325201264355130400164320ustar00rootroot00000000000000 NCO Homepage

Hints to Build-from-Source:

    Generic Build Hints:
  • The two NCO build mechanisms: NCO has two build mechanisms: (1) GNU configure and (2)  a custom Makefile (nco/bld/Makefile) designed for hand-editing. Try the traditional GNU configure method first, i.e., ./configure;make;make check;make install. This method involves no hand-editing of makefiles, but trouble-free builds with it are less common than we would like. The file nco/configure.eg contains a table which describes the success you can expect building NCO with the configure mechanism. If the simple configure recipe above does not work, savvy users may find it straightforward to modify and use the following, more advanced configure recipe:
    # gcc/g++ Sysadmins use/modify this to install/update NCO in /usr/local, based on netCDF4 also in /usr/local (works on givre 20100727):
    export GNU_TRP=`~/nco/autobld/config.guess`
    cd ~/nco;/bin/rm -f *.${GNU_TRP}.foo;make distclean
    CPPFLAGS='-DHAVE_NETCDF4_H -I/usr/local/include' LDFLAGS='-L/usr/local/lib' ./configure --prefix='/usr/local' --enable-ncap2 --enable-netcdf4 > nco.configure.${GNU_TRP}.foo 2>&1
    /bin/cp -f config.log nco.config.log.${GNU_TRP}.foo
    /bin/cp -f libtool nco.libtool.${GNU_TRP}.foo
    make clean;make > nco.make.${GNU_TRP}.foo 2>&1
    make check >> nco.make.${GNU_TRP}.foo 2>&1
    sudo make install >> nco.make.${GNU_TRP}.foo 2>&1
    
    This is the recipe that the developers use to test configure on their machines. Please contribute patches required to get the configure mechanism working properly for NCO on your platform. The regressions archive contains gory details of successful (and failed) builds for many platforms. Plaform-specific build hints (CentOS, Mac OS X, RHEL, Solaris) are listed below.
    All platforms continue to work fine with the nco/bld/Makefile method:
    export MY_BIN_DIR='/home/username/bin' # Executables installed here
    export MY_OBJ_DIR='/home/username/obj' # Object files placed here
    export MY_LIB_DIR='/home/username/lib' # Libraries built here
    mkdir -p ${MY_BIN_DIR} ${MY_OBJ_DIR} ${MY_LIB_DIR}
    cd ~/nco/bld
    make dir
    make all
    make ncap2
    make test
    
    Disadvantages are that nco/bld/Makefile (1) Usually requires editing to fix your platforms paths; (2) Does not support shared libraries; and (3) Requires a degree from Hogwarts to understand.
  • Duplicate symbols errors: When building NCO with the netCDF4 library and headers, some compilers emit errors due to duplicate symbol definitions. This arises because of the complexity of the build system. Essentially, NCO has to define some netCDF API prototypes itself to handle the corner case where the netCDF4 distribution is used to build netCDF3 libraries. We have tried to address this issue using autoconf/configure but it is beyond our abilities. The fix is to manually tell NCO that the netCDF4 header file netcdf.h is in fact being used so that NCO should not attempt to define these prototypes. Do this, e.g., with CPPFLAGS='-DHAVE_NETCDF4_H' or USR_TKN='-DHAVE_NETCDF4_H' if you use configure.
  • Build Chain Version Incompatibilities: NCO requires GNU make version ≥ 3.78.1 to support target-specific variable values in bld/Makefile. NCO most often fails to build because ncap fails to build. Two of the most common reasons that ncap fails to build are (1) GNU bison is out-of-date (upgrade bison) and (2) --enable-optimize-* is specified to configure (do not specify it).
  • C99-compliance & old compilers: NCO versions ≥ 2.9.8 require the compiler to support the 1999 ISO C-Standard called C99. NCO takes advantage of two C99 features, restricted pointers and designated initializers. To build NCO versions ≥ 2.9.8 without a C99-compliant compiler, simply undefine the restrict type qualifier before compiling NCO. Do this, e.g., with CPPFLAGS='-Drestrict='. More details on C99 compatibility are in the header file nco/src/nco/nco.h.
  • Old netCDF libraries: NCO versions ≥ 3.0.0 require netCDF versions ≥ 3.6 to take advantage of the new 64-bit offset file type. The library and include directories (e.g., /usr/lib and /usr/include, respectively) for netCDF version ≥ 3.6 must be on the path searched by the compiler, and must precede the locations of any older netCDF installations. To build NCO versions ≥ 3.0.0 with older netCDF versions < 3.6, simply define the pre-processor token NC_64BIT_OFFSET to 0 before compiling NCO. Do this, e.g., with CPPFLAGS='-DNC_64BIT_OFFSET=0' or USR_TKN='-DNC_64BIT_OFFSET=0' if you use configure or bld/Makefile, respectively. Users attempting to build NCO with OPeNDAP versions ≤ 3.6.x may need this workaround because OPeNDAP did not fully support netCDF version 3.6.x functionality until OPeNDAP versions ≥ 3.7.0. (The indicator for this problem is a build error like "nco_fl_utl.c", line 30.20: 1506-045 (S) Undeclared identifier NC_64BIT_OFFSET.) All modern NCO versions require netCDF versions ≥ 3.5.0 to support nc_type NC_NAT in NCO source code. NCO versions 3.9.0 and greater (May, 2007) require netCDF versions ≥ 3.6.0 to resolve the nc_inq_format() function.
  • ncap build hints: ncap is a sophisticated and somewhat fragile program. ncap requires flex to build correctly. AT&T lex will not work because it does not understand EOF rules used in ncap_lex.l. bison version 1.29 (the default version on early Mac OS X) is buggy and does not parse ncap_yacc.y correctly; previous and later bison's work correctly. bison version 1.25 will not build ncap on Solaris. Please upgrade bison to the latest version (e.g., 1.875+) before reporting ncap build problems. If ncap keeps you from building NCO, and you do not need ncap, configure with --disable-ncap (and know that ncwa will fail to build as a result).
  • Build Hints with GSL:
    NCO versions 3.9.6— support automatic building and linking for GSL versions 1.4—. Earlier GSL versions are not supported.
  • Build Hints with DAP:
    NCO versions 3.9.9— support automatic building and linking for DAP supplied from libnetcdf versions 4.1-beta1 and beyond
    NCO versions 3.1.3— support automatic building and linking for OPeNDAP versions 3.6.x and GCC versions 4.0+.
    NCO versions 3.0.1—3.1.2 support automatic building and linking for OPeNDAP versions 3.5.x and GCC versions 3.4+.
    NCO versions 2.8.5—3.0.0 support automatic building and linking for OPeNDAP versions 3.4.x and GCC versions 3.3+.
    NCO versions ?.?.?—2.8.4 support automatic building and linking for DODS versions 3.2.x and GCC versions 3.2+.
    No other version combinations are supported.
  • libnco_c++ build hints: libnco_c++ requires a good C++ compiler to build correctly. Few people need libnco_c++, so the workaround is not to build it. This is done by configuring with --disable-nco_cplusplus.
    Platform-Specific Build Hints:
  • AIX build hints: NCO versions 2.8.7+ do not build with autotools under AIX when --enable-optimize-* is selected. The workaround is to not use --enable-optimize-*. NCO versions 2.9.7+ do not build shared libraries with AIX xlc compilers because of silly AIX library dependencies activated by OpenMP directives. The workaround is to configure with --disable-shared.
  • IRIX build hints: The most common problem with building on SGI IRIX is an out-of-date toolchain.
  • Mac OS X build hints: Mac OS X users report success building NCO without patches so long as they (1) Install the latest version of bison, (2) Disable shared libraries and (3) Disable extended regular expressions. This is done with ./configure --disable-regex --disable-shared Building NCO with shared libraries on Mac OS X on may be possible. To try, first re-build and re-install the netCDF library using CFLAGS=-fno-common. Apparently netCDF, unlike most codes, does not set this automatically. Then build NCO normally. Mac OS X ships with a broken version of the POSIX cut utility which causes many NCO regression tests to appear to fail. In fact the NCO commands succeed, but the cut output fails. The workaround is not to heed the regression tests, or to install a working cut, e.g., from the GNU coreutils package.
  • RHEL build hints: Scripts for generating executables for recent (4.0.x, ~2011) versions of NCO for RedHat Enterprise Linux 5 (RHEL5) and CentOS5 platforms are described here. Older information on building x86_64 RPMs is available here.
  • Solaris build hints: All recent NCO versions build with autotools on Solaris 2.7—2.9. The most common problem with building on Solaris with cc/CC is that bison may be out-of-date. Install an up-to-date bison (e.g., 1.875+). Solaris 2.10, i.e., Solaris10, had the audacity to change the prototype of the ctime_r() function and so does not build NCO 3.0.1. The fix is to upgrade to the current NCO version.
  • SX build hints: NEC SX does not understand the S_ISLNK macro, preferring instead the (non-POSIX) S_IFLNK macro. This macro appears in the file nco_fl_utl.c. The patch I wrote for this may be broken. Will someone with NEC SX please send us a working patch?
  • Windows build hints: Building on Microsoft Windows is possible with Cygwin. The resulting executables will behave normally on local files, but will not have some (most?) of NCO's network functionality (e.g., scp, OPeNDAP). See the User's Guide for more details.
  • Windows build with Qt/MSVC: As of NCO 4.2.0, you may build NCO from source using MSVC and Qt, please see the NCO Qt/MSVC build page.

nco-4.5.4/doc/cdtime.c000066400000000000000000000016501264355130400144660ustar00rootroot00000000000000/* Purpose: Illustrate usage of CDAT calendar functions in CF library */ /* Usage: gcc -I/usr/local/include -L/usr/local/lib -lcf cdtime.c -o cdtime */ #include #include #include #include "libcf.h" #define True 1 #define False 0 int main(int argc, char **argv){ char *s_in; // disk units e.g "days since 170:01:01" char *s_out; //string of value (from hyperslab limit) cdCompTime comptime; s_in=strdup(argv[1]); // string with number units e.g 10 mm s_out=strdup(argv[2]); // output units e.g feet,inches, "days since 2001:10:12 00:00:01" //s_out=strdup("feet"); printf("system check argv[1]=%s argv[2]=%s\n", s_in,s_out); (void)cdChar2Comp(cdStandard,s_in, &comptime); // print out comptime printf("input =%s \n", s_in); printf("year=%li month=%d day=%d hour=%f \n",comptime.year,comptime.month,comptime.day,comptime.hour); exit(0); } nco-4.5.4/doc/debian.txt000066400000000000000000000327711264355130400150500ustar00rootroot00000000000000# $Header$ -*-text-*- # Purpose: Debian information for NCO netCDF Operators project # Notes describe procedure to manipulate Debian-specific distribution netCDF packages: cd ${DATA} wget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1-0.1.dsc wget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1.orig.tar.gz wget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1-0.1.diff.gz dpkg-source -x netcdf_3.6.1-0.1.dsc Debian: http://packages.debian.org/unstable/math/nco.html Gentoo: http://gentoo-stable.iq-computing.de/browse?type=version&category=app-sci&package=nco&version=2.2.0 Debian New Maintainer's Guide (Rod05) is Bible for packaging .deb's: /data/zender/tmp/debian.pdf # Debian Policy Manual file:///usr/share/doc/debian-policy/policy.html/ Questions on procedure go to Debian Mentors 0. Install Debian packages required to build new packages apt-get install dh-make debhelper devscripts fakeroot gnupg debian-policy developers-reference 0.5 Create key to sign packages gpg --gen-key 1. Create ~/nco/debian directory to hold Debian configuration files 2. Debian build procedure recommends placing entire package source in subdirectory of main package. For starters, we wish to create .debs of tagged releases, e.g., nco-4.5.4 First we create a clean source distribution of nco and place it in nco-4.5.4 Until we know what is necessary, however, we just copy a snapshot 2.1 Clean all build files from development directory cd ~/nco;make distclean;cd bld;make clean;cd ~ tar cvzf ./nco/nco.tar.gz ./nco/* cd ~/nco;tar xvzf nco.tar.gz;mv nco nco-4.5.4 /bin/rm nco.tar.gz;tar cvzf nco-4.5.4.tar.gz ./nco-4.5.4/* cd ~/nco/nco-4.5.4 dh_make -e zender@uci.edu -f ../nco-4.5.4.tar.gz 2.2 The preceding steps created template debian files for a .deb, Those files now reside in ~/nco/debian. They are now checked into the CVS repository of the main distribution Step 2 only needs to be performed once per package Now that the Debian template files are a part of the upstream directory, future work consists of building the Debian packages 3. Build new .deb package 3.1 First, remove detritus including *.gz files in parent directory from previous build cd ~/nco;/bin/rm *.gz cd ~/nco/nco-4.5.4 dpkg-buildpackage -rfakeroot > foo 2>&1 dpkg-buildpackage -rsudo > foo 2>&1 4. Find out which packages new package needs for building From Rod02 p. 14 strace -f -o /tmp/strace_log ./configure for x in `dpkg -S ${grep open /tmp/strace_log | perl -pe 's!.* open\(\"([^\"]*).*!$1} 5. Going backwards: How to create the Debian tarball source given the distributed Debian files, nco_X.Y.Z-3.dsc nco_X.Y.Z-3.orig.tar.gz, and nco_X.Y.Z-3.diff.gz dpkg-source -x nco_X.Y.Z-3.dsc This dpkg-source command is functionally equivalent to applying the Debian diff to the original source to produce Debian source: cd /data/zender;/bin/rm -r nco-X.Y.Z.orig nco-X.Y.Z tar xvzf nco_X.Y.Z.orig.tar.gz # Untar original source cp -r nco-X.Y.Z.orig nco-X.Y.Z # Create destination for patches patch -p0 < nco_X.Y.Z-3.diff # Patch destination with Debian diff 6. To synchronize .debs with new releases, follow this procedure: cd ~/nco/bld make tags # Put cute version-specific string in nco_ctl.c:nco_nmn_get() # Install correct version numbers before updating Debian # tags-query replace 4.5.4 with X.Y.Z+1 # If tags-query replace does not work, be sure to manually change # versions in configure.ac, debian/files, doc/ANNOUNCE, doc/debian.txt, # doc/index.shtml, doc/nco.texi, bld/nco_dst.pl, doc/VERSION # 20141201: Change NCO_VERSION_PATCH in src/nco.h!!!!!!!!!!!!!!!!!!!!!! cd ~/nco/debian;dch -b --force-distribution --distribution=unstable -v 4.5.4-1 # Update changelog (-b forces this version number) emacs ~/nco/bld/nco.spec # Update changelog # For unknown reason rules file may lose its executable bit chmod a+x ~/nco/debian/rules # Rebuild autotools so new version # propagates cd ~/nco;aclocal;autoheader;automake --foreign;autoconf # Save all files in emacs before tagging ${HOME}/nco/bld/nco_dst.pl --dbg=2 --bld --cln nco-4.5.4 # Upload tarball to SF https://sourceforge.net/projects/nco/files cd;scp dust.ess.uci.edu:/var/www/html/nco/src/nco-4.5.4.tar.gz . 7. Ubuntu PPA https://help.launchpad.net/Packaging/PPA dput NCO nco_4.5.4-2~ppa1_source.changes sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com # Location of build diagnostics for mentors to help http://dust.ess.uci.edu/nco/src/nco_4.5.4-1.dpkg-buildpackage.txt http://dust.ess.uci.edu/nco/src/nco_4.5.4-1.dsc http://dust.ess.uci.edu/nco/src/nco_4.5.4-1_i386.changes http://dust.ess.uci.edu/nco/src/nco_4.5.4-1_i386.deb http://dust.ess.uci.edu/nco/src/nco_4.5.4.orig.tar.gz # Becoming a Debian developer http://www.debian.org/devel/join/newmaint # Debian mentor FAQ http://people.debian.org/~mpalmer/debian-mentors_FAQ.html Debian Acronyms, Abbreviations, and Jargon: BTS Bug Tracking System DD Debian Developer DDPO Debian Developer's Packages Overview DNMG Debian New Maintainer's Guide FTBFS Fails to Build from Source ITA Intent to Adopt NMU Non-Naintainer Upload PTS Package Tracking System RC Release Critical RFP Request for Package RFS Request for Sponsor WNPP Work-Needing and Prospective Packages r-dep fxm experimental fxm (alpha, newer than sid) unstable sid (beta) sarge Debian 3.1 etch Debian 4.0 lenny Debian 5.0 squeeze Debian 6.0 # All NCO bugs http://bugs.debian.org/nco # NCO orphan/ITA bug http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=273322 # netCDF orphan/ITA bug http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=321336 # Debian QA member who was de-facto NCO maintainer Matej Vela # New NCO sponsor Oleksandr (Alex) Moskalenko # Former NCO mentor/sponsor Daniel Baumann Daniel Baumann # Created netCDF 3.6.1 package Warren Turkal Matej Vela , Daniel Baumann , Warren Turkal # New build system #1 # This builds NCO with debian packages, and includes netCDF4, DAP, and UDUnits2 support (?) # Non-native debian builds Rod05 p. 46 # Set path to avoid shared library conflicts between /usr and /usr/local # export LD_LIBRARY_PATH=/usr/lib:/lib:/usr/X11R6/lib # sudo aptitude install antlr bison flex gsl-bin libgsl0-dev libantlr-dev netcdf-bin libnetcdfc7 libnetcdf-dev texinfo libcurl4-gnutls-dev libexpat1-dev libxml2-dev udunits-bin libudunits2-0 libudunits2-dev cd ~/nco;cvc sudo /bin/rm -rf ${DATA}/nco-4.5.4 ${DATA}/nco_4.5.4* ${DATA}/debian # Cleanup last build. sudo necessary for removal because dpkg-buildpackage uses sudo? # cd ${DATA};cvs -d zender@nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.5.4-1 -d nco-4.5.4 nco # Export based on tag cd ${DATA};cvs -d zender@nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -d nco-4.5.4 nco # Export most recent tar cvzf ./nco_4.5.4.orig.tar.gz --exclude='nco-4.5.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.5.4 /bin/rm -rf ${DATA}/nco-4.5.4 # Remove cvs-exported directory tar xvzf ./nco_4.5.4.orig.tar.gz # Untar to get directory without excluded files mkdir -p ${DATA}/nco-4.5.4/debian/source;cd ~/nco/debian;/bin/cp changelog compat control convert copyright doc-base files info rules ${DATA}/nco-4.5.4/debian;cd ~/nco/debian/source;/bin/cp format ${DATA}/nco-4.5.4/debian/source # Replace debian directory with _CURRENT_ (main trunk) settings #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support #cd ${DATA}/nco-4.5.4;dpkg-buildpackage -rsudo -uc -us > ~/foo.nco 2>&1 # -uc -us: Do not sign changes or source files #cd ${DATA}/nco-4.5.4;dpkg-buildpackage -rsudo -sa > ~/foo.nco 2>&1 # -sa: Include _orig.tar.gz in .changes cd ${DATA}/nco-4.5.4;dpkg-buildpackage -rsudo > ~/foo.nco 2>&1 sudo dpkg --remove nco sudo dpkg --install ${DATA}/nco_4.5.4-1_*.deb cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress # http://lintian.debian.org/full/zender@uci.edu.html lintian ${DATA}/nco_4.5.4-1_*.deb ls -l ${DATA}/nco_4.5.4* m ~/foo.nco # Upload Ubuntu (rather than Debian) packages to websites scp ${DATA}/nco_4.5.4* dust.ess.uci.edu:/var/www/html/nco/src scp ${DATA}/nco_4.5.4* zender,nco@web.sf.net:/home/project-web/nco/htdocs/src # NB: Make sure RPMs build before uploading to debian, since changing # Debian versions is a PITA # NB: Only upload pbuilder Debian Sid (not personal Ubuntu) .deb builds to Debian mentors # cd ${DATA};dupload -t mentors nco_4.5.4-1_*.changes bsrc # Reset shell environment for regular development # New build system #2 # Pbuilder/chroot system # This builds .debs for submission to Debian Sid and ultimately Ubuntu # Configuration in ~/.pbuilderrc or /etc/pbuilderrc # https://wiki.ubuntu.com/PbuilderHowto # sudo aptitude install debian-archive-keyring # Avoid "Release signed by unknown key" error # sudo DIST=sid pbuilder create --debootstrapopts --keyring=/usr/share/keyrings/debian-archive-keyring.gpg DIST=sid sudo pbuilder update # Update chroot before building package in it # dget http://ftp.debian.org/debian/pool/main/n/nco/nco_3.9.0-1.dsc # dget http://ftp.debian.org/debian/pool/main/n/netcdf/netcdf_3.6.1-1.dsc # apt-get source nco # Get package source sudo /bin/rm /var/cache/pbuilder/result/nco_4.5.4* # Cleanup prior build # To pass DEB_BUILD_OPTIONS to pbuilder while using sudo, one must first # modify sudoers with visudo to prevent sudo from resetting environment #export DEB_BUILD_OPTIONS='disable-dap-netcdf disable-netcdf4 disable-udunits2'; # Disable optional packages based on available Debian support cd ${DATA};DIST=sid sudo pbuilder build nco_4.5.4-1.dsc > ~/foo.nco.pbuilder 2>&1 cd /var/cache/pbuilder/result;debsign -k6F635D10 nco_4.5.4-1_*.changes lintian /var/cache/pbuilder/result/nco_4.5.4-1_*.deb sudo dpkg --remove nco sudo dpkg --install /var/cache/pbuilder/result/nco_4.5.4-1_*.deb cd ~/nco/bld;MY_BIN_DIR=/usr/bin ../bm/nco_bm.pl --regress # NB: Upload pbuilder Debian Sid packages to Debian mentors, but not # to personal or NCO websites since most people use Ubuntu not Debian # NB: Debian versions are a PITA, ensure RPMs build before uploading to Debian cd /var/cache/pbuilder/result;dupload -t mentors nco_4.5.4-1_*.changes # RPM builds as root export rpm_root='/usr/src/redhat' # export sudo_sng='' # sudo not-necessary when builing in user directories export sudo_sng='sudo' # sudo necessary when building in system directories cd ~/nco;cvc;cvu /bin/rm -rf ${DATA}/nco-4.5.4 ${DATA}/nco-4.5.4* # Cleanup last build ${sudo_sng} /bin/rm -r -f \ ${rpm_root}/BUILD/nco-4.5.4 \ ${rpm_root}/RPMS/i386/nco-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-debuginfo-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-devel-4.5.4-?.i386.rpm \ ${rpm_root}/SOURCES/nco-4.5.4.tar.gz \ ${rpm_root}/SPECS/nco-4.5.4.spec \ ${rpm_root}/SRPMS/nco-4.5.4-?.src.rpm cd ${DATA};cvs -d zender@nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.5.4-1 -d nco-4.5.4 nco # Export based on tag ${sudo_sng} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/SPECS/nco-4.5.4.spec tar cvzf ./nco-4.5.4.tar.gz --exclude='nco-4.5.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.5.4 ${sudo_sng} /bin/cp ${DATA}/nco-4.5.4.tar.gz ${rpm_root}/SOURCES cd ${rpm_root}/SPECS ${sudo_sng} rpmbuild -ba --sign nco-4.5.4.spec > ~/foo.nco 2>&1 scp \ ${rpm_root}/RPMS/i386/nco-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-debuginfo-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-devel-4.5.4-?.i386.rpm \ ${rpm_root}/SRPMS/nco-4.5.4-?.src.rpm \ dust.ess.uci.edu:/var/www/html/nco/src scp \ ${rpm_root}/RPMS/i386/nco-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-debuginfo-4.5.4-?.i386.rpm \ ${rpm_root}/RPMS/i386/nco-devel-4.5.4-?.i386.rpm \ ${rpm_root}/SRPMS/nco-4.5.4-?.src.rpm \ zender,nco@web.sf.net:/home/project-web/nco/htdocs/src # RPM builds as user # http://myy.helia.fi/~karte/linux/doc/rpm-build-as-user.html # sudo yum install netcdf netcdf-devel udunits udunits-devel gsl gsl-devel libdap libdap-devel libnc-dap libnc-dap-devel export rpm_root="${DATA}/rpm/nco" #cd ~/nco;cvc;cvu # This risks committing unwanted *.[ch]pp files mkdir -p ${DATA}/rpm/nco/TMP ${DATA}/rpm/nco/BUILD /bin/rm -rf ${DATA}/nco-4.5.4 ${DATA}/nco-4.5.4* # Cleanup last build /bin/rm -r -f \ ${rpm_root}/nco-4.5.4-?.src.rpm \ ${rpm_root}/nco-4.5.4.spec \ ${rpm_root}/nco-4.5.4.tar.gz \ ${rpm_root}/*/nco-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-debuginfo-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-devel-4.5.4-?.*.rpm # cd ${DATA};cvs -d zender@nco.cvs.sf.net:/cvsroot/nco export -kkv -r nco-4.5.4-1 -d nco-4.5.4 nco # Export based on tag cd ${DATA};cvs -d zender@nco.cvs.sf.net:/cvsroot/nco export -kkv -D "1 second ago" -dnco-4.5.4 nco # Export most recent and build as 4.5.4-1 tar cvzf ./nco-4.5.4.tar.gz --exclude='nco-4.5.4/debian*' --exclude='.cvsignore' --exclude='ncap_lex.c' --exclude='ncap_yacc.[ch]' ./nco-4.5.4 /bin/cp ${DATA}/nco-4.5.4.tar.gz ${rpm_root} ln -s ${HOME}/nco/bld/nco.spec ${rpm_root}/nco.spec cd ${rpm_root} rpmbuild -ba --sign nco.spec > ~/foo.nco 2>&1 rpmlint ${rpm_root}/*/nco-4.5.4-?.*.rpm sudo yum remove nco sudo yum install ${rpm_root}/*/nco-4.5.4-?.*.rpm scp \ ${rpm_root}/*/nco-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-debuginfo-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-devel-4.5.4-?.*.rpm \ ${rpm_root}/nco-4.5.4-?.*.src.rpm \ dust.ess.uci.edu:/var/www/html/nco/src scp \ ${rpm_root}/*/nco-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-debuginfo-4.5.4-?.*.rpm \ ${rpm_root}/*/nco-devel-4.5.4-?.*.rpm \ ${rpm_root}/nco-4.5.4-?.*.src.rpm \ zender,nco@web.sf.net:/home/project-web/nco/htdocs/src nco-4.5.4/doc/dir000066400000000000000000000012551264355130400135570ustar00rootroot00000000000000-*- Text -*- This is the file nco/doc/dir, which contains the topmost node of the NCO Info hierarchy. The first time you invoke Info you start off looking at that node, which is (dir)Top.  File: dir Node: Top This is the top of the INFO tree This (the Directory node) gives a menu of major topics. Typing "d" returns here, "q" exits, "?" lists all INFO commands, "h" gives a primer for first-timers, "mTexinfo" visits Texinfo topic, etc. --- PLEASE ADD DOCUMENTATION TO THIS TREE. (See INFO topic first.) --- * Menu: The list of major topics begins on the next line. Info from nco/doc/dir ************************* * NCO: (nco). netCDF Operator User's Guide nco-4.5.4/doc/dods.sh000077500000000000000000000063721264355130400143530ustar00rootroot00000000000000#!/bin/sh # $Header$ # Purpose: Install DODS prior to building NCO as DODS-enabled clients # NB: OPeNDAP/DODS netCDF client library versions 3.4.X are obsolete # NCO versions > 3.0.1 support OPeNDAP client library versions > 3.5.1 # This file is provided for supporting older NCO with older DODS libraries # See file opendap.sh for up-to-date instructions # Testing: # NCO/SDO DODS server/repositories are at # soot.ess.uci.edu:/var/www/html/dodsdata # dust.ess.uci.edu:/var/www/html/dodsdata # http://soot.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/ # http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/ # Example DODS commands: # ncra -O -C -l /tmp -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc in.nc ~/foo.nc # ncwa -O -C -a lat,lon,time -d lon,-10.,10. -d lat,-10.,10. -l /tmp -p http://www.cdc.noaa.gov/cgi-bin/nph-nc/Datasets/ncep.reanalysis.dailyavgs/surface pres.sfc.1969.nc ~/foo.nc # Usage: # Set installation directory below ($DODS_ROOT) # ~/nco/doc/dods.sh # Default invocation retrieves, builds, and installs DODS in ${DATA}/tmp # ${DATA}/tmp exists on most machines, and equals /tmp when ${DATA} is not defined cd ${DATA}/tmp # Remove debris from last DODS install /bin/rm -r -f DODS* # Get about 2.5 more MB than we need wget "ftp://ftp.unidata.ucar.edu/pub/dods/DODS-3.4/source/DODS*.tar.gz" # Assume tar is GNU tar, otherwise must gunzip tarballs first # NCO only needs these packages pre-installed to enable NCO as DODS clients... tar xvzf DODS-dap-3.4.?.tar.gz # Provides libdap++.a tar xvzf DODS-nc3-dods-3.4.?.tar.gz # Provides libnc-dods.a tar xvzf DODS-packages-3.4.?.tar.gz # Provides libcurl.a, libxml2.a # ...or, alternatively, build all DODS files including server, Matlab, HDF, .... #for fl in `ls DODS*.tar.gz` ; do # tar xvzf ${fl} #done # Copy patched code with gcc-3.4-compliant fixes before building scp dust.ess.uci.edu:/data/zender/tmp/DODS/src/dap-3.4.5/RValue.cc ${DATA}/tmp/DODS/src/dap-3.4.5 scp dust.ess.uci.edu:/data/zender/tmp/DODS/src/dap-3.4.5/Byte.cc ${DATA}/tmp/DODS/src/dap-3.4.5 scp dust.ess.uci.edu:/data/zender/tmp/DODS/src/dap-3.4.5/Operators.h ${DATA}/tmp/DODS/src/dap-3.4.5 # Go to common source directory shared by all DODS packages cd ${DATA}/tmp/DODS # Set permanent installation directory (/tmp is not permanent!) #DODS_ROOT=/usr/local # For server (rather than private) installs export DODS_ROOT=`pwd` # Set compiler environment variables CC and CXX before executing this # You cannot do it on the command line like with NCO # On Linux, it defaults to gcc and g++ # On Opteron, may want to set 64-bit? # 20041222: DODS configure scripts do not recognize GNU_TRP=x86_64-unknown-linux-gnu # CFLAGS='-m64' CXXFLAGS='-m64' ./configure --prefix=${DODS_ROOT} CC='gcc-3.4' CXX='g++-3.4' CXXCPP='/usr/bin/cpp' ./configure --prefix=${DODS_ROOT} # Build necessary libraries make # 'make' usually fails because we did not extract (and build) all DODS sources # This is fine since 'make' fails only after building the libraries that NCO needs # If 'make' works, install DODS libraries in ${DODS_ROOT} # make install # Keep DODS libraries in ${DODS_ROOT} so NCO finds them and in the darkness binds them printf "DODS-enabled NCO may now be built. To do so, set environment variable\nDODS_ROOT=$DODS_ROOT\nand then re-build NCO.\n" nco-4.5.4/doc/doe.jpg000066400000000000000000000506521264355130400143340ustar00rootroot00000000000000ÿØÿàJFIF``ÿáExifMM*b;€@@@ ’œ›:žœ$ØUS Department of Energy logoUS Dept of Energybsf.org.ilUS Department of Energy logoUS Dept of EnergyÿáÕhttp://ns.adobe.com/xap/1.0/ US Department of Energy logo US Department of Energy logo US Dept of Energy ÿÛC   !(!0*21/*.-4;K@48G9-.BYBGNPTUT3?]c\RbKSTQÿÛC''Q6.6QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQÿÀ),"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ôê(¢€ (¢€ (¢€ (¢€ (¢€ *µÝõµ¢–@1ïXÓk—7 ‹(Oùêÿ*þg¯á\õq4é|L¸ÂRØèDŒeØ(÷5Bë[²¶á¥út®ZþúÞ ¶¥©ÇþYÆvçÿf5‹7Ší-ò4ûŸï°ÇøšãúÝj¿ÂMS‡ÆÎÕõù¥ÿ[9x®æqU¥¾Ôæ"1þÓîþB¼þëÄú­Á8™bì/?™¬Ùo.îïne|ö.i{UOŽvþ¾FOJ? ¹èÒ\²­ÔàýÔÿUŸR±ë5 ~+ûÉRÿf›h-°àS­,nod1ÚÂÒ°!qÒ§ê1ÞS'ë’ÙDîµ4¬ÿÈ\çþþôÕ4ò~Mh¨Jâ›EÔæ;cn|é*<~.Ž\.¡`þÒrÇõ«ÿl§ýâ•jò=Jˆgº‘[ÔÈü*Zàlµ->ð¯ØïÌoÚ9¹ÇÓ<¶aÕo­ï—ÌûÃçŸQøæ®õ~ZªÌÓÙÝ^.çKEP´Õ­nT|á àdð~‡§õ«õß Æjñw3i­ÂŠ(ªQEQEQEQEQEQEQEQEfjZÄV˜Š0e¸T^I¬êT5Í&4›vE니­Ð¼®kçY¸¼ÊبXºŸ…ü;ŸÂ²u;Ø¡Ss«ÎçåNF}ÿ¼Jäµo^_“$ÛÁÐûÄ}{}y®µlKµ-#ܹJ‹s¡Ô5;Orf‘¯n‡cÈSôè+œÔ•^Ù7øjôcîO~`ŠÝðæ©£lt­Cåv¡oùh¾ŸQD éNU!µõ^AЬcN{ÛGæcß^ɦxPš4 +åQ›ø3ŽkkÁm,¶w×;;4ƒ,Ç=ÿ¯Xž*‡Ë×§¡Oé]„Å᛹q÷™È÷Šuc«©[W`¥9}eÆú+œÝ¾³"YÞØ\—–ÞemœäÆÙãÕGKÓ'Õ/’Ò7,Ç¢ŽäÔXŸZëü o¤8Þß𮩥F›œNHIר¡&gë6:†RÔÛI{rF]šR€~UFóE†]ko™äVXd9hϱî*¾­3]ê—3±Éi>•×é­¯&i‡¤’`ûð?¬dåJœfÝÛ7-Z’‚VHàÅ…ÓÚ´Úv—Q¿¥[ÓõÝGO#Êœºà~EuÞ¶]3B¸ÔçàJ7sýÅÎ?3šÅ²“O×õm}j–ÓLÄEqn6óØ0è~µR©ŽQ”n£FVlаñ|ÀN •ÉãzýÖúö?t6Ú…Ý‚‚H’ï ”ÿýGµy•õªÚßOn¯æœ®ìc8«šV·{¦0¾ø»ÆÇÃÒ±xYC÷˜wòþ¿Shâõäª^²Ô ¼#mr3°ž£Ôz¥[® N¿´ÔW}›ˆg3BÇŸQè}Åt:~²U¼›Ì‚½Y‡+õõíÇ­eß%Ufnàšæƒº7( ÀAEè…Q@Q@Q@Q@Q@€2N $à çµ]NK™šÎͶ…ÿY/dãè+ õãF<Ò*1rvCõ=]ä‘­,p_;ŸºƒÔÿ…rš¶·o¤ïŠÜý¢õþû·o¯ öS]×’ÍOÓOÌï%ÎN~½ÛùW/2ÎäF#žNÐXן 2Ä?k[nÄÕ®©û”÷$f¼Ôï2Ûçúý=lG¥é¶ÊÕfqpë#j{ç¹§‹…Ó´+w³O&åäÛ1#æÊö>ÞÕ¯q >"Ñ–h@§AýÖî¿CN­ih—» ÛMÿሧIkÖV¾¥m+S•f¸µiÖï`ó"eÜ£ª|sW¦°·Ôä¶Õ,|Äulÿ|È>„W!o$¶wi2‚²DÙÁõEt9ºÑîÍý´E´éÀ¡8=¾¢¦®’|ÔÝ›ü|¾aKϦ´_‡ŸÈ»¢Ì­u¥MÈWf@{©<×õ®oPÒ籺’6¼ ÛVB>RNjܺ¬PkWÖ‘‡.?vÏ‘´‘Ïê5‹W×%ÜYÇ©áô­hÂT¥Ï²i^ýÌkT…XònÓv·cfòÿL}; »¢òª(c݆ý+.-^ÚÆÖ[{ 2 ªU敲Ä~*ä^XSÌÔ¯âGP¿âx¦µÏ„,8ËÞ8ú·òÀ©‚¦ï^^›5ZMI¥wÜ϶×.ímE´ G›÷@–÷9ëT‡žÓyÈŽvàQHÁöÇJÙ>1ÓàâËFQŽ…‚¯øÔMãËïùgcv&º£J½Û…+_»FN”ZJu6ò(\‹û©|Û„žYÆæCš¶ºÞ· …ûLÁ@Æ8þT¿ðj¿óïoúÿ=|y}ÿ-,`aìÄU:†¬é'óCTàÕGs&yšyšWÛ¹ŽNÕ~B®hÚ¤ºMð¸w¡dBq¸__ØOÅæŒ§=Jío犑n¼!Áßfç×*?¨©“©òÔ¤íå© ù¹¡5¸ª-´k‹Ã9ÔšvmÍD|Áìãñ­KûÙµñ™¥[ȶ*Ê&Þ÷ôTxZ9ãótÝB9×°b?˜¬©¬õMo0¤ÐÒD<~b±NKZWkdÊ~Ò•ù¡d÷hê¼Q©&“gma1H¥pÑH¹RƒŒçüE{Ëio¦¢A %Wg8={â©jœú’Æ×J2 y a˜zÕF®Ž•'-Ìëb¹›QÛò+<²¼’Îä³S]‹áÕÕ4I&}ž@çʘç;î€÷úÕ JmZýa/Í+ŽËþ&ºíwΚÈéZG–^0H•€eNØÏëKW•ªpv‘xj\éÔšºüÎæÒïL¹Q (ÝRD9VªGZè´~; –ÚÙ ÿW:ðA¨tÕ[3{¤ê~TЬFP¡²Ç`{§¥a-´¯o%ÂFL(ÁXáÏLÒ”!]8Ïu³õ)ÐjPëºô=&Âþk ø› ^ýŸËÒº8eŽx–Xœ:0È"¼³FÖü”wْٸ z¥u¶W’ØL¤7›œñÿ-?ÁÿŸÖ²¥Zxi{*Ûtgte ñç†ýަŠdG<+,LdO¯U;QEQEQEQYzÖ£öHQ ÓÈvªŽäÖu**qrÒ»²*ë:‹É'Ømo#.ýzŸé\Oˆu¥´Œéº{ßòÒLó“ןïÒ­ëÚ§öM©·Š@÷³üÎþžÿAÐW2I$’O$šóhÓx™ûj›tDâ+{%ìá¹wJÒçÔ®6F6¢ýùEã[CP“E¾PÚ*@¤Ÿ¿'ûY¬{-BîÏËÌB#nÙØç®k²´–×Y·Žê8ãûL?t?>[{úŠx§(Êõáýng†å’µ7iÞ.Uûd$! ³ælp}?¯áËÉm5$¼s®ƒùþ°ºÿ—+Új¶[Yxb£púàö¬­VúÍäò´Ëd‰ æE\3oAEgOØÊ?>‚­Êª{hÏåÔ±â)4ϵ»ÀîOÞ*~@}}ÍT·µÕ5Ù÷ÒÁ‘ÎÏ ­ ?@†ÞßíúÔ‚Tn‚Þôúuª:¿‹¥•>ɤ§Ù­—€àaˆö¿kF•©Ð\Íu{!JmÔ«î§ÑnýM'µÐ|>¡õ …Ý×Q3ù/øÖ^¡ã;û€b±m"Œ¶?®sk;rY‰É$äš•c¯R–Y óU|ÏÏo¸‡ˆä\´ÕÙ主“}ÌÒJÞ®ÄÒª` S”!Td“€zôãN1VG+¨äÈDTôÕ »pFIü+²Ó¼)h’_³I'Sœ(öÏS]NŸ£ÚZ¸Óm!·¸*Ue²¿C^oö¥ Iž­kRÉÏCË'Òïm—uÅ•ÄKŒîx˜Ï[Ë‘^Ù¦¦¦ P’~ûWýkÄ^ ³Ô‘ç° iy×å»fÔVÔñj_E<3_ <°ÅM1U™¢šÞækkˆÌsÂÛ$LçëM®åi+£‘·fA Ïm'™o+Äãº1Ðiþ2Ôm€Žõî.‡pÃcùÅ cF sÖÂR¬½øÜÖž"pÙ”pè!ÙKö;³ÉŒŒsôïøV.§¤^i‹ˆóé"ò§ü+ ÆUƒ) ƒGWE¤x¶{eº¢}®ÔðXŒ°Ö¼ª˜:Ø}i>hö{ü™³öUþ/u÷4ô?¤5½ÌqDì>[…@8ÀÞ_­VµƒY±Ô$¼q$¨ÁeŒîS»øjkýÞòÛíú$‚X›“=>ŸáXöº•Ý’5°šU›çŒ|zâŒc;Ê–ïtÂR6£W¦Í¼x`hÝ®Y°W©-]‡¬-ía¹„°š^sÕ_”zãÖ²gk]7M[­1ÞWº% ïÑëì}ëCÃÿèÞ¸¹=X»gè1Ybg)ÒÓE·ÌÓ N0«®¯DrÓǺâsgÊF'£5«¡jâö+̼Ϳÿ¦ÙmÑâ7wKºâd!-Ï÷ORßáY׬¡î­á1Á¸)]ÙÚOo¥t>ZÑörZwó9×5{H½{y‡a{&ŸpVF/ üÄâÞã¸î9í]2²º†R ‘Gq^gáíLLƒN¹rs™åO¥uÚ-é†_±Íò©l(ìéô=Gâ=+5YQŸ°©ò=%(Ö‡´¿EW¨fQEQEEs:Û@Ò¹Þ¸»íE`‚m^䜰"=p{ýOò­mrãí—‹d­û¥¥#û¾Ÿ‰â¼ïÅ™¿Ô 1ŸÜBv€:ßü+ɬÞ*·²_ ÜÒRö4ùº³.æâ[»™.&9w9>ÞÕÓ $–±<7%e( RqÛ‘§hw×ñyÑ"¬}™Î7}+NÕ/„gNÞðßÛüÐá±æ'uô>¢µ¯;Z4¤•·9(Â÷ubÝö(Ýhz…¦KÛ—AüqüÂ&âkKøä…Âr–û»sÎêܽŒÉnÁn™%¹oj¯â=Mg—ì–ªœyŒ eϧiB­Y®IÇ~¤Ô¥J ÎÕt­jï©Oö[4>Q;FÍ'ÿ[Ú¯Ameá‹1©%áÿWçiôþý¨¶†ÛÂúiÔo€kÙ#ºç°÷õ=«Œ¿½¹Õ/æé÷1è;(ô¦ íýÊzAnûš6âý­_‰ì»jÚµæ³sæ\6#䈕ÄûÕTŽœ‰Š’¾Ž•ÓŠŒU‘ÅR£“»¥  p±‹bbŸ¥Iª0aøR…§„¡¤Õ˜+ô5çñN¢÷Ь)ï•YI8÷æ¯éÞ0™f‚•0¤’y£`BgŒí#×Þ¹±2xóŸîšóž[†Q÷cfº‘ÅVrÕè{zT›sËc§T[þÃoæ}ÿ-w}qS×*;ñ„^WŒõ%Æ7ì~*+'Ñ|@‹gcýmªŸÈ‘ý+­z¸wzhóq Õâ)­Ì.7¦*²7–C~ƒ÷‘žçÐÿC\s.h´º¹ÓnÒêÕÊH¿‘‡Ú¼¼fÚ?iOI®½ü™×J²k’z¢y°HðJNc]T:Å¥†í‘&˜®<¿FÎNi.b¶ñf—öë0#Ô"’?_cý sZ}ÊÙÞ¤À$ˆü’Æãœwú^D’¯Y+8½Qi<4îžf_³°½Ö®Zfc´Ÿžféôµ·sý•£Øµ£©“Ì:ŽY½Ï¥3YÖÒÆ­ìxÃ$€|¡O¥RÕ‡Ùâžçq¿’ Y#n3ަ¹›WdÔz%¾†Ê0¢¤âï.­í©—wnÖs©G&6âì~µÕé—ÃS°ó7²¨à²ú~ãÜW=ssºM”`I0äŸî’O›y.—¨¬¸#iÛ"úŽâ¶«M×¥¯Ä¯o?øs u º|.×ò¿ù­¤^ý®ÛÀÍüC³~#õÍ_®NÖålˆæ¸î‡–‡ÞujC(`r ŠèÂWöÔõÝÕ#ÊÅ¢Š+¬Ì*¶¡t¶–rJÇf¹Ý~Qs{ –~AóÉþèäþg¹ñ5}•7"áiXç5»öÓôw”œ]Ýœû®zÀW!¤X6¡¸È^®ÞŠ:Õ¿_›í]ÔÇÈ1Ó=ÿÃð¨ìfÔl`w·†HÕðÆ_,ôþ•ÉBœ©Ñºø¤sV¨§VÏáFõÖ¯§_ªc€±"Œ¡^Â^í˜ä„ì’#³u«ºg‰b”,Z‚oùèTýGj–ûÃöRƒ} ×—ùäþ G}§Ö±ƒT¦½´me¿sI©U¦ýŒ¯ÀÎÕâ°[hî‘Ynn”IåòÇž§ñ«^±†ÒÕõ»ü,Qb ÿ¡…fé6TÔÖ-ä¯ÌÌO*ƒüâã=Ynn—KµÂÚÛ`0^…‡oÃù×Tiʤ–/}[ìŒaÊÛ¯%¢ÛÍ÷25}N}gPk™rqt@‰ŠHÒ¥¯¤£J4â£dŽJ•Ø´ PH«šÜÄE\Ôª”äJ•V•ËQ©O R§„©-"-•­áí]Zù2‡ì±¸2¹è@çh÷5Ÿb××±Û†§—ôEî ÷"½FÎÖ+Xí­Ð$h0õ®jõ¹W*Üè¥Nþó&¢š]D ù˜¨Aý´ò]$rkWÙ.9Úpõ¯<ë8O‰V¾^¯¥ßcå‘}úæk–d¯V×ô«h†•~lIËÈVÒ¼ºH§·¸–Òî?*ê¶DþDzƒØ×v¢·)Ɉ†¼ÅfZŒŠ´ËQ2×mÎ')*B)„SbSYr)ÔRí3P¸Ò5»€ôáÓ³¯¥tž$±ƒP±MNG™GóúŽõË:äV׃õaezl.Nm.ŽÜ7Ecþ=+ÇÌ0Í~þŸÄ·óGu ©¯e=ŸàÈô{ÛWˆØj1`'1ûÈǰúÒ<ÝÞ´è. ©Ã™ð6Ÿ­Aâ 1´Qá\ù/óÄ}½? Û#“ûÝ£A%Ó7”Àÿ{±Ç|ו9IZ¥y¾â£Êôêéo¼–×D´°Qq{2»¯<œ(?Ö²õ‘ÄŸnµmÑ»m~1†ÿëÖÅÕ‡Ú4è#Ô.B]3d9è þ¯yc›¢O“{ÈAÉã'¶rR­ûÅ9I¹^Öéc¢­qÂ1´m{õ¹7†o Å›Ù1ý켋=Çq]Ÿ‡î„–ÆØ“˜°S=vŸ—#ð¯,Ó®ÚÆþ•?q¹÷ë¾µm5§Sû¦ÁÏm€#ƒù×D¿Ùñ*]$N§µ£Ê÷‰ÕÑEê”6GÆÎz(Ípú…ï‘i©1ËR?|‹ê5럳i’0ûÄqþ~¸¯=ñŒ¿g°³ÓÁçŸðÿëŸÒ¼¼_ïkB‘¢|”ÜÎjÊÝïob€ZWÁ?ÌÖì·í©êO[†µ´ÿTFrz ÕÝ[XO-ÜùgEÛ/Sž§òþuÓÚÝhzÄs\«]ãcgù13jwqm%£ìÎj¼,¤“oð0.4—Ó.bûYŽX €Þ[ó§QSê±É¤¤šbJXJ<ã°"´nü-$—&t¼ ŒÛœÈ9¿#­gÄŸÛ~% Ï”Ïϲ/ÿªœ*ª–”ÒW¡œé:wQVmÙ~¥øäð£Ý‘‹Ë¼l¨ÏÝü‡5ÄF 1f$’rIîk ñ¾¡öÍdZ¡ýÕ¨ÛÓqëú`V$k^Æ[Eª~Ö[Ë_—Ab$£jqÙ(À¥Špë,rŒÔè´ÈÖ§ACPåZ¼tËØì¾Øö²­°]ÆB¼c×éUT{f½B{ô] _[Æ'#Þè§€|Ø÷·¶+šµWNÖGU*j[ž}—|â¶’°™wÆBðîhº±º²nmÞ0ìN3¹@=Íz˜¶¿Ùq}…Ã@Fø~l¨û>ݺUm`ÙÅ¥¼ÓÇæÙ±Û>Oú±œdý§#¯jÃë2¾ÆÞžžÚÅØ··Ð”F®¯9•·I  ÷WžGZ†ë[ñK<šrZM¡¨;²30+@tŒàrMwÁT[Æw´›W Xå˜zûúæ³µ/²Å=’LG,£ÈX|’ã€lŒCÐõ¬”Ú5JÊ×0¥Õußìô·Ót‰òİIu.G·®Ðy$õçõ®D³Ö´ËÛ¡e5ÇöK€Sp ç©ëßžµéóÉ ÇÜÓ±þŸ•g–·ÄC xî2и?ëcþ%÷àã·w§¥}âßS‡Óí|UmæÜØË4 3™i1sÉÂ7N}*Ä:î±vu+£öm›y8ví=vœzgõ¯Shãi63`7(AüÇõª:sÛ6«z»Z+¤Ú“¡ ‡ùúäpàzSDÔDàÚ³gŸÉ¢j‰•¬f OôëTÚÂëì }öwû,ŸvP>S^°Ñ†ÜædQ»‡oðªz7Ønì'XЈ¥‘ÖX¢>pëŽÇ=Gâ:Ö«.¨ÍáãÜòfZŒŠÑÕ-’ÏT»´·,”Û¨þuE…wÅÝ]+±”ãM5D¡*WÒ§¦°È©j註3¬cÿ /„<Ãó_Yp}Nõ­sþ¹†ÛW‚IÔ'nOð“ÐÕ¯ßý‡]XþæèyméžÇú~5[Ä6ÙÚÜðˆØïO¡ÿ&¾jtU*³Ã½ž«ç¹èN\ÑeºÜÚ¼¶»Öõ9T*Úݶno^øÍI6@$¿“pè_ª“j’Yè¶0Û4±–i:œäçñ¬¹Vr‘Ï3‚U‰ÎppkŽ*ÎÊ2åKEÝ•V¥%w(ó7«&¿°–Æ@«£}É£WM¢\ ½ÎM»ßýÃX6ÖóK¡\·XÕÕé×¥ZðœØ¿’ÕËq÷*± Ô£$ÝÜYžªu¢Ò²’=+I¸k:&s™l÷‡ùUÊÂðäÄK< ~ð¯Ýoä?:Ý®ì=OiIHëš´š0+†ï1SŸoëô'ùi(÷64›]:ÖÕ/µL¿˜O•ÈÈ­Èo<7x¾SÅ yàogê*;¿ ›¸­Ê\ùmKÖ\ŽgKámN.Qc˜°ÜþF¡J•gÍ*2«EZ0M5?BóaŠi%µºˆˆ²ÙsÏéüéÞT´±¿Õ$émR}†Oôª”wÚ-•­Ò²JØ+uUàëVõVû€ „p÷L3øœÿ!ZrsAS[ÉÚýÑ1w«ÍÒ*öís2<ó¼Ò¼ŒY¾¦§QPÄ*zúÈE%dpTwbŠ‘E0T¨+C.¤È*t I²GKi¢X½„É0i1Á¥=´}5£xþÙt¨ã ©6ÐÃÐÖuÿ"˜ÿ¯SüyØé_'¸šÓšUIžIS£Þ7¹è1húu¼"+{ëÈ#ÃÆÑúS…¤›f·W"9hÄøVïÈïø×F¥kìñ?ó÷ð1úÕ/äüOAþÉÓÄBê7«6ùkrBãÓš“,QÄ÷W dŒÏò©õ¥pxö¥ =(öxŸùûøÖ©'âwói6§—6¡y$yÎǹ%*cèÚl“¤ïyrÒÆ0ŒÓ’Séé\:®HdúNz =–'þ~þ¼e/äüNÞM*ÊGG–þîVC”ßp[iõ†£]Á.^åon„î0Òý î?qØ‚ŒAKÙbçïà/®ÒÿŸ‰Ø.×ÏóþßvfÆÑ!¹;€ôµGil\ÛÞÝB\îr—>§Ö¹,A[Úƒö…[»´ÄQûþçÛùÖUUzQæ•g÷ÒÄB¬¹cOñ.§‡ì»<ÇqÉ%òI=óÞ¹bC4˜ ì£ð8®ü`0@;WŸ§Y¿ë³ÿèFº²LUjóš©&Ò°ñô¡§a†šjF¦úSÈCi)h¤Q–ÖD8e!ô"ºßÔ4};XŒ}å ÿˆÿ\¬£"ºþ&½´<½³1_ýZñ³HòòU]àÎì3挡ݺí˜Ck¨¢< —œgiî?·ªßØ_Yùvÿ»hH( à0îbéÅu¨EÙÙ&W ô8àþuÑ[øb(ÙZâä¸UWh?yý*¼óm=Í){j”ù"“[ô«[EcY‰QdÐ1þ¿Z£e!³Õb“¡ŽPçŠÜÕõ'°U·µˆÇ€0å~P=s÷†F¹y$ËgùöýyªÃ9ÕrrVŒ¶FX…J);Ê;³ÑlŸÈÖ¢ ü¬å?ª×O\Tsî¶´»|¸äüU†L×kO.—¸âú3Ñ««Mu8»§òÛP—þyÄ£ô&¼Î&*êãïúסê/VPþ9ÿׯ;ZÏ/WælæÆ½b‹ëyç´âæE‘ÎIV#šÔµñ&«38”zH ÕmL‹R’o:cD ázœÔ7¶ëkxð£ïUèÞÕÕû‰ÍÒkUär7^ö©èËÚæ 5K¸¤_ùäª@è¿ëV¼|ÞTzmèˆN>€ñ¬‹%ß}nž²(ýE^ø€ûµè“²Cüɪ£MGN eviJnp©Qîìsñ 𣋥I_H¶8¥¸áSGPŠš:d­Ë S%Bµ2T›£©ºÿ‘PשþF¼ñFH=ÏA^…uÿ" ÿ¯Süyü%DˆX€¹%w~ëå0Ÿ_S·´=»Hð¿›i+N 3*õù†C ¬8*GÔjþT‰ÞÚ=ÃsHy™‰8<*ùÖ΃¨[I§EmŒ‚P„yQÔ…àg¿zvµul–N’íun¿(“`¶ž ¾•ÃSUWJ'LhÒö7gœIE#FøÜ§ÔT–ñ¬’a³€¤àu8Å6^eo¸y럠«VNè?ÑÝc¹,6±ë@{×¶Ûå¹ã+9XдÓ>ÓiºÂ;„¹o”‰WŒu;X§Zdö¬³EæZÉûÁûÉ$V^Gã·LóZÈ!ŽxÒ6âÝ Ê1`Ò`r9*9íQ]´ëm[´Ðù'’^\mLŒ)Éïút¯>5¤ånç\©G”æè©®˜3¯*Òcçe×MáÿU¾ÔWã„ÿ3þÛR´iCšG%*«>Xø{ÃÞ`[íAqTˆÿ¹ö­ËÛµPp@}_߀¬KUÉ8W«êÍzÆ(‰Éîÿ_ojñ­SSÈöwƒ§e¹×i÷ už2YK:à×ü¶ÿ®Ïÿ¡ë|2?âE ÿm¿rQÿËoúìÿú¯[&‚†"¬WK~¦8É9Ñ„ŸQ­L5#Tf¾œò:4Ph¤1®>Zé<û§ÔmÝ’ ØúZç¥løöøŒ¯÷áqüyÙœy°Óô:ðŽÕµð`>hdéô5bâò{©ÞGÃB–à{S5Tòõ‹Äô™¿2Ú?:xâÜ{ÉíšóR‹J£]›’n õ/Zê7Vë±dßxä—ò4ýNê;ÙcWk”ÔtzUcI‡NEh§2sµƒÔVUgIRªÕh"k:´“¥3²Ó›áÛP’Gúîíͳ‚OïF­ùŠà¼8whqIØ~b»]·hÖgþ™/ò¬0zV©3Õ½éAùf­Ÿì=S×?û ¯?ZôMU3¥êÉèÿÇ?úÕÄèv±^j°C1ýÎK?û dÿ*Ï%M¾ŸäeŒ‹”â‘´“Fû gVé”ÎjåµíݪÁ34Œb‡¿rk¥ÿ„·N¶ýÕ­›²/h? Îá¶ÃåÏ9“Ÿå[ûj¯XÓ9Ý+IT0l¡0k°@ÄÀRG|5/Žóÿ )ÿ®KüÍ:iâˆ[15Èu=8, ;Çé·_û4#ùšè÷õ¨7Ö,)¤©M.ŒÃ¥>£¥I_D¶8žã…MB*D4É[–V¦SP)©TÒ6GUqÿ" ÿ¯Süyè¯AœÿÅ+ÿnÇùóñÒ¾OñÔõ;±¿ = Þ\C$rT·© ÐgÓÚ¤¸½žço˜ßu효)â»y#{ØóÜåk\QRÛ¸Št‚BœñÖ¢ñVÕô3½‹ÖΩ%¶ã:èÌ0}ÑëO»$0Àè]¢\n±–''·©íéTØ"©fc€É&»m@M9îõC]•N¢?þ½rÖ”(®i!:Ï–; Ñ4%¿´uké èžçÞ®j:‚ª³;…U$ô¥½Ø\wˆØ·– Ç^|œãÄ×,][Iè{ G JñE=[T{ç(„¬ðV÷?áYÀRâ” ÷©Ó8òÇcÅIN\Ò;Ÿ ø§ã?ôÐÿ:ããÿ–ßõÙÿô#]Ÿ†üS‰ÿ]ù×fÿ®Ïÿ¡YWûÍ_—êwbÝà Qš{S }å 4Ph¤P‡¥kx+þFˆë›ÿ*É=+gÀë»Ä›¿¹ Ÿä+‡0vÃOÐéÂÿÚçü‡¯멪ÉSjï¿Y½Y›ù×Omi£Aaß$R –9ƒî;W‡*ê…8Ý7~ƪ‹­RVv±Î‰.nŠ©i&#€9lT÷ÛZG<êc21P„s€:Ö÷öÕ²YI5¬b0L`(9ÿõVV«ª FÞÈDfÈ1Æ*)V«9$¡Ëê*´iB-¹ÞVÐÜðÇüÇý|Jí4ùYçþyŠã<66èˆ}gcù ítUÛ£Yúd§ô¥…ÿx¨vÇø0ô9{”óF¡üô‰[ùŠóí*ålïâšE-ʸJ‘ƒúô˸|XÅÙ¢+ùa¿©¯/»ˆÁ{\ò:ƒüëvÿ|½D¿tÌ¡NÑN$2Oa]'+5|?u5®¤†ÞÒ;‰ŸåPùù}Áí]ýÌcÀŽpkÃúRé6Ÿi¸Qö¹GCüÓëU5ÍemЀwHßu©ö¯?oW’š»=Ì, \Õµ«%ªm\4­÷WúŸjæÅÅÞn%|³üÙëž=ºŒ{Ui$y¦2ÊK±99ï]/"I"£)?ý~pO¦}«²ªÃÝÝîÎ:•¾±-vF ͳÛI±ˆ çwÆqÚ¢·Ûì>lI¨4‹$ü¤õºã¡Ï5»’‘Û-ƒgvþI=±šÞï%ž½zJ•“’kNN“Ãþ)¨ÿë£:á×ïMÿ]ŸÿB5ÝxhÅ1ýtoç\ ?4ßõÙÿô#ZåïU~_©×‰ÿw€a§i¯¢<´%QH¡­÷k£ð bîþèô޹úœÿJæä8Zê4ô꧆˜/à6ÔšòóY[ãÞÈíÁ¯›±Ë;y×.ÿßr3Zía}¤)›íQDÿÝI9oýRÑ"Yu[hÜ7dÐ2?ZK“;]HnwyÛŽíÝs^l¯)ªkkjEÔ`æ÷¾†¤7Ñ^ÄÖ÷6Åwí%ºó:•ïMÕím­ÑmŸÌWŒ¹“ûù5JÍåŠæ'ƒ>ha·Ï¥[×bú¬Ð¦v/*¹ásÎâjU5 ª1v[ØN§=)+½¯ø”<Ÿ@}RI?wVIåXÁ÷cQúWl-mGSqþ,Ã?Ö»qÀÅc€÷¥9÷g§%ËDz9ÿ/•}oqŽ.~Ÿtÿ1^mâ›o³ë³qÄ€7ô?ʽWÄþ}ÇPqùôýq\Œ!ûE­úŽ£k}ý`һƈŠËš‡¡^ëÄ“‹K%³tŽe€,Ò÷1“í]böv­­k3»M·r‰XŸ-}~¦¹¿Ûéï{%Ö£¾øô­kZMû,oss4)Ï•… }Kð¢¬R~Î Õ˜Ó“kÚMú+™Æ£s­ÝK:£y.U?¸¹ÆO¿"´|3¶ûIÔ4©ßRËøŒ£?Ê·“ýéÌ—îÌ¡]o„tBøÔîcʯú”#©þ÷øW$ÊQаÁWgáGÔ&®î®åû$cb!<1ÿF.MRm; º©5sORyI ä\gÅjÖm ‚Y.Öi$9ÆÒ¿JèµÝ]b$ 4÷WúŸj䥑呤‘‹3rI®,¾”Óséùy…X[“¯äG¶µ¬Ù"²L˜päù€œà:{YuÊ•à·Ù0ò_¤õÍzURi&y´›M´A©ŒÞ;•NFyãÞªW/•• Üo%r U#Òª &oÞg} §—á{\ÿfýMyìm¸;yØþ¦½çw†cVãɶÉúã5æ¶ãmº×£(\ÕªÏÓõ=g»J$4ÓJi+èO5RHdRåˆU'€=k¬ñN4ßiÚBŸ›¿áÉýMexNÃûC_œfÞ¿áÐ~Ê™â{ÿí rgS˜ãýÚþ\×…ŽŸµÄFšÚ:¿Ðï‡îè¹wÐI±žá'¸·Ýæ[íd ݳþЭþŸzªš¥ºÃp8"U#ò5¦j“iö*¶öÛÁrÒ»ƒé‚:V¼:ý…Ò„¼€¨?ÞÖ¼ŒLjÎmòÝ-šz£z§¥Í«Ý=‰ÖëCÒÇÇ$À|¡>cùö¬Ìšž°…ùyåüÿ·/m´ˆtɯíˆòÔʆ>Ǿ*… ß©5Á-¼e¿À«¤ã S«­×s:ÊS© ZYë¡ØZ ŸZ·A÷D†OÁêk¨¬DZòâsÿ,ÑbSó7ó¿]rÑO¹×UÞDw íäˆÿ‘ŸJâ5 Cu§^ÙéóPzg¨ü]ÝszÌ_eԖ㻽ô<Èàþ5ø>UR; §gx¾§–Gy’1€Y‚‚Çë[6~Õ®ghÍ·’ªÛYåá_¢ñ‰³Õ%P0Žw¯ãÖµ®|Wv4«H­¤UŸaY˜Œ°#¨æµ•YÊ1•.§—tã)F¯CJßÚF‹q©Ü¬¬9ùÎÕϲõ5ƒâi,®ïEý”¡Ònq‚wǸÅeKq,óy³ÈÓ>rKœæº}:F×ì%°þÊŠÆRâÚ¨ã¦}}+7Òj¤ÝÍéÖN”»Ïü$~Àù¯lúzœê+‰‰«¤Ñ/¤ÑõlL ¡>\Ê{{þ‹ôìí@^[ôK“¸Ñ[¸üz×f¯±ªè½¥ªýQO÷Ô¹º­”9¥¨ãlŠ’½ôîpµaA§L¥™-/…§ÊÏnO<8þGúVg‰­¼Q¥ä˜n^õ—wö;ø¦?w8¡ë]6»b/´òS™#ùÐŽâ¾Sªã•_³?ëüVŠöøg±9+{û«h^eÛœ:í7×"%ýÌÌZVG-Ô˜×ŸÓØUNAÁàÓÑK0U±8u&º¹#{Øóœ¥µËúU„º®¢°ƒ€~iû«Ü×O¬êiÖÉij£ä]±Çè=MQiâðæ›öXö½üÃt½Âúì?SX1+Þ\Ÿ2P¹g|Ÿå\r‡ÖeÍ/~?ðµ?«Ç–?ü %Ã4Ò8ç%_§­JlœÛ5ÄDº&7‚0W=3Ò¦”˧»Â<¶1 ^PrsÞ¶í„Ói¢ØI Ê È={œm­*VpI­Œ!EM´÷9d`§%½›5cíò€ $`*ín~u%ÝŽÛÉ>ð p@ëÒ¨Öë–jæšÍtÓ(yUÚ@üê}ÌßjÖð•ݹ¾‚¨×oá;ìv¨L¸’a„²ÿõê+MQ¦Ù®›­Q&Eã˱–mÔüÓ¸ˆn§ôÄt§âkÿí m‚¶aµ¡c÷ô¬ºôrª–9o-Mñµ9êYt (¢½3Œ*)_žÇµ|+¤ÿjj^|Ëþ‰lC9=öZÃZ4i¹ËdkJ›©$‘¯j¿ðøA§q¶öóQ‘òÀs\¾›kö»Ä‰2ò7¢ŽM_ñ>«ý«ª6ÆÍ¼9TÇCêj]öÛKŒÉ™«%̶šúùÎGîXõü=Å_Ñti`óµ-fcºHʼrá=w…sZªÙ\%ÍŒÆKWba•z‚;qYG–¢öWÕlüÍeÏJ^Ù-ëÈÈÔ,n4«ù-.z7fˆ¦£dWfVÛÅÚ_‘1Xµ(QýúǽqWOctö×1˜åC‚óÕí౞ÕrOI­ÿÌŠÔ•¹á³%¢š¬§W¦q†k«ðæ¢'ƒì’7ïb.‰úÕÊSá–H%Ybb®‡ ŠâÇ`ã‹¢é½úz›áë:3æ[!ÒL2¸÷l~`;¡§\Åbì÷#å…OD=ÜÿA]V›¨CªZ@‰#þ£Ú°uíXÏn By uZù¼=iA¼6#FŽìEÿKTd»¼²4’1gc’Ç©5-º+ɇmªsP ’7xÛr1Sê+Ó¶–G•}nÍ;—‚xžY.ÎP'–ªqÁàäûT±^À¶iµ°Sæ9Ç r=qšÍ7:íy F替ý•ü«/euf_µ³º.Ü·=Æ‹öId/#Ió1À: ÷æ§Óg¹‹S—PÔC²ÆCn\cÀ_sYÖ–Òjº˜Ž5erÍ´pƒ©5ÖÜg+ÔJÊÎç½Ú›w•Õ¿ Yá’ù†OÝEžÃøv>·9/ˆÿ[òEžÑŽÿ‰É¬˜­„òA§Û±•Ú1ü1¼~§§âk®8Ö4UF…c„‹­U×—Èô¹U*jšEW¨fQEV¿µvÆ>7ŽPž™÷ö=?ã¯lEí£ØH ËZÝF:©÷>•ÝV.»`X}®/•—–#±úo¥pc(9%V£H4Ó„¶g•”òn<»„o‘°ê¾+²Ò­4m&Çû[Ï3ÿVî9_ö@þõS×´ß·Bo`L\GÄÑŽÿçµbi·p k;ÐÍe)±Ö6ìãúÔsýf•âíÝ W–Jý™¿<ÇÅHg6QÛ?!ùFSПqYÚsÙÅ¥jÐÎþu¸+åm,ü€@íQj–Kcl`‹VŠxwo¯R}N8§øwD:ŒÞ|êE¢é¡ôÞ´(Â4Ûæ÷¯Ä§)ʪN7—_뱟,7zUÌR†ÚÄŠT?+Qþ¾ÂÃÅÖb)ÊÛêQ•ÇñÔºöµdó ?ìé5²q# ÿ¹ô®~þÖ].ÿbÈr¸xä^2§¡§*¶—Ã>ŒMý^MEóGª3oìnô«³mwGf ÓÁØZë6:ŨÓõÈÔž‰7N}sØÖ6³ákÝ73ÚæîÓ¨eeãúŠõpÙ†¾Î¿»/Áú t×=-W⌺Z®’ûÔÁ¯Y4ÎG‰­ç–Úeš(ëЊ봽^E<·'Ç(z7¸ÿ ã)A*Á”G ŽÕÁŽËéã#®’[3|>&T^›v:MW@ÜZ{!óu1zý+žÁV*À†zŠÞÒüDF!¿ätÏâ?­k^é¶z¤bMÁd#å9Ï×ÔWƒí+`¥ìñ+Núÿ‡:ªaéâ= ûh¥­ tMB+µ·í#?ÜhùV¹íø×K£ø~×OÛ=Ù[‹‘ÈQÊ!þ¦ºjbiÓ5îpÓÂÔ©.[XÌм3%Ø[«üÃmÔ'F“ünk:Ýžf±"Æ"‚>­þÞ²õ߬lÖögœp_øüOµqîÒM3O<,Ï÷ºŸð40uq­N¯»ÝYÞçK Xk"[Ë»BèÜݶçèª>ìcÐEE! WÒB§«$y²”¦ï-Ŧ³Ly@±£xf÷TÄÓæÖÓ¯˜ãæaþÈþµlE:1曲.)TvH̳´ºÔ®–ÚÎ#$‡òQêOa]oüKüdB•¹Ôå^[ü=ùÔWºÞŸ¡Ú¶Ÿ¡Æ­'G˜óÏ©=Ïé\›¼·™%rò9å˜õ5áU­Sõ÷aÛ«õò;/ :´u—ä:æâ{Û—¸¸rò9äŸä+¢ð«ÚÅÃ:0#sŸîä3Ö¦Ò´í-,¤Y^+—Î%nÉì=½M„-®Ö{97ÄÀ«Äçï)ê¯>¾&•H::®Æ´hT„•]ÌýgE6Å®m”˜,£ø?úÕWLÔ®tùA…ÁB~hÛîŸðúÖîxÖ:Òo2èNØ\ŒðzíYºôm­ÃÃi¹¥-–ù¾Xý‡¯ô­hMÉ{ªýŸ‘x(¿mIÚÛ¯1Þ#Õ~ßt …³oÄÞµ±£Ø.—§´“ü³Ê»¤=Ñ;/ÔÖ†ô­Åu „Êû”?ÆÞ¿A]n“foî¾Ó'Ímdùë ïô½ë*‹¬--–ìÞ„[oSw±¡¡Ù5¼ q:í¸Ÿ¯÷²þε(¢½hASŠŒzÝÝØQEb (¢€ (¢€9½NÅìgÛŒÆ~P;¸}½áé\޽¤.Ó¨Y)11ýâc”=ø¯P’4–6ŽE Œ0AèEsWöRéó—A¾'ãŸãÿe¿Úô=þµåW¥,<ýµ-º¢åÖ‡$Ï?ÓEƒOå߉6#F~ïÔzWGâUl-#Óì@ñ‚zö>þµGZÑF½°¢'ç¡úVmž¤`ŒAqoÕ¸9Éü?îžÕ§»ˆµHën‡ rÃÞ”´o©&‰¥I©Ý ‚-ÐæGþƒÞ­xÂXßTŽ8ñ˜£ qÛÚ¥—Å –Â+4·`ä/ÐVE³•½‚îåY£2‚ÎÆÁÉªŠ©*žÒjÉl‰“§ ~ÊíîÉ…¨yHí!q•äÛè ;L×oô‰ \¼jpÐÉÛéé[>+ÓžåWP‹„\0ÝêU9 ]jßOTXÅË)73ã•Uã&³U•X'RÍ?ÀÙÐt¦Õ;¦¿ÄxwÄŸ2Ÿ°ß7¦OÓ¡¬]Gº¶Ÿ—HÅÔ#øáäþ+Ö–óBº‹{[²^FZ’¿QÖ›câ SN;cœº/\¼ýEoF¥Zk÷æ]˜JiéZ6}Ñæb¬ °êÁñ(5ÖÂM¤ê*WÒÔŸï¨ ÿצÿbø[PæÏRkg?Â_?£s]ÑÍ9t«¿CÃF_“9€â­Øjw˜dùOTnTÖÄž¸<ÚêPJ;n,ÕWðf¶¿t[¿Ò_ñ«ÇàëG–rM>ÿðD°Õ ïkÛø¢Óì®ò4‘04J3»éX¦»y©ƒ&ÚÔÿË4?3öô'ü"öãÞ?¯š*Dðf¶ßx[§Ö_ðÅF–[B~ÑI?W{ž&qåhÅp ; C ÒGà{3s©[Ä;í¿ž*_ìO Xs{©µÃáè¼×l³\:Ò.þˆçX9ï-=NLÊKPI=êkcNðÆ­¨aÚ/²ÂŽn?!Öµá$ÑôÕ+¤ik»þzÛúœšÇÔõ½ Èo©}¥a…¢ 6yÞËÆîx©ÅJ~ìé»[‡P÷¡5s#s¦Þt1ʼ2°àCê+bÞK‘Úô‚Å3ûÛ_½åŸaè}«J/ìïÛ²RXÆrxd¾â°üõÒ%š;+‘<®› ª Ïo_­J—·ÑÆÓ[®Œn.ŽªWƒëÕêÚ›Í4.`kkè Ve9ÿMH7ò›Œ­ª˜÷ú 4mïÚnK%¨<·y ÿ뭭亙líD#få«U*r~â‡Åù•'YûZ»~bÛ[>¡söh‡—²²ð#_î/¹ïé]LQ$1,Q(DA…QØS,ía²¶X ]¨¿™>§Þ¦®Ü6Pºõ:g>fQEtQEQEQEÙ#IchäPÈÃHàÓ¨ kPÓå°Ï Ýà³sèþßí~~µÍêºw›î,WËœs$¿¸¯I##¥aê1βmçËÝ?û)ãé^e\,éKÚÐû-XòT<®DxܤŠU”à‚9®ÞMîƒ µ®æ¹¶&GLrÀõ#×Võý•®¢¥n×Ë™NÑ:Œ}v?Zæoô«Ý*Q'%ÊÍOþµ8b#^ɾY#‚xyaîíx³kÂ÷SIi4 L•Û Ö¹y[d“,.Ë1àdgŒÕ‰õ;눼©n]“¸õ©´m9¯n£bSÊVËÃv·½\`¨¹Õ’} •GYB•;¶º›vJº'†Úf™Æóþñû¢±în¢¾ðûIq5ìró1†`yÏ¿¥[ñ]ß™f%EëCê=`ÜÙ]iáƒ(h; ŒýGUýGÒºš+–¾m÷.3q<ê÷B±¼ùíÏÙ&nBžQ¾‡ü+óJ¿ÓŸt‘0¤‰ÈüëÔ®ôki÷4_¸väí«u<ZÊšÂþ̼~±ëø©ä~®;bpú|Q"xz5u^ë<ü_fG½í!9;Iú‘Ö¤Õnà½x¤…^0«³Ê a@ô®–ãMÓo‹¶ØýÞÜôú¯_ÌV\þvɲ»ŽQý×ùM:xŠI»Å¯¸ç©‡ÄF-/y?¼·¦DË¡K˜’¹@GÝÔqXD&MZÙ Ÿ•òF:cš|ÚV§fÛšÚUÇñ'?¨¨¢¾½µv)+£1ËnO¾jéÒiOÙÉ>oë̉ÕMÁT‹\¿×‘¡â©7ÞÅ÷?™¬Ý-qªZŸúj¿Î–îúkЦpŒãøÂàãÒ’Êá-g4"VS•˃ýkZtåOìí­ŒªULG:zúÍ÷Øõ v6ñJ6ç,¿0ç±íXZ‚›«Û«¨AhCd¾0jÕÞ­ã#ObŒSûÂ*+ÍKí‰mºA¶ì!ë\øj3¤£îë³wÒ×:1¡S›ÞÓu¦»?´u=-– ŠÈ¸Krö5tß&§¢]´ñ1¨ÏlVWö´ÿeŠÙ£ŠHãýâîÍC=ì׬8Tˆˆã\ Ðð®M7÷_ä%ŠQºRm[gþbi÷’X\‰£Ã)è´/æÓ5ù²A.0ÃËÝŸþ½R·ÒïîÔÚJÃ×nækJ \»ˆ €îoÒµ¬è)ûG+KÈÊŠ®áìÔn¼ÊwÊö‘Ù[+%º’ßyÏ©¦ÛZ_êERä” À'î¨úôÒãév <‘ù­ýû†Àü½kAåâ…··".ÌãÊŒ}SX,OÙ¡ ¾ìêXIIÞ´­äŒ ÛÃóÞÉç¸äÇ«VݬS]¨†Æ1/l+øÿúVµ¶ƒÃ^ÈnäG±øƵÕU*€p®8:•_5y|ŽˆòRV¦Œë WÌßh¸†ÿº: Ò¢ŠôaÁZ*Ä6ÞáEUˆ(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯sckwÌð#°èØÃÄsYÓè ÜÃrÃÚU?>ë[4VS£N§ÄŠRkcšm/Rƒî(qÿL¥þþ5ZhçÁ6LÃþš[çõ\×]Uï¿ãÙ«Š¦_J×Ñ¢«-™ÅÉk¥¹ýå•°?R‡õÅGý“£¿Kl»p?ơԿãàýi-{W›'8;)?¼¾HKx¯¸›ûHÿžßñGöFŽmÿï«þ55Tºèj}­_çx{_ʾâÊZi~KKb}Ü¿òÍ\…Ç­“Û+R?SŠÃ³ÿ^+¾Ò?ãØWM?¶~ü˜›PøR2ÃTŸ¬¬Òãô\ÿ:µ!æ{¾«ÿÇŽMnQ^„04aÒæn¬™N×J±µmñ[¯™ý÷ù›ó5rŠ+²1QVHÎ÷ (¢˜Q@Q@Q@Q@Q@ÿÙnco-4.5.4/doc/endorsements.txt000066400000000000000000000137011264355130400163240ustar00rootroot00000000000000Received fxm: ************************************************************************ Received 20140613: NCO benefits my research in dynamic global vegetation models and climate change research by allowing me to easily modify and analyze climate data and vegetation simulation data. -- John B. Kim PNW Research Station & WWETAC, US Forest Service jbkim@fs.fed.us 541-750-7287 (o) 541-286-5546 (m) ************************************************************************ Received 20120720: I installed NCO in Windows 7 and have crosschequed the results of ncra with ArcGIS, and they match perfectly. NCO Works like a champ. it takes only a fraction of a second to average over 10 million records (argis takes over 10 minutes). I am curious how can this be even possible but what it matters is that the results are correct. Thanks, Camilo Mora ************************************************************************ Received 20110325: Dear Prof. Zender, I am composing this email to express my strongest endorsement for the NCO software and its development. I am an assistant professor in Department of Atmospheric, Oceanic, and Space Sciences at the University of Michigan. My research area is in understanding various issues associated with radiative transfer, water vapor, clouds, and their interactions via diagnosis analysis of observations and GCM outputs. I have been using NCO operators since 2006. As my group and I have to constantly deal with large amount of data sets of reanalysis, GCM simualtions, and satellite data products, we benefit enormously from using NCO. It saves a great amount of our time in programming and preprocessing data, and it greatly simplifies such coding tasks. For our day-to-day research work, NCO software is as important as Matlab, Fortran, and Perl. It has already become an inseparable and critical component in data analysis and our research. And I know many researchers share the same view with me regarding the technical importance of NCO. Therefore, I endorse the development of NCO without any reservation. Sincerely, Xianglei Huang ------------------------------------------------------------------- Xianglei Huang Assistant Professor Department of Atmospheric, Oceanic, and Space Sciences College of Engineering, University of Michigan 2455 Hayward St, Ann Arbor, MI 48109 Phone: 734-936-0491 FAX: 734-936-0503 xianglei@umich.edu ------------------------------------------------------------------- ************************************************************************ Received 20040809: Prof Zender, I'm writing in support of the recent NSF proposal [1] to improve the "NCO" suite of NetCDF/HDF data analysis tools. Our group: http://paoc.mit.edu/cmi/ http://mitgcm.org/ and many of our collaborators are steadily moving toward the use of both hierarchical data formats (such as NetCDF and HDF) and multi-terabyte data sets. Under these circumstances, tools such as NCO become increasingly useful and important for our work. I am impressed with the capabilities offered by current NCO releases and would very much like to see it extended (per the above proposal) to take fuller advantage of parallel systems. I believe that such a free, open, and extensible set of parallel analysis tools would be an important resource for the GFD community. While nearly all ocean and atmospheric models have evolved to take advantage of parallel execution, it seems that many of the data analysis tools have lagged. Thus, for many researchers, it is the pre- and post-processing steps that consume the most time and can be the greatest barrier to experimental progress. Thus, I look forward to parallel versions of the NCO tools that will take better advantage of both our SMP (threaded) and cluster (MPI-based) computing resources. Best regards, Ed Hill [1] SEI(GEO): Scientific Data Operators Optimized for Distributed Interactive and Batch Analysis of Tera-Scale Geophysical Data, Dr. Charles S. Zender, Department of Earth System Science, University of California at Irvine -- Edward H. Hill III, PhD office: MIT Dept. of EAPS; Rm 54-1424; 77 Massachusetts Ave. Cambridge, MA 02139-4307 emails: eh3@mit.edu ed@eh3.com URLs: http://web.mit.edu/eh3/ http://eh3.com/ phone: 617-253-0098 fax: 617-253-4464 ************************************************************************ Received 20040611: The best netCDF processing software I have ever used. NCO is indispensible in my work. Good luck! Haijun -------------------------------------------- Haijun Yang, Associate Professor Department of Atmospheric Science School of Physics, Peking University 209 Chengfu Road, Beijing, China 100871 Tel: 86-10-62767436 Fax: 86-10-62751094 Email: hjyang@pku.edu.cn -------------------------------------------- ************************************************************************ Received 20040430: I find the NCO operators to be indispensable in my work, and many of my colleagues would say the same. Their usefulness is perhaps best captured by the surprise of some people to whom I have introduced NCO when they learned that it is a separate entity from the NETCDF library. The developers of NCO have always replied promptly to my help requests and have on occasion even added new functionality that I had requested. In my opinion, the advantages of NCO compared to mathematically more comprehensive packages reading NETCDF files are that it is fast, very concise, free of charge, runs on almost any platform, and can be easily integrated into shell or other kinds of scripts. And with the evolution of the ncap utility, the capabilities of NCO are becoming sufficient for tasks of greater numerical complexity. ------------------------------------------------------------ Dr. Maxwell Kelley Laboratoire des Sciences du Climat et de l'Environnement L'Orme des Merisiers CEA Saclay 91191 Gif sur Yvette cedex mkelley@lsce.saclay.cea.fr France +33 1 69 08 27 02 ------------------------------------------------------------ nco-4.5.4/doc/help.txt000066400000000000000000000054361264355130400145540ustar00rootroot00000000000000Posted to SourceForge Jobs/Help Needed 20000826: The NCO project (http://nco.sourceforge.net) is looking for volunteers interesting in contributing to improving free software solutions for geophysical data processing. NCO software is used in most climate modeling and satellite data reduction research performed today. NCO is stable software written in C with a complete TeXInfo user's guide. NCO is uses the GPL license. See below*** for project description. We put out version 2.0 earlier this year, and are now seeking additional help to lead the significant modifications required to maintain NCO as a workhorse of the geophysical sciences. Our TODO list includes many items that any competent programmer could solve. Items range from straightforward technical extensions in C (e.g., migrating to GNU getopt()), to packaging (RPM generation), to build configurations (Makefile extensions, autoconf support) and web page improvements (a logo?) and maintenance. If you would like to hone your programming skills on a project that enjoys wide international scientific usage, contact zender@uci.edu for more information. More creative and challenging improvements to NCO are also desired. We have built a lexer-parser prototype capable of interpreting and performing generic mathematical operations on entire files from the shell level. This grammar needs sundry I/O and algebraic improvements as well as implementation and testing. The opportunity to code this in C++ is appealing. New metadata conventions in the geophysical modeling community require implementation/support in NCO. See, for example, the Climate/Forecasting (CF) and COORDS conventions at http://www.unidata.ucar.edu/packages/netcdf/conventions.html. These include support for packed data and for irregular and reduced coordinate grids. The NCO TODO list is at http://nco.sourceforge.net/TODO Contact Charlie Zender or Henry Butowsky if you think you'd like to help. Thanks, Charlie ***NCO Project Description: The netCDF Operators, or NCO, are a suite of programs known as operators. The operators facilitate manipulation and analysis of self-describing data stored in the netCDF or HDF4 formats, which are freely available (http://www.unidata.ucar.edu/packages/netcdf and http://hdf.ncsa.uiuc.edu, respectively). Each NCO operator (e.g., ncks) takes netCDF or HDF input file(s), performs an operation (e.g., averaging, hyperslabbing, or renaming), and outputs a processed netCDF file. Although most users of netCDF and HDF data are involved in scientific research, these data formats, and thus NCO, are generic and are equally useful in fields like finance. The NCO User's Guide illustrates NCO use with examples from the field of climate modeling and analysis. The NCO homepage is currently http://nco.sourceforge.org. nco-4.5.4/doc/highlights_old.shtml000066400000000000000000000434631264355130400171260ustar00rootroot00000000000000 NCO Homepage

Release Highlights from 2000–2012 (versions 1.1.47–4.2.3)

  • NCO 4.2.3: Group Path Editing (GPE); ncecat bugfix
  • NCO 4.2.2: ncks, ncecat support groups; --hdr_pad all operators; ncks prints underscores; fixes to --[mk/fix]_rec_dmn; ncpdq fix; ncwa on Windows;
  • NCO 4.2.1: --ram_all for diskless files; --no_tmp_fl to bypass temporary files; Negative indices for hyperslabs; ncpdq unpacks coordinate variables; ncra/ncrcat SSC/MRO options; ncra/ncrcat rebase bounds;
  • NCO 4.2.0: ncecat "fixes" auxiliary coordinates and bounds; ncks uses nc__open, format NC_INT with %i; ncra -y ttl fix; ncrcat UDUnits fix; ncwa and ncap2 limited NaN support; Microsoft Visual Studio support;
  • NCO 4.1.0: MD5 digests; ncap2 sorts & maps; ncks MM3 workaround; ncrename/ncatted chmods; ncatted NaN support
  • NCO 4.0.9: Fix over-zealous ncap2 packing; Fix nces -y ttl; Fix/improve ncap2 print, array(); Warn when appending variables of suspicious record length; Warn when NC_MAX_ATTRS exceeded
  • NCO 4.0.8: Support HPSS; Workaround netCDF NOFILL bug (upgrade recommended); Support CF bounds; CF noleap not no_leap; Fix ncatted overwrite-mode; Fix NC_BYTE printing
  • NCO 4.0.7: Fix degenerate hyperslab bug (upgrade recommended)
  • NCO 4.0.6: clang-compliance; Fix ncra YYYYMMDD-date bug; Extract all associated coordinates; Tighten ncbo warnings; ncpdq warns when _FillValue outside packing range
  • NCO 4.0.5: Fix ncks hyperslabbing bug; Fix ncra CF "coordinate" bug
  • NCO 4.0.4: Chunking in all operators; preserve deflation; ncks print formatting; Fix ncrename bug; Do not pack coordinate variables
  • NCO 4.0.3: Fix configure for ncap2, netCDF4, UDUnits2, netCDF-DAP; Fix ncbo bug under AIX xlC; Fix ncra bug for some CF-compliant dates.
  • NCO 4.0.2: Consistent deflation, chunking with netCDF4_classic; Fix ncap2 RAM vars, 1-D arrays; Fix ncatted appending NULs.
  • NCO 4.0.1: Easily create/remove record dimensions with ncks --mk_rec_dmn, --fix_rec_dmn;
  • NCO 4.0.0: Bilinear interpolation, GSL fitting; Chunking improvements; Better support CF calendar and coordinate attributes
  • NCO 3.9.9: netCDF4 chunking and NC_STRING support; GSL statistics, interpolation functions; UDUnits2 time-since support; ncrcat re-basing
  • NCO 3.9.8: ncap2 supports sort(), array(); better DAP/libnetcdf and UDUnits2 builds; GSL distribution/RNG functions
  • NCO 3.9.7: Improve GSL-build support; ncap2 threading improvements; ncks --no_dmn_var_nm printing
  • NCO 3.9.6: Fix OpenMP MSA bug (upgrade highly recommended); Memory management to improve threading; ncatted workaround for netCDF4 _FillValue; disable OpenMP with netCDF4/HDF; no math on type NC_CHAR; ncap2 documentation, better missing value propagation, #include files, GSL math functions
  • NCO 3.9.5: Multi-slabbing (MSA) and -X everywhere; ncecat -M; netCDF4-enabled builds on Cygwin; ncap2 builds on Solaris
  • NCO 3.9.4: File consanguinity; ncks: CF auxiliary coords, LZ stats; ncap2: masks, index arrays, print attributes, OpenMP, atan2(), pow()
  • NCO 3.9.3: SWAMP release; ncecat -u; wget URLs; GCC 4.2; ncap2 OpenMP
  • NCO 3.9.2: _FillValue supplants missing_value; UDUnits2 support; ncap2 type-conversion support and printing; netCDF4 configure fixes; Change licenses to GPL3 and FDL1.2
  • NCO 3.9.1: Support lossless netCDF4/HDF deflation; Improve Intel compiler support; ncap2 for/while loops; various and sundry build fixes
  • NCO 3.9.0: Support netCDF4 types (ubyte, ushort, uint, int64, and uint64); Control ncks metadata copying; Fix ncbo packed valued bug (upgrade recommended); Improve IRIX 6.5 support
  • NCO 3.2.0: More forgiving exclusion list (-x -v var_nm) handling; Fix rmssdn normalization; Support Mac OS X on Intel; Documentation bugfixes
  • NCO 3.1.9: ncap2 in RPM packages; Quieter output; AIX configure supports ncap2; Update to DAP for netCDF 3.6.2; Fix nc[erw]a for coordinate min/max/ttl; ncecat allows files to differ in record dimension size
  • NCO 3.1.8: Support _FillValue with compile-time switch; Debian package synchronized, includes ncap2
  • NCO 3.1.7: ncap2 “double-parsing”, array initialization, supercedes ncap
  • NCO 3.1.6: Support stride in all hyperslabbing operators; change more WARNINGs to INFOs
  • NCO 3.1.5: New ncap2 array and hyperslab features; change some WARNINGs to INFOs, add Pathscale and update PGI and Intel compiler support
  • NCO 3.1.4: Fix ncbo memory problem; report timer results
  • NCO 3.1.3: ncap2 automatically propagates attributes to new/derived variables; NCO handles record variables with zero records; support CF coordinates convention; ncwa -b retains degenerate dimensions; build fixes for Cray T3E, Solaris, Cygwin.
  • NCO 3.1.2: ncap2 control structures (conditionals, loops, etc.); keep non-processed data packed in output file; binary operators ncbo and ncflint work when only one variable has missing_value attribute; change ncra and nces to always average coordinate variables
  • NCO 3.1.1: NCO builds (again) with C++ compilers; ncap2 development code; server-side extensions
  • NCO 3.1.0: MPI operators are bug-free; fix ./configure for MPI and netCDF4; MRV algorithm speeds up ncwa 5—10 times; ncap random number generator rnd_nbr()
  • NCO 3.0.3: Eliminate all critical read regions (accelerates all SMP operators); builds with netCDF4 alpha; read NETCDF4_CLASSIC (i.e., HDF) files automatically; write NETCDF4 files on request; benchmark results quantify parallelism.
  • NCO 3.0.2: Fewer critical read regions; all known memory leaks plugged; better Intel compiler support; SFTP protocol support; FTP protocol supports .netrc-based passwords; better model grid-property-awareness (e.g., lat_bnds); ncatted ncks, ncrename support metadata header padding with --hdr; ncbo supports heterogeneous variable ordering; ncatted bugfix
  • NCO 3.0.1: benchmarks; ncks printing tweaks; memory cleanup; ncap double-parse speedup and exponentiation bugfix; thread operators by default
  • NCO 3.0.0: New ncks -P print switch; ncap optimizations; -Z option supports 64-bit offsets (requires netCDF 3.6); NEC SX build improvements; support GCC 3.4.X; nco_put_vara() overloads in libnco_c++
  • NCO 2.9.9: ncpdq packs/unpacks entire files; ncbo is threaded
  • NCO 2.9.8: ncpdq released; ncwa --msk_sng consolidated mask switch; C99 compiler required
  • NCO 2.9.7: Read input file lists from stdin; write nco_input_file_list attributes; add nco_put_att<int,short,long> functions to libnco_c++; large file support (LFS); write nco_openmp_thread_number attribute
  • NCO 2.9.6: Support -o fl_out syntax; 64-bit ABI for x86_64; Debian builds libnco_c++
  • NCO 2.9.5: ncflint handles missing_value data better, is commutative when weights are equal
  • NCO 2.9.4: ncecat works on pure scalar files; change to cvs.sf.net; AIX GCC builds
  • NCO 2.9.3: ncra and nces now work correctly when missing_value equals zero or any intermediate sums
  • NCO 2.9.2: ncap S/V, S%V, and S^V operations fixed (S = scalar, V = variable)
  • NCO 2.9.1: ncwa works again on packed NC_FLOAT data (broke when?)
  • NCO 2.9.0: Complete ncap modulo operator (V%S) and generic exponentiation (V^S), scalar divided by variable (S/V); workaround stack memory problem with GCC extensions; fix make check
  • NCO 2.8.8: --enable-[optimize/debug]-custom options for GCC work again (broke in 2.8.6)
  • NCO 2.8.7: ncap packing works again (broke in 2.8.4); Cygwin builds work again
  • NCO 2.8.6: AIX and IRIX builds work again; custom GCC builds with -Werror
  • NCO 2.8.5: Solaris make install works; ncap changes attribute values correctly; Support DODS 3.4+, deprecate 3.3-; add --enable-[optimize/debug]-custom options to ./configure
  • NCO 2.8.4: Index-based hyperslabs work again (broke in 2.7.3, upgrade highly recommended); ncap peak memory usage reduced still more; support for AMD Opteron x86_64 architecture
  • NCO 2.8.3: Fix big ncap memory leak; fix regressions; remove scary packing warnings
  • NCO 2.8.2: ncbo handles distinct missing_values correctly; improve error diagnostics
  • NCO 2.8.1: “Variable wildcarding”—extended regular expressions in -v var,... lists—support in all operators
  • NCO 2.8.0: New “binary” operator ncbo, obsoletes ncdiff; Debian integration
  • NCO 2.7.4: Autotools build support for AIX; fix UDUnits confusion with floating point hyperslab specifications
  • NCO 2.7.3: Support UDUnits (and some CF) conventions, e.g., ncks -d wvl "1 picometer","1 furlong" -d time,"2001-03-19 06:00:0.0","2001-03-19 18:00:0.0"
  • NCO 2.7.2: Printing (ncks -H) plays well with multi-slabbing
  • NCO 2.7.1: (Packaged) Fallback to B. Sittler's getopt() for long option support; store fixed, packed variables correctly with ncap.
  • NCO 2.7.0: Support for GNU/POSIX long options; ncks introduces multi-slabbing (= multiple hyperslabs) capability
  • NCO 2.6.6: Fix and document ncrename attribute renaming; add type conversion functions to ncap
  • NCO 2.6.5: Cray, Sun build improvements
  • NCO 2.6.4: Mac OS X, NEC, SGI build improvements
  • NCO 2.6.3: Mac OS X builds work seamlessly; documentation fixed
  • NCO 2.6.2: Major improvements in autotools support; ncap supports user-defined dimensions
  • NCO 2.6.1: Minor fix to unpacking support
  • NCO 2.6.0: All arithmetic operators (ncap, ncdiff, nces, ncflint, ncra) support unpacking
  • NCO 2.5.6: Handle missing_value correctly for integer variables in ncra, merge autoconf build
  • NCO 2.5.5: Handle files without existing global “History” attribute correctly
  • NCO 2.5.4: Add support NEC-SX support; update Cray support; small build changes
  • NCO 2.5.3: Fix native builds under MS Windows with Cygwin ncap; hint to ncwa
  • NCO 2.5.2: Add math functions to ncap; hint to ncwa
  • NCO 2.5.1: ncatted deletes all attributes of att_var when att_nm not specified
  • NCO 2.5.0: man(1) pages from Debian distribution
  • NCO 2.4.6: Free (speech) sort routines
  • NCO 2.4.5: Arithmetic speedups
  • NCO 2.4.4: 64-bit AIX builds
  • NCO 2.4.3: Handle non-standard “History” attributes
  • NCO 2.4.2: ncap supports nesting files with #include
  • NCO 2.4.0: ncks supports writing native binary output with -b switch
  • NCO 2.3.1: ncap builds on all Unices
  • NCO 2.3.0: Library redesign
  • NCO 2.2.4: ncap fully supports packing and unpacking variables
  • NCO 2.2.3: ncap supports manually unpacking variables stored with scale_factor and add_offset
  • NCO 2.2.2: fix rare ncwa crash with weights
  • NCO 2.2.1: fix ncap divide and fmodf bugs
  • NCO 2.2.0: (RPM available) 20020203: ncap public debut (has division error, please upgrade)
  • NCO 2.1.3: ncap implements LHS casting
  • NCO 2.1.2: C++ API to netcdf; libnco_c++ open for business
  • NCO 2.1.0: ncap full lexer/parser operational
  • NCO 2.0.3: small fixes to 2.0.0 (e.g., ncks printing)
  • NCO 2.0.2: Add packing/unpacking capabilities based on scale_factor and add_offset convention
  • NCO 2.0.1: Add user-configurable multi-threaded capability to arithmetic-intensive operators ncwa, nces, and ncra
  • NCO 2.0.0: (RPM available) 20010507: Switched all internal calls to netCDF 3.x API
  • NCO 1.2.2: 20010211: Allow weights with ncwa in min/max/ttl operations; easier building with HDF4. ncrename can now work on specific variables rather than whole file. ncks has -q option for cleaner printing
  • NCO 1.2.1: 20000828: Added type-conversion of integers to floating point before arithmetic; fixed broken -v option
  • NCO 1.2: 20000730: Added non-linear operations to ncra/nces and ncwa: min,max,total,rms,rmssdn,sqrt. Added DODS compliance.
  • NCO 1.1.48: 20000515: Potentially serious bugfix to ncdiff, recommend upgrade
  • NCO 1.1.47: 20000510: Improved ncra and ncrcat to allow lazier specifications of input files

  • nco-4.5.4/doc/i18n.txt000066400000000000000000000014501264355130400143730ustar00rootroot00000000000000# $Header$ # Purpose: NCO Internationalization (i18n) # Instructions/examples at # Linux Journal 200211 p. 57--59 # http://www.linuxjournal.com/article/6176 # http://www.debian.org/doc/manuals/intro-i18n/ch-library.en.html # Generate *.po file for all NCO operators: cd ~/nco/src/nco xgettext --default-domain=nco --extract-all --output=nco.po nc*.c # Search source for translatable strings: cd ~/nco/src/nco etags *.[chly] # Open .po file in Emacs # Hit `,' (po-tags-search) to start searching through candidates # `M-,' Marks last string with _() # `M-.' Marks last string with preferred keyword, e.g., gettext() # Compile PO (portable object) file to MO (message object or machine object) file: msgfmt --output-file=${HOME}/share/locale/es/LC_MESSAGES/nco.mo --statistics ${HOME}/nco/src/nco/nco.po nco-4.5.4/doc/index.shtml000066400000000000000000002673161264355130400152520ustar00rootroot00000000000000 NCO Homepage
    / Announce / Developer / Discussion / Help / Manual / Project / Source / [ACME] [ANTLR] [CF] [DIWG] [GSL] [netCDF] [OPeNDAP] [SWAMP] [UDUnits]


    Welcome to the netCDF Operator (NCO) Homepage

    Current stable NCO version is 4.5.4 released

    The NCO toolkit manipulates and analyzes data stored in netCDF-accessible formats, including DAP, HDF4, and HDF5. It exploits the geophysical expressivity of many CF (Climate & Forecast) metadata conventions, the flexible description of physical dimensions translated by UDUnits, the network transparency of OPeNDAP, the storage features (e.g., compression, chunking, groups) of HDF (the Hierarchical Data Format), and many powerful mathematical and statistical algorithms of GSL (the GNU Scientific Library). NCO is fast, powerful, and free.


    Recent Releases & Milestones

    • 2015 Jan ??: 4.5.5 (In progress)
    • 2015 Jan 07: 4.5.4 (ncremap)
    • 2015 Dec 16: Poster at Fall AGU, San Francisco, California
    • 2015 Nov 04: Talk at DOE ACME, Albuquerque, New Mexico
    • 2015 Oct 20: 4.5.3 (Curvilinear)
    • 2015 Sep 06: 4.5.2 (Generate SCRIP)
    • 2015 Jul 10: 4.5.1 (Stability)
    • 2015 Jun 11: 4.5.0 (Regridding)
    • 2015 May 21: 4.4.9 (ncra weights)
    • 2015 Feb 16: 4.4.8 (Precision-preserving Compression)
    • 2014 Dec 15: DOE ACME project commences
    • 2014 Nov 26: 4.4.7 (Chunking features)
    • 2014 Oct 01: 4.4.6 (ncra, ncwa packing bugfixes, stride optimization)
    • 2014 Aug 26: 4.4.5 (Stability)
    • 2014 Jul 01: NASA ACCESS 2013 project commences
    • 2014 May 29: 4.4.4 (Stability)
    • 2014 Apr 02: 4.4.3 (Stability)
    • 2014 Mar 27: Talk at NASA GSFC, Greenbelt, Maryland
    • 2014 Mar 25: Poster at NASA ESDSWG, Greenbelt, Maryland
    • 2014 Feb 20: 4.4.2 (Stability)
    • 2014 Jan 29: 4.4.1 (Stability)
    • 2014 Jan 09: 4.4.0 (Stability)
    • 2013 Dec 13: Talk at Fall AGU, San Francisco, California
    • 2013 Dec 02: 4.3.9 (new operator, nces)
    • 2013 Nov 06: 4.3.8 (ncatted groups)
    • 2013 Oct 17: 4.3.7 (HDF4, XML, ncrename groups)
    • 2013 Oct 02: Poster at NASA ESDSWG, Greenbelt, Maryland
    • 2013 Sep 27: 4.3.6 (--dbl default, ncdismember)
    • 2013 Sep 20: 4.3.5 (nces, ncra, ncrcat groups)
    • 2013 Aug 01: 4.3.4 (ncpdq bugfix, HDF unpacking)
    • 2013 Jul 24: 4.3.3 (ncrename, ncwa groups, CDL, XML)
    • 2013 Jul 05: 4.3.2 (ncflint, ncpdq groups)
    • 2013 Jun 03: Submitted NASA ACCESS 2013 proposal
    • 2013 May 01: 4.3.1 (Group broadcasting)
    • 2013 Mar 28: 4.3.0 (ncbo groups)
    • 2013 Mar 19: 4.2.6
    • 2013 Jan 28: 4.2.5
    • 2013 Jan 21: 4.2.4
    • Milestones from 2003–2012 (versions 2.8.4–4.2.3)
    • News and Announcements from 1998–2003 (version 1.1.0–2.8.3) and earlier

    What is NCO?

    The netCDF Operators (NCO) comprise a dozen standalone, command-line programs that take netCDF, HDF, and/or DAP files as input, then operate (e.g., derive new data, compute statistics, print, hyperslab, manipulate metadata) and output the results to screen or files in text, binary, or netCDF formats. NCO aids analysis of gridded scientific data. The shell-command style of NCO allows users to manipulate and analyze files interactively, or with expressive scripts that avoid some overhead of higher-level programming environments.

    Traditional geoscience data analysis requires users to work with numerous flat (data in one level or namespace) files. In that paradigm instruments or models produce, and then repositories archive and distribute, and then researchers request and analyze, collections of flat files. NCO works well with that paradigm, yet it also embodies the necessary algorithms to transition geoscience data analysis from relying solely on traditional (or “flat”) datasets to allowing newer hierarchical (or “nested”) datasets.

    The next logical step is to support and enable combining all datastreams that meet user-specified criteria into a single or small number of files that hold all the science-relevant data organized in hierarchical structures. NCO (and no other software to our knowledge) can do this now. We call the resulting data storage, distribution, and analysis paradigm Group-Oriented Data Analysis and Distribution (GODAD). GODAD lets the scientific question organize the data, not the ad hoc granularity of all relevant datasets. The User Guide illustrates GODAD techniques for climate data analysis:

    Note that the “averagers” (ncra and ncwa) are misnamed because they perform many non-linear statistics as well, e.g., total, minimum, RMS. Moreover, ncap2 implements a powerful domain language which handles arbitrarily complex algebra, calculus, and statistics (using GSL). The operators are as general as netCDF itself: there are no restrictions on the contents of input file(s). NCO's internal routines are completely dynamic and impose no limit on the number or sizes of dimensions, variables, and files. NCO is designed to be used both interactively and with large batch jobs. The default operator behavior is often sufficient for everyday needs, and there are numerous command line (i.e., run-time) options, for special cases.


    How to Contribute: Volunteer, Endorse, or Donate

    In March, 2000, NCO became an Open Source project hosted by SourceForge.net. This facilitates collaboration, code contributions, and support.

    In March, 2015, NCO source code moved to GitHub.com. No matter what your programming background there is a task you can help with. From re-organizing the TODO list itself, to improving this cheesy webpage, to documentation, to designing and implementing new features and interfaces, we need your help! The project homepage contains mailing lists, discussion forums, and instructions to make contributing to NCO easy.

    Many users feel unable to volunteer their time. An equally effective contribution in the long-run would be your endorsement, which may make the difference between a declined and an accepted proposal. An endorsement can be a few sentences that describes how NCO benefits your work or research. E-mail your endorsement to Charlie “my surname is zender” Zender with Subject: “NCO Proposal Endorsement”. This information is useful advocating for more NCO support. “What future proposals?” you ask, “Aren't you already funded?” Yes, in 2012 NASA funded us to implement netCDF4 groups and HDF support, and in 2014 NASA funded us to improve SLD handling. These funds are/were primarily for development and maintainance of specific features. To realize our grander ambition, i.e., to shift geoscience data analysis from a flat- to a hierarchical-paradigm (GODAD), will require a sustained effort and software ecosystem that understands and implement hierarchical dataset concepts. And it's hard to sell a federal agency on the wisdom of investing in a paradigm shift! Other more prosaic tasks that need work are, for example, I/O parallelization (!!!), user-defined and non-atomic types, more CF conventions, cloud-services, JSON back-end, and user-defined ncap2 functions. If you send an endorsement, please include (at least) your Name, Title, and Institutional affiliation.

    Lastly, as of June, 2003, if you're more strapped for time than money and want to contribute something back, consider a monetary donation. This may incentivize us to tackle your favorite TODO items.
    Inspired by President Obama's plan to bring more transparency to government investment, these homepage donation counters track the influence of your monetary donations on NCO development:
    Donations received between 20030624 and 20141126: US$144.55. Thank you, donors!
    NCO features “incentivized” by these donations: More emoticons in the documentation :)

    NSF EarthCube Project

    The National Science Foundation Grant NSF ICER-1541031 funded the Unidata-led EarthCube Project, “EarthCube IA: Collaborative Proposal: Advancing netCDF-CF for the Geoscience Community” from 20150901–20170831 as part of the Integrative and Collaborative Education and Research (ICER) program. This URL, http://nco.sf.net#prp_e3, points to the most up-to-date information on the EarthCube proposal.

    UCI's primary role is to help extend CF to cover hierarchical data structures, aka groups. Groups are the Group-Oriented Data Analysis and Distribution (GODAD) paradigm we are developing for geoscience data analysis. We will convene workshops for interested stakeholders in 2016 and 2017. Be on the lookout for announcements!


    DOE ACME Project

    “Lightweight Climate Analysis Tools for ACME” is a US Department of Energy Cooperative Agreement (CA) DE-SC0012998 from 20141215–20171214 that funds our contribution to the Accelerated Climate Modeling for Energy (ACME) project, a part of DOE's Earth System Modeling (ESM) program. The ACME project provides the resources to implement support for parallel regridding and workflows in NCO accessible through UV-CDAT. Spatially intelligent, parallelized analysis tools are a key component of the Group-Oriented Data Analysis and Distribution (GODAD) paradigm we are developing for geoscience data analysis.


    NASA ACCESS Project

    The National Aeronautics and Space Administration (NASA) Cooperative Agreement NNX14AH55A funds our project, “Easy Access to and Analysis of NASA and Model Swath-like Data” from 20140701–20160630 as part of the Advancing Collaborative Connections for Earth System Science (ACCESS) program. This URL, http://nco.sf.net#prp_axs, points to the most up-to-date information on the ACCESS 2013 project.

    This ACCESS project provides resources to implement support in NCO for Swath-like data (SLD), i.e., dataset with non-rectangular and/or time-varying spatial grids in which one or more coordinates are multi-dimensional. It is often challenging and time-consuming to work with SLD, including all NASA Level 2 satellite-retrieved data, non-rectangular subsets of Level 3 data, and model data (e.g., CMIP5) that are increasingly stored on non-rectangular grids. Spatially intelligent software tools is a key component of the Group-Oriented Data Analysis and Distribution (GODAD) paradigm we are developing for geoscience data analysis.

    We are currently recruiting a programmer (aka software engineer) or postdoc based at UCI for at least two years, to accomplish our ACCESS objectives. As described in the proposal, this person will be responsible for incorporating geospatial features and parallelism into NCO. See the ads for more details. (PDF, TXT).


    Publications and Presentations

    • Zender, C. S. (2014): Use Hierarchical Storage and Analysis to Exploit Intrinsic Parallelism. Presented to the NASA Goddard Earth Sciences (GES) Data and Information Services Center (DISC), Goddard Space Flight Center, Greenbelt, MD, March 27, 2014. PDF (© 2014 by me)
    • Zender, C. S., P. Vicente and W. Wang (2013): Use Hierarchical Storage and Analysis to Exploit Intrinsic Parallelism. Presented at the Fall Meeting of the American Geophysical Union, San Francisco, CA, December 9–13, 2013. Eos Trans. AGU, 93(53), Fall Meet. Suppl., Abstract IN52A-06. PDF (© 2013 by me)
    • Zender, C. S., P. Vicente and W. Wang (2013): The Future of Model Evaluation. Presented to the Chapman University Symposium on Big Data and Analytics: 44th Symposium on the Interface of Computing Science and Statistics, Chapman University, Orange, CA, April 4–6, 2013. PDF (© 2013 by me)
    • Zender, C. S., P. Vicente and W. Wang (2012): NCO: Simpler and faster model evaluation by NASA satellite data via unified file-level netCDF and HDF-EOS data post-processing tools.. Presented at the Fall Meeting of the American Geophysical Union, San Francisco, CA, December 3–7, 2012. Eos Trans. AGU, 93(53), Fall Meet. Suppl., Abstract IN34A-07. PDF (© 2012 by me)
    • Zender, C. S., P. Vicente and W. Wang (2012): Simplifying and accelerating model evaluation by NASA satellite data.. Presented to the Earth Science Data Systems Working Group (ESDSWG) Meeting, Annapolis MD, November 13–15, 2012. PDF (© 2012 by me)
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2008), Compiling the uncompilable: A case for shell script compilation, Submitted to ACM Trans. Softw. Engin. Method.. BibTeX PDF (© 2008 by ACM)
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2009), Efficient Clustered Server-side Data Analysis Workflows using SWAMP, Earth Sci. Inform., 2(3), 141–155, doi:10.1007/s12145-009-0021-z. BibTeX PDF (© 2009 by ESI)
    • Wang, D. L., C. S. Zender, and S. F. Jenks: Cluster Workflow Execution of Retargeted Data Analysis Scripts, in Cluster Computing and the Grid, 2008. CCGRID '08. 8th IEEE International Symposium on. Lyons, France, 19 22 May, 2008. IEEE Computer Society, 449–458, doi:10.1109/CCGRID.2008.69. BibTeX PDF (© 2008 by IEEE)
    • Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338–1342, doi:10.1016/j.envsoft.2008.03.004. BibTeX PDF (CSZ) PDF (EMS) (© 2008 by Elsevier Ltd.)
    • Wang, D. L., C. S. Zender and S. F. Jenks (2007): A System for Scripted Data Analysis at Remote Data Centers. Presented at the Fall Meeting of the American Geophysical Union, San Francisco, CA, December 10–14, 2007. Eos Trans. AGU, 88(52), Fall Meet. Suppl., Abstract IN11B-0469. BibTeX PDF (DLW)
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2007), Server-side parallel data reduction and analysis, in Advances in Grid and Pervasive Computing, Second International Conference, GPC 2007, Paris, France, May 2–4, 2007, Proceedings. IEEE Lecture Notes in Computer Science, vol. 4459, edited by C. Cérin and K.-C. Li, pp. 744–750, Springer-Verlag, Berlin/Heidelberg. BibTeX PDF (DLW)
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2007), Server-side Parallel Data Reduction and Analysis. Presented by D. Wang to the International Conference on Grid and Pervasive Computing (GPC), Paris, France, May 2–4, 2007. PDF
    • Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl, 21(4), 485–498, doi:10.1177/1094342007083802. BibTeX PDF (CSZ) PDF (IJHPCA) (© 2007 by SAGE Publications)
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2007), Server-side Data Reduction and Analysis with Script Workflow Analysis for Multi-Processing. Presented by D. Wang to the OPeNDAP Developer's Workshop, Boulder, CO, February 21–23, 2007. PDF
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2007), Server-side Data Reduction and Analysis with Script Workflow Analysis for Multi-Processing. Presented by D. Wang to the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, San Antonio, TX, January 14–18, 2007. PDF
    • Wang, D. L., C. S. Zender, and S. F. Jenks (2007), DAP-enabled Server-side Data Reduction and Analysis, Proceedings of the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, Paper 3B.2., January 14–18, San Antonio, TX. American Meteorological Society, AMS Press, Boston, MA. BibTeX PDF
    • Zender, C. S., and D. L. Wang (2007), High performance distributed data reduction and analysis with the netCDF Operators (NCO). Presented to the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, January 14–18, San Antonio, TX, January 14–18, 2007. PDF
    • Zender, C. S., and D. L. Wang (2007), High performance distributed data reduction and analysis with the netCDF Operators (NCO), Proceedings of the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, Paper 3B.4., January 14–18, San Antonio, TX. American Meteorological Society, AMS Press, Boston, MA. BibTeX PDF
    • Wang, D. , Zender, C. S., and S. F. Jenks (2006): Server-side netCDF Data Reduction and Analysis. Presented by D. Wang to the Fall Meeting of the American Geophysical Union, San Francisco, CA, December 5–9, 2006. Eos Trans. AGU, 87(52), Fall Meet. Suppl., Abstract IN53B-0826. PDF
    • Zender, C. S., H. J. Mangalam, and D. L. Wang (2006): Improving Scaling Properties of Common Statistical Operators for Gridded Geoscience Datasets. Presented to the Fall Meeting of the American Geophysical Union, San Francisco, CA, December 5–9, 2006. Eos Trans. AGU, 87(52), Fall Meet. Suppl., Abstract IN53B-0827. PDF

    Release Highlights

    Stable releases receive unique tags and their tarballs are stored here on SourceForge and here at GitHub. You may also retrieve the source of tagged versions directly with git clone -b 4.5.2 http://github.com/nco/nco.git nco-4.5.2.
    • NCO 4.5.6: (Future) ncks prints human-legible ISO8601 dates; Chunking bytes not elements, caching; ncks prints human-legible ISO8601 dates; extensive hashing?; netCDF4 compound types?; Optimize diskless files?;
    • NCO 4.5.5: (In Progress, features in-progress or completed include) ncks regridder uses CF to find coordinates; ncks --xtn better extensive variable treatment; ncpdq fix permutation with multiple groups;
    • NCO 4.5.4: (Current Stable Release) ncap2 syntax simplification/fixes; ncks -V bugfix; ncks XML _Unsigned attribute; ncremap debuts; ncwa fix whitespace in coordinates attribute;
    • NCO 4.5.3: ncatted fix deletion of all attributes; ncecat fix gag mode; ncks infers rectangular and curvilinear grids; ncks --xtn specifies extensive variables; ncks regridder fix multi-level field normalization;
    • NCO 4.5.2: All operators support --glb_att_add; ncks better support for fracarea, mask, and displaced-pole grids; ncks diagnoses area for bilinear remapping and when area_b equals 0.0; ncks generates exact Gaussian and equi-angular, rectangular, and regional gridfiles; ncks regrid with old, new, and regional TempestRemap mapfiles; ncra -n NINTAP option understands calendar month counting; ncra -N avoids normalizing by weights; ncra -w bugfix with missing value normalization; ncwa bugfix when weights were not found;
    • NCO 4.5.1: cell_method improvments; ncap2 gets mibs()/mabs()/mebs() methods; ncatted regular expressions in att_nm; ncks regrid using TempestRemap mapfiles; ncra weights with --wgt wgt_nm;
    • NCO 4.5.0: Regridding with ncks --map; date/time_written updates; history provenance with -A (append-mode); ncdismember uploads to NERC;
    • NCO 4.4.9: Output chunking map/policy nco/nco = rew/all is default for netCDF3 input; Turn-off MM3 workaround for MM3->MM4 copying to speed-up compression-induced chunking; LFP chunking uses “reasonable defaults” when variable smaller than default chunksize; Shuffle by default when manually deflating; Support CF climatology attribute; Output chunking defaults to rew/all on netCDF3 input; Unchunking plays nicely with shuffle; ncra weights with --wgt 1,2,3; ncks suggests -C with -x -v crd; ncwa modifies coordinates attribute;
    • NCO 4.4.8: Precision-Preserving Compression with --ppc; Arithmetic operators -y mabs/mebs/mibs
    • NCO 4.4.7: cnk_min minimum chunksize; Chunking cnk_map=rew; Smarter chunking defaults;
    • NCO 4.4.6: -0 hyperslabs; configure DAP correctly; HDF4 chunking and deflation; netCDF4 stride (NC4_SRD) bugfix; ncap2 command line args with scripts; ncra --dbl averaging packed variables with missing values bugfix; ncwa --dbl minimization/maximization of packed variables bugfix; ncks _SOURCE_FORMAT and -V; ncrename re-write
    • NCO 4.4.5: DAP on HTTPS; ancillary_variables for CF; ncks --grp_xtr_var_xcl subsetting Chunking cnk_plc=r1d; Default chunking policy/map is xst/xst; Fix ncpdq dimension-reversal parsing; Chunking while hyperslabbing bugfix; Correctly parse MS Windows volume names like C:\foo
    • NCO 4.4.4: netCDF'ize non-compliant element names; -x var tolerates non-existence; --rad orphan dimensions; ncwa --mask_condition bugfix
    • NCO 4.4.3: Faster DAP access to strided data; Group broadcasting for ensembles;
    • NCO 4.4.2: CF cell_methods support; Bugfixes for nces memory, LLVM/clang builds, -X, RX's with groups, --cnk_dmn;
    • NCO 4.4.1: Group support for -X and --cnk_dmn; Chunk and uncompress simultaneously; ncra/ncea/ncrcat bugfix
    • NCO 4.4.0: Optimizations; ncdismember awesomeness; ncks --hdn; ncks --fix_rec_dmn=all; ncks autoconversion; ncrename output path; ncra --mro bugfix; ncra/ncrcat stride bugfix; Better chunking; Group support for ncwa -w -m;
    • NCO 4.3.9: New operator nces; Full XML/NcML compliance; ncatted NaN bugfix;
    • NCO 4.3.8: ncatted group features;
    • NCO 4.3.7: HDF4 support; XML/NcML data support; Multiple record dimension support with ncpdq, ncecat --mrd; ncrename group features; ncap2 file bugfix; ncecat ID bugfix; ncwa -b bugfix;
    • NCO 4.3.6: --flt default; ncpdq/ncecat leave only one record dimension; ncwa/nces bugfixes; ncdismember
    • NCO 4.3.5: nces/ncra/ncrcat groups with -g -G --unn;
    • nces/ncra/ncwa float→double coercion with --dbl; ncwa -d bugfix
    • NCO 4.3.4: HDF unpacking --hdf_upk; ncpdq unpacking bugfix; CDL printing legibility;
    • NCO 4.3.3: CDL printing ncks --cdl; ncrename -g; ncwa groups with -g -G --unn;
    • NCO 4.3.2: ncflint/ncpdq groups with -g -G --unn; ncks -X bugfix;
    • NCO 4.3.1: ncbo symmetry, group broadcasting; ncbo -G --unn; ncecat RAG; ncbo CF bugfix; ncatted bugfix; Windows DAP;
    • NCO 4.3.0: ncbo -g groups; ncatted NULs; ncap2 rounding; ncks metadata bugfix
    • NCO 4.2.6: Record appending with ncra/ncrcat --rec_apn; ncflint --fix_rec_crd; RX's in full paths; Correct dimension/coordinate scopes; ncks MM3 workaround;
    • NCO 4.2.5: ncks --mk_rec_dmn bugfix; ncks subsetting bugfix
    • NCO 4.2.4: Group wildcards; Group anchoring and recursion; Intersection/union modes; ncrename global att. handling; nces bugfix; ncra bugfix
    • Release Highlights from 2000–2012 (versions 1.1.47–4.2.3)

    Get NCO Binary Executables

    Pre-built binary executables are available for many platforms. Our source tarballs are always up-to-date, and work on our development systems (Fedora, Ubuntu, and Mac OS X). We also attempt to provide (theoretically) platform-independent sources in the most common Linux package formats (Debian and RPM). Below are one-line installation instructions and links to these and to packages for other platforms created by volunteers. Anyone willing to perform regular regression testing and porting of NCO to other platforms is welcome. Previous versions of these binaries are still available by searching the directory index here.

    AIX on IBM mainframes

    • nco-4.2.5.aix53.tar.gz (): Executables AIX 5.3-compatible (last updated ). Maintained by NCO Project.
    • Newer (beta- or pre-release) packages are sometimes available for AIX users as described here. Thanks to NSF for supporting AIX machines at NCAR over the years.

    Debian and Ubuntu GNU/Linux

    Fedora, RedHat Enterprise Linux (RHEL), and Community ENTerprise Operating System (CentOS) GNU/Linux

      The Fedora NCO RPMs are usually up-to-date so that ‘dnf install nco’ will install a recent version. A comprehensive list of pre-built RPMs for many OS's is here.
    • nco-4.3.2-1.fc20.x86_64.rpm: Executables for x86_64/Fedora Core 20-compatible environments
    • If not, try our own most recent (we stopped building RPMs many years ago and are looking for a volunteer to do this instead) self-built NCO RPMs (install with, e.g., ‘dnf install nco-3.9.5-1.fc7.i386.rpm’):
    • nco-3.9.5-1.fc7.i386.rpm (): Executables for i386/Fedora Core 7-compatible environments (last updated )
    • nco-3.9.5-1.fc7.src.rpm (): Source (last updated )
    • nco-3.9.5-1.x86_64.rpm (): Executables for x86_64/CentOS 5-compatible environments (last updated )
    • Volunteers have updated and maintained fairly up-to-date NCO packages in Fedora since it was added by Ed Hill in about 2004. Thanks to Patrice Dumas, Ed Hill, and Orion Poplawski for packaging NCO RPMs over the years. Thanks to Gavin Burris and Kyle Wilcox for documenting build procedures for RHEL and CentOS.

    Gentoo GNU/Linux

    Mac OS X/Darwin

      The most up-to-date binaries are probably those in the tarball below. Those unfamiliar with installing executables from tarballs may try the (older) DMG files (you may need to add /opt/local/bin to your executable path to access those operators).
    • nco-4.5.4.macosx.10.11.tar.gz (): Executables MacOSX 10.11-compatible (last updated ). (NB: These executables require the MacPorts dependencies for NCO). Maintained by NCO Project.
    • nco-4.0.3_x86_10.6.dmg (): For Mac OS 10.6 (last updated ). Maintained by Chad Cantwell.
    • nco-4.0.7_x86_10.6.dmg (): For Mac OS 10.6 (last updated ). Maintained by Chad Cantwell.
    • Fink packages for NCO: Currently NCO 3.9.5. Maintained by Alexander Hansen.
    • Homebrew packages for NCO: Currently NCO 4.4.2. Maintained by Ian Lancaster (Alejandro Soto's instructions here).
    • MacPorts infrastructure for NCO: Portfile for NCO 4.4.4. Maintained by Takeshi Enomoto.

    Microsoft Windows (native build, compiled with Visual Studio 2010, use this if unsure)

    These native Windows executables should be stand-alone, i.e., not require users to have any additional software. This is a new feature as of 20120615, please send us feedback. To build NCO from source yourself using MSVC or Qt, please see the NCO Qt/MSVC build page.

    Microsoft Windows (running Cygwin environment, compiled with GNU-toolchain)

    Before using, first install curl (in the "Web" category of Cygwin Setup), and set export UDUNITS2_XML_PATH='/usr/local/share/udunits/udunits2.xml' (or wherever udunits2.xml is installed). Thanks to Mark Hadfield and Pedro Vicente for creating Cygwin tarballs. Thanks to Cygnus Solutions and RedHat Inc. for developing and supporting Cygwin over the years.

    Python Bindings Source and Documentation

    Documentation and User's Guide

    The NCO User's Guide is available for reading in these formats:

    • DVI Device Independent (kdvi, xdvi)
    • HTML Hypertext (any browser)
    • Info GNU Info (M-x Info, emacs)
    • PDF Portable Document Format (acroread, evince, kpdf, okular, xpdf)
    • Postscript Printing (ghostview, kghostview)
    • TeXInfo Documentation Source code (emacs)
    • Text Plain text (more)
    • XML Extensible Markup Language (firefox)
    nco.texi is the most up-to-date. Files nco.dvi, nco.ps, and nco.pdf are contain all the mathematical formulae (typeset with TeX) missing from the screen-oriented formats. The screen-oriented formats—nco.html, nco.info, nco.txt, and nco.xml—contain all the documentation except the highly mathematical sections.

    Other documentation:

    • This abbreviation key unlocks the mysteries of the source code abbreviations and acronyms.

    FAQ: Frequently Asked Questions

    These questions show up almost as frequently as my mother. But they are more predictable:

    • I still have questions, how do I contact the NCO project? The NCO project has various Q&A and discussion forums described below.
    • Where can I find prebuilt NCO executables? Pre-built executables of some versions of NCO for the operating systems described above (Debian-compatible GNU/Linux, Fedora/RedHat GNU/Linux, Gentoo GNU/Linux, and Mac OS X). Otherwise, you may be on your own.
    • Does NCAR support NCO? The NCAR CISL Consulting Service Group (CSG) supports NCO like other software packages. The NCAR CISL-suported executables are made available through “modules” so try module load nco. If you notice problems with the NCO installation on CISL machines, or if you would benefit from a more recent release or patch, then ask cislhelp. If you have a comment, suggestion, or bug report, then contact the developers as described below.
    • Is there an easy way to keep up with new NCO releases? Subscribe to the nco-announce mailing list. This list is for NCO-related announcements, not for questions. nco-announce is very low volume—one message every few months.

    Help/Support/Contacts:

    If you have support questions or comments please contact us via the Project Forums (rather than personal e-mail) so other users can benefit from and contribute to our exchange. Let us know how NCO is working for you—we'd like to hear. Have you read the documentation and browsed the forums to see if your question/comment has been reported before? Please read the Guide's suggestions for productive Help Requests and Bug Reports.

    • Where should I ask my questions on how to use NCO? On the Help site.
    • Where should I post suggestions/comments on NCO features and usage? On the Discussion site.
    • Where are NCO development and bug-squashing discussed? At the Developer site.

    README/ChangeLog/TODO

    Files containing useful information about the current distribution:

    • README Platforms and software required
    • ChangeLog Change History since 1997 (version 0.9)
    • TODO An unordered list of features and fixes we plan

    Source Code

    The simplest way to acquire the source is to download the compressed tarball:

    The best way to acquire the source and occasionally update to the latest features is with Git. The browsable Repository contains up-to-the-minute sources and is the easiest way to stay synchronized with NCO features. Updating NCO source requires some familiarity with development tools, especially Git and Make. You may retrieve any NCO distribution you wish from GitHub. Usually you wish to retrieve a recent tagged (i.e., released) version. This command retrieves the entire NCO repository (< 20 MB) and then checks out NCO version 4.5.2:

    git clone https://github.com/nco/nco.git;cd nco;git checkout 4.5.2

    This command retrieves the current (“bleeding edge”) development version of NCO into a local directory named nco:

    git clone https://github.com/nco/nco.git ~/nco

    Track changes to the development version using

    cd ~/nco;git pull

    One difference between running a "tagged" release (e.g., 4.5.2) and the development version is that the tagged release operators will print a valid version number (e.g., 4.5.2) when asked to do so with the -r flag (e.g., ncks -r). The development version simply places today's date in place of the version. Once the autotools builds are working more robustly, the confusion over versions should largely disappear.

    Developer NCO Source Documentation

    Automated source documentation, created by the Doxygen tool is available. Some developers find this documentation helpful, as it can clarify code and data relationships in the code.

    The Doxygen documentation is infrequently (i.e., never since Daniel left) updated.


    Compilation Requirements

      Best Practices:
    • Although building NCO yourself can be easy, sexy, and lucrative, we recommend that you first try the pre-built binaries for your system, e.g.,
      sudo aptitude install nco # Debian-based systems like Debian, Mint, Ubuntu
      sudo dnf-install nco # Newer RPM-based systems like CentOS, Fedora, openSUSE, RHEL
      sudo yum-install nco # Older RPM-based systems like CentOS, Fedora, openSUSE, RHEL
      sudo port install nco # MacPorts (after installing MacPorts on Mac OS X)
      If pre-built executables do not satisfy you (e.g., are out-of-date) and you want the latest, greatest features, then the first steps to build (i.e., compile, for the most part) NCO from source code are to install the prerequisites: ANTLR version 2.7.7 (like this one not version 3.x or 4.x!) (required for ncap2), GSL (desirable for ncap2), netCDF (absolutely required), OPeNDAP (enables network transparency), and UDUnits (allows dimensional unit transformations). If possible, install this software stack from pre-built binaries (commands to do so on Debian and RPM systems are given just below). ANTLR binaries from major distributions are pre-built with the source patch necessary to allow NCO to link to ANTLR. If you must build the source stack yourself (e.g., due to lack of root access, or systems without packages such as AIX), build all libraries with the same compiler and switches. The ANTLR distributions must be built with the source file CharScanner.hpp patched to include this line: #include or else ncap2 will not compile. Recent versions of netCDF automatically build OPeNDAP and UDUnits. NCO is mostly written in C99, and although you may mix and match compilers, this is often difficult in practice and is not recommended. The exception is ncap2 which is written in C++. ANTLR, OPeNDAP, and NCO must be built with the same C++ compiler to properly resolve the C++ name-mangling. NCO does not yet support newer ANTLR versions because the ANTLR 3.x and 4.x C++ interfaces are incomplete.
      For the reasons explained above (compiler compatibility) install as much pre-requisite and optional software as possible from pre-compiled packages. This is easy on modern package-oriented OSs. For Debian-based systems:
      sudo aptitude install antlr libantlr-dev # ANTLR
      sudo aptitude install libcurl4-gnutls-dev libexpat1-dev libxml2-dev # DAP-prereqs (curl, expat XML parser)
      sudo aptitude install bison flex gcc g++ # GNU toolchain
      sudo aptitude install gsl-bin libgsl0-dev # GSL
      sudo aptitude install libnetcdf6 libnetcdf-dev netcdf-bin # netCDF and DAP
      sudo aptitude install libhdf5-serial-dev # HDF5
      sudo aptitude install udunits-bin libudunits2-0 libudunits2-dev # UDUnits
      For RPM-based systems (substitute yum for dnf on older Fedora systems):
      sudo dnf install antlr antlr-C++ -y # ANTLR
      sudo dnf install curl-devel libxml2-devel -y # DAP-prereqs
      sudo dnf install expat expat-devel -y # expat XML parser, a UDUnits-prereq (RHEL only?)
      sudo dnf install libdap libdap-devel -y # DAP
      sudo dnf install bison flex gcc gcc-c++ -y # GNU toolchain
      sudo dnf install gsl gsl-devel -y # GSL
      sudo dnf install netcdf netcdf-devel -y # netCDF
      sudo dnf install librx librx-devel -y # RX
      sudo dnf install udunits2 udunits2-devel -y # UDUnits
      For Mac OS X with MacPorts:
      sudo port install antlr # Antlr
      sudo port install libdap # DAP
      sudo port install gsl # GSL
      sudo port install netcdf # netCDF
      sudo port install udunits2 # UDUnits
      For Windows with Cygwin, select and install the following packages with Cygwin Setup:
      curl # DAP and wget pre-req
      expat # expat XML parser for UDUnits
      gsl # GSL
      hdf5 # HDF
      netcdf # netCDF
      udunits2 # UDUnits
      As of 20131101 there is no Cygwin package for Antlr, and the netcdf package does not yet support DAP. Users should instead first download and install the Antlr found here.
    • Once you have installed the pre-requisites as shown above, you may then build the latest stable NCO and install it in, e.g., /usr/local with:
      wget https://github.com/nco/nco/archive/4.5.2.tar.gz
      tar xvzf 4.5.2.tar.gz
      cd nco-4.5.2
      ./configure --prefix=/usr/local
      make
      sudo make install
      export PATH=/usr/local/bin\:${PATH}
      export LD_LIBRARY_PATH=/usr/local/lib\:${LD_LIBRARY_PATH}
      Please post questions about building or installing NCO to the list only after reading and attempting to follow these instructions. To indicate you have done this, include the word “bonobo” in the first sentence of your post. Yes, “bonobo”. Otherwise we will likely redirect you here. For more sophisticated build/install options, see the next section.
    Still having trouble building NCO from source? Read these Build Hints

    Using NCO at UCI, NCAR, and other High Performance Computing Centers (HPCCs)

    HPCCs unfortunately do not utilize modern package systems like RPMs or .debs, or do so on old OSs with no access to newer RPMs and .debs. Institution-supported executables are usually available with module load nco. These stable releases are often many versions (up to two years) old. Thanks to funding from external grants,

    DOE, NCAR, and UCI HPCC users may find more recent pre-built NCO executableses the personal directories shown below. These are usually built from a recent tagged-version of NCO (e.g., 4.5.X-alphaY) not from the “bleeding-edge” of master which is usually untagged. One way to use these pre-built executables is to prepend them to your executable and library search paths, e.g., export PATH="~zender/bin:${PATH}", export LD_LIBRARY_PATH="~zender/lib:${LD_LIBRARY_PATH}"

    • ANL ALCF Cooley cooley.alcf.anl.gov: ~zender/bin
    • NCAR CISL yellowstone.ucar.edu: ~zender/bin
    • NCAR CISL mirage0.ucar.edu: ~zender/bin
    • NERSC Edison edison.nersc.gov: ~zender/bin or module load nco/4.5.2
    • ORNL OLCF Pileus pileus-login01.ornl.gov: ~zender/bin
    • ORNL OLCF Rhea rhea.ccs.ornl.gov: ~zender/bin
    • UCI ESS greenplanet.ps.uci.edu: ~zender/bin

    Known Problems from 2013 (version 4.2.4) Onwards

      Recent Generic Run-time Problems:
    • netCDF4 Strided Hyperslab bug: Multiple users complain that access to strided hyperslabs of netCDF4 datasets is orders of magnitude slower than expected. This occurs with NCO and also with related software like NCL. The cause appears to be that all recent versions of netCDF up to 4.3.3 access strided hyperslabs via an algorithm (in nc_get_vars()) that becomes unwieldy and error-prone for large datasets. We developed and implemented a transparent workaround (that avoids the troublesome algorithm) for the most common case which is where strides are taken in only one dimension, e.g., -d time,0,,12. With the workaround introduced in NCO 4.4.6, strided access to netCDF4 datasets now completes in nearly the same amount of time as non-strided. This workaround works transparently with any version of netCDF. We are not yet sure that we have fully and correctly diagnosed the cause nor that our workaround is always effective. Comments welcome. Updates will be posted right here.
    • netCDF4 Renaming bugs: Unforunately from 2007–present (February, 2015) the netCDF library (versions 4.0.0–4.3.3) contained bugs or limitations that prevent ncrename (and other netCDF4-based software) from correctly renaming coordinate variables, dimensions, groups, and attributes in netCDF4 files. (To our knowledge the netCDF library calls for renaming always work well on netCDF3 files so one workaround to netCDF4 bugs is convert to netCDF3, rename, then convert back). A summary of renaming limitations associated with particular versions of netCDF4 is maintained in the online manual here. Important updates will also be posted here on the homepage. There are no known bugs with renaming features as of netCDF library version 4.3.3.1 (March, 2015).
      Recent Operator-specific Run-time Problems:
    • Minimization/maximization of packed variables bug: Versions 4.3.y—4.4.5 of ncwa incorrectly handled packed variables during these operations. The two workarounds are to unpack first or to perform the statistics in single precision with the --flt option. The solution is to upgrade to NCO 4.4.6.
    • Promoting packed records with missing values bug: Versions 4.3.X—4.4.5 of ncra could produce (wildly) inaccurate statistics when promoting (e.g., to double- from single-precision) variables that are packed and that have missing values. The two workarounds are to unpack first or to perform the statistics in single precision with the --flt option. The solution is to upgrade to NCO 4.4.6.
    • Chunking while hyperslabbing bug: Versions 4.3.X—4.4.4 of most operators could send incorrect chunking requests to the netCDF library, resulting in failures. This occurred only while simultaneously hyperslabbing. The solution is to upgrade to NCO 4.4.5.
    • ncwa mask condition bug: All versions through 4.4.3 of ncwa could return incorrect mask values for negative numbers. Thanks to Keith Lindsay for report, and to Henry Butowsky for fix. Prior to this fix, the ncwa lexer would drop the negative sign, if any, from the comparators appearing in the mask condition, e.g., ncwa --mask_condition "lat < -20" was parsed as "lat < 20" not "lat < -20". Hence, users of ncwa --mask_condition (or of -B) should upgrade. NB: The -m -M -T form of ncwa masking is/was not buggy. Thus the workaround is to use the -m -M -T form of ncwa masking, while the long-term solution is to upgrade to NCO 4.4.4+.
    • ncra, ncea, and ncrcat file close bug: Versions 4.3.9—4.4.0 of ncra, ncea, and ncrcat failed to correctly close and optionally remove input files. This could cause NCO to exceed system limits on the maximum number of open files when hundreds-to-thousands of input files were specified per NCO invocation. The exact failure point is OS-dependent (NCO commands on Mac OS X 10.9 would fail when processing more than 256 files at a time). This is embarassing because NCO has always been designed to work with arbitrary numbers of input files and we want power users to be comfortable running it on hundreds of thousands of input files. The workaround is to avoid versions 4.3.9—4.4.0, while the long-term solution is to upgrade to NCO 4.4.1+.
    • ncra MRO missing value bug: Versions 4.3.6—4.3.9 of ncra could treat missing values incorrectly during double-precision arithmetic. A symptom was that missing values could be replaced by strange numbers like, well, infinity or zero. This mainly affects ncra in MRO (multi-record output) mode, and the symptoms should be noticeable. The workaround is to run the affected versions of ncra using the --flt switch, so that single-precision floating point numbers are not promoted prior to arithmetic. The solution is to upgrade to NCO 4.4.0+.
    • ncwa hyperslabbing while averaging bug: Versions 4.3.3—4.3.5 of ncwa could return incorrect answers when user-specified hyperslabs were simultaneously extracted. In such cases, hyperslab limits were not consistently applied. This could produce incorrect answers that look correct. This bug only affected hyperslabbed statistics (those produced by simultaneously invoking -a and -d switches); “global averages” were unaffected. We urge all ncwa users to upgrade to NCO 4.3.6+.
    • ncpdq unpacking bug with auxiliary coordinates: Versions 4.3.2–4.3.3 of ncpdq did not correctly store unpacked variables. These versions unpacked (when specified with -U or -P upk) the values, but inadvertently stored their original packing attributes with the unpacked values. This would lead further operators to assume that the values were still packed. Hence consecutive operations could lead to incorrect values. Fixed in version 4.3.4. All ncpdq users are encouraged to upgrade. NB: this bug did not affect the other arithmetic operators which unpack data prior to arithmetic.
      Recent Platform-specific Run-time Problems: No known platform-specific problems with recent releases.
  • Known Problems through 2012 (version 4.2.3)

  • People:

    Current Developers (please contact us via the project forums not via email):

    • Charlie Zender, Professor of Earth System Science (ESS) and of Computer Science (CS). Role: Project PI. Contributions: Core library, porting, release manager Related Research: 1. Group-Oriented Data Analysis and Distribution (GODAD). 2. Extend empirically verified analytic model (described here) for terascale data reduction of gridded datasets to account for cluster- and network-effects. 3. Enable and optimize NCO for intra-file-level parallelism using netCDF4/HDF5 parallel filesystem features. Other Interests: Atmospheric Physics, Climate Change.
    • Henry Butowsky, software engineer. Roles: Scientific programmer Current Research: 1. Efficient complex data analysis with storage-layer constraints. 2. Develop and thread the ncap2 interpreter. Other Interests: Compilers and interpreters.
    • Wenshan Wang, Roles: PhD Candidate Current Research: 1. Causes and implications of Greenland snowmelt. 2. Rapid evaluation and exploitation of multi-model datasets. Other Interests: Advancing to candidacy.

    Alumni Developers:


    Get NCO netCDF Operators at SourceForge.net. Fast, secure and Free Open Source software downloads
    / Announce / Developer / Discussion / Help / Manual / Project / Source / [ACME] [ANTLR] [CF] [DIWG] [GSL] [netCDF] [OPeNDAP] [SWAMP] [UDUnits]
    nco-4.5.4/doc/insure.txt000066400000000000000000001344631264355130400151340ustar00rootroot00000000000000$Header$ Purpose: Keep track of memory access problems with NCO reported by insure ncks -H in.nc Runtime: Executed "ncks" on lanina.zender.org, pid=18654 [4 tot.] Format string is inconsistent: Error in format string for fprintf. Format string: "%s = %hhi %s\n" Stack trace where the error occurred: prn_var_val_lmt() main( This occurs at ncks.c line 1323 Apparently %hhi triggers this problem %hhi appears to be a GNU extension to ANSI C ncks -O -C -H -d lat,0 -d lon,0 in.nc foo.nc Runtime: Executed "ncks" on lanina.zender.org, pid=18656 [8 tot.] Memory leaked due to pointer reassignment: ptr Lost block : 0x0812ae88 thru 0x0812ae8f (8 bytes) ptr, allocated at: malloc() nco_malloc() lst_prs() lmt_prs( main() Stack trace where the error occurred: lmt_prs() main( ncflint -O in.nc in.nc foo.nc Runtime: Executed "ncatted" on lanina.zender.org, pid=18675 [5 tot.] ncatted -D 5 -O -a char_att,att_var,a,c,"and appended Sentence three." in.nc foo.n Memory leaked leaving scope: ptr Lost block : 0x08114db0 thru 0x08114dc3 (20 bytes) ptr, allocated at: malloc() nco_malloc() lst_prs() prs_aed_lst( main() Stack trace where the error occurred: prs_aed_lst( ncap -O -D 1 -S ${HOME}/nco/data/ncap.in ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x081742d0 thru 0x081742d2 (3 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x081742e0 thru 0x081742e4 (5 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: ncap_initial_scan() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: Lost block : 0x08174460 thru 0x08174462 (3 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174448 thru 0x08174455 (14 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: ncap_initial_scan() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: Lost block : 0x081744a0 thru 0x081744a7 (8 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174470 thru 0x08174472 (3 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174590 thru 0x08174593 (4 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174900 thru 0x08174903 (4 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174910 thru 0x08174913 (4 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174cc0 thru 0x08174cc5 (6 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: ptr Lost block : 0x08174ce0 thru 0x08174ce9 (10 bytes) ptr, allocated at: malloc() nco_malloc() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x08174da0 thru 0x08174da4 (5 bytes) block allocated at: strdup() yylex() ncap_initial_scan() main() Stack trace where the error occurred: yylex() ncap_initial_scan() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: ptr Lost block : 0x08174f58 thru 0x081751f7 (672 bytes) ptr, allocated at: malloc() nco_malloc() var_lst_mk() main() Stack trace where the error occurred: main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: vara->val.vp Lost block : 0x08180348 thru 0x08180353 (12 bytes) vara->val.vp, allocated at: malloc() ncap_var_init() yyparse() main() Stack trace where the error occurred: var_get() ncap_var_init() yyparse() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: ptr Lost block : 0x08180328 thru 0x0818032c (5 bytes) ptr, allocated at: malloc() nco_malloc() ncap_var_init() yyparse() main() Stack trace where the error occurred: yyparse() main() [unknown:unknown] **LEAK_FREE** Memory leaked freeing block: Lost block : 0x08180368 thru 0x0818036a (3 bytes) block allocated at: strdup() yyparse() main() Stack trace where the error occurred: free() var_free() yyparse() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: malloc(var_dpl->sz * _Insight_1) Lost block : 0x08180b90 thru 0x08180b9b (12 bytes) malloc(var_dpl->sz * _Insight_1), allocated at: malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() Stack trace where the error occurred: var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: Lost block : 0x0817fd90 thru 0x0817fd9d (14 bytes) block allocated at: strdup() yylex() yyparse() main() Stack trace where the error occurred: nco_redef() ncap_var_write() yyparse() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: ptr Lost block : 0x08181040 thru 0x08181042 (3 bytes) ptr, allocated at: malloc() nco_malloc() yylex() yyparse() main() Stack trace where the error occurred: yylex() yyparse() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: ptr Lost block : 0x0817ff68 thru 0x0817ff81 (26 bytes) ptr, allocated at: malloc() nco_malloc() yylex() yyparse() main() Stack trace where the error occurred: yylex() yyparse() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: ptr Lost block : 0x08180da0 thru 0x08180da7 (8 bytes) ptr, allocated at: malloc() nco_malloc() yylex() yyparse() main() Stack trace where the error occurred: yylex() yyparse() main() [unknown:unknown] **FUNC_BAD** Function pointer is not a function: (void *) (yyvsp[-3].sym->fnc) Pointer: 0x0804aea8 Stack trace where the error occurred: yyparse() main() **Memory corrupted. Program may crash!!** [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: Lost block : 0x08180998 thru 0x0818099b (4 bytes) block allocated at: strdup() yylex() yyparse() main() Stack trace where the error occurred: yylex() yyparse() main() [unknown:unknown] **FUNC_BAD** Function pointer is not a function: (void *) (app->fncf) Pointer: 0x0804a668 Stack trace where the error occurred: ncap_var_function() yyparse() main() [unknown:unknown] **LEAK_ASSIGN** Memory leaked due to pointer reassignment: vara->val.vp Lost block : 0x0818c020 thru 0x0818c037 (24 bytes) vara->val.vp, allocated at: malloc() ncap_var_init() yyparse() main() Stack trace where the error occurred: yyparse() main() [unknown:unknown] **LEAK_SCOPE** Memory leaked leaving scope: Lost block : 0x0818c200 thru 0x0818c210 (17 bytes) block allocated at: strdup() yylex() yyparse() main() Stack trace where the error occurred: yyparse() main() ************************** INSURE SUMMARY ************************* v5.2 ** * Program : ncap * * Arguments : -O -D 1 -S /home/zender/nco/data/ncap.in * * /home/zender/nco/data/in.nc * * /home/zender/nco/data/foo.nc * * Directory : /home/zender/nco/bld * * Compiled on : Jan 23, 2002 00:53:58 * * Run on : Jan 23, 2002 00:54:36 * * Elapsed time : 00:00:04 * * Malloc HWM : 175,835 bytes (171K) * *************************************************************************** PROBLEM SUMMARY - by type =============== Problem Reported Suppressed ------------------------------------------------- COPY_BAD_RANGE 0 1 FUNC_BAD 2 960 LEAK_ASSIGN 15 197 LEAK_FREE 1 27 LEAK_SCOPE 8 138 RETURN_FAILURE 0 4 ------------------------------------------------- TOTAL 26 1327 ------------------------------------------------- PROBLEM SUMMARY - by location =============== FUNC_BAD: Function pointer is not a function, 2 unique occurrences 960 at PC: 0x08056e08 2 at PC: 0x08075995 LEAK_ASSIGN: Memory leaked due to pointer reassignment, 15 unique occurrences 85 at PC: 0x0804eb82 18 at PC: 0x08064fc6 16 at PC: 0x080655fe 23 at PC: 0x08065c3d 2 at PC: 0x0806e0fc 12 at PC: 0x08071e3c 3 at PC: 0x0807fb86 2 at PC: 0x080821c3 16 at PC: 0x08082cac 4 at PC: 0x08082d42 3 at PC: 0x08085c1d 2 at PC: 0x08085cdd 21 at PC: 0x080afb86 1 at PC: 0x080b3f31 4 at PC: 0x08101aca LEAK_FREE: Memory leaked freeing block, 1 unique occurrence 28 at PC: 0x080c4dd5 LEAK_SCOPE: Memory leaked leaving scope, 8 unique occurrences 1 at PC: 0x0807cdb4 6 at PC: 0x0807fda2 46 at PC: 0x08082d54 22 at PC: 0x08082d86 14 at PC: 0x080835fb 6 at PC: 0x08083e1f 6 at PC: 0x08083eea 45 at PC: 0x0808440d ************************** INSURE SUMMARY ************************* v5.2 ** * Program : ncap * * Arguments : -O -D 1 -S /home/zender/nco/data/ncap.in * * /home/zender/nco/data/in.nc * * /home/zender/nco/data/foo.nc * * Directory : /home/zender/nco/bld * * Compiled on : Jan 23, 2002 00:53:58 * * Run on : Jan 23, 2002 00:54:36 * * Elapsed time : 00:00:04 * * Malloc HWM : 175,835 bytes (171K) * *************************************************************************** 1729 outstanding memory references for 83,754 bytes (81K). Leaks detected during execution ------------------------------- 672 bytes 1 chunk allocated malloc() nco_malloc() var_lst_mk() main() 36 bytes 2 chunks allocated malloc() ncap_var_init() yyparse() main() 34 bytes 2 chunks allocated malloc() nco_malloc() yylex() yyparse() main() 31 bytes 2 chunks allocated strdup() yylex() yyparse() main() 22 bytes 5 chunks allocated strdup() yylex() ncap_initial_scan() main() 19 bytes 2 chunks allocated strdup() yylex() ncap_initial_scan() main() 12 bytes 1 chunk allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 11 bytes 2 chunks allocated strdup() yylex() ncap_initial_scan() main() 10 bytes 1 chunk allocated malloc() nco_malloc() yylex() ncap_initial_scan() main() 5 bytes 1 chunk allocated malloc() nco_malloc() ncap_var_init() yyparse() main() 4 bytes 1 chunk allocated strdup() yylex() yyparse() main() 4 bytes 1 chunk allocated strdup() yylex() ncap_initial_scan() main() 3 bytes 1 chunk allocated strdup() yylex() ncap_initial_scan() main() 3 bytes 1 chunk allocated strdup() yyparse() main() 3 bytes 1 chunk allocated malloc() nco_malloc() yylex() yyparse() main() Leaks detected at exit ---------------------- 8000 bytes 1 chunk allocated malloc() nco_malloc() var_lst_divide() main() 8000 bytes 1 chunk allocated malloc() nco_malloc() var_lst_divide() main() 7046 bytes 19 chunks allocated malloc() ncap_var_init() yyparse() main() 1920 bytes 2 chunks allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 1920 bytes 2 chunks allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 855 bytes 84 chunks allocated strdup() var_lst_mk() main() 640 bytes 1 chunk allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 320 bytes 1 chunk allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 256 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 200 bytes 20 chunks allocated malloc() nco_malloc() ncap_var_init() yyparse() main() 195 bytes 33 chunks allocated strdup() yylex() yyparse() main() 189 bytes 34 chunks allocated malloc() nco_malloc() yylex() ncap_initial_scan() main() 188 bytes 32 chunks allocated strdup() yylex() ncap_initial_scan() main() 186 bytes 19 chunks allocated strdup() yylex() ncap_initial_scan() main() 186 bytes 33 chunks allocated malloc() nco_malloc() yylex() yyparse() main() 174 bytes 19 chunks allocated strdup() yylex() yyparse() main() 128 bytes 1 chunk allocated malloc() nco_malloc() aed_prc() main() 128 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 128 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 128 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() ncap_var_var_multiply() yyparse() main() 123 bytes 18 chunks allocated strdup() yylex() ncap_initial_scan() main() 117 bytes 22 chunks allocated strdup() yylex() ncap_initial_scan() main() 105 bytes 18 chunks allocated strdup() yylex() ncap_initial_scan() main() 96 bytes 1 chunk allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 96 bytes 1 chunk allocated malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 77 bytes 12 chunks allocated strdup() yyparse() main() 35 bytes 5 chunks allocated strdup() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 32 bytes 2 chunks allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_add() yyparse() main() 29 bytes 3 chunks allocated malloc() nco_malloc() yylex() yyparse() main() 22 bytes 3 chunks allocated strdup() yylex() ncap_initial_scan() main() 19 bytes 2 chunks allocated malloc() nco_malloc() yylex() ncap_initial_scan() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 12 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_sub() yyparse() main() 12 bytes 2 chunks allocated malloc() nco_malloc() yylex() yyparse() main() 11 bytes 1 chunk allocated strdup() yyparse() main() 8 bytes 1 chunk allocated malloc() nco_malloc() var_dpl() var_conform_dim() ncap_var_conform_dim() ncap_var_var_multiply() yyparse() main() 4 bytes 1 chunk allocated malloc() var_dpl() ncap_var_var_multiply() yyparse() main() 4 bytes 1 chunk allocated malloc() var_dpl() ncap_var_var_multiply() yyparse() main() Outstanding allocated memory ---------------------------- 16386 bytes 1 chunk allocated malloc() yy_flex_alloc() yy_create_buffer() yylex() ncap_initial_scan() main() 10368 bytes 81 chunks allocated malloc() nco_malloc() var_dpl() main() 10368 bytes 81 chunks allocated malloc() nco_malloc() var_fll() main() 1032 bytes 6 chunks allocated ctime() main() 841 bytes 81 chunks allocated strdup() var_lst_copy() main() 841 bytes 81 chunks allocated strdup() var_lst_sub() main() 672 bytes 1 chunk allocated malloc() nco_malloc() var_lst_sub() main() 660 bytes 11 chunks allocated malloc() nco_malloc() dmn_dpl() main() 660 bytes 11 chunks allocated malloc() nco_malloc() dmn_fll() main() 648 bytes 1 chunk allocated malloc() nco_malloc() var_lst_copy() main() 364 bytes 1 chunk allocated fopen() main() 364 bytes 1 chunk allocated fopen() ncap_initial_scan() main() 364 bytes 13 chunks allocated malloc() nco_malloc() ncap_aed_lookup() yyparse() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_dpl() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 360 bytes 62 chunks allocated malloc() nco_malloc() var_fll() main() 324 bytes 1 chunk allocated nco_realloc() var_lst_divide() main() 324 bytes 1 chunk allocated nco_realloc() var_lst_divide() main() 324 bytes 1 chunk allocated malloc() nco_malloc() main() 324 bytes 1 chunk allocated malloc() nco_malloc() main() 140 bytes 5 chunks allocated malloc() nco_malloc() ncap_aed_lookup() yyparse() main() 117 bytes 13 chunks allocated strdup() ncap_initial_scan() main() 104 bytes 1 chunk allocated nco_realloc() ncap_initial_scan() main() 103 bytes 1 chunk allocated malloc() nco_malloc() cmd_ln_sng() main() 100 bytes 3 chunks allocated malloc() nco_malloc() yyparse() main() 88 bytes 1 chunk allocated nco_realloc() dmn_lst_ass_var() main() 84 bytes 3 chunks allocated malloc() nco_malloc() ncap_aed_lookup() yyparse() main() 82 bytes 13 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 78 bytes 5 chunks allocated malloc() nco_malloc() yyparse() main() 71 bytes 13 chunks allocated malloc() nco_malloc() ncap_attribute_2_ptr_unn() yyparse() main() 70 bytes 11 chunks allocated strdup() dmn_lst_ass_var() main() 61 bytes 13 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 60 bytes 15 chunks allocated malloc() nco_malloc() var_dpl() main() 60 bytes 15 chunks allocated malloc() nco_malloc() mss_val_get() var_fll() main() 47 bytes 1 chunk allocated malloc() nco_malloc() fl_out_open() main() 44 bytes 1 chunk allocated malloc() nco_malloc() main() 44 bytes 1 chunk allocated malloc() nco_malloc() main() 44 bytes 1 chunk allocated malloc() nco_malloc() main() 40 bytes 1 chunk allocated malloc() yy_flex_alloc() yy_create_buffer() yylex() ncap_initial_scan() main() 31 bytes 5 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 28 bytes 1 chunk allocated strdup() fl_mk_lcl() main() 24 bytes 1 chunk allocated nco_realloc() ncap_initial_scan() main() 22 bytes 5 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 21 bytes 3 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 18 bytes 2 chunks allocated strdup() ncap_initial_scan() main() 16 bytes 1 chunk allocated nco_realloc() ncap_initial_scan() main() 15 bytes 3 chunks allocated strdup() ncap_aed_lookup() yyparse() main() 14 bytes 3 chunks allocated strdup() ncap_initial_scan() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 12 bytes 1 chunk allocated malloc() nco_malloc() ncap_sym_init() main() 6 bytes 1 chunk allocated main() 6 bytes 1 chunk allocated strdup() ncap_sym_init() main() 6 bytes 1 chunk allocated strdup() ncap_sym_init() main() 5 bytes 1 chunk allocated strdup() ncap_sym_init() main() 5 bytes 1 chunk allocated strdup() ncap_sym_init() main() 5 bytes 1 chunk allocated strdup() ncap_sym_init() main() 5 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated strdup() ncap_sym_init() main() 4 bytes 1 chunk allocated malloc() nco_malloc() fl_lst_mk() main() nco-4.5.4/doc/logo_cog.odp000066400000000000000000004017261264355130400153610ustar00rootroot00000000000000PKz½ç:3&¬¨//mimetypeapplication/vnd.oasis.opendocument.presentationPKz½ç:´z%9à9à-Pictures/10000000000000DD000000E0FAB6EBB0.png‰PNG  IHDRÝàBô>sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYs!Õ!Õœ´ß¢IDATx^ì½`y¶=<»ûÞÛ÷ÖFvl}˜aÜ%†»qwwïNwÜ=âŽÄÝÝ'žð_Uhšø°À¾·ÿ¯·†ít:ÕÕU§îïʹçþâùóçïý»?ž¿7í½÷~õÞó÷~/‹ŸÞû娝ÞûÕó翜|oì—¿øÉç¿xþ|òWxÃó_àM¿|oòù{¿úÅ/ñ òö·þx>1ùÞÄäóÿüÕÄó±_Œ¿÷‹çÿãü_>þ«÷ÞûÅ/žO¾÷‹É‰ç¿ÄñÐ G…'¿üå/ßúý ?ßðßþ19ù||âùÈøÄèÄùÿÉgã“£ã@ÂØØäèèäøÄ86üjblt¯OLŒONLLâÏÞÍcbrdlâ>plrhlü)ŽcbbdldIÈ8~Å1Žá§çÏÉ3Ú;;ºws¦} ÄÿA\õ ‚¶‰IrYñã0y:†+`NŒOŒ<ŸnG€SYlïê„‘7{gx|rpt|xllü9uTã£C“£ØÆÇG''qèØ¨ïñð]‰—Ÿóÿ.qÑqa‰„aÂö…M{6<\ÛÔ–\Ty9!ýnÁèøØøøÈ(0AÞûõn®9žç#“£y·2’ò**[ºf eë78üŒ¸¢Ã#Ľ \`˜iÜ»<î{+a©¸Ö.u'A}§Ý:ìïDŒn唓؋ŽÅ'Çž”6¶EßÌ9®d–ZXŒurrôíÝÿнþâ×x„É}‚+ÛÚ{ÿ ƒ ö;õ]„´Ø»ô\„tظöBZúŽkåLµ®Ed6{&T'Ô|/et1ã\ѱ "coåÁ¤R>T²køXUKçvu‹ :öBêÌ݆Î|êŒoÅô®Ý+€1Å1À´â$E=õˆÏ¸|§ˆøÊ¯ú*oåPÿu;ý7Ä%J¤(Çð¿ÑaD1­=÷¿ÖÛ¦f·W›½ˆÔwâ×cí2tÞ©ë¸]“±]›¹AÞÜëfYpj3'£NÞ5þ°*ãÑÓgt ó-]x°u³Ÿ ŽZ…Äþ i¾A“)hè²KÓa‡{©¨Þ­ìB¬ð$R£2[@ò³‰a$:-c®\½|k¶ü-}埻ÛC\RëãØ0Œ +“m½߉뗻tÙ;uÙBzl~6¿.k'VL=§ZÌ*Öâv!œô&¯¤ŠÀÄúŸÄÌ£¯%Ñëì[òáÈÚLŒ%ÉJVtÝÿá´úF¦± ¿–ƒ–Óf-Æ×¢z—o—ãÃQŒ aô|œø$ðN´üÎ]˯Ás@öç^ìÿCïÿ7Ä%9ûccƒãÃHMO¶ôôuV븀Ÿ.KPÏq—®‹®³¾ã.mÖt>‡­ÊÖf‘ÉAiuþéMÖÑk$T[û{8$)L¬´ˆLèÿÞИ‚ƒ196ôthð¤‰Ó:9«íZv; ök²w¸íÔw]*ª›p·¨„Å„SẢ‘á‰áçãã î¾7ïÞØá¼¡oõFwóoŠK N$ =9ÙÚwÿqý-jv;õwê±ém—>ž; Á‚ê9 ê²7©Xóé:r2oUrrºwè:¸ ?CÕõÊPQ™ö7a¢'”r¨äÐȹäÌå’&‚ê,AÖ.}'úøuXß ë%æ"ÇÆ’$ÖÉ7¡m‡ïD ’óËÙ`'ÁÉYʸMžË;†$äV½™#y_æmíâß—Ô”™‰K‚€)Ô º[Ãi­²¥]LzXR]hV»”}ÔSöð ªÕ#ÔZ ð yth##cnq©Ë¤ vhÙðëºLÃåqƒ”‚ —¨U‡‚8£ÃÀ¥‚CpRq OVþm!ã_»ßS\¾XÇgØË—Ë÷”±¤­”.KH“µE‹±ßÌÍ+­Š“Xï­îÛÓªÉÙù@$,%Ò5¨`¾ kI…v÷?Y&a°QÕjŸŠóNC'½ŽÃýE–€à²Æ%¹'½QN3ÖôçrV¾‰EµoÄ£ø×"oþOÿ—Bº ô†8}—ž#¿£€&s¢…:çFxZChZ“npÊNy£ž§`K€ÿF ìoäBfHcéûD.ÕÞ®ÁØ£ë±wíQà&yËä ŠËFÈM$ˉϦò©²FîÉ…uÿ?.ßȵxç;yÕ^~û2î¡í%@I›I6¼L$vë9 ˜: ªÚ i°ÖË›y'”úgÕÅÜîY«hÉæÄ!wHˆ›CHÖ¼&4iÞ$Ç0·LDw§>[ÈÀu‹>s¯ŽëK¿b —ú°—/pI¸yÄ-!îsy=—œÒzú…w~ZßÝþÚKBˆ j‘H²àb‚ì€eq‹š=Lm“x7®ÕÄŠç{ œ7*Yž¶ Íj Íi5ò»v\סãþD*#££ ˜½Æ•¡˜•¨¹£dƒ y¬B¢—œ5Ü­îʯD•Ã>‚K:Q{é´Mƒ¹T\/µ¨‚ÊN®(Iòz)ŠËk³‹Ëj(\¾Æ±üŸù“ÿp9ðòD³ã’‹Qdgv8 é°6Ú(on•á›YǼxû+QÝܺF¤Á‡^YFÜI*®¦RޏOº7w[¡b¹KÃQ@—%€›AÏù%.õËeúi.©Ü©Yâ^#Õò‰‰³jvE%Õÿ¿½ü?s‡qôU{9 {¹\"[„Å]EsÖ {a뀰œ׫…_Öð½–<‰à(ðñómå""ýH,Þ š×Ðùå%>m6J » œvj;\êBÔ”½¤qIÖñJr¥¸GÏ .GFÇÅ•ì*ªšHâèçÛîŸ{èÿÂ÷¿;\RgòEDJÝïoékSŸB¿SqÏJ)½ jv‚:S¹:3="ë8IáuTÌ·©Ûí2`ÅåõFÜX%kµ^Ñ<¿¢š^L©Î*˜!5˜)â9±†Égêº5 9GR(¸ð¶Ñ–îîƒZ6?©1µ™ûôœP×Ù¥ã´ËdP^\n×tøá¬AFiµÂQ¦  ®æxC÷}þÓz•5Ô!¼­8Ûu™úÖïìCß.’LÜTG"è1o‹ÖJBW”ïðIqàñ“3欕JV hŽ4"ppq¹KL¦ÄhÑ¥sAmÖZ9c‡Ø;Q·;·¨Ú/—Ö6²ëêë'6“ðÎ@Ï$tH@À!‰wŠ+IŠ–ƒõ“"ÿTø1Ú“cž=ÓñŒüá¬! ñÓÝ €¹+àH i\þ(c˜U^Kˆš—T7'u7ÄfþeŸbs8%ï—Sw8ù¸;¨Ç[²)Üݾ;\Òߊ0É© /ßÎ×#–‹JõÁÀ`éD[ûüõ¥RF¸êˆµ ½ q˜¨ù–uÄ@üŒ½Zì°;mÖ±·<«÷„ú!3vkw(g$H>BóØP@Åg!?8‰°ÓÙ-¶xqb´ïÑC€Ë_‰ñë8¨ÛÏÄ%‰¼ø—+eïTÕ“H‰À·!àÜyE^>ªé8ðtp]ÆomÁ™†9ʘ Ó4»‘D×k%Ë~.Žß.ñ½¨<mT¿ñ-á’¬¬Ô*‹d8YÇ'B³—I i±@¾„Yõ^ÚË9ê„u‹Šµ‚ë¹kåeØQ+äÍþ!i¼ß€™[Ó d‚uŒO ë4U‹G·â:Ö'™ÔÓñ; “ô؎׵v(¸pþ!¢-¨ÉÜ¥Áä3Kã¥GAgÔ§ŽbˆnÓ`¬–7Í­nÄ®Án¦q‰»úé𨒇žUà“¡Ñ§øÀ·sWϱˆ“*íÀ`-x¾í»Ã% ËȪyãÃÃ/ü¿·²Ðí 8‰°T7m2:õÞgMQfD¨4Ížn‘ Ómšö oV°°L¿˜×+a¶VNïy›Ÿdì\c“ˆÏG%è¶t`"kúøÓ±‰§Ð&mr"-;§¼É2Ó­jæ‡tœQu4$Ñ7ï§Ó¸¤×q8¸[ÕkLójšHO>…°7ð5?Þ£iïì;6‚àmµÅñâ’^²©^)ò Ë9Õ(üï…KÒ90öôÉc¢0@Ò.o+ô!îåï‘l!‰œKËûAÒ ¹IÀ+8hê´79ÅÅœò/§#•8£úìmšvë”ÌÙWó/ô©ù\Ù¤h¼UÉü'u—Ëš¸_HÈ­¨níé1žXNp;†ÇÇ»ï?̯jKº- móùi•¶üZŽ»t\ø´™XÇ÷躊<Ùˆ_K\[D?\\ê;\Â^Ö4få_’Öá‰É—Ÿ4r‹ˆ§:+Þ^W78}¤NN>~ü˜ëYR†ÿvoÏ^–àr‘Å‹/:qëN±º­ÏÍÛeT ú5 `FÇŸ"N €:å5ÑKÆë™S’É& º¤W9\ÑÈäÛË¤Ìø5‰OI™%6rF:€~D$¤ñ:%t¥íÑsÚ ø‚Юë¸YÍv»ªUtf|ñCöù;GŒÜW+˜¬8k°DLw…”&œN¯0cN¬'Þ„sÑ0 ú”µç2¦_‹­Q°áÓdm7dîÔuá×ó0™BºîBzΨ7âƒvê9ìÖÇÝÂ"¬°7ÀÖsÚ¢Ê\#o~¯¦f¸Q”d|‹ñžýtÜÀÂ'dpt\e®ùÏ"$ÃJ|ªgVŸt·Q¢4Ä‘ÄΫšÔ™î±·è‹BpI¥¨d‚x³·…K¸[#¤M–:©“8‘£7s+— ëý—€*{ÚNÞ­ý÷ñ"b"%³Žw*¢u¡þ©oJ28 Ä]FÜìs5méY3~¤ ©Tµn¢ôç‚w“éb ÒiSêȯíÀ§Á؉Ê$‘ìP·_«`vÖšÓz§C/ÎY@Çe‡),è=ö~c·-êÌÕræyÀ%‚}œ=råY<~:¸SÞJÒÆåñÓgDx€ãŸ~à¾8ö‰+@Wð)ÓðÓÁgžÑ—WJ­>kô·ƒªŽç ¯ ™X"û0¥ö„ªÁÛ0Ÿo —”½Â}8224t5ù1ã²vRýƒZÿ}@séimŸ¸4+R ^hô'žËÈÁ%EE.¯…NÒw†{†62>òtð©ª[är³]†.XÊ2Ât8´Qnaíô GPŠÈ’JÅì|úŽ[u¶bW¶@²FÖd›²õ&e«UªÆBÚövœä‹™ ±w›Ü®Ü1O6ΰ½ÃŒ»ÃŽ¿ãÏ.:Í2,Ñ,ä¦qÐu-Ï‹r¬ðS¶œ#–Bú®[5TmתXý¤bº^Ír»º­€:c–Ó~W¤Ö÷å¤kÊÚªÅX%k|»¼šðúHi©gãòÞËNët t¯¡ó&5ë + 7¨XñáV1pÐsÚªÍX*¢˜_F¨m$G„O•AÇ&Ü¢nüNP®¸¥›8¾Þ­ûCÄ0I.²HQݸ¥Ó +El½¾5^«d·M‡ÉO|ÜÆÌMê–_‹›Ä’#ë¾4 'YÛ߸·û¶ì%`5494<2ä—ø•ŒÑ:RžvÞA–*·£ÐÐd|vJó?©üçnÅO©3v©ëÆ·ÅyAW5é¥!—ª“üìñH.Íã$j½”Sü÷SÚ‚ZLdˆàÛñk3±pï@¤6“OŸº ÜÇõrfëdwk³dÙH§sÒë/ævÞ,¿9¿ër^g|N{Xrm`JYXNM\qSruSCÏý¾¾ÇýŸ <¼ÿtèáàð£á¡Ç#ÃO‘Ä{:4öhhôáàÙžb½ÿd´s`¨²©÷viÇ¥{çsÚÂ3›ýk­¢²äÜcöšºbí^)m¶NÁ ø^ÜØýJ"…Jýa Sþö•¬Ü÷wËkzEÑî÷?ëYR§–ØJr¦Ç°Xµß¤âæ¿\Üä'y£ÍÚV{5œ@—FߎˆA:íҲߪa󽈡oôýA$PÇÇñ·€'É•½ÑÇÛÄ娍÷…kË$tר0q½‰MÒu­k‡&ã ±ÇCõªLÈ—ýf¯ú¯öiþé°ºePl]}•â$ë8•Ä}\çh z‚Äâ><¢ÃüAÁv'ª8$wÆíA¸Àp±ª*[®S0çS³—´µŠH J©¼RÒw½l .¿3æNKxF}HjuhFuhZuXZ­beuc# ÏW‚2d£ëXt›ŽT¨N$‘"¡îFþ„vNHeßã±ÚöñÂú¡¬êWŠÚý“*Ì#2Ä™‘BÚì/E ·(ë¡"@Ô°„æIX¦Ñê¶®*vßžÒmêèä†Íÿ p(C¤=s¢µ«Ï9ú2îÌo$Œù4Ù|†‚ÚÈàÚ éƒÎâ–ɲáÔé:lS6ýË=MÏðGcˆ H"‹êŠ{+5Ï‘¿!\Á?!1UÆ7}“˜¾TDc‹‚½ †“ ±ÓN]æn¬˜úLÈ]RÑî^}G~=çïΚÿþ ÊíUþ¯}šÛU˜W3?$ª*D¹üÄ''µD„×Éu'‘ѵD5žÌ.•z»¶BBg1ºDÂÂ/àI@–hµ´áVEsiV˜Ýù¬Ð솸¢îø‚® w[£²"2êÂ3êBÓkËЌڰÌÚÐŒš°Ìh].jŸ|ÄSè‚ïJq|è²?*•L  tf®™¿â$S—N ¾ˆbÉáö?iîyRÚúèfa úwt#Óö±ë;zèIA!E:1:42®áñé#“ „•„”InÂ%YY°Á›ÕÀ›)B—ÃÒD\©‘‰ñ˹…ûôm1^©h#¨ç¶Sb$l>=æN#—š¦qÚc€dN óZYS>›S6þ:$gɹ×’à\¾éªò›Á%¾+N)ç .ÃÒi\¤—œ”Z×ëåO!{AÅ#È`‰}½5tškH±ÙqbòIU&LL¶v?¼|·Îår‘ÛÕò¤âîæûϨ}TÉ#ô/Çô×*X£&DL Ö{€ÌR$á<I'ÞŒ ‰C¤CÇû>p ‰ù^D÷{i³­Ú΂šN{5Ø»Á5`í5pF~Ûn,2D‰µVÑ.·ëw3úSÊÛÒ*»n7<\¯aüá!%«à8Ñÿo]ÇéÂDô¡`?a|õoGÕö¨»íUuä3dñ9ð!qý¢¾ò¢Ð‡ðÓ‚°£{ôÁßaì7rÙ«ëô¥¨ñÖýÍ!­O*µòBr„8›DÖ‚X‡é¸ÄE&üFj!Åe#틆&¥½C¿×Þ!g÷“Œ™&Ó0ðzxNÃłΠ÷Úb²›€6¬Ñ°‹xÂI« Ϫ§m$ADîFÞ™VC´ÞõjISïcb!ÞäÅ 8öÄe!DX|ˆ¯’ø¬ýOž5tÞ,³>ïÊíÖž§ÃUÍ-›¤õÿ.¬/ kWÒЊLÜ0Êå$S3}!§)<1Á/lÈÐØ°¶{ ºˆ¶ª8ð«“F<>Mû½ ³è²¶/‹v¢î€Õ\‡õƒ„î ïsyõÙ÷KÛ/å6^-èHªlº^Z»JKIaþïÄ%0A$ª¨ò|—ÊæÎ]HþÉYïÑv…±ä×¶Cñ .Ë´º0Zj¸F$„ÚàCˆ^Øc;lîÆ§ÅüÃ~ÅßÐúì´åaFviÃà0´ïÁE8Ã^’ÀwŠ–YTºKÇæ«3¦ë¤M÷±,#R.u_Éï:—Õ“Õž^˜VžÝ‘ÕœVÙU%7À”%—ôsîàz\/Ï¨ì†Æ}¼)Q5êvBx K{‰è–”!Fž“|"ùz<Å(ê=ƒHKY_.¾VÖz=s­ŒþbFˤ £Òî>&æ`f¶—DXT‘‚ZG(íÅñÑÚÎ1†ÈM|`ËÃ}tÔw4©…µ[‹}ˆD9¤_—½AÉ|‹²™IصœæiU]ñwª¯´Ä´Åæ6&ÔtÝ̪Y}Ú,¥ 7TAÞìãͬã”o×…¨ëQu¿ëéKÏêm×6{§Ê'¹p_A!À .~ ú™³ –{·ê¹|rRïw‡ÔþvF­’™ePtsg‰|gh U8Jš{º=â®/Õü«ˆÆe³ę̀{͉E=‘™Í™ X¬SªÖÓˆ f2&¦±66ò…™œ†K®Åë)õç²aÎp—/KBì7ò ø!™D’-§K<İá£té°d !îÁ•ñqT"®çÖ¦7Gä1öZ&¬óùQUã  5 dŒúyõAq’›{öä‘×ùÔmê¶ßÊ j0aQmBš(ß#[" =¨Ð»Ó‚@ÕvU+ÖÅ´ÛÍOnµ\-h¾^cÙ|%¿áfQ{nû³ƒl%;ŸGƒO¨,Ó9/wòÆpI-Ô­IEš÷Ÿ>Û¡c±FÑZ@ÏÅhHû!SÃå+ÐK9Vp ½Pb!íý¤)‘,îûLÜt~Ðùï}Ê_ ›¬“¶Ú§i¯çv§ªëÅIªÇ´¿¬ï|hà{a‹šõŸO©,××öн×—×Õš^– CXö"  ƒi$p¬F‰9L£b‹ø4{I­øUi ©ÖH„d$"~cŠ5µ‘/E±á)“L|Jʸ%Ž-÷'”>N¬µå$¨ÙzDùGi¦OveEÌ$ k”6éÅÄ.j»3¢¯íÒ±^%e¶FÞL\²f(/¡+¨ô¡ àÅ]Î|šÎ›µí×Kë†$çfÕö$–tÞÊ©/j¾”ßœ|·å|^Ý­š®˜ìæI•64 Q¡&rEoìDP;zC¸œyP“ÏïT4þYTc‹ºý! ðÊܰLиœÁwä®ït ¥Ê¢ïÛé©ë6UÇ?ÒüÍ1奲+dÍ>?¥òƒ„±€®“˜C¸¢ÇEqû0¸êßɪ|vTêo§4WÉYHÚsâîµÝ,éʨࢲCR«"²^øŽ™ua<wá¦ñiÛ«¸$¡OdFWBuKÿCê^ ‘Ø›½óìíU Heâ&'û†¯•ös²›´‚®oRrøËi“?Uûê¸2¿†í)kç˜3ìs‚º®?œÑùò¨2šïÖh°PDþ(ÍrÚ .qQ At¢IûP¡Ù¤b³YÎ,®¤)³aàÒݺ«ÅqEMñ…Í·òZà\^©èȬèß|V—q™dœH*NoøT¼-\Âx(¸‡Ù@øšd½žÉqäbtJ’…Ȭ¡óË ­ÜHUö—Ë­ŠŒ/Ä >Õý³ˆÞWâ_‹é/•2^"¦¿RÆüdzfKd¬¾9£·[ÏÍáJ^lqçù»Í‘X¦k9©Õ3Ñö¯ÐA¶¨ŒZ×+%eSeÀ–\ò³0Í[Ú¡ó>$l>öhx°¨µïÜÝv×ø"Fä*Yó5Šf+•ÌAhZ!i¼RÆt‚ùfU+>m[mÆÎlhºKúìà܃E¥ÍÚKä½wè@¤  3Nrñí†GñùõWK`&c oÞkºžß|±¢-³¬‡–°ILóÉTza(G0¿´èŸõu|óÛÂ%2Pç»]\»JÑbæ?0vép»÷gšÌ)UP(6Ã:NX<”üßM$Òp+;ÓñØ­á¼A“µDÚú qÓÏ…õþ$jðq£OOë~~Bë#<:¯=önÛ…ì–èôFENZu$’äS™HPÿ|D¾ŒÐ_à²ÎýZYVM'Ŧ¡ 7ïêA' ¹î#žò‘D%y¨{à1"åÐŒ&ó°ôÊ oZ£”€ez7Úá5äLbuÖs¢„ã¦Såá_i±÷jcMwBô=×›é·kû®Ý®¿^Ò›[{%¿9¾ 9© -¦¨!>¿!«ºó'y=ÿKIƒ¤u‰h  ¾ñ3ñ¶pIdOEoÜæÜÕoD4ù À._²qgv/{‘Å+"é™ "…oÀÞb„àÝñˆ–ÓQS÷#æÌÜv9ñiÙ4÷мU•\r?6³!: auCe)¹ˆœ5û3ëªÍ›âÅ1e/©u<½Ú/¹æÂ½úÁR*%µŽwõ ËCT`=õ¡¨àæ I£$k5TÞ6p1»:(½æ4#b­’ÍF5+}wA}OA]7*²„…%hŠÈÇ=ÿ ðƒÓ„Žá-Zö+ÄuX±Ù-n·^ɯ¿”×p¹ õZaËµÜÆwê.•¶Ü®{ ç}JÓº÷æY¢/ic2ꈔfßèãmá’dƇ਷<Ø,o¾N‹ñ`(ÿrfÃ+š”ô)#)4-¨Îü™ ^A¢ŽÎÜ¡Ãܪf³EÎLŽ“ÓŸß–]šY‹òPªBÛ‰¤³•0¢s™ÌYÓC¼‘8 Íð´Ê ô¨j=Â?‚€sáǹ^TŽŽ´éf`Âɧj\£# O „|çXÿ£giEM!iõÚ!Ép7ªš hÙí‚C=ÈxÈbñÁ O/â”rö«ù %“3v¾9µ‹Úc ë㊮æ7^º×x¥°-¾ ñ\AmNqÇ妕Gä’ jHÊç£ €V;Âx£·…KÂl%`rüÂí¼¿žRߎ~m;ðu÷èyvÓšl^¤œ$Œz G:íEa£{›.k“ªõ6yK›¨ô«%ý‘Hp4æ¨QÑæ4‹[¾‰ïžÑ@•Å Q#<Ž)²HU¡i•œôJNfeXVExFELF}pJ£ÇåüžÇ°¨¿Q1ïËDÉx„ÓT¦™J)RÔ”–ŠUT;!Uð¦(ߤq‡bPÌ)ªºÎåv,|éB<ù@*­ú"ÌéÐÈH^EcTV­ËÍÚÝ:ÌMòFBz ~ D6Þüº¶$gN tÑ‹Xîh‘³ºMÉ<>·êziÓå$ƒš¯Þmº•ßv-¯åznÛåüæ+eMÙ•÷E,%í}Qå êÔ=9Eq{Ã+ùÛÂ%µà håî{úTØÆcµ¬9üë]ú¤¯EHÛI@Ÿ(ïÏl¿âž2úÄ!â×B¿˜3’íø‘…ZE ˆø¥V].éÅb•Mð4eÛ^ÄÚ‹\»yn@“ÂtaipÒÉ–Þ™ÚÚÚ‘Ú–ÚŒ_f4ù$TÔ÷ö=lë}Xßù´¶ýIUëÊ–å­ÊZ·”´”·÷×õŽë÷½„òèþ€pjä( z׸$K¿óU›­JV²ºRÜNXj Ò“t…f²”4(ah§ÙÔ†0 <£–“Ù’^’RšT–TyñvÓõ¢¦ÔŠ¦Â¦î’†Žìòúë9E1 9~qÉfÞÆž1{/Q¦ï{ïVng,Ý%l}Î:úË»«¸qô¢-B/ºÄÞŒKɾ‘S”UZ[ÔÔ]Üú(»¢;¥ ùÜív§[Í–qŽWË“%•uT¶õ=z:†¡¦£ø54/™°åHÓÕYÃC÷j;BÓâîìÐ$®ùpØ^æ/Ñ:â°JÎ0úNMzUÏ¥Â&ªÞz¥¨ù gAcVÝýˆôJßó_U»š7Ž Ày­ãû9_émá’ܰ£˜jKØ`D;Õø˜c|Âߎ(íPqØdÈB#ËâpÉÞ®a¿JÚÈú|ö¥‚Þói<«v'nò o@=/4IˆCmÓxC  °or•ç­²s9uwzë{îW¶ö^Îɳ ?¯è|ÚÚÕÑ}†Nû÷ºí7õÙoâ%¨á¸ZÆê§µ?>¤üé>¥Ïw+~¾_ñ¯ÇÕ¿<£ý½´ñ*%K>¹ž0÷”´óQrô×ñ µ ¾™œSPßÒÔû°¨ù!¤¹\¯V9_*p½^–Ù”PÐÔ÷àÁëÍ$%ÉDHRTbq?L¢ãa¨ ¡¢ñþÉåU­I/Uõ¡ÃŽ[Uìw²Óëú¯çÕÇ6^Ék½œßvù^CRYkJ]QØå•Ò†ŸR1qÐJR}‰Ë·d8ß.§2À<·î±gƒCޑחBúBÃa;I^´X˜Dg‚N[¼è£*Eh;lP{À†{çFI?±‘TE‘‡É%¡½t1 3ã…9¤³˜”IŽ=,µ:2½&*}•¡È½g6rÒÁ0jà$ƒ“Q“SŸ]ÞVÓÚs·ºÁå•3Ö‚Z  »Æ.§lüÎØú Ûú‰Úú‹ÙˆÚˆÛŠ3‚ѹ+ë&ç&ËâHÙ ›ûlÑf/cöçcêï–ÿŸÌo¶ŸýO™ÿ’ýà¨ÆWÒæ›4Øû ½÷{"· jãe~%¹°ªª¥£¤¹óBN]Pj³Çu`´02£ª%ðÁgXÜÁy›b‘dE&´d2×ga4‰°Dâ+ZºCÓªBS«vé3¶ªÚóiº€À§ï¼NÁJ×ûbvýƒ‹÷꯵\)h¼šß–TÒt½ªû„©ßÒZ߉™Ë[»c¸4i‚¤4èÚýÛ}¼]\¾rì$­@<]¯ÐÄM÷ Œ&ÅÛxÑÓMÒ鼡"|Êí*Öqwã zÀ*å'4‹(ó¤çH˜õð#³#°ˆ£³‘ì­É/ îc]Zy{YË@Ja™[ì%Y/´|ðëº6÷=m j,Ê%Abö@$Á%…Nü(‚çöØüÅRœ³ÌP%gŽ¢K¨¢[¸´cÈIKϽz«å-ÐcþÁ™_ò‰bû©Ïj@šuª¤ˆŽ;É0ýí£oÅßÎϯm½SÓ‘Óîx­Š}µ,,«µ ©LdÒö@Î(ptS á›/—Tv~+rv¨×´÷†e4ù&”š:l’7Ù­åɯËX«`\zje÷Õâ¶Ë…-—󮕵Ô=>aí½RÆpƒ‚Õ>-ëêö.ÒÃ76D|ÒÂô:îïÏò;Ä%¥‚ŽÞÇ6ÈZ`¾aX½ ¹ƒè€Kˆ¯“^-cÄŽ¿w©°÷|6255‘Yõ!$}ó’"É%óγvO1†¥¬àœ´\›Ðô¯¤† ´¦ü†–¾‡¡Iw¤8û ]ö˜º¶öÞ.I° 5H¸ãχ2ʾ‘4DßUo tÅ_Ôèçüö[,ñw¯÷!ôŽ-,Ù$7ô³+Ý$B"+;• J« M®ŠN¯Ë­ï+©oñˆMÔrܪÉ>aëƒj‡˜]ˆˆ5G”*â*Î  .AŸ¬&µ‚h2‚°{iKÞ lãGÞf$b$fË*à ‘e‡È°‚¤YAâ¬I¦¿Œ} *;LÃ-ZÕ=JÁ9ì‘Ëí*þz¯ü/wJÿJH|‰°Î! §Cè°ÑeŸÏ.©,mypávKPR…mì½ÈôªÆÎûDqâ%ä¯d1ŽÑ‹€ò éÚ# R$¦¸Ôµ=½Õu§i»¡Ýfek€ï¡T6ÁX—Ieíq÷jAœÝ¤`³TRÇâü Š\7ÕÈI­ÔÎÞ.*ß"ÏmÆã>ÇP”Tõ>z„µo1™t þ%É÷BAŠOÓY¡uÒ&ÖQé—‹z©Ptád¢‹<ô<ÌË©UžN°¿ôDÉ" ’T“Qz·¶#«ªÕ5.ùˆ‰'$7Nš»‹ÚûœfŸaÀÚ‹[úŸe†g§­}€< XDû8—"X¯)\rÑIc DXsÔÄ툱ûAW~§-jŒõ 6kä,ÖÈY­U´Þ¬b…üë1 oI» yv˜²G”’g¤’[„¢s¸„}Ðn'Œ.ýð€Êìÿï2=ª±AÙ-%§Í=,/&ç•4öÄÜÅÊ^é}­¨ ªåéSÂâô-ø Q 剢“õt(¾ »‰ºvMË}Nf‡÷Í’mêkåMÎåÖß*n¹V \6fTõ˜„\[¦l*¤ÊZ)oXÑÔF7ô¡@BMê%”¶â[~¼;{IµYP}UDæe2àjÒj9#†T)œTÌ 4‘x×q\.©¯|ýrIÿÅÌf‚- ,‹´Ì— °MÃå´¥üU\Ž5Twž4'•&–5Uõ=ð=wñ´®Õ!c×ãV^§ìN3…í|%ÊÅ×ï´­7 3T‚Á· µŠr(‡’š”±$Ëw ˆ½¿ÖtGÄ>Dœé#Æðcú±÷;jå½×Äm³ ã{Ó¿žÖøüü_Ž)aÖ„ªƒ”]ˆ¦k´º[”²k¸¼S°8Ów=ºGŽªÿz§Âoå?>¨±\Æ\Ø>𘉫Žç¹ò¶ÇYu¼뜮‡¤U6?„$ êU»¤È‰ ‰Í‰.¹Iì⦰ôÏKËÅu¢ïT!+tµ°éR~CfMï!C·uÊfË•¬M|c†‡Ÿ Gî©Å“* išXÄ=ñÏ÷Ýá’øbA¡ ŸõšÛ›×+šðëºÒ"¹»©.§mzÌ f*.ç}bý¥VðiÔñiÞ$/4)ŠFuXVutZ}DZ‚n¸¤Á©õç3jJÛG'e 2tOÚrDm‰×Oÿ’8Æ6HÜ.DŒ lp¢v~v¾âöþ§É†uß+ÿá!•ïÀqÖfˆ:x+¸„êxÇhºG4÷þJTÿw”É/ùþ>ù횬æÞ{].'–·u&ä·xݪt¾Z”SÕ‰‘ªè¬ ¬ x¤%>èÂfŒ”9è~”ɱüúάvKN2V’[ù­ RÊ»"Ó+WI›!…´LÒ"&3…–cýç0ö:ýîpI3ˆîNErÞ£ÇÚ®AñøI†ÅFÇu f§,}c ºÎç4“è–òÕæ¯E9—HO¦5†f4†¥ƒäy«ä^]wFy¶W4þ›úI!¸¶¡G,Óð©8F‚á+jç-Ìð‡ ”„¥´ Äò÷ˆXù6ð€Äú5[4pJ8„˜…]ñ¿•“‘÷NViEA]cISKYK{ykGqcKasw^CGV9*%åqé¹7³]¢RT9‡Í\¶jØm×p8n$Í—f…3qç“·ÿúˆÞ‡{”—ÓA¡AÊ1LË÷‚ŠkØqSÏÒ–¿Þ-ÿŸ|’;¦öêqk)‡Àë÷ªZ{8‰…®qE ´=&âËD^näl}º37#B'w<ÆÇr*Ú=oÔ@Ü& üßÜÚ{ôî-?kÃ*iËŠ®vÒýö­ãÌã|w¸$êÒ¤@q ‰nØYVÈê³Æ¤ï Zšht²Þ£ÁŒºÛs»` ö¾F¥¦4BV©õ©%AY­Ymå­½A7nѳ=lâ.lãsÒ6D’%JùŽb ²Ñöò´}¨°}¨„­¿¤­÷[ŸƒÖ> ½øÔ˜|Úö,¿è´»e í­=}}!ÛKê´¸ÆT"ÕîMó#‰ 5>‚ÿJ7$iF>zÒÞÓ_ÙÖ»ÄÀ'êžlwyž`qdÝCOÙx¬S³ýÓAµOw+ü e(ÌôÐô Õ÷8wÂÖ÷[ ƒßì”þ Ÿì?Dt„á˜úZ‡`±í¸r·ÙëJUDFUûýÇD¢qrëôbJƒˆëqpÈ=!¾~>6484réN3˜{Q·ëo54>>ÃZ¥hίi½SËùQë~—4S.@ß).)ò ­fE:°Í#¾?£ VÑvöv5ûÍJ¾·J.v‘îD0)³ëü\h’÷§ÕD§Ô¸§Ô^+o+®¨ÕòÞ®é|Ò:@ÌŽcˆ8Œ¢—‹ó" Fö¦1HÊÖOÂÖŸ¡b¯3VÞ~7 Ë Á“—‹.:“J$Ò ¨û#“H=(gdpˆ´;²9T.‡î%l!Ò¾ÕKKºZ'Š[Xáñ²öþ;µ÷xÊ9+9E2rûáŒîÇòßÔ‡ÖƒªK˜žOô)+ï¿ÖþoA™_óË i84õ¶ñÊ.«¹[Ñp«ÂëzqAC‘µ&÷à.ÚáâS-‚äJàø>}z>­Ö3±.®¨¹¨áŸŶÛÔ-{g”¼|•øŸû›w‡Kº{‘R±§ùŸO².g.Óá×coÑdn•77 ¹v9¿3|JJñJ2Ž3øA¼+;/Üø”Mˆ˜½Ÿ˜Cèo {/ºlC’>œ3vÇmývh9ìPµ×öŒ½q»¸¥³sKeÝA=|ú ‚¨ž>yøøáƒGî?êð¨¿ÿaÿƒÞ‡ýø‘Ú|pÿAÿ@Oo_gß@oß@OwoowOþíêëîÂÿ÷ÿ¦6¼­§«?ö÷‘Ÿzúz0$åɳg£¥¤ÓéUbWáé Abdt¸ûÁ£¨„¼£†î|ZŽÇ̼äØaÒ¬ð樓?â—ýꌴ]°ŽWèY µ5ùµÀÙö*ì1ðF¨nêÑÐ6p>«žy£,«ºˆ(ˆä¹÷I—îLŒ€ªDb$$šhý9¸›Dûj¨¾ÿaPbetzÇ÷gµ5X”Í÷XyO >½® é?ƒÐw‡KÂÏFÅ4œ’Q$-Æ Â´RÑb£ºµ€*2Ççï´¡ZÈ­hÏâ*mG©ˆ” ”ÑAQ”Ò€_64²8ç÷ªYœ´ CuJ;ˆxzä9Ñk꽞rLŸ pH1Cwi²>ݯú÷ R.QúÞ¡'­ÿx@ùWÛÅÖ*Yž²•° È­¬™×î\åÝ–œd(-DÍj¡`‹° =kp$Ÿ Ž^+lrKmÝ­ÎÜ j½VÞ¢¬©•Ìj¡Â¹…öô†ÿNq9>øŒ¦ÀIÏ­iX¡d¶FÉJÅõüõâ¾pÒëM‹„&Åá¥úËPJ¯â$VEåv—·µ+9øí3ð>Å 9mç'në'E˜È£–èwš"j(aá{ÜÆIlQ Ÿ–®GƒÏ>z$ôuõwwwÓpä>ySМ¹ XetaS²ÐÄ~R%›h=6 Ôv;¨.këu’ȤnR§b¾íÇ[Á%õí)žPPH¦ŒHÓaždÞKyKû2IÕ¥ŒýoU€Ç[hJ-‘º@™‘RŒ¤hça™t‚’«KêÚŒ<‚iÙ -ì,ÂßÌõh,|b`CÚ‡ xÈÂë¡Ó…Ä4’Æ!Æ ®ä kÞ|¹Ë:ž *¢çÞÑ×~*`þ<¿¦YÄÆÚkX äÙœM¦ïï‘E*^×ïü6Æû?¬t´gUW_hz™ßõê®OqÚ©æ"®NåéˆPÈÔð(r•Æ?{š_ÛšZéq£j"!h H¯AOÏ•¼îÝnŸ‘¼x'ŸHºÝÁ‰a+ï±qò ‚õ­áœ2ÐX±x“óAJC}²ñþ›”¶’cô¥‚²óP׿‡&õ[Hð×Då´r+‘~/l°¿~@ÓZÔf2HÃ_˜I–r¶~bÌ@dÔOšûJÙzÞ̹××Õ5ÐÓÕÑÛÛIåÿW=¸‹;m­éˆ;’‘„ÃÔl¸¦îŠ®Áè1±1>fµ”Á„Îî·ôÒ÷ åS±ýív•ïΜ²ô’rðoíðNmJ¯$µD † ¡ÏŠX'‹ö Ñö†Î¾°ÔïëùÉU¡™M¡PÀˬHC§rUüÝÛsYË$´·ÉëÞ)*‡‚øã4?Eæ‰!.._¦^äÞ:ß .qd”:€Øà„ºnÓ–Ç d)¦·EÉ.:»ñü–´jèö’ð…®gÈHó®æ4j9ð/Óê8 5¾CÃî4¬£a‰‚ärÚ†Ô¾‘¶ò=má­îXTÕв»£»«dO¬åÛu"è_ñ5yþ¯#—DˆÔd FéˆÈã\šúEnÒs8ÎôUt‰Ú$kûûhEÒð‰]«ÌþŸ­§~”Õ9cí«ãuéNC‡ç•â ·k€¤;•$Ž©²!½Uµô^Ȩu¿Tá“ZœÙ@”‰i²uÍ!U1ÙµW :OÛ})a´MÅ:³´’ ž %*{ð*ÉèEöe”fÁ%ïg,þ9÷¾¡oÒE÷2f5q+k›[NZy|#i²JJO3èÚ•¼Î(Š[ ñšó»€±¤x¾Df(£:(¥öRAWNYí~cQ[ÏÓ¤Ÿ¼5ȃ!œ4¤ÓôØøéº†U×…=½ÝÝ}]=}í$ônÉÿUYщ‘H"çsl ér¤Qx<øÄ<(j¶­°­§*3f­´ýÇ;%PJUò ]!¬óK>ñuŠæ',.%T´Y\,O(k›xA¸—£m}On¶z\/ƒ–gp:tk¡L[ö©htÍg4Âj¢lÆ!]+5ñ÷š½n•.‘2øQÖd‹ŠmBQ)WQzØÄô¼04HxÍäâaÃûN^¬/ —‹±ÌÜྙh|‘–ѱîG1|£¼þ:YóÍr6«Ô,.ßm¿˜ÓN ´×HƒÄ Ùý™’v:é‚$p‰S†²DQC÷1c×.gHÛ—|t‡‰1ƒN[ùH±‚¤˜þ’–ÞZN…Uõ(:z:å jØE¢x˜ÝHQþ¯%o ‰›Eâ!ÜM2tbbü ѵ&3ð<´¸¸[Õú4ÃOË3~É1ÕRVrò‘tŽ[zLç7;Q¨´=fà’YÖp)¿ÃŽ]OQºy44œx·Å;¾À#±Îœëìê¨Ô‚HøEèN!|~¢ªÌI­Â"~>½),­H¬8m°AÖt¢éwR¦&±í½ý#”ïK¢ˆW¡ùÚVs*@æ±ÁïQRuäu°E‘<áþæ’”‚ª”ÂÊ”‚Š”ü[•œ_û¥äW§æW¥äW¥T'çW¥ÖT5wA˜žöÒ©œ¹=Ê-¯ OÈÞ¯cû“j«Ô¡é½QÙ\×ÿFBAO(Öà˜ƒøúU/“» ¶9D°àS¢Å'£&*­Š“ÙŒy%µíýš~v¸JØù¶ã A‚‰º¢ÿ”v‚”AR6žšÎ~Uu­ýHÀ ’È›¬Ýø© F³¿ëM×ßʹù#îÞè\q7ï@ã…š´F™&ŠYgè½Ý€}ÆÌYÕ%òKôÔUõŒ8kþÉ^éŽ*í7 3eç×`øF+çfMnu§ßlç„ʰ즈”ŠÈ(§Â. #€¸F!„…“Œ°²*<«:*¹ŽƒW²jbs}+6)ÙîÒrÚ¡fó˜.æ¹Għ–÷‰>xlî{0ìÔTT$uɼåìÂò?–ýAÖp¹œÁr+ä ¿—Ñÿ^ƈw[.cü£´ñr£r&Ë$õ¿?k'OÊÞOÇ'Ú.úºc\²qP¬†[„­Ûzy“¥†km0Å ’Á|ü Nfý9,dù¨3ƒ+¸?k‹-'ï© ÏnŽN¯ŽI®ðOkÎ*nŒIÎÜoàpÜ6ˆWÈ.X‚á%Ì–²ç(9ɱ‚äm¼³ Êûh¶EXGn†ˆ^Oy3;\”pSî³fݧý!/R¹‰zîn.Žñ‡¨­OùšÔDè2ð詆{„®‹¬Sè1[ß? É­W2×ô¹°WÇùÛ…1ÌOØ*Ð6üRaã€ÛÍz¿„ª@ä1Hç]ux¸›¤½$-Ë/º fR°aÀ6¼˜ßqÊÂg³º-Ô„´7«2–I›-—±8jì¦æhpÎþüuFÌM#¯s2ö~BšöKÎè,‘0ùZÔà+Q½¯Dt¿ÖùRXûkQݯÄô¾ÕûBDïk1ƒï$Œ¾•0üQÚl•”æŸö«éxž§ÆÚ½\˜ß£ºpZ cHŠ×ªÎœ¥b;tœwhCªŠ¬Ä6MÖ šåÙ £ˆ¾ȉ`”zĶk17k2תÛý o¼LZo©”î÷gõWÈ™¯UanÖr܆á˜ÀgÀÀ0ŽÍÊVÊ®÷¢é–Z”_™K2kÂ2*Ö jƒ2| E£ä^móq+·£†Ž2hͱ "Ep?1;ޤC€Š½ŸšCð+§¤¬|ÔSú{:»º;»z:{z»‰Ú>qaÇ‹'Ún!‰ƒ‚e<¸O¸?r¡É‹Q^+øÚ•$úÀàkrK/HÝ dÙ1Ð/æì±Ç @É!숅Ëï·‰ï5v3ð<^¶ÿÜ.¼VÞꌅÏÕÛ× ºRª‚“°F Ú›G7=‡šy0 š¼ìA@3.¿ƒ› B2EJ2*ŒMªäßõŠV+¤¾“0øJÜèK1cÌß]¥hͯçxÀÄõ¨…ûiKðYÏ2±I3Cœ"”\Ñm©ì¥æ­åsAË'V3ð¢qPü)»€µúC„1ñ’ ò¥§køä£'Ï6@ZI…¹OÇy&Û^mÇÝšŽ»4y·ÝšÎ{µ\öh:íÒpÄ“ýºn»¡‚¬EÍ:1ph¦õìÕuÙ‡™ÚZûо£ãȧí²E‡žD`jUxCœCüÅéMd3¡‰[<»)*¹2,£Å7µ¶²ÝzÑ»t]Qø±ó@É X¾Ñ#«ËöWp>aær%5(ìGøÝÞ cÙÙÕÙ÷3£ïiV ?Þ¿N¨F` £}„t¼Î>íláÌ¢šˆ úéÓ§0oø+`—Æå"oŒ¹ÞÆÝ cÊ«#‰DRÓ-olÙªçtÂÂWÕ%b¥‚åŸ÷*H3ƒåCÿtTõ7{•Ž€~jíSÝÞŽ!ÕÁIenW ‘ú¥ÄsàJ­©ÒÈ+dB_Ú¿B-ãRa'š$Õ¼¢]Ô]B¥Yâ¾§™^§ž"L_)f ¬C€º[¨~À9ÓÐËÆ!d3 ‰7 ¾ˆÍ ø¢^Ù ý/˜øÇšÆ™Çc3 ŒÓ‰µ KÐ Š_rF73¿”pÿ^„Pð/qB©Õ}<­¨ò"ìºLA̽2€Â,SÀ€Å§Á—¿>KÈ 1u2C,!¢t³SÛcËv‘é/{ÉT"Çø•>†@¢­ âΫÌÎØAI5šÙêè g=ÒDŸ²îÞ™T•XÒ’™[¼UÝTÔË·ÿq¦·3XÒ>X’¬ä¢Æðn¿FÚ Šè£=AŽ›lDúåF”[ˆ^7‘ñú­¾‹ ifókA¬Ðd"ýàШň6¤ˆ¶ëÚ­–5t»^w¯% Fµ;.B[š2€0sTji~CûYsö)Ë Qoq6Úq8 eH8«°ƒý¤ÙÆnœªZÐÄàVv˜XÅ)Lb_8Î]mi8âÚs±È=Y3"3“#³æ.HX‰YÝ@_Ïvr úþ¡8r§GLGÇaÀ=/&m×g+9Fž¶öÿpÛ™ƒ¦^Ú~±ËÅôÿSPQË)KïÔâšË·;B²Zãó=®—D`ú[NcÄ •F®sÉM!OÑ[©5 WQ9M›e·¨[5wWvŠÐpÒr‹Öó>ogtêùÇøÇÄëù×öVó Wö“q9Áû˜9zDÙP%æSsܦ wޱY•¹IÕa“šÓN{§ªvÇ­¼{>z‰K,dæåøó§OÚzóaT7ÝÊM‰´à µz”„ø1Ƭ¯Ð°$O€cô€CÄjÓdÎ8Ì'´‡¨ƒ»ôÜ´¶«ØÔsŠ+ì‰Î‚Š$) ¸TJr.“9•E§D°«3+»B®çìÖ·•°?ÈG„,f$Ë ’wâh¸+9‰Z{dÜ+¯¼DÞ‘$ê¡ÂžYÔ™æŠæíÒ´H:2W‚l~€Î¬Ëqwt À§pѹÈc£áHß<øí$Þ©Â"¥†1ÒÙûð¤½×A#W%—°Í æÙ¥¦ì*kï÷»=J¿ß«rÜÌÃ<ä\Qõ€obmpJYL'µJ" JºV(¡d²|½Ô~âÖ„±Üãb]/î—s‰þQÎd«¦ÃFÛõš6Û´üÚLÈ¥ìÖwÚkè|ÀÈõˆ™ç>#7Œ†Þ®Íܬa·›ºÝ5;ÌݨŠšL>-2Æj¯©×A ÿ}6ÁûÌ]w:­‘ÐÜ É(¬o¤¬%aT¼GfbQ܊ºúÕªÖ‚êޝŽÕáNÀ}©ÎÿB»ÿåH¨iªªdÐ ÐLäæa2Ö+škxÆ^.ê!Ñ÷Ë!µ Ä 4‰A}À­òŠÖûÒ¶!G¬\ĈNZ°|*°ƒ5\9šÎœ£&Áq‰ ªu÷#M¹°uœßàGøm@Ì´2Æb·¯ñ !Óè|= ÓË›>ÄóÂúŽŠÈhú*8†}&¤°UÅF×+b•’Ý/ù¤–˘ŠXºçUÕ_Ìná¤Ô±o”ØF燧WèN$­K3[c4‰“Òê.æ´:_ÉC„€yžÄ Q>Ð9áq>m„FÔ"F§aò§€dú0]Àe§ F´@Xf·±ÛTà˜Á'ívi37Hé}±ÿÌ'›|°jûï—¬ýNÌðfA%MA2ì=2A™¢W jûZDJ,¼¸ä*­Í.æ;}¤8‚1âM3zÎü$lgmS± H­Š¹ÝL[GäÒ‘€˜Ÿ¥1Õq–ÞÐp¯¾ÇãZ†•ƒ} 4×Â5A>HÍ9DÕ1𬯚S@'•X¯;àKÎRËáMýðºztþ…Pß9%ŸÛ ËÇihÛ¹H˜â͸—èæí7S0¢’4\$‚ê;°SZÂ1RÍ)ô/ÞT‚—%éâÛÜû,$yºj“èb§ø¼0 r½´øa!¢r]f4÷‘9]±E݇ݡjFú|¹QÃXdj7‚‘ Ll!}ç݆nH0ï1v;`æ±ÏÔu—›OÙüÇcrŸoÞÿ›ï7üöÛ•øæ§–­øÓêMŸ¬ÜðþÒÕß ëZÅ$ÐJJØÞ#ÙP `ÅÜü^Ê” r\Œìù<ˆ¤~Ei)! Hól×´G£~l~'ÍçÅl<^of–´%ï´¼4¨÷6µôö ê³[yžµƒ¨iÙ‘qTuáh8s”Yb7nt’Òbw‰vf¯åp¯:÷ÂÃbqWí×0{¯ý'\0a¸%h§“79µøq½7ØKÐëÚ»E-}[I±¿<¬ö“‚=”`5mÿƒ_ñ{qS!]Fne:.¢ÒjûL\·«˜¯8£üÝná?mØóÁò-¿]²î·ß­ýòõ.ßôéÊmZµã³UÛ>Y³íÓÕÛ~·då’“š˜ÏôlˆjŒ.ÉðhTãG†BbAÎ!6Ïýòžx!?}MŸÕŽÒFòݽc¹IÑ\Ïïr|^g$ÅϘ²”3"Ái­â´½ I©K-ë‰LÎãW³:në#ª·}€¤¯’S¦+GÍ)DÆÆÛ>è\C{{Ï‚ðd‡:ç^ÇiDÒàMS¿cc9-BÖ ‰ÉÅc‘÷¸µhFe/Aò}p=…OÛí¬sÈ cO·ËJ¹ɹ…}tXëׂ²BFnþá…m÷9I°ŽåF犙±¹“‚,hz5J·•r‰ SͨèM͆€mMln»OBÙ93>dZ^ ža±&ˆäÇÜ0}çÃæ^Gͼ~ÖütÝž—m~ÉÆ~ØøñO[>þiÓg+·|¾jûg«ù>YÅ÷Ñ*ÁÖîúdíþ7}²nçï–®üö ÜwRFž<¥ëïÈ‘Ù~OŸ-ÕÙ†¹–úŒSoÉ@zã½-\йGLõ·iÙoV4 N­¼x·CŸh%_|s"ÜOó6è¼.m#_¥`âÇ ô–’–v„8¢~ÒLô7úKØÊ;!ÖÑpVdžµò¸S\ÀµwµuÅ6/Sˆ4 4æ5Z¼qÌ;À(ïGs È ðZü:ÎE'lÇ~@õA;äÑqĨóRqÿâ¸dWÕ½b iÿ;¤¿Ö;cë™PZ·2§Æõf…It®Ûõr”Óˆ½ #‹jÀÑž†Kr¨Á\P¶¿\Ø»Oßeƒš5¿pùؽßÔã‰Ë:•~Üö»¯Vüñ‡Ÿ¬Üþɪí¯ÚñɾɯÿñjþO±‘ç;>ZµýóU»ß_½ù+¶ýþÛåK÷HþIØðnQ -÷Þ¸“cEMð‹n4tß©‘…rÄ”;A»=ú,D-´ÅƘAˆríµ—S6æ4Ÿø2xÔÀy£ŠÕ]öåÂîèåT”ªW§ÛâGJ¨÷+éHêÖ§Õ_¼Ûv)óÎn}a{_IO‡0i¦Ÿ;BÅ5HƒxÚÚÝ9èªß€c'%Õ·M=æŠsqíŒo¦áæ5Öëy€>îñ:îÚÝäM¦òÚøYm*Þg€à›êéCïTjnùu{Yˆ"¹B[F*Îòÿ°ò¯ù¥€W÷Ë ¹ÕÝ~iµÁÕ1ùP¿ ½H­Bq|±‹+*Abãò¥ÔÜ*y â»JÎŒ4:Lxk|z.‚ú®GÍ=w©[ÿyë,ÖüqËgk¶ºvÇÇkù>Z³ýãuŸ­ü| 0úÑ:þ?¬ÝñÑZ>XÍÏÖìølͶWlzÿÛõŸ®Ù´ú¬Þ§§L¼|ˆv;pIä²ÇGú=ÓgýãŒêzUËÝÖ[Ci»cf €#Ä¢È$(jè 1dîØÔ·yl'>ÀÖÈš¨x]$µÇâÓ— tÂõ‡àyf#ΆBxߪ€ž¯]ðÅ}¦Þ'í=Á· Qr ÔbE¨¹sÔ8ÇMXeU4 g–øxs1/Ó+ÿ:GhÁô$oÚœº«)õ ŸcsEô‹Ù9Þƒ{МÆÛXЈNžO£ð|âñã!Ðöº*±QõÑR³Sq ]£Îø­¢Ë¥Í•kÚ:½Á|­gÇ—˜ÄÜó¼^•QsNµXM_ÇI`D4ÌêÃSë®Üëv¾’¿VÖŒOËa¯*ÌŽüžÈ•n”ÐúãÁÿþvõÇ+¶|ºšïƒU|\ hò}²–ÿ£Õ;ˆÉ\µý/+>Y-ðǵüŸ¯ødÅæ÷ÚðÁÒÕ\±e…ˆ:Ÿ¡ÏJIãÍŠŵu”~,â2¼€BFPï),?lÊþFÊb«¢¹Ž5*Š;5\„ô\w“Ix/ý\2Œh–1â¯ØN2ÝZÔšŒõ²&X9.Üm…ý[Plˆ®Œá®%¥ÛÔNJeQSû!71¯SâeÉÚ¨º†¨;sÔƒ…­=Xœ¸ö.ø“³'†¦½Žª mWæyÌ4f¼¾ <9ļeFì ÿÂՃϊ $o‰hL|âØðØÕ‚îæ´°bÃÃo˜ÌS‹M/ä×q†8·€ûÏÇd5]'ôÇ5|®ÚŽ?[+ðùZþOV ~ºZ賟¶²týKÖ}¾ApéIÆ^ëí·iØù%Ü})(Z,g|ördðùsRñz>1ÒÙ÷ØãRÊr›¯DÍÔ±ŽÛ hÙïÄ,-&–ojLÖw…Ím,IDOòºì­ê¶h-=—ÛN‚SörþÂ#Òü™µ!©•YÌI©N.íˆNÉäÓq“²ñµ ƒ,¥¦s¨ºK¨ª{°ºcˆ°[JNQwoûL\r×>îÅ£—ïy²å\DNƒ&~¤Ópã¸Âó¬­ôÁàãðf˜1`tÖæü…"š‹I¹s3íxÿè˜BBÝ+Ãí=',ýOXûIÛs>Ù'&ÁVu>¿ä¬á¯wËl·Óóä`ìZØ­ÊŒFóØ<“è»>Éȓԣ‰",möî?Äã´v3æz‰XûmQ%Cæ>Û䌿dýGË7”Ÿ®ÚöéªíŸ¬†±äÿpÕ òcÀq-Ì$ß§«wüqíÖVmúŸ¯V~¶f×Zaí=ºnkÕÝ–J˜X†ÄUA@Cˆ¯@(DXÇ'€ÉñIˆ†Œ >Gj’c]p.,•4X.e¶Õƒ±\0tŒ^ʧ|ÍùrI”ø/|öF5ëÓ–¾WÐÇ“F‰¬Î»‘,RFtAÁT Jk Iª¬ízpÖÎs¿‰7úÈ$í‚å‚TØAꎘÚ$mãkàÖÐÔ­ ¹®=@ Ì ”³zx³¾Há¹ÅCî¹>ôæf"ybXSÞ¤ý<þ%/XaÚaƒ„&ý‰ô={e%Š;‚Ep|”um¯+f¸ü(©·RÂDËóâq ï_òK|uZg§gukw\µ7;\.4ŽÊe])̪ÉiaÚ$8¢E±ãÀ‚%Êdðø¯P·ÏÌs§ºõ'?"ÖÞò9l䪟®áÿÓz!ü ‡ÁÍçëèìøxåvXЖoúõË>]¹}ƒ°êC×:ŽKÎ Û¸4tvA M6$N\Jj¤ë$å_¢@NHE¸Ë(còͨ1P¹µ-rÎaß ü$m‚J7Já´™¤þ妓f†>”½Ô!)̵ÊÚ~—¯Üë.QìZ—œô¦¨ 4”U¦5_¸Ý\ÙÔ±CÃQÔÆó4+ 1¦6²è®¡z0™î!¢ÖÞ!W’ºý¥7ÆE7tÀ€rfô½`(C#’»žòH.fÍÌi㯀oÚfÏUCŸYXM®¯9ÿgMÕz†ÆžÍNµê×6ò«;ˆ³„-ƒ>Û-'ëªëqþýª¿Ù%µEÃãjF^Bi'¼y¯[efˆ~b CR*¢3k8iÈ´¿H’Ð v*‹‰ì&é¸Èª;—Õàu½h­‚åÏ?mÞ÷ñk?^µí«?Y#ôÑjVîø#q(E¬éÄ|~ôã–ÿùzõg«VœP8d䉑èËdLÙ_̼7D¤µ »rb|p Õ~"OÚÂÐöiµ#ú_´2#E„žê1&?<;—–¹–ŸœTܦÅ8€P*ŒÝú.´¡…®ë‚¨HHÇn—“M¨¼?=v”‘ÍZ/í¡;ñwÛ19o~{9•iÏÕ²iÞà´æ[…Í1©y‚ZN¢¶¾a² ?uÇ u×PçP%Gް»´º–’T›Î­äu¼À†Ã7O,2+D¸¹î¼Ÿûàlžãá í†rà ®æ}2ó£Á}òì1‹%—‘ŒŒ±ðâK«óùæç eBØ‘ËÈ|…—‰&Õ耞Ëi ά;hì¹NLùwK6|·rÐgkø>Y¹õÓuü\'ðé†]¯úÓª=¯ØþÛïVüî‡Õ«OÈÖuÙoò„ÉJimŸ«I(”Íb'Òz¶dd+­ßI+,Ü ûúdèIÈõÛ+¤­¿–±Ø¢ÇàÓ¶Þfà hÈÞ¥ÉÜަ¾»¦­óÈ\Œ¿Õw"åÇ”Š 9ÍX4–Ô:ÞjMpJýíú.]ˆ#æ^p+%í”9wÔBPã‘´÷3öâ N©dÌ×AÅmÄ^LÄ7ô%_d=ðgA“¶µ@ç´\ˆÓ¯ÃlÓyÍÅ–~º»—ÞOð­ìmªöRNa›T¬WJ+¸Åœ²õÿƒ€Ô'§ôÔƒŠºÃÒÉB»¸“˜#?³àŸT¬—IjûEuôCà˜$³H€C}íY¯Ë"pIéV®jïÔñ þñ¬þR1‹ öBÚlAcö6C2Öd·ðIþÂû.Y(ÞïÕcÇ䵩U= 9—¤—D…@0ReÕ-}–îèlÄP){5—0M—0àRÍ)ø„…KÌ­,‚Ë>´“ÍŽK¸üs}ó™§k7Á·ÇiØ¥½ $Ò§‘‹çZßrÑ_‡{ls$^çuZª:ûøÔìÉø@†ÿ?NhË8…˹D~{Zû¿„¤O˜¹f–ÔÄ k*«žu¹È,:×>¶t\!»>Û•šêþ£(³7*ïÖ´ÿõ_¾Ažò£•›n²NðƒÛÿ²jÇGß­úèû ßî<¶VZWÈØ•ÏÐc¹ŒÍwgt$>I¥eDÌ žâø(ÜDÒ0<÷<¿Eà’Äîc&‡±§¡gÃ÷ÊëY!$ ?=¥ü½¬Ù^5G’Š7Ĩˆ@“v@õ1E_|I¤VÑ$NZlçUÔ ß<³£Ã3›#SÊRJªŽ›8S¸ gÁXÂRjºp”Ù'ÍX…Ý}½°#sÚK\NÞ†˜ùí% ÊEš¥Ÿe#g[p§@Æ-ÕÌŸ?âÞ0\/sw>1î*bå{ÔÄõ,+èï§ N[ùÉ9F IòÛÅ@B;Ÿš—XØ¿ßíF©å¹<«sy˜ U½ÙøÚÜñäfe¯ Ó÷>ýû§k·}¶ŽYÉO×lÿðÇ (¼vçU«}6;´ÝþvTã[I½Sv×ïô@ѱ ÑBxB#£ƒ¤åwN&Ḥ Dè†ÄzcpN‰pj—uRLßïåŒ×ÉÙîÔp ·'N_/o¦î_ÐE¦•Q-¶ â’42gÕø%7^ÏmˆLÊ?‹8tJUœ™ ¸Tw –cúj8Ô7¶¡È®j=³>°V.ÆÑ`ÅÚ‡Ô#oØ´` üÏ@“^t›6êó˜v@G¸ .i;Ê%sà‰ó…”½ú®R¬àuжà§)»Åœ°òø€Ô—"ú˜šZÖüÀ?¹Ú/¹Ê&6Ï4&ßrYUóð¼hæÍÕ’.ϸŒß}ò×mû|߇˷}øÃúß~¿ö'aÕÃ6Ô˜KÅôŽ»]½SBF¬Qý¶$E@ !Á¼ÁVPÈÍ3éba\R <|A'ÁòN±âQb=oå—±pûF\w‹š=&…Kâkb艌‰í…¬‹yÑd®2)°.@l#ÔÌêðôJ¯¤ú;uýNQ÷˜xA9CÆ|6ަS°¦sÖñ³6^ç: ­pÑéÎ ¬’¼aÄ<ÆðåZÊm¯÷·@ ÉE}œ³”v4ç¹a°+:0‚§Ö‰çñY%B:n¢,În=6ò*ÊîÑrNA9¡ýé^©ë;îû'UsÒëìÎçEå9_/‹É©äUæá6ýð O\.èB3ÌûŸ|ûÁê-\¹ùÃ6 ´MÎd¹ßr–J¦17Sï?FÓQ‰£(•°k/&š@SBXÂvÏ­öº0.éÓ„}¿8etƒ8bxjàðäDçÀ€M@ø?N©!—¾Aº^üÐ7°])ià›X{¯ p¤;˜¸ÝLsy0kBèã’PU×qƒi˜yc¾Ž<  ¬àe°ªc°ˆ¥WLB&®ièC?ø¦r%”Á€ûÏÛ\7?(è,Ò§œ† Þ¿âþjÚ‹‹´»€&~Ÿ'»¹`LÆÅ%ž¼p`&Šjšö™:¶ ±ñÿóiM ç9÷ȵòæïóÉì1t+¯oE"=»‰qþŽùù|ë+2‰½ä^¬W¢rZ`"½öÂÝÆ[Uÿð·å¿]¾î“·üÓv>mÆCÏeF'MÝŠkšˆ@Ú‹¾r:ÍCËúMiÊM!i>ÇjQ¸œ±òÔ* tbU'BmWnýEDi‹ ¢uG!C—]šì5ÒÆ$¸¤ | Í%o€òozƒ{ReMK/ôŸNZúJ2”éEÜ%¸±MÂÖ7án!ôT;‰”*T‡^Á%´ÒY àx¢n´» Áã<è7ss“\8.ˆÓ>‹¶š¼¡ô¬7ÌS¢äŠð½(Ã;Ñ}ÿÑ;wTqeYa_‰é#‚”w‹>aåý_|’?ÉšçV4"O–ÝȎ˳8Ÿg_›^¹ .17(»ýÑ?Vóÿ×çßþa ßI3ƒ†>KeM•]Ãz£‡V’¬ÖóŸÿùû:¸¤|’}Ÿb* pFŒ81_‹íÔd"îÙªÎÞ(gŽ>:L.#²¯ Ÿ… L‹øgÖ†¦Ög5”ÖwîÕaŸ±8Ë ‘8!jŽ! ¿ÂªZ„áõ€hœ®Ó¦‚¾Øt®d~w7;HÃk‘&“OÜ™[þ™5ÄYîÜ`‹è½ÌÖxÉ»¸c5ŸÿP¹9|*kK $ª.‡,üØk-›{È9b"eøï>ûÅIÍ«· SÊûÐGázµÄ,&×ôbi,òtóª—á·¨g·?ùQàðgKÖñëZïµ \'c·Ó€Ù4ð¨Å¡Pe®…ì›Ç%M¢!ýAôj†ðèäpGßÀq#·Õ 6ú¬MÚv‚šWKÎeC‡é•úÁ\‹8sRj.td—6ð«"Á¨Àÿ7\iKŽ:‚qV€ž;§¹Ùt¨@ßšj‘áâ’šš—$˜›˜ kм˜žCÜ2Ò4(Ϻˆ/Ž\»K›m8s]0zÀa#)» UFØG¦^lŒzQÀÀEÞ! ŠüšLiV¨Škø?Nkÿ㈚çå„üÆÌ‡ÄØIÓè»F /dBM|J‘y®”3S2žl•PY#©~Ü<`…’ý ýì²ê±qÔ´x "ÚþçÄ[_Ç^Òg‡†#m5áfB¬æûfNág¶—Êf‡=®—Þÿ—7Űo#½!(¡,±¢'.ýÞu&&‘©’p‡£EÖq068rv>fþQÝP-€}„BŸן{©C,ˆK?ªŠ:¬3ôfé}àAÏÔ´¨…(˜œôú Äêò–û‘×öè»J35!¤á¨á¤…Æ ×PQs÷ ¸jæ0Ù…€œ¤æ®Å°‚³F<Üi¤Îu]y¯ñ4Hq»Ëçç­Ñž+ÞƒF”׸rýÈ—xn£#íðÆéôJ…»‚ön¹~ÈÌ\&K[K{û{T eCPµ< yoFð÷ɳ ¨ëz…Aèæ™Eå›\ȉɜêYUùñÅrW{á^›Óù;+ä;”4cû…ÓÁ6†)Dü|ùÊ_ü“¸|±/âlN ¼Ç‰ûAÚh‰¸®4;âFÉ*ãp«é溙ç-븃k*[ª{GCsULãAK3·Ø¤l¢§v\T Ñ™K¥/¹¸¤ùlóüŠ·â<DxÃ[˜@˜CÞDý<ñ>ý+•Ž‹¯ns†f‹ò‘ë.Ó;îyA?—]Â…y6øl‡:㤭?”A÷º[¡G*DŒöÅ µ½†žM}ƒ(üFd×[ÆŸÏŠL{E±hv¿+½æb~—ëù;?ÈvD¥ª¹cž³ñz}3¸$jŒp)) Ëúˆˆ½ÏßOª*º‡½Dßñâq‰˜P]Õþ謃ÿASO%6Â’B‹™–s°š 猉ëµÌ\ —Ä^£Ii¼ÐÖ—s–÷ÜÑjA >¸A:/bV湸vŽË?çÆï ~4Þ€ƒäâ›û„7˜ƒÃÀ]²çr7Ÿ>CH²'ÛÔ˜¦%Îô?mã \BfL‚ºZÖÎR]×c˜ƒðÌZ«sŦ±9Àåüe9ª ­&æ^»ÿµ¢o$t–‰ë€Çû‚ƒ±@nnñ}C¸$$Þñ8'Æ<.§~vXIÝçÁ%ÕB—a/1*%0±¦¦ó©Ã÷¨¥Šc0IMá2ˆ§²ó(]j,a¤#—’šzÐ¥á¹ì%ý+x„3ÓsÙ\x¬øÜ}N³ ó; 4†h‹ͽX "é÷à£éŽ×¡¿×d.˜y½ÿð>‰QŸOði0Ka[LêB–Ú(X …p“ŠMEs/$€KØK³ 9ç2[Ä%:'#o·„%Uý]Xã‰#¹èT"ý ZÍ7ƒK2ÌG¯—èc×î–}|XEÃï2Dmh•,j´èÂë8ˆ›\WÓõJvÇ­|ÕQ'Å —-Ä=Ρ§œ3 J{IÄCºÅ) ¢—¸äu˦¡“{Ö°°.F¦•·B8ó¤/¸Žs1Dÿ-J·;.òÓKZéeC'Œæƒ{.>|¾óqk‚K[?+‹0uÞ˜d\ÑÒ“Ý•UgS¸H\‚Ûu§s«â¯g´Äí½é|öÿF\c24 EyòHÌ«øà€’–ÿÕkE}hEÃüâì%pTu<Æ:~Ô£$È NpIÕÇ .]î•× )%Û¨zËKu Þšø¬+,nº^²È0™×É› ÄŘîjN?k»H“I'¡¸<½™¦¯àûrëìߨ¯—0¦o(H01µÃÿ 3𔯔}ÆÀmÕbT4÷Äd7!Uns¾ØââóÙ­ ÚK”‹#î´†%Výõ”Ž¢+‡[£^ü2½à;ߌ½$9T°E0O›d¼y§àÓÊÚ×®ôB©šò/‰æå‚qŠÁiåu]ÏdýOš{ªºq´N§¸ÀjNÐ2;e蔘 ‚FBÜ O •>–Îôp×>\fn;Ü´9ý„K,_ þ<Ñ\óI÷Þ˜qŸgÀáLs¾Yq‰inCÄÅÛ¡é$láv)L :Âv{2˳¯5•M}QwÛ.ä4˜Ç:^*ŽÌÁÌ”…HÜ)õîv$çýㄦ”m)ª,Ï-Kã’k„f…ý"ò8SäÅ'úŸ9¿s9x®ÑÏžÓÎî¬~3ýe±:÷4kü\>xp?õNÞUG1»<õ¼üÊÛ:C’KÃ’®äŤ Ù<‹ 7s„¢9U7¯¹QÔ«éuy­´ÁN=ÆRq#Ëðkφ1 pxrŒør)@ðõQùzqá‘Ù®@&oŒsÆl*”LJZ{û8ü( \:nÖ°Ò`^-¿V—Т=E鮓È=¹îbnGfiù=7pqI5…(±üµÜÂ[Ú;ÈxÌk&üË):0"Sóãr®D47:Æ“E¶œs?‹×ëçýôùí7×ÚÍ¿ŽÏŸ`ç†ä³Ú]úïôÚ…^Ôfˆ9„JØbe\b6™¾«ëÅ+M=œ”а”&×›ÅÑEyu¢Ï¬ÜÙ°´ª[eâÌðõŠ–‚úN[U™«Ï•5µíiÒô89Då±ÿ¸DÊŠÊ y¶‰ 0t‡ØßK™è:¢êŠ©ëeŒ/äw¡ g”°å|¸|á¸Ô†$×§Ö5´7vQ›Kv€‚ƒaE)÷P€äÖ!çÇå´lßÌ«ÈÅ%–ÅÅŸÓ)ÆþÄ-¬gf›lŸë¡¯÷Z°X\ÎÒÍK ö÷)±9X²E™!bp+Áp1OÙJØùnS³¿˜}/¹¼ RPœÔߤ jM›C7‹gZ¤nUÞ?néƒ ‹Û!÷§ë¼FÆl‡ªMÏÃ'ôh˜,ª«çõ¯·ŽÃZPíH\¡“fÂP–œsßH +Ê-{uÝ0*eõYCô÷\¸ÓJ´hq.—1ðDÓ›|j«Û{ÎÚz`0*ô:NoPù—°òHº“æÅ$z9e~ÿgˆ×¿œ'Côsq‰ð…WàŠ6~\MùŒ7÷ŠÍÓõÆuñdfÉ€Þ󂸬ii=eéwÆÒ°E¿DòÒÖ vq{?-vNEý…{­¡)µ˜[šB2'h^7 ¹˜ÔºG{TÍ A% ï‰ÑBZŽßJ™ˆÛúÖ¶w!-!Nzôk?^—iõ-¢ƒœ% #FÞKE56CÎ@Ûa·Æ£8ñë:¬‘6òº^ŸÛAÇw 4éR³|017$³ÙãZuM[Ÿ¾o¨#é!^\âGq+¯ ‰ÙT½@è3…±ùãq—xÏ<þ½#ß‹4™Xñii+޼#®òùüþè<äs® Çž¹*ܽ-hqIꨯ'³ ‚x"–~bŒFˆ(3HÂõñÐÓ6Þû ÝJêÛƒ¿K­ÉÄɯ ʬ‹I‡ÈÛ|™fª²ýfQ÷ßWlÞ*§wÄ<#ÅС°KËa©˜á~#ç·c”gGŸÆÅŸLÞ5.i?mj{±òLq@NGJŠÉ˜'9ˆùü²߉o×uвØ©=Zº; VIÙEg\Êï¤D© æÓçÓ 9·›¼o6Ö÷z\º)cç7—’6¾®Q—;:º š…©¤d6 õX .é‘9sùs4~.i1#^ÃÆë§òr‘xO:¯Œ»eÿ’ w|д <.q*¦™tFt«s ;ô¥0 ›ăÏ@ ÞÖOØ!줕§¨}@U{¿çÍò°TØËêèÔ‚KÌ£˜—´»ETÉSÊ~ûÇ¿üfÙšõ":­üö;ð`°ÇjY›e"Úço÷ôsyzÈmRzÊôÊN5ìâ¿ùâYp‰ dðÑAXñTcqHüMFrP“$Ǻú¢’³0åo™˜Öj9+gJiƒˆÀ@¢ˆÈ·ê9BÌMË÷ò¥ÂnLÏ%Ëp_Î6[ÂéˆJo Î. M¬Ë﹑uOÒÞ›Ž{4Œ“\Ã9DÞÞ_Õɯ©±áø@Goû‹FÝùë=ô’GÓÔg }¸Øš_¨cš¥ 0/4y=¤y¹j¼Æƒ»Õ¬NÅ´_JðÄvôN¸ó©(•‡WpÙÞÕá}KÐØYÂÚ[”*f‹Ú#¦aû¶8nìay¯¹ÏÿV9Å^˜jð'È{u'f…ÁK3Ø1{éRa—ßõ¼?|ýÓ¾øáý¯W}»G CAYúîÒÇ,F—ªÌoEtOZ»^O«oï%òªÕQD'“&ž“†I"¼1(?OocyÒNDvpd|xd%­éãã¹åM§¬Ýw¨Z¯0Z-o½AÅoäµC‡–|¹ÁóØ¢b Šp mäÕç™êLt„³ãt¤Ô„Ý©J®No¾]V-Mp8¾ØHv]Ù1DÄ„Y\Yõî’['<7:¯>¿L5®"mÞæ Éé_ÍÏ.ãZ>¼mšõåÍÒÏiâÅL¯€û îûÅà’Ûôû+zϸ!¹ŸK“躨q­xRßÔ¤Èô9lá}ÆÊ%}ä/j 9p¿S¶{ #ne^-n N®¦§êÒŽÖ¬îï¯ð<®°×*:s“”Îǘx²lþúé+w¬8©xÄÌõŒCˆ ¡ëfMÖjËeRÆëÙûôÜ£ÓîQ¡ÂtxøoüùÈ å€.^Ÿ_td9èah¡êM¤‘é©­#¹UuÚÞçþvLc…œõvÌ'Õ‡tÜ ­,-»=D¦uÚ°¢Ë*¨as¯’ž±¦¥ æò2iQZJ).N•JcaC‡ºS¨Áš®ÄL¢öƒ æSÕ9LÔÔ1èJ""ÒvFñ/qað˜_õxÂæ’Ráu™'¢)ÆÜOç…oüK5ÙÌ7‹—»“ùщ»n¦®÷ЇA±QɇRè$?ä•Vеµ ¦F&ˆ0ý0û”ƒŸ´MÈn3Çô‚ªàÌbÒD‰R/T'Ä%°WÐ%ãͧÍÜgâò×­?\ºæ“¥kûÍÊÿY²öË'ùH+¬ë!c·ý&nû¬|Ök;üý¤Æn]÷«wʇ¦%“£@Ø%†nî°hú:Ž·‚4Læ¡!= “ l7õö±ãS~·\&n§:a&)&z ¾yê=YP ©Ê{£*§ªË.øœ<Ãm=d5±AØMÖÞWÓ% §v¢<7ybÀùõ*¸û™ß¼;祙ñ¢Š·ôB—ÚysFÜ#¤Ÿà³i/i+>í r/ÊL’êVsøÝݘºÞÓŸpØÈ n¥ÃWÜ.DØÞ]‘'>2VÁGm\‹ëÓË0‹ëø‚¸¤FUPƒ—cÉkC•x›†ý^SOŒÙûñ°ìûË6¾ÿͪ?ý´åƒ%˜h¶ñýŸvüyÛ¾¯wÿ~¿ÈêSʮޠÉ\.nnì[ÒÜB˜ºÐÏBî}n6ñ,¸¤£|ø˜ðþtdôò݊횬ïD5·kÚìÖa ©‘.üÎ{ Ý„4Ù‚ZÎ|®;0a÷¥’5ɽUÅšw©"ÒE¾Ï ß™“™Z’Ù’Zp« ãBÚmqKwˆfÀ† Ê^‚óÆà“¸µkIEmoO;ÝßC?æŠ3xcØù;\iHÍ#.0-|™µ“6Þ´ÉäZñ¹–rÚ‹Á%—»>m?t’ûY”‹ áÅ.à945–¯°µÿif ”­·#T¼`Û Óö~'¼tücòë¦Bõ^ãì9Ë—,0z5®BÁé5‚:ÌÚl>ö#÷Þü*Þzð·_­üã² Ÿ®ØòÁO›?þ^à“ï·}úãÚß,]þázŸ$ԡǾ^™ý“Œ…ëÅ›O‡ž‘1{/ãõé®ѱ&¬ â•’¯LÉ®ÃDŸ2­¤RÜÆõ¯‡å7*ÙbH*$‡06K£î …´°A"l†“b¤3sÚ„]Ì.ÇØŠõ æêÞqq¹ÑXÇ_u¨I¦ýÕ’•oŽN-JÇP•¢óiu÷ª›DL‘]÷ÇÈbÂÛ}º¬ÎZî"Vn!®à†0†Ò¡4µÏi2ñ ¹l‰ihà" ¯ÏÕÁ=Ó\qQÎk#¹{¦qÉ;r`fTΕ'žÀ%¯?ÀE'­ÁNãÎ6¥AªrhÝY÷Š…M¤ìCN;IÙúœ±Y=ˆ mwÔrŒË*¾VÐŽ9tèོí¹/Q׎ä{»ÕéZá:%+>m¨è;í6D¬ÃÚiâvÔÆg£¤ögëwýnÙú÷WløpõÆVnúãOÛ?_¹ë“ïwüö›Ÿþ°bÓFMLFûFŠOÃ),ñÎãÁa’ó¡ªêÔˆ¶É"BÍ£@˜M¤¸‡‘Ê Ê‹£°”u½ýº>œÒ+äÌvh9¼:…lºÀ HŒ¢ÂÌ@èþ Û"ô‰L'3Þ^ùþÓ@I#`¯Î®M¯ˆÈlŠH,Ë«i×r 1ò Qv ‚[©åÉ` Wuv˜"+XÏ%¨¦¾±3!I$m5{†† /8§bíñF'4¦ejh0M[pg5xse¹;œß^bŸsIN;$zrÔLXÓäS˜FÛS4Aq§öuvw;E]Ä8 ;Û‚ Ü6ûÀÓ6¡"6Û´YÍm=‘·Û8éóª]ró4(ëb¯ŽÉÄ<ŠvÃ[›T­ ¤ÅxQC¾$”ö÷›y ¹IRë¯÷üá»ÕX²æ“[>ß•Û0uïÃåë~»díç›­“4ܤÉZ¦h-ÃòÏ.©"âêTÖwb#ia€IbÌ•Bqs´ûáãËY«e´¾“3Ú®ÎT³ÒµY…ð8©'ôÁP=TÉíøÕìbî¶a–5³hN &}kbÎ5‘tƒÔ]V ’j7 ï%iyDº…GŸe†h²ýÑâctN=hLQK÷·s©“xú4§æÑ£óÛK\Z /b…Ùu]iûÄ5s¹­sÑ&¸Q>eZ[ã4l-rNÏL½z ä5·Ð kÐÄ}–[^­Ìô•gJ‘ñäk‚‰°Ùî1tÑqçTv=L¬ Í$êÀs£ôE¡Ú  Ã+˜R}¹¨OÔ6pƒ’å.Lr¢ÅË…´0äÃtÜøõ\Xø4sߥeùÝ!‘ß.ßôûeë±²ÿù§-Âv®æÿã²u¿ùjÅ_¶Ú(k´E×e¥´•ŽkLKOïÈÑË!ë6Àù´j‡‰¾ÐÄýÇsr·ë:üåŒö6U»½ä&` ê;£Þ½(\bœ*¶Ð$C-õøH5ÒÈéjA|~Ç4{9}§NAFÓ«9—јRãŸXz§¸RÚÒõzÎ]5v€"Ó(,üc ¼‚UX!’¶Æ!±]mÜhxp®8wíãrrgÍiÓË"o ‚™—Þ;ë*LއУ§ý9wW°¼S÷æ žðú¬Ê‰Ø-"üÂdÂpB)Šî°„ q 7Ç`q°Úì‚DÀ$·$ií·C›•p§ðB~GD2N5±—óã’h=“¹äµ0.ˆÀyØ¡b³Y•X+—dƒ‚k§ë„Øcf•è9ï7õ.7ô%ö8ï¨'-¶€&9—=F-¼YxðkÙ®:®øÁòm¿]²æ7KW~¸jËÇëÿû‡Í¿_¶òkþý?J­VeÑgeå’•||s¥0ñx´¡íþ{dÖh»îÔ°Ý¥ÏÔ'ûÝ¥‰‰¥Î‹Àåt›*@9Õ¦n¦øüî˜ì©ëÓÆèò⽘·…pQ$ú«‹M+‰OË9¡oŸWUeîñKEv [ô ¿HY1Sgë óÝÄÅ$4æЉL^çrf²hÀ{h«9ÓXâE,ÐtÜ3kÐÇÍI½{Å;œLî!Íl©£g†wKâd0ãÒîœ1vRvæH;3ØKЦîwÆ6ó=ã’jz|“¢“K#2[%²‹I²ˆÄA½Q6 ï½NÁŒ6–/Çh—N%†âA Óñvë9#öÒuÞ_8ï1vÝcæsØÒw³œáW»NýnÉÆß~µæ“e¶þþÇõ}¹òËm'>8­ÉðF‚ªï‘4åÄØãgƒßKè¯SacHên÷ÎüzŒläsñªù/bM'Â.¼s®ãmæZ9“ÀÄŠ¸»mSåØÅLÌC™Î[!2ð˜'Œl2ˆ°XtbIzq­‚½§gÌ•[·óe­!Z¤î—šqÖ£Éô1wͼ—"&ש2–ò9U7hÓEG?ÓŽ™r4Ê9zN@€`9Z´F67…>3~âµyaÍNÑcYf5´¼¯Ï,±Ò;¡þr8DÑ›ªð€‘ÚUÛÐ,cë®d èt–tÚ ,_I‡ˆ3 {ÎAcÇ”¢ê¨œ¦ÀäÆ ÙUœ”—ê¤s÷NÔ‘¹>$CÔx¹¨WHÓ¬1ÚRRóBɪn—®« * ïÈO¦ƒÂ ‹FMcCÛc·6æé¸4Qç_OÄu'æ2·ÜÓÔÒi69ÜH õt‘â¾>@ ˜F]O±ñÖrâÈ9ø‹2OátÙú 3„™>M}õÜýîÕ¶c’npzSXFeØBÃd)°’ì&ÌDü½ÿÄòµ²¦;¦£‚NÑp·Ùjݧ¼;}§}¦û-|Xy )˜-Ý/úÑ×+ýõª¯Äôž<ƒü6¹ç'"¸Äô縔%âúpŠi`qq)¤ÿsqI{H@Ëa—6‹_½IÃæ¨‰XèäKÒÚ/r™ vî¥W…&—Õ7ž1dùÄ&×ÖwÈ2¼äeìý¯§¥éy]´s³p¿œ™‹ d®PwWFþÕ_}V)^ Ì¶Ó‰Éiù&ÞwÒÅú¹¢xúunQtA\ÒýFÓ ‰t8~0•ă!وήžÖü’y†§<ÓWÕ%\–xŠé§`xÂ6à ÃKÄ2h«ªYnUóÕ¢VNZY8töˆt[ł÷K ç‹ÆÄÒ¼6MÏØ-ÊÖ˜HûªµZTê›m¤Ç;aâè-æ!#¯Ã6~‡õVˆh#>D œT)'ÞClŽtô…næ-“ÐÙAÌäK\^ØÅϲ—S£¥`wñ‡¤ŒÎÞ¡‹6431çî´ lB &EÔ ‹“ó¹8iu·ŠoåׄÄ_5óÈ/¯¼˜” Š«²m€MÄùøÄ´³vÞHÑÉÛy4vt¡™îX,®ÉœøVg:tà.¦Üå{Zj“‹E."g]é¿¢Ãçùq¹˜á,4dg­dBÆM„ MÔ¼Aàï`‡]³òTqö—g‡žež¶ó•!…Ç0)¦û~#/U×€º¶G˜Ö˜V™† Q{DFù‚¸¤«ÇZs·eŸ®#†LË .3gƒï5rF³E×a—¡Û*i3»ÈkÈZÒÒð/iîñâÚ† Š&[4”¥¤¡ù‚ºöbYç®ï<«<ñ3f~$r­»©üaoè;­Q0Õñ»_ØÍIÇ â8†' Lô^£’k’ʽn•VTK`ù>ßÔÒfzYÄÜ㬃_Òí»Ö~ÑÒvÞ§Í]‚ãЄFåØILÊíµŸDC“K}à.31ÇñKÞ?¡ÿŠžb6OO?ژ˿äî–Ë+æ™,)9d%["WŸm(h:bË5 *Ä'äÁ ñMQyѲ݉ÈÝ€Ì÷&—³s©n5²˜¼7†ÞZÐçŸ>³÷[¯bMû”¼Vsæg¼t@é|Ð ¿ðG‰aÔc#›€ »½ ùy û …0“‘ >¹ ž4˜Õ€s’Xq3§4üFêQæ²êÊÚZ]Ï(1 /u¿œ¢J ¶/º¨$Ì=² ˆâÁ“cþi)¼¸Á÷ç¶&ò®ÎóXÄiQýN`ˆN--˜çêÌ“¢5k±žP¦Ì<´^ÈJ^]_¯bç-çè§ìÂÑu •`@]ƒƒœå)»@»À}Æž Îùòæûn·`)+"3šƒRñ¨Š¤XÀÓšËx[rIM¢Œúëù½R̰µ*–;Àã¦-ç\K Abh"úÑsÂ63!©¤‡hÉr«ŠÝ:e§âÆVØGÚayo„(öC(ƒ˜L›ð¸e’h#\!!$ñ±ˆ#¼"ÞÀ´ VÒÉÛ¦6< ™UâžîÆÇƒd“ ĨlkÍY#ç«ù±¹ø’èŒ&â0SâƒsG‚µÁÙ(¬WE§Us®çÞ.®Q·uÇLÖúÖæÙ2–nÇÍÝüÎ_KÏ“µ÷³ö3p ª¨­èéBœL”„úFFñͦÊws­ª´ 0Ñ:óÈÓ0D¯þ´íÄüímì€}Ç=úH±!sƒ”Õ.=gò~2[×y»ž Ÿ¾ûnô —˜¹kÈ\¯j!bp­x=hXÄ©²ä|JZS’è(O­Š†q½‘w3»8évÞ>-«óIwÚÛZÝ/\cÉYy^I»ãyUÊÆGÄÜržx˜¤¯#~ºÜG2=9+Fñ"ƒÇîçõ)é5wZ¨ÎµšHdÎ5GbÚú‹çO[ò¢&CŠv[á*Š%IšÝW2óDÌ\ ¯L:›Cd˜¢öèÇ µó?m¸ÛÀÕå||^m«oòKžå\lÃ)l$A$º«kÐnpµ°Ë44iµ¤Ñ.×íZ 4fðû €® ËçìÎt™HR‚È|kýð ýrÛIÆÚÂ7}¹mÕw ùy×odô,#¢ÐŸÃ=WïßQðÚÈ?d·(oѰç7t·ÈÛƒ4œ ]÷iö†6!m—Ý:n{uñ/ a¤¬õø `DuB;0¯vWÛ•_Ûq£œ©obÅùÜv”¶âßyâqnT€¢U/*¥2üúì²6ç #çü²ÒòÆkßa+w wNEu¡+é¨:aèy# ¬¬«Tå¼óñ“Ç£duxå1—¼a ¡WŽb@¹u™ë;^c ˆü¬iÒÓd6æ Æñ«™¢Yô̓_Á‘~x¨=…eU'Œ˜òŽ˜&C¤Pª• ¹t"ù"nésÐÊÿ ™kcgxjSHæÂ=Á%Õén®8ŸÝr¥°C·©YíÕaîÒèE&ßZö{Œœ„ ÉÊnà"¤Åæ×fóë 3èÊoà*¨ë¶KÇw„„^Ýöé¹îÓ±åÓs["¦F1ðÞ¸ <72â…(c)›×õ ùA\[@›!€j¤¡€%¨g/¤Ïœ¶ "ë®ÏÜmˆ»Á§i³Yñ£¼Ý·¢&_ |qR÷«3úË%,×HÛ¢ƒs¯k—¶?(›zΛ”­\bâ‹{ñÍQ< ¼©YG]ó*Óë# ѽ& c J"oݹ[X-fãjt®£µ»¸¼ZÆÁë´¹‡SDüÝ’j5Vˆ¬—˜¥[ÊÝR”=º»[IÄÚÛƒù%Ó€8ÿšNŸ©=ýøCžàWüv‘MôÞhSÇkç‰{¸õiåGÜ0$KŠ2BwQe–£¯¬¯ H€®Áઞu@5<q14šÙìÕeÆÝ+¼QØ„ÓH¢œyðké !)U4.cïuØÇÞY­d†Î20n÷è¹ïÐ"k÷5;Ô¿<­ý彯„õ¿8­õ£ŒéF5›­š¶B–òWa³SdÈW6Au·£zN+ÔXÊ L½ò%.)n&é¹¥ÚwFÓŠ«þ̧ôÍi³¯Ï˜yÚä‹3&_ ›|%lðê¦ÿål_ ~y¤·JJ_Øœiœ˜u.«À'>YÏ?b¯1ó;ýo%,Ö«Ø hZìÔ±ÃYP‹D%hÅõFá‘Y(HV‡¥ÖG$W…ܺ›˜[u-e¿Ž#çJBcgû­Û…²ž‹¸‘y=í¶´µËY†·ŒÇÝâ²*0ïéëï˜j±àÅùí%—¼6–êwzùàýÕü(çþO¸¢¬\39. 9÷.eä‹›¹ŠÙxËZºæ–× éîê@q¯êДw[Xz†¨Ñ]E¤} úZc½ŽYz,ÓýIV_ÕçZbAod6Ia§Vq{šfÃ%ƒ(’¡ZÕ„§U…%•DÜÊI.¼‘•+bÄ2ðàTÖà>ì² ¿tÔÐYÛɯ²¦Ñ'暸µ‡¤µ—*+(¯¤â>.w$¿áÑà“¡‘B¼¸™!þY¥w5mçÜÄЂYt²tN yP§q|òñÐãgCÏ(›œ9EÍÜ”Ð,ê†(|#Ü –d¶õc² گǎNÏEï^Xb1šBÐÄ–’óvó\RNÿù̦ ÔÊËžW‹–K,—3ݪe™WÕ48Õ°Ís¿¼JKåYm¦afÖç<µ¯£³˜ë„‹Cî—g—bbŽ$Ó÷;1ýÒ¦¡é¥ï5¡aç‹îõ!vquOt —p49©•ó¯—$åU_HH9¬gÇæ\,­ª¯­­³ Ž;fânæÍÉ­¬ ˆ½*næuÆÌO‰éw»¸]/½hž$…ä¾'OŸŽ‘Åwc2¹s¥æI¡óFåXëá†RË"uw‰4ÜÚ£ 1 <|PY_oå}ÒÔ]ɉ£áŠÉìÁ˜Ô¡â"Í F¦ŒE‚]o‹°ø²–¶ÐÔ2„/aHž§‡žTw(á\n=Å[@³?ªq•Ñ·.çu3ôùBÒp·®}coß´P¿Æ\»÷Þ¬÷ó4÷f1h™y-Þ.)‡ƒ¾ãioŠpdÛzúšº}/f ã_ÔƒBb ,ÄÅ&\Xó 3+¢“‹Ãoæ&—çU7¹»¾WÇÎåü­ÎÖºŠÊJ]¯ˆcFŽ6çËkë=b®@÷BR¶)¥¨QöõuÈk¢Ý‚ÛÞðÚçqÖ3Îk/ñË1BŸ?Λ…ùâ¼áäÁa£Vð‘Ñ‘á§UuÆž§Ñ#ꪆIÃ.ÁÚè¬w•g‡`Š$+PÌÚ‘§”ac_Tz 8ÿaYM!©X¸I 9.§…A”Jz­*Ïßkf]¸»ZÖ|¢IaM %ž?  ýp)¶E¾sÚUx‹¸¤ûc¦¢ ô¤“ìHßãÇËNi.‘±r¿U‚ñ—Dc„ºƒiîô<ôi*£IØìÑiåp4C üJ‹Ëª™!1{t®çoÖ655µµ™x0`ÛøG—U×s®Ü·r?ktƘ“œÕÒ†®,$£1b…LWAʆöáyî~ÖÛ°g$•hÎo=}®„%ý:­÷Bnhò™#L’`|$¯¬æ¬•ëYk äÏ]µÝȸ-¸•H§c*¸,§¬=zˆY5 Fl B žFS͉OIå#q†_±—Ó ÒÍCœËº˜œºs÷Ú´ÙŸ½ZX 1h’0Å€^Ò_û|jµùY'äg½ù-ârÊL‰4`Ž@0cÓ©ñ[A×’??ªtPÏíjùReÈe'’2–óãg9*½’ÔvS«cóÂ’ 9·îeç—Zz…3qòŽ»VÝTWVÛhåyÌÀÍ2àbq]]äÍ4KOIŒú2uv ­lh&ƒx_˜=oVå_^.È4ÎǬ :]ɤ©CÔÔâZR^úس§O.&gKX{É0Ut]0͈ÒPvæ¨8s䨍ë 7tÔ*ðŒ1;£¬é|nG ¡±UF¦WG¤U"|!¥5Ú$aþ2îá²]_©.ÄÕ²mï«9ª¤ìsMÿ¤FLŽŒ e¡·üx[¸äõ¨ ¦ŸÈuÝ£Éñöîþýºö_œRg\º}¹¨#<¥’')Í7—\•&^Ohê<â=Yp•"SKÓóó.$—©°÷é;úŸ‹méé)¯­u½|X‡aèÉ©hl‰O½-mé,Ãð?iá«Äð/«©§  öQ?5'º§·à>x+ƒCÙ†Ðyb|„++:s•çµ¯ÓžÓ 7lßÌSËá­jâÈô÷v?:1DZ¯è4Iií}Ïó(çÊ2Ô¨ŠŽ&e&•]#1kK…aËÀ3 ÿ¾Gõ ÛKÚ“ëÑùƨpß©|ÜKÃ9•¡¤‹8Õ©hU…CYŽÉ=/6ö^kXnëzTIÄTïVÕöDêXˆ~:%0ðÏIT/ Ño—¼‡IꦛãfÒëÒ­ï$õ¶«Ú&—Åç¶q’ážS«ùÜmP40,£*4£vpa“+£’JÓ CnÞ»WRféî{ÀÀÝ!(ª²¾±©µÃ#6á”™‹¼­[NQYvY[„‚•‹<Óã°>Óïrj-áúzÛA_ìFí¤³§‹;¨9Êïy†% Ä[^PÎãã7j®àu%¹IŸY­ã«EHëÃÁ'ã¨lúŒ$ÁÀ“§ã2 vºñiÙ+°(‰~ôiÉtŽ-'_¬àÇìC„~Ç Ý„Í]Š[º®çÕ§”…e6†¤¢´]ý"^œZÊy3D\c øâ´#+B,%Õ,iÈc>+E U܃‘öí¸:ó ôÝá’$C©¡cäž+¨m\!c²AÉæ,“s¥´wvD †ÇÌS瀜ßÈLಆƒN¨Ôƈ%–F¥E&žK+Mͯ°öâÖw¶ ˆ-©¬lhi ½žrÚÔIÒÆ=êȇõ®Q×Ĭ½Å­}ÄÌÜu»Á?§‰¶FŠÆ[– ’9áVNó‹f)ü¢7æ µ].W+îŸ0õ^§d±Y2¬§ÑG}ì'rA0½Á7¼C\>494IÚ\‘š%“$ ‚â–Ké¡h½¼¸Ð— ºÈP•^æ@i½V®&ôj‘ŠS8½26·ÓîbÉY$ Ï4Iï,¯DVTFTb¬æ½²ú‹)Ù§˜'-¼Ý£®6µ´T57ù]M"µúÜí†0Ì=wOÌñæYïÛ >ir>ò¾éJ^‰ÆAI¤¤žP˜S\Ÿ•«hïqÒŒmàšYPÜÔÖ‘–[fè}H‡‰àýJfIEMÝ•ôÛÚg, Ná%ië)fá­Å ¿œš_×ÔÖÒÙAõXvöuµa%†Ãž’a˜i…ªf/~Ku}‘æ`Z•ú··½Ñ‰°»ºñNâPèɜdõI­ú=žm<ÎØûµòÛ¯ç(ÇJ-i¾SÛtãH€~‰•Ñ9-DÚêE{þ\iàiÆ2’­š^u!§96¯â?[Ô@™.¶hY4ñÁE…ž1èïúñîp $‰à`ŽR‰$4¥X!«eÌvê;ñƒmÅ55Û¨{-Ð>G2”Ô¿LúQ@¯ÆÚ ÒFln«_j…†o²”kºŒ×Eÿ,yï°—ò¾™g½3d¼3¼Ó”½’5}nz^¾s.¥ø\FynqsÌõdQsçcF.fÞ!7rî¶uuä—”øž¿zÀˆ}ДmèÃIÌ*¬ªnN½Sàzþª¬ƒ×)g _qK71+W†Ž{˜gÔÕËI·ëjâÈ:M¦Ÿ÷õÃF¢œC>T¤ƒWß“¬äpS© H=QNk_}SKÒ‚€K‰>ág,=ܦéÈgàrÄÜC–Íg&/Ì$Önt0§d@¼ÓŸÈ\袋8ø¶ôØ®fïyµ¦­çÒí†$„5õÁi•á·1ôˆŒ9Œ |žù(­4„Œõ!©ÕÈ Ïv!³ñjqŸ¨Mà9“회ÝpqÚªmǯÅ"Ó¡0cñ_`0ß-.)¶ÚýAÓݥǂ1?6Œ\4ÁÎgmP¶1P`¬´µm•œÉCA4ÅAoI˸ܮËZ+kr–WÔs»™(6!ñ‘ZuþvCÔVF|ñY×RnérÞé ¾irÞ©Jþ·e¼²±ˆc“Ã"ä—-ç—sÖ'[Å;é¬k¢¦_BЭü”ò‹©¥yeµq) FÑs’²ðt /(ÅQ´Ý+©t‹‰SdùÕaI™º9Ç_IÎÎ+¯¨¨i¾‘t'øÂ-»€sê.Ðúñ†Ð°©ç #×c†ÎGõÙ‡uY‡tް›8Ÿ¶p;eîzÒÔù˜©ë}Ö~=Ö>]6Œ"Úž˜:ŠØz(³ƒô<¢mÃn:]H÷º˜æs)Í24NÁ9䌹¸U Œ"&Ý’;h¦;cãƒÅä¤mÀKŸÎâæî¾—³Ë;ž\ÍkõM¨Êhä ²¶ˆp=]G>mÖÚ³Fz×®”öGã¼g4œ¿Ýtñn‹ud¶´ëu)ïL¿ EŸLUïlEOÄ:Y2~™”Þp1Ó}R½R•|Òe½ÓeýïÈz¦È»'©¸&ºÅÞ‹J-‰J)¿–S~§¼&üz¢„™ã!}G¦¿gÌÕ‚Êš¶ŽîªºÈ¤tU×ÀÃ&ìCúl9[?³€˜€+ YEe5MmømZ~éõœ{¡×œ"㠼•ØAr0lV^"Vž"–gÌÝNcJˆ¹»„ÒO~NA¦ÞáΑñèyOHË»ST›SÑp>3—}ñš–/¼OZú³ð?apÂÖûŒ½tSéΪ_ œsŒp €üî KKNlqmóíêN`1Ì 4ÐVˆ´r·¨}G¦!:‘BÄ”ü7§1 šôœ´êÈ¢ƒu½¨×ÿZÑFYsd…øtYh­ÆU2¤¤°t¼V(è{Ç =}ûÅðY€ÿíåÄsª¢h|´wà°…Ë* ôªsõ–ˆðÑcoÕ´ß o¦píRqV«Àô:à´ÓìŸ;²^ ò>éØ|ÓI”ÃéCŒ%ý"õúÔ ÞŠÔó³^)’n ê~I¾7Kb Ës#'å^iiusø¥qK#¦Î(!6Jl}ck[JÈõ<"$-}ë±:œ¶t‚Ö¦CøÕó‰i©¹ywKËóË*Ð…XZY_RU[TYS\YW\Y‹çÅ•Õy¥5y¥U(Цæ•ÄgæyÇ'kyÅÛøïÔwß©ïvÀØ]ÄÆ_Äs D-ýO[ù³ô?jés*¦f^å³ñ87Ù7"ZìѾlà¹:0ÚFº=4õpRv‘"Sí¼iÏ÷ð0³Õ 'ÏßÜWÞš×°¥óà^ÊTY£-xÁ”Ö@èÍMéäR•'Ûârk€Ï³óÓjþ2 (ÿâD®t“ê8ENÚàê½yñ@q‚Mé}ÒÕsF)ï½ýÃ%¤¹H`5å§OfÛû~i¹Ä!²`„ÎULž:PúÒq žeîsèDaÝݤ܆õŠ|C…Ú÷(ÙBÞ‹J:°Ñ+‹-ëX©Be§’¨L+ÇIªÚ­®Wk®8{a_a©06é{×€oxa–›}ãwíÊÓTœo¼ŒD%šì›Ÿ9{øè‰­Yªˆ” Qô&ëàX#_¹¡—ü'7énôo|+ŠúÎMö½g4ˆ#˜ö°Ð!lC˜®KÔbÇP}Ç È=~+ŽXã«0•lsOÍ•*<|ºöôùKµ-W®¶e•äÇÿ6Ç!àˆÔÌüÚ–Öcu—–]Ø\X Ñäê‹0oÈã¾¼BûÒœ‹rHž€ ˛Ѓ¶ïäÕ'./²õ_`€ ³_ç á( Þ‚Á#" µ¡j±È1ô³_íOŸ¿†êñƒÞn6¨ÅdЃÇÝçüãpɲ–=·»Ì•3Œ– e¤Ç>DÄ“ xá$2 \ «©Ã›aáœZ ®½WPc—k$GpC–Ò ¹!f)µ6r(:9KùÜÞ8¡x}¬ÆHzÐ!:[¶·rOiíöª„ìã‡ËªêÛŽÖ]LÌ*p”'úÊW‹d?#!ê.ß“y ¤üÔYˆ"5_¼ÔJãq:®¯M­W†Ÿªo*;S«:Y©:y:÷ØÉ̲C¥§óNžSW5VÕ£lÝpµã|Çö»»÷b¼Â®‡Wnܪm¾Rp¢:`ëþoÄòé¦ó"q©•ç.^ºù  ñF\nƒRu%±ð*lÛuÍöô‹Õc¬Ñ+@/û/D6KˆRHp.5 Oµ'©kõ‚çÙûCýã¿´jlœœ0N^ÉÔqZâ*™e¤gïÛÐvÊ=¤àÞ{ ŸäÖý{¼Ø”/Ö;/CzL ¥]c.I>W*t;H|†ÝwÒq šoâ·[SXß¾¹ Ö4¶ KÀ1‘Á>%¹˜ì ]~ðÐâµUª­”j“Ärˤ»•y¼ÆHQ¸^ª¶K* ÝwzwqcziãVtÀ”6çžj:uîBñÉŠÔ¬œ ä½Æþñ+¡.ŠZïÏdž»uÿæLu†æXaÅ™Šºús.4]Fiç­ûwöv?ì…¢ðãGt?~ØÝóèþƒ»wn¡bÔpéʉº …§£3 yŠ´ÜslÂç[ûmŽ JÝŸu¬úÌÅöãçÛ÷W\Ùœ3[·Öm)ÂXº”Ò¦TMó¶üó[Ë0‡yØ”™Q“”\ˆÃ5¨`ßRP ÿòðéeÁ9 dFu W>QìFÓfµ]â‘h]}ŽÒsŽ˜få³Î?²­³StI¡ºéûä_b/ˆØuäo†¼yć±$ýM€¶ƒ03Éÿš´ã¡¿õ˜È• [™m險ÖÔÞÝ\Pg(É1ŽÑX&òFÀQ ÍA;_h©,Fän§TÙÅÃÊ–Z)Ë‘T²PjLbUëåùHyúí­Ú]€ÌÅÝå—6¡÷Bâ§;j.wÖ·¶¯©Û­áEo[í!›ï0ÓÚs–•'æuð"¿õˆ3ô‹wˆÞ…±™ÞÈD&ex%î'g¸o> LÞo™òƒOâ|¶Cð3/sì|ö“…ÿ–™s¬üôù‹g®Ü*ª»uðXÛoeWh¸FŸÝRtm_©š iEØt¢šïFJh8-•ÄÊ3×f.Ÿ¯€lâ‡+¯§Ô/°õƒê ‘3€r9ÙËAUU¸˜ ya¿2GÍÃ(’°Ubéb‡¨O< ƒÂÑÕÊô‚( ýçµ—Äfêp5¨Ó´¯¾½mÆ/v ]dK²BHAd‹³—öN¸{P[V@b…¨CÌ6÷à'Ì:×¹³ä¢Ul¾©¢ØL¡±I*BÝ&Ie‹ð\Yj#°šÜVÎŒèí¾?fâÜS+e‘Y\¡‘<ßHší˜Tv°fKÑÅ´²æÝÅ Éù ‰y ¿½T~þVCÛÝ–ë÷Û:‹ªêöæ—ĤòLÜå³cCè-~ðŒùÎ#ú[±ì;÷èï¼ä?xÉ×x+¬£¶º(v†ìÊÞ™S\pâlíÅk—ovµÜ誹r¿àÜ-j Ë;›¬n©ñJ-“AÑŸMÑ,¾ˆº+ŠÎ8q3ð†ÔÜøÜ`®àR; ØD>Ç¥~gaãÞâæƒ§¯g”ϵõÑq ÖFßCmäsã=ÙIëIÙÌS\áùéZ¯½…ÇKâÝ0ηñò/©wвBϺŸ å´çA÷ç˜ä™V „˜>$[Á ÑçaïàüËWêd#5-–šz.¡ó-¼,ÂwdŸ½™yüªuRκøY‰MR™ó2QõAÀn*yb)aqˆ9ÜíÇ¥6µÎóøBÓ•©<×2&G¸¹0(½"1ïÌβƽÇ/í*oÙ†Ñ-¥­»5ï;ÝšU…^…«Eçnžh~pæbGeÓÕª mØ‹Ï4·Ÿmé8ÕrÇÉæ›U­·7^+oèP5vªêneU\ÞwYÃzÅ‘š }g|Ò*œ7›Çän”çlqHP§Ÿh£^Bk‚ËQ%}µ<j–ℯÔõLϱnwYsæ™Þ;òÛú£ÒË Or(äTû_¢ö˪>ìÔ`>‰_ºÀÖßÀ#굈^ ^'|Ž.qA¡×˜h®4²'«íñ‚…®’Å4|7ük¦.g ¿P-›å »Å‡|W”/l¶¹çZ¿Ø]'/©¸)ÚT¶.FeWj_fÓóÉe1Ÿ‹Ù9  ƒ´ÉNv9yJÅ›Æ(i™ÆhL¢UëäŦ±G7óÚu<úpÒ‡åM¥8 åÍiÈ¿”´À~ƒ6‘VÞº»ô~Ì(iÈ(=ŸVÔ˜^vq 3 ÊÃÕ’}§Ü·•Ú%—)K×(Š7*Tëeyjse©yB¹q|©‘,w“¦yo fäPZgÛË[¼_æYRœ “À¡$ù'È’©ê3Ž·fT^sLØ7Û–’´R(98¾Ü^;L¦O²Ä9d‚©wÂBèˆõôkŠq]?ãr/\Âyü¤ûYèlÏnÝëúÞ[2Ë"@Ï9j¥ j• ÙÍpù ñv–Ú¤t=›>äà€Îµö^"ÊÎ«íŒØwÂTžm£±I,¼,âßôg݇¦“¬_ŒK˜X¶•Ãé$hÚ$ÙÒë[ ¯¤Ä˸<³˜¼ò\ÀÈP’¿Vª6K(³Ý|”·½Üc÷ ï´ãUAUø; ý´ßÞ ïÝ'D©'\SOÙ'—Z(‹Lâ ×ÉÕ?K4¿JUF²|‹ ÷Vqù¸„lñ^ (\i¬âÔxä†èñ¶²}§ÚvS‹7Äç1{ù•²óCòçÚD:zÇRËšQΡðÒf¨†oÒÔ#¥?ËÒCyÒ€î7ZOé5 IëQ>=L»· þ§™gÕlƒÚf’qAå8ÖÇŸôu¡e …§OÓÔÇþoƒ¾3’Ì‘_Ã×F2‚Ït\Gî#ÃJ¸Ä@h½BzV“±"ÖBÛ ÙÎþéEµ7c²ÏZ(²L¢s¬”%Ö‰eÏm4¹Øœ«qÁû‹L&eæñfbqŸÕ3‹^e$>K,•¥fqÅfñ%æÊ2{ü¯"×<:×8&ß0&w-A6Ï8:ÏXž‹Ã$:o£,wƒ4Ï$F¼±BcWh‚¨+¡Ô"¾?Ÿ…¯Ã:Å*TM5¶8èhàE˜+ò¶—]I£zLæ m }®ŠÓÙ°îò&Ù¦OJOÈ¢£åÒ3ÏuF©XÁÂþ»È9‘5¯ÅHé÷ïà¯ÈïóËD]—à•¼¨ÏM¼„Ê­ý‘ã„IzÙq³—½Ô¥uïi÷Í;÷æX¹Í·äh’ǃm)ÁýeÈèjË|¦mgE›`K±‘ŒötlǶ —t0ÀqÕÈá`ÇYJ-‚ÉŤ?¡˜’PJ`…%„üD7Fte“›Z`–Pl‚Šòn+Etmš„K¸˜ÈѸ§Q'ô{ÿz|É*7hTG,âG|nèRRq’a"Ï^>^¸¤.º¾ÞGï{n=ôùFo̺"‡†V2Äå¦ÒÂÈM|ÈEL+Bó©ØÖ³\±ÒU¶ŒÏ$ßIŒ8ì@‘f™yÀ[U,Ê=×y𜱥ðBëB›%Â ÄæJÎ,õgàQ“´¤ìÒp˜ŽÈ7šñ˜‚ûÊ»6–×¾ÂàoF¸ƒUû!åû¡Ù®@€Dd(‹¸`—&Á!Ù?³P Jm>ô?Šr03”¢’ÆdÑX¢¦qš»ÊšÁªÞ¤®ÿÅ7+£ã¦/–ð%+‰e]lVðï#V" Ç£)‰$#=Ü•zþG6Éç…ÉæCo_2Ó&p]@ Äñž‚C=Åûâck<Ǘϯ¿ð¥µßbû@$i1GhȘ‹×U…!ªKBDè‹C—¹Ak*¥Ñ€ÄB’-±SÐ"[±µñÁ;Ì$ÉìS¨Hò•mðWV>7ï ÁÞ ùé§Æ”ãå_²`­¯ ¢öã\VòB(vȱá¾"ú:¨jèÃôEˆÜÃ17muèd#ÏE+\Ã×)…É¿Qee•à„e¢Ðé¦^]ËŸ¸Aøk@ÒÞ²æUíÁûNEç­—ƒ‡àzÿãd­“m /¬­¿Š ò šÈ[ü< pöLãK]­—d'ä#™?88bhýFKÝ€ÕÜV„†§¦ìŠieW,böM1÷ùï_x7ŠõBP>uUîñØœî¡L3 ß´Â;j²¥àÓõÎsl±w£³LgYdW)vÔieÌ 2R&ñ21 ' Í7ö ß¾”ZÈNa¾øFc ÍñÚÇ…;8érÈxµaivJ³9G.vøÈÐjª• 4-«¸²®¥­½óî]¦@lÀ»wï·\½v´º6dOÖDñÿ[m»ØÚ_»7óT{zåU—…k$ûMc Pld±"­•êÙ‡8ƒ†í9Ô¾|;~Ŧÿ²x‹B®a¬(ôs&™Å㳩×ËÔn)ÇÒ·j[–µ9sn+' !”¼‹/€+{öŽ×Õ*ÏøÿZmú÷ÍÅ1‰…Õ5õ-—ouÞ¥’!µ<½Ýõ¨åÚíç.$fÎwòð³v]\FX2Øš¹ÒÆÀx»aeÉ¡¥öÀ¬'"]~ÔTc·šÆVÔó ðÅd{Çò6V¸$5Xêq$Ѹ}‘{MZïªç¡/’-K¿šüË¡Wã¢ØÜwÆoØ<+dÚØ ¿ˆé6>óMD²­™ü Zƒh²1!MŽ?¼nRÛ†ë)*Ýn9¤ža&úËONól<üÑøXuyïñ«üG-c4Ʋ<óXìæ\Â’Òï–Ôà«ÆOùŽhp Hź.?yIÿjèú•¹ßr~hàö¬§/gm÷Û{Ê(&ïWY®yl¡MHFæq3Žf‘ â‚ 2ê%–JPr†KgÒß¿—ëJƒ¹ýþx–<À4 ï®¶Š/²M*5+0‹)ÜS±ÿX+äÐå½O”%·Õe”¶dWtš¦þÉ[1×2`‚‘X×Ñï€úEÄ`"Œ¨¾h³ßƒwž:—0w»úï8üßktøà„ˆ"W ¢ \¶#ˆç5)ëIÐŒÔÃÀ1…®sðdc·Eö¾ÔJ8Ö¡ÏáòÙ3{?èe=e•M-³m<¾4óZê¡z© YÖª½YYItèR-j•»96 \‰ý+‹€‰=yò”K×I0·÷á“^Õ’Ú0q¥‡ß8\âwLlMë ɵžûݾ Œždì 7_G ›aå;ÛÒÝJºu“êtfeÇ–¢ïô ãøœ_YFqù–ñEfÊBÓ€Ce‘¨²J,°JȳRªX`¤úÍçFýè[Ô M›J¤â~[ -¶Ž-6‹-0”þ5&Û,&;öHí¾ã­ûµ¨hKTÕ9$fê;‡Î³ð\à #’δÔuð¹|»‹yÙ}}]]Ì·ýöÌ^ JŸÞü@’q`¦™çd¿¥vÁË\‚ ¨ã ;uÚäÙåþQ¤‘K\e‹…aKmCÿaäž|PMéKœÿ1½.áúB0²çq/|@x7ÝùÕ3ÌÝgÚaj´\_ nå׾G FÓþPû‰ÒsÂL‰žKÈÇkxß{(–œ„°¹DÔk'kO”Ô‘ö~¤ Ù>N“^|‰b‡ö¶ºËm:ÈáÙEèa>_IE¶^ó-ÝöOLÍI/>›UݶIÓè‘zí礤ùÆÑ(!¢êˆVôr”a`Ò¸Mü-­á$Ïìq¡mR±Ub å,š_eð.PÆtTæy§–ÄåÖï9Õ–U{cWySØÞ’ AÛ;„Ï´ñ›ç¸ » /jKø43afÙ)6Ù׸\v³Y%£Üº!\FÛÉccÉŠ«ë$Û'nt˜eç‹Yf”k ‚È!±)#qS0àŠm0l©³ô‹_Åá©1#ƒ¥ÕÇØÁ#\Bmµï!‰c6B¹íÑÔ_út®M0À‡žyæ  Ã%üh0YA,R—9i£ûLs×ÝGŠQK “GH‰È›À(7D¨±ðäÝ³Ñ „K Ž0˜…M:Ÿ UÙ$C—åÙ7¼p¬æ|a¸®›Tß9ržµ? Çëý%{KU´çÕÜL-½±ÿ ?Qc)Ë5–l”©£U¦±j3(&@+¡?Ó¤má Tè( Fç˜Â Áõ4…Ê—Bm$Í1ŠÈ4“vNPyî<•{6åĵÃç:Uw3O]S©„Œàb;¿¹Öþóí‚Ñ…‡5Ôƒ‰rÃÌnétswÏÄm]áÛÊÈ«ïAd1FOnwa]Èç!"ó CP.¯òÜB¡ÿgF®‹­ úÏ·•â²?lGTІUçÀÉk„»r0AWáü]Åå3”Ãi§ô ®â¾˜ÏÞÇ%ÕS-=¾´ "—D Ših/ 刑­Xá±Ð!p¦uÀTc1/)ãÖ݇, §ÄHý œÏÈÆRÓ‹¿€)MÛ7õb`|ÖŠÔT‹À¯ÖŠCþa¢CÅϨ å+0tš“þ¡¹ŽþSÍÝæXy&û¥doÖT¨ißWÓ±©ä¼,«ÚcçQçÍ%ÈݘFç›D¬òT“˜ÂÑ຃W Še¬‡C! HœP1‹¬ó7*èØ>G4,qž¹"îNÉÅ)'œۤ¾˜~ª#çÜíüÚÛ9Õ×·ÔúíÈ1تãð¥‰ø+swduRË…¡ß ù ühaØ||–‘ãÅŽ›\˜ƒbé Pd^–T&U\„éÈš@+Š’ ÑsÿAwÜç€)݉¦ /‹‡$ bV„0åû;ybO9…LÙàê¢ÜNc ^ÄÆx?Þ²8X¯G=öULÄÀÇ@}”³ø „è» À½L¶Bö•]ØÇk„Æ! ¥5õªÃ¹ç£íE£ü?yœO±^8S4Ps¼úcC]—0t0¦–˜ÒRZ†,ÇÐ1›må³ÐÎâV‘ÛÃ÷¨S5gU´äÕÞ8röFúÉöÍš‹ÒÌZÏ´“üí¥ö›4›‘«/0‹Í5‹×˜Ä©<“x5XmÆqÓ5¼û¤2§Me”£¢”ò ½²ƒg“òw·8Ñž]Ý¡ªíÔ4ÜͬlÛQܶ·ÈZ’ºÚ3FÇ!h޵Ï\[?š¢ÙÏîb®Ð#&Âù°ÏMýò óP'´ÀµsH¬*¨£oÀÉë‡&uŠºEƒì÷÷Ÿ]*š¯’Ù5ÙàêE¬ 7#höEOﱦ–ïƒ7}ºÑoŽ¥¯/†s©0 V\ß%ê³_Üý’Ó13Ž¥¥È­bî×þ^[3^¸ìAW*Maþuß“ÌÓu_YøÎ³ D§*³SLÜæ:ú†lË |8œÈ§½(ga^‘v ÄïýC`Ó°AæŒBŸ«ëQ·SÌöi>8ë8ßðh9Þ§–¹M |BlXÔ„©G©ˆÐíuŽœm<ÓÒo¶¥ï<+X²P\T?$mÛa¥È°‹;è±ùˆïÖœ ”üˆ´¢È=%Q{JýRŽø¤äˆ·ä8ÅgÚÅìß–²&@ù/7™®sÈ<»À/-ý¦›{qvªŸPÒEîñzž#\6Z“‰Qïsmýõü¯Üºƒ|¼”·Y¥þç݈U¡'H‹§ã«a‹ö´;¥¸|¹»bò¯¹øœr|Ô/6ˆBS2>ꦲTqÔ‹h¤áçm >PÿKŒ.ûžt÷±‰mðdh~t__iMã¤5öÖû|ô£³(aÇéæ–G$‘Ì(@fõ§½†ç>úw§ZäñºÙkCºäIüÁ‚/ÌÀrg&¦*1¨ð1«ã¨wÄK€Ñ¢îuüŠùsp<еT®Ï Å‹¤Ý";ŒÑ˜oí?Ï*`šMÀ ωFüO~uüŸ­ÿò‹ÃDCá/müçØø/²÷Ÿoí¹BÝNÁºÎ(+G¸H–ñ¥ô. ˆœ]DwŸ³”ø‘µ‰j–ëJWºFL·öƒÊšÐŸÈ㎾,/y­>³{àÑ&°áèy ÿRǵ¤C…Ÿ &¬uýÛ÷α{ܽ›Î›¿AÿÒSY8:Öåã…K6{‚Õ°±„=”Ô|ò¬»¢¹uµ‡¼¸¶‰]”4ÿ ¸öè….=6€Jo¸Š¹«‚¨X»òË'›ùèr¬X†í‰ï§#ÀŽÒ¹'»E”ÄþB°ljt(>T†;úà}º¡4¾H2Ë1p’…×LcÑׂе>ržr·Û– aRºM8¦~£±Øs²±xºMÀ"Îú²QZ³ Ðgú#%\ˆ¢Ë˜Ä߃ §uÁ>Æs\'tðK?Ÿ-¿u#‘Ž ó‘8䉰t´±íÓ5Cªû™£Èl4]¹j½íPFTÒl©ž‡09„N\ýL܇.ÿ±ø0C_c¼pIξÀÉY’c¥øšJ,ÈB:aµ\êE¦­€‚ı*eqkJ²†,±ùìéÈ!™"ÁŽuWBwH70‘^É¿$KÉý– tC>~MÔC$]Ñ(_á*›o8yhµP±3ï\sëÃþ±Ùý=/ˆð=š®ÝL8˜g;mó,«Ð%0“"é*,üH9wUÐ5Ù0ÜQ£}†Kb G£5™ YÈ ¡S-üåûó`Ш‡{Œ @=ŒÅ.\2…Ù6 ™Î$6Qˆ '»Ñ?¬Í‡ªpã t0^¸|á¢=W®£…ù2d£Ù8_rÂp¤žDc š*‘Ÿ¢v+ ì¡Úír€Ó4¸{.†Ae EÁÿK°ëòBÿiîû¹¡h³êxË5Ì—}Á ®õ¤¸äé»÷³JN,´ö™h$ÖçEêƒW áFM6Ú&Ôžaû8J¢¨éÆžáéY¤(Óû`ÜVoØ ¿è+ŽÕñªoð‡âòYJš•Êi‚>(å¹%»tЉ'kö¥î>˜^—œ£‰”Ír>¸ÉÒ¥.Š©–ž†¾Ò¦«ÌJáyÚPjb":äiªßÍ{]^›Ò?Û Xè,ÓqS¬àùiq9ôÎsWÈð2 ú•¥:‚°™f>.q©ZÖ=&®øëœm†dL²x¯óŽxÌ{‰Kø ,{A47{BÓr§"î$±}•d2Y±~”aX8´kQœXªÃ—L1r3]¹ÓŦÝ—Ø¿Y`øåø ¯4p½±.%aàñì@^PŒJ‰ÖÍí }VŠdÀå\ÛàŸ|bnßà h6Môý½½¸|ú a ×¼ÃÛ÷ S3ËÊo)ì%ÅÔÈñ:¸D½T„áºbÙ&¢ï<Â.´]# òôA¸»ƒÂðHhà}9â‰ß³Þ‡]î{mÞ;ÍÌ Š#$Fˆ–ûjÞ8|\4‚.t Ÿfì~õz'mïõíýÄe7ˆoT£GÌÕÛrýÖg\ç;® 6+Fúá\ŽÀ£‡"a•·9¡Ëí¼OÕŸ§( 䦾nìÐ@åµFÜXˆ@¾- Pð£D#‡vwtÞYã5Ç&YªçJÏ£âMŒºb/FþåG§†–kŒþû>ßÞG\"SOP Ì%Bàò“õÂÁ,7Ù¯Þ1jS e:Qç!Ë1a[Ê5±è˜$ú 3Š/.¸PË'±Ë‹{„MÒ¬+/üõ+LáXÊ“ Q‰L2z;ÅdÂ_ÖáÄÅæ(¢B] )§ÿ]ãRÓ5Ê1ɪ¿»È~?qIäv–AÅŸÖŸ‰€ËÁЫ<ËA¯n9÷#fXûϱô~øˆ¸·ov™?ÊJöO»AµrŽÙ<ÙÔs©ƒ8BV‰å.е#QÅW¶‰²&a„ž ò£5εÍ×È ¿Ù§ù“<ë._ýP6QúéF¯-YE´)¿Q~X¦¤ Fœt¼Ëëšþa,œÇCf”¦i-!ÃÉJM¯j_þ€Ë?Éõ4ÊÇÄ>÷Öö5˜….ÁSŒ}ªš.¡LĹ߿8DÚc•>¶íaïêÍÎ5>òÙŽáàj —®CùQ‚ž~½¿öò÷¯ÿ;öŒ·ÞÇ9.Ü—¡†>±·ï–dëÞè[²MœüA„ÐDÒç—òOc(±ÐÄ7Ö#;š¿ûÁ^¾ÑÒ¿sOz\ãfSÈ, ÿÌÐ3ùH.Õuh:Š©¿ßb¹ Ïdå:°IX T|¶þŸ¦nh)4p Ö‡$ h©£¸¼pùÎAì>Ð.±™sq&Å>'Äà.&Ñ1Ù†°ånrR1F­W>ß%R߯·íîmŠÀÁa ÏïÇ%£€qKê°§„û“‡Oz\%ÉŸš»è€ $NX!äHný²a h êÚ J„~ˆ{Þ ïÔ“FØË¡¸|QIä êXŽn@ ¶â‡/p ûÛj벆V`©ûz/êìxËoÙOzèë»ÛÕ5ÕØy¶Cør¾|{è%m²üË·\ýÿÓ?.‘ÚD;lÚÞ ¢&›ûºH“Á ¹ÔH8s”Ä7ó0‡­k9§[ù›ê³ îš_âªmçôÆ>ä‰þýÈz»O0"Í^‚/Ls·ÁgÓã‡C}tº‘°ìl%whò¥ÑŸ¡¹jLx†èA„[ð¬ïJGç7®‘Ó¼ œG¯úà_¾Þ•g¿ž½ #­z£Ü€OŠ4ºBÉô ¼˜ÝûÈF2>}#*Êšcr£4&¶ÄJ=r¢z¢…hx#M&Nˆ§ô=5Kžbâ…\)‹{¨Áã.±`ïc½‡ÊØ´ç’DÇÓ¾Ë×oO0òZb‡¾u4O…CàãêqPÃ@Oe¶Ñ7ì¹ôÉÁÎüch%Ðv°ÎÃ1ÙÂB‰}Gœ$Æ í;w©mʇùvxw¨2E|/@ÃF„žkDFá]+¡Y"R,‡'ê&ûßµv•-­ôÌ·Áþݶã•ïÿ~â>!ׯ{×Úqë£u‚¹ÎPAZæ Q¹._¾T$(Y'$¹nÄçp‰„Šî ¿u>ò»!‹@Äóñ9u\ý‡jà³>îí•î>4ÅH¤î79µþ  /]‰ú$7¾ME®aÐÛøVªç,ýh ¿árÇÓg )0>ïxÕ÷—,àÅ.‰þ)"£!¼˜¸Q´ˆ=èx¡•Bß-t‰(Œénr)LFÇäK9EýÓÄ+ÿdk¿ê¦@g WÚ—ðüç8JààêÒ\Ì6@£0“ŽFʼ‹°e¸h„žtÂv —ÛÑ6æRûãñ]ßø5ßC\ÑŒ"hè‚ôìrûõÿZa:ýôÝ.å!‰m€íí‘h–…gI}’¨:†O5õw‰Oyðèu¾Q5üµNC$1ß§MŸ€LØèNVʨN¡‹ÜCôEa¤jÎG3BßU®ƒ> ×ÐYNÿ³Ä¢´¦ ž¬®ùÞÞÞK\ÒiŒâég=üåÄ •MDê<› ÆÞŸ›yÍ·ñÆnÒçše™®Á"Çà馮Ú:¨Pˆþi’ð¯³Njj”*¢ú$>%@†úä·â ©æΑßÐÈ¢o¨ S¢Ë“̵žfî>ÙÈm–ƒ§¡$`Ûo÷ïõÒ3Æ ™:^ßð­_÷ýÄ%‚0$0+¸ìí½‹(áÑãÞsM—2ŠO¤fêñƒÿ¶ÖùÿÖ¸@€`#TI¥ú®Q_ï%OËb’yÌŒ±ž²·^Þ¼^ô1òì—¡Ãu€^¾ÕÉÊO ”ÊÃàïHñ~aáóCþÇ¿:β‹wíÌ?zì|ÓÝÝ€sïÓG$Û2.Ÿn<¾ñ›¼æ{ˆKnØYãNÙ2úm7·îÝo»Þ™SVa'Q.tðšdâþñÏnߨ{_½q“Â\ôòÙrüÌ%)ÖqlvíƒGÜõð‘“TùÑŒ…_Yyý䓜WZÓÚÖqû΃nh²ïÓ{Ÿ-%·&ï-.Ÿ»HŸ3~¤Î‡Ôذûž\h½¾é·¬âŠj¦¦¤mï'sùãAj³èë}Ò[]רÜu ²þê=èƒ9R„@O.‚iÛ‚ßÄý©žóŸ‚Ë~#ÊD¯ qŸš)fQÓ.ÊéF0•¦BíAtñÖ,×D>¤ mK™-*0=~ôä!°HÉwNÅ“ûÌÿI·ÿ,\þYÎ,k]û£.‹wrQ>àò<-ÿñê.ÿã!ðN.Àÿ+¤¯£—I¼IEND®B`‚PKz½ç:®r [Ø[Ø-Pictures/10000000000000D9000000DC3FB7E3C4.png‰PNG  IHDRÙÜr“’sRGB®ÎégAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ< pHYs!Õ!Õœ´×ÄIDATx^ìý`[÷Ù6wÛûÐ¨Û ë³µ£Rš¦m˜ÁfŽcff¶,“dff;±š1fff¶Ã‰Ùù®ß9¶¢˜›&y÷öûkg®ìÈ’¬s¯ûºñâÅ‹÷~Ö·éãïýâ—ï½øÅ{ïýâ/¦1ýÞä/5ýÞ‹ÿxñb ø/ñ«ÑÉ÷þû?¦§É#ÞûÅ{S¿xñË÷~ù«_ïÞúmzlê—ÿñ‹©_¾7=1þ«ÿ1õâ½_ýâ—¿üÕ ¼…÷^ürzjò—¿øÅô¯~‰ï¨Ûôôô/‰½“÷öÖÿøy/,þ¼o“Ó/&¦¦G'&&§'¦^ŒLM?÷8Ë/Æ'¦Ç'¦&§¦ÈÿÇ'&ÆñÿÉ©Éé)üãÔ;úL&§žMNM¾˜Ÿ~<99:lNŒOŒMâ N“76†ÿONLO“à.°ˆkæçz{ïçú‡qþ®é €ñÅô$N.þ;=Š“;5616…ÿLMNŒÀvNMŒNLO¦/p¼«ó=9ùb ïçÅäÄÄóÉcÓSÏF&'§qLONŒ(4,ˆŽø£ðøŸë)ûùcq#H„õ…i ¿é‰žþÁÄÂò°ÄL/ÿèÁÇO^à´Oà@±ïæ|’«d _}o$úÝÌH.¬mèî‡ÑÆ…3111=Ë=8ÒXœx¾·Ÿ?G@˜D¸¹)â‘ØÇeHÛùóÊ™~.¬·YÉqã=ÿë·`o¦¦ÇÉÙž˜#vè]ܦ§a ÇîÕ6}%¬õOqËÕÆÛd§dÍÕl\ j[žà šÁÅc\tþ|ôÏ ‹ð¯Ä—͸Yœ·éÇ#ã ½)¥5:Þ[Mÿy^ý !ÝÄ ƒ“B³ZcKz-cR ;{'§Fa7XX¡·t£ü,âgñæ&^L=z2¢èèû½ŒŠƒ€¦9¿ºELqíy+öŽcjßP>®ãr-!¥¸¶yèá#\O?_’Ïûç†Exµ)iM’@l<·²J‰¶]ÎüK!í/Å 6*[ñjØíÓrÜ®h!n•Óá·Ö'½A@ÙžOÂÅIxê±·tÎÀ‰Éq„«ˆ^ù)‚ÉñËY¸6xTy5ív«YïP³%yËôÄÃ磷óËÌ<ƒ…Õl¾Ô>¯bv3µ`opúí])oé\éÓþܰ8…¸jrjbr xÄ)· ¿ü÷sJ›•­÷h±÷h±öê:ï×rܧéÀ¯ã°^ÊÀ2:3(­Ñ?¥Î*.÷ûêýCCøå±çȼÇWúùýÈÇ£M2b*K—ÉI=“’ÆûµùuÔí¶ÉÙ¾@€€Ä¢ÆñÁ§OË;‚.ß1r÷2òdzâù|ÍÿgþsÃ"IAq'ŸÃÀÁ£±â“¿’Ôç×cïÓtܯí´OÇI@Ëþ€¶Ÿ–ýn ¦€¦½Û­ ¿ÄúÐÌvaÛȳ¦ŽÏž‰ˆ*GÞÊ „¹CÌG•g^ìxÂ;!óï‚Ê{´öiÚ è8ð¨1·(“„y4y0I¤ÆPxš¯ìè7¸=øä)òü·òÞþ žôç†Eœ¨1âiù‘œÓåRÒ÷’{5ì÷«ÙÔeñë:ðë9î×q‚§æÓ¶ß,o&a™Óå—Üä•Rµ^Ä2!-5ªÐò6J'$‹‚“žF09VßѵUÁœGµM×ñ€6 >šWÛ~‡œI±H‡XPéÑŒSÅÆ7‰ER+¤Óäs&öë¥ÍøÔíé·A™mÇ*Ö»•l¨Š^A鸦äôTnU“";üÉÓÑŸm´øó«é,‚E{.,¾" ‚=ªŒm V¬›ÅÑÉÍÁ¹}ûôØÊŽ#£chÕP k”ì7`hÈS!ø› MÊýJ\ƒWמ_‡=saPXÜNJNö3X©¾%I¥¦§rªXaOž¾·ñïú?G»ˆ$u®]¤±èDŸxúëì·öȦ·+Ù5s‹Êj HmqM¨Ù"¥{¯¬±PŽ‘–ö›ðŒðôÓ£­}÷²v*Yü‰ºèÃ6%K¼1êµðŠ”A¤šÕ€cveƒ°8Šæ›x'ÿ–pü9bq½ ù4ÖÊŤ‡¤µÄ¤t‰2Âu#c$Ó€!#þþMœ<äõð»^WÓ¾ÑFÀzXÝy/jŠ´Öuâղߪhû4)ƒHÁŽ„S9¥u ¶AFÇßÈEñ&þš7ÿÿÿ‡E-b„f í°÷uxtìT™;µ˜žw*}“k½S›×éÄçW¢Z>>9Š ‘4ì~ò ®¶µÿáç•·*[ðª;òë²÷jÏ ºN°‹[ÌñÞˆY'XD’CA‘|;•S\£håÿxlœÐˆ~¦·Ÿ©³G—çpÙq‰ßKrrâ£qúiŸ8“¾À,é"V³'XTµ‘° ÍkJk1J9|QÿÉSmc“°FÁ¼‘Â(ȃ_ bM»éi]ï¯Eôè8ïÑEuÉa¿ÞÒLůå¸EÁbŸ®ER$97©æP™n¹EÕ:V¾ÏÇÿ?,þÈÓðñá„Á…Eg ‹¼Z޳ñ"'>ãÀ‘_Ëm˜Ã.<ê¶[äÌq¹AY­™k„4o—TáÉžT¿Ž—¦Jæh°Ì„*4üx”OÝh«2s¿{6õíý:,:¯§âE§Íòûu™³ÄøQ%Š*†ï²ó+ô-½FÇÇÞˆ…þ¿x‚–x韟]|‹ìËKaqÆ@Rំ@¹CÉò”±GPNkXnó×çõ.ß@ëc”T›¼g$V½qBE$î“wó«¿‘ÐåÑgí×p@ÖÂJ _bq‹‚å=;‹¨‹“¢;I`ÒsJuLÝ€Åÿ/wù÷¼xWtuq¦…öbš}ùîw’†¼ZÄÒ‰óü&“4f໵‘@l—3ó¸[W>´KÆú˜¾]߃AÒ²{x‘ÁÎ%¥rÆ'&! ßH™ñè9ì×´Û«Ëâ#ÞIÕ aÅý:Ìý‚0º‰]¢_¼HÏ.Õ7ó#͘Uü?rö~†v‘év.jݗX‹"Á¢¦Ã}ö æNeke—¸kåO.Øúþõ˜Üå´j`†ôq~Ü9%4l)ñ.ˆOä×µü ¬±KÍİCÄ Û è¢3þ²üNcñ/r|4UÇ §e—YûQ}Íù6~Ü›þ¿ùèŸé’Åâ&Xtн³F€Gs)»H÷<ö#¥ÕràѶ߭n{ÜÐ%&§Ç êÖW¢Z q=} šÖŽñ>ࢠÙ”©)ÿo¤ ÷ª1 ŽCÞŒ´Ó>´")»³MÇ‹‡ô𠤃Iùh*^Dà8};9OßÜ{l‚ômþoâåm¾ö;Â";œ€²Gž¨>ïÛø»&©*1Þ‘vElrú7Úüº,ø_¿}C‚vÓû´éà n!Ù¡le–™Óɯå´JBËØÕïÙès*ê#o.ÒÊ#cšKƒ—$v˜²YÔ¸™˜™—"}aÐfâyèÍÔ/µ¶ ‡q*J¸ƒoéÈt)YdÍÎXºƒÂ1éEXN`(æ„¡§…S yuàóÜfÿjìæíœ¬9Ç;Â"áX£L‡lÆ Ñ1B.|7€œGRO!V©®½k½,ñÑ@@¶Ÿ”ñì¸CF‘³GŠÎ£e¿KÙú°¶Óåâ!u¿[ßËèý ®jvéé éÇ!Áä()\Ã…—bðÇ¡%Ú5îŠ0„³Áü+æ\G£2ʳîÑd h0çF«œö"Z§uMm=)MÍÆ’±bä1°ø·ýÒaIy˜Çy7° •1òZäÚÃýñqÂt{ç‹û9ßÉÇ‹sDÌáÌ—·÷cEšÚØ8Š){Ô­w«28‹ü$]X ƒyå‡(õÉë%Æ–œ2õZ%­ó¹´‘}ÄÕ€1L@ÐHØ;„K~B®32\H," ’hê Û嬒5R&›­ažg­2§Æ9ÓŠ$Xt\+m$éèG|4žvä«ï\Ç/^Ú<øø¬í;› #X=„²ôäý™`‘8—1°&Ÿ<£®ù7BÂZ(¦L"ìè ¤{65}ÔÈe»¢ ª' ñ§|Y,R´V‡ŠÎ׊³Úöª;ý cøVDy}×Ô ÌW#$þˆ{1ùq˜¯‰g0ä¥I=ÑÝÛgû/1­­ªG4PÙfƒºÆÉš¹±HªîÄG;ý e(à ä`‘¢p“a­ØÜÒÍ$û{Ÿ>ÃÜàÛ·OôÇ Ž!—Ÿ#5ûvMã;²‹øÛˆ 4,x1| o-^$d/bñ)Ò-‹Sæž[å¬AaÔ´£º\UÊ™c®`Aôœ¶*šÒq H—¬î”¡ËyÓ¯EŒ6]´t¹šÔÐÙ3:N¢J¢àqÂ¥x>55Òsÿ~ÐÝÔ£ÚÖßkoհݧf½W‹Å«Í>€ÐfêG¤¨i»HÞyWNßIÈ:Ï œD›ˆˆ+qŒMÛqA1qÜ$«~[7º˜Iß` i£Hß§´+ÞâKãOz{X$ï›óÞõ Žª®ª~üè1qhÄ0Î\~Ôpæ»Ñüž’ÖñاÌ<·‹h® Ñ7“+Ì`‘N\¨Ü…Îgi“ dà‘ t9lT6?`è–Ù^Ð+a´UZg­œñjqÃ2¦âö!‰iu=÷Ÿ>üôù£gÏû<¸š[&i´]Éö{1£òæ;µljºñêzòéÚв۫å2ûŠtÚD¥2`˜Sõv¤ü2¬ ÏÔˆ¸}úšµLÚ~\qð鄪d2ëÍßè•n7R'nzúùèXQI9"³Ð|ë!ã[Â"®ß'C!òÄS>yöÜ#.ùý²›e­Co¥?|ú~CS#ã/FG§Q)=ÞL(¯õ‰“çzаÿH.;9¹WËn»º=Ÿ¦ý=Ö Vƒâ œ5ì Îü:,^|¥ØµDq‡Ì +p©˜^•·€Ë¶ŽÊºV2ìt½ü¤¹ïe‹M f«Äôþ÷”âû‡eÞ?*ÿþ1Åß‘ûÃa¹)|.¬ƒèp—:s—ºín-&R>-;\ä9Y:l>M¤ê¨uëv¼ºN<¸B´íFu¿“0•aÁ.‚>Â#vwÂ)üÖ÷'åêú{PB¦œ½½î‡DeD„íZ|T£ãD,…Ì'ÂþÁy%çŸ1a}zX¢÷1šM.oJðW:™NÄpí¿(ÞǧFI U’TN0Ân|#lú_²¿:¨ðáIy[¯’º&ªúAüÎ8þ°é©Qˆyà#"Ä//Ð H*kÁÇ:b>žràáŒBï(F (€š°WÓq¯¦Ý~b©ÂÊl6 hòé¤Ð¸K“ ×NëoD4ÿ)¬¸ÏÀy)'8µÎ&&SÄ&ðˆ¾ËC·&^g-}/Xù ZøŸ2r;ièzBßùˆ–ÃU›=òpèdÌ×I™®¿hºYÁr«ŠõvM?ñÔN4Ù‡4]h²Äe Áܧçô½ŒÑE‡@‘þ\ò"=GAçrjáßy%n–ÓdÊû™Ì$ƒ€Ó/Êë[?â•qŠK&) U}ü‰ €YDÒÏ_¨¶7jU=ƒÃÌ[_K˜|#gµG‹Ij[j M›ˆ›ŠZúö~ªíù™¸6Ÿª=–Õ!}ÖQFïÞ?¥úÞQ¥_î“Ý$gÉŽ¹1ôô)õ #qÃ`2UW#_^§¨K9øµQœBÄ:FþqßK“ú6DÐÐFˆ׉i@>=G^MæN%«r&[åÍx”¬Oè»(:Çš‡¥zß®Ïj¾VÒ—TùèzñPDNWPfG@Fs`zíõâÖÄâ¶äÒ–´ŠÖìºÎ‚–þ²®¡ª¾‡ ]{5t?ªj¿_Þ:TÒ1NfÑVø‰—Äœ_[>z Ã"ÓSV>ŸŠëoR°D0´GÛ™WÛ3ó§ \ø5¾4ýõ¥ÿÙ'÷þ1ƒºÎYåu´ Ö²l"bDQ[~ü$š8—d‚®­g€O¹Y™t(,²é!,buv¨3ÖI®×ãS¶‘v ³ŠÎÎjŠÉïŠ/î‹Ë﹜Û•ÝÙ‘ÚœT—TTÓ20ØõðQï“'#èCPâÓ(¶$lŽÙñ周•¢Äâ_ðŽ˜=~òtðáóžûÏ›úŸ6?¿Yø8$¹ÛõV©IdŠ¬Ë¥ýÚ.ëÄÖIüKH/­¬œ*[’R"•~Ž÷I}ûŽ(Ô·’«tööã?ž— ã}ÅONV5¶Kظ})¦±IÁz§ž nöiŽù^M{~]g~ Û½zμ*&ßJ™ˆ˜»?"ÉÔшœ„e}­3´ø›~CX¤ŠӉΞ§>zbäúù ^‡†î懵ЊeìÖ¶Ù£ãxX›}RÏy·†ãŸÏýϵÿ: û›ýr’¦.e ­£`­’|‡*Q™ÈLù‡æ¦Î¹Ñ?$ÕJ‚ œ~DAÊéÙ9×°¸Ï…tx‘›˜C¦ýuÆVY“mr¦‡õØš~ Þ)µ7ªÜ®ŽÏïŒÌlÆ4`hFC(¾f5…d5gBR¢É/¥þz~Ý‘À!EEªAL:€T]´èˆ 'ßÌ@“4!gúÔÇA¿É—¶Œþ]ü]ãCÏ'K[¦Tö_/íóLªÔºù½’M`è(qƒ¢éÖ„!§®æ”ýn¿òi=•»P`¤xh‹Tj_ù°¨þÕªœùÈ€¥Ú®nu÷À¿_PZs5//>uÄÍÁaî7pÛ¥n¿ßÐ1Ì^-g¤}[,w©Z~~A÷Œ¡C÷ƒTêC8ï¯}1,ø‹o‹¤O@±êÑ‚ Å ‹ýFBm·:ë ›™£.§b2S7Ù§ƒÄÖaŸ¾Ó:y‹?œPûÕaÿsPý+A=s¿Ø¢©ExýHèF0ŠGw3ðý¼ëè#bP`Ò|#¢®$š¬léZ#¢º[‰ …ë=Ú˜=…†ø8š~×Üo—Æv_/îËëŒÈjMo ð̦0qöÛ°Œ†°Œfè?¹'·<}JHÕÄ”€†àGß^–^Z6¢¹‚'}ðd¤±÷AIÛý°ìVF̽ëE]ÃÏ`Q¡"—Ötswï%«ŽÊÇdæ“@˜´Å'ŸŒ)¼Ü¸[»T ¿“1Þ­‚n8bÛ}:¼pÍÈëi‘–=&s»ªí:IcaKïKu¦wþ°_ZÌÁëÙ™B'÷GKþ›Á"ÞGE»àÛÙ_ˆ*mR³ÚNí¨Ûä"0ÏÔðБÓv<¨ãtHß™_ÏõKQ“ß×øåAÅ_S;2éÞ³ñgd‚szê 1‘ˆ%IwÎß‚Oa *F¨´Åyñ¬{x茱ëz%[U'-‡-Šf¤ -ýXW /åuÅtFç´E¤ÖG¦6De4…§¿ß,ñòCà2,£)8¥Á)¡òþ“§4k1i0¾Öy˜ê â*‚e% ,,¦ZzG§×Xƻ߬.k{‚Ù?"ï<1buíó zÛ”9åµÔè6Zœ“ÏiÙÝWo4 9ejò@r]“|d|,#¿Š_ÍôqõŠV¼ªŽ‡T¢AªÍ<¤ÇÚOÆH=‹Wƒ¹KÃq»ªÝsÓð»Íõ½¹¤BÿxZZÆ1Ó±o8Z|cµn2ÙN®UÅêÚVŸVÙ¬h{DÕų=Fvºö»gzÜ=SAš: ãÕaC—ÝšŸœÖúï£êÿqTó£Ã²&A—Ÿ€p@š¼$‚$aÓ\§@ü7ñdTã–´üPážêy<"ìì³FÊxœÝF+^ke·K>)Õ •ÃW »£2›Ã²š` #2›"µôÆÌqÀ7s‡¶Ž”™lrN¨¨í~0/Ðz˯…Å…B Y¢€«Eõ£Èu‡Ÿ<|ö,«ºÝåz‘óšÔÒ®îÇO?9©cù™ ù6 ëÂúf8‹1È*Ο—¥Z /ÃJ<+œ >Èщ1ï+7¿RÜ&ëÀ«Áæ×v&æ@Û‘GÛŽ:*¤´á+2èŒ2ÆgLÜc ›r;ž\/lJ(j½UÜÞÒ.nð§ýˆ&RÞ¸úÞ›±‹„ G«A xølDÊÂý;I³ýʬº¬]ZV¨œ|õjoƒPQj!Wó$ì>Ï 5‡\]ÓŸ>+iJl°¼Q•Rß›]^µê”ì*Q½]*Œ”òJ"DõÜçCœÓD¡\5I¡ð8·+w¿7ܪhǧ ì¸WßžW×–ô™ÔAœ]§=vÛ•-7Ë«yD%Õõ¥Öö^/jºYÖ}¹ #¾¤¥¨}œóƒ˜Akÿ2Ä7ò!pžäÍ`‘"|’1b¢Œ05Ñ5ôà+Í*H`PÆãѰݯIST^F€ ]^᧪kûÁ¹×wæÓ²9jä°EÍþýcš:©õ•°Á~Û[ù%h²ùwz^˜ëD@ÜŽŠ«&=ŒHÎ^+£µJD›Wš¡èwíJQçÍ’ˆ¬Öè¬ÖДº°”:˜Ã°ìfµ´z$(aÀbzCîÏØ?Ú)Ï‘û¾Jc`J#"ØQœyrHýFÎE=£»D–q‚$^„_7ŽÒÉs0-ƧFFGGZ‡‡§–…g6jeíQµ]-¦õÙym›ÈÛí}ý¶ÔíKHýâ ]XÓ&dëûQ>eZA:l^m;^u[òá“â?jïè ‘òêNUëò&ìkÙé CwË;n–v\/ßr£¤ýNYO|Yˆ³:7î“1ž×ŒSð›Á"I'ÎS¤Kª‰4ayý+qÝ]Ð8Ô¶G‡ 9ì,"R&2i{à+U‚Ö´; çŒT÷‰Û6u›OÏ«þæ¨ò¢Æß‹è긄EßÍní4{þ_所aCçPÀ­L!k×H­’4T`G…g7]+ŠÎj KÔšBÒÃ3šà”Ãàv3,#Fä|ÅÏgCCî¬å¥XC2oV?zŽ˜è~# }3X¤?/’S‰)5uE…¾8ÏTü ßM©ÙSœ£©Æž¡”ÊA©z×ø”,>:)Ï£bævéf~mól2EÕÉ©QHÜ$ä–ZøG¬3]-¦Í«c‹æAm¤ÆøØ÷£ÿ¤:©pφ‘ím*»MüósZ¤Tô$ä4Ä—vÜ*ì¼YØWÔÚðHÃ9ò„®ÅS(¼à]þ[æ.ó¡^×Ñ»[Ë‚°4íj¹ðê¢^@š ñµh{‰¶,J€èŽ {kwÄuH×þ{ ‹?WúÓyµ-·É™ïT±³öÑ÷»âq3?8µ‚u9CË+⌠c½Œö¿DtÿvV㌩—÷­²„â¾Øœ6h`ö‚ÓëgÌ[fc(×Á1~!¨àdÎÀnAM9kD–u.·ëšúQÖ‡b0¾Yÿ´ø³ÑÞ–úJ –#cc5ÝOã‹û]nV*zÄvVíïçõ7\4?¡ÃÔv uŠM L*ò¼[b|SÒÂó€m§¯dÌ BñLÖH*\LÒ×g!R¤[£<êvÛUì¶+¤—f7]Ëo¸^Úv½¨5®¬-¹ ýr~Ó­êÞÛU}«Ï(ÞÌ,ÄBöåü¿ÒÄe––û•ˆž€:s¯*{›c_åÌDG'Ò Ñ$‰û ]êº~/aúÁ•Du¾¼hö´É* ƒU¢:ŸŸQùNTïI“µrV/‚©êdu9çfíðå¼öˆŒ&Ĉ\u™W F#òeD¼gòhêIHî•Õèr£*·®cƽ«¥ç‹;³©1)¢Ô•ÝÜWÔçz­ò¸‰ÿòV?È›®–5ú‡ æ?Ïkþã¼Ö*ˆ“Ë›ïÖ°áÓbbp‚ÒX›­¦aà†x*G~ðEtH§~·¦ÝNM›m²úW Û²š†¯’±ýJIëåÂæ¤ü¶«%m×k{Šëœ3pÖwðÂeAÚ“cÿ=ë‹ó®jØñç£S‡umרØðëÚìÓpáb Îe³Ò ÷‹¤kL5ˆQV8¨Nè ‡uœiºîP°]%cöwa£¿ êýEH÷oâFÿ4ùø¼ö§ÔNZd5ÅõÄdµÂÂ.ás _ß|,¢ŽC´Ë†oŠÌhô¸]s»´iVüë]YE ‚Üá š#ŠDk´÷þÃÄòžÀÔFã ”]ò–h¨òj³¯CéÒ`èØ²‰Ú*¦ºæ4ÉÜ#>m5»CÚˆÑwiÚmÑõLʾW;p» ãZiK|aÓÕ¢¶kÅm·‹Ú#Ê›Ó˺ÒŠ¿:)[ßÓKØëHUGG^³3¶ø'÷†âŹ/€à5穬šÆÏDÔ·h˜íÕtæ8ˆ9Ÿ ‡á [Hs@SÀ'Eµíè³øõö8î×s:¥í|ÌÈí°‘ë>œþ. Æa–[lþí’ÁøìÖ˜ŒæôæÀ´PiHŽ’Ñˆ;œüƒãçßáÔnæd-\ÙtSDz}@jcä½úÇ#¤‹Dê‘6Á´§¦îPrÞÔ´ÞÉ“ñÑŠŽ¡°Ôj÷Īcfþm¶©áâwá×uç×uåÕB¥‚#ç̆ãR‡9< á„‰Ä]ZÌõzvqiiÍ÷‹Ûˆw.i¿VÒv£¨ífaÛÍâÖè’Æ{UCÇLì¢n‘êj¡dÛ bæ7\a|KX$[#Í<Ñö_#aÁ§mKÝ-á©aÉxEë"÷q ŽAêCeÜøEG@eØ£i»SÅj§œ™¨¥L^ÇÕ’îÐì&d$!)uèסXC÷QD®óÔ܈\ ÃÒjƒ3š<+{†O¡¬Gý½r›“̾)°Î `Qñ"«’¡$ÇcSHk@+CQrüÑÓÑ”¢†¨ìVï zlU2áÕ°Ù§e‡Ú5ú[pÓàíÒ#fœzŸ*‹ößÉ\t Émzr»´3®¬åZYËռƫ…HŸÛãŠ`›îUõ[DÝâW4ê|@§ø¨¢¡òÕ«7õ7ÒÏó¶°ˆÈÃc(R”¶´­“ÑÛ¡ÉâÓ²ÐAÈŒôÍæ¦RÏ 9r±4íÒ[ ´¢gs¬ p„îÇnm{¶IÞ¹V:™Õ‚2©Îd4"Giæeûn6)&-æ¹ÙÉ,VÒY Ï|Qå© ËD®ƒ'A¸Y”Q”U’U–YQœÚì–PÚÜwg®ÒÌ{úFäè!U’k#F ?t'šì®¢ÆúHªŒÒ™«B¯ŠŒÒbj>’êªÏs135ƒ—¥R ''e.R¸!lÂ)ä¶yU­¡éu¶×+ù4l¶]Ôß§gÇG7ž{tdÖ‡KÑŠ\ð€¦¦ãv\ØòÆ·+Ú Þ(í¸ZМPÐz@,h»SÐ[Úz»¼³¤åÉ÷"оWR©‰sZµ€bû¾¡"+ç~[X¤ÖA>( —+wþ%¨Å¯ ÀÙ¡Ž( é„ö ,æ¬iD’RŸ¨‘XGRÂÊ [Ì ð©1 ¯}¥¬/"«)’*rgÊܹð~™ëaŽ3õÅ̆ŒúÀ´ºà48åö˜´öØ”öÈ”öà´ö L½d´y'×ß«í}òlløÑ³þû×Fº‡žw =ëzÖŽcø ŽÎûOú=|úüÁó±§ =QŠ´A˜Úàh‘öUÇ¡ŠCÔ¬8ñùT»„¹×ðý„1Dàˆàa¢mèQTrYXNÿ)+÷M2ú{4 Š‚Î =tËñ9ˆI ¤í´^Έy)5­¦7¡¬%>¯ñZaëµÂ¶„Ò΄ŠîËEí‰E­éƒÚ>Wõœgê¸ÔU÷fÍá[Ç"J¶ ø£ÊŠðæùÄô6iÝrÖ¼z,,29¤‹µ?(ý/ŒÅWgCI\kTÅâl¾h$léœÝ[B0ë5S²¡3’…²Å,"§|H›Æ™^_hzsHVK(¼<ÂÍÌúàŒê°ôªÈ´ª¨ÌŠ€ô:¯”&ß»µ!Éõ7+Y×k®VÛÅWØ]©°»Vɼ^ɸZŸRa_æt£ÒùV5€‘Ù|½ #½²+¯¾«¢s¸mÍeR8¤Ø>„ïNƨ‰»CüGÉDG?úLSTO6ŸbŽÍ›Áûâ ;B3[ä<ã6Êꀛ- Ž".I 99.oXJPöj3oÕôÜ(j¾QÒr«´óJqk|)u6_.mN.í@??¡ZÞØOݾ2~õÆAù¶ì"‰¯ñfGǨy*:%çk Ý­HD #£i‹Ï›´‹¯ Ò£a ÁVmÂmÖKêI9†_.ì¾\Ø_—šVËÅ•XAn¨ã%@‘#SßÖ‡¤¡ƒ’d+:„A°Ž Ái A© þ©ÍîÉM>I•©Õá9­ e=™ÍC¹]*:ë{îƒ\CŽžáÆî¡æj:”·=,¨Vu?$»Ç7¹Åùz¥]\±Óµ*—[u~‰u±iµ÷*:{†žŒ ˆÁ‹š.8Àñx-ËHÈÞ4ÿv/Ìã‘‘kÅíÑYmF¡·AƒÂx8¢ÃýÔàˆ;¤³ íø½¤®iØÍ´Æ¡ÛeW ›¯wÄ7_)iºYÚv» -±ª=§í©ŠÃ%5§pŠC9C¶xKFñ-Æ‹¸BIë–Jÿñg ?y*fëúµœ¡¦çåí"ø÷ oW²Ü¥`¡ë{ãFÅýèìÖPdÇié©Ôd³÷*@ ©ÍL¯úW4cPÖ…d4¥5¡O“\–\•Ñ|)¿)¡¤>§±»ªm ¬©ó^EÃ{e—Sòíƒb­}Â.:ùI²üÅ}/ظ [ºI2¼dX~ ®Aêž!¦!1vÑWƒo§¦äç”×—6uVuÝ/jy˜\Ü~#¯Å?­ÓöF«E\…ûЏüöÒö¡žá‡c˜±ÆPÁkM“à”Pv)gOMTÙc£#yõÝa­öq9»Tí¶)[ac½ç†+´v©2×]Ô¿SÕ›\Ý‹¬ùzIg\a+‰‹›î”v¤×†gÔIØúl’2«néĸ-jH3ôÔ·Æ·fÉ:æ Ìå“(‰ÌXeT5|-¬ºSÞvÊ1D÷my,‚ø¸[±AÆÈ4"íjqlZ ]gÁWdÁ©H™[V’)Ï"’â<,’Ü¥> ½ÁãnU`jMrEWeÇ@}÷pzyϵÛFþ1Ò'Í=°ê¢ÏÚgà~ÀÀWK1,þyAû“SÊ9¦üÙaåÏN(£ÎŒòþ÷M6(Z!Ó:jà|ÎÌ]†é«áltÙõò›ùeÕ}Õ]Ãi5Ãé]NWKÙ×Ê|“š®´WµöR~öGûh’Ií Ò !…ÒËï÷ùèôóâæþˆô÷;eÛ”-·*Ybr€”¸µ0vè„Õ ‡MØOn5Á5_C¾RÔ‘PМZÛu£º[Ê)`­”Ñ_Ž*{_¾M1DÁ"z)+Eçjo“o ‹3\f¼ßÙ<|š”üŠoÄv*Ùî=Dª¬dŽ©)íRÓ¡¿EpƒrãVUËJ–Ö‘7ˇHùUB P’6ÃåØ?ò°YcÉ!#¸$¿N­Ê¬H¯ ɨ Î=§54 ©w3ö¥7]Ïoªn¨iïM¿§êpÜ+mé9ž2÷8ké}ÞÒ[ÐÊGØÆWØÆO” j(Á –²‘´g[úœ2pÛ¤bû¥˜þGÇ”þ´÷âïy¤~Ã+ýk‹¿=(ÿç Ú«d-xµœy5v?mêªÄ ¾“]ÔÐÑÐÕ—\цbµOR‹óµrÏ[e9µÝCOžÃw#×™™L&¬L¢‰BúÔ”&ÅB  ‘1ûu “gDX{e[_HzßÝJðNv«Ø‚*Æ«ÍäÑe¯—15½Ýô ¾ é:º,¥­wò:’ê;bòÛøTk.~yZÍ9úƳ1¢ˆAR#Bf~ãð{å ßçU&H•vlj,ônö·ú‡”íyt8¿,4…ªuÓ@"a±x‚q9½×HâIÀïšc—5ŠU»…/Ž„ORñm]xz]@R­oråܦ¢–á¢úö˜Ô ¯#úv<šN‡ <ÏYú 3…m„l|Eþ"  PÄÆOØÚ_ñ­î3pøŠ1ýHI»EV°;DÞ%LÂ!€ãW·ùAÚäïgÕ~³Wâ{„Å#ü[éOOi®S°Ýª \æY–ªKxÀœôòÚâ¦Þ›¥ýÞ©mv×Ê\ï6Ü,ïíifl)aS2{G–*Œ˜å$úå¤ 9þ3\uý¡™m^wÊöè3¶Ë™îÓpçÑ·1ñO*ƒƒN(ëBåjaË­š®ÄÂN^æV9³ïÅõu\ƒŒŒ =Çô4•½uµ±w…Eò‰â/{<òH…ü°>ô¾èÉyGsU¹Ad"ìvuÆzi›Øì«%±Ùmáà`gc4÷8Ñmö–>ÈãS±ë$]™txùv¿”V·» òtµ >ÉohÓöº|ÊÄc¿žãQ ÷Ónbþ¬½€¢« ëè¸VÊ@ÑûÊõŠáËÈ-è 6Æ€Å, ŒÎIg²b‹Tá:£‘p`IrÓ”R•YUÔÙ—TZ©aÉ<¤ãxÚÜ㌕÷fày„ƒ6>â6°|>ÂLŸ 6^¶A"¶!¢p»Öø¡/ ¤(ƒDŠ$X$þˆ ¡[â+hãwÞÚç¼µŸ Mà×C˜_÷ÁI=méuÈÈu—šÝ“ÏΫýõ„ܧg•¿ÕÝ«j/m¬\:‡)8‡Ê³üÏX{­–·üýqÕ_ï•û5¿Ü_ÎicX ÀYc—°”²ŠöûÑýì•n·+2úƒÃ:E¸XPÿY”C'"¥TN ,Á (oF”b½å¢ñÍÊÎëù (è†XnÔx·«Z.¦—˜[¢,ña”ú#’h"ò¦'óçƒöa/L t)`Â&äìÜ7(2(R·Ã>ì_A²¢k¿EÎDÎ1âzI?8ˆ0l¤Ž8›)/›¦ÐåžàŒZÒLEŸº÷ýSÂR3*{²k; =Cö©X6ª©xY‹þ¢6p»BŒ@AkD‡¢6Þb Àôñ™*¬ #†ŠµØ¥êxÂ$@Æ1BÊ!𬱬í'GÕ?Ü«°ú¬ÎW9·(M¯Y¿Ã:®=§õ+>Éßí“Y#ª{ÖÌí´µ‡‘WdkWïÝâF×øÿ;5 ÝÃØàJæ(MŠ•èÚ£U ËFò)Œ&2*:Ýn×EÜ«O*o½žß˜ÓüPÐ>p³œéVEkQ¦ïàÓ'L_£Òù¡ù®°H1ðˆã ¦T€iŸ«…t@ØÄGÃ~‹’Ÿ¢U,¦õDÞö£z*3ŽJëBÓª½³zî”÷ä74IYA¦ÂNÐÚ뜥—ˆ]$rŽ™ŒØ–˜F!$6á¢ÖbV^¬<›¹í3 Z+‡Øò®ÁQéyÝ=}=B2cuÛÕ“°þ.ïxëüÅ9XÄ_‡Ï þD«v ¤ ·¸äÕ’†;4mÁÁ vì½Ne‰4…êæ½œâC•ìàt"‹ã~§1½ªûN~ñEKçCÚvç˜Aç Øx !¶ñc¢Ôâs-R‚q>oÀ¯å cÇÈëåMx{p¹Ož|aè§ô¢r®éùâ·‰t^ÏÀ`È­ô3fîðÒŒà‹¬ÐC†Î=¬ôñ!ÅㆮªÞ±âLÿ¯Etþ¯Ô§ç´Î›¸7ñŒLË­i`ߨ¡æÁ3óF35"T…z—M(È~¦GÆF2+ÚÒ[ÎyìP4ý^ÎZÛ#rttf‹!çIÞve‘~¡wä£)Iw*®¢J_¶ô.­–1Ù®`n•™u‚°ez*’ÎK°fÖdÖ¡7ã™ØÕøànvÅQmû#¦NçÞ¤Y‚z5bA† MÀyÛ A[/1XG $¶®¶ÄiAûéÓ'îß¿Oƒ†Øµ>Xµþ7„F‚Bú™éî㵞={F/“¢z"Ô¤®Ð‰q¬\º)ïýºîÒ¶~²N;•™Ü-±NÒLž}ºÝÖÿÍ#õþ1¹£º®gü"âËÛ¯5c( ƒyØêA´®–‰TÇ>âÁèñM\/íp¼Ý¸WÉò{ó¦®ÝCCô`׻໶‹Àâ8¬!°C¼2ÞÑ;(``÷­Œ‰„uàÍÒˆ4г_!i/YµyÉÍ O«õOjÎn~p#7G@Ýᄹߪ"(aã  J†BV^ÂöþÐâ³ðƒàñ.MÔ<’ êž>{öøñ½CÝð¶ä ÐXäFÏ›%7qÖfxœšì¤ä€à1¢[UÓÕkx™WuÊÌWÖ!àœ¥÷?(üùü)s_M¿¸ãFNŸUúÍ¡CúìcÆQ·Ë›ú\oV„æÕ A®—H/£Ò‰W%3T˜€ÀÙx:ôôYlN‡yÈÝo¥u¿Õ+lh"e7Ú€/gbß`Xù®ì"‰Å´ âJ–Œª¦¿žUÚpÑ$š«y]$w&COËqènÊÌx éò5yßnÎk|˜t/O—y殍¥Ÿ¨u€¤u€˜…7dA&š(A6>B(ÖXúnºhľt§¡£køþDz½=½ý==ˆ‰Eä˜Ã7e9Ï3ß:ÒÐ|0ÜÿèÑCÄ’€¤ïIž;ñläiTZþ^}çýZ®’N¡ö~Û%L¿[’_“eàIÌ&èÇ”~»÷ü>u¦„¹3öjicÓµ’¨üf´ûðëËf3¤E8`ðâ¤à~uÇãË%½GŒœ?>©æsc¦ý³Ä"©ì`„cG ;«c•~³¤ù ý¨l¯‹Åpi³š@Û J¬Êoºå^Ének˜Ø3@¡}€‡¸Ð6ˆDŠˆ­ýΘû5p9oì˜X\9Ø7Ðß×Ó?ÐÝ××Ó50ÐÝÛ‹ä°€9ìÅýÙÛ›5‡óAIÿ¯I÷ÐàýÇä£ü(j,®ÛéÉÁ‡#jî‘;µE,ý¥‚ö°>Ø#¾VÌ\É9\žò÷3:ÿg» ¦íQ–ePtaS¯{BQ\Aô—5f$|'95É$>/nŠL*ÏjJ©_'k»JPcèÑ}ŽVÔ´|K?Õ[±‹@½%‡* ̬8$s½D]v*½¸ôãRÇLü£îµÅb¨žRN ãXZ”4Iv12½68½%$«5 ±:»²-1¯dŸ6㔕ßK_10k¬|DìÏ,"qÐ'­ÐìÖv ®¬oF¶ÛßÛ‹¯@ÀÀ@’`b è·u|³p\øÙèP²¿op õ¢çÏ¡vGѳ( àÌ=qˆ¹³SÍÔ2§Ð“fžŸòI ¯­è#gñÏó:¿æâ×´9aäîw§¨©ƒy½,¥¤¹X è:ÄP­?ª¶HæÉϺDy[\v#ûzipj-f-®æv)»%üå”’mD¦oÈUA­„KœR›z»°|óXœÍÉ"!*_$¤ª=A&ݪۺy´ÍV‹ë8Ää^)èFÚR"”,Í£ÿÒa)dÚïvu̽֔¢JA›³ÆlAÛA»°ˆ>¢Ö>">¢vÁèø{@Çžqµ­£³ ¯wTcþ­ntœJ_tùŠt"à82–RX»MÍê”™‡¬CðSÿ¿UøÇiUE·Hi§ /Ž+ÿf·(tO².ç”dV7³®T¶ Râ;„4F¯'¡Wh›„FF„FÛî_Ë®ð¼Uù2ÂòDîxù^Ktvûv›Õ"Š·óŠ)Á‘<ÇÄÄSJ\Š\$‹e ðï[Ã"è!d{¶'…_ª%1>øô +_P—´ ¾U> ê ü-XÁžc©Ç`H´1*§=àVÕ•‚ÎÒÆÎÃúì3&Î"6àbá0åC?1koI¦ß9kŸs–~L="o% ôßïíêëïë&%Â7–#¿LÓΚ;[zðà‘9˜)ú9$¨«ní;oÁÞ§Í–`ÇH0ü0[ó·sjÊì@I{¿¿Ÿ4ú/~éÃFö`™$çUÝªê·ÆËÐCj1"ádƒNO8R(nX“SýOî6¹Þ,ö¸SáŠP `dÔcÖ Œ÷àôê„ânö>TÝ&¥—_Ýð +± ÌsšÔ&i,rrîËæGÁnÁ¿,ÎK¸ÈV[¢·J­³AiqùàÓ1·  i¬“0öK¯¿’Ó&Ðci–ë²4ò$.™¯6µ±²}üpHãgø ¯e¢C0€^à¦ÿ9†/(B&ì+=Ý=}=aâAR¯!Ñá¿Û“ÈÓo E>r¦‰–7‘õB%¬¾µë”…“€‘³˜S „uèÿîWüJPMÝëÒ9fȧG¤þxXꌅóYs´â›.¥V¹Ü,m½ÿ|úš„DË¥u¸ì'cãwóën×¹ßnõ )),D>ÁiÖ[Â3Z‚2kcs!©¿[ÃáŸF|jeÍm IµÈÛ¾^–=ç·¸Ÿp,r€¿ò;³rl/K)O¸ø,sÊ«ŽéX+i¹QÖDÚ%üzA_ aÈ6‚˜ÓÈÙ$°(I–jÀ@Ô¼‚–ûö7車PmôñÀ)c’š°èÙþ ÄŠ˜»dUö÷u!(¸ßÛ;<•ƒ=ÿ>@ä6Šó“w>A¯ÑgS“#þ¦Gú†î3±ç׳•·’õ—½2 {*y1ö¯çGäÏ[x(Ùû5´õÚßlN¯yðì1µänúÁ£Ñ{Õ½žw«]“ýH¿  =‚ä´ï£°yTÑLpJ0uNÆs/ßkfÄåmT0†pÙ²&1Y…Oža˜‹ÌÒš%)‹rÝVŽîGr?ÉŠ°¸¬ùå~vúÁTq‚ܪÚÚãn+ªµVÖL@Ùv‹ª5ZÆW²;²_:hNûÕ)ú—uDºˆÇ/¹ánEOdj¿ã‚…7ø…¢ ï Ö@¤Ÿƒ IIÙzcTÊÜõvv1²ÔþÁ¾î~:;†IDúŒ¯/+Ïÿ×AÉ_Ó!#ç-Ñe §Ož`ê qHbˆ¶qe·võIš»î3u‘qò—0÷ùˆ_’WÑRÙ+þ  ûw¼R_Kiž6ö`„Ä—µÞw½V–ZÒ‹~fykG`rƒëõ2|zÁÐ5ͪK­ ÏlÏiÁ·D´Áä12ë£SZ‚sšÃ3k2ñÛ!o¾]É dJ °œ²ê±qÒ¤^sËB…»—3ÇF¾‡IRÖ$¢øS£/¦[:ûÔ\"Œüâ±½ÌÐ÷’‘ßeCß+>×¹#ßkFÞñF¾WqzÇ[ߪké†ö9%]@ĺŸ$V);AOö aÝ­jŽÍÝ}û´mé{ŽšÎv]»àzA§×í:øÏ›^IÕ9-a)ÕQÐÃH…Š8ó¤Ž Â;…@¾†¥Ò´ÑúkŽæQ›¤M ³[Ê¿&›$tD,Ø¡)y½ŸVÙ ˆ¾Ù¾Ó2ü£ß:>—´|¯èø^Ò¥=êЧïx_Ò÷ŠÕ÷ŠÑñˆRq‹Õö3<½’’r|‰Þ÷è¬ÜIÂ+ÁÖ4ÿèŽJ~)£÷¥”Ö×ÒÚ_Kë|.¡ù¹Ô+ÇWRÚ_Ih%¥ƒãŸ"êÿÓøø”Êg4¾‘2Ü©e·QÅê QíÏÎÊv^e•´!–üÒs8 nƒ¹ªM2Fq÷:€?4‘iÚöÃ+øPÂӛ¡üÂvZ}@JmIS,Óõ´‰ œ²¸F¥(V,3@È6@ÑÚOÉ)XÈ”u+€BÖŒÿQFqYû7§M7Ç8ͱXœêÏbOËy6N…ˆ“)/ûNæ?€Àñ1x3Ù+Iƒ§¦ë»™Ø4ö‘fGìT¶|ŸWŸ€–KìGGä~½Wòˆ»„µwisOPzg˜ Í5J© LJôúˆìÖÀä—µ îH.V jо×v­|`¯š vhb_ÓuÇ=Ú.käì>;£õÙ1…¯Î«­—7_¯l³VÚú/GU>9¦ø¿Ç¿ÖýBHç+aݯEõ¾ÆoÄ VK}-eôµ¤!ú½?È[®S´&k•Œ¿ÒÞ*iLOºrˆïQ9î3´kšWÝn«ŒÕA,îSwÂòƒÚÎ{ÕöibpýåŸï×p•³´Xû5öhÚc½Þ6U«ÍJf›åM¡½Gû—]öcößjÙíÑanV4;cæy«êATz€HD—«ãD©bRM`f›{jCjystFþ~C¶ˆ™;ä5ÎÙø‹3ü1 b¨hï«ê$bæÂ »Ü±Ô­»;{QJ$©óòX\"s ÔÈ'Ào,@q@CÁ}Ã}ü„æUpúÚør£ð5ì"ýÆð‹x¡™¤=>¨îM]ÍÍÛ¬épÑ*\–€A¶Uçµ5]"O›zýZ@ü£cÊ ¥[‡^-nðJªó¿Sá›X‹KšhžÑϘÑœQš¡8‚ÂLjN9¢ëpÜÈõ®Ø£a³[Óz›ºùzEãµò¦kå,°ù ¾“¨C ¼[„’{¤Š[¸¶W´ŽOŒŽw´¬ Ï%¿+FÔaìÕ$àš±ß½ xÓ[*^1?¡Ô3HßOý5ñõM@;zÿ.¬Gö)Cá™H½£L@T¡Ä}ìÓaí×uÞ«USˆ)²É¡íL”ìðjc7€ b"Ÿš5.¬ýšØâƣɂ¼ûFѵžpl{$ž÷ånŸM#ù\ $ÁÙ´º°ôÄ‹•-§Líëƒâàs–á.h" Om¨è¤i2„‘Wx{Gç01‰Ýˆ{`I9qy,Òhú¬ÓˆÁס¡!` àCJ‹òqL³‰äü’Ô“IÇñq ¥îg[иþ(39‚Éyê†qiˆ‘bцە¤í:ö­ƒ@þøÃ~É]ª M·ÈÍò¿Ú{q›Œù!}—¤²âÛå÷¡“á|½Ä/¹|(¿&×Î-Ÿi«ÎèÑK<æRA‡ß5ýÀ+úþ—̃â ý®èúÆkøÄjû]Ö÷‹7ðŽ3 ¸„ž$¼°ŽÏeM/üüІW´¦wŒ–oœ–_<9ð`Ÿ(=¿ƒ€Ë†ÁqAqZ±æ·µ®¬7ñ»t‹Qáéj(E±DÂåzåî¿„õ°štôæ^hëbç‚=÷Á !h=dsøJ퇧†íé]7vÐuØ­íħÇÞkÈÆƒyuí¶(›3v‹Áþ3(à¤5DÄeFÀx1 «‰íÄM7„%V”´õ3ý#ðVþ¤jcG„$˜A²öŠÎ˜Aö@D_ÛÑ3ÐOjˆÄ7÷ Ð-=Ĉ+9åÜgX8šJ³X$Î]‰˜ŸKr²7|¨¬)`½’÷°ÄchXãÙ@~%yà«Ç•Ü‚4Y a`Èÿ†ODÜ!PŽñÙ)•ßïW<¤ë,Ät/oŠÌjöOk¶¿œ˜FD¨P•íE·7̒ꛢïuú%\0wUõŠÐóŠ4õºjîwÃ$ðºaàƒÀ8ƒÀKÚ~ñ:>ñ†þW®Ä™Æ™úÇ›øÅø\ÒõŠÑtÄd™¼K¤„}ày4ÀL]Ár±BhJÉz‹‚¸…çsRú›Å"¦•1@KmgzòÊ[CZj°D×F+€ˆ ,½vžë`Áî…wÖqÞ§ÅÂ!€ÇcÒÙ,‡….ØõATŸ& ‚kÛåÍô‚î^-êN©¢6¬I¿Åi÷Tái `×ÅÝ«I/¯9¤a)bzá&‹h$ië/å¬Î¼èàÁÜíJr6ZzðË(gƒHZI¼¸b»/LS çT+CÛ‚Hå6™œ”“¶”?…I_*°ÓdÕÉ¢ºYOkÛú›8Ÿ6÷V²ÿâ¬ò×ô4=c°ƒö—<ÿ8¯+lâ|7=¹h( £ÕåF¹C\>„\"³HFÈI¹‹»4 I»?““ã ºŠ7^4ÚªÎà×tÚgètÄÌõŒ¥'ˆñR!2¬0e·0U÷H% ÍоÇL»2dñc÷ž&6 2v«ÙîQfò¨0¡»·GÝ~·†ýv-}¶,ü÷»nÓ¶¯ïêæ\ذ‹”vÐôtYGÇzÆ>µÅHZ]„:^Ñy¦dæ/3«sŒ(Û„ØÛ‚¡åQ¶†œaTN+xŠ‘øƒI*·”žÁ"éS7ûݪ¨n¢åvõ˜¹” Ï ÌÂð©TYAª¬@aKW—¨ë¨iw‚ê°¤ýY0½…Ñ‚?¥²•—$^ã‘øÐaØ€'¼"wãûG2`e)=âÔèJß•ìR¨s :úÊÚ|¼ëâ]¶¡w8v4ý¯Ìf5);ïêæ®ÀDPå›Mâ =ª#³k0Œëœ$›FŒHrç9 0¸é¨ôæ+ùݧMÜ!SëmïQ·Ý­j³KÅz§²Õ%ÆVÛí* ŒÛîTµÙ£Î„²Y¶ªñ(®Cñ‘ ïº×Àù€‘ûaS¯£&ތػL×Wüë5Æ×óËIxC­‰{V°ÂŸt#·àK1ƒƒØ ǵˆ# =gË<8ÎÅ+´Õöb+¶Ò;äbÂŒ€+%}ôe”‚æ™5¹‹&Ñ3ƒMA)MWó[“Êé:µô¤¦üÑô“²óWr RgÉ1ý¥®uMXF6c ç qNMËésÐ(äœÝ×@Øý¼nÉ UW˜òs÷¬Ix:5©ç' Å–s Ý%gýÉ1yÐÂ/Xùýn¯Ô'‡•²Ýn Û2Üà›RmZè—X†H‰ÒÕ˜•×çÞgóRoNéZQ¯Etú:)}2ÉÎ%=?{B\D‰,F@†Õ8²ø‘,æ9`ê~ÐÂó(ÄiÊæ›ÅÔ¾9"òéŽC¿ÿ~ËïVoúõWëþûß|yAÛãvÙ=J¢ÆÉ÷HMÄz§½RWIc•ð²r± ½§¹o”ÈNR‹– ”¿NRÏîJÞÕ’>ú§w^à²[8R|e;U³Ï溮ivÈ6V0ˇi [_Ç U§ %û€³&Î7²ŠPÖFñp¾™‹tÃ]šáØ!Îù†q‚ߤQȹýX`½Þãñrccc¸ 8å¡9=ÀeƒKü:§ìLÄI:ûøÔNXyƒ2÷×Cr»4غnáë¤ôþ“On«"ã°]kÿè얘Œz›+U6±E(îF ›šR‹½5D(†ô_Z‡I™ƒØÜöÈÂÎÍÒF¼êD2Ë[R¾‹—uœ DîÓw>`ìvÜÒû¸…z³{ä¿:&ñÉÎcÜ ð›o¶ÿú« ï½ñÃÕ?Z³á/wþyÝöß~ùݪóšBLÿÇÏžÑ)ï;„šåãçÏ…-<ÖËY¡þ²ä‚ª/Ž~8³ÙKÓn·†íö‹Æ×ÊHë“ÒÄYZ‡{SúÎWòºój[·+[œ´ö’´ !^6>òNjÎ!ª¬`I+OcÏð¶¸æ¾¾*:\ôF‡ÿ4‘¼FjòzÈ›ÿ[‹‹Nk~lr³Ê¹ŠÈ"÷‰ç¡7SùµÜEhØýq¯¢¬"}ß?¤ú§CJlÿk·súCSR«u#°™º<*«%"½ŒzB•šƒEÒâ¢&àrHù"¡jXÄ*ªýØ–ÅY†@î`ë¨D¿¸3õÂ.Çí²Æ_ì=÷Çu|ÿõÏuÿý¯µXðmþøûí¯Ûýçõ<ÞÈÿçÍû?Þxày>ÚÀ÷Û¯¿ÿü° $œ{‡± ™lC|ôÎ'§<Ø$c²M™œ[Xf™|åÕ«a8ÒnVRD»UÑLØÊ÷nõ}üåˆisH¯†|¹KéåÈ_FƒrSIÛž÷•Ó,Q&Äk0¿ç'eë«ÂTcÉÙH[º&çö õ÷ôÛ×;?^äÔh8U¸HÁd¦]ù¦P¶äóÐä$7tco†Ä é‡Çt€‹‘ýÉ©§-ý‚–Þg,½eì‚?Ý+Çoè¨ì½QÖêW»%7È[ËØy¶õF ¬“]ky¥Â":Ÿ¬NÊnCé;’‹3üQbgýN½G6¾°Û*2}£œ)¯“ÚnKÎ/E~]ö!#7ˆ·ìÒùtç1Ø¿?~µéƒo¶~ôÃÎ?oØýŽõ»þ¼~ÏÇëy>ZÏó§u<\Ï÷ñ†Ã¿ßÄó§µ<ï¯^ÿå^‘ŠV4¶bX|AèÄMÝÝŸžTâÑqâÑd7M’hªÄHV™í¥—ø  sŽ’¬ìÆ‹†Ö±׊º|ÐCø$(¦÷©¼º/’Š`¨Ï… a5 ú–Ý“YQqÊÀ]È2&ð¼rg?%Ç`5ç@u&¼mbz¨Ä¹§·“°dɰÀ7ØBÚ"œP|Õw?‡þ¤Drp ‡‹„f%Á"ǧÓP>é †Úþì]Zö²PÓeºOV.hãûŸ2ï–;eí–zïna[@v½wrQT‘Ý•2ðtBRkÑŒ!ý-[jÖFù`ŠŠGVËN5ä%@¢C²ꨉËAmÛÏxNüîëŸü°ýã¶}°‰çÃM¼näýh=ߟ7|´ÿƒüÚCÈóÉž7ìüßµ<ܰíÏ?ìüÍ«ÿÁ{î3QÓ€è8dϸFßC´éÒ{5õßœTø—ŒÉ^U¦€†Ý.Ô®uØØ/. ï€Ž$ª9‹ô:*Í™{éÀ‘hB¨ÛîQegCCqvMé,=ì¥8Ý,"‘b‡£OšÞ‚¢öe€ã™ZÞãw—ßÀ㼫Ãò_òö¾ÚÑJ®jŽAÇí*Êë8‰ÈÒœº ‚³¾4LçT¼ç˜½ùw‰'Gч»g³l¼HÿÕÈ©iÎ ¦Q!‹¢Þi·c¦ªN!<¬pDÓIÑ5x•¬É/· oUbFUw z%a•{£eL±iLä×"Ój"°M–øèYÍ_.»F_0ØÀûñúÝ®ßý¾7ðüù‡Ý¯ßóûÍ<ÚÄ÷ñº=®ÛùÁ[~÷Õ†O¶Ú ¦¹EÙòoçtÝã³c×5r’Ä@*&·²AÞÑ瓳²›mh2t™|šÎ¼jl]gÍÀ‘,Žœ]Ÿ´4éÜ iÿ9 _¨ä (YV‡ %¡‹æisPrïªÊŽ¡‹ ÿ³^çl¼¡ô*ní«ÌRqQfˆ[{¸Ã:,˜&sŸKÚ(Ââ|/áBÊüâÔÐp¬tëîâ†b '€ãÔº¹}pç¿<-°5ÿ/†KÚSãuáö !мÀdHb!Êx Ža›l¾<¯¢ì~ÔÔç×ûdþrZ턾SEsKPFKdf‹Óõ è<§«Å‘Y íÐŵ™ÊâK}„1ËæÈ´æ«…}Z¾ [äÍ‘Kðb…±çQ­¢êÿýÕ¦÷¿Ý†pða7ò}´†çàrýž×óüï&þ¿¬çÿdíÞØó„Œk¶ü×—ßýæÛ-{¤ è8ÿKÒtŸžÛÕœ’Ç#$dBúü6n>'³¨2’å@IÅ õÙŸ‹l•³>¨Å<ˆíTš$]‚9¤„`›îŒàû2FeE-ûm(qÜŽÍÃj æe±Hí%ÀBÉZpéÂÒQÊiI.©Ø£Î·r´dø©±BÀŸUs Qu:gÎÊ/­ïè^еqÒRú„Á5Ó@\y‘“YÓàC…îéq¿w]þ'|…y@ñ+Üu¢e1'›ç¼ÊÒQ^üFd¡„Ûòb¤«K´š¸IY}xDZjòQÿÖþõÁ‹Ûä.ÑWòZ†Ãk}RŒb L¢óƒ3‰‚GâîPÓp¤Åd2âNln‡Ç­²íò&èà è96p]Ná7_¬ûxÃî?oØóѺ]®Ýõá:ž×óÑ@üxßGx?\»ûOëv}°iÏßmÿËͯ߿]\OÀ4t­¬õ6ySÿ«)Èš©Eí£Dbo XÄÆ$tGÐâ|>ùÔT÷ðC÷„Ì *6_ i!JàÓ#eB²8I“¨ŽÄMÏ”»çç13ÿIEl¶‚à¤Ëõ¢Ë÷:ßÈǵ¾žP‹¾Ô¤5&Õ–´ ˜¡é§ï!fã%f"nëöƒŠ:~þÒ–^Zž!mÍ}ƒ‹’´9==XDÄUË¢aŽ¡"FfrÁ%ÝÁãÎÁ¹ƒ6Ph rW‘€ ˜¦gs,å²9²û9Öq1,Ò!#¾>{Ž#a`K!$9œbïî3pFWp•ˆúN+-÷xÄW¿â[#fŒm u]ÃÑ©õA™­–ñE†Qî‰u‘Y ÑÙ`1ÎeKÌðí1’љӓӶZpºNÇ̼vIéþîëM^»þÇ'›øp|´ž÷ã |nØóñFÞÖíùóFÄ‹¼¿[µî×_¬ùËæ½›„Õ÷º­W²[-©o‘€´Þ™íÂ$a ‹h(AT²©©ç„þJ­Áœ~VßÑktí adLwc³¾3WÝ›»ï2޳ÿ¤–´Ý.% ”r.gw é²ôÈ)a…¥·F¤×DfÕ¦·¡CØÐ=tÌÀ圅Çf¨¸•§+X™¬‰F‹[¨…gpBRFX@ {õ6§ŸQ^lf¬nYGIc…F!ÀÄ9ß1 ÄçCd±äØÂ{Xy_‘†#'ßZâ…è7348ôbTd›. ³Ë«±PÌÞï˜û_+(¸F©8GýÏ~ÙËòëzå”Õ_/ìÄD+¡Œd0WËpñGfõ^.Ñ"ºK|7*¸ƒ à›Åýè4îTc¢»û§ï·ôýVxá×ñ~¸ž÷H×îú`-l$ï'&ÂRîù÷Û~óõ¦?~¿{› êQ==öçªb ÷ìªzL~‘-«˜Ã ­à »øbê=P4Ç^¥jÅ!†I ZÉè(Yé9YÒÔ/bå»JDë{9”¯÷£±Cx7ŽHfMv“…íÚ¶0“TIËn“-ðm*V'LÜn”D“¿sùÁémQé5a©5À╼ÖÄ‚J,#ƒJ˜C¤4ÃCÃ)@Å9T‹¬è(níVTUÛ;H*ŠsN·ƒÃ}:kæN]³L§L·é8ÆogŽ÷_:ÉඦàûÐb:Üo`þ·ôO¸á¸ÄKÌã¡Q¢#¨0*£ã2¶'¬<äX1ŸQ8iæªá½JÒäÿðmVqö‹»{·¢£->w«LcŠ,/a¼î´—'èe­;ˆlÁ_§×Ý*é× º»SÑòïüçþôí–ØñáF~b IšÌûÑæ½oøxïŸ×òüáÛÍ¿_½zë•c»´ÝAl=¤Ç¼”U@örRbs2Ö_S»©í±/&—Ÿ½‚§¹‘W¼CÙæ³óz;±ýZÇ[kø@ÒòTìé8£ÎDé¿,rú‡X· S9vä­ŠaRÍYræÏlÅHP‹± -±¢Í!úöCLÚKØú+8À;©³‚2JÙúy‚' Nª;U8O(hÃÂ-ë9V†Wå½V’Ì®ü1xZ„­Èr¸m3ç˜ÿ&áÜWÎ¥À#iúyüR±bMоNÆxÓEy×èc&®ÿ½Køïf¦>‘%̓Aiè~Õš_*4‰)ò¸ƒTz”Ó'Œ+ìvO«]sJæwßlAtˆÂ5¼3©nØóÁº­Ûý§5;ßÿzËÿüë»?|·eí]÷}Æ^ßJ®Òô¿•Ñ58Œ.¨nKÈô,EJZwjèþ3ç+wÖÉk¯’4Ú¦‚õ¹ØæeÇoLïÕÀ¬$ér/oGâB´\κV܇*7‚e%r°,<2D²¦ ¤ÚâŽaÐc1Ý mmIÒçPuv(š~@ä3v\R61ŠP¤›WÛænñý¨.3]Uá. ­g+$}…иY:sÇ¿ÂBÓepN$ºD1œF9Å®GÏv(Xa’ ÏßO©K;…ãÀëoʉÛxb–7ˆ¢0ÚÄG8\)Ó{±-Ÿ4II8§5¾¢÷ýovþþëõ­ßñÑú=…ö~ôýžO‘ |½þÃ5[ÿÎsl”æcW=uÒk/šªúF4ô÷“Ù¢t ¿LÉø.r[‹´²ê32;ÞÒÙ¯íίÈX *¹´!(@ûÔíˆDƒÍCz;1“‹’úY —ó:ˆÑÁÍGZ”9‡jNF-B™ »•yíBæ.¬ý vÑÎ_•¢ÎA¯EÑÑÿ„³¾¹»-¿¡þÁ^°_¹Í„PC´ÃÂç›óQpN§Úü–Œ"wNCçÚt¥s1—ÍI«ñW¬$­Æóã99N`t|윩ûqCç‹NAŸÕÁÊY§ˆÍ fÿÉ#Æ«ÉL,¨Š¿×–Õìx­Ä,ºÐ íi¨w`û"§†C$»Sß÷)Á¯×}¼q•©ð~°v矾Ûö›/7þƒïìU«¦ž°S_ˆé¯W´²óM/,%fJ/„Ì…_BÄy},RºÐ° JXP÷{::ÚÐÑw§¸ZÑ5ìKQ­¤-ª9ïüjÝÔv(˜Çu£Å‚˜ƒ#¿Ät ´£²ýS£Òjî–Òu´ògø¶ÄìâE[oY[w ˜B ¢Ô¹Ð.¯$wÆc8‘ÆñÛÖ£íTqYÎ[óžñW ÐįpèE ¦2ô;§Ë¸á<9D'î×rUbíE˃ºlyväaCÖïýVÚØ/!#´´÷Û•±E&ÑEhLgBçm)KÓ˜Þ<ÌsBì÷_|Ga‘¼¿_õýoÖlÝ$©}ÐÔk‹†ÓßuΚx\¿WZÛÞñðÙs²‘ QQ+=1qò9ªò‹+¡,o©?mûá–H´0Ršox ÎôøBBw“VÂRÄ!´ uIì¸KÙ긑ە²~̬`qÅ¥£Æ0Âô®õNnL©L¸»Oß«~À Ã*  Eq W߸dÂÛ&º8çõÑá<Ýã‚K„Œ´E¤ññ¶4ÇÛr^ˆîŒs¿Ïùƥ͕tñ°(O½H-mÐrÆ:%k¥Œ]¢¤ü>>®ú—c*na Ýü“ëRëÍ£ó " ¼’IùbŽãâj9¼ÆÄšûbÊ–¿þçwm€9ÜþÛ¯ÖýçÔ]Ö}7ŒiŸT3)®o¥Ù_ÔAD|ˆrU;DÖ†Ê ¥Îó|4QQ! g =@nDÊ€´lCâ*œx42r%óÞz ­uræ‡uÈj  ]«­ æâ¶Á çÐëøÐb_6}‰ÀúÒô÷¤,¯3ðŠå?}ÂÐM@Ó…?FP\ßð}à2dvŠRÝÇê>®x¹éõ}ôüߤ4~fbj‘ÄXa]ãYäy•íxô]kÚoR0Sr¹t½´Ÿ¿+ÙãGÖÔ¥7»%Õ5vݳñ=iâ!nëž"IŸÙª‹Ab6Þé%•ð£pÐ}Ð ƒ@uãœÜ¡ ŠKÜfÙÔÔ ›ôós*‹wIÛ`>Vˆ?nhâW`•— miO½˜iä(lØŽ¾û%¼!*cú]i[YרƒzNÿÍ'½MѪª¥7*»çÅ&6i›„ÚË5 b‘Güëå¼zfDÂoÿúÕÿ|¹yÕ¡ 'Œ<÷h8|#¦šRø ¹ˆ]^w‰ó²¼^‹xa¢ÙD­œ$yúädzEåwr†¼êl~ ~5çMò¦ºþ· $†I+BƒXnü”@6×e‹zc]çð!m‡ó¾L8èP•”*š F™DÌ´Ì5:sê8‹åª8»tùf%¾û58öiŽ\y*=‹tì¸,io‰çR²©?™HàøF1ö”³ß åc·‹ŽáöÁÿ¹WòKAÍ¬ÊÆ(_f7Ù])-¯V]¦âÅùqç'¸WÐÊŠKzÿÏŸy@è •ûA]Ÿï$q·±ùÌC’Ÿ  ùn¯ƒEÎt&‡ €Íhgû\Iý×]Ôwvê;ÀG3bs.çu’$šrÐËæÑ¤=ŸÖ•×^ÞÒ¿[Ñ ›G‘A«;‡©#wa©²ƒå™¾¦¾Qm]ÝÈ¡ÉDF­(An£8c–³‹8÷Ü¿¸,’¸CInsÈ]BZöI–xw¼à{ÂÐæ^ö%ðQPu¸­ ×èüzβv¡PSFÝWÚ>DžúÉIåÏϨÇfæ¥Ucä£Áéz¹IL¾y|Åå¬Wö!/PEäµzßÈúëöý§ÌÝöê{~)m&ní<ôøñ¸Bnyô)¤G~_W;ž¦`TP…#R;"Ë É¨ä1]ûoäÌöhZîP´t¹Q›ÓFä‚fç*–.1g4'Ö^+íL-©Ý®d¡EÇEÊ.†‹2ÖžÌи>’¯ôÁ.’A¿Yž‡—°[›ó1Ñ6æG•o¸Í'‹°gxú©Lo—…'ÀÀxáÅú„´uÇ•ÏiÍyfNÜ "ÉÓã×Òò·kÛK0‚„m¼7^4•´R`l¼hñéqUÇØ…M}á5ηjM£óLãË.eÏØ‹%ÎQPVÛå{ { 0ç¹KÞñ[i­¡§‰œ";¦±ØãÅÄ2ÑÑÒH}»H5rHº4sÂ5M85u#·tµ¨–€š#°èq§2&»•^.¹ zÓ\é¨]%ÕÜ­ê¼’vo—ºÖ.³ƒaµDV²S ”•»{ü]ÐnÀžÅŠ¢íIÍ›r 0'k™Ÿ“ÒŸ]%ùQv‘óxäªpî°¾È'`\a„ð÷ñüœ++ñþ´Eç<’»^Í9mô_Aï²àÓr_ ¤ýM,ÅhvIÝf;1›@È}oT±ÁVy¦¿žëû‡äýbÊ[Ã3ªÝîÖ‹&qe±YËŸ£°ô¶¸Â–ºÎ¼Ž_ˆh³£¯P@”H5T°™Èß¿þíu°8›•S®€Jb 6IIO ŸÓcnUaîR¶öO©û ä¸& »òÐw N®¿Wßïž. Í’dÀAcÀ*@ˆXÔòŒ8iî­âˆ64iºÀ:bêO™»x¯¬j`ø£ªÝ¤÷B Œôi^¢šC^tú¼’”ÏÆéÏÿ¸—øôçÀ‘þ]À±&ïe/úÏYšˆ¾XÃyr¸ jaÁÔY3SÞ‚Ö>BÖØ…è+d‹þ¾ÿq#÷½:vUíÃadäªÑ4ºx…XŒ€^má jCÒM)® ,ï¿  ;œ¨¡à‚ܪb¿G‘CÙEzxbXÄÄxhjSQË}-Ïð㦞'˜Á"Ê:hº°HîR\Ó@V‘óŠÜ·™b7íÚ–¸>ñ™q:i+,èôJŒýëÜ&y%¯Kc¦tŽëçÅ•¸i\¤ãcðQSçÌ<™¸C+UÔ†’Ô·ñƬ`:dÄ©m& æ±¥Œk±Ùœ…b‹ŽáéÕñEC2aÿ2È®¬{sqæo}3v‘,„%8$ó c㣻•™°‹‘÷:"É(jS0Òg@¹Dú‚ƒÀ´ò²¶Ç:Þá§LÜ”ƒ5؄Ө‚lš*dìœ^R1„½<ðФM„Äèt’3]µ é¹ÂÖ3ž¤óÙ•`n… O…’ '+ZÌksl'‡-ö–6ðXcóü)BÆÉÃîÌ\.`¥µÍ‹Û±©Xá3­÷C²Z°/Ç8ªÄýf%T—%¯„&µ^/ë•rðÿç9½´âŠŸý&oo‹DÁ‘0&HÉ£¥·Ší£îu@‚ ­€Å—AϹþ€Å€Ô²â–Zž¡§ÍÜ•YlŠ-†ú¢S€*›øèäÂ2ZÛ“”Á£œN0—¥)ܸP¸çWæ›(îxŽÃæz“Ÿ45…ˆPóB FW¾`­‘ó~`¶¬éаøäÑøªzn–n‚ÔÖbQ#äê X%Mƒ aêÊ8ªØënMDÖÌLêÙttV{\A‡„}È為qˆߤƒÆŸöf°†Ä(‰dÉrÅye«$õ࣑‹„‰™IM=.WÓ Jk L«(jÖõ ?mâŠ!h¤Ï3X$y4°èz'·˜â‰¡çBê:ôé¤ÚÒÃMtY‘ò/á.ë%žê'¢ Y/öf8?_¢+Ð=ÌÅÐH|?FÿA@×UÈÒ]˜,‹õÆ|*Ñ6g`GÀy3÷ªÎGÀ"Ò£ÈÂ2 ¼<C3ë¯õ^°!˜p•âÂýëo ‹˜K uw«ˆ«/îP´L­‡æä.Ë–¯€Å ´Ê¢Æa«ðk' XàæÌ`ÌE$ÔìQ3·«é¹d>ŸTu~é`q‰ìóOËÒ|^ãÓç>gœÉ¥ÃGš0±XÈb)»8Ðÿðþ–²ðêº ZºaS§°µEØÅ³Þb ¿š®Çþ ó¥×šÅc³Ö½,ï£3ëQë>eâûƒœ©„cÀð£Ëú"º&ºyÓ½4óÞ¢d.-jÝÑTîŒRÎ ø‹!í)åyµƒ7³Žé9h8ƒB‹#2âNˆ˜¹GÄ­T`sWP@¦6LÎøè¥9‹€rÏÅB4nL,V0 ü-Q`âöÔK r 7 ËM‡Œ :z4êÞ¿ßÔѵS  Zé/Ê 4TqXƒŒç.ãŒ0~)õê°º\Fƒ¦Õ,ˆE‘¦$"»%6¿ý´¡×zSì1¨jéàS߈|}»8ûò„4IZ€d)çÔüÒ/„ ö¨ÚnS0ÇÔ#\spfD‘CQ[œ1–´ÈNV{`byzEodfñ!-{E/Î`wBÄ-=½/ß„{£”¸I?šæuã|Ð['–8ý¨ªpKœ~øzîü÷ B~*úÉ9%÷»&´…Æ×%.0`ou±q`ñÁðPFAévu'[_&’ú¢/ê‹b6~ÇŒÝÕ="JZAçK©f\)#r„Dái¾3‹äNZSl^Ç1-'m»/„õœ#¯ÌüE #¡Yÿ”Oìu°HºT¯Oø‹/ÆŸcî|Ó5ÇuÖÈZ hÙlW°p½U•ÓÕˆâ¯]¬” "1·„í#É ¥e{Õ]ÔYÈ©x‘𺑾`ØÅ‡rh~b4)v#^$¸Âi£K0K``]IµyéçYâùçüÓÒv‚FÒ‚—ÇÔÑ]ŸÅ2eÀblN«WrÅNeëmPuÁ8ò×"ú–¡WŸ’Å{Dl›ZêûÚ·×ñÑd°aHh„l…žL--ß(g¼NÉ’WÍv¿¶ë!MÇMŠæJ®—¯—ôÑ«ÊW’»D‹ém¾‰ ½d˜ àéÐõÅÙCÉÑ_ÜÒ=§¤ŠÂ iJsNä²¾ˆYÖ..‘ºÎÿ|Dî5 ­På‘vÓK‡ xΗ£}¯¾ºr¾D*ÝØÞ)a|ÆÄSˆì4†Èy€(ªÜXnÌðáU·/míÁì=º\A`:#:žJ²Hza"í Åø¼.—+(åpcÝasù$m!=¬AؤhúCáô<–@$ÝH\aJHS 9h ±8ŸT±„u\аÍA'’åßÅ¡L:£ƒ}¹eUÇLù¢¤¦Iƒå÷åY•M*öXwůiw@>Ú–Gßq»ŠÕ1=g̤rz&•Z‰º°žÁbcà½F¿»éÕCÉéâVÞs°v·ˆ…‡{Lø‹dÆݳ¹Ë²X„ë\–-ö£°8'\Ãïr ïtí}1 qй ©¦Ṉ̃²xÏ„A?/-ÃO8’ÔƒgÂúwñáÜÌ(äÑuG5Ç6Åí 6~âÖÞçì‚N›ºË;Twß÷º] 9j¬äÆôzPfS$ö¼ŠE¢×={ˆèV'×<RÐÿ?…ÎâY³ÃGôvëºîVe}.¨sJÏñÖ½2ðÝ HÈ*±U³‹hS’žæø’™ö\,âï†$(v|Áø¡·L(äTnBoP*0'sË娾k ¾•2âUÅhÏ\!ƪּ*6—ŠºQb„ƒFYg17ÍBHmºWšDdº³JÊÅlÎFŒŸo‰æ›Ñ0šó•þ–.y.}ã<Ïœ< ßrÌ*E¡A8SpÅFNÏØ$>–°…»0–?PÞYœá}‚áwLÏÅ-æjFã ßÝêÙå.ÔtÑHÅRЮ™ã Å;5ÏiX‘ùè/×ýá›í_•8e &´6]¡Pÿ´á9+×KiÅOž#§&«þÌáŠÀEVÛGdbzáÛ\,hÄýRºÔ.ßILX!L>1^ÙØ.cðÙyõ]ÐÚtÑŠOÅ«ÍÞ¥‡ls±ˆåGë%ô}Skâó»‘,±•ø4 pQ¦Ô†ÜkŽL­õ¼ÓTÚÜA22]@”tÔ1øBbÇ@lå=§cUÕÜ.í )¯ÍpÆ–mÜÑÅáåN=-9¼ü ™ÇÎ6Ç]rê,4Ÿ’…ôórŒÜJBXîÔžó‹´ä`A ·^z"uGÌ‚uÚÌû¼§#X„é‡xI˜é#hé·Oß>© ",»*À³kSgR“k:œ’U•%CÇÝvÊþñûüzÃ_þ±îïNI5t:jâ¾WßyŸ¡ $¸?1ûä¬&SK«ŸŒ¢øjë-fpŽé-ixÔ‚]TÓî•RBI£¿\Ò»X¡›“DGg·†çµCh2b<ÊæÞ´÷ý/Ö}ôíæß|±ö?ìú|ß…Í¢|Ê ³÷°7+Y¯7Uq½TÓ>ðb’H•"îƒÐÓ^zž‹×x±Àò§z::Ÿ[²Aù­¤Ù93,Ùâ£PòAÛ7tyÈÚ·9;ØÈ?m‘3Ut‹½Q1„•e7Qb\7$µKGRª“Ë»=/ß±ñÂN!ˆäÀ(+HÆÖGß#¸Ÿþ ó¾d§.kÒèkés¿Bý“ùvq>iMÄ%°¸Â’ç‚Ú@À%gp‡Â"¼ [Š{ºñ†^K:aÄd‰0¼Em‚„l½ÅmÏ0¼DM}%œ|+Zžø¤Vp°ÈAÛµn²-hÞÅåw9ß(Ø(¡‹±ßÊÈí«C¿ý|íÇßnûäûm®Þú»ÕÛ~óÍÖ?¬Ùú¿›ù?Ùzh£˜Ö~cöfë’fî×S†Ÿ>Ÿ|N¦Wgš4 T"çûhøyXRxäѱñ‰¤¢r°‚ÿu^{›¼1ôgb/¶Ÿ¢Ô©ãt@‡% A-FÕ…È-GK#’ÞÎå´[•qÔÀkcqIÍ.±Y‚!AtÌS*ƒ2ºCÒ‹âs:“Š+ÅÌ\”ÈöIŒ_Q>³ÒAJXweíZPRÞßßÅÍ“^šdE‡ŒËbZ Ig±x‘6“´›ælNX,‰Y Ÿϳ é’WòŽ‹ìœtê{ººÕ}$¬ÏÚa)އ#XÌ62–‚¶~'ô\YñÉi•©è>#œ)Ö,vRèíW‹©õ7Ë•|®o’5Å~p {lü;aí»KÁø³]Çûņ?­ÞüÁ:(Õò}ü=ÿ'ëvüaõº_¹îÃ-û¶Hk0pýZÜZ{1iàkÌpÁ¹òmޝ€v<š8D šÔn'_Énè-NLuöêûFü £¿FʘWËSÉB,ã×…æ§£€¦½2VdåùK Î`Ü¥a»SÉ2<»%>¯#4Š/Cc²÷Š+­ž5™-Ñ™5d×HfMDRmAm>JuGOV(!Õ:øc§‹ ËW“)dá•DZÒÔ¢!ú” ÞL.¢E¤ ð·Ïï¼qpÃ1–øÉ²ö•6utæA¿4ç+7Ö9ÕʱˆO|±ì‡q♓7yunŸ„‰x=$§ëKÎ+“°p‘°ödŠ“Už„¶¢—„Ï Ç{¥õØâš¾0‚$1³û]è\34íÂq¹Q:xÂÒg›¦R ~°ìGÇေËqS·­šløŸ/Ö½ÿ͆OÖïÄÖ‚ÿ]'ðñ|ï¯Ùþ?«Öþy‡À69£nßËØ€TÞÒEÅŒdœžœ-zÎãÜ“ïÁþS'¨ëɱÞÁ‡ÞI™_‰©þ mÌ«NšÜ›SW¶¹’,¦Ü£m¿EÎÌõFÉåÜvP’–°ˆøûÉÄjZSd˜KÕa™má)µYUíÌàË^ÚÎþrŽ¡šN~š.áÚ®Px‚˜‰Ÿ&; ¾©©ŸÒHží¾ô!óX˜lÌI]i¸p²NNîÉ#·"Ïb±#~¾XbÎ]ŽáN¥çDë‹õ]è÷ÆÁôbki^­nBB£¯­¨®ž^çè›ÖžXœsH‘g 1Â2è´™Ë3·æžà,‡f,E²SpÓë±>:§OÖWzÄÄïAÜti¨²ók;4t=mŽÍãÆŸî:üûo±uó‡ßíøàûCJyýî?®Þöþ7ÛþwÛ¡í &Ôl¿’Ô7ôŽníîƒ2(I®ÑBÙÙõÔô{DKždÜ0)ˆÇC“sOº|~Aq›:c/ru 4™Ë/FÕ†íŒ"-ý`¼Q>=G˜tMïë— ºèåÙK×#‹®68G+¬cLNÝ­¬<9;¿°„›˜ÛW³÷Qb…X^Rfû)Ùú3eÝ-(£×0S¡I¨Ÿ=G'pá–(*œBÎz©áˆÒ:t´áŽö怉CŸ€rläüx‘ûV0ÐvqÁa8nÎë’vh_7¢F¤Ó%uM²  /cÆŠbˆ â³òãÕvt½‘Ý4x§&tžÚâËRâË5dpÍuaYÀbCì½vׄ’ÍM ÃN/‡„1ùªá°2Z,>ˆË™y7w߯c½æìÅ¿l;€D\µ‰l<ØÀûçu;ÿåÚ÷¿Ùò/žS;/š¬S°ß®êègðѬ#YOȯïaGÍó ì ™¬okW³uÿ›„á9‹½jÌX\­cϧâ¶ø.wh³öâxŽ0ã»TmΚû\)MYÆ.’¾ ZÔŽmŽ`{Þ)/¨jT°r»š‘«ï(kã£èlêaà â.få¢péå g }}Ÿ<žŸ¦Í)…pfÝ9zŽiÄ·ðžœU{Ü…=Î}ÚãsÊ:ó+~ÂÑÆå6®|sƒ‰Í´Qäö!”Á~GLÜ6Šjÿyûþ÷¿Ûò›Uÿ´Žïëxÿíúß}ñí?wØ,oõÇc vÞ!dìrX$%òÆŽþÏΨnÕp=¨i³_Û™_ëvm‘1‘l³+[–·Ž\y4Þ(6¾ð¨Ûn”5¶ŒÊH(èåÔéè˜ÞMÉíHZ—‰}ïMQõ‘éuر•Rž˜_vF™VXì8ÊÚù9„\s cøÊ[8›úGwwwP#&²¯wiÒ}F98àœø9Öˆ†YoFíâøkÚ.Ò+Ù8´jnÓ¿HEN¦¸`Å{1Å0î, ÷çÔ;9—Ó+âfHŸ‰`_Ä­dQc%çi»QF€5èÜ@¤/f zD¦ä\*ëHn‰Í¨KëX*dšÙŠU­Àb$@™Ó²[Ù 4î*2¶ûh²÷ë` VØñ"0ÓuÚ¯ƒ-iX„Âã~=çc¦>‡Œ_ûÉ ¹æ®^ª€½Wœ~2ò\Ê)týE3RÑ[Q©•-œzárñ"Xi8òÁêX7ì¸MÝz‡¼éµâ,rŸÁµHSâ añeMÿ”Z{)«&£¨ì¤¶mb^i\b®¨¥»œµ—Eðåø›RöâæNF^Ñ-]TÈDÎ ÎÑüó7ÇÏÒY0G ™. r:(tôÉýíJ@C›C¦EøÅš‰0· zö9/Ä-;Æy*ØéÇOŸü‘äe\„H\|ãîˆZ¹©8…È;œgúŠZú@gú,Eõ‡EHHJ«îK« ˜j™¤õ°„i¤þ‰te¢2îT]0óÞ¬`"ÎüâÝrnsæWà'÷¢W¬ç|Ð#Û>´™?ûhÓ~,#xˆQnt¨¦‰&ë cz-yµ˜¯ì"ÅY°ÿ,ÎäѸP€E¬Ö±ûVDƒu½ñ/iÀÓÍ@ªM—R—øDÀ¨¼[ZÚЦæàcæs¹¦¾ÅÀ+LÒ.@ÁÆ'>%ÍÈ+J’éuÆØùJZvï@ï¸Þ}˜äî,hiï‰ôÓ¡æö³.Aî âüàyh5œ%ŠAô”4ý»óŸ; šC^¤Ÿqþð}¬äÁ(¦´ÿºª»$,Üdí¼B±îýŒ­·"-Ö"žgŒ}øT!y¯90­,,µ.4£=<£rY,Ò+ybs[c :¶HbOż mŽÃ\$ºdi©Ok²ø œ1v³CÑ”GÏŸ#‰FËû£1fO”™nç'¡Ëƒ8o‹3¯4Ÿ÷°²À‘ VÎz³¢ùy+ß«Å}_0šXC‰;Kn¢‘\œX’R‘’{ZŸ\Xt¯¤BÚ>HÎÆW×72ã^ž¸©_HZ¹V5¶½Z"õÔÃ7,=4È[Œ¶m„qŠ>Ü?áD„Ü@ääòˆ—Æå¾–°¸€é‚Á"”Gï“´XÄmh°¿³³ÓÈ3\ÄÂS™í/Ï g ÛøŠÚøŸg†‹ZÁ9²}o¦ç× x%ÖeTÂÔŽÔ—³‹Ø)Wv­¸ß4"õ{q]ìÊ­­‹tºÃIzöëÚïÓrÚ£k‡Ój„·±·ÈŠŠ™øŠôj,Œ0nW²Ø£ =G²›Ö‘ò× Ô¿’—y3µPüÞ…¥v*[¤ÔDä¶„áãn&@^Ô.ó .Ijç­Š¢Ê=÷p-WÿÖ®ÞØ»™‚æîBæ®ÑwS}âîÈXº[z8…\iîìÆ ¢¶²ÑõjÛ]r× ÚJqPÈÖ²äà’þÝ9Û¬3Ü|ìùÅ îÜe>±ÏI~Þ™òÑ„˜38p5)[Øœ¥€5u¬`RÁÁ€ËY[ô£Ï™zY²ËÛú+àsóZP©OÇÔß«‰ãì¹àž@ J«ƒÄõ¥Ü®Ó¦^›U-ù4™óNô=B­Ç">ë<Ãg šDã–(+Њ/°›^ž\‹„:·lÍø”¬Î®VSŸË–^¢ÖN9¥Õúžámý„Œ]S² ɪÊÙPoé5¹ÜElz%%7ò8®s¾iœïÁéà’cç燪Ü)ð‚Ÿó„óH©Î!ÚÐDµ··ÁqQy…²»´­—¢K°–}¨$ÃMÐ6üÙs–è»øóè¸]»›UÖêq¾”òÈôö@Ò}­ Ïhƒâ¦Ê¾2{Jwÿ2âîuøÝ®Ú"kÊcôOsâÅW 1:dáý\¨ äHàGÚˆÙnc>_Ó‚O±A‘UÞŽÄå%± Û¤ñNú^¿ó¯ úàà`›\;ÅÇ!”~²DèåÁ§cGm¦ì­ÞŸÝ^=ªÑB®'€oŸ&àÒ7{Ò(Bç±GÑû ëR~OLN{`Z]Tv :1‹1w8Ÿ T °N5…๙%uîA‘®ùU µuŽÞ¸î­<ÃóªdÞ’ ¿ Ìʆ¦a²…ˆN-ûGÇFÈJå íÒ•È¥9Žs<8 _Z®} 5:g¬Úì(ÂÒF‘îýÌ1çD.‚¢ä5!ĉ½:ìa+O ¦©³äìQÜ€zÎLZYúž6u³ñhîHÇdð+™ ·àF!‡]KÖ‰¦×^*î”s¹´é¢å^=W>´<¨¥f¶Ú£û'@ø tg¹€æÈ«‡®Ÿ.“ûØ­i{@Ûåšó:%sq6%!;Ó¶ÅþhBÉA\…`ãÐýžQ¥ E¼vX(‡º °…Š#÷q@ÇfvŸ&þ‰u@‹uH‹½_Ãî ¬©¦=Ÿ¦. ÌrïÂÂJP(@-ÃT„®ý ÆC×›¥qÝDÕ$ ŠK)ìà³ÃÃPôG v4ünù¥»yhˆ˜Ø[úÇ÷u·]ÎÊ·r·„’DÊåÄlQ3gaK/S÷°æöŽha„º·ÿÁý¡1’™½²Ö~±l†J H? ÀâîÎ é8‚I ‘Œ#m_ µ‡®%qoS[Â(âŸæ?'Þ9Þ™õéÑÿ ºzç¼ÉU±AVš DŒ¢¸¥×iFÐNU»¤Â¢[…~©Ëkå`¥D2xšÕL‹ßŤ5ÅöòªXó¨Ú j¸‹šµ÷¨³xµœôY{t˜|zvüÚv<èh€7¨á, ãͧév€Ìdq¯"(Úk€í‘ ]ÖßE´½îpskQ_DVÎ1S*¦dM€nX>G>={^b^9tÙxC|Ú,~6Ÿ&Šˆ,>-þr¬MÝ©Îܬb½Cƒy@™Å¯j»OkÎíùuÝöèxnU4?kê•Põòj`עܸ ]äðDdáPa©KÃn%d•\NÌ9 c“[ØÙÑzíî)3–˜•g^i¹Ç¥;âV^âÖžìð+ݰpÖ¨÷=|üˆ^ ¶D¹q¾%M©ÉIxyXJàÆ°ãÜð@ qg7ùb)÷3ã9¹çb—ÎÇä„Ï”E*B8£¿ÿjR¦¸9[Þl¾›NÎ!B%(å¢Ñ"lå{XŸey­¬å¾ïÔ+PÊYnú+T@ŒÌFXYŸP6¬–ü½¬>ãé;³yu{ ì0ÿ¿K•±[Å~—²ÃnULÊ.Zój™óëZóнzð!aà>”N©ÛîPwøêœnïÀná¼÷ÈIÂöJ²ÃŠÌZ9F%üï~y$8߈á0úF‡Á7úÜÇ*1ÝUb:«%ô¾•ÔûJDó !oÅuw*[Ôu:kêM™‡4í×)Z|%bð¸Ù.e¦€¦ Ÿ–º‚eŒ<«b±€ˆ¸€E¶rrwÓ[(ý«zLO†'Մܾ—WÞhê.héUT^ÓÔÙi+hä¬ášSZká)játÞ˜q;ƒ`±·ò (ƒ?]¬¼t$·X¯¿EÏAÓ·%ö,Öu¤_—[Òiiï ˜rPN?'ý tÒ¡ÁÞ¾ÄÜB K7Ô4ØØ<â1sìN¤ ✙һ욦 ŒV¬-€[|Æo¦FéC0qŽq]4ì¶©1viÃѹlSsü^Úúk!ýõ’F{5mO²­¼˜8oS±Z+mú¹Þ—¢&«¤,æ@eµ„þjñWޝÄM¾—ÒùË9>U[zÕ)çs{5F´_ȲW jMŽÕvö2.³£ï8Dß²‹¾á{Ë)æ–cÌMîƒué¤Ãð¯17Ø—ï¸]KN-,­niëzôdàá“¶žþ¢úúÛE•Šî‘_ˆi}rF‰Ï€Í«i·CÅJÆ)ârA7¹òfk:ÜñÊœZchZ !{§ÕFd´"j º[Z˜WZVÏÉØ/´º­­´²^‡$lîΊL(,¯¸Èô‘bx_0vHH΢RîG@Ç-9¼´œcá–(rÿÓ²vØâf+.En½nî7ý ýƒC¥UòVl)‡Ç`U—åPÇ!ÄQ»€³> fWËš3+»|SC³[#Rçbñòèl ín4Æè­óØ@o•º]Òp¿¦ón]—UÒz_œ’‘¶tŽN/Ȩ¬kF‰}øÑƒGO;ï?®mï½WÕ|Ï>ìÊœà['ѯ–ñw,b¯G^‰Ë*!›TÇHÿ¾‘xqzŠ Â8NMÿRÛVgµ˜g¾£?íù7ò@Ù ¬ú “]ÁÔ©Bslèé˜Çå´õ"zpýXú²SÁÒ+©Ú&¡Pª%µnÒñ£×sΈ Ïh N«E“ N® I. N,½ž]~+§à¤–{ø¥¶Þ¾‚êFk!‡àëIÅUMŠöþ2 _AS—èÄ´¡¾.Šo X=!U¢´§l%|YÀ-fYaJ/Z‡i Ò)Ý?|õƒ&Š¿£#Ïqm¡¦˜_R¥Èð’eú+Ùû)¹B 0D‘"AbDBÈÊg¯:Ó&êJQÓ÷šÈŒÿ̪Hä.¤¹úR‚^FÆ}åþ6a¥4¤ÔÆæ¶Ef52uÞ¦f³EÎú!uuŸÆî^2ɺ5‰ç¨}g“dÆÞƒJPC¸±3u4î÷Oc‰sáf 5¸3 ÙN®ÌrÁùè™Bô&!jBzþAGþ‰>æÝð~©·HÜ‚¯¢ŠÚS¦®k„u7Ëš º†ß)ФT“Qú¦±¸`‰‡ü¬ÄWPëÃRkÂ’Êýn¤U:‡_9¥c›’×ÑÙ”_,jã)¨Ï¼{¯0=¯LÎÚCØÚ[ÌÌùNf<TwÀ0í†þÓ³‡£ãÏqÅý(“¶XoiÌq¬œ=K”µ¹ÿ Ù •G’eR”Y@­mdt|")èrÖÔ7©3½DÍÝ#Âb˵%ƒ…¬¼À Ã@>¸§ÊìВ־ȤÒÐ´Ú B mÄ4>>Cz¢`á¡JMb™Q©ÍPغVÔm™¾õ¢Éy“ê–áw2©f”åºq>W¸ Z¸¸¨æÎëèF¬äôœÒ— Ù¢Jæ[ûî?8Ãð\}A}•Vxjý•Âfús!™2Ukœ³¼˜T"),ˆäH¯^eJåå¤Â »U÷Êj4pVœRsKZÚ.'çžµð’·ö¼“•w#»PÚÂYÂ*@ÈÄýZjVoçàä½IŸâþã'DT}6[‰9\É»._.½Úˆ›!†û´-AâZðë°‘¸xžŽö ö”V)3½Ä¬1ª‹ ]èé@þꢽ¿„…§ ›ù£±VÔÔp«›r*É^ˆ´&bí2ÀVĸ8—62«0g£î5'öïUg})i´Kɤ¾§brt,×ÙŒw1ÿðz~ƒû£{,®äÒ+é`ŸJK‰ ÙÃÇ/Xû|%¨{ÚÚýZ)!ØFgµ +Eª Tquéê7Z5Á©õ1ÉeA7 à}*›¥¬= žYTÑ×Þ˜–w܈-jáv'§0%·DÁÖ›Ì|˜°ü®Ý!ƒý#M™!z(¡’ŸþÙ-SúóÁ«pG-ká×â£&åð±áš!{pÑô{òðáíÌ^E³o¤­°ÇáR~'Š;(«¥Ð%¨©6*Ž8ZbÓ+C“K|ï”Æçԥ痛8\då””ut¶‡ÝL4rT°õÍ..KÊ-’±tÁ¾'S︛m]“é´=kº:½lãx%æ‚ÁÎÙxµ 'm>.a9ì`‘Úæ=ùØÆGGR3%-=e¬Ál÷Õr!›Ý1Œ†²¢4“„‰ç­<0„ ßJN+ëõƒüYPN™v>¸È_±‹óRápÐi±ù-aÙ­»”m¿QJÈ/ÁêM¤³°ÌÐjž€nÓO[É»ìçùv±HªÇè0‹/&á‰fãÔøÝÜÒ¿œU<¬ïß™”²1W€ÂÍÒvy7¡ÓÕ@î6µ&:©( ±üFFÁ¬Æé'—û›@§«åÜ~™›¥» +‡Nh8 Ä%S… ž¾ï°!Žªá¢ÄÐ æÁrŽAb‚·ñ² Þ¯fír)5«a ¥%0¥àƒ-D§€„@$M¦%ífâÅ—“~¹òHââKºœãþvNÉ&,zËOÉ4 tDÆà¦‰3YM?ío ‹xWT:Nn$…¡šDŸ‡Êt„L?=¥¬xëZY_Xj-¦ 2 ³· ¦ $}Aw?½.$»#*­&"¹4<)ß÷NqrNyÜ4è5J1ÜŠ**Úº;¯¦ˆ˜{ ™9#Ý.(¯5òŽ5u2÷€¬íí¬‚îÐñInˆÒ züô6ÃS?œ#‘y”Ø~ªgC+HqÃŽ†þ‚I4-„ÞÍÈèSô`x(ñ¢™Ï¬º¥KÍ1ð¤>KÁø!ðË”†~„Š&tý$˜mò;mé{PÝÆ%úFEç°Jk`fcT&‡ÂIi‚¦äal…@méú.#"R¬Éjº”×ážX¹NÂlµˆÂýQ éQ"8[•{1H® ™úŸÜË_y‹Xä~_¤ÀC]bä"›˜H*,ÿôœÒf9Ó°ì†+ùíE2..1O]Í`—àó­ÇäðФòð¤Ò°»Å·rË#nŸ×·Ã ËÈÏoí쾞Q€¹LIK—øäÌòúFs¿x)KOiK6¶a×É0Âà2kRgºÎûh­’Åζ[8fž>It’ /?‡;msBC@iDõõŽ=}†8þ–:Zh,7¶]t @Oõ¬‰»¸½¯*;¢BšlØEìE Ö`…\´dúµ àUcx^Ioè–ZŠ*8m»–ºb—’$óF´"&´¸31þœPÔgxs•ˆÖ×¢Ú% môÞɉ¥Ÿúðw„E˜wXpwé ¡£Ü÷²–Û.šZD¦]-éŸÅâ"»´‘’è;"£­UðC#+2½&>§Ö÷fqàò æ×'¤dB¼EÔ„~;±£³µ¨²ÎÄ/ö¸®£‘{hQU]jA™Ž[$–ĈY{Š˜{˜úÇä–W‘ MµnXH"¼Œ sv[.ÂJº(7Ø?úF¾pÓ çÂ¥;Î4ÁçÑãÔÐ} *ÀSÃ÷;D&Ñc]—óÖðQ²G¦Bˆ‰êNÈ©0-fÐIs¿ýöì˜ëÅ­CȺS¨ b„ÄD4NPüZn)¸ÌT£\RÄëà)†¦4ìT1_§h~ØÌ¥gð!‘§{Ë™Ê|ä¾+,¢6@Ê:0&øàÇà†Ø—ïBe‡’å%ëÀŒ¦xäÔŽž•¯¥õ+ƒ‚‹  èØ•ƒ¼&¦¨}»ü"û¶¶gR𢨻Åw k3 ÊälÜO™²™a MMíõ-Í>WÏ:ŠZyÄ%çV×5$¤IYyKbnËÚKØÌÝÚ7 àÝÝ¨ß aÜ,¤–/t£m7Èæ¤É˶U¸G*sÂ@0Ê%c݃÷ý¯g!,/A+Ïóö!¬|.:À/#kF°ˆDÞ1HÈÚû´©+Ÿ®KøÝÜüÚn¿”4úÒ[À#Á²ˆÙ9ô¹m•9lYÄ‘°ˆÄSë£sZãËúÏšxoU5[#c¬éwitœD  þTC÷#ÿ]añÅô³cPЛƒrÊRİäÜï$uô6É™€¿Óˆef€zVo&ã{)–MßÖð´šèŒZˆÂØ]¯s¹+æž.垦æyÇ?¡±ãìÊšf#ÏÐc:vZîÑ™yÅ=½Ws Á¿?©kkp9»´"³¤Ê.(NÚÒ]ÂÆKÄÒM؄͎¼v7·¸£§‹,„“æÕÛbü.n Ù‚)Ë‚˜†[§+86Kë[|®¥×wÙ¥fwÒÒS¤ç±mªÆ–¶~ra„›H²– Pr HrØ€…"Nb~IjE¯w*ˆ‰µ‘X¥†ÝÈuÁi5p¡­T<ój‹os¢˜P¤Êj†’‚nÀ$ ù´lÖ˘3#nÂD“jÒDÒOø;Â"BQÒRÀ¦½˜¸VP÷½˜Þ!ç=¶[eMu‚ï\+éGÔH.è,ªCæú~ÔÄ8†Cpû¢²0Fd_"äp[Ú+[Ö;]Ú+CÎ+]Åý–ëµ¢èŒÆè”’òê&ç°¸#ZV¼0ŠÐÙÓ[Z×èžpLËAÂÊ9ü潚殤ÜB÷ð3¦@¤¯˜¥3TéMQ)Yy5ê%e—$Úd1+ˆÐr¨++(ONý#Q:ƒ5Å×a*/GÄIL$Q¡#´ B<@Ý]ÓДVÑèt-õ°žÝ.iãúΧ̼°Ž 2ÆX7Ž>ð'ˆ ’vÂØW…í@Ö^‚Ö§¬¼Ï˜yÒ´³J®ëy›Q‘Yï—ŒV~+õáÌ ˜Î'—pü gºá86   m;§-2§…dDu[>ÈØi9ý `jŒÅ8ÙH°ìY}ÃxGv‘Ô©Hg #âtR²òJÈøVÌ`¯®#­Âp–ÕNyӨŽ蜶XH¦ÒR¶¹ÊBî\šZ%a—òÚüÒkÕ}RÅœÒeÇð‚॰…gjQUA]opr-IVÒëƒ2벉2"˜ØKõѱ#! d5¡†:X¡—²Z¯—œ6öØ¢`,îׇè¿ý÷òÆ&AWQžœ%úïöö±ˆ+°HŠÞ„·f‘ðƒ ´‚0+ƒy2c¶YÁ씉ǥžˆ‚f6¥×“¥–X̆Êvf=š4^IµŠIì;²¾÷d|²¥]STü³à¥=Ó¥½³$=3e<Òå=“e\S”}Óòb2*£Sòò«ê"o&‹˜zŸ3q×ñJȸ×ÔÕSZ]çw›l¢’lïãåny}kIuíõì<Ó€XȬcí²¹³èô4ƒ®«»Š³—™˜ïÕ›ws óK«›ÛºZ;ºÚ:»Û»ðµ³µ£½½³­­£CÅÕuÉ9‘7S¬B®k8*RfnõÉð–ÃqD~VÁ Z~—dØa”S&sR`ÙÀ"ŠÙù÷…Y>aFÈi ¿c&ûT™ŒÐë¥] %ÝÉ`<´¥´…ÙõAiÕˆh«,9`JóNðH 8ò^+²¤Ï·J‡ÔÜã7Ë™ìÖ°%ŠMѶ߬j-n0üäV<¾íÊöÿµ<åEtE‚ˆ+>y*ÌðÜÊ·¥}¡IÄü°bƒŒ±¨Màåâ>âGHÑ¡9$µ6ö^sDn»CB¥û†„KúE4YïÔ‹^© ¾¹Ò™rÞ²^é½3ä|²|²e|ó¤<ÒÝÅØw˜Ñia™Õ7‹2‹› Ê+Á—…L=ê°,½"ïdæ¶··×Ô7‡ÝHÒpõ;©Ë:«ãÀðŽ½‘x¯¨¼ª¦±5%£Ø'ò†¹g¤Š£Ÿ¤­»ðaê}ÖÐéé0jÙÖ´=ªcÊuÖÔõœ©ëYSç“Æ¬CÚ̃Úv!LˆCÛþ¨±£°•»¼¿;Ü$à†]T2 ›¾ ™æ¡W¥ìA#òF±®  Åø"p´ôp 9nêqÚÌ똎ƒŠSXzEgu×[UþéÍþ©¨¢¹G¤¶qDf7$U‡Ï³‹ó“h ²$G°ˆôTYè†m¾h §„Oþ°‘ëu›½d+s£¼im{@ïÚ*¾©]æËÚr²m‘ºÝ0e­í.êîP¶'*ËÚÒÀ8£#döhÙo–1VuK¨¬ ²–˜œH‰ZGçJ²oJxfJ{g(xg)ydÉyd\ôÎ’öÉe½Òä¼/¦Ê{¤É{eHÃ_”nI².Iú>é· #R+/eTg–ÖÞÊ-²ð >¢e Ceáš_ ÃVÓØv%㞉Ä)Öa];)+Osßï+·Ó‹ÊjšÛJëš°@=>ãžÿÕ[ÌÐK…ÜÙExR¬«°p6w»`êrÞ„}ÁÔYÔÌKÚÚGÕ)ÀÐ=Ô!4.ðZÒµÄ{é…5É%5‘é¹q7t|#`qÏš{Ÿ6ó9cá}ÎÆS&Ñ!ÆÈZ]Btfœ¶òåÕf š³#³jZû®¶b/PHZ3†~ÐŽM« O¯¹),Y Rfô¢^$ážqæ®Kalè´šn–¸Ä塲»Úžšvû54ìyõ1Iç°[ËùsQ­[Ù¤)±ìI}ÓxW>{fÀò&ûgÆÐ~q ÿ\D‡—ÈbP#·³ÓþzN;ÔlÖiû%\-ëÏìDéQ/4ó‚C²´W®Œg"…¼tyï `NÖ3]4eé÷á²eÉ?eÈ{g^ôL“tK–r½ms/<­:2©èJJ>xà‰™ÅZ¬àÓÆÎÕb^IÉ«nlnj먨i¼|'ÓÄ+ZÌÜóœû´¡ƒˆµ T™Ã.'g¦TUVV–W—T6U×TÖVÖVÔWÕUÖä•Õæ—Õä•V¦•_Ë.öº’¬ç}IŒpÄÈó¡;Vó]°ò´ˆýD,üÏYù²"}޹ž5óµ 8oîsÜô9¡g’”RÛÙŸXÒî ¦ÔTM€'‹>©F(¹Cê¯Ô nµiªvCÏòáç.I5Á"5Q™Ú€µ.wJ·*˜îQµ¡´šÈ=\ ä[÷k9¯–³>eâLºóH_H¯ $óqèÅ¢1ùzú•#öa‘0Êiû©Éæþ!¬ØÜ¡l…Ï‚HkCO’Òj¡ü5D& ­¶CÎÔ8,énq§÷ÝzIö]I÷Ì‹érž©mÞÀA äQ?™ãË;€)~è!핦葌gPòLu¿Z›V|·‘‚š¦„ô, ßcçZŠÌר©ù… --m½E•Õ7Óï¹DÞÖs»$eãwÆÀÕÊãºNçŒ]Ä,ª®¡úî!z.®!az.Aà1(ÛûKYyœ5dEïDƒy e÷㦞ÇD`zTÏe¯‹Gßv¯™Ãiw ×(Fäuß;YŒ˜›ržáõålBo¦”´ôß«ö½[ç›ÒÌEÆæðkæm^™ ¦¨“kðCz¢@9­Únñ…Ýn·ËyUm¶+[R’3Ãödê³íÀ¥.k—šã—çU’J*q®¨MSDÊø)üÅ|«·w„E°vÈ_C©3kûE#i°Ws²Ü[aì걡08îÑ`bžz£Œ!ëJnzí#Ÿ;õB®IBn©Êž3@¤àH 8ÿ÷!$m/É'î™yÑ=]Ú-UÒ%I/8Û?¹.&¯24­êjz}QE©{‡E š0¨Zˆ›ùè:‡ùÆßºW]ÝÒÝÕ-­Å•5·r B"¯ê¹(Øzˆ˜: ;Ÿ6`Òw‰æ¨®ãq}ö #—#ú®üŽ;”™;”íx4w©0øÔlök2Žë;ž3s—s6޼ãv+3µª©¸¡­®£»²¥%21ﬥ÷&ESGß,Ìat÷ÜÍmÁžÈO¦µD%c„”´é‹.ÊÓ¦3ÚYÓó±éMñ˜L¿×ºSÁ% ZÒcFí˜Ñ%š^¼Z¶{56É›×·ë|Œÿù$(Ý׿jÈàmÞÞ sŒ ›¸ÅÝýVDiŸ&Æ®a$¸…xø¡€m¬Ð"»5™ke̬B“RjÜ“*¥=ÀÔÑF1†ãŒ_æ%|7nŒÂ:‘R>Y"^™"®wÅãÍüóB«#2Ë}“ Ã’Jò*:Kº®å–èû„JX»ž2`Ór”4w³ ‹IÉÌ.«¬ªonjmƒÒ! Ü]½ýMÝ• ÍÅuM÷*jÒŠJS‹J“ò‹žßÈ)I*®M+kÈ(¯/kîhìlx4ðxä9bäñÉ!ŒGö•Ö·E'çhºEbT÷)ä ‚n¤µtÕö? Ëk÷¸ÕàÕ˜ÚœR ŠuxVC$eÞ~ìATÀ#jÛ”ª[FXz½“ªö([mS¶„¬!?eéƒVÙ£ew@ù^§=ö_‹¨º@ qkÏÀ:}Nøæo›-ñްH8cèû%¦¯ÕáQ2Þ£éwÀE"ߣËBqg?¼^a¡‚˜f«‚idJz]o@r„â¿`KÖ‡B1 ©ƒ¾?{p0 \*x&IygHúÜ“÷Á#S$<ÒEØiâ.é:¡ù~‰Õñ¹ à×e¶Åç6åT4VÔ^OKwŽŒWq< …mûÓÆ®ÊöAæ>1žq‰ÑIÙIùe…ÕµUÍÍ} ?yµóçàxa‘öØ3 IŒ?üôÑðƒÁNT¶[;AY ¿[ÀŒH”aìÓd¯¿h- n£Àö÷½‘’[Ó\ÞÒ›\ÝžÓx·)4¥1(³:(­&$“šDKF ¦)0›jD­ Žœ¬…,w¢Fîé¬ùFI¿GR•€šívsÄE‘…À ýáÃr4 ù)a[T±µìwª:¬–Òa†Åb½ œ5}³1˜Ÿd6ß6g¬:ÌbjQõ1ýMj ^Mjß9ù Ðw‚>­u ¤u¸:‰’)¤€4hÛïPc`‚epbJõßÄö]q÷TYïÌ"d$Ph΢Ós6¡ð*ãƒz8âEy¯LYï9ïl¯Ä‘¢.I¢.¨Pæº$T]‡ŽQ^G Š&Éõqy¹Ãõ݃e ­·² ˜¡ñ"6^{uí·©Xl”5Ú¡dµê½ÿ¿ö¾Ã-ª{k÷o¸Ïsï}îý¾ïÜ${4vEE¤¨¨InrrrT¤ÃÐËÀtšÒ†z±`WD± "½ƒ "Šˆ%±`ÁŽ&è}×oÃPT‚ƒÉá:Ù± Sö^{•w½ë]’ØŸ}bì#·¹¨v “÷#óÄíõˆßËOÌp‰O_š¶B–¨ï5ËmÃTÞºY.HÎÂܶ¦å”Ÿ?×pë~í­§9稼½§âJ (Ðm-¹Vzy{ ÈG×`Iw•C´ýJzß]ÇïÙ‹Ó£yÎJœ‹DÅ xõXÝÃ-9ôœ×/p †ÙAAž”–z¥¯IÇ Î5JâMaŽl©”¾{ìK¯Ä#ǰ·ž‚Ú×§}’ öüðHÙ"†ÿKìÆÊõN>¾h± VÎqÜ`$Š3†/ƒÝ‘}t«Ôê£Z"z¯E tæòüø‰5< ·cB¾M\©]|1¥†I….‹\`šÉ8à/É#rÎ’ ÜÌ.{Ü$Å÷žƒþ•—Tj_d¡ÊãÅçÉvVÇç"¨]O¯@ãûêÆf‹Šå½rnt¨`Žèüì§ÚZu%§ö‰OZ•yB‘]B¹cR•œ_ ܤÆjû¿Aì’À $ˆƒ‡lQh'–ÙKO,CVº6¦d²Â>¡ÂksEȾšäœ0†ÒK/g”_9xòúAØ%pP³JÑO»¹«¼ ¿½·øÒ^p .O´µàjJv£2óLðž*ÏÔÛ¤’_ãÊþƒÄ À*¶Ð.±”—Zi—Ri“\á–Z¼§òf:rÄâK@púßPl‘ÆÖˆ§MÄxÚ9Ptå@Í­Œ3wP¹‹Àyƒ!ç 9|¿_죧ˆ„ õùaÿóDiÞ`H¤g’t„ÌqDlŸ»Ï!¥G³lÝo£ög3“ñ•˼£V ËÑýÄ hü€Â3¹Lèü±E X=GäÕæ»®7D«Ž×å_j‘¨±UåØÇ!Xüx‰½è£&³º»?ôÃÙ"C4%y‰Kj™sj¹Crô’rx‰y6qy±ùkUù«•…ÖIåŽ+]7— ¶WˆwTøì®öÝs ‡ÏîÙΓâí•ü´J¯­UxGÛÄ"ëtÑê˜ó˜"ëØ‡øBçÄBǤBG´.SJp …uJ,â%WXÇäÄd7î?I¼ÌØaÑwÐâ}¶¨)h𚟪@h¦sÌUb(&° ïêÄi¹‰Hí5BÅC0G¨zFƒ>b"Œžinó²­w­ä¿—-‚¨Øµ8Å ¿ßžá 1òR¡Ý·R¢ÂRKÔqÈWȰ¤o¤ EnÚËÐJÃBV&>)DZL¦2ôŠXä:‡¸;§¸ñ‰êØy§Ä619T”$WÖü£º fp÷@[ì Ð`šbø9L™:: žtL.wL>éTe—XŽƒ—\åžRêŸë—k—Th‘X`–X„˜n_hWØÒ.®À&6Ÿ^Â}™ ûqŸh“|6^™@‰Sj©óÆ2gܬcé’Tì˜Tl_(Ý]³§êÙ"Ñ4,ÐÈjÈÅÊçö½Gp‰ ÙBI¢w:}èÞ{Š­7i¹ãV‹MÅ &Ec瑦ãôQÔ2èEîaß‹äF’äåž!}¿|/²Ø» d@Ym(‚î<îà¶ÿõ³Ûdk¡Kd æÌʺ#•çŸ ßzÀ|Cܘ_½ÿãŸ,fAi?Þð(xÿÙÕQÇ-‹‘籊¤—ËC5D®ƒ÷ma÷÷dC1¯?ôµÕ:' w UŽKrQzåumÁíÜ‘£GÀ5»ÁÀdNí£Œªf^Læ{ÿÿö«ëÿø—óJ‰< 5coÁ©¬*È¥Öª2ó’wÍòðû_?9~kíã3( AUÄþolûQ§IZ›öúcœãD?øÎèŠ äüÐiN!egˆŸßmlŽ×åcDl,Å éÇ'Yù.âcµ±(ú1ÐÄ~•gŽÚ»ôÛØ3r–KàXsW^LRÅ•ëP½é F=©Þ°”¸QwgGÇ‹ÖWéå§ ŒÿêWÏ «ø€Ë¬ùíè…{¾{æXÅØ%R©AQ˜köí\÷³ÈAÿø>«š„™"/¤JEË¡r‘ºÐO•Xl[¢ÌºB»†•ÃÙ¢Ú YŒÞWyóÐé;ûkny&ýÎ>à?uZêî›–yìéóg?Àð§Ë 4¨Luµ·w6Þ½/HÝ9'#]`>tÞi®Û14'_k¡_ÿ<ž–÷à`‰#h+KE¡ÓxA?Ic_¶aY ´‘tÌ"Ó-"…`–ï€â fÁ÷·V¨ç‚ÛN_gŠ55`n÷²r˜ ŽÍ‘Dèõ-eó—Æj.ì1ö–ccŠ•ÈÌ'òDY-½(c"¾“Î[eˆar é´~‰ãÔ¤eå-r[ÿõ?=¼B=2ŽŸ¾¶÷ô Œó±Q9ˆÚˆÑ)ÔÎæ¥–Ø¥:¤º¦¹'a˜Å/RI ƒ°Zbãj1#5Àø@ZÐûl‘Ù.A9ZFŒ„Yi‰+™ÔìÿÜ•{B‰G*̱xm\×öŠý'oîeËD Žn'‚º+õMGêîí?Õä³=Œ×ñÖ²‰kÝ×oKøì¨¦_Ø2’ f’@0L¢¢?¿{W|醳‚'a$Q®ôV­+ ¤WOö%8¢+‰2åGÎ÷ [èx÷%òEÒ×aÖ-â«¶u‘)@óêÍæé«Ý1*€%[K¨øUüà¿È›šÀZï¸ÏXsψÀØeÔÒ$cÚ¾±a†Gäĵ¾[¼ê€\Ç».Ⱦcƒ&nñþÉ2;ˤ~ËÔ¤É7ÂpŸ¿z±V‘0ÙÞ×H3ÍÁo¶›Ô9a'Ôc%çþÎßVižX¶&¦½> ?°Xžã&ÚÅ@ ^Dp4ÁYöx¸¡Xá N”ÒÌÎŒL© ¿ôm|sj(#뉯‰Ê—l,M¯¾ÀŒ2P‡n:{gSñUQÊÑy®Óx> \Cg8 ƒnµ¼ ­ÿÔ²š©ï5GÓCÉÑ}¸º~Œ ¶Sè"ÚUõƒ@µX¤4”F›XƒªAÅa¿ü¢T‰Ë´Ø3âo«ù»³K±›ð¯h‹pKoÛ°–¼ëÞWZý·Už‹\—A* =C(ÛèËœEʲÒG…@Œå^à,.Cj,0öRM°X7ÍÎ?=¿ &ɺ޴uwµ“ð9H$ö°f† 9!\1§äÚÃû+¤‘3ÜB—x)yÇÌv žïâo’Y–uöÁÁÚfyÖY^òñUª£fè—$€ÝXÂÛˆq±}r!PIêöpuY\FžÇ¥zìèÅY† @u&hñ+†hS*“*âJyq€»™Çåm.^¿«r½Ùçî=ÿ æèY‹ð tã‘/¾yÛŽÓòŠ×›î.rœ/ˆÄy\.¦ešXí¹TD}päúX¤ã¼´{¤vŠmáËž¿—wõivãݕ7•Ù »k\“‹mc Í£ Íùf‘Ê’UŠ"ó˜r6Ê<û˜<»Ø<#¬U9Ö1¹–*˜/ì8MÔ‰5Ê«èÈ{Ü!¡€¿±d}úÕáó[s/8yuño¯ ¯.lx\ÚÐRqñyyó‚†fÌ$äÖ?8V{\nløÙ\\}¤ÒoçqÔý–Š-?&àíæ»¬Ÿíè?Ç)p¾{2fd)\óWûèƒ?ÓâfÅt;?ÅÞãŒ)¯ƒÈH™ Ƀ3u[ZYÐuçÙÓÐŒünacÌ11¬4æ‡Ó™„³ðw‰ÜÚtÿ2T¶ íhZ„EV§±EÓŽ.h] c[wwÂÑ’©k$ ]ƒg»†N´ôù9 ¢¼ñ·×­­ˆæènÒ®Nî³îwÎ:oÇÝ§Ïæ9ú#ÜP/«gàƒ#Ük3ùS‚´ ·„yM0¬ Ñò°°X˜}Äñ¹nf¹Ív^?ß=t®ó=—0¹–‹¢¾—(ÁÎúÑ':˱ØÖ;zk˜¾{ø|§`=§À9sƒæ;““xÈáÿ¢“¡[ ĦçÃhÌQË;B× “#§ÙHsOÕ£™£ÑÀ™_C‰ ’H7mm0Jì¹ñàgâ®ñkÅ3Ý¢¸E|kéãšðôåK:©CÍïãëâ“h}™‘²EL]ÁÙ‘NÓ5¤ùñ£7h&ŒÌiëûªŸëbõy×Ïg‹Ÿãâ=gЏnÀ݆üp¯HT Èü8Bø`ýÀ ¬¤ÄÛ@AA1æŸî±‡ ž½@ O |w×+Õ~°6„É3­Ilêlmo+¬ko!žëe( X8€ÁÚÿ0}Al&øfÌú|kë Âmuœ¤}¦Ë2”·}¶ÈÕÑT¼ šo¸õ`–CÀH¦¨m‘Ç0 TèšT¹P ˜b%Ør4· T¡w¾êLÌšÒ@eÒ_Ú8Ãéj-«¿<ËÁw¡[øJýÞz ñõcy³aZ?ÙJœ^pŠJŽÏ.£=3ÒÉsF-v£v!d=ÈñïÈ?9ÑZÊjd »šIá÷›#Ì \ƒ¢ˆ^(ˆœnç#ŠÝØòêÕ;¬¥öñ®NÌæúKŒøpCr\S’6gS†´µmo~Õ83 *!æ’¹Š¾—Gü¡{ƒêhùbqìt{YøŽãºt†f8ŸŽ¨í}zŸ5êlñí»V¬ßîêh#úJgľ“ld„o3ºü20M´äÞ36ˆ‚•µ(ܪ¥Nëž¾|ÅêMÊI‘„ÇÉÚØ‚S¸BTº¨0¹e“DñÀÿ:ÞtºG¤N°ò%±9º1ä¤ÛÃiÿ€-²ÊI9ÛÉW–|Öãèm‚™hRÆ!ˆ‚ÀØläS»ÛÁÁ–lÚ=ÉM ¿DOE»~˜ÅrÃd‹Óý¾Øâ¼öÓÉ/R M~qضˆhn"·6 éh1ÛG6œÚ•ZTu3N ¥°Ýygê§ÛûHb£XCvöÑBê‹-þÙ65Ü÷׎ÑóEŠãýã&›ÉŠÏ_áZcØ+ºÄ`HF!×eõ“W­‹íÅ‹`¯E@éÆe±_lQs©¿Äè¾-&™‚Zg†Sø¢àWí´bܘáhÇ0pGMôG‹íC”Ä¥M²òY‰^¢w8ØCßýb‹_lQËm 2JlÌaT¯~öÎ>_O4ð§‡ÇŽA-M# Ë ùã›Û­íßšñõÜ{¡¯ƒ÷êk‹ýc¿ä‹Ã…Ÿ4FÓ¾»÷hSë™h (o• ¡O3ÕÖësI»¿zŒI4„ù¦}"Ù%~ß‘¯¬=L Æ€?b‹ ÷ùR»ü kŸa˜¶ˆ5˜‚© „ŠùB¥¾SÀÉ‹W€RÙAh!ZÛÃ)_ú}~p’àc›îÝûA¢šëFª_$¿ö‘0ýŇa‰´Žþ _¤K² èèAH\=ÙR”¶Ÿ&>;1 ‹ cdŸü`èmF clÅ(˜ìàCs}ÐÆ«Œ%r#iM9±µx$\Af sTM¶Ûà“N úw¼™«Í‰²0wÛøÛå_¯æyÇbþ7pÛÆàð‟OµíÈ^ GÏuôÜ”NŠúÑùm¶H¢'„œ@W‡h­ò-ÿý÷ˆ•²ðå‚`šb‘ÄÓf`PkQµè*)u`ÑîWfÂëÍhT´¬‘áeqMAJC)cDèïzÙÙ®ï4Ý%|™,z‰—ÜX®/aÓƒ4³Dk)J™Zð“Í|¼"·bÑl;4.Géc´Ù"yr$4~Ä™‹—"¶ë»Êÿná7É1x®k°‰[…ìž}ò A€­8ÞB»?R¦4´M„âNƒ¶Á ¢a©Wñ»°þÒD þ|·ï½‘/Fü(”¯`}qô"¯¨yî¡3&Z˾ã -TÇkΡ¤»IÀ¿œE6[¤,þ£)ô7o^Òk~ð4«¬6xÇ‘¬‹f/ûÊL4[]‚!b¦ð×PSQôÍæ{Dí¡™\‰ E&ø†´4¸õLÉøÝÓgÏ\"°N•F½„‘›`çÿ•d‚¥÷rá¿{wa¹ïÝ{À7ю쀿µ¥ËˆééŒÄµêk‘I>ѯŒRKjST]ßú¼áúíüšziÂ6Oÿ¿­òøÚÜÿ›vÍ£i¦ZÎÑë¹=¬(çªt†ZvvV7^læø–Þ[íùƒ¯…bÓæüʳ¿ß¸uÿ1fÇX9Ïp ÊF¯%ŽÔÞ«¡ZÍçxw!µß©û-äv=yú:«¨:zk:‰¡ÃÉ1’´í0˜³Ãû&´Á“ Ì®Í{m?\tåæ3´ ‘G2™MŒåws¢ÐÜW¡;dxŸ|$~j´ÅèçHs ÙD¹™î6 ìè#© ržlRŠÅLXÄ]ô2!Ê™ï¯V+oÕ÷Oýp:úª¶18näÊ%§J*‰}L±ì¬òC/ôlŽêjŸ”µM*–ùóÎÐ vX-9®@†+³[C¶NË¿îÓÎÞuŸ€9ÎïìgJ¸í*ý¤»«ô[7G";ÀïÄ•êãýÍÆ¯xÞµ/)Û‚*æ¤ì<ÌZÚÖgŒ5¦J…z²+s£ øõ³%½:*¾âD`n‰ÇGÅcDãq–ï äB$\|/]¾™Dˆê€Bä×Õp•lúïïoîâ çh#LvIQ Tl©rB;³²œ¤³+HÙ©Ã¥3D|ès\2.‚Ý“ô5½$ Ôt’•§Zp¥¢êËnÁ—ÑÆ—*_5O05Ó«1R÷J̉TDhÛbFws–` *Ä]E—9)d ¾nÄ ÁaEe¥(Ï!†ASÂqb×sŒ ëyN—ºE0+¦ÆÍa¶ÄùŸœÖÇwZ£f‹•(&bmzª9Î çŒkÞOðØézªÇVŒ’dë½`ÂO€§ÿðÔP €Mˆüz#ån ±ƒ”©+a²ÁQ=¸µævZ·€Ž«óð§b„š½¯ê¯³0[šÒ0ôý-Ž^0ãåî„8þMúÖÙû·¦â`ì­á|Ý„}Ø.ˆ#…tƒ{Sb#ÝJà¶²™otT][|Á$å0›¤I)N°q×§:Û˜#ž;L—.4@êÒ=ÃiŠI‘àÂÈê—E,–Ê­]‰9ì PͦGAÈÖe† X!ÿéŽÂN,ÝEᬨžuX7È}Ú6ènàþ¸_ Ov¾m_0ã2Å.lh‘Üý öUÊÝ;Ŧúi ŽÎv`Çýl#î<¸;1UZvl’š¼4ÏçéÑV‚r“⊠bš¹ú%tÖÌðL'׀ɜ“ÞÖ¸'f«.3-ðÑVGp1W½ííe¥óÛœÑä Œu_v¥Êðº¶Ý©ÕªØßvÃÂÖ›úÃí7"ª‡îDî$ž®DšÆïD¾ "wrgW"‡x0Ç¿ùRˆÜY”t%2PŸIäsHâb›Ç:£œÇ=`Õý2¤Îa; î$ªwßp% ˆ«cyr¿ §øƒÙñu*JI¥ÛlyÅMس(¾ÇTw=_RŠ…SWÊr0²W?ÖU®<»èý÷_ÿl¼ÈjdãK®2Œ¯ÀF–ß­sðk3Îe%ßCÂ~vå*Ií’õ»Ö¶K †_«¡Ì C>k¨µNU¢Å Æåk¶z ®jäv—¢9è4oWeå‰Pÿl…^ô*œ¡É«Dhx6„"oð* ¡þ«Äg|>|^iœžœ ¡Á+ÓÓ3"ô:ãtœ ¢á—¨­j½œö^åÐs–¬›û çò:‘×ê“}òÏas¾¾nÎuÔ Uš£J`®ï´Î|¶.ص8Ek¶ZëÇ›ðc°¹¢n=9ê*Ëf0 /+ëˆFV–%ìe\‘´ÐçÔÍKËú„ˆCóö>X,9v¢=ÃRwšã£ÖIÖSVË»µñõ­í!‘7 êWÚPfNŽ °?5…rsíã±y^ËÐ>ì‡ð¬ÍU‡ÙŽº:9Ë8^4öV~Ø?Mõ÷uÿÝÕømÿzà•EÚÓªb]Ê£3"·_¦¬Êä•7œÏqbŠzÝ ’¬¸a(1û­RúÞÆó  ÔvÀŠ[e¨l¡û3Žþ¶rƒ½øFñí?ŠïØ›(¨ZøBj-|a±5ZøFÞtÔWøÖCÓóÞî92• ŠÝú°½½Ö³MŠ˜™Wj,p‘É{‰›b–cÁתï{‚WW , œÀ‰ÂQ ? Š!nàÒ¥MS¥ºyùÞ‘Ê7Z½ÕŒ³ùœ8·½†3›šÎlÎÎÖЇƒÇØïŸN,¶ÂÀ &ÑÓ芾xºž7f ÷„¬É ²ÂѨMÒ8œ|NÌú©þ~¼ûñjôöê*xÖ˜õÒSÁØ ÃékLÓ³—¾7 Mo0¶ƒËÈ(¿~Bléɱ¥µS÷¡ö-좞µtE¶Ìç"ÔföŽ’;Qþù :c4ÁÜÙ·RT·Åa3Øf2°X ,ƒæ²gëÞj¸µÔŒ)ªªzñzxx«°Í¶š±‡Q è»îÚ*Ü7Ð}c2ר6¦ÌÙÇ<âÐP‡dhpn¯ÿêP–²Ê™¯ŸIœ9w°¦Æ”:ßòªþõç4Oðb–·ø[fuˆÁµ/Ý*&[lô²q8xŒž‘ Ë Oàdø8'ZyÓüå7T|?ÿóoξIÅ÷sK¢EÉoÝ~7ÊýÝc$J•MÚ c!H‘nÝwÏ™Ü87wý7WRöîbýÖF×?ð߃—ÿPKãy](3 ~8PKz½ç: styles.xmlí]É’ã6½ÏW0ä°o¤¸I¢Ê]å°§Ã'—£ÃÝ3‡¹A$$ÑÍm¸”J}š?˜Ãæüþ“ù’ÁBP ¸ˆ”¨¥Ôèî¨.a!™‰D"™z÷ëïI/0NÜ0xiŠ:’``‡Ž¬Gûô³l~xúË»p¹tmøà„væÃ •“tëÁDBƒäV>޲8xAâ&ðaòÚaÖéoý@†¢%äa]»“Æ|ᆭ];ã¶¥¾`Ñ}dÒ˜ïíÄ`Óµ3n‹0å»/î_O^†²úHݽY¼znðùq´NÓèa<Þl6ÊÆPÂx5Öæóù˜Ô¶‹vQ{¤•c¡ñ`ÉXS´1këÃtnËO)ÈüŒ;CRPYÕ(† j‚ÈÅ|ÙíA|Ÿ½¬:s×˪f{ âÎ|F—YÅpº³Šáð}}®Ö×?£Jòãù—_Å~×±pÛTvìFɤ­ùþaSŨ°“éêªjŽég®õ¦µù&vSsÍíÖæ6ðìñЯ µÓƨ… _0Ëtû®×™jÔ¶I@àv†·­°jŒÁo¤p2ŽaÆiȲ»ÒE£èÅ(Îà–‰Bž ãŽd,þ c,ÝcÜ囑”+onÃÐGOlw ›ÂÓ;¬ëׯŸa,‘ßñÌG?Æq¸IHÄ^\¸ù)|}©’*éªd¨´Ɉ¯¡2YÃek]ý2?½£ÊÁKyùÖ#Ѳ%@k±}­b­]{ÄÚF ¤LŽbDKœºh³¢Ux A–†Ið¦å:0¤M­Á(oefd}ä ª~%®yÕ#µ åE R½I»vÊj0Ï"M/û¡ƒïÅrº`UËmnà@ /ÞFÉSðDÈv»^ Ðvƒh £!0n&«hŽéªP›%PFûŽnd2¸z!RÌiœ!J–!Cñ;…É÷Ÿ\ÄFÒ¯p#ýú  …% h{yˆŸ]©Eä¦6ÒY/ vñ¦¹*q¿ Pt3JI™‚UV¨h“;Ì‚4Fsùù·º!—‚€Mô=üü=“>‚ 98IÖ3Ù&)ô«seõ»s-ð¤Y:õœòÙ³º/¯¯¬*§ƒÕaëf‡µˆ_¢¨èÛHSÑ¢™ª¢I-]Em eE¡mÇ£%1eÌÉË,UI ÄÎè€$çŸyÎ&*É\ø?'ô\‡*Z„ØÝÁû¥jû¥âœó¿QÉŸ‘Ä))4W´]w­ÖÛHb±UCÅ´Ô‰sKw\[×yéz^AAQRÌt>·íå’ˆEl‘ËHà4}‚Çà*ašâ ¯®ÎƒË×T*bwµæj(®kàMÙu†*ÊHÍ'0•_ËD–+·µ•Œ$KÅÑâCÜs“²:ßc ¾™‡ök6–™çÁT¢•¸íC#ú‘VÉØþzýï¿ÿ.øˆ{ÈŽ•ÆMÊs_3~D ðqë/BoÔG±RmgN¾%òÑFLRõ£H¥}Èž'/ 2û ^¨)^(Rã»ìêSð1®|“ƒ!„Ì›»DÈ!ë.𠆮˜w‰Ðt0„Œ»Äg6>wª§­Á2ïTOÏDè>õ´¦Ñäm)j®:?k›ŽL­n46:§¬0Áô ŸòBvH(—ÒƒH¹¬8ƒäÅű†´¿¦ªß’R‚œKÜ´i#¦pã:†YŠ,NX\™HºŽÃlµ–óËz"ß_¶Ñ9ÙÖסY¹¯ƒ–±ÑcÄð`§.ÞO@*2TL½DuóÞäè²çåStÖ”ÑÑ3 ~%«Ûò¦PpøJÂâ…ׄ§Š#¸¥ÁÍ9VHäÜ'MD64!|ýh (ƒU|K1ô\¸¬8f8dÂÅïÐN7nŠ(õÓÖúe˜{ÄÅ5 \9¶ŸêºQ´I_ïMá^nñëÌÚý:TLZÝ:G IEûœpæºãÅM\ŠgqÙA9ÒÈØŸuFÒ©­Ÿcñ¹sS©:ò\6-­õ?B =S&§Qt‰À†Ë„)<Œ!ôvªÛÑA>àG§¥oÝç««ÂçÛA§Þ½Ï·Ä›óù%¤Š™8 R¡8ðVFJ}S\ •âRdÍäB”¬c7øŒ?£â!cUBÎ;VPÕÊ0¿±Ä+„œiÊä.ª9û׎ j½¨·.†ÐìVCÎî5Ø£>ä캙H†yh¸³é†T t6»Ó€¡á‚Îæw‰Ïp!gšz§ŠzÀ˜3M»U}­ ³ÖH2ebWoˆÃ®ù=½5Ð3V­°í‡“ íSø+šê"v÷16táhô PpîÚ/Ð@â¥ü˜UÖÛh  ~´³ r1Rr4{óëÎêh óâšâdu ×ݵÔ,ðQ‚_õ»™CËWó¤'2÷ |j ħú0|j¼A>msgϧƒû‡Ï朔OÍøÔ†OuÁ§‚Oëøk2ŸšÃðiŸØ™ ¢­ËY]£1›„Ùä+Âl6fÓ¯3k Ìf_fó0³¾Ì’lQÎ=øE1¦aäÜÓ³A|×q<Øõ>¸˜¯È%"r‰ˆ\""—Èí\ìŠ\""—Èå¯uE.‘¯5¼Dä¹Dn+—ïZ<êõ±hpo5Z\Ü ‹[á7-þ¦<âø/Žÿâø/Žÿâø»‰ã¿8þ‹ã¿8þ‹ãÿ›?þógú·¨-’vФo$P›?wËþÖl‘l”NÃ?þ¢~Òq Lé+Ò"é¬uè!n•J4ß‘P=jD’`á EX,3ç[ì3Ó`Ÿsí¦©Êd2e…ì-oYUt#Ï yÚ4¤[5óʓؙUš~m ®1‰} М,íÚ@7‰q»<õ”7í“Ú[ܘ_­»°é†2ß­9£ÊP&êìd¹èž¦åµ «Ó4!ÛØñÞ÷Çåq®ü y¶Ì*˜éQú‡guTÓæˆ ¬rq—« 2Dã  úœæf`¸H釱»ûŽKüÅ~1pù¨¬:ök$^» â'Å›8%òµyž5±‘~‰ubƒ €~„V GæD¨ººŸ¨’¸%ÿºY"g,|aÅ%¿Ë¶•ÛÀ‹0vðÜÑ9ŒÑ¼*ïˆõšWIG9n‚ô×VÆyùvÙºk›,Ã0=Є ž¦6?@Ô6t&§.É2Z›­‹>ä´«bð­LÞb§Î°ùó¸lYËüÔà…ôp”—bòIy7æ?²:™ëã»o!ˆz+ôµ,ø*¾^¢ÉÚt¬øÏ¡ÌCXª‘HŠ “ÒÆu˜êë刚/²ßÑIäHcz`úél…Á, fa0ßBÂ`³0˜…Á, æÛFHÌ] fCÌÂ`³0˜…Á, æ[ÄGÌÂ`³0˜oÅ`6Eư§…=-ìiaOß$Bžö´°§…=-ìé[±§Çˆò $8Y+%o¼z`‹‹ðwŸé˰Ô§y\ð„êëw/òviÃ^ömlj#âÐkiáCd8ñ\I«ñ>ð<ß–L‰.§IiJê$—òÎo1ï×ã”Mìämñj3I“OšôI×™¿€ëI»ÖaÁ§¥²”ù|¾Ÿ•jªÌÌ¢GÑs¹­tÅšÑÞËÄh†—›Ž¦)æÌ¤¢ri$TšÂèB#×-†¾4àmˆ/c$5‚Aìoá—ò÷â»Ïq®hš±?Gü2¾ÉÍQå¦H~/ɾí$yÑ„LL^ɼák¾óDùþ°7ѽÄtô…¦Ž˜*Ú=l¼ƒåˆôÁ!B\cYÓ.8™¤ú@¥ïCU OpenOffice.org/3.0$Unix OpenOffice.org_project/300m15$Build-9379PKz½ç:Thumbnails/thumbnail.png½šuP\_ïï 3¸»î>¸$H Ü- îƒÎ`Á!$Á’àš`Á‚&h‚ îîÎã÷jkwë½Ýª}Uo÷ŸSçTî:÷v×ù~úöz¡©‚‹E…®šª¢€§@;ãqÜÙk±<5E9]Xæ^ÄDwíº¾1„sà .Z{µìõ„ÿ ‡É3ô4…fßñæó7nwƦ7Ô¢5sÛfMvéNÓ{v,vœÅKÎ<ŸÂ–“×ã9x;™‡2OàHòw3@aâ£Ó£bö¾H¾“Û… ßÿýÊNpÈëµd MnN\Ëw½ÂÞ1‚À¸ (²TïÐ B8@î52ÆÇ  åYþÏlü*‡&û9=¤¯¨„s~Ëa÷#Æ °©b"©*u&ÿWáN²n«Gc¥‘~´mœóVÒëøVðÁs–†*â ÉgF_Df䔨¸Ö|V0Ùôwõ:.þý¢¤äÄqF’*iÀ¤(»%=Yƒ·l4b¸JfÓñš¡9Õ5°r©y½6OºwG·ºQqLQ2›ºÃçüŒq†Ç3t,ñ·þmW†cFƒ ¨KIxÅâÚV´ÂžA£¥Gzæz-A#–&omöåŽÕƒÐ}8M@ 1;-š^+ Êÿ–¾³`¾WŸóé3{aÎÝÙWE_ß`Ì+†7½0äÖB*º&B`äÛøWAà÷m×ÊÂü¡ú¢ô·äV^´Îc…<{D(¹ìvëÛ;Ï.ÒžUôvuáÒöÝÓbB‰åFÛâñî¹S¹ØLFnc¢£_¤$ȼ²ÔGi7^{²µóëdaƈ¾«ŒbòìfcñíùÖ_Z¤ã}~ÕÒ¦Ò*\»F3‚x+…b $"ñ¤¦š™*Fsã)r@~ö&å=|‡ÉŠn@°’'Ì‘ï‰ïˆÍ&ƒ>\&¤Õ›È,hsê ÜË× )~eÖÞú1Jª­´@ôG-¤o~¸©k~ ¥qOà8Æyùç0±j[zôxÊE4‘¨i‚s£ YÇ#Š­DõÖ«[OˆÖE£ ÍG¶ûÎP#„{g  Oæ-‡°/_}_7·?2~•îW¯åSÚ ¨„f4Ôê'7‡pÁ~|ÿ¾=‡úç³rƒ‹á³?þí½¬årû̓qlNß­g£ßY Ô@ÞÞjÍ º" 0ö&Y³RŽ•½ ¾ÚDÓ¶ÞÕN%TŠ3\Ï6^öì ^ ¤zÓƒgÏP\eq³Êˆ‘ó.{ÂùJÓjòÜŸì’Ùøä(ÏŸ…l 4°’_ À W¶ð">Lɬ )•Žª=&Ø>b¼öL–Fâ‚6Z½^Ñgᩨ–p¼ˆmåú—û,^!ÛŠ–ÏÙKܳHÈ RÓÞî…²ž^^ÒúÛèÏŸ’ݼ¼Hæ6ÙÚ§}ÙÛù3†¹¦RÆêcŠàow¨<鞞ŘbUãkû}ºtX®x™WS%~ ­¤µk”ÃÙè ü‘>DûÀ6ý<žîÐ…Ì ±”0;5”öö‡LõÞ€Ì&nL<´º}©×Åçó';Á ‘'8>:”™Ú5¶¼t]^Ub›Zv†®‰Ь¯# ’†g’o¥Ý”—¬¬O˜l…­€Kõ“± 1«­tÑjÆB"ˆ›ÇGLƒµ–ç&I¤è®‰mÖNò´*»œ{.ÌðO» ŒŒb¶Þ·òQÅ})‡â£sU>Õ<Ò\ÆÀ¡å“Ííé¡d5 öˆ:‘íÕš ÷~ ÜFµøà¾ð­”}Ú»ÃÎ"fƃ”ŠÚ\«;±Y\0o³xn®k¨Ås„ÛšÁQ^áEú+{®SN5±ýÖÌRñiÛ¯ŸÃ[U“u¾]X0ƒ­u}ù©Š˜þ$œ¦¢\(¢ëiÁú"žDÏË 6¶¬Gi‡8RsÐá òTPØ Ù%;!ª7ݼ"Ï­ûòÙ2ð¯Z³ +F´‰ÉúZO©åû³MzšÓç–ñ“Ù˜xNk²RÞF›b#b R&ªõ g)H‘é¢ì‚ ª¹¯³±F›ÏYw¯˜‰KC#Ð’e0‘޳¨äl*™ýýû]™¤¸æ6uŠßôjPºs&ùD?)ZâìÍAÃ’~ÔC¸8—â¡«GW³m) ÏW9i oCL±Bÿ&F± ¥›gøWº˜Fs-¦$?ê‚L¤ýרø™ ^ˆ¯’ÙuØðXÜ຺»FÔ;8|?ÝgŠÍÙÀ3wÔ þ9w³W|c)Bšg\HÐ 1x9ºPêX‰ú5¨Ÿ¥zº?¡ƒƒ)àÒC÷¶YJÝJ=¶a”­†j>*|•[ªúbôüm ÏB%úºÛ¼>Oh 7=¶óRËüggpÂòR®(ßQâ˜ÿ1Í)î~Œ1˯È|öM÷züu^îsôqêk ¬a»Ól1ìû…ì¹K@¤_¡–¬µ²F›÷úg,jR!ŸŽ¥ŠÛf4sø’x´}Ðd'D} õ)Ö¸ -¶´§Ä®ñ'W{žÌ1ffWöHP~îvø‘‡|Ÿ–%1³^°¡Š9š›}.ÒÕbÝd |waì'A¶Sè õ®¹(ù¹Œ2àŠYù~ŒóÑ"¾ñÜÁN½ì{VLgºøÇ’"9\T©h4Ïÿõo áßM Á¬w-n¨§7`Ë–Ž¦¡ˆÅMöS5‰*R©ŽNqƨNjÿY*ŽóF¨Ct²Ö-"!EªqAà"ÉOq3ï¢ÕÚž©É~Ì—·Ë¸:¹·Õ¾ô@AŸ:fÁUâÞ¼@½ËþíS‰¡»¬æ@éR¡’’í[ŸñX#êÜ·Oì®™b©IBäZBŸ×ç4¿>/V!d” žÇ–ÕKM“«0nÅ~Ò§$Ôu9a‰åpgo)Ötõ:þµ„™ÿA- ,ÀÞØë]l€¢×…guãGtZãõß^/(¥¤æÆÜv‘n‡ã¢„§·;›‹£l„KÖðÁµ¡¶¢"0^]+WHQ˜znÑX¤†š? b8Ašy ÕQÌðÊ|4¤l|IñÚ ÃS61¹»…ÏÆŠ×'“Åjšã ¹ªçaZ_ÊæK'UlþAPÓ»*þ1¯@®#ÒOùJûŸÛ½„HŠ/wïªÇ;{ùh„›ß¦—I,¥;\…¡H}hÏühœEj~ƒN;ú?A£¢h¬x~ë¯ÏÀ%r-t¼æ}ÊÇ„ƒ¶ÙˆC6'¿Û$—–ÈÔ°„Cù!ðêš]ŒS€î²‹H ¦Ö…ÝLÒòŒ ZYÕB RÚ˜ª‘ ƒû¿ìÌû2ø¼øÒ~è0sÖ0†Èkù(âù¼dmMϸ*ìÈ騩ò·Ï$2|As0—µõýøþC‡`ßÁ©%åìhR—x2q”~¸r÷~µÓ4Þ÷“͘øò;BòåAùu˜Äo×EÅ®\5w'þ3‹q¢×«³ÍÚbDÜÍ‘j7ªˆdk÷ÜņÕJ·ûóiù!ãVB—,ògYlsuZžuH€Ý9Qw:#g¶@ –¥JG!é·|@n¢…ˆ¯='t œ`ÁžŠ>[­„˶ÉIë©Udõ¤¥ùÓ'U©â< &ùé}¿ ˆ_ämÓê)KDíñÎ>]9AuÇÂÆîqì0444 -,ZZÞî¸þznåÁ„ßQú­³ÓˆùÐ!™ÇnŠwÇ_ä íKç­_é­¥IÄŸ©?ÓíN—¿êû@JY¢†iÈCX[¶Âþ\Æ8ØÙ Pú‘‘«×}¹þæøŒœÜùþ7©’Gè$TØ®—»¶»&M™QŠdŸ.ÉwØŸ¨ÎÐ c!:äxq£qõˆ¡<ÙXNËñFØÀÁæ7ç1G5Éw«NnÝþ…]<è«Í¦îFC›šš0Z[ŠúÃòòð—aÊ"(·ÒUþ{ÏÎï›`B Ä6Q±9EôBOÌûă&OL÷o.Ks84}äqqðм¥sý —ÑÉÔGýȈØÕi`𘣓Ԝ¾ó?W:W^„?j€øÝ1ËeÝ.ûÏžXŠàCLÔ{FȲÈk#€&‹æs0?~ñS™Y¦©Fòv´Ü‘¾µ^Þf@OùOup‘¿y»RpÛ#ót¡Ðkùˆ}j¸æ°ç™º’çKq™UyŒªf­ØW¾èbÞ‡\štÒæ¥KÍ$JJ)üGV†mºsÇOY¢äâKKKaÊ£Ò ÖPüÇwVÉÿ@J—7ÛÌm#òe@Aó¹ºy}è|wª3Í5Ï3å«úâ%‰‡Lþ2T%bŠÛ•†}à•ÕZfÄ´JeÄ K1çN£Î¤n³m”Mt-Í•åz>Æ(Ɖ÷ÁWeæ9Ð Q|N|†XGGºÎtÍ4¼ÅÇÂŽv]쳆"vÁY&`=oä•%^Üš„ÄĪנدK……)ýC— JxùÚ¦ê§?zI-€%í.‹ß'æ÷–%çú/’Ÿ)ô–`Ò:Ê(§‹ ‘…,Uç-/1|ü¥»a=PÖóTù*õuÙÕ•極ñ3ª©Â¬nIk«vZt³ÿ ~ÀBªPˆDÍÍó_ZC÷õë+®ŠGú®íféÄÄ—•1lĬ/ŠW×$-;ßß«^'V¶Rá™:Jtˆ‡AKƈ êÇÂ(œÃí—È¥.š›¿*ð“O¬¿®òÆ0–B—¼u&%©ñböåÅ7ëÿ[Þ+…&6ç‹¿PàÙ,D³º“ trcŽó¯ È#¬àùÙÕþ ¢ƒ á»–ÏÆ¢-#«½ðk2¼|ÌP4gÞŪø&õy}l-‰’\JS ü Soê»™1ѯE .º /ÎÃPPq1e'$EË'¤V- ÉÀñz}?¤«ï%ßeC³X½7D<œkpáÝ$ýª-Ñ®]ØÕªñYχhÈ£Œ‡öaÑþ@Iç¥xž)jjaäCI{YoHƒàØAˆï¤ú! (K¿¿±nùVsöŒ×Ÿåî£XQÿO1TY€ê›É±©ä&b§’ DChñuÕ7áߪÁøÈµTŠ[J@&FÆÝ½æËÐë·û6éñ ÜKO¨-§×@] L$ãË\ÊÒBƒš=÷¶5’ðO y¤÷;ºEï‡6ÐK¿`LÎ!Ÿ7ûIE²õ…?‡éï8¼ ]ß´uL%휲%3âúã TvËtˇ0IMZåpÚ¹Æ~è‹,µÞŸkÜ~ZÙ¬cÛ}ã¬_Ç:³-ÖõeÜ^ü²p¢Ü¸~y}8Ã*ëîò¾j÷îÉ»ŸiÈ©­zָК*tÇ!Ö4çÝ,„ "úk!F Hxl¸Ó꼎Fá)±®A‘˜õ1ÂMë8EÔ›Rbâ€Ì‡bu‡ut×IðiuɧuTŽª8k‚‚ (xí(K ¶qãÇfÔ¡,Oêáé±@™y](®üÍù^c“™TóýX ~Àùûí£yQν•.xŠp+çÛ‡û»çðÕÙz}i)©nþ«Ù:'1ÿó2‚ülú†Ê•j2”šè Dd5cнUU`»Û®çvx<ð-b0(EStPe3®yô”@í»mvŠš¾Œøkþ¡ŒŽ’´„É()9î´)[MÎ=èÄ\, ¯åƸߣȇ{ý5߸¯ÛÛÛÅ­-Ž0§™*K¯>†t< e@Ì–mº k!úX@SS³×43/V_D¥ýYN/á VžM§Ûgû~Õ‘Î6^hûô‰¤úþ÷sÞ£úèàSw/L‘• ÁÑŒ*v'›´áÍù/æ˜Wv¼“†¶‡†3Äè»Ø– ü@ŽcùÉ|8œ{Pꎽ [ç ó9-·¹]þ\fâííÝxr¶3õe‡eZ¯uÏüá:Å`ýÝàǯøôdÿ۴,rYtŒØ¸¹q‘ðiå:Ó}Ü'kÌ ñÐ.â²àM”È#42D’î $½w#ç2žr&pÖ/Ô:L»ï˜à4D~Z›*7V}ö¬ó³ÚǰŽpõï½N‚ý:rNÎ^÷s¡k¬>v_À1æt¡Lß)›c¯xqTv3è¯ fZ65<]6bjá9±‡úQ‘t/K¥„.B.í¹±â~å)T7èy&;‘5È~ýú5úU —Ôв ERy—'ŽŒŒÌÚÄEB¼œícöTÑ×Û\§¼à@cŸÅ—”LÁëö•ìììüyW4[ë _Œ3zžB-‹‹ºƒÃiIx¾bò ¥WK۲݋³F'PÆ—9¤­ý rk4ëF>|Ã*öñê*]XM¼·$0ééì<¾QŽú¼ea\z“’†Ê]Mdk Ëy‰ç¼m‚m± ü>ସ0»¤ÆDï_²¡ìsfO“_ßs#JóŽËàÔ°S•’áUïMþÚtš®Éð@ǧ†Â0ÂJdêIWlN—Îc…Á4˜“”¤w›•VÁt—°¸»ÄÜ\L_Ä&¦Ñ“®Xµ]ºs+p šŸâó=¶‰>Ø#ñ'F¸»b¬à}É,"-ÖßÙ é½êéfࣈ5WÚxÕª:ÙTe°À€é4U–Æî2 8 ߘ4yÇùb¾7¸Ãü+¶¸!h‡æƒÝ›? íˆ*À|aàŽýäOP©6Q˜ÞLðÉdê?jýÆþçÞª pA ƒf:é«z7=¦FÒÂäÉvðýAC»YZWÂð«··Öêaì]qÐ_ŒfLKÃKÏ%33³† ;‰W-âxfK£+Ho×PkvG“«¸—d¬£Æ‡þKȬUÊ‹g›ÖÒ￯޸‚`àªÅrEuU ·ÙV yNŸ¾¼KñU«Ø3©¡Ô0Û¦˜ð¾Q=ü¨Úóá»Û Ñ ºq‚ éœPò›®+wGó";Lþ‚±¤ Úüæ'$ʨçœ@'öáщâ#¾ÕxIËš7Ýý³™¿7ן"¸”?Ž/*°@zyZ|ÿcƒâÜ Šó’–R‹6|{ߪSÓ9ßs)>wØv…©¶+ ~{kç…•FÝÕê£Ta©òCdþ¤w 4lx…+»Q1kuæMFs]×û­“ñ£q>cÈ{¦½},N‰÷`œ9¿Å4©³z˜œR?ç¾R/ÊbA2N¾g ;Êë˜áw‘ŠyØ»ßa¢¢ð¿W‚ð¶wüB´µHS°D«ü.-×Å…³£Øy€ÞµÖP@#´Nßeþ•»$ÆúdêHÉ¥¦¤°Åf"ÑÙ3°빿}ûÆÿÔíI¯²Êâñͯk$Ô¢jSvõÏÞøŸÞ‘ýÓ£²_f¾Ÿ–×—BÞÄ“BÚk£$]ŸÖçþ•hª2¯/ñÖûS-û!Í’Jý)ª1G'2(†?1±?%“Ÿ_gçœFv׺%|pÔ~¿Êd¾.½%fBÀcÖò.S¾€/h„Mmpiuoà³BŽeÁcô3¬P^ø© ì·0ûÎäfˆ[Ú#Ð$?¹m ¸îýÔ Y%ïXÌ%—wó‘„}_ ½CéðO1¬"‡9¸ì!5h&ñÑͯqý_{ÙS0øV}ª˜•ê›ÎÊÜ\YÚíŸàÉÙ «•àcO?ŸRP?a3ù?DGJF­™Ækâq±‰*‰îÙ+*ÇOfñÊÎÊÍc왘ª¯>C$µ²Ã>ųÁ»ì½-Võ¥MÍ9ß)É+6,‘ݹ7(½Ë}ïÚ .h—åÙ&ÖˆÀùFß€É Ì:'éàÎûï~Þ‘pï‘aiG¤Ç?7YéÚ/L–ŸT)¤Ñß‘€²kAÔ;:§geížÇµ›ÓjPkN<1"@ü°8Â{Ë…Fxt 0jPK´Çk_Û¿Y웂Kœf/º›Ï ‹Ç¨#÷TF—ŽrEv™Y¹44Cš #TIðâÌÃ’¾±uÈvDgŠ/ÉéJ¦Üýé×_˜òRu§Üc,ƒÞß®3“­ìXèªÃvÏÂ)ÈI#ö"4»Ž?¹>¥žm“\‡ßS¶f Ç7ÞÁ­{]mnå‹$(%XÑr÷Û¥}BÏýÅ´Ã ZzkÁˆaø.†Ùr ½Ò71Yf«ŸÊ®Ø7Úrª[gޝ –lžŒ«š-Ø³ÍØί{QÔÀDdm³A¢AÎ3YÁÜmÑýaá| ź¡Õ©‹*@VÒΣº’Ís3* 2~54ç[ò¶©?-{h‰Óæ_Í–0¦M’+0€ªX„§¯ÄŽ„z¡n…ÿQŸ2U™HŽ"¡Þ ‹F³ä}á*›^ŽçšgZÄ@Þÿ÷Îhª27 ÄL!7Áû²¯ÅøBŠàTåšöÃS×µ8 xíVÖúGûkOÛË@9…îIüÚsàûiøDÏûÚSŸ^UÕ|,Ðãþu`yeeÒHþ²P³ÇØ¥…ÅPwvv–šƒƒv¹‘˜˜È8ù™ éÌGÁ;´(3ª}VbP¹ì§«ûé‡ï‰z†.™8&R~tEÆcÙⱜ¨B·ÔËn‚üò<¥äQFU54zÓ|¥&à&ñ‰ÊD{»ìêÚZ1鎞I›Û ÆÏ­ß“u7PÕ¤ÊpÓ3·q]®VŽÌL.ªªsÔÑù ᶬ8”)N\QQÑ¬ÔæÄÕౡ¹µ’}•foñíñ¾:F³è ƒ€!Âýtç‰Qé š¯Z9ñö9u½¶=’¢›)f~jå O™.ìðîêdcvÛš0ÌÔZ”*ìÜm¶V—%î¡Ü½T¦§?èL%—§Êmxýœ*…Ñül V~ý¾ H^Í)$BÓÝaxŒ®6à5R…w-I—fzþNÉÁÙò«ÿ5<øÅR‹Ûz_+“ÿùO@MIS±BÞ"äPKdvaG PKz½ç:'Configurations2/accelerator/current.xmlPKPKz½ç:Configurations2/progressbar/PKz½ç:Configurations2/floater/PKz½ç:Configurations2/popupmenu/PKz½ç:Configurations2/menubar/PKz½ç:Configurations2/toolbar/PKz½ç:Configurations2/images/Bitmaps/PKz½ç:Configurations2/statusbar/PKz½ç: settings.xmlÝZÛrâ8}߯HQû°[[ÄL ¦Ì !\ ™äMØ4‘%—$cÈׯd Àad¼5µ<äbKçt«Ûê£6·_V.¾XBÆ%w™ü¥‘¹€Ä¦"ó»ÌØjfo2_*ÜÒÙ Ù°ìPÛw!Y…Cø…œNxysû.ã3R¦€#^&À…¼,ì2õ ÙM+ï.‡d›++ŒÈë]f!„WÎå‚ ¸ >]R6ÏåK¥R.¼»ê1È%¡Á§îÏÙ§µ)™¡ù©(›Ñûó)¥ïF« ÇBà †q•Ûü¿Í]„OåRc³6u=ióÿ°V€ ÷T5vÏëíÂï…»©ìb» iåvëèæW èªx_l/+¾»Œt½¼D0xÏ„LÔ¼çLWΘ ‹z™ÝM±öäMDD¦’½*¯nsÇ@¿Þ…3‰þ馘ü 9b…^¸.|þœ¾ Ñ|i}á¦p}²ùYxYD¸‚Î! ¢ƒΑ¹ÃÖ§X ƒŽs`&LfB¦¢ò"¯·-†œß®Çü”R ÉTfs˜¿É(9\ãs wøˆÏ¢Š%^0?!zÌá`sDxz$êgKq†ezœ~ƒ¶h2y1u–>•Q:Îô±ÏÛ€8r`búªÔ•Ԙ䣆ã㟠Œ\D€€}Š×á²uåa*º¨})_4 ]o޹ÒÑ6]°–…ïpx}U•F°u¦’;ùss§gK_n‘ü.Öt©ý Ÿ›’û9TšBîÿÓ4Ø£5Šé±‰É“}ècÈÒ,8j³¾—…ø°T.(“ÏŽæƒ3‚XniÐQàgîð0¨“ÎîUEóíN™FåªS_±†‘ýjÁ•h8(¶È'¡ j @æpH7‡Šk„‘y²! ¢c¬)”Õ²¨„Œ`‡™îéšé³ƒîQqásàªÜ¡~¤:ÖÔ›ÿÿ#ÉMÊG’k}!^£€qk}ÞÐßÁãmO†Þ”Ò8ÖpmA´CŽ·:´ÒáÑ_{¾ ”¥ÈQ‡„†â.š%Áñãù?ðã9?:<ÔŠ¦A”Œ=0&©!=ÝþB©ûH"ÄÇ å5ââ~ß!îö¶•=€CqzÓjsÁgaÝþ•î•éyx=æÕç×U$¤£–J…ñ°ÓYùó/_ð÷– Ç·%ü’Ó©«”1 H)ÉjÔU]RÕ´$åYUe(Þµ=³õHë€/´9MN8>’v$¢ÕD¾P÷ó$Á´S|®·ò[ ÎÛ”¡7JÀçß Û@ØúÏîB· ßCFL.óªï[øiì:<ìU)}Å0.ô>Aدiœ‚÷9>ì§'&‘õ6nÄ@eTZÖ7‘øH)%w úP|N‚°Ô('RéÚ„Qƒ3ºðè |¼[Ÿ‘@­N/­÷!ƒ…0L7‘,”ŠýªLÊj©½ŸëÒRà !p(Á‡êã\}]yúœB&Ř "ëšm£¾Ôts¼ÅÈwÝ´ªPñ0‡Ë“¤SÂBÖ‘2F}A ”.XïN»¨cd婃b_¹™ˆ2âéÛ±,¼«b^³Í¶EAá ú_ÖXAûŸ\aôêãUo`þöŸA~2¿yÔ®òÖø£¡O¦ù`âï>5Íæ‹šð:•×Fn [Mãyd®j¤ºOEãåk§ڦѳùš[’×&¾#Ç€§’ߟT—6®ŸŸ°Qs{K»…±ýf¬jn~a»Ž7u‡ @&oN+§dPz¨A·nòÓû6-¬–¶;Äv{HûVÇ|oÓÖ¤ðò”öï;.þöbA WÃFo9%C Ã…ÓjÜ[Mò2éyÐ_[­‰á´&k鋿 ´XÂÉæë4¤†)Oc}]ê·‡sÍFìØs¤¾’ ε ëá´Ö¯5u¦Lîè»E¹¸o’UþPKÉ áò‹&PKz½ç:META-INF/manifest.xml½–ÉnÂ0†ïñ[Àº–²V0ZÊ“°Žã‰_+Ÿø-`]KY+-åIXÇñį€ŒOü°.€¥¬€Œ–ò$¬ãxâWÀ Æ'~ XÀRVÀ FKyÖq<ñ+`㿬 `)+`£¥< ë8žø°‚ñ‰ßÖ°”°‚ÑRž„uOü XÁøÄoëXÊ XÁh)OÂ:Ž'~¬`|â·€u,e¬`´”'aÇ¿V0>ñ[Àº–²V0ZÊ“°Žã‰_+Ÿø-`]KY+-åIXÇñį€ŒOüxt pïÎmzpÿ.Ý¿Ÿà?s¯{îáå}æ·anŸÃYß Æá\ýQÕ· (í7oRùÉZòK) §Ø\Ê,«2s–ªv²¥y;")6§„Š+OЕ–ëôàŒf.¦µú“¹÷©íF'Ír ¡1óíèõ9Ûh‘ß²ÚG®6›±$¨£«‹þºÙ‹Æ¢ªÚ3Tyªžâ÷–RK{‡팼ªVÊ8òž™…Žø]im§¯6xÒ»Kœè½¥ÎôÙZO²K¨ àŒR-vÓðÒöÑómé“Uîtùz»¨|¤éuÍ—Œ£ùé>æ¹µ´wÒ÷[¼é½eÎôá Wzw±ÍØO¶±Åt¬®QŒÆØÙ±ñòUš¸Ê €v¤‰«ÝéÒ5n¢óÍmyF·;+ïzêÞZ:$]?Xî`:ѺˆòÜU@·oß6<œ 7…&Ó› ìéýe.j0¶Š{*O6Ð…f+eÕÈ:¹¡[¦Œ”Q Fr<(Ü$Û ZšC'Àjê¾T‚™‹-­ôÑJ܃ûß?QPÆ£'êèòÕkC7X lÉJ-ð¡XÒÌ‘`^cʸµM°\E™J.ðN!ûÈ”¾©ܶ’mõH̦·:ˆúïƒÕ¸f;ØTe,=t’.^1Œh}I`­`´¤?ÂÇÒ{û-ðŒ¤q‹ Œ¢0«ú³CýæN¾©¹tK‹]½]d̾2PQ'ú@MUYôźtµ­C6>§Lü=°kd¨D¬`ØÓÅw©6nwÏ-*;zš(šËÀžfÀ܃ruÀ.zg‘Šº©Î rKèíEvô‹c}»%lÜÃ(xO>¥ï?B¡Ù…P‡Ó‹37Òólˆïá–Ì6ƒõ½}ç…ìΣ®î^ƒë®$‚ܧƒP‰ttÝ÷Œ i£ÂêFO Õ^*¥ªq9»[óïËm§ˆË£¼ºzzh}Pýù·uô«c<­’„¾PWO7Ms ª ¦ro-¸ÙƒÝÜAßo  é®ÑdŸPJvñ%´:4‹¶ÅæÓæˆ\Z’E«‚÷ÐlxúëÖ@Ø^0ù¼yùz+€tŸ<â2é’ZÍal$Ç›ÎÓª€zkþ6ZêCm7Ô·X6…V0ò¦;ŠVRHåu!T^¯,¡´¿!”Êê‚ÅF|TPlö3É”{Ò…òN¹RJÕʯÙAyÕîãâuà¾öw¢èò”ph.íªšOÉGÓîãË(õÔJJ¯YKé§×Оºõâï‚3n”}Ú–ŠNù ÍÚ¨÷éînZ”@¯ÏÝ&¨Ó_¦n §¦n¤µg?i¦º¾Šâ¨þQxø$õÛ@íAÕ¼iÞÎD²/&¿ìãQXO±¥MtòBuß¾Gwï±±›¼î¡‰®Þ{tþÚMÚ_s‰Âr+i‘O­£»ø1–8 :@Õ°«míä±+›&€"3˜Y*;Ÿë‚wKz-ý602¸ÒŽ/¦¬š•”r| í>Æe)þ^F)'–SêÉØ|«)ï¼=•µî¤S=ñTxjñƪ+¿ÚrjWS*úO>²HôÏýfÔ®£üKÎTÓ³›öÕ¸UwýÚ‘/¢Œ£ë(áàl¬ÅŒc1¥[$Æ“v|)¥XJé'—QÆ)Œ©z%íÁzdÕ­£œÆM”ÑöwøPå­P:ÔLû/ êå!Y¼€´|zÙf3}°Â›Ú…>^ép9Òü¼š^™kKiåGt®Ç‰3çèûÍÞôƒmÙÆQð¾jJ(?G ûÏQLI#E5Ph~sêÖbÓo¡Øƒó†ôÀƒ?v.…vUÎEߨ)ÌýäRQøoÍÜcÑ÷]6Ö&ÿ‚U´ûP#eR}o½;@Pª(Lñ±Ábö©'”®ôñÏÏÚ"(åÖˆ:TÓDç „?Þxž‚2óiÎŽhÚSà5Qâþó FÕƒ"ÖQ$üš_Kù'.ñéRCMu?L H§ ¸¨Ÿ+íÝWt¬níLÎ¥£õgéìÕët¸î €–-¤¯L ?ÀXß^hO3Ý#(©¢žöU7SPNåy¼,<šîNiUM”uì^ u䟒O½·z­”Q×Ró0,X&(Ÿ®—~B7@òë¶ÒµîýØl‡‡äœô8ÁÈsΩ]E[i€˜uz耨\Ã}u[èz÷!jï=N‡#ÌÛéêÚg`ØýÙÚí lÖæ¦¤Z_(:øÊü‡;UÜ ¨  „Z€Œ(âïÕTõZnôÐí» xwP÷ût ÈûÆd+гé}ü{¸A¨Kxl­Ãcd)ì—À&”×PæÑ (É+µ„Ž×Ÿ3³t‰ê°PFÞ˜©Çë¥ ©8/é£ùØlÝTCƒ´Ñ”7=.0 áLݪ¼î,€8ÊgÎ=üÒ:ݽ ÇóYzyv Î,¤W!ÄaÕ„†: e¼ ½³Øžz' Æ–ÑA Äw*6PtéÚuà,@ROQE§iWùiŠ)„Pgߊë™z°ž Ž_¤C -Ôpå&]nï…ç–šUÕ÷˜Píå6Z˜JoÁP€íaÇÁv[ì^Ê+œœ{Œ¢rö[<å -Œ)c:„ú6`]{2]ìU‰þseåóª~à›zâBŸßL‡Û\ÅùØP ¦n&¤®É'V˜ÍbK0vBª:gG8Ôö0ò¹Œ7üªàLŠ/;KÑÅ8ꢄadQ#%Vœ§Ø’Z Ì>Hޱ9´" ‘æyDÑ4çún‹}s· 0øå“UÛñ]-öI&Ÿ=)ëðY:q¾T´Ïž•U’ÂIË+í7isÔ^z ìéG6E—à :ÂvÁŽºrÝtÑ`öÒPÜk±`Ü}d¡Þ›W·‰Úè5´e j 5ùeQra+(”3å5˜Äü:;ªkÙ+Jkwƒ(=wÚDá¿/´¢c—â¨â¬¯~î¬~ÂáEƒbçÏ\i¦/×yˆóSÄq ˆ«B2Aáp6,Öw6l Äò&Š.¬&çÄ|ZàC¿@ úÍFoø(ú@âê Ðùáo?úv£/¬lvŠ³Þ›8¾:{ =?}=½b³‰>…nrUP:Å×PUSu…^VÎûÔÒÙC›"sé«MÞ”Zu‚¢cÂóãp­iž"ƒÚDCx³E‚‘ÙԤà R­ƒ—|ud=Û@¯G FR± æø è,Ö™D™½¬kÉÔL§«·…ê. é(þ›Ëå¶jM¨.P²ªˆ%Á×Ϫ6þŽÄ,!¥|ºÃž©‚"2ûSDœ Á–FC’Jè–˜K³ÝÂè[¨:¾ßêðùÓ—ë½é+òg;¶À‰ E^±´Ø;žæyFÑT§úz#@ɦs‹¡¬·¥—fn¢g¦¬…õŽ3­ ÙCé‡èl +凜Uu¼¯¦–—Û{Èmw9¥V6Á6‘ÖƩרO:Ð}ò¸î³X0&â­Î:7}¬šŠ:BÓ[>àµ2ÆE¦Ú˜Íêñ€Ž^ ¥]Th¢Ä¸¶%wUCñ]À©Xp’¶^•ÿÍ…S“AÉ”T®W8‹èý6£š_Í(? úVšê)Ô|N|X@SOqPè‡äVÑïXúÔo,n˜~½ÑG€Ï# g9{Ÿ:s–4×ézG"tÁ:¦‹®Áƒ¿éJ «ƒÒ>—¦8†Ð½ ‰îk³6Ó ÓÖÑ÷›|(8ë X×V˜Ýõ—ÆJ ÙÔ|ƒâÊêékÔÞ7ð}1à 5È-Œ»,0¨zPQÇʨÜ6 exT`d*vèš•^ÜjE<Ö¾ƒº( ÔÏÓl!Se…£¢–=wZEŸlÁQ:}À`”’ǤâJ¨vPpÞ)µò¾=ÒSPÄ8°­^©Å4Å).T D€Ð›팥Ôâ*:‡á^˜ÊÝFéêì ÎöVjok¥6”ö¶6ºq£CüNjutuÓ¾ªjZ¼3šÞ_äLï̳£gl qPä;'ÐaÜuUÔ[ŒUͲV6\D՗¦c¤]ÃF¦zºU̦òy‡Áh*uˆeΣcfõr:Ö¹CèR a°Õ=ÞTÜè8 ,7œ%ÑòLûœ(´ð··)Áh•ŠóX>(Ž–ÔT­Æˆ/?CPüdëO?lõýÄßÁtþÒeêøÚ@ [ZZ¨¹¹Y]ZÄ¿û§úí:êöt«Œ»{ QM-;B? MäX׌uÐÖÈlªljQç´/¦š^é´¢‘vY$ÓÔ‡¨²é”rT¿ ‡7zÉYA4†™½öŒÂÖµÝÔ-FȺF–´î­Þ<`Ð('­20/u¥›·®SöQ{³×D©‹;RßHs<âtJM¥­©wJ1Àç38q³?ÍßAÅUÇ©³¦ë×4”à3ö)Ûr­ µÄU©…–úÄѸùôÔ-¯ÍÚ@öΞ‚«R¨ÓÜÞE…'/P^ ¼ví=iöü‡ó‹#¿ÙS@Ù@ÀÐÙñÊqv4WXñ(Àxf~¦¨1Øò‡ms£ñÂ1wÜÆ6Œôú· Û>\×D¿Ú@(rHx+6BXƒï‚s‹:|>ü~«/­õ§êºêûi t’*ªwõêUêhoCºÞuƒ6†%öcqŽõIßOMÍÙCe§¯`Œµ`§k)*ïÌàÔ>°eív[·áþÝ¢ÁXr:€â*fQêQý‚utÂs©ãPƒ‘….…g7štVL:<ŸaŸ:X]©¹èBWl M¢õ!\vÓ†dÚœL¶‘é–SJ‘{Ëh3âм·ÄB›h(õ!=UêÅßPöŸ¦¹‘BZú3Έë|b©¶¡Qœ››ûØP :S=þ7³¢\®]»ö«ª Nɺ²µãf7­ „¿$ù:ØÕO=.±´£ Ê«¡°‚ZahÀãe©ï|¯d½èº ]˜[ *ƒbös\9DgPõ™Kæ.å×·x0–̪²!e@žíΦڶT³¨ÌPƒ±¼É[nŒ)÷Ùú(¦|æ€ØÈÁî€H6^„Ú€]¤^Svê} qN_†ž ÿ6Æâi•:…6 eMd‡ Ìñn~µ¤EÛCéðÉÓ8\jÀ)σ ¼ÎÎNêŸ$¥º{÷.݃}*—;pæï; ]åz6U}¦”í´¶ª”÷ç-nºs(ƒ^ò…iëi‰O¢ð²ml”Ú ©8˜{‚&; éî·ˆÃúÃ6?ñï©ÎÁô›c0œƒég”OÖx’OʾÁ.í ï·x02 —xhŽAó9yv4—:5™í<Ðì`ô¬ j^4ŬÇ Ÿ´hà­ð‹‡9›*,†®Âæoìµñ³C(6÷ÃjŒH°€áyÇh²C €D³ AM)(ET i”‚×MDgð™rq=®ÏS”üïŽËZ|¼J}w…œ½™‚²«Èoïi ›ª2ÃSÙȲ*f¦{Œ0*øb½¤¬^ô%ÔŸ­ßI"ðÕ8ø^¾:yýÛ„é—n¦ ñ‘Ö±H02L¨ZDeµ*ûӽDžTÕ8uÌÂSÏ`C Ff7™"æ7m0 Æðâ)Rðë#}°º¿.¢¯©=„ñ·–í)”üëÃs A=«ÚجäçMŽ’éé¦ð=ˆêK3É1<‰.]¹L×!pQ‘)© Ô+SÏÖVfwUl­²]¦¢,drŒÍ¤ñ0{aúFš ¡QTqyg¢hi ãt¶›eßJ¶âhsÂ\îkè¡}û3ú§WÞ£¿{îMúo¿{–þðé¯Ô¦ÑñØŒºÃF«9ÒOè·Wí;;VA¬ïbÒz%YŠÊj cêŒ$èÿŠ&Óá¦$“Æ8”•:ÆÉ~Âåh†ˆÚ†àÍmë #ná ªÁÈgÅÈüS­JSŽcb×W¥¶Ö>ªÈêBx~}¬Ž`Ö”ǟ̪êªËß·Cx£ H¦š¬S¬>w™¾…{¾‹cæn¥ðü£ä–~‚Âà3)ÆŒ…qî=EŸ­óÄ<Ý虯¦Ñ?¾øýí³céïŸ{‹þö™±ô7(ÿ0æ3úr…£0>ÎË‚Á¸PCUÔÑI Føg»UÔÑÁÈP‚±¤ÞC¨)ØYÙn1=¡¿™L½‡rsð¦çø6¡Ù¥Âæ”φL%¥{”Ê ÉIHG# ú»B±`„­l¶'AJéG³qî² M¤Ë ŠRÃŒ¨ëbðñ¹‘YW¥$•ïeÐuCÁT^ \¦°J@òß7 »ä@YÛ"Ré˜Ë1uÜšA¤zgŸR¹s©Ïü÷—(zê‹)‚ þý oÓß>7å-úg€pÜìõ˜YB=Û¾åڛҖ傱²?›;k„TÕ«ª2“«¢ýþFç?”`Lªš‡¸4²¨1å³À¢\otR*()Ð…–6²N‡¸“äp)’A æx$xÚJ~°¨Z® H¦ÉÚÌq¤Ä¼XÑô‹A¥MåP P¥@G›õ”çCfMoÝbש¾‹ïoƒ•޶”•¥«ùGNÓ'+Ý…í,¿ ¢Àšº¦ëg®_qŽlà%ò?ž0‚>ÿ6ý㛟Ó+“WЖÈ4jTF6–z`0koʽ Æx€1û˜c¿9$Dhžù’"Õ¶ï2‰: 0Ða&!.Ž)¶©¬ÏË€5û,³¸ /ž:,çE}›áXÃ9Ú‘”#Bé¿–#²­ ÃyQ‡×~<1æà|6›{‘{(²CÕÅ>…)³Ê‹©MÙ é”Ü q” æ³§êHP³AÀÅ–vàì[VGøGž$çÔcBÅ!ígãáÆµ ®Tóç—鎙HoƒnOÊ¥#bi—ƒqÁC`lî¬RUc€”Ô±¡­ÏB×ÂùLËçYcçE6^ˆ(™F¬?öK+Òvõ™ó4i«— 2ާ–TiÎl_¤¨Ó ˜³â¿Xj:^â޸!Ã!ªfÆ`âï´Ï|ºLàtéÊ‹ÙXe=¦–ݽ½´Ü/Qd»‰7ŒÜ3N@çxZ3vâ8„gÐïÆCŸ#BùaÄÎéÿÂàÁûÓ°\0ö§Œ<àÜNFÁÈÔ©¶=‘.ôæt±J0rc1møEU6ƒŠ«³Ðk{¨Bì«l’uM…!»5 ‡$ÕÐî„áîÝÛ´þ…î©•¥ÆXœ!wì.¡4çEï„LDƒKÉV² †ÏÚ`d³²Êº 2®ì(Õ܆R¨£8÷{ûV7…ÃjèË ;áŒìòòË­«`l Ämµ{݃ T–|80Jê¸GGxEíóÚÁKÞ‚:ês±J02Ù[ÃЙ1…-oÌ5ÛMêql )¼Ø¹{ŸŒýþìµážT$t‹s èÜC×[¯›¹i³¨ mö”© ¡€P|.ÔVepJv•©<;öÜìBŽŽýð_TE°É¡@HT™2*¤©Þ™ÇA9Ëø°—ÇãX[Sû‘`dÉn©ãuª¤K½º}Û† Œ¬c4Di (cÜ¡ù&©]L}€CWOå϶šî)•`ïúƒ‘Ï^Û“ ÈÆ)` "¿älº¦öÊPF—І©ž¶ÚB׸µYQ#SG¥«”°]ðƒd[ZöœCu§ø}ŒpÁ0“,6«6ŒCS,>0Õˆ#?Èì#ö&ýeêx¾7O'u*0rŠcB%£ôÓ4E:t 3½¥øþ / >3j{ô³€OZT£syÆïÊ2͔͂Gi=ÀböÔÔ‹ÙX¥Þ’ÙVåy”/©nœ”½‘ç[˜¸±E+‚P…@?ª”¦ò<|F¶Kmf¥¾±5±`ÔV9Æ¢póÙñ»ZüÐZ %Yšj é`­“Ž-³H6•'dO¡¦º¥èO¡ðg;ÕDæžïLóÜÆ! fp—/‹sa/¤šJ0jŸÿ”`•õ˜‚2ð´Õ!ü;³´Ê³£’òJ©ê5µ™Ü–°Ý"ÆSFŸ´اöÏÂ(¶&¿Ô•<¡Â±äkÄ‚‘µ sŒ‘)RñY':Û»—òµ"‘™Ò±‘¸¡°<Žt”Ý'WЬRÃzi©5XE™]$þ1Ü6¶>Œý•þl Wp’–{FÐ×ZåEug„$UeT o´ùgJý¤Ìü›R¡2ï;or]©lºpù £‘9€~”7xïXÞôYß0«Ê.`öáYôÊÏ‹i<Ìÿ÷à ©¿a…h6,SµaHšªÜÄL٣à ™:6SØÕþqV‡ŒÉðO4$™e0r›4d’*­ >,*"ss¦áÀŒBú Ò7áÁ€ß…ãŠÀŒ‡Âl°ž1ê‚ Pm„€:QiÕ1(ý[ú Y$eS p´)#³²J³8mi¬¶ZDù»#‚ãð/°ú`´q‡ã)œ83² ŒÖ¦Ó¿¿ý9ýaÂ$zá×åô#œŽ}Ò éjGÝèð=UÏ#š2ö§Ž†mV™:6õæ€:îЬùP‘Õ-lÇ™¤ Zàp:ƒú”_;4¹BÌÝÊ7âÁÈ‹ÓpµTͪ¦Ž—<©±7K#YM­Z5$J~!ÄîŸ ’áàY ȼs¶”}fë 2wc0[Ê”o "­ ÿ>mc¦Žøž­pÜ!Äaª¢ÙÜ• y3ò“gl*­ñŽ¢ÅððOÌ…±8\¨z{ûŸÃ¤)œ«$X*ÊžYM¥Ä•ëJ$* Ã…—†ÚÔŽÞ0ð™*f—¤©þŒ30™íf%—cŽ.n"ï=GDØv ãùN@áÙÏoãï?úþû_ÆÒ>þ¶®pÏÆkT€‘ÁÀŒ™:^¦sT!T`ÔÏZšjÃmE•NƒeÐ|£†â—¨¨eû°èoݹ(n¾Â“_Ÿ§ÿ‡HÊiÕû¥ç\‘AJf•ë'Þà´r…9ÜŸhZïC§š¨ëFçC–5R*ªôÚ×6øÖ¶²Ñ¥ÚgNþí:Ίga»TñW»¡ì·áÜLû»}qŠºµ¡Ù!â ˜¯”(SÊ‘F`¬ÍFzä7RááÀä¨#/‘«Àh˜:VµRCï¡^؇´áCÆ²Ú $@gT½±·q#¾Ž´å&#²±M´ bïŒ8Šæ“)"ì;eÎÃo » ͯќ•2ro§äûT¦>‰™I[RŸ ¥Ô”-u”E*ôµmZµÏ‹Êó${j°À("=f8Àc#ñpB(ªà„’%Á(´²ÎvÁÂgSÌ ª÷Ù¡zÌsæòÎÌ«´j¸¯QF¦Žga ŒL/Q•6z)œIÙˆÓ ¤ºc65‘«)‰ª{S‡åÙg8‚3›áío+¢ŽÅÒT[+f(Æüöêœ-YQ¬[ªZPCÁ©ùš–+ôkA!“÷•â¬×¦3*S4Ÿ™]eŠÉ‚í Ä|®Tê(µ n‚]Í+?$ Õ§!Ôw Š®‰Â鹟‡ Ç¿ÁwnÉè Ì‹ý5åÜÆxoÈy#¨ÏÿÙé(&oøÓŒ0JêÈú>c€<ÑÁRn3k9T”‘%ªñlLbU´‡Q-Àø¸-qXšÚì«»¡_”@"÷ ê¨Ä8Ô1"ûùîʤ0PH'¦ZçCéEå |mtïnGcCêŠw#céÈûJˆ;Âh® B,"zù,×H{ )mÁ SJ;ød.÷¥v-?K“&?L•F%u4ÅL®¶;™jn& ¹ïì£âÜhLùÏìêÉ–(ºÞ{hÀI{Õ~Þêœ)j®G4Á%IRHÍÙ‘YAH0Ãö”OBº`YÝ¢SioŒÐ?^¸t‰nqœT”j帥û”v$¸fœ/Ûh¾nƒÅM.E4ݧ€¦yÐòbòC*6$EõNÌ¥Ì ¿$ä±Û%ô‘¶Á PdQlveœ…QÛÖ¢Êc”[QE©ˆJî”lÆ1ÂÄ£sžGÖ#rrÛhÉ*® wµô‰"z8¬oÂ`5Ä™°^CUÎ2Ò®Q Æ>+À¬lÐKÉÌ¥Œüð¹_–ÒrJ8cª”€ìºs’®ö–QÕå(¡5ûáz`EÙoo½ê ûLƒ»Vòñeƒ£j+¯ ˆ‡Ùœƒ0`]8"¯Ù%¡©;óiÀ8Ë—K!M÷.¤ÙøtN<@Ai¥b6Î’ä¶509‡¼ã3ÉN-u]µ3^(Þ‘´Ü^ n¡4ó^Àèû7¤ŸéN?Ùù‹kƒ’)çCf?ùÜ*#›«Xf¦ŽìÂMŠ]¼¦8Gˆhèo#@ó|´«:«2Ãm!ƧFÞ£ŒÕÐnÚßé p!øÖñÂ@ ¼>%„r¾2¿Ú]$ÎIá4ëõÁy¹(ÛT92/”ïäÞCÇ…iœˆ2.ÂþÛ!qL8Ù&V’_1ÍølüŠÈ€œ2…©äÒÐRòL«¢Àôr H-l«R&âæ€bî+»;V<¹8c摜ƒ]ªKx mK!‡ØtrÏB8Å|!¤I(o934V@šs«Ê+ƒ)"G%˜áÚ K/çIæË*À1ð`ýšr<"ŽìZžÃ»Êj}€(¹ÿ3×Êép«+á8}!(ûß[·žŠ.9RÙu*¼êJ{aËš‰F*ü w`ÉGS2l`S…ÿ¤~k#oçà³Á(iHã¥+òäŽ<Nˆ2êø;Hå=Õ9ŒìÒ¼À2šáP¡˜L)%ëº4l?¹¥'_8÷fWRh¨&ü Ò )Q¼#÷î§È¼ 83çBBJòÝsÎÍ•*v˜YR¥³°Bjʬ)Ÿáb™î Âè]“7ÄEOÄ…Ž6ž1Üê°QÆÑÁUÒÔù:C5š»²ì€œ­ƒr£˜üû`ÀÈ/‚âºHîEÇÚ¶›È~c«fŠ·¾ìiZg¾Ÿ‰èåæ0™½Û²K”¸ÂMËŽT€äóܦØ2PÁ‚EåÇTRM)™Z¢ÌÀyr ØY¿ZVA[+òa¸¥#Wœ9w&‡¤J²ÝUE[â«hU$P*¨«ÓnÎõñp,A!¡¾HÜŽ|³Ž‚u¬©¶­íØØ²kŸAïÞ3- –¹{k¨ëz0Jꘋ3•)TÖ åùqï©ÍÔI)tV?æö?˜ú¬ï `Ú¹’5 ˆŽ°ßt~h“*ù>ì:_…„“ÎÌñÞM+Ã+h¶?Â8ú”’uU’©&³¯üÛT¯|š pNئ¢Š‚¿ù{>ƒ2•eÖ—ë.-ÚXJ•°‚ p,ÔU0k¡#½‚|’ìÍÔ›ÇÖ” ”oãÅ‘ ‹"Á®ZøÙqÔƒ‘BcsRµ­Åœ >X0J@â`̧¨çNUœõ5k æŒWÖ­nñ¦Š«`ó¦›ýòî¹u›là’ô66º`O‹ ›UþDv*62gUÇTDˆ[áG³¡ÿ›áI rhix9(d±“ê<ù0µÔ¦žâÌ©]| µõØsÀSÅ´aw®„òsä{ÓYȹ8A±V@Ÿ9¦q.„mNuy¢°àéxw´u²W¿e rž02ud‰ã‰TqÑx2S¹©ÍáøM1‡3´ëU’Ïè/‹j=wÚ(¿ÎtᎩ€ä6ëZ’±åPqý3YTÕFÉ+ÞÿÚì)SŸWçl…Þ›ŠŽœ¤^Dóæë¬uŽ7ž¥M!‰ô›3$¤áE´ gŹ8ONWƒr¦ ˜:@§¡æ7–ÌBBËõ™½]¾_ ü81ò,÷£ÊÓuƒôÛ0(?Y‡´A ’[!pÒ¢æx‘¼1×–|R‡?3±±7ãFI¡^r¢Î;iذ)F©S~#KY—RHþÐ&5euDW/‚8Ú šR2]Šmñ›¿«· À7ªÑÞª0ÿ÷(³â°D²â\Åú¹¯¦0ë‚’`bv]çžêAö¨eÐ'¾ÐÎp‹¢eA9`_q¦ ?@ C*Ĺ‘©(SO>SÎÀ¿Uì*³©…4gÆ¥hMÌ!Úw€œKi¶gÆãL3]ƒˆsLêºšá ²-r7ÇØÙëD8sbX¸…½ ÏŒØÜ2cXö߇Œ¬CË<¾Ž®uU‹MÄ¥®e¯(ü÷µ®z:v>pÈ7Ýè9‡ªÊsÁ`hínÐô/ÇÁŸüý]j¤CWœÌ¤.ÆŸ'SIžÝå"Me ž?³±\ôQNþž纙8®«m`A½D¼m5«D¢‘¤FuõÑ(•àHu¥—WöQUY’û€zùzû\Ó‡l£éke­idZ ò»->‘í['®ÞNWZuƒI‚±þŽßlðÂ#%˜Œßlò¢Ë­£úXÁ8ªïã\K{'„1Þýu}8+rà+]2éŒî“›ü64³HÔ·‚ññ>;ko£l4`T˜Ñ±YÝ·›<é€jŠ;ÓîáLÌ÷I@Z)ã(Û(Öé<êx@WpfüdÍv¡ãc±k'©\™Œ[‡ªèc¢·±D–m`ß_ʔ՞>YåF¯·>êI kûV6uX—uþà¾é™”K?B¿÷.ìW_¶ÙŒ(n¡ý’š±p†@çT$Kù¥Y›(¿ëëžEh4_V0Žæ§û8ç¦8 v#ïÆÉ¦s‹ÀÀ'Tþ„¦hùTM¨þ_wî<üK¨ V7¬2y.+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc²òIX+Ÿ„§lãˆX+GÄc™ƒ¼wç6=¸—îß¿oR~FíYÞ{p_)?öû{d®‰¡Q[Á8úžé0ÍHšö›7©üd-ù¥Sl.e–U™9U;YŽÒ¼‘›SBÅH+~¥åºÈj<š/+GóÓ}¬s»Om7:‘6<„ÆÌ·£×çl£E~{È6j]¸ÚlÆHPGWýu³E;Uµg¨òT=Åï-¥–ö3ÚyU­`yÏÌBGü€®´¶ÓW<éÝ%NôÞRgúl­'Ù%TPpF©»ix iûèù¶ôÉ*wº|½]T>‚´äç@Góeãh~ºyn-íôýozo™3}¸Â•Þ]ì@3¶Ç“ml1«k£y`äÜ×xù*M\å@;ÒÄÕîtéš €‡N7Ñùæ¶Ç<£ÇÛŒw½Guo-Œ.Œ,w0h]Dyî* Û·ož?΄›B“éÍöôþ25[Å=•'èB³•2Žê dÜЭSÆ¿ ʨ#9n’m­ Í¡`5u_*ÁÌÅ–Vúh%îÁýïÈŸ((ãÑutù굡¬¶d¥ŒøP,iHæH0¯1eÜÚǦNX®¢ŽL%x§}dJßÔ€?n[ɶz$fÓÛ Dý÷ÁêN\³lªŠ2–:I¯˜ F´>‚$°V0ZÒÎácé½}‹xFҸŎP ÆQ˜UýÙ!Œ~s'ßÔ\º¥Å®Þƒ.2f_¨¨} ¦ª,úbݺÚÖ!ŸS&þØ52T"V0ìé>Ö»Î6\¦ê£M•kW…@Cµq»{nQÙÑÓÄ@Ñ\ö4æ”û«vÑ;‹TÔMun•[êDo/²£_#èÛ-dãFÁ{ò)}ÿ Í.„:$˜^œ¹‘Þ˜g+€Ì@|÷°d¶¬ïí;w(dwuu÷\w%|ðà>„J¤£ë¦¸g$PH‹cGë ÊK;@Iáy oÊGquwõŠþW‡Óš^ý éÒ¹–GÑíCm2ðÒb iÅoÛé—÷׊2ý“­4í£m•éŸl¿óxyŒCµ6]==´>(‰þüÛ:úÕ1ˆžVIB _¨«§›¦¹„ÕS¹·\‹ìÁnî ï·Ðt×h²O(%»øZšEÛbóisD.­ É¢UÁ{h¶G<ýuk ìN¯˜|Þ¼|½@ºOq™tI­æ06’ãMçiU@½5-õŽ¡¶Îê[,›BZswWͶôË[[è›Ö,Ó?¶¥Ù_ÙQIÎacÏÄäßhs¾¶ýõ— ôÅŸ6ö+<¦YŸÚóQ\Láø%0ã³­xß¿º‰>ÿãFúäß6™Tx¼ñËŬK½OotwÓº z}î6Aþ2u=5u#­8ûI3ÕõUGõÂÃ'¡¨ß*hªæMóv&’}|1ùe§ˆÂzŠ-m¢“Ú¨ûö=º{ŸˆÝäuMtõÞ£ó×nÒþšK–[I‹|’¨àhÝÅ‘°ÄI(ë¯ÛDîj[;yìʦ  È f–ÊŽÅçºà]Ä’^K¿†ŒL f}fGŸþÇVšøL+Ÿÿçšú¡ÝÃÏ!‘¾~v“Áþ?ûýšÿã>Oæ‚ÝR@¼žÞDŸýn‹Ék o­¸Ç€’NÜB»BóL¯dñÒòée›ÍôÁ ljúx¥ÀåHÿñójze®-¥•ÑÙæ‰3çèûÍÞôƒmÙÆQð¾jJ(?G ûÏQLI#E5Ph~´ é¹)†¾}Æð¾üý6šŠßÿÅ•ÖÎð6i茪ÎÙõ„½Œ|.ã ¿*8“âËÎRt1Î…º(!@YÔH‰ç)¶¤–³’cl­H¤yQ4Í9„¾ÛâCŸÃÜm >DùdÕv|@‹}’ÉgÏAÊ:|–Nœoí³ge‡¤pÒrçJûMÚµ—Þ{ú„MÑ%§a »`G]¹nºÀȤz„•,Œ“þäAßÿÞ{PeæD;bÉì@.ãÏ»ìŸÇ8P0îØC¿¼ì6àùMú³ýðŒýø²C¿òó®4éžFÛôôv“Á¨\¿3WšéËuâ<Æq(âªLP8œ ‹õ (±¼‰¢ «É91Ÿxaî‚~³Ñ>Š>¸út~øÛ¾Ýè +›â¬÷&Ο¯ÎÞBÏO_O¯Øl¢O¡›\”NqÅ5TÕÔFBáߟ—Uó>µtöЦÈ\új“7¥V è˜ðü8\kš§È@öÌ£¸Ç"ÀøãŸ¼è‡?ø ªüøœ;¨cÈ€ÖÈss,ýô¼›ÁþyŒcAÆ!šù‹ùsû/_úñEgš ýæ¹6Ï xÈ‚ç;óóm¢Ž?îѵŽ?>ã10ª6þŽÄ,!¥|ºÃž©‚"2ûSDœ Á–FC’Jè–˜K³ÝÂè[¨:¾ßêðùÓ—ë½é+òg;¶À‰ E^±´Ø;žæyFÑT§úz#@ɦs‹¡¬·¥—fn¢g¦¬…õŽ3­ ÙCé‡èl +凜Uu¼¯¦–—Û{Èmw9¥V6Á6‘ÖÆ©÷BŸt@›ã1Þd`üùϾôÓºÌúØ™Ž¬5{ùŒ?¿°Ý`ÿæ­‹š_Í(? úVšê)Ô|N|X@SOqPè‡äVÑïXúÔo,n˜~½ÑG€Ï# g9{Ÿ:s–4×ézG"tÁ:¦‹®Áƒ¿éJ «ƒÒ>—¦8†Ð½ ‰îk³6Ó ÓÖÑ÷›|(8ë X×V˜Ýõ—ÆJ ÙÔ|ƒâÊêékÔÞWnÞ|- ¶E€ñ—§è—?†¾<ãGK~t3{Yy#ÿò¢‡áþ1FsÁÈ”ë—çwš5¯éc¼iåd“@¨=Q6"ˆ È¡9_:Ð/Ïyõõ‹1˜Ë5HÉcRq%Ô;(8ï”ZyßÇž é)(bØV¯Ôbšâ*¢?@èM‹vÆRjqƒÃp/Lån£tuvPg{+µ·µRJ{[ݸÑ!~'5È:ººi_U5-ÞMï/r¦wæÙÑ‹36Ð8(ò è0Œîˆº*ê-ƪfY+®@¢êKáÓ1Ò. £ýö—`úíOzËä±nôëó>ëÈûg}äJ•¥§Ìz Æß^Üi¸}ŒqÎ×&·ËTqÆD[“Æ,Ç>õU_²]4pA”ƒró¼šù¡›XÛéﺚ¥ÚÐlpüa•ŠóX>(Ž–ÔT­Æˆ/?CPüdëO?lõýÄßÁtþÒeêøÚ@ [ZZ¨¹¹Y]ZÄ¿û§úí:êöt«Œ»{ QM-;B? MäX׌uÐÖÈlªljQç´/¦š^é´¢‘vY§ü%”¦ü)Zo™õ¾;Íšè`°Ž¼ò³Á´ôGw³žƒçæ8šü¢·áö1FsÀì–JS_ßiÒ˜y쓟 ¤ 6þĒסºöCÁcv^ar»J]Ü‘úFšã§Sj*mM½SŠ>œ÷À¿nö§ùÛ#¨¸ê8uv´QëõkJðû”€m¹ÖP‚Z⪿ÔBK}âhÜ|z ê–×fm {HgOÁÎU)Ôinï¢Â“(/Ž^»Àöžª¥|,íX§>ASÿ§·Ìz_åÁ0åÙPƒõd6ï{PNò~“P€ñ%_ÃmcŒ¦‚‘5õãM4õ©X“ÆËõl>w Gãeò2ô«x¸®‰~µ€Pä0ðV l„°ßÃXŸëðùðû­¾´Ö?žªë¨ì§1ÐIªh¨ÞÕ«W©£½]Œëz× Ú– @Ú @ŽÅ9Ö'}?55w"•Ë8ó÷®r= ›ª>SÊvZ[UÊûsˆ7Ý9”ÆA/ù´õ´Ä'QHxÙ66Jm†ÇTœ¿ Ì=A“‚…t÷[Äaýa›Ÿø÷TgÈ(ƒáìL?£|²Æ“|Rö vi}¿E€qÖs‰dótšÞ2õu¡c‹òÉ¢cü Ö•íÌzv—*šrc0N%Ø`»ª/Ít $Çð$ºtå2]‡ÀE D¦t¦‚P{ÜL=[[™ÝU±µÊv™Š²É16“ÆÃî…éi6„FQÅuäuŠ¢¥M,ŒÓÙn–}+Ùrˆ£Í}s¹7f¬¡?Nü…þõíÏèŸ^yþî¹7é¿ýîYúç¿R›:D‡±u|T¿[iîó)4ïÙl½eÖ«áÄ€á+Ä tl°Áúš¶žËFä bC·Í}qîׯ‹CriÖ[&ÏÔ6‡êáwŒ“ü„ËÑ88 3µ Á9šÛÖ;FÜÂ) Tƒ‘ÏŠ‘ù§Z‚4„㘇Ø5Å•G©­µ*2€ºž_Ÿ‡«#˜5eÀñ'³ªºêò÷íÞh’©&ë«Ï]¦o@áÞï☹[)<ÿ(¹¥Ÿ 0øLŠ1£DaÜ{OÑgë<1O7zæ«iô/¾CûìXúûçÞ¢¿}f,ý Ê?ŒùŒ¾\á(Œ†ó²0Î{!<—«·Ø¼©#‹¶àùƒ÷Èöf¿*l ŒÜ‡¡1ðMãú™~4çåDÓÆöj Ù/ {lÏŸ7=Ç· Í.6§|6d*)Ý£TnHNB:QÐߊ#le³=¹RJ?šs—mh"]U”‚¦` D]ƒÏ̺*%©|/ƒ®j  òbà2…U’ÿ¾Ý%ÊÚ‘JÀ\Ž©ãÆÐ €$Õ;û”ÊK}~ä¿§¸DÑS_LTðï_x›þö¹±(oÑ?„ãf¯§ÀÌêìyØöõ±=uGÆ/î¡EÏçë-³_ƒw·š2Jê8çÍpƒ÷hÚ{!Ï(uä¶¹Ccà1šÆÉ6Ð"ôi¨-ùÛ¬7B(Ö?û±=s%ºÐÒFöÑé0w‚"%Bò#ÔO[ÉRËUÉ4B›9Δ˜W+š>p1¨´©Šªèh³žò|Ȭé­[ì:Õwñým°ÒÑ–²²t5ÿÈiúd¥»°åDXS×´cýÌõâ+Α ¼DþdzcFPÃçߦ|ószeò Ú™FŠÀÈÆR<êe`\ôb6-y¾Ho™óZL?0ª¨£-~¡Àà}²ÍcÈeU”Þµd0r†ÆÀc4Œ¬5ÔŽò·yû+æ‡ó:ÖpŽv$åˆPúoåãˆlkÃp^ÔáµOŒ98ŸÍÆæ^äŠìP5B±Ï@a Çl§òb`jS6CzE%·ÃB%¨ùì)…:Ôlp±¥8»Ã–Õþ‘'É9õ˜PqHûÙx¸q­‚+ÕßüùeúŸc&ÒÛ „Û“réÂ…XÚe`\üÒ^ZúB©Þ2÷õ¸~`äE܃pó?1xŸ²Í9Ÿºèu±b0r†ÆÀc4FVÚÏúÔÞä1ÍûÔã± oÚxZ‘¶«Ïœ§I[½•qD8ۤJƒpfûB EÕÀ|œ7øÅRÓùóõÆþçr§}æÓe§K·È€T^ÌÆ*ë1µìîí¥å~‰"ÛÕx¼H¼aàžq:ÇÓš±³Ç!<ƒ~7þúÊ#vNÿþe,ÊÀcB­E€qéËù´âÅ ½eþ‰ä¥`SymX…0ç+GZöbŒ¸Wþ¶àõÝä°4\ç²rÛ܇¡vxŒÆÀÈÞ³?s2i<Ü׬O‡ßêFb_eãYŠÈk|fÜžzH”R‚1 * ¿Ì4 * £ Bõ_"ŸÍÖ®¡h'µa©§.1…c 1Å4¤[ä{•,«dW•ྠÛU·„lúœ4`·ãrÉ+§šrO á Ÿ wÂ)g^.Ħ-ŒË^)¢•/Ò[¼‘ô%u\øA˜Á{•íÎùÔU'ud0r†ÆÀc4FVQÌûÌÓäñXy%a¸{÷6-„¡{j%Ei1gÈ»Kh†CÍÅyÑ;!S‘ÁÁàR²•,ˆáóŸ6Y€Ã¬¬².ƒŒ+;J5·¡ê(ÎýÞ¾ÕMá°úrÃN8#{À€<‡ürkÆjÈq[mÀ^÷ (•%_ÃÆy_ƒ’¼‚Ó/Ö[¾‘ 0&<´ŽLç‚:®|¹Üàý²íE¯§ë¤ŽÜ6÷ah iePiŒÎAä¿l([È4 6S^ ¥õ ŠÙSS/fc•zKf[•çQ¾¤ºpRöFBœoaâÆA®Bý¨RšÊóðÙ.µe˜•úÆÖÀ"À¸ç±Õ/Uê- Å™ña6UN®=Ô߆²}f%•ÔQŦ&Ñeä3ã|œ ÍEù›¥œå:†ì)ÒT·”ý)#þl§‚ÈÜóÝ`ý„ä6a0ƒ»|Yœ {!ÕT‚Qûü§«¬Ç”§­áß™¥Už•”WJU¯©Íä¶„í1v˜2ú¤•À>µ|D±5Ñø¥®ä Ž%_ÃFŠ Dšª½¨«&ï¤E¯f™$É\üjN?ê8\ÒÔ¹ŸºS}õ0è»´Ô¬"ˆÌ. Žn[ÆþJÿ6…+8IË=#hk­òŠ¢ºÆ3B’ª‹2*…7ÚŠ|~v|ΔúI%˜ù7¥Ce ÞwÞäºRÙtá"òAF#32¶@ʼ÷,oú¬o˜Ue0ûð,zåçÅ4æ{Ša…Ôß°ÀB4Ãfd0.y9—–½X¦·Ì{#þ!=£69L#ë µ£ümÞDo ud=#÷aè^£1iªÔ3d í­ˆÌÍ™†3 é7HHß„~~Œ+3 ³Ázƨ 6&@µêD¥UÇ ôoé'd‘”M)ÀѦŒÌÊ*Íâ´¥±ÚjåïŒllpŽÃ¿ÀèG€ÑÆ=~Œ§4fpâÌÈ&|0^X˜Nÿþöçô‡ “è…_—Óp:öI+¤«†m–Û3Qwd”qñK9P”ë-s_5 Fžì<ç½–h°-Ù×ãú|8&Ӝף ÞÇc4Fn‹…2†æ¢ümÎۡĆåë’Ó[`w—kç#ìSEµ÷[àpEi$ÎZ^Ç—6’ üÙn6Jhê^jeT ûè S6%µíU%e>#*=<”çB¦žJ0Ê¶Û ÉÍ*ÄüààìO«ƒvãÒ§eãvAa¼0‘ßA²Ö§¿œBÿó•÷éÿ}æMú»×?¡m¡ø¢JB¦‹¸,Œ _̤ÅÏè-s^‹6 Œ’:jKù›´Êa_ÉYc‚ ŽÇh U¶©û ¶%Ç0÷ÕxÍ áqì–hVT×ÓSÅ첃4ÕÁ_€q&&³Ý¬¤ârÌÑÅMä½çˆûÏ®a<ß H#ð1<ûùï1ðmüýG?ÐÿËXúÃÇ?ÃÖîYÃxYÍq¡2¶Vf»X}êLÛ7F!‚@À¸P1ÛióV I.Tì²5ý4-±µÐþýÖÛˆâæ+<ùõyúˆ©œVm±_ŠpΤdV)°~1pâ N+ W˜Ã­ñ‰¦õþ1tº¡‰ºnt>dY#¥¢J¯}mƒom+]ª yæäß®ã¬x6±@µ Ê~ÛÎýÁT±¿Û§¨[š"ŠùªA €2¥üiÆÚl¤÷a@~S!6wm‡¢¾E€qîó©4ÿÙ½Eé\lʤUÈ!Û”ýÙ¼-Îy6ãü Öç1šBYe2÷O“úæ1ð8ù[š2gSëlˆØ;ãN£†¢ùdŠûN™óðèîBók4çE%…ŒÜ[EÁ)9Â>•)¤Ob&@Òß–”ÇÃgC)5eKe‘ }m›Víó¢ò<Éž,0ŠHÏ£ŽˆÒª8$Q'D, F™ •­p~´ >›b^P½ÏÕ˸`î˜3—7pf^… UÃ}YwÃ3>Ko™õj˜IgF¹˜’:Î{nÁveŸÓ?AVâ½ Öûün“ÀÈ99L£¡ù(c›«g(6KÖ#H0³Þþ¶"!êQl!Mµ±b&€bŒÁo¯ÎÙ‚ź¥ª5œšO¡i¹B߸2y_)Îzm:¡2EcñYÙU¦˜,ˆÑBÌçJ¥ŽRÛ`à&ØÕ¼òCÂP}I}ªèšX œžûy˜pü|ç–|€ÞÀ¼Ø_SÎm,€÷†œ7‚ZñüŸ¾bò†?€€ÑŒÅÀáø4JçbS6eŒ/ÂÜ¿;Jqmäo³ß€ÞÛˆ>1pxlKÚN³^L0©oÑç{þ”ú裓±4µ ØWy’ö¢äjÊ *AµƒG‚:Fd ß]™ é„ÀTë|b(½¨”¯îÝíïhlh^ºâÝÈX:ò¾Ò#âŽ0šë‚‹ˆ^>Ë5RÅžÂEJ[pÔÒ>™Ë}c©]ËÏÒRÖW×8,Œ3ŸC@¨§Sô–é¯ ]µ™`äÉfÄ•Í{>Û6Ô¯ò7£©`TE±³£YÏ$›Ü÷ô#i£M€I¡%MÝPœ‘kÕdOš6q³É‰t„w£:‡gŠšëMApI’RsvdV̰=%ä“.XV·èTZç#ô.]¢['B#¥ÚC9vé>¥ ®çËvš¯Û`q“ Ò¨RæˆS`i3æxlmÃ)èTÙ‘ût¡œ®.¼ ‰^£è|³J:jééÃåšXg<‹tfIÖ[¦½0 02uäÈâ3ž‰7ؾ¡¾åo6BÒi¨å¹û+!´¹Öµ“ºáîÄçD–ŒraC©ÂP*ÿ…šu©?‡ˆç)ôŒX¯9–B3\ÃÐçaPkQ!=•R_Näº4®r1†ƒ f}Õ½Fcáý9ôþ@(#/'+3ÁÃäPûúÒ ˜ÞŸûeu…ÍDG³ûù*ÎD_Ø›•+Dn¶såuš¼Ó^Öô=íÙHZø³Y{è¾Ú÷/}ÿ1=v ×äŠ~ìj,¨’çž47°˜6D”RHF9yþÉ™(Ùì$ƒJFƒZ¦PFñ:]ß%ÿU¤ƒk…óqpÿ¼!å´Pãù ”ø9FïY­8¿ã¯á;?Z†ä7aýÁv³*‰iÿôtÌžz¦W‰àZñ ¦#í² 0>IÓÿ¯·LERNN3Ћ³RM}6Ì`†ú¿aŒæPF+S§©/@ün`n:{ ¹B¼‡ÄÑãôé!|ÌŠ²Ñ×µ™èD¼VÓŸB„teŸ‰B†c[3—Oe#¶«øH~¥9'EŠ.©#ç”#dãSDÓ} hšW-)&?¤bóGRTïÄ PÊ òKB‹°]BiœHÅfP&ÀYˆE°m-ªP¼#i¹¼@ÜBi:ç½€Ñ÷oH)>Ó-œ~²ó)Ö%S·Ì~ò¹UF6W±ÌL!Ù…›»xMqŽÑÐßF€æùhWuVe†ÛBŒO¼,Œ“Ÿ¡ÉŽÒ[~{ÉkP`ä5`êøÛ³Aû14£¹`ä~ÙÇÑf¢ËÀûÕZ—ßÇqò_ÂÌno `Ü{è¸0QÆEØ;$Ž 'ÛÄJ²ñ+¦™Ÿ_Ù³Qf¢0•\ZJžiU˜^N©‚mõOÊDÜPÌ]`ewgÊ'gÌ<òs° Bõo O¡Ía)ä›N®ñY§˜/„4 åM"g†Æ HsnUye0Eä¨3ÜbB;aiÃãå|"É À|Y8&ò¼Áe.æ¬Âœ]x0³tLa eH6ø›™™‹•cåtoÓÞôxß²:›4Ÿ§ÂhÚ'›LZ>IC/]A'wä©p@”QÇßA*ï©Îad—xæ–Ñ o¨qB50™RJÖuiØ~rK=N¾pî Ì®¤ÐPMø¤R¢xGîÝO‘y(pfÎ;„„:•ä»çœ›+Uì0³¤Jga…Ô”YS>#†CÅ2Ý5 @„Ñ»&oˆ‹:Ÿˆ ms*Lã8\ÛœêòDaÁÓ/ðîhëd¯~ËäXú“7ýøø¦é)?=ï6d`ä ·q¶?ýú’§Á>µÇòë«®ì–j2u1TQäpË;ý=g26wCëbxÍÜiÖD{¼|2L¢j£Æä• ïmö”©Ï«s¶BïMEGNR/¢yóuÖ:ÇÏÒ¦DúÍÒð"Z†³â\œ'§«A9SPL SƒPóKf!¡åúÌÞ.ß/È~ˆ y–ûÆQåé:Aúm”Ÿ¬CÚ PÉ­8iQs¼HÞ˜kK>©Þöw°›cØÁÈg™þâI“þà«·üòš EyOzjêb°…˲Ÿ·Óä7]iÒùì›ÇÅããÈpÆò<šÚ¿¬ÇqV%(|Î~ø£ñ±Z''¯ÕŒ‰ÛÈeu„Y~’ª0ÿ÷(³â°D²â\Åú¹¯¦0ë‚’`bv]ç4{=jô‰ï´3Ü¢hÒ¾¯ Ç™2ü- ©çF¦v¢pL=ùL9ÿV±«Ì¦Ò\œ—F 51‡hsÜrJ,¥Ùž 3Ít "Î1©ëj†7ȶÈÝ4cg¯áL̉aáö&<3bsËÌ}<½þ°ƒ‘©ÄôO·ÒÌOéÇ—¡ËR”©ãœð½=­ømÇ MÄ´W–Ù¶8°V¿MX/úàþu{Áž>J`% —¦BâÉcá5˜ôôvUyj}ÿ{ï~eÒŸ=4¿ÿð¢͘àDS>Ú(ÆÉ/­œ3]”gª¤’*8ä: ÷"vµš ޤ_“—JU Y>Ü¥Ž6×pñ2}¼ÒE„óàÜßób¦{,- ØC«Ã i]ä~ZµŸVEUÐÊäVÁYsUd­9भñhK\­ ÛKóv& å?Èzk¡­ˆPp¤þŒ‚¶ªBùïò“µ4Ï#\5v”·ç;PXf¡j¼ZQñ;ÚŒt8ì`äñ10”lI¢,yiK(CV{pÿºÊã¥Èýñ¬á- L*üåç‚ïœ4¿‡îHQîkÏÚ·OT Û]V…À¿¾•[jš5‡Ì`ó¸ÖNÝ)ÊGÔ"¬Œ£åIZÀ<®¶u€õñf´Õ ¬‰F’ÕÕG£T‚#Õ•^^ÙGU`dIîWêåëí0ËG7‹ãí[wàJƒ8)ŠróFݽÓóQ-÷m¨<ª~uµ+סùrq¹rá:]<Óܯ\¹pMüÆ¥ýú êí¾Eî?Ö‚PßmñyŒlß:qõvºÒªLräðwüfƒ‡)ÁÌ`üf“]níxœâ±÷5ì`äÍwùü5º|›®ñZ¿réìuñ[Ë•ö!ßl"Xn{<à›Ñ·ªÝ9/¶"AË£3©ê¾ÙK×®¶ o| ¯Ã…†Ö¾RßF”Eù[£jÜ|/³£­ !/ý L×Nmiï„0Æ»¿®gE|å±K&ÑýÒ߆f‰úV0>öw‰·û¥&”FlF=åòYvBº€ALEš/·b·ìW3Œ7ºv4³Á.WoÏmj¾ÔJWxM&ŽÅÀ:‰uÄZ1ålmá,ÁîbŒ 3:6«ûv“']PMqgºÑÝ#œ‰ù> H+eìN3ñ~ÞŒ—›ÚQ:ô—3mÔvl¨®ëÍèël›á>µÇƒúLu†âbn /¡«L˜»¡u1²füá—Øãq!z@WpfüdÍv¡ãc±k'©\™Œ[‡ªèc¢·±D–m`ß_ʔ՞>YåF¯·Åò[lÃΦ Êp¦Ãpøl4× lΫçq3ÖçC¿· öb–ôêEî¿}c0²N:æÄså—Ï#äƒû" ¤gR.ýýÞ»°_}Ùf3¢¸…öKvjhý„0Ž÷ "Y‚àÈ/ÍÚ$@ùX_÷„,êDû£ù~0²â,6ÙÙNýåß¶ž*ñYªù÷g /½¿u–z0¿š/„ê cVÝsõB;±0ì‘^Š£`7ònœl:G± |²AåOhŠ–OÕ„êÿuçÎÃß±„ª`uÃ*“'áv0¶ ’ÙÕsØ0goè/ç;†ŒÌê^E[ûÒ7Œ‘Ç:‹ßöLÙ›/°oCkcÊo; ˆ¬—e¯À°ƒ‘7IËd±=ߥ¿\ì´‡…×® =µ¡~ ý†1tCwuvƒÅ˜Ú÷ ïÃØø"±ìí;ºF7ì`äóLËEñ‚2`débËE€ÞP?ÇÐ%Î^æ^lw{ý*æ8Ð~µïè¬`4÷Ñ=öúÃÆÖ–º0^»xS¹tƒø¼5Ћ¥—ׯ‚U3Ô‡Ñߺ .0Œ¬ á—€ÑùéëûÖ•ÁÌ” ³Ú×›ÛÅß×›ñ ×¹Æu ÍÁ ÆnŸÇvŸ€êÒM”nýå2ÀØ1ðC¼ØÀ—ôa¨ñÛM,s.:]¿Œb´mí¹£¯«7¨í"qÃ÷RŸÿ.RLyYBËu8±V÷‡¹›ù"1gžÖºC³ÃFÞD­JëeäÞÓS®_é0oõÞ¦ÖæÛ7Ôwßo7ņ7õb1xMk[1÷«*гA€¹ƒ“_Z¢_¬Y¿±‘jÈÜ1Y뛾ÃF–2¶]íFéÑ_šoX4ÏTÑ`Û†úí÷[·YºNV%´aÜfõÝÜ-ØñÁêE’R´Óv ù,xm1"Y/Ë^a#³ríÍ=(½zK[K÷€ÀÈÔ¥ýúMƒmê·ÿo=&«WØÜŽ_2¦·Ísg -`îB‚Ì8üBºwï¾eïDëèhøÁ³Ž–^êõ•ö‚‘n¬mCýöûÇh¢9¿:®uœÓCmc¬CmûjÝß#k†Œüæî¼Ö‹rK¹ÞcvX v+êlë1Ü®ì³õ¸ÑD‰.ŸÛ:¯™“²/Œs gÄ‘µÕ¬£5¶ÃF>Ûܸ~ å¶ÞÒÙÚ+$†¦^Ì&šÒ®ì“Av£½ÇàÄM£Ê5‹ç¤>ý3­]Sçn­7rW`øÁ*r£²›W_ië¥P:S/¦Š7pÁ65}©(ž£¡1ðMP¯°D³«ÃX[йbœ<^ëe]a#K»ÚoÓÍö;zKWû-“7,S&nÓP{ý~ë‹0tµ÷Æh‚±5tunK»ëYÑ D^‹ãÍlô€QoMÔ»1°nvkOöu[P\ÐÍÜgp ¦±û&·czÿ¦ÜºUŸŒv0²…I7@ÐÝK=…Áe ™Â¨ÚÓßV¿ßP—ï`ì¼eä>Œõ] .cóÑŒçeeQ-éóû°ƒ‘)SÏ»FÊmc[ÛôܸcB{Üßâú|qÛ=7ø^#ã08 X£íÈ~ºn›˜ÃØÌ­¿†v02eèíº‹rOoééREo3tñY±,¢¡v”¿õܼ­Q„ 0¢Ã÷bŒFÀ(Æ æ£.úÆ06“uƒ[á#΂½7±Ñobë-ÆÁx«`2ÚŽìý)Π ÆÞ›\ ¡ÿ=º–U*½Ý<Cí(~C]«ðfpx4Ý=ì`dVñv÷=œÝô”[=w ²s¼¡Œ†ÚPþÆu• `ÏîÃðý÷4l­¾ 0q Öu4mÆ'}.ÃF<¸`ìõ–{ƒ›Ö†l}i±¼(Ù”1c•…0¨ 68Å<1+ŸtöÍß"Àx§÷>*·{F=yUÒPPN#mÈß¹®6kÈmsÆÚ0ŒwÌ‹q¡”u«>9+0ì`dñÎ-€Ñ`ÑFÓî—íënG8éÞâbd«1!ÒÛ&´£îǸŸœmh)¯À°ƒ‘p÷ö}”úËû:]€˜ÂÝÅoïU¶ vT[ÈîEÆÛA#aó¹mfyMÏ0…á·n}Ë\a#{Äßc°ÝAðZ½E7M»W¶«» ~, F“Æ`xîÝ56Åt‚.7_u¾ V0ŽänÑc@ç[®Ñ_7yÑ› ìiì<;Z–OŽÑyÔÞyÃŒ‘ÃWõömšáL/ÍØDGNÑ¡“u•Q ÚM—Œ£éiZØ\NŸ»DcØÒ{Ë\èÝ%Ž4i[Ù' äÂCftwÑA3ß–Æ/q¢Ú󗎧Î] Ú‹WÌjÇÒ+[ÁhéOh¯þÒUzw©#}°ÜE”q‹hi@&m‹ÞGç¯6«gf˜a½ÖqÔu'îu¤÷–:ÓésÅ}GÎRýÅ–¼:Ý F­5Q™Úõ•Çý´•}«ì\ YÿqÓ”þŒãÕ`ü`|™}¼z;m‰-¥°¬2Ì2†/ŸÝy4v¾óø¥NTsþ’¸áXÍj¸(m¬•‘ñû°ƒQn&¹éî݃K•ž"ë åTöÏýÞ½{·_áï”ý>ŠÇª=†;wFò¢Ìõ"ìcâ°vw?Tø{þý6ÎS\_Žs(×f°smɬ%éî¢0…›æKkC²éòõVÝ]bù€:nvÓ—ë=ÀâªÚxOÆã§éì…«ƒ¢EÝ?l`TyJ°Ã.‚Aaãñ†»yI=»¥øÒ†+ Ç…ëÈ ¨Ü|]Qá ¬èŸûèìì¤öövQ:::Ä8x\Ü/×5[,o`pºÖ€ûomm¥ææfºrå ]¼x‘Ο?OçÎÓþ7Ï¿·´´P[[›'”Á9k3Ð5UÞWá2½ ÖT Æ÷—9Ó'«vПTŠÈ.z¨%Óš\x€Þ^hû]ûÀˆs(_‡ŽÕÐÙóV0ú9ÉMÈ äÍÇêÂ… ÔÔÔD T__߯ðwüoÈK—.Ñõë×8åÆˆ¾‰ïaŠÂí\»vMôߨØHµµµtúôiQjjjÄxΞ=KW¯^cå16¼¢œ?÷ÏbÐË5àþN:EG¥ÊÊJ ˆÍ"ߨ Ql¶Fˆ2{[$íŒÈ  ø KÚGGŸcg€ò\˜âå!¼6|W[Ûè« ž`/é5edêÈnæöxúÉ.ÒÑ“:÷ÓÓ ôéšíþ8 Šú„@,w¦º‹*NJþ:{e`gÆì—AozÊ(BbS38sæ ?~œ¢’÷ÒÌÍaôþl/z}òö~å);ˆË÷+ƒh®]4yÇìÀäûyÓ1%0g%EäMËøäÉ“”–G“ׇhú}í7wñ7÷;fªý¼.œ³+pDæô'Ÿƒ6™¢ñË…_>ÇŽ£âÒrrðÛE_/ñ¥ÿõ©ý÷w7›\^úÅfl‰¤À„<±¦Ê—‡¹ë£Ü78=‹öô" ×Í.¶T_•=½4Å1XÅf*Àø>€Å›å¹‹þºÅŸ\â2¨üÄi:uö<•Ÿª¡»2ÁÞ:¨ÎŠ„®8oºÐG¸§ñ2ŸPdz!µ´uò9uí½ÙÝ£¾ÇtM§ÑN†¨Âc£¤H¼©™Ú•”í§æz™¼éäýϯh£Oš æ’_|oX~lòŒ£¿y‹IcØè»G°Ë¼Á͹xÞ|÷Ës¿|ù² ÂLýv†¥Ð»3=Lƒ1þïÏìic„NŽ).³Ù}ðÛotÑ’Ñô)„/{*Ž 0§’÷é:^vßnö”‘ÙSfYß‚ªãEÌzºÐ¤­´<8‡~s‰£).Q´Ä/…f¹ÇÑWèëÍ4q[â"t”oÌÝ&îo„Pˆû÷NȦóÍ×M|@«iºc -öЦkí*?0A€dbCRí±ƒ‘À¬S„ªª*š².Ð$èÛ€“7E iûÈ `ö”_ù…Åfƒàdýq~4•:JJÌ fp0+ÊsŽM§q3vèÿï¾q¥‡‰2Ë1…lC 4…ÿÍß¿ð›áÙô-ÑTSF°®æRέ½ë6p½:g+=¥ûþ²†lÜ#èdãyÍì¿}Q ªN ý YÓï@z'“m\1yí9BA{ORÑ© t¾µ›.!%ßU$º†œ'-7ná»›tüì5Ê=|†‚²ÑŠ€Tú àÌ;¬bkãòÊiwq¥úПÊ)ÇSsþ"mI¦7qö|”ö…i¶{(µ´w €†²‘Ç F¹)ùìÅ23g_? LÞº‹ö â#gt–Ȭ#´! žú¡ÿ^ç•&Îs¦DŽ4|&Üœ¤·Ë}h÷ŸVrº_Ÿ{Š›¼±ùå#ϦL «««)'¯&Î× ¢7fø‰9À&5õºÚÚ%Öm¡{ýËgŽû÷ß8S^ùqA!MeYyºÀf®ò‹¥×A•>\áB¯rg¸?üº–žž¶‰\â³èÖ]ݱ_¯´µÒ›½pŸ;Í÷J"·ÝQXG‰ç)aÿ9Š.iÄ¿ëéüuÓ¬qî»îR+•œ:O§Î·Ñᆋ4Ã)¥|øº ;Ø Œ|šˆ1 ª £ƒ·A‘gn&»„}´)<•Ú»ºM]âÇRﱃ‘7& `øœæà§Ù8¼ ͹¸’Zþí‡ÛèÐñ:Aq W$›Ìç5”¸$hÚaJ£ïâßd¦‚Q‘_|6e–8nw=õÓC€™´>ŽjÏ Þ¼«±]ù…¢M1ÿí G:RÝ$„^&Qt€ñ(ùL—AU”g>%S™ÿ5iÍÙ«•"ž¯ÛàÊOž†iÍÝ™L98|qeg)ª¸AR–ÐüZ:PÇg@cQò˜ò©ê€Ù§«m7¨æR;¹&ÐdÇ*;~ûŽ*¦-Ï¥¸kƒé5PsV¥Hy}xe=OÙ'.“}ä°«¦½ÌÙ—ƒ©ûØÁÈì$‹íYZ8cC‹ºÒ+Û¬yð¦SäÓÅABaŒ“`dÖ–_®þñŒJ ²*âÈ‘#•Bÿþ…}? òÌ¡‚æ,SK%¥üyC´I/,õ®jŽUaAŠÔòyªàóé)ë… eºk-öŽ8iÆöXÚžR)@SÒD‘ÅõQTO‘Eu j)þ®'cö‘stžÆ/%Iv”?‘d¡=³*ÈfG<ú ¢~ ´Ð3 ª7Áó8Yð3 [©çœ¸@ÙÇ.’Oz9•U¬[ÒõXÁ(¥¨,8á3Óokü5“ÏCæ^Çê¯ÐßM°Õ´±;¯R#\Ñ÷ö`TJkYerøðarL¤øh›f¬ ’½êͲÙõ™å–ýŸ'Ú‹³£9§û 4›Â“i,Î}ŒBÕÀŠ|J7dé™iëA-heÈ^° g(¦ d*ÈTƒOõÉÿVQǰ‚:Š+m Ûf ÃúÇ5ºÚÙMîÉ%ôæbziÖ&€Ï‰&¬pãeaÑÊàÊ9~‘ÒŸ£]u²znõšÆ!˜½â¿á±ƒ‘¥‰¬¬f)⯫ýFž6ST¹Ù^üÕC(À ±bŒRjÊÂ>#²Êbghß¹”ÇÊgS~‘<®KIÏ_jgks®úKWµ¿´:J`¾µoø_B)™ÄýgA ÁŽ *؈|FäΠ,n)¶¬‰Ÿ¹NÇϵÑQQÚ©úÒ :{­‡š!ÐéB"¡»¬*jøð¥úîþƒû”{´‰~´ ¡·ªÌçØ–õÛ-Þ”|°ž2Žœ§½'®gJ)hP Ÿú(­9«ñèêŽx0²ðBIC±Ø†Œ’ú³Ê……5é™{éÿ|Þ§3ä³ñÙ+íf=Q.Ÿ™{`á)YeᯡK)ð:VsV°ò¦^ò îaÈk„(­iåÁyr†[Œ`?cA ÅyP›ªAÅ,;Cñå [|’¼3ÊÉ)>6â,·Ð+Žf¹@jìN‹¼hCh&mµK,©¥‚“WèÄùVºÞ%u„ýG/¸ €‘¯#MW!¤‰€|g‘mŒÌ{z™ö=G[¢÷RHF±Q¹‚©k3ÔõF<yAv&î×PÇ~Ù!DLu s%•:T¶ˆ)++£÷gõI~ù¥a*` 8mɱ>Ï»sƒ„DU×¥lãèé3fQ¶×{ë6­ôƒšÂ^°§Â ‘Ïk|.ŒÒQf?û΄̖ò¿£Š„g)¦ø4¹%åÓr¿8úÕ>€~ØæK?lñ¥ï7ûÒ׽鋵žâlúæ¼­ô ØÍçgl Wl6Ó÷[ýiktÅ•ÔPYM T ½L ÕE9c• §úÂu²ñˆÇYÖ–üsª(÷äeZ”°C®pø¡ÀPƒÌÔöFY˜Ã:9¹Q·ÂM‡õˆºÄøŒÜ³§¬Cåsâ §ð~¦n¦\\O—ŠÂ˜²_²Àürêèâ «ºC•ã­½p‰>Yí&¤“L§»E …PS(¨¡êo0ãÀ†Æ'ûèlšì`ùÒw›ý¡ð÷§o6ûÀ\Î J~o|zÃ(€\çA­vW™Ð‰âB/ÎÜHOý¶šÞ‚ h¹_2À}šª[¨ûv /ŽB‘ÿêvšEXÁ1Š.:IÍ>}+_¦x‹˜òœ†ºÎˆ#ÎÐ¥¤Ž,Æ¿xùªNC€GFÙ.KtÙ²&'wýËÄ>á+é]±£IkÂi‰ë.² ÜC~ñûh‘sÍÚMc§yê4à—“)Áx¼öœÙgF9î{Ð).†%Θy¶ôƒm …Ԃکχ ! ƒ1ª¨@¬'äBšá…?¨à6˜¿ù àý°ÕÒ×XrMØKá¹e”TRI)eGh>#rÊÉ=!‡æA=òéŠí4n¡#½³ÀÆÌµ…ôv­0 °Í¥½Ä^»ÁºBmÕˆŠB¬»"XâÍ ªÓœƒ¨÷ö-c`X·x0òåsoPC”EudÉ¡¶!À££´,b¡ KŠçl îgL`ìe»@©;åùþåwòM(¤ó0ŽfÁë+¹°9«fX*Í6º‡§•î ô»¯Vøs›Ê3õÅ+×Ì’¦jïÎuÁ»„`Ä7ó¨êŒØ„`QA £q6Œ):]_}¿ÅG€ðûm~`E}hg …ï-¥“M稭£“z¡¾{[UîÝþ]­ºÏÞ10ÄÙö ŒÁãòÒÜí4 êøÆì-ô¤·6®á”\VK—Úú+ï… ðUå5Í4Í5š–øÆXœÀF{m‡Œ¬Úøÿß"Š]X¡Î·ëàdÿüÖ o7ý’Á*ëþŸ/¨¾éüCÔQå=/ ×ûfäßd=m¥¿Te0HØè»¨¨H(öeýD=g9eg‹¶ïÑÔçûf;$Ò¥+ÍBźYºð‹Eú\JŸGþ]œ³EÑï$bJ*ûV~þé{wÁF3ŒÐµØÞÂÚf®G8­ Û Šs¶?kŠób8J4Ux’xD€õž|œ =dbþ~Hªûæ êêÄ gûk0lÞ™uϲ°É Ÿû;Q箚šuÃP=ûÐ1š…vÞ™oPÚÒóÓÖÑwx ú»ÐÆB¬‡)ämŒ™A3\ƒ±wL\ ‰V0N^@ÿÏûÛD±Ø·¤øèYM®•}Ôà:½9«¯Í9Ž»2“{Œ°À‘c˜¸4BoÛü›¬·§äD?ãnSḭoY÷ßm7øá5\í7Ƕ ‚úq›òÜË}HÝ©ü[¤²Ã9•É cjÉ”² ô ŸíÓ¯MGl‘é8ê• µÛÔ©3çh¦;Ή`M£ ÈWêYxÃ6±³—ÌŽþ¸-¾XìÂS¨ºñ uv´Qëµ:œ±"ÁÉ’énµÇÈõÎ.Ú™’OX™½æ+8O~¹v;(ñ1jî²OÒ A^YÍ!ñ=\×(fe’Ò0 qXÁÈFâÿãC;Q"ŠuN¿`”uøóíÙA—)l‹¬ÿÏédM“ð”Ô@Œl'ë¶]Sï}áJÍm7 Ž•ç"Ûý—Ï]¨¶é¢^µŒ±M$Ùe~ù0(yL2 €>7³æ6¸s]o£+­ýÊM‰óÅT÷$ØýÅ;#áæ-ô„ý€ÈRSœãËi}H”ì>P¼Òovþ”œ_j VÔ°¥ùaJ¨dMµÿÖL$ßÛ£¢€¹‡OÐWäxöÆÀr¶{$œ¸HÐãfV£ }§)&w|Ž/?ýcÙ¸…Бº&„Tù¤Þ€ã…–VQÎsin¥‹-mjCc+>´¿+§o¦œè,ŠsT©Î™¿Ú¡©#ëþ¶m·ÁUÈÄ—u…«ûQÞ`Ò6Õ=h—¦îW«ãô¶Ë¿É6³ÊNõ#³“¼QØþt¡]¸¦ž±qrgÊvÃa¦e‚±»¡É á…‚}•gM]áBŽÃ êËuÛáQïŽsÝN¡føfÃNú…mL{Ç`ó† ½"ÛŸzejŒ~æm Š,ÈñJ-šŸÄÉblV!(Y‹ ˆ-ýÙR%ûÉÏA†8‘‚)fK•çG]ÀìQ2µü0}+ qÐòÒ%¡@¼‚òj„jE¥û¬Å¸È/ûT3;E ¾/â…Ïp …[X8ÎÑø>Ц»„RÉÑš¡Eš ­ +gl ¡þÌU—è2Ý`lîÔÔ‘uùóD£áÈ`SlS4÷}·&ZcD. ¸%·Œ²Ý¯×Äë]2þMÖËV€‘ÛãóÛ îß¿Ÿ¾Z ©çciCSMÙæ¿}½ÎÁT͘¡» ÏTT‘çJåYSû^ÿôzÙf \‹„‹Ñ¸ÅN®óÝ%Έ=ãHo@…1›œƒOq‰„騢¶ôT°§ÕP¨‡@Ý@“íýiGl*ÀÄT TœåY‘AÇ/%·"Ç,Ÿ2‰¾3&S{>zîÎ¥wyœsàêhTa5äÖˆ—†4ËcPÆ•ž¡UÁi`Ÿ}égû@Q¦»„ãiMqƒ£3Øzص:F§›ºÔCVoXÁ8sS(ýËƔëœÔ-HOeåçTû4ƒ‹p²©¥ß}L¥‡>Ÿ­4`„ø]¶ûíºD½mòo²^vyµ4ò¼È7,E}úGM=ƒ¡+ µJS÷›Õ1Š 0ÐÀ eªÀOiþÐß :6Ã6®Hcî¦9+b³Çbƒ;ÆåBèCÓbcùΪihÂú^Óœ%•“gasÆÌ\SN]€d ú/ö7iÀ4ºÈg¡‡\œJaù0Ï­‚&$ƒ‘-…ìJÄ‹‡ý3ÙÈýXý|¸ÊÞš·…^ž¼œþòÍ,ú»×'ÐçK6›‘‚Àœé¯;¬`œµ9œþõ+QÜb+ôŽRÖÑþ4¶Ù§;dhÚŸ´.NcD®#;Ëv¿[Ÿ¤w ü›¬—££Œn'•ã’35u~ÿ½ݺcØ5H9¾ Ýû…ôt •l…NH'ÙŠ†©âu|¥Ï¢ÆRËÏ`œ‡ *(¨Z’GChÃlÞo 2³()¯„ÚU¬)ƒˆAÔn sãu–‚)%ËÊmwt´‹ég#ÿÆ„e®ôö¶IµzÎ{Njη‚¢CÚËž"_Â耤'¬ÚNc¦¯¦ßø=ýËëÒ?¼øýÍÓ¯Óÿ÷?Ÿ£ð5«Ãs d}rϰ‚qö–ú÷ovв=N¿ÔQÖáÏOæûkî™é¸ÇàœO5]ÓÔå{c2jÂ.Jg„díOÚ˜¬·=þMÖÛ»ÿ´ Œ¼IØÜÖ‰'h#ì!MiKvòÊ´`Mý“u燌E5e#tƒÅÛ’(XÐ×ÀÞ1õ%TRÇwá 8Ý5J°¨ŠÈÔÊXHUw$ kšYN!´Æ7á/Ðu€OQÚ Ë1))×ÙMæZ°R£=¾MuoÁªúÈ…;cé}8?ƒ³£c\ùî­!ŸœSPŨü)#Š™U=Ks<h<^2/|?‡þá…wèoŸK÷âÛôwϾIÿãÙ·è??BK!°âØ?óV0ÎÙI¿û«·(;â귬ß>a»4÷ð¿O1ì¿Â{Ÿ¦þûóÃ{ÊŠr~[³s1ƒQ¶ÿã&ý&kü›¬§£Ô/²ðfžm´¦Žsô~ƒÏ±¥½[S÷Ù_Ìö3ì&‘ (>^K;’ö ò‘íNûÀˆØÜëÃrúQe®òE\hv“¡ØŸ#ìÈÌ|PÅëÀðóúè–Ô‹JÐJõEŸÂ_¥ÞѾJ–•ÿægÊ ÿ$ÄÄ™[Ö7ÁzO‚z%ãtM?ÞOÃ~–[c 饟Ò?<ÿý=ÀøwϽ @¾IÿôÆDzcê *@ԈḆŒs·EÑï¿÷Å#A2Y‡? èÓÅ¡šûf»ŽÀ›þ/?hê3udq??D¦fž¡»5¿ý´%Uï3àßä8r+j4”Q韩œÏ®ÃÒ¸½›4í}átûz\›@Û3ðDÓ+^°x¯ÏÛ“7xfà\Ŭ«kò~œ·ú¤¨‚ʰýiÁ)š»S”…î!ÈU jUä9i_,´‘g@}‚¥´•ÛPRSþ[ÆÚ•T’ëße<‡hqßÁdÂr7•ÛRdþ rI;F!û Þc†©À¸=e?ýû›«(âsoÑ?½ù9=÷Ó"Z¯”cgL=4ÔÏjXÁ81Pÿøc€(ž»ôKeþd»Ï°„LÍ}ü]õYÃ!ûì"ökêŸ Vê¢püe0î MÑüöë¶ ½ëË¿ÉqäUÔjBê3ÙKãàÁƒôÓÚM (º’ n—í-pS…ˆ™ÚPnˆ»P¨‚‘„]Tšrpùtí¸!М%«Ū‚Ìp…ò§yH×¶Ñ?VØÐ²y[3΋üÂÓžQFK7Õ€ÆàS¶Å˪¤¬ò܆îp¥ÿ.úx%΂s¶ÀH½„<2O’ßÞS¿Êbˆ­„‚²ÐÆN xy<½øËÌ7*ëa@›Xq SHÕaã|ûúóÏA¢ìLªÒ»¯dþdˆC‡Ñ_WEjîýÍÖðÙñZG=?%TSß-²@˜ /|Ä,•íj‡“õòô‘Ï9lª¢¢‚¾_¡©s ZùZßÅó•ímÌ´~q° Ô®¤—±c¾Xïï •K”Òâ†=ô]j üç‚Eõ òšBŸÈ/)å¥ %U3¦ðçßY€£#³°J@3KÌÖ9¾P×L\³ƒÞ…`j¤ªþPqxeûÆ]\C¯;^¶^"ZûÎŒˆéƒ]síû‡Œ béé_CDñN>¬wn²²> ¢£“s5÷ò÷y•g ®cÔMý±6ˆûY]#|™2Êö§Øgémƒ“õö¨ÓPF¦hpª¼¼œ>]¡©sú¬ž¤.êx¾²=GØå*Mö†ú!›ÓžŠ©Hƒ#(ä—}á&Õ_Ñ/ý·FeÒLÌc7ãz+SE•‘·6UÔ' åºÌ¶òï2ψ¤vÚ’S^kåÅúJ « ÀÞºÕCÉpÁúbýN\v‡‡Hç×ÐάBˆ#_&lÎÇ&{›Ãw£¹¾ùš³N¢î°‚q¢^?;9LŸÝGôÎOÖáO^|¦D,0™¹5^sÿw ëYÍ0~a_}§Ð\ÁZ2e”íOsÐþäßd½}ûƒ‘©,Û¤~¸ BSçÒ5Ã’8ž¯lϦ€–FåC8g\Žm­Žð¦´¼áø5ëBR¡Î`0RJLßp^T©:ú=K–<3åÒfM¥‹›²2S?^ fCµësÊø=JêØ s»›¸\tô4€æuošƒ©l·¬* s4`Ä|¦Â­ê@õðjômôaãb§ØFŠâ›Âaãu_²òCâs‡‚¼·Fªû¹äî‹r­«¥¨½ÕšºïÌ‹¡Dgiª¼†ó^½càß4ýªïG%ß­©c Œ<_Ùžsdé°³©º&~‰k–ûïÁ£¤nQnhFD]c)*Ÿ³à)"Á¨MÁtQE¦‚†ôŽlLÑò©u–Ü–¼ø~åÙ±£½ÊNÔ"C²" °ór<ÀXCÞÙ}gF?›ô-ñM†¯¤eåwV0.qNDžöhQüR났ßü€XÂÆ¶ |æ›ï˜¤iãÇ-™¹‡Û Ž.KÖÔßè•BÛaŸ(ÛŸå’§÷~þMÖ+УdS'.ÕÔ¹tݰxtîiM]—¨2‹ã`W¨ ØT-—©ØÒz6ŸÏ‹sƌ╩™RÁì*¿<•gD]l¬®…ç{µ­oø^e¨I¥ª£QÌ‹Sƒõž“àм2 JþZòß{ºŸËSúy;‘lÕ²RÊ +—ºìBà¡XQüÓtSâ‡$ëð§LËÆŸœ+#+¯˜^Ÿ­jƒK „ ]ü»¬;n~,9"ª¹ü·Û>½·òo²^çÊ¥,À‘v©ßBE!ëo4,áM‡DÖ] ]¨%HSµ'ŸWu,_ÀÃÆá .¬c´HçÅ9ÎÁ”¼¯Lc®Ô2p¤á·< 2€L½´Y\fƒ•Â!^ynl‡Ž3½´ ñuF”ÕA»áð\CÁûTvªJ6õgû0Ê€‘¹ê&ñ©Ö" +—»&Hñ¢¦ëÎÓÇã•uøS&páÂCæoF6*YgâÊT„z×o†Æ¿qYÿÇuÈ%¡Ã÷½{„“õ µÀÈgØ æß”¨©SUk˜*GøAÙÞJïüÇ®gÔ;Qµ4ñ&6ùLP¼/7ø32e T•ÂÒÔø\5ƒà·¸–7*/ e(H>ã)Á¨M9•,§ô0Ñ¿x%à¤dUÖQžÛ@ƒ3 è»­Œ["ÓAÕUÁ’•’`Ö™N² ¡ÉÔÙe˜ƒ1õ¥1õ†Œ+Ü©zî.Q‚2ô‡[—uøSúù!óßìD[\áÉbU;\âö>˜óïÊ6åßówèŽ6À Í¿ÉzEUýôŒ¬³duË,Û¾ùä2|~­»Ð®iï×m™Ý§oó(Ãæ«¾½ŠM½>(Ažú™ŸBµ( «9b5Ü/­”æ#œÅ\PF×èTºÊžZ`””Q²© L]–5ü,¹Ž®ß™ú)Ù\>'Êó&·¥rÓR½ì@ÎvÅ`tÝU ‰ÓÓÏÛ$¿š&Ì^Gc` ¸:(þœíC¥A·1¬`\é¾–É¢ï©Ö;Y‡?exze°`6kÛꛡi답™F©#×Q¶ËOuÔϦ.ð(ÑÔ/ªjÒXàH_F6FXì’¢©“YaXÕÂZö?~qŠIyBý´u4À‘¸åUwá mO̦¿nòB® U¢ÒáÑàôm¬,Wzk°‘xä¾£´x{(-€ÏãJ¯HjÊÅýê2…ã5“‘ïä Mcg õ•*Õ Fþ·üÛa—­êúZ¸=Œ~Ud=£wgi…aÊÈ!B&;‡«^ƒ“EùüÉÿfV”L]„LYˆž´¦9ôA®ßo%Šõ3Ýìæ›[ŠóX`?]£ŠJ6Àä T'N¼I¹‘‘'Î[À²ºF¤PÓ¹³t«·Ûlɤ¶:ƒYT•Ve]u³ôv¶cÍ‚ÑçxtKܪÈzEU ç 6ýì©}á€òS>*j¨lwXÁ¸Å/9úŠE‰+о’uøÓPNz >¿±¯â:Ÿ}šöãô[ø˜²ÐÃŽkÚÚüÂC¹6d`d"ÆçkêNs­ ;P£»×·ÁD«Tsß¶ÅŒ¬& ‡èÌjráùñù˜Ó ðïlXZ¶Ÿ¼¢óÉÆ¥@Ó†rÝäßÕWÌJ §ú¤í£Õ¡9¯U\¨ª¡X0ÃÓ÷’7SHXñØ…î¢Ã§j¨Ñè^†Ö‚©¤´ÆéçB¡Ð]$±áëRË5r‰L¥YŽÖ¸"^+\¦6…eˆ´ä(KŒLkcä>Ú‰s­%_à ƭþ{é¯[KE‰/<§wdþ4FI™š0˘ #òï·•hú8ÒÐ6àg±)Ωý'#o"©bañWP!9îäRÓâªðø~´/×ÜÇ÷Os.%û°2ŠÏ¬ ²ŠJÁ‚³*s_Åe”‚úÑ&ÿ|úž¸ß}|/·Å}+Ç.©º9 !i(‹ú§!Úvà^ø*,rd°à°«qyU¡i{A)3¡öH¤u~1õ_F—ð¹ÙÕI=Ý]`_U™µxݸ0«Íl)Ÿµcãˆwo!,Æ=Ê­¨Q Ôy§imd9ˆ33?°„¦xåÓ\¿äÞ8uG>¨d:¦d‘Oâ€q­ƒùܶàDŠHÏ£}UT]×@ç8@Ø•«t/ÐË`ÃÏbý8*yqÕQ ÙSH+ü`/ëKßlBÆc(õ9zù €Ñ3¥Xd&f;Yí¬XB•d7ñÅôæB;ø6&âEmú9y8 ;¬`´{åxH”¤’Kzç/ëð§10*©£t±ÚU¤ég]èÀÎŽv15š6œ¼¤3à°RˆÄlrFn9ýætPs_Àž3f?ãês7(jßyâþyìr-VžßÅ^¤´ý—‰ë黸_y_&6¨.¯ ãCáÞä¦†íª½ÐEršµ8$MuO;J³} iºw!Íò-¢>…4Ó»€ìâöL8Ëâüè‡àPÉYä»+“\#wÓVœ'7²$ †lN—ÈáùáI¦SÄnÚ‚ ÉlôÍæmßmöy<¾Ûê »S?aêQ|BEru&,ÏU/ o$ꙈD7lkû ¢ØY’»”®õV0:†Ðd—âì.ÓMMÖáOSÀ(©£t±*)-§Yî‡4}åTšoïW¯¹ÿà©Ëz£K6™%œÌ®&–jîãñ‡åv­2 ókx¤ÀL½Î…U*Ið@®ÜÊã€Øœìóužä‘~˜—Ó4PD?€Ñ¯Hõ PN —•WÚ! ÝSFÞ‰Y€¦Q lHY/é jÉ”Óàt@pj>_n„%ÏRä™íA³·GÒ"ŸXä…L@´ð(¤œKA˜ÅC”XÞ$Ìó´-l4Á•Dÿœ“"«“-ŒûUÎÄ÷­gƾóKYàZHSÝŽŠ’R~EïþuøÓ0JêÈjëÝvÆ–júZ쇔nwÍcYœ4÷£Ò"ˆ¥ž,éÜtPs/ÏÁ=©‰ºoÎÃ1°èº‡ç¹"°ZÓÿɆf³¤©²Íú‹WàjÃê¥2 2#”ãרðŽ»*haÈ~šîS@6 6¢üœî£åÊðròÌ8Já{âLY Öuù^ ”þ){)*‡˜ÜŠÊ-£Pè6ƒ¡ Ì(¤@¨¨|ÒÊ(ÆÌvrÈ %KªT_¨¢ÖˆÙ|ƒ­'¼OØŠ/Œûs¤¿«>kš0m¨Ößœv†•2:‡á\t\”Ôýú•¬²š FIYÂÉa18ÜRŸ*Mq…†ãšj/¢sb“æÞCÕW æÅPºw±Jâð‘ã´-¬Rs?ÏcsT=’sJ¶9Ìôº xÿÌóš~çy öŽ®‡ÌÔ µ(ç²V5cæqÆ*•¹,L)¿BhÄ­xÙ- ?¨fUŠj9€d6v¨¨í®#䉤4¡pò ƒõŽßžä“¡Œ»}Püö¢€Ìès”l+i ÂlzgU«Ã->l]#“ÚÄï? J}ãñRQpÅ8'ÀœÃþsæ­[j‰é+ùxj>v0Jg\ÖºF”ÐL“¢¤Uègeþ4Œ’:òùˆ•Ål&•Z®éÛ*ó)]€†¬êñr`I#Û[à[C»÷·P–qßÑVÍ=ó}NS[Ç “Æ ¤Î,L/„=‡5m)ç¾ï2•Ÿî Înuˆy3$ðhã J,i¦¥uõá—Ѩ‰³cŽž­ –>Óœ‚è$À‘©ã”ý=Dàl¿úBêÿw«e!…‚m€C™Å@€ì+üï™ø~X[ÕTþ7q×çOëë/ó-ˆ“‡uL ½@Av C6­-°;Ý‚ñ ç Ñá‰2óøª‘¶NÓTMf>†AUì`d᛬ñÆ J>@ó|j5Å5é<$tú•5ašßùÕšEMÉ2²Ê¡òðQØ¡žè×/aypýC}óX”ýs=Ÿ´&³ËþÙ|mGÙj&¿ü9Dh r-¶Æž¡]¥-´଻Ô-Фò»SçnÒžƒ×Ÿ•ë¨ü{MH-å8/€hŒš÷ßI°(ű::¯\•PUnlñ©òòà4roCmÀºÇø‚ý´·òbå‹2³=“hUD)-€' ƒr€&XW!àQƒRþ­ãSP- âû¦JnŽ?$ÈŠü„ýçÄÙqyP&-Däpÿ´<Ú{è$¤Ë´,õ;8/2ðdÄá…¢öDáùá<ú@rdP(¢›+yÌÒjŸÏRåá-^K üêM*AY*6Ëœ7;÷)YFfqûaű.´Æ¤>•cÛÙ@-­fnjUÿÒÊDôå0“ye'É6ªÚìq˜²^[£ë) TƒYteÊnÓ÷ œz±^ßoÚ =<„†¼"ÒÇ-u¦]ÈÜ_Õo og¾ÚèE‹ý3huD- « ÙÌzB Ã”OC1•U€’Á((§šUeÖvQH¹È¯ŠÀÄ›¢òé $=uË DW^l˜ž^^%Ô/¯Ïå4w}ŽÓLݙʟÆkZ‘ÏM_›GSó±ƒQƒ•ò,X)FzïÍ‘u´( QoYÔ)Üyjk!½ÃÍ]fW™*KONûœš6Fî›Çµ2¤1sÎQóõ>×&sû—®NLø…"Óš1¥,^žµ®X~”VV öQÃþ}ô©ŒjÎ]­Þ…³.ç}üŽ»ßÁùwºk$-ôM¡U¡y0Ÿ+¤µä-+gÍ•øÜ] w­€¯€Ví!8!ü#°Ço#fÍ»”²þð(öŒxh»h)ôˆüBÉ:pJÿzÅf+¥ Bð-UÂ˺†Œ’u”¬›tâ©,üfgà vcõca``I«tGâ¾´‹t[Êþ•›AÉkÀí3µäþ™U:ÞJ¯xé±!6ñùSfoâσçà —~C³ÕT›vWÑAòD†ã“Y;$5Å|~‚¡ÔM¾¿Ü’Nœ3Ù!*ž=}6—^}±Ö“V"Q«=|+WÃôí«u‚¿·ÌQœI¹0efö˜Ï~ü÷w[¼a{k8±ê%¡z9´"%¸/t›Ñ9¥êïa 360J@JJ!7¦´âçO¥CíÐl¬¾V$Û(û0ô)ëõ”À”ë Œ]ÃàbJFù7/£ok¯Ó@)¡þ¹é0ŽÀWÆXT`üÅ>P-HQë&Õ‚ –tŽ…Þr¶[´6R¯HŽ T˜ï‘ºF¤s‹Da„Qè åß ÆIðÖhS$Á14~ÎÍ}8}TÕìv‡Œfö ¹A‚_ù)©öo–¼$g ’õïUÕ[ÇLG:¹v-ዜ§˜|•D´O‚«ŠÍ£"½¢_fÉë¢olV0ŽÄ§6BÆ\ :–\ÊHlJ@²Aùqž³?õ•”ìp}£ãËúG¯ãöدö‚ù6Æ–¼tV0ZòÓác«¿tUœµÁÈ—ŸÛ´§WMä-œ¥§!¾*ÂyŸ ·Çñ\ë†9ÿP?+‡zE­íiV@Feæt*“´”’Cêz† ö³! }S¨%¬`´n-ë x””QPG¦rsÜC„äW¥“4 Æ»÷î"q´ð¡ì ¬¬ò°RÆ?ëOÖ < Úó—wu j g¡sä3`Å)ÕYѨ›Zd{ úÄ÷–9ÑxÜÿlNßD{¯ÏÞŒ3£yž7–¾þV6ÕÒŸÐS½¶ŽNrÏ‚zÃúE(Ý7Ó&D17A/¢š5À(©§="¼l³I€™½ýa×Ú©?ºÁH\6+GâScVR=Ö!ž†Sï.˜Ö]¸ÒbæèU-]†§O|~9ƒ¥ÔMè"Gãeãh|ªÖ9Ȱ‚qD>6ë Gã XÁ8ŸªuN#r¬`‘Í:èѸV0ŽÆ§jÓˆ\+Gäc³z4®€Œ£ñ©Zç4"WÀ Æùجƒ+`ãh|ªÖ9Ȱ‚qD>6ë Gã XÁ8ŸªuN#r¬`‘Í:èѸV0ŽÆ§jÓˆ\+Gäc³z4®€Œ£ñ©Zç4"WÀ Æùجƒ+`ãh|ªÖ9Ȱ‚qD>6ë Gã XÁ8ŸªuN#r¬`‘Í:èѸV0ŽÆ§jÓˆ\+Gäc³z4®€Œ£ñ©Zç4"WÀ Æùجƒ+`ãh|ªÖ9Ȱ‚qD>6ë Gã XÁ8ŸªuN#r¬`‘Í:èѸV0ŽÆ§jÓˆ\+Gäc³z4®€Œ£ñ©Zç4"WÀ Æùجƒ+`ãh|ªÖ9Ȱ‚qD>6ë Gã üÿˆ¦h/ѨmIEND®B`‚nco-4.5.4/doc/logo_cog_nmr.pdf000066400000000000000000007700301264355130400162210ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[22 0 R 62 0 R]>>/Type/Catalog>> endobj 85 0 obj <>stream application/pdf nco_logo Adobe Illustrator CS3 2009-07-08T20:49:14-04:00 2009-08-24T11:06:35-05:00 2009-08-24T11:06:35-05:00 256 176 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAsAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqhE1bT3jeQS/BGvMsVdQVJoGWoHIV/lxVv9J2foSTcn4RH jKPTk5KaV+JOPIbb9MVXT6hbQRrI/P02XnzWORwFpWpKqafTirS6laPKsSF2dgrfDHIQA4qvJgtF r74q2l/atcfVwx9WrAVVgpK/aAYjiSPY4q5NQtHjmk5lVt9puashXbluHAPQ4qtOp2ghErGRUZgi hopQzMRUBVK8m+gYq02q2SwLPV2hYFuaxSsAFNG5cVPGlO+Kt/pOy9RI/UPJwhHwPQep9jkaUUt2 DYquTULR7gwK/wC8BK/ZYLyXdgGI4kjuAcVWLqtiyuwkIEahzyR1qpNAyggcgT/LiqpHf2skMkyv SOKol5KyFSoqeSsARt7YqsOp2QhilDsyz19EKjszU3NEUFtvliq4ahbGcQD1DLRSQIpCFD/Z5HjR fpxVsX1s07QKzM6GjkI5RSBWjOBwG3icVU01WxdXYSECNQ55I6kqTQFQwBYE+GKtrqVq0RkX1GVW 9NlWKRnVgK0ZAvIfSMVaGq2JijlV2ZZuXpqscjOeBo3wBeW3yxVLtV87+V9JuxZ6je/V7lgrCNo5 SaP9k1VCMrnmjE0S0z1EImid02a9tVuVtmkAmZDIF3+yO5PQZY3KUeq2EiO6yHiihzVXUlSaBlBA LAnuMVbGp2RhMvM8Q/pFeD8+fXjwpzr9GKtnUrMJC/MlJ2CRsEcjkSFAYgfCeRp8VMVdLqNnFP6L uQ9VB+Fiql9lDMBxWvapxVtNQtHuPq6ufVqyiqsFJT7QViOLEd6HFURirsVdirsVdirsVaYAqQRU U6eOKpB+ir5ophGkixpAIIIZ2iLcS6sQpSoFFWgJNcKvPL38+PJ+mXWsaVLZ6l6iyywA8IZKOi+k 3J2m5Ecl267ZnR7OyEA7NJzRBpHaN+d/lDzHd2Hly2ivLWe+eO3M1ykSRHxQFJXNXpxX4e+DJoMk I8RrZMc0SaehXltMbxZLWGWOYvHzuBIBEUU/EGj5/F8NR9jMFtbMFzJqsM/oPGIi4kkaQPGyFSF4 JUlWO1fhHfrirDvzA896b5Shl/S9ndhdXlBtDAIX/wB51iD8qyjj7dcyNPppZb4ejCcxHmxiL8/f J93cw2a22qNFJdoYuYjLhSvGgkM5cH1DXr075kHs3IBezAZo29TSxvDpUVk0fESykTAspKQFy1GI PxMV+E08c17c7ULCea6KwJLGsrxGeTlGISsZBrTeTlQU2oMVYx5t88aB5V1CP67LN6iSSXC6ehid 3Z1ZQyqp5IrFq1kI9hlGbUwx8+bm6Ts/Ln+kbd55PPL38/8AVFv5bnStKhhEihaXkslydmLVFDFx G/2QaZhS7QPQB22PsIV6ifsH60BF+e/msH99ZWMiNL68w4TKXYD4QT6pFFoNqdsj/KEu4N38g4yO cgfOk+0L87NJn+rxavazWUkMTwxz20hKcnKlWanF1FRv1y/Hr4n6hTg5uw8kRcDxeXJ6rA316O1v dPLTNMIWbUYplNvIi05/CH+Lao+x1zOjIEWOTppwMTRFEKtrZXtvfFlST0zLNLK3qAxuklWRVTls 3Ijeg+eFiugbUQbi7ks3N6U4xRl4hGFB2QEOfGpJGKsR83efpvLHGxSxkfUrsfWJ5piirRvgqnps /ThQCu1O+Ymo1XhkCnX6vXDDIRrmmNnrWj6hpMOqafOUtYLc27kzLbNBLsR6pZkFPpIPvl2PPGUe K3IxamE4cQO33PJfP+qR6p5ru7qGZZ4AI0jlQ1VuEaqSuw2Lcjmo1ExKZIee1uaMskiDfID3Mx8s /mLo8NrYJqtw3rRRyR3bGF2LCgRfjVzyqij9kUzNw6yAiAebs9P2nj4AJGiwjzF5p1HVNWF5FLNH Daj0tOQsA8can4d0p8Xicw82fjlbrtVq/EkN6F+ez3XT7G5XRrcXEN01+rRyyy8ofVMoj4l/jYrS nw77+2bqHIPSwGwVDZ30Wm20PovPOLgXEvFk2pN6pBLMlTQ9u+Fk68sr2a8eVYGq7QNE/NQiBCCw lTl8RG9Nm9sVRMYu5tT9S4tnSKEstswMZQAihdqPzq3QDjtiqY4q7FXYq7FXYq7FXYqgbe4vpGvI axNNbuqRvxZVIZFf4hyY7cvHFXxn5uWvmzWqkMfr10SRsCfWbp12zp8UzwD4ODKPqKVxs0UokjYr JGQ0bKaEEbgg+2TMjSK3fWP5dfmDceZ/LdlfFoTepIlnf2oB9UyinOQUICqV+P7PiK7Zz2qweHOu nRzMc+IMng1W6fU/q7BPSMssdArAgRioIkJ4MT3UCo+jMZm8X/5yUnuJE0eG4KE289yiuilAQ0UD 7gs/82bXsw1xV5OPn6PF9I21ex7fv4qE7j7YzayNxLQBuH2kb7UF0u3vG9NZHaP1IyjbrLIFWnx/ CQrV75yrnsW/Nb8wbnylYRLZtE9/fK620TKS0dBvMfioQCdgV3P05i6rPwR2+p2PZui8fJv9A5/q fNN3eXV5dS3V3K09zMxeWWQlnZjuSSc05F7vXQmIkRFAcqTzyt5C8zeZmY6ZbAwJu9xKeEYFaGlf ien+QDlmPTynyDj6jtGGEkTO/uKdXf5MecYLR7iJrW7KS+h6ELyLKW48tkljiP0dfam+Xy0Ex5uJ DtzEdjY86/USwm7tLqznkt7qJoLiIlZIpAVYEeIOYhhRouyjqOKHFGizL8sfzGvvKmqpbzSF9Eup FF3A1SI6kD1o/Bl7+I+jMjS5jA+Rdf2ppRmG1CY5eb6Kt9Yml1ARExm3aSRAwVqcUXkrCWvBq91G 4zdPIlUttTubma6WJYwiRpJbkhiaMWFXA33CcgB2OKvLfzfvbO6ismklT9KW80kXpqjIzW7KG5uj EslHFAD13Oa7XCJI73T9qQhKr+ofc80Mj8fnuRuema/hDqBhFkeY/HmvVZXdVjUuzEAIoJJ+VMAD XDGJWN7XSQ3UTUliaMEkDmrLuPc4TGgzlg4Y2bU+bCviu4IwUGIxxNcxbPdP/ObzJa6S1rJHFeXi sBFeyAkhKb80Ujk3ga/OuZsdZICi7aHaM4xojeuqI8led/O9/r0jm4+uQun+kRyr+6TfinBUK8WL sF2698lps05ZN910WpyzykHcfd9j1aTVJhfm1MkcSxemsjtHI4Z5N6BgVVPbkc2bvETHcXH6Tktn KNF6Qlj4qQwqxWhJYg9PAYqi8VdirsVdirsVdirsVQB0mv1mt3P/AKV/eEemCCAFqpCCnwrTFXxl 5tUR+a9ajXcLfXK+FQJmHag+7Opwx9EfcHAkdyl629w1tJdrETbxOkUktPhV5AxRT7sI2p8snQ5W i+rM/wAoPOv+GfNsDXExh0y+It75wF+EMfhc8g2yt9qn7NcxdZpuOG3McmeLJRfVkekwpcLKJJCi SPMkBK8FketWG3L9o9851zXiH/OTFkLeLQ5fVeVriW5Z+fCgKpCopwVewGbbsvnL4OPqOQeK6R8W rWKkbGeIU+bjNrOPpLjxO4fbt7YrdwrEZXhRSrUj4blSGX7St0I7ZyjsHy3+aHmCTW/Od/N6xlt7 VvqlqxpQxwfCWFAB8b8n2HfNDqMvFMl7bs/SeHij0PP5/ikH5E8sN5m802WkklYJGL3Mg6rDGOT0 9yBxHucjhhxyEWzW5RhxnIdyOXvL6msPL1nYWyW9q8kUUMQgtwvBfSjU8qLxUDqNy1a9838YgCg8 POZkSSbJVTpERHIzSm49QTfWapz5BeA248KcdqccLF5n+ePkmzk8rJrVuha901x9YnNOckM70blQ CpWRwR4b5g67H6eIdHc9jZhx+HLlL73gOam3qzjv3dz6V/J5xqvkfT5p5XkeyeWD0X4mPktVDUpy P7tx1bxzdaOfFjHls8Z2thGPOa67/N5l5j0zX/LvmC4+sSSW93I7SR3cBMYkUtXnGVpQe3bpmty8 cJb83hNRLNin6j1u+/8AH2JRe3d3fXL3V5O9xcyEF5pDyc0HEVJ9hTKpTJNlx56mUjZ3Zt5A/LB9 diGpak72+mVIiRKCSbfcgkHite/fMvTafj3P0uz0OkOX1T+no9Z07yrpemSh9NU2ahVT04lioVXx LIz/ABdzyqc2kIRjyDvIY4x+kUrvodrISJHd4S7yC3bgYw8gIZqFan7R6kjJEWyIthHmf8ndOuLW SfRZGhv1HIRPwEUlO2yrxY+PTx8cws+jEt483W6vs6M94j1fY8cmt5oJZIJlaKaNisqMKMGU0III 2pmqJ33eelIg0Ry2p6r+Tlzor2FxaShYL62nW5ZywHrKQVStd/3bV2HiM2OhyRojq7zsrNEgg7Se lS6bBPN6/quEco7xqV4OYzVCdifuObF3C4WFL43n1iTkV4en+74ca14/Y5dT44qisVdirsVdirsV dirsVSuHgh1OOWeSOCKRaSGRiyKYkY0ZixG5OKvjjzWUPmrWSoNPrtyRyqT/AHzda71+edNivgj8 PucKVcRZ7+UHlu08w+V/OOm3JoZTpqwyb0jkaSYK/EEA8a98w9blMDCQ8/0M8UbsPN9S0y80vUbr Tb6P07u0keGZPBkNDQ+HhmfxggSHJqqti+h/yR89S6zpVtYXUsjX2mKYJh6jO00IjJgIiOw4qnEs u9Rv9rNLr8HBOxyk5WKdhiv/ADkXcXEzaM0pkBb1X9GRXURlqDiquB+yBUjqcv7L5y+DDPyDyPSf +OvZClaTxVp1+2PDNlL6CWkfU+yNR+uW+hPLJIxu7aCWZo/XaMhVBYMSgq5SgG+xzlpGhbnxFkB8 iyO8kjSOSzuSzE9ydyc517+vpq/2PUv+cfouHmO9vKEiOAQniORPqBpONPf0a/Rmf2eNyfJ0nb0q jEd5PXu/tez22pXSz3crLPJK0MciWxjl4ozO60Clew41I60NM2jzSnHc3bWogjklkd7z0nklMkLF eBagYiqVK9hthVVnkmexhuEWYWsaTiVUnIZZFagYyMyl1BVu/wBGBVTlNO9mY5ZfrrLDLOociONK AvyQfD8e4Fd8VRHJYtWmDyssLW4kcPI3EEuQSKmi7eGJKCXlP5r6zplwkdlY3a3KRy/FSZpypRfi NWZ+NS4H+xzXa3ICABu6ftTNEiMY0TfvYLoWmS6prFlpyf8AH3OsZqeNFP2t6GmwPbMLHDikA67B iE8gi+hY1gj0nT/qivbRwTxQJEsrsoUTCNlrX41+Ggr2zfAVsHqQABQXXVxMNTlaUM1tC0EaqkzR kGUj4uC05/Ed+R6YpWSzXtvfgSGUGWSY8w4aMwrGzLxi5bFaDfiPxxV2leq7mK5lfhLbRy7TyNX4 jV+dQYydvhXbFXk/5p6IILm01qHl6WqNICGZmI9OnBizEn40pms1uMCXF3uk7SwgS4/L7WCGpX4a 1Fdqn/M5gjm6uIqVH7vxT0X8u/L/AJq0zUItYe3ktrGcJEvNvTaTm6kD0ieTA+46dMz9HikDfIO2 7O084HiIob/serFpI9WtysrNBO0ikiVpAzBSeJj2VAtDuK++bJ3Ka4q7FXYq7FXYq7FXYql9tFot w0ggtY2DAh39CiOA245lQrfEOxxV8aebaf4r1n06CP69c8OOw4+s1Ke2dRhMfDHuDgTviL1b/nGx tOUeZPr8SygfU2UNEZaAfWOTbK1AK7nNd2pyjXn+huwdVb/nIjyZbkweZ9MiYBVS31JUjcR8OIEE objw2FEO/wDL74Ozs4+g/BOaB5h5f5A833XlPzRZ6xHVoEb07yEH7cD7OvzH2h7gZsc+GOSJj1aY SMTfR6f/AM5JanpmoWfly4sZVmDiaT1VB+KORI3iPIgVFCT7ZgdmRoyB/HNtznYPGdHBGr2Venrx ch1qOYzZTMTEtMQbfZGufoeTy/cIkKOj28/1ZUhLcTxIJChfgox3JpnJZATE+52eEgTBPeHyLnPU X0Djjb2T/nHG5tEvdbgkoLmZbYwEjeietzAb6Rmy7PPMe553t6jwkef6HtEWo6fIXmiqzBRVlics yVIBX4autSfs1GbJ51Y13pUtrOzx8oEf/SEaBz8VASWQpXp3pirVy+jRpAZoUYBS1uBCXKoKEkBV YqBtirUsmiNdI8kUbzuU4zGLlu1OFZOJAJ7VOKsO/Mzy/Lr0FvFo8UbXsMsjTAj0jJxWhCyMFRyt N/izE1eKUwOF1/aOCeSAEHjl9pl9YFVvbaS3EgLRmRCquv8AMhIow9xmqljlE7innp4MsCLBBTz8 t3sU85ae10E+rfvhIHWq7wOBUEeNMu0p/ei3J0JkM8eI9/3F7vNPoTW0LSxJJbhC0IMJcInQnjxP AfOmbp6hWm/RUU1sZEjEz0S1bgCwp0CkA0G/yxVsHS4L4xqkcd3KpkcqgDFa1JZgP1nFVG2uNFWK Z4ESOMqGlpEU5q2wNOI5g+1cVef/AJz3ljLoGnRwn7N0yiIqUK8I6EcGAIpyXtmBr+QdV2rfBGud /oeY6Bc2dtrumXV2QtpBdQSTMylgI0kUseIBJ2HhmvxGpj3ul0xkMo36i30ba32hXk8NxbGKeWcV hukTkGAG4EoFKgdq1zfRkJCw9bGYkLBsKsUul/XmEcarduWBk9MqWK/aAk4gMR33wskbirsVdirs VdirsVakXkjLWnIEV+eKpHZ6ZqItza8nto/QWJzI/qqzg7lFD/CpXb9nr0xV8hebwB5s1lWIqt9c g0FBUTN0G9M6fDYxj4ODOuJ6p/zjlHJPb+aIUhkm9RbMVikEdGpcBeVWSqmu/X5Zru0xQj8f0N2D q9t1PRF1a0i0zUYll09oHW7UUCs7J6YCgbinJmH0Zq4SMTY5hvIt8hecvK935X8xXmi3Z5NbSVik 7SQsKxuKfzL18DtnS4cviASHUOFOPDspX3mK5vdC0/S7irjTXk+rMe0Uh5cP9i9afPBHBUiR1Cmd gIXSSDq9j1/v4tu/2x8snIERKARYfZZs7saStm9vI9Vkp6Uqoyli3ASHkgb4W+LrU9jnLOe+UvMe kzaRr1/pkwo9pPJFt0IVvhI9iu4znpx4ZEPd4pnJjjIDoPcyr8ltYj0/zzawzMFhv1e2PIVBdh+7 A92b4R88ydHkEZ+/ZwO1tNKWIkD6TfwfQ2nWVzDcGXhKIIYPRt4ZmiLdQaD06ig4gfEa5uHk1RbW 5i0aSIxmW7uFcyqpX+8lqTuxUUWtMVYj+ZnmO58u+WoL8QgXJX6pbwyPQ+q5XkW9J1Zk9NG2DdaV yjUZvDjfVzNBpPHycO9daeXTfnt5vlEAa0sAbcoU4pOFPAgjknrcO38vypmB+fn5O8/kLH/S+Y/U 9g8ha1r/AJj0az1rV7VIZZhKbT0AFgValA7K8jyEtxp0pTNhp8hnCy6LXYY4sphG6Hewb81JbJYb LT25LqVso9aLmsgAI/ZoxEYPULt8sxddOOw6h5ztTLHYX6gWA2F1cWd5BeQkCa3lSaPkKiqEEVAp 3Ga8Togjo6mOcQkCBye/6Le/pnytavbRtcJLGwrDII/Tk6GOVS4rSu/Wvhm9x5BMWHqcOWOSIlHk mdxpmomeKZZY3YPDVfTPwLH14nmopWppTJtrv0ZepfpMzpPExmaYhOL0cABamTwFBttiqy1tr+2M 1wkUriKBYbWCd4uRoa9UPEAe5rirxL8w9fTV9Y4QlnhtCytISv7yZtpHXgWUL8KqtD0WuafVZhKe 3IPOa7VCeSgdgK+KTaR5d1vWmkj0y2a6eFeUirT4QxoKlioynHAyOwaNPAzkeAW9D/Lfyr5w0jzA k97Zzw2Ko5dA8fFnYcB8JftWuZujwzjLfYOx7N02THI8WwelmC5k1WGf0HjERcSSNIHjZCpC8EqS rHavwjv1zYu5TLFXYq7FXYq7FXYq7FUmh1e8+ozTTcfrUcayG2MMsRSpoSebHmo/ycVfH3m0BvNe styD8r66bkuwP75tx12OdNin6B8PucGUd3q3/ON09xbReZZYSnESaarq6kkiR5k2IZaU5eBzX9pm xH4/obsAol7fearcw35hUJ6atCtCrGolNDWQHhHTsGG+alyHlf56+Wf8Q6VJrNqoF/oxkQRiN+ct tGay/H9gmM1cKNwtc2PZ+fhlwnkfvac0LFvnchdjvQ5vATu4hARmkLTV7Ijak8R8f2x4ZXOZ4Szj Hd9nz6ncrFbSRyo0EiyNNdC3ldFKEAAorVTvXke2cs5zyH8+/J8n1mHzValZI7hVhvVRTUcVHCWt WqCPhPh8OazXYd+P5vRdja0/3Xy/S8cR3RwyMVdSCrDYgjoQc11bPQGR4qL2fyj+fzx6f9T8wx8r qNAsF/GhYORtWZAwNad1+7Nni1lCpfN5nU9kkm8Vd/D3eTJ9S/PLyba2Qa2v/wBIXRanGG1njCrS teMxQHw+3l8tZjHLdxIdlZjzHCPMvF/Pvn7VfOGox3F0BBa24KWtohJVa/aY16s1Nz9GazPlOSW7 0ei0owY7jz6nvSry5odxres22nQ1UTOolkpUJHUBnPyr9+QxYjM0G7VavwYmRrb7fc+rrOGTTltd IgEa2aQtFBHGCJIool4ozOSRvsPsjfxzfRgAKDw+SZnIyPMvG7b8tPNmp6hMvKIcyZfrVw7fGrN9 vozPXxGas6KdvOy7KmZfHqef2JD5i8vajoV16F1R43LehcoD6cgQlWK18GH8coy4DA0XFz6Pw5Ue 60R5V86a15bmaayZXt5P7+0kqY3ptXY1VvcZLDlOOWzPS5zhnQsgvT7H849CuWBnb6hTgGgmR5Gb kaOUkj+EBf8AKXf2zYw1kJDfZ3OLX45i+SPu/wA0vLdnNye/iuYW5kRW0crSKB9mrH4ST4bUyR1e MdWZ12IC+J5/5o/NnWNYt5LKxUWVpIKO6giZlP7JbkaDxp1zC1GrMthsHV63tCRHDEVHv6/sYKGP GvfpmFW7qjjHFXR6j+U+uW1to97bW6pHqKEzzFkeQzIBRAOJHBUNQS2wr75s9CY7jq77suUAJQH1 PSH1aQ33oB0hjT0w7NG8gZpBULzUqi9aAnqcz3bKxnvl1OK2LxSROryOBGysiDZfiLsCST4Yqj8V dirsVdirsVdiriKggGhPcdvvxVCJpxV3lNzK87II1mb06qta0UBAu/uMVfJfmnyP53l8z6vLDoGp zwyXtw0cy2c7K6tKxDgqnE8utRnR4suMQHqF+8OFISs7PTf+cfvKmu2sfmGPWLK90pZmsWh9aBoP UMRmb4fWTfieNafTmB2jOJ4eEg8/0N2EHe3skmkRSSF3mlIk9MzpVQshjpxLUWo6b8aZq29v9E25 mMjs7x8ncW7cTGGlBDmlKmoY7E03xtXy9+Yf5TeZNG803Nvouk3moaTJ+/spraCWcKjk/u3MasAy NUUPah75v9NqYShcpUevJxMkCDsEk0ryJ55TVbN38u6miCeMu5s7gAAOCSSU7ZdLLj4a4h8wxjGV 8n14dMAthbpczRxUYPx9OrlySxYshNSSelM5pzV0ulWU3FZoxLCsLW4t3AaMo9AwKkb1Ap8sBFii mMiDY5vFfPH5CXsdxLe+VSJrZiW/RkjBZI69o3Y0ZfAMa/PNZn0RG8OT0ei7YiaGUmx16PLNT8va 9pTsmpafc2hXcmaJ0FCeIIJFCCdq5gyiY8xTu8U4T3jLi+SBihlmkEcKNJI32UQFmNB2AyNtnCAO fxZf5a/KbzrrsiMli9jZtxLXd4DEvFtwyq3xvUdOIp75kY9Pkn0cDUa/BiFXZHQb/N7z5O/LTRfL FmIbeWSeZ2SS6mcIvqum61oOQRTuE5U+ebXBgGMbc3l9brZ6iVy5dAyKLTFjuJZvXlcTkmWNvTKk EUC14c6L2HLL3DattKjtzVZpXKxGCIsV/doaGi0UeA3NcVeVfnLqMMb6b5ft/wC7s09eRtieTAog PvxBJ+eazXZdxF0fa2ooiA+LC7DyZ5l1DTTqNjYTT2iNxDoAWY9yifaan+SMxY45yFgWHAhiyziZ CNj8ct0qlgkjlaOVWR0NGjYcSCPEEVyq6cXiMdqorAtCTU79RtjanJYArk2qb05UrtU9sSVlkvoH tGn/AJK6BHpL29/PJPqElG+toeIjIrsidCN9+XX2zax0Ua35vSR7Nhw7n1HqFHyn+Ul3o+tPd3Oo 1to0ZIPq9UeQSAqwkDAhRTsK/PBg0pjPiJRptDKGQykb7mfPpNu0gYO6R/uy8KkcGMX2K1Bbag6H M52SvHaxpcy3AJMkwVTWlAqVoF+8nFVbFXYq7FXYq7FXYq41oabHtirHof0pWW0UyrdfVuUpeUPW TmByjPJuHIcqdPlthV31m8ZXt4RIqG7WECSY8wPS5snrKZCPiHYk9sVbvb+U6TxgE8I9OZnmUyzE NEWAX1RyO7ivIkfDiqvfySBre6ilfgJIRKPUZSoYgcfQoAeQO/LfAq36/cNq6EiZFIlSO3KSKhCA cWNQFJY137CmKu0lzMipdGT1Z4BOZVuJCCpbf4QVEe/8vbviroJpo9O9SMzst5KfSf8AeztFD0Df ttUqKj3OKqaG7m0y0uwzyRQRSG4RppYGc7EHkBVqcT1wqrX0rVt7yGRxGXg9Qeq1UVyPh9EfC3IN vU18MCqoEn6RZrWSSRYvUN1yctHyI+CNV+yCp8Bt3xVL4726TT3cl/rc1uswl9ZnWkjhWPA0SMiu 1BhVFAXLW7wxJLzt51F0iXDOzJw5fBLIUI+0KjbAqh617Jp0Ny3rG2RbjlwlCOOL0id35LyAUfT1 3wq3PNqKCC6kEhaUWwhKyBUDMR6itHyHItU/sn6KYqmK/u9YlX1HEbW4kZWdiobmQSAxIXYdsCoS MmK6uIp7l47ZoBKsomaSqhyDJyYD0yRTZRTwxVK9V8o6frMUNzfWTXPpXAeJXcrP9W4/YaRmUkcv i4s2wyueGEjZDRl08MhBkLpVSW4ayijgLRpDbzmKMSmIKkchWNgY/tlVHQ7ZYBTcBXJ5N+Yml3ze cp5IoZZY776u1u/Ejm0kSDYAca86jNPqYHxCA8/rsROUgDc+XPbvem+UtAg0q3tbZ7dGu1aaCO5D k0ljDFiY6U4mhNTX9WbLFhEYgVu7nT6eOOAFcmBav+V2uTa+9vpcAEEiLLKZZECxM2zAlSx4lqla CtO22YObRy4vTydXquzZGfoA/U9YseCaBbfWppf3ZK/u3YPIVZlVAwPM1+ebQB3YGyHuv0isUULy t68dtLK4MzR8fi+FuS/bZRtQ7e+FKPZybzTZVkkInVuYLMFYCPkCY68a/RgVRS9mk1qLn60cberG sBSRUolKOajiSTXfsKYqnOKuxV2KuxV2KuxVxAIodweoxVQSwsUieFLaJYpPtxhFCtTxFKHFV31O 09D6v6Efof764rw8fs0piq4QQiH0RGvo8ePp0HHidqU6UxVa1naNMszQRmZfsylVLCng1K4qqFEL q5UF1rxYjcV60PviqnHZ2kfP04I09X+84qo5V/moN8VVFVVUKoCqooqjYADsMVUX0+wkCCS2icR7 RhkU8R12qNsVXNaWjTLO0MbTL9mUqCwp4NSuKrUsLFJvXS3iWepPqhFDVPU8gK71xVtLKzjEgSCN BL/ehUUcq/zUG+KtHT7AwiA20RhB5CLgvEN48aUrircllZScPUt439LaPkinj/q1G2Ktm0tTP9YM MZn/AN/cRz8PtUrirX1Gy9f1/q8fr1r6vBeden2qVxVoafYKjottEEk/vFCLRqGo5Cm+Ktfo3TvS 9L6rD6XLn6fprx5UpWlKVpiq6Wys5VRZYI5Fj/u1ZFIX5VG2KuNlZmcTmCMzilJeC89hQfFSuKt/ VLT1Wm9GP1XHF5OI5EHsTSuKtR2VnHE0UcEaRPs8aooVq+IAocVWfozTfT9P6pD6ZPIp6aUrSlaU 64q22n6e0aRtbRGOOpjQovFamp4im2KrpbGylkEktvHJItArsiswA3FCRiqqUQurlQXWvFiNxXrQ ++Kt4q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FX/9k= uuid:B9224B1C936DDE11A357F96382DA463A uuid:cdda304a-fa79-234d-9df0-831cf73e1d1b uuid:b1ac9fe8-11a3-4422-b8f3-ae4b8085b7a8 uuid:5D20892493BFDB11914A8590D31508C8 Print 1 True False 2.510000 1.000000 Inches Helvetica-Bold Helvetica Bold TrueType 6.0d7e1 False Helvetica.dfont PanicSans Panic Sans Regular TrueType Version 1.000 False Panic Sans.dfont Cyan Magenta Yellow Black Default Swatch Group 0 White CMYK PROCESS 0.000000 0.000000 0.000000 0.000000 Black CMYK PROCESS 0.000000 0.000000 0.000000 100.000000 CMYK Red CMYK PROCESS 0.000000 100.000000 100.000000 0.000000 CMYK Yellow CMYK PROCESS 0.000000 0.000000 100.000000 0.000000 CMYK Green CMYK PROCESS 100.000000 0.000000 100.000000 0.000000 CMYK Cyan CMYK PROCESS 100.000000 0.000000 0.000000 0.000000 CMYK Blue CMYK PROCESS 100.000000 100.000000 0.000000 0.000000 CMYK Magenta CMYK PROCESS 0.000000 100.000000 0.000000 0.000000 C=15 M=100 Y=90 K=10 CMYK PROCESS 14.999998 100.000000 90.000000 10.000002 C=0 M=90 Y=85 K=0 CMYK PROCESS 0.000000 90.000000 85.000000 0.000000 C=0 M=80 Y=95 K=0 CMYK PROCESS 0.000000 80.000000 95.000000 0.000000 C=0 M=50 Y=100 K=0 CMYK PROCESS 0.000000 50.000000 100.000000 0.000000 C=0 M=35 Y=85 K=0 CMYK PROCESS 0.000000 35.000004 85.000000 0.000000 C=5 M=0 Y=90 K=0 CMYK PROCESS 5.000001 0.000000 90.000000 0.000000 C=20 M=0 Y=100 K=0 CMYK PROCESS 19.999998 0.000000 100.000000 0.000000 C=50 M=0 Y=100 K=0 CMYK PROCESS 50.000000 0.000000 100.000000 0.000000 C=75 M=0 Y=100 K=0 CMYK PROCESS 75.000000 0.000000 100.000000 0.000000 C=85 M=10 Y=100 K=10 CMYK PROCESS 85.000000 10.000002 100.000000 10.000002 C=90 M=30 Y=95 K=30 CMYK PROCESS 90.000000 30.000002 95.000000 30.000002 C=75 M=0 Y=75 K=0 CMYK PROCESS 75.000000 0.000000 75.000000 0.000000 C=80 M=10 Y=45 K=0 CMYK PROCESS 80.000000 10.000002 45.000000 0.000000 C=70 M=15 Y=0 K=0 CMYK PROCESS 70.000000 14.999998 0.000000 0.000000 C=85 M=50 Y=0 K=0 CMYK PROCESS 85.000000 50.000000 0.000000 0.000000 C=100 M=95 Y=5 K=0 CMYK PROCESS 100.000000 95.000000 5.000001 0.000000 C=100 M=100 Y=25 K=25 CMYK PROCESS 100.000000 100.000000 25.000000 25.000000 C=75 M=100 Y=0 K=0 CMYK PROCESS 75.000000 100.000000 0.000000 0.000000 C=50 M=100 Y=0 K=0 CMYK PROCESS 50.000000 100.000000 0.000000 0.000000 C=35 M=100 Y=35 K=10 CMYK PROCESS 35.000004 100.000000 35.000004 10.000002 C=10 M=100 Y=50 K=0 CMYK PROCESS 10.000002 100.000000 50.000000 0.000000 C=0 M=95 Y=20 K=0 CMYK PROCESS 0.000000 95.000000 19.999998 0.000000 C=25 M=25 Y=40 K=0 CMYK PROCESS 25.000000 25.000000 39.999996 0.000000 C=40 M=45 Y=50 K=5 CMYK PROCESS 39.999996 45.000000 50.000000 5.000001 C=50 M=50 Y=60 K=25 CMYK PROCESS 50.000000 50.000000 60.000004 25.000000 C=55 M=60 Y=65 K=40 CMYK PROCESS 55.000000 60.000004 65.000000 39.999996 C=25 M=40 Y=65 K=0 CMYK PROCESS 25.000000 39.999996 65.000000 0.000000 C=30 M=50 Y=75 K=10 CMYK PROCESS 30.000002 50.000000 75.000000 10.000002 C=35 M=60 Y=80 K=25 CMYK PROCESS 35.000004 60.000004 80.000000 25.000000 C=40 M=65 Y=90 K=35 CMYK PROCESS 39.999996 65.000000 90.000000 35.000004 C=40 M=70 Y=100 K=50 CMYK PROCESS 39.999996 70.000000 100.000000 50.000000 C=50 M=70 Y=80 K=70 CMYK PROCESS 50.000000 70.000000 80.000000 70.000000 Print Color Group 1 C=0 M=30 Y=70 K=0 CMYK PROCESS 0.000000 30.000002 70.000000 0.000000 C=5 M=70 Y=90 K=0 CMYK PROCESS 5.000001 70.000000 90.000000 0.000000 C=5 M=90 Y=75 K=0 CMYK PROCESS 5.000001 90.000000 75.000000 0.000000 C=30 M=0 Y=95 K=0 CMYK PROCESS 30.000002 0.000000 95.000000 0.000000 C=60 M=5 Y=95 K=0 CMYK PROCESS 60.000004 5.000001 95.000000 0.000000 C=30 M=0 Y=10 K=0 CMYK PROCESS 30.000002 0.000000 10.000002 0.000000 C=60 M=10 Y=5 K=0 CMYK PROCESS 60.000004 10.000002 5.000001 0.000000 C=80 M=5 Y=10 K=0 CMYK PROCESS 80.000000 5.000001 10.000002 0.000000 Grayscale 1 K=100 GRAY PROCESS 255 K=90 GRAY PROCESS 229 K=80 GRAY PROCESS 203 K=70 GRAY PROCESS 178 K=60 GRAY PROCESS 152 K=50 GRAY PROCESS 127 K=40 GRAY PROCESS 101 K=30 GRAY PROCESS 76 K=20 GRAY PROCESS 50 K=10 GRAY PROCESS 25 K=5 GRAY PROCESS 12 Adobe PDF library 8.00 endstream endobj 2 0 obj <> endobj 22 0 obj <> endobj 62 0 obj <> endobj 63 0 obj [/View/Design] endobj 64 0 obj <>>> endobj 23 0 obj [/View/Design] endobj 24 0 obj <>>> endobj 61 0 obj [62 0 R] endobj 5 0 obj <>/ArtBox[0.0 0.0 180.72 72.0]/Group 78 0 R/MediaBox[0.0 0.0 180.72 72.0]/Thumb 84 0 R/TrimBox[0.0 0.0 180.72 72.0]/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>/ExtGState<>>>/Type/Page/LastModified(D:20090824110634-05'00')>> endobj 77 0 obj <>stream H‰LWË’E ¼÷WôѦ\R=TuõÚp2„ƒ‰à ,„áÿ#ÈLõ¬9¬ÛêVé™ÊÒ¼ýáé|ûñ©žïÞ?Ç—£žá§­Zð¸áïŸ_ŽŸÎ¿ŽZæ>ëiøûãxûÝõüõßã‹d¾µ1Š×8}ëmžÏ/?¼7+ÍÚyó2Z?o Òyë%*£L|™¥~>·({úwœ7cÐYqÎZ}ž· e§²áØ|j¶Ó uÛ•=O7T÷^fo´Ng7RÛV”ःuR»Õ²‚VáæÅÖ>­xsI+ÚÙX*ãØ²s–hðxIËÖ«®yésIù2…j9¹Y”ÕÇk HfËô¦{©ÌõJÂ[YÿKo#¶j’EðQb"ЫD>‹ÁÜ£„øºªê}•/:#Wùa¬÷«3pK?Œš]ƒ;cí²¡ÆÆ³ôÁã=ìÂËF戸®Óp¤6 €ÄBʽü4ÔÈOYõÖD ‘XÛ~DôÐ}Þé™&{2Õ$.If¢¢µÚåÃOð2I¾¦–¦Îå‰<ÁmP­‘>Xð<,5æ³1:Øôµ_)C>ûºfÉëÌÍ*çvmF¢œÓ‘tEƒ•É\\F¹±)âºt8FîBd+ż¸9Atn*|º¨tØΕ$†[L`dFôe’7ç©Õ:SN,s_˜i:ˆP$·µºæ.¬›`é`Ÿ¹ƒò¦p½i׆ÕÜþ´ömÉyyäUÄ7l®.ª4PG{\dêœ h˜šu’egqrñÓnŒø8;ΉJ¨b;Øza9ì6Ó!¢p™ØU°‘÷yU”Á Xu(Š‚zÎL:/Õ¼ö™óÜD¬|½,¯•á&:ÒnÁ}‚¢¹i°Qk%«ÔåZÚ²xxÙT)ÑGçä"Ë»dk[â–¡â'ÅËóÉ^¼Û`v\ m–¸á ­ü=€‘È ó?t'‚Õ §â`'º~…äRÁVÈ}ÓºAþ¬AsGDM¢E群è©éËÝ~jI¥®z¦%}«€hÇ¥ªbç‰;û%î6N ’Þ¼wQ¥Mžgd]D¦ÙY9­¿ŸOÇ»;š°I“iÕüÝv¿óÇÚýó@ó:?áïþr¼ùþ›ûïlFˆü3ùû¹9ÎrûÉûÏÇ›'j}¸ãÇ"~¾ýö¥žïÿ†ßñ+òÓñŸÿ=·Œ endstream endobj 78 0 obj <
    > endobj 84 0 obj <>stream 8;Ul;Yn7*^$j.H#J0Ak7D1"Zl-#aG> endstream endobj 70 0 obj <> endobj 76 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 80 0 obj <>stream H‰T– tMY†÷pž DBˆÜwÏ}òKD—”Y‘Ä,† Rˆ Od0D‚ ´©šÒTi…¶hS•©=Z™ e¨&)SW+¢PMm^L«Ä¹}¼Ä*}×Ú÷?ûì³ÏÙë®o¯sÀæCÌ€Á-[ù .W3ÅÊ’S2Ù‡›öÏÀN¶1)Srdzd³€Æ[x~ZvzfAê½Í„xû§›–±¦àÃ.*§8#Õ1êô™ô©ýÚd¨ ¯ù¾ ʨüŒÌœÜu±;R”?À1.+žÝFÄ^P~r¦#7Û/Ï»`ʇj½ïÈL]³TªØ•oyš5)'úÓŒ[3"ßgOLÍ~3haÀµJUßy ŠP\µv•%\Ud­R.€4‚÷Ÿ@f äÆ¿ó³§Mœ¼^S ¨Ü {ìÄ" øõõµD”%ÿm5î…ÞÊXY,¼ýŽàçW¥uƒª´^H•6«ÒÀvUU¥Á}•zXã”jjÓd¾GÈ¥êó—Zâ¥ÎðQ±Y°ö ø ÎÃE(T±Çð-è5Ñ}±.j¨£±9¶À–Ø [c[lñcŒÀ(ì†=°7Fã@ŒCðLÀ$tàTœ†3pÎÁ¹8â"\ŒËp%®Á¯p=n@'nÃ]¸à!<‚yx‹ñ¿xïâ#|‚eø_Q5"t’Ní¨u¦(êF=¨7EÓH±4”âÉAi4–2i Í¢9ô)}F èsZL_Ò2ZA£Õ´–6ÐfrÒvÚI»i?¤Ct„þIÇé$¡óô3]¢+TH×é•Ð}zHO轤rª J\ƒ=Ù›kqm®Ë 8 nÌvnʡ܊?â6Ü‘;s÷á~<˜‡ðPÎ œÄNá,žÌä™<‹?ãü9/â%¼·ó.ÞÃÇ8ÿÍ縌Má'ˆ$‘*F‹L1ALSÅ4±TüU¬ëıIü]ì»Ä±OìÅ!qDy"_œ⢸,þ#®Š"q]Ü÷ÄQ*ž‹—¢\˜´øk¨yiµµzZ€¤éZ¼–¤ehcµñÚ$m²6]ËÓ~´®²®±–ëõuMï®÷Ó?чéñz‚>SÿV?ªçë'ô³z~Q/Òoèõ'z™^¡WJOé-}¥¿ ”Á²© “íeÙ]ö’ƒä9TÆËé)2KN‹åré”ÛäN¹Oî7а5 /ÃÇ0‚ Í0 ›b|`47ZH£›mô7’ÙÆ<ÙG? ¯ÿ ŸÒÒ/è¿è×ô›ú#ýWý…þF‚ô’5¥Ÿ¬'JM6“-e!{ÈÞr°Œ“Ãä™(GÊ12[æÈ%r½Ü*·Ë=Šu0¨šõúFCźt³ÞÄhæf½ƒaD)ÖûI†Ã˜«X¯aó}õQvP¬ûÚýíÕ¬·W¬'‡¦‡Nƒ°`'8=>κN©XGÅ:šåæ+ó¹yǼýîÆ©î€w™/ÕÜ3SÝcf…YhþñækÈ0Õݬ"ÑÕ9/Ì ftVÖ×üÕL4ŸBKó©¹Îœg>TÑRs´ºœŠa+lá˪ŸÀ²Nù¾*ñge_(›ÏõÕìvÈUcuËÂkË9(·äÁK³™òÊÌaÂc‹÷ßž&ÊÄ 5ñÌniÿ_nz•ŠçêܵÊV‰;–Færµ;Ð÷Š6ÔÚ­ïeµS\5®äêº#îñxÑKE2•S6¶òÉ﹕×+©w¡²«ïW‚‡U^?¥)˜¨ê¨oª?¾Yé]Õ®gè4‚]°“T°MÙVš£âêã:—¦Ò4Ú§º6‘vðÊ7© U§lÕѪ³ãÔ|_©ú<†zQœÚ}8©ÿ³Ÿ™jF›×ÌfOnav7Ï›Ef$ù™]¨…¹›”F”¶- )Õ\å¥þ® ®×W±«ÐuÕuÖÕÍu× p·aIVIfÉØ’Ñ%é%iÿc¿< «*ò0þ}sgîdwéÍ ‚Ò”@‘i"U0€¢ô ²¡# (H]À•*M¥‰‚ô. Ñ  É#<¤Wuÿ÷=‚$çì‘={Ü“wÎüsïÜ7ïÞ™ûå7ßçoçoëoãÕßð·ðGHmæQªÜÏ_Ï/ïß×Ü×Ê×4uÖ¾âi߇ÿ¼WSÖ¤l”ºþøÍ5?þбýr¯Øä÷mðÎÍK)w$2%0:¹JJÁÀ¨L)™ýËä\F%óz’&Æ$E'5I K,ãûܷʷ·Ì÷™o±¯f‚¼‘ä'¼“Ð=~@|ßÖþÖ§Z'KÝb÷™ Asóm'*ŸìÑ…d½ËÈN.$jïôÿíºÓ/íœnÁ*¬ê»|¼·'5â–Q†Ó4m“Ú$µ:MÓŒ¯—æ,Ü©qãèÆª E«Ho-q M¿ÖÒ‰ôž(Ðz¥{Ú®Águz8}¤;Ðy[޽6ÄóòwŒ3Ñ:3ÏGÏuÆ,ü­I/,^î¬tÿ=ÎVi;½æÄ:qÎAç¤sVήH»¸¬Wn<ËÅ43:lR¿ é»­çmV8ͯßõ›q¿ëÙžî|íÇÎ ÔàìeEœ%£%7®.r–:kMÞ=dö—kZéZ8¡óéCôƒªÕ%tXà8,8V‡éÇSï¢Ë¤^ÓåS{R[ê÷oÿÑ¡w»Š…BØ·ñ£0^x9£…°S…1³9 ÃůÆ{¸ˆK… x›‘ˆ ˜†ùø—qE¼ýÇØmX„×ÐcлÐÛ±SÜþnœ@{ñü_ákaWœÇXĉ+ÚŽâ‹Î`"Ñ (tçô:Þ@WtÃßÑ1èž’z¡z£/ÞD?¬ÄL <1oá´¤ˆÕT’ÈÌø X\\QiñS$”öåHûŠìóKÍk˜ã¶Ô;ô*ÕÍ.Va¶‚ª`Øùv¡x JâÑßPñöqušÃÝXwŸ-eKÚŠ£J¨’z/ÿ¡¿Ô_‰Ûm{{9Áö±“Týµé¢òêX½ÏtTM;·…ʧBÅQ,Ð{lŒÞ­÷›’,Ôq*¿>`¢L´í® ™N¦½ík§Ú)¦zL¼öAi:ëCv‘ýÀýRÜu‚>o{ŠÓøAR£±+ôQqÛ>}‘¬SlU[EœÈq!Ô×õ5q—IˆÇÛËãm”qÌ}6Ú¾n»Ø(ÛYŸÕçœPcm¸­n«Ùgl ÛÁvc´¤¤nËîü™×øž8ëü‰?òº‚¤š&/'JÒ&g¨¢Éb²*¥ŒÉf§)WeQ™ÔöU=M.;ÝÎ0¹UV•M÷Ñ}U•]åÔ=LvIG¹Ü=v¦ýÐä±³ìl•ÛäTÝÕH“ÉäP1ö#;ÏÎÕm?ñ—OÛ–nCã6r›éLÑTeµtnÆKB;Ä$žë»ácOò´Îà ¼ÄI:/ÄÕf²¸[/Ó}'©î8OñŒÎÇ‹¼ìäרGuþð!ÕCjÛ|ÎJq€^â鮫ºùõ`=@¿íÕïèzˆ[V÷×oê·ô ÝOüðsª¾äÕÏTÕIuÔÃõˆ†!±ËB…ÅbO™ž=] Wa5Ö`-ÖyŠÃF|.êÜŒ-’?· “· ™w wcäѽÇ =Çá€P%^ø~‡ñ­PýˆÐ$9 çJpn«„Ø;è!C ~%dÉPÂ=P©ÿ‘Nˆ:#>éô=PB¶ %üI™p?zþ?ãßÿpG%dÿƒJÈð ·WBÊM%øoQÂÜ›J8vS ÇÓ)áQÂõ´J`t:%ÄŠÒRw‡1¢›%·(ávÈKI£òwL˜"jñ”°]”TB &Ü%ü?ìE2˜ð_aÂM%P³ãÝ”@ÃNÄ12’ï‰c,•‘"e“8™Sø§r§sgòCÎâl~Ä9üçrçsòc.â'ü”‹¹„Ÿq)—q9Wp¥§~Ÿª~TÏñ¼(á§*‰˜À+<Â$&ÓÇ£Lá1úyœßñÄï•À“<ÅÓ<óé”ð/ð"/ñ²Êx&ð Wq5×p-×q=7p#?ç&næ~Á­ÜÆíÜÁÜÅÝÜÃ/¹—_ñkÆr¿á~Æñ€(ÊS2˜à1ŠÚÑ 2Vvê(™Ú/²ëve[¶ã}ˆa&fæý̆ÞÌžÊæbî ˜#=˜3À„ü,Êb,PB– 0á(Ë2ŒåXž¥Y†Y‰OxJà“|ê%Tf8>á3¬’ž ¬Ê¬É:&<ËZ¬-¾ÄcÂ1Öåsâ±±0Áãlð ÍoØ‚-ÙŠ/óÙÍN³ÛÃÇ E²Ùˆ¬fJš Èÿ+ïUÕuÅï½ï½ý–åë=Ÿ€ëŠae…wQC0|ˆìªÔ]• Ò¤µ­ck-†Zêb3µÕ2N;ƤM™˜>«k3aŒ­íDÛ&©uªQj:i4Ó­5ãWEöõw«…Œãð‡#oçÞsÏ;÷wçÜ{ߊÕÈ ÑÏC.pkÒ¯I& ú°J‘ð)\‡°Þ_"ßÇp.Ѝ‹>jE£tùV\ˆ“'†sçcäº÷ŸÙ¹Bo¡6®‚‹YÈäV~êëqâVá¹B%ÔG9¹ªoÖ¯ÿ ““ÔL'Òlý8ª O/ÙO“Øjý0jè9œÍ]ˆñr^ï×?Cü9X{ uŠúEÔ¬‹ yè#ǨBUZHWèŸÀnÆ•¤O¯Ó7â½kðr¢J6c¶Ë4Ù)‰pIˆê]ú.¬- c͸-Öàvø.ÙGö“C†×j1KšŒø^ÔÙ² L_!ŸSB§Ójú-vVøLøX!öê'£óqò `e*mF-­Çyrûô+c!Á%œ׋€­•s»òÎï‹ÈP¿†q£ÑJú<ÝŒSêý˜Íf­¬“ídçÙ5¡D¸$šÅi»ôŽ.êgõ»ÀœƒÝS}ЀJo3n¹¯à.{™lCMïÅíò.Ð’Aš@“Q{%t!]Šºø2ÝD^ÅÉ÷kúN§Ò«@7‘å2•9ÙFÌ·•í`‡X?;΢BаAè„KÂ-q²Ø*à”ÒS–©ÖÜÛÔún½yIÃ3;ÚA*©_ÂÍټ엯£ÆßFe÷ëCÔ…ê}¸.“kä62–…GÁ)ç• „/Ò—èËtöáìå§Þ;ä=G‡ðÄH³2[ÁBlž^²}hð“$(Â4Á!Ô MúuápXø\Ì—‹_7c'í*eIó¤i¹´^ú¡tTzOú«tMºaÊ6u›^71}h¶˜KÍûÌ1:Xdìá#Øq[É„õèO% è6du9êb÷ á7Üù9Í&1g3_?@"ú÷‘Íß_ ßÁ™õ*û{V¯Þ¬t–~±f"_ñÇS8}ZA~ÞTuŠ"çædgeÚ3léi“'MLMIžðôSI‰ V‹Ù$‰£¤Ø§Öe-?¨‰ùê¢EÞWC0„F‚š SÍXMnòXO<_ø‚§gÄÓóÀ“&ËnâvË>UÖÎxU9B—7øÑ~Å«d-j´ëŒön£ýÚŠ‚dŸ­Ý+k4(û´šía_ЋpÇ=8{ÅøÊÁAžÈkdA¨³ÝÅ=|š]õú´ ÕkŒ y¾ÐZ­¾Áïóf*JÀQ¬ÑkÔÕQ«µ Eñ×ù{2\ý˜ÛQ¼Žã'=IkÕµ=Yä­ÐJ¿&„ ò9RŠ´tÕ«¥ûÛÿ»÷[¾£5–Wj ×€šžE#Ý ï…v¢WÛ$#,Ûðkt{`„}dmª[‚²fU«ÕöpGœ“z¿Ýc÷©Ao@#þþ O†Ñq·m©P@ÊqÇ|Ç|®+Û–ýé÷Fì $~'ÿ]Ûø€ÊgR¦&¯‘y\XËù¿¶r^S7ü(V¹xh ¥$äiRÞâÖÕ‡j÷ÆÁuxû­v¾†`uþÁpò\LÿdUß$Ȭý×XK(n1å%ß$¼Éóÿ „0~¿½Ñ †OgSÛyú6úâ}Õæe@F¯#B ‹k#ÄZï?Lé®@„êÛ#Ä›}׋°êK.â·Î‹éÐ).†¡PA ³Ö N ¯ 9,‡¯ Ë5r;JJÌ34ÚÂ'kòƒ²Ô¯hž@æƒf[ 0qfð8¢'@„Žx„# ÃÉY\‹Uå×ûüZ—7Sóx :Pï×§@^3 …î\g‹c.æ™…h̉҄‡Gzª¢ „Ùa¾ÓFúJ¾hðÄ bÚUo u©J¦A±¢*€àœÎFß/ )}4ÃÏŒfxÐ>c0\ö˜.îq1<÷á Wó\ΰûÉ1RO÷•E2eãóO4g $A³Ù­&s6%kŸò¢ÛVT´ä†»nؽ$ù–».yØMªÜÃn.%3g§()^ñ`äÞéÄÝʈØ8ô6¾Á0ÏJýœ´Yº†¹dƒgzKÂó‹°‚2ýÙ/ˆß¤;¤_Lê%üN<•xž]˜tÑ6˜yÇ–œ¡‰Õn±Ø“æç Bê|»57­,ÝR–›c¶+Êr2dåÇÊ¡e®º(PÕ¥¸¢‰:IU´ÊMu9“£%3i+iM-›£ÈéiéJ~A¾:…Mž”6{VÙœ2ÅD¹ ?…®üÓšF7¼µÊ;ã\úÆ›'Îüäµfg.-™;Óc'Že»Å–÷ÞØî˜Œ]¿sçv‡ëë×cœ>CÛ;Ö¸\z¥ß¢>H‹Çia-Œ1“™š S)eÌlI(³˜, Ôda’=Él)°f$& (›FV`[7œâr¹°ëNu¹ÄîEÉÝ'Kf’Ö‰ ÅüÝK°Zš;=ü³Øe¶Z:14$Jw+Åô¡«A(1$ÿÞÚ;«&¸o’ Ïy­`F×ï*ÿ>wû£{‰[¬5ð³Bâo˜¦Ç¦’D1z!q‹aõgi‘NñªAR]qé#—…÷Hºø B åælâ„ÏWé§d ÆZ!“ØÄ·ÈbøoDß ÝÅ\únø{ »âzÎ(áýÒx{Þ¹Â1ÒyCÿƒl6Ÿ!§0W)äd%d¿´Œ¼±ý&iæX1×6ÄppÃÞGö¢½ãmð=hèSä ÚÍWâ1œæWH´Qa/ÅüfŽó÷ðõ²>ýÐ ôBè*h'_3ÚÕnÌ¿b…}+tøéâöøx'Ä ~¶b¼:þ^'ÚvàzškÈd‘ÿ‘^-°Q\WôîîìÌ®HË' ¶âPƒÁX!PC]—1M"\  QeƒIÀ"4uQ1 d’¨P]‡”ˆZ%ÐDMK •|@iT‘­U¨Z¤l˜žóæ½eÖ¬?RG:ºoÞ¼Ï}÷Þwï™,Œ‘`‘Ä!ÇaKŸ{¢:7Μ<ôW:¥G)õóCù¤Ðý pøÄ§[WlHÖ =(•%Ô˜üPvX5îûø¾-Ü.™âî4οcí*ù>ÞBÏÒp› ã;Pªdû/k¯{:ô•Üns¯Û»ÄAn°s¯É·‚Wd€#°ß·±þ š±§â¡ k×ÈHµN»{íCôö:Î5¶¢}Ð÷| ?¹h_…mëW´Ÿê¸tÈ¢Ýéû@Ù­}á¯d&öj%°ï½ 8?ƯvbþN¬åùÄó…'m_e[Ú™:(Ì—•Æ_J‡VŒmu[€ãÀ)ì¹`l Äû9¯íµîU¬wIÅmòÏDÆ ck ¤}TìzçàxNß…Xc.É5탒,æÐf¼7ô7maÖfŒñ¼F2ÎyFÆT™2–ç²ã©â­7iöï* ÞgƧ'Ý«¡ ·3´F¡å’ª~Ð9â,uÖZÙÆ{¬uOa)’¹ƒ÷r'äJïÝÝŸ´Ýmÿdéûú'áÇ„º¯¸O}•ÌKÌ Æ·ÆïFÞ±r¨HçàE  äè¿Ù²8"ÒqÞû~9¿óº¯ƒ±äóíV¯ri:³±mð\p€D°ç?uŽ÷rž§Ã`<0 ˜‚µ;Œˆá3À)³úÆ¢ ´ÖëJùZpdžaLÞ5‡¯Èätõ=©þ25g‘Õ®æ Š ‡ëo‹`ÃFó˜ç[Ìx¬ß>­t,Ä>³€ÆPÎW £Ð÷Öùl<ÎÄ¿cî,ÌõÞÛÕ¶ŸUgÉ…a·¨5G©o5RŒu¶bï­˜›K‰3næxÕNHõá~<;÷‡-ŸÕ=á¹06ûˆ€Îƒ¹2˹Œ3 Pc-ÌŸcW©I;¦ž˜3Ó¾ú³6¡^´Þ7jÏ÷~0&n΀Oš¼xIÆQ^jì¨19“4g ´ŸMÌåùææéXãØû½=Ÿ`LoaDLmÔrÛV옡òî¶PÌ=ϱ:¾†Á÷ý!«ZlPƒ9ÇP÷Ž©¼´XåÅ&™óó~–áû ë})rÊ‘£ÖÈûAYŒüyÀšŠ¼ÍÚò² g Œ¼"bKaße¨+丮›' ÿùu°ÿáAÝŒ£d­ /œ•^ž$¯ê=Îku¯Qž_íÏ÷ S?•£ŠŒwv¢UÈtø ;Ê¿ h—B>¼ ¼ lÀý:q”ΫÀul²s“ççÞé>lÒ˜D»Ñ.Ɔ¨±ƒ€¡Ö<ù¦µšõ^ÖÏ ÜJ õ|¾ªéUø^…¿R¹[*™wT^+uöRç4ª•™=)ùýªÍ¾,È,ô1/î5ÜܱÃÚ€ùÛp·)®u<\%6RµSú˜ïLÍc,F?“Òè]òÃH­Gž–Uö!YeåI}t¦,uŠe…½Bí¥j¡®ûG}µ¢¯¹>¥¦’3‘÷˜Þq¨7µ3óÉßFãûlëY»ä`üRÈõàhó­‹È/e#üÞ€>¢@õQ 8M»,Áx¾ÏQmgÂwìSN~Y °6]f¿ú‡Ív£ÞÏžì| qÂp=¶ño4Xá{hÇ%ÌØzšcݦÐjOÂn5vøv¡{ËÄgx\Äݬ.ª|êqXuzº Ðïà·=Å·ïÿTťʆ˥±ïâ[ÞqúÑ*Ƹ%àæ»\Õ¡2÷¿V=x}PWü~¡<¸âúÈ ÿvÊp"z”Üøë\àœÆ2à‹®ó”M`'p–_~™ž€˜K}àÏ„’ÓU®.AîÁÿ(lS:!ÇMÈw ÷-ö,¶Eîúõç-Ü—gñïµPêûåIBÝÿÖ@r<Í­œ®ïɱ8ê_‹ÀiÃF™¦iØÛ N‘¾}W¡Lúi R —,“œ$ ‘ÏÁ¹÷‚#_¡=09ÖÌmÅZˆ#þ×­ôpóæ_ ã1ý-OÓüñN® ó‰Èßäý‚õ/EO ¶è§Ë ".[ñ tǯí?aÞ¹Žõ ¶3u{$ÏX(Cµd(›ysJ•,Tkôy¾ýµLÔüa¯â£ÈΧîuäš1ΠภÙ_ÏAÈ×\õI«Ý½aïÇùTr€ÌÙƒq5Fƒ§ˆ«ÝÁ7a—j÷sIÈ–{øodþ S”P1ÇœÒì\‰ÛS%Y-{"#d5â2îüxAžf3¥îV89#/Fþ(»#»dGä=ù¹ÎUÝkríx´xp€ö¹Msœ÷ðpVËs„•#q"ü1phN²ÏmR`þKØ:ND¿žöa^oúâœ8_g‹;;Ý&æÑžà\Á8 ºx X4²绢ôólol©÷Á™ç/FgÝoÖíÍ‘W¡ãO$žQü ¬ÇÞÈrkíè ññò{ ¹=†¼‹³Ïm"z;w|BÄà—üƒ_b'Ùç6eäøÎº¾N¶?ØîœHÕ¶ØáüHl§ß¿„ü³l8ÒŒ˜xøpDã#àT°Òý+ðkªŒ³~ ÛïðmBÃØ™upH¹ó ö€ßÓú÷š”DÆJyd™Ø°ùöÈ|ä}ãOÏ Æ¯ÎC¡/õp>–ÇuòDdºjCÙ2(4\°J¯ûÀü‹m¾vWü^£MËw|} ½Ý‘¾Âø—9ù&Î\£rO…—szûn=%¶ò%ar@“ÎgtèÃøØV>Ö~NÞo»cÈ™»w(D|´J#ÿ­Ð÷0êY‡uDfíÇ÷EðÇ,ç-™æ´´K&ò~‰Æ …BiÃÜÜH6øâEYLn¨yySf$\sº,—ÊÐYeO’ á·Á'¡9ÕÿدÖ訪3º¿¹wÂS¯J€„Iá•@‚¼À¹$Ig&)RÔV J©R*.l)Ú.X¬VéÛ%­¬å«±±µ´H¡Ð b«(jSÒ}Nn^,øÑ]«?îÌÚóíó͹çñÝsηó|£yˆqÎ8ríeè{aë}Së’À‰æ|ï4_¡v^Eí<–ZxµðZjå'¨e6Ñ®dy´yCiGxk©•z6Ÿ¡VÞG­¼ªÍ2—i=‡ŒM¨×þ·±Êwû¼ó£ÎáÛsêùsÐË{Œ¶ ýW™ÛZí2äy‹¨§þµ6,Ç~5óC, lÃdß~Žõep ò^¤ž<‹4Ö-m›Ç%Ž÷›è­tcÛ˜·hNõ~T]j«Kú>Z€¥z‘«wÕš3[5(‘Å5ÿ±Ò—ri ÔɨµšÏ( Bd(pïV¨ýK<¥ü¯ôÝ'©N½óê ãJè~ÎêûE¥ºkø‚Øí‰¾Ž¨lo+Ôú€ ¾(ðec¢±£|C‘á-Ó9¡œíé„å(ä}¢ÐhD’ÆQj(æ‹<[®ñž1‰}cƒ‚áÇ"£œwŸîŒó*{¯apå¤ïQÌ¢V-“÷1W.Ïa¤<‹d9ŽQDš1 CŒ"b:ÛœÒO3æz2¨2Е9°0éAÌM‹Ù„GÊx7ÙÊ÷þ&ü\ )æ1jæÔQN}s6¦idR—nGÀÜ‹bêÄaÜG1Z¥ûµàÓ´Oר›J‰Ô}Þ´Âl¤ŽnD¾YM[ü@:˜û©Ç‹1Ô;–gñæ™0áº=¬ssÅq•3Zó€¹’ï„û´4_lq˜ØÞn›/´àú2ãÍ6¨¹gP+&úQS¦Ó¦(ôû^a¾Iz]§ë5›‹¼Såzïpêý?Ö·\äés…0J©ýŠPj”0f-¶Â(Fy›}œvW¨ò>¤£ ª|þw:à=b7 £ ùD&×mïÞñN!Ûx q¾ËN_‡½-hºä¼‡ü.‡`'-¦uÖ›^s™©±#½)al`E_º‚çrè#»¢¯’õ–±|·ò±¬ÿs°TΡ»²ÆfLÐõ2Ñ“÷Ó…´iô—˜—1ßeÜ>Á|ç6Í+Ü?×PÈ{ÚDêÑé¬ÛMõåÉC¥n«sµêž5%>“wž3jE¦?ƒëg4ßÛ 2,t£6fÄ©ÇrLCʺ;yöî¤ÝJ»ûú²sE©þÿ„Ìù/pÒ… .\¸páÂ… .\¸páÂ… .\¸páÂ… .\¸páâX‹$Ô Rù­üç»ô‚©þE¶'[[õ™¿Ã…OT8ÜÚw;ÜÀ0„n¢¾èp/Ÿ„Ã}ôÃá~äâ;ïIÿo[8’pÖáÂ1½¯¹è6›îÇ颹A7)p¸“¤Tsƒþ^²Ùá~åÍM~Sä%‡û1AŽkîU~OŠÃýÈó¤i‡gžÃÙŽ'¤¹_õåyXó€êËóºæIºþiÍSÈS=—ôØ“Õ8 Ñ|ˆòÝɽè¢ú5†pŒbšj6ÆhÍ}ä>#¨¹Ÿ<`äiž¤ùdÍ»’÷5J4OÖþJÍSÉ{aÍ{hƒæ=u›÷kÞKó-š÷Ö|›æ}É»iÞŸ<ÙØ«ù ]çIÅ-ã|Fñä.ºþá¼ì`x¼sÐÊ)(fåƒyÖ´õëkl«(Z»¾>aǬ²ºÕÙ–ú??Çš©‹&î]o[ÓJ-ç‘‚k¡ò,ˆÖÔ'"Ѻ¸~`¦]Ó`'"«CÓ£5á¶‚¥J-§Ï‰»Ÿ,ÈÊß¹J[)«ó㑸²bvU$ÎÙa+ …íÚPl]Óql[›© %êcvœSªÖYmåöj¥±P‡’OXõu¶Å–ï©·­ðŽõÑøZûÆ}”؉DÇ1&,;R§Pes€Uv·*B1»n£Y]m×±¡Ø[ªâ0âl-ÚîúG¢²º:u¦ %¢V8rã&h:ÅËfU¶ó mÇÂVu¨.l×Äkm†­!TwÓ9µ¶Å,ªµw›ýóÁX}í¶Ø:ÛZ³ç&“™kWÅ"‰Pǰr.!=™PÛT¡›ÆÕVݶ÷jë^íÚT¯‰HMõ†ôfÏ…b|0îÉ™¡š†5§U©5tßÑãçßh/½r¬ñøkï¶—?:snÓî=o¡6OKõ›àw:¢<…ÇÏãAlÆlŘ߾„/c¾‚íø*vˆáaìÄ×±‹9îìCLìÁcâÅ·°߯><Ž'˜ó¾+>ì?à žÄ÷pOáûxÏàxÏá0~ˆáÇø ~ŠŸáçx^xGð ü/â¨$1÷½„—ñ ^Åkøñ:~7ðÛ8Ž·˜K‡·ñ{œÀðGœÄ;8…?á4ÎàÏÌ­çðüïâ<.à=\d†ýþŽð!.á#|ŒËøÿÀ\Å?ñ)þŬûo\C3“—HWI–é&Ý%UzHOé%½¥ô•[¤Ÿô—4 e –!bIº •a’!ÃåV¹MFH¦Œ”Q2Z²$[ÆHPr$WÆÊí2Nòd¼äKL‰2I e²L‘©2M¦K‘Ë )‘R™)e2Kf˹CæJ¹Ì“;e¾,…²HK…,‘¥r—,“JY.+þÃp=(†@AÌÛÝWÛ¶m_mÛ¶mÛ¶¦¶mÛ¶mãò3ÖÀZ#klM¬©5³æÖÂZZ+kmm¬­µ³öÖÁ:Z'ël]¬kÀëfÝ­‡õ´^ÖÛúX_ëgým€ ´A6؆ØPfÃm„´Q6ÚÆØXgãm‚M´I6Ù¦ØT›fÓm†Í´Y6ÛæØ\›góm-´E¶Ø–ØR ´edËm…­´U¶ÚÖØZ[gëmƒm´M¶Ù¶ØVÛfÛm‡í´]¶ÛöØ^Ûgû퀴CvØŽØQ;fÇí„´SvÚÎØY;gçí‚]´KvÙ®ØU»f×í†Ý´[vÛîØ]»g÷í=´GöØžØS{fÏí…½´WöÚÞØ[{gïíƒ}´OöÙ¾ØWûfßí‡ý´_öÛþØ_û‡Bp„@H„Bh„AX„CxD@DDBdDATDCtÄ@LÄBlÄA\ÄC|$@B$Bb$AR$Cr¤@J¤Bj¤AZ¤Czd@FdBfdAVdCvä@NäBnäA^äÃÈ(ˆB(Œ"(Šb(Ž(‰R(2(‹r( ¨ˆJ¨Œ*¨Šj¨Ž¨‰Z¨:¨‹z¨hˆFhŒ&hŠfhŽh‰Vh6h‹vhèˆNèŒ.èŠnèŽè‰^è>è‹~èˆAŒ!ŠaމQ1‹q ˜ˆI˜Œ)˜Ši˜Ž˜‰Y0;`&æÌÂÜ€¹˜ˆùAX€…X„ÅX‚¥Ä2a9V`%Va5Ö`-Öa=6`#6a3¶`+¶a;v`'va7ö`/öa?à á0Žà(Žá8Nà$Ná4Îà,Îá<.à".á2®à*®á:nà&ná6îà.îá>à!á1žà)žá9^à%^á5Þà-Þá=>à#>á3¾à+¾á;~à'~á7þà/þ1€F!’¡ša–áž‘‘™Q•Ñ1“±›q—ñŸ ˜‰˜˜I˜”ɘœ)˜’©˜ši˜–阞˜‘™˜™Y˜•Ù˜9˜“¹˜›y˜—ùøó³ ² ³‹²‹³K²K³ ˲˳+²+³ «²«³k²k³ë²ë³²³ ›²›³[²[³ Û²Û³;²;³ »²»³{²{³û²ûsrs‡r‡sGrGs ÇrÇs'r's §r§sgrgsçrçsrs —2ËÄå\Á•\ÅÕ\õ\ÇõÜÀÜÄÍÜÂ­ÜÆíÜÁÜÅÝÜýÜÇý<Àƒ<ÄÃ<£<Æã<Á“<ÅÓ<ó<Çó¼À‹¼Ä˼«¼Æë¼Á›¼Åۼû¼Çû|À‡|ÄÇ|§|Æç|Á—|Å×|÷|Ç÷üÀüÄÏü¯üÆïüÁŸüÅßüÿüÜ&DI® ©P ­0 «p ¯ЍHЬ(ŠªhЬ˜Š¥ØŠ£¸Š§øJ „J¤ÄJ¢¤J¦äJ¡”J¥ÔJ£´J§ôÊ ŒÊ¤ÌÊ¢¬Ê¦ìÊ¡œÁ^É­<Ê«|ÁjɯÁz)¤Â*¢¢*¦â*¡’*¥ÒÁž)«r*¯ ª¨Jª¬*ªªjª®ª©Zª­:ª«zª¯j¨Fj¬&jªfj®j©Vj­6j«vj¯ê¨Nê¬.êªnê®ê©^ê­>ê«~ꯨA¬!ªa®©Q­1«q¯ š¨Iš¬)šªiš®š©Yš­9š«yš¯Z¨EZ¬%Zª@-S–k…Vj•VkÖjÖkƒ6j“6k‹¶j›¶k‡vj—vköjŸöë€ê눎꘎ë„Nê”NëŒÎêœÎë‚.ê’.늮ꚮë†nê–nëŽîêžîëê‘뉞Ꙟë…^ê•^ëÞêÞëƒ>ê“>닾꛾ë‡~ê—~ëþꟸ9œ.wá!=”‡ö0ÖÃyxà=’Gö(Õ£ytá1=–Çö8×ãy|Oà =‘'ö$žÔ“yrOá)=•§ö4žÖÓyzÏà=“gö,žÕ³yvÏá9=—çö<ž×óùžß xA/ä…½ˆõb^ÜKxI/好Œ—õr^Þ+xE¯ä•½ŠWõj^ÝkxM¯åµ½Ž×õÿ©¨îÀ(ª>HÉoæ‘"½ J¯‚ ]C  ‰ ¸¹[.G.wÉ•P”&M¥÷.ÒAzï½K¯Ò”ÞQQQ¿»ÛK²ß?;3oß›_Û·]¥›t—OE“d±ˆUté!6I»ô”TqHš8Å%é’!nñˆW|’)½¤·ô‘¾ò™|.ý¤¿ 2H¾Á2D†Ê0._ÊWòµŒ‘ò|+£d´Œ‘±2NÆË™(“d²L‘©2M¦Ë ™)³d¶Ì‘ïd®|/ód¾,…²HËY*ËäY.+d¥¬’Õ²FÖÊ:Y/d£l’ͲE¶Ê6Ù.;d§ì’ݲGöÊ>Ù/ä ’ÃrDŽÊrLŽË 9)§ä´œ‘³rNÎ˹(?É%¹,Wäg¹*×äºÜ›ò‹ü*·ä¶Ü‘»rOîËy(ä±<‘§òLžËoò»ü!/äOùKþ–—òü+ÿ!r#ò" €PȇpD QxùQQ…QEQ ÅQ%ñ*J¡4Êà5”E9¼Ž7PP•PUPÕP5Pµð&j£ÞB]ÔÃÛ¨hˆFhŒ&hŠwÐ Íñ.Z %Z¡5¢ñbбh‹vˆC{Ä£ÞÇH@G$" ¢>BgtÁÇø]Ñ Ýñ)4$Ã+tô€ )°£'Rá@œp!pÃ/|ÈD/ôFôÅgøýÐ0ƒðc†b†ãK|…¯1#ñ ¾Å(ŒÆŒÅ8ŒÇLÄ$LÆLÅ4LÇ ÌÄ,ÌÆ|‡¹øó0 °‹°K°Ëð–cVbVc ÖbÖc6b6c ¶b¶cvbvcöböãâãŽâGÃqœÀIœÂiœÁYœÃy\ÀEü„K¸Œ+øWq ×q7ñ ~Å-ÜÆÜÅ=ÜÇ<Ä#<Æ<Å3<ÇoøàþÄ_ø/ñþÅÌÅÜÌü £$ó1œŒd_a~`AbaaQcq–`I¾ÊR,Í2|eYޝó –gVd%VfVe5Vg Öd-¾Éڬ÷X—õø6ë³²³ ›ò6cs¾ËlÉVlÍh¾Ç¶a,Û²ãØžñìÀ÷ùØ‘‰Lâ‡ìÄØ™]ø1?aWvcw~JÉ´ÐJ=hc íìÉT:˜F']LgÝôÐK3Ù‹½Ù‡}ù?g?öçä ~ÁÁ¡Æáü’_ñkŽàH~Ão9Š£9†c9Žã99‰“9…S9Ó9ƒ39‹³9‡ßq.¿ç<Îç.ä".æ.å2þÀå\Á•\ÅÕ\õ\ÇõÜÀÜÄÍÜÂ­ÜÆíÜÁÜÅÝÜýÜÇý<Àƒ<ÄÃ<£ü‘Çxœ'x’§xšgx–çxžx‘?ñ/ó æU^ãuÞàMþÂ_y‹·y‡wy÷ù€ùˆù„OùŒÏùç|Á?ùÿæKþÃùŸÊ¥r«<*¯ S¢ ¨”ʧÂU„ŠTQê•_PU!UXQEU1U\•P%Õ«ª”*­Ê¨×TYUN½®ÞPåUUQUR•UUUUSÕU USÕRoªÚªŽzKÕUõÔÛª¾j ªFª±j¢šªwT3Õ\½«Z¨–ª•j­¢Õ{*FµQ±ª­j§âT{¯:¨÷síɵW} TG•¨’Ô‡‘.‡µ»ÓåÕ3|š#@¤kn¯]sXí=zD´Ç—–¦yí.gp«ÝéÕmnÍnÍj·„ŽiéénWï MX´Ïí*”áó»zìN›#Yóèµü{ —¬ÉÙ l‘¦YÜ.'5Ñ"Ù­gêЂÀ.›Ë©§R30¢•Åî¶øÒz8ôÞ–ÞÊêòj‹îô†[²)Z[´€¥5ŒEÒC‘¢Hz£sôlÊèP|Ý@DŽz"bLÙØLÙÄäxÙ²©Š±èV»Ã¡)[ˆÀ¦Y|^=¢É&%‡‡µIÖÜa)þb½v‡U‡=Œ bal(I»ybÛæ±÷Œhkrí™ÃU»¬4R³Òˆ ¦GT\Ö{Gö{£hGÂãrŠsä´:ÞðpñYÎ,xÃÃi4Ω¥»<^·+=Eg‡P®ÐX:cq!ªCŠÏiÓܾ4‡æóF¹Ì FL·3!+¦;+f‚Óm@Gc·ÇèyGSw<¦î$f¹x³\ãÞ „%fâ Ì$ɘ‰Ï˜IR¨ _¨Š$£ _$Éí¿â <£’þ¯"ŸY1)4I_èsïdʲ—‰w6ñ>9]Œû!¼KΤúfÓÈŽ—ÿ6‡„Ç,ÍÂkÊÝ3uKZ² ûITNÐÀr°~’Ϩ>°,ÜO"³#ûE„Õ®»ýŸ3Ð ?æ7w p2ØèÀfSá¡ib½ñ³¢—Ãnõy.§Í•©»ZÿªÿÖ»]š72Æ\Í,âÌÂaíÌ"Õ,âÍÂi fá6w­ËksëzjT†O÷~ŸAõ?¶«­«mŸC¹Ø‰ tÿÅî´H¡¤H»ð²GÄJlâXY_H“_¿ºÎÈ/žoÆÒhôIš‘œŒMòpÅ·~ÒàÜÄ4ËÞZ3ñ+‰I³鶜P“ ÓŒÛÙ8\’mÆ”§É¼HÔCÆ®œw”¦»’ò(ážbµ #)>ùÉôMxAg© ·Ù¯RÎi4v.(À_¯öº/!š_¬‘A”ñÑrøuKú1Â9ÂÄÀæŒ?Ñ·Ÿ"Ì>AƒæÿO ÐÛÆuŸ2œÀ%NÀ}Ä6íÇpŒZ÷†¤AM!²Ö3MaŠÝG¾šöß߬‚A €ô&RñŠó{G8E Œ0âµEÿÚjôGúg8&Eú)ÒO‘~Æú¦H?Eús¤¿ÀÿHÿÌ¢?·è[ôgýY‰þ°Jÿʦ?«ÒO7è0¨ à#€îõ†4EÜ‚¡ïøÛ„\=cË@÷Î ¶ð½…ÄŽeîã"·ž2䮕[Š{kõ˜Y8X[žl;boTÚ.^QR[}kõKÙ¹i±‰ ,ÓªeO&F•¼È+{WED&K­í¢–FÓP”‚}i2 jºüúh Òg‘ìÄTä@Óà/Þà#»7æù5%¯Qbxé䕯l)4YÚ@›GI‘ÍåyÚà®)aÆÐuÌ(¥xÀ™¬hFÛÅÒ d‚6Ú~)CYcæ©BkT‡ ]:²–Ã}qÏšQ¹”hý¬¬åÊÙæ¼¡£®tdæ#Æä¿­rãÌ@–ò½_²lÁæ4‰dã¶€¿ Vy4#9K˜,øEŸ|ý‹¯*_Î_^çôq—©÷¦Ë¡Š­êR7×2UÒ›‹¨c:Uj#Õª—–ìÛTÔ˶üšÔŒø]$æ/™ä'¤žk‡yJùˆbADU­¿ëñ–Z®”t§1Ëy÷,g‹= ç¶Í,^}¦}lœF‹¼­¥q(‚kôÉ„'4’¸s}DšPEêOü¶“/Y=Wò“Ÿ…Û#Q÷ ñõF‹,â37NÆü°Í~ý qKb>_Ê_kžT`¦m©~NXLÒ/<…ÎI\$¼m¶š¿²X]\V 6o½¹XÙš89m/ÒhYV,êÑÁña‹‡&—4mñPAùbž|1ð Ä4ÄÃo_š…͸Ö¦ºqgc^D1ßêË/, <%ÌOW“sNcªC9ßIøÁH)™ñ¦Ü©?GçÎ$š)Ï$YØæÜEk&hâ—yÝàXË+-¿jùMËž–M2‰¢³ÃÓóc@'€NU«ƒ-ë4ÉdLùËSIe?ÑÒ´?Óò\˯ޚò‰GAÊn» ò ª#Ó“ÖŸ9“ù“'ÎYG¢œ ³Ðµg=Ÿƒžƒ'Þ³’&gľmRöJøQ¶>9n˜Ó¯ }-/¼‘8´óú•ÞïÔìp¹Q™øªãz®åág‘7CODpûŒQn¬ªËÙ±–'Zžjy¦¥v}öUËoZö´¼ÐòR˾–¾–W:CÑ‹JÒl-b¬ Ý€-ùîÏ %ó‚g©]¹–aG­…eÑL5ä&ž³@T6ƒ»I1çV\näaÜ· ¼?M¥µ“ðSô_Aâ¿ç_®twAø’8ˆ&mêf…(½üý¡ ±¶üT›>^J±ìÆY,RöÇöêˆ÷ Oíü<;¦4 i”×xy’Æï<6'IãiÉ$pžxek^±"Õ(z×í£?ªÝ#?Ɖ‚¾`G5¼À¡þëú1´tŸ–4ÖžäS%n•˜)¾†lÊ×xVgJ¶µ®z¶™­ÕÞµý—­þz+X×®åk÷2ÚZ"…ÓHþpÀzÏW’P)[CuGQ ³”fÏÜN›Ä ¯—9Q·ô ÐÃ/÷ åèAA¹GTî1„ z Ë=X¹ÇôH¡ÇC¹GZî1‚ô•{%µv£–2TK)²áÑÑ™–çZ~Õò›–=-/´¼Ô²¯¥¯¥JæGÇZjy¤¥*&G¾ß]˜Ã> {p£W[@Á ¾EÉX$Bç`óÂ< š¯9pùw^¶/Ç4àþ‰Ü&í±­9}ô ï>øÀw}}í­hÐíW^Ý bhéc&שEmEÿQ››ZJׯz¥ƒëã3Å¥ˆÛ¾L.|›Úšs…³Ÿ¬_«ëS"n°UˆÝG! “g¸M£Æa(ÔÀ½ÁG—Zx`Í Bì ʉ1*©µ[%f* ÜB,3X¹[\¹Àæ´Œ ê€Mç͸¬;wè ߙݻêÚÄC퇊q®öÜäsŽ|þ€xæù=¶L°å=´L°%F–`d÷ÕÈ’ê®Jže\.Cì)»aÚc%µ5´7-³•¡½ƒ™¥Ô~*±PüÄ™-> Lq¾0ßVꡲRie¥á#úÏÐÿ#øÏÀÿ£ Út²Šþ(3§õ¿¬ï‚O4e&ç aŽñrpÕG¶´šÑÚÌÖøÅÝ â¡ÃáC+Ž0Ê£•£,ÊQŽ0Ê£•¢,l­ö¬RñJ=1ž!æÄüŒîWxVžÕYYé½ù/’ÿ¯ª {tÓ¶[j'«ê.Ý0É'ÄÉÁ–ê rrªõÓ~÷%¤òˆ›§Ew]1èŒ*)©;=“žÁBª–Π챕õ=CµÏÞzÓ¶û²iZo˜:ÅŽVÖwG–ᆅU-ŠAÿR˾©è0nQw´á³¨ZöGa‘LIZÌcRä`ýŸï²knÉÂp•mÅ#[öÄŽco¶jÿ”ø†K>gT™§&qÕ&7[- ‹^!ÐÊÆùõÛt¿  É^؇sºÏûœnqh8ŒEßø#»¶’cwŸãBݽŒ/]Úþ&—äxýêq_ï„ù‹ÿx¯ nêÕ+‘¯LÜtŸ3/®ÈäW²Û‘‹ N+²)âx{îKÊÎë³/lô4d3>%ìêlÁŽïÉ{²ß“W¿“ÝrMNþ8œüy8ù'=ÜÑzïN>ÐÓ¿’|ò‘²O¬ÓOäpþ$¤N?$ôÔgJzñ¸‹7‚4«%ÛW*Ìmß/qY—¸©Kœ¬ëÏcT÷½®®¬xu´®nË«Kyu织œd‡“oô<%žI~QÖõ=ÓŒ¤~yZ±R(uÏÊ\±?æNòºÔíVyèW9%Y^ÅiL ¶vþöeŸoêS}·‹3ÊKXí–bÔ aØhƤ*Ïb6iÆŸ~pÄŒac‘éÚx„ùÍxcàѫ찋‹ü2Ov4ûìí¿Rͽ^ålŸ«C‘Åë]¾¾"û¼¬Š|ŸÄÌ›ÆßVlg×Ë”OŸë6¬sÓ9ŠEuOpþ\›¹Ý)Òsø¢ó [õö6¬ ¢+rü ½¥Ðƒ<‹K=ÈSE\žÏ™#óÅ÷Ý¢[í8×õ ?øÄÛG¹Ü\.Wž%Ê’§Š¸<_”+ÏU|”«(¥Ðì©»¨CÇ™~ëžÑEÆâ å—“«ä¿dÊÚ4~®¦6WWYÊntºIªúõ~²«ãÓßË]Ýó†˜8ËŒ¹rók×·Óöxm†‘I˜ïã슛ØUÙõ~~\’¢ˆ×­Ÿ÷ýëÇú ƒ5çšÏâÕp¯jîÙù,Ûˆ¯;þ*Á/×ùa™ÖwÏ—Ý4GæëÐŒ6„Þòj¥³¡‹> z)žÇ'ìa—‚dkÜ*Ž'¬gÀšÜª–+æ©âFã[šsXŒ›M<@~£çÁ"îÎ/ùæ¹á/ó¹"6Ò0†‹\š®ëÂBS<™¦ìALMÝÑáÛ°Èô‘é#Ó÷aQ•%•*,*‰¯†˜ïaõž‹ùæ{:,vÓC]^Sò}äûÈ÷‘ï#ßG~€ü;`<Àxˆü°©ºÖ‚ÂàG˜!?jòuÜ—lã ž¦*°*¬Ø_M71¯±‚£i×pßëb?5Åw€¸›Ô¹Ö2qg˜*¬†– 1ãândVÇxÓšM¼Ñ…ŽÑè°&ô›:ô|èùÐó¡çCχ^€zÔ@?€~ݺtèÐ  B/„^½z!ê ±ÿ!ôCè‡Ð¡B?lôQwݺt#èEЋ A/‚^½È¿ é>!ü cïKÊ>â¸óS\‰è”渚å;Z0 çЙ|‘ïâ˜táõ®^Øè-Z½Ç®ÞSWï±Õ»©ñÍÜÜ ^ñ3s³U¼#ÅörEŠ˜½”ìãí¢¢ŒAIW³tG×ë4æ_zg){å¸KÉn¹&âøg/ üKð5ß’©kûJ J~îòo”t'ԵзÃO»F‡¹ LÉÛa@ÊåÑ:WÔÁ?Lù¤ë£?渻ÏsÞ ‚ƒDκøÃÄcAõÓÙ¨ë£_?Ý5{¡{©èv˜& ø‚7E¡˜ØÊ ;nÜUëÖƒ÷­×«ò˜Ãùoú.×¹íÇúYþ¦ï²ÚúnqOwöò¦ª'ý½éÕÚÏçÅ<È!®{/Çe^؃Qh×Ð|Üæ×ÝH=å]7Ð[@/™u/E¸æ[),¥óŠî¥ˆœÞ–þÚv¼;èxwØñÀèÚat˜+:~r æ:Þíw¼;èxw¬ãÝ‘ŽwïŽu¼;Òñ‹AÇ/ú¿øAÇ/¿ëøÅHÇ/¿ëøÅHÇ/ú¿èuüb¼ãýŽ_ŒtüBîøE¿ã#¿;þIîø^ˆw|/Òïø'©äèW9.+ˆŽ—C# ÇŽ’:¾áß ô;þiØÈ÷RD´¬–ÒEÇK9½-½~ýQñ™«*s¾+¬ø\e¾ ÎçÏ5ñy7WÝàlg›YD+²z)hšÒÕì¹ãˆiâ+”ÙFÖ‚ÜVyU¿°äÏpÍËϤj$._Ž×7!;:è3×m$F.?”´½Þ¯o>Ê”VU·‘—aä];g¨úîåG#¼f_|h2«Àª°¬kÀšÂZð-øâÓYÖua=XÿîK¯ãrgë¸hйû>|óe$ö}$öžÈ±íH,ÌäX< Ë‘y#±O#µT#±ßFjIäØ?¶3«‘àìc’oܲãÜ<±wbB7ÉñÞ; #ü¦ÖÅ'³Ö;ÆýÊ޸銤⺽{V?ùÛ{òƒí®Âl“½¸ë=´U÷sãñ›÷dIÊdKÛ¹Ù#õn’å6©ŸYw7¥à?ºû.®þßèÕ§¸*«ªºÞu˜%y¾mݸﲇ[XBÒç‚f›³Ïù&9{aÿ®Y3ÿõ²‰m£ˆâønjâuóýAÚª Ȧi’ªò¬wvc­×öº.)Q”¶¡EÅv¶‰UÇní¤ir¢¤—Jˆ"z¡|H zq(ÎT n9!¤JœÊÇTfwþ›:mެ´ûÛy3ûþofßÌÎfóó[íV·ûDí£³¹ouGsÇñµ…üRe+=:òÛË{P?—-Ì—ù‹Û²çw¶‹…nÜ[ÂŒ†A j`D¤V"…³AQÖt†uÕã`L‚v‹ûÎðÊeŠÁã" ÚOñÄré|Á¹âŽgà¥Õb~)¨h‚XÏýÏ€îË•ÜWþ¹)Î/2e÷m,–æº1s“x“FK¡)„B )ô@ô\ ³8FA Œƒ 4À$(F0½ô#ˆ'ýô#©(hq0⃘òýŠ71ÑÎD;3ÌŠQÇÈE@ô[ÇÓÑ_ÝS¡¥•R㓈HCD"Ò‘f£l[=K¥¢“åßÕ+|î/ð9â¾F[¡´ÂMí0¡EŠ‹ù¹†’h ¥Tèle1ÃÓøb&4¹u7íßµã®è®_Î\ßöbeù¢SΗÊmå>ÇrnæqÏ¡Jna%㺜ÒE§èîUÊgÎKÌe€FÃOHt^¯ÛÆFÂSP# 2ÐMpŒ‚èûO€"ìˆß>%H¡O¡O¡O¡O¡ý”M¡MáŸ&{¶u?W(ñk‹g÷»s<œ%w-Å,ÑŠ_ºBf)_ÜÃWšL9·àwÖá¯.·˜m¯\Zæ¯Ý/vTœ Ÿ‘¿Œm²\GöêþvÙÍ0+fC{†,gñ{mÁ~¿oqÊü>0Ç/ ¯àû½RQqpÓ´ZC–Ï ¶bÛêmx» Û6Ú[ûá–†ßÇÝÜv?ü5 mý„´mÛη6n½÷`Vç _·Ê"÷^œ?ŸÉ¡"íäã›»ðhC2d C2d C1d –| K<§šà8"[(å.4/Ó$Å&3l ‘på¨_ÖÀ(œ†ãX ãš’+/¯9ùrI,8ˆÃ…e6 òå Œ&8ò–óJ~¾ üZX]-c×JÉ«³L- RÁ0Êa¿¬Ph€&˜m0%Há—ú~ÇÁ(hq0öЧЧЧЧЧЧðKá×ÿUÂÒBuüJ‰¹B“‰0HAd šà8­ÞäÚ¯¹ŒÞìÓÍq(ƒ>ƒ>ƒ>ƒ>ƒ>ƒ>ƒ>ƒ>ƒ.ƒ.ƒ.…ÂN};üSø§ˆ‹".Џ(â2Po Þ@½á×#n~ ø5·xÃ(‡á/Œþ„Ÿ‰vúe`\ ôÃðÛáyñ˜ˆÇd]—–KKNÁ9¿ä¯µÝž… \c¦à~ÅŸôL¾jøß9¼˜/—Kå¿aƒmïcîP±ïq¯¨©KÓcu)ÍÏ#üÔù9:¶¡Ä¾’¯K½çîÇB2 H-äç}¿+–Ú¤_½kU>km“B¹õçHn}==b…ä É È‘mIõ˜¬©·I]>RS9žhª™ýR,dªä_3Kþ1ëŠÛOþVß&ñóOõ(ùC¥ä'ÞîGó¹kñúùa´ÞÄñ½Zȱòz•|aŽÏÍgIm˜ÛjdÃâ¸C>6¯’®y–G=| Öå›5rËÅò>÷cÝ«xG<øºÀÅkžPiÓCq³ÞtûYT,P޵sj¼¢FÉ)«.ÕȋÞމá»dÂò<Ä„!¼3Õ‹X²‡Ô¯ÉA¡ðŒÛ:ÖCÔ¤Ÿû?të¯~•X£uùÓ/ÓGÕôð £.ß÷4\¼#PÈ #"“Fä—¥!ù½ÍôY¾^#ë77ÓÍ¡ú®ßbÝds8=|Ÿ?‡øyº.ŸŠ ¾œ žF‚cÁ‘ààÓÁ§‚ûƒ½J·Ò©´+­ÊnEQš•€Ò¤HJoýÁ/±1I’¥ÞæNÍ÷ðî;›Ü+¿ð«Ô$+MÒ R½Yz£ïòѽG»tESÉ.³¸Ž=<ö6ÞËýÕ'ÏT?ë?[ÕÜ›ýgÇþŸÃ‰óËÄôêæôê½Û´gm‡Ÿ³Õ·./ì­¾–ظ·êV Tw˜Íæ\fœêê “¬ÞLlLÏìP=ãVO&7¤ûÔ™™˜“¬MǦíÁLòìæ”žÜ¦õæ–VÚÞÁ™í:K»ZS“;TOºÕS®Ö¤«5éjMŦ<­±1;2þß{ØÿÍ endstream endobj 73 0 obj <>/ProcSet[/PDF/Text]/ExtGState<>>>/BBox[0.0 71.0449 181.666 -1.66602]>>stream BT 0 0 0 1 k 1 i /GS0 gs /TT0 1 Tf 0 Tc 0 Tw 0 Ts 100 Tz 0 Tr 10 0 0 10 0 62.3999 Tm (981753168799324656227674929182)Tj 0 -1.2 TD (128528157119338498438828295761)Tj T* (126133472373446921726169876393)Tj T* (642371443338971832894344926413)Tj T* (598186126573959792878292614367)Tj T* (996434674532669991329856912814)Tj ET endstream endobj 68 0 obj <> endobj 71 0 obj <> endobj 72 0 obj <> endobj 81 0 obj <>stream H‰Ü–{Xׯß3gfwEPPŒgwÅxAŒF­Vb€x«A´Én›*( ¢ˆ¼5Ö×*š&àµ5ÆjCnZk7Vñ†ÑÛ(‰ÕŠú¤šZ6ڭݾ3l¼%ñéß}Μósæ=ßù¾ß™Y˜‰Œ§G'&ï|öÚ%öü•%kBavñúÏâ?ÄÀÚc ¥úåw­á€­P’óŠ'žþèb6¶–s‚§ÌÌkÚ¢ì¾Ðççfç\ò ]´˜@½>ùì$oÒ^E»S~aéŒfÇ·Ÿ¢½PûN)š»-'x„s”ØÂìÅ–W­l·mÉùúóÙ…¹ûz)Ûh÷¢™]\TRúú‹+?ú½Âù늧åߨ©Iô¤¿!¿LË¡AÕžR߃ke4–*y6Eiji"mª¢¨óm‘Ї!t žTZ‚è_*–è@´Xm-Ÿ°ÛˆÔ,­ÖðÆœ(‹ß8†ö´ØŸÂ"Ž˜³Î³G¥XaC„¡)ÂñfhŽHD¡Z"­ðZ£ Ú¢b¨Ò±èȧípÀ‰NˆCg<Š.èŠnèŽx$ ‘„žHF/<†ÞèƒÇÑýÐßÁ Äw1ˆ;xƒñ$R‘†t<…!ŠaŽøFâid`21cð}<ƒgá‚?Àñ~„±‡,0· ÈA.ò0ù˜„LÆây¡S1 %(E^ÀtÌÀLÌB9fcæb¹ú1^Äü ñS,ÂKX –àgXŠe¨Àr¬ÀËø9^Á«¨DVbVc Öb~Áµ×ã5lÀëØˆ_a6ã×xÕø ¶àMlÅ6xñ~‹ßa;~ø|x;ñGf@Á¼ƒ½xû°p‡PƒÃxGpïã>Àqü æ*âN¢ácœÂ_pgx΢ç˜?UIçœLFSc¶æ"(¬"BD‰Ž¢§,F‹q"[ÌsÅËJrV¾!÷êÑz;=Vwèõ$½¿¾Åîp(‹£¹£…£•£#ÖÑÝ1Ä‘åÈ;ò¥ š”¬NÍX‘$ž™b¬È¢æjRN™š-õ6z{]75ûÝ£EͶw4s¨)‚Á i Þ ^^ òt×Çן æ£ LëoÕŸ9ÿËFÖÏ/<_Éò̹‚ºÊº uK€ºÍ,¥uSëÆÕ%Ö%¾¦½cÒñÕéÜÝF}hB6fÞ“CVr£ýí—ÐE'Ñ…u·¯´o,¹dè÷ÿ@ýxâ?Áßþúu|ôÕ(Õbë<ÆÄ‡EÊ<(w~>î÷(kcžO‹ÅN¶7ñÝq”q¹!Âdxœ­=|Ö¥ÚÙ[Á/…ñd…¼ˆ2¹‹;}þ”É‹¢Ÿä³âìâÕß]EŸ÷r¹Gºxö û­T,çšE˜§°V2©|L5¾ Ǹ‹EÌÉFÆê˜éÙú–»\ÂŒ¬T.ó‹¹q9Hüª›kˆZÜ¢Rµ2PÉ㼃T[ÕbsQ¢B„qæ­VéNÕíÜñ]«Õj+x°®Õ>çÐÁâ³D[Ü…·Mb—è©ŒÄ >_Ž1ò99Už U§:]^F…™Åì×j-Ѩ°:QaÉ3Õ,óWnìO™®f‰j\¦æxé§m§gkÍÛ•Lm¤6’{ÎcßZó^Ñx·D☼͸¯Pbˆš.q¤\Á¯õ>ù(#ÉÞ\½åÚÒÆ™­F‚¶TVRߌ†è¥ ÄZ%O,¡··Í"™Ê-yè ]ÅB±~Ã:%Æÿ+6»í°h|k Äë‘^%nhŽ7e”K?ì¶'Ä?`ê‘VÝ‹ oÄLÝ f¸ÔÍíÕÚ{eœÍ«Æ9/|Ûà…„øá.Ý'Z§¥†dÓ²RÙ9ÚŦa±›ýi© >Xã‡û`Ëp½%Ä2·OúÚámþ§“ãÆrدëi“R½"‹F“xvt³³¯§s©ôL—Ó­{tÏО®çgçÐ1³æ@®ÇHG»&ñ>Æe÷¦¸cî4sÝîþÔij訦ŽÇM…‚B©@N ®{eç ×(—w~jŒ7%Õc·ëiÞ½.ïÞÔ»ÛÍYwööÝ ìÙ•ÄáèG>Ýl3~aŸ]‰‡Ùeõn/ø®€“ý*T±´Ðã6™+V¡ò2ƒ#×dÎB(F¿5;‡æTÖvnÿᑦËÜ ”QøöõÞÞÞT²ª5ñÜ«û«×|´¤ìów_º ¬þ+Ö»gò¶a9è]D}ôæ$–xú)kÂ䊳§æ'<]¦nÇ颼ŠÉë,´9·+7ÝUzAð'à ><‚‡m÷ÆîÙîUúàáÈ5xÜ… +œ oh]Œ*t2M4“ÖÙ£Þ½ßô»¦Æ÷Nõõ9z4ÞsðõúóÁ–wkþ€Œ{סs·°`°bi×¾wŸj Ëm‹õ³ìwÚð/"ô¼8 Ô‘†#Tu• Y+Å0ÖjŠÉ0'ŒˆÙŽ2-”3Í`š•YeÿäÉá2;NófÙ•zž ƒäÁzw:ÊgÊíåÝcϯ o©EèÓü;—/Nì2.¿Ë\/?©ö À/qî@îß ¨•UnƒyÁc ³=nÛŸ›°Òð¶¶v›{Œ“šíD7es9q‘/Aš cCC$_ê%Puµã¬PŽ\jZâp¾>¦G'.-~¾øïȦÞþªy`à ýÜïœ{ã{G¡{Õƒ¶Yê½;Ãê?XöJÙ’·Oïóz!;AÛ:¨ëø\\Yå1»æ&,®„ÍrÆ¿·û ‰¼.[·×í¤ ­n³i>ÊqymãÃÃãCøÒËù”Óõt” ›Öf;riKÛmT~Yr›¹yºPæÖSû×_xß×+þþ‹Ñ›êøò Üg©7;êx}÷nãÙ~ïBõ–ú·À6õ«/GÔ1CQ+ÚçšõŸ<ÙÿóŸ½õ¶öüÀÁ úñ:e¢*ªæ½4C3^ƒÑPm„Œ2F>(Ü”Ë Z/Ù+qG‡“ F½r ®óãÌ›w®ÑiÆëµ_wã#×ÈÉÈIå¡J©5UÞ9™Tb¡)á|<‘Ýåì^xÚ7'³à[NGsVºÓ1ÏÍ8gå»|P¶a­n8ÉvÇW•›”xKà±\V^–‡ŸGò ÀLNr“îê<¼swçaõÃŽƒ#¿½:r°£ë˜ª ©“ÇÖooiÝÞÞÖ²HìÝÛøÉž#[ò϶÷]½Ú×~6?ÿƒcÝ<>ˆ^yíµWZ·wèýß1­Õb* ž¨r瘨DÞ›5ž¹ß–p›ó»ÜÝÞƒ\îtgfá\\æ¡a¨´^f­ïkUNJ„x­ÿ²íY¸îK³ËÙl\qw!½¥£³ʹëO¸Ú¥¸Ú_þFÔ›êÝšCtW²”{ Ü(Í lC–Ñ¢tu¯*©»TÙEi€}g¯¾8ëÉû”KÿB|ï;í62þ{rL]`øÌ†Ë4m½¶ÃV@w\›ü—á32?uè΂ÃJ3|PÓA WÑ&à4à< P ó6˜ï¼×§uÀ;aü3ŒŸãC`'` p°‡Ì óqÀ@»¾^Û[—‚QÀ<€—Ø€¤}|=þ) –¬‘µ1âÏ•:uýZ|ÙÄ~øÿX·‰~ã3¡¯Ï&Z¸h#¸˜2öúÀãDËE¢ç¼>¢­0^'ñâ{âÎ7à×€›Ól}Ôâ÷ÄIɘ:‰¦G!Uc}3Ô6gàè^Ltcß—áú)q,¿˜ê tƒÜ«#si€"r]›ÏE’“¤'6:`o©÷³d_©žsÜ{ÚÞ'ˆÝ:½.T3©ÉF2ŸÌUL¯••¢ïš\_­Æud]ìÁ}tE¯;: ÜCp"¥/¯¥øH1g –‚Î@îĆ\€•ˆ‘†g A~äÕéþñšÉ1Òq’ÿ½G´þH#õò’INq\]ÄN5`­A~’h$ý0˜b7Nj’á> ç׫×T«-ÖÜX®ÛC™bÐ< ¿áß&ø\µ gP¡Yz/=ôÿ¿ÿõ?üžAYÔzøæXKàk£ª(;EŸ7»àLßBN$>xqTúƒ7–…ÚJ8 »Â˜o#Ü|'áF8Á ÜVz7S>ê§„§ÁYó:áp¶!Üš¾Ytÿ2-« GTºe=á4ðZÂà/n$ÜüG„ƒK+áfЃ•#ß³ì Q¹ONSYõ„30ßD¸xáF걌„›¨ìŒÓ„›©—2ΞF­ÈœGxåËü>áÖl1sg͆ښÍ5Õëž^/„FÁÏ)‚$Êì"[æó-cZØœ(ø‹ÙÑ_®‘"-Q¡)¨$W”ãÕ‚"+Qž “U«C!v^%³›x™¾ÌJt3ìfN”7ñM±š˜bµ|T쒟ϧMãÙöY¸Ï±‚Ìr¬å|˜‹nc¥Æ™R—μT”ÈŠÒÒæææ’†ä¿~(´‡‚/ýfá[-Šßjùo£°Z¬–|4,ÈZJ`}òà¯)ʉ (f£<7úƒ\´‰/f‰åÄ6I„ RƒÂ ¢ 6?Ç+• Ï6J"ãüs–ãJ¬‡?/Ê<»È½¯p±Ëɲä8ðÇ$,Ì‹ŠÖ#l£â¡Q°Em»YjTš¹(ï.Ò”DùHT Äü¼f& @hBCLá5 Ó6³‚èÅXI³ ¥˜bÂq„×Gõl‚Ù˜ ëq8Ål˜×¢ŽÄB‚,NñQŒ}–JQVæ¡°Z©$ü®±80Á‰VHê4GÍA)üð\†ÆXT‡¼¶1 ±²TÌʱ†­¼_Á3zŽC!©ä—Ä€ =T+pA·ÀM®Az™×bÐ{I“ð DIBÈú,®Kdªô{¬ä ¬žä „"ËM‹T¡3¢lXŠò œUZ"|#ŽJ’²¦ßs-ØCXûYÀÍÆ…h? `– ´èõôóeø©Ö\xYh5!M¡–HPÆ›p—r~0"ãIEòLOz×ô¤q¡G {’:¦¬<1Ô ÓZ‰ò"Ö×b"ãTâÚ$úŽ×Å7Kÿ¡½* ÛÈ®èõb{Ún™iªÒnWu²»í¶Mq,ìiÎhoʲ$ÛjDÄÉ–™™™™™™¹=eff<åí}ïÿ)ŽísÚµ,ÍÌÿï£?ÃæÈÉÄÕ˜Ýц“‘âÍXТ­šÕëIäNqáH¿›Ö::fÝ8õÁ€EV_í´dÃxOÙ3Ù¨úˆ[½iT¨.Éñ¦3é5­É™éÞ’1>nÙQ¿#Õ­¡“@ÕŽtÖLD8¨7××éë±×{ÈîSkJluÖŒYKžS¨”C§Z)„+nà9~ÕY*ý¼—w2n•Ï™¬³â‡K•Zè"pËá!§RpÜò!g¿_Îgï‚åÀ«VJàø¥å¢ïqÍ/犵¼_^tÈW®„NÑ/ù!…†eµ¢|¯*ÂJ^[⣻àýðPÖ)øaYd(Ôu–Ý ôsµ¢8˵`¹Rõ(#O±e¿\¨Å+yt‚‚r•åC¿¸fÉr1ë„›÷Jn°?+Vèrà(É<­¤ Ç;(ÌÕ%·Xtü°ž[ZAg±\) FµrÞ ýJÙYðèŠËQml£+¹¢ë—²NÞ-¹‹^5Q"dÖaXôÊ^à³NuÙËùrCýÀË…JIì‰DQÍÍUÊUï@ ¤‹T0 Kžª .ÿsj™º_¦»"'¬alÊŠ_õ²ŽðŒA A…æJ<É!>Öˆ§¯lí•ÉÚñÙA*á¶æ=·HU1ã8ZÍ/ïh£5K~Û"7MRªé¢YÍ\Ó ˜Æ‹=–¯YÓ[æ4ëK'érI‰ÉpÎÚ&,m„ΩdšpóH‹p$-…5Ò—¦²Ùi½svûvþê*#WLÅžYïm›9]TÑ` ÛdÙ¶Çl)N}ÂÕaûB;’‡vdÍz Zfí¶FN¬ö‘VçØïVqŒ¿Ë¤ë)}–O>ï˜ç]ŽœR ¹·Ž Êš•q^,c4cj“ºEyÝY.:ü8|Idô©Åk‹âhgéhÜDrdc¢AêOì3O늒hL0‘•¥OMÔÎÄš¦z0Öœ[åîXw#'ÖÕ¸It;äjƘljlz¢|‚LW×ÒEò‡S¹i¬(†ÙTt侫ñŒb= ժʑ;{?²±Ÿ{(iÈ'‘lªÂÈn[T§£¿½×rÆÚAœÑ㙬K<ÚT<º»ÒUÃ}j¶Ž”'ÑØÔ_ёի qOR4Tž¡Iç±øÛ׸˜5TwS-Ž&Õ¾¸BCËY§Ô¾öˆ$é¾” p|Gè‘~l+b4EÕK‚Zº¤ùõ»n£µj‘IòÍ ÒV¾ú61ɦg 5‹úåÝF\hŽ©½kÚ DöüqhmÇ/¸‹}è¦N QgûǶû™c­àÚLÅ>}Æój1˜E³:ñª©ÖJÌz)DÖI'mصaª—Ö5‹LG:f1íèSº×5§2­®qÚ½ÓzfñØÊ¶¬yGùÚÛtõ¡í@-µ«;%7ZÅYÕÍìiÙ~ךB~S½j*f‹Ù˜‰ýžåúhòff2ÍÔNqfÖ¬jí÷SöNl=DQ8ÂÝö¨µpT±îÙŠðÓ±§ØU8G:öÆîí+fC»½£×‘µ±¥Ùtâ\1ÞmÕÇew¢TÓ(o…¬“B/Çÿ¥fGÚE£ÙT]TQr’èÄg‘¡å˜–8ÐÌ>Ìßu53{Šïì9äâèZ'öjÕÖÊØÎǵ)´–à©® Ê|]>…Xá 3Ð=Ÿkr² ¸sOy®æ5>®îÈ~F+s…÷"±‚šÊ22þŠìC\ÙŽ>ËÓ~Ò—)Kx=\ :úêkÎbkdš¼79QL¡›S%²¨Õ³9å*vÓ^˜ û/L\û›Ka–D¿l£›‹c]Ñ,;•­EO©\u5F¡ õ[²–×Rűfó³[6oTGÝnz‡‘鞎`^ó©h-¬Æhì,7é_g\C߯qÿžžäé“drBMŸE³©ž›>˜n¼¨´ÝºdÕôi3¿’w ôYn«)æëYwÞžñ““pt1=ܼ+¥OÂM=³›3á(>¥˜9ÒO*›º›ÌwóvØUŠôûßHõÏ&–cV–9gÖõä ÚF[ ¹Ý¤š}cèì7Z6õ~lO)âßÄÒÊú…Sï”kÖ‡ÝÇ òe'ü‡ï}Çj+Âr¾œ·r‡ˆÞ×L5ÝëÎD=É>‘¶³çRÁ`=eyÓF¼¯ç‹yœý»èl<–—9ÌüÍÁïI¤:§àTœ†Óq \’•p)\šq.‹Ëáò¸®ˆ+áʸ ®Š«á긮‰káÚ¸®K]×ã¼¾>n€âF¸1ÎÄY¸ Φõ7¥þ=Ø‹sp.ÎÃÍpsœ[à–¸ý¸5nƒÛâv¸=î }!§õ[Ðiâ㎜8EVxY§ÕV©LŒgÊ çú!Ü wÆ]pWÜ wÇ=ôüÙмZÓ7Î6ßpó®â2À½ôý`LÌ0GŽ2âÞ¸î‹ûáþxˆáÁxЇááx‰GáÑx {'à‰xžŒ§à©xžŽgà™xžçà¹xžà…x^Œ—à¥x^ŽWà•x^×àµx^7àxÞŒ·à­xÞŽwàxÞ÷à½xÞàƒø>Œà£ø>ŽOà“ø>Ïà³ø>/à‹ø¾Œ¯à«ø¾Žoà›ø¾ïà»ø¾à‡ø~ŒŸà§ø~Ž_à—ø~ßà·ø~?àøþ‚?ã¯øþŽàŸøþÿà¢9ÌÍÍ÷_nÉó=ª*ã{ó»d³5Ù )]ŒÀRVH 6¡¬ˆ TØ Š„`_‰T: +Xì0v{A;ÅFÕ¨ƒ'—?Á>çÃ{fæÎòž·••m¹­Ëcy-Ÿåw¹ìS‡ ’=elý¸«&«­óMª|ñÄĘںúÚɵ »ÿÔÉeLYž½›±¬›ƒÝìÕŒåN¤<æ`¹ƒ‡ã=,K»ZvZ“Õ`…W-¬‘Ê6VØð‹Á—m…Ì|Xyæýa;à ß¼F»Í¶wÕ®R±¼æ=±O±ySX6+›æäȦ0Ÿ%ù´‚OŒóI+}è–”Ý| ¼¯¼73(ïµáÝ|ÞQÞN±qVD6*o)o&Ù ¼¡¼®¼v§W^U^Q^V^RM½Æ/zX¿.#ë•ukkd]†u öÚLDÖÖ°6ng"¼ ¬I‘žW)Ï+«Íµº‰çL­g•g¬Jð´§ryRyBãó¸ò˜òh.(?䓇c<äãÁ‚ò`)Y¹"*+“¬ˆr¿rŸr¯²|Y¡,O°li@–²4À=nîVî2MîRîô²dqY¢,î¦ÿ)R‹2’Rm-ʰ¨Á^8?" kX·oWnSA†ùæ2æU2×l;7Äœf›Àì³ i³"Ì r«r‹r³2czPf(Ӄܤܨܬ’†r½Òp%Ó®KÊ4åº$É®U®ñqµr…r¹2µÞ#SýLM[®øçv½‡úF{J.Sâödå2e’2±n¨LLQ7¡Tê†2¡”K•ñ1.Q.Ž1®‰‹2ŒUj•„2ft‰ŒQF»2º„ • ”ó•Q#rd”šçm`¤qF†‘ƒQô¹!ÎQÎV†ʰg)C•3•3’œ®œâTå+*§(C2T—ròà9¹œÁ}sepƒúÈ e ñ&`¼úÐÏú•Ó·*(}sé›ÎŠÇ³íªJ¿T©Jg¹ŒW÷I¥ŸÊ´Õh¼xÄ}ÄÓVƒñúx²¥‡>i+OØ')'šNlâåøR*”Þ†àÞ zu/’^Õ”+eÑ”)=«éÑ­HzTsœ¹ŽSb&1¦t7Ÿ»Ñ­ˆ®ÆêZ@—ì|é’!Ú9O¢!¢é¬æ¶AéœGçæqSv§Žé¤t4™#›U!Ç*¥Ê1J?‘ü*‰ôçh?G)íý~i¯´k•vIÚF9²šÓ¹D9Bic¸m£›W).¤H)T ”Ö¦Bë䇣’_E8p”P€<“—"×üŸ«ÍæÁ*¦C Hà0w~ŸGü~ü‡¹óyÝâóà;Ì×pçuã5Ü=k{²ñ4k«ÜÎQÜf·’O«-•¦t EB`–£‰,ȪÀ2XQ\¬´•˜>Çêôÿ9®ÿz€yŽøgÙ!û· endstream endobj 82 0 obj [/Indexed/DeviceRGB 255 83 0 R] endobj 83 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 46 0 obj <> endobj 47 0 obj <> endobj 48 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.0 %%For: (Rob Hetland) () %%Title: (nco_logo.pdf) %%CreationDate: 8/24/09 11:06 AM %%BoundingBox: -32 -24 200 134 %%HiResBoundingBox: -31.6665 -23.9619 199.666 133.0439 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 406 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%CMYKProcessColor: 1 1 1 1 ([Registration]) %AI3_TemplateBox: 108.5 35.5 108.5 35.5 %AI3_TileBox: -179.6401 -320 396.3594 414 %AI3_DocumentPreview: None %AI5_ArtSize: 180.72 72 %AI5_RulerUnits: 0 %AI9_ColorModel: 2 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -93 176 3 1345 852 18 0 0 54 42 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 7 %%PageOrigin:-18 -80 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 58 0 obj <>stream H‰¬WùBÚN}‚<K-$h ¿ –](UPjåK¥(xÿof’Ì03™€ÿL[ w9w9çj™ÜM/QL2Z&Ñé&Š›¢™¨¤N*Ú‹rs‘(žVç¹ÒÕSQk>÷ÊZëT–Ñ“ù{>¹ÿÛø—­ýž×¥ÙÆ8 UâW¹oÝ‚ž(˜MING©ú’mâ©UB‹ùFÿüS‘µæx{ýõr¦í";®?½<œ…ŠËØË­¡î8(gfÓª,Éðˆ®–´K@×¶ãI¨æ'”ù)$Ñc¹*6B $ïâYEùñ8OÏBçäû¤FC'QʶØ@Ä¡3 +þÑØ/x¹±aU}`X¿öüo±&ÛO²óQ\Æ¿-©¹7ïD ’, Hö¤üVˆ$ï‡2ZÇ„ ä9ª6Ý@pÄ„1¯E®Ћm¥›]3üij¯•ô½à Á>/¬<©Yí³³'Éúƒ9IÃ(~:ñ\ž¯pû bWŠÕBè+`^D×c@@H£ÉI *rÌìŽÜÃF–?e\ ær0èªèÆF† zãz¤kã´ž•dÁÛ¥65çwŸÑTÕM¶ö`6ˆÍ£$ªàµªRWæƒ93Ñ›$óÀ 6âT°T —€#Ž…¸ÍÏ3ø€·Ð€ÛÕ·8ù3|YÒ«‘mãtê¼P² Ô¦×i…µA<óü%'šñVÕÕóNÒÁ.F`çr墥?lËm§; ú²†O£eÛ*‘šwöÝîðI­Tèvü€~Š+ˆvQ ÀË^(­-NËŒ¬m…©@¬t7!¬ú"9ÕC¬Ï´ô˜,¶hi¯Ùð(04XPGÀÙç㮂‰g¡s&ÔɲzoN~K¯Å§‹­FHiÐ!¾Û‹¿˜n“R:0v°.…®ÌG@ [Ø•ú_TZG/A‰°M*áƒæ¥Ð @Ííó6A~ž£v:£Ï—m’÷¸ Y v¿ÓAïà¤wÈ(õåSB NttX"@[:j–At~<´§eaõwµéóXÕ^ÔûŠ'+ð™H3ð§Îêä ˆ'ý!ºû9o˜l‡”’ßyŒÁ×öm/øØügîdh,èðíÝK`hŒÒà¶ã¿“y½Šª&@y’ˆü<  ²sìZV°kÒÀvr;Noã=»ú¤±ò¯|ë@µ…ý 0J2fÍ‹«8áðó—F$›ìg“ð±öøÅ¨JÙ?ÐTeƒLÁ\8c(@7ИžS°ðá‹mú6=‚Ò#?í¶c1\¼Còˆïm4sž8p£YüâÉs±:v£õ‰æò‹¸‚÷Üh’g§qŒ¹ÑІ| vÜ샪17ZÙvÜhØý‚ì¿Ñ |£9SÔ¾Ñt¯•d9f·Ïy'ãjL xIhðA ‹æS«´+üU×Ù5IºFÉ%{hPb(xó‚}ö¢>×Ä÷æ(cðË«ºòYCþʬæüjÃfI´f±AÈ3KÖ£.pc£ð±kfup¹Úuò!T P^_`)؆c'€´gZ±ª?<ÚŽöš ˜V$YÜN!ö‹19~’Ÿ}dŒ=†BúÞÃ… ¿âBlOSGë{«IŸÃ=óè‹oxÇÔ÷4.´¼0Ùð.¸¾§™B—4v¼¾ÿ½braƒUÐ÷¾,í­ï-+8ÄbÈKßÓ¬ìTÅN 6äqáïÜ0ŸÁ†;.¯÷¹p¼†Œül÷ÆœhÈb‰s`§–´¿üÇkNI¼Pz²÷°1Ã@ÓÍí!ôòÓmÅÅšm4û¾»GLHîb÷ «“ ±´Ðœ#c ]ðxTß^O`A?R‰ø!É>ãES%"4ðYFè® &½<|Ù²ÔÓ…6Ýô3™¿‘B=Döv'ã‘éÌÈ‚×Äô°£¾¤±ì;ÛØÃ¶ÜfšÂøÅ6–û`3¢ÿµjb6b_‚IŒçð¦Á¨ä8ÍédÒcØGèÄèI4(ÁŽ Ø0ht]^,žvÞ©—…]ƒæz­›B©÷î8”<ÖB©ïÆc(ÕÊ×B`ÁVàßF¡äìí>iøY]’CÉj¯Ÿ»´ñ#u ª!Û¯Ã`„¯S‰óÞÙlmfåµ—Å"† ~ÖZ¤3æ×f.¬òcØcåLç뻪e·Ûõú[Xþ^¿9þ"Ô88wµõö)òö æ4ñMÿÓ¥9•dàö,é/ÿÝ»¥õ:Í~1šáú[–éT«¿þ¼Á¯WO®g%ÛÿåôÅë4wõ8ýú³|ãqú¢(ä Ýš‘ÙÔ• pq]8™6þaNã#¦S﹎©>Ç­k^ûÉpz‰öú#ÃéèæT’w›9Z®–ÓFòiÀtªNc_ft§ßBiäÔÑ–8Àáú•étmö‹!¦ÓÐÅCê«é4:0Í»…ˆW~½,ˆoR¿÷¸]¼û~ï,"É«ÇÚðÊ÷›§3»ïl1Y9ÿþŽ~±7¸O±!0a.õíš½¤úór`#¤¸KÊV¶Å2PÌ7£o»­z_%¬¾Oe¾®&Š×jyôJ2E×0Vý}¿K„C’ä½ &F“”% ýÅ9¨ZÝt‰ò~¢£;^[L«çž°N* õK†´CIò׿÷Uœí(è1+¨B·ó8ýw‚µ«Ýç(›èa<1çN`·€6}›pr»‰y¿@cæüîSòƒ›Ÿ’áù{wÄñ 2†ï"¨Júþ@œð]ww­.€‰Ç¾k(²Yd×Ô çqö¹^Üîˆ+¨;èby”Üðõ-mµÒ/>è ÄR¦h=ÈÎÓ³R;ù>©QSƒ­ÍbÄM µTD@ºƒ›^§Ö Pn\/ü³R¬¬è}þXƒ^ðá;$¡ä§æ•Ôh+I¾W¦ªÏ}j=,X¬m ¯…NS¿3¤†n6ÂÔNÁŠ[z“|Ê. P_Ñr¾“ŸëÎW„^‹‘÷ :1Â"…€=|תJ­és¸“%v2ó’s#+¬qé+½ü+ߢ% {,Y8w’öcÑð"fk½Ýõ3ÿºKï¾â†~ÛÇÚ’DN4x²ëªG‰5æQJx}_¾²k¯¾tç_·è+P[29‰§[1°&!&X*I†f|ƒÊ‡™4) ¥w·˜Ô, êÂ)Pýà¾Ç§rsUZiõ3JƒÛŽ@ýÜyaWpí«C›ÁÒɶ1¿C¸³ÖÙ“ò[Ý5åÜ•‡ìx!IJÏQµùYˆá»ö(Äð1‹Nw¦—‡£lÝŸN7á¨Ôˆ%„ë11- l¿lùÃÅð¶æÇLÌ|öabßÀûØûÓ>ö˜àz°¼jB›>û‚$³d%l–›÷#+4Öüùe'ièc±)š¾³oƒÁ¼+Ü#ÎÛöl0l)é™J&<å"朖$‹éÈ‚IêÈR¬º=3ùüv)Š<÷Tº„fb4ÅÏU†„ÔÌ “Íê±Ë@ï¢DÓco—ÂÏÅ)Q*t;è+ކ9§YF  ³¹‹ÝäQ8$û~Aé¢}ée˜¹,ÆÁ)($æ†AUÒ÷âdo»iÒ(—Æ¿b¾}Û™X´peF¹é°«ýž×)=Ö‚”ÞÀzÌIkü¸‚ŸºÂ€ŽòBW¡K2ÿl0¢…´âig†v[Uvžs|b(9\£–ZŒ™šä9vµé5Œ›ÎåÆõÂ?+ÅÊ o)·“A͉á;$¡Ößâ®`Qï §ÑV˜TnDó«¿æ4X¬m‰cÓ(˜ˆ3r ÆÀlœãv2œ;#ãbÙ(Ýn4\,· ±ìÕ0IJQê'"¢ÍÀÜ0Ë6~hP€Ø¡HFu¯$^-áÃß  µBŒ™š$ó;ÝM ^Nj¼þ´ù„"gƒw(ÞŸ°æƒZBÖ†ñ]7!íU] ƒ.vñB…ðK50,g,ŽºÀ€aéM‰):½–¶Äæ7—ìy,ÂIŠWôY¢“dÕUÀij-Trx“(Îóÿg½JÛWšè/È kXŒ£8ˆ ˈ (ÊÕy½2Ê&ÿÿíîlÝIo!|ÉÌ㣧ª«êœ:uamdz/§Û84þšÃÏÌc:I(EeÚN:ØNÛŽ˜1Xï0ä3gÜšI'a…ŒGOÕÞ›²Ù€IfâP–ÞÙ@þ™“ G¤Ýࣨø.™“l0â|d¤Ä€‚~ 7›q06Z‚Ü|P**ü--8³@_p°úWh‡gC²®˜¬dï.f)ß_S¥T¬ŠŠMtkI ^u<Êfž™eòK±?tÍûŽv¾,¸=9 õ¸­uÅÞ+`iÁ+žv{a¹¿™ÃÚ€:˜ÀSÓ6º®oWM"E'úU`Wœì^ª“ã\I¹·EºbO‘XÑAHðÆkµ„µ]+ýœKBó² Óx¯”—†àg‚F zHèDÁixš†`ˆÇK—„¦Z† !£Ð¯cLŽ—hHwã°Þ;Ü‹ÞA3& ªxÚQàì@ïõŠpö@€’“ÛbBœ¼D6È,[QXÖ‘çScäJ°+fýÍSRC¿tvÒ>|w˜þ°u`p­t —Œq&A“ Ðý?z„­@Ò|ŽŒ¶‚ëU`t°i$¸Í>™ 6‹†=]~Á ²O\|»(ÕdMçPBïU„³™ÿ ©›“ì~|5 gh,q‹‰qʉ{Îå•3>îy˜v= Ù²³Ölƒ7>Ý/8?Ï¿~ s¹ÿ¢eOC‡„«û$ Gû¡!|xž£c„ p·a ñRN×èÚ¢/Û@ŸŒÜ€¿˜d)Á#ç'ÜGÆI¨»/£t5at…#3 Á’켪z·'f%ì¸bÅêÝmw%èeÖI^xWúDÂ*zÇæ`Ʀ䙨–BkÈ1†õlÆg ëYoÂÎãYCJkÇÊzpù›Ï5§-žÕƒék}½>»|ký½{ž6¢/[£yrxþ»y{60Îs_ñzó¶ú}¬¨ûæø¶qo¬ÏÿiÝvêµì¿õz-×M°›¥½ŽÔ¿dÊ?ÍÿE‹qð{lnsÜŽ—ÜDrýãÏx>Wmu½þqð-öþüpª…oM'16ÇWå>^Óu(à “®\½¥Oÿ½ìcó‚ýö–R,PP4cxØõº4±ƒFš/9fÐ|ó¶vE ª¨ ìQT½ü¯ÿL{+ úÄ ÚÊœ`A_b±¨t½)§7(¨}W’.Þz§vÐÖ_<èHZº9tƒ®·Oz–T øÇéǵóV2èQ4º:ÚNèAKãfPPÞqYoÍ7··Ì ±ÞëÛ +è+-(à‹9J?¯FÌçŸ-FÐãöágñtÊ z…‚b[,Šk%€þg6â ìë>ý÷N™¿§¨øo–&=)ÄRr`þžµ:{G#j·¹ ã]¨/±Êš)RžH9©H›þ„×äÞÄüKUn_?4ôTí½éfHFq-üXñ¾/éR?ˆ­dSã'EXž‚/%`œ0÷oLæMÊ.l@#ýoû©S•õ¿ž” ÛZ—–’¢2êTZ0ê?Þ:E¥%EZß]ëä®y¬ûrÑG ƒÉ Â³ÁIÉrãRó´ð g ÷™Êï¼p¼d”ÁÞçM _¤‹>]˦†—T¡vÒÙ _Z¯_’I]»^Ö2SÖ_$Q”³“öá»=©¿ w,ì¼SŽï¼pÐdL1ÏPzÅÆÚ×~î°+ÉóBq-2ú\›OKý33¨O«êÝÓ'ãã=-•8%ò¯ƒlÌsÂb|1$Ì|]2AÏ)Æßò–¤-uãqÓrrðOú´º1w*!+‰F65¼'®laˆ²àœ5·˜àü`]jº$.Ee‘6A_"›€WgVX‰æ\n#?7uÄèfhæÇЧÒÚ »?+Fd?ùñ8| }…¸ Æt‘®ø3+¯èƒŠEÊ(ñH­–°œ‚mÌŠ—jI»Æš|6?^zŒ!øë¡@ô=Æ)?f ÝjÁÂ4ææòÚ“-Ïܼ´ Žá£l©þÂ7o™æFQ‰+H~v`i[)ó%ua&åf#—Ò[”í”$¬=Þ?ÞSÌ©¢ÊvPè9ý#=Ìüxäx/ðöîýP`B;hhŠ* bâ},òt•vC~ÅÌ…jZ¡6gàèþt†¸ ©bp‡8…¬b‹ù8“ 2«6zÙwžÀÛegˆyDðTø­V‚ž¸ìn§« £Ë)Œi}bªÃµ¤‡Û®Sú_»xxÚíÉø{º<–<8׫"ÿú<Jtšæž@kXn>CvhšïÛÔÐiñu¶rŸS äÆA9þè‘ñŽå°‹Á9Õ¿àXÎ<(Øè¸HEõ'þÌx@T±÷ wÈäȸ’.¼ SwçJr+Ïs…ÇÍJDv¼ø¥Ã]žG™#Ìð<~Yž—ê.]“bw‘RT©:}¥ãÁëäV úd³N/¡±ÖÝ“v½Ê$å¦$-¦ç%5Y…©“›t}øµ¢Nä…)TNR…Çm­P2Á=D(LUïl<QñðdIì}'½lß—Œ»Œ»Ô]ù:ÈÆXšÜ§Âö·£ià] L¹œ%ÿè+ú*æ|„ £wãáŸV-_õÝ¿Ew%þ8Û‘$cˆ¤ô9Ð;[’ÂŒWµº1´!œ·’z¾*ì¡W­ñ’TKßì ™jÉj“w‘³Ê¢¨üœeÆ•ÛY1I«¢ÂêIT‡¶ÏarKñé| SºÆs-_ŸÌàZ(ø×)Fí–]R<½oV¼ã@†êPWù kC]ƒŸšåÆ”¿ë5Ýô^rL·û4ÒrÉ‹Ï?錧U’ܧyçÓTKo*^ç½qAÏõTí½‰Ý•ê2¤–d‰ o1:u»¾]¹qAYþ”÷èJâÚA¾†Õ! 4s’ü%ýoDŽÆá[~:¯ªƒŸ%>øs÷¾pÕÚ >ø¼ãwé誌Hä|+„Êy ÀŒÑ~ø~‚åÃÏXi_ÈÝ j+|}’Ä!-«E‘ı–ÞŽÙ + á„f B!OXð…À‰:»$Í#Ý*=% j2a6±8kÝ|z7ü™hKk†f~¬ Ô?MöÒ€íæðhP€•P΂ì.f)o™¥ôö?$9&"™B¿rvÒ>|w¢ ¡´„ÑŒY7&.™ãL‚ÎøÍ\ D4;H\ñàjòHà$¨ÞVÆ[âdœalpžûCƒnà2ÞN˜(›ù/n÷%qþÄW£àÙ~ áÈÙxQ6 á®|êTmœË+g€4±¢ }4L÷ NãÏó¯_ÃÚ®Š¤—O¦)4¼cÒÐCB{‹1i‘ {•ÕU7&—_{¢¡1¹£2‡§cL“q$´õKC´Ã]ÚNiW \¯g7zPà OC˜ ¹ qŠ*míM°zö Æ„}A`¦…¶G¾/‰?Ôqæè¡•®ÌŽd¤\É€QðñúùÙ YÀÉÊcs(׫ßè°Á$mŽ"6:“Uñð´ÛÛñtAõ4gì[h¥JÛט(ŠgWÝÝ'p¼WÔn¯òžOŒ[Lˆ£8¹‹’{[¤+ö Yþº‹Y1I_-€ …ÚýIS]¬ñZ-/_ ~rTF;$„Q Ë ÍGÃrBÐ& IŽ`6 qàn1rsc¥¯úM½DÍ-†ô±¶4³”åDAôH ¹¾ƒ ¬$3rðcå5ˆÇY¬,'dXÉò:dÅ>Õ=Ý•`©µ²w%¡ü¸pM×¼MÌŽ*Ôú&BÊf)ÆpŒŒ!â‹ÈŠŒa=«3‹¤@¡,æFžmôçÃx›¾p)ð–’êÇÀ3ç'ÜGÆI°«/ãt5at¹3·oÌ4S,ÉÓ»=&T 3Û«w·}ÑÖt;i‹Üû¾^æœä…`ŒåP¨¦Ø’!*ÆZE)IL„¢ŠÖCI»¶ÑûNg[¿lnó­]¹mÌõz-×ùÕˆ¾vnÕô PËÊâ)}þßú?ëÕÚ–*E?BÁKŠ—,­´4¼kfiZvR–ovRAÿÿ; Î cö…‡Çh_ÖÞ{íµÛ×±P,õ‡¥iBÈùnõÅSq‚-¼Ý'5ŽŸ¬ž·ò»Ó7ÅBoŸ„¯:é¹Êõm½“ Ds\R¶kÿ@Pç•\¶ø2°Z)Ö<ÿ¤ØU«(©`?šl¼_âœ*ÛQ6îpª!f¸•JR¨Ipšæügà+Áé`HtªúJ«$ÚcH®R™{î ÕIôcç´üewzé Ú¦üÞpû4as: 8ÀÂY@1&§§ó ˜ùÂ;M_=¼Ã-’ë8Jt*•ê—m‚Ó4ǧZ·#Ë)Èøâ´ìO“–ï¹g‚ÓóЇçïþkŽ ¹:d§ç­zìT–»%«¦pö¹¤þ=b¾é_*ÛÐU ­>á»dQ¢¼h¾G¡ì ƒÅpv¹‘­5 r¤œ¢s÷&X«ÓЖ½‹Ž !¤Ý¢#žOèÉ@= BÞlÙ4Ì­¶)W)Ûn¶¯Vvn&°JI{tt%!% ­ß:5¯{H¦RrUTpA™!q•Ÿ­ð{¯PµOÀ®ÄÜ 8­KTº ¤Æ–¸^8…n&2'Çf?¤tö[ 8xðý NKt¥Ãê;—:ˆÇ&&É-P~ø¦ãd¡dì}š±Þòèü a\~UËøóñ°ü†k—yaå–Œ]¹ÔDý>H¼n @Áâƒ2â­KKWò0²è ¾ÉN²2Uß¡t%«Šû-Ї¤ùÿÈvÖ‘§±³íãÁ‰×Á0ø›U{©µÚÀGOÍãL—“Ò/×FÕöñð ”Û0ñ`³e5kG$‘/ïM/’-]’Þ…ußõ¤ 4 s” v²^¨ÈŠr"°a‘p°À[ìЫ‹1Æ™‚ó‚37ÒY:d‡Î¸$M…±Lës6†)…s‹L•Rƒ·­ ÝXæ\‰„rŽKN†!> tRKüðMkšÊ*ˆúÅA# #ƒ‡ä !É»ûx¤˜ý»øØ·)Û[!§bj ýuìA-Τæìz½’Àç «>‘ô¯qѧƒ[LuË–n3ÕÅž"a¬ï´ŒŽf©ÉÏD®‹Œ× ¬Ý2Â…dí—i9QxÎÔKÍU#!qŽìzÌ*ƒ¢x.üô¥mÕÏPJä æ³÷Mª¢d©Ÿ‡×À’fã·îÑÆ SŸ³žÃ”sï`L]<±Æ¥3 Řc«‡Ø{Ü7ø%ÄÞ³âó¯!æ`´#k¤†cwÓÕ!àäBp‚êÃÊï³Àòt»Û•®J»ã‰¹—QJwð×+0±p»ÊF‰?qøQǺ΋rݘ}<0ºøã~ ê÷QIú/ê "1{ìj€hÑ–”ƒ…dô˜+¹ì*—•÷ “Ó÷>µÈoëjÁ/‚MN…:™ñ¤$ÁáÎ!£.48Þ”n¿ì—ôR¢¬IŒ\„â‡Òlƒ xÚDg?+T=eU§zÊ‹·†ªÁêÌH†Ï*sé´LC7Ù‘©žKJò ;qn¿Ä«ºáȈ9Õ•4ªiD6ëĉN 8!yBå1fœæ1z xªÜîr‚’]õÁ ‡UJH(À»òÇ8¥XCÒ÷>-(7Á˜JTš”Ï>m£WntÿÊýW³®\PÆ;Ó¦5ëÂ_¹úä}v°›!¯û‘$MØ\O¼=Ä’þl4`§s w¤À›uk0®.5MÁÚ“£¦&ÒSÓ³6ŒÙWz]v(—Ûÿܳ èYá»ÔÜ1½0$T'³$TÛ¢‹`¿s´G¹°ºÒ`K+õ¤?³Nýû"×§ gI˜ŒŽcf±¬« œ.@%{2ÿ¸‘PÁ^w v§„`]’=™ï†¹#›aU·ñ¡Œ9¢?ŒtãßøŽÈÞ ôJzx« tÆ©eŦfuòªŽŠn–Ý„ã²ÒxŒ¹CaÍ{ËÂWR-é]X÷h–2¸Ù{o|ì*,¶‹ï `Ò ƒk­ ù ª¢3QÝÑ!Lo*ÒA´%äH§þÕ~3WÝ‹®à.=ü‘s×ç™*•ý‹˜Y‹dcÝŠo ü©ëè1hŒ°ï˜{ ¢í½Ÿô¼wƒfÈ,# s!؉‡ Ÿ¥c¨@·W•-í ˆ³âa±cö-K`N’A‡©iÆö0c¨Ô@ÓDDkïé·¤Š+…:9¬—4UÜ8LÙ”ÒA KDYTˆ¾Åˆ`P~ÎBLPÂIBاêµ `¯—¢Ý‹º»‰eû呇¦`û]VñN›øÞ’Ø‹þ0%¡{ÝꘜL4–ô_ÔÇͬºHj®À¼ü\¨A^„ÍÃ`'r¬l¹@;'GÛVÈãcW}îvbä+w¾ _ízh„ö. m@Ð1LØ )ˆÆv½jÆ”÷kƒEæSN3eªñŸœ.Oð†l2ÈOcªáŠÎc¸†»R]<m’KŸhÅóۉû?ŒÆbKh'+>Û{pTËïìÜÝ› d‡arÁrå‰jõî%aþZšmº±Ø\6Â8†'˜1ì;†ÐRJaV”ˆcˆÈûCv·½$o åÚ²Ë2”'›i.2U*ר1‘T—~8/Êu*bz³ôA‚Æ‚cñzíï@˜Kæ{Í߸+A-£fð®Æ„ ðìa‰ÙðB—†˜öŠ2vDÌÒüTiXŒžì ÃbÔe;„¡¡`1¥Ðî3;X …²‘…þÜKZ(€‡”ÅhÒMí+{$c§,ò>v[,×’±4ƒ1& “( |÷̹31¨d¹ýg ä‚1F˜Ï‰J[y”å « LPÃ5SG0-‡˜¡`ÑõðLÓhw]mpu6ìR‘Ž­¹ò| ƒë8v%øu*ŒeÂ8ëfE'žú "3G7íz €Ð2¸Zñ¶±×E›áJD@ˆ.-`¤ØÝ,mâÙB.цª( uîá½`­Ô¼á—–_ŠõgúGWôÜëoæªQIüöÆþ¾¬RIe^+å¾^3÷Ýxò/(Ö©òѺáÖÛBÚ;O“àmtÍŸž_TÍ»uçt½¼œFS=üy³ÔÖ£Š÷´QN E7?}h¦Ÿæ³Öéº'ÎÞýO7ÁÔí§ï±S_d¿.ûËY^ü^¿­yåú;Ýò>µò‚?)–ÓüûKµÜι—Ôr8Ëj…ÆÔÓ ¸,º=o4üçÚ›øX÷—IáZ*ê©ôþ·&•ÓŽ¢Œ2¢¢ž?UUîOz¢žN^ÚR쪿U”Tð1|;yŠ&Ÿ$ËŸ1E./àoœÆ ~oìwúH‹ââ¹ñ–¹ù{¿‚½ø°2>y›•í(·n®5X ÝM@Q’~¯‡§æ:ǬÍõžsþo%V $R[îkêæ²Å—â>øón#«Tkþ­ù þ-ÍyoJ¼äŸMÁoí%¸’ɾrŒH­]4M0šîJ[j€Öp8äÒ|q{û\šõ=ü-7ÝÊÅ×r§Ÿn§¾ëØæ²vS§¥ ·hËO×É?¶ï\ù«×ÞTÒÞ °Ó[ï̆¿55/ÎP«Áÿ¬W÷^âL¾/%PÒC%tAVVX kaA‚÷ÿs2 ƒ‹û½íŸü2íÌéó<Ór¾ÚU•åªëV:WW·P/õï£þƒÁoðøßÀ³Ü숰s¼!æ¤*Û¨ Ãۭ׉KŽøZê*¤á>+Ch8í5 í é›l`¢*ûJ£®Ÿe@lK×ÂG#Új·µDäç­¯hGâ²ÛY°çºñ{Z >ÖIòKÓôcpFáÖÕE° q Mç0¯uãç†Ñ¹¿ù,·´0‚%pQããMk…Ë*> a­•l¸ A'Z½j­Ò‡}^ö|GÏöÞ–ûp:ç¿/Ø 1½í>ik¸I‰Kí¾ÔF·õ™ØûþÄÂç¤p‚þŽCålèY ëRÒDôɹE—Jå<Þ’?ŒÒåvà¼É‹Xåâþ©[ë´Cßv) Qµ$zU÷‰ë!ÖéèR«Q ±Ÿ„B&ÿ+±ý®ˆu¬íEø±yó#³¨|û?×<\¨hŸÆg²~ó1-WŸgЦ*ã©á'Ú¥É9¡VJßû¡»J’+õZ¿ªàPñ à dÏo$üÓøRŽ]Ñ˰Â?ÃûÛw6q¯õù§Ã°k¹›Þ*Z¿rÎNéms­ Õrêª|ù{:Ìð†ŠD¼\ŒU2Ì ‰áwêc¬G¯q/YœÑÔU•×cYy>¾pv¹UÕ¨ìÖï_ß³Tö°e ØY4W04%ФV¿.ã0‡Ü)bE'‚X\Síǵd( öÛŒ$jÍ©ü”}0%x)@ÁÏ‘Ë ¨Ùh¼¸-¾k õ×Wû1¯"U!(Ø«,@WXh™ï [©Vªª»ªjÍ;¥ý±À¢GMo¯¨G¢é×>ð ¥Tyf1àÅ6šûXô)钪ͻíxLšdS†h¨ å9Q-kõ·‰-ÜÄ3æÊ!Çœ•ÍÍxûâ7©C8Tçì©zºä!‹z €„HjHÛ¿:mìéHC"¥+Ú|ºÐ 1æ´•çæ°©žŽæP•Є¶^9MÐl VÅÂ5¦ð>1eFÏC†ùé ÚÑÜšádÅ>»WëÏÇŽ„t0YA·%?PçfêÐæ#áOÛ?9Éþdý_Ø ÑÿÛy?}í^Fz»)Š­Ó%¢û>2¾;1øH"|Ø@Dåç:«ß¶ˆ"x¦Œ—ý?7{T‚úôŽ ìÚU%ôûúu1Æå¼‡“ëS úÓ`‹ˆºHñ©°²“0—ùð6‹÷™Ç,h.´º$àHÀí¿‰0cMÙlU–êƒð«¶ÙØ«?[n ɳÖ£Ù±±ã ôœpà-ö½ø›GáDhQS h úD^báF v)ÏÅaZ/”u®HÍÚŸûþNsä±ñFyîýŠáBá®q+M:Féûyg¯­£ÛLévˆÜ/ä—ðð4nC¸0ò7-ä߆ç<+ŒÑ'Ÿ–6('Ç&c±Š7tˤ(-HÑÒämçïù&¤ßpR=ŸŒ'{8“¯$?†Ó霶{ÜX¨{<@[MyƒôEŸ×û5³>¤õ‘ ¡ÕN=z¢˜ˆšû- )×ûê%w´ÜùèßÖ}à|a\–5›}ò ¯·½=¬7]Ê1þ:¥ÜÅö“AGÂß „úè¾J¾ˆœÆE²|›ùää'ÈÅO‘÷˜/‚L?$âO:åw®«êWÿJ¬´d¸­±Úw›-gwúéÛ ¸Gbû/ÚnŸ`ž×îø œÝ¦øáËcz?.]Óæ½<-—xƒ"?ÓüPý•á‡ÝxžNÓ6?\ØÅ½¸4»ÇY~8°Å §2/ ˆ[®s¼l pÅÝ0 09^ïVª[懥A…Χ¯P<^‘ùZãÆWà=†dWå>U-2RaiQÝkmj\Å,`mþ¹¥Ç¨ø°J—ûõ/‰»ewÆ ÝDjdïª2{ÏìÞx»jÑŒjé“ì5OU gTM9q ña~“[üŠ …º¹òžåÈz( ¡ÄÏ—ËP¸– ‡Ä7×ì$ KY}¼EåyË¥Ëm/Õ ‰%éΣE² 'cdÒç³’ÍG`‘†Çy#§žÎuxçpˆ¶­×X.Ùòm0AÞ¿ªOyé§î]&^L}Ï ÿLþ¾PÓ‰R*ç ;kTê†Cï:DòÚôÛ® F¥6R=W#ÝÛy½™vâ¾éÑÚ ß•2ùØùä‚#!ýi~z¬×Z‹:ØoC¢5û€˜Wñ2¶5˜Ó¤bˆ››,úx„'îx(c²y¨ ¡cg ®.³G‚ €h’O…Ó×.àöåD=}­fµæ{¤tÍÔšZ·¢%´‘‚l±Ú¤Ëj'*Xðú¬«`ÁSDÍꪕ@\ŽÉf,ÕTž­FŸ`<³(cTËH%ÒZ«9fkžJÐêÍ}öš‚dD¸öþ &â}š¥že~`µ­6b©ÑÁ˜P-—ïO«g=' •R l\cÇžö ÀϱK<ºâ©Ä8$º®_–™Øª!q¶Èá°ŠDÃ0g÷tœKãÇÄ¡…—Ø›dq–̶… ~R!q43˜ØÑ,ƒ«2Ö¦Ù1×õ‡®›ò>°…nÎz'@”‰·˜mw¸dá_Š {:Cדf&þ8g39!Ýbáf5Û êx³·¼,MüO{€ˆlpK–ÉîM4œ3Ùdóla°U²”î͘=g¼,óä%¼…é¨1¥˜—óL4æÒ(Â7h¶Èã–"óyÛu³ÞÌ)ÌÑìlnñüÈœ^`q£ÏhÆ\M±ò}§xVy÷¹®_ob1›É7,º:¥Šg‹‚½tðN{7“iä<s©@½\)fËl‘a¢Ø1Ê òåå˜ïy×¥Ó:Ëô¢&:˜fû̶Î"IgYÀòÌ L/‘ð:È‹>%]Фİ{”wÓÛOoè[šan³{»€‚CN%]ÉxŒÊ‹ mW¤<$ ˜ÍK *¾Þ$ÍâGYI$g‘^L o¡ɢîžéT ä'Vݹ @4!Êd– O¶ö¤WÙVêÀýþA”)$tBPæ0ƒ"ŠŠzDp@@׺O÷ÛoU¥3ÀÑsuùÂJÓéJwí½«v3[WÚ¦­}J1xÀ•“±E·¡q±ÓFOq¾–ÎŒ”33ÂiÈh~…˜EyäÐR–“|T³O‡.iZp§L Ì£QžxRuŽ>m♣9Œ”[ kêœDÌe‘àÛãÌR¸ éç´upâ ä¿BéçLqŠpÑè\©ôyÚ%•xNŸÂ8ûÅü¾Ë¨YÆ®ç-Ûò&íY(<´m¡ðÕ é2m»‹ÖàF}8)µ´‚ü§…mž‘'rüÞ*Ý6÷Ö‚ö4WPìLVûïEµä=,Q£‹u½F ®\vX}XT«eþLº³,,«ÖÀéµ@•`¶º¥~=¼üÜæ‘È”üü§òÂì®Ý˜î Ï·cÅôjï£H¸IjØ{smKm^8§Æ ¡‘‘å)‡Î´v¡A͆L+è•ãGk§ùGáŠ*øFQÏöá28®HÃÌÎö¦ŽþÌúu5˜Ù7øE²°LRXõÏúõc7‹¬9v²;ÉärpÅ[0xŒ2¸¹¢?ÊOà VÑC>Û /ÞxU8½$Ãp¸ÂKS‡QN?˜tŸ`šOßè0¼{g’2—À`Vù1|½ËÀ,âpÓi?oh6o¨òØð:®f<˜2¿²Mç³È“ÖP¿7¦3{Š»†{%“Þ‹º2žÞæ´üËc‡{FpxNZA^‰0§¹¬0ùó¶ƒ4’’¹njùç÷˜2aûx~w°´dS·Ä@Š_ˆÿ÷Æ ‡­¢QŒ~rÙ)»U×_I6IÚÿcLž¤îø6lE˜•’öµÁ@TȦ(#jˆË圆ˆšÌ‡àñ‘Ÿþ20A„½¶ûK"ˆÇDœ&àÞÂ$S9#€1 ¡^”°Ò|G¥ºðê'òËðýT©¯71e¼)'ΛºæK1T§×”I¨SBh¶š¡ZOª0Ua+­qé6•cûvKwtcpîyÑ «4›SšJÜ …Û”€c Av®R$%×ê û²ô+ìoÈÐçÂFA|&¦t7ÌÊQƒ!bÎ8ª_>ä³ÁggŽ×æÏN?P•d…ë\ß\%l Øß)íÛ”õ„ݦ¿”5žågÂV£;Âþ†¬¡Wra»VÿLØß5õ—ß ûKY# ŒPC\8ª²ƒª¥d¤(•œà!ÎJ\ç({ HÔY‹/«œ0Ä "‚*¿ö„Ýg¾v\ =ͪ$ìoÈÚò0_ [:^ãßÂþRÖÎZó,¿ö7dLþ¥°-Yc}˜°ú*5lÀXÙ©##P¼˜3.MZ˜óŽŒ«íŽ,¹A[Àá}ânGÖXǸ°ãªõÖ>vq]üM¿æÕÒv2ösa[²v­Ý•µç÷Âþ†¬·}ò„mÙ..>d ƒ C˜Ç”AGÎkd ˆe»ø¼ÕÀ¹e³f­ö ’þ!kô‚²\þvBˇ›ß¶[Ö[À;p³¦Î,íÛ"î‹«Õqãʼ°XF¬ˆ-à¿2 à ¥g\ ÍÊ/é!uä$쟮°#·Oe”œXú`Ø¥°a¹}«¤¦PPã¤ÀœáÑ™"÷šNb¬¯Ps¸‰òà8zš»ù¸{µ‹TÈÕõ ø·~„‰Á*zM6:/~v'¨Ó_¾Ör)V¨'Ïôd¥œ Ž/ŒÚ(íå­¬wÍ,&_¨¢!ùÁÔCÕtû·þ'Zo³“0pmxÁdIÞĆ]™ `x­°a³&ÀÓ-£2O÷jF¯©€Úp€®Ÿ©z;àa° 7âPåùBм©ÅÁ~] p¬W@pÀè••Fˆì ÎÊbéòºŠ{½#7žXTXÈlQá|úl } "žÇLA‚ä––®rd‘€º»3ÒåÊ<Ö,Óæ€où¸»Àgsê>w‡û ¸~pxõxC ,SŽÑÄ£ì¢û¿¦ˆÚo˜ÚG0¦ªCè7 Dâ²Z|˜æGÀßé[ám^f_íÙ*M'1ÆÌl¥¹UÈ­jʉ؛Z±µæ;ô×ÿÍx’JRÛKªjbOî|¼W§«—§—ùžä9òÈùcÝùhQ^ÇãÿlŒÅãÇl<ßì¥öäüy±VKÆñãb4†×qk W6É%¶T¬©š=qf?©v*½2­tÒc¢ô2ö¬*¦;‡Ï^A«¦½9…Ü+f¦Ç^ÿ˜5¼Òóë9ËQ­©ÃCúÝoŒ;KË ýÃÆxUø(‰­æ•ѨyÏû•×ñjümXZ7åxÕãÏWã)¿‘Ÿÿ7DÃ$ endstream endobj 59 0 obj <>stream H‰´WùVÏ~‚y‡EfzÙ”M·ƒŠ Deñünþ¹Ï~«z†%^““Üs=9ÓUÝU_}UÕSéíß±S÷°XH• æmÚÌËÆ9¸é”ÌÂÂËHÉxQoÄîŽ]‘=Î0sÿy~¼> mb›ÍùlÆ;#{$"i;þ)bæÇe-Ù.{v$e‹(mDÌãèQļµŽPQˆ¤÷ø]$ÕêD’Ó­±S/0›Ï=ÉÝ3í‡Qy›&Kt·ôm`SbWûýân32˜çj…µ<-ï§/4uŸ‡·OS2êX;ÄG-ušoûO B–­–d4è'·ï£$œ80_ãS—f¸Ì$Œƒ´Zj1òµ)B_Ï3‹Êíxê[ÖÉÞÓss¾wøùó9,ühÞ5ÖŠÍò9sC1Ø.å–ŠRZ‹­UlÿËya©ªÛkßÞ½ß[*Út¥¸†¬Å‰]Ë%ײMϵRJ)À‹Rmø®Õ-à;•dûÝKìlìjþý'T-yá<ËNqm»'Ä3Ȫ)Ü’¤•ËÑ>0VÛßrCÈ‹˜³¦GÑ6¤¶Ó¶irO¦ÀÁt–çÊl2HŽÝéq»u:æpú èßÊn¡ÖÖ±/šé•Ó›¥—ÏÌ;_€±²=Èîdî'ñój¶"¾/K²‡MµÇ¼_ëƒ±ØæcÐ-ca#BNJk‹ïÙƒìÿEÏGËK‹FÃ;ö½Zµ•ëw¹HØM]ªêcff9{ÕbÕÄA½ÎŒÇþVX^± }°Y^Ãv)J©î–çvXöÃ.¡ÃfÝ€·% èÃk–÷ë r5p-¦ÞC´|ûØ,¥“%rï•D¡}“WU´Ùö«®üöÇÞÎBïÃ{… ÷SÓ—öûm¿ºW¶·w0´„™ÏW°·[“0Œö(©úÅs§I=ö~õõjõ!åE” ^ø\TûFï›ÝÂ&c'2šS¸L†-N£6+§{&ôq.µÌv|ªdÉ’ÉnwÑKíp­\Ík ªÚ :ï¼)u, ÄØ J‘ ¨ý h³D"³ìÞŒ #A+×`l)-ª~J@˜'SXV­Káj>ï?F'Ušz)‘r#ûLþûhÂÔÁU@¶¿ã½xd†•¼‘xÜ”IÜm¤6Ÿ{Æ©“U9ËUK±Ÿ²¿êð ÚÞ²çp{æN+wÐ/w±Iy6ËÝî(/aeõG¥Ù,{øYTÛYél(À˼µ6±5u^[K7±·^‡©Å›ô‹™;q";_XѶxJÉ]ÀÍ!NP¡ósØþ5»Yµâ¢£L„äsõ­^ï´š8 L@«œœ`…ÍWíÇ™ñ´ïb…&híúž`M¡l0M†²qÔÄüI³ò©{€¹º[óŽ5¦ª£~½ÉPõF:’ÅÏÉ\{fVZ}ù”ÂHzkîðO(ðf¶×‹ô™ZsßGL)pÍ¡–ï¹ r-ê‚HîRøŽJ@pãY®G7Är¥f}Kz\ê(`ƒ¤YœyŽë[®/|]ÂQ²òÃ$³<Ïa Š”ÌÕ%„ãpptÀuéÀaâàHº–'(W‡(•L—†1¦À1 7 œ+Ra'ŒcyÌ£ÊþRWÀ‹`ÊT•‚ãN8°àr`Ì(p}Hu™åx¾D«\@©à! NR"Â=È£†w ¡àÃ…àñÍŠÃ¥ã‡ìqD3Xã¯ãXŽ ‚JD.°,!dz| ÀA }Œ^€W‘R‚ó”@nà—¹_ ö!ýpáu†ÈD"¨«ø†WÉ€Møu$…~t¨å0ˆ.u¡èH=w|Ï 2 Áy²ö­SàÃßÇÌ‚€hoÜ!}E8ð*(–§6$Ã!P¢*Z‘€ÊÛ"s” w:Š$–ƒäaÐ ÿ!½Üzã*‚ ü ö?œK `{î"L.È’%"%¿Y+¼q,‘µµYAüïùªçœuˆà„ÐæŒ§çÒ]U]#Š€7pÒôí3TQ é´Ô€‚Ò¨, mÑyå!@«°t\l ØU4äú½p tÒ:9R>Rô6)« ò ‚A½Z°½±®ÄQ‡©¹å®êŠ'½v[¸G$ÂK 4#W©z9í¼Ý;¡#ѹf‘jøˆž€¶Ž@%²Í1REöNq„ä8˜”¸‹¦àÈ{ïÎòÍœš`CÔ$X†ÄÙ(8°jN":¢ÿ,¨N¤6)dÍ)'h]óKSîb†˜”:+»Ù#€sÀ•žhÊÅ*¾’†±léƒJ¡´°ÔÛÉÿ`ádÝ6{”DºäËÓE¦~è°‘ƒCÞ$²…¬Ô…“Ø\—¬ÆØÆ•àj„g(/¨êvº8.Õ+Ñ7(0Oú2š~3„ÄVi|ëäL!Pj‰¾ c×5~û—㩲£&uŠP†3\c•‚¸€sF@†dšTôPÇœà ‰îY¨ 8ŤlaÈIæ›ÓØÚ€æpèEN‚‹Y°èîhÞÒQYA`–$ÈØ®FÑ%Q,êͺKpâ άÏ}Œ+irV‹¢÷ PÎû´áF€Jó Öê¨èZ‚æfÈF¶Ï ³iF+ÕÛ–¦Ê%ºíh»ê_ t×[³—¡J†´>Ç ²Å,:g‹jª/(áEÞf01Q ’H€Z½Ost.\w¬My–ÑNY?C‹â¶“2nsjÖ–§*› $,–Š¿8ÏÅúxRžÊ°1€Ö(d4PÀ9ö¡A‹Éb¨§¦ƒ ó4œ¨;-VÍ—! =ÕE)¦ô÷ÔØšà!F«÷ w‡IĦŠr³0`#- ^þXµÆhf/¥é= “f„Ó8‹h(,ñ„äUl;¸\éM–PF8K“’üÙ0ÊÀ-³ÜÂÁKó݇M3·M!5S—ƒœ¤ˆ¯³eÒœbÚ(W/`(Ø-št€“i@ãe`¾ ÑÃ:éñÀsD›«,cÓ[$™cºóx‚З$å® të™b$`bœ=dØ0v§`W÷®CO¿~]¬ÞóTzaµÖÙ$Éò 2ãÔy8?Óä!C‚ƒüm¥×‘à¡`Þn,q¶|Ê»6ÁM†¯ã_)²3Mˆ™ÖM&€miÁhÈíÄ/rˆ¦ÃlÏùg¡Êz»Ió&Io*lvHBŽ-¡ûR¶kE4 dÁä[süðÃô½(“†ðZfPÌÐûìã Ü£+7¶™ßu<–ˆ$QôVúeM$:SÐyW=›P¿œŒ+øáç³#›ÈX›—“ýÊ¢ì’D³‡0tmΑtÓåaÏ-‹²àÑtN´f¤Úæ×ƒ#«…긔‹…sû¢žRðŒ0KÍ“žLòl *ÔO¢=ªpä½z[kx·*³åL؆[™G2Ó¤$oc 1Ëœ8ZØa‘èÆÃñk€>¸ß¼[]žíö/nÛßÞm×»‡é{†êtz¾ÝOOÞüòÓÕ›ëûÍÛ‡ûÍÓé;þôŒÿWŸœýwù°²ŸëU™ž<.]ž{ÿvóyÏZn:}µÛlÞm¯ï·¯õÇÍùözóy|¿Ùßí–ïg«ÿ¾–ÿj-]‹ ËøËÙý Ï@=Ëtìõƒ @Ðöøu¡¯êô;OüÛÇó¶«ËoWϦÓçwÛ÷·ÛÛíÍëõþÃáìRÇÿŸ—ðOyù÷„_ü¸::;ÏW/·×ë‡Íîøxutôz}³y»[ßþ¾Ù­n>­ÿØLëíön¿ÞoîùËt³Û|b‹ÍôéÃÝŸ!d™~tôòçW«¿ª³AJ endstream endobj 49 0 obj <>stream %%BoundingBox: -32 -24 200 134 %%HiResBoundingBox: -31.6665 -23.9619 199.666 133.0439 %AI7_Thumbnail: 128 88 8 %%BeginData: 8816 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDE0FFA8A8A8 %A9FD05A8FFFD05A8FFA8A8A8FFA8A8FFFFA8FFA8A8A8FFFD05A8FFA8A8A8 %FFA8A8A8FFA8AFFFFFA8FFA8FFA8A8A8FFA8A8A8FFA8A8A8FFA8FFA8A8A8 %FFA8FFA8833358AEA8A8FFA8A8A8FFA8FFA8A8A8FFA8A9FFA8A8FFA8A8A8 %FD1EFFA8FFA8AFA8FFA8FFFFFFA8FFA8FFFFFFA8FFFFFFA8FFA8FFFFFFA8 %FFFFFFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FFA8FFFFA8FFFFA8FFFFFFA8 %FFFFFFA8FFFFFFA8FFFFFFA8A9FFFF583433AEA8FFFFFF835E5EAEA8FFA8 %FFFFFFA8FFA8FFA8FD20FFA8A8A8FFA8A8FFFFA8FFA8A8FFFFA8A8FFFFA8 %FFFFA8FFFD04A8FFA8FFA8A8FFFFA8A8FFFFA8FFFFA7A0A076A076A1A1FF %A8FFA8FFA8A9A8FFA8FFA8A8FFFFA8FFA8A8A8FFA8FFA83A333A58A8A8FF %A85833347DFFFFFFA8FFA8FFFFA8A8A9FFA8A8FD1EFFA8FFA8A8537E537E %5A7EA8FFA8A9A8FFA8FFFFFFA87E537E537E7DFFFFFFA8FFAFA9A8FFA8CA %A09A6F936E6F6F936E7599A1A8FFA8A8A8FFA8FFFFA8A8FFA8FFA85E33AE %FFAFA8FF3358335E83A8A882333A33A8FFFFA8FFFFFFA8FFA8A8A8FFA8FD %1EFFA8FFFFFF5329062906290684FFFFA8FD05FFA8FF292906290653A8FD %05FFA8FFA8A16E6F6E936E936E936E936E936E93A0FFA8FD05FFA8FFFFFF %A88311331183A8835733333311343333333A3334A8FD05FFA8FFA8FFA8FF %A8FFA8FD21FF7E292F292F292F2FFD0AFF53292F292F53FD08FFC26F936F %9993936F9993936F996F936F939AFD0BFFAE3A333A335E113A333A335E33 %3A333A333A33CFFD04FF83FD26FFA8FFFFFF53292929282F28297DFFA8FF %A8FFA8FFA8FF2929282F2853A8FFA8FFFFFFA8A0686F6E936E756E6F6E93 %6E6F6E936E6F6E6F76FFA8FFA8FD05FFA8FF5833333A3333335833333358 %33333358333333A7A883333458A8A8FFA8FFA8FD20FFA8FFFF7E28532953 %2953292FA8FFA8FFA8AFFFFFA853282F292F53A8FFFFA8FFFFA16F756F99 %6F936E999AA09AA06F6F6E996F936F93A0FFA8AFFFFFA8FFFFA8A8833358 %33583358335833343358335E335E3334335E333A335E83FFA8FFFFFFA8FD %1FFFA8FFFF5329282F2829282F0654A8FFA8A8A8FFFFA8292928290653A8 %FFA8A8FFCF6E936E6F6E936E9AA8FFA8FFA8A8766F6E6F6E6F6E75A8A8A8 %FFA8A8A8FFA8833358333333583333335E58583334113333583333335833 %337CA8FFA8A8FFFFFFA8FD1EFFA8FFA87D29532953292F292F29A8FFFFA8 %FFFFFFA854292F282F53FFFFFFA8FF9A756F936F756FA0A8FFFFFFA8FFFF %FFA1996F996F996FA0A8FFA883335E83A833583358335E338383AEFFFFA8 %FFA883333A3358335E33585EFFA8FFA8FFA8FFA8FD1EFFA8A8A8FF532928 %2F2829282F292953FFFFA8A8FFA8A8292F28290653FFFFA8A9A8936E936E %6F6E9AA8A8FFFFA8FFA8FFA8FF99936E6F6E936FA8A8FFFD073358333333 %A8FFA8A8FFFFA8A8FFA8A858FD04335833AEA8FFFFFFA8FFFFA8A8FD21FF %7E292F292F292F292F292F7EFD06FF53292F292953FD04FFC96F936E9993 %93CAFD0AFFCA6E936F936E93CAFFFF83113A333A333A333A58FD0DFF5E3A %333A333A5EFD2AFF53292929062F532928290653FD06FF292906290653FD %04FF99936E936E9399FD0CFF996E936E936EC9FFFFFF831133113A333333 %FD0FFF58343333113483AEA8FD24FFA9FFA87E292F29532FA8292F295329 %84A8FFFFFFA8532953292F53FFFFFFA89A6F996F996FA1FFFFA8FD05FFA8 %FFFFFFA8FFA8CACAFFA8FFFFFFA883335E333A33A8FFFFA8FFFFFFA8FFA8 %FFFFFFA8FFA8FF333A335E3358335E3383FFFFA8FD1EFFA8A8FFFF532928 %2F282FA859062F282929FFA8FFA8A82929282F2853A8FFA8A86E936F6F6E %6FA1FFA8A8FFFFA8FFA8A8A8FFA8FFA8FFA8A8FFA9A8FFA8A85833335833 %58A8FFA8A8FFA8A8FFA8FFA8FFA8A8A8FFA8833358333AFD043358A8A8FF %A8FD1EFFA8FFFF7E2853292F29FFA8532953292953FFFFFFA853292F292F %53FFFFFFA1936E996F936FA8FFFFA8FFA8FFA8FFA8FFFFFFA8FFFFFFA8FF %A8FFFFFFA85E3358335883FFFFFFA8FFA8FFA8FFA8A9A8FFA8FFFFAFA858 %3358335E33343383A8FFA8FD1EFFA8A8FFA85329282F282FA8A87E29282F %282F7EFFA8A8282928290653A8FFA8A76E6F6E936E6FA1FFA8A8A8FFA8A8 %A8FFA8FFFD05A8FFFFA8A8AE83823358333333A8A8FFA8A8FFA8A8A8FFFF %A8FFA8A8A8FFA8FF58FD04335858AEA8A8A8FFA8FD1EFFA8FFA87E282F29 %2F29FFA8FF532F292F287EFFFFFF54292F292F53FFFFFFA1936F9993936F %FD09FFA8FFFFFFA8FFA8FFFFFFA8833334333A3358335EA8FFFFFFA8FD05 %FFA8FFFFFFA8FD04FF83335E333483FFA8FFFFFFA8FD22FF5329282F292F %A8FFFFA8062F292906A9FFFFFD04290653FFFFFFC96E936E936E93CAFD13 %FF33343333333A333333FD13FF583433331183FD28FF7E292F292F29FD04 %FF54282F292953FFFF53292F292F53FFFFFFA1936F936E936FFD14FF8333 %3A333A335E335EFD13FF83115E333A83FD24FFA8FFA8FF53292829282FA8 %A8A8FF7E29062F28297EA82929282F2853A8FFA8A86E6F6E6F6E75A1FFA8 %A8A8FFA8A8FFA8A8FFA8A8A8FFA8FFA8A8A8FF7D833333333433A8A8FFA8 %A8A8FFA8FFFFFFA8FFFD05A8FF5833333A335858FFA8FFA8A8A8FD1DFFA8 %FFFFA87E292F295329FFA8FFFFFF532F292F2953A8532953292F53FFFFFF %A8996F756F996FA1FFFFA8FFFFFFA9FFA8FFFFFFA8FFFFFFA8FFFFA9FFFF %A85E335E333A83FFFFFFA8FD05FFA8FFA8FFA8FFFFFFA858335E3358333A %58A8FFFFA8A8FD1DFFA8FFA8A853292929282FA9A8A8FFA8FF292F292928 %7D2F29282F2953A8FFFFA86F936E6F6E6F76FFA8A8A8FFA8FFFFFFA8FFA8 %A076C29AA09AA8AFFFA8FF583333583358A8FFFFFD08A8FFA8A8A8FFA883 %333333583357333458FFFFFFA8FD1EFFA8FFFF7E2853282F29A9A8FFA8FF %FF7E2853292F2853292F282F53FFA9FFA8A06E996F996E9AFFFFA8FD05FF %A8A8FFA86F6F6E6F6F6FA1FFFFA8A8833358333A3383A8FFA8FFFFFFA8FF %A8FFFFFFA8FFA8A8335E3358335E335E3383A8FFA8FD22FF5329282F282F %A8FD06FF53062F2929062F29290653FFFFA8FFA16F6E936E6F6EC9A8FD05 %FFA8FFA8FF9A6F6E936E936FFFA8FFFF8211343333333433AEA8FD09FFA8 %FFFFFF58333334333383FFA8AEA8FFFFFFA8FD21FF7E292F292F29FD07FF %7E2F292F292F292F292F53FD05FF999393936F9393FD09FFCA9993936F99 %6FC3FFFFFF5E113A333A335E333A57FD0DFF823A335E333A5EFD26FFA8A8 %FFFF5329282F282FA8FFFFFFA8FFFFFF53292829282F28290653A8FFA8FF %FFA16E936E6F6E936FA8FFFFA8FFFFFFA8996E756E6F6E99A8A8A8FF3333 %11FD043358333333A8FFFFA8FFFFA8A8FFA8A858FD04333433A8A8FFFFFF %A8FFA8A8A8FD1DFFA8FFFFA87E292F285329FFA8FFA8AFA8FFA8A9292F29 %2F2953292F53FFFFA8A8FFFF9A6E996F756F756FA0A1FFFFA89A996F936F %996F6FA0FFFFA8A883588283A8333433583334338383AEA8FFFFA8838333 %3A3358333A33585EFFA8FFA8FD04FFA8FD1DFFFD04A853292829282FA8A8 %FFA8A8FFA8A8A85A062F2829282F2853A8FFA8A8A8FFA16F686F6E6F6E6F %6E6F6E996E6F6E936E6F6E6F75A8FFFFA8FFA8A8A8FFA8A83333333A3333 %11333358585E33332D58FD07333483FD04A8A9FFFFA8FD1EFFA8FFFF7E29 %53295329FFA8FFA8FFA8FFA9FFA953282F2853292F53FFFFFFA8FFFFFFC9 %996F756F996F996F996F936F756F996F9399FFA8FFA8FFA8FFA8FD04FF83 %33583358335E3358333A333A335E335E3358335E3358335EA8FFA8FFA8FF %A8FD1EFFA8FFFFFF53292929282FA8A8A8FFA8FFFFFFA8FF7D292929282F %2853A8FFA8A8FFFFA8FFA7996E936E6F6E6F6E936E6F6E936E6F75FFA8FF %A8AFA8FFA8FFFFFFA8FF5733333433333358333333583333335833333383 %AE83333458AFFFFFA8FD25FF5A062F292929FD0BFFFD0429062953FD09FF %CAC293936E936F936E936F936E99A0FD0DFF833A333A335E113A333A333A %333A333A333A33AEFFFFFFAE83FD2AFF7E5A537E537EA8FD0AFFA8537E53 %7E537EFD0CFFA19A6F936E936E9999C3CAFD0EFF5E113433A7A8A7583311 %3A3333333A3333115EFD2DFFA8FD05FFA8FFFFFFA8FFA8FD07FFA8FFA8FF %A8FD05FFA8FFA8FFFFFFA8FFFFFFA8FFCFCAA8FFA8FFFFFFA8FD05FFA8FF %FFFFA8FFFFFFA75E57AEFFFFA8FF335E335E83A8AE5E333A33AEFFFFA8FF %FFFFA8FFA8FD22FFA8FFA8A9A8AFA8A8FFFFA8A8A8FFA8FFFFA8A8FFA8FF %FFFFA8A8FFA8A8FF7EFFFFFFA8FFFFFFA8FFA8FFFFA8A8FFA8FFA8FFA8FF %A8A8A8FFFFA8A8FFA8A8A8FFA8A8A8FFA8FFA8A8A858333A58A8A8FF8333 %333483FFA8FFA8FFA8A8A8FFA8FFFFA8A8FD1EFFA8FFA8FFA8FFA8FFFFFF %A8FFFFA8A8FFA8FFA8A9A8FD05FFA8FFFFFFA8FFFFA8A8FFFFFFA8A9A8FF %A8FFA8FFA8A8FFFFA8FFA8FFA8FFA8FFFFFFA8FD05FFA8A8A8FFA8FF3334 %33A8A8FFA9FF7D585EAEFFFFA9FFFFAFA8FD05FFA8FD1EFFA8A8A8FFA8A9 %A8FFA8FFA8A8A8FFFD05A8FFA8FFA8FFA8FFA8A87DFFFFA8A8FFFD05A8FF %A8FFFD04A8FFFFA8FFA8A8A8FFA8A8FFA8A8FFA8FFA8A8A8FFFFFFA8FFA8 %A8A8833383A8FFA8FFA8A8A8FFA8FFA8A8A8FFA8A8A8FFA8FFA8A8A8FD1E %FFA8FFA8FFFFFFA8FD05FFA9FD07FFA8FD09FFA8FFA9FFFFFFA8FFFFFFA8 %FD05FFA8FFFFFFA8FFA8FFFFFFA8FFFFFFA8FFA8FFFFFFA8FFFFFFA8FFA8 %FFFFFFA8FFFFFFA9FFA8FFFFFFA8FFFFFFA8FFFFFFA8FDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFDFCFFFDFCFFFD9FFFFF %%EndData endstream endobj 50 0 obj <>stream H‰ÌWmoÛ8þúºŠ”H‰ÁáR/­÷6MÐ${胑hGWYrõ’6ûëoHÚ²›äº]Ü—z`K>3Î gèW¹º>Uw§OóÀ÷^½J{­Æ®?÷-×_4Í4Œ½a½~âc@H,’åø›î‡ºkÏí”,Œôë÷ÝÿVj«ÿõ ðoê±Ñ0ӖݲéÖÝÙ¶ZìW™a:A$B÷1>˜/. »©­êv-»¯çþiHüSù$`ɦßÖïõðƒÏc€ág´qn8 VF!±¬+§nÇ«¾+õ0¤]ÓõùŸ>ªÖ¿Pk˜QþÝ4Ý_6ªüt$RtíзºyÐc]ªSÙ5ÌÿÕ¿xìkUÊÓ÷z=5ª·Ü+ÕÖåµj‡#ï´®tõh º,êFƒ»7jô¹ñ½X`²”SÝTï¦Í†8D3ìpi÷w;ÀÆ`æÝ°ãåbœk=Žà;0ÄÄ/½øðc§@hwôú#ØRÛt€xýûÄi¾Ñ›m±³®ÇArFýÂÏáu‡c]xp шl‚ø!gg!å‘áÈ!¡Ñµþrî¿ëZív,úñºþö€“à,&~LÿýÔèþ¶­G· ±ànÇ]¥›sŸÌÒE£ìF-áïܨ~­Gȧ®™F›ÖI°›þªµÉì¸Üêö¦ûÍZxÊCÇÌMRR?¡,´Ú)lŒìÖÁv-ìq#¼×ƒï¯ —}½®ÛóS?M¦7}]¢ûNÜ5ý,9úòý×ÙÛGÝîl†ìH/Ž¢œ]\êy[¥ÝÆxÜd¨„·pFÝÜüng@|Úz½£ÏS7êt5Úç ­{õ }L$ªZ÷03 ÑÃ4JK]ÕM£P®ÊiÔèÝ)ªÑåæ¡ÛYB9ˆ²Ú*ë’aÕè¯H0N^Yåå^¹¶’ÒNT‰êY´vêk‡©0õŒi­zuÛ9lw„íflçL™trÐéõÐ4c+µ^ëU` Ö¨£aÔ}cv1èÒ$º›šFh«zãí=‰ Ñ»¼ÔÛãÚ*Tv[¨ëûÁq¬ôFõŸ³a^î¬íÆJ¯ÈÑåШáÞ›Y[¨ê›º ýóQ·h3=e{Ïpûg×W+ ªêV›÷Ê©1ƒ=@·úçIf“U÷¥EúkÙ¨}…ì‚Ú×€À,µ‚³[·ÏÍXCqkô¦ƒV²#ç ¨ÖõÖì|تR#á‚!vɶ{ä¨39ÒV`Òû°‰ .¶J÷§ÓŽ|Ǭê‡Ú$Èì´Ùçæ·U¯\Dó©ï¬¥ö¤ÌvÛ‘Uç¡U Þ¥¬Œ¶°NW™±±>œ³;5èÙ@;èxßM¤ˆ‡ÄQŠæGïÂeF>—;×,qœ®‹´p Kº<Ò·ß÷¥CÜ:Äí±š[7U™H Cޤ] 6ªìM¾C·0UÚᎴ;ѺŸÚµê§M£¦Î!´O¨T çÝä¶ŠÒ_–74‹C—¶LåpÍ0‚sùmw}Úl?¢'ôïZÅÍ¿œr¨‡{ÕþM?é›Ç­þaKž5õÚ<ØóŒ‰ž º†ò’Uöâö§ÌšoG÷ 0c àœñ3¼«qÐC¹¢?Oª1ýÕí jÅøxTL~X4¸ Bò™‡l ±VMU¯Vö±±W´í»j*¡LÖ q4Ô']nôZùæAU4E®~1R[øº³‚'(Ó ÜîŽv'*Ðïº]kŸD7p¶—×›»®Y"÷üfçÔ¹p .½‚„5íÔ{·õì½øª™`êMßMÛE»ê¼×î"}¥Æ{¸HBÝà>ìxnè; àþZ?hÇ;Sõöä»ún ¼·_Þý:ë©õ+º.Í ¡÷e? ÷þM×5³}ßNÍfîØ–kð?ÇWV ½l§Ÿ¯´<] î„?Ý*€þß+ÀäϬ=UÐ…íÕ¥._Zà…ùy%7÷'ƒëm¯òv¸þ@ZÚ“]›C6q®Lå)}ýW®ÍkËô þйÍróöA7ÝöÈÈ™-Ûÿ§ê·ßSm³‚bÏóÁÝfkþóú×÷j«­¹ã}a‘×?Æj¡‰Xþ¬Ò”È_¨gß–$Ç›•RSöKßééwj"õe{4ýÆ”eèóçFu«­ ŽããïÔ\âKhÓÞß¼¢(ò"+ÒB¢àERÄ+haA \y‘çy–§¹ÌEÎó$s–Ó<ÊÜä8²"˳,K3™‰Œg‰—ÅËheaF2œi‘æi–¦©LEÊÓ$S–Ò4JÔ¤8 d!s™ÉTJ)$—‰Œ%“TF2”Dbx¢¹ÈD*¤‚‹DÄ‚ *" "°xÁsžñ”K.8ç 9ã”G<ä„c$E’'Y’&2 O/‰–Ð$J„$ðŸ7.â<Îâ4–±ˆyœÄqÌbGq“Ç+XÎ2–2Éã,a1cŒ²ˆ…Œ0Ì4§M©¤‚ršÐ˜2JiDCJ(¦ATDy”Ei$#ñ(‰âˆE4Š¢0"Ž‚°ó0 ÓP†"äaâ…qÈBFa’‡)HN2’Iá$!1a„’ˆ„„L\àg8Å Ì¡ËÇp_ 8Â!&ãÀ Ä"8,€=,ÃÐà ðþîþ«¥„«’gZ2…‹P`9ð_vyÄ‘ƒ‡ÝhžÇ0'³9›÷ùöc‰J^HTb5Ú'*˜Ë,Å@ ·$€$Pj)Ê-AagØ}ÀIà Càoð ÅÌ1pT î2©Î3Y®4ù Ž5G–Œ.÷Ø@ QCÄ„Ad %– ÿ ^ÿå½ÜV$9Ž0üù}ãK5y>€oººª.Œ- A ŒX,YÈ’FB¬1~{ÿñGÖiº§gv¹‚íÈÊ̪ʌøâO1„2vOl¤M4dX°4}9ÎäŠb! –i…Viv¡ ´+m¤M´Y,Únün£oC7½R·L+Ýj·ÖíÒmX )lämDýÑô±™áâ±?Ë3ÔÅ,~fÐO ü±¿þÀ¸0 š&Bíß™‰I™¡/—.—Q´/­.³.ùÀ´k†{¢»£;•™I‰Ù™QYå™YbÜv fÙÄL™m0Ãhzä4šÆSé–i‰¦+Ð_YgwË%Ájí,©:3]'¦¬ÚµÛÐíÒ­u««•Õ4[²a¦Ó¸G·„ý4Àš{Œ}†Ø— {³£¹!펵Dí¶{Üî»"×0€ênÜÝÈ»°—ôíñ–zœi„ÙYŒ)Óªõ(Ê=~Bç±ë³ÄÊu ‘Öé\Ö à{˜-„Ä@,YŒ„zS½xC¹èż¥ZÜ/ B¸¾BWp;³žpMdj%K‡ÎЉìt$¦°2‚ÆÁˆ9èȾHàBîB° Ðf"Ìwj « ßgU%‹.Y”É¢Mu²è( ”E¢t‘²È³*•E«,jeÑ+‹bY4Ë¢Zêqãš^•Vºån‰¶ UaG0)?Ö¤žiü:ƒì™ajíBÓ§èUh™ÆÜX8®…CÉ'i$) Œ™6ÑF?‰:0Y/LØÆ¤­LÜÒ“WÒ71…a† Vª*ú”B3m¢qá‘ÞW¦øÀ4¿0ÕÓ½2å%éqf~Ò²¤50×JTÅx D&Œä•lȇ Ñ”FßVgMziRpxÂCŒ¸DæAÉØ+?БØ‘þØÂ«æ3Ûσ½vÙ—Ì,…å›Ú¸™Ù;ÏÊÓ}ÚŬÕìžµ‡VS o-?´´™‚O•弃݂»=ð†ðöÈ;@OKÈ{·à»E_ì2­P–](ÁFÄæ,¯i¶aÔA^óä€dÈì˜ñU¹K ÙUj ©70G$çŒUqHÞ€lN%$yEÒ_+ 0 &°¨üàIB²§@ˆ4S3öÄcXKHé05ˆ²] è;µ›êP<2(!÷ Ö ; w„™º$ ËQÀ¹Æ íêΈ(‡ ×hðm¤ª@õоÞÓuÆN9P= epS€Íö¨#ªÁŒxv¨i¥º6T‘apœ‚ÎádÏÖËŸ‚sˆ{~&zé>NA½ÝWü)ž7c8ÛPOÅP¼MòZGÎæÛò¨æ—G{ìo3=êÄY²Ü—'Ù¤÷ýY"æ´û¤—»|ÈÙîKüz÷ÓvŽs8Ûݶaz¿œíæyžP«¯ó0_憢WP3è èà4OÓ4N×µÜk±×R¯…^˼ùjXãµÂ³¾kuï¥] »–u-êZÒµ k9&‘ͧiä[lž)äûúøV?—Æ«06¬ƒ{]¼©âMwEüQiÞ *ó¢+ß"+Í}])ÇA‘ËÖJ.éçsà56W_BYï“qkù”@õwÕõa©z‹=«~æ•âøÁöÚ„+õ3>ä½ 6qñQ‡Œ‡GŒÛZûÚ#¾Xe{‰575öµ {§¾îË«ÑúúÑÕõú¼´šµ5p‘ŽŽý=ÇHAŽ,ÊIE9•¿1§¹p*™ìÊ eJ±Y&6Œ/ÇÚíY¿ƒ*eJñÌJ^XÍ¥ž7Öôˠוµ}d}G…»ZÃBïXì¥Ü‹‰W…ŸYù «¿ÔÿF *` -0R@ˆÖP8ŠÏ£ŸH„¨ÇžLôøS)EÃE_‹sé5‰„›¬¡’pT¢'5Eäi$?W64jפÈ">ÓR¤wõ÷Q'ÕI”‚Ôx ùls‰G]ò Ï‡ÀñoOOï~þîÛÓ÷ kïµù ¹ßpTøñÓ'ü¿÷u{V#>½Èè4’åHB¨—»âå£ä‹YôË«òåÆì5Ì 󒈹/c dÌ3%C-³“2G1s”3{A³J³S5›®Y”M×6H.7c¯K?ž–.rôIÕš Å…§~³T±3•ìD5;*ÁÈÒ–Lª´B› Un"ÆbGš§â³Ô½3µïÔy¨×@|¡nÔÃUijÖLÄr•;x=e²³ˆŒžh Håî@ù|¡„n”ÑÕPK€ÌRzYà· GÓ…›­#vdÔ^¹jÃ2ÔhZœ -÷VÓRºi‰sݘ7x¾Í×±º€ùErÙü°Û#<£á›Ïyúâ·žÞÿðôýgŸí¨½¿a>ÿUî½óÅ»÷ï¿ûí 8ÿâ—Ÿ~|wyêm€ùmÛÉŸO'‡ccŽ<…Š[ä‰\ýÃ7ÿ¦¿üJÍ-š\ì«ÿÒý~þ ÿ9ÅÓ_N_ÿÝž¾eûW_â¿>Ó2ñÏh:>êÏkK[Ž/°oÚ{âsþª+,ëëå [ðëôãïýìöU±Ëª¨És³;—"3¸sN!ðÁÒÖ¤%UçNìѸÎЬ‘~ÌYü˜};ýCGd LÚ€É }2HÆ>Ör æâSBHË4I“—€«â[K±â#˜A½ÓUÇ/mN‡4Ü‚‹7r:E âËKô§ˆD–¦T‚g—˜+}W²úṵ́~L >Kx]Ù¤)ÁKÎò1кu]‹LË Ë².Z âg”ñ „ø)–þlgжÐÆús¥O¹â‹S?¥P軲 )=*²^ òCDÉz¼P.ô¡½uDÀòæ&mÎzöAEr챫ð3ÖCn»eÍš>³­¹(]JKü¶ˆõ¿¥Ì)j‘މg)!üÞ ¯Ï8¥xö)±î»–1ϦŠå†[¬£_‹º(Š\eÙ¹>¢¤ÀÝt)qÖ¹™Þ•JW¾U|ˆ‚e$CįÕsÓ¬ü\è#ê¶1Œ#DÏi7J%]Û¾NFLD¨ íÙ§µ¢±ø INg×1ÕZfö]_Íi¢E?‚‚©™íº!&̃X‰òl'¾Gü„M“((äâs¯zФbÙ':F ÄLã^¶ÿ[$|È ¿…fåcðáAú¸Ü8Æ–Ì4jÍò¾u5/)9ÁOlÍ{MÈ„®ˆ}õýѶŒÑÃ'B‘±OÕ%ÁPeO-º‘ÎelÂQ—] ÏèÛè§\hˆ^3ã_ŠH€t´ù°’N\ç7ÒÁ·Ð˜ÒI›×7f@'$C.éÄw1ïI‡¦šãF:ñ]ÚH'~HGÒ%I˼’Nºø´‘޾=޳–tðÛtôÓ‘tÒÆµë¤¿ùt2'ôètòÑn¤ã¢¹tð}'ßJ:´ºéàcA6Ò%IÊ| ]JJ\HÏ»‘~ôíH:´eÛ6ÒÁ‡^ÞH— †¬;MÐÐe%|ìÿF:¹_Û‘th $|'üTòF:ø8•I‡¶ÚÒJºT ±âJ:q‹;’NÚjÞHG!º ¾“Ý£NÚW êàËaEøÖQ'cšÝP·›CP'nHGÔI› êØ§l¨£Ÿ¨c[ØP'~òêäó‚ÔÉB–º¡Žûé6ÔI„ÔpD©Ù°¢®œWÔ1îÜu›Åm¨ƒݱ¡>ÇîQ'1.ãÔ‘-eCýzDÛÚ†:æMØPGÙê„5­m¨£_7Ô‰_Û-ê ûchÒIÓÿx/›ž;Ž" ÿ•wéHHéïXÙʱÙZŽE,À‰,gáOÓ35UÝFlJ¢øÔ;×ÓÓóÌyj«Š:dy (êÅêd–[(Š:䆢NrZýû&LâìCI‡,÷WI‡ÜÆt¤+í†>­3)ä˜×F»!ÇQ, 9ä¸EÈ!‡õ 9HМQ!‡cV»#ãûj„Ê8\YÏSÇÕ*C'¹Å8ãd6š‘q’§¼¨”qO£lmÃ8å‰þ¶ '±-°’q{[J'³YrQÆ•! š2NrÎ¥:Èɬ^=‹“̵¹!'¹¥ÔädÖ/vr’åÝÞrÇ1äd–Òx('Y¾ÚoÊI”ׯp”Ã,-úrÈqmR—k)‡™Ô$¥œäZWÓ"åsîŽr˜¥ÕI9sP±]ï¦z¹)‡ÜLI¹õî(ÇÙª¤f=d¤VdÆæ(‡•Œ²nÊáŽb)nÊÉ/ëc…vRîù†\[±ˆä¸ñP ä¸9KWÈ!çVrØÐµu¹‚[í 9>a*ä˜ãtã,…ÜÂÌPÈC¹YÈV‹<„sŠ 9ä´8é —Ç)®˜=âÊ#Œ¸"ïâ*3'®ÈV\%ï⊑WÉN\ñù.®y8qÅW¬¸ò^\92âŠlÅ•yW̬¸"[qÅßlW\°W.šWɇ¸æéÅU²×<q•‘WIN\K8ÅUfN\%;q•¼‹k ^\%;q•|ˆk‰^\%;q-ñW™Yq•hÅqW̬¸"q-ñW™9qE¶âм‹+fV\Í9ȹxŠk‰^\yŒWæM\93âÊŸ1âŠsîâŠu´âŠÛiÅdWì##®yzqŶÛÅ•[Óˆ+²Wlç]\óðâÊGÀˆ+ó&®œqE¶âÊìÅ#+®ÌF\‘¿&®9žâŠ™WD+®’qÅÌŠk^\‘7q•‘Wd+®È»¸æàćXqeöâʳqÍÁ‹+ó&®˜YqE¶âŠsî⊠´âÊE3âšã)®9zq•ìÄ5ÇC\s²â*ɉ«äC\eæÄU²לq•‘WÉN\ñù.®2sâ*Ù‰«äC\efÅ5'®ˆ»¸bfŕوk.§¸bfÅU²Wä]\ñ+®æ@â.®¹xqå1F\™7qå̈+²W\Þ.®XH+®¼ŸF\±Cvq•dÅ5G/®Üw›¸boZq•ìÄUò!®ØãV\É#®Ì›¸rfÄ•ÏW²È‹+Xcŕو+ò×Ä5åC\1²âŠlÅyW™9qE¶â*yW™8qE¶âм‹kÊ7äð©Wf/®qE¶âм‹«Ìœ¸â#®ˆ»¸âʬ¸rµŒ¸J>ÄUfN\%;qMåWYq•hÅUâ!®2s⚪Wɇ¸Ể«d'®’q•™WÉN\S;ÅUfN\%[q•xˆ+fV\‘­¸¦vŠ+fV\%;qEÞÅ3+®æ â.®üi#®ÈV\×w¼¸rfÄ•?cÄ+²‹+VÒŠ+î¨W¹ã»¸b'qMÅ‹+7Þ&®ÜœF\‘­¸bCïâš²W>F\™7qå̈ëÂÌ#®ÄWÂʈ+³W䯉k¬§¸böˆ+0⊼‹«Ìœ¸"[q•¼‹+FV\%;qÅ绸ÆêÄ_±âÊSxqåȈ+²WæM\1³âŠlų]\qÁV\¹hF\%â›WÉN\c;ÄUFF\%9qýW™9q•ìÄUò.®2râ*Ù‰«äC\ãðâ*Ù‰«äC\efÅU¢WÄ]\1³âŠlÄ5ŽS\eæÄÙŠ+ò.®˜Yq5ççwqË+1âʼ‰+gF\ù3F\qÎ]\±ŽV\q;­¸bƒìâŠ}dÄ56/®Øv»¸rkqE¶âŠí¼‹k¬^\ùqeÞÄ•3#®ÈV\™½¸bdŕو+ò×ÄuÀ[Kw ðÖðÔ¹‡àBP7 ®u:Ô ˆëjÜÑ⚦¢®C\«C]‡¸¦¦¨ëÜNYQ×)®Õ¡®;qíðÖ…-’®Ó[£%N Òܤë ö%² òõì(é:—.+éð §õ@‘tÞºH¨¤ëôÖ¬¤ôÖ‡tƒÞšé¼uu#’nÀ[CWÒ z«+u‚'Ù¤íFݤ¸FEÝ„¸.¬)ê&Äu4Eݤ¸Öuá0W9s•ìÌŸïæƒ7×¼¹J>ÌUfÖ\ct抸›+fÖ\™¹Æxš+fÖ\%;sEÞÍß±æjÎAÖÅÓ\côæÊcŒ¹2oæÊ™1Wdk®1žæŠ…´æŠû‰K¿Y7OqôÖx£nÀ[‰ºqzë@SI7¨­YI7øÍâH‡w[Z•¤ÔÖ¤¤§¶bt;'@‡§&§§Ñ Zk² ´Ö§Ñ ZkVÐ Zk9@'7;Ù|¥ ôÖÅ¢. õÞ•uæ†ïuê:w PW.ÏE»w «7îžÚû@}]$ðýu#^¸a‡/Û3*í6L‹;Ì"¿›wa­hTàÜ…±ˆ¨Ä käá¯sí^2/Àc{õ&(²‹`¤^ É¦¢Ø TÙØ÷\çºÁ‡Ë%qµãÑf£ëx°Ù¢ä‹Îf#d6_ñ ³ùá^¢Ì–Çf!³¥{›…Ì.6.›åÅÇf!³u³YȬéx ïûöØl¦ÌF¾L™½Jžü³ì£k•@¾ ™]/)%_¦ÌF%_†ÌÖªä£åæÈ—!¢k?‘|2»èIòeÈìÊJ¾L™ÍJ¾LÿH7ù2e¶8òá§å-ªäË7<.òñ;=;òe/³™.ûÈl>]6SeîL5õ§ãÉ‚\eìéxÎeÛ»rÛ®†9ù°9ËEG¢/PfSSöÚl~xܤŠ¥…XBSüq€× †y”¡´"váÍÀ@©]  ´ÚU·HÁ@­}(øî¢à·¯?}þîûÏ~þøöÓ——ßÊèhÙCß¼|ûýçO>þýåÕ›7¯ß½ûõ_þùó[úÍËopàÌßÿôö—÷oþùþãzûù§¿|ùåýuÐëÿxÐï¿[‡üNþ“ÿJ¸Éò¿¾0Ê~”?´—Wß¼üð7ùÓ¯ÿñúÿüC¿îïáñÌÓ‘£ÚžË'xm8r9æè°µ0ëÈ—‰ê’ÓºU7Óɉµ³‰tdÙ¿Jtä6¦úzÞæE™ºHL 3¯qóœ£Xç„Õâ4iN¸ __8¾T/–ã˜ÕVIrÄÞ<ÈqeBrå8W« Å8ÙµøªDZ!>—ÿ Å›2 ˆ[†“CŠ‹á¸Nq,C[רÇJ•\â@ˆP\!Î{Qªƒ8nq]Í“ç-ŽS!Î)yˆãi“V¬ÇSæq<êBqqPC(®V¤ÇÞt²…8fiÕJBœ`*M!Nvåâ ŽÙˆO}ïhlÄ‘sî☥e5„8Ï‘´¾"¶™ÄùÓý©¯È}µdB|}§;ˆsf(Οiű";Æ ÍØã8ßµÄ8.k}¬ÇjŒcñr(Šqn¼Ź9KWˆ# Å•á¸gµu‡pÞëÚ•àÜ/kÿà+OÇoÎòƒoƒÒ›ÊÍ›°ÊOeNQќ֫ðÿŒî7ÿ[tÿWlËž•{ÁUò*´š¹Ã­O#—½»ÖÜ4r¾ü“­äµ•RM%—=çô•<Õ,/eSÉS¨¡SÉ¥ï±"ØJ.ŸñÖi3OÃbšyº$Å6óúúÎ]ÌÛ¼žõ»˜·²g98!OeµÅ|¬7½sy–˜^žåÅÕ‡éå5ÔyÓËe¿¶¹÷òÚWÛ%Ñe 2¡ø´rt÷­œíÄ´òV½zùˆsáÛöò)·Ýôò$ïH[Ëg¸^SO-oq½¯V^ãݶr¹¦¸·ò±Øp—òV›ïR>Êl{)e÷«”—T²ò5̲—rˆ‹-åäëÓÉy©¾“×Ü›©ä-R%ŸJ¾ôÕWòÂ0•\ZBíO%¯²çVɱ•¢©äR•×f»*¹|gŒ­’×”ÖƒwuòZ®¾suò«æûRÎýô”òcɶ”÷Ë^ÊeO4ÓÊÇ¿™/›$KNߨ„ÄÏzÎäû;SQ´#¼ò‹‰‰T¿G½é#³›$ÎÙuUì·)ï%î±ãÉ—X\˜Û“㮚«þòä …AßãÉÑȶ¾ž|Å=ñxrûØñ„Ïvã ]ÎëÆùkæ×Ï)ó"®.ÿg¦ÿµÿm/Ýõ§”úXéÞ~–ÌsÇ5ê9®“¦dÛ\'­¬Å\6ö/U˜J¶ÜR^½ðÑQ“RÓGCëAÝŽ|ûhHé2Â8c{¡Ëj3tÇØsB¾Nš5‰kÖ4´·ßqÒÔeåÏÇ+k}…S¥“†4 ·ìN2ß<œ4»·ÊuÒ4‘;ÂI³Í®Y‰ÚÐØ¯pÒ5&"4&§kã°Ò¨‰ŒôÒ¼þbîÃKóöi£ÂKÚE®—®±TziÞ«¯“ÆÿN“ã¤9-}]'ùªÇß'šß‰ÇIó3¼~“†O_'¿µ¾±ó¶b½]+ÝÝ>_[L+ÍÃ(²ÒJSwÓ´Ò<;xƒ•öÃñi>VÚϼδÒ쑦ù·Ò¬ù•~Ö@¯™^/ ©­/í"mÿzi¶¯æw†··ÍÇJsxQ+Í©j}¥•ö¹ù·Ò¨Á0µ´ÒиôíXiH?­¯•f­GÛ¸—æ#¦Â½44ï¡ÇK³V$­4¤J ›[ièÖ{Úo·Ò¬µ5c ŠSÅ™~¬4tÕË€80¼¡Œ–VšzEÎt+M öziÖh—öÏD4s/MÞûó/ØýoiÊ y0Ê¡±u1 =­'F!MôÅ(ækEŸÄDu-51J<ôå(uÔËQ^ݳ]Žâï%ôå(Ç~é…i¥k¹,¥$I¾,e­ŒËR%À,…Ö)/KQk1ãÁR²ÄÚ…)~Zíõ…i w–0å–©\˜‚!õ SX­õƒSm%LùlCÉ_o£ ²›ÍD›q —>h3c@‰6h™a mЪ¢ÚP;¶ÎÑ=w:ݬÃw´ñ¡*1¡›nÐ aÎ tÛ7é†Ú¹“œnÐÞ Gy}"J¸vFÒÍÆOѾoÔSº±´VOº¹Žhàtƒ®WWÒµ^kÒ &b%Þ¨«¬‡o¬•8LŸã\cóZ§>|ógG°òÝ£¶HMηøÎúòÍK=ñæOÙF¼ñí|Ó>|æ¡#WòÍO3Øä|c‡¬.ßÐI0›–|3N?|óÎÓöðÍ›3’£7 þ«ÖpFŠÙzÇ7]I8Ÿ€R“p®ÍI8¯IO¹î 8ġpŽªÎumI8ê² ø!œ¢AmØ—p,¹=Þ„£î‘eI8ÊVûC8ÔÚˆCÄÈRÕ0)=n¸dk5œ¿Cºöð>/Ô3tBN9‘q{:äø™1%!ç:Ø’”óu×JÊQ·:“rÔ2ô¡k5Ð)G­jI9ê¦.1Ç÷ÙôtÌùžµË9èÞÂ&èP›|·C:赬&é”!2I‡ø€ò@ÌAÛr< Cí˜.NlÓ’t³öá 6t$ç uKÎA÷ͽäjC­'ç Ñ;’œÓˆEHС&Û¼:è Ûì’ Ó“k>¤cmÛ6‚NO4Ú £öwý€5+ÅtÔ£I‚ŽÚDб¦qœº\cƒŽÏ™c> ógÛLÐùg"×8è\Aç%Ó$?FW’ŽçIÇܦ×IçÇÙf’ŽÒÌÒ±“,°ä¤ÓÃÜM:ï¼6Òyw69¤£ŒUtìçaíj¶TtŽ–e :Ÿ‰¢è¼VW‚Îu¬ë¤s‰<¤óuëHÒ¹.#IG­uý&]C‹®¡_Ò¡4«Þ´J]tÒñÛ$&éX«snÒAu ßEÒQ–þ¦UÔ̶Y'é¨Ë¸i•ZÆ›VGrÞ´ÊÏÔ°|N:×òÆU_7Ž“Ã5’tÔ=òJ’Ž5‡ÿ&µg°M:®ÙÂß%éøŽMn\õ=k7®Bã7½qµ-P8jN:h\“ ºÆ‰œoZEmX$Z'4û¦U-œ¼þ’®¤ ÒlÓº +xËðþgÌ è¤ý’®\";éð÷ù tîËn\Uþæó‚›ãÍ«¨Ùì7¯Béõ‚Žá#¶ð‚ŽeÞÀêZn`…Žú%jZn`Uþ¦V/éx$R_Ò¡6åFÖ\ãZÆYýÙ‚tüLä› ]½‰åŽ%»‘Õ£7²òõìå6r”›Xý0ƒQÎ96È0}8ÇFZvksäÎäœ÷]{«÷f«‡s”Kod….ÕÞÈÊoZtN–u3«Dy3«×êLй6IÐ9Š^Îù²õfV×åfVêYÿ‘Y[…ÅéãáJîdç*Mbª–ùbmnq„œWÌÁš–˜ƒÔ¸é.æJŒ{bZû¸˜ƒî¡/æ8q‹æðz1G]û‹9®»êÅt¤˜ déý¥\‰IÊqÊÛ¸”+Ü{)‡WÜô ÊÕ8ʤºÓ³Â—ràÊZv)WÑuÚ.æ8ޝkXn™\ÊIÌ)­¤È—rMÒ~9å §_s »×D>˜CE¬­Ätµ5smŸÉ—s¨©èLÎA÷² 9 †õ‡síÕ[r®¡ɪùv"ȇs¬Õ)ɹvbÌæµÆ'çXk$ç–hrŽºU}8ÇšÄ:çrÍ9êhÏÄœ?úWÿDd§\|þ”óÒ'¹RO­I9nÈ\úpŽYÂ%9çü8ÛÅœ`?t¼˜Ãž·`R`îðö`Ž'ëÅ\åþjbŽ­^-0‡æ1µshÊÑôbŽ`™ãbŽzõsu×Á\ÝÙé`Ž$ªúrŽë”u9-k]ÎÕ8“_œìûèýË9––ÞäJ=Û: £ÜF1A‡¦æ$WªÆ‹ ƒ”ior•ÝtÐ¥7¹ò勵ÉU8’ã&W~g…çsй®orõuop¥´²tÔÚíkNþ :êÞz‚Ž?­†½KÐñk½ÁÕ·Lnp…îºÞà*lç¨9è'PUtÂy/éPÓáÖIÝw’uÒAãΜéPÛöËA'†]š7¸B·!õ:TŒûy@Dæð@÷íCt¨®7¹B/-A'ëorE ì»ÉZ‹µµÆ&&èX³ëç\ÊM®ÔóÅJ°¯7¸R/i‰9êQÛƒ9Öz½Á5ר˜£.ý ®þèHAÞÙþ™ˆ8:×ã ®^Ò\©¥ÝàÊ%e½Á•©ëW?Π”“ŽbÚÒ±“Æß¤—M«f·„ÿÊ]Î@ëû#YÙx²HÀ ñv°‡xH˜˜a²˜Ÿªj©utC lã[ýJ:çHݪËi\“ì S⥻oer–”7è’•þæÓy–»oe,æìœXÆé[¥ÐÎ9•ÉÁœd)Ž9è•Ó2á´­Ômž¶U:üGÛ+`Uçs ÉÆ.ÌQ³îæ h9F² ʪõÞ7ä(S½‡|XwÆQ§:qÔÅ´3.²»#ŽCrkŽ8é0.ÄiÙ‘q‘å’3ŽzXÍ8ãëVzb׫/"㨫™;g¿p±SŒÓ~Yï$ÆAOµ ÆÅ0º3:×GÏYŒÖç9ãë½gôâ—;ò'Ä qˆmë%ÆAWÝ‹qÐ=Æò`"3ç范yLg_ÌsÆÅãuzVÈ4–w#â ¯q!±juÄAãÓš#.îæã8Æf/θ¸˜Å8葬?uÈ1Vížä"{«ØrÔ1´ rŒ;OAÎ×X£.-]Ó³KrÈiŒ58‚œÍéOÈ)”‡CŽºåìãçµÑ.È!–‡y$ANç™’CŽ)2ó¼ ‡X‹Æ$A.nÞ.Ê)õR¼(Çô±mÊA¦˜æ CÎý³¼¦æ˜XútÌIqaN•b¬8g¤éÎ9‘(´‹sZ'Dçu˜Ñ9'òkÎ!Ekí—C¨ç\œsƒv&¸´‰ãî[Ç»Ð{¬‹tP±[£JÒ¡2Z1wç¨C &ÿô­èéÉQ½{RGk²¶CúrýBu0D9ê¸ìX­,Ë…E ‡BtªíF]ø“£®óbë§o…Fp÷­,~²e£Ž[[rÔ!=QúñBÝ€Eõô­¨|¦9êX‘ݸ娛ìJRsÔMîÎé['oÌy»¹IïeŽO¨›Ø¦EKC]@õÆüD]ÀíŸNß íLê3¹Ü¨ °^ùô­Ð-µzXð‘õî[›¥ž¾5F´i¥Ö©i7ëØ´ôÓ·JÇÓ·R7»Ëë" ìé[#¬Xë k¨7ë+áô­¾Æf]dûq£Ž¶.ÈPÇ!ÇÎÙŒ«oU(Ÿ¾• ùô­ü=Œ»oåF¦qúVg ÝI‡ nÒ!“j9}+ùÚcwÐ1ñÔó<@‡äDÏ26èo÷túVäsW7ön·™lŠ@G² :êÑæ:ÖI0ž tBM= #ŠÂê,7è+ó´­”cfçÜÐm_^sù9k´¯Þ  ¨ÀÔæqt[ìyD] ULùf‚¾¦,Ø¡* ×›Wh¼±½ ã…R2b‹w„Ê3ÝÀCI8ÇE<–&ÚŠäÌèX³yNAë(AŸÔc°×äÔCýÒ}Ç5äyq/ð&à!lð!¿ö0yX7§/ò‘JÎ>îa˜ÆK±$hJÅ'ü¬CŸñø< õx|J´å~û<Nn§—‡lfôpF:ˆ§Ñ“+{4³ØÀ6N/ûާò„¾=¦|ZYB:öág 0Þ­,,YN§“E^²š7ú2©6oôá8Íö,ôe•Õéd­'¹;Yö1­6GßîkùØúèKäËøˆŽËcÇ% ,òe|¹ÈÇØº"•X¾Æ"_fOb=§£±.cº•„ا9ÆÂÍ>†’•žv ºˆ‹}Yz¯ûð­?\s98syØ‘Ëíò@¥¼Ú[¹|úùOï¿üò篿~xûòúö¿úý÷6äwøÿþ…ï÷Âé¿¿JâŸñG{yóöåÇ¿â¯)üÇõ#ÿù»Ï {^›äÌK…G.Ù !ÝKtAS넆! Žu1±ÜÀ3Ä€ÓÆ12Ô³h3’;¿¦DìãK…yoäÅÔ-C °NéfpÓî6SªZüJ ]JX:kµq­ì'Tä*b©u½TÄÍ-£=!ØbmþV€}d,dBcGµ Aƒ-ΈºÓl®)ȪÉX}Ú~ÉD=ÜaŒ’ÊÑ5Ep¨Å®h%`E¥6¤RçU…² Æ+›ÿ ÆSÄxrŒvœ7$Ò4×”Nv¬)º“c±v97=F¬‚F¢%GhËšƒÊµi¶SZÔ׺%ÛÙú5§ófáç¨u'*JcÖí¼¦†íHèë9Ä0ªH»Ô9$·®)µƒÖÐ8VÛèv¦€ÔE‡AÚSÇ¢W™à¤´>zŒìsFÔ‡‰„„®D,Ïœ 5ÛIæÄˆ>§¦¬9 ®æì5d{¨Ûʽ¶¸©gwåQK €)]§OÑcħ=…‰Ï¢eÚc¬Î9nÉÄ-ÃÚ¬¥î9«öw—®‘2ñ~ì4NúUgµr 1 cá@ÇÌMìì ›¥^U5 ðžžÜ¤†ƒRu÷N”®M¿wš—5§öªX“g‘×ÒªŠ(-/¹æØá û6}Ž-7¢Ÿ·]¯ >™®J:™N¼s&ïl@«ýÿ‡òwÿ+”i_`Rn”ÒÒÔyP =j;(d]¹QŠ›³”B#íJ#1Sn–ÒJõxXyYåÃRüL;K£u˜ÔÈkòð”2§›§Œ…~xJÃGlžB—‘nžF;Kç)qÂŒÝ@Å›Åo â‹Åé Tî²}táu~5!ãc<@EíDnü*\í*[fº- ÒmZF»øa?ëETº¯‹³‰ ]§ôY= §ôZ4ä§Ô!fǩ܅áÕqJ_ÒZqœÊÝL§©ÑHMi£ÐlšÒ‰…SJ¾à¦ŒÕ9¦Òv‹ ¦ÔúÒLC·’¦Ô–Bb)¥!ÐQÊP³+W(}¬`$tíB©žÜÚF)‡°/Ü(Õ»¡¥ŠñÒZ(Õc FÛ/öMRîbeÆIi›'ï’ER&sø‰R&QoÝQÚ6Ô7J™t¥Þ(eb–CRÈ^Ç!i´à")›šz@Êìù€”:æ¤qÖi´brCùæ(i•êá(µ=Õ8ÍË¿æ(ó6ŽtQޱl»-ÊQ§Zr*Ê”/Ê1–gsÊ¡>汋T©§‹q¬ Þq”tãqÔÅôF‹½Û=-ÄqH‡qÒùBœB¡9âTç©:⨇=ÅÇX7¸ q*ÿšqÔµ]„ã÷ÕpÚ±²ÇBŸñâþÖÇ-¼áÿ­ÖáxÓ£ì o|eë›ÊrDâM»Ê…7î”ÌÝÂkŒ}Ö&Ï#æ~Ž§Ì†tާ¼P¬ÊQ†-ÿ» ÇÄ -;ávnoıÂíYTÁ " §²mÓG=ÊE8†ælN8iÛ<Že¼œ¬ޱ£Ž8Èf…8jÖé“qŒ…q5Ä8!d”‹qzv«›q”5gœM™ãkŽ8=ÅŠLˆã×u븜qDÈ s3N§I>-Æé#[º§ÍiÕWEÛæŒSæ•|1NÉiM¤ Ç3‰ær9²¹ ‡œ²¡L§œ* \™€3ŠåKmSN²9äD¡4.ʉVFQN:f§uX|R®`ÍÚëE9Æ–Q娛õ´¢u6»î”+|Ó1rÔÑH,ÎAï|wÎ1[vÐAÇÖ«ƒŽz˜Þ +,K»E:éfÄ:éT.ÒiY3|ÿ&»nvå8n(¿Š–öF.Öe— »lø ÛHJ h“·Ï9d5Ù”VäÌôÜ©®úšG¥cÝd»t¬ëêI:öÄ VéX÷>\:Ödž;§Ž?G½Ôé²5·ål–é;ô6ïà£ês†¸v‡rï¤z]¦c‡Ò!#v¨ñÐ\ ;ôlôºØõU:Õ±CÝøc^Ö¡5–=ŸÔ:Ô}Ûׄz^ûÜ:ôV7ÿÕ:Ô§Úø¦÷¾NÛÎŽzµ/y°CÙö¬Ž]BÎK;öl|Sìú““.v¬ïœéØ¡7ŠMVŠëe.(X¬G­ ;öº=»×5;~Ï^;a§ßmOb§o9˱ÓÚžŸŽöFwíôkŒ ÕŽ¯ãä&í¸í>  Þζ];î6FÒŽ;iŒãÚõÇݫ’vº;[uíX›ÃŠ7ô-a‡Þ8½:vÊËŽž‰ÒvÚ“ó`§¥]VµSjMÚéee¹vZ—åÚ±î÷’oívè±DéÚ¡·¥GreÍ›óhÇÏÜyѵcOövíPÏqªkǺ̜\ÑcV׎uY‘\Yו’kã¹Ü‘\ù±™LµÓºæèª—=ÛµCóµ\;ÖӾƵco¬ˆ®¬wﮯÙì!âÚñ'¶ÑU—­ytEyVÉѵ@l=Õ5ž–Ž]ã¡Ü9¹¢·†¥[Õ5žã‘\{áÃsfíÊÃí Vév‡ñŽÑ®]}†vÅ]6íðúþ;Á6"º¢®ó¾G±H¶rvEoìéÙåªS;&[ÂÀŽieGxÕºFxE½ïÌÚ¡×K„×Θec›i‡×O•¬z»F|}]ôC]WޝúÝc¹v|Ë™¡xn íØ_õkzÄWþ¼‘­Ã:®âéUof[n7ˆ&±—uÜHgDzmÊîvëtßµœ^uo6qëXŸñu‘‘ã+÷x³¬ Ø©.'ò«‰’ó«öd?Øiië¡Ø)FÙ:½ªD~ÕºD~e½åÇüÚcÎ\Ù:ôîLkÖ Çš ¥ØdÔaŸ-AŽÂÙ#¨CÝÇÎÔáøœ1‚:Ô}® õ´Ú©ã©´§©Q‡· ÊŒ:Ö23u¼ì‘ µ¥“®ØOÒ{&z[!êes^H‡_¨‚>ÒqÑ,M©tâwH'û9#¤<*{ êx"óX×*Þ:jHWC1J‡OΓ¤Cφ°+ê­Ï‹K]kø•µ&êЫüüCjg9u¨Û¥Ï­C¯×¾Ý:Ô³Ø §Ö¡d3Y‡Þ©7øb÷5¬Ä4.Õºöä‘—uì‰Í‹j]{2͵Žõ9Ý:ö–Xj]ã¿m@­cݤ'ëØ«öHTë^×PëXÛîtêô«=Äê,´ªtö‘¤ÓÞ+Ųކ…JÇÙ§'븎åŒÇ:½-¨«X޾2uØHmHP÷˜ûPÇWO¦O¡R{P‡ºÙÌfÔ‰ýG‰:<ÝVëAqÙ+¨c}f¦NîíºÔÉPu´Hz¶Ž—)'¬C]Ï ëXßK¾­«Ø ËÒ¥[ÇÞé‘bYïv;ÖwftìÐkgEŠeÝvwìP×=rŠe¯îØ¡.у_/3¥ØÊs¹"Åò#Çf2ÅNkÉ)V/!–å(DZcÝí[;öÚŒËz¶éØñ?ó;þb‘±ºjÕC,ÊÙO±èa]»cWñWzuì*äÊÚ¡×›]Õõ¼©VµCGçNÚÕnCØÅ®â—ž!u[Uvè þKv¨—õUÞ“;¥>Ø¡·ôà^ìPãÖ7Ç®âÞÏ™S,zxÍS,Ê^FsìXw[DÇŽ½s–5R,ë©C sl„XÖÇF6¥Žõ’–¨coJ„Ø×5”:Öeæ«_Ýσ¾eoÇNë•C¬öz„XÖµEˆå%ëÉ!–ëØ‡X½õ¸vÜ!ƒ·á¥wÒêb«:ìØéÆ«9ÃrsöÚ;ÖÕ:îçÓs†eOZsë—VkË´n§N+[¥N)ún¬Ó«”ˆ°¬ç‰«uù1 –]ÆIÔ±wZ¥ŽumÕ©Cm¨9tìðëÝCýFæ„›»Hb=À®s¨‡>,®s¨—HOΡwZwõnû¸s|ýºçÎÉÆ!Šüвn›á”9Ô0l'æÐ›eŒ‡9”ø¦3'Oy1ÇÞ±QQ“'Í\çPï;n:tì {Ö)tœe³¿BÇZÊLбWìy¨Ð½®¡Ð±î³&èô»{} Ó·X^Uèì#+A§½¶:ÖÓ¬Pèøó€F‚½¶÷z ÓûÉ¡üBÇ-rÚIС7¥7‡Ns¯tºõª$é¸=·L—u•Ô¡.­­D·ù¨Ó©S\Œ ¥Në½uzR,ÕÒ:³f¹ujQ™É:½L·Žu9âÖi}/ù¶;tŒ•Ç:ôV³Ÿ¥ÖmÎ4%ƺ͉qç »?–µd¸v›«x3+µÃé˜ýŽywèaâ ‹5y½‡»¥'­¿¹ãÁœañ$.w¬‹1åÜñªÛ¶¶rÇs[ŒD嵨7wKÕ¹[|­Ȱ¨‘ r†åù/«:w\5™õá;´n›_œ»IaȰ8û0f:w<”ËìrîJÎÝሠ{øàÂ;M#3{dz"Ãj-‘aY߉3¼N²‘a…aˆ6óõ(#{‡^/‘a_×0ï„)$sǯîâÜñ1ÖÙr†Õ^‹ Ë/--2,_/;gX®cÝžay;y,í°C€PÖ;iôȰ$vÉrì¸ñ4ú¼°ÃæDtÙŽÝæ¾F†ÝÜÖ£'ìð€;Õ>£ØQ°àرÞó$ìxNŠ¡Jì›Ø£Ò%a‡^?aYòju[Ÿøýë°=ÏY »‚3Xç‰É®p²é7Õr] §ÆÚ²wh ¦›îàá<ð^æœïäcsÙ§T>aNâÝécc”v’}…O„jéCñCsÛkØÃu[=’ô#EÇåËXŽ™Iÿ  õyX0A,»’Í{øÆº$æ=Ü’É'ß{ÞChi3r­¼tÓvë}x|:›½‚-~ÿÜ‘k?òžd+¾±¶ˆµ¤º„xJ޵XŽV#ÕâS‡¿FÚNæ¯áÈêdü!`£Eªµ€’S-CÍ4EõrOȹú1éO}釕j»Ä´ÇÕTT®~x}«]?öîcRõ{]CWc4±­ãü¡WZL{|˲í¦þéGÌC÷½j§OýCݯ ê~NêHþa!çŠi7óNr6íaAÿ{ÚLíF]öTâÓ6žXs±9ç¥WD}êXÛ,„oÛåbŸ·Gt5êܪ²ÖŸÿF°Ø]«‚Š‘¦ ²>k景ðóÕ†,…]wL}…Ó@?õ ùë×oÿüÛ·Ïÿùòéëÿ>ü­Ÿþñó‡_~ýöõó—}øé×úïûó/¿ÿóÓ·ÿ“^6-ÛìDþ+g©à"¤ó+?6®Ü(ºWAÁ‹óï­ªžéLAs^xªïIf’t_éúëï~üÇ_~úÃÏøÐ/þëC¿ùu<òsüÃÿ¿çþzèߔį㇟üô‡?þýSáß>?ò¿¿å¸òŽhji·Z…¿?!Çæ2†*¥ì(`Hc—FO ͬúS i¨ìt]]cÔR#娙x}©Ÿ¶g„Шò ^4ÔVÀAê1´¹€KG'ˆ­æ¯ì!!ç™HƒqÐãÉ0…© ïÔ¸»©Ýw¼ ,Í(L?c@zc¬!-õ ÚAH‘ƒöˆ3­wêÓ0¹Ýc·¸T¤-/8hÐUšxǬ1R»£üƒVÁLÞSh²:íM|Bm£TÂ% ©íÆ\è”@y¥6âú¡ûˆ±Ž žêÜâ%èG¨áC\¿{ZsÃÞ ÍSiR û0-®€Ô£VÍ×û;fòZaŒà€Þ('i’cVÜÐK‹hrb °Â&K›„Ã…ncjŒ>­2‹bŸytÏ^‹Žy£i;ó‚gã;Æh¹8ºönbËtÄ*thwÀš÷95-%S¬yÇxm36]Ï™c"Ù)G$\LÏ×€ŠÊÍŠ•SYJݶí3•Ú˜;ǰEaúÜñš§ÈØosG6Nz–jï˜Â«£¸2˜'Ê…–…œì›ô³ëI‚Ê1WÚXã&²\£&TF«²žäìšÆöPÒƒ¸ƒ<ÖÜú½Œ’µæÓ#Æ;JEPT¼"¾´Ic®¬µ80¬°Ú|0£Qã# 5í7êW/«‚<ò²Ò54ýum-`†©ÿo ÿòò@ ?¹1ŠË÷Å(äòq0jìIûQÔ׎L ŒB£!85öýâ(Bl$“£Æ{ªŽâ÷úpÔÂ_¾05^‡¥”­^,e¨ÌÃRö‰Æ`)t_õf©EÑ%KÉo¦ø0vÃë£_˜rÏz=0[x‘_0­à›Ù)*Ç|'LGoüÀ¡Ù˜jSÈ—”¢éhغêM›É:“¦Ðž(…³­ ¥ˆ­íž(¥.Ö¥ÐûAk¢t S£'J»ù$…ÄW׋¤ˆ¡w’šýÐR*öà_2F`¾ •à ¤ÔZ餈Á¥´)uä8JüKŒ24â¶F?3£”e £zñ‰Q>cÅ£³í¨b£&FõŸ‰QÎÀHŠrÝ,):ØÔó"y(Êä ]ûb”94ƒyÄèxþb´Fí]eZöCQȉn2)J×4ì¦(bæ¢LþÒD©­Ýµç°^ˆZÀ3!Jµ‹¡$UõÃPjóÃPè3^ ¥7㇠ÇX‹Ý&á(«{NƳ¶‹pŒµ=’p°€û´‰TuÖ/ßèçL¼Q² ñFÝC'ÞhhgÜÑÄiëðMº}ñ¦H‰79Ùê‰7jŽüâ1ÿÁ›ì­×ĵ‹n\7Kºi¿zÂVvÛÅ6„´¸m(ü•h£KݬÃ6ºPej M¦3C¡†²Ç;mtOS'´ÑA¶½’ntÖæE7'Õ¼'Ýè(_ïÇi=nÒv«Œ–t{=Û‹7½r÷‰tŒ%úBÑM¦tìo”«_tchï‘t“c ºÑ£Ö¸¹’nŒ ³¤½n " oÔt _¾1Vš%ß>so”=>-ù¦WO¾Q{x&ñ-Æì‹oŠÄ›ÞòTñÆÕͰYÉ7ì¾h'ßtœ'ñ²‰ÌßHh6ý囋´#ù¦¼ëíâ›R³í´›´6ø 8f¸÷„SD{#ÂI›]„S¬Ž$œôHÀ Au} 'RvD8éà¦G]~ ÇÜõéáSƒ„£ácE8ê]z±6ãE8j ¿¥WÇ_Æ1dÑüÇ=‚jñ%‚õ â%äøÈŒ,PE]û—rš5úÎr«N3 %Î1A¦÷‹sÌ#õÁ¹&ä®äœ²®ÝŽU™Ù,9G½û±¬ÐÅü¶¬ÌðÖ-A'²ìãYUåö¬ŠÅu+ÐIdžt"ÑÅ9ÍjdzJ—ãY©—ý§gm†ZóæœEοœ3VÈÁ¤EC}0‡4÷8ÄÀ*a/?˜ƒî¾.Ì¡xvôé9蘃¡æX”q“ sxÄ£ ÌQÛ¸0ÇY·ÌA‡ ÊA–1nÊìÜØ‡r¬ò6å gôw‡rXߌ )(Ç-‹V+(‡ô,Ñ?ÊRqû¡œá¤¢ÌY”û‡rlb<”«I0Q7æ¾(‡ØÛ|‰rÐË£+æZCRÖza±êm'æ Í÷LÌA·{É9ÄpÎ+9=ÊÓÀ‘sÐ`ظ8‡Ø®Ñ,ˆs­cÁJ}ÚëA>œcÌ¢…çÚëcÎQ÷8ßäcsÏä\£Ãж_œ£nÖ/Î1VŸ–™œûÌAÎQŽyaNo>ÆUO„Ãåb„_”Sìã\©W·¤÷cí~qŽûX¶'çtží`®b?ú¼1gÌIK̽¼}1gO#ôÅn RûÁt‹^-0‡töî7æp³ÍÖæ–§µ樃ûsö׋9Kט#ˆ¬_œã4eÎA×½ç¨cÊ‹s :ÃR&çÛ=+åj;AGý´Š :ÄڞǹR·ÕtÐuùå\jOÛΆ)=Ε¿—q;×ʲœé\9dG3&ÐIÛå\5ë1®”ý½@G݇_ c¬c\©G :~˜E{— ãzÍŽqÕžÕc\¡Gß·qE ÛÚtµs¡5AWYó"B]9¤ƒÝŽs…Æ•¹.Ò!ö4_J¡êØ¢uŒ+t›Õ.Ð!æ»­t™Õ=ž>4A‡Øý8WèÝgKÐU~â¸+b`ßq®Ð½x{AGÙH :Æüôs’õ8Wêuc!ô¯Ç¸Rï@£0G=­]˜clØ1®Ÿ9ˆ9ÊÑ]6½ZQþ+w ‰þþІq¡ Ù!BT$äºàß[U§çôtˆ›¼uÞ™~gºO?]Ú\õËe:ètNºŸÁUµ²ƒ+uÊ;¸rÌ4ÏàÊy,sW­§aJ¤c‡T®Ãtl$ÙP#]ƒtj»tæV¶fIÙAGÝ‹sŽÝ<Ë™[YÃvpÎ ,cçVi˱Î9í’9I›aN:íœF ;¶R·¹c«tø:¶ÆÊ¥šæX“‘5ÌQ¦œsÐ4‡+ÙÖPƒn½w‡uªwÆ¡#ÖqÔÉCŒ£.¦q±êö…8^‘͉ qÒaܧAGvÆEnלqÔÃ63ŽµÞ¢3Žc„ŒÈ8êjæÎÇ׫æ£Ä8M˜ù,1z*(Üå»Å8è\o™5r7ötgJ½³ Œq‹_B\ĕġv/1ºê”XŒƒî1–ƒq¨Íœ£3zä1qü~1Ϲj;³B¦±¼ÙuˆC ¤:â ñníB\¼ÒÇ q¬Msïb\¼ÌbôH–-r¬U;æ¹ÈMgŽ_£Ž¡c-ØQ(ÈÝÆ ,(KKäôÓ%9ätm`AÎîéäTËÃ!GÝrvÈñõÚhäPËct‡œ4%‡[dæy@.®UX‹oåÔx)”csŽØœrÐ)æ9ès?0Ç&¯©9æã„0'mÜwÌi£X’çŒ4Ý9'…v眆 Ñ9GftÎIÛç8ñµŸvµÎ_œt3aÛ¹A£8ÎÜŠõì=V'ñÔ-§ŠtXÿVÌÞ]¨C „Û¹m£'¿Pm¡ô†:îËæ±W˜…X¨£ƨ ut¬$ËýÂMŒ†BtªíDúw&G]çÑÖwn…Îî¨ãæ=9ê8g±%GÞ1 s.Ž:L_uçV­LnŽ:6HñŽ:öYa3ê&1¶sëä9O77é¼Ìñ us$X^¨ ÏBùD]ÀñŸvn…v& u 1ºQðyçVè–Zݬ €D=s+j³Ô[cDN+ÕY§ÒNÖ1µô[¥ãέÔÍŽ²ÍºH»skdÀ2>ë k¨'ëP+açÖÛb]dô8QÇ_.q£Ž—l;gwœ¹Uµ¼s+4ä[ù}gnå<¦±s+ד v‘n²'ûI:4R-ž[‰×»ƒŽm§Äs‰e8è÷´s+w±¢Ø t8Üf²{:¾(˜à £m ã6Qw.Ð 5uƒŽ$ +X.СT掭”cfçÜÐi_¾âÚsÖûº€˜ÚtGèiŠýžPhS>Y‡b„¯);l‡ª»h‡žÚžòÂöTÍÓ -Þ¡pâ  èÃ9âq{Š\‹y¸(Öœ“CÃÌyRµn÷è^ì_ÚïâØcA¼»s/ð(H=;øP€_»™<Œ›ÓŒùÈ‚ ×Xèã$†Ù»³$h}¶yÀ/À;ô·ÏCÓ¤·ÏÃm<òn>í››gÙ¸ÉfF{Q‹p7zòd·0‹ÙkcgÙg\‘~ S–ò޲„tØìKÂ[<£,V"§dqÖÕ‘}™T›'ú2÷ZëŽ>¤ÍðBŸ…’3É2È´Ú}W°YäcôÑ«ÞÈ—Á‘¶ËcâPù²Ö£äcm"ßm ’/3Xã8ú2{èæòxM·í öéc¡³µd;Oìƒ.¢Çb^§ô^öa"5Áe±šËÁ™ËÃŒäXN—*åoéòDá´]ž0¦zÀ­Ù4K ~Ð3Õ>œ~@pÄtÅèòl4_ü#qVòÿ¨G°lç ¶jÉ (ÏD@êÙÛáõpŸh8Yil·èÊL_aðù‹Ï/?üþøáŸo>yø¥'?>}xþêñó‡<àÁõ÷ú‹$>¼Å‡öðäéÃëßðé_•Z_òߟ~_¸îkX3¶ óù÷ªTž¢p F]¸¡q¢SF ¤ËB@ãJÖX5lJµ7$—ZmÇc5ûØ`ªµu Ïjôd–n¦£¬¹m&CÖ3™}>3†–Î.ðúo]ƒ¨£ endstream endobj 51 0 obj <>stream H‰t—ͪ®· …¯ ÷°'…ÊŽ-Éí¨I(”N é¼’ÐhOC8“Ü}×’^ËŸl6KŸ-¿–¥ÇÖ÷¿ûý?ûz¯­Ú›®÷Õëz£®ª®KW×e.êÙJû>攵*mC1—c¤S¶Ù\>)m–¶gÈP÷"S„cÌÌÇ”>ÜC¯z¾/í9g–°9+ǬÑ;µvÓ·QÞEЏ.møØtF›tÓ‹QZÅPÈÑÕ§`uÙS–iŒYcê{íÅ—1Åv UÍ]¶RcJ}o­»›†Oäcì §ŽEÝEÜÅjUöœ!ÃcV¤Ǭ²†ésö)ÏÁñ4ª¢} b·Nm%‚èË?sLŠg3u·VÍÏ›2×¾[è)=çÌê‡3fŽiÍ|i2]«ºFlsNø·ò^ÛÚ>¨ƒº/¡®]j®cCi“ñ|˨>Þsµ­³Ž\‚©¯%±Lws ßž®Ú߬¾#sÏ)µÚ†b,´5¥^¹·øÙëÉÑáCf‰´©Š(ÒE¢ÀÎ+uײNzšûA¤9d"-)­ãP˜Ñ­ûÏV†ì)m4·é,+ªÿ¡eêSÕu…³=ÇŒ;ìÓb #‚1*¾Ž5ð ¿yæ¨úç–¢±ŽJ躼BMT#j>ã/øûêÏ¿|þöã÷Ÿ?þ÷Ó‡_~}û#L_üíË·¯¾ûüËÇOÿzû⻟>üüã×ÿþñÓÿðù§üúó_¾ýƒ¾þ¿ƒþúm ùþø]ç˜ÏºòöŸÇ´šçÍâÙSOäum.›˜Ÿw«OD*sÁÓ„gBi(Bʹ\·9|ÊÍ)YÊ4g8ÙâiäÉßKhí¨´obŽêr?ÊœàœåZ•çK©ž¼žmÏ2¶Ê8,…nÆ`i ì\,­™d)ó§iÂ_V{½aŠ?ˆ˜2f&¦5°sÁTÞ«aç SNm+aÚYó«_0… 4¦ÐIJÒ´+®iMaÃ7¤)tK”Bô¡ó¥0ÍÕZ¢”ºà6J¡×ƒÖDi7ì³[¢Zl%I!ñÕòJR˜P‹+I =Ê)% ï)mmÍ©ë¸Á¤Ô¾ÑÂ6¥j‚”zYr”rè…Qšºjbt{Ø¥.³_õ•{OŒrLEjlŒúœU_1ê¦.‰Q_¦Ä(]>¼Øe[­IQ„-ëIQ&Gëza”I4‚yŽÑ¾¾1ʤÃUza”‰iIQ¨Ñæ¡(VÃù߭ކ„(³¿è(uÕ¢5+!Jn¢¤Þ %«¤†RDzÁPèþ¸< m†×rï…p4iÄÚ G-­mÂA–%zŽ6]}®¡fòJ†\|ƒ ç˜x£”YoÔ:ñÖX‹qA;Þ8Fçá›k½ðæ¦ÒoÐðÐoÔdË+Þh#ò7Þè£4Ùx£lý¢÷×´&Ý<^–pƒ”U/¶ÁÄÝm´AöÖf¢­± —]hk è#ÑíɳÑm&v¡ ¶ýªs´AO]3éÖ:B¥ã•n0‰6KºAo {Ñ@ëóÄMºÁfŒæ¦t›óà z”ë n‘tkÉ×WâzÚE7šÖêI7×:“nÐUâæJºÑÆìÚtƒÆ#b%Þ¨«¬‹o´­É·ícóÚ¦]|óµ{K¾Q·bÉ·˜³^ù榞xóU¢ÄoÜcöÊ7­¯x{9ßü4ƒMÎ7fÈêrñ ™„ÇfK¾5'mO¾yæ™^|óäÔµÙjë 8hÕ¶.À1Å›­$œW@©I8׿$œÛ¤'á\÷œCHæE8g•hÎuÕ$uyxgHOæ {èƒ9fC\£9~°ƒ¹ç“.ÌÑïªsÐÑÆå Kï7åð™+ê/(Ç*ôpÊ1ãyw(‡>ð Ê1dÑAåpôì.ÊU¦{;”C– Óƒ9–ãýœSa•É¡œ‚‘rÐÖ#Ã’r°í×—Sz¶È(Çœ**9À¼1“´È ÇtmÏ…ÇÚÖ{É9ØLž ç {yøîŸ¤„XåLKž^—œSC°•Î9}ZWÎÑV§$çôic6ç¨-Î79GÛX#9§ì°Ä’sÔ~Î/œ£MêHÎm›sÔ‘‰9_ú4®>"š§\Ìh¯”sÓKçJ=­&å¹ìâãXâ•äœóãÔƒ9AÖyŒ«§SÊHÇ iÞ é˜I½ãZŒÁ:K¼rûV&g-²AGé®Ï8Çtžõö­Œe‘àœ‘eßjÚ œ³29˜3Yk`ÎHôª³iÒ±­Ô¤ÔÆœéôÚ¶æ†ö¦Í'æ².vaŽºHÙ˜ƒt ä?@BR{ï9êÒ.Æ!„>¬ã¨K›Á8êê:—YŽ=ÇGD5gÚÛÌ@œM;$—Y®©㨇M0ޱîµgŒãÉGÙvë¿Ç.tãlÃÜ;ã 'm“qYÑŒŒƒ–öð¬™ÅØËÅ8Äz¯5½ùEÄåb§|!±ÝyYÂ@7^›qÐÈôúdBS$ã ‡ŒŒãï‹yÁ¸<ÐyÏ Y†j üOÄ!¤©µ@4–¦¸¼ÌÇqŒÍ^ƒqy˜Í8èQÜŸäk~Íä2Ï k@Ž:'½ ÇXJ3 ·çØ£®Z.ÈÙ»k ÈÙ3îp r>¦?!g!9j Èqy:ô‚b2¼G2ÈÙy–cŠL™äÓìL2ÈåÍÛE9K½’/Ê1=GÖM9È’å`:‰ô sÌòV40gdé30gzŒ sV)îdsŽšœ3%½8g󤜣N3çL¯9ç ­õ«C¨‹ÔàÜ`3“¢ìÇí[’µûõGÒAæ¾|*I‡ÊÀîÔ uˆ¡Ë?¾Õ¤­—@ôö¤:¥ÛŠGújû uÔIó…:N;<¯ u,Zëwê KÓuÝÐ_u%Ñ÷BÂܾ•µÏߨ㞡uHOT~¾PŽäÑŽoEå0¨ã£Ý¹¨›t%Eu“;¾uòÆœw77Ùz­Ž¨›¬¢z|kÆnµ,êX¬åøVè eG`5¢u<79¾Z‹¶Ã:œ}m—oEhÖv|kFŽÚëÌ€èÍ:V@?¾Õt>¾•Zý*;¬Ël`oÍ4XÎGgtKífb5ߺçÖ±ZõF_í6ÈQÇGN;ç#.ßšWÉéðÒ$Ç·ò÷4nßÊ},ãøVgñöÆH‡ é7éxLõøVòµç câÑòа&ÓJ™ù"Q¸Ž>nbšŽKcܱ¿ü¸¡}æÓç¡ÌP”§Ïc I¿û<ÑãeóƒlÖèÛ<ˆ«Ñ³¦ìaf±:Ž—ý­Ø~<½,º‚"ÇÊ’Òé°?…ù¶²Xƒ”ãd±ém”@ŸkóBŸ`¯ØölôÁƒ ÏŽ“uOr;Yúu‚ú–¯Ùä£õ±•>È'è‚F:]²É‡ßÇtäc,-Ã@òí96ù„–Ä=g ±$.Ït/ cŸqnö1T¼öŒ}ÐÕè±Ø'¬ŠÞ.ö êÑåñ0Wç]vD¼ôO—*ɲ·Öå…Ëéò°Ê\Ú?|‚.î~³´>‚~¨ë\†÷V?¬Cœæ‹\ë2žÆ?ê‘j¿˜üÔJÐä83RÏ®w¯‡Qü¤d`”qº½ÄN Îò ƒ_}óéów~üüá_ß}úòò;„ÞüñíËWßþôáãß_Þ|ÿó»_ßû÷úó»Ï?ÿå˯ïß¾ü†}ó_úÃwþÈ×ø‡ÿÿÊÏ{ßìß_LâŸð‡¾¼yûòÃßð׿-ü§õ#ÿû%Æ¥=N‘üÌsÁ~¢|þ¹B]bl¡®¬_”–n:Ó¤ ®ë郘(]ÒgâΦ¶ψÚ&f)®!yv%$u¥[B¥cWMëÒ8éßÛ*mÙ>ÊûÇ‚S)K³5mŠz¿Ï2–¦}TÆÅMmÕEü è;b!@}f,‘|†½ ²_ŠOÑÉ6d:Sa A!NÆ´ÌéûU홊 w‘Ið(ÞîY,ó*V²¦5yÁt^Tì°ð¸‰¼ýE Ã2øŒí8oHl#$`nCúlsñ Õ…ã}éÖ¸ùkØ)CÄؔ0Œ«1G=6µy&òžŽüTvÒ«ô1‹²Æt»X2[>2QO&¦íØË2lµBFÛœ[,Û$~ÎH»±«º&ßđΘZ¸dÄf¶y+«•‡ÃÞ‹Ú–‹÷á"1#û³Ô¡[ìÌ15Ý$sïÓŠØÕÆì9l~jõܳfb¿‡ó³ø#à—%¯Ä{ÝI{ˆª~ô׬:ƒ_²-á2Y‡s]éÜJ6 RyßÙ6v÷_àv6Nö«ÕÊÂCaŒÅÐÙÓp1Có¢˜l±ðTc;éÉMlt²gÀR«îAŽ3¥›Úï½Õ¹Ç´Þ<ƃµ*HFc¾élºÉA€˜°ß[ ± ±ÖÇ@$¾Zd!¼røH[c¤¸VÜÔEĆ|ú¿¡üíÿ eEô!7J³c 4³GЃRèVêÒÌ˺”B×”JQ £×›¥ˆY±YšyWÉa)~OKo–æå/7P³µ ÁSJ)7OKýð”Í"Q°yš½'¼xš½ ž'ÌØ T|YÖ|• 9@宜¨Ù»Â ¨xeÍùŸ˜¹ñ ¨Ê²ŸzUY›L·TèMK#ªbÃÑk^DU6•8¸MTè8…Ð.㩲„Z œR§,Sè¹ð8U”¦jÝ8…,uM!ñÕå¢)b¨Ç4…¶¶uÁ”’–ë SÆÚSÓ~‹L©m¥˜"¯"SjO!c)¥#0PÊú•k(}Ì`•OÍE=QjoVÝ(å#9µ@© ñ:Pj1^Z ¥ö‡‘¡”S.hl’r3ÆIªlíy—,’29šÊ…R&Q×(Õ õR&]m7J™˜õ²·qHJï¤ù&)b¹2û“Rg¹Aš×a-fOÈ)1$7GI«ÒG©ý­ÎQhõ/Ž6¬=rQŽ1ñÝ6ÊQ—Ö‚rÐi¹(ǘL Ê5ìÙi©J/ãã‡lÄQqÔué…¸Æzô{ÚÇGdÆ™– qJˆƒÆ -G=ü-8ƺÃÕÇ9R+8ê¦Ḿ&9g;V7à ÊÌß²Å-¼Ajk#ðÖXˆ³^xk Ÿ£=ðmiã ºÖR/¼!æÍÝÂô9‚pMÑ~H¿‡X‘VÿCv½eIŽƒ@ÝÑÞûߨD€ Iõ_iWÊÒ5„pÈA1Or½n‡Úh«Â!brMâw«ý"Jxõìnn?éqÌgáXºw…p–û áEýõ±¶DB8dt7ˆc½Å8ÖZ—0îçfó8£g÷^ó3Žq¶ÆùWn1Îj+ˆ³»¼CFâøë¶O\am]ö`nœ=MúôŒã¹TóÇ8ì$¬Õ ãæðýŒ³7z1Î6§‘†òïr 9äÞ½ ä¸ÇùïO9;Þå˜r–EŠrVÓõ)gqr¦ž¢œiåò˜r–¥‡rÌí)ø«ÜÀþœ{åX{²)Ǽ|¦5嘻·ë¡j}ŸÊ1‹KlÎ!ëZ«8Çšø`Ð!ËÚ3 c>/?西E :~d{#fÐYÖQ¤³ËzÃgÒ1wÓ'³îQ¤cMöé˜Ç˜!óõæ.¨ãÏ1Au¶l=¬C\ÝgºÀµ£­‡vÈ÷råŸvƒ‡òœ¢jÜvˆd†2^š»`‡š·^»q°JW;äÎócJsÖ!ÛÞû¬C^Ͼ°µ=ÜZ‡xõµo´n\œç= v¨éØØ!÷³4°ßó£kÞ¾v㛓vÌËgØÀµÙ¼³²“ü»vÌSµ`ÇÚð¢a÷s ÃŽ÷9ûììÞó|ØÙGîì,ûû3°³Ú¡Ýƹ0íøÿ8¹E;®$ÚÓÎ'¹Úq‡ô9‹vÜIsÞÐn|î>ílçõ]´³ÝÙ5´cv‡ ;nè={Á5; 쌗;;;mì¬&÷Ã΢_Övœi¤Z´³ËÊí,·Ú1¿dÑ®c‡^Ÿ(C;ÔŽŒœ\™ÛØ¡¿óúÅÐŽ59'´C^ójhÇÜV\Q›óuîÔŽ¹íœ\™u—ɵó\žœ\ùñžÌ´³¬utµËÞÚ!ã€íÐŽyùmB;ÖæÎÑ•ùŒÚñšÝû¼ÐŽ?±kŽ®¶l=FWÄ»[]ûÄ^ó.úòmØuÊS'WÔöôéÖ´C¾Ksr/ÏUµk¯ û´kX¥›ØáRWoÕÊYËñi×ÒeÓõó;ÁÙ›1º"êò8vÂWgWÔæY9»"o]’Øqñ%Lì8­œ^-k¯ƒŸõ—Yj‡Úh9¼ŽY]R;^K¥j‡ÚÑ_®áÚñÑï:¾Ú½çíø‘»R;‰¹%µcmæøj·9¾òçÍj×·Åôj³ï°Ždó1üXÇtgN¯ÝØ=aí»^§WÛ›]Â:æ;r|En2ëøÊ=Þ‡v¦ËÍùÕŽD«ó«Õä|ØYôõð×+1ªÖÙU%çWË-çWæ#ÿίvÊÖ®Ö¡özZ·NØÖ$uˆâuR‡}>$u8 ÷̤yÌS©Ãñ¹þ¦pêšï€ y½üQÇSéoS§™Þ”9u̲*u¼ì•¤Ù§—±­U¥£ë¦t<è}§tÈÛû¼”¿Ðý¤ã¢é éäÝýW:ü×½3¥ÃW÷èIOdmëøÝ©)†b&bµ[¤ãbYö¤ãI³÷Å£ŽëßU u|ÖouŒ:>ÇywPÇ­ñè ë¸;uœÏ:îïö9Zgû­bÏ–úÜkÖñì-çÒ¬ëß<òckâ £Y׿™æYÇ<ü‡u¬mo±|&â´¥#¬cî2Šu¬©¿ͺŸk˜u̾;ƒ:»u ±ö_o“ο0‹tVû™b (Ǥ3Ïî(Öq!ÛŸuö8{R‡Ÿ$cWê¸o§$uŸ¹uÜxz+ux 5Ir÷žÍ©ÃcœcVê°vI7öÙIó]•:yëQ'o„ê9IØŸük/ÓnZ‡lGÙ/Y¬S\sûtÖ±vGN±Ì§ßÀŽùõŒòaìœb™û2~}bYë¯'vȘPsŠåÿ·U¦Xå¹Ü9Åò+×{2ÃβÔ)Ö.›C,ãl7°c~—ÀN?¢vÌ«¯ÀŽ™ŒQ°ã/É!ÖVMcˆE\ãÖ!5¬ëì{O†vÊ#¹«v¨îƒ®i‡¼ÞTkÚ!ãÕyŠv¨Yö°Óé¿ôùo•‚jóöØ!‡Ëçïñ±+œ“…6áìp¹ÏŸùUx·çPÛ{ŒpùfÌɆÚM s¨yöœCžö²xÎ!ãv£8‡Úí]Â9doŸsüÿç^8'X̯Hz^GæAØ)Ì¡¶ÚœÁ2~Û æä›D~˜cíz¯hÎÉ7Í<çúœб6ý]gÐ ç,Y³´U c­ùûРû¹†AÇ<–èìÞC?èì#n®Aç_Ù:«õÐ1/·Â ãÏ[Þt¨õsö=O6å:n‘Ûoµ%£tò™û¤³­§R¤ãö<²B:d•žÔ!·Þw¡ŽÛ|ê ê §Â¨³|N¡ÎNŠOµ´Î­ÙaYÔV±Î.Ó$¬cnWÂ:Ë~Ébv蜻¶u¨yÏý¬;ìiZ¶u‡ã©3ì [fh‡,ÛgVÓ§c oó‚;ÔÐñç ‹µæÖàùP?îx0Wްø„7;ææLw¼êyc- Ïms;dl«Êݶ€w›o¸3,2f‚:Ãòü7o ;®š,ý¸ÃÕã LpwÐ)œ™3,?ŒYÁåv»‚»Ë EWpwIYΰ—/Î[»ºËÌ;?#ëb•ž˜Î]Ö—^¹kè4gXäÙ¸khÛ_—Ü5B3,âÒ5Ó;ÜnÌ:âvÇÌV„x¦w6¬êWkç kYr†e^þ>Kï„7gXá°%3½CžmVïP-gØŸk¸w\ŠU¹ã­‡wüD¶uþ…:ÃZ­ç Ë›¶ž3,ÿ¿:Ãr!mBtíø8µíÐ;UíŽ/͇‰Ý²;n<}~°ÃæÄèr»Ã7¼æ {ø}( ìð†»êß±¿º€…ÀŽù¬[°ã9iŽ*±3lfbGŒÚ›1?ìP7GXÆs{Xwì?þ±ÛóN‘]°k8ƒºnvvÍð;w]£öê]ã;Ûðp&No²(àïö?3ÈkfŽÛmæ¡ÐðÞ9^ãsç~úQç#††{ø øx™{ÿÈÇâöo™|8ÂìÄGÐÇÂlýûßêÓ‡á‡ú¶Ÿf×íz¥èGšýŽÇ—±]7“þƒµïº@€3·_Éû=œXÝ’ýNéâ›ï·ßÃÐÒWε’ºyÇíiÏá·á³Þìg°Åú­“sí|&ÿ“^.-›ÝFþ+ßr ÁÖ­uIV6Þ„,pB¼5ö›$c& ÿûTUë´^ÙÁfª_Iç©ûQ× Àâ [KT§Ã?ü æÛÖbµZÂÕâÆ³Y•źnüUnE?ä<í¸Z7(·«¥©éŽQáï19›~ôAúÔú±Úf:ÝÝ— ²é‡ßçrôcl_“¢ßË¢_¥5ñÔ ü!–êéö8dxºy?Á)ÎÃàcÅ«Oüƒn› â>§aÿ0´Óíñ0w'çÝ6¤²ü_»=œRÝVWÝžH\N·‡ÍÊîÆ€H†¾Ñ+B¯Â {È$-Ó›¬@ ²²>DIíBÅ@ê™Ü哟Zy((9ÒDAê5úÝóaßhPE>$LìÚ*¿BágŸÿôñ˾ýøÃ¿>|óÓÏo¿EèÝ>yûì«?ýðáooï¾úþ›ßñ÷¾ûÓ7¿ÿóÏ?¾ÿäí7ôùôû/}Èïðÿÿ…/øzèÏ×?KâßáýíÝ'o_ÿÿú·ÂÜ?ò¿¿Ç¼ôÌëhjiÅF¨Òî!ë¼p©~£fÁP£) ¶¶!€XíÈvÄ{jf8õ¬šÃÌ£Ìó™‘‘ ¡Û3ŽàMCyJÔÝ5L›ï.r¸´OÙ‚ñW6‘“¸”Æ5­&õyó1Ô´Þ L«Ò)ùÒÔ’ÖZ|XŸk<}Ž•! \Ž$ 5®³øT"–az÷îÛÅoEŽv\ˆÐ`©´rtÏ™Écºb 5®=0o*´Ye7ó¸ µ€{x)Hí5.Ä~ /Òì^÷ ÝFŒ±N‡ú6=@”‚5LzÙ~JFÒµNa ÝzÖ‡©9¼}ŠÖèm×>bƒ— ?ÇÉ1 Ť1hiÞHY¦üêû9€ ‹W A£ 4‡w dKÍ÷ØÎ”V’ŽR §ÎMç¢4œÔcÄ”™uº¨Sã3§]ñÆÔô“̆¾Ö3ÇJÕQîeá/ÖwÎYoñ”6”S5À¥¬Å ï9CYÍ‹ó™Ó»gþªÝŸâõ‡¦«¼|X“mßÜGvW¥£\“ö9s¡;6ž9ÐügÕN¢»²Š‘+·2y5 ¥2µÈiÙ´Œ¦R×®9ª6¦²uýžÙì9†Þ€15DJÿ¤º]¼\¤³4 éïÇ…/dè„ÑŽLf“T}v›&N9t:»)é"þoI—ZdHÞÿÆ_ü¯0î(ô&7B³÷GPhäÌA(´•v#åµë¢ŒÙšQi§ J­/=íL‹\¢Ôž;Ê;J‡_ ”¡î—¬ú²ÂÐkMöë¯Õc{„rLNÕœ•/„*ÖK TO±ízúEPî¡åílæy…l‚25¸S¯eö çÚ˜?e²ñ}E(²‚BdZ”n©ç› ˆe;eÚ§zJë мêhÞfë(ùS/~’RÅ?©³~f_é—ü4$Pžå¢cÕw[t£.fA7è´J½èÆX]=èfÈÓÓR•Q^Ù†›êm”ì¾´Q7×6c5úM´qH‡mÒõB›B©Ú ±€Ú¨çÌÚï7Ú¸F²h£¶~‘Ÿg5Ù´a-ÀÉ÷{åBúº5ãûÙ ¬ë…è•mØå©c ²ÌÝkÆ=÷çÖ{š9a zÖ5ƒl†lÌu\d3&µµ ô_• tÝ]mÍv­¬@u.ëbc©æ`ÛËCïÓ.¶éÁÝ‚mÔæ6Iló9ëb›b=Ц‡xq mü¶áÎ*؆ë‹=×f›ÓÁ$¶1?qùÂ6¤šL{Øf¢l¶)ãZ½Ø¦¤¬+àmÙzÀ ºV[ܘÛÖVÐM©ï]è&óE7ÅJºI÷€›ðSæ+ÝD)'Žè&íÌݨ“Óï¢[Ã×Ú°‹nŒ©1Þt£îî]E7êêíyÐ ±:üE7êìß Kïý•o eïú8èÜýU8êé:×X”~}p2¼ñà¤K»§e½Áá¨kžA8ê2ÚE8ÆòA8êÖ,G½¼™ Äñs–·NBœv­ÆA÷ê¦5 ‡Ø,©å ×²”k¬I™G>>åÆlÈAÀ9h\“ã‚bO«%ȵ‰^% ]­^ŒCÈFÁ8è6“ã ûf^0±Ñ¬ã WÙí×6Ú9ÄJ9 ]g/äÚcg^(ǘJk#Ú£înVÈ!d)Y@Žzxw/ÈQ[)äk~ r/k ¯9æ9=Øf@NcÜÈrÒÛ•U±<rÒ¾!‚œ(t1N«æãS¥Óñ©Ô3ÿÚ§ÖŒlïãfbêaÆeö1qÙ;郸̪Ìq‰ ²ƒ8èfóBjgyƒîˆƒnþ&Ž8èîú Ž5éר‡!æM˜#Ž:÷q\våƒ8h÷N8ÈÔûM¸„½ëëŽU^Ç!ôð¾î8¼rÂeM *ŸðJ¸ŒÄ[v—‘¬­ı £«f„9° W½H8hÜ•ë"bOÓ%ÂAOÝqb5¼"±buâ ‘Ú#]7ò‚qˆµÒf0º§Ý¸‘qÐàW¿‡Ø*Ûà’qµ}šºs’Œ«óxacÙûv1®>îe3ŽºùÙ>Œch¬Œ«´UÞê‹qÔäØ+ã+~ Šq/k ±>.Äé¹Ç¬j„›ÎgØE8Å^Ü*õl9Çݘ«]Œã.¦eÁ8f=ˆ+Ø6nÄ!ƒªóHˆ{Xû Ž ÷Ò˧翚ˆâoå·„ÄH§ÿ«+Ðq¡‰Ý BT4¼{Ï9Ó;½…˜˜ àz '&¬Û¬âoìk=Ï"³­æ€ß×FPŽËQÆ:åø{ŸD9nKýM9îÓý9ã_F?˱¯„s:ÜÃÏÀ Ýö½XÉǽâ’kn0„½B¢­{˜Ý[ž=ì€{RÇž[‘Û½Ò¾Èènì=vfS†GŸz¨Ç%Ïtº;Ú,ÑdS¿Ïå:¨ÇؾE½×ƒëjLá {ˆ¥òêîøÌðJ÷4Æ9Üc,{Õ‰{ÐUäØÜÃÇT9¿÷°}¼º;žåîܼ»ÃGrÅWw"·´êîDà|º;$œåvIÙµI|Ð+·1ƒ|À¯å¹ìBò»8É7ûH›í6Å>ê™ÜÎü’ŸYú‰>Î2ÑZõÂqE3ÈÀÌóty‰Ç]Wþ ?ùô»ïýÍßóÏo?ÿ@è£ß~üá“?|ÿÝ7ßþõÃGøúó}õÙß¿úöËßþý×üá__}üág|èÓÿúÐo~íüÿáß?q°pý÷—$ñÇ—ø£øèãù3þú·Â¿Û?òŸ¿Å¸ôŒëheŠ ã;Òº\J"È©+]Ws‰F@ŽŒIõ…)=É¥^”jØÿ™Q3íø+Kk@{ŒW156œZ× ußm¾ö¶K–ê‹p» ƒâºhº„¢‹W4Ó¢L;[Ž ”NS~'ËãM†ÕÅgðíKö·òm´/¸Až¨CÍRè¾´[UÏÙÝ 7­É˜1%;·µÐÇ+ý U0ƒT’¯(uS±²Ü”„€ÖŽc$ ®!u¥ü ÑU„˜.²¡ŽÍ_3цAÃyhÊV~µÖ5MÏœåÞÍ ^jÄ5ÅZ›ˆ ¥NtT>³ûRh”Ù‡‘žòÔŽ$¦šÆ+쮸K<èÒ‡ÆÀkuêšê6ŠgLÍüdÄfӼժݵ>g—k1Ó=©*ºµª÷̉ù©i"™#8ÚgLËE¹–xoƃ ñîž{™=Óóž:T#”¯üRúæ£÷´×Þ½*Õkv™±£á–,pe¸Ò|ƨ$¸ u¢jù‘¶¸Z™ÕÖií$`«ž7V¸‹˜¢yU ­ŒºÓ‰D~V̓æ#`®†´äņ2ÖÏ•üÛCÚhÃãeÄ1_Ú¤Q9Ql~`è%Ñ[lÐLiö<QñhHŠ_=¸*Znb›(]£{“Î¥8ÏòÿäÏþW$wó#yƒ!¹«¤Ð“ækƒ²åzƒõµÉ˜}‡q ç¾G[{™V.ã+«?Œk¨‚Ó*Rå‘/Â!6ÇÀQ²G]·~×X~G p|¦ÌC8érN¡ÔpИ¡à¨ç´ pŒ úpœ#µü²ë-Ëm†è–ô ^ûßXP¦ÂéWÙDÛÒ5ñÇrÌä¯oô¾é~Yð†²štCKWwqC‰¸»·Ácx,á6 µU/n¨Û¾Ã!qCmÖ,á6FLvÂmð÷ÎßÄ©}ýú6˜Ý†…o¨ÃažšAîèûù6¾Lx}h?àP¯’gE´ðâYáÛÀ²y8ÖÛ’ol3Ã7Õ}‡o¨kó—WøÆÞ¬5|CAâp¬k;I8öŠg! k\áXó÷~…Óoϱž$œçü §Ö àô+÷Œ8^nÚp¸ióøü¥ªÇI®pÜ"g¶$¶Î Y;C8m=ëI8íNÏ$å¨cq¨{÷(ˆãvÂ8RÃ8ÕŽs§^›aœêÄI¡¶“qªõ0NµÓ)ãX—kàq† :Öø5Ž­;"Ë8ÖÓó,cÙëLơח?DDzžÊ¡nÓßr¡{Õç1‡ºÎ5‚9ÖûÖsÆCéoP1ÇϬ݂9Õ>b†sZׇ=9Ǻ×αnË’sìU?‚rŽµÙøœcy|® èx9—OA§›ÖŸt¨g÷Ô^éaêsF ëŒGrïdzVgP‡òcLÔ¡Æ s%êÐûæ.QgÜE§u¨ûè¿Ò¡3–­µ>ùI‡z^ùB:ô–¹þ’õiwt£t†“h~Ÿƒ:ôš­Ô¡î{¶ Î¾tóc{Δ¨³/ ]êXëb¨Co”2‚:Ö«· Ž5d¢Ž=k#¨‹5.uü½v¢N¿=vP§Ïxºuª=šŒŸ¯ìaa~ÆNXÇÿDZMÖñNv’dž'µ¿Öq‹ô1’uÜJÃa’uö©{­ÓÖë+Y§íÙÛgK_UÔqC¯Ñuèc-¨.gu:ÅuêÕÔ©öue4j-Y§uë ëT—Ö±6_ó×ºŽ‹=Ë~­CkW{™•u±õYÇohPü±Ž½º÷gÊ9|ô’u¬ËÌ™½1îÈNëX—õ2+ë¶rfí<•ûeV~¦úØ'ëT·Zµ®O—²5Ž× ëXÏÕ“uìép­c½Í>ë¸d÷/¬ã%ööB«nZ¡õY%‡Ö~À°÷dj¼)ƒºÎ#¹sfEo ϵ²5^á/³Zá‹sfëJÌ`n]Á]:º‚1¡d]ÁI³ù¬+eY‡ÿߨ«Ø?ã…VÔmú¨ìÔU0¶rjEoìùR+êÕf}Ô1‚ø=|Ô1¦ì[U·[Qï⯲gzV^l5,÷Ñ­«|ô5[‡Þn/¸ÆŸu•kåàªßöÔéÖñ3žrܺ©eü|… „uü{Á•—7²t¸‘«¼Üª§I¥®tÜ!kX’Ž;錗[»ÐÝ!6^ϹU›³×O:–Ç^píü¹‘ƒ+÷x·ÔÉ–ó’«ÎDÉÉU½ºƒ:Õ£uÂ(K§eëK®ªËK®¬wý/¹öŠ'7W’­;ͺt•3M@Wù'í ¶ùðG(èpÎ:Ôæo»ÏñQÝ¡Cms=èPÏ[t<“þ&uèð™±ìAÇÚçÍ×=õA‡Ú³Œ;‡’‡*9Wp~Ý9žó¾Â9”ËG¼ç®ðòéÎñ–yŒrç°=~«ÀèŒç\Å6³þ ãyÌ#]oØñ£=çZ&çPã­y’sè}˜œC½õ¶¸ÐõŽ¡µ_èÐj<t¨ë8+ CÝ/|!zÖl‡t¨g¹C¥C Åf’=ÜóÒuÃw]KI׿ ò#{Õ‡EI׿0s¥cmþ€C:öÖY!]gÎjÒ±îÕ’t쵺BºXãJÇÚ·g@§Ÿ~ñUŸð¤#çüã×9µ~ò+ëm5œã ÙÇ’t¼‘Å'%I§çÙt ÷ÃV†;©»JÝ'î]uàtx •fÊîóšC‡ =ldèðrãy èHË^:Ögfèê}\tõæ§:ZT-KÇuÊyÒ¡nç<éXûš¿Ò5ìÐ5ç¯tl{ù•õî磎¥†ÅêÐëgE~eÙ}öu¨Û9¿²×ïäNêP#š¾üÊÿ/3çׯS¹^~åwŽÏ}¢NuÍùUë¾øÊr”Ô±¶9uìIÿKëÙçGÿ²ê^PÇ+®õÅWݳöâ+êi'ÇWôp[-¨kØ×ÕZP×x W¶=ëqeêyó¬¬C׿NÖ¡w'0Q×nÒ~ñu_­þR‡Ö8}um<”y|PÏ;Œuè-ÚKêc>+‹ºÆþÌù=è÷ò+j+£u¬ÍïbPÇÞx3Êöò+ë¡Ck:ÖÇqt¬Wí :öf}ñ5ָбæ‰ÿ•N?íÙSÔé3tDê•â«Zöâ+ëÖ_|å’íäøÊiçÅW=O:u­ã6“uÜJË^|mR8¨ÓÎk9½rwZëu,=ú麹ŸåôÊŸâ'hÙ/½ªv£C:“J³€Nýé´Lyá•õÊ :Ö­·:”NZ0ÇN÷'Hæx<ÖZÁœŽËHÊñP-ŸÑ¥ë6N(§CwëO9žm_UÈéÜÎÈ©öQ3Ó²»‡rßñÿ”ÓY÷Sʱ·üðI9®Qn:jþ³Ãç»PŽxñ”rºa ¤=PVøQŽÿ·ö åøÝñ“\¹þY-)§?É,”ãe¸`~Öq'¬Ô„ïÖ¾¤™^W9>€ZíW9>æÞk(§Ç¸O(Çÿ¿ê…rܘå%Wnå}ç·â³Û 9ª2F ÇCg¥«_ùA޽ãs¢”«_Œ¹Êñ7O©Á{cŸ`®2aÕ̱®e&æØ+ås±ÆeN^Ì–˜Óo[ æô9bο³~™S«ï`Žõì=˜ãåÍ=sTcûœ$æô@9‘_æxé§ŸÄoOu•Ä\ýĽÎiﵚœãcÙu~Ρlµ?èø${_ :nˆÑf@'ZÖ èTï ÓQñ<+éÜšÒùñ˜I:­SjHǺøS’tª}Í_é°â+tü‘îW%é6š#Ýæ¨¸szÅ'×ò7 ­ã—§UY‡/úNüÁŽOÓ~Ò+>:Çjê/™v<–ó…W|dÝÙ_ر.³&ì¸ì¾–†‘fž‹jÜõŒÝþ-°[|¹­H¯ºî‘Ó+OY-°ã=«³v|Ø{Ö„6MÝã¥Wì33;Éårv‡Ñ¤ÍÀî²—^_š'Ot‡ã—O}Âîà.]/»‚»U{®`h/½¢–…]ÁÈ~ ì ö|éõl>+»vÇyäôŠÞ±ñÒk­Ü„ãi§2³vŒ.ë¥WÕõ¥WÖÓßfO»Ê)ö¥×ʘåBºv¨‡»ÿ´CÏÊK¯±Æ§]eÉØñ§={:vüÈéü)½ªÕ_zåêÍÿY‡ÿ/;§WÞȶ_zåólüC¯uØ"0([‡­4ì¥Wþ³ê ê¸ó”{~¨ÃîDpÙu›/øöÒ+6ôR"û¡‚æ_u´eùËEÔ±Þó$êxPŠ‹*ê„ÍxÔñŸróåGzv^xe¹}Æ•t[/|û+öçÕ¯ú£®à¶yÞTW8Ö˜?CbW8.¶žµC³b´±;œ†£û",ø›}*ðp¦p¯ý*ñÐ(xãì ¯ð¶”³“y<¸ªêáSõ›ZÄ×9ç{l.ÿ–Üà æ n:T¿ò¾ š1ч†¶7èaÙÞNMöƒ¢ë¸øý#½lzu+Š(üWÎð’˜KwWêdbh‚F¦DˆõJÈuÀ¿w­U»«ßƘ˜ œUïîýÑ]õÔ*nbZLÑ(ècõuá/Á=¨°¶×CïTqn¯‡í6n¯ÌY?m>ls³r/·§Çìɘ½Œ´Ø?wÆ>Ѿç¡\ø+0ÅÎ@KN§C?ü æ{ …-³ræY4¼6KÀϘq놟Á Êú<ðÃ$‚D;ó¬O&÷<Ëi¦;D¿=Ý<ìã¤O}aŸá«g:Ns—ò°¿Ïå½9ØÇXz¦QÜãaŸq.ñÉ3àg|˧Çk†×„è§5NÃv–-è]Ň~ø|»ègÜà§ÇÓ”‹ÛN;b^üÇéKö ¹rzâp9N™—K»ð‡ììy‰¿Äicÿá\¦û« òÜœçÉœgü©gªãB`òS+Á@AÈ&R¯Ño¿—ÈŒÒf`Yæq|‰f€¯ö3~úÙ¿øþ¯¿ÿׇ¯üéí×½ûý'oŸ~ùñÇï?üííÝ—ß}ý÷ŸÿãÛßüñëßýé§¾ýäíW¼è³ÿyÑï¾ðK~ƒÿðïŸù~o œþûê'Iüñ þèoï>yûê/øëß ÿáù‘ÿü=Ö¥½®ÃÒ˜ÜC5lä?ŸPë2.ÖpDÔ•LìÔÙäZÐÁýd³žäJ²¡©•át6Ck”y,ýgI^C±„Sã%ì3ì·Ö– ŽP#E«øÛ»£ƒ\Èp«~-Jˆþ,íZV ™Š7÷Xº†À›èÔ¨“î_ló1 ž>/—”ýü„ö> ;@9ÔœÑfqëg êP=~¤å›¥¾Š=þ {ÎêçLÐgÅLÙ[oÚ+eª´1-ûT¢uöŽ"ÿ‹½_Øĸż†ÛÍþ8§–€årÛ†7ÛK´œ®óÄqërä4gИBšÐÔ×dØ^4PÌ¡kjÏü¸RÈEh ›:ë^3>|1|®Y('^SÙ5GyŸÊÔ¨h °RäzPYHhëƒkºztMÚÅ©³{ÖÔ"ƒ¦Ðýš\u8ªnj~/ŽpärÖ cñ<ÙÝZ:óÌo/ìY²ù½îé¤0©¸¦ŠHçhæº{îÉ]ì瀋ÌOj¼swÐíø>gΧÕ*Ô=ýq@þ¯²Ò»oÉbëee޶×ÈEÉ·ët`'dë­sGhœô+Ψï$À`kò&[rëœÒ“{Mî[xü$C‘@–u ²Jµ=›yJ·®ßÇjQlm4Ñï© ’¸ÒG~Ê"Kc èÀø…m<˜Ñ†Àjø-šùl³&Z9zT³Ò>@U"˜º˜6±t±_ŒäÏÿ_$÷ìýòiö BÏÖH3+¾Þ E…­5H¡kʤ¨Ðéãß!)b6ò!if«²CRüž¤7I³Ï—ÓÌyhJ©Iö…¦Œ¥qhJ«ˆšBÓö^4EÌf;4%M¯S¼WîùÆ)¾—”Þ8å–Õrp ¸°Ø_qZÐ7r>8Eá 9N;kžŒyÁ)bxƒ8…~Xé<í†ò(íâi§¡„Eß<…nSˆ>‡˜"6WkSê”-` ½®¦½Â[ô0….uK!ñÚåb)b¨Æ,…¦%Ú(¥$‚^QÊX[3P*­æ(¥æ§¾¢1L*(¥V 9I)ÀR†º®ƒôÜÁAJf¿@ª'÷ å59µ©Ö¨AHÂGlê1Ž"”·tdG¹U7G;}=ýëÃQfGëv”Y4úö‡èRföá)3³ŽBŽ6G99õ|s±ÜF™þÉF©³ÝÍ~X£”~WÇ(!d7EɪÒE©ý©NQèþÜñ•¢­‚9³\ŒcÌ|·Å8êÒZ0:­bã#Û6ã áXEª2ÊE8ÄxÜp”tâpÔUú\c9ªG;àxÍC8i»§Pê8hÜ¡ਧžqÇØXp¼Gj%GÝúÅ7~]³¼ù¦íª7Ȳò+Ýá—m¸AöÖfÀ­± W½àÖʶ€t™2‡7èZK½à†˜ŒÝ†ô”‚o­#­m\|C¬X«Á7èÄÎ7hsŸ{ø†X%¸6ß 1´ÀAt{E„ÐxFð­ $A_8êY/¾1ÄK7ߤmß sQó:|c N=ø '±pÔ¼ö•pŒa´ Â{8á¨ñ×E8=»· 5ÿ¿ çkÖ+áê8=ÅKL€ã× Ÿµ‚pØ´¾è¿œp:N§“ÇYdæ áJð›-ׄÚ„SêU»§ìôñQˆƒnÙŽmæ(ÇouãTîpÄ8éœ/Æ)VúfœdĉAe^Œ«œ;*WélÁ8êä ¼W;ŸÐ.Æ1&“ü0Žºû4+ÆQ›[õ`b6æ ÆQgç°(­Ã{¥cÙGa:÷ÑsÔSúÁ\eUªƒ:æxÁ sÌI—zqN7•ÙsÎQªtsŽºŒzqŽ1¼upŽºÖœ£^2vtüòóöÌé »iš Ô!4QNÁ:h–k°®²"ç¼X‡XÍ=Pù`ÌQ~9.ÔÕá¶k£®òy«ê  ßòJ:„Ú¨#H]ú twòÒ!6ªà賈^Å­›HWŸ:ê…:Ä æÆ@´Í^uõo^Yǘ[7¡®>ÒFu×ôzP‡XK2UŽ:êa%PGÝJ¹PÇXU;tÔ{8êøœ9æ…:=»Í@®Y#P'ísÊFB­ëô‡…Ê…¿£n/Öq'-ÙfÎo´YDZÖ.Ö1•Z[Áºú@w³N©gãbÒÓJ°ŽÚ),Ô1¡a¢/Ô!†º-:Áeµ@Š"Õ uŠåµQ'é·ëÄ¢R.Öé¶yë¤ÓÖQ×ç–¯¬3¤èòY2X‡ØÌõ̬ÔÈÓ`×<^1XÇXž3XgÌ×U‚uÔ©ß3+b­=®¬£Nã̬Ôe¼Ì¬6ý…6ëxA–sÖI—{hÕM× ÖA£¼F°Žºë!‡uŒµq†VêYk°Ž÷4y¼Ã:~ •Zµgv†VãÚt ­†Ûw…œuÐh”:cEÎ{f5n…æZg4Zø™Ykbßì7ë’[°`²ÈÑç¨KÜÌu³éM·¬K›ÊëðûüêP%,Ú@*­û5Ž:Tâ÷ÔŠX›ýL­Ð£ô|PÇD{ø‚:Î)óŒ­Ò匭Ð3©•½°1Êa,ˇuø}•|³1”úa]Üãa]æþ݃«žÝÆa¯Yý°.ÇȬc¨ÁU©gpåçµ›tØÈ‘bnÕi:¥D:fÈ <_HÇLZíÌ­&æÎ Ïî¹UÉi9HG½ê\¡Sn÷àÊ·šubË:“«j"Ý“«bynÔIú~uBÑM:Ý5ŸÉU:É•zæÿž\ _k}ܤCL~v“.ÓÔÐAfwÕtؤ6ó6hÍv@]Û¼A‡M[Þ'tЀÎt—Þ cQª“> ã®Ë= £Îýoºò´æ‡s©÷›s<¼¾çXç6ç ‡<Þ çð}äçæw¬ôÃ9äaÒØu8—ßWçá\ÆÒjt,ÇÛÒYÁlÒÊá\Ù sÎA£i®‹sˆÉ€mÎAOžé,B)è+ÍV€:·5tÐæà;¤C¬–:ƒtÐ=¹‰é +ï•tˆaÏ-Hgõ}ꢥ“ΞIä•tŒe™E'=ÓÌ&uÕÒ16䮜tÆ9«Ô 5þ¸HÇXQCtÒ{8騕›tzô/Ÿž½j#Š•g™HÕ‹ÇÿMW l‹V¥UÙF!‚¨% èe‘oßsf|g®ƒŠDzÏ<¶ï½öÌÏs¾êµ«Æ9›ÑîœÓÐÍ¿ROC…rŽ2W=HÇL«]¤Óó,ºŒí¨ã2©4 Ðmà:è˜yy Ã%”r ÐAë× tx^«íž9J Ð-sèÄØp€Nì¸.ЉÙ'I$õ$—I+HÇX+HG½—¼“.#C‡ùJ'c«†¥že9ê¨w¿è¨C¬¬þ•ºÌꨃγþ•±²›w¢î4ü+Oýæ_3Ër„å„¥ý˜¡NµœþU ûJ‰ÏQG]õ:ÆJûJÝKwÔñ½D[¼@¿WÄí«nYû ݱ§wÔ!„M­ŽºŒ´u™õ8NÖ!V‹Z\ct7?k¬ƒÆ­9Ö!ÆìB]nØ£öºŒ,êk«LGô¦²¡º[7¨Cl°j/ÔA¯:Š£.w`¬Ÿþ1”cøWèšZqÔQWÝÅ@c-z:•9ü+õº.GŽ™ÓQ§zöUC5ì+u.a_¹d^§}åFÖåöUÏÓ8¥¬cŠ4ÒóÆ:¦Ò¨a_³BØQ§™—O÷Ê쬹8ê¨Íú)é˜Ï«žî•1)ÅI§h™á^U››uÒi8èTÙv(èDŸµtºJ óJþÇA§:ýÞ¼JC‹ÓÖ:Æ´™Ý £Î%;è  iŽ9FÊ(Ž9èN¼]˜£Îí BhdžSŽ:·å”£®ª7å„9rü½h3fSæ9]s§œ°`SvÊQ£Á9(ÇØèâ”ãÉÜ‘RŽºiƒ”ã瑞›rº_2rÐkªárÊIÇÆÌᔃ.íæ\…Å8òA9ÄX1N9h#˜ANä€bÚ|]”ƒn¼).ÊA´å[¥ˆSN¸à\N9þnÔ Ê ¾#…s…ÌÓú7…46È!†½i9h|\wÈÉö wÈ1¶´O4ÊÉö1å gV‡˜c¬éMg˜“i•{aŽZR?0ÇXÒÛÐ0kæ¨kÏæôÙ5;ætŒ"×0gsÆs*Ó1GÝŠ9~^ŸýÀbeÎqaNù…9æÈ*ëÀb]jqÌÉîÅ9ͽ,瘟Sºs:K ÐAƒ<ãÓ¼åî S´(tªç<@§¥b~–¤3Ò '’(õƒtºL'uZâ¤S½—¼“)ÚÚ8[:–_±ÏRÒMv4)ZºÉnqžîu"¹´v6ë el·JÖ±nênñ.Ø!†\ ÷Š’êØ‡ëÏÌé†벇yeý²‹¸`GR;®95± v,Û¤@4رæ[?a7þÙa7x»p¯Ðp§{eù§‘/Øqˤg‡!7µyqØM4 ³…{ÅL¦;ìX‘Cɰ[´&¹;ìAîuñÎ\gGÇÊKÚõì°¹›—vØü&å„–vÆa—..oØ%R®ž°C±lvÈo Ú!ÿ±'íPGµ…{e­ÍÚ‚vêCúI;z—îUµ„{¥îz›ÝhÇŸá^É!-hœ´&w¸×XcÓNè?NØñÑUv-Í8Ü«†J¸W>4•p¯ £yºWndžî^yž9 g¾:Y‡½i5Ü+;d8ê˜y´=wÔM¢¦NGÝäýžÃ½âǶcŽ:¤–ŸŽ:²PpÔQ£bÔ±P’!•¨SÔ´@‹#U9P‡X]a^)ç*Nº©~ýé ‘ 2Ôá1’ûŠ®.±¯©ÛÏv‰c.'í;â;ÎFù†…åì*öš<¬Ð˜ýN<’¦Ï…<‰kóXž0Ù©‡!¢Õqa‹¬õ÷:˸‡·0Œ\àc qô|‰·AVÛaèCMÛ­Ñú%/9ØG$~ņ÷0-¦ÑçßÇêëŽ?æÑÐ…v¯‡«E½J´—qözX¯ôp´âlÛÍÀÍC8š=íËn–Û×g8Ú£ÃÑ¢3È% -A‚~ø0”ÓТ-+9ü,¦6ÍEƒ_!×Ö ¿‚n­Ï?X‘L8]ð3krúYÚ™®5øm{s±ˆßzg_A+4Stzô]DÊÅ>ü>—ê`cvIûb c_¡)ÑÔ ø!–Ê­Ó㘡ùfôÓ9vÿ\ôc([í)ý ëæ‡ÒŸS‡]?N?ì$wß -NswqÖéaCŠÔ³ÓCÆ3¹Öé)†stzÈ<íoøCvö ^Åô²k`óˆ“<­Ár"ÏËÅs% ™³ý§z&ówŽÀd§–/*‚ hÊ@ê5úÙïáO¾Ñt 20óŒŽ/±P?÷¿xõñùë÷oŸßÿòáÍÇO/zñíËÇß=|ÿáÇÇ‹ï~zóë»×ÿ}÷ᇿ¿yþ韟~}÷òñzõ}óµ ù+þáÿñò°ßR‰?~ÀýñâåãûïQËÕo:èo{(ÿû¯’®U:2y‡jÓrûy‡Zg& ÷k¨kgw´5C5VñÓΩ3ÙÇÔ ØQ²7Î;­¡™†yæž! âb —¨qÐBp«îªí¨¾Ò9”@rÕŸ³’dÃïôD35D…Ú‚gÒ1Bßó„ºÄAS'ÞÒO¼D嚃˂) ’ ýXaó̲þ)á•ÈR2oÏ@Yr•¤Ý§nWå­2qÛ‰0ÐEèl3ò5k& 6^Žúrú‰%„÷y Þ\‰Y§×žMÌMnâÏ=ñª’ª6`°@ŠÝ/Ìù=ZIÏ•Ïah+§±mB¾¤é%4ÊÞ7[ë\ …Jøî†ÌC]§g-åùž4xÛð5dؘ…£ã˜5HŽ³Ë“Ÿ l²®txÃÞ‹»5Õ¢ !:íÕSJ¼¶¡k"ÂØ,æzMª™½€ŸòÐ1Rõ”ÔVPW½Í*º°æs¦&ƒµaЭ‘OziRªÑ…dù»áRäÉŽ¡nˆK(îP*ÈnêN<‘÷ñju0ÕqÙÛ›kÌêÌžÒ¦ R¶z×”®õUáš=¦³2ºY–ˆð ³I¿æ$v^¼®to…}ï¢!e1ØOñg˜§ÏXïVÐ`£¥×J­»:Y¼VŠ’Õ³´r<––5XÌ)YŸÎÌn? _ýšÒFÓ˜¦–ƒp¯‚²5 yyVk¬pð´¾nı–H‰Tt´•ûê—Rh ‡´uQ£:†åCKQ²±ëyû¬F‰-Ø¢q£ñëׯ޾ýíçüòü†C7¯ÿÔ_ÿY¨wQêžð»ü¾ÂSï_èö¿nañ endstream endobj 52 0 obj <>stream H‰d—9’-±±CW =´#·ƒ9p²ñ·ñ ÙÚ¿+¬"‹-ãÅkàrfæ)¦çÿÖÑÇüù÷?þùÿÍ~Ûœ^Ž?”YŒM¼Æ¤F[vÉ:g{»Ôèl³gc›# mD]}Št™½µŸ­>“ã”,%ÕgŽúc¿£[™K‡C÷¥¾óä,ý‡+¾úToÔéuHç`Ÿ:Ú´Ý'4n¶Þ»Ú´ÐáækmÖ Ú­}lRlÔÊ&}¤ÿ”ßQ°M£1«ÑhÝGõÕ »MüXpP™†Õá8 »/¿V D£VYÁ–mÎÝ­&.üyf$ÛgË=½ÒYûj¿>¼ÃsïºøU‹uJP­ÇàÏÑã=¶ø³²Uî²±Õ(\jO7 2›q©mô§Sþ–Ö¸šÞ¬³MþzªÉìŽK„ƺy˜Ð‡½½jëSGÅ~lÕuc¥”9$q8Ц|úôŠßp£øêÂá†ÒûÒÜ2.ΰ·ÏpãU·Ô¸ÁÙqïT?â²æ^ØhºÓÞ#óç 0ÂKH—ÁPsäYØÀN¢¶Ö5 GŠ{v/K—ɨ÷¨qÖUš3;¢2t8Me25Kסõ`—>uo—¨ˆ›øÍu®øc"‰«Ñ½¶€æeí ©½uz+y0®…c¤ƒ¡—:ïnÇgÂò>ƒ-¬#e ‹™ÒÙÌUWþæÁ4b+˜… )6k,mÌêy¢ÙÖ]9Ž+Zm7Ì„TÆrvn‰áð€ wç±ö,¾†í&]•5ÐMCöÞ¢«Ïÿá_M¬k¸|ÜáÏ/tܽ4\µWŽÕª¡/t™ïèÅl/ï*RalÚQy÷‹vðFïv” ÿvÔ)}`W™–Ó7ìØ&FnØIÇÅ:Y¥mÖAc„ºYG=†]¬£‡³Ø¬ã¥úfum_Ôq5l£N–‡tÐ>í<îosºá¦ç*“qæÍ¹Z C¶üà/ç…mÎÁÈÔ¬‡sðš{;œƒ1bŽƒºÚ°æè7ê`"ó ÆKå…:½~Q Mã FãÃ:½Œuðð-êuµÿ*æ_ÖQëŽêh1Œ^ÔIÇØ¨ƒ6×í Ž^3Û¨ƒöÅ:JÞívôŠnuÁî ±`G+ü6ì4u«/ì(kÉ »Õe^°“×6ë4ËJ6±Ž›ã©}a‡CkÿÂN·*P-Ø1J&øù…Âibà »*î¶ ;Å_Æ;ÅhÌ—vÕjÛ´ƒæê—v õšsãN©PlãNÚì‡zÁÄŠZ˜±[ø3¾çŸ¢6 ?£íÆ^yßd/ö00øRPòù{1™íƒ½²ý`-ÆM=ì~ÔOU ÃÛjóPG8úŸ²6×Ù¨‡ ôf‡z,R„§õ¢qêZi?u-ô(ú¼}°/Ë©k“%˜P¹°Gv¹Ý؃7üT¶gˆ{øÃû]ÙjjÕI {l¢èÁž½%Í{ôê©l5MžÊ–»«7ô°Ñ^Na«K°ô$½æ=FÓ¬§° xlè)úâ.l¢a/ô(gžÊºX½+[†z¤mê‰2ó”¶Êr—¶òllêIë@õD¥zÖNi+]NiK=ìKÛ@a7ôàñ•»¡g|èæAšÛæ!:«®q1Ù0G=̃N}û>ÌC„O½áæA§Vò0ºI˜§Ü‡y…Uæ<Ì£¶v3ãN;̃Vò ‰ÖÚòzÁJLµ G–ôè¹nvAï ± GÝúÅ<ͼë[5P´·:Ô yò>.õHÛÈãyŒ™ôx’Eï§=]kæa>Ë~3ÑÔü‡¾›y ?ø—y8›ÂßæA†^qópÜ5ëÍ<\ Îê0á’^æQë#ðaž­ÛÚ̳U]mæJ–7ô8N™zÐ>çµÆ¼¡ç<2Užzôfž—zÄÜÔ£^¯ÈC=x`×.p)C/²E=hdú]àÒ =éõ Q»ž—¿—v¸Îôì§ÀeŸÙƦž´Ý®Æ=õ-%ŽmSé‹zô¢ú–ºEÛÔãÒL¿M=îØìÔ·:4ÿÔ·0Žõ¦Lœlê9¢a~¨çLËþ{0“Á[øsKû¸0ðöà­ÙC=¯bÇ¡Œèn7õ`ÖãPÆ‹èE=m=S7õ`õ–ŸÆÌ‡zÞÀ³ö§À…‰ß>.Œ,56õ¨St:Ô£WÏKOÒOK=næÁ ÷Ô·ÔSœó(AŒ‹yôšúö ±˜G]Ú]ßjf•J¢žš¨ ZÔ“îw}+/O}Kíqê[éó®oy’9O}«k²ö%•ωöN=O}ë"ò¦žÂÏïò–1šDÊ¢eÏ =†õÌ»¼¥gz‚Ì8å­ô¬ô”/‡y’:Å<1éÏCOÔSÝR#È6ó¤ËÿV·Vñì©ób=>q_æQ{øf´èvˆG't‹"äBÅCoa¬!.ã­EáÀŸ *i‡›<Ç[YÛ9Þr¤Ã-à“ æxk9ˆ ,|XFwðÁÌoç |–ÊÎ=~YF%埘BO_ØÇ[±ù9Þò£ÆÏñ–¿›²·Œ¤+s¼åµrÿŽ=d p´céÃo Ûló ÓSÑJ½ÒBÕ¨WØòÝo‘×™óÚJ=4»êä¥)< êq](çê±`˜¥zB8©G*?õ` uN·\–êôŠh€ð ô£5ŠJ]¨‡¬¶.Õ©õŒh?°g(#ß¹£MU¸€Sq)Ü }¨¬è‘”ƒ}0´Ÿ2àÇZ7Wú±J1t¸Á?Ãy³ÈÄ©ä>øÈN@stƒ€(cjó0HC4¾n „1Š<ï$RTõ5 ’ŽE3)H úÑ1È Â<9¤\SÝAˆŸ¥§D/Ee.é—äVˆ RøúÒ × ^}Ø è´uäգω÷aÒ#²_^BÛ,Äà¢ÝÞ I¬9ï¢Æâ&=ùVa5%‚ˆÁ*±²¨0Ýz70¨£Ë>ï²üSLƒmüéä„DŸW zÕ½vTv¸4âW¢lƒ mÚ5‚Ü76 èû|³P6$Õ  É"+ƒòŠ`qb6'5¨$§’ŽAr*ç¸a‘døç¼‹;Ue×ÔìÞ†]ýP>¤©þ„Ènª?dŸuqã .%1JƒXVs ÄMZW$~“„¸o/`ï(${@§©iñòC¤Öáä‚kAÂJBìÂã”ÁB$¯: •AR) o ¿º|÷ðͫۇWoîoÞ}<¾†éEVÑoóÙñÕ³‡w¯î?N¯®.ooß¿~úæá†žæƒß/O<{yóöîê?w÷/~ºyxù÷oïÚC—_|è»oô‘¿àþÿ™žRÎøóü£,ñøG:NÏŽç¿ÈSßžüéò;ÿë·²ÉÃÝ»{]_Ýýþê¾Y¾>N¹ùïÝG[Ÿ÷£\:n2 ½’R”Ÿ!Êÿý:Íorš§í¦øß÷Z_ñøÀm02h„Jƒ –#À†‚uG,R5ABXYbªqïAÒtgÚr¨|˜ÎG ¨EŽ (³Èµ̪ ÷ÒöôËà_&‚Ñ¡8tdÐ.@ùE™QµðiÀ&ÂM¨ð#Ez2†‹`h÷lá‘_EkK~FáÀ¸ˆÍÇÀ>D¿›àÄà7œ (ÿȤ[œÄ3(Yß hFPÊÃÉ€ÏRI¯N†ýª;‰5OÖ} W±m…Ô^úrAiÖté¢:^Nsò¶9iqà™·:iÙ8RNbÈt8ÆpRò[Ä3>Ûä\¼NÚ|»ÍIÇX†á£­¸|Ȱî¤Enëø0š]>Z§¾;‰7¡@²ÿÄËÂ=e\ŸIAœÌÜà¤çPˆƒg¾‚e„xŠt2A"í‹WÇŒ‹BC ¼.,‚Ü­ëZ*NatÇ)Zãÿt\`Æ;hlXæöÍ!˽+0 €óÐß©™KÖ Þ"G­˜8‘W!wŒ+üB:èÙ83àºa«…¥ŒJuFÎ/׊³V´1®¡Hµ÷ÇÈ®¬ŸÆ=` ¡Q˜Òò9”•^ ™¼€d¯ 2ôqŠyÒb†¿ "ꈙ4qCÑF̆®æ0bæÐÍ+cºÄÌQ9 ¥ö˜9V4ŽÐcæ(FpckÌðNHŒc‹™ èt¬Ç3‡3%ÞÕ3p"ñ[Ð<ÑËáDƒæ©½}Aó¬Ç· 1‰|ˆ#hžXEpzÐ|j9° Ÿ¶Ì4¸Š¬w#hà¬)Ì] šp§‡ŠA+Ì"hÍ4íý{Ð$g«‡DÆÅlPVX§]-S–¬!‚[¾aµYÝy-‰9ù A@ó³agdOát‡xQ{XĹëCIý•T8Üx¶!jôi4JF(>ùCâ ñÁÆ‹“Š·5<~­ðWÔG’u*Ѥ©> ømòÌ«-$¢>Èü‚Ÿê#PðcŒˆÑªAs9GY@ÉP°®{ØžhÀ4RFØ„Q©Œ°8²ç6Ï‹Å>=lX;wzܨgŠ[ܨg¢­#n¢gû=nÔ3i›Èâ§…Mô xÑÃF=ã­ßÂF=ƒ!v„-t¶¶°‰ a/aAÒ ›(F ËÑ£’{ضV[Dd‡fR › Øg^õƒiÖŽ°áÙlðn›(¤ê·°Q!¡žGØD!±5·°=VÔC!#=n"‘(X[ÜD"1…–¸¹&7{ÜD#=nÔHe‹Ú³/R‘ë_xsÿF¶Lmççj–ùjýá䇷ü¥è/WïÞÿñ²ïsúóýýÍ뻇;;1Ç%þ<ÿpòÿmÕçÇ)¦ÎƒC¤ÑàÙ¬#qéIŠó€æµÏÜæëGfd'ŠëG›|Á<6¹—ãýx¢Ç³˜¡>Ù–¿"[fñ¶-Í…›ÁŒtÀoŸ;7¹>ùM~Àøàôy[ñÈën6Å«ÙY<ߌPÍ›)ïjJΓö¹Z†Ï|íLãÌÅ g¨Ñ×NL?>{ªÛqÜô?«mGÏ£>Á¾Ãƒ”\Í©§g.‹ Ð"RÀ¡(ŠNò^„„ˆ·§úPó»ë[–íÚ™þzúP]íbÏ€¹{ܹêpAQ¸çLí£3 DTjOËmiM‡m ö‘tÓ‹ÐÂîY+ýöQÞ„khÖj»|îáÒ!H§[€Õ6Ð!ÐÌX2–ï’®µ&3Ï2’yö£Ð5¨À=Ó„ÖšQ¼£¼Lz– 6š7àyVšvŸfä•‘Ðø\¢'@ ÑVÁÐ×r>æq• éÁìÓ |ƒÚ˼OWØ5ì‘°IÒefteß €qÓjÙFŸÅ‹Öžg;¤X‚‰ MDÌ~¾1(^›‰é±8+ï÷Ñ–a£/úä²É°ÎÉF+ $8˹,à1•n©òì(¬#lµBð¼ùi„QFÍjÞÑ"H Ú!±Y¼‹ÚÊszf 6­0–Á<ë36ÀM ò$±.BN˜é4[DÃTf竪NöhÆ KçL¸fÒ(ÎÚ’ X”íhÝJKù©}7|`ÌÐF:ÕG’Št%ìŒ à;Ù«Ç„W¯5í®|LLfÑß x¨MiÓx°âJV¶YU>¡WÝ£ffQ#÷ûS„÷­"ÜØHÁ+x©)zxUë>©mƒ+ES;™šFÂA")§7·•åöƒÀ™/Ò½ÐÃsßm²2‹‰‡8Š‚|ÕäÍjkà ªð>–ÙÉ™'Ðk~"lïãþ [µi½3lë ;‹òl?Ãn¬Ÿ"Ø€ï#j>ؼ^Ê3^Üõrï# Œu…Ý .žÞhþ,¬2ø»xªÇºÛ´&5z;áaÉÂú7Ÿ€¸ÖºØ#6Œ\ú¦Õž3Xˆö`Ã;øÄæÉI‰I‘÷Ñ0Ú³15 ¡‡¼h8“Ù*¼_W¶Ã'_6¬=0Ø9NfeDeØ­mynÊ »,§ƒ5¬›æKÖ .žßZr9k ŠÇs’@ᆃˢ›Pî—ï{¤ly^òs]ÆV— (­—ŽRÓ1y›Q\qÔ’HVÈ#]µ2mðë ++Ö3%µ Wp"°mÉ0pDóÇ}tLÞ×Ë8ó·­5ÑcE`w¿h6=´':…â ;‚?`o0lT!¸v˜ÍTª²ŠçÚÁCÍx{±Œ¶×[çakÊz³rpÂ&'„ÓLÜŸŸ ‡-'T§¡‚G^ŠË@¼•ú Òq%&èÙåbðXd]ABÒ,´‹0‡½ï0±lŸËô%‰µ=ò[JÖ2ØoebÑH Oe¬»Ù®û¸1ë±ÜL³Ò®¢…/±ý«ënuíz `̲8Ñv~´qdì Þq°±mÇL¥a°pÈŒ˜³¶î@h(k[ht–ZÉçEÏ}RÔã¾/:ô•àù«šà°’£|’86B«³¡èoJ`ér `¸12æØc:¶Ÿùé<ËRÖ¥5¶…ß‚@º? ½ž_ƒ¦ïyvHt¨iedják½š,àqàxƒƒ!Fl$£Cœ/¹­ƒ+ýG-ã…˜ß]% c¼g ð–~ª¶Íš>øÐ‰YÂ(.›îQÃTÚ½ÉʺÐ:»|tb%­Ô渌ëã²î][RG‹¾Ã—J‰ ¥ŽÇ–Ó|TúÑ:®¶".V¾ ›;CéÖ“—~!®ÍOí¹ò,6¿ŒµWw‚c´*  íU3¬Á n[dÃÑ1{‚eíÌÛ«ŸÛê–»zrl-ýG}g´<£·„ ´æz”™G•/"‹Ø¹–ç|m Ú·Õ®OÂÛò6rYi ·œ¦ke™”Ô Ûç©5ï+&BˆºÜTè–±_€¦ʸ”˜r“cU )Aä„O(¼?îÕçÌçùGÈMÛY¹,ašmºïÖÃh粦zÉÔƒq=u @ø|º§3,%¦ÐåS Òvçu‡À÷sŸà­Ôô€§¼7¬ƒ5QÔÛÌÁÒéÒ¤ª^õÑdÙ½u!$ƒ.•–À}%YõB•¬’v}î>¦JY…z ˆ½€m©Kt: Nµ<ØN0)õÖŠ`lìuÇBea¼ì+å6J?” Èr1ؾÅ}“Ÿ,LPè¼ý$¸cûÌp—~ L¥øØË§¹Md³ØB<*4Æ>l§B¨!º2å3¤ƒÁ”°8Mýãð ¬´<¶JôR3(ÿìoWÖ‘ÐËŠŒ]vç‚ 'ù2åx-N(„¹Ýõ²®v1qàu,»R0¬]È '88e÷Ò ï”£˜Ïܨsœ¶¥´4/¼¤Ø”/g7Þ%³IþÓâ]¸Èé…“ÝÙ¢Ö²ob iœ¡.Ü b; V9×9Ííõ¡â ¬Ú.Lp‘v‹-a €í)HüU¶ò` )Ê WOU&²0P§¾El.Ÿ5ÆçVõ=åÄÎܹ=Õ:y(ÚŠ‚¨e²†D_û™&ÃB…¨rرÉa?pA‚¬`—œ3£ªšG=î¼_"VÃf±dUÌM· >» ·Œ¤ØËËx@ÒõÓ̯íë² ª£Û,D±»äk’'mÃw·ãµC®ª0@í,BÙfÕ¤3W4ÛûÂ.†b™slžÜn£*%0dÊ «ìŒ"àÎÍW†°êí“A˜AêÀd1 ²*Áûõ1³âºkïÉÇÎΣҙuId öVž4õÎê`uEÅõò0ÎfÊ™Þi4îùŸAQ˜„¶/Ê×\—E™å¹ƒÌš^öѳ¢LµœÚþ1a1‘u/»÷Í<´–tÖ°~îE>èÈ&(¡~Ý ‡í­ÂªMòoÍD£¥îB.ll80[½Á³û\@s(À¹² HtWží'ñª|îA¸f{”5™Í”×Âgòùšà&1×¥ò6Ö/fi´ŸÝ#Uö+¾g_>ìÛ'ŸÞÞþéÙ¿~ñù¯×W¿zz÷Åw?üûï¿ÿúûïß÷àïÿö§gð'_>=}ýáý»›£7ÀŸ>”ÛçøóöLJðW½ÿýö¿øÏoðúñ6n¿½ýå¯åöÎNþáá—« RP ¦Œà&¢£˜…AâwøñlÓª©:EÅý×Èåê“ûó»4‡Ü ÚñgßÙQ ¤aµ î=Ù÷Áè ªps 7›6Ï·cà“=ÿñ£‚ÎY-`<À*¦YuÌô$ͬ+a©¦`èª±ŠžS«ƒ¡pµ™¬‡Å"_Õ@¬2¦yý¬)CXè6=b`fˆî8Ò¾ ¤íÿ5DÜ»‹‰W¬¢ý;x±{.~eXwˆ„„È*ÛB‰_¡D³ Õ(ͨï—3]•>k„³ÔWLÿÜŠ8™#¿¢ „ñ€‚«¿ñ‡¦÷„ÔÒâd ‰‹À?þù!Þà|°¨‡¯¦OìÖõî“ZÍ88ZL,˜šÊ·jDõõ³þ˜axUQ˜˜Ó_Uœæz`Ú|mém·u(Àçˆ[->õ2oòúhmÇumQ›X¼ÂUUÉoá~‹¼”Y4v–~°<®¾zëÏž¶mS]¶=‰€Ö2€‘’ÚÆgÅÎîÿñ]m-wGð|ÿá¼ì<ˆ¹t÷L?Ú"  '&#‰\@zpl™üûT_f÷œÝ=BŽJ3³3ÝÕÕÕ%Þ×Ðiª%­ hhV\Va±™$€¥þäaÍÞ¹Ä#f0Àè<µŽŒD5#ô‚E™jß·íxЈàÀû¨wUçÛ{ Eñ zèÁç {‚3bðôrŠkÙHSÕƒ«À|¾¤×P»L–Œ¤b~tÉT†ÅJ˜›`î¥0ÜKö¥(t®_ŠÇpw…A+#--ÖâôÝ,Q¼KnòlUÑs-ÒTP}Qâbd3P¤;ØQ£Ÿýîü9ÅÇ $ÌHU{‚Uq›–Šd—-žÀÇötÈ—¯Å¡tP ŸL/ãõ%ŠâYÃ/F>:Úãã~ñümr.­Åc®^«Î}Œ}ç/F‚YMx‘Zgh‘sÙ_üö%ÞvàÄ­¯šDtL {ýbó_Ë]ðÊ­ŽM†€Ý®žu-_~§.ÝZ*(äRÊiq!.ê'L•1•˜Oÿ:÷#±ùN Œ”w/Dû< j ÷n‘½”?×õ&„Ç/jÀOvÈŸÝ™ÅÏ|>"áY©Šž1ñ©Ì ”ìcç§~™¸dQ(,*Ôtª»BSšPÀÞŒ×ZöÊ`K£,\˜TB:*y1)¤6V¹òˆŒ¼f7Ž…hÍ-8ä.µôxÄ4gkQ˜6çh€Ît€˜ ÜÚ„+±Ôyhš™Æik'´«h[aì¬ñˆcö«ÙMaG*GòZbnö®{Ïu» ŒI×/—ä2M ™“1²ººï4ç ʤÔÿ0BpÿÈ´Dr)2ê‘6 ÊÌ:˜äCúQlIÐn£'„Op»íáVÑM•Ò†».“&K’õÌŠ€.ÚOê®Ôݺ7¯’«ë¹-`P­HO;÷W“uHNº¦H¢\Jº1w%œ/£èÚ‚¦$C©zÙ¼(iѯ*ƒTÔ&”·éÑ[„QjñG˜‡ Q,_ˆÐ4Ó=+¶*î<,ývsKNNȘy$ï!–ݦœôb›DBú[ë¾^ â´o:=chÁ\úOË”G!"F Å`ÇÉ¢àòÛgTx-c) q‡j‚ù6U-Ri CA†™ùô6v ”·KŠÚ¼®hN²#Uøpúº>7‡á1GXÔW³0øoõÄ›Š`hèè¢Á<ÂÌ© ~ÀÐY3AÕ~ÍPA˜.6–Täí¶FUÂPtò\Œ´iIÉâêò8¬EŠfð$FÃ^—\y ÅÊfÕ¾TFQ¼¹&ε5ü•ŸJJ5sÊ©G k{ñîdž"ã PÉæQ€jW_¡áI©m%(‡‹Ucä\,óYÈÖúÅì¹è;ï‚çÕ‰¦MjÖzÌViã ´ mµ†ŽˆÚ Öj^Ë DäšÙÙ=â šÜÂlº‚Ø‚ææA ”hWžñbÒ÷“ú‘D`š3×2ÓHv{M\›høÐª‘ÄÓg _:zÉÜn Ž`•4¶M7‹`b™¢9¥ Šíò ^'Lû‰³ï¢Éµ›õQ“ç¶5þSf?>gÁ‰1o_ž±ë’‡gΕO w*_TÃeÝ<­±Ëz¼¬Ü«ˆ=‹îeŽûBnO<øk®Å;fܵô˜Oð3Ľô2žëûklêVJšwÕp—ÀÞs-ԓ­fxn/_hE§¶å\¼lq—ÍðIã¼l²—íø²u_¶ù'†à‰y¸4—–äª7<ë#—çÜ^?ïdOº ®;kq.,e8Yèkw~¡@f™²Æ“¤ÇÇ{—CJ%JÖŽò€a¶Úù…ËñµÖ›EþþEo_}}{ó·‡_¿ùæ÷ó¿ûôþÛŸ~ùï¿þüãÏ?øéS€ß~øç¿?=À_}ÿéÓ?¼¿9z|k_¿”Û7øûæW³Žæ¼ýÏ›ÿáÀÿúõF·?Þ~ø{¹½·•1úXØ,©÷bCÊÔ@¾{Dð˜*`øwÛ®3â»>½üÖnð§›Â HzG™ôAóƒ\Ÿ¾õéNæ|§¡öu=Ac¯Äö‹¢èîàʵ0Ê丮¸ô1D¤-ÐߕȣÜ?,Ô^i>®ˆîœaáÆQá5™å•h“W¨Í = T©­µ„ÒJШ nwà»<’w^;¥öÓ©Z©æ ºè&¾1N5¯‰Ñ³ßQç\[g jlÞqk;¬µ²ìš#³@e×þ{t0i.]!0A’`ë‘ñ×¥´ãZhHxãT(}‚0Ë ·º’«S# ðÅÕE¯Ò¼€5V¥%“˜àŠ@L‰‡µ`? !€Ñß±•ì}%ü•ü’Ëb€e¨Ñ« ¡°-à2‡& ‹Æ`|tk']uÇ|;Û”3+Ѥj¢ÅÌð"§Ð²Ü¿Ãh=º'¥ÖgÔá|{ä:T”Á+ÿHz+ËpÍ!œk5èà—òÝÊ~ÎüËÎ`ä´k ¸=°¥P`Ú´ÈÖÈXÔP›æÑÚŽÅnÄo¶ÓJ‘"Ï1¶4­íwp3°÷Ô6â™3/mäMAæF>ô]éškïÈ·LÆö0ë ÆàZI–y©|Á©nrAóTÔ"xZ*U RY©Ÿ@ýH«¹6ܪ03ý_cºãPˆË<¬uºÇ<€µ/ ÝÁ¸‹††ìJ¯Qs>15ïÚinÌ>S`Î× È ¢ðè¶Qx;`‡KÑyø”cð: ÂÞßq@ ö°V¼med™E ½Ú«hG!³Ú3j ƒ±± cš ,©ÂÆŠõº€WÂÇ–¯±x«ø˜û ÃÛˆ›kpEàKÜæªOo.•6¯Šq³‰™¬ ôgî×"³Ó[aµ1% ÿØïÉŒ‰¦çÚ¢.$æD“ö©¼V‚ë÷´V"^Õ*¡Ô9¢µ>õ: ÑFÀ½Æ,fÏU Ìþ¬„è$!ĨS{X ¬Tï.ÕˆÕx‹7oÛlwŽ÷›'ÜÀ ó÷$OáWykûcJgÞO†äµPö;ÆŸg ƒV§KïÞ×lämgªÌ™DŠÑÓ?„––̰3¦\+6>Ø¢¡؈ïÀu“èi­÷cûTa>@CêØ7ç›|D ¨„”aÂh0Oà ©Ûö„›ñ†äqmk÷+_Ë»'¸òI=®­I_k‘"9€PX]Íë®i -W->…›º߫ǩ¡ Ð¥·å„+¥Âì l9ºÊííË&¡EïI>1Ü‚hºRhNxU—ʘ·^ÖsëÁ~:€¨t´¤í¹;¼\‰ÕBˆ$’ÃS·úì>/ØX‹RÝŸKÞgÃÕ­ [$ž°ðµÀQ¨ž?ï*|ŠÜÏM`Ü‹ïà&q¥ÕÃÚÚìÏGÈv¬Ï?À’ì(R%rX–Ä¢SL«rß¶WñKn$ëSnìcœ0î­íû7XfòõþPgV~^Ý(Ià´Ù9©¹½4¤¬õAt>p:ÉI E­.oNQx½Ä•ÜÏ´œ>Q©Ú} ÃF-1#™Nõ’àfÆ6’e3^ @òy/_똵åÚÞY¬!Ÿ Ü$ºÐýZøùM+pAIƺƒ«éϲÄf[{öý?Ýå¶*Ùm„á'èwè›@È ’J§K»í‹„6Á³g’Øfö…ccòöù뤥µ:Áø0Ÿk©K¥:üµÁj*þz{r«½=p‡‰úæAíµ‡­Ï!À–ÃÆ\Ÿ×¢+ÕÉ’)e?ÒÛ`îÃÓdÈ¥ì{4ýÔ=QTS›BÂMš WW=¨i½Ö3Bß>¶Œý¤6Z¬s6Q¯ì!ÒÖûÝyzao¼86Ž„Êc{|ØvSqØ¥&wgZÂz8{Û˜­rè›\ÆÉ,Ùz&IÆ3ûz×ÒšÒ¡± z)ÖÕù‰’‡(»O„þ)!`6LÖ7ìÇŠ—TSk±Ë‚á­¸{‡Ó¤‘Gm¦7pfm3:©¿†ü%9uYß–ÿA¥“¡k¼8ö,5‰GÄÅEh’`¤æaÍVöл‡°jâbgÃmZ¥rUµXgÏ¢ÎNXªÛî M;ŒaaˆËª>8`Ä•‡mn'[Ï6Qì­æ'ØÖ‚tÂ:îüÔ¢‰%+§8 ‘­©€KK sqÒpúµ‹ ïÔ–®Ññ}ŸZ”`mf¯’*À2ôÿ¸Ñý džQÆògÍ‹ó³sÀ:ãy¡QhƒQ6½‹­äÇ(ÞEfõàe+(ë€wòè ´.Øú:U ÓúMæH\î°†LÖ²$ëZóS‹Øž!Üj±¿ž1 >ls÷æØóŒSÏ| ºþ>4¼¿Ò í רÑ«—óªòÑÃÛImUtÅè²ï1¡¢ø!ð]qôÜVíq§ ÆÍ¤D/¶è.ƒý€9lÓÙ ÄÚ«°ãXbÎp˜X“ _ÆñXß“‡¶ö–ÃtΘ1Dó ‘­ËÇ#¢!ìZ­[¸*Æ•iÄÒ£y[nBÍZö®¬]ß`!hšì•©PSÞ 9£¢v[‘‚Óˆ!½A<âÚKOØÛ—²Ö,=à˜1¤5çá@BþÆoQ²a™­–,Vƒºë¾<Ëz®ì©‘RÂì6!eëêÉ…­@öB½"Ø“Ë^•ÕQs°›Ì‘VÐzÛà«gñ,¥]lÒ€sæ ô2zõúš’½dCÏõ…R Þñ©­ tƒè'µ#70ºiÎq¨|䙋r¼öê#m’×ã@vùxö™«l®ïk†òt¯·+æ±²«wÕï:´]´ *&‘¹Zü%z<ë©Û®å)—€.ë[Q py@Ú~w[Y=ufSÓL:3Œ–Tú*ÐÀÈzâHe.:¯ %bU‚–›I ! ÐCÌì¶2ß{±SÑVú†C»…`Z@ÕY¨“¬„ÞÊ®qÈ·¥ Nk+¦cÞ»&«+{ë\/3"áÆP8W[èÿÄÝN­ÓÓà€xï¾$Î '“~ ‡ç h$kÉúôÃÅ3Lce¥¼trf/¼ψ>œb‹UøêyÄ]_ìl˾òâÍ"vs>Ôwck­§ð–Zö…ò9{d‘mƒñ K;Ûb›(ÇŠTM»m´Å6ŒT¯E½íe¡¨àì°´<6h`òÕ1.¶Ò_×°Jxü¯o†5J6x´êÅ'ÈmÆò´ã\*»cX¶ºwðnÃB6*«Ð€q]ì~ùb‹Õ£˜Ë¦Æ rÏž‰ÚŠc}Cü!ã¶RAö¸I:=ÁÂõX¬óÂ`êö˜¥…“jÝ`8Ðñ‹-úóäø1è ‡PeƒëÁJ¾Úââ¤I‹"¯Dý!¿°y®G ‰>m äèˆ!幺ú0ð]ðl;-Þr*Ž?-¥L¼\ál[(¹­/'Ö¤¨âû G q¨QµñŽË͆商›B‘;‹*iØl*9\iˆ?=ÙâÏÅ•.°áaB£žp‹ö½²’¡l3®%yü¸’CB@T.Þnq= 4ò±:—˜ëÒnLL[ô ¢ºÁ(Œ[ºØöwÙ…‘›lÛ†ºá*åS¼’Fo e×°ÈIņ%çX0¥À<ãè+\ ÌÎæ*¤Zk@ÚZgõÁHG!•õ²ÐmÔ¢ufÖ¶E²[ä²ê`˜f%VfR3íž0¢iÒ‚# ~ù($›Àùh½ø§°â¡æ3¼3©«â²ÏåWs3š}øLÈ]mç ¡,cú¿ÀÀ¾oî¶2ÈTàÐ2|‚e¶8àÀÓŒ+ž¢}OîêÊ£ºM}€˃¢Šg·•I8ü*~/LÕ=˜¢!.BŠ­`v%eÒ´½Ì9¨Ré4d«£Ý+h*î- ËíÜ®°ãék™œ:iZfÔÒÈ=ÈYïpIAŒÂ‹-bЩGj¹€\Ë—Ž¢ÊO¶Y9Õ 6¦v}àîC°âÕEe)¹效'\}Û¡”¼º¡îÒªD…¯!äìmv[H ËNx5S¾@D›¹„Ýqn¦§ÅOËÉêin8Å#ÈöQ¼¾f]ò²éUÅç©èôÜ,±˜&óiX™Ÿ .•ó’Â;žÕ÷ùÏäÁjµÇ¾Ú( ¾ú¾Ê)³­ì«-Eb¤/[¥¯›²häN>*ÛðuS–ÓÓ:‚9R·¬6SJag-©Â3ªë á1zض¶Ñdï0 ,±ŠÎÝ/ÚBï$.Îz².$ñùðï½É r]€6I¦»E/ùœž[Þ૯ZuĨÜlô¥ÁR] |)©®ãŠ^^p»‘OÊhóÏOðð·\(¤ÿݵ¡å~òºAeg¡Í÷¨a¶©TÊß¡S^`TfòÄ9mˆjbGÚê~ Xo§ŽUã.¼¡#9J©¾Åv¤êJø?ý^¼VÀæ?†d^èÚfÆbNóbËK²-WX¹#ìÀúd~ê´+ ðÍÄÕóÄãàn3‚ÓSŠÂ®ÃÕœJ‡YwÞ3ÌK÷)ŒÇ©©‹-ú[ù"Y\¼ËvZ«n‘ÒF^ÏS3ùª³ÅÑð¥ a¹ÿÏ+ÈÝ~ÿþöþö›Ïþ8¾ýòíÃç?ýòïýõ»ŸþøÓ›ÁÏ?þóû·þíû··ï>}üpWz¾óïnéþþþê×Û/ø×ø›îIÿúê?øÃŸð?ýzçûŸïÿ&Ý?ˆõßäkØí[¡¨Ù>'¡äuÿürÁÐP"^.‡ü¼yÃ/ÿåfÎÑýG7C§’xgF"…õqmÛDî°-0ãAl°˘í'`)­ï¿\ÌO9ÒRP'¯BÖž\SWÍï¨u·f&öÀQ‘êÊ%I¯„HÚ—ÅVå D}O~2”Ê×€¥ Ìá¸f ÛÂþc:ÝÕxø}[‚ãö=ò(ét‚4¥ž§ iµ°$ªdÖˆV“a uwVÆ‹cxÛÏÑIxï‘WÛVR÷N¥¸DÀ\ª¢2üTF-b>Ç8¨}=°iuÀ>ÃN# ´Lx0Ø¿ÏP)L!4ï $ë^IÞ–Ãhq€§ìMíÅqï:œ$âij·Mè9y†q®q6a£°×:ý\`¹º½ä,qÀ4¥)¢3à ÇŽ‹!QVæë>&PÄ_‹ê x®“ÓÜN{âæ‚èq-ܶïÂN:+¬ ^ŸöÊNrX5ïÖ1¼°¨f¾c†Íq¨‡5›²\"œò!v}ÿZ„Å”ž©¯¢(E—| ÷ã Û VÏt[?+S°Æî3ºÆ}^rò¾ìÀ‡7ÄY´½NãÅZÜÕ\ù€árØb#¶T÷1³±âék<›3¶öÀ„Ds$€‘'Ÿìu’;Ìh“î-gßNt @Nþ°iêô6+ÀM1Fçý´.} Üèhm¼ª¶¿",wL•£{ÒÇÉÌ`ûÈ×%G€Õ,ÏbWÙ,l¦›³[%Øa[¿h ªÉru&u”¢{zuщV¨–]t^Aᄬ4xÕ8!Ëdžðw¸®ËÁñ"ë»·øX(D’Ãi.Aø;0h “C²ÁÁ ÈK0ó÷'a2Ç•±·r ± DǿߣÂj­Œ¼D‹¬u‚öðm36Ð.»¸š€Û N³Ì¾­hwÇxozNű•<2ê‹ÒŠ“NúøËìq Í›ª{îDinn€j¶²F€Wç£TB çb$=øÉÒ¤ënà òvÛý!,1¸D Ó'N˜û]…[NÌzœ¨£Î5Ï8±ÑdcäŽ!>äcˆP¯Z÷òé'á+óï0’úý óÅÒÇIƒqosê³6~¢ZÛ_'Á­uÛ}ž˜”¸Ä%\ñ§>ÍÙv‚œ¸ì¤°j'òæN*€ü¨‘#sÓ¨5q{Ó¢É~íÖœ}”?–?±²<7òÎݹleç8sÀ:;ÿÈó½QR–sM€£¿cÇœCBwx5>BÏÃF0åÍÝÚä tÕàaQ0£*úh'Ø•¯(Ù³…'±±hU²ºìHˆžs…‡ÐæJIM[TUÀèV& -ìIE¹O ¶ öú$ÍU#÷€:žópŸEY÷T`Y5—³Ì'al TZ…¢¸¿{¹¢Øm±XþI„…¢t*Š¥N|¼Íu£Î\v‘|m`4]ß €~udsfàõæ?Bé°Õum3À.³rYIfouÊ”:U óê¡su‘MÖÞ»2 ?=PâW½š^FžmÓmŒ0Lvæ Sð\a7ö,,ìhbòŽ_aÓµÎEÇ¥€Cs%šÙB*Z£ªîn ®±9õ"£¬&5v“– 3˜/€ØtØrSX÷À©ªÁŸ„5}'~NÄGÉ};Ûk¾ìô•NÆÕZ4fŠ«æC§C '§®FM^=\cÊOûÇÄ(WÏäál/žœ¹T¨mÐm%Æý9û!\ݬþŠ‘>§LÆXðx³¥÷qžÏaq©¸š›?¥”›+É 0„Å1wJ™Aé•åjv3¨Ôç{]JÛ—ÎU} £Ï¦õh¥¸§Ý`UáCœ0ꊖ´å›Ŧ=´ÚAío•a€¹ŒqSS’J€°_…•±Ø1 îg¹Õ\-ÞFýgnÎüÐlœ”=ÿ',½·»‰X*æ©îˆYLp,ÚŠëÏ"–£½Ò|Ç…MC)ë³Çr ðu[Ÿ”ÀáÜj<1\áÞlu4Ÿ·Ÿ oœµâl·÷f8‰ d\§È`q¹ ±|UP’OCE‡ØF}¯«F4 -À9• >'¿ß¾y=7`ÚT/‚.pÂÍF²‘àuuI<¢€NûUEZ­0#v`Ïæáçt°ëmüü¾ò÷檲¢ùà™Ü+XŸ„Á’?Cê—3«µÒé{®½%wIîñŸ3I0윊 “{o¡Åi·'äÜœŸ¯cžÙ֓ퟟ#W¡ ó&áÁVË­>Ym_óâá6îU‹Ïr‰hF¯1ºð{)MõåÑU­Yí†å-Ñ™õû&„;A•MÜr÷(ÂLQ¼ ìZnƒþýlNWnU.в0Ë—SúÛËl²ûÊ¢â\ïM¡"üGweÛv‚°©tíRÔ9Üù§Aîw»úyrܨ!ù¿Ï!O¸ÕXÜ5®ü¼ìæ ISt›Ï¯Ý?g ptkÉd&º›Îršñ{‘ôËà“Âþôu8%» tµ"~±Âà‰ê{Š ÃË7ã÷¯»Ó T¡è5×/!ÁÝrrc¹S—äç€6‹m”ÓÜgQNKC”gb ܾ˜ˆ(‡£`ÐF˜dÐÕž¬êkš$ôg~m/Üý‰-XxÐÞ3Á1Y ÷Õ¸ñ9Ô&!&>§Ü€ž°G^ßÏE¸1_ÂV£s6«y½—ð9N¦w:øIô©tãTº òV¦u+«½à¹f…µt¦^¹­L¦…Ô“u•œ¾N}©žÏ±ß´„h˜|»âd‹9/ߢrá+G'螉qç¡nÂê†as\¸BaAS÷xÜšv}§,'[¶$”h®Å<å}­¦ÂwØ%P¯Ñr³ë«´þž&¶¹Úa}¯et~.öœÉ ÜK~©2@Sa‡·UßÃÞñû3O.E‡ñûdÚ媾tƒ›,@¡² †p­L1WðÄH³ -Sß[ç Ý&9«‘©á[|ÜX&£Ì:ÙŽãFþ¡¨ËâÊìØÉõ#›pÔ….¡?M_å}hH”守Êoì9*(s îÛóQ-¹÷æøƒþÛïHƒjPfhL?‘¶R!š<è)£³Ï»Ó8ä}ÒöÝle›S]€kQŠáÂVnÙF]'ǼëÏŸ^ä>H\ü© C›ÄïÓ>@[Lª¹reëoòh\ÊÕ*‡›A·ñýF©dÀË;÷ŽØµ÷ì“9d[ ûì ÐÎdºv°6ÖBç3ó­ú²dªgÆ}[Àck¥K²‡Rf;¶O.ü°ε-GÁíÑš ò.2p¼vïZùÉö>èÉq¨¾x),]+wC5ö K—å—`Ô•õŠ¥|ÁS“ËËyœ »Ö¨ï×îl.‹’ +gîSÚç`EÜkbžî`7Hêh#ðÊ»ŠnÀpHú9íOÂìùd‚ò¼! ^û»‡§6gIèbC‡‘æÜm|À¯{§w¢=W·¬÷œy5¸¥• ^—W›,ZÀ"LÙíkÆíÓnBó†°¨c'hÆ›Áå÷—:+ì y¢‰F&òH½yWf:žZÈÔ¸ÃZò+3f|u ÖL*Šíä ’ý,‡´p(~ B7yï{„›½Þ1²5FÊz-<ç}ßYwÃb&xu¸x pZOP›fÔQƒ°¥˜!Y³»ä3ÎqVUèÊh©#‡•ðg³Ñ-OÐm°uOãs¿x“nn¦šú.o´ Ð$¢:§äôñ¾îÍæ§´Ä æ™Ìé 9¢¬ÔLÂÚm¹ýõ´ ûv:Þmqe—lj¸MnÆ ž›škKµ‚(µ1žPXÏÓþ$<Ìò¾Å‰_Õ™p†2YO3­Âó19Q­ÿ€wDø$‹M¶"†É“Mâòì§ÖÑù¸‡:¤q´iO }òà<–R*å¿Á¨‡¹Mž¤×Óå÷ïp½€BiT—mžu3åÞä¿axÔŸ²ªìÆŠÛ¢Zâyäãu{Ô+ã¾Îë:ik_v9…š«ÍsÆHãhèð=Ø{8(ÏQ‚»4‡„n‹˜î;ÆÖ®µx¬–ÛÍ(/KC}z¾9Œ¨€k³³B½ÄÈžìñ˜mæn’}cÙ¸š­é"]‹F'©¡ö §*1‡i¬,ñª=:3ÂnåÚ5x€nm$hÖòà ©½1†_h!¡²¼ô$Hc€¨.E"@+o8MŸº,=úßmVu‘ç&4ðbÕ³÷_ÿÕW _±ÃÑd€"÷æ‹lð VÇ÷tö_0¾W'¯ K}0SeïÃN„ßìƒR @wv-ùú+ž|Å=CÎMn èPY†™MЄ_Ù]@µíB[Ï¥:_çðý`Ké9±d­ó¡ A\“4fxQ‘ï©jVÉø´}Ž5,µ³3¯'5cA6ôúþ:Œ(¸¬ŽÁ¤Îu0uºu{l®µ 3€32UËh|Þà6ˆ)nô9³»Œo°ˆwºïŠ>C;¯-ŒFÁeL7À[çyW«ÏÛ.íô‹Ò‚Ûs†ïaœr@RZà4J‹êúI·ØMBòøÅÏN&ºâÍAت¦`øÈÌaÝwôZÀ'J£k4Ê¿l—ÛŽfG …Ÿ ßá¿A$Fut¹.“.@@H‰‚BÑÌpT÷EÈA¼=ËååÚ{ÿÝŠ’LSíª]e///؇k¹ìÜB6˜˜z€ c Ñ?k_¯h0Åk³j|é;@I[â|.1v¤a+ñû%I(ôvÎV<5p.¯Î ×;#µb$0XjHaΑ 0Û½åÞ\kô!çóê%—Prœ–¬"¹Ãá‹g‘AÑüh¢,€n1ݽ iÍÉsÃpóØÚ~à’âf«‘ÑCãÉÍp8̳†:ÁDè “¬±·è˛ۯƜÎQxµSæR`5¥Ž³QÕ ¤§øó\áeÈÞT€ Ex®jS‹A‹"µ.Ô •Í8k„È6>rþ@zùZ®Œ˜jNðõÓß탒°G˜åà^ˆ—UñõÉ%A‘¹mRS–þpe„k"»GÉmº¤ÎµE Ĩè·'¸ûÑ0NNZÝî"ú˜3¬¨zö†CÁ_óhiÖ1Ö(ªÁhŽ«›m›réfÄ–P\ñ'ó k“Õá'ÐÛ»_ŸÖöa'C½Òk-‰Ç-êŠ8‹OXè_)”ômÜgnXNW!ˆÂ Q¥0öàM˜.ºB ÔØ]ÿ0›[$`tÃôuø}¸—…úDÔ‡Ü÷Éb(Ãç¡öÉÂÅHŒ`˜ ÈêðN ˆNÍ;kVPq²ž¼ºÄ]÷ÒÁÝ»úÛýy0ASÑßf/ð8ÇÁ†gXi™_Ü-OfÑw˱+{âi÷`kînò1gõŽðvû8×ØÍ ›ñP`˜rÈè$ ¦ išó¯k{à!‘d-|­íqX:‹Z3£ŠÙΧbÚÁ̶⽮»Æ½÷Vb3Ï9¢rÍJ=¿„Ñ‹úØàa"õBÒŽ0Ùç%Àåã¼2Ü#³9Ï™ú=ÂJ«QõÞß,¨„À¨6½½{¾QAÇhJ1XÆü%ðŒÌ m Ûã ¨hž¾±ïþêég_üVÿö›×O_~÷ÃÿùÇo¿ÿþów¯¿üü½^ðÏ¿z}ýöåó§Û¢7à[ÿÅSº}¿ùééü/ßÒúç›ÿá‡ßáÿúéÖn¿¿ýå¯éöÉVþiIúº~J·¦êµÈiê è—ËÓ?ïßzKÖo½>ýò‡§|û5¶øÃ“9†Ÿ†ÿ ïÓí?ŒŠê^wœûÞ=^.™Åºqÿá·˜QҞ»ná6nó#ýàXFáÚ™£K‡¬wó*"1Õè kcÄéæ)j£ÙISâXÎjÚ¸yÛ’|Æ×µÝ î=6÷ÒHõZñvª6Ù˜*¬Ä‚HRº-N,W˜S;½˜} ]þšpÎݼ…Væ*Åý#ÈŒš©üt@ôè©ÝÍŸàn9îz€ÃF\Öf=ZŸ;x@Œ3 VÊph0†åÚ¶Û$û˜Ô|bñëxær]i®+´rùûG¸ÆHÿýChe™v:4é¹cÍ‚ OoÖ®qÄ}_å`Hª™^uZÐ>H*´lÚx²½/n°»£ýò8gÄÀæêIÆŒ0ƒ1 ï£õ†jÎNÄ…&i´V­Ö3ôƒmï%Öfv0±³;éì’fzàå½®j?ˆ>¬EFLwTy{‹Ä…wá“\°Jí»¹«÷HwC蟀Y“žåX ØY¸0[œ~N°Âò5Ý'ÄäKØ8£\`µDŒ¡…†p¢ëÔ·°ŒÞN0^aêk†"¦Êb†èêÎën!IØ«q¬íÈJkíËl'¯8µÎ‡µ¼ê)9~¶Y0óæœÀô9¢Õ¥$…+Òä`ûΫ‘½!=µkHÀ̧=À-Œ*jžak¾2hþ*1íV;D™ÕôXkHòfm¯‰¥óˆ©ï^úçUÖòR‚l÷ؽk®z† ¹\_Ö¢èѰ,j6Ë fõó­È(¥Zs$XS×§n€®s‚i¾‘3óa-²=»›Ìº> \º6llkÒùµµ,áÎzTò+Õ3ôØýäÍZü[Îé]nØã ï¼2 p‡RˆQñvÔ5TŽÉÜHáÞÆ#4ÐÓZ˜zmBÈj:1µF;8¨¸¿~¬5_ɪ•v†÷(¸Tâ¼ÖþØy[Ðä|…¦ÔfE<ÀÛöSxdF;5_^ËžO…€®t]‹†Ô’ RsËð—½ðgY`Q1<°%¦–ßÀ5Õìl Ï'˜ÝÂÒT£Oâ”r‚»§Â,<¬5‰§>ŒV.ÈZY»£,¹úû·x?Âã_Ûó aìÝR­k;4ÏÛ²Õ£6ÂÖÂ#/×—è(Nkáœk!•:b¦“Á>(t2ß<[JÑNÍÈy6D­—Ý\ɶZÞP;“C@a¾Ïº¬s†Çh£ôV 8ìXwV\È V„zfmñƳäûzBÀ&þV(Ž¡ËpdX—Õ voÕ{¦r‚»øÊ•Ý·GIËâlÙÇ;33<ðð±Ð º•¸>stream H‰|—ݪf· †¯`ßÃwRh]X¶lY‡ÉnZ¦´)¥”°gúKæ M½û¾¶$/¯õmÊ03{žÑ’mý+µƒJé_öÔÊ‘(çGÏ©©¤°k°šk¼¾®IŠaN5d¥µ6 •z»Aü¤ôx{¹ÓL-.JéHµÊ„ Çö¼Á© êQ3Õ«líGÉÅe{ïwˆ£˜ýæƒiÞJ‹f²W×ê µ 8´¤CÄ.°É¬Ù\iïÜŸ`Uñ\qXk‡9©_ iá“Åùê“d\•B9w”¬õ* ˜Ke³•ºÖ œ¾ óQjg?,gnîVJ¸0oÐ^0>S½ÉfغiíÒõ7Dº®G‚cÕñºÕr›/•£$D]@å2ï o²r´ÔæU :FTP:X²X lx¤K§ÇǬub9¨{`õƒj·"üÄÊ; TBܽºc¹L9…%² ¦yÄ]e¿˜öÚ * Çþí%=~5´HƒSÛx¤Zy|wÃ0”½,Õs`Ý”Šd­ºÁi4àFö‹,J€Ca”ƒ$Óé㤂œ¯>´H5œUg†ÈHuHÌÕ!ÕZ6øæ fÁz’EØ&¡PP¯pFi˜–©}Ý )ó±’ªCQ3+7ÿ¾â9ä¢`~\íš”¹?ÞõÁpÐøáC R9zbqçìXr›¡#ã>)¤dñ$;—šmJ„Ù.[ŽÆ…,ΑjÙáP)"úÇ# Fž«ÕO»@ó“Pˆ[ Ûâ^É.«ˆ ÉqY—Íä RÃ7o/WÜÑ!´ºlí3QÒ(Ú-´–”\2çÈÊa®F.Kä²»aµKy‚Óî¦Öèà6X ±ÎA¿éæL<¸ø%TzµWh­ä¶•f5Ða8G´<Ë"X( ÕÐYønì–#8Ÿ4Ü ¨vUîÙjðýþ¯x×_¿|ýò³/ÓÿúëÏ¿úþÇÿüãßþðçï?üêÓßÿùù‚þõçÏß~÷éãcÒðC~êò%~óÓËø‹iþúæ¿øÇoñÿ€~zðãw?ÿ%=>É?Ž»—ŒZÊãîÙCý$³}K³âÙË»_}xÒóáåóËã¿A+Ì´9ÆZp‘OiT •ppIäGWdmñvÐTg„"ŸÈ`uG\!‰gÙS6QdžZØÌK3óp]É9oðÍ_ÁíÙRrµá«7‹Û l…úRpb”[uYö:Ѧ ТºC*ºtÏŒݲ PK(À"O0¡ß-+B,DE˜ÍbêWíÅÛqé(^ýû,Åe³öî²$!ë³Ç'ð&E ßð8 ŸñѺ•:䈷¸FRŒ$(3q :³n0\ëMk—OŒX­ÙªG0ûðB¥úÅ`æQ °Ë ª–ù€-}ƒo®@’<Ëö"ü¤µwQ«h‡Œ®× ㉲‚ƒN‡#+Dyƒ¦ #Ôj¹Ê2^nãWÇüµÕ}y"©6у­‘ÌÍ!:²nоN«–n²i”~—Ÿñx™ä“óØÌö¨{]åá½Åf,¿ê'YG/L¦Ôa<<7}–Eä«ÒQ7¬° ÇOÉ5@%gO”9oÅîƒR°bu­N>—b`!Û?Ô×z2û|,O6Ξ’gúgë3WoRç•Ò±?¾ÀÊׯç.fêS˜›#ŸGA¬Í p–äÁ¯ã(˜Õãœ=í7÷1Ë:?0I6;2<©éVú¸nÛØYú¸[0\eO8v-«ÉD×;è]ž}*`‰-Sº­,Èß 4¨ˆ¹ñMv4³•UaƒRIº†i<ÚxiòlCmï+*¹ßuôºP0Kùĵ¬(‰CÑv‡¦ºœ8‘ºÛa£EJ(  ‡¦A‘ldØdG³·l­½Ý ˉ'„-´„»Tb²Ðl_cèö0thßë¨\ϲ WqH¶qöÞ|0¨É·»Šž£Üé3^*êÝèš6Ùµ\}w­Ã^÷Õê?,HuÃÿæ¾-å=Ù÷¡¾{­ ¶‹aóaíñ.šïjH‰ÐJŸÐÎIÔŒ5ïʿڵBÓnT¤ÆÝ[M,BWYì)Õë˜àØÜ‹ÆÏ(6XÉ“³i`§@K¦ ¾ùª„Ntk0 ›¾&Áæq-S°ã’9»l_)Ë•ãq’ {Ï-+c›­mDqø`Ö¤+d‹ÇxÁ‰a ?ËÌ—|€¡cKshßb(÷+m²c¢…E©Ý ×ÆPxõìÍ©d¯Ý2RСùÆVP®²‚úß$ªw胈)8ñùú±T¶˜£z£Øt[ÏV9×¶nP¥·­9ôB>V¥Òža¯çNŒïk–¢“W…cÛ½ñÊXªÜdÇo#f[Ù (ÜÚM¦ ©t•íØ¦JL3ï@„P¤ñF½8ÌeKGÅc²tˆör2û<Ä.)zä޽dzO=‚¬àê=KÔ?%6¿ ܼˆÔœvø§Ã2 ì°ªÇU©WWKò§[lR%7 oû{°uÑxì’u¿YrøÂ!£8Š_ FòŒFðÆÆ bdÒ5#Dû¾pBSÀ«Ã]daszÒ°ºÆÔ ã ãŠö®•²ñØê\;×v5\ãKî&‹%ƒ²¯g1úÏb×3xîwÀÙ£øÜ‹¬Ñ·F@Ì0²ÁP0|—àºhUiþ®sÇÑé°f‰€UÊ·A‘Ax‡ðÓϵ3dóX4¼Å6nÓ,‘+¥£Î£»ÎèˆlM¸'tŸ»iXÖ`t«/6JJ.YÆ,ûzK_´^Αé àMTEŸ æ.+ÿ£Tôê¢Z¸ ÿÎP¶ûú<ð¨ü«ÒàÑù=`NöL>Fl²ÉŒ1!ªuw˜HÚßÜŸ2þq‘lÙ"Jì}w8KI(8qm!!^+òê1}Nh©%²º9„'Fp& ä:k8áÞ5õ”ÇRض œ‹""؆%ñkãŒ4—"@„ªrèìNX5PšÏeÄò€#ŠÚªq2ý‘ÇHSäQ58ºá‘µGE6DÏW¯èc¤é; sö2çàMv˜(³kEw.7ˆN]šžæ\˜J ç—2{ž lyk!àºA£þ$‹ýËag‡Åê|À¨1šŸdwXKÍOë{ß“¤ˆ>ïŠðŒRZåWu&hm–ùMA ¥þïrG²4G¡ð j¹‚! =ìl³6ÐvGŒ7î¬$¤›Q^ÖWüºzÀá`«¶Òûq‡”xW•cÇ\ú¹&2õÂŒ=í:‹f(•;¬ß“¥+Aëv§Nu;`̬Õ6i @äɶá¨9dñÆ­%ßÁ˜D ÙæK@3kŸVcåVkÕŠ›HÒR‹  G4 ¯&«RÑ.`nO‹ËáÓjcìPC(¡Ñ¥¸øx+Ç8ã`ï뱀ܗD£¹í©%Â^ûQãƒ'_ «½$XF±ÿüz1‹m¶h-6é8&ç*ýDzê^Œ…çÔq 0•òB|é6œdß[åqû]üèDö^SÛ¯týÒú.[|Uïá§éi–q˜>b³¬ má¤ZŸ8’Å×z© ú€t*>â Ýô¢YôD{lŠ0ŒË[YßC Y@a§Õ+Æ^æÜ¡WËPÕŒ±åV}f#G„­lÝŽØœ§,Ú—lƒ­ó½0¥~¾w|°æM¶¼47 ˆÆßôï›Þ`ŒE6‚ìûµÂ^‰ ?ÐeRç'–¼Çf¨Ó„"ν€aIÀ:†Å®QgÁŒ&f;0Sèp+ŽL ol·Á3$AÞ XaQ¿ý(ÕïÅ®ÝjØ4zA´z—–Dz»U¬š¸ô¢Äæ{Çpïƒ÷‹ÓXÛj:PêÒÔq¶Å)óƒÝÁ‰m(Â>üÇDŸ^ˆÔ5[ÞÄð“Í,jªppe…˜oÆ×ÿ,vêƒFM -vâ‡.ñˆ #µ[`—üÄÎPa>¨–²†O‡º€Èf¡X ¤»eüÿQ°ï{ÇèBEEKî@/1ËŒ¨Žx%‡Œ­™Yi˰F|·»Å¬bž½À~À*Jˆ¸Í½ƒócîÛ¥ÄãÙ›Œtë£g—Él6=|Ï Ev눩>-¶Ï6ÍZ;‰¬B÷÷'7½ò'íÞîÐrΡ®,Ä¢k—a>Öb|Àšý/ÜJõX_U$yW¾C|S÷èqóÙ/‡‹­‰]ýš–ø5÷wœaBéâ›h-Šqέx„h—¾ƒá»©'fˆä%§âúF¡Ÿ çÚžØcÛ±~Ùò[ºN]~IûBŒM8—z°v.V´-s€^Jƒg½cÛ2QËÔÙç‚+a|ÇÁ–=Mа­Uÿ€á£•xÒCglxœ¬ãÈ){‡¾îùcD¾ƒ”½˜=“m¯º€L4ݧO˃†×tŸ ¹E:þ…ñ“åR½"YÄHÇ4™Jøa6äéçÜN;²Ž"hjHèažHG,9g!K/Z 5dë_,ݘmò*æbÕJuàà Çi±«ÒTå»Î´,~µDè $¦òÄʶºÅ²øw=×Ú¡Áiýëÿ>˜þ#Ìþ» Ÿb„?nëcS Ûò1ñ\R¥?7À:@¼·esäËe´ç " ïupx[ÙÖ ' 6v\³g·˜]èHe~æ¡Ã'gŸôÞ.(”ÁÑÝX0f5cd…–ï¬cKi¬×*kyj»ŠïOåV*ÖŽæ«À‰=±ö²?:tÁ£Yv}«r9ªË £j^Ø0ïnàZ,{ýA·±6bÅõ&s%’41#äuxœ®²sŦ4‡5´ZõÒ¤–]“# Ÿ=ªX”bªi^£ŠûôÞ×›ºæŠiÀ´Ü ~/“CáØ\f¹âWnø¯mœd™é®Ùj°Í~® ÷dŽq?&ßa^¥ökiÙJcBÕö÷h ws‘€ë³Ù½À½6nú#fëô!6ÂΊ0àc+ÚINt˺çƒË„OË»]°¶<6øÂn™–f«º¹¾~êñ*BÒÓ~ª6Øûã(ð‹ »gÀ„¶]LÒÐ))ÄJMyCÃfÉŽ²÷ý9O~bÏè$NfƒVr2©Ò˜ûÑ}mÔÌ…ýÂMúdþDJ>Ц?_à`ŸD…™ÙmcÞ5JÑhz†Ø²mM˜j”ö>l€Å D¤°õ©y€Dךq¸w@«QÄX©ÀbC…ü´w°îàÛÔ¨¤•t‚9y1[v „|äÖk€^ÌKÛîØ]̲ƒQÛ GˆeC_—D ¸Lr•LKPº BÄÚ‹;À%(\ýÕ`Vofp_¢jßk7+«Rîp™‘瀻9ÀΫ' @¨´þ3^t/p°?¾ý-°=hÞÅ(Å¢žñÄ–ñ¬v/Ë8\Pj©²-pá5›)œz‡xÚz8fXà`ü‹,ªÛµÔ/ÊióQä[ûe©Ânƒ}áaÞ*¬ºg/‘Ît˜kËpE®k]‘øfXrhÃ~0:£ʇØì^ÏꮋŒ=9èbÖ'Ï'Ü’ÅÎa â@qô\wìªqAé[öK´òݘÿ~«n¤O¤o×ßÈ÷O4"ôûë¬ bñ@<Ÿ)5@\ ײpÌ'‡ÏšfèÕ#z šÆXäebñ¨óx Öôä°a¸#S@žÙÒu ˜îu¥¨-žæ´ê3MGò¶ÖâßLKó6áX}«€Cñ|Ô×oã٧ÄiøÖõ®Ògì/3»õãQ’èÛ~Ñ×ß² #®Ÿôä)þû`Ñ.ív-ùB¸4ÉíDâ}bÀž:_q’<©YJs½aÖ*ÓÏ#N½eMÓ•h8Ã-™h‘g¬P½Ú z€¹®nˆÉv]LËi/˜zWúùvËÀ+ ôD«¤×sµ¢#b€Öåýô'鈺ªóÐÏ™®ÎÕðˆiðË>1ˆÂkº6õ‘ôûEs»z],Úu>C÷ªYÈ,³§èÿ·mYlEEûŽ@ø “×2Ê ;¸ðÔÎw­ŠÔàÚk€~„:TuC,˜ü\ä°!^†šËnÀG¢Û2†óv–MN^¢ÝÜi0f¿cOUôö^oè$å%ÿ"6Š f…õÀßüG˜#üw/P~Šýοýˆ› ðP’©7O7²€eŽjpð08÷$<Û’//ñvÙìŽÍb-¹¢ÓWHÞ}B$„ËãäÄÄ“F:¯è¸o…=5N²§yꙿ»üŸýjÛm¢_ðKÝEÓH¾gódÇM ¹ N‹} hil±¥I•¢»_¿”dÕ’Ó­FÍFG(Ú ÔŒÅÃáœ9G/µµçKœÊvQ‹ŒèH4õ¦5t#jÉfk/Û1¶ßDz$±–ÜÒn9±ý^pË;é >Ô7‡{'¢WOOÍv:R|;$ÌÄ!÷‚Ù¨TA4än¿¿W¼þ;}Ç{eÞ»©çÑ­î†m–l¸ez9ќ݀X 3ÝÆ=Cß©~’¢éåáéðI¬6‹ý4‘¤Nj9&¨Ô¯ÆT,š±~ÙÑž^îôz{Ù œÐpLw‹)âM,ë[0ˆÔr7ÐöývÄDÞu¡>ûi&#FŽ™ÿGl0å¢JôµB3N÷!ÒoGr9Þ^Ô ´ULWòt{;ûÛ;sšP˽àRÅ#%aѶÞVÖ´·vV/ö së\C†=ßB蜶çÕ9ôz°hcs—q·˜ÕáàÇÄË@nÄ;è÷ƒ­¢´m„«ošÄbÜ!ýÁ°½Û×w*¤óX§0wj9ÉòZ¡œvÛ{ó@_u3d’ÔìÐ%]3›è›ÝDzÚLÁìøëÓѧ£7£«áÃ{n¥ï9wD)÷@™ŸQ¤gPyI…¼¹€à$k$‚òj†C¬ÅËm ¤S¦@f~ûdóÖÙÑÉôóåE˜Q!’0Mã öJ>R[9è[¹.^]tñˆ  /ÌãðÂ1®Î…`c ðÐ bgÞÌ0¦p4Ç=tÖèڬ˒ãªmÐH6% ³/`©±ð¹­·6ç¾O:Tyh€©ÌઠY’\­‡Þet ˆÏgx‚ŒÃ‹'ýwV1‰ØÔÇ_Ö8¼pHSáK FÌuð×.¯f,’MQèùUG‹y-¤ë&›Y“Ù¡ÐHCk¥ÑZCf ™½(˜Ãfh$u¡3ü ©xïw±Hl¼ï³7%öúí|îªQŸÏ%±a7‚zhŽ’‘刿Tt '~åù ¯]êÂ_øÙRqãbª¨²,/Œ¾§ ð3•S8Â÷—·šIV9%S fà=ÁŒxp!á›ÜÂÏ¡½¬ÒFÒ½/g>Ó›€¥YçõÑ7å¡)¶k—]•f]Ï" /ß¶Ñ…Ãùˆ…³>wçÀ¦ÀÀRB¢‘=M,ä ró» Ÿ&–6‡&Ôs±` \]·FÃhIôO­Êuf¼¢‘Ôf$á¥OÅG’ÑŠÿ´ž<š©G,âð o0âðÒ8ï\0!¯cú¨ ßÍЦ¯òì€FRvÀ3wÅÙ­¼=eO`EI°!¼nM%a *Ý7—ß3D‚c(cèC‰‚ ¯4ad“ÁÚ©NTDæjÅ(¾p\=4&ÛÇKö0¶ºÝ8—b‰¿papñ…AkuWê¢ …¾a3Xä ümtáx$„ ŠØ6Ut…·S»„¡qÁñ¸,Ë_úŒ¨È)…cc”É`°:‹0ëZ¯ ±í G†×‰êÅŸ¿ !` ˜Î*É’N—ѵË2#/â‡.‰ïy”ð1 b] ‘…žŽU7Dx$µ1D‡â‡Ž‡h5¹Á‹ÉMiT3‡ÛùÜU£>ŸKb)Ânõгp ?‰ö²JJ÷¾œùLo#‚«2˜¬Îë#pÊ3BS|×. º*Í0* ZL{ax·.ÎG,œõ¹C86–ìibá GX›ßù4±´94¡žËˆKàꚸ5FK¢j}Pþ¨{0ã¤6# /}*>’ŒVügûŸù_XÄáÞaÄá¥qÞ¹`B^ÇôQ¾³ÐΨòì€FRvÀ3wÅÙ­¼=eO`EI°!¼nM%•F—Ä÷t_3­¡Á{ÊžÀŠ’`Cè†I'•Ö4Ér7mó?µÍà5· |Ó6MÛÜÑ5°;F6æÿß3ó/`©±ð¹­÷6k,¢¨”:Táµq*§p¨=£Õ3òÁûyÁ}Œ6Zæ“°+´ÄÖ Yža%Ô™°G²É¨[ÂÞ§ˆTxÇŽË4Рlo‚ÂØâÁ´Ì³¶Ñ2{ú_£¥ÿžégýÿ™~Ñ Ÿð‡_¸,(^Wl£ ÇC¹ sªiÍ\ j’ãZ&2 ǧ¿Íˆ…Gl›*šE¢ l»´×#ot endstream endobj 54 0 obj <>stream H‰ì—QoÛ8Ç?A¾ƒ_ضk;iÚbý×W£@“u¯woMŽ,6©£È$ÞO´Ÿåìm8Ì^H)õKáÚ3šáþCŒÑ|i Tür4<Óš¬¿M?ßB*¯hÎÓ 7¿†¥Ùý¶ùǬKØüö³TÒ}þCrê¾^¸¿+Wû¡7DØ&–Pj +ˆñdHRÔ î<íwÒºpî¬Ã§†+Iôƒ““ÿ[U ާ£DÐs÷ šm—,ã€þ²ùKÈÒmŸ}QŸ[½ý¬_žN3~„f0ôœ]ò¢é¹ÇûH"—g)¬ÆV†3t96¡Ñ[-„ECe…Aólã3-”ÕÎD™t™$¾L2Ò[,HeØ n8Ù´Ÿ”H2˜[UœÈiÓ“}‘ƒ¦Ýæš”9§ø†;è¸ã-GUQªŠ¸´ž;ß?…RðŽKƒï|;U‚&FyÈ[<»„dšð~Û…½„ÀùÓ'9¿4=xŠÖu]FXkO9[ ›Ðè èn»>Áƒœt/×)´ßZ¯ñ ¯€ÍM^€Áû¶v†úÏÞ•ñû¤I¬æ‰jyz›—‰¨åó Ñù0àß ‡3È“£áâÛüCÑ¡Þ<ûxõ™ßø,ÈúÊ£ò­æd^è:&º~ªåw fª¬dîlSu‡%jJéBM…¾w{9ÑQOGƒSôÜkŽúBá¾4íÖj(Ô ¼òFD K nÉÚS·½Ç´á4ññÍç Å,ÞÞÔ±i.ãäx48M‚.fý +·áñ6ºXKXx—ûèè<\2ȸl<(òf•@Ì, [Ñùܳ¡h8Â7Ü'œ-¶]Bt4©$ž‹R[XA|en“µR¢³ .x:lGG‰ çŠáÙv ÑɤUºí³/êóc«·Ÿ•h-"’䯭·‘˳>a{àþ‘«iŠ% „Åù+‚ìRi¡¬¦p&Êœ Ë„ŸÂIFð[,HeØ n8Ù´Ÿ”H2˜[UœÈiÓ“}‘ƳÌVè1ÛuEÄé‹(‰vÇÕà­VgÎÙ.œ—ÁÛ‚ý¤èpkBÝb _åÆýþŠ*¡ðëÆÃ´è”ã°ûVÁ½œî¢Ý+Í{%+C$^Cþ‡™X]™ åÛ[C‘ ~/MpôzqKÖèUÅõ¦!:h`4ññûø Å|³¥Ý½6…Þ4ª:Yi9q³&\2¾R“®˜‰6QšÈº5ëOž7ÔÂÞ†G'¡«¸„UÀ俎Îãê—ÜX´ˆ™ôh+#:Ÿ{¶pö Gã†ûµÅ¶KˆŽ&•ÄsQj +ˆ¯Ìm²VJt6Á%´ÃvÖ„ž»oÐl»„dx‹Ùªßö5¶„ûYcó'HãGCÏÙ%/šÆ{ü¸”"ö¬~7Bæw^X“ãK²ÞxoÐL Ü6ÇASµ25Y3^û÷O›û…èµg:C½K|º¿ã=jùªêÄ^_Z™~¸K®‘ ßùS´Î8¶$vm|Š%©¬ÎœñY¸Q‡ûIñéеm×÷JÖ·Oø‡Ä.×ðþ°¿+×{å.1ñfXÌKÔ‚|˜†™<]‘[ …òm­ÁÂ…@¿–&8z½‰¸%ë*`v¢ƒ†GŸà¶¢¡˜oδ€êØè0\2¾R“•“5¡n'n<Âä†+fâ.íDi"WèÖ¬?yÞP {|„®âV.à>:E%!ã’t¥4”@Ì, G[ ÆG)œA¯aŒqÃ}ŠÚÞÃþ›Mº‘Œæ¢Ôn’ûÊÜ&k¥Dg\A»mg3é¹ûͶKH@†7)­úmpQC`K¸Ÿ…16ϰÎÉ‹¦ñú²ÄÖ5B¯zÚ^õX ãñ½ ‘ßyaMŽï¯m|t¨7h&î?›ã ©Z‰nL3^o•ŸîÑwqžå ‹ûåïÓ½bõè/”ÕÎD™ô5–Çø{¼‰ÞóÕ}=.-Z›ÜºcEÐvT‡÷-À['2ÖXU‚&ÆçZ<»„dúô^¥ªx¯¦:ãYf+´eî¾ n>._œ4ê=פÌ9})z0Æ‚\{"[ ›Ðè hçu}‚9é4^®Sèä5äu¢¹É 0ø[˜6h}™ŸhiîË 5]ŸxëøìÄ›€ŽÏN<ÈavfgÇf§ÿì]»Á*XÉÕñô 6/QÇç;@¢‡sa@{Ÿ=œA6˜ ßæêŒõåÙÇ«EN˜º½Âw&ó×1Ñ…S-¿5Se%sg›ª;,QSGj*ô¥ÛËÁܾ®T|)¬gPôÏ&/”ÕÎD™“—â”=nkR6ƒN6B#í'%sb«Š9mzòÉ> ¶ÐdYfsh ,¨ëúr¡BD¢ë7Éc÷w Ì30Z ›Ðƒ¬ñ ë„×ÿ²¾G?ÆðtÍx‰›@WªÒ‡¹&eÎé\ÃjÖ¹Õlüzô¶%o939º+°ñ ž(¾ÊñNiéìãÕ"'LÝ^¡;gÞ¾¬c¢³¼Ÿ¢ëƒ÷J)¬R Þ,­¨åw fª¬dîhSåyïÐ…š ¸—ƒ™[]ÑÊ}¥/;XãMž×*FFzƒ© ›Á '›¡‘ö“’Ù®9±Uʼnœ6=Ù+üô¥/*D$º~“ÞaA~P³“‚ŸÓlðú_Ö÷è¯\üþŒÝ§kFðýJTÍz…ݼÑ)ycæš”9§?rAžï‰^Ûsﳇ3È“£áâÛüCÑ!Å8ûxµ0Ρáû’yyë˜ÃbÖÉ ‘iB ŠW€}AM2òÍlŸ™‹50RXSô1ž¤/>ŸŽ_ŠË—ja¸¡9–§ª£¿rxiÙˉN8aÙ¤-.”Ü µS¢“~=Å¢-I4üÛ‚¤ø-çAVŸ¦‚†BÝ ç~"dRŠÕ&â–¬=¹§¤†è )mâ£s¢™˜Õhž:¶Ë72ÓªÀ·\œç-ÚQ)¼ŸR P¸dqçnÑš ¡bf=×ʈÎçž-EÃƸá>l±íX‰ç¢ÔV_™Ûd­”èl‚K žÛÑQ"è¹ûͶKˆNà8ZåÛ>ÿ¢fÀVp? cSþ„hüÑ`è9»äEÓw÷—çxx_­^Zá^6æ]qi e5…3Qæ¿Py¶É½ê¸Óën×—Cßùv$ªMŒÂÏÊ]B¢ëšÁ{U”ªâÉ®,´÷ÙÃdƒÉÑpñmþ¡ÎèÐ’5~ÂvÈ-g&G·Ç}tôŽ!ʯrü†µ Îtöñj7®NÐâļ½YÇÄßJкCç®ÓÿÔâX'àPËï@ÍTYÉÜѦÊóÖ*  5p/3:º¢•¦íÏP¯§IE¾—ísPay4TVàõrž`ß\n¨gXí¸ª:ú+€o㽜è„ï°hÒ—Ô›²vJ|IýutŠe XP[x²’™×úוu/D ßaá;,|ÿ«= ßs-|èxXø:ÃqXøú¿ðeš8,.¯+ßaåK¼ò½~¹+í°ñ6¾ÃÆwØø_À~túâ6¾¢m|ÿTŠ­4Áßçή{¯Æ/eá !9¬|ý_ù–ÂzÆãƒë‡4)naK_Ö¼ÆÎ5)sN_ŠƒC¯?•a3¸áds €­µ”ÌÈ͉­*Nä´éʾ¬?*Ë*ð\ŒþHBC³)´ÓõE ‚ü¥èÛ(–ÂEáAðŠ­ŠÙåVú"cT õbŒML_„+ný{U£ý¶„^Oÿa¿Ì–Ú†¡0ü*}˜lô¢w4”Ü@Ó™ð[ƚȖ«HŸ¾^â3:ÊŒ-Éx¸ A'чõ/jÞâDTí~L.-zÂŽ‹‚P¯v&¦Û 3 -Ébþ²’¢Îï4ŸY„è,(¶P¬ÃÎÜ=/=¦ýIxA(y‹ç8àÌë–<+¸¤Šäw1M- yŽ×Yâ„bCºø\¡‹Ž DdMß9êî%mädô)Uåß/ßB|?Ö;äÔN^vðdÆ_´½Ñ,y.äx ù0‡I+_¢>y†JNVLçh+‚4Ó*Eó¼­ïêûËDXùKµ4UkÂYǺ¡µnˆ¨Yí¡ÖðÝÞ‡j{² ‘f ÖÚàXcE+’ëˆ=VëŒý8Ø?$Ú†›ýõZðœœAyü"m7°¾4Ö¥±.}麴ÙU€}iõˆÈ5+RÀw Ãé¤\Ìœù—À3Ð|ýIxA(‹h=8ó§%Ï .›Š)ÄÍõo8†À¨úÔT=ÃsƒÆ½WŠ”FCñôõikXÙ©–ö‚n^Û9dî5Þ¶.|²Àƒ,€€ *͈«~ÌN Ú˜ŸnòÓ–Ë÷èÄû›çщïžG'dŒÎ1:=‹NóÞ}I]ž$’¨ŸL AâkV¤Ð™¥;z ÷D<‘ê?Pê<^xÝm  ƒˆ°ßœJ‚= Í0ò8¾©g®-5#y„¦ ¥o¸éÖI{FÊùFQ¥XY¯~ ¬ún$ØÉLÿe]Òr­KE>[ µGz'»œ\aÑA’[AþêR–;4Ý»)gÑrâ(¡Ø{åG½ÉØW娌€ Î×íËw[Ÿ~›ì>{õö·~…wÅÃr‡=ÆÅýA€¡8Æ97µP$6Àê´Àw¦ø†>stream H‰ìWkoTGýþ÷K$#-—îêGu/ŸÀ,(»†¬ É"­Vh°Çd6öØš'áßï©®êk£ð˜`9ÆÉ Ùu»«ëqN=oï Ù¹?ìþrr¼<=œßm6«ÅëóÍ|-î=X­fo‡¿^>qðÃâøp5_Êw?Üûz¹¹ø&ÿmÞžÍåÛpïT-ß¼ûõ§Ùñyû¼{4ÿæèh=ßÜyÿÁåìd®¶ÁŒ—O÷ŸACî=Zl§ËÙJÌúà‡Ïöˆ>âÑ®üðø|µš>8>ûaã¿[.pèãÎ.–ôñ£îêÙ8}=¾ížœ‰gßž¯^oëÕj¾>?ÞlíX?þ»ûöW׳ãùöéú Ùº‡>eß…'§góÕlsºÚÚŸ‹ 7VЧëÅf~‹JÃeú|‚ê·?ŸS¾t ù1mëÊzsøhþÓb&&míÔ»—nŒKOfçëõb¶”ôÝ2:½<š¯/V[íÛ¦ëïFŸ¶ûKÉófözû8è­-#ÑŸø¢ÁmíŽøþ½ü¹ÞÞ«Ëwn¬¨<>_<¿EÕ䇲‘7ü9pöäÿ8»Aœù?K9{¸Ì®oÙYΗ›oW³å#Ï-Âû‹ÓóÕÁóÌÙ‹ƒí§™OìGïŒ3tC뎺öG??g´þÒ—¹OÙwáÉéÙ|5Ûœ®¶öçâÂÕ§V"Ö‹Íü•†§óÕ›ùƒããkgÏíÙu>¯¬\Ãòw- m —hÞT#mÜÐã‹ãÍûÞ£ùÑpç«_{÷êoËÃß?yÜnŠ(‰äÕ³Óå?¡b-wïªøáüÍbyùÃγ3ÓÑ>½x{òúôxg÷!¬.V‡wvÜð?/Þ9¿ôÏ ðóÍŽ™sÜèbÀx7zW‹üåB~Ä ÈÚ¿—oñÇßñË!úyˆÃÓáßÿqáh~¾s·¸êGÊ5 …(1ãúIþ(âÇP| ,Šý„ä–Äv?ŽÀŒ¨¥8²Æ¿¦‘C»ï‹†G=„ˆ‘g `Ix«Ûsâ•ÆŠ]W}3iü<>{¯÷»Ÿ#bíšXrÉF®©jPsVø¥‚׬N#<í~?"5q)éû)h„ZP¸ PªUÐ⯠h,Y„±5Á+%pÅhÂnj€¨¿°À,gkÖ³@ƒoÖ-êBÌѰÎSýȾsÆ V*8ΩkU^xü¦/É›\¦v 5j«©½%fb£puÞ€‘«7xb;Iâ‹VÀ„º I@áÉ¡Y —ÚJ]ÇðÞÎcÔê¯^ÉžËÿHclõZ˜ƒzZÐê5ìý¾«š\+—¤ºžØXâù„t78x7ÅnØè€¢Œä!K,E…wÈbÖ,1Ø<ÞKÛˆÆèJ•Fsar«‡ªË- „J¹á¯âíÚTP–é%S’ÙTÀuè”õdLH¬µTôzoe#¦:Q&ÖK‘¤<Å¡Ÿ¾K+2`MŠÚ¤Œ”½á„3O±à:"νúÉ  –Š•Ô*UP‹'†¾„í=¨xŸïðS‡Ý;ÃËÉÄsvyìù-cÌ{Èseê\™8W¦Í•IsUÊ\‰0W¦Ë•Éreª\™(W¦É³iò—©ÿÃ]DÇ)` £w* ¤ßÇjRé¥û&N1Å><Ô ñ»:dx3Š9ms^Çç“.ÁF@4kš´„êL‹ÇØÑ¥>9kªÕ'kŸœª)ixïc{“¬±ÉП¬ðF_§=Þ†ËH¦Ä‘¢´LöÕb Ìö™g‹Zlã ¾‡BƳ÷Z`¦!ýÙ¦.ðëš1Æ2±ïaþõi‹3†ï‹á­9ébR[0¯÷§E¥í/ƒ½¥¯ (J} Ä^…A¨¶gÛeÏ*n²šG’©jX6Š1&¨c!>S_˜ªE«)…0g1J!{SÊb·³²)¨®XBlÕB}ƒÍðÛžÍdØ˯Žjy¶ì@eé€ocy¿žÙV]LïWqÏt:lc¶Ô"9ÅîCR‚A‰:¤m§•“>w!ª ) ]p›8Ql€Ä²àJ0èJ“ š‘uXwZ,UÌŸd <¹~Z ºž}í“*WSlXKÅÙVøÐ¥ªÖrYb¼³ŒðÅh"_̃-ÂK–,¹ÚM ÌÔ`©#v?²dÙLú}¬:æ@L½ñe׃•¬CAèˆLg¨dÀ‚Øûh÷Ûê´ogæþzb1¿ju&DÕéΦȱ+ÈuZYƒm·P0ÍnÚ’ï×)vYðÝ-<ÀÙžÂ( ‰Å¾ªm±î±BÝÏS¡º@– nc†¤Åš¼ä•;²\äž×€–aJ¥v`85@âut(ÁõdK;Q!¾¡£‡¶€ü”,°—°í}"f,90ÐJ™{`³€QðS/øÕë~ÊRRúnU]èKoŽlmRX¼÷¡z¨b4f;œRè+[ŸàPœb «o6?ÉT6qµ°?Ãè«‹SÝlE´‰³–Ù-7Q(‘lTò™m0ŒX0M-SBÐa¡mêYŠEWÒP¶¹$ø>¬™›L[È£‰³s¹A± QjM&¬UkjuMð$c’Bób´§ÐÑ‚Šr¡®#˜ fÄ!N×g›l[àt2àúú´´AÀÐK|BÙr:=ˆ'®E0Iyð&ì³RB:²ë“!O ¤RðDZü¾‰Ñ|Ì„ ©—,Vs:oá(j¹¦S¢ª è¶qz-%ê^LmcB´™¥µ˜™T÷A&ÞnÐ[ŠH‹:‘'€CˆæbÂRu䔓Fœ,½r$™ˆÈé6hȉÔX°J¡ óIçÌ¡¥·çjâ(APÇÀDì„WÛŽ]Åý‚ù‡ó‚Rú^]É“cÈC2A±EˆØ$8Á8rŒ,þ>«ªVõ9ã€4Ö°¦wíÞÝUëÓà.%úSÇêA r²Àp–ÀíÃy³Á'ÄÒ ¡aAÙÇ0õ᪀à";VÁ™ÐsG›ìoCÇ\öÚéW@múª9—ð+æY|F¦„oª“+w?L7Mì{+:¸E«6ÖôgºÖvî ë>$ü\²2üv€©Šh“”l§šÂ¹ß@Ĉy ä1NY Ž.þšä# }tš&\‹T+G„ReU) ‘ThØÀ¬¨;؈:Ý/X¦…FnvŒÕ+¨t¶F³mÅŽdŸpO›Û4=ŒŒb†z0J7ó´óh$z äh`Ô…•”Z1L¬+v 5:Ñ“E€°,,Qz˜€ø°ÌOÙH¸تϧ0¨QÕ¦]*¸v¦0àì:Á…y¦„´cE¬@*ËãríœegÕš œ•e誧Àhá…lÄB2-÷4¥Œ¹ï"È‹ž\;¿ #Ö¶¦dn.-à¯Àä"s¡j‚kÇÇt®“ÔaÁi¦âŽL1R'×¹ddâY])Øîì3Ζ H~½-àq4¾ßº$3^)=W+p e&ï šÍoí<@Ãü.èB&²”{i^"»sâØ:[ÚÍÁhMƒ!d‘ÓjFHúÎ ¯‹%´jòÁÒÊüäÁ1/\z'l’žeEÑcŸÅ²g!M½5ýh™À,‹åÜÔ.L`ÈW›³[™UpúšCN¢ív“|#=rôWíA(æDâ¸V^‚“'iþjgªŠµ©aÜÓÎ,¯°ïdžªG×Ê:„„]ÍÔÀ}P‹]¼MÂixå47êL‡¨¬ ÅœJy/IŠ¥–ÔŽx[GC]àâùi$’ÚiÓAM7ĸç 4º(_Œò3Éo•T )á%®‹ îMJÅi) ˜Äì¤ÔK…·höwƒƒš9ÊûöùèC‹‘eð][DCÄw 6õ/ÛÝXÀ\˜;ÀJƫۂ†4¹6h—Â2Æ®‘ 4@tËZŸ¤e *Ø!nm#øÍŒJ¬@¦ÏÍÀøHèå’’rWÂ{¶<­QÕï ÄTeœb9Ng0ø¸±xïJªE¢ È‹Q´# ž?ClZåÁÜZ ñöÌÄ1¶Jq]æÕr«†²(1šyÚ{=†t£$‘³1ôí X,†Ü–f™ ±qT¦3³ƒ+ÁÙë:…F] pa²v¨km‘~Ä/•kgø!½ÖÅ÷lw£„=Θ;Õ%°µø=Q PÝÑwÓ8ÎEoT }ÐåôHp"†±¬é¦Gƒá0smñÃWcm+ar rp&´¼ø)d“)ƒ-F›g_°ÂC[ƒ ]|ëÐô~‹ð\î ‹t®îðÐhg\]ÊÆÛD 2€ìR¡ †ÊKuO¸OÑt4ë #¢ng~ºçLéŸÊV°ñÛa 'È5.rwF¡Zïþî¼`45˜p†™‚  9<’÷tAƒáCœÒ˜HÆãÿv]¾fœ<àa$þâ$‚Aáþ§Wߣ̗wzyÿƒË“?ÿÌoï?zöòoß\½zýé÷Ÿ}ýúÛËo_ýðŸo/zùò».õR.¸À'ŸÝ½WF饘Wé¿+ÿ«ñð:w} ’Ðõ¸•öQQܽ·`ã×ǥܽ÷Õ‡xÕGÏŸ¾~þòû¯_ýxù5 Ë‡_¼~õüû\b3_ù¾yö•íçƒË/°â7ø¹Ù|Á¾ž<»[ÊåÓ»bén^`‰úÛ„_,Äéå_TYc Ê5ûð‚h¯ÎLPIz0¬Yá] GGŒÐüyÇìéÅlûóÅ<óTö¸7ÀšŽÙçq9…•p–O9{E»S3¿¥6Žœß$(A&Ýg Ôž°ipÝž|ò‰›ùæ*¬¤}*²RÑkQ'µú@Ÿúò€Raï;? ^fÍMÏK¸ G›VŽy¹ZK†êÚ|m—!MŸãysÜÞÕÕÌàX¹¶Äµà.ÆnÜÔaŸê÷ë †ÎãF÷14:8K¡›ðdê—-`mØœ æØv ç0mê¡åÇ>a—kÌ5èYÝ{ØZ6€? eí§\>·ÿO{þÁÿŽ¿¾Á/‘w$lˆÈW¼ˆ?à³·”“>'à;>[TÔì6í_àçKüè“Gÿ¶ðóä öW|¾}–~Äÿü¿üЛ˸üñò—¿–Ë3[ùùÝ;¶ôŽ ½c;Ÿà…?øK~V­@É¡‚P¯{•A°¬0L˺‹Ü;½úöÄ¢åTÓã¬ÞÀl„mÂO«É2ë¦úî„wß‘þTõ½ Úë_÷±K,¼äºÝÜÇZ½…ÂRø öMý˜³f.\§Þ”%XzËÕ³³‡àÎÀðò,¡š·íî‘·]J‹TóöâûS-Cü¨˜Ã’Û“A6xÍɯÞ1°Bèsƒê^ÐÀC˜ò˜`ɳnšƒÛ(üð†õæ³æé7Ú"iÎ0ê“G¿&½ ÁîXù:9¨Í–ßÎâÓ,m K/evbí\}¥}6q²½ý.¸¾¼gõ„h äëvqÏ{I>Xye‹d&§±ñ\îKÝÚuÊgfY»¡ûÃ)ÂmUé1Lþk'Ø[‚H¢`³e›}¬ QŠ}ulUYuMiá‰+‘ŽX §ã2%„ÏáÆ:޹'\†²„¶žu _6L såβfúöÊ¥m²,ÌI›u°‚Kä€Íï…B—!¹¦§î ¯º;oøûçÆ@ ˆ$RÕ^¹NzÑ¿Iƒ( #­ÓÆml® #oߑġ¾µãt5Ö<<E‘Âl›Û^0梞BsPœì°{½ú¨ã\׆Ÿµh/¯[#Ý‘DXFß]…y¼—rI–ï òãl–aµnF(ÝC>_Ww#€¬Ñ£l. ³tì¥îU6Žùn±-.¡'1§km#’3kŸ…T<ª å¾h¹xÔÕœ›â½ó ¤ùÆ&¹ Ol‹BÙxäC*knîC-*¹v#æÎ8o3·zVOÀ 6a)ÅOó}3m²1BçÞpDœGµf'«TÅëbµû1ƒÉFA»“Ŭi_v962Èq–4ãps»†íBï‘!l¿í ±‡i«øµ”„Ç…YUîñcA“gUãûf•U ½ƒ±mLÂÅds”iLQ˜>Æ P¤ÐÌtÞ³ÝvsN#$§‹¶ø>÷Šì-êÆ¤¬v±JãV›+ÕzI ³²yÊ5V֜⾵\ÌB‚ŸEXHÖf”0ên{xV=GñóÅìÅ-æ+}ïõ Õ=µ§â@÷•D½g.©p奼 c-#Ú.ÓØälâÔRþ .ÌC=®:T-ßÁ»¥XºÇ³ôÈ,#©ñÂvhX°f1g:RáDD\•îù¦ÒåÄAÉ-q¤VºÅŽãGŽvœ¤ŒZf¾ÙFÄõÛu¨ü«©2‡©¿È]ŠV²\é%Ægb©¥úu‹ –:žÚOÃ2ºàyìÊò½F8Z¬r°ƒÞÂ!ê(4Ž€€Ê:L²S9,—µÖÎÔøý–Ìh腵ı€ãpyn#@Â)û´/µ¸4§µ÷Ãæ­GÜ£Ά¹•pv/6T†mµ]dX ØUJ‰½±eQ° `f峊%©B×.[TÁX­ùêåôaÃÄîNÙ<¯ôô¼`†^óÝÙ0haŽ5³Vj˜mpÓ¶,Üõ-ù-°ÿ;“Æo£ë­K9|/YIž³:ß)€Ÿ\y¹ÆËý¼8Ð&%Šš÷Ø¢} +møµŒ~Ì®¬d‹U7Žì¾U¯&=ŒS ð8¼l~/IÎ^›ÜÈQkæöÉ“ ’ŸAVÑU£º07^.ÕÞ.f«ù˜©Z%Pk2¿ÊÈku;͈âÆI³¼¾‰9Ùo6g™cò:ç¹%›ó¹žTœ¤Ž–w=íΔ˜d¨l=´NàtÒ5b¬Ér¡0JDí¥:uµáì·â€ä¾"•AQC*€kZm¨' %ÈK5‘ióÕ€•šœý®Äëª{k§Š]³û–P¨ë˜ZÉùÂÀµzéÎ>g'g—r#´¨Wf.+´<õ,ua÷ôÕlB7‘UËŒæò,\:eWÏœŒÊ» €™Ò@Œ¯WŽeÄ.}³e/zš:†q×4[£ähF‰–SÖ»qMDèk4—q@ ïí⢅JD%$éزë;5­]P¤ûC,®àÔ¶:˜ïS˜nîá«z-è§ «$Û @ºB¬¹yj¬0·æ©YŠ·ÔW ó˜}ößW= Þæ‹¿ ÙSn=Úï_²èv$‚VxìîüýO{Ï0ßÜÛ'oOþüþúäѳWûîöèõ›/^~ùí›ïo¿~ýö¿ßßþôêÕoù–nØÙO¾¼{€Ñ–„®Lø'þMºÿ“÷'À8È‚öyC]Ûc0ÐÏJªz÷ý1Úç)Ý=xú)Žúìùßß<õòÛ×?Þ~ Óíӯ߼~þòŸ·ÌÓ•ÂwÏžÎ|Þ~_á÷’|B^OžÝ57¼Å§ó7ݾšÿ‚> ÃÒ„;\¯iK›°ýn}ŽOßág8²+^t¢Ì ÿÀ+[n‚0¡£n?즀ðéeÛþ5~¿Á/3L·Gÿ™ÿà÷É;¤—V%WÖ?â?¿Åÿ‚éÝMo¸ýå¯éölz~u÷‘Œ>’ÏOgóGœ÷vùÅÝÏ•âßü~Ù½ú$P¼/¼gl²ª#{¨ÀÊÌ.æû1Nw,‡ýÁBžn•æ0Âhwóv°¤‡$É‘½úµ{¢Ôzï´Ç‘†¥-ŠðÁ@˜†å½ÇqÕЧEé;'œFfÖKé·÷EëŒK ×G‹Ä ³}/ÇÐv ü"Ì|Ô^¨I>ô>˜Ã%&˜ÜáE˜™‹ CƒùjÛÚh‘«O V=ëÅ9IÈ%ÊŒtÊI.ez“P£Õ„F³)l´¹±Îmz§^bâ…˜A³ºw°i–ä ºˆBÈ63&°¤BË{¿ÁwHÈA^×£ºp%Ðæš`\H8š¥ñ"ƒÛ–&0©|¤:,ââÁ*}mDܵ[w¶Vn„ù}E› ›µ7¹´ öð¤Æœ‹§xP†ÍÍÏêªlÍQ9è&TMËÌ2ØD›Ø4–<‚E„˜fh@-¢h9amÃŽójнôn[Î­Ò åY™ÕÍ-ó°‘£¸Xþ~];¯^І«Ð¦ìs‹–žf+—‚3+5c²zÚ¢÷‚]Û8R•*hšO«âê \âx†[L¶5$Ǩ}0ðnîâ•YlÂDz°óÁ{+À°<WsrßjaÉøfç2Œg•ê2·(§ºa+yÔ¼çÓKcâ¾ X±2R5§½sÈò¡‘Ybž4·Ã÷ V8¾AíÀF¢G\lF('ìÚ—§2 [M§=SuZfß¶êÊ Â)§~ñ ©a„<úaÿ³ ««“ÿ{uK«G2²ôAyˆ$…²±ËWç–u¥ l3¡$HA3—`ÿÎ6g”ŒëÓ·+æSÝHåö?š ïÓb¢&9?Τ+S_ú£ÏyY6ÀqP@ ºbòɌٶH¥[߯š­Å÷³ˆµÔ£7hÊNÄu2¤m´Ô „N™X4ü°ÚÊÙ«]Š2DŒÙhØè²ž“{ÖÑzĽ˜í„mÚ½´j•“eæW³j4¶Áûb²õ¶E 'êè^„Õ«]r¤.‰7hŽ•ybTtƒ’ºý\ÔFù`;éC¶v-t-•šª Ÿ;ÄŸ¦åkMT=9|Á <*…Qµ³9}øª¼­ª…oIìƒÞkDmŒzï ГÌöBa° YEkùT|¹îfÊ ‰*ä{2*®Æã8åè“·è{O£ÊzŒÕ¬B4‚n_˜‹ÀîÙü¸QRÄmʸ͈âÄ$gqb|LfÜt×ênLüllÑK\¸° gÞKè`‰AMR›¼3_˜ C8¯™¶Án4K…éöb?°µ”aõ`‡ÄZeÔ<øî‹UF€1x©dvŒò¢KD@ˆ5•`%Éx¯Q.•ªœ `“Á›Í4*ggÍÈHì°\O½Zaã-:æô!d¢ ‘|Iz:Ûs’)×G  lb31»³I±¨yïÄ"ÀHÄ÷–{‰ÄÀ%+a«d5ì¶©rOC*x²û͆¶yÿëØqƯÓÔ885z$Á8zK¶pÉKÉB‘  Øšî+Œ šBGgg®…°×ã4W!л ›^+Ù »ªí°Ì : i—XPy4Ÿ*Bç%¢š°‘!UŒƒür Ž“a¨ÜVÃ0ë\4LŸz“¸n"‚VD¹dƒ…Þw’FäÌT› ¬8›žxžª°+cœ»1¹˜iºP‚©ŸÚŒ ËT=˜åeuîb‹Uð'ðÂc€ÒQ `În¨5¼Ÿâ0¹±Öét0ÅaÂÕÈÌ`“¸ZòºVtì>46ÀˆÙЕ4·Sµ: 衦 ŽƒÅ¼¦: @ÈCðµ4·´É:}‚`,‚™Ä'4A™°°>’ÌäW#2WÅ’ÃZ‚Ý©ò½„•)ʸø½b×ö~²’ÍœÁGq–ˆÀTg/²À…ì&Û%u~ÀTfÛHN ÇÑ}•ƒ'ædóRŒ!à¼\ÌnL‚Bqú"RÄFª ‘êS:ëÈÂôV#‚à:cWïehü6@6Ø$xë ¤ÐµÙuHh¡%º¼dnDßqŒBŽh0ªhÒ/Ó »ÞÇ)sKÁ¸$Þä\qvAê04HÀ„é‹,Ú¦6‘‘’²hOáqSãeÆìZ%ÀT~bgn:ñ§ú€ÊbE¥RÜ® vç‘)Ÿ®fª¦ ]ÀiG¬ÍñÊäÞž |ñøêjæõ®lO·Ó>óíÉñÅÍo·ãÛ»—ׯÞܽ۾¾½ÿnûþææ×ÃÍm´i³9}µ; ½[•‚Žô/“ÿ†öÿ\¢Ý„´†ŸG½°xÂÄÏT=Êî fýýœhwpöT·zvy~wysýæöãö¥BÛÓïîn/¯Þº3gÍ…·gÕŸÃí ]ñ•~çIý:½ØÅÜ+ðrW…¨&ÕiS¯Të/ÒîþK‹wÔ îi­üõ¯|gêV?ú»Qm‹g®åþ¯¶,h’õKdݩ˃ ê¯ ½«_³ã€•Z•çÃ@ÓO Žƒ[HŽ^×÷·»¶ÆÝmò£ƒM7°U*Ü„¥‡â„#¸1xú>±TIKÊ †ÚÓèÁM9jHïɃpÖâvÎf„°$™KT˜gËçb0Çh¬…9E÷®š(.¬.œÈÚ¬ÒšÁ¥¥La솸†‡FØëfn^&&•ºÚ#ˆÙ¼5ùDìáAÌSÃy´ž$>$ ‚½š„Žb؉\\D ¨_Š:/Kl&\p ¢ÙUËÀv( -â¦íèSÂILkGÊ~xø2côqQ>©À.[ª…Ê6¸ŽÚÓ Näqpž°8v‹‘ÑcÆí×>>^ÖÁ^(Œµµ£˜(¿ ‰?IWÑ[ ØÈ¯Âcm6’R0¦gP‡T2ð ¬ø0Îu‚**,0P[›©­â ^ÈM×4˜ƒëÈž(‹ûÚ\¼ $=å"Âzåi68IaU†¿•{ì’ ›}NiG¢•Ìl„‚ 3SÇy &îÒTé %©W ¾¦ÁŽŒ‰3/ÁIÙúlC |mž¢‚ ª·?Vrœw‘OÕí–;ÎÖª}í¨,Ë¿%xúF3 +;Ã_ ŸäÙÞLWa;t•"–¬sÔK¥A Ê ªÑ™¦Î¥¥.š¤¤Yì¬ÏˬY&ëça¡æGút…Ù¦[7‹Ëû‚þJ5òèÊcr Y—\œó¿x|5ÌìµýšfWŸQ.û««™×»²=9ÜNøÌ·'Ç7?¾ÝŽoï^^¿zs÷nûúöþý»íû››_7·Ñ¦ôsújw@BªyÉ‘þeòßÐþŸëO´ P ñ¹rg‰'LüŒµ1ì”ãJ|N´;8{ª[=»<¿»¼¹~sûqûR¡íéww·—×?oÝ™³æÂÛ‹³êÏáö…®øJ?‹ó¤~^ìâ~ÓÚÁÙýƒm/ë-XíÃtD¢u@G®Vœþª2û}þ§LÅ)·DæzWúàj<`ýÙ3@”E—RNJ>ÇÄõÞPA݆ÛmJM>ývÞM$U¡e¿$õ¤U%ŤŠ@j ÝA“Qdp“ä£è4O†‰X IQUN9•¶´Nri€Îlf Ã%êb¯G¥y¸VJ›Ïªo«]È•°›•„hÏDï)ÂM¹V,«òÍ# ¡[MtÔ¤"»l1 Ud9õŽÚ(E±(¡¹J™B½ûtP  óŒAVEÑnBÔ©¡cY:ÕåÙÀì’¨èü¥%Ž÷‹2fŸ4ö¾ßdâÎÕ ª..^XãÁ¾ƒ©Î“óiͿٯ–œÍrº•¥Äy8¢’ÀƒFHHˆb€Ô³»çØ>ν%ªØ=¨êj'ŸoâØç-ºwo¯`ºP÷T”!uNÿbÁ«?è³O,ü#štxOŠÿ¥èëjÌùmèÝRÀUc*ôS4¾Ðvv€¿w %(Uç!oÖ®zô†-ë±âˆËÌsºº%éª+Z¿‹œ$ÒÊRhQ'Ë勘Ccdè§ô³ßÚûƃš$È‚H«åïŽÌËX;¨0¿rÿJÖ³c¹÷Ì€RÜ Ûy0X¾ûû*ÇH-¤.мw6æ:xôT[x×Ṵ0?³˜,gX#kÅÑ ¢u%]Çη¨PI;½§9Ì wË¡C¿)JAœ^Òû¸cÚïS°»}7|ÎGg¢å£&y‘¹'ç@_8³1.´saRÚ•}Zo´;þ•ßÚ©úŸbVK¸eœ‰4û%§†ÇðIÕ„(¼÷Ћ èWñ%^‚k½ˆÚ#Nf.VR°³}F~û zÿƒqtzûl½Þ8÷ïï„©Êis<®!Áizù›ž°º«:áú£ å˜æÀ D59^tç‹)&s†uëN"“3c§œX ­Jáv#Ê*ÀŠ­Ñ†o[¤ðÆm GÎ6grz–Ké4i Ó½' E­÷–œžju¼’)~x§± x¼•“â’2ô4Jg°Á NùàcõêÑãåJ.ä´®‰gÞ§†brPR±*^ãÀgоȼt²Å'G'°6§äœÉaØ8áM¡àžœ@ROÍTKïnÑš>+ÉéAS{M ŒÒÈ@ÿâD,M”õ¼½Fæ²;:Ó^•”}ëP»ÑãgY©Ö$3<{™®­·j_Ú:…F÷ƒV[‡@kŽ‹ ¨úêm“?áÏŸñÇ®ôi¿ùWþ'þþË/wˆ\ †RúwüïïðÏ"øËÇüøÃÇ_ÿÖ>þž¿øé×aúu˜þ‡é?p ?ægè@Èûúð¸“âšaãÎÄŸwaÍ5K„Ø{áÛL% 9-‰²§PÿùYƒ"¤/¯lóõ½_ñ¾ÉÙú" ë2&2å㻟üúÍy&æŒÊ£ò:OçØ·Ô °S˜ªIö´ ¸ ã; Ã}ŒÝ'OƒJùˆŽ^Åqñ÷ÝS¼ŽˆVÙÔt˜:Ø«:" ™„ ýy€ÿþÅë z?ìÑØöó³ y2”Ñ…ýçË.…Âæÿ”1®¸• ¢=ƒÃõëõ+²»æB¨ò:ªø+ç€#ªPS3%(–¥LˆŠ±ô€?&FxÆÊ­±ûM¬~ªÎý:6“X;|*?`%.Ã6 ÿªÔÙ½:òµ9¡Ò³Òv!é© Cð$ØCèjà 3ƒù5™µÁÆ|c"V_›ñ±võÅHKˆà©ÆŸY2ßÙw¨7…|Ù=P Kf´,¬J;ƒÍ-9 Û©iZBo¥pÅ+LÑ¥ÕnäeswíVÚX)Ð-·–ǰ;` hÉn¤z£¬p˜|…÷û–§ŒO0;ÉRn)ÙíÄ S¹QÝ=`¸x¹ŠVw«²-r‚M„Y‡Ém6,ô>™!,\aNë›àÜÃû™5Tué5uVŠm7·÷Ø®'¹›w»þcõJ ³b£?×ÃGtósùІ[Å+¡îU5°É¾Ðöî6˜1 AãD)áï¬Õmmj½ó1­³íÓ*-á)|R¢œÑêñ¨2YÁþȹE>Y,ò«ç{_’Á «£„¼²µxFï)”±Š2 ò(v;ð”˳–¾-RIÃ>ã_ÿ‚æèŸ?Xk”,Ý›Cˆ…Tl®_ ä4ÎïøÒ­ÍÎìÆÂN¸pË·š>.‹â¬o¥$0½75šèŒ‘ÂäŒÛ!%ZnúHɦ ½¤ÑpåÉÐxxY.ìÖvÉ®¢d:"ÙdÐ,ñènë–¹4ËV†Vü˜qdh©¬}”ƒ¢c¾´®TÖQÄÔƒ!£D×(8’Vp˜ñÐÂÀµÔ&~Ÿµ\!ÁRg ³[iR}¥Œ\¦À}\6|ÞÐòŽwWËz´–:›¼ Ð@*ð̃€·çë›kIÝçE“8:ô)'Àøð>[2–]qÕ]§Ãx”îîpÂ;^à ÎÃë².n@´Ï‚ˆÝGBk›,Ý®' 0ᜭ/çqt¹»8PˆSrç}§] Fu»¼Øö ¼p¶U,*Õ½y!󛚺>ƒ†<É ­Ò,–~sƒw—Q*´‚QŒZKáëå^ŒíËÃA•a9Üǧ砕ʢጠ õ˜ó)‘^°tù â“(A;‡ ŒºÙMáôt „“r=¨|UÚ›1(³UÃ~¾Íýéf¶M~ï¨ZŠÓWÅâBâËMá /” :˜ð>”úA,©-8Þƒþ˜i[ÜٜΠ|ˆe=rS{ï”!ŸxA ƒé{âfg¬ì_ï1¥É¹[[fK}+3Ù!›¥[¼(‚PjÏ;aaÒŠ >žXJD9Ájåµ—e,¼Î3O˜ëØ,Ù¦9¾£…È0=I!e‹»A(”þ )!˜©T‚n?ïÂØÑ¡X¸˜3ucP[ÚKQ"æ~É_ᘠ3ƒ-:ƃ}K¥HŽä5I} SÓP!¸rÞ0]´R†ÙÑñÊà \ ¢~?†Ž›“õÐØz $ìc2Ÿš)€Z˜vBßÀ= .ñiÞ7|tòÔþì½ F©9d ó÷}ÄdN¡Yx’†G­ú9SÆv8˜P« (ªcÙ?è*Ø­À¡ v[VZÚ§'kêlóô´ôX‹ fÚ_ p<ü¦®+ŽÎÇÔ’gtä±âä{g3©¿c»ïø¨#ýëU·kçQC_eß µRçÇ3ÃUHËÚª ¡ª$…š…TQßžå¿ùfs¨P%*%=±çøóxìåµ°öÅC9ÎÓµKT|uçzK5Œªt¯ [¡:/[¤\Ð…¶¿ÔXœðÀØ%ÇeÕK ¨ƒ’ØczœnËŸS1 žãd¶4„àÖ8˽ó}öÓÄÍ×?G›JVV¨¡‰ÞÏ€‹fè ìSr•„¡ëi…º•âkDÔuî@st»†:¨ï¾›Ei@à9˜Á)(<ƒÄúQ%)ÑŸî¤JÌ’›&‚P‚åÆŽ”s ¢»Dêh-úäÝGEm5Vô§È8=Å÷’`«z£ý¶ÉŸ®ðÅ|¤‡žžî`•?ÛÁËÅT!ħ…Á÷‡!ºgG›Û`7c«ˆtú¶œÊdlm–ä8öÐqz8Ï’+6oPq"ž±3b mÿ‡me»,ïÈ¡¸h«“*àÁAv˜ ã€Ü¡u›ØQxlž.Vjºh¼žã¬fP¬¦U4˜¢ù‚FêM¦3vm<²ñÆI.n©æ(†m–‡í`îQlYÎØÑìx à> _4#š3 àñÚöêg ƒ®=lG,É”æa'øðöì?é_÷ñËçï^¾yýõÛn¿€éöÑ—ïÞ¾|ý·›'ô•¥ñÍ‹¯4§o?lj_âÏ£‹døì~˜ÛšU$N*Þ' « u¤àìÌ©JiÞF½ôä‰s­=ÃÍç›mRT°S÷º™ƒŠÂ&‚µ‹ƒJÓe€Þ´ ÇÆX“[HHÀÁðE´bóÑÊ9*>û<躴ØùTcÿ.G£¬È›º·Ü¨k‡À Œn0SÙCKØ_S [ _ OJc ñçÀ–SÕûØ-È)׈³¢Ô½¤4$]÷JMѧ†.$ß)X‹kÀ°±#_4Èp‡Éb ˆ_Á!†nÜÊìƒ8T´Œ4 Ë.8˜368Œ\$þI͸µ&Ì„9’£’mî:äiÖm/¾¦!æ’ ?GŸØ* ±5V€@Í.²ÐjÙÀ–l Ã¥Nö¶"ʧøS1;¯ß¼¾AÄ(”Ûgú7Š€6„:!´„v*’Á¿ –ê?6Á©Îm”ÿÚö^½ÍFŠ"°|×F²²Ä.bå jNo›kùEE­÷*iÈ cMAk+nG(.øòEEŸ–FG¯Ô„Þadß³Êĺ½ŒÖEù@Ý«9êê3Bpá¸F‹$¦ÖÔ° VTHÎ,Æê%ìsØé¶Os¬02ﻉaoRc/ý©m½.«e¸¡Fmê«ÏÀ(ì´*4šy:ïB«Eb“L_ègÑ•už¤ýŠUå ó‹\q*Ã-3„µzÉûž#¥‚=Ð+• ÖØ4š „’CÝ·[n±ïãO¹}ñ?÷·æ‡÷ý†ev´ÞÂÐ4¨a©>rc`—~¿W§ÖŽ‘SÇ—6d¹=ù§ÿÏþ~ö~ç¨ëÑÐöÏßàÇ¿ÃøþF·ßÝþôçr{á¿ñÅÿ7ÅOB}ÿ¦\ÃUJÚ­p&pï ™”Ìì`^±Û<÷¡ò #m¶­§Ñäë; #ŠG8áæÝwVÇêÖ¯ÿüâ±Q?úô>£5#ÌħΌdEFsrDêÍÉo0ó0êçÝ80©OwP 9B‡±ô–Öá}G†@• â°.Wo˜ð‹ÞK‘¬Ì£_x¸ †F ßA,ÍÁ™,Ó¦Òê˜cD–C€±3a1)§Fò¡Î§zºCЪûÒ êhT¢ŒIÖØ5G¹eW™1cÃA#ždŽ-åÔaÂ3>ʇ‹d$h¸óvC Ê\Ri•¶¶£Ú®THòiï¿Ù–} F|Ôˆuy¦á}`¤Ï#(WºZi1gˆÆÇàw3?6V¦Æ¡#¡iw)ì;éw] °Í¬¯‡WÇì+c{Ú0Ò(œad¦1Ï•VÈ4{¾#MÒ²OœÈ¹‘³£Ú®‡HTNÚzÔ„ žt¢Â’¨Žšc ò›PÑz¢ù£[±YwWËòE»´kºF‰ÞÃOóî¹$nÌÑŒ’-¼zÉREŽ|¯fª¼â½–Ëm0NøIÈÓ~ÙçRV;" ÊÙL.wuâ.™XjÍi®Âq9ü0ŽÁ}Œ$1·#Õ{&H†¸¸ð5#:¿µÆÌÓuAË#½ ™aQìÇÆÞÒ8š§δÖ2‹ÙXxž]GÂqçàFµ“`ù;DOþ§[Œk§×QöžŽBa¤õŒ]⃤Û6O®+´Qgóz¸4©P‹dœÑ«ÑÊŒkÅÍÁ q&Ñäˆ ˜ kbµ¥þœ¦ÝuŽk r^|I|Ï(ùuñ±Ó–Ò{5¶aKoåçÖŽ”¯w´ÅG—–Ä¡*!…9è{“7عT:ºFšsŽ®eÌãØÓÝq/öÓbrcÇМ½¿‚ùǤ”q»PnœY[ĵ–¹æªEÂq…(}ÆEÄ ¸á΢éFþb»ÍÕ=@ã0ûaÄdFçK)c¨I,¢s#àZñÍØXjëŽ%¤['le”ˆ¼æ:s+£G…Öà½PARE2i@NF!âZ©øµíàL6+çª)Å9ó>4÷ü ©+Ã,m ãæÆÑãzͳcÃAÔïKúcaÉ5‰AG„µFV$ %ŒÓ ìÎ~ÔXv‰Xä ÑzKGVƒI¢›yyÓªq•x>€Ð<"äVê¾ÃX(+ßÖHc”鎻$jV¹ªÌ¼ª¼‚zâæ£Ý9zÊÚ{Ö ",ë$mɇ'åÇcÔÃ¥n+Š×Ø7=ʈ“€ç³þ@Ž8ÝË…ºwŽVZ.ÎR½¬0Ž&»kg?wz™¥þ—ØpEl `³Ó’·,{}_'yƒ¹Zyõu(pÇžܳHRZNÌŽM#ïÒ¸Ÿ±÷(ÕYrèÜÈEX`Mݪ¤ï 1kæ]—Œ#=£˜^“1“ßM¢ÌDb2¢lµŸ(Äm˜¢F’XŠk·.YRh•¾5äÊ$Úu–™è¥ÖƒtÑ›`€ušq·ƒkgݾ*¯mC*»~1GEdAiqËÎòå½@ÁÖ 'é SÍž¡ôUõ˜È­¡s‚ñ\BRº\›²î„CœîŽ1Ñ-2J r .7Ñ $¸f¢qdù|K ­8eÝc¾ñâ¢;CÍ6§E¼îYìs•ă÷þ/I]Å¢œ·W»WٖΊ¢Y ½2e+>Ïã zP|½H™lGN»Guá›ÁâÎäç¡ÉvSK¼g¸S ÄJéY[¸¬ð½Cõú ®kªÝ7PŸ†š)~r¥pôn˜3+utQD5Óš…;T‚Ì!¡¨Š$fÆÝbXx4óÅTÈSôiC5 –§Néo¶/k·ìð]WÅfd$h®ÆŽ ]ÕЕŸ1ä¬AVgÞc#É2´Y‡?¯)X\Ósr¯†ëÝ ÈÅ”èƒýÆÙ$^YWŒ(–kÃ-lô›?úÝ}OÛm?ü©¿_ž~|»ßÞ½¸yùæîÝöÕí‡ßÞmßNïÏ6¿¹ \áâ%6~˜ˆíðÆþµ;þøirB¾ägoŸ€? .Iÿ>ªªågÎá÷Ç8îéÕOwW§›7·Ÿ¶/°´=~uw{uóË6z=Âx{ùºÇt¶}Ž_âóà"^\â—¼–U…J‡ÁùJ‚¢aSŽIù~W®´ØBC]tÃs|<"º9Ýlج|ÐÛ¾íÿâ(4€ëX|¡  nžú×a‡õ㪆1)Ç)¥C#ãÂ܈2 ìžâÂMˆÀÛ\õàÝvþ¯ùßø÷âã ±?áHÒ§ñç_ðë?±øq“íoÛßÿá¶Ëùoÿ¯>7išq¼ø©úu÷fƒEÆMK”0!¢ÓK«)8APk=ŽžŽW0§q@©9¦&ºcãNŠš!GÝÙá.NXœ¨I)Ž*õÞ™OU7Õ$Œ yÙª~’ÜO¤PðáîV\d„%„b$l¯wúŽ ¦å``Ô÷‚0vs5î¯PÂ.å~ã¤d)(›N¡®‘E‹ä(M}gÉS^ÅT“Ù«úª&½Å å»‚‰ëX°:ÏoP 0#ÉX».”¬‹©G#Sàu:Dïz¶†¤ÉO†vCtZЃ1í†R+ÃÄ Øõs°cw›„‹˜(š*0|+_q=u‘û\Ü}§ÈDóR º˜§²ë€/µj|ã)w×f|r1+5ç°q’¹U{\«‘%]r<ªÖz×{Õõ¤ M×>ëyE„%Üa¢Æ]|SR;~™‘ZºÃåe¡@vlºVÒ`ZX×µEºnö%~£ÓÔ„çyfÛgÏ›7ÉÒ‹×½Bµ9rMØ Õ}7Ô``MjeвT¾LG¿¹ØÜZ”]HvCã™)ªÌ¬‡u<˶ m¢7-ù B %j–¡Òì „ÄÅB ;wßâîNUŒkÒá^Ù IZ^ç…éL@ˆÓoyö³“5M5ênðÎ5ˆÜâ°ªz#z˲}\='>[* ÇF_¬Ô‹nÊò9LÁºóyÏÒî:U–£_ÔKõ¬êœTœByzWÌN£Ñ*G JÁ &c¸g[ºhÒl‡œ(ÈÒò‹jY·œ"]x±*mxé“\å•°0!#U”[ Õã1‚IixωPa4ëäF‹.ŒÉ3 xì‹åÕuµTDxÒ%°Bï§±‰¶l@:Çäf …Ká”Zæbò5>F=ÊŽkΫ^‘ÎÑæbu9Ð…‘w»š˜r°ÓºÄ t³š‹ìt°¶añNw¦–‹ñm ÕºÎR4ÑR1âV/YSåbn¼9ú_®ó ÄznE2ê˜ NFV¢ãM²"¬Ÿ®vϨJ ºý7¿™ÚÓ€t'&¥©ëT$psH¤9ò©0ƒô©²?ºG™è×np "Å@¿RX´ƒ–¸K¼µH]»ƒcm”’–ßL¿÷.RKcÌ‚„¡ÊŒÖìmþ;y|pË*¼zgžº=¦‹5ò/•‡ ú˜pZ¾­ÍÙÞ%Ž—BÛõ|˜â¹†-Ô_õÐÜò…¾s%þ¿°ØeúE©ûv¶¨kšdèe¯nJXWÌ( Vª;švv1e¶@Ùã†!в¦¾ÖX§D–‹‘a—P-Ö`ö ]ËŽ+l¢šýúÆjÖ¸hîÄÕ+ªé3Äåé 2%‚[t•÷kÁâXHÂNŠ ccõA{. {ktçî"6ÇÊóÉæ.–ä€,kp¡¡§ãVƒš;;YÛ-mµiœ¤©ã}acÔÑ/˜y#FÆj\4Çé} &<0×Dðä0å<×D8÷!V4d1³eˆrºï“²Ò—2[+™Šñ¨lÐ! vÚƒDœ¸Èæ¯îŽô ÄÒìôeÚ~ø\ÌyMßT¹Øñ?Õ1 M£„ZRƒJ¦4HÁ[Ãâ…­P“IOƒìN#‡™ËÅÆþtvˆ‚9NrgDÝ N¢4háV4ãCYkìðÑë»kïó Ä0⸈µ·k¡æj«Æ ¡Ð‹¯¤L¸*Á|t­ù¥æ‚½a ^÷æl£h²èiu6”–Ãê£m'€`'ë„Ã7ê¤u²#ya<‘¢ò‹µze†>ÅhéhñºÛC¥X:Z(êâ׀ >0 ÏHçÓÅLåê[±‡‚'« \Ïràä ÄÀˆ¦pÂEábPŠ9ÚÁ”Um•´˜$µ ’'º „ƒãÆ>8ö61/¶MÀrH®sf}ƒ–yîvô½k(éˆ/MKâ@ Å4Äh­6=3ÅL@¯’™¤’âjR½EË‚k¨óÏø.^¨ 8Ù¨)êíCY*.ç”xóÐŒï,Tªâ²;eÏ’D¹²!vòñ ’ùa²½Á$ß_K „ÔÅ–Ø*Œ::É õÆ·gÉ‹;d;˜ÊΜd>°$d,°§brgøˆÐwŒÙÒìÖ(â$.Ùüz4N®“2¬ÉGõ¡¤%+g²¼å–5”Ìh,EC­ (Kýy]3Þ@Ïòvm ~ꪤ‡ß0î:ŸK“@bêö|m(ç‹~óGß »ïñiÛ£³íâ‡?õ×£óËÓo·óÛ»7/ßܽ۾ºýðÛ»í»ÓéýÙæ7·a´]¼ÄÆÏêÕ;üT¿vÇ?-˜\Xð,ãó“àÂS°ZéßÏ+ÏœÃïqÜÓ«Ÿî®N7on?m_`i{üêîöêæ—môz„ñöòuélû;¾ÄçÁE"¼¸Ä/y-«FˆN¹Â ïLlÂW¯R·÷úNÏ”6ןããÐÍéfK9«ÿãØý_Œ”¿ÃK`jöQ€/â/ó«úÍè´Ù~ÀïŒÂº^†çÔÝŽ¿ÇÀ/[;Hý[7&4Â,­ð;ûÕŽc× CW=¼ÅXî§qÀHåT)‚A0ðîMéêèR3°Ó»™yE‘Ôá!÷]ÃЮF6F—ka¯$ø2Xäó61'Ç©ÐÅŠ…ß „…Ç—õ-_Êtx\—pîS8™åv{h„G†PæÆ2…sŸ{šˆÏ ¹W>?~#Ÿ¿N}ì þ—¹ýŽÜþû¦ÖËãç®_óçï/;û£Ðg)}™ÿþþ—?~{|ú£<þ¼N|ü‘ùïÈüß+¯ÿýôÿÙ¢ê5»…GÑåS^«Pƒ¢ìéh( ^±ÊŠÓTîc¡ìe¹ÍvÞãŠ{Ɔñá©&YQËÊ,ãÍâÙ‹#×FööÎ÷§CêÚf‡âùá'r|òN¤ÂÛÛØ3ŒÉÞg^~ZjÍWx"žmÅ0ŠÓr4fË1¹v´ÍQbÊbøÙ lJSÁ¸ÓÓ0!c^uœhYN×&ùöo…Ñq¢y{ê½1^N™ái4|Kf 슘”“û±%ÀvRz²R˜’¢n¸TÖ¬` Žt©8o ]ï„î½ÝÞ„¢¡òg¾“mW˜‰÷ÏŠ.þê¥w~ ŸÛ†Ok‡ûÔ7®ÀùðñRŒù©Bù8QaŒfe:îO)HÔåŽLhKï›Ê~Ã×:–Ì›?V=°o¿Ý’‰7…²k†äkÏ^³ ze]*B%6wøR­í‹-a@oÙnvGä=¶‚KN´½ôõ1۰„7›O¶¾MhCURBFÈ ¨“œ}YF½“˜XКMG}âkI Ea‡Â:>stream H‰¬WÛŽUÇý‚óûÅHáPÕ—êî䉫âÄ‘ „˜È²ÌŒ ™c‡ þ>«.½Ï1Žb Р¡ºwuuÕªU«›tY¾Ù}õòNg’}m,=å´oId cáFÎc)KÕŃ£ .Å`¯±›G ¿2FšÆÎáB ª5Íyl£Ê}~‘{¸¡”Ö˜S[yF!}u]÷=×¹¹ž›©–y^s·ØÉ}žE,[)ÅB›äUÍNÙäi»0æ}ˆÒfAjgÔqmAÖÔÞž!¹µy¯ˆFêcF”güµ§;³´Müµé;%Þø®2‹/¥ÔíB£¯S‡ƒ,%o=wŠÝ¹×íu€Œˆ¥PݦVdÄB.µ-óŽ9»±¦TȲpQ•㡠Љ…~-U­Ï{–ܦ›N4}Ó˜ES\ÄÎ$Ûútnë¡×jßAowEÃ8÷¨9ŒE6$……ÒòŒ›ê 8ÄBë×ÖŒ´ívâñ×ÖgQëb=”êÜÆÜ®õPkiÛJœÊ\Øvz¢>=Õk–”õ}!˵/Ò,Fm¼mÇœ½½ÔÕpW?‰/Y­Žmç›…Þ7 ßüÖ[w‚|Ò By~\õžÛè>ûbº{ŽŸ±Üº½¼øîwýïÖ½ÓÃë³åÞåÕ·O^]½Yî_~øõÍòÃáýí…Z@m/ž`ãWT(S"&üé”Óõ?ì+<$U¡‡»!§øEV³§)Ó ó ð{9æÔOS tÌÇå?kÝó–ߨ¥NLy«s.5%ö“ãhëu¬*“«&xX>­­4…@PXôoÐ`›àäØ8©Í«0>q£Í…¡Á]à‡‘è‹ÃÅýïtþ^óÑq7Ûó›ëmÕ\kyïk¦—.NŸ}:}xÿ¿öÓÛ‹°ÜºÿþÃÙòøýáãÙåí-÷ðóâãîþÒòíŽ ó‚DÂ?È-ï`~ú¹ù¯0+¨-òOøÏ_ðË¿±š1ë>.eùÛòý´œª÷§»; ÓPh@c*]‘sƒS [5·½pSýG‚Ú– ægéø ¬þOÝÛ%WFa!ü–J7øý×îõÍ™ºu‡Wè«ÛÇ&¹ÿÞÉɇ󧇫WºwÓ!Ï׬"5{Ñëwý§ZVxù¨1%( ÄŠ ‘1€¸ûµÒdú'SdÉBM 4­0ÌÜ¡z m¤p ¬L¼¦#W­ W̌Ի¥ 6WikÆÖ¨šW«9e¤2÷pdë =§´gJ¾·O¯IÕ®_p´„ÛTÌŸèç•÷\t ª•\8ByïyQ#ï]2PøM€ߨGy:XË¿NÙU:˲jÑ䯖£çs&0õˆã;Ž×ô}¯Ùööü »¡Ù¼ÇƤçDg¤f¨5C eëa5æ¤RSó7ŠQ¾ìRÔ€ºH_ïk©Oàü±§Nu8*1¨¾m3)5U €Y•£•µ.ªótoG…­V8KˆÄ¼¢ìÕ&ë`pau(g1ÞCj45)ºÝÇ" {-1êVYS ä‡Šxi>tô0“8jÄhz¨+¦’€>ŒÑƒEÙØ"@™¸ì¬é^…™êA»q©5Œ2Œ1Q£®¤kÀ<ÄdMJ ÙaYõBÑë¶£ŽFg¤dÓXð[ i´LöØà¤ûó÷’j"ØKÞŒ‚4—'÷®¢ `ífÄ_ |çäÀðQ¹*GÜÅäã‘FL°ŒáHÐr¤8BxÈœ©rmY®¶Wóǚ[•†èà‘l%¯’ V°ÀZõæsvhÕ£¤Œ/72ɃÝ7-w¿¾¸Âx¹/'‡óŸ.N—_ß¼úùl9?œžmHìÃîÖ“Ãûw¯–‡‡«àê짬Í+ëßïy1+µLhÜTÒËÏ»”P»z ål,gÚ/wµ‚š-ëÎÒ‘s7{ë¢þx;irF?–‡$ ˆúÕYÅ?í<œaxÃщÁ¬:À¾-ˆƒ­Š-û{H¢`¼zxšR¯âðFQ™ž‘zsPË<!L&â‚6M+ªhÀQ ƒ–ÅÁ¥:Á8ÂáÝ×wUK ûK)D y½yD cF‘NAððÿ5¢~Ùé @r0– º’ó°!¥Ç½³;9?å˜6 ¼žkH¢¬díM l̨ð6 .Œo#â¸}×^´ÖÕèd™õ± #J¤^ ‘UõÙCË£†ÝKeìá”3š½wšÊÆ>âû¨¸ÚÐdXÓ‚0£’#9öՈ½>8@!qÊšài¯ÎdX²ÉgU‰ÞÕEQá Ð0H*-6{ãh61.Ö!ãMý6eEÍ·FÐ,".„ÕX0ä›ñ¶<|Ê4™ï6è¼0%F¢$Ì=˜È‡ç¼ÞAsÊé@†E­p—ýR“ Ö‘UDZ=vÑ ¬„g§\9zº(Q»J©|O0%¼cGI_¨D ‚ž%÷æÇcšƒTÖf¿ªs[ÇØð‹6J¼:l*2ʰ.8wå§µ6/¥Ø¡Gô!ëÚs† ; £›~'§ŽÛàd÷çÝwhÿ¯2ïù.t¸uŸi_€Óe/šÍ´/@¢šâ£Y b0ÂMGÛyLOŒv‰Š9º±Ó(¦~¤)òÑcÝLONþ"±y`9sÆÍµ'ìͨFd /Iç«ÃƒÝ³/A/7úžÌoªÖJ_¸p4ê”7€³ò@<œð­+1ÃUn4ÜÎÔ ä ´¼Á¤cö”bZXL‹z“g# Ðg£~ÉË©¶å&^ºª¨òÒU¿’u`…€Ö{Œ½[JìÁöSfÔÉiʘƒÏ05ÔL h3gv50z‘ëðøb·Ó®­*RmºZ+óë‘l:œÙÁä][]UbŽxË*#YýX+ðå"ÆL÷ÝËœIUYÄ:PU9yü«ÁAt³³4FéÀŒPóAHx ±>!Í< =,¥Ï«©Ï£eCŸu¢¨üb-S\D›\Õ¯Þ2mÊiŒ›© Ðe{&Fé5•‡b2H' ôIæh5¢F}(–€Úh½ÎFt½ýZäËÝMÛÖÞ" \ñQâw6s­2•ÀÐùmF¼C()ó%›|Ô Å–bI+J)š¤Å6ÉA›»ïï™™µÿ¥ ¦HäÍdïµgÍá9Œ#œÐ¹†\Œ…‡»†/|ÐSÙ¡æp%=¯Þr¾)ßPmAÏ| ’deÕ0vW$Øhe¸BŽyIª€{^A›û~¯®÷ìÙ1‡Ðpj¿Ûœ¸JJ¢Þ©¼„ !WîŒH¶Ï#”£¯£yTÓ}’»ÕË  Ñ Áäqö$çf§þtß{ýÆ[’-ÔÏë,‘goFkfï«`ŒrUjžÎÿ^ñdº3é9lº’ÈžJ+„@…æg­ÂFíÿ¢~A¿¼”dº}lÈöÚ;æŠQ¼›´O¡N3ï o”¼}°Ù› T»RñXؤ ¸IamZ A/ÅhCg"ù( A³“*Aû¬s5ät‰G«ÛWÙÄ@^óld[x¿BuAæÏ\ÂlìµëñêÒ]¿“n ¥L£}à‰-qqÞ{­N@ŽWfe‡@,¯ËÆUZËÖjh‘ ˆ[ë‘×H>« . ÄµÂ‘jÏ^,gXEÙ¸Q„éÜ~ªÀiø°íê¢ ÎàÖɶÕ ;ÐÆ…úZÚš{š>ݨ!Fµ+T€¾·}¹Jò÷é4aF·KR)5±Ò»{~Dv¡Iv -w¬Níµß¾?ç^U(9ö%„.Ѓ£8Ÿên\LeÂà'ÂBáuÕ€.ôËäÈÀ&çM4- å‡:©58¾-ï,A³ €±Zó6k!®š“Mª9Z€‚*Á§Ö|ó†,ªY$[­ç€ºK㑱Ø÷c”u2cVUNéQïÚ ïæá÷‡ê(›Wu°æ¾2M†Ì‡“Û jíW8#oä`Ä×%dGÌ á Y.Ö|?uÔ\b^‚y)Ü\;ûÖoáäãÈ`»Ü4Ë9\:$_k[$ƒb»êqSýfsÝ¡™TÛ¾µvãã*N±_¨¦¾RT¡ÇÇÐ ö6Øp*˜Â ª0wBƒpöîðìš®æÉª›\å[³™™d‚¯ {té ÚÊœÑÆ¶O¹ÂoUíÿpãÅófÈÎË›©\C æp”|d¨Qµ\ȱôCY9Ÿ8ŸÃ²IP©l­‡OLž5‚ȯ=˜Q|sµ(á,G—t@Ö‚ÅH>¾HÙÑz ±'…¶MBB㎭‰á#ÒÒ{ZN²y/ì¹ÂZ{¶ÀÍ_sAÉ ±é tH J2ëß–qÙ‚6 㣆Óº ûejWå^ò>z›)Øž¿ KW³dz`¯û.BþYšˆšÐÏÖO®SüG#8µž]\ÞgÒ*wh¤õPËhì|ö¾„aÈK6cŸÊ6r¢¯};>¡«Z×Àè(_ð¤KëÂÈ ¿4œ”Oçìšx䣙GÞâ†#³s­Þa]§ãéðD>CpÏ<#˜é‚2ƒ³_¸®DHЙv>fThÁÆåö;l”Özô·åúêNêgôÊ÷÷þñ!÷[„ÒC„ÒFòiUE(ýPw©$_䎑OoŠë’Þ tBg UW4ªö£tÎ˺5»»’¶_+ ZÖÌ}@Vöé$—ݵ€0æê"9[/¡B¸ý´Qv\£J t¶ŽþýcB!ûëõ°xâ9‡r&$^£“;À“©J)d€ȃ#‡c>pPÛ+ ¬é’ƒ_+üë–íVUÊ>‡ –Ìÿ$ʱäc¤hAX@ÏÔB[Âÿaõ$§êjŸ‡În0¹]«!$, Jµ±~ýîI–º® ²®ýr,Nîï\¦­jâ‘»>Ú \“Ô}ÏV|V•A¾&t_ºÚ¥Zö‹ËÙUÞ¯žmïù€ {S}n›ÆÊk`xj‹£þ€å>Çö½1AÚçA®ŸŒ¼OøS/4„‘ 8;–\m±3rÇ9 j Ò)6ø@häŸåA÷îWyÛ°æ¼–½KÕ4} /Cgïñ±Éø„Ô>Tu¿¼·o÷?º=úêG¿~öàrûøóon÷?ù<×?}ýæÍÓW/>ûÏw/_½ùË»ïžú‘éöñ§/_>ûñ3/¾þæÙÓß½ýöÉÓ×þTþéAŸþóÛ×o^YvwÇY†'«ßðxúûg/žüùÝóo^>‹¿Ê‹/"rÿÁ³—oŸ|„ú„?~0aô*ˆqHöß¿ äøýèù=?þEè‡[»ýñö׿¥Û½úP½‘ Ò%0(ðJ1uð­fIø¬F¬Öè92ƒŸ[•¡\„½T7š¦4B7,/ÿÎ/‚ü2ÄZõ‘,ˆ!ÜyØ“š›Ž¹qt†DµÇð0A–¾×dã¶ißG•!®»{³5v€è®KóJ‰ÏÚšž•æ3³¼†Ü+§rEþ~LTc€ö9+sœú˜äC1kc ‘ ’ÙƒRˆ’H~€vhåð¯[`EÉ‘ ›-w¨ ÐLàv’VÁ eÈÈE”mX.Žª%ÞgK‚"3%€7’é N"7{6C·ûhÜíûÀE.fFt•ù'i8Kµƒ«»Û]ÍæÞS~±¤Óº¯R!eúJ9òïáÑŠãr‹ª8ÁàX5›[vû`B×¢‡n£‡C"\Aø8ÜëYÓUÒ*Ø5 ŒcÏ3®Ü¯5,LŠ3[ 3û𴨂Ÿª¶ ÌY÷ÉI9M.¸®ž0LE÷Š1F2õ…1“æh',,íi(GP6Ó20×jÖp6Ôñ”"ÊÑD•a½‘“IþèdQLK5Ÿ,.ÞªKÚcÇm.ÞmŒù…˜1’˜ ºàÏNN± ]ž3û]ÇZ±‰,½ñŽˆ—¸y”ÛXɂ蠰Oòkj‘ØDnÑ襥0­‹)„ŽF~zÇ!×áL! RŒG š¾·Ì´¯6ÒѳÅmÝ‹e2È2KÕ3XmWe¯ôQ€N|Óâ*ºˆÉ½|Ÿ5+ªX«´>éÅâËÜy â&<ï@ìçú–b¬4Çæá+4øEÀ(ÑJ?³¢Z¦Ê©ä"Ê’köMýj²è}†˜–³(Q»8=[á£b'ÀàŽtUø¬)RÛÍ 'š ©0 Èðe[šJj¹ÐðXõl[Zô œU½áA½§rô(ÀW‡­”+ h¦oüZšBi'ŒÊ:„åæÂD©x¬È9dðšñ}7£AuЬ´±ŒvGÇÉ¡`JB?\]êœ6ŒX›G”a²8ÓªÕÊ £¡øi@ê.Uc·3XŠŠ‚¬|šŒÃh’ûªKåeZŽ BŽ HHXÃ*}]Ç4aàÛ`+¾::[¸&ÊpZÅ, 1)ßô}¥ÕhÓ¸·+lÖîrhHí„4ã!ŒW@!É·ÏP«!ã¹Xºü¬±{Õ"î­ªË&2Ìc PšrrDË3 ©5JC[¬aì1#aoˆ9<¢¦œXLY'þgÖ ‰ÜÖ\$ƒQ)Ì~ŸêM¤»¶)´ø,ÒIÅŒõ*­–"5¿®×è¸s¡ßD¨h}|ia¾“DY†¦˜¥E±(9™Î³†?[4ޤôMӶܘ­L{ˆü,E ŽŠûè¾ËdoÓ?Ákõa{Ó©DëD€Io‚™¶mÈÀÑò@)DXMàæ¹‡\Á2Mi¬3ÞÛæ‚ÂmÕÈ–@ӋЩÛýè:ö HÚ÷Ž6{EÕ0º2[=óö1¨K7dä«C¤ôZ2hÃL»k±„r¿K“j‹¨n%R@éGEð1S9¤¦¨.-â¶ÜžŒtaG€VñùÔ€€ú©3í³$Ñ#ë êèZ<5iº/tî½áMøÔ%]ÈE I–º½ûÝËgw/ß¾yzûñòk,•ËÃoÞÜ]î=ú&׿<½»{qûæ«_~~{{÷×?¿¸ù¶¤ËÃ/ß¾}õß{Þ<ýéÕ‹¯ß¿|þâwåÿ=èñ‹¼|wwû”÷}:î7øs³/÷î_žüíæ lO?~õæùw_ÿôöUüûK|ø&Vî}}ûôÝ»ûðdðçɇ›÷×ÿÒåÏ0b¨/&¾\hF/éò/,ïé¿'ñ?à‡béÃ¥]þtùA ¿z¬±¦VM5ÛfuñJá0·èÕAh sÜ 6ÅŒ@Ö´¸7Sÿ¥‹ôdqŒ( Ö®’!máLÖ‚‘¹šŠmå­NœÄ•N`ŠfƒÁ-'³OéñDZÏ]µÈå!>i\Î%*°R5 (>+4ª…«¨c÷˜÷¾#ÈÓ¯u¨rˆ€Œq%ÎÇ‘](ÀñĆ14°“:Kv¶Ièú~’Vµ¥+ɤˆƒ—QxôYb±piLZ`tq‘–iHDŽI(!Æ„V ò"ÌàØÕ&#ʽƒh‡x0÷#ð‡€ÜDÆ¥K©q‘Î@ ‚¾«Ôð>é¬%ò²ª± è¿EŽ)l¨2-€  ôŒy–ћղ¹[Õ¯8 îêXVºú CPÛ çÏc+•}>àf»Áºœ àÔV„­ˆ|<"Ø€²•ÂieíE„¹œ×ANãb¾€Ñ¸€$/«64lv ¥šjX;ò‚`Ö¼DÚgwÑ3Vcq­¥àT ;¥KF‰.¯Òóè÷|to¨ 2ÇuLOÍÆ)Õ˜r1U 5ë1sZ}ÀÀÏÌ©ì@3úÃÙÚ}…ƒ…p,"C|„&Ÿavs[Íc”¤ð“@íø¿¹‰:Ê ±,ͬ½£…à^5 A†É"5Å”é$4u)ℇíª`;U©„µ®Y£Å£ ˆK|ްùüVµáûbPêtÇ›÷°ˆgGtÛ¿ß~¢ÿxów°™ðýùÍ"ùþJ)ïÁ/ïE[ùØSòC#?T|ó-iȉøñÛ¢œ7 ž Ý÷Z¿  4´Ìñ'hºn Òû·w´D:ž'L5¾KÚcTqéš9<ÒH:‚DÏ‹—ê”W±°T&´oB¯¨³¨LfØÇuUÙh†-£à(¨t!ÆcHHÀøt7g ÿ7)“d ñ°z:‚n íb¢ÚÉ<-4ýú[ÆsXœ1ŒUÂ}<Šh¸™ë¶°c[j‡ˆÞûÿ%@çb'CKõÒËfU²ãÂO0ïÐ/mê?«–âîÌØ !¼ZÈ xc„ÞÞ‘‘§ïHcPs0Æ9Õyê'3âK ´q c“4(¶VsŽràœpMm"1úÍ6‹ rЮŒ²& Ö÷`#eiPôb»~þ¦P+ªx\¶'1ä^Ô)ðCHêúüðêMmíÍò‹V;=Cv¨cí®bäï•-J2&’íé^ZÅŽ^+è¨Ø¯÷­órÃËuAxÉ^󨳱²ð }'eÔ§+>½„Çó›åé{Že>Ö ^§ßZ4Ô»‡Æ4T‰¿NW;&ÓHû¢'ºø[å‹Ä.êÎà £‚ÆÚŽ×À4‰‚m:HÙ¾z `5z½ëÏ ê(%Þ±“ÁžÑ~NT2A¢j‘ð=Þ³#Ç8È %Æ,G†±ñó„Z u¬9\.GÊ‚²Ü;oVzí"4MãÅuL”y–å_‰÷Æ? â{'^ªû6ƒ'ßïÖÖÖ:‘s£d 'U»>Hˆ;$#¯Ã¹±÷ýùQµP¹IwlÕáß}ú$ê;©"@¤ºÔ-2´ÃÝÇ›Ä-ë€0ÍY‚a¦kãsQ_q|f8A€ e­óáË‹hWŽ‚˜øª^1qܵÁ‹Î'­_g¸.ÿ‡—.¡¾nûŽYDg¬ðZü-ÔW)`½ÖEŸ•ËÃàËq4­QWnb{§Ç–±‰øŠoãëžz“ÑHØYl2^¯ŸÀ'¦82:wãî€Á]öHAÛî8‡9$oM7a˜ÊçŠq-ì,ðÚƒ0^<ƒÖÑ~ßjµ»[¢Q铹Ý4–Äa¯Ö\ 3áíiYž‘úQGfSÈ… 2n/þFä"ÛøÇÎNÇ?\U‡íA‡VW,ä.Žk’ oå=výá_ÿÀ_ã¿d¢òøê?þ‡¾?ƒÊ£>Jüàÿüù ¡Ÿãñ—ÇwߗǾòïþ½ÂF·Éè6ݦ¢ÛLt›ˆîòÐmºÍB¯Ðïå Ût›nÐmþy…~^aŸWÈç.÷ܦžW˜çâ¹Ë;wiç.ëÜ&W8çʹÍ8w ç6ßܦ›»ló ÙÜæšÛTs›iþ jùoËß> Ú’2ðª¡<þíùÑkR™6•å“§0Ù¦ƒ~üÀo ` /”›>Œ Úͪe(ˆæÕÊè‹7%€ó4‰æ:¦µ¥\Jz¢$»¯·?F†þ§±Í[ÖRá—ŸÁ”TÂ.ÐXZ\OœÇ¸2^úM Tîâ2×BÆâN%c¬xi¸Ho|i ­L6aõ6×Çjô²Î^úãK'xžl®nÔ° ˆñóh!ÝÅdÖâ@ƒ_K¬ˆ 0ëÊË9æJϵà P j;>ÖÀ_/î ¶ÊÕ»©?û,ÄÙâ%ÙK•7»Ì~Ôj‚ÂÓ¨þ¢i–ZÐóøbÞü ×Ÿùž¡ºQÌŸ&V;|.÷ÿ èÜ$$÷@ðS‚t]Í<øA¨W$@ªaäL?ˆÑ3ãr­Ó«ÉDP-UAHêý´}%€AùZ(tÜ ƒÙ»²^«vß| ؇¬ÜÃÛô  üq]åê\-óàÉâÅHÐ#8Ƀ{·­²<|ü0ŒÓÜ´ÂßP¶LÍר¡qun…ʆÄ%Ò/•pÌ»AÚA!@ÝWë××ð´‚ŸSV×Úº2+¸+wë¶±vôk¤y!Š0t.¿ :Þª¼–ÿ&o=7qâÁìcóeëÝTœ³-šfë÷èìÕÕW®í5ÁéïÅ`øwñ¯ýJPœ!"/ˆ†æêÂKs„sM:®óùŠú†ã.+Gîz\/*Ã'ÖZ>¡Û´ÌZkWoÛϽÚȱYL £ ˸ÿmD„ F |ýMÅ"®LKn1+[1M#¦ðçáó•KO-M0lT~*ô–Aˆmc°¸p3A ÔѰ0¨â»ñ¯¢î‹)¶Ãë|€Y¥<¿WÈ-¨+ÛOÁ"k™`´“ó‡ë˵²Úp/µU]V?q+(+8ðÒý÷QTÝÏ 8´w~&@³Ä `˜¢›~"0þPßmÓ¤ÀnãÚÒ¥idŽ“Ý´ j˜^4¼ñ¾±Û˜|"ª:«ç§®ļtØš׺pœ¼õ)Ϥð Že’2(r¾¬ßZeø¬Â".Tªð¦Rõ ÞÄ)z‘ÀÐ'+Ñ5æ&Òܨ½j’Ó„bÌ\€K62ÂcìÆðhÜ‚ ­¥ Îv‚º\ã«êÀ&?Âýhm&cV·µ’Üg…ÛrË,™`d}!¼q4òSPâÖêàð ד‘‡Š2 ÎðÆ›\áU§Â‰fæBh±»Å“x(²¸»Á2'“ÎFÖuV6½»£j9º´yzæE= èÚ}°T†jsó-*ŠWAØï+¯+„áðAánȽ ·ÑþšX¶Aì]Ìy¶ITÍË™îãÂmÒ„œJ¤ã:Šàr¡p®·h•f‡Ò›¶2A« šQý*¡¦7¯j@ùœ@ ZÔ5c^e›´vÄ‹ ›µwwà~áÓ© xØYçXQÖ’Ðâúce‚弤6@+ŽÆ¢ Ä܈àÒ¶œëIÄÈqh΋®Øôù©¨ÏºfÁUª¡`xƵKîàÞØÏö›‡¹¢6àóKÃI£ˆ#zK ]˜#ŠJ1*BÄ:l©ÆN¶EËUn+f¦ c©¢§ cí¶0W¯NçK®Dè(’#oÇñ «ÓÞœVuX",ÿ€öZf Ûtþí©ãB¥;ñb‚ö#8¯^À%b”J ¬¤v\xø7·UGèÒ¿ …ž½]Ïh½i¤mCkÑï'¨£È©<ˆÑBååï^1•¹øˆlq¼ma!¡×oÖ×Ú¬LÐéCXhƒ£ö×¶Ò¢’÷^Ù͇£¯mlq\lÙYóhSŸf³?Ší¥þ°• D•kÂ*²C‹ƒ GÅg‡¢ƒf$YŽwè`+€áÎR)ÈŶW}Š_›ê%àìN™[uñb˹‚áÀ4²Þž;8|ŸfûÑq!¯*YÀÅÈà‰¬þÞ;;ÔâñÕ ó‘‘ªÈ%|ž@/¯¬ç籫ÎFòiï¬ÜjŸRtl©æ¡Z$÷qÖ•ž06÷¨Tÿvº¼¦TY†{ër¦Zk†{ø¹‡½hžá¡$uÖ¡0Ž2£ðɸ<šì²€]ZŠ}-üý"|¤®×´çáv¼&¦Œ&6´Æ*ñ¯©ÏmÌ‹K/#¹hÏhÞâŸmMxÌ"õ=%`·ž,hxqxcyVé„ /:-o½{#Ÿì1=$Fw‘â4ž ‚ê®bÀž'8]9_­¿§—{pû¤Ã•èÇLz¹Âh}³Ù%V«ê=ˆb²%àU’Ð-¯p»| Þl¨&¯¥Ž•x]Œh –­pc”LÌ¢>Íwhi9 ÌÝ/¾/¾pTšwòýbñc2ýJD¼Ç,2wÓçÛýrc_% ëœ{ >ÌÒò0í}8ìe7lùA„OÉBÜKáè´?ÆŒ!&‹ìÃ:ƒŸNêa¶“‡§8Íç4â›G³>ªè`ùZ\-Ñá]š&8T’zÔWÓ¹§8G¡ÉNO;FÓÕŽÿ±]eW–¬8Еr ç>´ÿöL,"«?Þ_U. BŠå³iìÃtL3‡-ó…ž²e%&H×)}>g{ÍÅñÐØ u§–2@¨ úù¹íçÏÁcÚÛ0fZ\ãÍV–GBW­ÕX—£“)H«Þé7Ú@Vÿ¥,ѳµùoœòÊ ×vôrüŒ ÷…v­í¡Óó¤ opÊTT ôÐÜ;wÁ3Fm; µJ²£6h¸£ÁÙvÔ‡V7 k¬ÿ¾ƒMÏm·«ô¾{öÚ‚Ìh .îx!Fy}ç²¾¨om›ÿ¥ˆïk üa²|?8{«;¸›ß³íÑM5£fÊuŸQ¬±¯Žiš«üÇn}Øw//#Ÿ™P) \3äx9»0~^ËÎZì®Ðýùz4÷ô§~µ0ŒöÍ}¿çy¬©†<FɵPOÃHlkˆ ;IíêƒyËM9yüaÛ‰õ:úÔ5h?†»_ ³#ˆ—ŒQ-9­ÉèØ±úª¨BrðïA×Óf pÏQkAì¥R}[Ñè<‡¥ 2çúpû¦€7ª8l?¶‹šO Nx]qô¥¬ Àeã¡*³Æùl N0RcO•xb-Rì19S{åy>àª'àswI¶Í;«‘ÌT»¥H…1ŒÒä¥rÓŽáîˆÇ9Xt×®lCh%¸¿·Zk”t#úi™¬y(% ‹ì $6´Äâ±`¤|Ô{æ†;N¦3!b² «vH¼;¢Äë,Ðæ¾Ú]Ž×¨vË:^]5 Æ`s-ŽŽª.fû’mnªèßc0A•nXM»×"æ>«Äº×¦Î?=d ÿS´Z(Ìúþ©Cuÿþ“^`ÓDHuRmÐÉbâšr+^ïìâ=ª²ÖÑÎüÔ5 9Xù¨Ê‚6à‡ÜưW½^¡Áø³[9Sa[]<ó· ;õFÜÍ]6šk%sì =ÁÃz ÂwÕ˜ül¹—\vêŸcÇ®{ÿã»Â`Ô â "+3¯Öµ÷æ÷b:ºE¾»]ƒO–°÷1AàWÙCM U#231riVªÐQ¶¦†þ_M‹sFŸ,Œik›iâ6(̳wÖ 0á´{3M¯é ÇVf<ßfHC÷d‘”>vzí=aÚ¡ÖjW¨.ÒŽhgÃÙLÑjÔ´;ؔDŽ5q)ø\Ê-Q »[€«í*À¦IZåJV)GËçWÁÆYDšm”øïü~ÁJÉFÇüŠöÛÊ2à×¹×)ÖŽØÛ°iÝž®#õV`m¸û§G;e77gÜù‚!ñR…ØŸœ€ÄfÁ÷þª‰ºˆ¡ø/8 ƉîêÃ{d9|Üâ6ŸŒY©8¡7ØÚzÚxHöøç@›6QFÝ÷”õ'ŒFüÐÞ Eô«üÆKåÛCNíÁsÇ}ëƒû8UŒèŸºŸÖ«Ä*œÁyg©åþžSDš~$q[­éd‹äYÒj%]´ÏóÕÀefíðØ9¡Póü>A`¨•cY$< ØW£tí™<5ZÅH=wךDgâZó×[³œÿ6 fMíKV˜E)Ê9»ŸE"²ˆ±÷à·gÚß°o‹áU½(úù%'U\Ó_1—Õdˆ?¦ü&yÜ{ÓòN±™ëõÃè ÈÇv£%ƒ!£ì7ôâdK£Ï vã)NsÊñ”‚’U¬uº(`¿¼†Œ€1<¦÷²|5ŒŒ“Gz_Ýêˆ1†™æDÓ›9!„uµdÖ°@çvY3I´Ùû6þ)“ ÂPÙ¼&¬×iøTÇ»Fv’Öÿ•z3‰Þxë 0u&\» `#Á ÿ—`íH‚cÕ縴mX#ûå…Í`„çvÂU·C˜ói¸°R+aÚkÁN»K-:ž ¹ F¿ÌHØ­@¸î”À«Ÿ„ ¢ÆFôÊÏ¡¹ç*?zµÒ6:*gF+ãŽ×´YÀ~AÕ@Œã] 9•½×,‰mÜ5=•ïuyçð „I.mæm¢9÷n Ói[0/ÍT“‡ŒNz\ááÛÝ ör–d¶ Š§å”Å¢½PqOàÄ´ß÷c¤Ô§óÉ–0ƒæ4"nÛΣƒÁ¯%} ´äsÐQ•nÉ‚¦«`oÖdbÎó¶ ·ºãž39WÙïÂ7àp9+{´0ãV7Ùæ$áÆû 4çEëË·®tfÄ{Âó™O/°F[p¿„;ƒ¡¼l>îÓ°‡eçFp«yÇ£YuŽuk þág[›­/¯ca°°RÏ[CÙéË~'¸O¦‚cvÁ¢ð{-ßgRpëAþÃß‘ ÈóãÚ%ŸMŸßXRV—yÖ¥RÀhÏã«/3ò¸`HÅY Š•¹±ËË5 ͦ¡ÍkÑO+ÊeX¨LJºŽêÔ†§S ì‡AÌ}sCâK ˜ZC‡÷—Eæ óÓ¦•o!BDÖÃíUSüi÷`€G2míi¶14½œe»“§Ê†ÔÚ3Ì–CgÁbÍp©6aCŽWg„:mK7e&LÝ&²«ˆVÒX*—T$Ù\*È'¡‚òä^óÐ5Àw3{îÖ½‘»ãÊy3jßåø Ã…T„­‹}kpƒUG¨4k=óâl×ùFø9f–2/íc5„¦4š×BPâ-ThÈÈSQæ2G’/ßëB"ʨéÄRéêMŒO~3C/ÞYÏ:(7­c˜kJ©G÷ØWŒÞs–v+ñr²ééG‘Àûzeî&+üt×mèI°Å%ÇP{lÃ7"¢¢±w~ ¿ºòÀäÎKð°·¿ÔvÉŒ›w–°qiáÃYA¾ûhÑ3çŽ>`hä…S|1Y ©mP§ùIXék<È%Z à»8øv'ô` Ð Ù=Íݶ>„trBP¡YÆÈ÷9ÏjÅ·“Î*oU\wb¬³±çЙ×B—gîÃs³0tª0ÁIeà“ÐÓ3ö†‡‰œÜB˜ V ¹(˜ZÝ@˜ù²GZ„]îˆQ{Há`Ùðkaìt^3C aM¡`Š‘Q4ÂÖáˆîTÁ#ª^© ¥AãÓ÷xW[W<;rÇŒö:l»t†Ç¾p¹,½ÆÉk/ÜÏ=ˆFêÂenL~¦?È~µÑÓ:XD§ýïØ9=ªD“ÕE«_g»°ß’Õ»`lÓ%¦ðbÐq.ó8ÂëQ:C¯x ó@Mc‹0ÃŒœ‡õÒ9Ü¡ªø¬–WqfgRP¯..Ʋš.Ö¶fGŽÖkÊù)5×e(«‘ñŒ¼ãö¶rƒâÖÖnñ'‚ßòø¯™ª£ÍI\Š éÅÕø¼óÃPyYÝæ–ÆjÕ ‡:ŠŸý7­ ®¦[¹ÑÜ$+×¶¿—äæ‹Â³B4¡ŽP &Ç£\u ih:ù£ÁB‡‡šydÉ Âkƒµ„õôÈ,0 3¿Ï˜ãlÅ䲕l`—ÀpòÍ²éæ 8ä!ZçÙ€a£óÙ¢íÏ'òÉâk¡×ß:“ÂT¿ß/n^Áè"µ@ps3ÓìŸ)ƒ^\¥®ÇÞU sg’EF۹ט²Ø ÊôÒ¬Jê3h;êŽÉ¼`Ïæ¬I*Ìiž/r´ý„‹=®ýbº#O·v*¸/›þ¦)Ùcݱ/á/=¯r•ŸÜ#®×<íåf%€–º"±pTƒ0)‘w»êmcœ»=k ŸœòÖmV˘œ„;JÅ ‡q¯[Ž6ž37Ðyq"tHÑ ßwo‚ábh‡Œô{2°xʲ<Z¶C×\ZÂu7·l±Ó*:PÔÞ裺\ïŽö«+; Íw7Æ`ÙÕsˆ‚—«i£«¶KÿÖÔ ‘¡þÆÆ‹leiÛa4ï5 s—˜3&ØN| Ÿ*?Í 4^S3Ÿ–ËFŒ»Mt6K§ÊÅ©Z<±uÉÖ¦òûåšpÀ­Ëã C ;[‚£HܾóKsç÷¾s¯ë¸ãÖ´Ëèúf‡Z8}Y/ ¦‡nü‚ KQ"£3†[Ȇ=%ꪗ r\¢‚=Ý·¬Ú÷Ý€… àÊÛÖ®´UöS¿¾…ŸZu» VW¶Ð½Œö(0Ú-H•Áˆbƒá¢†K|ç~a«—4d3Ì]h-(Ur·Ü_¶aìÖÓÕÞõ„'\>Ëà‰‘ ¯ŸÛ„s­š©¯ÜûB¶QžêãYF¶s…¦ÓŸø´h¤ JÍFºmÍr$s5PÞ^¹­fŽBÇö}Ò€÷Ô4–ó8êözéãØ «¡ÜÜNë)`¡,Uèá‘­TëèjàNQ«0f»ó´õñ:‡ ^›½¢”ù§ ïH ¹t9[‘?iÇžÆ ,H. ùÕUõ9ñö¦µÂ™©xúšzëÝ(’.!>ö ÌŠy’ ̤1I­*¶ 6òÙ˜NXê÷øµ pcyu~ôøú¯ÿç¯?ýîÍß¾|úöÝþê›w?<~ÿößÿúáñç7oþùÑ#嫸ú«W ¹ä) ~pw(¿ü ÿ§À›`„¿˜ ¥ùüÖçP´þêƒ ¹š_”òêƒ×ŸàSŸÿøí»ßüüÍÛÿ>~ èñÉŸÞ½ýñç<¼™×ÚÂ÷ß½æ~>züOü¿ïm¾`__÷j&ðÁë%{rþ1AÎ5?éJrÅJÛâ4D¯Ëyt¨×üô$aG§-ùÝ{ÑdÓ†lId@öfÑŒ6¡Z‚ã8€“lk8™üÄPKÅXü„(Öÿ6wÑÌìh6޼œIÀ®A‡õ¬'»"™aØÏÁhäp|½+1É é ´Ø>¬0ò«¢,SÂ\9ˆòèyøôØmzîÛQÔ.xXÇb#ètQ*›1Æó TOP%¸IOÃÞGqbÉn8HùVx9ÜÜÎ òN%(:g?äA-­“Îó\(U•Vúíy7½LÇ/ïâ}ªÄD’2 cè¼ðlWÙŽ]GýÿÃ}A‚‡š‡G‚@2BI»A»9ŽŒÿž5ì:íÆ êTÎݵkköÇøamk<}ØË”8‰@ïãëÌ1U÷wEÜ€†}cÜÐ4$Ý(†õ)ècT?ÌÊnÂf ªQ¦MNª^B'k>ÏîÅ“…6ÔEô ob9Uc"=)qm"‹xb —-Š(GOÕ´P4º y]¸ #DînŽOvG”E^ç0,:¶Ô È¢MÑ㇤ůWhQì’àg4§²°«b”\cÉÖ®õCµ[ð=’J’ 순¥ëœäçz€ ³%Žz|a|½ˆ£=cIGRÛïqÑ ­j(âG5Ysêç-ƒ·¨ßø˜Ý×ÁS[’7Z=ü(A µÐžwCìØàIŽ,=‰R®€ŒSÌb®u=} ¦È’­H**(ù±Ã¥¡w%äC åÞìGnU¹oW9Hµ”dQ:±ê+ódšÊ†»ª4dëxn]ê¶Ð…ÂßÑUNŒªáÄŒ ºÒ>Žpƒ÷…ÝPÙÊîN¢Ð½5Yè!ò„/líÉä£x`}[ÐdCEÆî—¬®B B¡úëEu¤Ês9ÏŸ¯Ø#â™Ý+‘@j±µÓ5¢2 òúT¥Ñ1RZ‰¼¬Åyˆ:O~²š{aý’&V‹D„"èfÊ2 9P#\(Õ³ Å›œ²8“Äâ¦+e$¡[˜mNž´,qf6 ìžäå ±ƒèÈÆu´Y$ïHÂÚ.½\ØÚV"̈æ¢.Ó¶OILŠziEΊõûk|Mv«ÃƒýêØ$à°FQ“*Öâšµ>ã©ÀìáÚô·8ä¾Á5ÒÓ_8Ķ4šY]¶×aqü‡kêp°Å×:‹MLâarUt™´,CüþY†$zxýpë£}Zú|âà“«Ü>ÿúá-¢}+dÕÛû7_þ÷‡×oÞþéý÷ÖXéöùP}O¿yøö»—÷¿ùéû÷?ú«üq ç÷ÿúþÇ·o¾å}ážH¶Ÿáóô/^üñý«ï^¿Œÿ?|ˆ“Ÿ?¿qûêåëw÷o~7ý ÿüåݳŸð¿tûÃ3úÁ`·áÿ°éöSêõïñ/¿ÅÿÆÑ»[»ýîö·¿§Û †xþÌTϱÄÎÍÆyÇ{-=3¦ '<ťͫ!…” ±X:dÏ2‰“ÜPÍb›B°2½a&áJÈ¡˜2j®\ŒÕ"&§)<Ê\æGÀÊÂF fl‰"/ÿá†üs0iBŒð€­¶ ×¾ÅüÀ¨”Œ8ô |#$úº`T)˜xDÌZ´Aa1‰ªT ÀÜt€X.âDØ#q0¯¥äƒ_Žr¨– ±Tå `¥cBŽ, _³¨&aš7Û¡\ùÂdÇ‹»6~ê¼´AÊ ÇyŒÐŒ ê_ßbÇfΡ“¢0´zS’…iótv'Û3‘ýb¿Ž\HÛåœÖSYª´pßwf5Êým^OKgH–Úc4ÐÑFIžÉ@ô- 0Z—„«Öd¹19k¶P ‰ Ö0œ 2ýÎ^d@©8©«xˆ,=’ï>ÓÝ9SZLEÌWX¼ÏôÓ%t“Û9ÙÜf²”ú.}¨”Ø›¡W²q—œs* ˆÌB$”›e1.Ôdö™\O^† Àh¬¨YÛYQAv |KIõ‰c$ö›hM§¾Öû²µIçìb{'¡Ù¢°E‰ñ•öE/[7oÓ…ª;I‘>EZOWýúÓûæÙ?Ê UVð½õk%ÊŠiïKâ'pªZ¶7„%€°'[–‘s¥ä3D8äLpl¹çÝcÉžƒ©’j DÝBÓQЬét§(«­GÔê²"D.N 8,\KåCî@ΑX©Î€ÙîýÆ¿$U/cÜ0.£WayÄYšÙªÑyˆK—õãŠ=-+0e%PZAOÊwÂQêVa'w§ÞÍã@˜miVñŒ™ƒñ%•;ÖröÊ7—PÖETÄã*# mŸªw‡E²Æ7&C`pS›6r:nðŠÜBcf`H­Åù²ÂR[+Ùª)5ìI6Ê.Vrؾݔ `æ.C뮫ú\ù¤6pÉØñµáUÇ.’{"5 ú’Ód4fQc-…`_#:PzOƒ¥ @ 4ª7”6ì9¾³DŒXKÕaIš9šÅnÂA®[ú+ „ z‘±êt‘¸Ýo#…ÉRb™¨ÀFda*c){®%Þ¶üˆIÖJ=Rã§007Û5âä~T 3¬ …¶Q†-2ïæI‰X¢C55áÉöpFÅRÒ%i_µiY}ìfS†ª"üµ¦-'r¶Oú¢9£69-û ]Ãr^ÈnB%ªÍ$´!Ôm‘7r¦[œ:¤]ðá¤' %ð4i­A_$–åÒlªß Æ"Ï)õÄ·%óÆ ¿’×Õ|ê–¡¦Û'¿ê}iFûzÔb–-$÷ò FW´=]AÊÈ7î$áM]>ó>ÀÔ…$l ÷ÎÜ€qê~E¶»1ô¢:b„qF+ÌærxIzz?•‡?Én[h@Òl«Í×]‡Ò3JZACÖÅ•ƒó! jú*˜žP›\ 6¥¸; H©‚\ŽÂrZª–ôŠö¼° [>¼T î[ÜS@pâÈ#äé8€Š5« €ñï.Ú³‡p¯1ÀžAÝøÙô· ou(/%™0óÃÔd{-ß%°ôaЬ€°µŽÛ'_O{xâ)§Qt¼lQ“9ÆnôèðQùµk@ Ý¥²‡\(ÜŽ"×Ö)]-æ§8]aiÊ€0x¤ØLBX°#l2Ýjš¡–eXgÈJ±\ò²¢¼nEÁ_¹Ȳ„„å‚G.›’Å:5®yžYÀ ÿÓWo1ûPv%4j½z™ê£Ö®ÚÆ1}]1Ž œ¢žQ+ÌÙâ0Y£’ÿGÝ×8¢í-…5“ê|SåeiJ.±×ÝÓT&HÖ~ Ò¤XŠÊçX5Æ•OÓñl– °+âBeQÏþ¡9ik±±1X¶6õpË-01{K¶æuÒ’Ý©;Úlo×!äí‘~¦!=B€vv–µšòpž&wªLNÃ!wh§–»ÖÛZ,o¬`›!ƒnlyüšMAumÇPƒ¾Ã6õ£pÚa§n6cMxÅŒ÷" Éç›$»ÏH._ qIfì3Ú¶0'Kš“rºÊ6åPr”Ô¨%Ñ“*ð×DU˜\ò{4 Zgx¡[³Ÿh‚ Ižu¼‹•Ž+­2†½¦+Ãa3JýÿÔƒCøF´T( zÏCˆ§J03mØg6£}é[jSÉPmˆ²ÈBÖGX±6,¸lŠÊÃ9Ê'š*§VúDÆG¾XêCÛZÝå¦ :§»÷K²Ây÷‘м ±Ñý4`ØZ·¦ 8l’o@ u)¡qRæà•–]^? ד¾- ¸äžÃãa2ÁÈ7+§„Jð°T¶ >ÚKn´º ûxÞ>ýõéOûöæ³ÛŸÿdCƒýœ èÖ”àiHÞ§Ï)­éÖ|п¹ø[Mô*ÿ¶ ŠéW¾ÞÖ¦--"kë6¤zKF€4²ò¶Ø)Ê5„àjæ §'¨É$ÁÚài\›±=þ:,ÛöÞ°½Ösñ¡  ŒHÁ"kd RrbëóÖÃèŸ6ÁaÐQWØè1ÂÙE¾p© ¦0‰ƒ`¦9û£“5äÕ~, Ü¡u [#s˜†I[9]ZÃ9†½Ýl£kEô D© f#go¹QŒ^‚:[/ ©³“_¢³í¦ øn]mdzç®çÁ~÷nÛ‡Áh³0ÊüTdõœ…ž“³jÒˆd-Ù–^N=…^¦Ñ¨ Ïb’r/– z5AȳM3g㞎HtÝ'÷åa¼¯ƒþÓÌY¿á3øgßÒí;׿*æsk‡Åõ€‡Iî«Äè%æ¡z/tœ³¹Ø°]&ƒWFh¬´„l‘à@¬\A¨Ø€æx ÄÙJÚ1Q:­Â#€‘èc¯„ Hpgilä o0ùWàî‹>f.˜-š n޵{p, @ßK>÷ÐEçé„Öe˜y«2SàdæD!'Ä3+}qc»`ŸêÂx75YQ¸öw0’LZvÅ!•Ga=Ü‹«÷Œ5çÖÕº¿2 «qŸd¥Ïn@ÝSŸê¹ ݵaÇ÷Øel5eÕáö;宾̥)œ”ĤŠÑÏÉÞ•«¼º².ñ•€ }k­¨çágÍ`سl<®ùFº¼‰ü×þ(#k‚–PV+¹i^ Ç<­'^¶6i‡@:ŒÎPØdª#×ê–Õ^¾y0¥a=ôË>{hó¼^í }›[gZëÈ…'«\˜®çÒ€•ò&û+àá%ù1lÔl²PÄø^,XÎäiÓÎß¶å8?f·S´(ÇPéý Gq{í4j­Ùf·Ó~À„_¾Ôã$Ü£6OJq ª&;èhøITAàõî­P›TâÆX±tP)Òg©±z?3•¹„—QÔkûì鲄—0%/+¬‚PùÞÒ÷%N¦U»{¡©%F¬¥ZÝ µM6bpÔä-¶À Øm±„«¸™«ÉP g´$hó7@¥‰(öâ–ik.q¯c™ä"hSR©¦²ZÅøÙ0tÄÓ”îºs‘u–ƒsȪJDÌ ^”Y¥ß³ [Ë&ƪµ+貕{c 0l¦¦N·¯ÉŒ„Žâ¯Ûï|8µªÄÉ{ïe¥aaŒÙDïRõ•Åt ‡2tbi¹m 6ýuÜŸãÑ–“!”¿c+Ó@\{èÒLý}øDl`Ú®Ì3šÀkÈÞ¾xÇ*¦]ÍññÑç°I„ŽôG·é©iñb1µ,Ç ŽžÊwž×Äá!{@žÄ”³rÃ_\¤'.‹ž7•ÐrMt†ªœM›¶_0_ñú=ÃÍïÌa¶Ç{IIóµf³©GpaàÝS¾}ùw¼üï?~ùï¼Á@qÿo÷þU´Ý2X—5A÷„ ÎÞ¯Áà[xÈdz B{懬נ ˆßߣͤÁ5'Íéòþ}ÆÜD­gïwmGo<ÞŸ’K’Ê®z:ª»ˆ‡0ãt¸)³om ÁƒÐÑù|ñkòê,±Å5ë5hÄÍîaîøCRÄàÆòcŒ¼ØÇ³÷kÝ“¾ê@´k_’aøý«(¤ÆÚä©”® ùDeîN0è!eéÑËYìLîýUÖ{PÄïïQ¡û5' ²¾þ¾cÑ£ÖËÙë]#éëûG_FÐölüõÞÃÝ`„Î6*ͱx4¼ZÈî´Ï½&Mü~D_v5\$‚*AÎÉ“ùЗY„5èÐ(·õË¿¢º‰d­æ—s6#A‹—­à2ÿÖ<ŠúUØš_üå‹/üðÛo_>|ûÃ÷ßüø¯Û¯zó+jî ‚üìöÅ»?~ûýßno¾úêË——ŸÞýÇoxö³Û/qò7øç¿P(lѵP&ûÜÓI±/!$Äùp]±dxõœuš*$§ŽY†‡Ü!®ù±si¼êYÞ5î¿wFLGpó[]3š€dUE²4ÚÜ©Åo· -(u_Û$"üÄÝ_žþñ3õû?È©ÊÊA¶]¼ß8ÓöV8AN:Mb Û«€ÆRk@é./w)‘ øš Æð~Ñý7e…ZgO˜ Dnñ9Ñ?Ú©J Yé>ÎïS )+´ x(KeÙÑO¶àçsO.yÅ¥'‹þÞ—pq†\uúΜöiúŽàÊõ´'Àå’õKàñcù<ȱ´L ODÍ’òù˜XÚsôqÊJtˆ+˜l»& чÂX×Û'{ðÀŒZÓjÂ`VÃ( Œæ¬1€ck±¨uvßEÈnÿ½qx¬rÏ2—õˆì~ ?µ½¹H]°Ö%mVB‹–+ð1¢¦¹ü ÆØÕ§Õ?süÞuP {SûíSWÿ¹PDò·ö檢ÖûŠ0L‚ið9W1´8‘Aªº-È –*^„÷øý0À™Z¤ïÂN—6ežßï”md%ù¥<lBß²&øGì¤ÊúWðûݧŸ-%¹ Ã(×Û'ð?Çh*e)ƒü“‘¤Ö… û¹†Æ”*ñ ‚%É =Ôv˜Æ>R‰O³îGÔ࢘3¹ý>GäêyîÈËý§¥*räZ92Lv¨4u®–fßX‡Z•å+ÑÀëµÙª3pl%Û‘÷­®Ëàó|Áù6m‘«¶‘ßžùÇZà烉í:@Iô YÑ’MÈáÑ•-lß­œ‰tÔ{ËìS„´Á~Fïü櫯¿«å×oß¾~ùññ·wå¿¿yóûo3òôÅ»¿ß¼ÿæÙ_}xòþ$5à\uÝÄ@7Qüyõÿø?ü‰Ð‡Û¸ýpûù—r{Í%^$Œ4ÞfcðfCµÎÀ(;´ž28î«önG뉶¨G¼½—~gßÎioÞ4Þpìl,<~Ûá‚)h ™Æ`N2gh©•ÜÐ`ÅV•IªG¸MÃ|’Še[á¤ôüÑò×A>^«~}ÐòóÇŒCõ«ó`IND- $KM3\”—EÕõ¥¡ÉP(Sûc³Ù¤T.ÐÓÁb‡wº^v‹ÔxhS°‚Ýò O†®°VMÈö•’ÆoG”9ŧRûf\aºàÆ?ç±tŠu,@²JγuN€ $‚>ðˆ”ÉF°Û~O;Ô4¼0^£Œ”™†üñåvd¡Gi4ûä …êàX×WÍv4€ç Ž‹Ÿ¼ÇVãÆYUC`¬é5~?•¾ýF!ÁeÀƒIuÇöUðûp¤k[¤`ð&gîí«+–<Éã{  3φ@¼LÒFR‡^{íœM©õ®¦ªz:ÈËwè©ó°V,ÐiЖã!ãº-ñsÏžÕ™[Ì´Ûdjž Xÿ!]ÁØ•ñí\ñ©uM)ˆQ¨%ë,΀ßFê÷‘Ï1»WWºmÅ ùÜfk›fÖ{?™åú£Ü¸€ uʽ`†æ#Õ ¹µÕ€²•ú¬*-Ü Å™tQmg/÷µÎh¥É(ŠÏòÀ´KÏŠËFˆ:Øñ-‡…Ú.Wªk)C0(1 RAzÁGL0Ö.%öĦl72°áWi{Õû×açËpI±ú_}Â\¶‚×^¦ý ê§tÇàÜ×åFjjÞ$Í*#¡h£?.¾¢fiJ»ka‚xiR.g«Ƶf¹_ŸÂ±Í4„ôLºùçݵ1¤*oŒôÎPª§•36–9fjÍ eSÒ“qãh8ý6™JøcÊT™+Ãvé¥Ô³M‹[ÔÇĶ:d \¤s¸p •á„g;º «ÖVª‚{ˆÞ­'¾2ÈœƒAíg`iT)HGÃKG¦„ÕÅ^€…ÈVhÍ^Ò?\Þ¬US'ÅÉÆ‚òÇÕzÎ!Ü‹Cõ¯#4È„OSÊâ ò\Î9'l u9(çÛGÄ(‡¶UE KÅÏ"ª”ZüFé§ûñ¤ÞZY„Kø»‰ƒ#6Š Ã¬èm¿Ë:4cy„!·ÈÕíôSi¹×h½jµ”õ˜ZO‘rN X·Š!‡9;E IÏûÂB[N¡çˆ¦Ÿ’v q[Ì^—.9¢M¶žÊ¬CÀGŽ÷yûÀÛæ¼J@ôÊCSô%  édRÓ›AO“L‡epž‚µKj> ÎZ¢J)Ô\uÛ\Bª .ž2e!¨š¶ç¾ŽÖŽscz—$%ëJØ#\Š+ãþ}ÎOºB–‡TŸv楦ϲ µj›>‹<§út…5¼Ÿ“Íæ‹G;b¤“ÁÈ,Ô=Úòy²º£µ!/~L}{Ú6šõ!/£EÈžyˆCu¥¸PM¶µFï3àäØ÷:ãø´†T¯.›÷'“-|0ֹݨç£É~PreI!á3û^Áw60bRM4@'—!‚Vg# 6FFƲ‡9ëÄ ÐII4 Å×!ÚRØà¬ã’Þe‚áÏÀ5$éˆ^ÈCÌ(k 2ù˜]ŸÉ3B¿x§0Yîäcë5qÊ岊%B» è22éH'\C¾ Lx å 6Nš¡²ôåŠíº@2$Ÿõëóšä@CË6·"CQ´Ÿ-ÞWœéNšiTŠHÆä8ñ˜Û¶|s3XBÔ)£Z˜æ8OÚ–¸a¿Ã"1 Æm9%%¸8.^¦`à½,Í5ÃÏÈô€ /aœ:4ðµ·J .Ò£] ªÄN°"²˜ÖL¹¨µfQ¡!XaÄJ\“¶f\—\š:‰ŠÃsºIЙ|qÙ(zbùNË+ h€ö­ú—÷Bá Ž™ aq…ppî¶O{¿Æ€É· ,ûçM¢WL‰!ª+ù… Ój…R©•1ùÔA€¢à ê Þªã–Ì݌K×0iÈoú˜L²Ü‡¢8`Í5ªš–³mçì5‡L“UyÁÇØ½iš  Óóêq4☒38sŽ\“d tN¡P”;•#ÀÀ©ûAÒñ¿Y5è“ÏØø2ïEekÑÃç?âbÈ"P.ÃѬ¶q?U]Çà”!…¬¯Ù“^`½ð ŽþïÁ[Ñý endstream endobj 57 0 obj <>stream H‰lWÍy69 ŒàËÁ l?BΆ0gç*@ýÚ3{³qñ[U̯ÿøØû‘XûËçögíá4ª<Ã-hÏCðÌöÄ>‹N–>q¶Óxž€û4žgÎ}h”ǧί¿þ”y/£ßiÚžÚ|¦4ÂÁö2â)?QÆi¾ÊÌ{Û*óZÛ–-eÜ2å&|æk³s“á<048³ÿûn³ÚXeÖLC?® “øvIý±ƒÐa<ø©ÐdÎgMeqözDdõ·(3¿]Ž2h¯+bWÅŠ}C“ñl]|NÏ3bz…&ò,OÏg=GvzžúLOÏŠÄšiDßvæ¦ó‘Ù‘¡x/*µ€#~yðå!§.Mã||ãýž?Èþ00[OŒ±k|=èÍ>žQ5æ7;ßlg7 S g×—>Ä«ç<|‹~9žßÂ8GVÿµÝrÊn¿ÄŸ1#û ÓƒñêÉìÐÐcíYBÓ‰á[ÏÎ1©ïÂ>8k†7ö‰·ƒu Î%~:ëí~qO³`ÄjNêùTjJ:üù(CÂ6jÃSÇê0°£9:¬GvF†5ö¯ZJp'­×ÞÑË‘í³Os¿ð#¼ÂhˆgGzÆ(r|99ÞRË?`åÖ…Ã(¬“Á ÿ8ŒF`V^ÏD_øþ›ðÝybi&â(ûŒî?bË+ìDôÀ«,«¤.hŒgYâÜØ€6Ö]CÃhFn:­wKIL¬Ég§)lI<¨´û;<Æ3£< 7­BÃÜiBRñÀª–“ÐaÕ9#ÖÝ]\Z1`h¬Q•²ÉZÀÕYµÌÜtgν0iý”:D>ÎÚÄ„©F¹ŠšdhÀ13i”5QFÆš3=s­ÇiãY? 5Câ6€4F»àÇc'Ù¥Ô[J;&…ŠÙåÚ¹ *¨ŸkW‡$C`­Ç²ö¼üð[Bá’ì¡Ng~‰çndøyïÕ¸†MÈúÌýhä[ùOÝÏYt÷1vd H¼˜@IäF¶9wYyd²=çUÈž>’ 0jã”qbÀT š“_jÔÀ+3)U*Ú©íKlg›Ò¸¸DñƒÊ&PY•[V ÀÀ+)¯ ·ÅævÊ«r¢:7ÅнJ"ë_5Eh 4ÙØ‹‘«¾ÈªÅ…˜½ž?åTŸ_ǘ¯‘>Œ/[¡%~å8ÆkUδrr?AðÞÍG®ÀN:Æv¨‡¤8s½€T)hè pÒh4bDg 8uÊÒXEÙ_/«å@èZÅ_g‰7Úí‘3a¤žÒèîÖl¾ñÏËD}…À’Êx!™¯2a*N…`5Àýz¹þW\ØqIéô‹çð•®ì4x·ýbP,C.µü¢L£hrs1â•zXPÕÔ= RWú¥ª+¡…ÆÜ¦j’?œŒš :@yWœš54æ¢3óØŸêQ®þw?1çM{•g¼ >Ýo!€Ñî‘Pˆ3°W•h0*edz 8ó[Œh„×°Z ëà°®³®qŸw›'<±œ:iuh’#-»6ß½Í&•4ÆÇw/³FŽ8,©­võö,…±ëî"¶N[tl] >¹6$·»‹¨öɯï’~_øñê)sŽ‚ ÌÔ<ÝhóBìÏ–ÿ YR-ÈÄf$€dI¹¦^º+³g)RµRJ´ì’Þj ‡_ÖÈœ=.Ø5Yj$§ü¯vÂü²ªŽÇ<ÿZ?V.õÌÈ÷\ó}Åf3á3U3V1„éGr°ü' è9Ö¾t(ÚâIG Õ`‚l“ÏJt„f ÁÛ¨¥ÁÀ$K-¡æK£7Jã"þB\Kßñ®15OO^ÝÒëF¸Ú‰D¿’㘹vµ“·w½å/xRŒm}±öá_²‹‘ 3òÐÛ-” ©NüÕ2ŸÑ“] r·e“ïý‡ÈIÏàOH'fº›•ä]¢W¬”ð{Q§Ùøˆ$¬Ñ¢àÇ® ⃃ÊÛ‘Êò Ú9‘«yR8#:¤é!f¤”ë‘@lJ'áÆ‚ÅsRV)9š\3• ;fÇ‹0v ¡ô´rÕ± À¦mÄx^a(1Vf¿û™SJx¯ÝçHÑa•[ð ¨ÐN® p1xvÕEPÊ‹Fîí_-Åëø [Œ§Àˆ¡&ÕVšI¸hÌK$82{DÕ _-ÆyEîïa|šá›{ñž AN6Ô ®–¨œ.ƒ '£Æîsg¦å·%°©º!µ½ŠÍ<3¢ê³Ï1‡ ¤´ÐäbŒK©Ì/–•%"24àÊØ¢}”ˆP‚þóÙòm«ø®Xn£i§—ãœÈ/— ^œ6ò J<áÆLk*"³>Þ¹s4rýò-ˆõ]€ÂEgà)™õF6;‰#rxãda%Bkx“¤^HB ØJmâËÛ²d;î×·ÍÊÒWé&p¦š±K·È x~hîŽ L€LYEA¨ûïdþº_Á"!òQæÊ —:O+î ©Ð„*L[‡J‰ˆÉ»%ÿŸøVËù)Ù¼7°÷÷|¨ÀðòN:¤ÖÖš`4cZ9‘G޶® 6¨¸ÔÜ; ©Ý‹Ùóy0ac ö39LT™$˜›1…»Zƒ³eo3b§„ xE52Æ«¤tT¥;4Ïÿao¤ƒáHõªUyCÛQjS7z¿€¼3ën”ÙeˆXÖðZ‘é’TSUjM~L O­(û´‡HTdi¼x‚äNÓ$êðÊÒTåŽyCÞùÝ‘B0(1;á³iÚ›1ÀE²K€B#Nfv²N¬"öÊ8UXÒçÞ¥Vy†Í< Ù×z7ЕJÅbkî†fü’üÉQ¿¯bk‘¶óÚ=ŽVæk6gŒW®`wGƒ°ðèkq„A¿~I€[²^;ÉÊÙ­ Ld¯U¶p»Q .{j–X5Ø$ÈÖÖ!”ÃWUÂ߸÷Ç$|÷{Ôdžu{šë¬ô´ï0hØ"“O…1±à7†“2Q€,AÆÌþdÜ4*Æ>v}™³žd•JN·9”$uÈÉ·À‘¤H¯Â2¶é=ŠÊ>Þ4 #ªK^3.í>[mkÔÛgcFhŒÌ4@:ÆR©¦c&ay“IÓðøykMüÜÓ1Î â¥WÊÊÄňgà-³dªë1 !EèqMíaé™\Dv,˜:¶!K¤àŽ]š/ÓMþÓÿ8qÒõ3RãíôŒ¹¨lA3†‚,ÑYÏÒ.6óÁýJ¸‹LwÙT‡‚–ZØ4?Þ1g}Ž a¨­Çe¸ä}V"zÄ’:o˜–"Yð+ZX‹ˆÎ¨%E—/‰#Ìj+mfcˆÑ|ó忳ƒöe`¾ ŽãrŠoL^ŠiýÄ5&8•ŽRlo:žÄ³îýú_šaYSxª,Úšëw“Å܈›,Š'Îùº²ç*? l¿Huâ(>±L¯xAþú¦±\¿šýwã_#§›8SÇ«Æã_ìŒÚôçL¾Ìp$ú…qJQ˜ÑI-¤›ŸyÍÒÇã©8ÉM˜éÐFêúó–Ö’³d@§Ïñz>ÂnùA´z´ Íqçž¡®<¿É*m•¢6䋘_Ýx Úã­þBÙ9ëÀ#”Aº=˜f@wHîyS{ž}™òáüfôªf ,Âz<Âé@~÷þº¿°¥WÊO’¬¾FG2;b¥Å2ðâîüEµU±U–yƒñ|®s[¦(e’¦²øyι†!¹ÕeqeÁ¶Šk«xâõë|†í–©[·$°û—Æc?u&¡‹}š­£Ì¦Å£¡Û™öëvWiîÌÛ¯½÷×Mü{ ÂC#"y¶p â-3Á4AUK@v0ð‰›ØQ—îDË€ú[ì- êÓ­º~Ï%¿…±CðV¢0H¿ïLGgzõs˜t¢w"nAòörÒP ŸifÕ<-g›>1NÁ'&$£ð£Åý¿56îjÙ»Òjçð+ý6‚¯ÅˆFZÌVxYhbÉ.¨÷]âkðHßAþ·¯â%+ïÎl±‚î¾&T•D~´´©AT³pò$R[tµ(ˆ“J0)ÏåηÄVZh¯vå!ºíH,fÛQ¹ôÐúë0D5^ò&vPõSàäªTôA0É?}LrklóÆ~ŽeêÐ׎„ñJ²w?ÿ³ÌâQ8qì¡`XÒOGלȉ­…XøÄÜɚΔ¼èiòvîX„Ú€ä«Æc/ED½ErÂöŸo¡qVÙ¿ËC\ )%Z;:0ˆ×g†âÀ62/r“ñš-Zßþ{Æ]ùš~™c̾W!h󮿩úÇPö{ÿc†«ü<œ™*ºû„|xN$29óñµÓ×hHOÀ±¹9™º^»,Oöó5!ÒÒý[ u¡’‰i-æ{ý“—Y§ÿÕy×ZfÈ€þ ÷{+نᯣÑ/»$2P/®sC”ª”0ì~WYƒ­µ’¼ÐÀ_Ûfûä—‡¾ž°qÚ§LÜ¢ƒîE0’]Hß¶D´¼è$±·Ry ÃÙõ?ñíÎé6_ÀY/ âKçþÖ¸)¢Wñâ¹4R¡sÌoŸä.oµÎhjÇ2ëuiH‘äqtK£glò¶¹ºèJ,¹†¼Ú‰wŽß" ;séPrñ®E=ôDÐ g‡±ô¼ávß.³ÁT—ÆUö½î 6•cÍ«ŒÒºÖËë“aÞzl”Åþ­…†N +˜*Ãþ?äÞ”!°ÕÍ+½v¨c ÿˆ[d(‚Ç”0ª´bd§%zöî7ªåѱ.mŽÚâdÐË|øM-©°ZžR×Ôð{W²-Eúç¨Aâ_¢¢Ó&[9ÎCÃgXŠ'ì ™"źe!}¦éK=±íf“ŸpÂ=ÜÐô&\ó$%þÉ|EáTäÉ_P —•)d þÚ.ãº~»ùïæÏ…Ã:åÖ®3f{f󃲡*¶¾m¾ Øžü^á•E5ô™7Š fà ZØã²O˜b¶›TÌÉD •)Lx¬ß¬Ó®y@‚¬ } ›áíìL땇?…ãλ'f<ö$õâÚ#÷”>/[…ñ€LKõ·›6Ll7Æ'® @þÄùò-K¨»—Ïå_i$¿Ùôm¹¹¶Ç̹·/²²IÖ®©±È¼u‚íwl¸‰œXC+÷©yÁ z‘få•ß]éî¡bâÛ¦©5Iê/2žËL„s7o‚û`IJ“à àUD#s–ÑÕÃÎMfö`½uî¿h’oò.QaÈtå\p¸ zôfÀ˜×iYtõÑç%h@$)›×ë˜3!(øX †¤^º~W› ! YóZh^Æ^:Ë Õw© ü=7`ÑOü{¤æç×Ùì;®áÍ€\­Á›ÕûI$®[^tŠ ×f0„ ýï‹sScÁ2‹ FàŽ^)¿&ÉéYôšj4"áó|ž³ Ý€0À­ω„Ý<›rm4 £yb“¡7ù•oPÛúÉòðỤb?à“!1±§#Þ´:v¾PÏæÑDGínžÿËpQ-Ëè)ïÚÚÊ{oœ4sZìŸÇPG'±•øwÿR×÷4‘¢º4LÍíÇ&È_{ó˜ Ï>ë©ëfÔO]ÇG;%(,Ê{µà便¥oWÌälÝú¿Ì¦åX(Q¶k¡ŒÓÅýúYŠÕµÖ€jà+­”å]ëÃÚõiÕ^-;gI‹8ݹHzyiñv_ïÇYdø] "æÛ¸TLÍ»6¿WK.[x<켇m‹oÚÉ­JŒrb(¸§)ÊÕìúyË!->ªø¦hGaJo»¼rÌþpBóÝö¨jBHŽÊvsgÔò^qŒÇβÐeJe»e€  È&âë‚™%Xêú¹ŽÐñJyfRVrµBÍ.~ ÒÈÚ#‡ìOÌ—«©Äɳܷ4Ô¢­Þ¿ø—ËûøÐêƒ(‚:C¬ÓØÃûÑLR•¡@lêÊ8+nžE3™”aÏ ðÂ*ãÞk¿N~Ú¸<Yù‚‹ŸKSØ%Ž3‚ˆQÎGnR ùô‰|º«25‚Þ0¦âñ·Ü/?›‹y»œA"’d×ú~ÇŽF…03õДe…„¿0©Eì=iq;ÿ!»\vt;Š,ü*5i $ì¼gv@5VVíÝå§³ _>»®b·wõYübý…Œ×I×óÖæêp‘/ùfiìâ•+ï=mÜ þ-Öšß»ÅY'õ6'Zˆ?‰ìq‚FfÔ*„”i:‚0¯3P#¯ÞF‘4í¡ôƸ]Á©AÕgö Ò’Æg{ë¡ÂÁåm±Šéœ_w÷¾TLìj¡,äxNMÍSäÞ"a8ƒ®æ^0žêŒKبH á™A¶ýV ™Þ¾h®«„8cL“cYç+X '»SuöØŠX ¾&ņj¶OWr³¦²(ëùô¯Ü9;9eÖm…¶¡Žß-TÄ£¾‚ýnŸM÷ñAΗç^€·0²kejçÞL!Îõ_2³ùZu¥]ù÷”…$ñÞÓpÎ\ l•´îo»êPÎ¥H€pNA(¢Žšî€‡“â¼tKÞ&0£IepÈw\äâgÞâ"µú¬0¬©xŸ- cX¤+Þ¦]亂¡0}¥\´®ê¾vN7##¼ðûò#vî&!Hºc4÷먰s€ñ¯íàËæå྅%¦’»?ŸvïJRwr·W©2#3 ^;—Ê2Š3†ˆéŸeÜ#ÛeÁÇúçþí“K<7c<ÀºRÏo:j>®W—G¼ÒSÞ¦ºÃ=­gˆ•1=Ò›‰üJvC«•ž ªÄK×¶v°È\޳Óâð€<;G¿eµù$íŸaY®–VÊ I,aµQr˜ ôž=ëÝ"YÚÛ»ÙxÝyâ_߯OO•4Òͳ‹©omùmâ|úÇW|/¸˜ÁëÚ‘óW}>)Ew‘peÜÍ|Ñt^n$UM…<â‚è6wÐcëÅ÷RÌ5bY ; ×¢Üù…5O-.p§•4s¶+A=ÚÇWzöRôòΉ ‹êíÊC:#U1uшQ°:¸_Û`%U¬”C^‰ ø­‚†ß“AÅzò±[«ð…m½®ê"B* ó™oÅä'—¯%ìNdFQŽ?HC©†/aͽٷ¹jêõ„N-ç9/þ¾rY9Ÿ^ïnP¸-R/ÒºÆO¥] žç9³&ÓCÅxÍqaŽoÀ?.¸Èƒ,f­ÔN ¬¦• H7W, Í~L³ÏMû DjÌÚ‰K$ZnœP—2Ñ3xhšfMÛëófØÑÔsÖä¥t3,¬àÊU4Å †‡ÒÍì¸çJkxq«PóŒx4\ŠEµ8B ™qƒèW¬“àè=a¿ä«bæ¨!ûs/E“qúˆh[²]D¡?õ(<ƒÎzŠèïùâiï¢Ü`µ/~ž•¯¨^e‚h‚j<¸ko–¦®Î5‘œ³…Å#BÍð)R—U¯”¤$HB‚àt;¹k§ó€^ =4ó©Îö`$Í^®c‘ŽŠŸË÷]j=jÃH;“æ ª;ÙÄŽòzkÜ‘·˜‹µƒÆ=鬛!²‹©€­52«'¯–XîÈk]dç^OX×ñzËa%.’œ‹½ÝrIkmÁûdƒJÐTk«h«òÍ?Zˆö=d'Ǿ”®÷—U³’"É#sKœ7úÍ0ÖÎN@3ÁFÊ´–á†Þ Õ^«I ;¨‘¬~2¶ÕLxz¿ƒ*~›Þ”£3±bãSA”ó¡{‡´°UÒŸOÔA^ù€™6ú®éëæsBÄÖÒä ñäã'Ë!SŠiÖ»õ³è4ŠŒÖì¨:Žèwt<%×dWz ÏjÑfé:#HÉrN›E‚EávÊ%õã“Ô t¨G¥øÅ›¦l2‰N˜]œí©²ìyÓÂ9po«ð¨/i±½KAÁ:'Óš ß,¿_†#þy†È­¡Sûé—àv%€P?OËfV‘°PªY¿¦W×H ’êœ3ÅÕ2*Ⱦä&È+~Ø(Íð=[[¡¶ˆ³—ÇÏ%³õÌ’²;›5€U‚6ÿëÿÿôçŸ~þë?üüã?ÿñ·Ÿþýñß„~Çî¶ÿþãOÿ÷óO?þãï¿ûË_þüÃÿúþ¿ÿüùo:úû?pðøÏÏ+ÉÓ}9ë*kÞR–HÖyÔ$é %Óöǧ…"¤*AÇÎ2ðYw5qÄY*T£BÏ“þ Q@`.ÝãÐx’”†ð»eã­÷í=\¬•î*·lWmðSªÎVpôÑÊ ž«ù[Ê]‡g ˃̅êr1&¯®õìiÎÒ(iÕÒ¢: —ê“u)nt•œ›Íï“O´7ñíO§Õ+r¬MrEÿ·.(š”¸Í®,:d¥ê9‘'[Ò–¤vM~my•ÚÞ{¥å-÷}êl{l¡ðúDë<‹_m“Z“3qj[*°”x›yGAI›[‡Ä4ÞÐàoq.ؾ( @4abÚ¹¯%Á½ª”¿*Op[·„ñ-–p Í@)DS{.ä[Õ3=õn/y £@ÂùEqœªGˆTøž´L—Äh»Ü) Þ8Àæ ˜›“›¥ÑfÎYŒ2€R;“X­øÒS¥ 啈ûDåÌl©ÄÍóö«µ§me‹þ‚ü‡ùr$J2~Œ·âZõ"š()·­ªªrl“¸;²r诿{ïñ3/ ”Òœ ™Ù3³k¯Y˜2r‘—²eëùe¢æ4+áىênƒÀŸ”]Mv¯¼ÕuɱT ®Ê»á§ÓY&Ê&‚*ÊKMò: ¢†+RfäÂOƒ²7ÐÉZ•â”W¤LWQÖâ5géò…a–÷?¬1X‰4Ó6Éadi)ïñ ¯UÂzÏEKݰK×0™a bÁɤi²§`8çáRQ–eçJ¦`aT@ëI á4¹†ÚÌ6H-Àe®HLA'ª( @*0¡©æð¥€%<ŽlQ’È1M£ôé:W y•áF3é@TŸ-m¹g-,ñUZ<!…ŒÎåsC£&Âþ¶$URiW°å[ Í]Ò¶pŠüþµ Q¼0PÊ©F Š´¦nJ•-bH•¼ih ³‹5ùŒ­$«Ü$Žm‘†Ç5…£5º™á"VX£œ@°u£Vg• Š¥ÕLŨꌴNà'Gdœž0H>BP^côj408»¼Ð$%ä#-ÏšfsE>̬âegI>&q'¬JVb9mŠÊe+\-~Ës $-ŠMLrŒT^”€w˰LùÔÑ Kæò¢ÅgŸ¼–ÁööÙ§0°TÐÝnç6ÿ½Sø·ÓÈÞ^â¿ üúí}õA d äp×Q}¢õ~Š3–œé‡3ø·7úî»YkïÈ‹G>ë&³tÂÎÈû ë%žŸì¯ŸcròØ Ã`œ8ÓIàæ–â8ì0•M³6ëýpàïEÓ}v[ÔíÅZû†©F¦´Å›ÐÉî´—[/1¥-Ví?ˆg‘wçÞ´…¹¸ÊÙ‹úN6iX÷ýÈ BvÀ>L‚¨0¥-–ÛOœÄ«”,·ê:´EùIa6™ŸDKŒ{Iä\ûQ愬c-;û¬-Ñpj`cË[‘CÀR…ø¢tàc0¸AÁÿœ)ðÃ×ùù cµt¬>Å¡ü%¬”§‚¢¦ŸÚgëçŠf°‚Émúÿq- ‹‡*tàˆ0MVVy„s͹$›ð¹g’·‰üem ~ulY‡]DØ—^nÑG®*>'¼*Ì ¶àu rΤRNAÔ"ÅÏÃK¹ÂÓ‚‡VùÊôÊ[t¡Ã¨°ðòx,L:疺ܙÍ\ÙfÝW±0ø»@Ã+Sk.‹ƒƒ¬1£« ÂlÄ !_C&dc´Ü;!¶œÂ ³ÛÐO[³(¾‰è ›½£(ŽöYç=xÏ^µ:ÃàzúÅ,g½xŽÞ’ë ÛóìªU:Ë>Ý—ÿÂßaè†éìœ}ùÊ™£ŸdâªÓwÀ+öºÅ:'þ%ü^âÝ\óää×Ò“Îq|=Ey„PE\mDLÈÑ}r¨“›¼Z¶h˜9îÕúE]' ÜjÅàSª•(h'ÛN0…hdýÀÄÏãB#¹Ì~²UÚ%ì%Ã,‰¯(üºü„¤ÄÙÀwšL¡°º7œ:.”z¼ ·ÿasíÈֆЩ#Œ½f{¹o¯ZJyŠë„ù)0öê;~Ÿ¥¶ ŽÎعˆ7ö x€Å1Û; ÒièÜʯû2€.œž&ñ4N(а¾ÿqÆIðÓÁ™|_LÓÀóO:³LWŽ¨à­ oOdi †Î–CUk«ðØ\Ä«"¥¬ÁWGÔ9XAÕÝ0v¯n‚”æ^3ª¡¼ï@™ÁtGÞ,ÈV@oÍB„ÇzØÞ™ï‹Ô?ýáG=Ï£üá®Uö6íè¹ •›¬ÈÁš¨º¡y«Cëï@åyµ|¥ë­Î鿾;Cîd/±c¯{ý"{Y¦Žb[W[ѪLÎMk‘-øŽÃvöP3v¶ã°_ä0Ó4ˆÃt ÉKá¶E¦Ù«8 D›ØÑ؎ƶGcæŽÆv4öô4¦ZÂÚ=*LÖ[›É«E-Úí¸n×YÏëtÒ\YrÎZ·äžü¶Ð×¼Wçúuƒž|ˆ©Û…ØèdEÿƒÕÔ\ó¿„-½ÆÃàz–Ü(o&Å‚;I‡ÛÈR€H ô¶Í-UÚ®¦>`?»Ë#q‡GÜä¨!xÛÖLUé7ÁÏÇòÈXïœojøúdè&7àÔGrż#9–f«Š©¶®¨tüÖ]9qÒ‰€œÿî֗˘Opã?PÉ›Ši+°¥±ü׿²~›Òýåö ¼àØpâxñÍ3lº—¤MŸý{‘ãl«Ø†æƒ~Ä#/ù¬J¥,!VNµ`  í‡³qŸÃwÔ‚,¼ ù À•_ICê† f@awpõíˆr¯±ÎÀw $“8ù‰¼mCñÔqëkÜ4qk~øI–ȺN€N…Å(œÑ€Å‹ÏI®~Ÿšþ´ö6|–|öD­œ'ý;x+PÙë½ËËÔÏXßÉ& ½.çpje¯7–oÖëjÞ[ߣlŠñ©zÙ}—)5W9p×vÎSÕö^íŽJ4t'øÞEAâ<6N/ð! ø)¸NÉ“ùVv»¿ 3eyßÌ~þ¼eçNzµP]š:½¼ôÝleyßøPXÌåf¥ÕKÎ@|³ôþÐ_)9^þ…0t“`4 ŸãËò¯DÜV.§RÆnÛ¶Å#ß©Kù³.F.Ph1»’?k¸ßŒ@ þ‚ ¢ñ¾L”;ŠÆÒ{Þ.Õæ©7ö{ JCGÞ¥åzÂÎÇÀÃ{¹¶GîPùiÚœþÏIÝ“çp{n¡ß4XâFÃà~äÿT€2NPÉ6dHý¼> ’øræN‚³o—Ùÿ$‚6MC`;év•Âm ¿qÍ~z¾`ÎØqœD~’.ð5Í®$ë¹µ›1¶RP`²©âý“ßn|þíÖVÚ¿)Ï÷ýÖVmĦЂB}:öI5×+õñ'/ù¶‰õþúñ$‰§l8q¼øf¡\8'§V–«±|³r-¦€¢U~%öÔ “ýFaäÉö/¡0‰“ŸR3j<@SÖ—¹iâÎ-ÍX HÖsꉴ±J^…3³J½é9ÉÕýE×ÆÏ£—/ܾÀ¨3 ³¯5Ý6 ®§a©Û*èȶ”@:ÛHJ¤>p]Vs柣wö·ÓÈ;J2:.Å#ßÞÇQ?kx‹Èá®]ÑwB?Ë|r¢?¢ñ³÷e³i–Гã+ÖâSÚšmõÝZ,{'Aæ×±7 ³ /óA…âƒÁãóÏglà{¥q}ü³†Ð—8¥ÌM½M|?*gxmæøÖ)&”ÆD7œùåñõ‰sgìG™#çÚŠÀi$³6¹}|#ç‡ çìó¡ÍÙüYxKV–È÷:ä`g£ VV¨Ö솕E›5­D ™4ÁSë6šX8†šÊWWAÇ`…î—ÎFj-¡‡*ÏMçµEÝF,·1F¦Xj„·©EN-™ÓÒ²È)eTËó±Mq–)Óg翚Ǜõ|XùkT/í,^œ®× ñSD‰C“Ì0¿ ÁÔ¬(ªVe¥ðòLŒóø|(jvh© ùOÍNÂMEKUTá*5ç*T6kV³|©&!®‰ªZµ›&êõÖ¢(íDš®ÚhŒUm€NÑê%ôð`-õº¥ž×«'‘luÜUÅÙ¢‚)ýµ,в… ^Ï¡( é…4F 2ÆØõ†»zn\sW/MÿÏ}Õî¶cÑ}¼E°ul§¶“ö—O»ÙuROÒÙ.дDÛ\Ë¢@RnܧßKR”(Y_δH» K‡W—÷ãÜsÓˆ&.ŒÝ¦.Œs=·.\8þž§.\äüµ_7}áÆa4´-}î‚ÇI¾2à8벡ÓÙºÚ/ô¿YÄÆ©c½Zœ PgFC‚9.¬`@•¨Š,±÷‘eíºZA%\]”à[vF\­•Ù{x b£µÙC|µ‹ƒ#]´s±Éì!^™í|Ä;"ÔR &<Í0ÿ}r¬ý¢â md΂ FS&2txÊOG«tͦÂÀâHéçùÊÌSΔÑuÜ+LGö'sf|0hz¶z3šÚ99.ôPnNžÛãÎIÝ8Æd éF+¹þµ~¯`­Ÿ£éQ:Š#¤7tí]Øö]Öï@â÷ÂÃJ=&Á\tTó§|Úƒ?#óô2%xÖ˜‡éòÜ<§¼¨^š‡£¬›õï´»GÎ7R2;ßH'è…óA:‚odsy˜7|3¿JE¥ÕŽ™šteæÉ]d©~c%é ä£+“O:§‹„î¤óNë¾Î‹5QËgõØÝÖ¿¦œ-coMO¯¶Þ¨yK¼ì÷Ì«‡ývÁeæ/JºÆ]Q2µs°Xý ¢½7a?Ié/(!„ –ÓÄ.xâZ­ö.‰Ô”yñHdŠ%>yñùÌþ†ÝAýr– ’ßç#»ÊEØ×»ä‹Ï=»n±Ø˜GéZ("& (PaA)&¦Ñ®y6´;'3«ë‹ÏoPgrƒ&±dè  ú•LÂÝP„#XãÝÆÞRG´9…€EkÁ0÷‘§Èɼ?ûÏíìŽù¤ô²ðåÇmÂë—ÀqPE±$‰ëg-iN}gßÀ¾ƒ‚²|N’ð ’ðØ·ê/¹’øvþŠÏ;ÌÅØ6¡[ ’òÐVËÁªç¢¦š&3þý§NÈBÒ"0ó6°‰¶ˆŒE~£Â|ê½4ôÁÑ~‹»Aq<y§/Ñ|?ýÒÿ'#ѯD«ûS ³¥Má7fõgjô×»Ö­® Ï\Ñêz^,$Û>/“}¿:|-ð6 ˆšéÐbmËñ»÷øò¹òÿÐ¥bùåžÆÏÜ" ÞÏÎŃó~÷ü|0´:»ê®_¨/×m2œŸ—‚ûÃq·×^6ÝjMèj݆3RäóÞë%dk45fë±U/>ûmçÝËQ¿1Kû6·Ù?÷mÒ%´ê &AÌÈR¾çtEÃ6·:<óŒÍ{,æ¹bqè?ûü‡)õÜ.l‰Ä>È¡?ëÇåŸôã¯>óâ- [‘šVOz¶‚'7ý>²ï,À’ P5zS³Û³};¹¹D·D¬Ñ=’pú«¦C÷ÆêkÍoBØCY,ÑŠ³82Ðó^ÎøûXF¨7o»S‡"ÂUov©ýšÜ{4ž,ærÁ0÷‘ÇÆQî·…®8±‰^ .ª±Çl#ô³œø-M‘ý\"æœÂw} ýâS‰4 rŸf-1 Ø©MÈÛ8B3®b¼"hÎ"›ºÎ§[âÓxëäç¨ÅßBêAùÙ’,³öªL’pã’Dwi­¾rî•À”™_c¬E3²#ÁáÝzh™šôA$ÔÖò‘X[ c޳ åNp]m/wÄ“¾pè‘ÃJv@4$HB$ëݱH!9ÛXî®G6ClGx”ÉT¼ 8xO¢8iCˆÌÜhx Á?°„̘‡j¡ß—‘ q"üfê"Ý×Ôæ£¾j_{ã>ñBgwLæ^çùá—ùƒê{¥n<³jÔBHÜÐä&µñàFºÙý•³lºžý—-ºÐIŠ ‹\\„EÐ@@+’÷¹- ª6§µåPÜ\åOCžt.Üý“-nÂ%CYÜ{U1(£AT‡ñ…,«¾Ÿÿ~ŠvƒzÀLÄÙ’ÚÖ*+fÀùê¬ ‡%ñF—Æ'K‰¡PlYî õå:)¯ËJÔšÐÕ:1Ö™’%{4åÐ3¼þæê|.·‡Ÿð žTƒ\GÊ£Az1iU'jô××ðnŽ¥Jã~—ñU·Öù³K²VÎ %@(k«·«ñ\ƒ¢ÀÛ×·Æx¡¨ )`$ì*v'í|ššÚjhi¥ãˆž@¹ù{`_ÈÀV«?V€5¤NKðYÛœ‰|•Ï líTä·6n:3=Ñ¿¨j(ºù £k)Û!¥¥ÃËWõHž5ÈxXÙл`2%’šÆdË%ȨÆÖ,ÀJu¶O]…8S)U@Ú‹C_´:ÄZ‹ÃbAå×LB5^ÐSUìª8PŠˆÉW2Õ÷°x5 ‰! ¥ ¥€KìkÆ¿¦Ëj)J¯®­ Š5SY‚«¡­I¨–ÕvýcD£n ,›mÎ@Ê$•iþ»ƒaiÕ+(´´RðùQSîºÚ/)¬| 0+ƒ€SŸ(s70¾À\Ô7S×ÐM?´§ÑËsS´ íÒĨ¾Å|#ò^·§^·À:^·@È­b‰øT}MãjÝ¿Ul êS šžÈ¼`×ò¿L*ó"¹èŰ ¹jCCJß’° Öï [é¶An纷tE1ªî,Ivë ­BHøŽxÛ}÷e@&×V ¼I6ß¹bO4±p¤Vܼ- ›2/Þ}¢"ãÍp¸Š¡ÑœEqa'Ü\áíBy¦>¡‡õ½FgwLÞqÔ¯‘B7Aëög=]•׉ºÊ|úöó- ™·ælK¦ìK(ð6 È}¡*JWC0ÐC6;q,@,½„ (o—F8=PŸË(–ð"47+Œò|Îj¥ei7Z÷ßkYðüŸpù…ñÍ,S=ÃRöQ9¹%bîµÇô«fWT¼sÓ׊k¯u­«¶u=~9µ7ykB ïçªDe–ÀW¥íë&0KÝ’^“ŒÐÚk¸™ó`Æ#ÅByDjâ0»ßŒj>›Ä å®ѰÝ$Îg¢èkípãCÐ%µMYÎYöëï8ÞW×ëqsŸÿ`PQéÙ•ui´~q@å¾ÍWóW=æ£ó„ê&g ,gxOx»Íµ¡;“²lÅ*¥%r\‚>°¨¹'÷nB8³Ð”-š€ÅRi7dF—xŠ›WŽ$¨K‹JhU)h®.ç,“‹§±V%Óg)©ï·BéóÙ+%ôf4Ü4sJ!2™su®Ý“Õ­Re-›°ìîUªÞüÀéV}ã#É)ÛêÆƒ½IÕýÓø°]•f²6&ºP²G97%BÒç…Em”–"\Eí¤—çvê̆¯€{À€éŘÞC3%@BIÐL ¡Clø¾µÏÕ .ñÎ>¼XÈžg^I£‘Žòtì×eg¸¿ùJÀGEL¬Ò/}8昫ìèI“ØUýµbÔ?±Ü’åoÈ^%µ”žþ—ØAµ\„¯¶výóU(˜@z(r·º´¥ ±<{<*íûõÀ¢Dý×ëiPÒ²ØWå– ¶Â G–_q¿|©nC×vDÙù»Æ'a%æ1lCΗÁnU+Ь0AX—R[nGÃù¬ÿ®WœU`ÿA™ÄrVm î'++ ¿‹ËÃ&† c]ÊãAÐ 4´$<õ‹ý9œ­Gh§­PïW¨8ÀÊ--÷Én8ëFò[vù”ƒZO´Äûʺ9¡—Yë ¶“bפt—ç÷5Ú^ƒƒÓ¾ùäÔe$Ys†Ý>TüF°ž¹U(xs!yç7Ç+:³ìi5XŸ÷ ŽÝ| ·æðM-ƒ¦¨i»…«·ïËjñ¼Yý{ëV4íå-Íš&ŽU)ØeöÈŠ‡~£ô%0°Â'Ò˜P¾L|7 •fâànþNÁ÷ÃY9yÔmp;k êž-ª˜~¬™±Ð ÌªÜR™u+ì‰E†Ã³NnåV±YDÉÚÐ>‹ýr£‘ŒUV(Ъ¾|lžðž!*äk{}…õ)‚~ÑÑl7¹º—_¢!) N¥ÊGª¶«Û{9¶òA ó+íËõâkÂÓ¹ ÿlÙ±„¯k ¾üŽ!©>rCˆŠeO7*ÐB6RÙE ó|¤”Œ$ã£ø~” Ì™Câ%B-U+UŸ­Ê<ŸïmŠõx§ÎFî“rØòîcpÌ„êEo¦2bú½b8ùÒ{‹éƒL‰8þJF¤ž#!Wí? Z@WŠð¯7`š ß9Ý'üí×  Ú4’æþ?¥åTÿ±Ó¼»O ùd=û™Ñç*?Q m8`rÅÜ;HKpi倷¼V5IP0ÒJ9Dƒ…Ô½Ôx># âoP¡h_’¡îLH2§gzzØ9©¥3,’Ôeù %daíäÙ—¯NU¸… †„d-šüÎláÚ|=¬è¡c~ÒwÍ¡µÄ4–nLƒ¦Ð©£Ó¡(“uXßÜ×Hsh–póB˜äÍ¡áqÔF§½(PVpùÛ3­­Ý¬kX5‡F=c_–þ4Wjc¦QûÓñ«q1ÑJ1¥û; 4nwp¼'‡§óÑé @‘°5"ë 7gSh­N0Ðdås ¹¸¨êcúÂÏy¤°žŸQu#o_a@£‡©Ô¢J2ôÑå2@c±ýìh€Š™,agüdÍ 0Ð;6ž`aSè´0ïá uGÄ[Hs­Yb"Ø×«ž9´[öä¿û–Ô—ùJç P‘"§’·0º{0‡F‡CŠIQS¨ùL8z{úÁ J1“ §Ò\kÜNî¸ve©šþl­QE×ʪP ©qðÉî/ÈÐaÀmpp¡Í%hu¼ctÐQ–j%aõþ€ÖW ï±°‰£QkëmÄb q{b·d¦8h…j{') Z4ØÆwúnËwz¦Ð~ÆÁBïWpb oÈäþÌc3×z__uÞF·)ôÙÅ}b¡ýuw¾P¡c:lz¾?fÍ¡­ùÄÜesæÐcÓ†…ZÈçYÍvÂi} ^ ÷sh;_M»“‰)tò°k¨Pˆ‹»Æ– :NRá+`ílû‡T2b…¸Ì«•'û>>QÕ;i Mv6ân¨4ým!UéƒRb̾y$hinè ¡Ÿžò‚QŽ«R# h-Ÿ~”º-.A áû€áNõ£馉8Òå{ ZëàyvÁ!,e€ò|quPò·I Bl›–ošBº4¸×vXÍ"¢¿bgqý¦êOÎé!-ݹ&Öa7¼ÆY×T}Nž Vmå‡Ò[qb¾†8}e¹¯YmW ƒ5ž ϲUØ%œÊ8·¶½bí‰ÇFzŒµ&iooŽ·®Ù©ëⱟö"í½c¿nù¸·.>2«ê±¸ýÁö¾¨c¾NÖõì“ Y?\ß)ÃÚO¾Òœ~„mé{Z4ûÖþ\ñíx¬õ…\„¼u\Iç™Øçä4áÀ~½==ëXëî™.u V­Çö;&?Å} ïu31¬µIGó¯X«…|çýÎî$œ±k­Û‹ÖÚ¤ ¶0ÞcE‚vxÒ˜¯cuªšó*šÓîŒÁêt…‚l-³ÆSYÌkÞ¢Öõ÷ôX™ZºÞÊrý™“_Èzkbf1©ô”BGú¥«côÉfÌ2h¦†0anèDÿ1„¿Ò+£Ç‹:¿¡éMª2í•”ÊÇÛhWî1 ×s˜stýXÞAÇ´¹Ïšt4'"ÔNr.˜c_ÏPZmNà}d/<{h“[x :Ùªüy èÊ­ •§$qÒÑ\-4nG“Λ94:a¡p‰lÆ~L«Uœt°Ptå½ã K-4ÚwˆP )a“R_£uétÚU¨Øý_ ƒ{Q÷QZûÒA=CzéǬâà…ŠÝ? ó tÿSMI²Ö‰™VÅÁBEÝ?ŠºÿµÚéµf‰à5hË……Š=…*žJ‹zŠ.ª«”‚Éð”GËý-ïMÏ{N{ö1oÆíßÓêëï+ÆÖrÞÉÕ¢šÇEñ Q.ÄEstçî=òNï’ýP™3/gÿÎpâC{Ú¯>òG÷.ÿá”jrjþèÉÕž¿í—ȧꎭ¸‹|ªöVÂÅV9¢+MŸ¯’òÃß>ȱVênÄó’;J/)KЗ²W ­Wòòèi;fXGspáå ¢Ô´rçÍ‚¸a [~z„?œà»ÙÙ«xGêÛår¬QðèÔ;Pö¼¸eª#IñòE?%™mj—j˜mJÞÒìì‚ÔmûiWj º/«tÕT]NOÎ¥{t*¯;=äÍG}.âº> ©Ê¼Aˆ_ßö{üì}^UŸv“’ š×§+κ=~5?•[ì7g]Y,ì-m™ë~·Ü’îà¬LàÏ,5¯-RfÕÆßéy£ß¡¹©~Gæï=O—F©æ •ÁbšYbñ¹|ãùYz¦U}é‰\/=(.¸hTÇ ^ëÀË–utJ¥ÇÜwÓªè^Í©ü¹Õ/=dß…ÿËzÕô4Ñ_à° ‚ éA=˜z ÝƆ«m =( MLŒ`ZüÿÎÒ-Ÿ;°‹^ö´™7oÞ¼Ùˆ_;ÿêÛ˜*]UE ù½ŽÐ˜‹¥àFãõ«ÓVj2WhÞK$[ç¡b.–2wîµÂØ¯Ñ ¼²ŽåU& ô|ç¼Bm3ûü]S 9ÏFh2¾­` Îò²¼Rª0&îÒ±þpêœB'oGÌ’ V •«Žv²î\ÖuL¥t‡«.èy?'í#\ö-ceôØ¿O¡âÛœ¶€Éx1™£t¦sL9@(}JC” øÊS°lñœ¥TÈ °$„ëûS`{À@>š»duSÛÂJhõT•JBÒ¶…‰ŽžÏ»Cz*Æ1&1¿ ÛÌ&i´¥>l}büZ“YÇí©¢ýd—°b9qn¼ )%ã'Ô+K–ÈJ)Ñ•ŽŸRF=Ά­ Þš þØL†ä£a3ƒâü÷«ª°ÃH{‰Dóbzi V6”N áÌoþÄÈ€¬mu©ØÛþ+Vžh’ ¾X˜’o÷¿ ¿,¿_ endstream endobj 79 0 obj <> endobj xref 0 86 0000000003 65535 f 0000000016 00000 n 0000051830 00000 n 0000000004 00000 f 0000000006 00000 f 0000052280 00000 n 0000000007 00000 f 0000000008 00000 f 0000000009 00000 f 0000000010 00000 f 0000000011 00000 f 0000000012 00000 f 0000000013 00000 f 0000000014 00000 f 0000000015 00000 f 0000000016 00000 f 0000000017 00000 f 0000000018 00000 f 0000000019 00000 f 0000000020 00000 f 0000000021 00000 f 0000000025 00001 f 0000051881 00000 n 0000052139 00000 n 0000052170 00000 n 0000000026 00000 f 0000000027 00000 f 0000000028 00000 f 0000000029 00000 f 0000000030 00000 f 0000000031 00000 f 0000000032 00000 f 0000000033 00000 f 0000000034 00000 f 0000000035 00000 f 0000000036 00000 f 0000000037 00000 f 0000000038 00000 f 0000000039 00000 f 0000000040 00001 f 0000000041 00000 f 0000000042 00000 f 0000000043 00000 f 0000000044 00000 f 0000000045 00000 f 0000000060 00000 f 0000087652 00000 n 0000087726 00000 n 0000088112 00000 n 0000107439 00000 n 0000116455 00000 n 0000137418 00000 n 0000159274 00000 n 0000181414 00000 n 0000189648 00000 n 0000193354 00000 n 0000213495 00000 n 0000238754 00000 n 0000089062 00000 n 0000103304 00000 n 0000000065 00001 f 0000052255 00000 n 0000051952 00000 n 0000052023 00000 n 0000052054 00000 n 0000000066 00001 f 0000000067 00001 f 0000000069 00001 f 0000077970 00000 n 0000000000 00001 f 0000054854 00000 n 0000078033 00000 n 0000078223 00000 n 0000077426 00000 n 0000055082 00000 n 0000055269 00000 n 0000054967 00000 n 0000052691 00000 n 0000054485 00000 n 0000256030 00000 n 0000055529 00000 n 0000078472 00000 n 0000087091 00000 n 0000087139 00000 n 0000054551 00000 n 0000000162 00000 n trailer <<99746D05A16B4FCE90C7DC20BA3AE5C6>]>> startxref 256202 %%EOF nco-4.5.4/doc/logo_cog_nmr.png000066400000000000000000000436061264355130400162360ustar00rootroot00000000000000‰PNG  IHDRûdÏ ÑgsRGB®Îé pHYsaa¨?§itIMEÙ‰„GÞ IDATxÚí}wx$Åö¯ªÓiF£WÒjµ9², ‡38`lcŸ1öaß9>ÎsØ€9›p¶q ™Œl`as’V9ÎŒ¤™ÑhB§ªïžiµzºZ#Áb|ŸëáyXuu÷/TMwUõûÖ‹(¥ðòòÿMÁÿHÁ?ÊÿW…7þ§ªj2™¤”–––Š¢hVëº>55¥ëºÏçóù|¶‹UUUE’$žç€RšN§mçµ²,kš6c•ç%I2þMI¥R²,cŒKKKAp1a-™t:•NÛ®*tØÅ+÷Ø»{›J¥2™ Æ8:LÉd2¶X£pIëÓ…Usæ¤ÐJ1—8ÈJ/ËaÖù.ýÕKM Ji"‘èììôz<ãT*µ¤½= Àôôô‘ÃGDIE195UYUÕÚÚj\–L&»•eÚ–,©¬¬¢ë;wí2í!]×—-[^*ëëë‹„Ãç^)5Õ5‹šÿ>|èP*•öx$MÓTUm]¼Ø¸›£ £PJ{{{Ç£Q¯×G)á8nÕêÕ,‡]¼Vì¬ã,oààétÚãñ꺦ªjÛ’%åååÖÖ:ÚÕ511ÑÚÚZ]Sã°ÒźÄÅ´c•{N­]ß±sG\™—#ãr$­M§”äOúøÚÆãXº¤‘å0ë|—þÀê¥,<ôõöVTT,^¼FFFz{z‚6`Œ‡ý~ߊ•+ ‹uvtÔÖÔz}^à9®¡±±´´tïž=3#$ŽÛ´i“ùg4èïÆŸ¡PyûÒö·LëâÅÇø÷àÀ@oooyy9ÆØÑ„QÆ£ÑɉÉÕkÖ?hUUã,‡]¼bÅÎ:Îòª««Ë+*8Ž3zLOwOYYÎ÷ÚD<®ªªù§K.éb]âbڹʵ¥­`Ž ,ó}o×xAKeR+OÍ_ KzY³Îgu9—Fg™Àš¦e³ÙŠü#¡ªªJUÕééiPUÍï/1ŽÁ+ªbüéõùªªªÌ¶w,ÑH¤²ªÊ–‚Âb½I $º®ëº»‰H$R[[c¾¿Ì7»‹ÃŽ^±bwÉ Ë[¨ª®æ8Bå庮)Šb¾vûúúZZZ‹‰Â¥°.q1íRÅj)–•Ž©æ%Z\çƒÜëã/N©qV€…i›y©ï•¨Ž^¹¤Ý¥?°8Î­Õ ”{Nc ÙLÊ+Êãñ˜ªª”Òh4*IRiII‘óƒl&“L&«ªªÌ#étª£££³£3‰.QJ³ÙìèèhII‰{ÛSJS©”Ïïèï?räH__ŸÙ„s:lóŠ»KNŠô6ÉpoC‡‡†ËB!ãõ8g¬tÍy‰£é9« s²ґ؟;G¡z†òA¬eó蓎¦7KÒ¿é¹ãÖ½7_ùÚ{îìø~ßôQ›Ws¦Ý±ÓK­cAA˜N&ºX,š®@CCCi °kçÎÛ·G#‘eË—cŽ+²Ç‡ÃŸÏo>'$I …BÁ`P…ÞÞÞÞÞ^ëÉñX|ÛÖ­{÷ìQué²eîwÖuR:80€*++3éô¡ƒ‰NŠqØæ+v—œã­¢(#ÃÃMF›¥Ó鉉ñÆÆÆ"£`¥ËýGÓÅTÙrâbÅ|Æ«1‚%Œ%y4•š. Ж^BÉw߸!š S‚RZòÏ#~qûÇnÙÿU«Wîig•9Ý8}}}ÙlaŸ¯¥µUÓôñèx1øX,F©¨¬p¬ –•ÙÞVcQKJJÚ–,I&“S‰„ËÍ9ŽC•”–šJ’”ÍfçtØÑ+ÇØ]Ž»{Ké8r„øÅmmÆ‘©D"“I§Óéþþþþþ~JéäääØè+ —t¹_RhÚÅ«Üãœêã“ã¶œ°¬ §ûrWM ˆ ä^zšìÛR 5½»’[^‰=çY$PBoŽy€Žp6¯\ÒÎz¶º4ºcà9û%%%%%%Ʀ¦i¥¥¥„BˆùÃEaŒt]+¦ÇG#‘²²2ÖÛÀ˜ûsNµ†9÷BÈëõi–• MÓxžŸÓa–W…±»gyK)=Úu”Rº¬½Ý9ˆ¢h.Õ…Kº\.q4íâM¾³ãûú0úÔÒë¬vYVÆ2#ù9+áüåè˜G]Ú óÃ8ÉÅNÞ+”c’¥T΋(ÈÃziypiÃs¦ÝÖãYÎ œc•^’¤l&ÓÓÝS^^aŒ7<O$ ƒÇMLL¨ªjþô !ÆÊ¨Ñ$™LF#qÙl6‘H,_¾Üšôh$R^Qa|Šêïëóx<~¿ß5F#ÑòŠrQ5M0>y¸›¨¨¬U×Ôˆ¢8>>®iZ0àyÞÅáB¯rßY±;wñVO§Žl{}2i©©~±â<^o øJjü¥Ru=â8ˆ„ÃåååÆoÀ1 ÷t±.éíéI¥¦Û—.•ó³LI’Œf.¬âEþ÷ýÿóèÀo4YÏŒ¨?/ùÎM-?­÷Î l­DÆF€(TOO“å"¡iiR ¥Û+m@*úñ¾³z†*TÕùR ”1ÈtQs‹ÍaVs¸ôV£³r‚Œ×PWg'BˆRZ -Y²ÄøÑ¤R©£]]Æ"«®ëuõõæì$“ÉìÛ»wÖˆ­©©¡¡ÁX¥_¿aƒ9£”îÚ¹SÓ4ÄÏç_²¤Íëó­öïߟÍf*AZ/6>:¸˜ „ôtwÇb1Žãt]ojZT[Wëîp¡WFaÅîxÜê­:“û»ËâcÐ{(=Ô«&b]2ÙKP‹DðbÄqžšFoâì_vòKþé\1TÉŠÂ-]ŒK¶oßNf¿W®ZeümUI5ñ4ü®G;JTצˆo±P"nXõݵ¡Mfß*´òãƒß|%ò¼y‰í¾"¸nEp­‡óMŽ··.[Õ¼®ÚS‡¾gïí¿Ûr/ \ öÔó®%Õ¥‚N/iºü„ÊÓ­³šÃ¥?°•d, iš¦(Š1Y¶¯3f³„;ï9øÂ_‹G/|îªõ¿ØzD–e]×qaá‹[UU„Çãq™©ôô%>wÃfË«Cª#$ÀìKQ›Kîúñ»‹\YbÅîx\™ŒŽl~bäŧ’‡v ˆ¢…¢;|ÍK*N<³öü÷K‹ÚTUõHÌáy¥«ð’bJw²ãK;>á€6Á—V~ûäª3­D²£ßÞwý`ª·xCçiñ/9š<¬i:Õ(âgBfùî†;W•m(²9æX Ïf !Iš³Ñy¹Ávkþ:U%Å{pïßuz“ß'X1¬“‹ R:ÛÀPÛê>G¨PüB*+vÛñT_×ÀïïŽl~Œ¨*ˆ îìÆ qÿÑtÿÑÁ?þ²¤}UÝ{>Tÿžç±AVÞdºËâ’ö J(1{?#ê~ý‹+o>½ú\ÓÊ„ybðÙ¿„ÿ<’˜¯!YÏ«™ˆÄ9'k‘qñÍQüwÌ¢zü[^Sòoþxøš+×þ@ÛÉãcÝwÞ~ñ 8Èê鮃]·Ý4ðÛ;[>q]Ý{>„Šþ¡.¬ „×…NøkøÏ:¨~ë¡›4¢žY{ÁöñWŸúã¾øNJÉ1ò¤L,/‚okC´ð£Oþ»îë”ßß½õãg‡7?Ç’H uüøk[?qNâÀŽcÔ†ò™K”ü÷‘ï\»õ²ïíÿÊÞØöc×Ý Éßú7iÓcØã5üâ¾}¿Ý]™ŒîýòÇ»ïºEϤß‹™¡¾Ý×]Ö{ßO)Ñ•õå' „ÙCG2œî‚íHìÿ}ß/U¢ºŸ¦õå±gnÜóùþT÷;½ÇÀ–m#»÷Gþ»{âÀŽíW]Ûµåm«è}÷ݶûºËÔ©ø12+×–müÛ?PˆòûÞ_~aûG÷Ŷ;žÎŽüo÷ϯÚrñOk_lû{®Í ½y»ÜÍ7ßlÎͳÙ,ÆØº\ŸJ¥¦¦¦²ÙìŽ=ã=ýSöå=CˆŒÌy8%P¨žÿºû¦.+CvMh#FX–eY–¦zyøÖ;}ÿp|²‘£L:³#üÚI¡3AGÆ:’5ÌL:H$¬1²6ÖÞŠ©Œvêåx>²’E˜C˜×ô æ‚T š×Õ)s¹çƒ=}üÓÏ÷¶6¤Y”¢ß…Rh…—ÊR9ÿ]09•8|èÉrp¹UaUxóㇿwý´ª¨  cê(ÁC d ˆt †‡@>½¬ª,…A <‚Œjf¯Œ©tJ‡Z‚ù[¥téìÿÒ'V|éUòÃÑÉ-àvwÛ8GŽRXN¬ü'QñÄú’XDˆ’¦\K5œÙG3ZaU¶_%2 ¡Š®‹u_Š]Îw¹DO‘숎@Y(ûëΩƒ_^õî¾î÷Þ¿'¾!ˆÅjÎleµ^è¿iôKŸhû<‡°Ù¸,– «Ñy`cí­˜zÏãj¶ û}Æz¹.O`N½õ@ô´’å… Âp¼_ðÌú®~ßïþä[Ç-_±Â‘²ÀBô»0B­Âžüd¨¬<ÐÜÒb²\ne«Ší|íð-_¢ºQ¡C­0©CX¿ F˜Y—× ¬A)—ûêWÁƒ¡I˜&0¬@#çæÁiy‡%g=>ªÞÿƒÚ¯ß^ Gœ G ‹‡ó®ÐÛêù«gú4Í©b‡$%ªsTXÅ9>€Pú<ªs%!æùìKÂ:_Š¥ZÔI"©ü»?¿íòÄHRS4o;0{Í #»ÓÂøÊ Ë³qÅl\K†ÕèØX{+¦Þë è@5sR±'¿à%¥LÈM}ôÐäý?)†£ãÈÉ……P’UìÉ#Ñ%¢åB¡8Vñe87ðBÀ—" ”ªÔå|Ö%T¢P¾4ÿŠbªÉÐiuJ's·þ¥ýßJ… µqYüV£;sU5€ƒ<òãýDOQªP]K"Äc,å‡ò²’S2cº:e~zäÉ£#c¹•J/aa¼G+3cG]±ñQæ,z:uè»ÿ¦¥¦­ãróC¨tÖ]¡ÓÁ‹mÏ"‡ªRr™Hè ðå{ø„†ü˜Ï{Û}r¯‹—ŸŠ¼ôäœGN†õãIaáxî'‡nܯnÕSÄpKM, Æ € VÕL†eŒ L1çÛ.™ý‰€*$ÉiÙ!]‹[Ã_qÚ5ç[),E²dæýJQ”éDTB&€C*ÕåTB€¼u€0 , ð#Ì¢ªò8!² U™+•ßú÷S y Š¢ìÚ¹cÌóüò+æü\ʲ2³¼Iø|Í…›/¸”Á‡îñŒ‡=À#Èðc€i=÷èÍ ²u4¤RãÝdù0Êùü´¾-ì ñ>µ¿¤¥<€”¬õ ÷÷õôÍŒ€hsm,SHÚRðiµÐzø©?$Ͻ°º¦†•+ƒt²vÝ:çwl,ÞÑq|>ÿòËïîúÑ«‘Ä NÖ Ý¥ Œ€Oo­\ªò/ªNhbx8oE}éLO¢ˆ:žo»Äxr’ åüÚ4J q% ˜(Tkz–3F>àãK>»ì˜Ma1ù+¡Pyeee49tðàÚµë\ðEÑ;:;:%O 'Ì,kÊ$ÑR¢§a^WjfTò5Â|þ+€±¨ÊQ^!ÌÀk[GöìóµñÀ;q±büî%Q]]]|wo~<¶kKe壒‡° ¥`}0ù8Ú†AWaX–€·öÜK«Ïº¸lÍ&б Ô 1È"Cƒƒüà`(‰¿ñâÑ—ž’µf 0À˜‚*xêØ26ëÕzïþAÛñ:æŠã8“tòäÐÇãñ@]I5ÔX33–»þò“ÍøQ@ Fu2Mõ¯œl…çˆþ–ÖVƒ÷ÐÒÚºsÇÎñè¸ ,êƒÂl+@ôPÊâ£8|)›žêºífÛÁ †”A½Ù™L!P/qñg¯úÂT6µ˜U¢(Š¢Ø¶dÉ®;§‰Ò@`tt´¥½½ªê8ÿÒUŸ ?ý_7&·½ Q€Ê"š‘RHê@(„xgë©Ã{Æ^zjÔ_U˜+¯×cNžÜûÈG~¨ÆôßÝ]ªZÓºnuÙÆM•§U{ê ¯¢Á‘'^þ£ÔÄaVcD¬á8?±†Ku-A„rL)8Vml;á캋7„N>:ŒšñÒ¥K·´­Ï\sn©\ÞXÖø¯+þ½oºkKôÅg‡ôŒ#ĺ™ÎÆ—q؃õi‰UB¦GA=‘+A@Ê èœºKÞUû( õO¬)ªÇ[1õè9ëö&”R 3‹«Æ`§à‹4Õ°ñV¢j6<8¢w÷ó+V`k_0ïÄÉ Q§x!P<ià»Ô©XáqŸ[^Ô!‡û5‹TY³â¦Ÿu¦4äs ,˜d[€ReMóåŸö]péèí7Ç£.^ZïùÕñç¾[˜+ƒt¢Sý¡¾ûÌËcÊÄëÑ—_¾ü?]?^äoÛTyêÒÀª»ŽþJ JèÌ$Â4‡už]…0ÞXyò{×\~âÒS)¥]]6Ž…K ¶”´7û—¬Ïž¾•¼¼MØ<*ÏzTyöpÆâæ SdÖ@qh‘¿íêöëÍ +­§xbͬ™«±•T&“<ÖÞØËÀÔ/jn–ESeB”<Ûc,èÚ”»ÐµiJuÄy¨®N5†eš*c,`,€šR"óRå=¿Ý711•Éd!`"ú=0¬ˆþB¯ò¿¦ DÕõŒä ÚÞTŽ@&2zôÁ{  (47^WhnªªRS kÊÓ@£àoYºþŽGcþòFˆ®ŽÓ&MÓúúúŒ*ÇëŽ?å”»k^´¨šã?„ ”Ë=àYÖå¡ÞìÁ…¹òú|ÍÍÍ=ÒÁx "Vs!¾ å(¡ê$éO}¸ÿ¿·ç«“Ãq„çEˆ,"-A(¡ % Õ{X«ÚJ—­åÇïmøØòšÕ¶þ`ä“âÒ‚Æ%r&ûÁWü`ݽ¨û¯ŠF"J~ÇÊ¡ Åuã FUª„5,"ŸÏwÃêïIœò´Ûxµ¢²"™·²dXŽ(¥,¬½SÿûGŽlß½ ˜óK%j6L©€'„x1@³Ó}P„%ÑS°ÙT/äaIï:­é¢ó›”¢¿Ð+‚7~ÿ ‹Ðä ]›^¶bõ/o;¯Â&—ìûÑ×·<ô€m ]ÁC’Àˆb0ÀÏA½€RèSWÕµ_÷-¾¤ÔÊ_q¡¶0ØqõEZ* ]2Tó3_ ­€´bƒÿš o¥Sýs[?4–€t§*Vc¾Œ3–?3}1&R­-d©<¢QQ ˆ/ÇbåÌ(u”œUuñYuBçäX¸ql—Ä•‰§à½[KyX³3E(¤*¹>EKØSÏJÊî8ñÊÒ‘ÖÃbɰ¹·ðþ{ûs/õ,ª!Þ2ÂJ4€Íµ} Åã{v~]ßz°Dwoüšë_(ÆJË¢À/o;¯˜É×Þ (¦hx4ký‘óù×ýìa¡¶É‘¿âBmq 0òÒS¿umñÖàÄûŸÇ5¶[)DùÆîÏvNdû¨FìdT¢P €°®®” Á/­üÏå¾uEr,ŠoAÃÕ;;þ륱§ ¯ ™"T¥”Â`®c¾»á}ŸYzëçE³dÞ’ aafñæYÝ…©ôx<>Ÿ¯xÇœVŠ)c/üÉÉHnéþ3¸x™Ïçóz½…t-AXUŽV¿ëÂІ“‹·‘—Ÿ.¼•ˆÅ›×ÝÖìosÎXBXtà^ca Y»{¹Tùýãþg}ù‰óm‘"ϱø…7~¨å“†W…Ä($ ,ÍZ¶näO½Óî·52_ )ìo³›ö«o ï=ý›Ã÷F`^ç—Zíùï{k}hûÌÌëü‰­/;÷ñ%ßZ{·ñMÂ*¿½þçõ¾EÇ:ói½æÃ-Wy2¡äÞ£·¿U¦ßúŠ£ÃÝqÏÞ¿­XCz°wúè¡yÖöÙ¯¿ån”.[\u\ñç';öéYç÷R™Xþ­õ·Wyj扇óÞ¼þ¶_óÛ“ÿË[¯¾¨ñCEž¼/¶ýH~Àw\?ëô¢žݽñg^èûöø‰7^œ×ùU§¿»¤mù±ð¤áÒÏg1VOõeÕV{ên9î  !@×­ø&k\tŒÊ•mŸ_Y¶¾È“øõ;´Ç¯[]uÚI ÅœyïÓíoÖã_i^ç7¾ïŠcäIå©çbA,þüÌ`Ûݤš[6übEpݼ|¸¤éòSªÎz››€Ç «¾ÊŠ9yÛÄ«›GŸ|-²Ùüo_lû@ª»¥>‡Qël·P}ÁTY N<4JB„9urÕÇV¼¾½O×8sRK)¥D¦T³ž‹gûàá«>¶ÊEu,ʦYJ”‚‡`Ø¢D&DUlýQ(ì¡gÒ‰ýÛ(€\0°pyz‡J!ða(ih.[w¢£WoF dFc㩉7fý³’³n›Ý¥¢c©TÊEš÷ÍÕ?ùiÇÍÛÆ_1VJ·í #2ÕeZé­þ`ã' W?ÕYæ¤@ØÃ]µEé²úOßÕñ}$Ìô Ã+›Ã„Ÿîþ6UÁ„ók¯¯ùÑâÊö9Õ\È ª<®«I„ET$ú€èÙ¾žC¥'®…W¶§9>‡ìS³£DW0æ)Õt^ª6ªy²ky«âõPGÕ £˜,Éèð&óŒ¥[JDOæ}JzˆR˜IewïÚeòN Yüp7QU 0¨X; èäç¨ÞqÜñgÚ&(…Ü V‹²`ÕÃÐß÷™õ_ý±©‡ÁÒ·0Z**ËÑýûÍ–¢„:thVº¾lÙòóêÿyÛø+,N†X×:ñ¹‹ßß´ßT(aõ‡bééî¶ {8RXlWAcõø¢pÙW‚¬^P ëžæ¼RР¦g)tPt]¬åø@Ž\’QSBö5é¥äÐŒ¬ˆ#ÎQ“ºš’|ƧJõü³—WÔ®[¿JVôýÉTþÁ)U|ã#‘*G1çG©*yî¯Óßþú?U6Õ pd9X˜†'ª<Ž8/pB€Jp TZQYiòN YÕ½ûIv»º˜Ð!ª‚£P@o#„¸yeÞ¤h-= –¾Å¼¤Y^9ò<°9Z‚hSÄÛ"¬¨ZóÑŸ´*”°úÃ)RµåüÔ{Cþ`Æ+c«njXˆµÎ7‰Õå°Î•Î"—ī ¡Æ9Õ\ÈÑÕ)^ ˜_:ÍÂb Xîñx$‘ûÈ–[WîgZˆ÷í€×wD÷Ì­TÚT7X,‡Y/MmŠÆïù™É,ÞI!+"Ñá0ñOèàskÖVzG‰×ãij+Æ«âµ@Üõ0XúÅK³ »'·›Æ¡%t1„±„.iºfSfYVH‘ª-'´žÚVºÔê•ù%Áúé`æc…N€•\rdj1j. c„PB„%MžP²£ª<îH€:óÔ¦¥KB¶‘?%ª¦Æñìowܳ—R¨ºáÎrÈM$ô,Ç;`¹ õ0¬¬ˆlÏ{€2dæ;î…‚ܰ¤4(Æ«âµ@Š×ÃpÑü(,&[¢?ÕmèÕÌš`˜œ z–"òÇËBuÅ)Hñª-7]fz¥D´ì¦„uªL³(…ª1b ƒfýr²cI-s©¹ÕãíŒJÕ¦±æ IDAT¨®L Ž/¥DQÒÃ…!Ÿ»jfí‰héìtœ D¼uÖ3;;G~vçc6Õ Gi û3UM",™¯ËÜQ³ñNlÂÙQûš1 $’åÑžÒQgze-)Æ«yi©‡á¢ùáXL¶Ä¡Ä^{WÉq28„€ jTßXqJuUµ£ÜHáëk¯ÚrrÕ» ¯ÀD¦Ù~Í ÉÕ§iªCÉô¨T©Q0^¹V—‹Ï­æ2w-ŒY€D„%^*çøÑ[K©®ë©ÂkW-¯x×iMù7”Wò7‹¾FŒ°š³Rõç}eZܶ\ø®ÎNJ©»´†ùóÕÔ)^Ö¤¦Fl¼ƒ±jõjAàïÞ©e3¶gù”e³·Gôq´M‚f Jë›æôª-ÊÊʥ˖)Š2›€ÆÆÆáááî£G{zzF†‡ õ0\4?X-5>5 …¶ï5œ ÀtÞÚ‹l^¹—ùbRXV­^]VVÖqäˆU§Öê°‡ó®-?ÞðJ¬æøö4òD£C*ç°ù–Þñ åØÂb%W:]~…ÿºO¿œŠ¤ Õ\ŒF7Zpî?›bý¬ŠðÌΠcž26—úô'ÖHbnHjÐayO ѳDËXî‡bSÚcÏ™ªŽÒãÑY›==…5—ƒÌž§dFælzVaÉ¡ÌìÇÙ4Š ”§³×ø€GàA°lã&¯ =Œh¸ëa¸h~°Š•-1dÙWŒRÈjVNÂJK+ƒë¡8"Å™¯jË U§l0`…Zûâö ©ž×3TO“ ºfÓ—ïzÿïO¬?£H5—…0BÂ"µL¤ Ñ9ÆÆnU•¾¿wÙÿþáõbcúÞ•—‹X€²@ŠSsá­¾`UY0! ùU‘]IpB!^צæ¼¹G¬’µÂðAøÀ%K{rw|šCˆJTe¡Ü+‚RBÔ$üñª¢ýèöç/¿´ÑøŠÑÜ<ð0”'d™³ªºž=³æïDðÖêD3|$‰Rjö Ù´•p£PH‘Ü~2¹ß…„¥ðt€‘DÊøŠáè•ÑÑ Z†cKØÃEƒ¥oQØRˆƒÎÔÁÝ“oìo=¼ïˆØˆ¸ø¬_ˆ¡Æáià‰f ßÀhC>ˆCJµ¢(6¯\úÃ|™¯jK“¯U,äI…aÄ#mŠPxJ¨§|!•q•x?زzÙ†¥Ç‰Xœ¯š ²,›Øùþþþ~;?19Itýà UÒaÑÛ€8p|ê²’ÀD+ó óê@ï‘}{Ö[ÕÕÖ¾çìŠ{Ø›ãp NðÔ"Äç>—h U7ª¶ïàÞñºbÖ%tu !óÞÙ³«P¢¤‡’±˜ÑÊU«ü>_8<Ößßgr5š*Bc–?¥ƒ€f‘ú@\‡ˆñ|yV^ÒÞ^äjIa©­­M§R{÷ì1( ÍÍ-†àG&“±êa,n›ÙLÝšy£Ü kKm;²å¹ÑÇF¼½´L5–¨)O8Ÿý‹µ:MA§™¾™g³§Y༈áVo[¡W.ýa,io?ÚÕµ{×.ƒ,ÒÐØ ͼ(Š`Ð :h©o=šéÌôh€)$VóHBF‹hq]‰P@PWl_¾ºuÉb£E­#[£›-øæ!N*×ÿëÆ÷œë°V}í /îˆPŒ˜Ô6îcTµ/Ýñ£³•B¬Œ÷Rȱr5†¹¿ëöoÍý£28%³ŸÜƒÐ›H`P¦‡a”¿„Ÿ½õÐÍoÆ¥o®ýÉÚÀ¦ùÊ, âÂW¬ªª… *¥Œ‘ o}ø€4”ΦÓië–ŽXðBº±¤h.6;ÂÍ ±ãŽ[›Ãd,:í®“~%üÜ_ÃϤº€ž¦”P,!,!Û„OOà¼È*g`p) Ñü.Ö͹ŽÇYÐy3@`f;-Ã%G|üÌÈû¬ôVzÝðñ,ܳYzº»ÇÃݺF¸ü'}‰T×@ç¥:¯fGG†Þ,‡;þ~ìþ‹6¼¯¦¦Øh~7|< ÷œs:WU!lÝgÏD¢Ô55 ó‚TÕÖ¾zõšV°‚’g¸[Z¢¯¼1<öæj0/–cÎ#ˆ†Þñ«=·|ãxhiJuë4ÜDáBÚÚZmƒJwÚ x™Ú\UÑÀnœR6ÜÜEþ€…ífáæñ¤pÉ’­X¹2«g¶ö¿ú×=›÷ª[4ApÐ&ð¶‰FÎz§»ŠY˜“àxœ•.Ç@R=r\eáãÍp"ÿCìW{¸×>}üõkBYéuÃdzöœ6ÜŠDç8¿ ·âàm`wë·å«®8ÉL Â"'”Z/4Kg÷äz݉N)Ñ”qÛ&Ú,ë6¨4Wœ—ÌŸEUܱà¶çÔkpÁ޳°Ý,ܼy+ç=©áŒóê/­›ã¨M`üy4q¤§·»H‘÷þàxÜ%]ŽMrÁÇ%T ëR ½ÓßÜó¹ÿÜûÅIˆ:¦—‰wßs~N„:ªZÅÀ ”<ó1"“I&“7´]pNËÜ߀”øÓ/†ÁéÇ +qÌû'”èJ¡uÓ«²ú¦yÉ >`»‹µ[·ôw›ÇÏ…wI#ÌÆÍÞjqe›Ó÷‹6A|,åÆŠY˜“àx¼Èt™l¾âŽWÇ W‚‘el»kòÛþñ‡úïÓ©^d¼Ëžóîûðçï¨iò¤ •›£‹ôôÔ¶­[!¿?¿í|ý©®~ùµ¡tš¹4N‰¢kÉT¶éwYÓîP%ù›‡:Jvt*æW•f«u«jÀªã7m’¼9* Tð ip4 A¶ãл.üæ8ÌqÜøTε[·ôw)îR6™Ûµ6Ü|á­Æ&{_Ž>‹ØÚD¦Z’ôKG.,ôÍÑ:«?°Ž›Ðy—t™(TÞ7±ÝÀÇs%˜ -N²ýš·5·é¦á°¯ÕþËWˆò›ž»^l>#}Q,™3ŠÜТ÷\ B€ª™0Çû¬Ðy¯¿¤”lNŸMÇ{lÖmPiÔÔf]W1pðu"ddP€˜<ø0H|‡M`·;¨½0FæPp.ì¸#¶œpóŽ·ò¦Kƒbø2ÎÛ,`ay ”Păž&T¡D¦á¡ðû°ýYÖY΀{ºl<9øµïˆ7V"ºÑ)¥Z’ª“³çåR•6YÂÏÂ=³ß–m€ŠR- Wc%›ó9+šçñ5W®½ñ]l„yë{cÏþhwo¢²²¼°ŠU ­[{šÛS¯/¥´?+;áŒõgžã®Y@tý¸ò“_{µ ðe¹Ë_}êªêås¦‘Å ˜«Ÿ8§ËF8ßÕ3Ýi öññ˜G¦Ã¬ÒZ²¤˜ÎÀÀm|#„0_b®Ç›HtB5ÈÍOJÔ¤¦©ÆÏÆ J'<4œrBý†µ•;÷Œ˜ß¡Q0âyqæ1©«‰Gžþë—k;¶*Ã1+ÔžRÝÔ,p„JW¯Ú0Q€ƒª#ð"àD ü0‚$é]¯¯:å pµ³bdÁÍ­ØñÝ?ûÞP_?ˆÅ…^A’€_„‚1Ò.yßG¬¸y ýTïÙ/=MŠ ÍÒ&È)„a`|ÇÅ-0:. Yî `wI—•@)¹çÐS j_é…øx$!ÓaÐâ„/Íý(cw†Ö’¥fzBnøxîÙm%DŸù­{0u-Ñ×}pÛÖ˜ ” Nxh£\õÑ•[_ßF(M^,çEÛ&ÐÓ—(„+Ïz-X ö‰ _ÞmíD¥™ZW/µR2æÆÇ»ï9ïˆw,_¸fÝÙg48ª°Êíwï~ì™î¹Ö\ùöy´‚¾¨)pÏíZ­B¥÷üÛGb»_‡<è €BBN«~ã ¬XoÔ^X²Ùlï¯oýͶT±¼*?þ´u?ú5ëV ½/Ó}Ëþ¢Ù1eà¨M`-6~ðêö/¹¤kÁÅ=]rä‹Û?žT6XD!>žCܵ˿®SM%jFOgõŒFT?_ŠâÊ i´Ù_<¢àmkIo¾ 9ŽŸ—*|âòU/¾2˜œž³5gwc¯(ÄqœÔ^]hÓéFç8F›Z¿O >øËU7Þ<Ï/«6g‘D!öÜ#…ŠåUù¦3˜+^ ?÷³ŽïÉzÖ²~ˆ›£×>5ôà²Àê3jÎk;ƒ{º4¢þàÀ×lÝåðIUgöi÷âÅßF1Á¾V*^qÙÊ·ÙhÕiçÍëüÈKO%;ö¿ånŒ¿úœ+þüòÏt©}tà×?9t“µ»_~ÞqKÏ\Rom¹»ëGSŠ<ùÒ¦¾%Fß=.ywÛ¢ÆÀÛiÑ·¨Í¥[(íüéT×ßB(!½÷Ü:Ÿ›û[ÚYµ¿é¹óþîŸSX  _Ö³7ï¹nf„c\îë¾ý¹‘ÇŠ:³&£R«V‚õE@dŠô”]Þz5ÌÅS±ñ™\:<ŒŽŽFÂa”ÿ†WS]³¨y̆óGÇŽpžxKˆ¬¤Gææ5=ƒù€ UB^1aWiŠf?Øø(§lä^ÙN€Í6ÅÔq3¡¡ÁA“Ú 2µúÔá‡ Š ®Š &S$E`DÖ†¾û•Eººää³­êŤÑ`Ex•ÌÞ®ìì›YíµšÎYQs«¢cê(ÁÐ|ùgXJ ©Tz}â´žñÄIÓF¥™AÍj…êÔÓ(p%ˆdif@Ã"²_`ˆ,<2ú»×޼|QÝe笿À°2/z‡­qy‰ß<úÄ_"Ïð‹èªŒhÄðÕó†öÁ¬IŨ¦M©–SD9©NùùRÃÑÏäBÐÉýC¡òö¥ö)‘Î_P³E_sN1AžÀœ(zë€èi%3Ê A„S1¡xöƒÒÔÜ¾ï ›S² S„ÅG1uJË*×®[g¥¶8ˆ9ήéºràw¿WÅ“)Q¡C­@áÑ»§zt^ò‰Mïšùà?gGFFv?òÿø=zb’%Ö3V&u«Ð|öy%í«ª#GFÈÐààiMg,ß:êÖ§ivHË8$`Ô¸ªneÙº•ÁõMþ–ïnù÷Øp û(Qó Ï"f]bY˜¢ÑûÂ?}ýù—¯9ÿºåekæEï0r2ŽEGÃå}O?õŒq &r„J{‘ññÈVô¡ ŒŒQÐíG¾óõ?g1<ùLn—Ùl¶¥¥%·Jà/£T§$k¨qJ¸üó!c72 `*&| ÐÌͨLöƒ¼PÀG •ù®üȪÛîÚ…°ÈaçO}ÜÌ~ˆãüº:T$ØtŠ\QnùÄu‘ŸÈ†GXŠ ^ ù] 5¦\ÑÞ-{wíðøè²ËþÅSS?G)íÞ2rÿÏ:·¾Ñ$‚oöCÍjZŸm%ÈÁåk¯øTå!™‘"‰(ŠâñxŒô~²îó?<øõšÊF.íYÓ°®­fé’ÒµÞº…®º7u[%¯çÏ÷? €h„“0À äp¥èÀàζþËŠò5Í‘•×ç&UUUƒÓÓÓ@ÀÑ+I»’‡Þù»]™WÕtÖ\hÏýCB<ãcªAûð4™þÜá`|÷“Ã^Üøá™åì`pddD×uŒ± Ÿi¦Ç[:¹ŸN§::: P¨¬²ªÊø6k‘ÆÐSÁПáýD›¦4ˆÖµ¤±i°Û*rEùÄøx]}ÏóVöƒÁG©«¯èïOg2§¾¾þÂs[Ÿx¶»§/QLµðQ(! ‡Cš<1=•ìë뫯¯7Çš…Îü~<¾¥_üöο*C F° &Aµ0EôüAó]IT¥÷¡{cÝ\{Bºm ­jÌN„…’`EMME(¤gRÓÃý±¯u¿ü¨¼ûÕlxÄøÙ¨³‡Ö†XC¡iÓJõÙ—@ÐÆ´1B&ÆÇW×oüíi/ {¢kW®µíˆ”Ídñ⯻æw#w@ú¡:‡0¨ ‚Äyº )²p$q`×À®gá+ëÖ¬®oñ¶¥d%–¬ äw«Ô©žÒ’{Ã;öNî~£û¹=ñm1y<Õ¯Hõ<‰¢P­ÔrÇRHû€_wß±±â”zo¥T–e“ááØl˜ƒ Ó’Eóƈ> ‰’”Édz{{“ÓÓ‹/¶Áù³™$X6æÅJu9Õ‡ào ·eûÅGù×O­ÿò)b‰ÜÂG¡ÄÐqÀ\‰(•[úÔÇ­÷©8ù,þ¤ó¤¿>gSL°1E8A–ä0Ózî‘L ‰ïycrç:…BBGLaÉ ÓTð³.±›XƒÍ ´,¯=ï},"‹R¸˜ÁSùð²OMáØSCŠœ¬AºKAž&ÞªUŸKoNdG(÷TÑÓú‘Äþ#‰ýÚ‘G4qœ—*xçר–Õ3T£™^U¨ä…ˆñ|†‡óó‹Iûïîüáý§ááÂg²n¾x¨«›Y,ñû{zz$IjllìëëËf³ãé©(B¼¹ž¦L-%zêæu5¡fF%_“K§7) ‚(†ÇÆ:ŽY½f9©7ø( …vîØ1›\¿¦ê´“^}cؽÃòQ Q ,]¶Ì¸Uee%+@˪)ýç+†{`hFØÇÑ6 À¸ à 4‰€*y« P@Y ‚¥“”s`.µxS¡‚¹]y±†JY%$ÌK8ÉÛzùµ¢ÏÇ"R“^ÈóT›à_Ú¯Ïhé?ïœLOx¤Åˆ<¨yZ„Yk&" b%'‡u¢PÀˆdˆA.!”LûÞ8‰2@žá| Nu)Ú4)œ§š]h{&·­?¸á¸MŠ¢ vuvÓBÇþc.™Xw^–•AžŒh…óWT·PJŒe$J©®Æy±ó>„E^ª¤”ê*s»öƒË>ü×\¹V0ûé^ÀG™­ãÀR°8ó”Å€N¾ån¾4hàÛ˜"ƨz‘"C“„:Ï„ŒÇ³1zq¿ÄQ¬Á¸Dâðª/Þ´á¬ó\ˆP¹fóT Ï-ûÚJ8^¨ä8?Æk8¢ƒ– –ôÚE€A.q9ß…ááXæ¤}Üßû3Nଠ—þS¸s7¦ºœe'ü†ÆÆúúz]ׯ@@)¥–'ºñ".=žµs¾Ë>üu5þ÷_ÜÎ|ºçø(5–‡Ÿ]ÇÁQÀ 9³)+++mj]{˯8Ÿ¿à+²E<*x(ç@¥ Ã¬m¸gL¢¹/a‰5xlúׯ®¾äÊ¢)–Z”æ&€ž %TÕ噯G€0ÙopFd³Aܰ •œPŽ©š'—¸œÏfx8Oö|R¹Ûlp0ÕûüÈc`ax¸ë8€ASJ#á°ñéD–åþ¾>Çã÷û “ÉT†l&Ÿáø„yãÇ‹± kS”еiJu”S@°+&”cûÛÎù•ÑhÔØ@Áº?!ä½¶K Ô¿Nˆ4÷£2ø(¼TI¨FˆBˆb̳9¡DW“ƾy+—s3›l6‘HÌÔàêë~pòøbZ®¥t€pž)b¬ÕOn•˜¥剣Ðs¿ •BD1?4g]y±†²‚ׄB¡þc×.ºìÓŽDŠEÍͲ¢d2™L&CqO¯-ÀüÌa¼#³_KJ(hIB5Àù™«2¦™ˆ5<Ñ€(4Ÿ] JNÓF.a|«SÄØ’`–Íi¬…® žpûé¿»û¢?ž¼ât±š«9„_Š„rœû‰NªÑ½±íš¦™t—þãxn?88ØÛÛk¬Ïø|þ¥K—N+œŸãyÁ3³…à©Q³a%Ýo¬Xðby^#ÄA1ÁÊ~(Ü9ŸÅG‘eùhçÁ3OÂxÔÎqä£ Îcê8$&c½=eÆ­(¥¬ÍÇ€•Æ\}üºÞÿä—ÿ%’Hr2d #JŽ«áç V˜y€EUSsU‚!7éq¹¤P¬!—“Ë?_}ê¶­[]ˆFa1B‚VJ!Oå©á…:,h™n ‚ŒNîÂY`‘KXç‹áaÒ8@’Sñ»¯¨¾& ”„²o®ýÉ®É7~ÕukµŽ0µ¸JÖì?çŽV†‡ ŸÉ‘ “[…”eY×ucd[N6àü·Þ¹ÇA1¨!Þ:ge)&€ëÎù,> ¥ð¹¯lîìŽÍ¨DõE¾_Ýv¡õV¬™@ÂèØžo|:vd!'#§¤à4Q) öé©Ë%ö”(-¿áû5çüóx'E dõÌU[.1¶Y%  X€Â…çÜA.a]U¨€‹ümŸ]öÕA;ˆP#ê‹cO=Ô$;š HÕß]{W—9òTÜùLög¼±@é\íÊ~`lÄ,.bÓ¬¦Eþõªu_üÚËó@\!Žã$[äEvô™ó«j7ýì¡î_ü×ð#÷S2kŠâ Ç].±ocËÊoÜX¾Ä;q×ò6Ë«‘çÍ]…­BØEå¶rI‘W‰XúpËU—.ú‡Âä±p^ý¥g×]ôÒØÓöߟÑR7­»µÖ_?ßþóŽÆN²Êê•gžÖôöÛÅ‚Ø~íïüSIûªcm aÜøOžð«gŒî~LË_ÃÏ»Ôrˆo-Yú6¤weÙú÷7_áØÝ­ÎœSwÉ'þñ'›î«à“<ü=”O_±æõm#²¢¿ý¦K—­9þ…_x|à»R}Ç„"TqòYm×|Õßòvô³˜2ý,ÝïIDATq ¾“ù’á|_]}Ëúò÷ƶ?9ô‡[%ÇÈ“ 9Rä™â*¥š·ÊîßG¯®ò}ðÒ¥¿ùãΈu„¹ÚóÞ[{î¥ã[^yüɯ¼%L(,JÕg]ÔøÞO”.[ó¶ÅòjäV'®ªo\wk³¿ Ö…6­ mš”Ç_?óJøùÞcÀ,¾Ç¿Å­Y¤Öß?ÊÌ$i*}ù™ñ×7OÜ¥NÅç{9çñ…Ž?­ê´s+O=×úÁëí)7ïýžɭ…Ç[K–~cí+¤*Vï¼iÏuCé¾â ùùÒÖ’öɽ¬=PàÓ7¿ýZT¹ÏBú³ŽÅ]VÄ*1§ì0& MÌ©ÆQx+®F1j…,‡œWqñh¦ë@z¨/;:˜PâÙt*•ÉPEñqHôx±Ç+–UðÕõzY•¯¹½vÝÆÐÒÕ¦•KzÝ«ŠÔÃ( $¡Ç~rèÆƒñÝ`ѹ í½W¯¸^´` é;ßÚûÅ]á×­½q`~YXÚÔ&.ÇšËÊ›šƒ‹+¤j¸¿ûçôþÚQ¡~zÜo«øZ[Û¹¤Ý…TäHBrì <°‘þ¬ãPœ¬ˆU.bNÙ‰ÂKX&\Àþ¬[±¸05ƒåààUž,kVUÎvØL#`ÜL-™šš3½¬ªùêa8òíõ?xà{ðÒCY¿ÇwÙâ«ÚR+S‰´ÊõxGúNP ©“Dëæ:¦Ä`QtxNò^¯Ê„‹pù>„>øÔ+%è„M¡Ä`„l#[›ý‹­¸KX¤"VNX¶ë8'+b•‹p—p¼„eÂìϺ0¸05—ÀYU H/«j¾zPÈqû`󕑪mâ_>sÚõUžZ›uGúN)¾„“ìKñ‹aŸ’V®YY˜“Ñ‘+Ö~æ—‰Àl…ƒ²tM»Ü3kÌãB.a‘ŠX9auÌrpר¯¬ˆ‹ìë’bþ0ìl‹bÖ°‹Qãpñʱjéu©bɸ¤×1MÓÊPÅuÇ­ÊS[ظŽâ%¥ìÝm×ñ'9æÄäôÅg^sÌV(AâƒXãì{r±ÒlIVNX³„\,+½(¼ÄÝ„Y Õ8XÖ FHgGg4)œ¬©Æáâ«jaéeU¹÷(l¸˜p/1ÆåD&Ù!-;¤kqb ›ý\i›°’•ÃÊ5K¿R婵)”ÌœÀ(VÊ !©RX;6™¹õÚ¼ë8X`ø¨²²Òà^@^.¢±±±Ð|<ß¶uëÞ={TE]ºl™¥/:\âbÂZl`–uƒ Qèííííí-Æ1£X¹.^±ª^—*—â…-w ¥À®;wlßD–-_Ž9®Þ· ˆ+Aœ#ä°&‡u8§öbñŽ91­”ð¥×¯üIäJrsJ6ÞÖFyayåöƒatf1?’ISÈu<·üT﨨p‘‹0¬p~Úår‰ Ò Àþ.·rg„8:fš°q/ܽr¬Z@zÝ3ïX\¢p ÄÅ„#¿¤Á·H(ÇæGzNBò˜æ¯ò^ÔøážÉ^VNL+.ý'ñÂç„?@P YsÁ¹õÿÜèkÞzô ÇU»Â´ÏÉz±½îX€êšŸßŸˆÇÆMMMûöî5Þ‰¬ãÅÈŠV''' ¡µuµlE±mÉ’];wN%Á²2Ö%5µ5îH(û»[7‹É1{¼£càĽpá¸TÍ7½îUÌïYŒ(q1aðKZZ[Ë[Z[wîØ9¯­«-ÓjNSÛXr9³üÝ•Þê^ÔÇj)«•kϺA~V>yåég´Ã±‘hŽÞºxåx—Î0ÃüpÔ½p<¾PY0“b¾CY—̉ô‡°‘Ö!…ŽÙD,æôÊÝáy¥wΪâÓË ÄÅ„ ¿¤Ùßf,䃱æ/iþÈœ-eµrvõEë›6¸tw–·Å°^¬Å¥3ðÀrpÑÃ(FVÄ”‹`ÉNm–„£‰™9këV”Òh$R^QÁó¼ââ˜UÄœ `Œ]¼bU- ½¬*G¹= —@X&XŠ#”Ò/ÔßL—’°24šîè<âk+i*ovo©yÂó<Ë[–W¬[¹ô«\wrpÑØ—¬ÈÂd'ÜM°G ‹ââ‹{áâ«jéeU9ʸèa¸âbÝ‘_bk4MC•ÑÚwU·-YÒf¤Ñ%'ó ¤¡¡å-Ë+—[Í2`ñÜy ÅÃða¡²ó2áR\! pÌÅ+Ǫ¤w¾ŒDán‘_2g sò–KªÃzù’ìå%?ÅÿG þQþ¿*ÿe{«MΔ¢IEND®B`‚nco-4.5.4/doc/logo_nco_stk.png000066400000000000000000004044501264355130400162500ustar00rootroot00000000000000‰PNG  IHDRÏÁòÁ sBITÛáOà pHYsÄÄ•+ IDATxœì½i¬eWv¶ÖÎpçûæWó«‘U¬bqj²›dKìÁ²duÐ’ b)±P<@q€N KJ~Å1 [lQ )Bl¡#K‰†Ù¤º9W‘,Ö<׫zó}w>ãV~œ{ïê»Y]¬"ï‡Â«ûÎ;gŸ½÷9÷ìï¬õ­µˆ`ˆ!†bˆ!†âS{Ôbˆ!†bˆ!¶9†lcˆ!†bˆG¿þ8 ÿmþ÷¯fõ¥y ²!†bˆ!†âÓ…xÔbˆ!2,D¼ûOD@D@– ûJÙ81qBIjRe”mÀR€#™ãpÏe9Ÿ Î8cÙëbïTˆ›Oú1bˆ!¾h²!†øÜcK­·±¤µ5†´!c èVG×[ªÙÖͶiut»kº‰“$”¦d,‘µd 2Ò³è2†œ໘ó¸ï³rQTJ¢\â•’)‹jEä<áH&8œ1ƶèÞv 1ÄC¶1ÄŸ?¬£ÖomHkJ¥© "Ól©fG·;¦Ý5ÍŽnµU««;]ÛL70ÝÐD‘MR«“(ÖhAfö ì®×ažÇ y^Ìñb ¢\äå’(D¹$ÊE^-‰rQäsÜu˜#™ã 듌õ¬hÈ<†â …!ÛbˆÏ î¶ad[ˆÀZ²:jwM«£-µTS·çãÙ…d~)]XN»¡MS†È2` s`]ëë©~Z¢0¦ 6µ†! –ÀZ"¨–Ùø¨Ü=åîÙåîžr'ÇѲ¬”Eµ,\‡sŽŒ!á]ÌcH;†â‹€!ÛbˆÏ1ˆ@ªZC¯ÖÕÅxv!™[HVêªÙ1Ib•&­Ikâ = z^’ì§1Ðs›¬ã1Œ"€µÙæõ @@ÊöaÀ¤ÀŒ$ ,,«ZÝ|t9ô\V.òé g×”»w§7=áLŒ:cU‘Ï Ïr‹!†ø"bÈ6†âókAi»ÚPµ†ª5Ôüb2¿œ..«Õ¦j´t³£ƒÈ¦©ÍvÎè!‚èHtú>G2ÁQ9GÎaÏàÖÂÀ€a,i ÆX¥A)J•M”MRJSÒ†€À)Ql²ÕlyUݺ“œ»MŽŠ© g×”;5áLŒ8cUYÈs×é);†FŽ!†ø"`È6†ø|ã¬UŸÙïîŽY al:iµÕå›áõÙøædq9]^MWÆR¶3 ‚àˆ sÆ2FR`>ÇJy^*ŠBAó¼˜ç¾Ç<=‡¹9CÆz …¬cÉ›jJŠbÆ6Œl»«ÛÝîšvסUš¬%mÀK„D`45šfµ® ÅyŸUJ|Ç„³{‡»g§wdÆß9åŽUßcR2†ûY»C 1ÄÁm 1ÄçÚP™Óç»ç¯WnF‹+jµ¡šc Y ŒG°,RRÂ舜žp¦ÆåĨ36*+%QðyÎçžÇ|ùs&%:{€š~”¬1d ¤Ê¦©M”bF6Œl™VGÕêj©¦–Ó;‹I£eâÄ2†œ£ÈŒzS·:æÆ¸˜ïî˜p÷íöíóž:^Ø9éæ¼áShˆ!¶?†ßó!¶ ŒÕšRmSC©&50ÿS?¬#rœ#ç(9s$º%â9î­µc“”Tj®ÍÆ7nG7ïÄ7nÇs‹éòªŠb›(«t?y†Dò<6>"'FåĨ«ÊѪ)‹JYTŠ¢X®‹Ž`B0ÎQpèyOô- ¸A*šm¬K=—Š5d,iZ“6¤µÛ t³c-UoêZ]Õêj±–.­¨Õ†Ji †h,iCqLÝ–ëêæøêÍøÀ^ïà^ÿÀ^¿R’ëÇ>´p 1Ä6ÃögŸÞ²ñè¤ ‹ÑyöϬ¶êY2šmÕ熔%£lªlÜûG11¤UÛ‚¡`ÈJÁ\‰žËs]†B0É™èt%sóp†üã;ói¬… 4ŽZ^IOŸíž½\¾¡S«TƤD×ayŸ l|DìÛåÍìööìð¦Æ¼Ï]‡Iɤ@!6ô|« `[ö8g8xf úIÆ’Ò¤”MµÚje5½~'¾v+¾5׺Õ5adSEÖ’"H;¦˜¥•ôÚÍèâ5÷Ø!¿Þ*ØëVDÎãR2ølß–C 1Ä}`û³!¶¬²Q#o&sMµØRKmµèzlÂŒs€% ýœ™w59 úi«2eAT r´$ÇËÎtÕ™®º»r¢â€ÿÐÇ·ZÓÕÙàïµ_«Uo›02©ê-ÄŒõtJS¹Èîñž9Qxâ±üÞ]^!/ɤ@.ea$Ÿf'3ˆàè¹ *E±{Ú=~¤˜*Ûîè‹×ƒSg;§ÏuoÝVÚ½à[¥¡Ýµ—®G×ï$o}Ð}êhîg^9¸7?R–SbˆmÜ®ç7Ž‹ºº^OfçË¡n*Šì'n€‰¹Š35éœôq&Xïaþ鿃mºX© ;je1ºROI`î6ƒoä }Q©È©éÜcE9î0éKä¦Ù /÷¤´ÔR3™o¥‹mU t3µAbÃÔ„Šbm#K±!…`¡wYi ;\;EïçÀ_€@Àqtó$zË9ÜwXÞż¨–©Šœ®È©‚3ÊÑaýºB›úùàÌKÙ¯`-u}åfôÁ¹î…ká­;ÉâJšj°vÃ-0R滦#rûw{»¦¼‰Q9R‘yŸqÁörНïÛ¦ûçAu{SkDDD–€´¦VG¯6Ò¥ZzëNréFxñz´\Sq²!ªÖ‘8R»w¸ÇäOÍ?s¼èHÆùfçÎÐα]qá_ÀsººŸ5üË[ðK{u'¶?ÛДƺ3~x'øp>ü(Õ5MÜ“mlý8dU’‚å r׎Üñ½…g¦üC9QY;ø!ÚØcÓYMfogæ‚êÉØ4Ì ä½[d =Q-É]û ÏìÌ?>áÌÁKéÃÁ骀¬ÕŠÒÄtÝôjW×é|#™o¥ ]]KLÁbR0$B ,K®o I«Ö²W õØ!Øþ‡þvèù¢Tr¦*rGÅ™®8SyQÍñj^”–ÌAd½ôëpS·i¬¥ 4µ†º|3<}¶{êLgaemmFÆÀuX¥$¦ÆäÞ]Þ¡ïñC¹“^¹(Ö¢;6âî„Zý_zÙÁÖ2p¬Í\ïàuíôùЀĬî–gÐ2m¨VO¯ÜŒÎ^ ®ÎÆs I¦;QzC§öírŽÉ¿ôLyf·79îrüîrŽm‚Sÿ^ø ½ßü—á­?„'ò²SC²e5!¦À+ÊU¾v²úW bT2÷¡â.$a/U¥±¤vÒÚrrýVpz><ßHæ,hà€‚‘DËÁp°Œ,n¼j}›®³dlÁ6ÖíÐ;†³c- ³– %B@—寽™¹c{r'FÜÝ99"Ñe(9òõýàG™Ã»¿zÆPœÚ³Ñ©³?~­~ãvFÄôßòA ð<69æœ<šÿÚ—+‡gr£U¹eãˆ÷üjg$ÃXCÚµ`Èf©5²í°^ÀÑÃLL ã 2Žœ­Ueûû 5ݸ¾ýAûµ·Ú·“VÛ(ÕÛÉçâĨøÙ¯¾ôlùàÞœ¸‰E ÙÆö„…×þ!|í×$óì–ù6¼ó{pÀ}âbû³¹àü™ÆŸÜ ÞaúÂ>vÛE%ú÷óæ•x ?ÄÚ²Ô3ÂbuªÔa<Â=OŽ|ë`éùiÿ±ÞÞå9hɫη¾w¥óú­öë#Ø,b(@#ƒ{,®YÇ{¶€l˜)Ɉü.ŒM¾t¬ü½…§ bä¡â.¶a­5±é´Õòj2»]^InvÕrj:ÚDGÍÁr ìU3£Ág½B©½‰²Y8 rÁ<ÉrÏ—äÔ¨»gÚ?<âî*Éq‡å“ËPm¡Y®¥\è¾w¦óÁ… ÙÒqJ™ë„st$VJbf·{üHîØÁüžÞHEæs\Š­O´i¥·–REIjSEJÙ(1íŽn¶M³­Û]„&ˆl›lc@k° 3à¤@×a¾ÇrËçy)Ï+%Q.ÉJ‘{÷\æt]îÈ Ì`K¶AQlš½\S]ì~t9¸p5l4M”d9Ð! Ž;&åу¹Ÿ-=˜ß9é:ÎZ»C¶±maàþ.|ë7ï¿¿oÿØ9”#~&±/ YÒ‘é¬&shë%lbS e½uåžlƒÖÞS‘z¯zØÛˆDˆœÈXØü\øa^VÇÜŽ’!{8Á{–Lj£ŽZÔŠÝys0ÐO•°ÆÖyV6m` k[‘®5ÕÒN›<´‡ø¦(±a¨›]µZKnÖâ[õäV3½êš±] ¢ehYfDè g:ÀÆ :þà:hÇZúÛ£^ïƒBÛ§Ç^ƒF™n¢;m°­t©‘ÜYMn8»FÜ]#îȋŠÃ|†bÓï5«ë'Aij¶õÕ›á¹ËÁ©³Ý«·âÅ•”³Lu¾ÇG+|zÒ92ãšÉÚçíšöŠùòÍ%"c(NlœØ06ÝÀ4;ºÑÒÍ–nw{Õ_»éF&ŒlœØ$µ½4熌kÁöãPÁQ tÌJ²å<–ÏñBŽr¼Täå¢(ÅHEVK¢Xà¾Ç}—yã[É=!çóœÏ'Çœr‘OM:{wº®F·ç“•ºJRÊ{ÌÎ¥AhÚ®5ôGò3»½|NdÔŠˆ†„c{‚ÃÏþsøÝü§¿{Ÿ Ìý6|½?ø ã?|ç!2¶3ÛMijã”RƒD ˆz¶âõê¹–€«Tï͸¿>1ÊcXf¶m¯Æ—3…g b„¡÷p•ùZŠrLI´DÀ /Z üálƒ 0R²Qb"KæÓ~ˆß%°¬¶q=_‰¯/F—ï„gÉ­Ä4í™ôö—œ©œ(qlÐÈÝtý<‘ÖPoªóWƒ¼×zëÃÎ…Ô!8.îšrŽì÷OÍ=w²4=áJñq!ÖöDZS™Z=­5ôʪZª¥ +ÉâJº¸’ÖêºÝ1Æd¤ý°Î-²nzußúýî)@mOæQ.òÑŠ˜“;&Ü“ÎÔ¸3>"ÇGäø¨ã»Üq˜àˆ¸Å­ÅÎìöwN¹OÏ¿yª“Å÷.Öt7ÐDd,,¯êÅZgµ®WÊRyϯZœãz“Évl7Høë¿üí?¼Ï.ÿsøé*üù¯@yxk|ưÍÙÆúUêÞ{ƒx—oSn5™½ÚyãPñ…гãÁá‡wÀnáù¹ßÖP;ŸŠ’Vº°]ºœ_I®¶ÒÛ`CbŸ‘Ĕ㠮d‹ëf-0´€Ôû¼Û€ l#Ã:™?úŽ™á&A†€È90ÕJÝœ.Ž:»vä›òLzž°µœân\½¾w¦óú;­[sI½¥€3°¤„é çð~ÿ¹…#ò»wx…ü‡t0IM³­æ—Òùåt~)½³Ï/¥+uÝíšD‘1d,ŽÃ2Ô7Ýõ¾)vpO­§\™Q¯ÿcÈq`G¥`¥®ëMsåFâH,䨸˜Ü9éìžövN9;'Ý]Ón© ¹uÏ…ÀrÁyéÙÊÌ.ÿØAÿ½ºç®„·æR†=ËÊÕÙ¸Õ5˵ô¥/•Ÿ8õkðóeøÃ_†Üp|–°í¿¸ýw þó3ûi"ëEàÅä®Û7“íÞ{o6¡ƒJ€U :yj¦jn687æÌø¼ìò[xõÀVßû›à<ÐŽ ñã`Û³»<ö}¿~@¹Uª®Ú2 ”[ÝßÊAM°Õ2´9``]LËØ®ÛÅ娰’»Y”cÛxÀžs@ïR>"/]»²@€)c!Îú¿þàj÷ÙŒM‰O6“ù…èÊl÷ôR|¹¥n;HP>3 ì`!(02Jaˆià˜%nzV Fb°a,»Å³ëy ”¦ØÓ¢®eï¸ëˆ -é@×CÓj¤óËñµ]¹ÇwæßéˉJ?ÒgÍøŸ¹ V›úêÍð•7›\fçc€²ð“‰y`¯÷â—J'Žìö¤äŒmÍ3Œ¥4¥N`–W“[w¢óW£[óÉârºÚT®MRÛwŽ "rœÀ91Fœ“ëØ¼gGªP*@>G’[×%ÏC×Á1PšÒ”¢„ŒaÖ¢6„¬Ý…F:!‹¦5X‹FƒÒh,Zk¡Ó¥vGÝYHox¬XˆÇFÄîiwÿ÷ÄáÂÎ)7· ¾™"äs<çû#9=îŒÈ7ßo_¼5[Æj +*N»–¶†N+îßãå<~¯ˆß!¶° ¿òÇÐþ*ü³‹÷ÙÂwþüí2üë¿úXä>'øâ^ˆœåëTöÃs€ƒåd9“D¢‚í„j ]šÏåØ˜·÷atýÞ°Àpòp`Ý2i%è&’GØ=Mj!¼t£{êZûÝÐ,ƒm!`š>ÏØ°~hàŠd "3f HƧÙǵp•ág@;Ø=\NˆÄ 6Ä][Н-ú—U¾>åÜ4(c!õ»¶_{»ùÁ… Ý1¶oʧ'œ—ž)½ü•ʾ]^©(\ùq*$17nÇo}йr=œO–ë*KžÝÎR0"0´k¡‡±Ú1eÆGôhE‹Æu´çÚÉ1žÏ!Gjw”P)óR»B½¡ƒÐ¤È‚#y1/´Æv×.ÖŒÖ,Nx½Éš¹Tã·î°ZGa&)Îf[·:fn1=w%x÷LpdŸwâ±üÓÇ cî–N¡|NØ—›žô&Ç7O·^}³ÕîZk@ è†öÒ¸ÕÖ« ¥TùØ¡¢ï ÙÆvƒú ´ž‡ÿýö}¶ðü5¨üüÆ7a˜žö³€/,ÛÀ×¶¶½Ðóëà-[òY\‚®Š!€ƒ*OÝ®´Ó›KÑî¹Ã9^•̃OS9O™£¶¬jÑOZuWâ©~\Æ£y@ØVº´_¾Ú~{9¾ê;œºb‰šA?_ ¦ˆk„&Þ7cà]—i íè‘¿¾à“Œ{ýÛ¬]/°í ¨¿ßšÉk­fj¶?YÒ‘n×èfhZ.ÏØIÿë;¶ReWÒSuÞ8ÕþèRØjc,AµÄgv»/¹|âHaf·_Èq~èV"¨7ÕõÙðâµèÊÍèúl¼ÚTÀ&©µ2îBˆà:41FSãf¬¢«3Z¥© ,l>gÇF±N•Ù=…ù³–ê-"ß³å"º.#‚0ÔBP¥$¢Ä’µŽÔÚP.GÕ 0$Òš‡Õ[x{Þ¶»¼Ý+«|~™¯¬²(î;ð€¢˜”¶QDÍ–º5Ÿ\º;œü`~|Äñ<ÖTæ×aŽ`'Žr+æù»gº×f“T$‰]¬©wÏtSM–`ÿ´âÀ0JeûBLÃo¾íçàß×î³…ÿõg ò}ø•çуoˆuøÂ² kïR@^‡ò]Ê— #Q“è õUu§–ÜXŠ®OûGs‚‚¶Ð¬ ª÷oÝrüð‰ÆÀøoHuÔÊlpæjç­…ðœ2Ë$.¤ ë“9èQ:f2{ ÒÒÚkÉn°nø4`*ƒß?ÎXµÁÿr¯,¢¯“Önô­Ü¥¢$$°‘éD¦s£{Úáù ï `¯"íÜRúÑ…îwиr3®ÕuÖ„P-‹c‡üçO_þrebÔ‘÷0iCQbWÒË×ÃÓç:ç¯Ds‹i[kŽ à‡J*L¥dì³öšéq•óM.gÇ«Âu‘3Ò†-êT-C>‡Æ€±Li¤ÎÉZ GÂøou!NÈZCd9‡b…D)@pœ¥ öíRQÌ:]>·(fçåÜ"_©³F‹u–¦Y sèhÓ ÌÂrzóN<;ŸÔVÕу¹=;¼Ñª“…Æ &LŽ9yŸUJBÆXçÚlœ¦DqB7î$Ij]­çËùœ3 8¶+œø?_‡îóð'û:^ï}ªoÃß?>$_\¶q Àr5ªz˜0ÙúíBZ†öª]h¥×ï„ÊÎTAŽ<*Âg”ÚðjûÍKíïÏïû¨s˜ø¸…CÇKÉ ÁÓ$ì1=éÝ’ ꓆u6­O|¢{ÐŽ] ¥èJINЈk! íÛï·^y£ùþ¹@iÊdDà»ìK'r?óòèK_ª²µù†±™_ŠÿOjï|й5¯úr pšš0Ï=©žx,OÆÇ°”gDÐ mªÈqHJ8¨Ø:Žl-(EÀ" ëoL$©Õ9³ÆÒÔ˜Ìù¼TΔiµ _~J Ê«³òí÷w>Ë5¦ôÚÔ) Ë«z¥ÞyïL÷ËO¾öåÊ7_•’ÝÍ yqô`!ç³±ªø?XYYU©ˆº½ þô/ZÖb!ÇìÍqwøuÛÎðÂÿý*üåàÍûKlÂ/¿ åwà¿Øÿ€;6Ä'ÂmüPô^Y³&&·aÊUÞ’¨² èŒiº™¿œ›ðfr¼\”c_Ø×¬ ù$À.EWotß»Ò~£•Þ̱$©ªo{èåëÔÄRrRpH ü.íç†æ{ ¤¬Z bhX¶¦ë„ÿ«ï õúÐu 9z„c-t–zŸ¡ºU\ì viÍ·²î}ßNj£Ä§öö|üý÷Zoœj_ºY‚ŒUÀÁ½îÓÇó_¡z`7ÕÈn"k!MíùkÁé³Ýw>èÜYJš-Ýs;Cð};Z1;§ÒC3ê©Çq|”ržQÆJÁk{5V2›6Ôê(ÆØHY‘ùÝ6ç ÇÌuDý”}^ãH¬”xÎãJÓüRl´p$ŽVD¹ÈÓ”ÚæaNf{¦’—žM¯ÍŠ.òóWx7dJ­ÅÜÆ)}p.¬7Ìù«ÑO>W>4“«”ä¦/ "LŒº_:Yv$ûó´>¸ĉmh¥®Ní2 a×oSÌÎöÛ·]Q|þè»ðòËpæ×Ó€Uø›/Cùmøùéܱ!~tl{¶[9>y+½–À‹ÀoQÉ!åB€]d¡²+µäêJ|µ,'ò¢Â€#~áÄIë¨)›6’¹ë÷.w^k&7жóL9r AÚ4K¨@¤$pÛ×7àzÊÐo,b@–aÆ6,`` ³–>DØŠm Ò·öìY̲~ŽLd@¶qωs!A°d´ÑIboÌF§>êüùš·æ’VG ÎÑsqzÂùÊÓÅ—ž-=~¤÷·Hh-%©]ª©·ãw>l¿>¸x5Ì’ò9š·ãj|$Ý¿Gš±`‚c’R£D¦ÖX !²:õ¤ E±-äXÞgœá:!YK$9ëåÑ2ÆK”…´  ç¢ï"bïD’I œÙ(AàÊE;1j÷ì‚=;MµÌŠ\m¸K5¾\c©Â,]éJ]w3¿’F±]©«'+ŒT¤ï±õÁ&9Ÿïšr 9–*¤s—à ²Zƒ6tóNB–FJÂÚ˶4 ±mPý*üÙ€~®Ýßñ·á¯~¾û}øÆèƒí×?*¶=Ûøñ™F½—H ¬n+¨2ë "1€<&¡iÃWâËegç„·_2šl£¿’~V°¹–)™@×/¶þâjç¥ø££K=H`iÁ*!ø 8øz¡Éæ:*€YH*CËÁHÐ §A.ªÌ2Ñϲ!KìÚϵëô ™äs=+ZGƒ(˜²÷šñõÛ7p“4¥•ºú‹wº¯¾Ù¼p5b gD LŽËo¼Xú‰ç**n5Ÿ@‰²KµôÍÓí?~½~ùzÜ ¬èKG#GÒh…öì´/>›Ø9"•¥·,c(3eŒ)™ë2Æ2ò‘@kAòçè IDATд@P ‡,fÄX›*²‰ˆÌZКmµ!)XKIBjk dI;Œ%mÀZÚ1i=OÏì1«õ‡½wß+ T…ÀTÁâŠúΟ®^¾†‘=y¬°{Êu=†ëì®Ã&Çܯ¿P©Vx«£oÍ¥m9Ãv×\¾;²Å%«ˆjE:’ ­Û¾÷{ðÜ ÷wüEø™Ÿïž+=Ø~ ñ#ÿê¯þê£îçCª‘.Ì…„]ð¡^ ÿÒŒ*t(P~•èF¤ èK†z/ÇÌ  -úãÞ>É\Á>•Ô2†Tj£ÅèJ'½EvÑÃT¢ÉF A”KÉ1›ï^v²ØÁT¢4ÀCr¤˜,»û¦üƒ¾(=À'õr|ýJçÍKí×»é-ãĪõB@ <¯ ~ Òö5[ž ÚƒÔÅÔAÕ——âÚ.°~Å_¿ïÚ¸Õg\·d¶™ePëíãøÝ]@`h;µÑ_?úÖéðÖ\Ú³§ :¦UÍb#¾>žãyÇ幞æ¾oõêZà'&IŸÖŃ€¦´­–o\ë¼ÙU³œZ9–JЬï@±À4ñܘÝÅ3óÏÀ20Œ@ÃÁp0™% Öi&°g ,Jv €ARÒ5¥Åà,˜9Çîb#=]H_ÿÁlfÿX'ïØj,ë6!6Úú™ÖÊŠˆâ‡r‘Üë½øléKO”öìð\g3Õ ‚TÙù¥äìåàÔG÷ÏK5'ÎarÔîÝmŽÐû÷èý{̾]‘´až»ö9C׿ßCÁ1N1 ¡ò$©Â8åÝÚ]èt Ý•a©ΙèH´6+¹bó9(°ZƼO®k9çRØœÕ ³’YßAÉ ®‹§b‘¤ƒž‹’C¥hÇF¨T°Óö옸6Ë—k,‚Ðvº ç02qj;›w]gÍ9âH6>â<{¢ÅV:s1 "K‚Ð\º:G*‚Ì8ƒÉßê2 ñ¹ÇÁÿ^ëÀ—ÿ„÷uxðçð“Þý]˜æ}¸Øölã“:6 B›q Z[P îŠ)±Ž©@C€’©2MÝŠÔíkwËÎtÉç(¾áyýi³`BÝší~x³ûÞbtÖƒ0‡± úÔ$br"ðˆY‚6´CÀ€$j J‚æ¨Ò:DæÚ°”•MAKh!2"$d}:±¾ÎX¿¾XŸŠ Pöëzä&â w€`³!ôCfî¾ £ ’”æ—S«˜àŒJE~hŸ÷õ*Ïœ(Îìòï~'¢(±µºz÷LçS­÷>ꆱ% Œ!"ùTËöéãúéãúéj´L9²i‘sîiËBb9 äÜz¨( õm¬7X­ÁMÖhc£ÅÚ]ì†E,I Q˜*ÔŒ ` „G’ë€ççR±@å"UJT-Û‘2´íøˆ­ÑuxÁ#)³Þ%ò9ú®Õ#"ΠR¤gO˜]ÓvïNûæiqö’¸~[(Ö"çpóNÒL½©’IJã8=î¾VÅÞuØŽI﹓Ä4Úfv.î†$[^Õï}Ô—žË+EÁ9²aLì6‰_†?oÁW ôß{ ¬þ>¼üKðÖÿÓÛ~ü,a8Ù÷D¦``Rp50Ú¸’ày *ITèdJCâKê´|;8µ;÷xÕÙYv&Ùºª±]ºÔ~£_q ÊC$7>ˆÜ¼A%—-!A; $(‰fKñ4À  Ô† PV!ÝÁœ# ’å$s:%GÁP0cI[ÒŠRem£ÄtS)fæ"Œ#džÿ{¬Q4שׂýö±@RŒãà3¾ú\鹓åjYl¹ ×g£·ÞoÿÝö͹$ˆzF5c R‚£‡ô‹Ïª'ŽêÝ“T,€à÷& ÚN tº0;Ïoϳù%¾TÃZƒÕ¬Ù ÂDY L6Û7ꬩ]ú>$†™I (Ë€^ÌS¹D#U;>b'ÇhDŽٻËîš6•pñqj) €£Uzú¸µ3»íÞ£sWÄj9@hwôçCc ÙÑé¥êhEzî†[eÇ„ûì‰R»c_{§õÑ¥Þûm7²¯½Ýö=¾sÒq\gH2¶5¾üáÛðÍÿå>˜ý-øf^ÿ§0ú…“ò?2l{¶±e¬Ý;«É(kz˜ P@¹6åÊ0êk‰ÐkQɳI‘Ô[)±0µ­†uçÃòr¬(Ç8nçIˆC-Ym“•øú­îézrÝšZb‰j °°€šD^J޾YlÑ·j0 ÊÁ̤aØÚ^fƘçòRÉ©ú¢ì‰¢Ë .ËK–“Ì蔜 ‘#0 †H[0Æ*eS qj¢Ô±í&¦™N¤[‘i¦&° ‘ÁfËÃzolìØ¦ík 52cñä±ÂKÏ–N+ŒV¥Ü*Oh™óWƒ·>h¿óAçæ\–ŒAߣñª~æ óÔãú‰ÇôHÅrn›#JÉ\¢Ö6Ь±„ <Ã0â³ól~™-,ñ¹%¶¸Ìj Ö 1Š0I0IA0v`¹GÅ·¾æ¡ïìumX\a¾GÅ["ê!8|ã×á;-ø¹ßºÏÎÿülþôAix§<lç…ð¾€ @1ØÁ–=Œ³úmÌZENr}ÀCö§Bj»˜°˜Ã¸ˆñr|Ñ—ã{ Oú¼ÈQ<°üÊDD÷È\þÈ% ]ˆ.Þ Îh½äP×c)€Ìï IÄäÆàê¾åîV€ö0‘¨8X\KŒ‘eÂ@E\‘$tó=VÈÉ‘²œª8;*ÎTQŽù¢,Ñå(9J†œ!CdØ“ "e’ kµ%cÁhÒÚ$)…½ÚNWZéBC-tÔrje"mKi±•Ä”6nÛúbUäã‡òù«Õ£‡òSã[»‹»¡™_{»ùÞ™ÎÕ[‰6=KΣ“æèÁä›/Ú£ÍHņ± "„Fô\bœ3€TÙN¨­%mQ¥,IåJ]œ¹(®ßâs‹¬ÕÅ `qÒ›ê¾s‰8Αqœ †Œá ½FO¢D@Œ%cÉh2¬%Ðua„Dȸ¿tÝŽ”ùô¤=vÈ=¨§&HJ ¤C)БÌu³ !¥)ŒM’P¥»wÐøˆµ€‚›8ÆnÀSPou5ê†Frô\¶{ÊÚ)ßã÷ù–nwU§Ûi´ÈZJS¸v+f¬¹›óY1ÿ ¿tC|!àÛÿ ~» ¿øïî³·ÿ1üµ üÁßÿökˆ-1d[À‡¸‚ívTDè R("ð”6Ùÿ5ð.äVhd kbä`|LÆxwEßY‰®,†W&s‹âÁ‡x?<"‰ îDçï„çéõ"´=LùZáx0ÀpºàŒ…u@å â`6¥·€ŠdLR"ºE1¾3w|wî‰QoOžW–Ü(9“Ѐ-c\29ÃÀ[I ŒM2÷Jbî^]‰®ÝÎ.F—Ûz €8p¾1¾åÁ<÷dñ/½8òôñ¢ïÝsøWo„¯¼Ù|õÍÖRM`,0„#ô“G'FGˆJ‰)ÍŽ±*%F6M) ­±` @±Àkuñê›ìâ5ï΂l¶1ŒP)´Ô«1 Öf)7€ˆãàH…ÈJIrÜs™”½°Æ@’R’P««›m³ÚTõ¦ B28爙¹Bi¨·X«ƒw–øÅkr¬jìMŸ:ŸüB~燵é?ul{¶q? C+Ñ0ì¹Ì9˜<†ÖŽ­gi­r&ä¶l©d:K˜í Ãz×z]µp®õg÷?¶ñ ã{d:«ñíÓíä¦ ¡ ©@;Ò°„ø¹¦ï@ÁÍöb@>Æ.¦Õ\6 ¨@&Vp½¹ÃÓþcþŠœ*ˆ1%s03cÀZ”ÎÇÔ©Á=Ï4 ¹ Ïã6G•‚)ËñIï`K-5Ò;KѵZr3Ðu²¦'éØo»!$g'±–&ÇäÏýÔè '+Gås>ßò5»êK׃×ÞjýÅ{Õ†6À˜µ‡gÌO<ŸîšV…œq ¬¢TYÁXÞçZCªlªHHÞ^à×g½«7å¥ëXoŠ äJCVË,1„Ѫ˜“ÓîĨ­ÊJIä}æ{Ìu˜”(cý¬£™UCkJ%‰MÛ m»«W›ji%]XIçÓ ²©"†€ˆÆ µ`4Dkvä »|Íyæ uhÆNO"Óše•²à8, õa KEØ9eŽRy_œ½Œï¼/²Y´×nÅ‚aµ(Ÿ>^ܳÓ[?o•’œÙ“{æD’$¶ÙHÃØž>Œ8‡güB^HÁ†rÑm~éßAû§áþà>ø÷ÿ9ü×eøÍooÿåðÑbûOï}¼’2ÄABI@ “2¶ÛXP$Ò5Œ @àw)çPšg! °ˆŠÖíòíàÃ]¹cî_”ÙvL-J@D¶./F——¢‹J/y4¬'¨HDঠ7i5ú+>q4( z½ÃKA&àpV.‰ñwߞ»rÇFÝÝ‚¹™(bý*B÷Ë¿²¬ˆp˜—¥g—²IG­Œ¹—æ£ ËѶZŽL‹HY2kÑ®ý°[žØZš‘O}utfº0RÙ:À¿ÙV7nG¯¼Ñ|ïL÷椧BeP.Øã‡õWŸWO=®¤4.¬Ïkn-iEZ[¥H)">¿(?¼ÈÎ^roÍÉ k× <œ“ë`± ª%>R‘Óãr×´»{‡75îŒWe!Ïg`‰Œ%cHêqÙÌ Å@päŒq†ZÛ 2« 5·”ÜYLnÍ%K5Uk¨FK‰mHGD¢Þsó²Ñf+uuü°Þ³8£8± xÅÝ r$òfbTïœHG«¼Ñ„ÅÞ Zí,…WÓqX¡ÀËEÁ×…¨ŒÊgŽM½°œ®6•Ò 5ÜžOÏ_ ÏtO)VËk5f‡„c» ðßý!´_†òá}¶ðo~*¯À¯mX›þSÄög?6\TeÖiRƒ›’Óßž‰xLnJ©<…ÔÏÍPaÝ”Vç\ˆ.UäôÞ“¸.Ù×çýÁ7X׉¬²i-¾5~ê9ÚSL¿ž ¤$ðÖâ=×+NÈUÂnߤ1È™Ábpcr°io÷Áâ—Ÿª~+'+xïÂ^z÷cæ8 g(\žóö.½8ž¿Ü~ãZ÷ÝP7,Á t-®7jÜ=K¥¢<¹§,ðžfÚ«·‚WÞ¨ÿ¿¯¶Û]Û«êB$%Ì|íõõRGR³Ó“ê gè:<ŠíâjÅÖ`ïžÉ:ãŸ>+´Ù¨Ì@W²‰1ñÔ±üó'‹OŸ(•‹B –ÈZ°½¤å”*F¦¨ ´Y…wÆÀ‘ày¬˜y_x‚•K¬Z–‡÷ç²9œÏ^î~ÿÝÖ…«Ñü¢2ëäD©‚Å›Í?sQ[øŸª?€ÿþÙ¡ºøÓÂmü¨à`{ÎòÖB*ÀF䔋Às@ez…øÖb-,™À4nvOµ’YA±ËR±Þ°A<?ÙS8 ä kñ®Úgqf T…5„ IƒWLÌ¿|¨ô¤w€£xøKŦ—¡ðEù@ñùg÷¨³çBý æJb–³8p¨ 2bm*+7¨ÒtñZ÷µ·›¯¼Ñju2ù&0FùØ«Ÿy"yþ©tl„@e0NIkbqJNJŽÄ ¤;‹ì£ ò§¼+×e£ œç@R`¥$öîpŸ|<ÿÌã…'ޤdIjÛ½²šÞYL.Ý/^ ¯ÜŠ–kF)âœe‚PÆ‘ɵçÁ]‰P’–jfaE[ ÆXÇÁñqd¿ô@þèÁÜÎ)g|Ôùæ‹þGÒ‹×»o¼×¹p-š[L┬k¡Õa—®yA +¥¤˜KÇÇÒRå<ÆĉMI‰iJIjKvpŸNR»¸‚ç¯Ê¥e–Ùuj õG¯ÔK±kÚÉçÖ…¼Ø=í=ñX¾ÖЋ5MZS'0g/‡»¦ÜgN¥ÀS?¥_«À÷@CÛßi·u${~ç5øÖóðêý%6__øI(¿ ÿÑ+/ãÃÀm|@¢ ¬E䥃¬Û}¤ [T*Rè v!…,˜Â<´Ûfa6<3æíuw;<¿mü)© [éâ\t61Ë#¹.rUƒˆÁS îåCá`\P>$ ÖXÒ`¡äî=T|q¦øì˜»‡ãÇe}ø(ʱîÉÙVNÕÆV“S•©E7oiDã ²T+ëÑêè WƒWßj½ýA·X"c`|Ä=h¾ùRrø€™ÇAä|I)+%Á9JÊàå›Î§øko:#¬%,æØÁ}þåž²8=áUJfçã›·ãK7ÂË×£›wâVÇĉIpŽ,ÓôBW¨ï¬Áþ=š ;`ÁED!@ ŽŒZûá…ðÊø{o7ìõÛï=˜ß9é>{¢<³Ûÿà|ðöí³—ÃzC' ƒ0†›sìÿûž»RÇ—¾„yßrNàºXe¢\‚ƒ` Šy82ð -8{7a#¥ayU¿w¦S.ò—¾T)æ×_9ŸåéR­®/]‹‚ÐZ ÆÀÊjzm6:%Ø¿Ç/‡Ïº/ rÇá;¯À7¿ ïªû:þ|ûðÊëðòÈîØÃoà'JT%è¡›‚ˆÁ‡Ì£A=BH~‡ò.¥"0†¶ˆ]µfš_ޝUÝé)ÿ°¸kú¤Ý<üȨ>)oêÍtq)ºèA‡š¡ÍRB` 2Ç[oX÷ÂO´ƒŠo ¨@¦àWœ=»rOì/>7âìtأϻ“ `-Ü7d‹‹îÅÆ.ͬ›¼ZÝ9—«®bVìž²øcÉTÝUgÇzVºRO/_¿÷VóÃóÁRMCÖ¢41iŸ>®¿ò”>yTŽP¿*,"’ã Ó‹Å†Õ^¿-^[¾ŽÏ- k1xólÇ„sx¿ÿÄc…£s3»½$¡ÿŸ½7±ëÊÓþß9çÞûÞ½o«•û¾o)j¡º¥–ÔãîžOÏ8±''2ˆ“À1à$€á`àFàv¶?ãÀã$6bO‚™ŒÇ“ñLoÓêÖ.J¢(R")Š;‹ÅÚëÕ[ïv–_þ¸¯Š¥µÕ[RKõ¡ ¬wî;ç¼[ï|÷·|ßÜB>1•]º‘\½™ÜšÊæu»kŒ)BD‚™„ )9*s¹Ì%ŸžÏãBl£¸±­ƒµÐ¹¦âïÝY>¼/<ûv?ï:"êöí­éìüåþÈWäš=ì—µGð½ïãk¿„ w5œÏã[¿Š—~€ãÕ{<±/3ÖØÆÇ-§³%\™Ò†èdÎO¹`àÖ.ŽØ.‡e—E"–ôIF"Î]«éªóéåª76äo’ªV4VÜmW¯úùlÀ`0/d7§â ÎÅò¡<3CX–9{…•ü{bò "8IÎGîÑ ßÕÌd  •I4Ö•ì¨<°®´[}>ºxV©³³Ö<9“¾öf÷ÕÓfbjÔQY'¡Éƒ öK )íœ%A(¡6”÷l(ï$ˆÈZNswézüÒéÎó§ÚÍ–ÑDP’‡jîèAóµGô#÷ëJÈR.¯¶°Š+Ô™{±¸zS>ý’ÿÚ55+¤€´cKéØèĵ½;ÂFÍëÆöÚ­äí+ñ™ ½kéô|ž¦ ‚ÀR‚Ë%®Fnl„G†ÜpÝU+¨„\.;O XX­)ÉЋ©×£fK,4if^ôcJrÒ†¬¡‚ôÌ-šù¦¹z3½z3½6‘>|u÷öò±ƒÕ‘†jÔ7oe½Ä²£~LWo¨n_”KP ÷µŠ ¬˜´xF†øþ&IqcRÌ/Š,'³ úüåxß®~9QX.6‹¾'wl.8V½1™u{–Yγ úâÕøÐžh|Ø+•$ÖZa¿4ù:žþÿpâ×qó®†ç/ã©ßÀ«Œý¥Ÿþâ5|¬±»Á0µ2 –¸aßÝIàG>éÚ¸hNñ`BôkXìë3éúMú $Y’¿èœ™-ôBvc.yG!÷á /ïFʾ†g?¤UµpBñð®ÀûDÛöèØ¦ðÐûsŸ9ŒÁÔ\öêÙÞžoÝžÉÒ” åÙË{`ê5ºqßeQžl%‹Røuo|Ciß¾Ú㛢#  ×7W'’g^n½tº³Ð4Î@®±u;l¾ó|÷V[`,œƒwÎ{cX³Ã+gÔ³¯x/¼æõr Ãà µgùÉc‡ª[6¾G3óÙó¯µÎ\è_¾žÌ,h­Ù9(ëÈX‹±lÝhwl±[6Úël£ŠZ•++åJJ>hU“±u¬3 ­)ËÐîR«C­6Mω‰)yù†œœ–í.”‚$ˆ³×&ÒÙ…üòäø‘Ê#G«{w„šÚ´>øþO–.\‰çµ§D®q{–~ô¢g ÆGl£Æ§wwá/†É IDATa0°y£9šóå›òÌyïö Ðó‹úäéîhÃÛ²±¤äê°q]ðБê󯵗ò8€NÏ^½™Þ¼Žx›Ö¾Rrkøycý¯áÙ…‡ÿCÌÝÕðîðÄ„×þ¶~~!±Æ6> ƒp \`öIWDˆ[-®iø‚î?jx±+/¡6$:e*8 ÝݦYÊ®ÏÄ—~R¶Áw:?}Qfâf>ÙʧsÛ©ˆLQÁ˜A–EO³|O]Ë-/ØZ‘Ë+p|G庿awíÄhiGIVV?€~ifçõK¯w^{³{k*K³¢ä‚E›kÛßµetý~*/v³¶$/Raóxig¤†Ôêèw®Æß®yöí~A5œ#ÏÃø¨=ñ€yüá|÷6ë)Ól»¢ÙU„¥""âóBS\½©ž{U¿¤:=1[¶lï ¿öpmßÎh|Ôw–Ožë¾q¾wöíÞÔœ^j™,/JPÉ:jÔxý˜Û±ÅŽ ™zU™­›hËá{ bë¬6N¶•²ô¡$uû6׎Á̤”¨D" Q¯ñÈ Óø‰^Ï[\ò®ÜTóMêǤ$´áNÏå·²\óâ’™™Ó{¶—¨°Eµ"_9Óíö¬6,@Ó³âÔ›Ê÷ý£‡âëlÉDð=ªF2Nm’º,g¥…©Ó¥ùE/×ÄŒ8qW'’‹Wã-ƒ­Ë¥`ÀŽ|_Œ y÷ïZmsîR*%’ÔMÏ뛓é¶Í¥MëמR¿tØöà¹þ›èÜÕð¹?À œü'X·ÆT?1ÖØÆG¢BCY–>2EŽÀR2&š‰+VƒdÊrÉB† ÉC%ÎÒŽE¶Jq×6Ssk*¾P÷×7¼uŠ|,7Fþ¢„vï½¶?Ÿïè9@”)²Å¬#ÃJûã‡òncv§ÈxË;ëd9<ٶûãbÙ8÷óÀ3˜a›[Ôç.õ^~½sñZÒ"xíÜZ>¾¿öèÞ¡R´‡džÛL@(2T2×|ézüâëí^ë´:&× "©¸Qs÷Ð'ÐÇ›jˆfÛ6Û6* XÇ̬¤`æ8å‹×ä³/ûç.y‹K²˜”ïQÊc‡*_y úè5O‰NÏ\Hž~±uú\o¾©µs‘ìû\¯º][íÁ=öþƒ6 µs¹µfݨZ7êˆS[0kÙ9fTB™kÎ5q®Y)”(Ë‹B®Wy|¾rí®{ñ”¹rCMÏ©n _ÞÝõ[éâ’^hæqRÿÊñúÑCU!dîü;ñR[3§tuBöSßqêœÙ¾Ù ¤$P–s/¶IâÊe–èèAsuÂܺ-oM mHž[Ô—o$[6# Ïó¼¢?E…eyÿÊ­éüÜ¥€1Ü隉élz.?¸ÛÍ)kÉ”/öý <ÓÁ£¿ì®†ßø]ü…žû‡ZÓýdXc?” ” T•z°JȆÑZÄPŠBObkxMnÔÑ© öá¸ò*úÖÍO%GJ;†ýM ø…ÝÿÄu&úoõͼ Å²Î•ƒÐðäG´¢(³Ò½²Ì6Ê#Þ¦uå]c¥¡¼ù™€IêÎ_îÿðù¥ó—ãvw"B5ñ©¡¯¯ •‰JX«ڳܵ;æ‡Ï/=ýb«Óµ ÁZ WÝîmÙ“'’ý»Q­¹†6®{Üí›\ÃWˆB59%/^ö_+ˆrË`º:´'úöC÷¨T"95“½öfç÷ÿlav>ô¹œC)à­›ì7Ï´;6»r‚frjÎë@hƒR <¡Ù6£ÊzM‚%À®Í4÷û®Vµ²äPÊŽÂU+¨EÎr^«ä·gƒK×ÊO¿ä7—džqíŽ=s¡ßîÙùfþ—¿½îø}ÕRYd™»pÙvzL„~B7nÉ7/DcÃê¡ûr€ˆ2D(•D£¦*e)8lÛ=óÃ@0¤<1•½}5>°;ŒB¹"0ê{âàžèí+qɇ]VJ½=“MÜN[mÓ¨«À_ã_2Žýü¨ƒ'ÿÁªÜíÏ‚sÿ~µü6*k÷Î'À/êi÷i‚€œý®«±€óD€˜=²Ã¢­Zäa }p¹ìQt\µ„|T4 .Ežq«£'ÒËóþ–PÕ}„÷ç–uj:Íì–µ-_h"·ò h¡rx–åJ ½»EÁ)Ø"°QìV/‡OP›ÂC’Ôûµ°>C8Çí®9{¡wòõÎ[ã^¼œ3bìÝY~êÑÆýª# E»¬Ø‰âÑ9Ëí¥ký?yzñô¹^·o‹“O)Œ4ÜGòãGò­mê#Ÿ|¦ær€IP½*ˆÄì‚|á”æm¯Ÿ³ƒÚè:~¤òk¿4²sk™7n%?y¹ýêÙÎí™<ËïP°ä†‡Ì¡}Ù¡ÝzËF]‰B!¤ ¥æò+E™ŽyYÀ…òœ‹ä õ»ÐÔÆr)# é)AD‚¤œå<>ì>Å©#²ëDzjdò÷Ö;þåë~/–…W‹6˜šÕ¯œé*%sâ˜>¸G‡eVò]ï]¤—ÀŒ¹EñÎ5ïóÞÄmi-å@=}õxí衊Îyb:;õf÷ÅSK×ã$Ì\J 7ì¦uzÏÎì¾ýz磤ó<Êr.$EA5;,R’¤µ3Ì”çÎ÷Ìi¥ÓšQ¨z€Ʋµ p¹$„ Àx¸Î›Ö¹¡zÖ¨q½ŠË7üæ’ˆ ×·7sÇÜ–Cuÿàž(NÝìb63¯ã„ h¶ä¥kÞ ¯yÇïËÊ%WÕN) ËRÅ©Ks×KlòŽ-tp¯Ö†¦g•èöÝí™ìêÍtýX0>â‹e‡]¥Ä†1ÿ¾ÑíټݵDÔîØ™…|z.®{•k­°_FHüò?ÂÿÛÅoü_wyïÿMüVÿò¯a­fôîð…gt¯úD-‹j ¦Ê=¯ Ä!â*õ*è÷ˆ•¢z:®ÒG¹"bA€‰´´›ß¸mŽ”e¤ÄÀÄág=_òàŸ"VŽáv>ÓÌ&Eº`Äp€4PrµŠ÷*Û2'É)IwôF™)g¥d}4ØÞð7–Õg­DˆÕTƒá‰ÛéÉ7:?9ÙZl)"D¡øú‰Ú'»·…p †1.NÍŸkþøåöbËb¹¬§¹ÝÛí·ŸÊwnÓµŠëÇwlɲœsÍÛ7޹Ós>Ÿ»$ž=é_¿%ûñàî(bãúà[_z𾚯ÄäTzê­î~oa¡©ÓŒ f %‡%>¼O?r4=z(mT©H@vû.ÏØE¸c†V8½ |–x©m²ÜYfc }&B5’µP,uLœñRÇúqj…DI ! òÕkj´¡¢Pä{wÚ§_ ³o{7'ÉX”å|m"óT‡~åÉÑã‡+óKÙK¯u“T„…¦zñTuǶÛò~â*e•%êè'¶Û~âÊæ¯?ªÛy{F @n¶Í•›ñ®­¥ÝÛJA ¥ "’„ñQÿð¾èù×:EÌÑX^j›kÉÖ ¥‘†b­äïK …¿òÏðvðÿñ]^à÷ÿ}4jø¿ˆµè.°Tüø >‡]®Äíª4AˆdT4}äïÁŸåÑxUì̓­Sìñb¬'nÅg—ò™"³ü)­à¡­g›ù$`œ÷n%Pá>ä¦*¢Av¥ÈƒAžEjdOõDU}¾¤ûÒÌ]Hž}µõƒç[½Ø­ørlÝèÿÒW=ÜØ¹åƒ•ÇŒq—o&ÿò_Ͼ~®×l™â…@ò±C橯èƒ{L5ä4‡±(ºRWPˆ|g9Þ¾,Ͼ­.ßq:ø•§°wgé¯üòðîm!S³Ùs¯¶ž{¥53¯sÍ›ñ<·q\?öpï/<?|T‡%2qÊqZôÁ’ 8‡¢-Ö:hë J%1:ìyµŠnxQ(hÍiêÒÜ7X­±Ô²RP5l‰ˆÊ@œº4g!°iûõo¥ßüZ¶o— Kw–v{VŸ<Ý=õV×9~êDcßÎp¤1xàÉ5—è͋ޕk^É'¹áTs’9m ‡z”ËØ¿ÛíØâ†ë® VÖâêÍôÆdÚlkïüE¡Ü0æo÷jUá„@7vï\K[Z›_°?·5ÜKøø­ßÃ?ú¥»¿À?ýþÛç?™ã—_øØÆ½ùf)Î ÑçrÓÕ=‘KJ©pK§¼ŽN‡*š= E«†¨תÜ/SæC `#JCŠÛv~²¦ám ¶ø¢L$ùŽ™ÈÇ›}f®l=½ØÉgg’LáÝʃ,KËrYÑkµZS±4p’¬Ët  ð*jdKx$TϼS`%‹Ò‹íätúÌÉökoö&§ób·¥Äøˆwì`ôä£[ÊÕÊ{ÿ|˜ÙX¾r3yåLç¹×:3 :ÓL€ 4ªn÷vûÈQsì ®W]’±6ì´á»×«Ê÷Õ(¾'ê5µecpk:ët3ÔíÕ›éRÛäšÃ»Ö§­ã'k\åâ¿ø#t¾‰¿÷Ê]güß@ãeü×Ǿ(ŸÖb P åN¸lY'G:¤¤J½2¥k1’™)‚®‹ú.,ŽdWD 5›œ›K/wó9ǶxI>+W¶åªBÛ7í¾^HÞ•±r¹hã=‹aANÂJ8Z&(–EΞ’QÕ+od´’Vøô±òÖÌlŒ›žÍ^?×ýþ³K—®%…:¸¨VÄ}û£G׺¯V¯¾7{ËÌyî–Zæå7:Ͽھ:‘õú®ˆä‡eÞ¶Ù>uB?t¿Þ¾Él *¬ÔØ(*ËFUæš—Ú˜šUWoøÓ³^šÃ9a™Ž®é:zð`jÔO¹ÔCôžÎOº¨øl*è+ ‚ê2NÇséÅ«ýuG¼¡ÕÝŸgÎÛÉlÏ!÷V5¾pêÃÒ(¬³šRYö75üM?ßyÿ,È5/,å/œjÿèÅ¥Ù…ÜÁ9Œ«{£o<>thOè© zŽq{.{åL÷äéΕ›éêíàóøÃù't½Æð}j(Å•g, Àž¢J„fKNÏú“³^§'¤€±«©ý»K?T?°«b _¸ÔùîÙ ýܰ’d,ªïÝi~å)}x¯Ù²ž|_‘ J¡^QµHP‘ K¢ø¼\\SWúžË "–’ÂH㎖L1ÉâšC5Eò×%"ߣ¡º×¨$jãñ\Hôbš˜’Y^”hès—zëF½‡V÷ï ·lèNÎènß觘œ‘¯žñ<‚ͨQ-.! €§0>ì !ÒŒ_| Ym %–ôÅkñÁ=Q£ª â¢$Ê%±y½?6ì µÚð|S7[z݈ÿYÑÖðC ã|øg7îj|ã Ô_Áon½·óú"ã Û¸7 f'H4‚õÃÁ–È[ßÅXÇU-‹"†!ˆCJªÔ‘,KÜAÆ^ÃŽ‹4{…ŠGy$’ŠHúùÍÉþ[­|*³ýå7ú8O]ôY%RŒË:ù|êú ã‘–ä@…›9ËÒ-Oê=s#°„Sd—o8¶–…e4üMCþ†Ï,-TÌfyÛ³ÜNÍeϼÜzõl÷Æd–kf°”ª«Ãû¢'OÔ÷퇾ïÍùXënM¥§Ïõž9Ùºv+íÅ€µ¨D|ì yüaýÐQ3:Ì€‘§Dà‰Àž'”$"‚‰<—“SÞ[½¥¶°¶ð'Ãö-ÁS6¶o.áölöڛݷ.ö‹R !ÈS8¸Ç»täS¸»Öð9‡·ÿâ9tÆwÛw5þ¾ó <ó,oÜã‰}!ñ…g÷4l Uµ™M÷ó™y]O³ €„-QÖ NÂ8­ß•CµQ ‘”*¸âõCÔ‰4íÒÅγeU ¶}F‹ú`9ëê…ÌÆ€U0+_Ø 8ûá¢(:`ßÕÀ"‹Öžš7VóÆ~¾óþ`F–¹×Îv~ø|ëò4Éœ` ˆÍë‚o>>tüpul$ luÌÅký½Ô:ûv?Ë@ìå8vÈ>ùhþKå•Ð¥™ëöm=R…V¯oǪ́Wdµª”D7¶Ó³üÆyyñ*-µIÊa½ÿ@tÿhl$P×&Ó?þó…‰éÌXfŒà‰GôÃGí¦u¦Ù6¹v Ë¢I)ÑíÙ8q¹fÂ’ˆB–„”ÀXNs'Ül©+7¼·/ËÙEêô(M)7(”Ä„„'9ð¹Zå £nçv>¸;5€‘BxžŒ–ÃŽÑéÚnß2P eJ"ôcÛëã jùØC"ÍèÖ”X‹NϽÐV_ÿÊðæuÁÕ‰t±idæ—ÄÄm¹qY?¦“Ä1c¨îR§ç)7TçrIß`Æ¢ÛÉÙlû–òèP°ò¹¨×äØˆ×O\š3æ›ù|3_+ÛXà J{ñûÏàWÅóéOñûáÞÄ7¿ƒ—¿‡£•{=³/ÖØÆÏ†+ÉÚx°s}yÏ”k-ꬆŽ'´VmuÑí¢’¹ }·âœƒH9èqTrY]Õì‘®ˆ$ã¥V61›\]WÚS÷Ö{"ø©Î) .Ä?Å€ðà,ë¾mZ×0^¥>N±àÈÍ1À,à–_O,QÊFIÖ=q×MŸ«òV¼¸”¿úf÷äÝ+7ÒÂq­ðsß¿³üÕj÷¨¬õßO5£ÝÑgÞî}÷'‹— ÿ‚µ¨„¼o§ûÚ ýðýf¨†nÏvúFk.û²@IŠÊÂóÈÎ4»ŽiÔ3õ:Ù»=#pŒÀ§¡†:¼/Ú±¥,ˆ®ÜŒÏ]ì]›ÈâÄàêU³}³=v8¯Wµ6ÖZþdÝØJIaY”¡¤Hs×íYk±"|žç|cÒ]º.®NxÍ¥`nQÎ-R?&­É:8-Ç/X xOLòå›|ömÙ wmË6ŒÛñ–D!.Òí[kQ* OR!åÎX&Aµ²ð1hßNw{Ö^¾!—(Ïðåé¶Mé£ÇÝö-ÁÄti~¡Oc©Ý¡k´~ã#ˆB)­¤Ä±íô\¸zÕ¯Ue°ÆðÄT>ßÔ»·£H›@ÉõªònÏjÀ fË..™µ*Ñ5¬Få(þäGøúx㮄ÍÓðäoâµ?Äž5ÑÄžmÜËx)ƒùUotKx$1K7ôT›«>犒peJ+'TÊØ_}î2„õ¹\Bq"ÉpD‰æVÏóé•Éø\¹Z÷Dð¡oÿžÉÜ+Ù²ù^Ãyß,މ ÀÅJ˜ÈÝɤÜAñ{`ZEO,“¥²7ÈHú”ÝéÞsÞ4[úâÕøÇ/µ.^‰—:ƒbÞÀ§ucÞ‡+_}°¶yC©¼—kXËIêÞºØ{ñTç•3Ý<ð?Oñ¦õö‰úÁ#zë&ËÌIæ’ÔY çXù))¥qIêòÔYÇÌȵlwÅõ o±%…€s\­«ÝÛ‚=ÛËëF=mÜÙ·{o¾Óow¬‚Hð¦uf×¶|ûføOµ(”[&,qRàS) ¥¨¨#)ŽáN“3âäôæEïÊ͠ד™Ƭ|ÊË©°wíµÚ˜žÃåëb݈¼=+íÍíqEYh®¹Õ1ž¥@H )@ÄÖr1%Aðö`mÿîÊû©­yn1û7?\xú¥¥4,Ï9 7Ìá}Ù¯<•íØâñRÇ€P¨SAI*†÷bçE!H·/¦çÔÜ¢ˆ`-¨ŽT6­Ê%‘eöճݷމWCêUìÛi÷îÐaÙ(¹acQÄ0ŠÀŒX5k! $áÊMñg? þàÏj/½ÍΫ~2ÐÀªÎê÷wY3`,â„®ÝRötøô‹Ñ[ïÆ€1èôÜRÇ,µÍ|S÷˲Ì-µíÌBÞêç8,cÇfwü°©D²ç³ úÔ›‘†Ú¹eð`È çЋÅâ’˜šã©Y³Ð4Å ­C§g#,S­‚Ñ!7>ìŠ5:‡©™¼¹dVî2Ÿª‘ª+%äIÄ©kwßu÷®a ƾ‰ÿ!6ßíðéÿ_ÿ¯0w¶o_|ñÙÆ½îÝ`" d8VÚ¾£òÄxÇ…=„¢ ÅUê–)Uï: Í~ŸÃ¶«dìz ™ÑRn©ÏNôÏ.å·‰è³*™üp@ÌlÕ6ëU…p¹¸ãûúž§¢dÏ­HˆÂ‚ DPõF<|ÚÊ!«ÐêèSovž{¥}ê­^œ¸•\ÃÖþWŽWŸztxÇ †2 µ}ã|÷ÿøƒéw®%IÊœCàcãz÷ä£ú¡û3æÌ“æ¶Ó3J!*ËÁöˆÈZ6–Ù±µl˜œ–ç.zY&ˆ a‰6Ž{¶…ÕŠš]Ð/¾ÞžžËµ.d(,»-õÖMÙP#O3K! ëöL·o$Hå¹MRë)…T®× IDAT¾èôä¿}:ø£ï—žÕïô3-Z+m®ú³òÊ—®{?y)øîƒ›“`k¹Ê‘!ø"×ÜOlà‹±oÛæ`ý˜o-&§³,·žgªQ¶~\תÎ9Km}ú\/I1T÷¶lP¥1ÄýDĉç{~½¢Â–Úº»,·Ýž!zUFe®×ÜPÝIÁ¬ÅÂ’nu´6vUÜŠ|OV+^à‹ñ"d™›™ÿåß5¬aÓ_Ƴÿ#w;üÊ?Á7ÿZk:£‚/|&å^¢íb@ 5lÞU}´“Ï&ùlÓÕG¨¥(H‘ ‘4¨c! «åªI`!sö»ˆJœùœ‹årÑuS»fáVüf¤†Þ†é6€O1¹ð(¦`±œ[Ö€äÓbfcr|çDz?Eƒ–¢Î’‚H IòÌëSDñn­Ž¾r#yúå¥3úÓsºø|=5yìPô䉡ÝÛÃJøŽkiîÞ¾Òáõö˧»½Ø-·ªòº1wßóÈ1½m“µÎeš˜‘kÎs8Ï]š»,wž"ð=ª„¢Ÿ¸4sZcjF^¼*s]´zbtØÛ¼!(×&Ò“§» K¦ CJa¸áöî4›Ö›FÍ !ŒaçPòEá¦æ)rÌÆ8©„6œåN š]×où?~É窜[B¬pˆ;X9§W¹Û¬.^î8"t:âÒ5%Jñá}$Â’ˆÊ²ÐD7²L…Ûªuœ¤y?qZ³6а~ÌÌÎËnO ^ì®ÝÊšm…bçÖRz%CDYFq"¬U¾Ç¾Ï½–SÊI‰L³Î“B[ lX¶B¨"ñ“¤®Ó³íž® ¹åÕST e)E O‘÷Y\Z‹m¬áƒ±ó·ðl'þKÜ]œùÌ?À¯ á{Ñgÿµý¹Ã>¶qKV.×ð×ï¬>2l±4¼à†2Š“”Aåcb1¤„–3,+iÕã¨Ïåœ=Ç€G”„Ô#^œêŸŸÏnd6¨‹~$>}Á ùv™eC\x¬Ô` )âÃRh¹ncÙ±Ž ÇPÂÔ§ªl¶bEæÃ7o§¯œíüð¹¥·S똙¡ÉÃ{çN }íáÆ{¨FÑ7šk7;ŸÿéÓ Ï¾Òj¶]Ñ"ˆkU·o‡þæãéÁÝf¨áІµa%©Ÿ¸VǤlj‹Sk“’²ò”¢~ìz}L͉뷤6 °´yc°uc02äIA3sùés½NwàîV.¹õãöÈþ|ý¸«F"*+mXk®UäȪ+ß'c‘e옅6КÎ^ðþí‚ÓoyóÍåýAuÆ@¢‚w0LË?w,‡ù]¶ÃJ¡‹—Nû/ö/_SJ‰B´”ÀÅÉEï­ã"ТY!¸V±Çípƒ™!Zs³e§æ²\»½Ûè,‹!y.z±èöÉØ5†µf!(IÜRGk•´¾o¥`*¼—A½ØÎ-è\;Z†R–E¹,|_RjZ»¥öÛXÇâÐßÂÿ{Üõ·Òó¿ù¿#»—3ú‚`-¶ñ³aå8$Ë2Ú^yP»Îdw±M¡Ç&¤€„‹Gˆc”ûx—І%(Ť f¥”!¢dÍEÍ&W'ü3[¢#eUûTö1`Yk—;XÜé.Yâ>ËçÖE ­€*ɪü,nÂ~l§f³§_l½tºÓ^¶ƒwãcêèÁèßýöèž2w`,Ÿ¿Ôæ•ÖÙ·ã…¦-¡¥D%ćóã÷¥ëÇò,gã…¢IßÃuÅŽãÌ-.™FM•™dN§ š¾/¯NÈÙ…;›ê{Ø8î¯óK¾œœN'¦’^lWÌÛªo³»¶æA!È÷A$³ÌõúÖXkŽBò}*”æú±|ëà•3þ¥ë2û‚sp %ø\.±çAÊ¿ i*ÒÖb92žÂùKÒWÁ¿3¦ãÄe¹ÑA_‘6œæÎ¶¹FÉ%_TC <,µÄä4.\‚H©âölÖ¨Êm[‚ry`¤œæÔîb¾‰‘!+¥BQ eà‹FM9Ë™q½¾ÑZ6›" Ñ‹á!NÜ|3ß²áNo€ˆ›-óFm¹Ý[ckøpú»øA_ÿŸïòiõOÿ3üõ:þù¿·æMÿ.¬±Ÿ+tˆ„"c¸¯£§¦ã 1tó2¥EÐA‘­Q/£ á²[q¢a€˜ËW)‰T —`åºm×ìæ7&ã CÁF_–%y˜ù=Y†ÏÊ'Ų±œ3»Õl£ˆ¬3ˆÊ<'A¼*"_¼‚T "A$~¯±º ¥Ó3Wo&/¾Þ:õVwb*7ÌðÕ‡äñ#•ǪíßU£÷%PIj¯ÞŒO¾Ñ9yº;»0p^06ìöï¶=höírŒ%!¨ˆ žرTD (J‘qý²°F^½éÍ7e¤¾GµŠÚ0 ×=®M¤·¦³LßixÙ¸ÎmÛìÖJPà OÁ“"A  ^•aYŧI*¦çäésþÕ›ªÓ½SŸ±²+E~Á÷P«¹Ñ†và ŽBö=hƒ8¦VGÌÎÓü’hµ…ãA êÊO³%nLª[ÓA¥œ[¥DÉOÌpEŸP.‹ª Ï#_Q%Äø(»j…{19GÏÌå›×GF¥ ÐçecD’R¯f¢äËb3}ÀYöy I*ªU„eö§9Q’ºfˬvy‚ŸŸ<5èé5†{ýµZ¾5|$žü‡ø“6¾ó»wyßû«hÔñ¿~kÍ›þÖØÆÝCò7—ö »Ó<ïº^ƒzЬ3DUÄþ’käìYÈA„™pÊA—£*u%¬ @Á–Dh¥zr:Ù e=ò>ÌÞÍ|>%86–µƒ¥U &EÈÂ11èd`±ìÓ¶Ü. !¤/Ë’äÏ;'´B5 û±“Ù«g»ß{fi¾iÒŒ¥„ Ô«êÐÞò×®Ÿ8V«FJˆ÷^!Iyf6áµöÉ7º×&²•)W#Þ³Ý|ý+úøa;6L¹QÌ‚ )*^fš¾'5!Äàÿ PBÀ÷DËë·ÔbS9°Oi¨ c~­"q×n%·grk™BÀ÷±s«ÝµÕÕ*„ §¯àûB !¨Ðäh.É+7ý‹W¼ùEYx¯ßõÈÆa£Cn÷v»s«Ý¶ÉŽs­Â­ÑíÓâ]»%/_—.ÉVWd9 ÖT$ -uäÅ+þÖ ¼»cI ¡$¬ %œ¾'|Š[ET+<ÜpõšK3‘ç$Í-šnÏ®ñOœÕ9¶VäZ¾¬U0 m}ðùJµË"\¹ÄJ¡ˆ\§™kuŒYÅ6¤$ß¾'”¤eÃîÇklc ? ¿úñßÄß:y—ø×ÿþ»o`ô _­ð±±Æ6><òGü­{j_=¿ÔìÚù.*Uô}htDñ0µ¹a WŽS dŒR—«Y¹uEÁÖ)6¼ØÎ'¦â·CÕøp¶ñÙÀÁ:6~Ö㼞 yŸfùIÛéùôG/4_:Ý™×Ì$ŒÆº1udù;_Ù¿+ªUÞK58ÆÍÛñ˧;/œêNLe¼\ò $8¤Ÿ|T?öK,O`Y†d5¨p|e2<óâ\ãÖ”hut´ˆá!o|Ì«U¤6n®©Ûº(‡½;Ý®m¬„Äò¶ÿU ^‘0ðô\¾é½õ¶ZhŠÜà=ër A¨Uqhyø¨9¼ÏlsÕˆ•ä)œƒ1td¿¹:!ÇǼ×ßônÞ–Zß¹3ú1]º¦Ž1JXIƒµDÊ/BÉ«oD¨†hÔP‹°ÐüãRG÷[«©eµÐ•« "QP–wm&À“(ùøXY´6®ŸØÕNE…ÑŒ§°b•ÂŒÕÁ5¬áÃ0ûCü/wK5§ð£ÿmj¼ klã.ÁË yCÊû§â·›v¡ér%lqÜ”ˆ¥„ƒŒ}`P€ªåj%ÊBJ‹ŠK.S^æNæfçÒKuÃp°9á)_ñªŸOŽ­uÖ±à kEªðIùÞ°Zxƒ©³€T"ôsŒ5®²AA«“_ºž¼tª}ê­ÞÔlnÀ¬Õ+òÕ¯¯Ø ×½•ciifoN¥¯¼Ñ}áµÎäL–¤€1r»¶™ÇOèûšZÄÅÙl Â{O„A*d =µéÊRjwE«KYNDì|_4ªr¸î1cn1oµM¡q ðÝpƒ×ØzeÙ]¨(¾u(ÌY˜…}’cjV^¾.¯N¨\r(ËsOq½ê>j!(Ñp°y¼¼/53KÉ\U¤o1u궨–p9A€ÁãbqF‹>‡î—)%@™2’”›KÙÕ¹tËúòî¡`“Oò2&˽¸Ÿ&˜ƒåA·ÂjÜÑlø0¼ï×Åá'ù‚}ÔÐ»Ç Õ0Æ%™»t=>ùFçG/µ›-“f,ˆHp£*÷î ¿ò@í¡ûjãþ”ï§nf!õL÷äÝ WbS8®Â2ïØb} =¸ÇŒ03i mœÖL¥„¯HÊE4–acØ÷…§È9ëœsRR»'–(I©h£%B9 FUUB™æ|{&ïô¬Öƒ…„!ow•ЂlœT€€áºÛ·Ë)%ˆåÎv̾¢ZÄ÷pÓ³b¡I³ "ÏïäΜCš¡ÝÁbË5jxЍø•-lÕ¬±O E~¨êý|j2¹ÔGRFî-çG$l:9y ¿×xÌú¶¸î“.¬Ý\†ÎÑëèÉÅôêlr-TC¾øàæˆ/H’G?ÿ6ì~l'¦“<·ôÚ›½ÙyÍ˼/*‹ÝÛKé[ÇöDÆ‚÷'PÌ.ä§Ïõ¾÷LóÆdžçÎAHØ¥} }èþØZ×l‹±¿Û·qjóÜiÍ'†ª\ž'ôbÛî˜^ßnêU'¶Õ6in+‘Xl³óÂ.7I(‰(Cu)%z±™Ïû±[Ñú¬Fؾْ°íž‰ûgNJ ÕUà ëÐí["X‡,sC5¿ÕQï\“sóÐþûŠã¥Äþ]æÛOæGØRÉ6Û&I]nØYnxÕA Z]›çÖ÷¸çP h¨®¶nÒ»·Óù˲ÝE¼¹A³ífç-˜+¡(•Ž-Fcr&P«È‘ºp?±ížéÇ ºÓcÈ m¤nuÄ:ĉm¶íRÛ(©‚€²Œ'gòB ÌÖú%Å"Uô¿üT”»·Ii㩞¹ÛÑ_xüq ¿^ÿ¬'ñ‰anã?ù:þ¼Wƒkø§?Æ_Z§ôÅÀÛøÄ È!Ãxy÷p²;5ºãÒ²È 3BJ«¢×rõœ•cQTxßw —Ú®Z£n™ &°""¨ë‰ëý7†‚MŒ⃚S>Wø™¿À´,LyÏK7V¢Îa©Ÿ»Ô{ö•Ö›o' KÆ1 ù,¥èÁûª¯Þ[®{ï§¹æÅVþâ©Ö^lMÎäYî@0ºÛ¾ÙýòSù‘}n|T.µÙ9X‹r@¯Š"Dk‘dÎSTô‘Ɖ‹ÓÁ#·(•D¨% ÁݘÛ ÄÒÈó¨©F])%âDÏ7ó81E_+€jÅmßl‡êT ¥']0C)‚eë²4å~߯ šKâÚ„lõÄò£?Š}ff¥xtHïÝ™ßwÀDkÍÚÀ÷E©iæ„@ˆ(”®|ó‚j¶Q«¸ûp)  ã\ Ñëƒóe±/À“¨„Ô¨‰JˆR‰|ˆ$®Û³R3´fãØN3çyT*‘’«›ª¨ø°Œ…ubài–¨Q“|¬åt„¸FÝ6WÞ°Ë^Ìå.W$lˆ”A. ¼BIÇNÏ&o/¤‡+Þ°ï—èž+°ßîõûóàxøye„ríz}{îÞK§;/½Þkwm–úN5¹sKé±ëÝWY7ò ”,wó‹úäÙö §:o½[ f@Xæ=ÛíWÔ6£CFÛå> ‚ç !ˆ™sÍÖ9çP|•JQ‘‚‚|A¥ Ôrý„Zí;i¥( E½ª”¤4sKm“ R *ó¦ ®Qà 0û>³ƒï‘§DÑ™’k.¨Iš¡Ù¦[S¢×¿#ºRiá{nÛæ|ǽn”#ÍÙ1Jø>Q¯Ÿ“3âD^¿¥~ò²¿ÔÆÈÓÖl^ÏÖÒrÅòåˆ=…rÉ•KìÖÁ9"Bš¹8s¾G…˜‡sœi×O¬ï3­hÁ éô$„õï¿dºÿÎ#õÉï1ò!­gÅÖJ–Ÿ[ ÁÓEªÕE½- ÔÌUq$‡ælÀZÉ g|(d­¨2’¤n{¯ÊrxTV¼7àõ-•å÷•Q H¸ÇOg‹‡œoô(N¤VF/J©S2—¯é—¾ëÿö? cvÊ¥™>{Ê”%eÕ1G fñ<«”)«r ©FÌaÀ¥|ŸŒ‘ʈsRVÒOœÎi˜:cÆBöàœd™1Æa¼Ž€sv{¯\Ý4 sžï11¬gEœT•”•«*Xw7ŸÁµAÌ=ï£u¨*[UÖZW7ê*¦àƒ…¥ Ä¯ü%üµ—qô/ÿCü?{ ®ñ½pm|jˆÔÄrüäzvuÕ¬oV=-Æ#SïÁ 6FÖ¤,—°¸_×R„C79 hÄ, P4ÉÏ$[Mßjús‹ñÙ€êƒý Êy|W¹$ÓþqaÛØª^}§ÿõoï½-¯]ÚA+üø‹íy¡óÔÙf»ùçßטßýÃÝßyiokÇŒ}Úš±,-ØŸýñê…§M» …¾×n¨îÀè l±µÒZD!·l-ŠB°/a^UR1F¼}=3Ê IÙ¿‹b„>Gצóe)îžV† ÀÔ„hÊ 4€™4¥¨ÕPaÀIjwöÌæV×!î!péIwô°›êÔ…Gd¹MR8±B'¸v‹o¯²Ö`FVàÚmÞÜñŒÅîU÷ØÆ6cwêXqt‘f'ý~b‰¨2HRÀST”RVâ¬3r› …ú^Û„º´‘xàÅšãåE==)iæ´âÀç(äaꆩ5VŒQµ'Ëx”Ò¾·(&Æ &¶Ô`Ft@8À°øí¿Š¿ôk8úGÿ{üÿp úÇà3mÐ÷›':N9x¶ý¹ùèİZ]©6¤¡”•˜$@Ù $£°-cuQ‚èq_Z“ÔÓ0h¸ˆÊ&’½êöVvy=»r(<ë?áþ+†bh†Â8·±¿²c[³JùÀ[ œ‘Òá“î­Åˆ IíÖnùêÛƒ?z£ÿúù$ÍÄZ!"ÏÃÜ´wêhøÕ/M<ûxsfÒÿàNœn}³xíüð¥Wú®du{&|Ï=lžªúâSvyÑ*ç …{¹³¥q\¢(]ohBŸÃ€”"çÀLQ¨¨ êöë D¬ç¢@š“«sCT«QQÈ(@©¹Ö¨,4¢@¬ƒ±RUâiò}"¦:ûBߣÊcuØÙƒ@è~Ê84c7?c;-Ѻ,HiŠBvNŠRœ‘0àÀ'{=îõ‰Y˜a,u{´×…Èݼší†[óÑÆîøÏÄLÁ\t¼WmÜÊ®'„’(…À†mPVðp`c–û» 2 wÑiHªÈÒÈÚ­jcÐsº[\¿6x¹¥§"ÕºßöÝÈ¡H+ö˜À"µÄÁx6BÞ€!€ ö7¯Vj“6ˆ8'•È'Š6îUÔ¨{&î¬o]þÖ7w/]ˉS ÌÂd[?ùXãÿÌԙ㙩Ï!8+›Ûå’_ýÍí•õ¼2#ÑVÏ“Ù)ûäcå}±X^@¢²(K©{D J!+\š¹²”F­ÈXQŠ¢™aXçj)‹ºfa­TFˆ$/‘çãÓ9ÕŒV_³uRUr¯}ºR¢”0PÕz9€°N*+ÆEåÈsN2Æž'h7ÝœUZ*ƒ¢tLLL¾GÜÔAéòÂ1SÒxQë÷Ϲz’4þLÕ‰¢Åy÷Äóì¦ÓFšSíBçûhÆÚ:T¥Ó FAJ‘Ö\YlnawÄjç´[J1ݼ“g¹#&„D¡ó”5ÆšJ|êÚSr°µ®¬\V(fUY¶v$g¢G NwÕc­ä…Ë gŒ«_+n5N¡¸‹Ë?ù7ðhÞ9 ¿û·1yÐôð™6~À Ùàx÷n%oçÅpOÒ6 kv+êúÒ&¥C‰«û³n*C8ÃÕ ußh›ÊĬ]¼²?ÙÒÓ¡n  fýý€ƒi&¥H×ýªÄa&ù­\&øt*)¤¹}÷ýäÛ¯õ_z¥·¹mòB´‚sðBÌLz_ûÊċϵž|¬…ùn( »±]ýÞ·ö^únïÎFQ”#5‰(”CsöGž/ž<[ÌNWª(Ù‰$©­,Pë{ÔŠU’:£l,Ò̉pRPà)'Väij7”§PU0ûJäÖ¡¼ÿ{ŽXA¬Ã½Ê_–R+Ä!G×Ò¥Ö¢(\’988‘ `­Õ‡9<ûkÆ6¬p¾&r(+—dÎZ!¦fÄQÀNpdÉ,-ðõÛºNœŒµé¬C`¢í–ä'¾R¾ðŒYœSyiÓÔ2Sp#dOˆ\HQÅe%ÎI0‘ˆPšÒn—özûÌÍLyO—¯gÃÔÖw ‰#«Ø¢š íyì,†‰5Šä)QE³ àvKßK9GãEö×ò¤"pBž&¥"îY4@¾‡v‹'ÚºÓ¢Z‚Œ|pÝLL¡ÏJÎrƒ¡ õn—’”Œ…§%ð¥ÙÙi·¼à;iŸU)8ŸÊ6'ÂÜ÷º‘‘5D#BÞT“!ƒš”fä d¸’¾)Õ¤ÅÉ¢äÜd™ÍvÅ,ÿà^ž&OsÀ¤ ±'Õ©6]ƒ£)\Õºæ ˜šÁä˜`¥ÊìÀJõ±b 65 rk§|ãÝá·^ï½õn²×ÑR•‚ïóɣᗟm}í‡&æ‚VãÁÞ9TÆÝº“½úöðw_Ú»³Q{ˆ IDATSWï÷a(‡çÝ ÏT?þ¢9±ì¢hT?@Ä¡wÎND€À§0Õºdÿdz­U/ë. 9ðG²¡¯´º‘Cûáë}úôc¦‘RPŠ}ˆìÓG=MžæF¨ju¯ÊÀ×ön@+ŽBÕnꉖˆŒºf|ëþÙŸ¶bœ\vŠ­¢òÊMµ±My(ÄD[çÜÒ¢=zØ:j£P´‚€›1Q nÿU×·WŠôþdœ#q”fz˜è,åJè´”Ü^-­¬ Ý”C³X^àÉ6ùþhJZS»¥Ç¢ïÆòpˆ4cc‰Bž™ô<ën*ÊR‰É g­°&>ÏLTR€ô<þ¥ŸÁùG;±Ã?þ'x±ý)Oé³Ï|´ñ'€@5æÃ“óáÉ~u{7O›H"ä €‚mÒ0A”"ÊÝûœ PÂKÐì Ï°4LƒŠ–$½òÖÖú»¯Ý8²·>[à`78žM,šùÉ\,¥É÷9PÐ?ÐjA–µß‡»¿øR‡€VÊÔôŒ”ŸdVý¡¹v+ûƒWzo^H®ÜÌk("è´ôÉ£áÏüèijO´Ž.FúaÎöYnW7óo~§û­W7îå¾F¸§±8ç~ñ§Ê/>Yž8â¼ïÛ…ùA±©ºCâƒQrÍ­ƒöý‡~[j ïC¶Ô²Äp÷êW¾Æ±Ãnnº\ßänŸò‡VSf&%mŒnñ=¾®ÇOEý7U…^B+«¼¹CÆÔfi#O5c$+„÷5È&Ú27åÚMù Yu›õª+)ŠáXÍÍø¾?Z9c\šÛ^ߌ4̈ž|8íùŸT·ðo} ßÌið$þÁ×ñgç>å)}æñ™6äûÍIcLN!°"¹ñDjw·ò[}× QNrµê"LLY“ÓÊyô½é ÊÅH!g*ꨜä^î·ûü«+/ w;A+_œ0Ñ´Ðí¿>ö´Á÷'HïÊÌZ‘¯H ”“±¬`8µ_Œû¾±ìögJÇ€ueRíYW~”·èƒ=¨yán­æç/%o]LÞ»š®o•yîê°¢ÅYïésþbçÜÉx~6xÐ\ÐíW—odðr÷Í‹Éíõb¬ýÈÙ“Õ}±|á);?cuÃÔ)EÏZ33ŒuÃÄV•Ô—0àVC‰ ¨\žÛ²bjDìy¤˜PwqW. Xk*JW”bS e¥ÕÝ”8+UåÊÒµ›ð<¨}ÁMª •DŒEV¸4µ¾G¾OaÀLT—¤ÖX!¥H+Õˆëu»ç½˜0Hxc‡‹RÒÂV¢ÅIQI–;ç ¦ò5Ñ ±y霣v“:-ö4ƒqÖu~«~HœC’Ûzýý€Ã€ÈK) [_Ó󨩼àÍmuõ–ÚÜ®)¾h·øÐ¬ÞÞ­úÑœªRˆB™v6/ª$‘ò×pÛøO~¿ºõHƒ}üí¯ãß<ñ)Oéó€Ï|´ñ'†ÙðÄ Ú½¢¿›Û²'eK†Š\ݯSÞB’Pl…Ýè-í %¼Dâ ©‚­ë/L“’˜Ò¿)rZêgJY7•K}þ„¨ŒëͶ«TÃ4"¥îÉêß ;F!…R¤=ÏAíïbBÁQA¿7ÙLj“²Ð¥Qt#ÅÀl)LJ¢ñ%"ÎIw`WV‹WÏ÷ßx7yïjÖ˜q«`òÌ”~áéÖ—Ÿk½øL;Š”þ€T¨µR”îâ•ôå7ûßüNo§k²BFjÙ‘>d¿ðTþüSå‘Ef%i.ƒÄ*E"h(!c¥?´•O3êÌGe\^¸Aæ¬OSàC)®£ª“@yaûÙÙÃÆ6º=vû5¦vSµ›*Ž•R¨…ZóRz³½W#ucÇDKMv´>ÐýC†øo~ÿóåGþWÿ þ³çCÑÆ÷ ‘jÏGN´¾pk`z¦7…(BVóS"*]´*èòþ·À@gˆ†ˆ}T>*Ô ¸eègÓÑÌñ›®ò;ÓŸJ¿3º³ÛMz®wznòìÉF3Ö­8Œþžt¤šLau¿h^Mjý7r ±0à$˜­JŠ5g¥{ý|ÿßî¾þnÒí›{ë ÎaiÞûꋟùêÔÑÃÑCSÒÜ­nä¿ýÍÝ—^íõwMC™°¼àþ¥˜ìäžW¢ÚQ…™œC^J#Ý¥ª$h~ÚFª iî²Â˜šÔ¡Ïµù{nßvûF&˜¨f®Š€`à»…)'(+É @1yú¾ÔUQ¡;@’Y¥1=é%‰­*¤¹³5ý˜h)¬nUžg›ñ(Ós/ˆÐàÖº¾â6 ÈuàyG* UY¹4³IêœCà«Ð'ßS¾Gý¡­3q¤”Bp–Kž»vS¨*ÙëUÚãv›#Ÿµ&ëçÎ9ø>M´µ¯™•Á ~ó‚ÚÚᲂRp‚À£™)ÿêÍr¯7Š=SS23UuZ€‰Žö=¢{èÖý¡]ß¶»]µ¹ƒÝ.í»ÏÐüŒ7=¡ÇÒ^ä…ëöÍÖnU›èŠ`fÚ›™þMüþŸrI½Ï; üƒ ý;8úÏÿ#üw_ûþÛH~Fñ™6~ ]¢÷’S´½ÙÇ;?Ñ/7ÖÌím71Ë®E‰€ âQ5É}ëô>–öå’ȈJ‡(*‰9kª$’ùc7ÈÄÊN…)õ‰ŠDµ yž»µòÂÕÞKåF§¥æüåÅàèáàèb8Ùñ|ÿ¾O–f¯áMjnðê¶zm™„áXœ~w7A€,ØÇFõ(’Â¥ýj£´©ˆ=ü#ü@eg¯º~;ýöƒ ï'×WŠnßš{D-1ù¹Ö—ži=÷xkaÎÿ°Pck§|û½áo~s÷ý«Ù0qõ˜àûxá™ò+ÏG+À1³§ÅÓ\'wÅ=P”.Ë!RÕ*ݾFYJ­·Q®©v‹ëQIêø>•¥BL±1RçBX¹vÓ1 ÄÁ—fv˜cáy܈ÙÓ4¦žf96¶™•´›Ô¸*\QIY:¥ˆ€ªr•%rNZ ™’vÓuûìܘ¿Zñ)Ëyu#è´dq¾ÀL 0Ö••d¹ó4×½ax P_§fÖä4R˪×úCËÊ…>'žm5T­R.ÍlUI³¡B_ívÕ{Wõ«ïxÃd$867­|Ÿ®ÜÌúC[+Ž(…vÓ[23“F³íõ%M\ñDKy#IfEàiN2ÚÚ¡Ím¶–(¦¥CÁô¤Çûù1q’fv¯g6vªÊ'2?íÏOû5û=Àg¿ñWðïüÆ#ŽþÚßÅ?øóŸý-óû‡ƒ¥ûxøÞ»û[c šsÁéiÿÔNv½g«˜Ò“ aÚ4H)L$2¢î!”’g&ˆbÉB*9>ªgÝsó±žYnÂÃÒlhçp¿ÕÇ1‹þÐÞ¸] ¶f¦õâœ_G sþì´?=éušºÑPŠIÁkè)­b®„‘ ¨ˆ‚(rv_øòÞ›pݺAûŠ"Wæ¶Ÿš~i“Ø›øàÖdHX놩]Û,/]OÏ¿—¼òÎp{·Êr©7Q&„/Ìûˆ~üÅιSñâüÃyiYn{óêÛƒo¿Öû£×ûe9jkÐJ&&äÌ1û£_*Ÿ9WÆ‘MsD¤J‘uw‹DÌhDÊX‘aj‘f̵>7óˆ‘;Lш`ºxEª, "(¢R\U¹¼ϳͦ­kõΦ¶7°ÖJàs§­ƒ‘Ù¤­oñÜ $/\Y¹²ÅÐJ¡2’å®N†Ä¦'åЬ+JJÒºqwmóœ/] :-³0WÉ(î¬Ç\iDëzaÉÓdŒ•«ŒˆÀ÷I+b"¥hLÛÀZd¹Ä˜Q–’)G€V䄉¤ng—®ᆵW7ˆ„‰¶R +keš¹ze|_f§Ý“gªÉŽ%¦Q²'I]@h”bßãþ€vºª7`ˆˆV¼¼ÌLyµ©°ŒuÝ^µÛ­†‰«KiÌM{sÓÞG)Øà³Á·ÿ~éÿ|ÄÑOÿçøµ¿‚ÉûO‚ƒhãcàÃü¬Ø#Gì?"gÙ–aË=ÖÆÚšl ]«¢¬®;4(mP:fr9¥î4-¤¥z¨x_Ø;¤|Zí¡Ý:<·wì…ÕÝÜ ¿*÷I¨ø’îû/ë°±eÖ6«WßI˜0;­;¿ðtóܩ汥 µÀ‹yRS,ÐF4“Ô\‚0œ‚c8{7çM÷܇؉b¸}ïǰNìÐlÍnìݧË>fP:'ÆÈ ±×ng¿ó‡»ß}spýV©5ˆ¨®_0#ôyaÎû©™ø…¯MOMz¾÷àѵ¾šuØÞ-ß¾”üêom¿”ŽgH@³!gOØõçóãKU£áÒtdW÷AÔûYýS­®5>0Vn¯eiµ‚±¢57bö=®*·×³õ¶7L\<ÍÓžˆ]NP'Â@š±e–Z¶³22Lmw`Œ•(äé …¬Õ…’4ãµM=7ÀÙÜ­òÜ B@piæöÃ/™è¸cËv¯Oý¡Ú·‰åÞҜ޺àMuôã§ØÚ‘y­GNDÆHH( M–KèS»©ˆÈšñZŒr‡VCOOênσ,—vKÍDLcps¥zû=ûÍïxï_×"û1"‹ï“sÒíÙ}Έ4#YZ°Ï?UÕ =ÙQZSed¯gÐIêZMbÖ;{ÜësQI†ñ4Y f§¼ú•:'EéÖ¶Êí½ÊZÔ¹L4?ãÏMû|l|þpñÁOÿ­GtIXþ·ñOÿ&:)±O†ƒhãûk1HªµâÝ+é›×Â]šn2ng±2 5¢oP“Ò)î–Ö/>àXÀïI+ ²ÞÂ(ز¾ë%ÅÊuGN.ÿTf;6G­Lµæz}÷ö{ɵÛÅd»77­Ïo,-™ö|»’à ZÃŒçMpãHâ¡p`åïÞ®Ö/ïUk½j}.:þàß;¤¹ÙÞ­®ÞÌ^;?¼p%Yݨ‰Õún8ztäpðøéø‡ŸoŸ>ONxl­_WeäÝË×ß|ýÛÝí»œ[­¤Ùp_~®ü¡çÍéc¦Ù@}t¶N²BÊÊÕ],NFââîž­þ!ðHDœƒ§ïÚÀÖ¨I+Ì蜵.ÍÜ0qQ`Ã=E­Xµ"žžpí¦ï•Á0qu…¨óì´ßˆY«÷u0¤›wÔžô:-¤R—6š .+‡‰¶ CH·g˜]#2§é›wÔÊÚCÞŽ4£«·¼ï¾6V{Î×x¬Ú‡²½[å¹CiîzÛíÙÉŽ®[4êØW1‡s`f©‡ñ<ÄÁ9¬m…o¾«®ÞÐÝÞH Ì÷ш±Û­j¢Í¸^slÙž=ige˜¢¬îë8.«‘ã|·/sÅëFlQH3SúÐlÐnzû¤¹»u'ßکꉅMvôÔ¤×80IùüaåWñµÿÉ#íüY|ãïáÐÁSó‰ñ™6¾=]õÉr×í›ÍòêÍìÊìýëÙmFcš§ŽÇÊÆtÚB Ð° ©hcØ£¶6ðÆUTÐC‰[’z0wÕEa»½ã˜É÷e?IZ؉„ÍM{Xºž?H\Q¸¢tE%"(+)J·×·ë›å¾½VÍÏajŽýR•ö”€Å~nC“añpÕݵ9°ö`Wkir,è–wºåêþ’Žö‰ÁÐìõª›«ùõ[ù•›ù•›ÙÚfU!"&"Bñô„>z8|âLüÔÙÆ¹“q»©ùa‡Ö²r[»ÕõÛÙ½ÞãBråf>¦ Ç‘ÌMÛÓÇ˯<_=}Î6""e9š:êFíiRQ c„Hꌋu#Ÿ­)ô™h䣿œAà“ï±RTÛvÂR|ˆPVb­ˆHZ 94+?"M8AV¸^ßä…m6xq.hÕ}»…&t막‘xšX! pÆÈ¾© DÈóÐiˉ#vá}wõ¦”%‰€hDñ1´¾é'–Qh''ÄZ±ÖŠb(M ›¤¶N#FÞ°ÆHmrF@^ºÀgO£&'©µV”"­!"Y.ÄVÖõëïøï\òözl )b(%L’f®¬¨\%™^Ûô‡‰b‚u2ÑòŽ/‡S/ F!U%ý¹¹ZlîTJ‘sÒˆÔ‰å`ªãdIð¹Áîïã§þÖi¬÷%üÞ?©àSžÒçŸùhãÓD}î÷‡ÎÜ&×7‹«·òóï'¯½3¸v+$âiiLvV/‹[½ÎÄöc&§`¥v¢§¬MÃJôûÙœp ‘ØGQÉÖÄÑ&§…óö\hÁeã­ŒƒzokÆjb9<îµú›í­jk¯ÚíV»]k¬X+"TgÍ“Ô]¼’]¼"ZË3?ǧ'tÐð­ä@%Cœ‚×}Ð"¶P²/ßDEN³tËÕÝ|µ¨*g¹,‘—v}«¸½š_»•¿õ^råF¾Ó5Lĵ5 ÁÓ…´´œ=¿ølëñSº¨ñA8AU¹­ÝòKÉ?{yïwÓÍ3Ò"x‡çí“U?òBqö¤ÌNK^ /¥ªDç$ð©–7Fœ­÷rX[W»$+ê ^ñ=Õl(Îä¶,¤ªD{Ôjr#õKŠ“¬pJWí–|Nr[®2âD1–©Õ”®”%¡fR L?1“`aÎo7•¯p’œV7y{ì¶‹ƒçQà±ÖT®7°’Qݸúìû|ä°;rØÍßpwÖÙ:ÚO!Ôª`è ôµ[|ñ Eq©t)2â¶D!Ç‘¨(œ´š @Y‰b"˜ÿ’¢tµŒi§­²Ü%©#BP»ÊYÙÙÅõ¼ü†÷Ú;Þõ[Ú÷G:fZ€¢@UݵJiÄr|É>qº<¶d„Øóس’eΖ¢µš*Uàs§‰¢à"×;{^šSùÍNygODí–ªYʲÂnïV+kå^Ï(&kÑj¨ÇŽGSmu@ý\!y ¿øsxïÑŸÂoü&¾ØútgôùÅA´ñé ¬ìÚfùÞÕô­‹Ã÷®f7îYf+S+1P>Œ·nžY:<˜ßˆš¹¯ em1ÎpSÜ-ÄK%ú`·g_š• ¤59€‡*¦¼%ÉOζ‡F¤¦£S'§|3×Ú•õ|e­¼³^¬m–;åÆv™$¨Œ(&­Q®òʤ™'Í0º{¸`Ñpêà £d îÉdÀ‡ÉMw+Y¿¶~§»ÛØÞâÕÍâê­ìÖ|m«*r)+ÑŠDêx“^:ä?~*~ú\ãÜ©Æì´×Œ?ô&fm£xé•î«ç‡/gi>š›µh·äÄQûc_ª¾ðDu|Y¢ù>€‘W;fÏg­È‰ø>Mt´ÈÈžƒˆ@ÁÖ ¼6yVŠ|ÏA ùþèR5|f&<Ï#b„>A!†¯)ÏÕÒ!Ùíb{ä…ìuÍæv5?í·šzrB7cÞífž—´º©.¹£K†ˆ4“Vb_³ï±µ`²£|™0?#§™[wh{ÏO? ›XUØÞ¥o¾ìe9²¼XµRËchÅÌNyÆ‚™j 8­êP˜Ú-Ý¡±Œ¢VSû¾3FÃ×$B{}>‰ÿðUýÖÅ`¯ËcaÓúí·•#kÇêæ8vØþË?Wž;-í&>i¥ω+ |f¢Úèú ¿yQ'é(4×s3Þ©cQ»©´ç°½[]¼’tûÆXÔ´ª‰¶>}"ž˜Ðß?YØüó†òþâ×ð­G±ßÇ þ¯ßÃÏÌ|ÊSú<ãà“÷I‘¤vk¯¼z3»t-»x%¹½ZníUÃÄÑ(y q¤f¦âãGGfÏNIŠ~êÒJŸj9 )orš¸4‘ÈbDk­©¼T¢Dâ2&K hqR:_> bñ ¦À穎në`fJf&½K¦7°ë;åúV±¶^nìTÛ»Õn×ô‡6MÅIzíÁîdcjÇ*åF&ê %V‘Ubݨ ¥>>Ø‚­(Ku' 1\€²€ÚN6_Ù~õú;'×nµwzE·oC“æµs[fàN‹çƒG¢ÓÇÂ3Ç⥅`zÒó}â‡eÅ­•ÕÍâÒµôí‹Ã·ÞKn­ƒÄãpdÑž=e¿ô¬yâ´9²`›‘ ¾Ïõn¤,Ð@¤‰÷¥S‰G"Yä‹hÐz´uÞ¥nÈUÆ90ª/8J«(E!±ó@ÍhÆ8~Ä®¬©ÍmÅŒ¢p;{fc»<¾.4ôÒ¡`nÚ[Ù¨ên‰¢ÀÍ}|É=vÂÕϾ‘:qÀ#é>i6ôåø²}ê߸ãV×9ËëY„@œCYÑêºz]¡2xîI~ì„]^pЉ"–{XËuìDt_‹FÝô£¡O¢‰ÝßYç Wôïªóïë=e î’N ÖB@âF¬Z?m^|Î<÷¸é´áyµD)˜0^²ºÍÓIsºzC]¸¬*C€(…™Ž·´,ÎaÀ„:0u«›Åëe":-5?ãžâPך¿Å”Ï<ì&þïá×wipˆ¿ó üëG?å)}Îqm|<Ü«ƒntûæöjþÞµôõóÃË׳•õÒq‚ýc¢H/òO Ÿ{¼ÙZ0E3¿šßÊ$I%×°L®ïŠ)íP?—Àá…çö¤í“Ñû>™&’„â Þ'6jiNhEZqªC³ˆôÛëW;»ÕÚv¹²V\¿¯¬›;v0 É'“ÝYcoQV”& 4-FÁ90p·er$Ìr†´†©·†x0šdXînî¾òöÅðÎe*Œa&E£5ô5OÍNëcKÁ³çš§ÇÇ–ÂÙ)ÿÃ$Èê¶­ò ƒ×Þ¼v>Ù뚢pZ ÷üSæÅçÌŸ6í†óýz?m>ZѸawl³Îõnw·xFû wÿÇV÷ãÞ_2ƒ-€Ã@N³/;wY±BYÛþnU½YZ/Wnøo½—Ö”¨²Â­Uug]YËZ x¼¼ Bí³JûͺDXœwOœ¶—®Ú<Ç꺿.ì?ci†ë·Uo@IÆya˜ªNSâX|_”Bm*»/9?º‹àn†JökfÎQžÓ0¥Ë×Õ;—Ôëç½›wx·Ç5ax_ÉTdŸŒÀ:xZÚMùÒ³æKÏV‡æÜx©êÿ3Wëß%nÞá+7ÔíUUÏÊÓtôppôp03å{šrÎ S{{­¸p9ÍóQ7ÌÜ´·t(˜öÿ Œò¹€ôñ7ÿüo×qø_û§ø«O†~Ê8ˆ6Î!ÍìK¯t_y³þJº»kÒÜÕG&TÇüþbû©Ç'Dó3U¼YæÝËi1ìÛA¤Ê#rDˆ¢CƒÚü@y¢€ß“N›å¾µ›‹PÄÈòGäsݬ{H¿k+VçgüSÇ£$uÝ~µ¹SÞ^«Þ¿šßÚ›7ƒ9q\BÐ#þ¢‚Õ° ¶zØs%€(µß[ çÁj¿ÏW9:§¼Ùž±U%Í-ÎyÏ=Ù|êLãô±hq.ˆcåûJ}ø–a¬»xeøõouß¹”ÜY/ûÑízý ,Ø?ó£å OW'ŽØVŒÊ¸¢€öHïw¿87²iñrî9Ä?°DÖŠ±‡ `Þßòë~R¥îS¤¸{…ûC“ñ&xì„}yZ¬@Ö!ËÝúf±Û5 œ9]º–)ë ë°¹Cw6xcÓˆ¢z¶$‚Ê@œ#ôïÞ¦ãÈ‚}á©¢7vöTYÝ×QC¥PVØØ¦o½âݸ­Þº ¾òsîTudQXçJ3RS§ëÆzhuʧ¾Ú^—®ÜÔ¯¼­/^Q7WTw@UõÇ$Š ³òÕ/—?òByꨩ{8FÆ=û}Eõ͘ ˜z=úƒ—ý+·TeF^nAÀgŽÇÇ–ÂNkT¶ªŒ\»•]»•ïtmm˜bË Áñ#Áô„çˆàÛ>SÈñ¿ÿ9üW¯=âè¿øÿâ¿þê`觃hãã@pXÛ.Þ¿–¿yqøÞ•te­Ü險ç ç¤ÝTK ÁSgçNŧŽEsÓ~§¥Ã€Ú%Egnš­AµÝQ¹‚ó`RäB”î;ÇC4ƽ–¨Õ—¦‚mÓ@@Ñd"Ê Bú1‡RØëV[7†×†›ó±øPxl)œèhßSõ1]‰xš_Z 53å-/Ø3Ç¢½A°+Ùfü¡¬”2¦œFvtPd5 ‹çjzÜwÊw`#Ê@yûç!xR*/"rie¸;±qíX»E³3êØáàØRxôppäp8?íOt¼8ä1Y÷ƒè ªÕÍüõóÉ;—’Kײ=“f®Î(Ea Ç–³çž(¿ø”,/ŠïKoèŒqÖ‚(äÀgÒÌ¥(­È÷¸+c%ÏÍ0uZ!Џ*˜J©5VØDj7U–»¢te嬃ïq³ÁÇJ€4³IæòÜMut©¼rIêªÒú>Ç‘ò5OOºùY;3éÒŒƒ±²ºY¬¬½~Õj¨C³þÑÃþdWå IDATÊz•¤¡ÁoÜæ—ßäÇNóÓ®öŠsi>z½ÎÉDK‡!—•Ës—•rt™ÎB·O×o«¼¸›?C„†)n­qèmíðëçÕ✛ìT“39áÚMW³9‡Ò¸²c‘çØíÁTþ0õï¬Óu¾³¡î¬ón— ×”ÝÞ¬qT[wlœ9a_xÆüØ—ËÀ/v»& Tm‰Ònª$³iîòÜ1SP3æA®®ßѯ½£7¶˜ Ρ«åCÁécÑì´?.¨å…{åíÁû׳ºVâiŠ"^^ æßg¦äÅs€?Å0øµ¿Œï·qôÏü=ü¿|°/~_p°ª""½¹²•]¼R¾þNòêùá`hËRFN Š<…™)ïÄ‘ðÙsÍgŸh_ › ¥Týå({]ÜÙ ×7ïÒ¡Ò¿=P‰f£ÉbŸÝÚ¦aNa*î9×õ”4<”MJ0Ú¾%¤‚á,˜5Ú¨‘IêVnæÝ÷»[ŠN‹çý© o²ãµ›ªk"øL¾Çq¤&Û²8/Ö47óåïö–·ó¤4+¤i_!ÖC¥È¡»Bhû9w€,”rà1Ý×#péyåì‘mff¼Ó‡çÃG‚³'¢#‡£¹i/Ž•V£mûƒ¬c'RU²±S^»™½{yø×‡·×ŠaêêÆR"DLMºÃ‡ªÇϤOœ6K‡¸ÕP X'‰“¼p 83ÒÜå…‹&ój=71V’ÔÖv¬Q pãv È0qΡ+çF2íeéŒqŠ¡¨¦¿"IÝÞÀä¹kD*Ž eéÒÌUZsà#1;eæÌ¯2䜬mU+ëÅæNÕŒõœÿ̹FoÐ&ŽYNkü憅﹩1üðˆPUÒë›ÀcÏ£,wiæ¬uó3ôìã ª’V7)ÍïS`«™±N¤”¦´³Kï_W-™žÂÜ4ÏÏÚNÓMvdfR9Ae$Í]QÐ ÁÖŠÊïü·yg Wûë0–K@w5ß"|é´åÅçÌW¾Pž=i6¶Ì0µžffªS5e)Ij³ÌE!¾"ÂÍ;êÍwõÛj˜Pí;5¡O O ';#/å4³ë[ÅùKéÊZ©"†jaÖ;v8‹z4m|–áð¿üqôó¿úïâá:ÄøÄ8ˆ6>.ßL®¿¹ñê›åæ¶­Íj8‡ÀÃô„úù¯M}åùÎÙq|@ûʆo^þákékï5&›\zrº BÎcäõ7ÃÅÈ” ¥QÀ@<•0 ¨€çÃÔEù¥†1ÐmŒf.(J·±m®í¤o^Ȉ1?£Ïž¿ò…ÎÓg›§ŽÝ÷„Ô¾GmÕ\2O$f{ϬhFU'œ£àì‡HÔÅåí×_j¡Ž€Êùåõ³KÛ§,8½4?7Ñ Q1ctß¿Ãn¯ú—vÿèÕÁ…Ë©±2¶X«5.æå¹'‹¯|aØiÛNk_]JÓô„& (e¯oT•x)Fòd[û>×½>7µµ(Û7Cp0c¥(jÍS4c¥”† ?´inóaíà²BŠò.¹£±ˆÒeyw‘&:fq^VÖ4@ØÚ5+ëåÚfyøP°t(øê—:ï\J×6M}¯~Â7ïx§é# âyÖšš 0L\¯o¬“ÊŒæ…ÜŒùKÏàø’I3õòt}å!ZE㛢¢¢‹½]_‰ˆ HXÁ÷$Žú¡(¤T”TËm4vïy¿¿÷nn,çåKÏT?ý£åéãÆ÷Dk0ñÔ¤Vê.‘‡qÄSÝl(Þ¼ ¿þmo̬aÆüŒwöd¼´¶£§tc§xëâàÖÚ~S0Јùørx|9œ:ø®û¬CpþïâgÿÛG}ì/ã·þK´Ñï> Ša+¼u1¹sq°za¸Û屿9|Ž,Ož¿ò\ûØr87íûžDœ`u#«Í¯Ý*Ö6Ëî –Ö¡xj9j [´¡³ÊÚÊÌ#Ó@Ú¦þ®LTðð Ï]¸©Þ )‡0“#ˆ‚Œ­Ñãma_+;{æÍ ÙÍ;Õ7¾Ý[˜óŸ8Ÿ>=ú+5ÊXGª}´ñôZza+W™„Lâ£"ë¡ò¤²PuÊÝ$ ÀBUâ•dBûÝšlLY¦|«W‹è ¿¢t÷7:Œ-é묕¼p·×ò·._7¹v+ßÚ©*{w͘qhÎ:b¿øtqòX97-ÎÁSû,sèö«AbóB:-FÌ„‚)ËÝæŽ©õ1g&¼šr2R±­AP”v¸þÐæ¥D ›Qz¹{+ßìW}[é˜Ú ÑásRÄ;{Î÷hª£º}ƒýL>Ú–ì3çpá²KRÀ„Ííò­ ƒåEéPxôp||9ÚØ6Û»@’Ñ­;êúí`y‘Ïœ0Z‘³H ך4sÌ`†µ’¤Ö:!Æ0qØyžü‹?)-ÿëßöWV9/GÆx”Áq€ƒ±\T# pç`ì(‡q`1ºÊx©Æ#ðåìIûÄ™âÙÇÓ‰vÝÓJžFQ`}«¡8ä¹iO)(¦´p›»åÍUug=zë¢ÚÞe'Àó0ÙÑgOÅO>ÖˆB5V¹v3ûÆ·{ݾ©'àkš›ñ;MOz ùÇÍÿ?ñãDï„©_Â7þ'Ì<#ßOD µ=Øö®Yݨַ*g|bBÐô¤>²<}¶ùô¹æÓgϵÄP–»Ýnusµ¸x%yçRòÎ{É qe ˆîoÎíÞ>ÚYØèû½X¥ºD†FlØ¢Ei"qÝ.Jûļ¾4’Öæ)ûÇþúë÷nëþǃŒúµÅb- å’ffk×\_É›1ß¼“Ÿº_点ofÒ |V:˜ò—;þB¨&J'Ô„^"“ó¥2Ðô=ÜìÇ d¡Jñ=&W·W2œOUE™¡]¼Õµ‡:¦ë‰f¼÷}JíúfyóNþÞÕôü¥äýy–;kG©{O# Ýü¬}ì„yæ\uòh95aµ’4)°ÅVjcUŤ˜jˆÔ]Ìd S[T˜hi½Ïòx`*D¤˜”‚ã|§Ú[ï­ßNnmç[‰I º©[)í±w¦#‡’,ò=­yÔXj¬(~ÈãÐÍNËÒ!›çÜ0vöÌù÷ÓçžlÍNùSÞ³ç;{ÕöîÆPÀ7ïx·îàé³ÒnB±0¡–ßpΊ1âD”BÝÕQVÂlŽ/£4D„o½¦VÖTo œƒÛWz¹g½Ç?‰€ °–ÆJ\wŸž{þøácåîo<-í–[˜³?ô|õØÉraÖ[ÇLÜj(ßI3—å(J§5"¥˜zCYYW/}×»zSeùèFq¤NΜˆŽ,†¾WwȺZðæÒõ|d×ê´ÔÑÅàÉ3ÉŽVjüœ^?ƒØþüä_Àö# ~_ÿ÷?å)à|æ£ ’GÛ†z-ŸŒÁLOó3Þ3çâ¯~©ýÔc­Ùé þr­Œ”¥[ß*Þ¹4ü?ì^x?ÝÜ1OD¤5œ3ywr°zÄö¯ ÛÝ=?kq¢È2D@ª˜²gFt!>î9ß[¨ a"±Sú)¼´’8’NËÙDÒTÜ~»ƒª »=û­×ß}kØjÒ³7Ÿ9×xælszÒï´t£ÑœÐKÞ‘­<­ „FJ,RYÁ+jú{Ö‚8p)žOº6fÃ]rJ^ÙõSþr¬:K'5y£@JFLÝ$s{=³¶Y¾üfÿ;oô®Þ,ŠÊ)æ1‘ÁÓ˜è¸ÅyóüSåS§UuCbeP““C«!âƒGj¯_ƒ¼fL&wš Àíµ¢ŸXëàwMÙF?“¾G^‡ã& wz+½Ë—»ç-JcR ÓµÛ;õÊȲ¢i:fŒ8c¤2b¬0˜/£„c‘=wÊ$©Úé²§©7´—od7nçGƒÉŽ÷â3­®yõÄZqNZYÓ—®á©³îø’ìH#æF¬ÒÔÞÙ,K#Bâ…Š€aj‹RŒÃã§Ìâ¬!V¯¼\¾NIJ•-òè±…ûȇîÎöw3Lµ\:3´–‰¶;}¬zöñâ'~ÈÎN٢⼀± Âd[ƒHœlîVU…$s͘ãH‰ Éx{W¿~>ØëŽž¾¦éŽ~ö\ãÔ‘¨Óò8‘Aâ^~£ÿî¥t0ÅDJÑü¬úxôÄ™F¨ïýJð§Ã×ðó?+6ø,~ëÿûÿÙ{ÓX˲ìLh­µ÷>ÃßïÅ{/âÅ‘‘sV¦+«ÊÕåªöÐthZ²@к%K @B ¨1ƒà êj@²Ä«¡A¨iÀÂ6cW¹ÜeלY9D1dÌïÅ›‡;žiï½?ν7^DFÚ™QѸ*ô>…2_ܸûÞ}ö9ïìוּ¾oÁ‹Õ';£C<O=ÛxÂ(k™ sòXôå×eóq«§$õëÛùÕ›Éwßì~x#ÝÞ±iÎAp?§G<Ùâ…™`¡²ˆÔM¤ÝƒÇ Ž ¯Á “ÃÃd[ûR ÐV3^ø0pþÓ_‚°òXƒ þ£?€ëžÒ!þ²O „£³Áì|ý\cæÄÑÆDs˜æð,Yîßz¿÷Æ¥þ›—zë[E·Ï¥ 3XS“rfÙ½ü¬»xÆ[ð­ši¥HÑ|<—ºÁn±×óqŒIØWÀhÀŘÖq`E;x Ë«`zP‹ ×{®>.´‚8Rš‰# :Tclž“ ¶wéöªº}OÝZQ7ïÐæõ“aÍJiÉØéBq;NéB÷šSÛ9!pe“6cî=<ºÔÛ‚J Fà±§*hð1¢…îNzuµí¬¬^}çÙ½©¤ ÑCÓLEP‰ayÑ=ÅO» §ý‘nTY+=¶Ö†Q½Ü Æ¡«œjÑ8ô…„€ 5F!•uHCûo­@Å* 5X.vŠ­Õtõîàî–ßL!ù4xË3d Õ•ÎZC£¦H5ÈPCS­ EƒÄß]ÓYÎÑ´²VüÞ·öæÂV³>=i¾ðJ#Éx}«=þН™@ã±:½ì¦'d¬Ñ0LM×ǽ_K=Q„Q¨G_ "Ьû“K¼º¥îÜ£Û+je]­mÐúµ»£f(ü×eøŸR™"jEæfx~–æùØQbÑ/ÎûzâPŒ.å7h*)J) Ö‚ÁȇDÐy¸~W¿ý~põ–é÷ï§v¦'Ì/}yâ¥gëS-Sšš§©÷rïú7îfi:ü]0Ξˆég'¦' âiE ¿þ×àï¼û˜£ÿæoÁþ…Coòÿ_ñÔ³ Äçñf ‚ù™àd=>ÛŠÅ,ƒÔß¹—½µéÊà£ÛéÊzQRöáDÄÉ–œ<æÏŸöçOù3ÇÝÌ$×kb4ŒâíÒ0£•£3ƒÙv–´½­Ð Ƽœm€Ez GN´{ð49ЩÄ)Ä\„9ÀìÏDD‚Òç@ˆ@R­@­Â“-9qŒ/žq+ë´ºNk›z}‹¶v©7öeÅ$l¯Ýß8ÚœÙTõmM^/»%‚Ür¢H˽vìë €VT&! DXŒ§dÐäÀ ÁŠžÎ¦Î÷%>÷–’½if ^˜ô‹s|lÁŸ:î-𬟚(¥J…é}’1ödG€ÒHÊH*À‘ uü&=½ËýGvÅ"díb;ÛZO×¶óív¾Ÿq*ài4ìáŒÝ-y¼ÎJÁÈó{Xp %õAPpdFž9ë¯ÜðiŠ÷6I¾¹’÷­n¨—.ÖÏ.WöÛnu=¿u7o÷œRÔÐG·ôÿû-øšÃÎû‰&ê~4l5ô3gª»k‹N–³uâЫëÊ{£¡Y×/?[ûòk­SÇ*q¤XÄ{¹·™½ûaÿíú«ë…ó ÆàTKÿÌKçÏךqüæð öéÃ7ÿøÿÑcŽþüÿèo@øDgtˆOƒ§žm5 º2…|û…˜¢“)àˆ(ªªQ•åcÃ{èö½q¾«À@šó^ÛND@M¶t%¦é@@\`xj¾ðJÐîš+7Ì;ï«ë·Õ mß9Õ»ÍùõÀäšXÁ}g†2Kâ@ŸÐçȃ*½S«Ž¼ S*P(Ūáõ™¢9·yôÌÍSµÓ,_X¨W+Âhû}»×aB˜ž â…akצ9—‚Ø8¤ZE×b²^Ú=7H*1µ: ÍZ Ýjh­¡?ðžË B Œ¾x·wéΪÞï ;€[«Ù.õçfÍ«Ï5碯¾>±ßvƒŒoÜɵfèöð¾gvÛ¨?»Ì·{~øÜ "T#U«¨Zu蟒æìO6÷ÒK|§ç½£pzÊL¶hª ¡ Cn51ÐEªVÑy!ýïô|`­B͆ h%JA`“Ô;…S¡WÎC?ñÝžó FaÓdÓ”*eï%͹(¤S"h÷\š2³\ºRýá;ÁÿP§9zD(,·šúk¯7îó­çÎWÃËOèõÝ¥«ƒ?ú~ûîZ‘¤\^ÆG¦Õóâ/¼Ò8µÆStˆŸ¼ó÷àŸùû9úÌ¿ ÿ×߆Ú!ÿüóÀ!Ûø (/Ñ4uo¿—¼óAòî•þêFÑíùR›' pzÙ_8ã_}Á.Íóô$Ucê%®|¼+…”HجS©À Ñà=&ݰâgç+Kƒb¥ÏIE…<H Ó Ã®T-yл¢ ‘8¥0Â<(wwÏÈ)E"ÖÉ ñ{àŒsa@F¡µÒéóô„®DˆQˆÞK?õ2ÑÄ©Iêvm³î—åsÏÑÆ®mêõý¸çæ:kÇ5°n9%N³ @À]R)5½2®5µRñ@…‰° /5èS²&„™7ÝÍÊÝH¦'²©Š´4Eq¨az‰#j5tÕ ‹¤) gé§ÞyfM)Zá°¹À åÁÀ%)+¥MFa³fºEï^¾»Ÿìz¿ëÚÝ¢—¸ ÃórÐ2óSÝ·:=×ë³uR‹FÔ¨c‹wlìwÜdKkq¬ªUåYœ“©Éâô2®®«KWÔ~‡À9¸}/ûÆŸ´ëýìÙêÜLøúKMï¡?ðý—•§½>]¹®ÿ÷ßîóÅKÝDSâˆÒL:=wÐÐÓ9ÙÝwYÎJA«&Ja\–ÄZ.,/"õªŠ#Ô¤pò\]`¤Q½ µxëƒ@ZuT çAâ¡^SÆ``ˆ²œ½c°)cH+†UX’Œ{}—d¢”ÖšAàÊšùÞôåëáíUfÄ"`,//_¬}í‹§ŽÅa¨Á9ÞÙ/~øn÷ow¯ßÉò‚¡´üŠðùóÕ_þÚÔÑÙÐêPžRÜú‡ðµ¿ ùcùøÆ Ó‡Ý]ÿœðÔ³'S·Q¢°¼ºž¯îuÿøûé‡×²•õ¢ ΗšÏJM¦ZþõWÜ«Ïû/º8­•ˆ R°N´ÂÜŠõb­D!jµäÙ IDATZ#x ƒ><9­Ž÷°H yû„Œ€ØÓ&=¨ZÖ¥–Y:ƒ°'U%¬‘K%ˆ²¢ùÓñ˜š”·uç¤$LÞC–q)ë(ë9¬—,0«´†ç¨ó'qâÚ¦¿v WöêX[3pØËÙËrQ ärèE9P0j؆x¿€Ã‰‚¡¿ˆ”^ge}¬8$P7&gìîÀ–M&0ÓÀéVتšJ@ažhÁ0Ž£j…˜¥pRú[…iîóBœŠP#”ÍÕXÄ{H3Ÿdì˜S—‹M˜ŠÌg ö¹½–on¦ÛuY¬—«5l,(ÖðQë ã‹Î³¤g9;ÌB„!­D;I3É-³0«HÆP’±µ> ùÄ’K3»ÛÆ,ÇÒFs¿ãÞ»š,Î÷â^z¶~îd¥p¼ßu—¯'Û¶4ßÞ£ÞÀhÖáËÏÂô”Ô«ÜO°´3k%ÉØ9±Ž=# …!¢Ñ’!–Ë‹¢¢´Â¶8ë„™ƒ£ˆ°?"1¦ ?H§ç´¦8"(ËcJ7³’ˆk!Dd–ÂJVpnÅ9ñ\ŠñöŠyû}ý'? 6vT04§ L4ôçž«éÕÆ3gªµŠ.³];ûöÊõä[ßï|p-iw½"@Ä0À §âWŸ¯¿p¡V‰ô6ó‡xZ°õÿÀWÿuØ{¬±ñWà›ÿ;¬þóÃSÏ6ž AXÚ]ûî{í¿¿¾¾ Y~@Ñ>¾`¿ð¹ì/ü Ÿ\’À`YÁ"žEBCγsи¼ ¢©–´,yÎFZu³¤ávÝ®ñ0?"c>Eíœ fl-R€éH3kÀip”e“Jì@6Ä?ëV+` Õ"U-T`hl˜évÛ.ɸÓDC! RhV )k ÐhP ŒáJìf&ü U?òQ²£»—‚…‡¤AlŒ €‰Äc‰ÊÁ>·è@³ C Ï ¸²s[!&wvÝõ×`U£iØæltdRÏKÚ"39!¥ —4wqDÕŠî§I}£®'›:B²^’Ì;Z‘гú}õ;_¿÷–ÙØ÷aiÕõKÏÖ¾öʼnWž­WbUrDçä£[ƒoý`ÿ;ovÓLʬPi û—¿6ùÚ zÕŒÿg ¿ÿ³•';£C|6²OB`†[wóÛwó­=WØûëV­Èô$ñ{áL±8g+‘$)j¥ˆÀZÙëZ£¡ D!NOèVr+ÖÊ~ÇU« ¬…f3\œštý“÷¶—%5Š %\ È,˜â€»(`ÁOö±€- H%ôŸPñ§GúÆÒü±^£3Ë¡VTXî|oZ“ÑPXÎr$5šH©òu ôt8“p¯—÷V½ÍÅkð,vd >†\r ì'\x T€6‹ÈwŒ²Šïzætu0ðÕŠúö›ÝÞÀ[`-®¬«ßþzxk/žãK¾^%¥À:É-{ZÑýÒ†]Ö Œ7 _,mIÊZa³FF?0dx,ÌeŠ$Þ:HR®DjvÚLM(aèüêz±0ˆHž³Ñ€I"7oÓÕ[Áï†7ïªýÎ+yòXôòÅêÏÿìĉÅ8 © –tºîÃëƒ?ø“öwÔ³îþüÏŸŠ¾ðJãÙsµCÉëÓŠì*üÊÏÃ[wêùtX€ßüøÙÖžÒ!>+ÙÆ§¢ôÜësš‹g@£e²Å'óóçÝçž³s³NQ) @ÂI»ë'º^Ue°(@HçÜßëû0$£‘¢@µâê/uóöo 0Ä2bÐÕq`ÁvNA˜B”KPvŸ÷Œ;?%ØKQH^H&h†h46ªºTŽ _8ñÌDH¡!c0ÍÙ:að^’Ô#B%R± 'í̬J÷ ŸˆK„+ æ~ZD Ú°Tb–S•qf'bÀb n )™D½öÀ$Þ‹unàÀª=gB 5`¤fƒuš 3*Eç¹—ÛEÐ%6wPxÈ ÉË\ –þ(Cƒ‰tã@HeÈ6¾Pú»x– –ó‚óÂM„¬W©—ø­®Óí•ðÚíàÊum–-ˆ‰ VQ³Sæó/5^}¾öÌéj%V¤Ð³lnWo&ßü^ûí÷[»VkBÄÀàÜLðÊsõ/~®qt6,û¡Àa`ãé‚[ƒ_ý*ü~ï±7à¿ÿ&üÕù'<¥C<žB¶!øz"@ ÒTQ"ͦîœý÷^ËãH¼çNÿ~ aõMSž 8RÀ,ÌCÛE‚X:`!!§&ÍÔh–`2‘<’¬‚Ùø–Y§eÓ• ÐxFò ,8°1Ú»­g(rΠΘÆZUÁð\Ä@Ïà½h…QŒõš¾·YdyÙ­ œ‡AÊÕXÕkJ‘T±9£–v°½Å@¬BFĘ́Ã-„—#‡ð¾²÷Á®ô,T@à@‡RPŒ›·A ¬€€Ƀb/œ¹<ŽɆÉ'ñÅÐÓBòò|"!"‚ DÁ‚V®¥ŒW²$ådù¤‡6†…¨¤1ލ°œ[(¬äç9—•>a€qDiÎýŒE Ϲ×ó®¯×T£®´A„fÃ<æ^yÎ6( 8ºß½á+QÇ34ëz¢©_~¶>9¡*q›¹·º^8/,àî®ëí=µ»oz›ån¢ÁA$ì'œfìœä‡ƒJa%R¡$) '0H|»çz}ž?¢jUUþf1‹sâ½ €sb (qLDRÚ±—&,~¸„`4zi†û\ߢk7ô{—£[«A?)]aËß/¨VÔòRøÚsõ¯|¾uæD¬5‰@ay0ðï]|ëí¯»]¢ €V0ÙÒ?óbíõ—Ïœ®†9ÆÓÞ‡_ûøŸ×k°†ÿìëð«gŸð”ñxx ÙÆAŒüœž<ƒ˜hȉ%ÿìùâK¯ø¥y‡ä{),ç…Ä!…i¹h5ugàœäVò‚‹‚½H¥¢Â´Âf]‹@»ã-ë:LoÛdƒ*d¥oyE’ô{PqÛê~œC4êU5%zÒ˜ZE…Zýï$/¤Ù £(·œç2H9·ª•ºwaH€†jºZ;áΪ\îù"õàj˜™ÒÖAJHI’y8 ˜ChE`5:|¿„âÁ7«¡)–‰‡E+È8¤1#_¯Ñ˜Q}*>øIŸ¸–ã`Æ'„4>QH‹GBA’KhìD]G¡Êr.¬wnÈŒu­ú9÷C$„4c2p@­ê^{AõÛïÓ¥+Á˜N_½™•-W¾ðrãøBtv¹j´Z˜ ¿ù½ö­•|¿ã@8‡×oë½}zïŠ~ñ‚>sÒ//º© vÞf7ëš’Ì[+΃s†Xvì |^H£®=Cšsifä9{ˆæL¤ƒ­†¶NÚ]çâCÎgöžÀ ­Ú]½±­?ºEï|¨oÝU;ä=€8q„SæÅ ÕÏ=W{ýåV«¡µ&Ès¿¶U¼q©û'otß»2ðh¤?^˜^z¦öÕ/Nœ>}H4žBHÿŸ‡¿÷Ácÿ7~þã× CR𴱃 é'®ÛwYÎú³íüh€VCš'ýù|á”?wÊ-/rInÑ3!£! )  %p²¥ƒ`TO A "E…† ÕÐE!žÅPp$˜ÄpqÐÛ±E¿Çi=!Mìæbè±5<\ ø™•ÂF¨ "Ï¢5Š€ 0¡‘R¤5*bçê5*»‰€ÖЬ«8"B¥ ›˜ ŠQw×3+}‘*€ÆÒc D£ G`± J§ÑñôGe°È ªT¬(ð˜ÀJYTqßG[†4^ž.:û€"ÊÖn£(·_@~d|òeôèˆ!i$"A0qDJ¡Vè=Š  A`£®aÙÉ…hxxZa³¦*¡¯W-¢ºq—º=€AÊ·W3ë¹°ü¹çêÏœ®.Î…a@ÕŠzûýþåÉÚfžfà=8[»4H±Û£;k|rI//¹V“êUßlPH¨ˆ@+ `µ¢CA@D F"ˆ"Ò¡Ì*…õªÊ vNˆ 2€$Ã4£N÷Ú´ÛVÛ»fe]ß¹G뛪ÛÃ(Š„°OàÇq<êy’Ë8zxŸHÀPä2ZË‘a9 ʈm|–E~è€` 5ôÐ<=0„Ì@¥¥¬F¨Ä*ŠÔ¸L„J;ï8¢H¦& QsZ"æ£Ûj tû¾}-±V‰W‹óÑ‘pn&˜™4Sú­÷{«¶Óvœíõñý¶ºsO]¾®–Õò¢>¾è³œ§&¸’‚R(uíÇK† ‘ˆôÛFIt<¼<=óÚ]ÜÜ…Õ5uoSÝÛ4wVic›ö»¨ˆ€HHAªf^8_}ñ™ÚKkó3a£n Ëý^ÛÞ¹—}÷­Î›—ú×ngÞHÐÜŒyõùú?×xéB­RÑêj<}ððûÿ.üõß|ÌÑ_ú»ð?ýõEõ‡ø ÀSË6vv‹÷?J¾ioºñi×Òðc² "X^rË•âÂd1U§(¢±µ$KÐÇ2û~'hZ!"h[GãùÔvÖ];‡4§ÁBi“¶Ž}'f‚ç~ÞŸ0)iØäà—hz´—ß?¨rzøã ¢ðͪÉç#\î‰'XE2PŒ?¢ì*§Àk2)T9PHA ä@¡02(¼Ï<~¬)£ XVUŒâÍâñQ.ÔÈDBE‰”•ÂG>‡Ý÷¦_š—z­0JâÈ|÷-3 6 ÞZÉ{}¿¶Y|õõÖKÏÖæf¢—.Öç³'â¼Û{÷ƒÁíµÜ3B@aa}“¶vèòu55Áó³ìp-¹~'ëõ½µž¹VQçOW>ÿbýÕçëK Q5>L <¸þðÿ°5vî_†¯ÿW0yhú“‡Ÿn¶ñP•F^ðnÛݹ—}ûΥ˃ëws!;Syüx·#DÑŠ­óY.Ö•˜J¥‰uì\Ùk ”ÂÒ¼9/FžŒ%ÕˆHœçÜ ¡1¨”öDγ³’Y5…¡j“f¦ª¦¾¯$­Cª€B,*˜Æ’f¹G…>+J‰A’q "BöRX¶^ˆ0ih@é$χFOa@A­ÑÚ¡)diú@Ïâ<ˆ‹°× ={®1ó¾ÞN!È´CŠ @Ñàq¢ˆTŸù@™/±‘q˜g$Éùx@Zr ¥2æ¼íþ÷CbÈfù¸""±Ž«ºJHÖ‰µlÄš‹µì¼”¢¤²ÒZ. ³0@ž )}P Æ Ö8?ëì9fö"Áµ›¦ÝUhìì¹wóÁö^±»o;=átevÊ5øó&ö¬ úÇLÀÐz’w­Ó×j˜(Ä$ã­"ɹªù#A óÐîú$óyÁÞC5Vͺj6t/á^߀óBˆ­†ÒK?+Çâì÷Üì”YšŸºXm¥;ð)m[€*R¹¾ÏÊ<kð9ÅÈ;õÏòƒ›þg:ãQ<ŒŸ¢ó«€xðSáôL4‹€Ý¾ow]oà碉%)ïí»4÷qDMݨtzn¯ãaíhÖ"ZË…ç„A½®¦&t^p¥âž» Î;£Ãï¿;G@IÆ·VòõÍâ£ÛékÏÕþòצf§Â¹Ùpz2|ö|ukÛ¾ñ^ï»ovÞz¿o3E8ꔆƒú‚¥6›”†²ƒ®"A€²Ký}¯OaÏÀ ŽÁ;ð<$ˆã·•\eÓ“(€³'¢×_®¿ülmñhÔªJÁ¸ä"IýêFú[_ß}óÝþú–-»Ââè»á /×á˓ϯÕ*J>¹>¥h~ñ¯ÂÊcU/Á7þ8=á)âIá§•må<(„0ÄɺjÆ*  âˆf§Íî¾C*6¨4êªZ!çÅ9¤œd\¯I­BQ€åœ’¬µªUTP–û$cÏ* ‹4œ¦ÅW&£•ì£]»Öç] *Bb1ž  GPhp¨2·â@ݯˆ-OèÜÊÈØåâ±ðÈPÈÁ†¥!ÞÃJ'1h&Íäéúéc•ãÞc–û¼T"ò¥£Æ©:/ÞÃÌ„f,÷ÎI`­¡<ƒ°‡Ý"Ë™kUج‰\ôµZ6;%—®D+ëª(¼‡4—Û«Å éÞÝ(^¼P{þ|õÄR\ÕÑ9úوΈñgóî¤×路V²½Ž·VÆ)‰²`Ö1x;ÊÌR<Ì)3ˆ2Ì'>bå•‚© }ìhpêX|z9^œ‹f§ÌDSWbe4"‚÷’füö‡½K—ûï_KV7Šý޵î~š²ãòBô¥W›/_¬^Ž«1)ÂQðÆÓƒôCøk¿—ï÷÷8üÖïÁçOxJ‡x‚øé`cn1êZ¾¥µöݵü½«ý·Þï¿mÐîøñÆ«L4ÕTKUbR4úûw§RHÉð±)h$Â0 ZEi=,¸À²¸O!+qŒ¡pÆÈr¶NjÎ FJ­©VÈ"Ö•Oè½$)—mÛI²@š{.‚ OM¨'Ý®Kë’ð =jð1fLèÄØ”<ð¿ ‡E ^_çÄ:Ð ŠÖX«ê2Ø^þ»R)„‘5°ˆ†ˆ¸œ?³”µ®a@aÖ134jª)ï!MPsãH{…à£-6 Ý Ò`Ë8°ÜÔÑx§€xŠ…ÔAyHIMà€Œåøð€`\ÊòQý~‚fÈ6ð¾°öÁ-K4W&Íä±ÊâRåx&º]ÏÁ²L‡Â(Ï’2®E"(¬”Á` –¾pÞI–s¹b "@âéI>:ƒ“-ºtÅ\»©Ò ‹ÌÐíû~â7¶‹í]»¾•_<[=¾™榃ùÙàü©Ê©åèÆÝøæÝlc»Øk»NÏuú>I¹(¤ E yÓPTóñåº?íá‰#@’×J¬šujÖôDÓÌÍË áÉ¥èøbT¯ê2Úá½d¹ßÙ·ëÛÅÝ{ÙÛô¯\Ooß{ µgb³¦Ïžˆ^ºXýòÏL™j•êh©ÆÓ»ãçà›Éc ž€ðMø+Gžð”ñdñSÀ6(Îeò=‹w²»o¯ßN~û»ï_lîú±—W©©Dêì 52®Lè@ßS”[šoÐ…XÀ(ñ?t«6àÔÐóóãÓA|ÔfV8¶Ž Ф ËiÆÖI–s’zD„)£€Ðé¸ý¶k5t«¡µÂ½" i¢¥öÚŽEDÄy)rrE4U™Ïp°ç: × Ú*¦@ !Ú*%Nt!¥öÁûØôQƒ'ðϼ°@žËFb]l§ZR¯ªÀ|âM¼(x¯í”Â( ’¿ä…lîØk3¬žM3é'~áHGä¼d¹x±„ÓrRQݨʮÜÀ~&A¡†ˆ« € !ØXÔtÆ‹z”çCx¼‡£Fá(˜A÷YÚÁÊ€Q$F$¸Ô5 jni‰N>_?W3º(xk·˜šÐq¨6v<ÛÞ=¡A£`c+„(T3“:0CZ“Üí9¥0-¯÷’fÞy™hâ¹râXqê˜üæï…«ë´×kÙà ‘7/õ/];Úþòk­/|®¹4ת†êÂéÚųuç¸Ýµ7î¤\\½®m»m.㥊„ËŠ\~XŠ‚0Ø(…Z‘10=aæÌ¹“Ñ…S•ÓÇ«ºÑ#ë-ñÃð˜ßëÚ]ê}ÿíÞwßêY7lÑrð÷wfÒ<{6þ¥¯L¾ôL½v@{rH2ž>ð.üûþ×­ÇÀßùCø×N>á)â‰ã§€m<H¿»_\¹™¾ýAÿÝ+ýõ-;Hx "hÖõ©¥è¹óÕógÁOlÜ–‡å¨2Eíš$K´vp+3 X†O kÅ:!£Áh(,DUf'LR¡4ã^Ï·ºQÕ•HYËiÁýOR –ý¥HI^H–K– Ä4j&ªÓi²™­ô¤IPT!c’줴Ç‘ñs¿<ôÀ><.1èÔǶ:£¡^QsÆÄ@iÆq¨Œ~tÙ]àûI± zM•Ü.ŽBÉâ IDAThi>LŸÜë{…hªÊz)û…*D¾ôð é–Î ©Ú™)[ÛöÓ[veÓÞµl¤ ²¼Ò²*ð¥Xü0ÎA°ôþE„­>mxã``DÆ gü™ÌEÈ©éFgZ²8ÍÌT[ªvò\ÁZ)F¬-ýàF™ZœE Í9+D $÷z¾Ÿðô„©ÕT9f±`¸õb«.Ÿ{Î.õßy#xã’þèRr€ˆXdmËÿîµx©îDå™3ñ¹“•™© VQ¡zÍ\8­–ŽÆ_Î8M}’ù½¶ÝmÛýŽëõ}yÒó‚ ËÎC™¡$D¥0(ލS­¢55ÑÒS­`zRÇ‘ŽªÄT­¨8RJ¡0sVH’øv×ݸ›\¹‘|x=ÝÚ±ûçlµ…ج«‹g+/=Så¹ú‘é ŽË4žfHþî/Ã{íqÇðk/ï=Éýdá·ÚðÏ5ÿ¼'ñ$ð“È6<ü=pSÎsî%¾ÝuwV³ëw’¯§7ï¦k[–=”OW…Ô¬©KÑ©cñÒ|4H’Ž+z‘ãá±ÊHJ  p¨±ÙDÂø¯ò°æ`殺Ì,ÞsaE+$Ê:D†¶We6ÁŒ¢)ˆˆ¥­vj&›[!Å{f.‹ÿQ+Œ©ÚÄé)ut×ÙôSˆ‚a¹(ôGÝ<îÏÌ6Ê™ãÁƒzè•1‘qè•ÌÂR>Ý‚ubŒ€ë¤ÛwY.¥,‚±|"ÔÉ£+XD82¾pºrf¹zìh8.(9ÄÓ‰þÇþÃïýyOãÿôñ“È6Æ(£ÎÌâ<['Û»vu#¿y7}÷òàƒkƒÍ]Ç,F%šˆœhª…#áéãQ³®w÷퇷zƒ¨ß8ok³À†ä~Î>þÔŠððÎS¾«Ì£3z/yQªÿ%M}%&b Òy“P)Œ#4‹œ©ÏsajLD>/¤°ì½CCaH-Ôγ-$0`(qDy!ÖIš‰ñ…àT;9w:œM`Gݯ¬üÿØ{ Ë’ìLïœãîW>:"Ue–ê-0h´¡µq0Ã!mŒ0®H#ÇÆŒ;rÏ—XpE#±â‚†¡2Ú AˆipÐ@7ºèîjQº*u¥ ñÔUîçpqß{!322+"3²àŸE¾|ñ®ò{ï‹ë¿?âÉRdüãªJr‘@K]á…ò²ÈJQJˆd93v iB`-k¥Ê’ë«QV, A@Z3 2V†ª#nˆ0‰©ª¤?`!‚@ÓLÔš£ÖEwþ~qënv÷v/Πk¹2d¨”X§`4»5žÉÀZy8ÞH|Hn.ØåÅyx¤êÄ—e2;6ñaÙÿ-™xA bHCcRÒTÅtñ…ÆùØÍq + "JeY)ŒcR­e )PWÛqRY±NªJªŠëÜðÆ@Qr]ù=0YÁÝ¾Ó ;mm™Ë b¥êä(u¾ ¨,—•\¹XÌLÁÜ }t]®Þ nÞQ›4¢cPˆ,po¥úä~ùw?ÌÏ©+¢—/Å—ÎGó3¦ÓÖ¦j¤&MTª8Ò‹s@ˆHµXÞÉ}²ç[$cÇXa`‘²¹¸%÷v»ç6·íêFyo¹¼~;»u§¸³\% B=«¨Ekê4Õâ|ðò Ñç_K¿þ¥æTÛL ºŽn–Ÿ@ùìáàÿkøÏÿͳn†ç©pÖÕFQñÚfõ`µ¼÷ üèÆðêÍìæ¢7à¢dE hOÕGc Q)xëÝþV×mn¹Ê¹éáÕU梂ZmÔϰÝÓ$“´²ëµþßYPèŒÁÅT4…ˆyÁa8ê?ŒAc( HiDh¦*SX' ˆj7”u—œåŽ”ÂV¢Â€´F£•9'Ú`hê,¥ ˆ™ËK©äåÎ ÛÝ;wóíõªŒ¨Ðh5ØÃÒi|ËÞŽv·©( &¢5ª(ÐiBFƒuPUb4° 8„ $±ªœX ˆ¢!k¡ö^£1MT D!…q¤Ô¸y3ÕÃÌ 2F„ÐP«À€"9ˆ‚+Óáüœº¸ ËÕêz±Ú/·3î#”€®†"?|b €@ê’'µòÜgÈÙu­dïç‡^´ƒ€Ü8Þ$Ñi;ètôô”ž6óÓÑT;nä¹cÊÊŠ"Ð!ÖECD(Ž8 (M”Ö`€Ö€ˆHP{ã6RE•eˆBL…e)–ªëÑ#‚&@…l¦*‰(0£±¿c)*.J ‚7_u¯¿\®oòÛè÷¯é«7éÎ}•åÈ ŠPÈÖ6¿ÝÏ>¸š' ÎtôÂl0?ÌÍêÙ© ™ªf¢ÒDÅE!E‘2­‘p”ÞžE˜¹þªÔaºYÎÃÌ sî l·ï6·íÚFµ²^Þ_.7¶m·ÏÖ1;@£œIbœ6/œ‹^¾½ñJúÒÅxa.Hbãú÷ƒ>üÁ>ë6xžgBm0KàÊŠFc¾óœ µñöƒª’ú9( ÌÂ\§VðêçÑ‘Ãz…‰"=ÙQ>Œ\¿°µÑ0ÍKA‘®à0—·ƒ#;U(§T5QD FîëqwI‰ý–†‡n»z£Cû€Š§J 1m›¤$CÜŸÇòØ“-¢r˜V½Y² ƒ!ìtÓ,c%±k½¯ï<0àÞ× íûh×'‡]"ÃZN™¦(˜Ó aÚý(D^ÔìÉ JA’ÑÐã$¥êOØw±vMÀØÒØ",²¤¦Å Í{ͼß(úbæýF1H«a*.@Ñ5Õ‰&\ŸGð0—‹ù&“‰­wo-T­Û1K!âÁ?¨3“=_„C´EýOÆY2DFÙÀƦž4¦vKÍL™ÅY³8ÌÏóÓfv&˜Ö­†Nc¤”úñ& ç3É™PköO&Ãã<€{lJ]gÕV¸µÖ¦Í&¨%Bzœ‡¶;¢Õx·±íc,yôÊ1b„ª…dQ=F.Ã÷É$N±Õ"½M÷ø@Ó>m°Kmì–ûV!ƒ6IÍ9ÒÖ„E˜’öVÔì…Í^ÔÉ ˆ3¥+RŽˆ±~­ ?(°7Óùè••Š#ç;ÅNUyTeI1hdýFÞmeÛí¼×,³Ä9b«…IXíšÅ8éîð©t¯û…ø!ëŒ ~‡þÆŒ. @× ë™(¤(¤  :.7©ÓÖ³Sfq>¸°\Xg§‚$RÚ Ñx¨1Ãë ç3Ì™PÇ—O°ÛqöebVP™GmtÆAp@ð¬›ñiÁ=ÿ= !¶ŠÁ@ å0nMmÞ½€?Nb¥mgA:“¡‰3:,”©HYR®6Õ~µ¶°eh‹°Ê£b䤮 Øò±ˆ aˆ’Ä=¯œÌq¬ƒÂpñ\pùB8?cç‚¥ùàÂbØHt¨Q¸0ÕrgÇ­{§5^dx<8jã­?þò³n‚Çãyzx…áñü}ã32Xóx<ÇsfñjÃãñx<ÏéâÕ†Çãñx<žÓVÿÚãñx<çDð¶ Çãñx<§‹WÇãñxN¯6<Çãñœ.^mx<Çã9]¼Úðx<Çsºxµáñx<çtñjÃãñx<ÏéâÕ†Çãñx<žÓÅ« Çãñx<§‹WÇãñxN—3QqÞóHžB‚y_Üãñx<§„WÏÌÌ̧·"RJÞþ=Ÿa¢ñ_>ë&x<žgLþ¿ýáÑ+¥6DDä”ÖˆˆxĨš¥æ4Ž€„ÙO|š¦…ÑExØâúÐÌ\Uœ‚¢Þ¿1Æ« ÇãñœG©­Þàæ½åk·ï}|ëîÑšàq©ÄÂÌÔ…ÅÙ7^¼taqîak~¼¼þçï]ßè*kàäúZ`þêË¿òâÅN&appf.J»±Õ½÷`Ã1ŸhO/@DZÑùÅÙ…¹©£×ffk-œšÚðRÃãñx<§ÇQj£Û¾óñÍ¿øÎ[þ7?@D¥NÌ¥”™™åÍ—/틯uš#ÔÆÕÕÍ?üÖ®Þ[ͳàûZÇàÜ¿ü­¯_œ zˆÚ¼(ï-o¼õÎÕ²²ŠNì ­ÂÀ„AðHµ!"§ª6‚àÓ÷xŽ…÷øñx<â(µDHŠ´RH¨Onøë˜Ù±RDDG?©@’"Pˆ'ü\A£›€c‘èä¬;@'j1òx<çlr´Ú@"TŠ´VD¤õ‰¹”’c‡N+¥ˆŽîn Q×jC+8ÙÙ!¢£ÚPë I´îÔ…Zmóœðáþ%Ïg€‹SKÿèÍ_%ÀŸÞûè;7~äÄ=ëy<žÃǤx<žOÇ )`Ë®›÷¿°ôj ‚Ü–®\”™“S ÅòxBÛãyÞñ~çÓq¢žË··î_h­¼Ð¾$Ut.½hÎ"úñ½÷—{ë¹-Oð@çiâÕ†çÑüËÿù‡Ïº ž³Âÿô_}ùT÷ÿ »¾2X+lUB¼Ÿÿå˱!ýÎòÇ·7dU.'æ(âñxž^mx<žOÉIÚ6úe¶w‡nÐT­ªRÊxñŸ}áw.L/þ»¾óÑêMË>2ÖãyþðjÃãñœ-6³í›[wßœžAVÖQ– ]L/ýúËœ†ÑµµO6†>PÅãyÎðjÃãñ|:N:ˆ|3ïÝܼûúì«CÇè–%ƪýÒÔ‹¡6séÌ+ׯoÜ9á£z<žÓÄ« Çó)9a¹ÑÍw·”ÜÊmyšõ™=ωáÕ†Çã9[dU±1ÜîýÀL+…µŸ3T%9,&‹­+É…©…ûî7oo=(| ŠÇó<àÕ†çY""u=\ SEF…dF£ÖIBýfòËQ`ý‚{~ƒ½Ö…g'+Œ^w>Y÷¸gd-[+ϱ##! )T„¤žM®Ý̬^ÿÂlc6ˆ¬%d€ñ q•UëJû…ÿðs¿ôƒ;ï¼»rm;ë?“Fz<žããÕ†çYRk `瘄AD˜E˜k2%,;ÊãhûùX0àDC"`½¤~ˆHˆ„D€ˆTw·4ÑGUJ–¹¢x^Íû„ 4aRÐ±ÔÆ)’ÒÙO¶\™º<§æE‚ñ×DÀ9ÒhbÝúÜì˱‰¦Óö÷?yw3ë•Î9<ž³‹Wž§ÁÃĈ 3X'Ö²s˜Å9aç@X@öŠzÓ#8×?;ãõ‘ÂÕ7F"$‚ñ{ BE¨H è@?úHRU2¸áðy­%†(Æ ÖJ¡_î#OüäåFåìýÞÚМÔB“™œCÝ :oÎ7fSÌòþêåÞú°ÊO¼%çDðjÃ󔨅³Œ@8© 'ÂNvÛ6Xê÷; ã Ü'›°"H='€(#-Bµ"™ü:¶m Ö‹L@ÆÖObçx.aËeeK[V% * Q%m·PO³–Ýýîjf3¥PL¦ÛF+ˆ@Y½,üGŸÿoßúÑßÞ~ûý•O³‘çøxµáyÔ:ClÅÖ‰­ØY°V¬“‘õ¢vÚyfÈny±»ƒy܃Ž^Ǿ2‡# Læ\Æ‹'ˆ €˜$ PŠŽa×ø, Î:7d;(± Ò倢™‹$ôtÕ8€»ÝÕ{Íå…è…,æÑ}aÝDp ”ÁôËç>?—N½0}îwÞÝÌzÎ=¿Ž3Ïg¯6<§B­&^ãɰ•TW;+¶ë@øÉ2Q?NÏ?ñö€ƒ30;øHû((µ8åL¨Ljô'ó™•ÂbK)‡Öm£]ÇMc äÈÎûÔ.Åê`se°vaþb^ 3Ö’T'/f@¥ôT8έ¨17ߺûÁ{¥«N©Uç ðjÃs*ˆ€°°€µâ,×f gaì!ì„È™.zRõ׳íUVe8µL-*ŒGS,žÓgµ¿±2X B† ## Œ=r˜êÉ1D•èÆ‹x©5ê€îl¯ «Ü=ÇÑAÏg ¯6<§‚ŒÂL¤,¸,]Y‰­¤ªFxR?Œ§OÕÛpݬôX§me‘ߩg©i¯»½µ»ý•8ÖJAUí÷ÛØ÷^˜ˆT;~óå¯_ž:÷§þÍ«·¶sëñœ ¼Ú𜓓‘ƒµb-;+e)U%•ke2™þ<ôÕ£6Š-]>°Üå*q£ÏÓbPf·6î+˜Q*`Œ€,o‡þŒ¬"ÎÆàRûÜ?yýW^œ¾öÓ¼v»töYžƒÇãñjÃs²0‹µl+(K®J®¬8줖 Ï'“¨/2žý"»º~û¥Fb”qvÇcc×ÏgfPJ¥&½2áTÜšM;?¾ûQ¿ÌÜÑÞ'ç4ñjÃó©{ƒŽzbv\U\Rä\ä\íR>Ú¤qøäŠùëzÀÃ>|Ä\ÀéK³3«´»'?æ§i«ê•ëŸ\l\ (eÑ0ŠLÙɽˆÑÑR" (¼ÐZ˜NÚçZ³Ìr}óÞÆp{X§×TÇs^mxN‘zêDlÅe)U)U%üi:PqÀÕø§®€-ˆ¶ â@xduØ‘“0ÖÚ‹“àäU) ¨4 ªßÐó1±s–9Íë—¹òno5sÄ€å¹?Ôo£vÚY„šÌTlÚQ²Ðœþë›?úîíw>^ûäÛêñxŽWžOK=¬¬*. )K¶•Tå(õøïØËÁÁ¡€‚ËÁåà \bAØíWµ¶ ¨  @ T*ŠAE c‚³$8΂…ã,´a‡¬*îuWK)H €0ï÷ÛY;€pWˆ,!M'ͯ_úü\:õÞòÝûpm¸m}¬ŠÇótñjÃó$ìLÔyÇ-—¥9—;+Oâ“ÇÄ; \Ë¡€íƒ¢¢Ë ๱ Å×˨üI]ì Ô€ ´FÀŠØz[aX‰«@ @-µÚ@ ]¶ñŸÂà p9ȳög´T}¨zÀˆ0϶9,œUÅVÞÕ¹1QUî©á·;÷ÆgŽÑ"@4Ê,5gRͧs­™ŸÞ¿öáÚí^1<Óñ×Ïg ¯6z“Sn©|Ò]9Ÿn̵ÌÄ]çp¿qþûÉ7QÆB“€ÂÀ|õÒkçÛsï­Üúέ·¯mÜõµÜ<ž§ÀQjCpRG=þnÇFÑѳä$íž“]Õ‚Ý+ð€Éuxü Ÿ9Ì£"jeÉ#ŸPaÕ˜”º\6ƒròM¨¶ÐöJ ©&©…©Š*Luý&ˆÑDd"ÔjCÊ * …Tσ@]ÞD„… [v¶Vb+v¥Ø‚ËœmáÊœ«‚u Ž0 „P°`銊U"$å&¸|ÔŸâµà퀤ÔI['m §%t‚ S¦&™Vq ŸicDd¥¿Ñ-»¤ˆÉJ@–Ýõ~yœix\g²”G®D†á Ósí$OÛï®Ü|çÁ;Ýe®âñœ*°mÔ­cr'6„qÌÎ1מ„G>ÁF%»vŠ2ÌpìÎ^žD¹Ã‘x:Úáña†ª’ª’¢àª•†<ê1´Í _lÊM(¶Ð ”Ñ*0&ꨴm’6…© bĨ é•FÒ¨4B$$UÏžŒü6vŒçT›×‘*ÂĵþpÂNœ¼2;fafqŽ­e뜭\µí¬uÖ¹ÒB¾".õ”òm¨0f_ˆ^Bõ´« í£sdb7Q=ŸrºÆ ØÌúýj h‡ùjË™©FHq43Ûh-5f®nÜùpõ“{½µç%!…Ú4‚¸Ĩ±Øœygùú'Û+Ϻ]ÏC9Jm ¢"ž ž IDATGé“ß8fÇ. ŒÑŠè¨G•"ŒŒNî¤Õ‘Z=r—D¨µR'vj‘¥´ÒZÑ‘-§MD":©£<Ä1kŒív­*Îs. ® ÇebïbÁö![Þ-¬¶ ê!JÏšp6hÏ¥pú©2áã ÅÉËqš3ªyÏyßå=—õ«¬°®_¹™ä™T]–0x:S*L™‹~†Lô÷¼ÙbPf…+HÅ΋ c~"µ£ðİQLAe«(€ Dµë(Î6›­(9ךyiki.íüôÁõåþF·¶ä³1@@B2J‡Jk¥5©H£t¤ƒF˜Ì¦Íé¤=OkÍnd]¯6¸•U¥/è9Ë¥6‚@ÏvÚ/]Z²Îâúä'€YDdqvêââ\šÕ‰v’è‹çæ›ÂZ8ÑÇšc±Ì—禓À臘 Q+•&ÑÂlÇ:9Ú óXÔOF¥P)GÇRǧGíùï×UãË‚'9¿© Ø€þmÈW±êbÕSñ\ØY: :í˜dJ… Ô†t¤N¹¶;"" € •Òõİç„™ãrÈå@LcMx–’süý¢[ô—ëSÍsÈL€€µ cœ`'éDQ˜GßšQúÚiQj»îdæˆESiü3¯/\¼±þà£õ;W×ïm ·³S– )6Ajâ$ˆA›¸¥ÓIs:iD:µ‰ƒ u3§Ñt3nÅAëÐ(f¼³œÿôöïÞøø­»ßí®=ú`ϳã(µ‘DÑ¥¥¹V#yùâ98Q»B=²O¢°‘ÄÓ­£œÞ[ßxýʰ¬Km =Á6°À¹N£“D>¼#GÄÀè©vÓh-"'>t@Bj¤ÏÍ|¸¶:Øz7Äãy<|¾ ÏcP×C)r.K~ÃÔjc÷ Xƒª¯’4hÍF‹/™dZ'M6ÆyºÎ uÌ(ý†×‡òtü6Ê|=Û¶P 0ìò½˜”ÊÙ]cÂ$ýì3iÀÞ wú%‚8Pi¤æT Òpn®ª.÷óbXV…ef(+ë#Õf®ñÉãhް7ŠÚiTç™Ccp*ZI¨5(ZƒÑ¨5]O§÷"°@–Áõ;ù7ß»õGoýÕ­ý2óÆ6ÏsWžcQG+ץלvé* lA”=(6°Ü %:mÍÓœ56ÈD¤ÎÌ'wè5ÆY b—Ù’ÅQZCjoŒQþPœÔƒÝKE€ÇyHkÓÊNîÑz)Jç‚õNŒ À8 ÐX@¨º ¢"@" „qa8@M´+$´"M8Q(»މuÒ¸ofßx÷ýÿ¯oÞ?#®¬Ïq83wÏÙFXœ[ÕRC&Ù¹Ž½½W€+ êB± UW7ÚAc.hÏÍY5É„HþÛèy(R±í—ÃZ¢Ðº‡¥Ü8~î}Kñü¨Õ€R`ˆ!)Põk=ÇA4ùd<Ïv:T•lvÝ»ƒ¿|ÿú__{ÿ½•ÛŸÕó\áŸïžc1ŽzekÙ=®a`TÓµêCÙ…ª‹¶¯ƒ¹°³L3i5ί†çqyZ–üŠíz¾ª¹@¥e%#¿ äQÎzFA†IvQØ•~ƒeâÿ4NE:rø¨ãV&‹j« ŒêÊŽwUûyLl!;æÚÊ‚¨NáJÔÂh«k?¸Ýýîw¿ñÑOÞ_½½™÷ýŠçù« ϱ`†:ÇÆz¾seòUtT¤ã¦N;¦1£“ÏØ×ó¼`Ù­eó2V;þûRhìÓÁûM–Êaî,ÝWce—WÇÄd¶S;kf¨*¸úÉðß¿{íÿyï­Ý.\ujGóxN ¯6<Ç‚l%UÉÎ=Qw.¡êB¶L®O •iê¤cš3&í ï}é9N¸Wf‚–E‚M`'Ièn+Åxä/#ûÄ$-Ç.FíŸ1Ùpb&:QÇxµZOpm™˜7PF&±‰àØäÓ9èöøÚ-ûgoð—×Þ¹¾q¯|B÷lçãÕ†çшH=“b­Ôî¢Çß²þ\UçØ@ *ˆLÒÐIGE $§ÕhÏÓã)‰E'¼™÷ ÎE9µ×ÙBN$÷Æaë?ÞÊ'%5ê`×Í-wínïÛÜýö>\»3öÕðêÜóüñhµQZ›Wö42>Ô=Qd´Ñ òT×Bc–S*[€£´ÕGU!yjeW¸ÄO¡ G‹sòø†:* °C(»´LÚ Úó:n=ªÖ—çù@žVßgÙm潂 V\»SLL&v…Ý&›ŒLûÓr € 0b™ã|£ˆ8ÚóþðA€:O©àÄ‚ã GV8 WfÙîÉGŸt¿ûñ'þÑß]½¹‘÷ΚÌxXsŽÿx¬:Շྖ<òX»×?tåǽWO|v‡wŸnó‡ñinÁ£ÕÆæ0¿µ¾EH'^Ì1#À¥™ö\3}Ø:Ìâœ+Ê*Ë«“5QÖ½&iMqGªÝ`O<§*Ž9zMf>Ù£ïkÙÑëBëž(y¨0p®€jU—¨e’–i/xµáy\œp¿ÊK®Fq¬ûœ*veר÷ùdÑ~—‹qý”C—ÂaûØÙpÏ¢]»:‘¿Qëàúíò[ÞþÆÇ?ùöíwÎH•¸ýì9UÜ錎ßÚ=qÕ·OÀ¾ÛöÈcí^ÿЕ}jœŒžŒC¿pgïê›à,³“'±¯ˆ€+Áeà2 È*jê¤CA‚¤¼_½çø8‘¬,ÜÄ2u ”Ú1κ+—(ï6Ù0F™9xbí¨íJKºc8O¦LjÌîÞPözŠ Ž Ò~šïµs°Õu×ïdßúðÆ7¯¾ó“7ø )úÄh§Cu¡zÉø!)"²#ÞÝ"Mö£;w¸}¡~òˆðäíÃwû§³ç\`t¬=ªrï&4Jñ2nö$Àî,öãv$œÝH§ŠOtld;nã'cÕñ!ö´´ÛclNpø-€Ý§Vß‚Éþ÷"ª«_ŒdÇÁ³I§ºg õNGŸÚHbÔû'"5nŒ€‹cf7’2vUß‚»PßÍ·&¶Â[0rmŸïcÜ‚G«•íþ÷¯}bàä*ΰ¶¡Ôƒ­žeàð¾¶¶mlwV6êksR¯ed³‘€@YÙ£Wffç?fµÓc¢”z¤Ù@DNÕ¶GÕ¡µ#ÛÆ“ì\ ¶6C`ÒšL¤ÂTGM€§—§Ásº<­Û(%[O]ðž“Ú\!Ì€€uqW9UìJ0:6HŒ2sŒzò8eìc7@Ï¢ ³uÀ•°°"Å‘8'LÀ$9 ¶Â2—<ƒ"ã^Ï ‡œe’eœe<p–sµÇ5…TX+γ0ƒs"’ ]oXðp¸Ðßšb{à2¢2‘%*”δùÓWÞ\OOUm)e‚8Žâ©4nGa¨H©:ѳ«¬ÍŠ¢—e[Ãl3/+ç˜˸­ïQ†é K33Q(@:ðp £EØÚj˜çÛÃázoЭªÒ9a`y KÀ~j…¡ƒ´•¶_]hÄJéúN ÷¶·V··o+ç, ¸ñ„Jë°s~ªy©kD.«rpuy{3«Ja@ЦÚÍ sSmE†ÇV„}g'""®ªª¬(ûy¶Þvó2w–ÅÁH¢=ô™[7^‘ŽšÓóíÖK-ƒ@#[Ÿpk}y»wkX2[8x•É(•\>73—ƇނI;Ù¹j˜½,[ï ¶Ëªpœ{¬[pŒ˜Pˆ OZmˆ€"¢GX,¡öâ$DurЧVkõáOjŸŸUØ=nYù \‚ÍPJÒFÇm ï®ñ™ã©þ{þ¿ŠÉçoŒ‰ |ÇßBv–îxfÀ®¥» ôû¼1FO}f±…te{»›n°Ý-ö ÀpÙ@²dCȇP•`-تÖu^¼‘y£ªêCŠ8WëŒÑ_×è¡.–k:{°:6ŽÕàxæÑ"•JÿàüåSºõМˆˆ‘V*hL-½xþÒ¯¿zñç.Î|n¦±”©W–Åö°õîòoÜþÞõOþêNw»(Kg­ˆß:$ÔÊ´;3/þ«ßÿÕß>×yñFsq¶ô¶¯Þ»÷½oý»wn¼µ9ÜÌK‡–Ù1 <‘Ñu tмôù7~æøO^!Ô)€ToÿÝßþ›ïþè®õJ@`;šDD"¥‚xî ÿüWÞüo~ñB@@¹Ñ]ÿè¿ý£þå­ÍŽ€‚ùðÅ/ý«ßûÚ/Ð>Ò!°*ËÍn÷ÎÊêÛ·oãý;?¸·q//[fË̇GŽ´ÖÑâ+_ýg_ùÒÿ3ßG¾ýïÿ÷ï¿ó×z c;ž~ÚÙQ)ÝÐÑ¥ÿìŸþê?}méGÝf7ìuo<¸ÿÖõÛö“k?\<È –ÙÿCm Ö5Na&…¡6Ä=ÜGÇK#ÓÕÉÚ6èš;9»Â1Ù5»ù´©CQžÐ¶ÁØ!r¥”V¦¥Â„´ñV σ£atío!P'Ìyì›L&²'Nõ OŒ¸+O(rm#f ëÉp[²ž ·y؇²ÏEæò!åÈ0èB6À<ƒ2‡²€²[JYBUŠ­ NµKã¿VD$’ú!£5ƒÆ€Ö¨Ôh …X§@gÂâ —ûýÍí|XÉ—lQ²s>$R›jJRƒ‡{ž}úKN¨”2Ú4­ùŸÿÒë¿ùâÂWšÓIØ MbT ê{A:ÛJ¿q%¹´tî—>ÿÆïß¿õ§?½ñ×7V>Ì•ãzÖ‰”RZ)ş9)4Ú¯\Ž~þó/ûû?ù“|w¥_BYOÚ<ñi*¥”ÚŸÈX_¹rþkÃÞ›÷ß¿žÁV5öG›”RjÏ,0hER¤ÍØÜóˆhLµ;I’ž_\üêk/½}íæŸÿàýo®WòÂu ‡{æ#)¥B̼q¾ý…óѾ…çÏϼ¸<7u«ØfaÄ}ªer"æ˜ÙöUœ6¯\ çfç¾òæËßùÁÛþá'q·WÛ‰çÊÑø|žGãÜhÂî±·© ¥"­u© F¥Ÿ‰fò<ï ¢F…@,À „{;îòˆÜ,"l…UFå@•}]T™Q•Q•©¬Kƒmlð Y†)RäPä\`K`‡£ŽFCB D­ÉP µ¦À Ñd †!jÆ`’1EE 5iÆ€ÒÔVî¬þæÎ{ýÍ~•»ƒob!áZd +fÄÕô )äD.9‘RŠtϼpþÒ×Þxõ·_=÷sóéÅTp)DB LÐn4–:­§“v’,¶Ó?}ïö‡½¼[Uµá‰”RÊ­Õ±ñµ š&h¦ñâT³Ö¡æ·~ÒƒÂVµ?ÁžÞîà^÷?»F~¤´VF)Ú5âDltæ_½”ýóüëÛÛƒîÈe¡¾¤ŒQšˆv>hR¡ÒF€ÒF“¢GØšFZ4‚ šiºØIgÓp*TðwïÁÖ­a.£r˜ûúò‘\ÓAwο>Û~³½[-!¤³sK‹ ¯¤kï ¸ª=]x<^ºRJcŽ} @iÓЦ‘Ä‹3í†XRj{põ'=èV|PÀ« Ï£©gRžÄ¶l K*RQJ&öÕ×>k<-íHH &PΊs ëŒ.µ tÇ“Ç1&µÅ\…EI\*)‰­âB»\—=ØÔýuÝ[S½uÕßÂá6å}*3(2ª ¨J';ß~DP ƒÂÃÃâ☢ˆ¢ˆâH%±Š# Œ  C ÔƒÃê×0Ä cH)ÐÆ¡ÚèËÝ;ƒï]»ýƒÍvÓúì@&AbQŠÖ“ôn")¥ŒÖéÂâ ?ÿ…7~ÿk/ÿLÍIï&\ZÎ*W:$­)2:$P¤MÒYøú›Ñl3JlùG¯^í3çI+¥µÒ´Ç¬,E醹²L”­"£›ºQJÅ/½üÒ¯ö†Ýõͫל«ÝQQö5úÀ•9œNV±§*‘Rt`6Ý4æ§ïK:”å¼ZvàFjƒ´RûúhDÔ¤ ÕNJ¢Ý; «aåòñ  ‰( tª)Ö ¢ù¹¥_nÆeoX8^»Ëƒñ”Ûþ›‚ŠH›0™ZºøR§qù€Ó¥SóÓó_™¾ñ‰µ}kY\]ÿ&þ¡DDZ)M{ÎDªÊ ²Ñ-¨ÛIHZ«Èè†M@á¥.ÿb^ö–×î\—¡ãJ7åŸûžGã<©µR@,¸”%­uØ Wž'Â(=ßè8‡°Ûc·ÓÆ>G €Je›áöý`û^Ø{ {º¿¦jØ¥Ú¤Q ¡R™cm·"P ´ „0‚((Æ(Â(Æ´I6*M)mPšRšªFª›MÝnéN[wZºÕÐI¬ŒRª8ꤜ“,çïw¿±±ü§«·o¢¸#]¶Ÿ#?D¥´ŽM<÷õ/áw¿tù—öP\µÕÍ®®ïgÎiÓn%—ç[H'r$h¿|éòÑ„»ƒe¥»‘W"¬H)¥”Ò{3(ñÆVÿ½›[ïç6¹‰a…³æå¹æÏvT8Ú'¤oœŸ¾1ÿÝιŸÊÉt3íæ©i0ÎGc7Œz.åÀéÇ­Æ•ŸýÂWoîl ¶l­ÆëÓÞ™D ¥H“Ò$Š”ÚoÛàÛw7ß[Ü(\ý%UJEaxq¾óÆLôrsüHÄ §÷«/ßË«÷Ö²ëu´ ï”§ª•‚" â8½üÒÒR§qˆQ‹’¥Fû×/¶þªW,ç¥+»d"B½¥ô^¿Eîö³w¯®»®]Ò0 §Z‹síŸR­“ޝÌÍüî—ÿx%_Ë*ÇNðÑ=„î{Í(îéÉlâ€+$&¥(ˆI‡¾Ü«çÉ”¾Ø˜‹¡áJ=É~ã\¢â°Ìƒb;Ì×ÃÁj8\ò-“o›á–nèá–.zX©ª2W!  ¥@)ntÀbˆˆŒRˆcH›ØlQ«ƒ´ÚØj«f“â„âPF™zî[‘QÊ(h 4 F ×nGÚ˜a»ç>º•ýõÇWp÷ê'ÝU÷Ä^')EAÒ˜>÷úW~ûÒÌÏïtk’ ³Õ{Ërmë'kÃå¬*XÑ“ÆÉK—–~érû–â€@'AëÒúÅ•œ«×¶ qDª7Ý{iÜf·ÿöÕ-ºUUG“j¥Ã ššj¿ñ¹+ÿøBøùÖèÑ¡ÍæÜü áýí¼ÌÙ21Žr¨ ªQlmÝ7Öî8nºéÆ~#¿žCSL 5ý›Ÿ[Xôß·ê<7hœhã«…8NìÝåÜÜø~¿`¶"R[J’(Yœ›ýâå…ÿø•Æt@ Aûü7~kqå¹ã,;ÞW  I)4Ó?1:×8üqÚjF¯¼<·p«£›•Nì nB8$[¦ë ‡Ü\þf·X)+Ç© ›æ¯]þ‹¯O§’$YX¼/ßÔáSnðÔ!xµáy4\OŒ>áÆ \Õ&Y bÔÁA;§ÇóH1ÕÑ‹í m¹’:ÀÕVšó¨ÜËnPõ‚ªæ[Ñp-®ý5“mš¼«Ê¾ªrt%²C¨]2ƒHt ÂHÂT’&$ IšÐhA³­6Z§…#‹8Æ(‚8Â8†(@ !Ô„ "ÕoÐ[Ëxº|ÏéÔöúîÖröã[¾sëêÇ2[<ƒ+{ãY­‚ÆôÔÂ/þü›³ÉŒCÞíݸ·úÇïÝÿνޭ~>°V„IiÞ”Ýâ\Æó¿±¤‘´Ÿ{ùâ׆?¼Ÿ}”W‚j°û¢pY–[ÝÞ½­áfQÔ]!iÆýbZ¯µf.µ’PGöR^æ›ìê‹Id’¤¹8?÷ÊLë|+ž‰´Ap¶Êò|{лñ`íúfÿÞ ¨Fý(SEmå8ì`péÒ…°>üòî÷»2tLujŠ:CȾ 6ÎÃã\ûÇ0ËÖ¶{wºCkËúyŠDJ…w{ÅzÉæå_3—cBD0—¦¿zyæß®ä¥«˜ìoê` e’öÔÔâÏv‚…°¶ó‰]Ty`(D“Äó‹/5—¯môú®b¶ãà8ö‚ð@@fe«í^ÿþÖà^^XWç\ ­L°5ÜÔK©zmºÑ@  љ¦Ñ*…ÇàðjÃóhÆi‡ž`ÓÚ¶aQˆ”"‘¼mã³ÆSñÛˆu0wÎGóå æ1 \Ú^”o¤ý{qÿ~<\ ³0Û0EW—C²²Ea@RlBŽÛ¥œ´$iqÒ”F[’&$-H[4 ÑÄFš-j¶0iPŒ| P!P-#˜ Nç±c_{Š œHvŽ¢0öŸŽˆX Ëëå;·×þêÆo/ßZvÏN¬VÝ)ÒA2=?»ô[—“¥†¨5”½¿¼ö½îþovˬ°¥sU­6ˆ”Væþý"³Ò—àÅöÌ•D7(ž[zuaãç¦Vo¯KÙ1ì†Ù±-Ê2ËËÌ9+"DÊèJ†xïîڽϥ[’´ê”Ö&šL¨²€P…sÓ3/Ÿ?÷s/½ð• Ó¯Ï4Χ&$peÑôW¶7tíÎo?xëÞÚ‡½AåÀ(×>á   @8=ÿÚÅÞï\Z¾yïg%¦“°vñç£ÝîA˜«ªÊ‹bXU³`"¥Tá\uä;3£Öù80€83Ó~ñÒÜÒOÖzeY:[¯?º/¤”2I«³°´ôJ¤; jûMw}p ÍvGO§ 1ˆLkî Óéû«Áí¼´D(´£|wZ»÷äÙqUTe–—™µU} ´6,òàþúÝËÍui4"¶)…th¢Žýxµáy4O¤3&0ˆ@ B€Ò>…¨ç XH§_º”¯®4?¹ÝÞ¾ÖìÝI÷£ájPl›²¯«¡r¹ E$$.jº¤íâ–kLssÚ5g\gž;ó®3YH›„J(U¢‚R GŽ¡{ÜA&Ù<÷¦ë€}N${Ó{ 3tûòÉJöw7nýŸïýÍ©_¾Ç£vaTJé¤=·´x髱šHšFO IDATªîïnü¿W76òAQeUU8W‰8@$ÒZÆØÍÕkõÏuþ¡Ñ¯…µ õ¹éÎ/žoþÙ–uNèðþÉ9WVUV–™u%ˆ)‡¤1­ËdÒ9¢BA RL„¦yá×¾þ¥ñs/þZ vØUÍ„ÑÌôìëW^ù'+·~òÞ;ÿÝ7¯}ÐÍ{Ì£ñýAƸ>S…j– |iiFùÒ_¬äƒ zò°–?q•³YYfU•9¶ŒHZ…,ûÁÕ«Ëw.ÛóÁlÝì´‘Î̾÷3ݵ ‰„G“/Š”RáÌLû¥+3@Õ>>"|ûAÿ-޶9ýZL@¨Ö×o-Ç»•U¨<2rDع²²yYf•-@I1DùpXUC®§Ç€U¤•Q»ç­ŽÂ« Ï£‘' HoÌ€jµäÕ†ç10Î%U93ìÿB¿øt£åoÑÚjÐ]‰³µ ì™ªO®$VÆš¸L¦]ÐpQÓ&íª1c³®5k›s®5ËiâƒM€¡À``ˆ4"ï¤å€ÑÀO‘'~!»Ó’ÂÄÏp2|•ÝÚ:-)Ž£sÇyAêê£CX+ݾ{ïFÿÏÞ÷ÛŸ|ðt¯è1@@$$E*œžnœ?×FÉÉÁ9׿·zkmëF–åå°¬†UU:WÕ9W‰”S‹C¤­^ò·×_6êµ¹Q/ÓnÇç–Úí…XwØC ö«p<ú©]|É9' JÇ ãI//ì˜û þöެɎ+;[{ÈéÌC §&  1s&»ÙT“­–|ån[Š«‡Â¶^ì¿ø/øÍÿÀ~qH!K¡pKa+úº[êæmŠlNÝœ@€ 1£PsÕ9uæœö^Ëûœ¬Ss¡’û|(u2wîÜ™'÷—kë[¶—.ü‡×^øó3c/¤J:õ ã/ŠÿUˆÿãÃ…ÿ²ÐlìUª‰@E×ר[ÿaÖ¶€1/Ÿ?ùŸN¬Åš>jÅ}ƒó‡!i±ÒQ¬C¥c"dŒ!"0àa‡7«º£KQnÄÐn§ìôÅœ}µ-#³b‡À¸ÉFvñD1÷ýŠt D…ªsµÞ¹ÒQ¼V%ãJfÁgN”¦—j……V¤…Fѯt@ÿiÇ%`Dœ D B¸‚§øÖ†ˆº¥!:ò"ûm q8Ž+íY!Ó_Æ÷]ý΃ƒL“;‚¶ƒ†ÄSo÷XÌ„BßÄ#¼ D ÀÒÚ‹£|è|¿tJ~wÊ÷/’œ‹™^¯ñ°ËuÈ ‘K-œÈ-Än!ò qº§G¢ì˜J—tº S9r3à¥ÍOæ8LJÆ0 nVØZe?o£|Ú™ôk~A³­o/vÞ¹}ÿƒ…;÷kÏŠA?CRpé•s©™²cõ¾´„×ÖZ+õÎfÄ*ˆUkÃ68 $Æ—]¿ó`©YqÆ|ÊN{¹R~Ì^ojðùžoÉúqÆ©·pÀmÇ­LL¤ÝB2N*ŽÃpCó˜Yé|aúÄ©?==öBÙ+J€n£q·Ú¹V ›–ãUŠé “Ù1®íæK£/^<·¦š]õv#f\ì« ]­ù_´Dy¬|Þ…¢´3¹â/MЃ°±If—=n@{º‡8!’B2V¡ºgÒªD2h®úñZ `Ø“®pN¦íŒ-9ãœqè—5á\ºùÑÅâ3îpŒã¸^¿ÝìÞkDY˹§<‹90ÎS££Ó¥õ9o½Kŧ^áÁ}o¹]— ç¹:Z)OæSeÖmh…_°;dC©½’.M§Ý,·À«¼:Sk7ÚŸ~H!vfØÀŸä7¡o7†=BÊ×l4¹ä9SšËôíʩݾ¸ÛXï~¼#?XÓÏ¥è´mœ¸RgòÙ—+é^ë±1‡]]M r™ÜÓgO°NTW1’&×ñFŠÅÙñ±K"ooµßWj+AÜÞaäº?†lcˆÃ‘ˆãŽý\d‰‡ÝîÔ°!À¼ÿJó}$8¶—ÚÃ0jÕ|¿E.ÉTQ¦‹\~s5ól­2QPê´§›õ‰V}¼Ýo·Š~7ŽV §óNfT¹Ó k²fO¶³3Af…êå€|m¶âL'ŸÍ>{¾TÌl9$FdgRù?8ç÷U`\p{ܳìÎí‚›þÑÉì¯6;×ÛBÞ;îC"ŽÂŵÚGw×þóµÅÏíÕn7Ò¡Ò‘FE ‡lcˆÇý¥Ç!~/Á-ÔcíÖìæÆùõ•Sµõñv#Rkß²V3Ù /³˜/<È—–²ùt¶c9ÚMæÇÿpîÙœ^\µº]2B¥€þ#š±ž„"y[Dê‡1b&†±#Ja29a[S=#éÞ ¶ïHÄA?È={PÓí´ßØòÞèõªÜj#þ|aã·®¬uøxÊ5¶@`än4ük¾.¹Ð«nÊ'¦ò•…jn¡pÁ¹@Ò4H6Lò,·\×›;‘/eìdŽ Ú~½Ú\µšÄ»ë#¾=_÷úúo;Q[kc×Ý‹°¢Ví Øìt×›ívF¨˜àBo¯© £8ju¿ì¨Í‘¶Ô‹ƒÖ¥ˆ:X\Ú¼)¶¹í֑ܵÒ1@\[_ÿò†÷ÞÔ©ïY΄àìçæ„,õÕ^¡’rœ !m;SšöœÉdSGÝÈ¿ÞR¸O7˜n~,_ü£qVÐt{…ìÙ”7:ƒ;ž•Xu<{æÔØäÝf~½iA„{›µƒZ\k¾ûéÊí¸¦”FÝK¤1±CwðÑí®5ÛõÐã0R¡Ò±FÝ×Ù‚!Ûâp0öP¯"ƒ{ÆqbÌdJõêC|g°çÅ$G«\ÐjÖŸª®žÙX›ÛÜ(]‰J¹’É-ä‹ ùÒb®¸žÎlzé¦ãum;‘¿X>—ާÖ7RÕ ¦‰ÆqÉ–GwÔxXïƒÄˆ l4£»›Ÿ­Ï·¢`ßA{<Ðë ’j6;+ë­ÆYÇf0!R££Ol>«ý{-žB°θ©S'\±0úúIo*kʫ՚þýÕNC© xoÔ‹ín÷îRõw 3޵VˆÊ $$DJéH«XcL@F½ª”V €I,QqÜZ¯¾½àÙ c­úØ€saÖ#ˆIk4[í%_w ŸÙõp#BZéüN}eÕþÕ½±QÎÇJ–`¼˜ÙÇŸ0‰áîyq.8—@Șj~®—™<11“K•égt[­;¾nk2ÚÎE*W¬ŒŒ>ç²ÜÀóSØVÖ¶ö(;aÙ©±Ê©üÊŒ[¯*E¤{^ã;ƒÎèáüríãz°FZÇHš/ÆX©(V‘Ò‘R‘Þ*¿r8†lcˆÃ‘¸kg=ÿP„@8ôýÎaH4¹Zµ›s›—VŸª­UZTùÒZÉä—rù»Å‘»¥ÑùÒz*JI}Ù]ÞNŸÎMŸK?µöÀÝXc Ñç»h‚½%É#w@EÑ x0bd"‰Þ¢§Òè….zé'´Ã{{ñ“~Òß±ŸÂ<¨gÔ‘DV¶å¤0BìGJA»‹›­»µÕN]™Þã S/•Iu[͵õê—Aɬ,ãœeÊ—&G4³y«­]Ù3.…%ít¹<~qvúÇãö¤kÈö6;WV»]¥Ç)„¨” ¨F‘Ò‘Ö½™ŒzSÖ£ÖHÚˆqÆã ¨ ¤µê¶?_¬¿³Þ t„¨Í1—®ã¸’[½£„A´­ì½mD&¼"6›µ÷¾\{:kÎYãrϸ@Â2ö»²Œ1Ιà\rnqŒ3.¥í¦rc£c¯žË9iÃÓ»ÍîÚZ}!R]$0!aËÅéJy’ÁC¯â éòùRö©œsµ)ìßîê-¡V*ˆân†Z÷ €[—€j¥tŒ¨´V»jê„!Ûâë&z»&ÁeˆÇ`¬Ý|~iþåÅ{§jë©8BÆë^z>_º>6q}tâ^©Ü¶ÝXì|=;:w.s[…ù»<ŽÀ¬ÉÊ2#;${Ê&vì8蟱ŸØbkÇ¾àƒ¶·“|6¨íØñÆnØL½¥¯¯¬~¾¾¨£‚ò¡—“©uÜ©¯V×~¾~zDŠr €}þÌ$“úîFû*<¦µ @¦NŠå¦*ÏžûËïÍ]p!ÅzÍA§öe­ñV- µ"‚mc´uP­´E~úÆ¢Ôä…™Õ^b-ôVFHŒº­¦ßY‡‘i `Y¬T”ž$ŽZk¥Ñ¸eq1RΜȺcˆ´Ž;+µúgü&ð}ŸHÔóà"Â0hWçï~0“©TrÿM~¿1;dºåLnIi!ç‚9ÒòJc'ž9wþ:›šr1†^\o_½W¯iõб .2'Æóç¦3»íAŽà]Ë\Mýl= Ø«,h¥‚(ꆑ«°Ÿo‚—‘4jM¤ñ!KZ ÙÆ‡ƒ3†Ç o0à¸E\1ÒŠ¸„½îòßw ‚°Qô7[sœ4t—@uᑺlxq4Þi¾zÿö3ËfëUGÅ5/½+Þ»Y_Ìj©Œ/--¶E¹²¶wº8ñL鬨߼ţ€!%-ƒQŠ$а¥·0zãø™È/úz ““BŒAbú‰M%‡ ¾—(2`&Ï%‘²=GÿÐ ±^i•$îb~*ͶZlÔ—Ú›r”¿6ôΉP£ÒÚ¯7k|²ð}g|:•ÊÌÌÔ‰ÿù?¥Ÿûbá½û«¯6W¤“Ïf+•×ÎNoº|)NïºéXGW¿X»ò`s%Šb­ú¨]Ç%ZÅ*ˆâ V½b"ÐçxHDýéÍ+AÔÊo,·Z6¡”G·m»RùÞx{½Ñ~w³·FbyéâøÉÿîå±çF¼<"Ò›÷Þþ²}e¾w›ì9Æ5D›¥"ÆxT¿vwm"þá‹¥ ãë"g&Ç~@V¶¡ŽÈ’2“ÎLó§Êù3#Ù ‹›6 ‘ZëW×jo¬Š‘¸°¬Ìè¹búÙDs‹Ñf»ûÿ}¸zµ®)¥õ– YvqÒ¹‘±ñÿáœw"ÓSÑ–+…©ñBåfc„‚=Q+¥¢(b(­z®*=ꄽkñ¯ŽC¶1Äá`¼gÕ|Œ]q0I¨5Èø“ñz÷ø«ÐºÍ¢Æ7z\"ˆwÀJ¿‘í*7Š&[ç–çŸ[žŸ©×,­×ÓÙÏÇ&¿¸[]Ëd;¶™àÀŽiË=™ÿþè%¨¯-xµ îÖjOTñ5ÙiºqïSDPŠÕýîfØ~RKfýB£VùÝæÒüÝ7ÇìœcýѨÍ—©TöŒç:VêÔdåՆ߈5 +å¥Fóùs•ÜdÊÎõ_Ô£®¿±ºú¯w6>Úhwt¤Q1`´×k1¡VZÇJÇJGÛÙ†‰!"Ä80cÁ©ãÎR­ñþ½öËg¼\J!™—}ùì¤ð܉•Öª“e— Åó3¯Ï¤gÒ– ßX‰ju¿C¤Cù37zËIšˆHgb}mõóéŸ+¼še£Ö®5ˆƒ€œóŠ…ËªWmNé:N)å•=¹åÑIZÅþg·V>XؼÑíKOÒÎŽÏæ3³}šƒQØÞ¬½?¿ññfw#6q Þñ9‚[N:ëÚ¯Ÿ´ iQdN®P)/¦–êmlc_ç¼û,Œ8£wâ¶±u ¨—ÜÕçàGÃm q88cÔ{)|È=YÛ°ˆˆtLh ïº] aµî²`ƒqÉı¥dž`Üò˜°ÉA A÷tuýå…»'7«q=½:>õáÔÉ[åñÍTZíU(Çær*]~*37Ÿúü®\[ƒ(ø0²‰m ÖËõØJITŒ '%Ø# AÆÜ“ ÚÖÔ $I?1Úa¿Ñ—w@?{î¥lg…¨A#ø*îªè«ï7£•0JÉ(êðúÒ;7³®”«<›‘iÉ8ãÀœ™‰ÊÌDåõ}Ú€ÀWª^¿ÿ«¥úÍvéµbLŸß±½QK Ö¨ÌŸm•É @ÌÔÑZûëµÚ'_._+O¥¥;fs~êD¥\Ì]œjßo+rRã…ô¥QÏ@JE­æÆoîTßYh·9c’ö’‰%#`•~»z-ó³;“'žòr9Ëa;·§~jÆ.,`£åühùÀAGÝñ;‹këÿùúêËZ)TˆÈ¹eÙîôôèT.)SBaÇßX©Ýiµ6ü®¯f €s!…­ 6…óE§8³‹Æ ÌÉVr¹—ÊΕPu"dŒíJD&Úu S{/Á10|îq88ýЮÖ0Šˆs¶M6±KQ±‡Ø‚úÒŠAÙì¡·HöMT°Ï§ÚŒ½wÜù鮎i ±‚•|R@ 5ªXG\ûë ·ßPѺ’ÿËs…³Y¹÷µÜÕÆÚÒòWçÿ÷kÕÐ÷udt…‚Â2Q³~±]?3€¯Ñ¤I+ŒýæÆÂý_ÉÙ–õ'c&H óÙ\>›»¸³}Ýí´?üíç?¿[}¿½ËµwöfÒ$@Äuk½Vûà“ù?š˜­ä¬‰£5 :Þœ¬üùÅ•Ÿ¾sóÿ]i-t¥ã^å6n9Næé“™J1ùzÒfÿ5_[ë¶[aw`Õ Τ”¶BäB|T;›‡s½ýì‰\ê'2?­Fq¼gz<“pàlgM_á…dÈ6†8_¡n+nw€3"@q4Æ„Cì n§Ý‘“™™§9ñLHn{Üz-øÝ±vÓ‹¢–ëÝ-\©L/f þ>S+9™ÿ8û=¯9½4ï­¬a¯®Æ FEH š0J¼7`—ýÛ‘±Âˆ`¿š+²žž£·#ä%áØÊ(Id"½£“©rÊX?cú¥ÉÔ”4nÍMÅ.›î'D5@Ìc1gÀjKW> ÿ·Zåûsc¯Lž/ÊÝÕÉ "ß_«n¾s{íÕO×67ÂŽù‘ °_ƒk­Io'D¤QÇF˜yðl&±”æQ¬ün»võ“Ïþ¯ÖÌâÙÊ=—+qænl"êÔ7¯.¬¾}{åÍ{›7›AdÒ;×Zi½ãeJ£YDB¨{—œ«Pøvmþ?ß*e¤ó“qk«; cSGz%ëãD¤µnûáF³{¿Úøt¡úérí‹õÖŠßâ@éµιtSÙÑïåÅTòàÔÝùVã•FÃï„‘Ä6€gBbŒˆœ‹›÷+W<#Óð2^åD¹r­¾ Ø&ì[elõ/Á±ÖÎÀm q88gŒ›Á‡Ý•·@zÄ‘0Éréøq’ï>¸´d*o*Ü:ÚÛããG)/Ž$êHˆ†›ZÏd»¶£wוŒWR¥ ùÙb4³¶’]ZàA@¼g­qt;ýD‡zo º8 åC7ÞÙ,ì. òøÃ¬Ñ#i­ƒ1 .¨8îøa­Õ¼½œ?ï•3Nѵ2–p8‘Ò:ŒÕf'Øhv—êÍë˵›õÎZ·ö$‡õ.¹öÛíõ7~÷ù|.UäÂK«Ÿv#߈èàk­µR, ¯VW>Uﴬ䧳ÞxÊÎÛÂŒ”êq3—«õ«µëk›·šÝn*Œ‰‚Í…å»óV«(¥Í‘ƨñ»›kJaO‰¤5»ãý3 IDATS,ŠX‡ûìÆMÙ\¿S°cDˆÊ÷;Õ«n«PqëþâÂÿó6},¥'8gb åÖj!j?Œ›]µÙ¾»Ñ\luQ©@©^9*¿ÓZÿõG×n¥Ý ¡{iýÃz§úQ(©^CŽEo[ž¿ù¯¸±¾àr`@ˆq§ÙÚ\ð£5R¨£Ú;WnÔ—G¢pu£öI'j(Õg’p ÙÆ‡ƒ ÆUßuà¡À ÛH‰#mH¾ãO,1Å92ƈl­½8¶PiÎqW|lÄËË<ï\X½—ž¿ÕML d±Ä£sï€ÄÞ‰P#1Þ€p1Ö÷í=”û;B¯Hì€nƒÛ&Ù::ôì4¶¼DÙ@À£—¡[ÑŽÞ+âF5ú $TD Œç‚ÒñçúÍ®´SS¥t%ã–]+%¢8n‡áÒf{¥ÔÂ(ÖQ¬B‡± FZoy3hÕm·WõAãMi !@i¥T©(ÖÆ1ì§ ÑU(ÐÌ<›Ö7¢z}óêíT¥”›Ê§*žtúaTï­öB+lFa¤¢Xõü¶ˆ1ùµ‹íÿsõ㜈”ŠbD*6ÞehòöQkÇŒÀʃ[¿\r-$0„JDZ —3(nÝ}.¬¬ZÒ•BrnqÆc4 %5t €QiT¦eŒ³zÄ…@GíÍêýŸ¾»"…-„dÀ‘´Ò‘Š£X±µ6—Þ}Æ–upíÎ5çÍþ^•êBhÄø7Ÿ¶ß–´VJÇQÆ*>b铇Âm q8¸`ŒïÎcÀm)`!!aä“ ¿‚dˆÇÛiDÛõ^&’V& çjëu/µ™J¯fò]Û¡í[¾0~æ´<,•>»Ý.LôuÛ—Àwk5úâø]z‹í¯cƒëÿÉŽ;÷…-ÁÇŽ£ì¡öØ!"Ðslõv`Æ€3&˜`ìøë‘ß.P±ºDRm¥Cuoû›w™àý唞WOc+)›MšÈLŸ 5)¦hÒ\ 0«ZiiêÝ8l¸4舀LªRáüJkaUpΓ.gR…¦3F>‚Ĉ›âh¨16ñ[D¥tl¶If\Óg@š´JiȰa`ZǺ`Hî)$kÉ™0E\ûn"a¸5bÚtOéÞŠ i†±Ò€„gus.÷rtý,™1AÆ´¡å(´³ÀØg6†sÒ$P)mšÕ&E£Æ„í?º{ölÃ~bUµïH0Yí}—½I&RéõÁ)ñÑvyd‡x|‹GÂݲ‡¬1Â+CÄPwtØÅ8C¨ßqˆ'Ë™ü‘±éFu¬Ýª´/.ÜMGÁõÑÉ;¥Ñµl>p^v³Ïž™Ä¹ê½üÍÏ¡ÛÂ=¢ØOÙ#ŠÐÏ­t’ž3ÛÊ Ö“qô·dÌ<Óô…^n ë$z'2‚*- ,[‡°å èÕ’ï«IA{R¦¤ý¥¥$ ""ÝË|$D­”ˆ—œKÁ½è6¶aRg±—Ô÷\@úA;í+"r3C 5)3ïG©£t ‰ö“)TÌ„’÷{E@HdæoD…Zi2ž]&  P£Z1.X¯º‚ÖF·AH¤ûÞÞ 0i¦”Ž9 0œÐ=ç10ÿF#°å†±PêÇ6hË2 IiDBÈ3h "äLí+D¥÷+"Ôš ×8ªäfcæ=s-*ÆúÌ ÅˆBT¦WßøJ èÞ0<Òˆ Ö`¨Ýó¨yŽ >bE7õˆ%&H„d\ÏpœwÀRZc[ÅmçQÙÆwµTæÖH¥èwŸ^Yo5&[uOÅ#öL£v¿0²šÍÛ£3•ôÔç©•ÛÅwìj•àûꩨâkòÞ8¸qbœli¹ÂyÙ†"!CŽZqÅç\0ƶ¤¢}¶AÔ·þ4…6¶ç}’ š!gœiC Ðã0>Ù×1ÒÊP!Æל1nVå¨/ 3£÷œ1û|€40†È4CÎúl“QæàÔDÔ#7ÈCÍ™ñŒ1@sîfK¦2DB¦ãÜÔ#ÙÛ€DA}³,ÓŽ‘\  Aq¦Ž8V†iЇ¨·è "öçòÞèS¼ßlo¬àÑKDá(lc,Ÿyùô40qœÙæFW°ñBVò}Í%9çŽmåséÊh‘3Æ÷ÒšóèDòÜB.m[cLJ I ÿ[îw¬ö✥eÓ‡CqhS»ûÃØ~lcà.="ó3± .ˆŒI‡Æaòºp¤ÞñØcÛEì8Î|¡l ¥FBL5ë#v¡Û=Q¯­j ÏýPfO8öeôÞ ±¼DÄ90ÆBÏÙ"1›¤íIúUKv$¶L2ˆ1Àm a†Á¸…± í™0)I ýÀF²#ôJ«°¤Ë@ÎË@Ù­²´ÆÞƒ8gž´S–S ÛßÐ5yÔ 331BÎP1ÆŒ§çÖXôÞד1! ºx±~S[eì; ÷B'ƒG~µ5oᤠPýHlÿpÔ «ôB/â ó9#fBWýØõémï6`ÏU™Þ>20Ȩ1$b`u‰…Ëöí±ÞXôVç¶?œ©ý0b¡£ŽU²#XHº:°B?»k[³´íÜ ŸÀžšùoøg\<º™Þ@#2 s“£Ž%ù>³Ž%D&åNŽ—<×f öÉ·:̶,éÚV*uþŸsnYç½²pfc¥ÔíÌ4jSÀ_ø£ÿ¾Z¸|õsõ«7âv—·UBÙÒC$âŒAÙÄ^z‹d›ÁFÅ–þƒvbÏwl¿_Ç’O·6€mÝÞêX‚½TÉË,tª_÷Õøš‘ ƒá‚zГ2™,ÍS¦÷»}¾åɬFlkçÞgÇy0‚îõYÂ6L—ú¢†~ˆeǺÇ1%tcÿžô/õ€f~°çÛ~GÛZÙãálà³=Î}{áècevÜÖÕ³èïOðˆ.Á!8œmT ™WŸ:Áû©G$" J!{áœ;Ž•g×±ûk²¦*Ÿco‡8Žã86oü–e±ÞŠ˜Àž¹¹¯Q)58— !cæç~}ÐZÇqŒˆD4¸ëÃPƒ éƒRJ)¥µNú¼c"’R !vté`®#ã|ðó0Wq"à9j¦5 6 éOªhnˆCŒ‡Â^È—Û¶»/=U=S];yâé‰?ý7äìoÞ>øP·;dVhí;wGŒ–¢àÞU'ÀÌglÀij~‡$òFÄC#ÛlI‰&v æ”|9cHƨ œ ÛÖmHú²eÞq3GôÄzìÑ'[ôâ«7õH0@+ºÑ‡êÉQ6¦­¿Í¯¥ƒ÷¢m}½8œmRžkIö5ļÍýชÁ9cL¤8wc¥òˆ;ÁzëÛšõ}¿ÕjI)mÛÎd2f ã൳¤DZïûq›ùžsî8ŽmÛ&z±ß¾¾ïw»Ý8Ž•RÉf&Ú!„RZ–e9øÖâû~{vØ(’Óét*•:¸K;À9œ%_ñEîu˜—Ä]YM*¥£.6“6;ŒB ñ$`×mÉóm'²í¸Õtfüé‰/­¿ü_ÞŠ>¾¢–‘3àœ TB9H÷°KBñ¨ôðÞGÜr«}̶X9•ñ²Ol*ì±ñPçû Îñ°=ùŠ=?Æî_Ó¿ÆKp8Ûp¤pä·6%˜wtΡ_²ü›À½{÷®^½šN§ÇÆÆÎŸ?_,÷ÛÒLðÕjµZ­nnn¶Z­(ŠÌš‹a™L¦X,ŽŽŽŽe³ÙT*µ£‘ùùù›7oÖjµn·›ð‰„m˜5”L&“Ë寯ÆFFF²Ù¬ëîñ’ÔívoݺõàÁƒååeÜZãÛ‚áû³³³³³³ÓÓÓ¹\nw#{‚1`œ ɤdá8E³™VÜ1⎊¢¸SnFñM^Ö!¾&@>c!H¦y~„û¯|ëì«ê׿‰7ªÄ9 ÕÜŠUôÓ: I? ¶µ@ÝÏ7 Hôâ [éµÛåwŒöCt}­ë‡+ì4€õ2Y /¡$±… Ø~À€3cŸšè†±>`À9”¼ôh*÷¼C1Äãˆ¡ßÆ¸råÊßÿýß]¾|¹R©À6â8ît:ŸþùG}tíÚµùùùZ­–,¦ig±Xøà7¿ùͧŸ~†ážlCñ£ýèõ×_ÏårGgæq)ÇòËàXYàY¬£Pu#ƹpvÅO$|JÙîs£sí†üõÝÎ;ÿ.í"¸ÝÚˆQl“@ôþ;¨‡Ø¡¢¤Î lïvh/`û¾»u»e»:¶Õ·½vì¶Ñ›å¯à¥~ïBC ÑÇmìz½>??¯”š˜˜ˆ÷©^E‘ïû·oß¾~ýú§Ÿ~úå—_®¯¯AàyžeY–e€Ö: à îܹÇq½^¿téÒ… Nœ8‘Ïç¡¿ Üh4–—————ã8>yò¤ëºFÃaT ›››QÕjµË—/Ÿ?~ff&ÞV%<ŽãZ­¶´´tïÞ½ñññÙÙYÜ^ùȰR©”N§U ‚1&³,®5PLZ¶zÄ&8ÓЉbŸ[ ­yÿ}v˜œòĨ—¿X˜ùaùÙOÞI_ý„Õj4ÀèE¶ô[QÁÁq bžÇ\\—9slpà¶–‚Y¤dB(ïÉ2Àx/ÞÀ9C$Fœˆi"†œ‘͘´"d8˜ê¶Å0`{–J?î2è28!`À%;2 âLpð¤ßÝÆCC¶±8ç¢ý¶ñ}uuõÍ7ßüéOººº†áÔÔÔùóçÏŸ?_.—s¹"A°¶¶vÿþýÏ?ÿüÊ•+ï¿ÿþ‹/¾øÊ+¯üä'?Éårƒ‹&¶m …ñññ¿ø‹¿5#Âh4+++wîܹyóæ»ï¾ûᇾüò˯½öÚŸýÙŸí` „°mÛó¼W^yå/ÿò/‚$ùÔ¨Dgff¦¦¦²ÙìÉ`Òæ6FwîÜ™3gNŸ>](Òé4…aX«ÕNž<9>>~ëÖ­[·n---½ûJE133ãyži“sžJ¥ÆÇÇ/_¾<==mòJ”RA´Ûí #¶¸yóæÂÂÂíÛ·-Ëšœœ$¢‰‰‰Ä‡£¯qá–eMMM½ð J)Xö0l#›Íf2Çy¸B¬œ3)9!Dn/˜r4¢À¸qC%9ifǨ”*fBÂG†x‚`sYv²OçO„'Úóc¼Ý6¤Ýý‘Rª^¯úé§û·»¶¶fÛö믿þãÿxnnnddÄu]“b ý„ØK—.½öÚk×®]ûíoûæ›o~øá‡¹\Žs^,¶&ÿ¥\.W*•-o4µ€b³"óöÛoÿû¿ÿû‡~øÁ‹E!ÄÈÈÈ×/#Éf³ããã;Bæ¿&fó°>iœ@$Á{yôO„VžÈ•ÚmÒÊòRÒ 8ždìúšŒzù×*—ÎÈ3_ÜLÿö=b'N°±^aùR”/P& ÂÖ>útTàC{S·ëQ§u›m¿u›‘?씼?acutT:ƒ¿/»™Ó¹Êó#s/ŸvtªÛ¡ÀgZï¥çØ¡Ù|ÍöÜш9l!Š)o6?ºì×Û*|¸Sbˆ'ÛÐZ#¢ *$ó½Ñ.$“¥Yé8øm8™°Íû=™6*°çöZkTHdFŸRJ)%µZ­O>ùäÃ?¼ÿþäää‹/¾øðÏ=÷ÜÈÈÈnh!„ã8N'•JU*“ƒ:¸ç\Jé8Ξ Pß÷qssóæÍ›W®\©T*/¼ð‚Y=I¶1ƒ&¥< cÀ¸=‚Är ±¯qÏA ¹`I¤Xi?hµA‡Œ éx‡ï8Ä‚ïžy©|f.5ÝnÈ™9U¬Ä1D ”"«sÛí Ûét»:ˆIkBMˆ h…Z“VˆŠP#oÿÈ¿¾¹¸Ð®¾»úålzütvr.;a)cŠ‚ñÏHVLÝ5ŠÍ"0èWiÙ^À%±ß‚=÷©bå“ûßÀ© 1Äã†Ç‘mÄq,¥¤J©n·«”ã`q·oC5Œ"ïŠÝÓ|D4ܤ°j­£(êv»­V R©”aµZíÍ7ßüÝï~/½ôÒ_ÿõ_OOOŒŒeè~0é¯RʧŸ~zjjjp%éí¡ƒsêÔ©t:½¾¾Þétnܸ199Y«ÕR©Ô Ûøš`ˆçLJfÛœ€”fZCOàôu.‘P¨@ BiI.ëG\¾­…•Lêåô‚Л<†+>‡`ÄËæÝÔJT] ÚMè^bbQÅa';*ôUêøàIßêú­Ø_šë~k9Ø\ÖçR#²˜’i¦-ØK„q<1ç,mÛ“é‚+zP 1Äw‡³8Va¤Â(Šbõuûì³>úhss¥”?ÿùÏ'''=Ï»téÒåË—ëõúƒ¾üòËV«uîܹ˗/Ÿ={Öó}ºT*år¹l6ËÓZsΓ0Ì£dØã8cccO?ýôòòò_|±¸¸øÅ_Kè;Œ%y({6»çQL®ÊQÖVgÒN @ ¤ÿþɈ9Š#â!tl×±\Çr¾vÚtDQÏö”gÀ8ÛßHö÷Û¥¶¿h..uk~s3ì´â`ß5‘Çf4cÂe¿¾4o7Vž.ןÊMÎx££ö¨ 5í¢~-jã®aÜ>ú. ÄvU”,kKYtÒ®°8ãøÍØ7ñÅ1ÌR¿uÎ6Â(Þlv6ëÍf«»Ÿ”áx "Êf¼B.#J°Ï>ûìïþîï^|ñÅK—.ü‰1Äâ #Gˆm(ÝéµÍÖF­Éø#f (޵²˜ï½ýlll\»v-•J!âíÛ·FµZõûàƒ´Öù|þ¥—^Êçó‰Søòòòûï¿ÿ‹_üâ£>ššš:}úôåË—f¢ÓéÔjµk׮ݺuëg?ûÙ‚ëºÏ>û¬a®ëNLLüøÇ?~öÙgÿáþáŸþéŸÆÆÆ.\¸ð“Ÿüdjj*Š¢±±1­õòòò½{÷¢(Êçó³³³…B!Š"Cƒ=ß=à E8t¬L Â(@óùüääd»Ý¾wï^µZM$®ISA4›ÍÝ~ˆèº®mÛ–e¢³;ÚqŒtƒ1¤@[ªXs츷:#‘ ê( Dz]˲ìk¶!i$­@iTŠTLJù" ‘ÅB‹GR(°H¶-lñÇNð4Ä#„"݈üFäG¨jQëL~}Ö›,ɼÃ@±8Ž÷ç,íÈ™lñF=;dC”üØú}Ù ’Ö+Í9í(`öU€H @kD¤_bÇKKKQe2™¹¹¹—^zinnnjjJÇñè訔r~~¾Ùl¾÷Þ{§OŸ6ˆv»}óæÍ_ÿú×›››“““/½ôÒ3ÏÆ8Û`}5þ£Õm°íSHÿ— VVVñûßÿþ믿þÒK/%rN˜ššr]wiié‹/¾xï½÷^~ùå(ŠljãxmmíÚµko¼ñÆ3Ï<óꫯþñÿñ… Ç1¹-fV|ê©§.\¸P*•>øàƒ_þò—Ï=÷\’/ÊúÕá“ ‰%˜¬¦*J»Ý–Rf2™l6ë8ÎÊЯ ¦Ø[±Xt§Ñhø¾ÏÜ=•Rívû­·ÞúôÓOwó!ÄøÃ×^{-ŸÏƒmlõAp˵€3`ŠP¡"b’@~…‚ @"P¬d¨­à $ç‚q!zú Ã=8’¤ŠìD)½—\²•ÁØE@$$@Ý'H h½­ F¾Šk]žòx$­cÕ‰âIE Õƒvm½Ûº[\ûAåì3Å“)Jsä;µƒÞÛK«$Ÿr–€©lqÔ˲'nÕ}ˆÇ{8À ¼N=®8œm òŒ¯ƒmô^]·ýžÙ¶],/\¸pñâű±1Îy†`Œ2ÇÆÆÎž=»¸¸¸²²Òh4 Ûèv»7oÞ|ðàA†Ï<óŒ ZÞ`Ö cžçŽŽ^¼xñÁƒo½õÖ­[·\×5%Ê’³K;ÎÚˆ?Lz‹eYë‘õ¨`‡YZRJ ^c'Z.—Òep˜Äœ‰‰‰B¡pp¾î: ,‡IK¢îªH)ŠbàØ ÄŠ)$Æ4䌤Ņ%, 8)çÌÔÜ2N¼ïl ÀÀ°/c"£Æè¯ hMÉD ÜIMèÈÇN°)¡ %HÇ…¡äï"Ô·«ÈŸom¼2vöTºÂ´…}·ÐÄxtÐ{£ãƒ¾-)ÆÁ"c9éµU@ñÜ0ÄãJdÆ0Pœw™Ç%¯@qxã1]~6òÌ .ÌÎÎJ)ý™þ]×››ûøã[­–±Ó€v»m2PŒ¢âܹs–eµZ­j “2;;;==íyž¥NOOOMM¥c y´–APf IDAT‡…‰¸pÎÓ³†ˆ<ÿüóþç¾Ã¹ÜŒáÔÔÔÔÔ”Iš=~8 @€eKÇ‘„+ŠuD„Àè@q/¡z6Ä€H"2ÎA)&83ɨ=—hÖ‹pìÉ6 Õ2LÉÄ05)Õ@0ƨû5©t@:Ôó—ùÛÃwQÚ* :µãUµÐ:™ÈÊ´Å$ï+6s0®e•Üôh*ç·"µ¿ÛúCÀ@-áþ¿·¢j¸u“!n…ÔWÙèA‘^îÖ›¡¿Ü©7ƺgs“£N!Å]"FÄpÐ{{ë°`ˆ4mU”u¤Mef²¥ÅΦ®Ê q(¶˜mçØãIxvpyåñÃcÇ6 …ÂØØ˜©¶cR4¡Û¶M}“ Q­®®®®®Öëõ_ýêWï¾ûîÁ±ß÷›ÍææææÆÆFGìX*•Êd2ËËËAA°cãƒ)0«µNŒÅ’Œ­ÈÈÈÈ©S§ÌºÏà^†Ž<¶!m),!-‰*Šº"'Æ Ûè}•¾pC<†ø½¡ÐÑÑçõÅ;͵?œºðÊØSOå&-€½¼7’'ÿÖ;'³¥˜ÈäÏÆ?Z¿â7­úâIÃÀ‹Ô¶0ª¡·± Ã_Ë ÇcÇ6LÁuÝL&cÞÚ÷dÉBÆ cDE®ëšœ‹J¥r”l‘‰‰‰S§N•J¥£t LÆÊÍ›7›ÍæÆÆF6›Íf³GI}„ ¢ ªÕj†###étzÇ™&uRÌ@ îøPù®`P(\ÇsIë(Ô±Šã¸NÜ"f³zÛ<4'ûýšÀ†x²@!ª÷×n¯­çÊ'_;›€ olóeD MpòŽ[Iå]auâ`ÜbOìLE lh}f¬üú©ß?u¢”öl!X²>v$#ÁcÇ6 ,Ër]w¿‚&°ƒ4•J¥‰‰‰?ù“?yå•Wv¨volVFÒéôÄÄÄ¡]23ôèèèää$4ÕÕÕÑÑÑB¡°CŒùµÂäúú¾¿ººA¥RÉår» YÂÀ¾µÆÜv.¸ìú~»ƒAGSŠx ¸8ÕbˆÇT ;qc¥«¢®Š.¦§¼RÖJ%ýÄŒgÉ’›.»™¶ }}Û§2Ä“ƒþmtf¤øŸ9?],x¶%¶%+˜¹`Gî>á}Î;^)êÓ=ñ8² £Ì8¸Êë`žˆ™\¥”…B!‚0 s¹Üìì¬QPîÖm˜Ÿ¦›çyÆlã(½€‘‘‘™™™\.×jµ>úè£\.755•DYØÝt8qè:^2‹‰è¢³¾¾Î9?sæL©T2m£Á¯s\Î9wliKˆqGû©A" Äq`üIb;²Ë†ýAOÊ5ýÐŒƒ•U¿Y ÛÏ—fÏæ'SÒf$!© ÀþöÞ5Ê’ì*üö>qùªª¬¬¬ªî¬êê.ú¡–º[R«i I´,d¼$ŒÌà †±G0XØ‹Yð¬–Á†13Ø –Àólì% Œy@Ò´@j!Ô¨%A·Ô´Ôê®÷++_÷qÎÞó㜈7_•Uy³2KŸ®²²ï8q"îÍ{¾ØûÛߦ¼2…””˜³§Þ˜Ýw¹×jWæVC¡UDñK)¼qx|ì™Ãgæ—–ÒrwÃuÌ——­´ì_¬`}UÜjÌ¢ä™äÿ¹sú*g´Ùrß‹o¯ªI’8pàòåËçÎëõzÞ.s-¶áU žjläXe¶±oß¾'N|æ3Ÿ¹õÖ[~øaäâÓõÏ(Š"k­µÖ+N®£œØO{vvöôéÓ—/_ž˜˜¸ë®»¦¦¦Dd»jq@ÅImtœ9JS—¥™µ©sd…A1Læê¬n‡A:¨«¨F…U‘©\ê-ýÙ™/ŸëÌ é'¸É-/ @¿¼ 1ÑäHóN,Í^è.n÷T¸‰ÄÍ$ž=9·¹ø}XSV[Œ–­6Åݺÿ¯e{QÞÞ›ŸïOdåoëcç²kZŒE¤Ùl?~üܹsÏ<óÌ™3gΜ9Sx}"W{`æ4M/]ºôÌ3Ï<ñÄ<ðÀ«_ýêøOxâÒh4<øÀXkO:õ×ý×·ß~û±cÇ<è×ûeü¦¥dY¶´´ôÅ/~ñÅ_œœœ¼å–[Ž?¾q-f6ÆXkŸxâ‰ÇúÑ~⟸óÎ;_÷º×:thãlÇFºÝî¥K—{ì±Ç{Œˆ>|çwúLÊ5…‚†Ž‚ë°1ˆ%ëÁ5X-§Ê‘:'‚¶dNá[¸18E œ6¶‹-i^í¢* u ± ’¢sé´ õå7[ªpã À’íu–.9HËöf{­»''õ„¢•ÞLÞ×hî«4£ZÛö¶{únä#·óªNÖÇe×Û(¢G޹ýöÛo»í¶Ó§O?úè£Y–½ìe/+âÞ£âüùóÏ>ûìŸÿùŸùË_n4ccc###×d¬Ùh4Ž?~áÂ…^xa~~þñÇãøÒ¥KGŽ9pàÀøø¸÷ÝBÞóeqqñâÅ‹Ï>ûìÓO?ý…/|aaaaÏž=ÓÓÓQ´^Ñ¢xDD¬µ³³³gΜùêW¿ú¥/}é©§žRÕ¯ÿú¯Õ«^åw#eª„IjD×MšÅ™µ½^ÖmeÝË"ì`âQ˜&LŽ@ÛH•|Œ[àR¸l® ÛmÁ¶‘-!G:K”û˜V(£º 9ôÄÒå¹´}¾³ÐsÙËöÞÏc C‚ýËû§0Q3N4Ç&ë#íV%­°Ê_ì¥êjUu*¡³ðu‚Výu£{]ûqw(Û¸V¨j³Ù¼õÖ[ï¼óÎ{ï½÷ÙgŸ}î¹çF£Ñ¸ûî»ã8&"éõz/¼ðÂg>ó™}èCÖÚãÇ;vlÿþýÞØcƒŠãøÈ‘#½^oiiécûØ'?ùÉ‹/>ýôÓ<òÈ¡ªÓÓÓ÷ÜsÏ=÷ÜÓhôƒ¨k•بªµ¶Óéœ:uêóŸÿüŸþéŸ>öØcKKKwÜqÇ›ßüæ‡~xUK’“ÔMRNҮ˺٢íöZÚ;o‹ÆJ5¨CÂ`¯!ÝÎÀLH…º¶…té<Ò9¤sè]Aoj¡õ&4 =ZªðF…u1—vþföÔÙöüwüëˆâqª3Ôù1ñD½>3º÷PsâdëÊvO¹ÂÍçÄËïå&‘”í8¶á‹6}íÆZ‹¨¿ã/ßý{q†1æèÑ£oyË[êõúÓO?ýÔSOÍÏÏþóŸK’¤Ûí...žø`š¦Dtùòå3gÎ|úÓŸ~á…¦§§ëõº7øRÕK—.8qâÒ¥K8~üø½÷ÞûŠW¼bÿþý¾á»?„^<ùä“¿û»¿;55¥yy5Ò4=wî܉'Nœ8ÇñC=ôš×¼æž{œ,Ô©þ:¸ÅÈ[õ>­…"¥þa61 hŽ«*'5—‰µ]ÐlÁ TTÉÄ!ÔÑ,«gá0|hµÙ¯3ï›–+%ÉzßÅ#$M28 Í`».¹”‘fEã<Ò`ß©¥1RÛs8Ûoê£'ë\€8¦æˆa²Ùâ¥lñ’d ’»Z§a;ÀzƒW¸Yª»Ø[ú½>÷ÂâÅ7¼kº1>V«%‘Éû*IdŽŽï;:¶ÿñ‹'¶yºnôËâ åñM„Ç6 ö°þbY6ªò[z¥äÌÌÌää¤÷¿zòÉ'?õ©O5›Íf³922²¸¸¸¸¸˜¦éÄÄÄ+^ñŠ×¿þõo{ÛÛü‚½ÎV=´snbbâþûï»õÖ[}ôÑÇü±ÇKÓÔEQÁ$üÚo­=vìØ+_ùÊ·¼å-?üðääd½^÷ÓöÇJÓôÂ… Ï?ÿüsÏ=E‘ßÅçPЇµvbbbffæmo{ÛßøÆ™™™F£QΡ”§½=Tc%ˆÈDÌLl8®%£{l–J–Ù´g{-×™·Y½žK{@¤œä¥+ LJÀ18G`°„èኚ‹:á­|=½°A„¡ÄÂeÒƒ¤p=¸.\¶×…:¨%Ç Ç±Iê&j Sc¦1ÕÇM}Œã:­+‘‰"61ikþ‚Ìÿ­¶ç7t¡Ô![„뛺àÛ‚*“²Þþ륥YQMEîßwëíãû§š£MŽƒëÈ0öÕ›c͸Öu™ì„?Ø ; ´¬T)D†ü»°üÁ¹Î¿Å»]}œk>ÒŽc333oxÃî½÷ÞC‡­jƒáÝ8šÍæÑ£G~øá™™™z½îKC}lÇ÷ÝwŸ1æÈ‘#§OŸît:~ßQellìàÁƒ÷ÜsϽ÷Þ»oß¾Z­¶rU>|øðƒ>¸ÿþcÇŽ•óå90sEÓÓÓ>º033sîܹ+W®´Z- ¿M­Vk6›cccGŽñÍ¦ ™ˆç¼ÿþû'&&æççkµšOúø·½õýY<833óêW¿úСCI’ ”Cñç>33sï½÷ŽŽŽÞrË-ÅÛ"‚1ƒ(6µ&€(íJÖu½V¶”YYb—w,Ú‚H5VÄL)P¢’S Šy¨#”³w1 GÒœgø`†a O5,$#É‚ðSz$=*؆ë‘tA "6‘‰S¯™ÆXÔ˜ˆÑÈž¨9aê£l"☮ViEEˆ.J­.l8HѨ©Q4ß÷ Ûžn]™Ïº‹iw)ëÝ#N싼,•Í(ÞWoN×ÇÏv滕ñF… ¢¬å7œ«T¦æXç¥õA׵ךØqlãŽ;îxë[ßzìØ±Ûn»m­:‘(ŠÆÆÆîºë®7¿ùÍÇo6›Æ˜¢ „™_þò—?~üá‡>{öì©S§ºÝ®· =räÈ-·Ü255Õh4V­YpìØ±Gydtttzzz­^©E‡³‘‘‘[o½õ‘G9þü¹sçÎ;·´´Ôn·‰¨V«ù†/333{öì/”u¹"233óÚ×¾öøñã­V«ìÈÀ󌑑‘‰‰ ošîS0E줘ªÖëõ;V«ù¢ÜÞ±á("“4¢‘nbSÉ2q"¢!(ãÿ‘ŽJ[ª-5Wí·W.àî[¡Æ„ÂO ”‡¯ €QŽ Q“¨A&E1›˜ã„£Åu“48®sÜà¤a’™k“²’I’½‡GU\zõ†eDñdb¼½B–kEÛX˜O;?÷Ì™ÎÜ¢íhL4c˜üÇ´'GÆïš˜žK;]WõL©°´Ú£Ðx²œR^¶?õ·,ïY¬˜ýÝJoz»Þ^ÅÆŽc‡~衇öíÛ·wïÞUÅ›ElãÈ‘#Ì<33S«Õ á…¿QŒŒLOO7 o0š¦©_¹''''&&šÍ&3û»ÿ•Kòôôô}÷Ý—$Éèèè:6£…†#Š"ß‹utttjjª×ëy=GE>°±wïÞz½Çñ²‡gSSSI’´Z-¿W9³S6|lctt´Ùl®šâñý`:4::Újµ:´b+AÆ3E‰I:²GƒjC]Ö“¬+i×öÚ’v\Ú–¬'Ò×Û“,SçVÅÁY…@•Ï(ŽA "2¾9=±a☌a³I(Š9Š9ªqœp\ã¤n’' Nšט Œ!6D 2ÄLÄàk‡r”ÔöNF'U¯­&ž8¢¨F7Û¨pu¼ÔšýÄÙgæÒök§o¿}bro£A€1¼¿1ú²}·<9wæÊ5Ó »¾)ÛÍ…Ç6<¸ÿ~ofµVŸRf®×ë333·Ür‹ßlÙ]¾oÍZ¯×kµÚþýûËûúåÜo³Ö¦¦¦öíÛWXe¬ÓjÄk8ü°###Ífszzƒ5&ÅïY¶¸¾?Õ!ýï8¶E‘7ööXg öA…pP >ðP„ ʵë »ê6ÒØlåáÊó_Ë£˜¼çL«º#¬$++±²5îÍ2Qqœh}T]¦âÔYU§â NET}‰@Ä_”"oR ð!A 7‰Až|0Ø0âˆØ1dbò\„# r †žØÓí¹Ô¹®³ªú²ÉCõZÌ7~܇ Hù…ÏF)7v›»cÏÕ‡©ØF… 6‡*´qíè¸ì« ÔÊÒ×¼}oÒ<ؘ˜H Y÷¦smª°…XÎØLhcÕñ7°‘:Z¼`z¬QÑ-JI,-ž7­XxcµÛÛ¨P¡Â&QÑk†]gŸ¼rº•õb2¯Údº1~ûØþ¿¹rÆUZÑ }¬$(ÿÅñZ?¾òq}òºÎo¾£ÏÏ+4ÏÕ+È7˜ê?6À¯bUT¡B… ¶¼°tù/|îÙ… ·4÷|ÃãIUü\áQ^õ×UTýCŸ_ußµ^-{™^ªØF… *l°èÒ÷½ðDÍD›öäÚ Z*ìNøP7ô‚Ù¯$gÏD/&`„œÅüy›Æ^ Y¼:—¨ØF… 6‡ªOÊæ`UN¶K÷Õõ¬P è“2ð€~b£„Bô3X½¸Ò!"· Uíû5@×Û‹ŒI}Úh‚ P²]’yŠjÉÍ ƒm¬¢©P¡B…êË¡B…mÁ:z×שm½½£‡ìäýéÝû`ˆ Ô7t–[êÈv®®Ê¨t*T¨P¡B…­Å2)y¸FB7¬¡EùD”¡×Ö°­píØ¤Kw… *Tؽˆ5j\]o´1ÝFРª+Ú]?ú®Þën¶¥ká².hëo¶E6œÃÖaÛ'PáæFõá©Pa‹°R´‘×Á*4VT£B… ׋]Ë62 ¤ª­©$@¢’÷Ò%ab#€(”QI°àˆÈ0€!Î%-ßîªÿ‡Š¦ÁN!Þ¯P€ þ–”¡%(û퉤P8À D€¡¡¿ïÕ*´X7µ¬eSà}ÅgÿS… œbLÞD( R½É*T¸nìZ¶Vn@TE‹{¼àÕF`VPîo6(”ý€À7â†ÏLNÕŠf¢EL†@0Zœyv"ÅiB%ªZ7v,nÐã»Hê€8TEUUˆ* ƒÁUJ… †ƒ]Ê64düšLy!ü"ð‹2C¼pNÑoÅ+€ u…D”¯ÞË£ÕÞoŸÁÈ0‘!Ÿ›"y2¾\úH "¦Î¯Z…†Õ®âæº}¶\5ÿ<#›)ˆÈ§PBðÌ×£Êí‹(ÿY½á*T¸.ìV¶V QˆRf(œB¢pÈïþˆ™@dBL A‰D^@°‚Tli• B$ U)˜ˆ†²*©Ëƒ.TÖR„B Tòä kѨJV†Šë|SÖêÀG”Rrª¢êTEUJ5®`&¼p£üY®8F… 6‰]Ê6VD V(È€€¬À œzªA e&fb¨ç !R&ãS(bjÀ`9ÂM*©gá9«€X…TH%”€5ÌX„Ì Z>m•߯°Z££ ¿G«nè?3«ñJjU­ˆŭ) ì¤Ìå8FñOÚ¨P¡Âuc—² ‹'`ëÐíP§Cݱ0‡…t:…TÁ†‰#Ä1'1j ÕêãÑ1¥Z¬Æh©a ¬ðCë¨R^ËK_ô€T*Iù>*L 8…KÉ:X«i½.z]tSí¤è¦È®Þ@çšgXaXå^m\¥ÉA’h³¦:ê ∢˜â˜âqLqÌì?+D¯û!…RPùPþ3V ä4g¯ã¨P¡Âµc—² €,€uX\•+teçÏâìiœ;ƒ…9X ká,LDÆGÚh`d££<>C‡éàanŒn9>löíåFƒ 4ꡲþL|A“ÿŸ(XC %Ä=*¶Q¡B…ëÀîf)æ[zîBöü‰Î—¾Üžæç¢¹¹¸×c°‚UIT¬ˆ±µØŒ,%Ízmq1v™£4eQ®5xÏ~ë[ !¾Mn0”¡¡-'è‡2‡N­6.ÏÊ©3Ù‹/uOžì]¼˜]¼]¼h»iâ´é”fØ“­° Ÿm¨µjSµÝØØ‰‰hÏD<1Ý~,éu‰‰ $‘¡F½üÑ"ÀB¤ %-E5†VÍT¡B…݆]Ê6Ò ó¸´€Sgq挞='ç.ÈR Ý®É46Ê!ò߾Ɗéf1EɬƒÉ2k“F<±/™ê$–cÌ•y¼¤Fð¶]¡8TH‚ÒÜ‚½xÉ]¸èΜÍ^:Õ;y²wúL:¿@ óñübœ¹D5Q5:¤5#LªºßÝ,®Yn{u¶á"µuuÆh/ÓÅv%01Á gåà4sÄÍ"3¸? §b¡ÚwV »ê­®P¡Âµc³ã'¾ IDAT\8Ó§p欞;¯ç/JšAÄ8M„#e§d…`U£¤V ²X\ìƒmæÒv»32Q;p Z(µ †²NÔ±tÒBá%Mä]@$J¢¡ùwælú‰ô¥“é©3Ù©SéÙó¶ÛKº½¸Û‹Æ¤!Ö,ûl£Z‚6Õ­`¤.RW#•ží-uzÑBÆÀ$§Â&‹&Åør*J”±ðPR…÷Œ ¶¹Õ[]¡B…kÇ.eÝ®ÎÎê©“zâwö,®Ìq»9‰£)%Ubqè‚©Æi¤6R!ÓÈY—ÍΚ+s2?¯‹‹8AmHW´dNʃ=Bsƒ¦~Q,«cQv‚vGg¯ÈÙsrúŒž=‹sçùâEc5²RsRSÑl½bCA‰ll4¥BkþG>¦cq¬Žq™K%åLæÝÈ|Ú¼,£ãñþ)tSrjh 8¥ …äÂã\‰ìMe*žQ¡B…ëÆ.e¶\¼à^xÎ=ûUwñ"ÚíÄD¬‹Fˆ Ô÷N!"bÉ!au,P+È,Òí6æçpé"ÆG!ãˆÆ0ZîL©ÔfÕ[«»àžÞ+Œ-³ÜéšÅ¥hq‘Z­¨Ó‘^O•c¡œ'Ñáè;Klc(ãíR„؆ê0ÙFÙ¾Þ""faÉTº6ëf6ud•%dM¼å—(Ôò‰`Bä s¹ŸE©Þé *\v+ÛèèÅ îÄóÙ³_qÝw{I×UX„D ÞØË[G†Md"aµP…ˆsk)M©Ý¦…y\¾„‰1Ä„‘ÚçHË!€¡FÆ–¶ô)vUÀZîv£¥%,-E­º]¤=P!ŽÈDLÊ* áŠmì$hÞœ¤Ì6®–+¹Ê–â›+ãû÷1ÖÂu­íf.u‘ÕDñ,Z÷©§Þø ‘—?Wïo… 6‡]Ê6D`¥–ºõ,¥©S§¢ îàAGP‚…: ©FPuÖØŒÀ¥Î¤g)l.ƒÈPg™§M4¸+奉0@XI ^ê¹I‚¬ƒ1¸°À8¢¡i8*ñKå 2ri lž÷ìòÏPÈèøQ˜Â²GÞ™%…É2$õÙIh„§9¹Shaa9Ì%®?åA¬`tK~Aó ïî܃b¸µ¿Z¼Ó¥quãÉ©U·d1)”©Gd J FdÈŠ EÌÌ¡OŸ¿ò¤04=ÁPHòüç݆on,Å—ŸÆ³Ïâ¹çñâ)œ=‹sçpy ˜_²?b#IÐÃþý˜œÄä$öÀÌm8v ÇnÇíÇpëäÍ}Eº—ðäñÔ—ñÌWpâ%œ< qi‹-,÷fÔG01“pðÄÁC8ê¯ÆŒîÒ%¥ÂÕ±K?¢žmp/ÓÔRêJXn™@œ›+‚àU(‹0@ΗH£T¢Ìr–’MálÞÔ}  P _ƒ¹y´jþ€—bø\O¤¬ª2(×°£„^nA·‘ÛRCT¨ 3³W æ7¹Á7 ÅÝ·ïŸK¾D’TH”U™¦°yžQ0 øŽ¢ùjêI€DÃRçÛá‰B€Hó*ßa]»üçàªL%ÅIÎ/UE‹å†r†BÁW-XäÝQ‡Å9|óUnÃdcõ #R"bHY-ÔÁ 6ÄdžcÃ̦oF®‘ ~µþüȤ€Áð$Æ7³ø‹?ǧÿñ|þ‹¸˜]þ.C'C§…ÙsklQÇ]÷ãþûqÿýxÕCxí˜Øñ_«K/âc‚üøøŸã+³ÞMÐ]DwçO­¹I²w݃{ïŽ/ÇË_ŽûÀm{«ÐX`ײ ¿r8¡Ü|SE}RÚG ’—úùrS8%ÍWGQV!X”DH‰ƒÊÛ]õå|œÛ!MÖ¸èÙY̬d”c@¡"ÐeÕ‹lCÉ…–oþö:p>ùØÅ2«¹ŽÕ»Šü±gä÷Ï¡ˆ•ø_ѲHþÓ?©äo¦ÃÙýjÑœJRO­òûøœi)V«Ä ‚ å‹TØ›Ù}Ì $ …0Ã0¦ˆÙ„¢¦U’Ü©ÖÀÛ±ô»÷ù¾È>®6¬Ž~[ ûIü×â?Œ¿<±•êâ™Ïâ™Ïâwó'îxo|#ù&ü½oÄá» _?zgð¿ßú<ú·[uˆtO~O~ºÿL´¯z5|^ÿZÛ³U‡˜Ç›öàÃéçðö‰a TÀ.fá–Ý÷l/ßË·¹áËŸTI}Wy¿´ûÖßÜ<¶õlVOiäu-y¦"d.Ö UØyÿsA<;(-+~Ù Ï"o©&f0ƒKØ2„Ä)3#êåy>BÙÇ|`É t‡:@ÊÑðV—`•£ä´M¥Ÿ6B~B%±Ve!׉ŠC7"2l˜™Q׫ê…o0OyL‰HٛȘ8¯*GРêÓuÛáVApâ1üöÿßþ^L·g Ïý%žûKü??÷¾ßú­xûÛñÐÌv^¹KŸÃ{~¿ø‡hßðCÛKxü£xü£øÀèQ¼þ øÆ7᛾ ¯” Ê Ê—Üb³­&W.n8WÌ*œŒU’+>Ï|9-‘ç D> ïŸFžyaôCþ¡rä›È¨‰ ¢ÅPW˜|È%8G àÄ©ÓbæþȆɯŽVÔ ìÐØFθÂJ™/¢+sü”$)!¶BÈ„@а¼®†Ï6˜Œá8âˆVUœ• ê@J†Ø°?M³zõ1I.êsKÉ?;ýØŽ„,àÿ‰wÿ>qr»§R—Å—Å¿ý!xÿøø¾÷í¿¡XzÿæŸãß~ä†t,½ˆ¼ˆügü ÀÀ›¾ÿþ—qïKù*ìDìR¶á !rË׿bµd¿œHþK5HCÌ  UÑxµy¯’c(…þ5ï«âòs,o( §¡ª…PâHžR„0ÐWËù°—†ä’ ÊE 8'*AÝ N=‘P§¢j}˜  DþyÐ#UNÔÁ!¿ÚËj›¾lþT8(Y5\íë9¨¸"€×šÔùÓ¡œkLújÖáMCü 9q¤ I ed\½fF›<1OŒÅ͆Ibÿf à¶ø(ÐÓ=]D¤‘Ù™‘ { ïûwø©wã…-Nm>‡÷|ïù!|Ý7ã‡~ßûw1¶ÅíâCÿßÿ³¸¼µÇ¹~¸ øØoáÙŸ¯ØÆ®À®e Rb!CÏËca• Xòì‰ô—ððm¬Y˜m;™Ò/T)%ò|ÈÇÔ)2…9‚!_b@LDLA ¢*¡:!,ÅäÈyZ¢9ÕR•°ªYbö‘{ò¶@8ÿ(&ç LŒ/‡Ð0” œ8qND™• òÊ a °§ Pe˜ÕëR¨(#*:®“’ e³Ÿ«TIý»®CëÒ²-“"U’Ô5‘kÔ0:Â{Æã=ãÉH“’„˜=½tlƒ©ÿQfO ™‚b—òöl;ÚÂý~ôlj-•L _ý(ÞõQ¼ë|ÿে·æ;¸óüð·ã7¾´%ƒW¨pØ­l#°GìBe€m”Ôƒyl£´xK)“¢ÄJ[áÐÁxÆŠôy¾\‘—•HéQ¾ovJ°¡Ó@‰A`"Ÿ2Pø„ŒD¹§uÈ/øà„5­Ï5ˆ8§ê(W¿ä<ͧUTÈ7r)"0¬ÊªF¨(UaÀå…ý·cHWSób™ŽW&x0‡š<~áç¤XV r±Ñˆ)Š”H.âÀ85‚aÝëŸm°€U8er†•™§&ùÀ”™>`öïÆÇP¯Á5N-S„¼!U %¯ab;&¶¡xæ¿âÿ ŸÚxIÅŽÂiüæÿ‚¿ÿÎ-Ñ!žÿÞúv|~›d+*¬ŠÝÊ6|ˆ‚Ø.S‰æl#¿mõ± vy%O£„؆ÜÈð†®„ØÐ"¼°Eí¦(K!ÍSá6_UÔW稆1ˆØk/Ô'ùUDs÷'Ï TH™ú}ñºÃ )Ì# Ìlò‹ã{ŠB|™ò…XL¤¦Xù5èáªå¥Â(®O~×lÎ8P ?5(Ô)e Œ`k Õbª' "Kp Eâ²{ü&§Øÿ9¤“6@Ì3bƒ$B’˜86ÇŽ&GFGŽÐ¡CسÍ:L½`DQ(<8¯Âإȑm;²³øÙïÇO~x»ç±#ñâûðúïÁÚ5ª*lv+Û Â8ßÙ¬¤ÞÐ{ÐIqÄŽB8dP%ÊJ¬ýÚ–­û"^;)Ç,òðw·øˆ ±q}½ åôˆúC*…HQµ«p‘¡8¦$!Ã`RCJPqÖ9'Ω¨z·Ua ¦ZêN%J*ú¤Œ}ÎÄhq0_p«NBss!‡6¤`òæ&¤úšZf!Â…Y!£Í-~c JÁ©![¯q³A#ufvÄQ@*¬2ÜØÆ0­ÅZ‹µžP£5Q£=šÜv4:r”§¦Ðh Q‡a˜a1”òò×UV‰¨m^ø ¾ûãñ_\q3àÌïã¾§·{*¬ÄneAïiAYiá-å¬ûÉ_(¥˜Ay¡vJVÉ*í_·6±=¸.i®´Ì"ªáM™È9äqr ¯]À48dø.Ÿ* kŒåHÆÇ’ñ±ÚøxR¯q!Ž`ŒˆMm–9›y…ˆ8‹,Ešº,MS+™•Ì©uš 9!«¤F%"1ÙÛ„y­BÍ:hìÑÏb KÂP¼]äsI®_ØéŸåœ§)A‰42G.Ž´Y3“{ãÉ}Éþ=q­¦qìâÈ1C5R1ÐaýùlÛˆP‹Q«¡Sqs›ý“fjÊìÝKÍâ&Tz’Xmôˇ>ÍkD†?þq|ç»ÑÝî‰ìL,>Ž·þÊjTØ¡ØÅlƒl3)ùº¤è'WŠ|Ä2¶2)®ÿ¸·~«|ù’¤yØ&ɰ-öy“|ñ…"ª uªJp†­!G2>Q?0U›ž‹5ª×Çâ²n–ölÖuÖŠ8g]šJ{ ­–k·´Ó³½žë¦®—jÏ"ÍH- bh,ƒ ` ~%ÊÙõiú…u x, QQˆ¨xÛ¥èa¢Ðí”ÔÄToÐHƒ÷Œ™[×n½¥9s¨1:Bõ†6jGš›£SÈ:\ÎÇTO¨V§$b4b¦f j49‰s— çǹ2´ïM^Öo?dïþNüØÇ¶{;rïz;þúæQËVØmØ¥l#{:2–Lhvæë-h9ÛPb{¹eI·.Hȯ ®y©¯¥•¨#vÅ>j ^|?C¤AáŽÙFÆ%‰Œéþýæ–õ½{㱡zM\Æ636cç¬8çÒÔ--`i ­%´;ÜéºN×uºÒéi»«2§ÖJæ2§âÄ Ø ‹:_/ï O’“ 픇†sýˆƒñAеAÁê“L¡l—Ô‹6H8â¤ÆF46Jû&éÐÁèÈÑÚø˜i61RG-V@iYËÖMaøl#ŠP‹)®!6}?Tã³&&ÀB½‡)q^Ìã˧V2Z»Šnh aÏàGÿ.Þ[UX¬‡½ ¿½–·z… ;»”m„(…—n¬ô º õl£Û@P5¢øNfW2äØz™èzÐ\~"A±‘?ü8¼³oDÆ”ûŽ0\Ä.ŽlËèˆìÝ£àÀí§‰qŒ4I],ŽÄE¾G®ŠZ+í:t;hw´Ó•NW[m·Ôr‹-·Ôr­¶´Ú²Ô–nÏv{ÚM5ÍàD¬À»{Œ"X ‡9Š/¶ҕ雨+|×”À¤˜Ù×CCŽ™ sdlI½Vk6ÜØ(ÆÇÐlx¶ÐËlxBÖþÏaÕ¤°v&f eD>¶X—÷}%˜Hy ƒ´°Ù!^^Ù)¼óð_Úîyì`\ù8þéû·{*¬‹]Ë6@¬d„Œó± 29[ð*Ñà æu…—¨RŸmyñ•[;éþÏB³W¾ß,ô¡J,d„‘\!µ6Uå>"$†\d\¹ZâFGdß^LOÓáC¼/&÷b|”  ÄÁ ½ÒiŠN.:],.Ùùùln!›ŸOg¯ôf¯ôfçz ‹vqÉ..Y±@î¦aJ¾ñåÞ¡]ÌÒU_ýkC‹ PõlCH-©c£Æpd(޵^³#MÃDŸm8ÿ Ãg¹&ÆŸo`Ó¢Þ‡Ÿ|›‚’ò È94œÖ46 {ï|þãN²Ýqèá¶{*¬ÝÊ6 ¥˜D)xœßÚAžv„V¥ùŽýLJ‘³@ÿÆ|x3ø]W¾@klš©’h0å”<òAäûÜBð?‰!á€L%›‰íº,uY&™KêB^Ó@¥;eepL1Q=âz„ÑÒ {Fir´»h·i~Ñ,,& ‹ùÅl~ÞÎ-d K¶Õ¶­¶[jg™uYæR«NHÀª>T 2 T\"bG$¤ÒW†„‡gоnׇY|ÃG&5¬†Ä@ ”¡¹ëì°ÜꇟIÉ­`)OŽøÿȯEx/ üØ€`L²ÒͽAÝx "³ø±·TTã*¸ô¼{˺¬U¨0,ìZ¶n ‰¥ïî…rlØ(¿ÏÎSÝ9ÛÈݽüJ¼zßïMã:Ö¡B_’[nô•˜Ä¤Êž'ø^"—³ B¦Ò›Šõ?3±‘:a(1‰0‰—@D1³D¬ ©CÔ÷»gë(s&³Q«£­Ž¶Û2·`¯\Éfç²Ù¹tv®;{¥{ùŠmu\»íZ×Ëà„Sã=ãu˜¢’½ A8Té†)§’ž*ž¢1„Y ðrb Šhy³"qÖgÁÉ !°¥`¨ ù•\5œ+5<(Pîma]¼÷;ðóOߨƒÞt°xÿÿ¥ížE… WÅne¹yÆ Û œm Ô‡RQåîºý×q©¯Š–›h¾Ö<7¸M^Â1`A–Ž¢„¤Ì˜¡þAš‡Ô!LB^Ö â Rß9Gª!)òHDlHÕ—µæ‹¥¯-@„º)õ2ôzÑBËÌ/Dó É•ùäòs銹|…ç²¹…lnÞ¶Ú®›J·'ÝÔ Œxiëð¬ËÃÅQEjÞOër»³<\Qôñ*†¼NCÂäµ ÐWw§ÂO|ÐÿHKùÂðáö[F¢}ÅRØ'gb7˜kþìÅâmì6<ô ^yî<ŽÛfpø &÷blµìÐé ÝB»+pò%œ<‰—^ÂWžÂ¾€s7h†k!ý Þû¹!yø>¼þµ¸ï^ÜufnÅIì™@3AÃõÐi£ÝÁü%œ9Ó§qêžþžz _z½!O¤Â×v+Û€¢v£èNV,3ìFÐò¦æÅ XÜ1–µ¥Ûœê.îsªá³Ežj'Iš+&‚‹ rA  Qd(bІ 2¾[]Ñë5?<åPòíEDHêEŒš¡$ÆHƒöí‰tÌ|+š_jÌ·F/ͦ—.g/§³Wzs Ýù…ÞüB/ÍĨó g8(òc\ü }`J¦à­YòT×¼J7Dµ´¿c«"ZC€2©¦àÔ0T÷×ÈýG|G˜É3õ¹Q§{ö÷ñ¿´ÅÇhà‘ˆïx;Þúwpûžµ7cŒÄ€£wà×¼˜Îâ©Ïã±ãÑGñ§…ΖNx5|åxfHCÍ<‚ü§øîoÁm£knÃuÄuŒoÁ]÷¾æpòIüŧñéOã±Oâ g†4­ _+Ø¥l#Ošô@3)¥/éœRôÙF?°þ¾ù3Û‹þ)PQ ›ó(± ³"Ï)@…rψˆ"¢Øpdúœ#¢ð0 Cl@TÜ+BE›\XÀ)»ˆ €Öh ‘C$ˆ21íí­ç.ôΞOÏœë;ß:w8Ê2g»!#•Õ×{YˆÐã@%UÕrËP l“}&'Ôåšœpx﯂UúÅ퉠Æiß¹v¥$(“<\ç_"ø´Ê /Í^Ä÷}/®lÙø_ýçøþoÁd¼Ù¡’}xÕ7áUß„wý ´‹§>‰ßÿÞÿ{xæÆä62üñï a˜úxï¯ã¯ÙÜz`0ó¾ë|×ÿ‹'ð±?ÁŸü1>ô'•‚µ°kÙFnŸ) « D ‚¨ê ¤D̬ a¿q‘'ð -“0 Gl•ØiÍŠäŽQCšaÉÀËÇ(úõrø;$ÛIÕ»„:¥¢Ä=ª 9G" ä÷ñ¹0Ö{ij0€U”‚RgÖdŽS‡T|«qƒûkM?®Q„åÑŸ.ˆ†š|‡‚Ò@ÃÀĨx‚J{sh,šŒg§k—¯dçpqçl«+iæRë¬68"Žk‘Ë,(Ï„54Ïx¿0õm`ò†,AïHÄâßGý„B¶ #bT"HdÄdÂN;óæ•Ê·ûÃÂFÖòâ€Wß7ôS+½Öέܴ«_)~)Å8n,~çøèÖ“O¿ ?ûsøGnÉÕñŠoÆ+¾ÿÛoà¹ÇðþßÁ¯ý6Nº-8R¹ˆ?Ú´®åöÿöp4Æ„J» ßöƒø¶įwñćñ¾÷áÄé­¼v8v)Û³ §FA £ª"êT¾ £¨ %“ ¨akŒ5QFJ‰Ó'"¢Ã4| ð²‚ü6Õ×H–~æ¡ò ®P8pÑ%Ý¢¬*«°…äQîÝé ‡o &…%Ê@Yg.ÊgŽ21‘)ÌÎJ+îóËFã”ß÷#¨#B]'"€ !2¨3$B“h_»fi´´”,,Ôæís§íóg³½<Ÿ.µS'if¨NQ£º*ª"ÐP?ÂðN]JªÂ&(nÔg:T8Ô y]§Ï¨p)Ïà«T¶ ÑH4‚Æ8’(ã„5¿œ2,¥s¾±Èg­ƒÔvåTØWÏ``£e³ÎE?k£dçCpæ÷ðÃnÁ¸“øñßÄO|+š7à\ îøFüÄ7âÇÿ/|â}xï{ñÁ¿Þ’ã´¾Œ§67ÂøßÇŸý*Žn:Ƴ¨Ž¿ ~ÞÝÅg?ˆ_ûUü§OA®¾_…¯5ìZ¶á¿§%o€"…8U+"€²¿6 Gpþ¾—(„ÛÕ°e“r”’É|ÅJID:Tº¡¿–4~ù¡r¶õ•"Î`ºuÉ0 #böe€š`›Ú‹=ÙNØ)95NSÿ{¨þE9ºžÿBƒ³Cù% Åb”jrB’ÄÆ5ÑI:c®³G—ZD&r©dqBW/‚ÚÆ ³2Aýýz‘Ê âKlƒá=«@A—; lƒ¼â³NýI`JÞèÝÁ7“÷²XvÊ^+;°Tµ•KùâåbÛÕëTŠ÷ûjŸ³ÕåDËçK«=9°ÁåS:‡õ#ï°8üð¿…‡ö{Ü«Fð¦‚7ý\ü+¼ç§ñóÿ/²¡Žê³XÜÌþuüÒ¯l-Õ(ƒêxø{ðð÷à—_Äïþ:~þ—ðä¦f_á&ÃneeÕ…* PÏ9‚€£ï9€ÈÇ6à×{RŽˆMñ`6†!æ-ún.Â~ñd*-%U*îÔóNªa VUQaUVŸ7 •ʾآð[¢¬RÀàK«ó«Â%ÔÿRØ8„$å1ìŸ1Ƙ(9Е¶ƒ3Òm_œ]h\Y¼¼ÐîfèXÛͬ‚}_Y‘*TÄ›b«Œ\äé/[•Þ*…O†‚s¹g`þ’äV"ƒZœ¾F8Oß ¼7[‚~ÏÊ—¨ :å£Vzeì`QÉêøÒ/â·†äÃOãû¶¶[âU0õüìÃOü-Þû3ø?ÿ3æ‡4ìKµ¹Yý÷øö[‡4•kAó(¾÷gðŽŸÄgÞwÿj7ÝÇ´Âua—² O5˜Á,JV,÷zÄ¡þ`ò¯ôÙÔDl ³aŽØDÆ?Ø0 ËË=åû¶AÅz‰¢A‹g0çv õ½Ñ}¹k¨LHç¶A¹¯Ì•™éÀš¸Œgô7[±2³§Ƙ(Š’$©ÕÝ´35¨9Òj4â8aŽ0·Ôs­^»ÛS2Ì ›„Ø@Ôª¼£kžaâ¾²1'ê sþ-ò*ÑbÅõH”'…|Dzж–Š`È`°€J?·«7ÂA×ö+ÞŒ›î;\.à_þ»!ù­¿†÷ÿCõ:1v7þÅïà]?‰÷ü~ú°Y ƒÅ³/nj€¿óÝX»údËA5¼îøà;¶on,v)ÛðÊK2ŽŒà ®t[¯¥Å„ss ÊÓªdVÔŠ:“ )µ3êLQ^Â^Ð5iX†”I™Å9˜”8°&ò€ó©¯ªP„À€iðÑv¬‰°|_­„¤¼Aá(΋™11x|ލV§F=®×º­7pþò"™¬—Y«âƒNJ¬Z\Í#‚j”=#x¿çÙ¼ 4ijß "OÐ`N|Þ ¡hhJ¡õ~£›†.?…«ä7V‰> <“_ÒòÜ xú×ðGCM¢|ó¯à?€ú0‡F¾?ùAüàãø©½9‰Åó—75“×ݱ©Ý+T¸&ìV¶AÈ;‰8BN8Ô¯»yJßsŽ`‚eJN× r +°%ª¡ºú*pÝÇß]çš¿Õïzý/3˜•Y˜Áìë]½‡i`NC‹Éwì³ÜµL8Ö>£<¦¿Á5m-[l"bfz¯ « IDAT"bƒ F­={ht4iÔ›Õê†íÙÖBËö¹Ð¨Þ·Œ¢`3ÜÔûÊY!ù6ò%¶‘§GAn2áû”Va« ©!Ò<¼Aƒ:ÙuòK× õ]îòðLÑŒ8œš.‹•_~r™ùÇÆ"S; x÷/s¼—ý>ðÏvÕ(°ÿ!üòon‹s ›àÐøæ&P¡Âµ`—²ÜEÔ‘±¤ŽÔAåÂÇ¢ð•–ĤªÐ¼Ùù0,Dý÷ZûÑ“2Ùÿ_~lüxÜ\iû"~õ³Cí ïÁ?šÚh_Ãøðcø©WÀ\}à †€ÝÊ6¼»6e ä@$`¢Üñ’ Gaa 5)^@DlÔ E«@Ä©ˆª M¶á Îåˆý–ö>·R¡Še@X‚ "ŠA‘R$0>äáô’¾¾g€m¨#X‚ù‡+jbµè¸µ_íd×a«þ¾|_Í{È)EÄ s3¦=£Éô¾‘N¶— [uí´Û³Î‚liç J cv0 ãÀÅé;"ño`î½.ùÌ“€*€ ¦ÈpL3ÅŒˆÕ«”šã ¯ ËBŸå­*YöQX9Ö2×ÿ_ÖXwâß±;¾×›é„ö¹_ÀS߇ûw¬¶¥Â×vÅ_åjPgàr"ÄL†É›@9 ²Ê ¿1“!fcÔ0"&ކ8ˆÀÚ‡»ü(¥\å OlPôP¯l2À1ÔÅÌ q .—äªöU}%¬‘s¶AlÉÓ/*“œ š ÍQÖÅkP/¬Ê3úEê °¬QD&Ò„öŽÕ:Ù¨0;•vÚk-¶zBbUÕ‰($y°9Rv8œ‘@$§‹ÞŽÄŸ å1ž+*EƒæÄpˆ‘o9ÿoÎPá/éU[™1)ÿ׊WYïÑ—˜î|8<ú¾¡ ö~÷í‚×­†Á¾‘M± |ß÷n|ê'0r³|T*ÜÌØ¥lƒHAŽ(#N‰…Œ’ 1b/ ”¼VùM'ƒ ‘sÈ5U+Y/ëuzÝVW;˜¯éׯáï—) eÚN í ª™ ¤JK½´cm'$bFȸ wÕЖ9ÛМmBlÑ:¢ðèÒÒö×{B%_¯p «¯‡ Ä1QE-¢±F¼o¢©Æ´º+K‹—梥.±…X—YXI”|ù#öZWbRÔåvôžm„Àòö=U ªLÊNY…5U×u¶•f‘Q©"“áª6BÔ(ÿä™’ÐÑ…(8¬ Šó‚•<ɶ¬^…ŠQ†6¿­…\ÀùüÆ:‚ù÷†×;x‡#ÂÌ`vSc|á_á;šøÀ`b·\µ Û†]Ê6Ê*Q6Jªlò•˜ý—~^ÛWsN²_ÍT™K;ig±½4·H5Ԍ֡Ãñ&V…Â)TÔù®ðFKͳHÕølˆj&ș҅ùŹv»•öº’e°Â‘@…¼òªšàè/o¾Çx`…J4O0mÀr£Œ« 86‚2Ä×o&0fn±¹o¢±w¼¾ÔëP×Ùžë9+ %£ðm|•É÷ÓS…J™Ê‹J‰¡í‰@áýU}¥À*gbº6]êv¯´Z{Y4’ðHL‰a`x•Î(rTZÔã23…¢"Ãärþ‹a"øµ«X\ÁÅ/âóC*ޏÿ‡wM`@Œ;Ïov˜þϸë#xï¿Ç·¿l×µ ÛÝÊ6H‰…Ù²É`UF¨8û;}ô(*A ¶aüj&+i'í,µ£¹DÖ!™s›“‰çPUuN­€”#¡HÉÊAR1p ñlà ¬ÒEÏ6²^O2 «ÆQ,ð ¯e`œ³œD±É9ÇU-7Ê5¿_v"ܱø/” N jÄÀDIóK#“ó}ÅnÛQ¯'¶•f À`"‚a0©¯jVu¾O›—‘æA*„‚ØÿŸ½7³,«ÊD¿µö>çÜ1"222³(„‘YÆ®‹A@ÁBfDEŸŠ(Ê ƒ–>ô‰ÝvÛP"¼~úìÒ?Qì–Â(‚ UC)j£€´2WAUeU1Üñœ½×zì}ν7"2«¨<‘‘ä½_ºÃ}ö97âîo¯õ­oQ a•”‚äÖRŒ}ÑÖƒÛ7·ÆEÒN¹™Ô„NpU-É™"T3kÉ68¸á3[Ö9™<’5œ0[C `ÊþrÓ9­oEüï¿@] _öÙ8[M?Î0.} pC #ýk<ç¸ô)xÙÏá…ß‹ƒst8{˜W¶Ä’¡FtRž¶Å6ªBÑàÊÊ:àUI0̱ÕGÂ…Ïû›æ¶Ì¶³šþRUð¢~W¶Á*†|ox C·ܶÑ?±9Øc'¹ˆGР¨Ä$ª”~É6âr[z¡ÎÄ3´T‰n+šÝÞ]ô.]âöå±”CÄ.x1_D€aJ€fjºÍô@§¹9hæ^ynÉ—ò) ;Âõ¹ò$%Õà.:9“)³PUû1um^%wÅ WèmëäƒQ¯•rÓ"³°LP’⪉mTrÜ…1ÌLd™ Q”άM g‰m7²V–¶Y3K[YÚÊÒÔ Çü›B0“Ò©¹ç n¸¾¦¡…§\\ÓPß"¸×c€·Ö6Ú—þ /ÿ+¼¼Ç>Ïx:žòDÜÿð·Dtlo Ì+Û DÓLã ±ˆ5nª£V¥ÛÐÒI‹*BÁ%§å~«ïà‡Ã¾aRf˜Úþ:c_V…(XÉ [ ï¡Pˆ%o!/ ¯÷‹A¾1(†N<È+ £,®ñѯ»¬C)3D¡À“'± r¨L»ßË»öž´m”ëb0ñŒuyµ°DÊhev©•è¶6‡ÃA^l‡–ƒŒW„Щ&tÇ jSõˆr £SF %CÛÐе¾$VÉ}!y,åÃñÖÉÍ45š²XòLPáз¶Q–ÍÄÀq¨À,!³¦‘$ kÚY¶Òm¯´Ûºån{¥Û¦SRF•TEU %ñŠ<òFùb=#=èù¸hΪ9WŽK/Õ;è{'>öN¼hÞ y,óh\võ¬ž÷& ì%æ”mD‹Lb!›Øaµr{©…ÐÛ¬tZ@µkFtþÒÂùá¨PGC&Qñ€Ôä…´¡ÁtKÁJfÂ6TUÕ@òbHÚÑÓû~.ý\ E°]ßcMi¨/Õ™HÊÂX Z­üCwÐTY%D}éäkS×é¶™wív¡³êQâ´†¤@j¹™&ÝVÖm5ZýA–°å˜Ó„—/È`C&E Aèj¥¢T%ÚÆ6T*M ©A'ºÂ¡7‚E&9@EØÃˆÖ³–k¬Ð eÊÔŠ F•!¬šÎŒÉ w²tu©{°ÛÙèw—sï”à¥ÙL¬Â’5qô T¢Û‹>Ñf̧Ö6³´ÕH©M¶¦ªå -nµ EçõØFX«özZ¹ÐOU’2 TÆ¢3Þ;†gu §Põ°¦–2Ó¶Ad™,³Ø{ROÞ[ˆQµ*Mkz£ÁÖ`k£¿9̇¹+D]áºK­¦¢e,!tœ‰mŽÏí¸€Ñøz-uðÄ9ì1ÖÂ=ÿí¿Ÿ¥³Ýú9üùçðço‹ŸÞ둸ì2\þh<æÑxÐ%ó¼–,p§0§¿!Ñ@ƒ•MØŸn_4˜¢ý÷ÔOp† x‚¨ˆ¾)uÖ:kÕtKU `˲ÍÒ~\U"mõVC˜…˜Ùø± r e°"C¤¯ˆrƒp‚x”ŸRuPɺNµVU_?58M¶Ó>fâYªéXæ,±ÍFÖnfÍ,É“XªØˆh݈BbC5hiÌÆ Ã*¬Bç¹J&…Aõ"ÅÔ«óâá RGâ N¡žÅ“zÒÙ†#x3'à„Èwp¹EŽ"Ï[ÃÞf¿¹±Õ,\.ꉃ`E“$i 3XF™H9çqÛgk2,ÿv|G«–¾ÅðÈãÈÇÑý8õ—?…/ üVðè+ð¤'áÉOÁ£î¹ð']`Ì)ÛRÏRÉ­s¯*ì¡B§Ï° úГ¼Ò„¼‚±+T½zñÞ‹ Æ +q]Ž€L¢$Äìµ8ÄþETœ #XŒ 39‚2±B)TI2ÀÁ46c£`¼¼Ù=ÈDˆ‚UU=Ô[‚$c5±'¨ôä¨&£@0¥S¸µßyqâLÿ”Ò´48P„¶ñQ% °kØ&ƤL‰ªuÞŒ|ô=%Ñ2g Nî Ö¨Œ"8¸SYÄ”!iVƶâÄfb©Š)T "!BB^# ¬aE'À(  F0Rg"¨†J#GÖ ;ÂÐ é¨È½Xl²7êàáN³¢n(U9á6nã§wWÛµª¨zNõ4æÚbè·þK=ã|Vçr‰k?/¾~ã û=u|âÝøÄ»ñë@zw<í™xîsñôËÙ–&˜S¶¡mX)¬sp^½ˆ‹ÏC_qUr"âªB2,ó“7p…ªˆJ(ô¡{_×Qæ6ÊÏ«³Æh„”å 1@$ TÊ“øEzõÑIJ˜<9eŠ5 ª¬J*$ê‰$ÍÕ:AØ&‡XO9«2û¢€˳;³¤íŠÏÔ²`7ŒÉtŸñº¦Är’›NUçíØ ÏU¹ŒÐ„:Ñ1„r𥉖"Æ=Bl«›ªÁÞ ï…—" J'RÒRhqÆP… 5RÙ:(ëSˆgG!³CÆCH7(ÆXäâˆÑmµ­¨˜_”MЉfîöÎöxÓ¦Ó¼vᨑmÜöÕzƹûÃÕ3Ò·2¼äWñ†©¯§Ý#¿ ×¼×¼XÃ3_„Ÿú)<龋hÇóÊ6@PV1"FD¼r.@Áì€ ¤RîäˆÁW# K|ÜÒSÈQH|*Á«¦)N–?Ú–Y˜ýXg?¨Â»—RbC%¥‘À:H”ˆÙx6:Š„Œi¬Ú)O7Ñq¼»”PØ•jLêB4h.{ˆ0DÆ1d,‘Y f©RU°Æç‹–$„‰”I¨ì`Wâ´AåU•®0 Ã@ª.ˆˆM¸q„(àEmlC`ˆ J{À¡"I”)8ÙŠ"÷®ðnì}VØth a¥Ýê‡ã¢p^J‘m$Vwe.» ò g„_­©ËüÝï=·ïe¸èYxÍ¿Çoüë~Ïc'Žáš«qÍÕ8r9^ñ‹ø™§ayA:æsû7´eqJ,›,¥u“Ê‹¨-¤À:bÛÑh¯\8”¢ü°®÷âéíf=#Nt‘@è×>QŠ*H”€ÀVaµls;Å." ·Ûõ¡d6Z%,â‰ÂKÆ f2†½x¥h_ÄåK´ÀâI36Ä1Êc'·¤|Ô‰–ƒ,¤ÂFkk%¾ò!ÉVÏu*1”ÈSäJÑ5ü2QIŽC`F<àU½ç¤(|‘»|ìò‘ËGEž’!f&æòwôôS<=™ØöÝ;ÓÅ÷›ƒÇÑ­zFú¶ÕzÆ™`W¬àÚºG=þ|W.ßÕnâÕÿø8ÜTçŒêÄÑOâªgàu—⵿‰_|6–镹ļ² šâqÝ ºQ„ 1Qe©q…-¥¤ñ]¶Qõ¯–´Ly ¢”R ”v˜à·…Ší­qV¢ªS_J©389Øxñ‰Êa±%ÒÒ·+83ˆu»KYU®ƒ‰h$†‚A‘ —5I\RÒê6ÖÃ6J/Q o¸|i*ã×XÔE!e佺@8r_䮹|ärpb`-3ÅnÅ3¿<»Ø©MåVªD‰ªîd!wÌ\î<Žõêéâ•zÆùÅÒwá¯ÀwÿÎ~Ïã´p_Âo>o~(®þñ“ZäVæóÊ6‚«+‡B“(¹(û]¡ìæU%'"ÊDDÜá 0ñ(ÕÊ6f¶ôg Q•JIH•C©RÎ1¡$SB6÷Qêa‰*„9@™ 6ìB^ƒG*‹1Ê*$¡€T‰4ìì•DVC[³*.£‘;–/nÙPUUUb"b%"2žH˜±bBIk㪪 œƒ&eR‚PÕOOƒð†EžY­¥41,i6³f3K³Ä&†ƒi`T©LÞº8½ v”š9‡`}XÏH«sY2á»~oü^ýñýžÉ¡ÿ¿ð’‡?|%þè?àÒùij³À³ÒP6Ê^™…YbÄ¢RCξÑVIú2·>ó- —ØU¤ÆYN=Ö0Ú¤à#\*$ˆ# ¥wXL%Õ@Uºrl:Ô‰m×=•äP¥ .ñÄÂFQaö>X¢2Á0 $kN³hª“SL¥‚TUB;%"†€•JÉp5TIŽLA4ŠA8&j¢åXP¥(T &C s–ÚF#m5­f#ËÒ$±Æ233ˆ£8xÂ-vŽ;Ãvõg«“m(Æõ´B·QÏ8ßÂh╎‹·œƒŽ¸áMøŽáïųî±ßSYàlaNÙFk°Q6ÂFH„D¢î“ËUt—ü4!&ìKaÇä)¼ó§îbœaòX˘q¹¥¨Å`"ò}KÃ:ELAíE£ÉhM4-{2Áé|:™öýJ*ðΣPrÄ>0Efσg?oüüÂÃ÷41»À¹‚9eA"Ê,%Ûðä}™“—2†±3ÖB™àŽ#…Èzì[sMJyÚ:0ILi/"Bê Rª% 1`¡b Ïp€+7ö\†>ª!땉R´+ùÔ?A ^]!y!¹×\P€±cöƈhHEáE,…G¥ßu+¨ØBå?® ‘²µ 48×WA-„U7ˆ\b9¬Ösé (C«,W˜‡ÌŽ„F6DЄ¹•Øv’u’l­Û=´¼txyemiy¹Õj%iJ&™2‹R ›'÷–ˆ™OÛØf»ó™u²úpÎMhŸ`ŽàMŸÀÝŸ‡×|`¿§rg°‰Wäxõw.^ÁósÊ6&F¢FØ‹ñámràÀÚòòJ«ÝN³ŒŒQTêÒ‰ÛÆ6¶…;¬wÅ,ÿئü8SR3E]Ïy]67ßúàe¼ú}xøÄs5Õï%†xí“pɧñ¼9ëß;‡˜S¶¼5ƒ #vÓl#>«,Y˜R‹†ÔuhýÃ&±ÆZÃÖµjÁ8sÔ÷ž^X9j0†™É°¨¨WaP “‘m˜¤e ›„Þ`å–_p°Ú¬+…pg'{²’Ýh÷yoä¹yÍ…Ø“âb{­ˆØ0xj•ÔÈ9‚C*•ë;E¶A±=1Qb¬µÖڄŪ]äºØbæJKe)]çKƲIØ4’l¹ÙYjv–[#K«G–W¯¬l/-5š c Ê.Åe vT´n ]œŠm8犢pÎI¸¥³ÕÕšêM ™ŠFêkäüůÿ¿ðàþi¿'s‡8†}ú7øöEÙósË6BE‰à‚¸dLˆÎ¡(ëZQºi£Ü-Æ*¤Ö4R“eib,‹ª©‰$Ô¹ƒ,!""ª"€’1̆ Gõ¡*ƒR²)™†I:Y£‘$IhðETbUÆÕ¨K$yJLXŸ£.'ÅØ†Å`÷GnPÈÈ#ay Õé=èAÌT¾†å€ ¥²qldÞC%ô?a°!¶^߬‘6LŒ‚DÕ‰wâýÄäÌ”¯*±‡}ädØ0˜‰3›¤6mؤ•5—[KËíîr»{¨»²Ö=°¶´²Üh·LÖ´ÖV÷¬’Í\tyS§ê]·ýš…\U‹¢‡£ÑÈ{/ñ÷&&P˜¹6¶ÁXiu”¥œ¨©‘ìù„å‡ámÿ€—ü!^ù‹øøñýžÍi‘?ú»øè+°àç1æ—m„؆¢ *ˆ|̤0uj• ¦ÞUë²Ò¤ƒÉ1Ðlp»™¶[­fš5`d”Ô4¿½aª¢¢ª¼m€€Æ‚3¶‡–Wu—WZíNš5¬µÌ¤++̲=t„(RY ^æ*…ÊXÆC7èç½^Þƒ\ÆE×)‹¨ˆŠWU0Øc #²ÊjCb‰ló<ÏóÜ{h3ßóž÷¬ç Ö:À‰Fºy£†AÎC<ò'pý qíÛðúßĵ7ï÷|N¿ý¼ëyxÁ…û=ö óË6¯Z@sÀ{†Tl#Jÿbk™„r LJ†MÂÆ2·šéÒRsy©{ µ´švf݃i·žùMmÃë‚L$“`fbÃL¢‘€@•…HaA!V¿Üê´³fÓ¦M“¤ .k&¦ê9ö.­B“<ÄÃçpc¸öŠþæhkk´5(c9Ê)Tô2bYyˆÂ¨2Á„˜¾MC¨FKõMȘ”6í ¥”MfÒ†ÍÚióàÒêêÒêêÒj#IJRN˜8ð@k‹mÄØ*¡1"2Y’d6ÍlÚH²†ÍI£™4ZIÚL²¦Í2²Ì“N¿åœÀìêëµ­ÝI¤ŠÈh4:~üø7¾ñ›o¾yccckk«×ëÇãŠm<õ©O­áª®çÏ_«ƒ²œ¯ ®x)®x þå/ñ_þ þàƒ8óN\u5žñF,<8ÎWÌ5ÛP ³ª<®ËŽ Ñ\ƒx°Üǃ­¡Ä˜Ô˜v+]^j\]º`yíîC—t_Ò9\Ïü´|¬mÄŽ#Õ ÁmRÊ5FDÔ‹zhæ ›4lš°±`KÆD1(aç”ö"°?ˆ„#°òŒzÅ`k¼µ5Ú¸A.#OE0&L‘¼®'&„7€²ô5 …²‹Ä±LÍß0ÌœÛN³vÚZnv¬¼`õ‚ V´³fÃd ›¥œ ÕµÕ¤”S "f§6IM’Ú$1‰…±0–¬…#ò ÁT?”šhé5~‡¾^Þ{UõÞ¶qÓM7}á _8zôèñãÇ?Þï÷+¶QÇ%,¾í`=#}íËð§é´ƒû?¿ûtüÎQ¼ÿOñŽ?Á»o@MÈõàk¿¿¾ ?PÓ¯Äçæ™mÄ–­%RQŠíÍg¶ˆ¬ %’¨# ûû²Ý«1š&ÜlØv3m§YÛfm®§e\´Î•¼êç€JÇ+”TX‚LRDû; IDAT,Xc6 RU…Ƥhb{¢ß¨ÂJNdäÇ=7ÜrƒõÞÆFcc°±5ÚƒBse¯„ÐrM©¬C&2”5º+(´z‹–eѤJ$áN(…f7Ê[Ô ¤m³å´ÕMZ ÓhÙFÉ6"m«éZ'tH«[MQ d±l  Ã`6SÕ·ZFDt’ÕšáMRe'W8—¨NÑPï½÷>¨:ê¸Þêô8|zFúƧ1æÜPôN"=‚+_†+_†â$>ñüåûñ¿Æ?ݲßÓÐÛþOû‘:ËÜ8w0·l#Ô•±+†B§­ré,©‚56% t”k‘¥Üj$ífÚɲŽmt¸Sê`êñÌÇ Ñÿ Œ”pÉAœFø~™\àr‡<ÚÁlp£ÎÎ̶Lý8•Q‘÷ƃõÑæzcc°±9Øì¶F2všÃ±C)Á`¬`QÜ‘€P.CÊPÀ„mh¸R-áBP$à'ÛXI[Ki§išmÛÌ81€™òé8ó+0ÉßM}™JîÝMÁpt#«ÜÉËÊ‚¡¹­Ó÷@Ù}V%*ÎS³“»Œ î_Ï8G?uAk±L}3HàqÏÇãžß†·â†ëñÑëpÝuøØgk©º+¸þ­8úB\¸xÏGÌ+Û ‰åF…P)•ÒŽÊ ²©PDSÀ+@äµ”XNb< •h¹ZÔº–ì)¶% ’Ò]jêOÊ]÷.­RvNö̱sGõ*c—FƒÍÁÖæ`kkØë{ƒ|“óð0} PÆ1â+(!R.J•³… A«n'å «XÉ('dl[&k›FËdmÎ2Nà=`:s fkS§D2HIU¡„Ê„ŽªŸ‰4…fës·9tj2Dd­m6›ËËËkkkD”eY«ÕFÌÌÌÆÔ™¯¸àHüÌúW|aˆ‹Úg>М¢y®x®xÈŸÿ[|ô£¸î£øèõ¸¥†—çÎÂÿ-n8‰\$SÎGÌ)Û˜4µê%C謩u|‡éj Eèò* J §êc?‹j‡Zïlk‰¦3ß,0ù·Ìäè,뙾O¼w a5t;UÉ]1{ƒ^oØŒÃ|4v¹7"¬¥AªFÇñhÅE‚°÷ß¾° & dAcˆ‡\v|/kbºæ’Q¶³G«ñÊ©4åª&:óÙÔ=)ëV«‰–Õ;Q«¡ž™‰Lä1²-°±“s„\I£Ñ8xð ˆ4~¿?ƒsΔ¨ï¢Ñ¸w¾|æ­ãº¯áq5EJæÜľøü ÅmŸÇõÅu×áo>„Ïíµ_Øïý<~ð±{|–ösÌ6 ÃÆ²JÌçW¥Õ“J{Mb &Öqà ˆBEHÄ©:U­„ˆ{°ôÖ: ©-p„î HÓ†JNPrŠìQ †[TŸ›Ù. È6òQoØëúƒñp”r—+A ‘ ñ(U"s4¨_™èMÃv?d#À‡W”ƒJ”QQšYåDM¢&A<ê½Ì)²P}iÛ3ª)±ªNÂeKâ2…%αӌ|çÆ"2Ƭ­­µZ­µµµÊo#|78ÕxíÙ%¸_Õ0Ôû>Ž_¹}¯Í2>r'µ7pÅ ®­ë¼ç‡ïgÝÏz ¬x/Þýgx×'öJaúw7 x,j /paNÙF¬J 'ä<޽ƒó哪zÏ @BQÀaX Ô0ÃÀ$>I|bÄP­¢Î0ÑÉ#ªu •®P§¿}ÊÍ0¶¯c3ûæ™2ÎÝÞ`iæÌQ(PnìwqO­Ô.Õç;‹X&ù” &>Dñ¦ ÝàdÞ[Ï·ŽÖoÞ¼íæÍ£7÷Þž?®'Ʀ‡t¬ÇH)ÖF•«zòe„B-Å@„”,KÕ“ËD)ba¨! C¬ñÖ:Ûtfì(wp^B[xÝÁÎ;G;uØ„*QÆŒ)y$T!’¡ƒîÐVýT" "J’¤Ùl†¦*ÁÚ À^dRÐÆã.Åû>WÃHÿøÇ8ö8²Hùï%Vîç½Ï{%ò£xÏâ-oÆõuËK¿úIŒ°`ç!æ”m Ú7za'(¼:G¹Lo/ÂŒ’‚¡t)%%£ $3Y˜DÒħV,+ï‰Zr—ÏÃÆ½Rl_œªìFefU~ƒ·-e³ ÖvT™,˶¼VÍj˜S* k¶ÿ@4¶˜)þ©>`yºþmÃÛ¿Þ¿í¦ÞÑ[ú·ßÒ»í–þmý¼7ÒþØ9ƒ ‘‡!%ò¤J¨„N°(=æ%š¡N©R‚LBâÍàIèF9° ëmâíÈ›ÜsáÉ üt)í©ïÙ]M}êac@zgsŠè{~šDÏéÅžD”¦©µ6Ë2LÅ?J×±ZÇ\~9PÛðÇßÜŽ©a¨îé<ûñìWáïÿ/%>±^ÛÈý¯à„GwQÍ|Þa^ÙF”} È+{U'êt"S¢Á2NаoFh¥A°Ò)3d”ÖàŽPÓ +ÓËSäg¦¢3Z“ÝžÓüåäf÷æ;¢eƒvûâÔ·¦WGÝ…ñL¾m†ÛŸWñ&:çFFÇG'öo»ióæ¯õn=:#IÎÆó~OCöÖ:ü¦ üÞûñÜ[¸nœEX<âÇðÑÀo= ¿rmMcñ÷X¼Šçæ•m˜,æºË*2jNUÝ@õñn#Ô<ÉÉ$“cgR¿Ìè3§>Üv*Ýö}`G¼}Ù]Oz:èÌ 3ÿnLÏ0šJA£œ´Ôf* "^Å«÷âÃÿ…+¾Ñ¿åý›oîß|tpìöá‰Û‡'Öóõ¡ r(åÑ…TA…’ÂG¡GH±B…HXƒ•hˆ˜PlUVI,£â¥zÉ*cÎ껳¿{¾š{X<å9ø…®g°·ý2~éZÜsnߨöé}ñÏÄÓ®9ã<Üâïì|ÄÿQÆíì®l3{X’©†T1 š•Ê£ÞIN2›-Ù–ÐÙ§L®€ªŸ˜ºÀÝÄ »²ŽíפÀ¶²ÉI‘Äö©’²ójI8BG´`Zäâ )rŸEQ¸b\Œ¾Ñ¿ù«›_¿që¦Û‡'6òÍ|³Wôr§cP>å€E¢އÃ|8 nêßrcï–¯÷oYÏ7~0tƒ±•<¨`rÁ-#(Tù!–˜»‰&©UlC¼¿&rÐp•J³*Ñ©žêØáX¼1Ö€ôRüäƒñªšÂï| ^ü]¸b¥žÑ¸óè|îüËŽbaUç#æ”mˆÔ!¤ù!Û¨ä‚4aS»Û`5ÉîOgRêßþÎ §Û|+¦ ª(ÌtMäοظüWÔa·‚ÆS}6©HUE1fêS Ð Õ à¯B‘gäÈsäcä›nc}¸±1ØØìol 67›[ý­ÛÝÆ1·qÌm dè4w ‡âkÂÛ?„ÿë!øå×ã矆ξ^êÖ¿àKgpS 1\ÄÁ©\ P)©d"Q™â‘1ïÓ/ñ+åM }ø&n÷¨nå‚…ìÌÝñŸ^ŠË§¾ üúwcã=xÃ÷çït½Â/_‰_ÿvüÜ«ñ²Æ%Íý˜„ືqA pуѨa6 œs8¿ÿï¶Ñ…Ó¬-Û–ò=îÓÒÑ•ì1<§¬Lš¦E‰dXUO/sœ–ŒÄÇʘST«Õ©c<ÒÑã¼È WEž»|TŒÂ1pƒ¡Ü _ôûE¯_lõŠ^ßõúE¿ïzcŒÇ:ÎiìÙ© =Õ@+BCxXË „Nó'š–„08¸–1ŒÐ†­€sê Y Ã,pÎaÁ6"¨ŒLÇÖiú£i±Dù•éMpí3ÚñÁ6”TC'«°ÆËT±æ”`’»/»Óz†'Œ¬EU ª"‚*ÐB‹úÚ ?ÈÃÑp8 FƒÞ°×õz£Þ  ‹áÀ †~8òÑ G2 $cŒ±gïÙ {5J6ôX#À<±jt-ÙF¼fB”kƘ5 lkˆ)4œgÊQäZœª'ñP™Žªªˆj.yOz=ÙêKoœÆùx\ŒFùx˜†ùpP sŸýx,ã\óB‹yN¹CQPáá…E+é« !’XÛ U N`a H‰ 5 ËjX’–ÉڦѲÔXNŒ±L†znØË=7r:–؆åÎ… N/ù !-°¸÷‹ñú?À/ºæaׯÃ3.Å÷þ"Þx´\óàç&¾v-^w-^gñ¸â‡_€g\µtONäáמ†7ÔÂ5VqÅ·Õ1Îçlã܆N‘ŒË[ÐnĒΰéW% •ê!ZHQ¨Ë½+$wR8Ÿ‹º8: ¥¾U ¢¢ªY…÷NœóÞ‰w¾pÞ{ïœw""âEtìÇ[~kËoöÜVáòÂ…ÏsWä~œû|ìs¯¾@áÕ{ò"ä=y„G‰5ÃA¡€ DJ¬€€©eY‰ Œ€I !±j­&n­¤•F§™d&µ61°tb¸i`Eh$ê "8}÷…]“V‹ÆYG†W¼ÿã!¨›oÀ ¾Oýy¼ê¥¸âÒóW=: ‡ëÞŽëÞŽŸ2xä•xγñô'á¾k5ý6+þ÷»ð3/Ƶ5Ô¢@ãr<°UÏPgŽgìŸAÜŸ¯ãÊóŽÏ)Û˜, óI³‘„]v·DÐÙüɶ$ÄÙÅä´¥’AƒY§âÇRäâÆ®ã‘Ýx:t:F™œÐظD%fI$F2¼ñ…8ï½Wxç½óâK¶!"’KÞw½¾ïõ]ßIáÅ{qN¼SçÄ98…zòÁ‚Kbè€JV84d›§Í¨2KUjåªfFÁD‰¡4á´AéRÖ]k8Ü^igM“›X5`2Eáûƒ‘#Ê4sÓh†>Ìü3Å-têX޳ˆæƒñ'oă^]s>%ÂáýoÂûß„CÇ=W> ¹/Ò»ôžøW|à½øïÀµ5Oqoàñ©kð©kðZ sO<þ xâðèGá÷DöÍ_¾[ÇGþ'~ïwðî3µÁc~+‹?²ósÊ6NÓ+'§³gcí¹S;ëXƒwp…ú¡÷ǃÞxØz£AoÔïÝêSoH[cN)>bºbšmˆz/^cË4õN½ˆWU¯^K8uc?Ëh,c¯^TÞ“ ‰°  BS‚ ¬ô:ã›ÅT­èjPYl£•cZåºÅ 0±M8m ÑAsµ½rdùÐÝ–u-NØXã!yî6·zÆ ¥X¹r‡wzç-_ðŒýÁw¼o»/ªCux*Üþxó?àͯÚxØexØCñÀûáÞ÷ÄÝ.¡U,w‘¥°ï1bk'ãè-¸ñ«øÒ¿á3ÿŒ¿¿7ö÷pz{ŠÞWðž·â=oŸ^ò`<ô;qß{á’KpÉ%¸än8ÐA«…V ;À¨“Çqë7ð•/ⳟÆß~ ù4ê+U.‘á§?§¹Ä‚mLãT±ôO8ëPX yö|»Ïˆlީ˵ºÁæpódoc}ks½·¹ÑÛ\ïmna}Ë®÷ìÉ!÷Ëö%•™°  YˆBÑ»¢ìÝ:±6ˆWïÕyõ¥I¹jX×yöþÅ—ô‚baRf0)CÊ2äè¯eŒ#PV"0‡Ø`IÂY“šn¯v\°rè’ƒ-7;dˆ â¶zýÛÍqëˆȔьSÞé;Ã6„ã,Ââ‡ßŽx$Þræwˆ>þñÃøÇïý‰ÎUÜøÏ¸±¦&5g‚ågà‰kû=‰ö sÊ6BQaQUE´/7Ö€T^ 1åBÙÌ–Ô’Z½.§j™c™ëj©›îãëMˆbÍT!ëy=ßÜÈ7NOï?Þ;~¢w²7ôó~_û# F~8Æ  qU;jYcg“ ÉT­ˬDŽaÌz’pYµjQº¢kY?RN@\©©tGpãŠ"DÓw"B*,žUUƒºªÆ³æÂ4’NÓv[I·“,¯&Ë«ÉÊÁôÀ‘îê‘ÖêÉÁŒl.ãBÆc×—êUU@ V2 ýgJÔ‚ˆíQ$5dÂAdˆ ˆ¨uªUCœ ²WàxÃñå‡á}û=•Î ~ê58°ø{:1§l UV5¢¬Q¹ŠÄ‚JY eý'`dK°„¤$68^Ö½öÂá§bTª- „ØVâôd1¸upìÖÞ-·õÞÖ;z{ïè±þ±±ŒÇå:rp"âÕë”^r¢CUB´Õ$Ê«ÚE§Ê`¢*øì´áÖMÌ:ã#ͯ3ÂêX £*ʆ²W$‰ØÔ9˜>˜Yk>ÜGê»±1È1©ƒzUQ­” ¥þ&øt0ˆ ¶D–Ù01!° ÷mQ”röÞ üa<ùÑød¾ßSY`‘=¯øÎýžÄ{‰¹e&ËwØÊ£\Áãž7ª@ %…TA8 ª¢±ÍiUÙQ7¦ì퉞2)ÔZlæ½ãý·n½µwó탣·Ž/(/8wTвרô ʵ?pŽmÜ¢¢³:ËòæJ“)°ŽJï2M`ÊSÇûñ™ %°rB6aN‰[Úl¢ÑDc­yäHû¢#‹·/8Ôvó~OeÚq_üñë±´ø“:ß1§lC5Ô^8ñ…ª+s(S­VCy¦F?‡U†&zI%R(¼À œ`FQf*O¢p(k7*‘¨^იÑKá´ðê<¼À‡ð†#@ã.=&MNq®êÓȪLÊô#@”Uår=£õ(s?ñG¨’ž”G¶!|¥“t»éR—»Kig©Ñ^j¶–ší¥Fw©Ñ]j.uÓåNºÒå¥&š)RƒR!ÜC|8(¤Q´ûY*D¤JŸ ˆ‚Ó91MdÓŒ(\Qh g„~,‹7ȳ‡æwàŸÆëŸ‰×l¿§²@Èð¦wãòî~Oc½Çœ² ¨ªˆˆq€ Wë)¸:ÂZÄõ ”f4²gl£\ܧ¾ÊW;N@)² $¯…×"L)6<‰g Õ™º’ŠÌ|?šb´Û˜4OãÐqÓÜ+„ƒº¦E±m paÁf*ÛϘµlíHvÁ‘Æ‘¥n£Õi6»V;kwÒV;ë4L3åVÆ­™µ04©Wò O"¡ñ}†h¡Æbxx¯ÞÁÈZfb”EI±F&Ljâ Ð%Ö-¸ÆÙ†9„_ÿþâ‡ÞˆERåüÀË߇—Ýo¿'±ÀYÁœ² pª6S[Pheî+ Šé а*=$(¦J ‘e“À¦&IŒMØ2¦æÍîö¬ŒV¼#„3X#õ©º“AƒEèÈVºeHÐ6‚ƒ4#J[wO).¥›¯ Êt¢™sŒ&¡0¦e(@)(aH‰•†Õ0Œ!cÈ2–Ë֚Ēa6†MÂÉ…Í‹/l]|QóâåF·•fí,k¥Y#i„ÃRj¤¬–ÊB’W3) bŽ •ºÚps„DU@¡ð(\}o€@LlÉ$œ ‡e²±( óÈ4Φ2ôtÈðoÀ¿>/úa|øØ~O¦&\òTÜk.Ûžþìûpõv^ó‚9e†Lƒ²·—¸;ÒÑHªŽ¼§°)Tž eÙEôŸ`P¶´ÉvÒjÛvÛ¶[¦•qf¨æûYeNN³¾…¥Õ0YeËl™­1–™…BÆLlØlGw ´Ë×CQkù0QU/êãÍâ°HÖÕJx IDAT ¬D$d„ca3“¦&ËLÚ²­VÚl5Zͤ‘¥Y–6šis-=²–9”n%­Ô˜ÌÚÔ˜HJ`–`–`-õC VÃX£Öjb5M4M$³:ÀÃ#° "0˜ØB™L`K•%ÅÄd,ÒŒ n5¸Ù f†FŠ,Eja Ì^õý]àÎáâ'ãƒ_ÂÛ_ƒ—þW ÷{2g‚Ë~ W½ßÌ]5Æþý_âªÇ,¨ÆaNÙ†%ÛàF×t–Í’õ†^½j!䄤ì*4•9¨’ &° ÎÚ¦ÕNÚí¤Ý±¶mg&³\7Û˜õvØu}# ±NÀ‰1‰1‰±– A¡"03ÒÉx» Sm^·%n€èõ…í…+¢('p€!6d …0²³‚ì`„­7FLФ•4[Ôj›Ö²]Zi.¯t––ZÝN«Óiuº­î²9¸l.›Õ”SF”éN]= ­¤'!ûA kX$ ’DÓD³T³DSOÂ(Ý 3¦ tB(‰”HذMeÜlšvÓ”„ƒ²i‚ÄÎë_Í9^Âÿ>žñbüÊKñ{»ß³ùfq!~ø§ñŠ—âágh™áiϧ߅õz¦u–°ôüÉŸâû.Þïy,pv1§ï›gÒ·.ö®89>y2?irÓ×áP†NÅC¢(“„QöaSf%VN´¹µœ,­$ËÓƒ“ƒ«fm…´¨ ÙÃIO\0Î'!“P’qÖNÛËÍåµîAGFäÇâ ïÄ…sêªQv+)%²“Í*I§íªØˆÕ¤Ê*†Û “MȦd¶©±IfS$§ Ê2N›Üh§­VÒj§íNÖêfN£ÝÊš´ÑLMÛlr§IM ÃJ“ÉL¬;fDª3óW20e-Ó^²ùjvðH«?ìæQsïo:ˆx ¾¢`L,ÅJ7ë•ÔjÒåîäÀZóÐáöáÙjÇt34Iš(1™V».°8ðpüî'ñª÷ãW¯ÂŸÞÛwˆG=/þi<ÿ»Ñ®eSßÀ«þ ¯ØÂGÿ o;ÞyÆuŒº‡°ø¡«ñæ—bmî‚9 Ì+Ûh˜Æj¶z·öÝX¨É-£V …°ùꃳ¸4£$e…[5en­$ËkÙÁµtm-Y;h×VÌjƒš)¥{>õ)IhpF`C6áÐNÚYi­ üÀ‘ÖB]æäÆêTB9-ÏÔµVMV+¶AÓl£T‰ÎL¡j:¢œhJš°&ŒÈ6R¶™I3N3“¶l³e­¤ÙNZ´ÝNZí¤ÝI[í´ÝNÛM›5M£i©M-Û„ƒ&±H F鵆)Ï-Bå”1¹!eØÃÂ6¸á!’èÁÆ`ÔÊ]®Ö$4¦\ó\F^DàJd¶P¥«…m ËÐXâ¥ÕtõPóÐáö‘Õlµc—h%’aʲèÅ;æ¹Â¥ß‡w<ÿáoðÛ¿…ßûë½é{fxÈ÷ã9ÏÅó—îAñ…éâŠÇ?Žÿv}/®¹×¼·Ö^wÆxìÏâ?ÿ.?¼ßóX`Ÿ0§l#3ÙJ《¤œ¦&³œ0Lꚉ˸H2R(Á†Ù’IÈf”¦”¶MëpóС`›Ý¾à`vhÙèP×rb©æØFe°Ä«RùJq•„’ †±”i;í®¶W…„™ÙZbkØöÝ`à}7ppP {ùˆ©(—ršc ¬&p,ކXÃ&h¥ÚȨÅ0–Ù°MMÒ°†Í2›µ“f ­´ÕIÛ­´ÕNZͤÙL𭤑Ršr’rbÙ2ˆÁ&ªPe¿šÈ~J¶¡“›2ñ t„ LJ™2Èb”­ù޲&ÆZ’'G,…ÎçN «ŠÊ'mÓiq§m:‡ÛG.ì\xQç¢ ;®6v“nJ©Uk”HhþµÀ¾ƒðmOÀ[ž€ÿô5üÏ·á÷߆Oî»3Ç*¾ç©xÖsðÌ'ã¢ÆÙ8a²Š'¼OxþŸŸ»ñ~|àƒøÈçN™==KXÂþ ^ó \~ÁþÎc}Ƽ² ›­4d6keí4m4­F£½Tœ8‘Ÿèä'{®_ˆ+|áÕ°acÉ4LÖJš-Ûì&íÇZG·ŽÌÖf;f)Cƒax¯v»A·Š=ˆ§5 €ÆBè$]mišd´ÕÈÚí¬»Ô\Þmn޶6G›c{- 8¯SÛ¿iCêÒÏ;|ÀÄá‘™)>–ÿqJiÇ,wÍÒ’Y¶l­µÖ$Y’f¶ÑH²4Éœe&ËL#5ifÒĤ)'Ö$ '‰±‰!„Ÿa:3­*}2±˜µÂ˜² #€‰$Ld˜}¦¶iÛi–¦kn ³a>åƒÑxÊ• Ä$ÖÚ”“¥t¹›®,§Ë‡ÚG.\ºøÂîŇۇ[¶Ý²íÆ€¹¢: ¶q®¢u¼èõxѯãÖOã]Šw¿þ—³xú<æñxÒ“ð¤'â‘÷ÞÓÄêi‘âOž„×nŸú>ü|ü“øä§pö:Üexô•xÁàOÆÁ}» œC STCžï( ]GnttxëÑáÑ[·?6:vl||3ߣQ1Ê]nÉX¶–L+i.5:ݬ³ÒX:ܾàPû‚Ãí º¼Ô¦N‡:e¨:­×2ÁòQ ®Ê̆ˆ™+QChä¡ðJ2Æ8Gž#ßÌ·Žõ?Þ?q²w2ƒb0ö£‘Œ É·Ÿ)ff‘ˆäÂ33³1Æ”lŒaŠÄ£eškéÚZºv(]Kl’$i’¤YšeI#K³4É,K‰EÂkG+#/ C`‡.%cBÀÛ PÕ\Wƒˆ“c³—Ê¥wXôÉP ýx ã¡Ý:¼õ뽿޻ñhÿ–Þ`«7Øêõ·¼:Q/Kܰ†m4mã@kõ@ëàjsõPûȑ΅G:­6£l`(Ì+œ´ò˜]ÐŽsù1Üp-®»× ÿiœ¬5Ű|7<à;ñÈGàÄ#û>·‹,û9üÛðÅ/âkßÀ-·àÖ£8¹ ·)>Y†¬Î2ÁáC8|‡ã¢{à>÷Á}îƒ{Ý sš\Ü1|7~_ý*¾úU|å+¸éfÜ~ ÇŽáøq?‰þùŒIÑîâÀA\ÃEãn—à^—âÞߎ>—žãdk}ų NüÃ¡Ž†Žt<ÖñHÆ…^½/ê-8!cÉ$lNRJNSn„ÃzËೆ Y×3 ÕªÑp,ìÆQ6í-ãZ«±›˜(DX@ªFº\ò\ò±ÏGÅpT ‡nX¨spN½›õ<ÝÆ6˜#Û`2LäŸ f2ÌÄÑøœÈêÿßÞyÇGQ¼ü3»w—J ˆ¡‡‘.EŠ@h"Ø "* E@ý!0~ѯRÄ Hé ‘^¥×ÐBéå’+»¿?v¯ïÝíÞ]¾™÷‹¼ØÛ™yæ™™gÚ3Œ?ñó‡&€øˆV aÆä€Õ¼4Ã[6–“… d“@X'YxޱX„£µA,Ö†) áÞ4³×Uަ‡£/QÉ׬£²Ë¸hX­ôóÖ‡ý{Vÿç…Kk¬žG±Z#6ÿð–YK0†åŒOÌ»;ybäÅ[ôL÷áˆîépŒyÑÄÚfáˆ03ÄPe*جµ3(Š7TTk–¾ˆÑß••µ!^õbÕ³‰crñ¢ŒòO¢yôlržnjó«gÖØ_êîÄpóY…/‡'2ß”z•€ð¦|ØÊYtÄ!ÜÖj+±~Ã1n°+Ñôˆ±Ì™wab9Ålm Á ÿóõ | …ò?NEÝ%Ê›ÿ5Áyq‹„édƒ©ïâ-ošv ˜—ìúOõAæÏYu†6Kæ§¶“¦Õ «½¾J4΢·Ûpõ¦M ›`&Àº¼Ìó 6¹vcSñÖñ潪֩åMìÃY­òˆ›6êÂNø …BqBEµ6( …B¡üST¸mn …B¡Pþa¨µA¡P( ¥|¡Ö…B¡P(”ò…Z …B¡PÊjmP( …B)_¨µA¡P( ¥|¡Ö…B¡P(”ò…Z …B¡PÊjmP( …B)_¨µA¡P( ¥|¡Ö…Rá1¤,îª!„„Æ­J5þÛ‰QŠ1õ·!„M×Å)†;1ÖðÅWÖLÒ¦V%"ÐcSþ¿$Š#ù›zÐÒùG ÖÆŒìj Ë<¹zÎ[C:7‰ Q ›DíÖ}_œ¹,ñ¶Öö1N[Ô•"ë¶ì:èÕ™ 6ÉÒ»LŒ3”ÖUcþ¥Í_½;´s£êAb AÕb: y{Þ¦‹ù]gÏCÖ~q™›ß›v@J—,^Ó|®¥ÄCÿžÁIu—Sš)¢\1ØšÏ.^Ü?úïOÙš%N§óÎý>÷ÍF2be‰Ši×gô„ÏÞs)ÛIesꪑíFÌÝpên‘õã‡L7|…<9WPáTxÊKÞÆîÐ}cžówô Ÿ÷¯å¢€+µû·KEœ]œ.¨ÒùÝ•—-dt™H;´7Ö¾Ý&ÐiT½µ&I«PVr îÁ¡äÔ´ºT%묟[—xÍ·8¨ï2§J5“÷F1tIó;²êÏø[¾æ2wOkä+­¶Oѵø¦H‹É›.giæç—nøùrþW„SKä_‚Z0n«îöªQ5~MžÿÇ‹wrJtú’ì;WŽnüvR\‡FÓ!NΠ+ÉM»qfÿúï>|±K”€m5=1Çhó-_ÕIí•ïú† ©?pêw›Ž^OË-)Óæ¥'ß²øý¸*@HŸEW^ƒãaj¿ŒYâ‚Ôšp´Èö1¡1áÐrÎ¥2ÇÐÎrêfz©…‡Ç×PièæûRf‘#ºäÅÝ4Úñõyë^º›[¬3è´Y7/Þ±ò›^кñÐm—`Áθ~I+ŸzôРDÎÔÚøŸ†Z0nªAÉÙOZ@@§ÿKÈÔK½¡Ï:üÍðh0®¬ [ÊRwÐ)†­O7ÈOŒLŠŽMklów6ßÕI¼ KÝ:¡ ¦+”×oç5Îtà!Ò Ÿ HÎÔÚøŸ†ZÞaÖÔmòÖÏ^èÞ°²Ô•=9vÑáûNš=N{{ß‚w‡<^¿rÿ*1ÝGÏZw¡Àh­$b­Ðß\ÚEàÑ·r]uʆÌ]³?L,pH°ÓªÅåz¯DO>U"‘S/ê¤>yA{@ÕQ›2œ÷†ŒM£«`Ú/H¶êªÌ ÈÎ?»rúÐvÑ•øE6ï÷öÒc’¢v+gÇÈsНožûj¯æ5„™_æÉÍy<Ï—ežÙ¼pÆËO·oX=ˆÅàÓyøÔe‡Ò®>8)8žçù²´ƒK& {¼~eaˆï_¹~§aï}o—œ„qÅ×6|2¦[LðÀ껎˜²8á–Vž¡¦Oþ6€_Ÿµ™Îe’usI75€È—÷Ú«š”Vx ™^)† cúê^m¦HZ8v)ßò” Àã+3•˜´r Îýb¥Ý(>:®:€G&ž´ªw|ñ‘±Õ„—ª=RlõCÉɉ¨>î¨øºl-µI§3Õây^I r†L9˪8 3(f¡8iû×ã¶«®‚ÕhÚcÔôe‰wÄ:â¬eÓ^_>¦¶¢ë§‡seç˜â jmx‡¨©Íß}½…ĆÛzoÿ™c_Ǹ’k¿>_WºZE ÿñšÖ*Zu¯ìÒ§ö_—¡¨È1¸ì-ÃBlÚ1™ÝPvñã†ÔÝv$Û`¸ûs5€†_´ÌÞ‹ hòê³RÒ«:øÇë¥6™#g‡ÈÇŽidó&é±1Ïuqvúäh¾¬m1¢è é;'Ǫ%ßдžºÛ®·u•0®ðĬ֬TDr‹Ép÷ÇŽ4½ÖJôV%®=óQ#ˆùðŒ¤Ü¬?çfz§fŒ«žP¤ÓÏ©î¿\¸oD€º3Ï–º}Wü¸Ì‚óØÚàó¶Ðl^’¥ï,»ôICÓ[1ŸX­fé®ÿ§€ ÁÛóÜ×VKmÞw¢óJk—r–cm(Í Ïs…g Ž’­M•1fø¸K)«WKì#¦xµ6¼Ãª„w{ï§ýW3‹u¥y7ÿ8¶9 g]°©d†ô £"uâ>ø%áâ½üR6ïöéM_ŽjÄ@ Í•ÆEo¸õ]ký7;˜3²ì¦7›½¦_^Ó) è ÃÍ…±4½Ïr—f.k}o €ÇÝ2w?ÖmÍ#g¯?y'O«Í»srýìÂF3Nš‡~Šäl¹ºùKÿÝvön~™Õξ#Ú>õÚ¬Å$žIÎÈ×ê º¢ûÉ'·.ß9¢ÞØoÛй•öÂÜ6 ¨šŒŠßpâfNIYIÎÍãÌ)¤‹m©Ô1*©„‰‹ è8é׃IYÅ:}YafÒñ­KgŽèù®|9E’¿sp ˜¥sÁåî{¥u×%6+.Ž9õ@3½T ú› b •‘{cƺ§ á‹Kß+u›V NÑJŠñÞ/Àt[™nR>ÃÝeí-d‡Ìæ˜1}eW ~¹'¾ë¡–:Ñy¥5ÈŠä캑QšAýƒÂµúMûaϹ»¹%:]qö­³ «çMØiÔŽ|éjo¬|A°²˜æ¶¥É˜(£È‚ZÞaª±~]\³méSu Ϲb5ÇWøZ5ªvŸž´ßâÏ™ÑiožvQ÷Šþz±2€fÿ¹®pÑYžÑ Oúª9€°Q …ö9•Bž Rô× š|qÍ}šu×¾h â…¿Ì[Í º&Õ¦Ðß]5$€¦çòT¡1V&gëÈc¦‘<|á$™I‹º¨¿>ëmúI§B6¦¯îã€mûùi»½\ÁñY± €€~k3Ž0H%L܇Øò[©eY”]šÝ@õ7mfè¥saH]Ñ7@øÈ-÷]°ð@3½T +ÄU›9§”ÝX6 BÔ`Rµi÷!¯Lš5oéš]'o:X2œ²}º+s¨ôÌn“¹”³¹¿?€¦&4ÐKŽøCþîg*h<÷ª[¡¹ÖRiW\ƒœ£@Îi$3Èåìx.i>ã Ëe›s~Ò-òDü‰|º~âC¨µá¢¦V}õ€}ã§Oþ¦%€ ¡{Ì{&¸œ­ƒ‚4øè¼Ô¬"—»cx€¶Kn¬#—ª{âjh—µ÷=K°»ú|mª§¶Øo/õÂÚP”fç hõU’Cûª»>¯%¦ëŠ4£r9["è·ÞíðÚ6®ôåD¾~غ¿v&dcúoÝYõfž‘š†ÖžžVÛc•¥×r‘°‚ý4‘Ñß8¡0á¹P± oJ-`Øç¢ìò­ Î”ãö& õ6dåšé¥bX¡¿¹ €Ðç,V²Kô¾Ù³ŽÆ^¡ö™ðÃqË^ Ï Ná.Ñ’cãk¨ùî aò¾øÐkUÔžväÈÔhU_;$(Zɉwk¨1þ˜ŒY~—Z*¥ZÔ —È•³§¨ä²Ö÷ñP{ê)724·4yÕKõ„”=:jùÃ} ÿA„z÷ò õ»7´w  « $·Äìo¨4iωb zðàú~‘–}¸~ Y[ž‰õ Ɇ !.TV`^ÒŸ“2êÇ=õˆÃ⹺ÖSqõîrbr©7rŽé×:ŒH~Ö˜{vÝço hß 2ÐÚ©S}ÌÙ)²ü@•ÞH¸hjã/ñ³ãgŸ‰Œ’Je$,°ÉÀ6,péýîý'}·íLšV¡c+ÀXt¿@P•`9퀦Ѹ…ïÔRæ_–ä…Û+ |¡ÀU Pœ],ÏCœ*²Ó¸Eû’‹ónݶbáçÓÇzºCý äÚÎÿ¾Ò.fÐâ«BAx^p ˆyºcºwª€.ewBÞ¹O³f}:‡Yû÷¤èèïîß› u|:&À*¸'Z*¥Z¾n©äÊÙ-ò3¨MÚów=|D“ZÈ=<§oË‘?ÝT±SvŸøet=©¢¦xµ6|‚_°ŸC'Å0ÏYR}ÖµL·âc$ýq²Q/PVà¶­T…F…ȽëÛf_Äw'@pd%éMˆ¡ ‰ }3Ç}šõ9)ÙBj„ªì~‰Œ‰t"šj1‘roå轑shûïà‹þþ²wVÃg.Ýz<)Kª}5êeõnúœ[¹¢šGIµá€_ÍQr%$•0¶ÖsKþÛ/HÛýõ¸þ±QþÕ›÷9éë gsä:ð&‚ÖÊíìƒ;Ìüfh(¸ãNÙäŨ'šéŰEÚft–€Ðºíû7ýó…+¶¹ž[”¼ç«‘õì­o›w© ÞœR*µK€Ë[Žåp0fÚž¨Û jÔ|P[5p}Ûá #¸œã[.$vP«J¦žj©”jù°¥²Æ­œ]¢,ƒúì”lQ-jJ™gãã DŒÜ¸gn¯H6|jmüƒðœAÎð“3ºË?º}7/ùhXhCÑÕÉj¶”[UåàÝ.@Ò¾óùîÒÌœO¸ vûhû†³nÄê¹çr&¬D…Оš5dê¾|0 †~ðý–Cnfä•èŒâäsÎú®2>å<­rCH% MÆoI¹¸!þÍm ôV=iH«j-ÇþqWF¿ÇUPt_æT˜ÈþñŸ=΢pã„OJ–¢šéÅcQV€à*A^4lLP''.ß¿¼wpaÙò+VÃnå§øã•Û÷o po<[ÄçŸÞx@óAm k× À¹§óù¢³Os@ãí+›2ê±–J©–[*縳¾¯†¶´œüv[5€œU¯ÿ-EçmtG¨µñ¢Ž€ÓerE lõnƒÚ}Kÿ¼ïM—„Ï>ðã¾ F÷.5¥Oüy[£ÛÀ€.aáö{®{7cÚö…– v­n?ÆÈ¸š)Ñè2®d4\íS9Оÿå·›@Äs›¬ýäÕþ7Ž P3BÇ£ÏNÉ‘‡ˆ:":À½óiÒYÙ½s÷DDGÈ;ÒdДE›ß*Òç¥ßúýG£ †áÒ’Q¯®Ow«šjMªH»à$=RY¨ûòü© €Ôã^‘ åfúF1@—v1 @µÆÕ%æ¿ÁFõÝ @êÙT]¹œ3Ôµz<Ùv5ûâ¦ãe@>««UÎ}êeÇ7_ʾºípõDZ¦ïùPKáëä [9»@iÕ•ëVpï\ªÛIðγö$~ÜA¤­Óqô/7d†£È†Zÿ  {µRç×îÏ7–dXÏI´Úš£'tbQ²õ½Ùå¹³ö|úÑ_…òSÉ™3q}!]Î¥ú IDAT=úå–ò–Q †¬ÓÇ2€ fm£¼µ6LÓ$š@5ñmÁ¹¨Ô„­Á@êÞ‰[³ˆ®½ëù€_½Þ]"€û‰[wî½[oÚðDKãÛä9»ŽÒ 4èëÜZ»ú’Ü]plhÇwü¬³?±îÅ#¸îå.Š.MWŠ;\qü‰ËÞ6" @åá¿Ý–qŽ pïðJp~ıäïYÍ °óÇû³$Ç †ìc FÔ†Ïåº{{>êaCOó¹çr®ðÈäz j5iû=©\éÓvˆ.”êM>R(y`/|ØšT›ìêSW  îñ‹ðƒB9ó.sW”ø|8€êo$Ú»(¹´àIñ²)Û€N Θ¶ª·?uÇø³Åv) O}Ö†ÐwMº7—x‰Þ+üúïát"õ§Ç‰ ï^vèoÿô¤?€È—ÿ©›Ä;Ê5ÓŰä&cÍ“j€túI†w¯üݯô¿ìX¦´~³v­í—Ü2ð¾,87•šçycÚò.À£× éý‡éâî¾àl¤æã`º¬°º‚Å-u¥ZÊk3ÉÙ…pgËÝ5*i1SÁ Xžç N}ÑMØó1`ÉeêØËwPkÃ;”Y<¯¿³". ‚Û¼¿îà•´‚Rƒ¡¬('õê‰Ý«¾™þ|ÇžÝn~_Ÿôu ¨ÿÖÚséÅzǶ,eùðêÿƃ§.ÜxèrjžV¯×æ¤^=¾eᔡ-+¡cª8ƒ6?=ùì_–üßK]?Y`ZNÝŸ]>·I•\ú¶—°³MÝpÐô%[NÜÈÈ/Õ•æg$ŸÜ¶tÆF 4øÉo.ÚÕsë#¸µâ>ýãôÝ‚²²‚»§ÿø$î@ƒi–“™Šäì:w\ÎögC ¤ëä_&ekõºâû7Žü>gT3ËÚ®”œöÂœÖ øµxaÞæÓ·óJu¥y·OnŒÝDlÛø‹rœDñ<Ÿ·ýÙÇz¾8sþÚ?OßÈ(ÐêúâÌ«‰?Mh@ÕíG9×…èSæ·†;Ïå%^záÓfP½eeÉw<ÐLÄ1cMo?­çËò\.ªSX«!“þ³bשéyZ½¾´ ýÚÑMóßé)8 ¯úü“s_œÛJm¾>V õw?f¢ç4¦ñÖîI<ÐR×5Zi ò‰œ]Ç“jxg¥Ù»×û?î=Ÿš§ÕëKrnŸKXóÕĸN£w:ñîÅs…Ï{BpºÖwáÅbE‡â)N¡Ö†w(µ6xž+ºøýˆh8Åú}ýÍe=¶iÚÕ¨´½³û:óÍ ¡ÞYuYÉóÇ/¿è8xôÝÝE\ɵ߯¶r>åìßò•WKœ% ñ+ÏÔ‘TyàÒ«6çã•ÈÙMîôwV¬!‰:öµñÍ$º*8CúŽI­¤Th›²KÚs¹ “¢rÿÅWå9ä6Ü^Ú‘¤ÃwÎne“– —Ÿø¦Eí$oœW¨™+†é{)‹Ú€t\*Ë „ûŠPcà·g­ë NF¥.9þ®hö£Þç¬ ²ôÜ&Wâf—æx•j©»­¬ùFή„£¼ò\ÑùÅÃjJ†qí¹œçŠÎóT ä©oÎQƒÃPkÃ;”[<ÏóœöÖŸ 'ëÔ ŠØ´’ j Ú xcö».Ü·™r4fY4¶WÓjþŽ•ÄŠÒ{GW~:v`ǘj¦ËŠ4a>ÖçÅ™ËoÛ]Ï%Yù™À*ÑÍ:xùýo7œÊpâ…ÑÇ7%rÏoøò­AT5eͯJýqãâןˑî,,·²åþyò ÖÃcMÕ¦}Þúîp–ÔpV¾œÝåÎpÿèÒwŸn%®“«Âê´{gþ¾;¥¹Îy¹,¸²{OÚÁtQ”:¼nÇ¡ï-=˜æ({W +Ë8½áÛ©cžŠ­mºpÊ?2¦ËÈ™ËO;¡\ÖÆÁ.oœw&CÚÚ¸JŽY³Efš¢U¬EGÞy@ðà2ý³é²¯ì_õõŒ7†õlÝÀê¨_DíØ^£§-Þ›"e×ø¤àÜWêü]ÃÑV~ÉÖgjÑ_/UT&á]™–ʺ2Iv rŠB9»ŽâjÈóç]Ïû¾À„LÈ„LÈ„LÈ@aL,Á¸ýNˆ‰¥šÃÄw0Ž 0ÜàkÏ  ˜Ã¸\sÆ¿gŒ²ù‰Q€1Š 0Œ‹µæˆ0€#€vòt¡¾&@1†qµÎ|›õøüé‘÷øOrñµâ²Áw´¡$Ýr4Š%²Âʆî¢ÊÆnÈ 1Úa@1ˆ 0XäúºxxɬèÛ"BÂ&ïh wXs9€ž^Ú»dèÊQרŠô¬bìMÏ] £o³CÏæ×øýH ˜ÄÆtmYcB½.˜á” /WØX[t€W¿Ø…?ŽfÝ àÈÍ?C_?7#„5±” yÅœ¸7-Mò˜7m2¼<œÁå° >H¨ŸT*Íꂊ €ò¾c²°ûþßÿê?§>ç{4§|B&À@ØæÜ²dúûkL ‹Ÿì;+0ÆíE{[æ$„ËfÎϼR©P1h¬¾c˜×pš` \‹îY=ëõUÉñS"ƒ…Fiƒá$Ø×WÊfˆÄ%€²a´Cf &1†±ÔK×/L|{ÉÌèØÉABpØl³lÅå .Ü[œŸ@  ªï»cø—1à_ £%&1Z}„ «’ãÞY43*$*Ø6Ö\ÒNàdoƒùÓ&ãÏcYIJ-z´ƒ!}` w,LŠø8!2P¸hfx$¡_ÜøöXŸ’€íG.ÌWk´yºõ€aീ0ü‹œó0+1:pÿŒ˜ »‡6$S~Rq{æÜý¼ €bÈ«·ï¥  î{i084 ŒŸä ×' '4ƒ`Ê⛢wÝ¿wÍlZNl˳Ââ™QØ“–“¢ÖhDÄlÌ!I3ès°-QN’hÆ(¯ 0P€ä•Éñ?¯š/\1'–Ö pv´Ã¼iá8w¹|Fg·‚Õ·9Ô#l$}VÁxDOß}ΰ À¹>ÍÇ0â;›aîòY1ï¿õÏ aþB·1¹gG[̈ FE}ód‘Xâ  ºÏ<øÔ×—}&Æ) Ô®@Gqñ‡.ÔLŒ ! ÅŒÀâ•Éñ¯¿ûÌ-S˜LæØ] ƒ'L‹ „TÖã[RÝä]bN¥Çy¾QA(‚.šf  Ã”Í?ó€ Ë#¤$¾ýÖ“ëc-⢠ØÛX#2È R¹oiu¿Ï©ÖŒ`"#l²ñˆ~ ·ôAfB°ˆ1ÓVo\<íý×[bQÇ`ÀÎÆaþžh·ûÖˆZ­ûL&õ0Ð÷ïxÄ@m¦ÀÈ!dƒ1#€°>%ñë×[+´Ô u°ãᦸ”Ö4Õ5µÙhìs:G€> a‰¹Æ(šÎŸaÂL2cáÃß}è§7:Yú[[q0{J(Ò/•´wÊ\úL&õ(0Ä”bX  ©#7øº'À0ú¢ü3¿½ó0¼\x? ZÚ»¼*êÅ^JúœêÑœéñàC £?7†‘YIU#ÞýþœºŒV‰J•úºÅV©5hï’!¿¬åuÍñõ€+ßž–ÅàYs15Ÿݭè /¬±ú|µ€e³]¦¡ ÖÐ_.x# à±â}›?§/¾— k ÑjGý¼– ÐÐÜŽœâZÄ…ùÐ ˆèo¦¼§7´ Bä ]¦z$.Óx¦Íß OÓ¡Db ^út ÊŒV»mÝÈ.¬Æœ„08ØòhYœ!yguLÿÖ§n@°FØ4Fu'@xŒ He ¼ùí~œË-7ÙþÔ™M X8#’V§zZT z”jŸ¼Ò:÷>@ÈL0I,¹ 0Œ´ñÇ30ú¯ù¡Œ­¯|nmEýÆúvW:~?|až+vµµU -H™ MµÖº<„=ÊIWÊê½ö9ÎÆD˜¾7nÁ2áBãë_zpåO‰Q”Ÿp_z.Þÿá0Ô-)Ç«mlEk‡Ó¢ÁaÓ ç°Yˆ öƒÁä×ú(ÆDÆ X&^ caÅ»Oß¼sÃÂDʯùçýçðŶTtɤ“PÕЂö.bB}@‡fž1¡>ЄGNq­tQ&Ù0aä÷Á¸ÑÀ0^€°æÝ§oÞ±bnå6ÆÛRñåöèÊI?¶Z£AiušÛ»05Ÿ6@p9lÄ…ùBÒ%ó,¬9éqªy@Z4 †Ãxw û¯wÉ?ïX´sÓ²$6Õ'ܲ= _ý™Ž¥Š²shµÊk›Ñ*‘bFl0­&SBdz{U^yeõNÐQ7äì÷¸×úÀß³ ,{hcòžÇn]@)Tj Þþæ~ݽ*êS5A ¼®WÊꑜN[”‰Ëa#:ÄL&Ó;»¨f€&èæD‚q3#b(ƳÉÔí ¹yÞþ'o_D)ä=J¼õÍ~ìI˦T# ‘¸9ŵ˜“Fê ˆ‘ÄÚŠƒÈ !¸\ŽûÅ‚*!tÍŽû;Ù6¨}\âFõþÛ—ÏH{öž¥”ÚR9>Ýz »Ó.¡WIòž \mí@e±a>p°£'1gÅå :ÔîÎn§.•úöBbÆþ±(@Ü`è¿æÄå³bÎÿ÷‰õ”:ËõWÛñáÏG°+íTê±MÞ×5µ"¯´‘Á^´Q7Ø,B|=!p¶çŸºTê]ÅÜH&Óh&¶Å‚e ?`L¿Î±BHL¨wö×ÿw/¥@¨¬ãý!5£’òæJK{òJëä³M€`"ÀK‹ƒãéìÒõ}€®ñ˜1•r KÃxÒ>Nö6™G¾|ÎŽÊ“å—7à“_álNÔË¡sÚ;º‘_Ñ€I>&¹9Ñ’­ærØó÷„ƒ.·<º&ÀíF<8-¦‚° 8ÙÛÏØúŠ•'Ë-©Å;ßÄÅ‚*Ò2Ëd¢µ£WÊêadz‚ŸÐ–Ð+‹ÅDd†ã¥Âj_èsR=ûÄâa ÃR€àådo³3cë+TžìJY=^ý| +Efs¨–N©y¥õàrÙðºÑ’œc1™ˆ óßÞñtv©?t‰¹nŒÞvÆâÁ2Òy¶ x ü=§z)žÊ“Ì*ƳïmCCsû¸±½Jä×B*ëAxà$Øò¬èqªý< tãóO^,pº(aľs@Œ§èþ…üs©ß¾NåÉö¥çâ•ÏwQB¯ ZÔj JkšÐ*éF\˜/-¹6‹… w¸8Ù9žÉ.õéó$}À¢Å‚5΀à$ðóR¿}Á›Ê“õî$]2ŒWÑhµ¨il…¸]Š˜Pš4BÝùüŠü¡ã1‰¡«‘mó9 Xã|¡€!õÛü¨<•„;Ú5„F‹òºf4‰;0-:‚Éd ÈÇ>ž.i™EÐ1]›¡«¨Êc²(§š5N€`ëïå¶ÿèWÏÅQy2:wt A¨¨kFMc+æ&„Óeb2á7É ~BW›´Ì¢èj!j ôAcÖ8‚µŸÐõ‡Ã[ž]JÕ‰¤2þï{°íp&”4îö £«XuC ŽžËǼÄpØÓPWÍfë|?¡'5£0:¦k­ß=í€`Y8l|“±õ•[¨:‘H,ÁËŸíDZf-ô k+æ&„cñMјˆ oêšÚÑKƒ6ê”Êqäl>#hÉV3™Lù¸ÃÛÃi™EáÐuÿîÄðsªÇ, ‚ €ŸŠ÷m¾™ª•T5â½ã\n9-Ye³ž½{)žºc¦Ç!1*s¦†!!ÒEUh‘H)¿™¢ÙE5ðtsÃÜ™ ‚}<?Ù½/=7@~Ÿ–°8@°,ë¨:ÑùËåx÷‡CÈʯ2¨§‘yfg<|ó|¬[8,Ö`º„‡«#Â&!·¸–Ç]Ò%CNq-íyóŸD‹S-ð?Ù·/=7@®ïË4’¡ï=Æ †þãØV¼oóªNt2«ï~%ÕM”g• &¹9á±M)X¿0A/oÈÝÅ“…È+«CG—œòìf·¼—KêàÊ·G¨Ÿ'-€ðòp†·‡³CŸSÑ› ÐebY8¶PeÝiÙøà§#h¸ÚN ¼ÜðÂ}˱tV̨⇫#¢C|PZÛq[å€èéU!óJ%Ô Âü=)¯œc0ñóD ·ÀñØù‚8è†.J-EC°,lŸïÛ|?'ÑhµøãèE|¾-Ím]´!*Ø Ïݳ³§„åWy»£¡¹M­”_§R¥FA…âö.„úyRÞÁO÷€`rÐîЙ¼­Ð1^‡öY¢½¦še!@`ø¢xßæ‡(‚F‹ÝiÙøâ÷TˆÛ»(¿)“‰Äè@¼üàJÄ…ûý÷®Žóó„TÞƒº«m”3eUj ªZ n3å…BL&ÞΈñ¶:x:/€UŸ–ÐÀ´NÞ¤‚e@`xÿãn{4ÈÇ l=xüt„ç”É` :Ô›ŸÚˆ/ÉÇqåÛ#"Hˆ.™µm”‡}Õ-*ĨjhŸÐ ®Ž”?0¼=\ÀÜ{"'€tÝû4ú¤‚5Æ@`x÷»×ï*9‘|ÞF«Åo‡2ðÉ¯Ç ïQÒ„™qÁøüßwòtu°å!!Â,&ÅUM”' ‚@SK*ê›î?‰ò\“ÉÀ$ þØ{2Ç€t¹íX‚5†@`øïw¯ßÿÜŒØ J¾ØïwŸÁ7;Ò!•õÐbݹê&¼óÔͤ:¢V\"àîêˆÜâZ((5 ¥]Šœâ„)× ž'$'†³þ<šåÑg2UãC *db¬ÀÀðÒƒëæþgãbjf ~üË1|»+Ýrê`mÅÁ=«gãÙ»—PvŽP?O8;Ú¢¨²‘ò{"’.9rKjìwjÁd0àÊ·Çœ©aV;Ž]t‡Žþ-†ó›Ék €ÀðzÊôˆW^œšœÚ;ßÄ{ÎÐB¯à;Øâ¡ Éxä–y”óŒÂü'ÁÇÓ%ÕM´ÐË%]2U6"Ìß“ !pv@Tˆ·ÍS—ƒû¢L­z”%€`žX<3úÍO^¼ôHe <öÖ/8~yÐÌ4ªÄÆš‹Ç7¥àΕ3Á¤©e¼¿Ð 1¡>8u©2E/åçk‘Hq:»áþžðòp¦¾ž.˜5%ÔfÇñ‹‘ÐÍ©nÁ¢#FˆQ€`Ñ „»—ÌŠùø£ç7‘~^‘X‚ÇßþÙ…5´ÁÁއ§ïZ‚[O¿Ž^Aµœ°pF$N]*E' 2™¢grJêç Oê5„‹L°Ú~äB(tL×®4i>‹F ܾrnÜgï?{ éY’ªFü÷«}È-®¥œg>.xñX9'Žv ô‹½-kLEe½Õ -”ŸOÑ«Bnq-. ">ÎŽ¶˜j³'-;€ tlס€0v”c,ÁÐò¥KgEùÞ³·:‘}‚ó—˱ù»ƒÈ)®¥\#0ûèOß¹ó§O3 ô ‡ÍÂŒØ`4Š%¨µR~ÿ]2rŠjà`ÇÃä@!åkíîâ€YSBw§f»Ñ€Á#µH‹ Ì ó÷Üúý ]¿öîJk®RN[`³XHŒ ÀSw.ÆÌøÚÆJÉŠŸì‡¶ŽnÔ4¶Rž­–÷(q±°Žö6ˆ¢ýNõ̸ÁÎãí¡ëþ-‡a“G‹b Ä8ræç—IÕtîØ,æL Åó÷.C”n¼,IlyVˆ ó…¸]Šª†ÊME¥JŒ¼rtË{ìE)ÁÁ`ÀÍÙ ¦G·¹à #O!$‚E!"dïÛLª@7áŽÅbbÙìX<}çbø ]a©bc­;¥èQ¡¢¾jŠÃÊ…"44K$¤”àÇd0àâd‡Yñ¡“v¿è]_&9†Ø>œ¦0,Š€0Õ–g•se×›l²¿: wV\6n^< Oßµî.°t±åY!:Ôv<”T5AÑKm¶Z£Õ¢¶©âøMr¥”à×o2Ňû ÷¥çz@ד© :êÆhþÃpï]@}e×›L²ðõŽt|²õ-áDk.+“ãñÜ=Kaokñ"ÖV„úy•o‡Šz1º(¦¢h4ZÔˆZQZÓ„o<](„—;1¡Þ‚Ãg®øÑÒ ­m`èže †k€œ+Þ·ÙŽì'Ї?Á·;OÑҽšËÁº”üû°¦iTÙQ¦`_z PQ/F[G7¥…BA ©µùe ˆRJß`0ðtsB ÀñØùWè’ríz@@àS\;4‹D Lp°xßfR;bË{”xúßpàôeZè\mLÆ3w-¡,bdhR³|&>ž.ˆ ò•òz´S hëìÆÉ Åð÷r£´Ù‹Å„§Nv<»ó—+ÐÉGð ú*X$! ºþ²÷ñ·~Af^-Ý+l¬¹x`ý\xé¡•ˆ%Ѧ­¨kÆ?Áo3L®FÓj Ô5µ¡UÒØ0_ØÙ?WÃfaj„?Ä’.TÕ‹¡ÕR»ÞjåµWqµ­Ó¢Iï^U/Ɖ¬â.Ø?ýèë: Á2Öþ³lvìÓ¿¾ý ›L5~èLÞüfj[)×6 ³¦„âé»–êÜeVãõ/÷ #¯Âl²œVK ¶© ­‘A^”ÌU°¶â`j„?¤ò^T7´ÐÓ}£¾]Ý D‡x“vOZ­®å~jfatíf†šGý/Phƒ#€W_|`Å3ߖ¶呣Tj ¾Ü~ý|”–2Æ~ÂÝ3w-A˜?9a?©Lm‡2ñÞ‡P-jYJM£Õ"¿¼Uõbø{¹ÁÂÚJ×l@Ò%GyíUʯE•"Ƚˆ õ!  ”Õ]EjF¡ºáŠÚa4‚fÀK=à=Â00ð<ûî3·<»vþT6—CÝHÞ£Äû?ÆÖç)çÐÔîDb >Ùz ¿ÊD{'ù`&Õ¢d\®€ï$WøN"Ÿ(Èa³-A ¨RD¹†ÐÊëšÁÑ!Þf›L PVÛŒã2èªâF‚f€–Ð ƒ–5 Üü÷ãn{ráŒH›EŽ­×!•ã£_ŽbïÉZ€@ᮤª[¶ŸÀ‘sù”÷dêìV íBZ%R„ù{’>ŸÅd"1*^θRVn9µµÕjÕ¢pÙlD{™íT—×^ÅñŒ9€úQ£`Pó ½Ñ$Ÿ½òðê»ßÍ K#tHåØüÝì=‘C˸(k+ò w§/•âÝáüå Z("€n‚ga…y¥uõó¤¤ÁW°¯„ñ™¨EµMmðñt¿—éÔ ­–@QU#Ò.)4|ÒØôjè²Óý¯€¸æ7°Fp˜ºsåMw­K™jãhGNˆOÞ£Ä[ßìÇô˔ۧ`gc…[—&áù{—‘F¸ëwö+ëÅ´I'Í­8“[µZ /w>éZÂw’+bC¼QÓÔ†&Šs²ž^ô*Uˆõ19óÎ`0PQ׌ã… èꆚG*èZßüw (4£Á À‹¬›ìMŠm¤RkðÔ;¿!5³–¢}ž5ÿ~`%î_;‡”ضT¦À–í'ðñ/G!é»I ©¬WÊêPYß_OWÒµ„+ß ‘þÈ+­£´5>Ahï”ÁÅÉ^n&s³J«›šY(ƒ.­¢aàk(®óúµÂüYSBY4#’GFU*Sà©÷¶á\N-„;G;¼õÏ X6;†4GùïbWê%ôôZÆ$P¥JƒºÆ6”Ö4ËfÁÇÓ…Ôø½ƒ-‹fD¢¸ªQWZKÑ}ô(U°ârîïirÖ½¬ö*ŽgJ¡c¯Õ CÐ; j}>C?ÝbæÜ©aëÍŒÇL_A$–àͯ÷!ýb144˜F“…x÷雑c~ÿV•Zƒœ¢|ôËQœºTJK-…ÑfS[rŠk!•)êï k.‰VÌC·¢ùe ”™Lý`0¥k¹F«EqUÒ.uBWÛ ÆO„Þ!Úáš#ÍF+04z¸9ÁÆL{´¤ªßí:ã…´ÌM ðrë¯Ftˆ7)þÍá3yøaÏT7´ÐB1mÝøiï9tÉzðàú¹ðr'·óÝ ÷.—ÍÆÏûÏR¢E͈Z:LŽ„õiD5täÑ/þ"•2¼Ïðº&l=fi“ƒ™‘—’ªFü¼ÿŽÓà#0 úðú£ëHB‡TŽÝiÙønç)´uvc<ˆZ£ÁŽc‘STƒgîZ²[üÿóŽ…°·µÆ÷»O“ž •Êv+Ìz ôa¨…ƒ!›èƒð>Òã3hÙ,–Éœ‘X‚Ý'ršYDù|cFßp·ŸÜˆØ0óéÅUxùÓøèç#ã7Ee½O¿û¾ß}šôu¾gÍ,<|ó“iX0ô#«ÝÔNÓöv<ØÛòHÕ^îÎxæî%XlfѾTÞƒßeâÛ]§ÐÕM¯Àèûâú“wö¶<8ÙóÐÚÑMùÏá´Ä®ÔKhï”á_÷-3»N",`\?nÎHË,Õ7™$à#>Üw®˜i¶Ï]iÓÆšI -j­Öh’›ÐÍ Bw>JªÈÙl.NvxõáÕ¸)>Ĭã´H¤øä—£Ø{2—~Ô@q°å!6Ì3ãC®%—ìíxº9¡W¥ÆôË8ŸWŽ^%½tô‹Å(®áåWaAR„Ù€¸ÓŽ¡ÀéZ4QÔ,¹öP´·åé¢F}>¼i“!“)ïKê2GØðÃ9Í×ýž=LŠ žÃf™Äöì ”T5’ øxçé[îkò1Tj ² «ñÑ/GQX)¢Ý?pu²Ã+¬FÊôH½Ÿ™Œ£çòñÍŽtÊ#qC¥¹­ Ï~° oJÁ}kÍk &ð±fþ$FèÀÐÒqø…>„î|³|„áœyèÚ¬ Õ €vS}¡»ù%Uf}±±a>xùÁUf%Óä=Jì=™ƒ¯ÿ‚A5  C?ÅuuJRDB˜¿éªÎ•o¯S· Å’Q‹æ…>–ÍŽÅíË’eó´®© /}º'³Šiõ8ßÝ¿Ü$^þP-æï‰ÉBÔ4¶ UÒM+…\Ñ£DAEòÊêÁw°…§›é¿È”¥?î=£…®ìS5 JsÀÐÿÿ)IÑ¡föråÛ#ÀË 6Ö\ØXsaeÅA¯R}MSØÛòà-@L¨–ΊƚùSLÞHŠ%ÎÃ3ïmCE]3íÑ¢Þ±ÿØLZT“ /wg$'†£W©FqU#åMÍm(©n€ŸÐ’ffdH·¼?í=K@×*F= ṳ́þ¢Ÿk`ÐÇZuT©5ИfN¶ ø¸eÉ4ÌŠ¡,ÂÐÖÙ¯þ8‰íG.Ð^ìë7ŸX¨`/JŽïâh‡§îX„ˆ@!Þûáí´òQ+>Ùz ¥5WñÄm)ðts²80ô™òúJ˜hÛ?˜ÐõT%M¨Š0¨ÔdÕà“_¢ \Dk†É` %)ÿ~p%%m[ Ïš‹Uóâî‹ÿ|¾YùUôš!½*ì9‘Æ þûØ:øxºX ‚诙a ‚0hÚçpś͌ 4Çg Zä=JìNËÆ»ßDU} -7úÅÆš‹î[Žçî]Fz«–‘ÄÑÞÓ£ÑÙ­ eúP‰%8|æ \œìàKrs´BŸÏ蚈© 0•”L¥k2ôaiJRDD¨¿§EahØ”N•§›ž¹k1n^¾ß}š–©E©RcÛ¡Lä—×ãÉÛaÊd¿1Õ&S#˜L }f ÀM)3"“Bý<À° 0È{”xñ“?qèt­aS6‹‰¸0_¼ôàJJG2#œ¾^IÓ¢Áf³PwµVŸ– nëBæ• ð¬¹ôŒ :»u–B_4i`«˜áL$}šA£/´³0)r%™Iµ­¸ý__ârI-­çµ±æbEr^ùÇjJǹš",&N6˜ŒÈ /\.­EW·‚6³‘Ð-ïE~y=:¤rx{8ÖG’NÞ£ì7“êøý½ƒ3ѽü†A¡Uæ(á*‹¬ü*Üö—´Lª(ζxù¡Uøïcë(™+‰Qøöµû03.˜ö't{§ [dàÕ/vãlNå]ɇʀ"4Í(摾÷#E“’’ÄøyŒ©Ï ïQbÛáL¼ûýA´H¤´úá“ðÚ£k‘’‰ñ"¶<¬˜.‡ì¢ZMI-A@$–àrIìl¬áåîL[’N*»æ@×à¯ö’»é g*]×UO_=ƒ›ÅSNJ‹DŠ9ŠCgòhíoÊf±°fÁJ:ÓÑ%÷­_OW¼ñõ^4·uÑzn‘X‚·¿Ýs¹åxøæy§½jË»Ñb÷mîÑœçaŠé£p[eÙgmc+6wé‹i=/ßÁkLÁ=kfÃÅÑãY$E Ø×}LÖ±W©ÆñŒ”V7᥇Vbö”PJϧ‡¹0¬)„2Ðṳ́ŠgD&„úÑï@§fâé÷~#µ×Ïèfè-À·-Ä­K¦¬©×âdoƒi}IºÚÆVZïº(µ‡ÊÛR ƒ›ÄMêMÒg&iÔ-íy†ïvÂg¿§5Àd2ä-À[On ¥+Ÿ¥‰ßÿ~`Bý=±ãXÊké%1*z”Øv(ÅUxñþ”¬±3Z߯է)úŠ{–͉âëA›ùì{Û°óø%(Uô=½X,&fŇà£6Y\Ø”Lár؈ õA ·;®¶u¢­³jµDÿÄ¡³¹e@_·t+.‰Î5زýðWhU=@; VèD_›Ñ Ïgè²â²iY¨¬ü*¼ú¿]¨kl£•³oÍåàñÛRpïšÙ´oN‚ @0©/•9’¡;N]Æö#pµµ“¶RØþhÓç¿¥¢¼ö*þ±qžYå¥Cƒö®ðæá¨ÇgˆÚ’°Ì˃ºhJØôÃŸŽ žÂÉ0×û z ðÚ£k±vÁTÚÐÞÙ:ŠÊ1|<]hçö8Øò05ÂS#üq¹¤R9­µáJ•åµÍ((oÏŠWGR´DŸÏPƒÁÓ=õøôªè’AP’|û;†MµË%µØüíAä—ë&´žºT‚×Y oOgÚÃØAB|óÚ½xåó]8›[FkN¢Ÿz_µ "lZ–d––)Èé®O3Äß»vö2'{Ò¢¶±ÿýjŸ½B+ÙÉÞ·.ŽÜ<.Žô:‘½*ü°ëÞúfÿ ,ºH,AúÅbøMr…»‹#í™c[ž–ω…µ9E5´SÂeŠ^”×5CÒ%Ã$7'“«¹v¿fhâ3(Gð®Ó ¬a¼j&€È{VÍZIfo`l¦àãá‚§î\L{Ø” 4µtâÛÓ°õÀyHå×7'Êzpðt:¤rĆù‚ÃaÑžõ ÷E¨Ÿ'Jª›h§„+UjT7´ ³[g“1LhUQÏx3‰ì¨ÎX„MÀÃÕ>¿‰ö°©R¥ÆéK%øyÿy\.©5Æ¿ýÈT4àáó0#6<š}‰äÄpûºãëéØšMkÕ`R…“YÅpv´ëëÊg¶cmÒÓD_h5ööå3V:9˜o&Ie <ýîoøãX­aSòqÇ/o?DkØ”ÐÜÚ‰m‡3ñõŽt”T7\ÈßÒ.Å¡3WPÙ Æä!ìí¬iÕvøé0Žg¢µÃ4raUC 2òÊaÍå"À[00tH¹ØXsæ WG´H¤h•Hi‹6Ie=&Í„6Ðg0ÙL"Ì"•T5â!¯´žö¶Ž›–%áé;Ó ¾Ž.9¶ü‘†Ç.’Ba®jhÁ>߉ãxé¡•ðñ ¯¿¿A;¶üq®T6¿Í¨H,1µy„Y¦‡^Ípûò«Mu6KªñéÖã8—[N+ü„®xúΟg5}‰4-A ¯´¯mÙƒcç H÷‰j›Ú]XgG[x{8ƒÅ¢/+pvÀÔ8ØÚ ¦±2y/åù ^¥ᓌꨨÖhú3Ðf™Iú4×Ô¸wÿØÛóy´É`Àg’ ^{d-­e™*µßí:…_÷Ÿ§´ŸQqU#^ù|ÍŒÂ?6΃‡«#­€¸oílLÄÛßîÇå’:J;‘˜2Z­Öšå8÷‹>0¨Ì{ÛKÓŒ4›…éÑfw6V®¶vâ¹~Ga¥ˆ–Úã©ûÓs!nïÂ+o¢½?"HˆŸß„ov¤cgê%Ú¬Œ$Šˆ(Ó0Ð5ö¶_¬¸lRæ +Û\Àÿýo7í_º¼G‰³9e¨jhÁ¢Q¸my­å¨g¼ôàJÌšJÙ¼lsfBã¯Á褂AkÊ“Ž±·ýâîâ@ÊÄc¤[Þ‹w¿?€?]³§ J­Amc+~=påuWqÇŠ™˜2Ù\›¶k˜=%nÿº _lKÅéìRRë$L™ M¥Gß rL!OQ=ö¶_æ&„“2‹Ì9Ÿ[Ž×¿Ú‹ÚÆV‹0 j‰UÉñX•‡I4š‰á“ðÆë±;-ßí00ÖIÏËÝw¬œ‰u ¦Ò–HË+­Ã[ßìGe½˜4f$UZâdV1Êj¯bÃÂD,C[ÄÉÆš‹•ÉñðñtÁ¶ƒ8•]jRžÅÞ–gÖLhgG;ˆÄ %`èUªŒ¦pS1öv,¦=Jv»ˆ/·Ÿ ½¼9Z¢FÔŠ÷~8„S—JðÄm ìE‹/Áa³€I><|>{â¶.ƒC°ö¶<,˜>Ùä™Ð*µN6ýUr¹I÷¯›»ÒÎÆ8:F«DŠ’š&´’dNpØ,̈ ‡Ïo¢¥å”Ö4áÅÿÄžÙè’)0E$–à•J¨5Zx¹;ÃΆMê`ËCtˆ¼ÝÑ«RCÒ%5Ä.ð±tv nY<ͬ‘;Ž]DK»´ŸŽÑß7‰:†)>™co¹ž¸m!maSµF‹ô¬blþîíãg©ć?ÁÙÜ2¼pï2ûzÐâKØÛò°dV ¢C}–Y8ÊLh'$F`þô³rDƨA½-côþ±I` iì­£ ^z`V$ÇѲqÄm]øzg:öÌ¥40’•_…'ÞþÿØ8)Ip°ãÑÒ:”î™Ð£†¼¯—ŽaJÊ½ß ‰;°;-Û¤âë—\Ĩ@Ê¿0­–@Q•ÿ÷ÅnVŠp£ŠH,Á>߉SÙ%xæÎ%´•™Ò5ºW©&Ťe›ˆ´‘Ÿóâ!•)šYd0 8l"ƒ½ðئZ€ èUbOZ6¾üã$­s¢ÇRR3 QU/Æ]«faåÜ8‹Xh¬XqÙ°Ò ¨É3˜sа€I¸sÅLØÛò–Y8ªÉäîâˆÙSC±fÞÄ…ûR¾xÍmxmËœÌ*ÆßMªZðê»pðôe¼úðxÝPý¢´šGÆisSÜa“úJøœðËþóhí‚Íb^ãÅÿåDéü s(CD£Õâ\nÞùîªÄø;KV~ü¿ïñð-ó±|v,èê“E£í±É:ÐHN“Á€‹“=Z:¤”:Q#I‡TŽ7¿Þ‡§.cBþò%^þtŽË§½€ˆLQªÔè%aä±^¢YO {[n[>c̆ŸKE5ØüÍ~‘ò½åtv)Z6oÅÃ7ÏÃì)aãNKp9ly»£º¡…9ƒa*27ïXAѣć?Á¶Ã™´6É2°€èõsi­ !ç¡k è’m&o6½` ³UÒØÒ7¿ÚƒS—Êh=že`ÑXPÃMöš ¢ †vÞö³¤—}޵h´Z¤eâÝï¡©¥ƒÖfÆ7‚Œ55ÜTSØÑÎÐQ‰H÷T–ÆZ5DdŠ^üzà<¾þó$íCön$kj¸±Âb2û5ƒ¡jlX?‚ԲϱT“¥ÕMø|[*Î\yõw×cE 7Vxº"Ûèý=©eŸc!½*5¤çbËö7ÁεÄXQÃ1ûâ£øŒ‘@AjÙ'½v"ÐÐÜŽ~9‚³9å7ÁÎ%+¿ /|¸7/ž†•Éñpw±ŒÙج6F`8Ú{z5ƒE›EZ;ŽgáïNø4ËXQÃG&ƒÑ  ›Þ3¬¶Ðç}óØlËŒ&uË{ðòg;ðÆWû&€0ÆZ≷ÅÞ9è¤yú1Jc˜M¯7¼ªO380`yô…+•xæ½mã¦óï %Æ‚>\e,¼‘õÁÙÙÑÖb½§W…¯þ<Ÿö³¨Nn¢“±¦†30tÃ"zœhƒ¢ ƒ„ W*ñÜ¿SÒ¦¥xßæA?×_mòG>14Ëa³pe×›ƒÞ _ù¯Ï#pvÀªäx$Å!Ð[€þñ`R9*ëÅȸ\§.£©µÃ¨ëg³˜˜?=óÃìW'XsÙPôªÐÜÖ‰¢ÊFœÌ*±ó”Kj8ƒ1ÈŽ!0r&š¡zY«j†Ö¹C¥¿©ï7;Òió ¼=\pÏêYýƒ/†JѦ†Ãfá±M)¸{ÕMÆ"Î8; )&OÜž‚?Žfáƒt¿sÂñòC+‡åÙò¬à%@€—ËçÄBÔÜŽ·¾=€Šhñ%Æ‚®'/f0ICŸ§ÐÙ˜v©¬ã¶¶à“_Ñî$?¸!yÄe†ŽªåYqðÝë÷áÁõs ŠÉ³Y,lZš„ßß{®Nv#~öÑ[`Ëî2˜L'twÆ/݉Ç7¥ÐæK¼üé<ñö/”ôc*­¶_›3a?iXGZÚÇ¢$PKÈ)®Á#oü„üò†1¢-Ï OߥЉ Ï00|ðÜ­Hˆ4¾ÏS°¯;>}ñ½Óï^u»uI÷öÈ-óq÷ª›h[ËÓÙ¥øçæ­8žQ@é,?“ öõs+#˜FF9ÐmtoÂnE/ö¦eãóm©´Oœ*«’ãñÛÁŒaiˆ™´.e*’'z¯¹­ßìHÇ©K¥hjé›Í„¿Ð +æÆáŽ3ÅêãÂ}±bNöžÌtŒˆ@!ž¹{ÉàˆV‹§.cωUŠ •÷ÀÞÆ“…X=/+æÆ 2!žºs1Îå–£¼®™–µ¤‹ÞÚÕbpža$–êuBŸfPÐež}åÕÏwá¯÷)Ž/¸fþû•zÌ$«QÚÇnlŽVаêñ±õ`šÛ¡ÑjÑ«T£¤º ïýp¾ñÓuqú ‹¯;ö¿î_>È“É{qÿ«ßã…þ@F^:»Ðj tv+‘W>ú¼úý S“Ëa_(ª¥Ÿþæ×û‘WA‰–0K7â‡ô¦›n `|íG:“7æ‘«w8x­\l˜VÌ3Úg¸)>t™M©RãÉÍ¿¢s„i4grÊpälþ ÷¢C¼™J“&aj„ÿ ÏüûÓ?‘‘W1âõœ»\Ž—?Ý1è½9SÃà't¥umû©á¯mÙƒïwŸFe=y5è­v`´lĈ‘)f’Ö†â9Ä2E/^ù|—E€àšã×,Á{Îà¡óÏܵ©ƒº;ÛŒb&Í™:èç½'s jÓÿýîÓ¸:$´Ê³â^kx¼è¦èA¿»p¥òš&MŸ½‚[—NäÃ,œ…¯ÿÃhQ$˜b&dMCzÁ;_Äâ‡Þ³H €¢W…>ríç{VÏTé5šÆ:[ ˜¤&¾žƒ;Wä×õ÷9C>èã>¦ë¬RkÐ-ï%…ÓD„¡Oï¡Nó õK6Q¯[ÞƒÍßÀËŸí„¥ËÞ“9È+­Xq9xáÞ¥̤‘Áà0¤å¤KFÊ599Ø úÙØ.€â¶ÁŸïÏ‚¥Z‚„è;Œ£÷9};^Efö9¯´wýûkü¼ÿÆ‹¼õÍþkO­…3¢®™£E“†5,…Í9´)—3ö%œ †Ž~m®0ŒþuHá6úÀL#ß7I®¶J pv€·‡ó¸éïy¥¬ûÒsÿŠÜ<° cTŸA¦’v$é Ü5$åælÜ/·!SA¥²ž1_c:¼›-™c›͌ƖWîF°;l¬ÇO³Û~:|-šæ? &Œê3 %Û“d›W‹VŒ÷3êïãÂ|ý\#ûA,&“Í©%RêÞõCÅÜ´E3£ tÇxiCÓÒ.DÚ{òö…£Ä—V ÌI3è\& xßæA¯0Ïk¿Ï.ªôùu ¦u/ëRý<ôxt‹PÀ‡§+Ù æŒñ %éç•Éqxí±5¸ÝD )ï¯J†ü°û4®¶Ð Ñšø*ç/—úy}Jø£3âΈºÎ×Hr;zöÊ ßO‹DJR¤A÷°pF$’b‚½wô\þ˜¬gÿdŸ—\‰`_r´¦ eŸF²2·/¾y>^~pÖ¥Lµø6†*µïþpÐàÏÏ(„Lþ—‰igc÷Ÿ½Ö#4XX3 nŠô^~yäü¢ªF\.©ô™·ŸÜ€éÑ#ϲ˜„·žÜ0è½Ü’ÚsTjƒlLÆsw/Áœ©¡ׇI߀Ø{VÏZEU;6‹ WGÄ…ù"Ôß,&í2ÚÇËe~±-uØÏU5´`êd?xy8ûû§RkÀ岑8 Áåíá‚E3¢ Sô¢½SE¯ú4¶Õ8; %)ݺ gDÂÉÞ†TóH×7ë*R3 ÛH¡£©û,œ‘†*¡„8â€C&³–myV˜ŒP?$ÅâçýçPXa™ã¤Þúövü„A¯ÿLÇüi“æÿ×ø&/7¼ýÏG²v§e_÷þ…+•øõÀyܾ|Æ__“Ù×2Þ cÿ¼ï.TѶnABܹb&’bƒáêdGIêeŸfY5z3д…³ œ°bn¶üçn¼ñÄzLðbn”±R^{Í2è³J•ÿxýGÔ6±©jã±7†V;üWðö·ûMž1±çD6Þùþ -ë%ðñІd¼õä,› 7¾=eÝØ‡)û$  » 7ƒÁ€ß«’ãðáó›pÏêYpq´³(@|ºõ:» £˜7·uáæg¿Àþô\ƒÂ‡Z­¿ÎÄÆg¾±Þ[«%ðÜ¿ãõ-{ ¦»Kºdxõ‹]xñã?iI&FàÇ×áõsâëAKô  éí­VkǤšÍbÁoGo]€5ó§à÷Ù8r6ß"ZGvHåøü·T¼ôàJƒ>ßÙ­ÀónÇ—œÀÊäx$FÀOè {[kh4ZtJ¨¨oÆ¥ÂjìIË1ª!À¶Ã™Ø›žƒ…3¢0gJ(Â&ÁÍÉÖVôôª –t¡¤ª §.•àxFå峺„$kçOņE‰¢‘ûd`Ù§aæÖÿ³ÜW¼oóÿ,ÇDiÆ·;Ó‘‘W™¢w¢y˜… ‹É„§ ¹e>L–Áþô\<ÿáör }²@wŸCÝ  €¤ïÕ›ÍR> IDAT «ïw²~‡š’iŸdK°¯;Þxb=r‹kqàôe¤gSÒ:fBŒ›;"üñÀú¹˜(³kÑSöIŠ™y6äÄrØ,$F 1*Ùs«±+-9Å55K&ZÐØXsâ5 ¦"ezĘ<¨ô,z8Ô„ ‘•_‰ÝiÙ8›S6a:ÑøPš$àcþ´ÉØ´,É"’¦Z‚ZöI*´6ÚîÉ47!“…8›S†='rPRÝ4Ñšžâ5Ÿˆ;WÌD¼Í{c2ýÒͤq3Mà쀕Éqˆ õÁS—±?=wbh ɳæÂÓÕ‹fFá¶e3àâdgqר§sƒ0ôôªÆMí›ÅB ·ÝºËçÄâxFR3 -6›=žÄÅÑÉÓ±vÁTD{[\ Â5­ee¾%£7Ï`©óF‹‰/7ܽzV%Çã«?Obû‘ ;ÚDñrwÆÆE‰¸mù X²ÙLD•Yn½Ó>Dz鰹Qk.žnNøÏ?VáîU³ðõŽ“Èʯš0ŸŒe³cðÈ- à't%¥4“êïÜÖÆªß¼'Ýg`Þ_(‹É„ŸÐo=¹ùå øaÏid\Ö%î&±úå¹{–âÞ5³ÇÕ5³I |è&)z”G–3G¢‚½ðÖp.· ?í;‡ÂІ‰pì@›Ûš‹Ä¨@¼ñø:‹tG¥JC87úÅÚŠƒùÓ#€£ç p2«¥5MkóÉÞ–‡¨ !î];3ã‚Çûí õ³Á`cÍ%ý‘)•) j–@$–@ÔÒi_·{;„nN øºói)µ·åamÊTL‹Ä•²züqô²ò«þv@˜2Ù÷¯›ƒ™q!Wuf¬ô…VÉ÷Ü]Iõ˜Db ž¾Œs¹‰%h•H¯5øµâràÊ·‡PÀÇ̸ ,›KKV“É`ÀÛÃÞΈñFúÅbìJˆ¨YrÃ'î"‚„¸oíÌOœ .—}CÜet VËèUªIATRÕˆ_œGZfѰµ½JDÍí5·ãRa5öžÈÅʹ±H™EÛ\0ogܺ4 ‰‘Ø•–´ÌÂÊt²·åAè·PÀǺSqSüø×C…Œú›ak =]bo[>c%@øì·ãHÍ,‚¼gôúf‚ é’!»¸Ù…Õpq´C€·€–Åd2påÛ#)&Ó¢Áw°E{g7$]òq½I„>–ÎŽÁšyñ¸wõl„øyŒ›V=ƈLÑ‹ŸömƒŽ¶­Y5Ðl–ùI‘X‚ïvŸÁ™œ2£Ã˜*•EUxæýmˆ öÂýëæ 1*–Ä›ÅBxÀ$z ’-œ@jFá¸Û‰QX>'É ápåÛÓrÎ~¿°¢¾%UMhjí„TÞìmyðpsB¸Ÿ‚|ÜI÷˜Iäú ­ÆZ£Õšü‘ÊØuü"Ò/™ÏWªÔÈ.ªAvQ âÂ|±~a&L¢ÅÑærؘ(ćÏmBIU#þ·= éKÆ…)tËâi×µž¡ZDb Ò2 q:»uÍhë”A=ä»g³Xpv²C°;fO Áüé¤ù‡TR¸]µZ¦ÒPÊj®"5³ÝròZ¿ä–Ô¢¸ºqa¾˜›FêBŽ$6 Q!ÞØòŸ»±/=W7TÑkQ‰;¡€Å³¢1-2 Q#öh"[ªZpü|>Žž/@E]óˆk¢Öh n넸­åµW!w`ͼx„L2û:ú2f•}êÑ „­9VAE[:H_øž^2ò*_^ÓÙ¥X<3I±A´qêWÎCrB8~ÚwYùU¤'îl¬¹°åYÁ†gG;.pã;ÀÉž³#œlàdǃ£½ ìl¬Áa³®U›Ñå™B yO/Žgà·ƒ‰%FÏi·waçñ‹Ê¸sÅL³aEÂ`X0°XL³Ž\^'¦4»Û-ïEÆå ”Ö\Åɬbܵê&$Fвìm­ñØ­ м° '³Šq2«%ÕM׿%Œ´¡]œì`Íå€ÃaƒÐ°³µ†ƒ­5ø¶ðöp¹½ÊÖh´ƒØ¢APÖve$Ñhµ¨kjÙìRì>‘ƒŠºæëL!cÞc…°·åáN;5òË>=J+¥Jmrñ†¸­Z-µCÕµV‰'²Šp©¨ ‘X·`*"‚„ i¿N…¸»8`ã¢D,›ƒ©R™6ÖV°³±›ÍƒÛÑ«5škÝFúÛµèÛÐC©óCiÓtA*S ®©gsËpètÊj¯’’÷àxF„'¬™?Åd_ –µ^ÖªYö›JMë—ÕÕ­ÀÉ EȺR‰©‘þX·`*bÃ|acÍ¥”_Åd2`ok {[kƒ¢Tcµ™ÍuŒŸ/ÀÑóù(ªl„’‚ï¶©¥YÕHŒ @X€i`ÐFŒ\ŸgÅUšSÒgÅ¥¿(HKÊ{p2«— ª‘€e³c‘`qÍÈÆƒVˆšYˆ´ …¨nh¥¼©œH¬£ê˜ê;8;^ëtN:…Û¬0»³˜ ´c4ÂI*ïAÚ…"œÍ-CRL0ÏŒBL¨„îü.óJ…l?r_ýyí2(•*Zj€EÍ:ÎÉBJÙ'TjÉ'ÈG‡}4VÒ«TãÔ¥\.©E\¸/VÏÓµ~·¹¹d<™³ò«°e{Db‰Þ^¯Tú%ÒnÓ9adh.öHö°©ìG[JÂ«Æ AèÊq2«E•"ÌŒ Áêyñó÷ÃR¨q{jÛp2«GÎå£É¾/“Á Öök²Ë> ­9ü•_ÌŒÁîÔlÚ$Ím]Øw2y¥uX>'+æÆYü°*}‚='²‘~±-ôk‚¡bo˃½é§¾ùn¶™-ìmy¸mÙ UˆPT%aAgÔ *ëÅøä×cøýp&æ&„cé¬Úòc)*µ¢f ¶<ÔÌ"4·uZÌh^¡;B7§1½†aÁÐ%ë!Ì¥p‡úyà‰ÛRð[öX¬úmnëÂö#°ýÈܺd:î_76<+Øò¬n(G[*S ²NŒ´ EØs2mÝ‚k`ðÍÒÒd$y‡ÝíV6‹ŒZ†ÙSÃðàú¹xmË‹ß0ÛgâðÙ+¸}ù $F "Èë†p´³‹jðó¾³È¼RyÝ,iKO7'$FúCèn¶ÉJjÙgÿHK/™ƒïwŸAc‹Ö¢7N‡TŽÏ·¥Âý˜’Ñœ8aþž´d´ÉygsʰíP.Õ˜E™ Z¬¹¤$Ebþô³}. ZÅ0@Z˜ÅÞÆ›ŸÚˆÔŒ9—‰ÖâÔôPóéÏc‘‘W‰±Á×h–n ‰š%(ªjÄ{Π¼®y\71:kæÅ[D cX0(UjYeŸL&ñᾈ÷ÅÍ‹§áÄ…bœÍ-C^iíÓ=F‹ÚÆVÔ5éB3cƒ±zþD -¦…޼G ™¢…"9{y¥u¨»Ú6æ‘!c"@·-K"…ÂÝÓ«¢ Ï|zºçÆà¾‚≛·¦lY²$F»N%vTµëTj?mU*¼›¿`?l¥’J%»I%NœÄ»Žd[§)‰2I‰D‚ÄEÄÉ!H$îÁ5˜«»ù0ÝP³õëž Ç 8oU×à\ƒ÷éçyßû¢çþÃm=<µ[ƲTÈÅŸü§N|ÿå£Û'q¾i„ÜÖ˜ãÁ˱ϰ%à ÅfFuy!•äáü‰zôŽLáâµÜzW;ÙDB0=·ŒÿýÏñoŸÜÄ…sÍ8Ó\…¢ÜŒ ´gæ]˜™sáòía|vsË+ëÊÅ eFŽECõAü—·Î ³­&î~?k,Ç>£}¡Ê‹sP^œƒ7;›0úðþþ½«¸Ù?OœŽœ]\Åß½w¿üô²3RQ˜“Ž´k0¥AŒ ^Á0 !àX¼°µ·˜10[I¹®!›d`ayÏV°¼ºu·wÏcfƒÙ)8qô0~üúÉIFH2qÛ} ‚ ’½,:9/.Æ_ÿù¡oä~õÅÜì›À¢k‚_wEQ$p­mµ¶‰IéÐ Q8ò÷U¾/BvpyÒµ¨8øCÔù•oq^Î4WádÃá=xe·ši)ö®U–5ÄÍ¡±æ ŽTÀãgK¸r{¯`|j6.%”úESWù>!ä¹ç«ïú‰ †aŸ†Ž–j´Ö—ïÅy’m,›^¿1–cŸ;q‡)+ÊÁ;odâÂwš10úÿôÁu Œ=Þ‘“WI‹æÎlACõœj¬ÄɆ d¥¥Àn5ïv:&9Cóv/1&9™©vt¶Õà¸44øß>éÚZ–ž´Ý7›Å„sÇëðfgÓÖðè½ØR"f`teÒáƒùqߨf•6O;rƒãOðÏ^GWÿ$V76‘àR;îÍ``PR´7 ½¥:.ªóR 7§!“ ›%¡þ9/UÀOò:ºú'ðñ—ýq_ÝNTæ¤ãhU ^9ùR\žLM±r:͈L4`°¤¥X êY=ñn¹™©xël3ZëËqùÖ0º‡âëþ‰ävžX¥©‘EYa:ÛjÐZ_¾§RHÏQDFª[Ûð0: ` sŽ3d¤ÚøXŽ}î¥åfà¹f´Õ—ãÂÙ&üò³Û¸Ñ;žôêHc«§ãµ3GÑPs0î;wE‘€a˜HîÞßU&Ùm’H³}¾%óìVT—[Q]^ˆsÇëÐ=èÄ»ŸßÆWwǰ±éMzºV*Æ`@ANΟ¨ÇþnJ ²f|½‘c!Š„QÄ ;0 ¬ÅdÜWüÛ^*GÛKåžœÁÏÞ¿†ë½ãpo&nEw»Íl2¢º¬¯·7 ©¶%ùY°YMq¿ò–ׄˆ´d£ ‘²½I»muEøéO^Cg[ >¸Òƒ±Ç Ùì¶]f5›ðöùœiªDcÍÁ„žâðòðc6‚à9¤Lòs¬Á°·»Èöëí 8{¬7zÇñÁ•ô<Âê†'áÛÂÊ «Ùˆ~÷~ú“×öýŸKy[+€f¨1!DÜ﯒ÍbBg[ *æc`ì1>»9ˆ®þ‰}[ÑfYé)øîÉz\8ÿ'÷"5“‘ƒÙÄ,3Á²84™ÁÌ0̶ôaÄÓº[­ «´(¥EÙ8Ý\‰î{Nüæò]ÜrF¼o žuôÁ‚lt´Vã­³M¨,-ØÏ4 ‚¨hð‚ˆXcy­Q÷ÐCŒ<˜Áê†g«¦\¹ÔV_¶k[xô,+-­Õh­/ÃדøÙ×1ê|šÐÎQR…ßûN N7V¢¤ sWo:»}# ð‚œF2hÈ%5;0Z`P~ÂgäX! Œ:Ÿâý+½š+d×ÝŒ:=u>Åå[Ãø§®£½¥zχyY¥ö?èhDSm)¾¼3‚¯ôbô᳸YYÊÒR¬h¬9ˆG+p¦¹jOÒ£ò°«Ÿ-aviuëLŠÙÄ!ÝaC^VZêÊðfgã¶°•"“Nj•?hÅ 1á_>¾‰ßݺörñÙÅÕ­a^gš*ñûß;¶çª(7?zí$.œkÁÞq\êÄäã9<™]Ž‹ª¶ÉdDŠÕ ›Å„²¢lÔU£07‡KòQ˜››Å¼ëéÑîA'.^ÀWwG1»¸J}ŽÏÏcni sKk4‹Á‰'øã·;b> -^Ãh0‚3PcH4«’fæ]xÿJoD@PÛõÞqÜ~ˆ#•Pw¨­5(+Î ®†Úƒ^e =3ïÂðƒÜrbfÞ…õM/Ö6¼[ÓÆ ³uÊMþE{¸Gý½Rl¤ØÌHµ[qè@.Ž­@iaö–ÜÜ SJ¡ÿì6®GXé÷úèžÂòêE¸7½xõÌÑX®Ã†]gˆH‚ÈJxën.߯å[ÃQAù"u:Ñ=èÄG_ö¡¹¶§›*ÑÑZƒœ]Úi¬hŸj<Œ?xõØszxvakn/xAɶû$"Íj‚ÃnEq^æÖÆ½ì ’ÇÓ<œ^À—wF0ü`÷ÆŸD=ªE$Îéyüí//Ãn5ãå–꨾ÏÏcÓëg4b„!è``Héuf΅Ô![ZÙÀ¥®!\êBAN:ΫÝñ#„¡LÙîñ"™<žæFï8zîOaiec[¾/!ÎéüÃo®!/;U¥ù³‰ƒÝj–S«Ð“CZàÐJ¡F4ÈkˆvÒž-¬àÿýök|p¥ÅùYøÎ±Ú`'åJ…ýn²ê{Œ¯ö¡oôÑŽü‘ N<ÁGW{ñß~ØU¬XÆN>?IP¯òVÁà£HHDÁ×Ì fæ\;þÏ ÁƦ£Î§x8=K]C¨«(Â[g›_ˆ±ò{!…zîOalêÙŽ×^¼¾îOafÎÕ¢ÃÔkLi3­cŸ Àõ O̱B4:qüÑ,Æ÷A7וíêúÛ¤Ú~›[Z‰jÑ¡ ˆÈL³³ˆá´Æ²ÃZ¢u,®¬oâÊíû¸Ù7ŽÒ¢´7WÅõa”x²ùå5 OΠ«—oÝdzŽۧáZÛŒjÑ!Ë“™Ê4ä*ˆæ1‚òIëGŠ»u×ÙAˆy}Œ:ŸâÁã9|ñõjÊ ãö˜â^š<©ïο»}Ó³KØôø÷¼­Ýà£^tè°YXDÖ’2€æD¬D3夣(/£ÎøXˆà8§àœ^À¥®!T—àͳMèh­yáƒíîA'>¸Òƒáɺڇë½ã¨8‹—[ªq²¡ÙéؤöîxÀÌœ Îéy|òU?nöM`-n@Z–›åÀÙãµÛÕ©¬wÌ3ì¹I1Ÿ®./Ä;)V妇y Lb3A&Ü ¢ˆE×:]ë¸=èDšÃмÌ4¤;lÈH³Ãȱ0YXL&d¥§ 5Ň݊´+8–!V³1Øek5Ãj6"ÅfÙ’’qåIÜ´ŽUù}ØêV~í¦×Ÿ½ÿ>»1ˆÇÏ–æ¼…6+ÐRWކª’¨¾ÞÀ02‹‹!d‘k| f³Ù`` 1ß÷Ã0/BVÖ6±²¶¹õŠ)oêmŽc·ÖÌ ÃÖûòDs9€µ˜Œà8 tv#Ç"À `¥¯Kµ[aäX˜MŒ †a‚'3s®mYêf00h©+Ç;?8µÝá4ëi3ƒÁ`Ø–cŸrP­æêðG\ƒƒÂ"ÏÅŠ»³(ˆâ7﫳8^ðk;ón·A앱ªÊòñΧbR "·Ãt?¢Ã=ÄãñˆgðïÄQAy˜—ò|tÏðC¬mx’½^@³˜Œ¨=T„?~»=æoòùDÞq½sÇ>#•P3ó.|òU?º&áñúÁÇùÂô¤mOÖ(7+mõåÛ¶ãM>0!ôS«&“É@&šcŸ±H¨áÉÜrâJ÷'žì=œ´ç­´(¯½Ü€ºCEÛÞ]LñWÝ€9dÍó<ñûy»ÜµZW|q~ø½cžœF÷`°Ìùd>¹ª*Á­¼8mµx¹¹jÇΜ¢¨¬3DT ¢(BÙ«n›Å„†êƒ8|0Î5ãÖ½øôÆ=L<šÅ¢k#î¶}&íÛf6q¨*-Ørþݨ곌œ ·c„'ßhôø{*Ú‹t‡ é~ï;-8väƦžáj÷®ÝÃüòZÒãâȆÃnAI~Ê‹sÐÑVƒ£•`³šwµßKbs[êîÕõ͸*µÊ±ÇTàŽFt:q­glWŽ"&MãNÌk!Ù)¨*-À‰£(+ÎAQnÆž2ä…Øö!S§clúq½ª%ÔÀø|Ù=‚þÑǘYpA’j§¥ˆÍjFQ^FÜ$D_@€þ¨˜ÈeÒ¦'·ó蕪07͵¥˜™wázÏ>ùªOf—“^»v°0¯·ïLh»€êFÐd{Áà÷'Ì-673¹™©h¬>ˆ·Ï·n ë}”LÏÆh»‘ÚN[Yw‹€„3Ì-¹ënOÂmr‘‹yÎ5cxrŸ\ëÇí{ðpz!Øþ4}Ö5²¨:X€ŽÖê]Ëm_¼ buÍC(OTÎO´€A†Æœþ¹5{âþcë*Š“éÀ+'ëÑ=èÄ¥®!8§çá÷óÉÖ…YÍ&”d¡¬(çŽ×¡©æà®g¶Ã¦g—1·¼î>B‹æD=æÙ²Ž„þG+%”Ì¿½ÖÛƒN,¯l¼° °˜ÈNOAeiΫÝó,ÐvØÌ¼ 7û&6CÈ!¢ºž{ž†þá½K8S÷ã}ã¹™©ÈmKEg[Í–„œ˜Æ¨ó)6½þ}ßŲäf¦¢³µgÕî«aþ¾‘)/ˆÏ<Ï@¼¾3Ðnu÷ݸ;òätKÍ}粄š™wa|jŸßÄ}çSx}ð¼°¯ªÜ©)V|ïÔKèh­Ù·“‡&§ñ7¿¼¼ `MƒD ¾OèínûÕ§7‡÷%ÔêŽF ?˜ÁÐÄ4î ?Äý3p{|„`¿‹|ŠL½3A5¿¥-Uïï•e¦Ùq¤²§›*qþDݾµùá•^`Iå䢯# ¡m8‘çUåeg\þÅÿú“’mè–z™zÿ‚×€ÇëǦ/€ù¥Uxf“^_„ˆ„Àçlí™¶YL Às뜂'×Ä­÷•Õt–5l}N½Ø„e `À€— ®Yé)[Ë]- «BPûæÿôèGpF0à¼`/7€u‰1V¤Ë%=®JŸsØà§Á ÁàOÿûÎÿÙ_?™šÈ ³ãÉ<Ò„ëM¯›Ü^ÿV=„¬»½XÝØÄÚ†K+ðúüAfb° ‹ÅˆŒT;Ò6d¥Ù‘“™Št‡v«)!³@±ZÍÿC0`YBÁQGÉÉ×tÀ°!]^>.DúéƒO® 4·Ô•½ÑZŸ÷¾fÃ)‰jþWïÀ¬äà²ì\%pÈ‚âQPï^àTÈ Y@ ±‚GÅ ~“ðJ0Ði9˜^z:¿2ÄóbIQ^F®Íjæ86)™’¶óàLLÍâ¯~qiý/~þÙìƒ'ó ¦Q#T`PÁ­Á J0Œäô*'e•,l²\øƒïŸøÑ‰£‡ò[ë˹´ëŽHÚ‹gþÙÅUôÜŸò}xµwýö½ RÖGPÊJF¨@à–¾f]Ê­*2KrJUE@@k0«Ì 3«€<çšjK½ÙÙXÔÞR•î°[LF6 Œ¤Ee‚(b}ÃKî?ö}Þ5äûôƽU×ï’œUÎúÈ fà)ŒàÆ75†ud lH€QÆ ¼Ö´1%Œ , R¤+ @!€JMomnüî©ú´ÖúrØ­æä7iá@ñdv—»‡Å¯ö­ŽMÍ.ã›Ü¿²j¬fA0ûó&ž/¸­+® …d’c ž†PRÉÀ.]©K(KTw´V—¾örCA{K—,Ö%Mm"!˜™sáFß8®÷Œù®v¬XT>ÇLT, d!Dœ°‰o j ¸ñƒW"€¨=v°+BƒCñ1+€µm5Ž–º2®½¥š++Îá Iõb@±¼êÆàä ¹z{Ø÷Þ¥;>IÇ/IŽL@ï+U PK#e¬ ƒ[uý\A -©$·fp vPB »[ À^ IDATؤX#@€ì?üþñ‚޶ZKI~&ò²Ò`1“^²ÏÀç `ѵN.ß~q±+0=»,³nɉ†4$‘šÔ5ÙÙ•PÁ« šñMzVÐÕMcNrn³ vd0X¥Ë,±ŠI’Q eÅ9éç×£µ¾ …¹(ÌI‡ÙÄ%ƒï}d³ +äã¯ú}_Lz¿˜\“œÓ#9 @Ph~­›:êQ€Gù}E-f€;ÈrI?ØT °IræI~žœ‘’¿Þ GbŒgš«lÎ5ãÄÑ XÍ&$³R‰iOç]âµ»£Â»_Üñ]ÆG€Åé}ªó*Ѐ €&B1ƒ J¡Œ'h—‘r©AaÔ…Q2kd(—™fÏø¯^f;ÛjQ^œ“ôv[\YýÅ]÷GW{×œÓ .h·Dˆ:  • ¢Õx»»ÞÇx Ð~†DƒÉ@B¸`Є²IÙÏdP°K…ò‘ÆZ`0R˜G‘2J©Ý 9)VsÖï¿z<ã•“õ–ªÒ˜MÜ AqñÆ€û£«½ë7z'\x¾=šèd€¢@8,@“<~˜‚§àêz…ZÑØ@ý6"IÉh-Š3h°…AŽHXƒ£¤^õÞ׋Üz^ òÕÓGÒ;ÚjP^œƒ’ü,8ì–¦¸·äZ'w†§„›ýãâ¯.ÝY@°1Nv0„€ ÓÀGÈÊçÒ´(A¯dÓ&çi!R0Ѐ@c u\¡–QêK‹1B±€šEÔ±‰úëì¨0r¬åÕ3G¸Ó•\uY!2ÓìpØ-0÷kx}Ü‚þ±Çâ¿|xݽ´ê^0íÆ8Z@ËñyöSŠe &àu Pb1D,1¢ƒ ´@¡Î@)3Qj)Š9¸0À ‡¨d‘ê”–çXϯC‹´‰Æa³ 5ųɸ•aP,r½w÷îwÏý©uG©¬«‚ápã´ê<Å¡i¯÷v8òG B‘Bº@ˆ á€B)¡ ÁZÁ·^¼¡-Se “êûY$PÈ`=Ó\…²Âläç¤#73©)Vd¤·™ŒXƒiëV}Ãë <×+"XÖ@ÒNî×î™.^ð}ôeŸoÝí]”@ ê¤BÃaš”ñGàôJñK 5ðDt¨ lB‚ÆP€ ¶ˆDN©/-†0SÒ·FŸòûÙlÉ’.Vñ»+ÙM X@ç±äg¥#ÝaEVz ,fŒ "X-&XLFX-Fd¦¥Àj6n1OVzÊ7ÒÆ€Eú¸HˆH¶€%Ï|•çWÍ.®âZϨpûžS¸x}À‹àT¹u)#Ä«œ…¦­ÃiŒ Dù èäýÕ)P^ãõdP(§'Ñ:òvBïýPñMN±aÔ4¸©ZSˆ4.GÉJ©ÙIÉfòsYÀ! ç㥿EžtîWP»ÜÝ+3•üX6‹ùØÑC–¢Ü “Íbâ¼às­º½³K«ÞdzËÞ'Ï–”Á)Oq|šÓhÅz-ÒZyþp _|„A°Ha°aC¤ÀP³-+¥—Òc‹pc‰PA7 J`ªg:ÛçÃ|­i7Q•÷×- S®pÏ ÐZ!ü!®p U£¥BEPc'@°“`ˆ`h÷BU½M:E¾HÁD %#•z@Â;:꜀ ¾(A ®FkíÔýM»Â{†Xd”ºÚ­Œ7ÂÉJmGÊDaµ|SßÍ&SDZàÔ{ýÂB$lN?P¸  v» Dx·Ó ZY)­Ê7§SíÖ‹'h²É@a®hÁ WÃAˆï¥v$‘’øAïÕc­:íBˆzÀž`¯Á-0 |Ó€ÁQ‚îHz¥Bµ”Ó‚jƒJ÷3:wúp_‹p@AýüO© èÅ~Ðâ´Ú!ÂÂŒvñ†íF8±E¨ø‚Öú¡ÕJ®þY ¥¾B“:áÄ zì¨8kµRó:E³HcZ%XDè傈7Ä+ÂB$Áw$ñz Mb±”ØA+è—BìÑ’^$´ÎðÐnŽ Uޤ.xuºýŒP „Zµ ­‹Õ`–3tØ ÔߣÕ©%—ÂI¥FÒW¤— §'(.%Ð~ÃvC¯ê­Õv®fµìbÂH±2þ ê¯1„ŒÓªÌ‚†TÒÊ*EÓi- îÈ`ˆ¦†*¾`4Ò¥4çW?‡–ZÕË$E*‘´@Åè€&•h’Iïm­Æ¸°–‹Ç« ÚÏ`ˆzÅ=6„¤ÒºX!îè‘c@´VF‰VxSâ‘B €ý†í ¼õ2SL&U`¢ø½#a½…à4¶Ð*ˆíJc\ ñÅŒNÚ4TpËÄ^=01!˜P“0_¤H.µ“ï+¼(`ˆzŒ¡—¥B @@„` ×´îèZE°=kŒK‚!ñCënÍ„ñõѾÞL¿·ÞñF‚5a,@^$ÇH#|ÙÂDáÀÛõ;…bZ¿p,@³ÿS‘_Ëð<ìŠIEND®B`‚nco-4.5.4/doc/logo_pch.xcf000066400000000000000000001714211264355130400153550ustar00rootroot00000000000000gimp xcf fileÃAB´B´½Unnamed™BÂ@ÀBÂ@ÀA`B¼A`B¼A`B¼A`C‰€A`C‰€A`C‰€BœC“€BœC“€BœC“€BàC“€BàC“€BàC“€C-C‰€C-C‰€C-C‰€C,B°C,B°C,B°@jpeg-settings U            gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) Ô /˜ÎC#NCOÿ     = ¬Fgimp-text-layer*(text "NCO") (font "Sans Uralic Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.843137 0.698039 0.533333)) (justify left) (box-mode fixed) (box-width 67.000000) (box-height 35.000000) (box-unit pixels) ÂC#Ú #C#î ïÀ×À²Àˆ‚ÿýÝþÿÿõx¼æùùæ¼x ôU£×ôýó×¥Xÿþyþÿÿü‡ùÿÿüû• ýMàÿÿýßOÿýóþÿÿý Áÿ ÿýÔþ€ÿ ÿþ‚ÿþ¡þ+ÿÿý²ÿ ÿýÅþrÿ ÿürÿÿýþ6þ8ÿÿþcÿÿ÷äl" 0‹úÿÿþ^ý3ûÿÿöý£DD£þÿÿüùÿÿú­ÿÿÇþDÿÿýãÿÿýÍýIþÿÿþÃþÂÿÿýòDýFôÿÿÿú!÷ÿÿ\þPÿÿþMÿÿýø!þ©ÿÿúú2ÿÿþTþWÿÿÿù…ÿÿä þ\ÿÿþ—ÿÿþ›þ5ŒŒû‡ÿÿþ¾ úÁÿÿÿÿù åÿÿ„þiÿÿþËÿÿþKþÃÿÿþ\ ú_ÿÿÿÿ÷^ÿÿ÷ uÿÿþìÿÿþþèÿÿþ" ú$ÿÿÿÿ÷Èÿÿ¬ÿÿþüÿÿþþûÿÿþ ú ÿÿÿÿø7þÿÿ@ÿÿþýÿÿþþûÿÿþ úÿÿÿÿù¢ÿÿКÿÿþðÿÿþþêÿÿþ! ú ÿÿÿÿùóÿÿg¦ÿÿþÓÿÿþCþÃÿÿþ\ úYÿÿÿÿúzÿÿêÂÿÿþ¤ÿÿþŽþeÿÿû0‡ÿÿþ¾ ú¼ÿÿÿÿýÞÿÿþ_ÿÿýñþ¸ÿÿúþ 2ÿÿþSþTÿÿÿþRÿÿýòÿÿý» þaÿÿþÉþÇÿÿýòCýEóÿÿÿþ½ÿÿþÿÿ÷Ø_ <ŸþÿÿþcþBÿÿöý¢CC£þÿÿüþÿÿý-üÿÿýÐÿ ÿýÉþ“ÿ ÿüÿÿþ–ÿÿýÛÿ ÿý×ý¦ÿ ÿû¡ÿÿýîÿÿü¤þÿÿüý—ýjíÿÿýëgÿþnÿÿõ)†Åëû÷å»} ô `ªÚòüòÙ©^ Âh×h²hˆ×,µÿ'ÿzÿ·ÿáÿôÿûÿëÿÅÿ‰ÿ5Æ@!!»8 Backgroundÿ      Ö»8 ö˜ª˜¶˜Â»8 >e%+g6ªCøQU a‰pBx„ôŒ¡‘× ?þ×<×<×;×:þÇ××9þ{××8þŠ××7þŠ××6þp××5þg××4þj××3þ\× ×2þL× ×1þ/× ×0þ× ×/þ× ×.þ××-þ××,þ××+þ××*þ××)þ!××(þ!××(×'×þ¯%×ý0$×ü–##×ûÖ… ?þ²<²<²;²:þ¥²²9þf²²8þr²²7þr²²6þ]²²5þV²²4þW²²3þL² ²2þ=² ²1þ'² ²0þ ² ²/þ ² ².þ ²²-þ²²,þ²²+þ²²*þ²²)þ²²(þ²²(²'²þ%²ý‚($²ü|#²û±n ?þˆ<ˆ<ˆ;ˆ:þ~ˆˆ9þNˆˆ8þWˆˆ7þWˆˆ6þGˆˆ5þAˆˆ4þBˆˆ3þ:ˆ ˆ2þ/ˆ ˆ1þˆ ˆ0þ ˆ ˆ/þ ˆ ˆ.þ ˆˆ-þˆˆ,þˆˆ+þˆˆ*þˆˆ)þˆˆ(þˆˆ(ˆ'ˆþn%ˆýc$ˆü_#ˆû‡T¿þ<üy:ûhÿ 9úmÿÿ8ýsÿÿ9ýmÿÿ9þgÿÿ8þTÿÿ7ýMþÿÿ6ýQüÿÿ5ýIûÿÿ4ýKûÿÿ3ýFüÿÿ2ý8ýÿ ÿ1ý5þÿ ÿ0ý%üÿ ÿ/ýëÿ ÿ.ý!Üÿ ÿ-ýÍÿÿ,ýÍÿÿ+ýßÿÿ*ýåÿÿ)ýÚÿÿ(ý Âÿÿ'ý¨ÿÿ&ý ¤ÿÿ%ý «ÿÿ$ý «ÿÿ#ý °ÿÿ"ýžÿÿÜöHip€oU+4óI~§¸Ï××Ͻ­O0û/s¬Í××þV.ûM˜ÇÕ× ×ý½Y,üX¤Ð× ×þq*üa«Ó××ýÉ6(üT£Ñ××þ·'üO˜Ê××ý®$üFÒ××ýÀ "ý6p××þÁ!ýH{××ý³ ýNš××ý²ýLÓ××üÖ´6þN××üÕ¼QþT×!×üÖ¿OþV×$×ý»AþT×&×ýÈ=þH×(×ýÈ$þ×*×ý»Hþ×,×ý¿P þ!×.×ýÄN þ!×/×üÖÅXþ/×2×ýÄXþ6×4×ýÁTþF×6×ýË[þF×8×úËTF××üÖÎÕ××üÁX××õʯ”yVZ“¯Ê××þÄ××ú¼c$ û $c¼×1×ü¯?ü;¯×/×ü¯+ü&¯×-×ü¼0 ý$¼×+×üÊH ý1Ê×*×ýlýCÒ×(×ý‰üVÍ×&×ýyü YÇ×$×ýl üOÇ×"×ýnüPÍ××üÒ[ü:É××üÍUü3Ä××üÇ\ü?»××üºNü/¯××ü´C ü)¬××üª@"û*šÒ××ü¦1$û„Í××ý©&(üvÇ××ý–*ü [Â× ×ý‰ ,üPÄ× ×ýy.üPÂ××ýl 0üIÇ××ýn3ýCÍ××üÊPûý½××ü¼?ùDjlZù¬××@üƒÔ××ý¨*û#–×ûÔ××ü©#ý‡û„Õ××ü§%þü#–××ü¬0Üö5ü~àÿÿúôçÛ=/ü|Ùÿ ÿý?,ü9ïÿ ÿýP*üCßÿÿýh(üBÏÿÿýu &üLÊÿÿýu$üOÕÿÿýh"üXÝÿÿþF!ü_ìÿÿý0ü>óÿÿý0ü4éÿÿýKüCßÿÿýz üBÏÿ ÿýœüLÊÿ"ÿýœüOÕÿ$ÿý™ ýRÝÿ&ÿý‰ ýPìÿ(ÿýý'óÿ*ÿý£ ý!éÿ,ÿý¬ ý8ßÿ.ÿý¸!ü:Ïÿ0ÿýªü?Âÿ2ÿýœü?Ãÿ4ÿý™ ý5Âÿ6ÿý… ý%Æÿ7ÿùùx Ìÿ9ÿûóx²ÿ;ÿýì–ÿ~ÿÖþX8ýÅN7ü×ÅX6×ýÄX5×ýÁT4×ýÌ^3×ýÍ]2×ýÆd1×ýÌd0×ýÎV/×ýË^. ×ýÈf- ×ýÊk, ×ýÏ~+ ×ýÐ~* ×ýÌ|)×ýÑv(×ýÒi'×ýÏ|&×ýÏ‚%×ýÐ{$×ýÔ…#×ýÒ‡"×ýχ!×ýÓ‰ ×ýÔ‡×ýÔœ×ýÔœþ‰××ýÕ‡ü nÊ××ýÕÖþI8ý£@7ü²£I6²ý£I5²ý F4²ý©N3²ýªM2²ý¤S1²ý©S0²ýªG/²ý¨M. ²ý¥T- ²ý§Y, ²ý¬h+ ²ý¬h* ²ý©g)²ý­b(²ý®W'²ý¬g&²ý¬k%²ý¬f$²ý¯n#²ý®p"²ý«p!²ý¯r ²ý°p²ý¯²ý¯þr²²ý±pü [§²²ý±uÖþ78ý}17üˆ}76ˆý|75ˆýz54ˆý<3ˆý‚;2ˆý}?1ˆý?0ˆý‚6/ˆý;. ˆý~A- ˆýD, ˆýƒO+ ˆý„O* ˆýN)ˆý„K(ˆý…C'ˆýƒN&ˆýƒR%ˆý„N$ˆý†T#ˆý…U"ˆýƒU!ˆý…W ˆý†Uˆý†cˆý†cþWˆˆý‡Uü Eˆˆý‡YÚþ9ûIF6ûbŽ 6ûZS6ü. 7ý8þ8ýg7üìj 6ûÿól5ÿüù{ 4ÿý™3ÿýœ2ÿýª!1ÿý¸0ÿý°/ÿý®!. ÿü¡, ÿüž + ÿü²** ÿüº3) ÿüÆ9(ÿüÌ,'ÿüÇ.&ÿüË>%ÿüË.$ÿüÇ,#ÿüÌ9"ÿüÆ@!ÿüÏT ÿüßZÿüïhÿýgÿýó1ÿýáÿýÐÿýÊÿýÕ*#×ûÔ#×üÔƒ$þ××üÔy $þ××üÔz $þ××üÖs$þf××ýf$þE××ý`$þH××üÊ<$þI××ü¼0$þN××ü¯8$þJ××ü.$þ(××ü–#%×ûÖ…%×ûÔ$þ ××üÔƒ&×üÔn &×üÔb&×üÍB&×üÄ5&×ü»?&×ü¯/&×ü¬)&×ü§0þ& þ¾××ü™'ü0¦ ýKÉ××ýû@ª× ýyÏ××üÒl úC´××ýŠÓ××üÍ[üNº××ýÓ××üÇY ü\Ç××ý~Ï××üÇOüUÍ××ý^Á××üÍPü cÒ××þ”××üÒ@ý „××ý=¯××üÊ?ý”××ý^Í××ü¼Hý*¨××þv××ü¯Lü#©× ×þ„× ×ü¯Qü%§× ×ýˆÕ× ×ü¼^ ü0¬× ×ý‰Ö× ×üÊyü6§× ×þŠ× ×ý¯CüG¯× ×þ‹× ×ý”(üL¼××ý†Õ× ×ýy ücÊ× ×ýÖ¼þŠ× ×þlý ××üÔ©8þ‰× ×þlý„××üÔœ*þŠ× ×ýy ý××üÊrý†Ô× ×ý”(ý›××üÂSþ‹× ×ý¯Cý¥× ×ûÒŸ.þŠ× ×üÊy ý0¬× ×ûÍ~ ý‰Ö× ×ü¼^ ü9ª× ×üÇm ýˆÕ× ×ü¯Q ü I¦× ×ü¾M þ‰××ü¯^ü^¯× ×ý¹6þ‰××ó¼rC( (Cy¼× ×üΈý„Õ××õʯ”ylly”¯Ê× ×üÄ]ý„Õ×%×ûÒŸ0þ‰×%×ûÍ~þ‰×$×üÇmýˆÕ×"×üÇRý‰Ö×!×ýÍCþŠ×!×ý¸þ‹× ×ý¡ý†Ô××üÍyþŠ××üÂRþ‰××ý¸@þŠ××ý“ý†Õ××ýtþŽ××ü¼=#²û°i#²ü¯l$þw²²ü¯d $þ‚²²ü°e$þ‚²²ü±_$þS²²ýT$þ8²²ýP$þ;²²ü§2$þ=²²üœ($þ@²²ü/$þ=²²ü‚&$þ!²²ü|%²û±n%²û°i$þ ²²ü¯l&²ü¯[&²ü°Q&²üª6&²ü£,&²ü›4&²ü‘'&²üŽ"&²üŠ(þ þ²²ü~ ü(Š ý>¦²²ýuû5² ýe¬²²ü®Y ú7•²²ýs¯²²üªKüAš²²ýw¯²²ü¥J üL¥²²ýi¬²²ü¥BüGª²²ýN ²²üªBü R®²²þz²²ü®5ýn²²ý3²²ü§5ý{²²ýM©²²üœ;ý#‹²²þb²²ü>üŒ² ²þm² ²üCüв ²ýp°² ²üœN ü(޲ ²ýr±² ²ü§dü-в ²þs² ²ý8ü;² ²þs² ²ýz"ü?œ²²ýo°² ²ýe üR§² ²ý±œþr² ²þYý k²²ü°Œ.þq² ²þYým²²ü¯#þr² ²ýe ýw²²ü¨^ ýo°² ²ýz"ý€²²ü¡Dþs² ²ý8ý‰² ²û®ƒ&þr² ²ü§d ý(޲ ²ûªi ýr±² ²üœN ü/² ²ü¥Z ýp±² ²üC ü =‰² ²ü@ þq²²üNüN² ²ý™-þq²²óœ^7" "8dœ² ²üªpým±²²õ§zeYYez§² ²ü£Mým±²%²û®„(þq²%²ûªiþq²$²ü¥Zýp±²"²ü¥Dýr±²!²ýª8þr²!²ý˜þs² ²ý…ýo°²²üªeþr²²ü¡Dþq²²ý˜5þr²²ýyýo±²²ý`þv²²üœ2#ˆû†Q#ˆü†S$þ[ˆˆü†L$þdˆˆü†M$þdˆˆü‡I $þ@ˆˆýA$þ+ˆˆý=$þ.ˆˆü&$þ/ˆˆüw$þ1ˆˆün$$þ.ˆˆüc$þˆˆü_%ˆû‡T%ˆû†Q$þˆˆü†S&ˆü†F&ˆü†>&ˆü‚*&ˆü|"&ˆüv(&ˆüo&ˆüm&ˆüjþ þxˆˆüaüi ý0~ˆˆýYû)lˆ ýMƒˆˆü…Dú*rˆˆýX†ˆˆü‚:ü2vˆˆý[…ˆˆü~9ü:~ˆˆýPƒˆˆü~2ü6‚ˆˆýˆ ˆý‡wþWˆ ˆþDý Rˆˆü†k#þVˆ ˆþDý Sˆˆü†cþWˆ ˆýM ý[ˆˆü€H ýU†ˆ ˆý]ý bˆˆü{4þXˆ ˆýn+ýiˆ ˆû…dþWˆ ˆüL ýmˆ ˆû‚P ýW‡ˆ ˆüw< ü$lˆ ˆü~E ýV‡ˆ ˆün3 ü.iˆ ˆüx1 þVˆˆün< ü#ûcÄ××ûÍ„#&üU»××üÇv)ü#–× ×ü®C,ýu× ×ý™/ü?Á××üÒp 1ü&¬××üÍ[3ûp¼××ýP 6ü 8¡××þ9û%yÍ×;ü RÂø  þ@õ>ylly”A3ý’××üÇ€0ü [Æ××ûÍ–7,ü-™× ×ûÒ¸_*ü<¯× ×ûÍ~'üL¼××ûÒŸ0%üyÊ××üÄ]#ý%ª××üΈ üGÁ××ý¹6ý }××ü¾Pý„××üÇw ü/–××ûÍ‘/ü3¬×!×ûÒ·bü TÁ×%×ü¡ ý†×(×ü¼= ü)ž×+×ýt üU»×-×ý“ ücÄ×/×ý¸@û#ˆÎ×1×üÂR ü&¬×4×üÌy%ý?Á×7×ü¡8 ü&‚² ²üŠ.+ü/² ²ü?)ü(œ²²üœF 'ü2§²²ü§Z %ýP²²ýr#ýT²²ýp!ü_±²²ý|üe°²²ýŽü i¯²²ýœüw¯²²ýª8û z°²²ü¥<û/…±²!²ü¡Bü7•²$²ü¢BüAš²&²ü¡KüL¥²(²ü¥b üGª²*²ûªm üK®²,²û®€#ý[²0²üŽ"ýZ²²õ§z[FWez§²²ü‘'ýe²²óœd7 "8dœ²²ü›4ý r²²û®…EüI²²ø£+}²²ûªl"ü;²²ú¦0Œ²²ü¥b ü:˜²²üªB²²ü”> ü=Ÿ²²ý¥B²²ü‡%üP¥²²þ¥²²û§bü7²#²üœF ý²!²ü?üL ²²ü~&ü*޲²ýuû` ²²ü§Uü 8޲²üœ?!û(qª²²û®†4#ûR£²²ûªm&üG›²²ü¥b)ü|² ²ü7,ýa² ²ý/ü4 ²²ü®] 1ü޲²üªK3û]œ²²ýB6ü/…²²þ9ûeª²;üD¡ù þ5õ 3eYYezu53ýz²²ü¥j0ü K¤²²ûª|--ý%~² ²û®˜O*ü1² ²ûªi'ü?œ²²û®„(%ü e§²²ü£M#ý²²üªp ü: ²²ý™-ýg²²üBým²²ü¥bü'|²²ûªx'ü*޲!²û®—QüF ²%²ü…ýo²(²üœ2 ü"ƒ²+²ý` üG›²-²ýy üR£²/²ý˜5ûpª²1²ü¡Dü޲4²ü©eý4 ²7²ü…/ücˆ ˆüj#+ü$nˆ ˆün0)üwˆˆüw5'ü&ˆˆüE %ý=ˆˆýW #ýAˆˆýU!ü I‡ˆˆý_üM†ˆˆýmü P†ˆˆýwü[†ˆˆý‚+û]†ˆˆü~.û$f‡ˆ!ˆü{3ü*rˆ$ˆü|3ü2vˆ&ˆü{:ü:~ˆ(ˆü~K ü6‚ˆ*ˆû‚S ü:…ˆ,ˆû…býEˆ0ˆümýEˆˆõn]F6CM]nˆˆüoýMˆˆówL*+Lwˆˆüv(ý Wˆˆû…f5 ü8nˆˆø|! _ˆˆû‚Sü-nˆˆú%kˆˆü~K ü-tˆˆü‚3ˆˆüq/ ü/zˆˆý~2ˆˆügü=~ˆˆþ~ˆˆüKü*nˆ#ˆüw5ýaˆ!ˆün0ü:zˆˆüaü mˆˆýYûJzˆˆüAü+mˆˆüw0!ûV‚ˆˆû…f'#û >|ˆˆû‚S&ü6vˆˆü~K )ü_ˆ ˆün*,ýJˆ ˆýa/ü(zˆˆü…G 1ümˆˆü‚:3ûGwˆˆý36ü$fˆˆþ9ûM‚ˆ;ü4{ù þ)õ 'MDDM]Y)3ý \ˆˆü~Q0ü9}ˆˆû‚_#-ýaˆ ˆû…t< *ü&nˆ ˆû‚P'ü0wˆˆû…e%ü Mˆˆü|;#ýlˆˆü‚V ü,zˆˆýu"ýOˆˆüx3ýSˆˆü~Kü_ˆˆû‚\ü mˆ!ˆû…t> ü5zˆ%ˆüfý Uˆ(ˆüw& üdˆ+ˆýI ü6vˆ-ˆý] ü >|ˆ/ˆýt)üV‚ˆ1ˆü{4ümˆ4ˆüMý(zˆ7ˆüf$ÿû T¼××ýÔ”üL¯××ýÒ—ü7§××ýÔŸü0¬××ýÕŸü%§××ýÔ«ü#©××ýÕ©ý*¨××ýÖ˜ýŸ××ýÖ¨ý›××ýÕ®ý××üÔ§ý„××üÖ©ý ××ýÖ§ücÊ××ýÔ®üL¼××ýÕ§üG¯××ýÕœü2¦××üÕ™ý&©××ýÑý–××ýËyý ‰××ý¼^ýy××þ”ý l××ý¯=ýn××ýÍ^ ü[Ò××þvþüUÍ××þ„ýY ü\Ç××ýÕˆüÍ[üZÇ××ýÖ‰û×Òk ühÍ××þŠ×ýüvÒ××þ‹×ü™(ý•× ×ýÕ†×ü¯8üE¼× ×þŠ×ü¼0üyÊ× ×þ‰×üÊ=ýC¯× ×þŠ×ý`ý(”× ×ýÔ† ×ýfý y× ×þ‹ ×üÖsþl× ×þŠ ×üÔz þl× ×ýÖ‰ ×üÔy ý y× ×ýÕˆ ×üÔƒý(”× ×þŒ ×üÔgýC¯× ×þ”×üÈP üyÊ× ×ýÖš×ü¼L ü ^¼× ×ýÖ«×ü¯I üQ¯××þ¹þ¸××ü¯^üL¯××þ¾ý“××ò¼yC( (Cy»Ö××þ»ýt××õʯ”ylly”¯Ê××þ¾ ü=¼×*×þ¿ ü ¡×)×þÀ ûb·Ò×&×þ¹ û/‘Í×%×þÀü wÇ×$×þ¿üP¾×#×þÀý6¹×!×ýÖ¹üˆÎ× ×þÀü]Ä××þ¿û0ŸÒ××þ¾û~Í××þ»û_¸Ò××þ¿û7–Í××þÁü€Ç××þ¿üE®××þÊý™×× ü \Á××!ü3¬××þÏ!ûyÊ××þÓû Fœ²²ý¯{ü?²²ý®}ü-в²ý¯„ü(޲²ý±ƒüв²ý°ŽüŒ²²ý±Œý#‹²²ý±~ýƒ²²ý±‹ý€²²ý±ýw²²ü°Šým²²ü±Œý k²²ý±ŠüR§²²ý°ü?œ²²ý±Šü;²²ý°ü)в²ü°ýŒ²²ý­uý|²²ý¨dý r²²ýœNýe²²þzýY²²ý3ý[²²ý©M üK®²²þbþüGª²²þmýJ üL¥²²ý°püªKüK¥²²ý±rû²®Y üVª²²þs²ýuüa®²²þs²ü~"ý{² ²ý°o²ü/ü9œ² ²þr²üœ(ü d§² ²þq²ü§2ý8² ²þr²ýPý"z² ²ý°o ²ýTý e² ²þs ²ü±_þY² ²þr ²ü°eþY² ²ý±r ²ü¯e ý e² ²ý±p ²ü¯l ý"z² ²þt ²ü°Uý8² ²þz²ü¦B üd§² ²ý±€²üœ> ü Nœ² ²ý±Ž²ü<üC²²þšþ˜²²üNü?²²þýy²²òœd8" "8d›±²²þ›ý`²²õ§zeYYez§²²þ ü2œ²*²þž ü…²)²þŸ ûQ—®²&²þ™ û'xª²%²þŸüb¥²$²þžüB²#²þŸý-™²!²ý±™üpª² ²þŸüM£²²þžû(„®²²þûiª²²þ›ûO˜®²²þžû-|ª²²þ üj¥²²þžü9²²þ§ý²² üL ²²!ü*޲²þ«!ûe§²²þ¯û5wˆˆý†^ü0nˆˆý…_ü#jˆˆý†eümˆˆý‡düjˆˆý†lükˆˆý‡kýjˆˆý‡`ýdˆˆý‡jý bˆˆý‡ný[ˆˆü†jý Sˆˆü‡ký Rˆˆý‡jü>ˆˆý†nü0wˆˆý‡jü-nˆˆý‡büiˆˆü†`ýkˆˆý„Yý _ˆˆýLý Wˆˆýw<ýMˆˆþ]ýDˆˆýn'ýEˆˆý; ü:…ˆˆþKþü6‚ˆˆþSý9ü:~ˆˆý‡Vü‚:ü9~ˆˆþWûˆ…DüB‚ˆˆþXˆýYü K…ˆˆþXˆüaý^ˆ ˆý‡Uˆün$ü+wˆ ˆþWˆüwü Lˆ ˆþVˆü&ý+nˆ ˆþWˆý=ý]ˆ ˆý†U ˆýAý Mˆ ˆþX ˆü‡I þDˆ ˆþW ˆü†MþDˆ ˆý‡W ˆü†Mý Mˆ ˆý‡V ˆü†S ý]ˆ ˆþY ˆü†Bý+nˆ ˆþ]ˆü2 üLˆ ˆý‡bˆüw0 üt…ˆ&ˆþu û\‚ˆ%ˆþzüK~ˆ$ˆþyü3xˆ#ˆþzý"uˆ!ˆý‡uü V‚ˆ ˆþzü;|ˆˆþyûe…ˆˆþxûP‚ˆˆþvû |ˆˆþwˆˆý]üV‚ˆˆþtˆˆýIýmˆˆþtˆˆü)ýzˆˆþxˆˆüwþ3ˆˆþyˆ ˆün$ý@ˆˆþvˆ ˆün)ýUˆ ˆþxˆ ˆüw<üfˆ ˆþyˆ ˆüLü&wˆ ˆþzˆ ˆýn+ýIˆ ˆþuˆ ˆý]ý]ˆˆþzˆ ˆýM ý)tˆˆþyˆ ˆþDü4{ˆˆþzˆ ˆþDüMˆˆýu‡ˆ ˆýM üfˆˆþzˆ ˆý]ü&wˆˆþyˆ ˆýn+ýIˆˆþxˆ ˆüL ý Wˆˆþvˆ ˆüw< ýeˆˆþ‡þyˆ ˆün3 üdˆˆý‚Oþyˆ ˆün<ü6iˆˆýy)þtˆˆówL +Lwˆˆü†`þtˆˆõMZMDDM]nˆˆý~0þxˆˆþ‡ˆˆü‡g þyˆ.ˆü‚: þvˆ-ˆüx( þxˆ+ˆû†[ þyˆ*ˆüGþzˆ(ˆû‡n*þuˆ'ˆü„Sþzˆ&ˆüv. þzˆ$ˆü‡Qþ|ˆ#ˆü€3þ}ˆ"ˆýe "ˆüƒA!ˆýe þ…ˆˆü…Fþƒˆˆýrˆü‡hˆüN þ‚ˆˆýy/!þ‚ˆˆü…^"ˆý/$ˆýu%þƒˆˆý‡S'þ…ˆˆý€;(ˆýk)ˆûZ('þˆˆý) 'ˆüW!&ˆûrA $ˆû„j=#þˆˆûb3!ˆû‡zV ˆú‡{T!þ…ˆˆû…{C þƒˆˆû‡v>"ˆûq1 #ˆû…f6 þ‚ˆ$ˆûg4þ‚ˆ%ˆû‚_, þmÿ8ÿþcÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþ^ÿ8ÿþhÿ8ÿþvÿ8ÿþ‰ÿ8ÿþ”ÿ8ÿþ•ÿ8ÿþ‘ÿ8ÿþ~ÿ8ÿþjÿ8ÿþaÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿ×ýÖÕ××û¼p××ûÅ[uÄ××ý¬&××÷Õ¥-6·Ô××þÁ××üÎpü—Î×2×ûÖ½[ üWÇÔ×/×ûÑ“5ü+”Î×,×ûÖ¿o üD·Ô×)×ûÒ’5 ü"ƒÏ×'×üÇ^ ý>¹×$×ûÕ§8ü)’Ñ×!×üÒoüW¿××ü¿4 û AŸÒ××þ€ûfÁ××ýËUû AžÑ××ý!ûn½××üÏt$û F¨Ò××ü¨. &û u¿× ×üÏ{+ü6¤Ñ× ×ü°8 -ürÀ××üÓ“1ü6­Ò××üÁ[ 3ûƒÈÖ××ý«+7ùD·Ô××9û"Ï×<ý6µ=þ ¿²ý±°²²ûœ]²²û£Ka¢²²ý޲²÷±‰%-—°²²þ ²²ü«\ ü}ª²2²û±œLüH¥°²/²û­y,ü$zª²-²üž\ ü9—°²)²û®y, ül¬²'²ü¤Ný3š²$²û±Š.ü"y­²!²ü®\ü Hž²²üž+û6„®²²þjûT ²²ý¨Fû6ƒ­²²ý!û[œ²²ü«`$û:‹®²²ü‹& &ûaž² ²ü¬f+ü-ˆ­² ²ü’/-ü^Ÿ²²ü¯y1ü-®²²üŸL 3ûl¥±²²ýŽ#7ù9—°²²9ûk«²<ý-–=þ ¿ˆ‡ˆûwGˆˆû|:J|ˆˆýmˆˆ÷‡h"t†ˆˆþzˆˆüƒF ü_‚ˆ2ˆû‡x:ü7~†ˆ/ˆû„\"ü]‚ˆ-ˆüyF ü+t†ˆ)ˆû…]" üSƒˆ'ˆü~;ý'uˆ$ˆû‡i#ü\„ˆ!ˆü…F ü 7yˆˆüy!û)e…ˆˆþQûAzˆˆý5û)d„ˆˆýc!ûFwˆˆüƒJ $û,j…ˆˆüj&ûJyˆ ˆüƒN +ü"h„ˆ ˆüo$-üHzˆˆü†]1ü"m…ˆˆüz: 3ûS~‡ˆˆýl7ù+t†ˆˆ9ûRƒˆ<ý"s=þ ¿ÿü T¼××þû4ŽÊ××ý?ûb¼× ×þÌü×uü S¯× ××ü–#üL¯× ××ü»Uü ^¼× ××üÄcüyÊ× ×þÌ×ûΈ/ýC¯× ××ü¬C ý(”× ××ûÁtý y× ×þÓ ×ü¬3þl× ×þÏ ×üÁ\ þl× × ×ý™ý y× × ×ü®Cý(”× ×þÏ×üÇvýC¯× ×þÏ×ûÍ„% üyÊ× ×þ ×ûÒ¢I ü ^¼× ×þ×û¼bü Q¯× ×ýÒ+×ûÊŽAü^¯× ×ýÔ+×ó¼yC( (Cy¼××þ+×õʯ”ylly”¯Ê××þ/0×ýÐ!1×þ(1×þ(ý„Ð×.×þ(ý>¹×,×ýÑ!ü)’Ð×+×þE üW¼×*×þR û AžÑ×'×ýÕ_ ûn½×&×ýÔn û F¨Ò×%×þ{û u¿×$×þ„ü6¤Ñ×!×ýÔ„ürÀ× ×ýÕ„ü6­Ò××þ‰ûƒÈÖ××þ‰üD·Ô××ýÕˆü"Ï××ýÖ‰ý6µ××þŠü„Ð××þ‹ý>¹××ýÔ†ü)’Ð××þŠüW¼××þ‰ û AžÐ××þŠ!ûn´××ýÔ†#ü F¼××þ‹$ý•××þŠ%ý‰Ö××ýÖ‰%ýˆÕ××ýÕˆ%þ‰××þ‰%þŒ××þ‰%ýÖ××ýÕ„$ý­××ýÕ„"û I–Ò××þ‰!ûu¾Õ××þ‰ûP¡Ñ××ýÕˆû+‰ÂÖ××ýÖ‰ûg±Ô××þŠü6ŸÌ××þ‹û ^³××ýÔ†û!‹Ï××þŠûH­××þ‰û 8‰Î××þŠûb¼××ýÕ†ü Fœ²²þû+u§²²ý4ûQœ² ²þ©ü²aü E² ²²ü|ü?² ²²ü›Gü Nœ² ²²ü£Rüd§² ²þ©²ûªp'ý8² ²²üŽ8 ý"z² ²²û `ý e² ²þ¯ ²üŽ*þY² ²þ« ²ü LþY² ² ²ýý e² ² ²ü7ý"z² ²þ«²ü¥bý8² ²þ¬²ûªm  üd§² ²þ²û®†; ü Nœ² ²þ²ûœQü C² ²ý®$²û§u6 üN² ²ý°$²óœd8" "8dœ²²þ$²õ§zeYYez§²²þ'0²ý¬1²þ!1²þ!ýn¬².²þ!ý3š²,²ý­ü"y¬²+²þ9 ü Hœ²*²þD û6ƒ­²'²ý±O û[œ²&²ý°[ û:‹®²%²þfûaž²$²þmü-ˆ­²!²ý°mü^Ÿ² ²ý±mü-®²²þqûl¥±²²þqü9—°²²ý±pük«²²ý±rý-–²²þrün¬²²þsý3š²²ý°oü"y¬²²þrü Hœ²²þq û6ƒ¬²²þr!û[•²²ý°o#ü:œ²²þs$ý|²²þr%ýr±²²ý±r%ýp±²²ý±p%þq²²þq%þt²²þq%ýv±²²ý±m$ý²²ý±m"û =|®²²þq!ûa°²²þqûB…­²²ý±pû$q¡±²²ý±rûU“°²²þrü-ƒ©²²þsû M”²²ý°oûs«²²þrû;²²þqû.rª²²þrûQœ²²ý±oü 5wˆˆþû!Yˆˆý(û>wˆ ˆþüˆJü4nˆ ˆˆü_ü0nˆ ˆˆüv6ü üLˆ ˆþˆû‚Vý+nˆ ˆˆüm+ý]ˆ ˆˆûzJý Mˆ ˆþ… ˆüm þDˆ ˆþƒ ˆüz:þDˆ ˆ ˆýaý Mˆ ˆ ˆün*ý]ˆ ˆþƒˆü~K ý+nˆ ˆþƒˆû‚S üLˆ ˆþˆû…f- ü ü 3nˆ ˆý…ˆûY) üwˆˆý‡U2ÿþ2ÿ2ÿ2ÿþ 2ÿ2ÿ2ÿ2ÿþ 2ÿ2ÿ2ÿþ2ÿþ 2ÿ2ÿ2ÿþ 2ÿþ 2ÿ2ÿ2ÿþ2ÿþ2ÿþ2ÿþ2ÿý$2ÿþ2ÿþ2ÿþ2ÿý$2ÿþ2ÿþ2ÿþ&2ÿþ72ÿþF2ÿþN2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^)×ûÁ…5 *×ûÓ´hþÏ×*×ûÔ´o+ þÓ×+×ûÖϾW 0×ûÔ·Q 3×ûªIþÎ×2×ûÏ”5 6×üʃBþ ××õʯ”ylly”¯Ê××ýÕºþ$××ó¼q66q¼××ý!Ð××ü¯Rû"pµ××þ+××ü¯B ü*“××þ/××ü¼L û3—Í××ý+Ô× ×üÊj û1…¯Ê××ý+Ò× ×ý¤&û9y¼××þ(× ×ýx û ;ƒ¼× ×þ+× ×ýSûB¡× ×ý!Ñ× ×þ=ûC–Á× ×ý!Ñ× ×þ6ù A”ÄÎ××þ+× ×þ=û CŽÄ××þ+× ×ýTú@ˆ·Ò××ý+Ò× ×ýxúA‘Í××ý+Ô× ×ý¤"úR¢Ê×þ+× ×üÊU"û#o¼þ/××ü°+$þý!Ð××ý™*þ(××þ*þ(××üÈ(þ(××ùÕ¥a%ý!Ð××û¸v: $þ+××û¾{A!þ/××øÕ˯p4ý+Ô××úÒµƒ9ý+Ò××ûÒªD þ(× ×û¦Rþ+×!×úÔ¶t*ý!Ñ×"×úÒÅ–5ý!Ò×%×ûΠD þG×)×ûªJþT×*×ûÁ‡: ýcÔ×+×û¼yC ýtÖ×,×ûʯ”< þ€×1×ü¡K þˆ×3×û¬J ý†Ô×3×ûÁ‹; þŠ×6×ýÍ‘þ‰×7×þÒþŠ××õʯ”ylly”¯Ê××ý†Ô× ×ó¼yC (Cy¼××þ‹× ×ü¯^üW¡××þŠ× ×ü¯Q û=”¯Ê××ý‰Ö× ×ü¼^ ù6a¡ÂÍ××ýˆÕ× ×üÊyûF‚Â××þ‰× ×ý¯Cû\–Á××þ‰× ×ý”(ù (l¡¼× ×ý„Õ× ×ýy û&Q¡× ×ý„Õ× ×þlûC–Á××þ‰× ×þlø(gœ·Ò××þ‰× ×ýy ú"K‘Í××ýˆÕ× ×ý”(#û-|¼××ý‰Ö× ×ý¯C&ûaœ·þŠ× ×üÊy&ü=þ‹× ×ü¼^ -ý†Ô× ×ü¯Q ')²û n, *²û¯•Vþ«²*²û¯•\$ þ¯²+²û±¬H 0²û°—C 3²û= þª²2²û«z,6²ü§l6þ ²²õ§zeYYez§²²ý±šþ²²óœ^--^œ²²ý¬²²üD û\–²²þ$²²ü6 ü"y²²þ'²²üœ? û*}ª²²ý$°² ²ü§W û(n§²²ý$®² ²ý‡û/dœ²²þ!² ²ýc û 1lœ² ²þ$² ²ýEû6…² ²ý­² ²þ2û 8| ² ²ý­² ²þ-ù 6z¢ª²²þ$² ²þ3û 7u£²²þ$² ²ýEú5p—®²²ý$®² ²ýcú 6xª²²ý$°² ²ýˆ"úD†§²þ$² ²ü§G"û\œþ'²²ü’#$þý¬²²ý~*þ!²²þi*þ!²²ü¦(þ!²²ù°‰P%ý¬²²û˜a0 $þ$²²ûf6!þ'²²ø±¨]+ý$°²²ú®–m/ý$®²²û®8þ!² ²û‰Dþ$²!²ú°—`#ý­²"²ú®¤|,ý®²%²ûª„8 þ;²)²ûŒ= þF²*²û p0 ýR¯²+²ûœd8 ý`±²,²û§z2 þj²1²ü…> þp²3²ûŽ= ýo°²3²û s1 þr²6²ýªxþq²7²þ®þr²²õ§zeYYez§²²ýo°² ²óœd8 "8dœ²²þs² ²üNüH…²²þr² ²üC û2z§²²ýr±² ²üœN ù-P…¡ª²²ýp±² ²ü§dû:l¡²²þq² ²ý8ûL| ²²þq² ²ýz"ù "Y…œ² ²ým±² ²ýe ûC…² ²ým±² ²þYû 8| ²²þq² ²þYø"U—®²²þq² ²ýe ú>xª²²ýp±² ²ýz"#û%gœ²²ýr±² ²ý8&ûP—þr² ²ü§d&ü2þs² ²üœN -ýo°² ²üC ')ˆûzT" *ˆû…rBþƒˆ*ˆû†rF þ…ˆ+ˆû‡ƒx7 0ˆû†t3 3ˆûl. þ‚ˆ2ˆûƒ]"6ˆüS*þˆˆõn]MDDM]nˆˆý‡vþˆˆówG##Gwˆˆý„ˆˆün4 ûFsˆˆþˆˆün) ü]ˆˆþˆˆüw1 û _‚ˆˆý†ˆ ˆüBûTnˆˆý…ˆ ˆýgû$Lwˆˆþˆ ˆýKû%Swˆ ˆþˆ ˆý5û *fˆ ˆý„ˆ ˆþ&û +_zˆ ˆý„ˆ ˆþ"ù)]|‚ˆˆþˆ ˆþ'û*Z|ˆˆþˆ ˆý5ú)Vt…ˆˆý…ˆ ˆýKú )\‚ˆˆý†ˆ ˆýg"ú4fˆþˆ ˆü6"ûFwþˆˆýp%þý„ˆˆý`*þˆˆþP*þˆˆü(þˆˆù‡i=%ý„ˆˆûtK%$þˆˆûxN) !þˆˆø‡nG ý†ˆˆú…sS$ý…ˆˆû…l+þˆ ˆûi4þˆ!ˆú†sJý„ˆ"ˆú…}_"ý…ˆ%ˆû‚e+þ-ˆ)ˆük. þ5ˆ*ˆûzU% ý?†ˆ+ˆûwL+ ýI‡ˆ,ˆûn]& þQˆ1ˆüf/þVˆ3ˆûm/ ýU†ˆ3ˆûzX%þWˆ6ˆý‚\þVˆ7ˆþ…þWˆˆõn]MDDM]nˆˆýU†ˆ ˆówL+ +LwˆˆþXˆ ˆün<ü7fˆˆþWˆ ˆün3 û&]nˆˆýW‡ˆ ˆüw< ù"=f{‚ˆˆýV‡ˆ ˆüLû ,R{ˆˆþVˆ ˆýn+û:_zˆˆþVˆ ˆý]ùDfwˆ ˆýS‡ˆ ˆýM û3fˆ ˆýS‡ˆ ˆþDû +_zˆˆþVˆ ˆþDøAct…ˆˆþVˆ ˆýM ú/\‚ˆˆýV‡ˆ ˆý]#ûNwˆˆýW‡ˆ ˆýn+&û=ctþWˆ ˆüL&ü&þXˆ ˆüw< -ýU†ˆ ˆün3 'þ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþaÿ8ÿþjÿ8ÿþ~ÿ8ÿþŠÿ8ÿþÿ8ÿþ–ÿ8ÿþ‘ÿ8ÿþŠÿ8ÿþƒÿ8ÿþƒÿ8ÿþƒÿ8ÿþÿ8ÿþƒÿ8ÿþ‚ÿ8ÿþ…ÿ8ÿþƒÿ8ÿþÿ8ÿþ–ÿ8ÿþœÿ8ÿþ¦ÿ8ÿý­ÿ8ÿý¶ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¹ÿ8ÿþ·ÿ8ÿþ·ÿ8ÿþ·ÿ8ÿý¹ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¶ÿ8ÿýµÿ8ÿþ·ÿ8ÿþµÿ8ÿý¹ÿ8ÿý¹ÿ8ÿþ¶ÿ8ÿþ¶ÿ8ÿýµÿ8ÿý¶ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¹ÿ8ÿþ´ÿ8ÿþ¥ÿ8ÿþ”ÿ8ÿýƒÿ8ÿþlÿ8ÿþcÿ8ÿý\ÿ8ÿý^ÿ8ÿÀþ=ýŒ6;ù3׺z( 6ö+ŽÑ××Ó°^1ú (C–Ò××ûÓ®h".û^”Í××üÑ­D+ü6‚Ã× ×üÒª@%û (C›××û‰ ûcšÏ××ûÊk5 ð .DYiŸ®º¿ÄÒ××çÀ> .DYi|„‰ˆ”¢³Ð××Ï××þÔ××þÖ××÷Õʺ­·ÃÇÈ××úÓ××ÖÖ×_×þÁ×<×û¬\W¡×7×ôÒ·\Y½ÇÒ×1×úʧdûl¢Í×/×ü¤FûX™Á×*×ûÍ‘8 ûY¬×&×ûʯ…%úS£Î× ×ùÍ—O ûmÄ××û‚= ût¼××ûµz? ûi¦Á××ú¼¡^!ä%?NMLQMNMQLMNONNSSNNO:!&þó—û A7÷ `×·ˆ@4û[¬××ûÄŽ<0û!a±××ûÎÊ(.ûp¬Ê× ×û¼|-(ú@y¶Ô× ×úÍ‘K' õ=h‚§ÁËÕ××ðÒ·œq="é &I¡¼××Þʯ”yaSONMLQMNMQLMNONNSSNNONXeœ·Ò××ý¼¡×;×û¡Q&Ò×7×õÁ–Cx´ÇÒ×1×ú¼¡i"ú$c¢Í×/×û‘>úQ·Ò×(×úÒ®v!Àþ=ýt-;ù*²še" 6ö$v¬²²¯‘N1ú "8|®²²û¯V.ûNz©²²ü­9+ü-l¡² ²ü®Œ5%û "8€²²ûr  ûS¬²²û§Y,ð&9JWiwƒšž¢®²²çŸi3&9JWgmrp{†”¬²²«²²þ¯²²þ±²²÷°§š—¡¥¥²²ú¯²²±±²_²þ ²<²ûŽLH…²7²ô®—LIœ¥®²1²ú§‰Rû Y†ª²/²üˆ: ûI ²*²ûªx. ûJ޲&²û§núD‡ª² ²ùª¡}AûZ£²²û¡l3 û`œ²²û–e4 ûWŠ ²²úœ…N!ä4@@?C@A@C?@@BAAEEAAB0 *þó—û6 7÷O²—p54ûK޲²û£u20ûP’²²ûª¡r".û]ާ² ²ûœg%(ú 5d—°² ²úªx> õ2VlŠ ¨±²²ð®—^2é ¯××&ý™××þÏ#üH××þÓ"ü'××"ü5–×× ûP¬××þÌú\–Á××úYŽÄ××ù ;v°ÃÎ××ú Mœ·Ò××þÏû m¬× ×úK‘Í×"×þ ù&gœ·Ò×"×ýÔ+ û F‘Á×&×ýÒ+úa¶Ô×)×þ(ù/{­ËÕ×*×þ+ü\™Ê×-×ýÑ!1×ýÑ!2×þ+2×þ+×õʯ”ylly”¯Ê××ýÒ+×ó¼y?! .b±××ýÔ+×ü¡Wü5™××þ+×ûʯ”= ü#Ž××þ/ ×ùÍ¡a6 ü$™× ×ýÐ! ×û‚Fü5°× ×þ/×ûʯ~1übÊ× ×þL×ùÍ¡a.ý.¯× ×þZ×û‚Fý”× ×ýÔiú×Á–\ýy× ×þ|ûl( þl× ×þ„þ"þl× ×ýÖ‰)ýy× ×ýÕˆ)ý”× ×þ‰)ý!¯× ×þ‰(üOÊ× ×ýÕ„ û6ƒ­²!²þvûW¢²#²þ|ûFН²$²þƒ ü^ª²%²ý± ü>–±²'²þš þa²*²þœü5¢²+²þ—ü /²-²þ—ý}®².²þ1²þž1²þ›1²þ²ó§sQ=32=Rr§²²þž²úœd1ú1dœ²²þŸ²û–\"üN²²þ™ ²ù±¨ g ü C²²þŸ ²ú°—d"ü Nœ² ²þŸ²û§Ž]üd§² ²þ£²ûœb(ý8² ²þ£²ûŽVý"z² ²²üjý e² ²²ûœoþY² ²þ¯ü†PþY² ²þ«ýý e² ²)ý"z² ²)ý8² ²þª'üd§² ²þª&üNœ²²'ý4²²&ý²²þ«#ü ;²²þ¯"ü t²²"ü,|²² ûB޲²þ©úL| ²²úIu£²²ù 1b’¡ª²²ú@—®²²þ«ûZ޲ ²ú>xª²"²þ ùU—®²"²ý°$ û :w ²&²ý®$úP—°²)²þ!ù'f¨±²*²þ$üL~§²-²ý­1²ý­2²þ$2²þ$²õ§zeYYez§²²ý®$²óœd4&Q’²²ý°$²ü…Hü,²²þ$²û§z2 üu²²þ' ²ùª¡…P- ü~² ²ý¬ ²û¡l:ü,’² ²þ'²û§i(üQ§² ²þ?²ùª¡…P&ý&² ²þK²û¡l:ýz² ²ý¯Wú² |Lýe² ²þgûY" þY² ²þmþ"þY² ²ý±r)ýe² ²ý±p)ýz² ²þq)ý² ²þq(üA§² ²ý±m û)d„ˆ!ˆþZûB|ˆ#ˆþ^û 5i†ˆ$ˆþd üH‚ˆ%ˆý‡n ü/s‡ˆ'ˆþu þJˆ*ˆþwü)|ˆ+ˆþtü $cˆ-ˆþtý_…ˆ.ˆþx1ˆþy1ˆþv1ˆþxˆónW>/'&/?WnˆˆþyˆúwL%ú&LwˆˆþzˆûsFüoˆˆý†ˆüf7ü!aˆˆþˆûn]& üYˆˆþ ˆù‚{f=" ü`ˆ ˆý„ ˆû{R, ü"pˆ ˆþˆûnPü>ˆ ˆþ0ˆù‚{f=ýnˆ ˆþ9ˆû{R, ý]ˆ ˆý†Búˆz_:ýMˆ ˆþNûDþDˆ ˆþSþ"þDˆ ˆý‡W)ýMˆ ˆý‡V)ý ]ˆ ˆþV)ýnˆ ˆþV(ü2ˆ ˆý‡S2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýb2ÿþb2ÿþl2ÿýz2ÿþ‰2ÿþš2ÿý«2ÿýµ2ÿþ¶2ÿþ¶2ÿý¹2ÿý¹2ÿþµ2ÿþ·2ÿýµ2ÿý¶2ÿþ´2ÿþµ2ÿý¹2ÿþ¸2ÿþÂ2ÿþÌ2ÿýÚ 2ÿþæ2ÿþó3ÿþ3ÿþ 3ÿ3ÿ3ÿþ þŠ× ×ü¯^)ü‰××û¼yC (ýŠ××ûʯ”<'ü&†Ô××ü¡W$ý)‹××ú¼yC ý(Š××øÊ¯”Hü‰Ö××û¬w5üƒÖ××úÍ¢l(ý ‚××øÒǽ…<ý x×!×û¼•Týh×#×úÍ¢l.þ]×$×øÒǽŽNþR×(×ûÁ¦iþH×+×û¼†8 ý/Ê×-×û¬`) þ³×.×ùÁ¦p*þš×1×úÁ–Kþ6×4×ü¬`3þ£×4×ýÁ¦þZ×6×ý¼×5×ýoÊ×4×ý$¢×4×üRÍ×3×ü‘Ò×2× ýEµ×2× û b¶Ï×0× û^”ÇÖ×-×ú=ÇÐÖ×*×üW—Ì×)×üQÊ×&×ûI~ºÕ×"×ûaš¸Ï××ù!f›µÏÖ×× ú=ŽÇÐÖ××#üW—Ì××&üQÊ××)ûI~ºÕ××,ûaš¼Ó× ×.ú!p¯ÊÔ× ×1ü6l·× ×4ütµ××7ûk©Ð××:úI‰«ÉÖ;üR‹¿þr² ²üN)üq²²ûœd8 (ýr²²û§z2'ü&o°²²ü…H$ý)s²²úœd8  ý(r²²ø§z; ür±²²ûŽb,ýl²²úª†Y"ý k²²ø®¥œn2ý d²!²ûœ|FýV²#²úª†Y&þN²$²ø®¥œv@þE²(²û ŠWþ>²+²ûœo/ ý*§²-²ûŽP" þ™².²ù Š]#þ‡²1²ú |>þ2²4²üŽP+þ‰²4²ý ŠþN²6²ýœ²5²ý\§²4²ý†²4²üDª²3²üx®²2² ý9—²2² û Q—¬²0² ûNz¥±²-²ú3v¥¬±²*²üH}©²)²üCw§²&²û=iš±²"²ûP€˜«²²ùT€–«±²² ú3v¥¬±²²#üH}©²²&üCw§²²)û=iš±²²,ûP€œ¯² ².ú]‘¨°² ²1ü-Y—² ²4ü`–²²7û YŒ¬²²:úsƒˆ0ˆ û<]~‡ˆ-ˆú'Z~„‡ˆ*ˆü7_ˆ)ˆü3[ˆ&ˆû.Pv‡ˆ"ˆû=btƒˆˆùAbsƒ‡ˆˆ ú'Z~„‡ˆˆ#ü7_ˆˆ&ü3[ˆˆ)û.Pv‡ˆˆ,û=bw…ˆ ˆ.úGo€†ˆ ˆ1ü"Dtˆ ˆ4ü Isˆˆ7û Dk„ˆˆ:ú.Wl‡;ü4X¿þ]ÿ8ÿþ]ÿ8ÿýcÿ8ÿýcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿý^ÿ8ÿý\ÿ8ÿþ[ÿ8ÿþZÿ8ÿý`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿý`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ.ÿ8ÿþ¿ÿ7ÿþgÿ7ÿýßÿ6ÿýtïÿ5ÿý¨ÿ5ÿüMßÿ4ÿü ïÿ3ÿý4Ïÿ3ÿû.µôÿ1ÿ û cØùÿ/ÿ ù^§Ïïÿ,ÿû<†ßÿ+ÿû&n³óÿ'ÿúR¹Úæóÿ#ÿû'fšæÿ"ÿýHÐÿ!ÿû =†ßÿÿùI„Áôÿÿ!÷;†¹Ùùÿÿ%ø$HŒÑèôÿÿ(ú!i¨éÿÿ,ûd³óÿ ÿ/ü=»óÿ ÿ0ú%Áôÿÿ2ø=v®åÿÿ6û[Ìÿÿ8ødÎåñþ:û -ø8v°ÄÎ×"×úÒ·•IÔ'7HMS[n|‰˜œ›¤¯¹ÂÎ××Ô××ÖÕ××ÕÕ××ÕÖ××Ô××Ík#þþã !&-23/,#úB 6ôZœ·Ò€91ûV–Á××ðΣwB þû@|Á× ×áʯ”yaSONF=3 ïAl¢Í×$׿Îù¯¤œœ˜‹|n[SNNQYjz¢²½ÇÒ×G×üÔ¦c×8×üÈ™^ü²ÄÑ×2×ûÏ¡võ!fšµÂÐ××ÖÖ×)×ýš= ò=^vŒš«»ÁÄÓ××Ï××÷Ô××ÖÖ××Ö××ü¯lñAYi|„‰ˆ‘™¢´½ÄÄ××ñÏ××ÕÔ××ÒÒ×׿†Q1÷K_ovp^=Òø.b’¢ª²"²ú®—{< Ô -<@EK[gr~€‡™ ª²²°²²±±²²±±²²±±²²°²²ªYþã  %)*'$ú7 6ôJ—®j/ 1û G| ²²ðª‡b7 þû5g ² ²á§zePEB@:2+ ï6Y†ª²$²æª¡™ˆ~sg[KD@ABJXet†“œ¥®²G²ü¯ŠR²8²ü¥~Nü“¢­²2²û«…bõT€– ¬²²±±²)²ý€3 ò3Mbt€Ž› ¢¯²²«²²÷¯²²±±²²±²²ü‘Yñ7JWgnrpx~†•œ¢¢²²ñ¬²²±¯²²®®²²žoC1÷ >O\b]N3Òø #Ko|‚ˆ"ˆú…t^. Ô #.14:FNW`cbgnuz‚ˆˆ†ˆˆ‡‡ˆˆ‡‡ˆˆ‡‡ˆˆ†ˆˆ‚Cþã  ú*6ô9ct…Q$ 1û 6_zˆˆð‚gK*þû )Ozˆ ˆán]M=521,&! ï )Df‚ˆ$ˆæ‚{unhcc`XNF:41238CMXfqw~…ˆGˆü†i>ˆ8ˆü~a<üq|„ˆ2ˆûƒfKõ@bs{ƒˆˆ‡‡ˆ)ˆýb' ò';KYblvz|…ˆˆƒˆˆ÷†ˆˆ‡‡ˆˆ‡ˆˆünD ñ)9BNTWV\afrw||ˆˆñƒˆˆ‡†ˆˆ……ˆˆyU31÷ /ünŠ ²-²ý0²ý­b0²þ‰0²þH0² /² .²þC ,²ý©W +²ý¤X *²ý‘E '²û®Y $²û­™|D!²ú°¨Y²û¯—e-²û±ši=²û°¡€P²ú±ªi²ü¡k@ ²ü¢q*#²û±¥zN& ²ú±¬¥w3( ²ü©}H+²ü«ƒC.²û±¦Šb1ø²±¬–~M2ü©v3q"ý\ˆ ˆý‡S'ü2zˆ ˆþV&ü$mˆ ˆþV%ü_ˆ ˆý‡V$ü _ˆˆý‡W"û3mˆˆþW!ûD_zˆˆþXü?fˆˆý†UúDf‚ˆˆþW÷ 1Zw~…ˆˆþWø 0TizˆˆþWø Act…ˆˆý†UûD_zˆ#ˆþU ü?fˆ'ˆþLúDf‚ˆ(ˆý†Aø-Xw~…ˆ)ˆýt/üTizˆ-ˆýc0ˆý„K0ˆþh0ˆþ70ˆ /ˆ .ˆþ3 ,ˆýB +ˆý~C *ˆýo5 'ˆû…nD $ˆû„u_4!ˆú†nD ˆû†tM"ˆû‡vP.ˆû†{b=ˆú‡‚xQˆü{R1 ˆü|V #ˆû‡~]<& ˆú‡„~['( ˆü_7+ˆüƒd3.ˆû‡jK1øˆ‡ƒs`;2üZ'q3ÿþ 3ÿ3ÿ3ÿþ 3ÿþ3ÿ3ÿ3ÿþ 3ÿ2ÿþþ2ÿþñ2ÿýå2ÿýØ2ÿþÍ2ÿþÍ2ÿýÏ2ÿý¤1ÿýß91ÿþ0ÿýüI/ÿüþØ/ÿýñF/ÿý€.ÿý·-ÿýÎ *ÿûß¿€ )ÿû¿`- &ÿûߟ<"ÿúùÙ¹s !ÿúó¬Y$ÿûß“5ÿúùÙ¹sÿøùìÕŽHÿøùÙ°s;ÿøôèÌw0ÿúä›X"ÿúôÁu!% ÿú̘X(ÿøïϯM*ÿùß¿ŒH(.÷ÿùìàžM* 1úóÀ€04ý? 7þý]œ.N'ÃA Drop ShadowÌ     ¼™~ÃA™žòíòùóÃAš œ¾¦N¬ ¬¿¶6¶o½ü¾¤ÆpÆ€Ì ÌÚÔ¦Ô¶Ú5Ûä‡é(òòœò¦òÕòå?þ<<;þ:ý9ü8û/ø +ø  )ø  '÷  &ö %õ %#ô %/"ó %.9!ò %.9E ñ $.8DR ð $-8DQ_ ï $-8DQ_n í $-7CQ_m| ë #-7CP^m|‹ì #,7CP^m|‹š(ë #,6BO]l{Š™¨'ì "+6BO]k{Š™§µ&ë "+5AN\kz‰˜§µÁ%ê "+5AN\jy‰˜¦´ÁÌ$é !*5@M[jyˆ—¦´ÀÌÖ#ç !*4@MZixˆ—¥³ÀÌÖß"æ !*4?LZix‡–¥³ÀËÕÞæ!å  )3?LYhw†–¤²¿ËÕÞåë ä  )3>KYgw†•¤²¾ÊÕÝåëðä  )3>KXgv…”£±¾ÊÔÝåëðô¤ 1+'#úø õ  ô ò ð Ý  Ü  #%&''&%"  ð $(,/244ì31/+'# Ö %*05:>ACDDC@=94.(" Ô #)07>DJORUVVTRMHB;4-&  Ò &-5=FNU\aehjihd`ZRKB:1)" Ñ  (09CLV_gnty|~}{xrld[QG=4+#  Ð "*3KYhw†–¤²¿ËÕÞåëðô÷úûýýþþÿÿþÔýüûùöóîéâÚÑÆ (2>JXgv†•¤²¿ÊÔÝåëðô÷úûýýþþÿÿþÖýüûùöóîéâÚÑ '1=JWfu…”£±¾ÊÔÝåëðô÷úûýýþþÿÿþØýüûùöóîéâÚ'13)! ÜüúøõòíèáÙÐÆº­ ‘ƒteWJ>3)! ÛýüúøöòîèâÚÑÆ»® ’ƒufXK?3*! ÚþýüúøöòîèâÚÑÇ»®¡’„ufXK?4*! þÛýüúùöòîéâÛÑǼ¯¡“„ugYK?4*! ØÿþþýüûùöóîéâÛÒǼ¯¡“„vgYL?4*" ÿþÛýüûùöóîéãÛÒȼ¯¢“…vgYL@4*" ÿþÛýüûùöóïéãÛÒȼ°¢”…vhZL@5+" ÿþÛýüûùöóïêãÛÓȽ°£”†whZM@5+" ÿþÛýüûùöóïêãÜÓɽ±£•†wiZMA5+" ÿþÛýüûùöóïêäÜÓɾ±£•‡xi[MA6+# ÿþÛýüûùöóïêäÜÓɾ±¤–‡xi[NA6,# ÿþÛýüûù÷óïêäÜÔɾ²¤–‡xj\NB6,# ÿþÛýüûù÷óïêäÝÔʾ²¤–ˆyj\NB6,#  ÿþÛýüûù÷ôïêäÝÔÊ¿²¥—ˆyk\OB7,#  ÿþÛýüûù÷ôðëäÝÔÊ¿²¥—ˆzk]OB7,#  ÿþÛýüûù÷ôðëåÝÕË¿³¦˜‰zk]OB7,#  ÀÀÀJòfâ  (2>JXfv…”£±¾ÉÔÝäëðô÷á  (2=JXfu„“¢°½ÉÓÜäêðô÷ùà (2=IWet„“¢°½ÉÓÜäêðô÷ùûß (1=IWetƒ’¡¯¼ÈÓÜäêïô÷ùûüÞ (1N^p“£²ÀÌ×ßçíñõøúüýýþþÿÿÝ )6EVhzŒ®¼ÊÕÞæìñõøúüýýþþÿÿá ".OcwŒ ³ÄÒÞèïôøûýþþÿ"ÿå #0@Rez£¶ÆÕàéðõùûýþþÿ"ÿæ $2BTg|‘¥¸ÈÖâëñöúüýþÿ#ÿæ %3CUi~“§ºÊØãìò÷úüýþÿ#ÿæ &3DVj”¨»ËÙäìó÷úüþþÿ#ÿæ &4DWk€•©¼ÌÙäíó÷úüþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûüþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXl‚—«½ÍÚåíóøûýþþÿ#ÿæ '5EXl‚—«½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿùùûüýþþÿ8ÿúûüýþþÿ9ÿûüýþþÿ:ÿüýþþÿ;ÿþ=ÿþþÿ¾ÿ ÿþÛýüûù÷ôðëåÝÕËÀ³¦˜‰zl]OC7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,# ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OC7-$ ÿþýÝûú÷ôðìæÞÖÌÀ´¦˜‰zl]PC8-$ ÿþýÝûú÷ôðëåÞÕËÀ´¦˜‰{l^PC8-$ ÿþýÝûú÷ôðìåÞÕËÀ´¦˜Š{l^PD8.$ ÿþýÝûú÷ôðìåÞÖÌÀ´§™Š|m_QD8.$ ÿþýÝûú÷ôñìæÞÖÌÁ´§™‹|m_QD8-$ ÿþýÝûú÷ôðìæÞÖÌÁµ¨š‹|m_QD8-$ ÿþýÛûú÷ôðìæÞÖÌÁµ¨š‹|m^PC7-# ÿÿþýÜûú÷ôñìæßÖ͵¨š‹|m^PC7,# ÿÿþýÝûú÷õñìæß×͵¨š‹{l]OB6+" ÿÿþýÞûúøõñìæß×͵¨™Š{k\NA5+" ÿÿþýßûúøõñìæßÖÌÁµ§˜‰zj[M@5*! ÿÿþýàüúøõñìæßÖÌÁ´¦—ˆyi[M@4*! ÿÿþýáüúøõñìæßÖÌÀ³¥—‡xiZL?4*! ÿÿþáýüúøõñìæÞÕË¿²¤–†whYK>3)  ÿÿþýãûúøõñìåÞÕÊ¿²¤•†vgXJ>2( ÿÿþãýûú÷ôðëåÝÔʾ±£”…ufWI<1& ÿ ÿþäýûú÷ôðëåÝÔɽ°¢“„tdVG:/$ ÿ!ÿþýæûú÷ôðëäÜÓȼ¯¡’‚rbSE8," ÿ"ÿþåýüûù÷ôïêäÜÒÇ»­Ÿo_OA3(ÿ#ÿþæýüûù÷ôïêãÛÑÆº«œŒ{jZJ.ÿ,ÿíþýüúöñêáÕÆµ¢xcP>.ÿ,ÿíþýüúöñêáÕǵ¢ŽydP>/ÿ,ÿíþýüúöñêáÕǶ£ŽydP>/ÿ,ÿíþýüúöñëáÖǶ£ydQ?/ÿ,ÿíþýüúöòëâÖǶ£zeQ?0ÿ,ÿíþýüú÷òëâÖÈ·¤zeQ?0ÿ,ÿíþýüú÷òëâÖÈ·¤{fR@0ÿ,ÿþïüú÷òëâ×ȸ¥{fR@0ÿ,ÿþïüú÷òëâ×ɸ¥‘{gSA1ÿ,ÿþïüú÷òëâ×ɸ¥‘|gSA1ÿ,ÿþïüú÷òëã×ɸ¦‘|gSA1ÿ,ÿþïüú÷òìã×ɸ¦‘|gSA1ÿ,ÿþïüú÷òìã×ɹ¦’|gSA1ÿ,ÿþïüú÷òìã×ɹ¦’}hTA2ÿ,ÿþïüú÷òìã×ɹ¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþðüú÷òìãØÉ¹¦’}hTB2ÀÀÀ€À                          !!!!!!!!""""####$$$$$$$$$$$$$$$$$$$$$$æ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}’§¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}“§ºÊØãìò÷úüþþÿ#ÿæ %2BUi~“§ºÊØãìó÷úüþþÿ#ÿæ %3CUi~“§ºÊØãìó÷úüþþÿ#ÿæ %3CUi~“¨ºËØäìó÷úüþþÿ#ÿæ %3CVj”¨ºËÙäìó÷úüþþÿ#ÿæ &3CVj”¨»ËÙäìó÷úüþþÿ#ÿæ &3DVj”¨»ËÙäíó÷úüþþÿ#ÿæ &4DVj€•©»ËÙäíó÷úüþþÿ#ÿæ &4DVk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©¼ÌÙäíó÷ûüþþÿ#ÿæ &4DWk€•©¼ÌÙäíóøûüþþÿ#ÿæ &4DWk€•©¼ÌÚäíóøûüþþÿ#ÿæ &4EWk€•©¼ÌÚäíóøûüþþÿ#ÿæ '4EWl–ª¼ÌÚåíóøûüþþÿ#ÿæ '4EWl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FYm‚—«½ÍÛåíôøûýþþÿ#ÿæ (6FYm‚—«½ÍÛåîôøûýþþÿ#ÿæ (6FYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZn„˜¬¾ÎÛæîôøûýþþÿ#ÿæ (7GZo„™¬¿ÎÛæîôøûýþþÿ#ÿæ (7GZo„™­¿ÎÜæîôøûýþþÿ#ÿæ )7HZo„™­¿ÏÜæîôøûýþþÿ#ÿæ )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿæ )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿæ (7GZo„™­¿ÎÜæîôøûýþþÿ#ÿæ (7GZo„™¬¿ÎÛæîôøûýþþÿ#ÿæ (6GZn„˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6FYm‚—«¾ÍÛåîôøûýþþÿ#ÿÿ-ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹§’}hTB2ÿ,ÿþïüú÷òìãØÊ¹§“}hTB2ÿ,ÿþïüú÷óìãØÊº§“~iUB2ÿ,ÿþïüú÷óìäØÊº§“~iUC3ÿ,ÿþïüú÷óìäÙ˺¨”~iUC3ÿ,ÿþïüú÷óìäÙË»¨”jVC3ÿ,ÿþïüû÷óíäÙË»©”jVD4ÿ,ÿþïýûøóíäÙ̼©•€kWD4ÿ,ÿþïýûøóíåÚ̼ª–lWE4ÿ,ÿþïýûøóíåÚͽª–lXE5ÿ,ÿþïýûøôíåÚͽ«—‚mXF5ÿ,ÿþïýûøôîåÛͽ«—‚mYF6ÿ,ÿþïýûøôîæÛξ¬˜ƒnYG6ÿ,ÿþïýûøôîæÛξ¬˜ƒnZG6ÿ-ÿîþýûøôîæÛξ¬˜„nZG6ÿ-ÿîþýûøôîæÜο­™„oZG7ÿ-ÿîþýûøôîæÜÏ¿­™„o[H7ÿ-ÿîþýûøôîæÜÏ¿­™„o[H7ÿ-ÿîþýûøôîæÜÏ¿­™…o[H7ÿ-ÿîþýûøôîçÜÏ¿­š…p[H7ÿ-ÿîþýûøôïçÜÏÀ®š…p[H8ÿ-ÿîþýûøôïçÜÐÀ®š…p\I8ÿ-ÿîþýûùõïçÝÐÀ®›†p\I8ÿ-ÿîþýûùõïçÝÐÀ¯›†q\I8ÿ-ÿîþýûùõïçÝÐÁ¯›†q]J9ÿ-ÿïþýûùõïèÝÑÁ¯œ‡r]J9ÀÀÀ€À$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%&&&'''((((())))))****æ '5FYm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ &4DWk€•©¼ÌÙäíóøûüþþÿ#ÿæ &4DVk€•©»ËÙäíó÷úüþþÿ#ÿæ &3DVj”¨»ËÙäìó÷úüþþÿ#ÿæ %3CUj”¨ºËÙäìó÷úüþþÿ#ÿæ %3CUi~“§ºÊØãìó÷úüþþÿ#ÿæ %2BUi~“§ºÊØãìò÷úüþþÿ#ÿæ %2BTh}“§¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}’§¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÉØãìò÷úüþþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $1ATg|’¦¹É×ãìò÷úüýþÿ#ÿæ $1ASg|‘¦¸É×ãëò÷úüýþÿ#ÿæ $1ASg|‘¥¸É×âëò÷úüýþÿ#ÿä #1@Rf{¤·ÈÖâëòöúüýþÿ#ÿä #0@Rez¤¶ÇÖáêñöúüýþÿ#ÿä "/?QdyŽ¢µÆÕàêñöùüýþÿ#ÿã ".=ObwŒ ³ÄÓßéðõùûýþþÿ"ÿã !-M]n~Žž¬¸ÃÌÔÛàåèìîñóõöøùúûüüýýþÿÖ  *6DRbržª¶¿ÈÏÖÛàäçêíïòôõ÷øùúûûüýýþ ÿÒ $.:GUdsŽ›¦±ºÂÉÏÔÙÞâåèëîðòôö÷øùúûûüüýýþþ ÿÏ '1=IVdq~Š– ª²ºÁÇÍÒ×Ûßãæéìîñòôö÷øùúûûüüýýþþÿÍ (2=IUamy„Ž˜¡©°·¾ÄÊÏÔØÜàäçêìîðòôõöøùúúûüüýýþþÿÍ  )2FOW_hpx‡Ž–¤«±·½ÃÈÌÑÕÙÜàãæèëíðòóõ÷øùúûüüýýÇ #*18?FNU]dls{‚‰‘˜Ÿ¥¬²¸½ÂÇËÐÔ×Ûßâåèëíðòôõ÷øùúûüÈ %+17>DKRY`gnv}„‹’™Ÿ¦¬±·¼ÁÆÊÏÓ×Ûßâæéìîðòôö÷øùÉ  %*/5;AGNT[bipw~…Œ’™Ÿ¥ª°µ»ÀÅÊÏÓØÜàãçêìïñóõöÊ #(-28=CIPV]djqx~…‹‘—£©¯µ»ÀÆËÐÕÙÝáåèëíðòÍ !%*/49?EKQW]djpv}ƒ‰–œ£©¯µ»ÁÇÌÑÖÚÞâæéë Í #'+05;@FKQW]ciou{‚ˆ–£ª±·½ÃÉÎÓ×Ûßã Ð  $(,16;@EJPU[agnt{‚‰—ž¥¬³¹¿ÅÊÏÔØ Ò !%(-15:?DIOTZagnu|„‹’™ §®´»ÀÆËÖ !$(,049>CINU[bipw†•œ£©°¶¼×  #'+/38>CIOV]dkryˆ–¤«Û #'+/49?DKQX_fmt{‚‰‘˜Þ #'+05:@FLSZ`gnv}„ß  $(,17CIOV]ç "&*/49?EK ê #'+05:#í  $(,&ð !)ó ,õ /ø 1û4ü7; @ÿþþÿ=ÿþ;ÿüüýýþþ8ÿùúûüüýýþþ3ÿþùøùúûûüýýþ.ÿþõýóõ÷øùúûüüýýþ(ÿþýòüîðòôö÷øùúûüüýýþÿþýíüûûúæéìîðòôö÷øùúûûüüýþýüûêúùøöÜàäçêìïñóôö÷øùùúúûûüýüûçúùø÷õôòÐÕÙÝáäçêìïðòóõöö÷øøùúûúáùøø÷õôòðîìÂÇÌÑÖÚÞáäçêìîïðñòóôôõõ ö÷ø÷ßöõôóòðîìêçã±·½ÃÈÍÒÖÚÝáãæèêëìíîïïðð ñòóôóÜòñðïíìéçäáÝÙž¥¬²¸¾ÃÈÍÑÕØÛÞàâãåæççèèééêëìíîíÙìëêéçåãàÝÚÖÑÌ‹’™ ¦­³¸¾ÃÇËÎÑÔÖØÚÛÜÝÞÞßßààáâãäåØäãâáßÝÛØÕÑÍÈýw~…Œ“𠧬²·»¿ÂÅÈÊÌÎÏÐÑÒÓÓÔÔÕÖ×úØÙÙÚÚÛÛ×ÚÙØ×ÕÓÑÎÊǽ¸²¬cjqx†“™Ÿ¤©®±µ¸º¼¾ÀÁÂÃÄÄÅÅÆÇÈúÉÊËÌÌÍÍÔÌËÊÉÇÄÁ¾»¶²¬¦ ™QW^elry…‹‘–šž¢¥¨ª¬­¯°±²³³´´µµ¶Ê·¸¹¹º»¼½½¾¾½¼»º¸¶³°¬¨¤Ÿ™“Œ†@FLRX_ekqw|†ŠŽ‘”–˜š›žŸŸ ¡¡¢£ø¤¥¦§¨©ª««Ôª©§¥£ ™•‹…yr16;AGLRX]chmquy|ƒ…†ˆ‰Š‹‹ŒŒŽÇ‘‘“”•–——˜——–•“‘Œˆ…€|vqke^$)-27CFJMQSVXZ[]^_`aabbccd÷effgijklmmÕlkigeb_\XTOKFA<!%(,/369:62-  #&(+-0235689::;<<==>÷?@@ABCDEFFØEDCB@>;863/,(%! !#$&'()*+,,--./01ú2345566×54320.,*(%#   !!"#$%ü&''((Ú'&%$#"  üó ñ   õ .ÿîþýûùõïèÞѰœ‡r^J9ÿ-ÿîþýûùõðèÞѰˆs^K:ÿ-ÿîþýüùõðèÞÒ±ˆs_K:ÿ-ÿîþýüùõðèßÒñž‰t_L:ÿ-ÿîþýüùõðéßÒòž‰t_L:ÿ-ÿîþýüùõðéßÒòžŠt_L;ÿ-ÿîþýüùöðéßÓIJŸŠt`L;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`L;ÿ-ÿîþýüùõðéßÒòžŠt`L;ÿ-ÿîþýüùõðèßÒñž‰t_L:ÿ-ÿîþýûùõðèÞÒ±ˆs^K:ÿ-ÿîþýûùõïçÝÑÁ°œ‡r]J9ÿ-ÿîþýûøôïçÝÐÀ®›†q\I8ÿ,ÿþïýûøôîæÛξ­™„o[H7ÿ,ÿþïüú÷óíäÚ̼ª–‚mYF6ÿ,ÿíþýüúöñëâ×ʹ§“jVD4ÿ*ÿþíýüûøõïéßÔÆ¶£{gSA2ÿ)ÿþíýûù÷òíåÜбž‹vbO>/ÿ'ÿþýíûú÷ôðêâ×˼«™…q^K;,ÿ$ÿþýëüûù÷õñìåÜÑĵ¤’~kXF7)ÿ"ÿþýéüûúù÷ôñìæßÖʽ­œŠwdRA2%ÿ ÿþýüèûúù÷õóðìæà×ÍÁ³¤“n\K;-"ÿÿþýäüûûúø÷õóñíêåß×ÎÄ·©™ˆweTD5(ÿÿþýüãûúùøöõóðíêæáÜÕÍø«|l[K71,&! ýüûûúø÷öôòðîëéæãßÜØÔÏËÆÀ»µ¯¨¢›”†xqjc\UNHA;5/*%  ûúùøöõóñîìéæãßÜØÔÏÊÆÀ»µ¯©£œ•އ€yrkd^WQJD>82-(# Ãø÷öôòïíêçäàÜØÔÏËÆÀ»µ°ª£–ˆzsle_XRLF@:5/*&! ÆõóñîìéåâÞÙÕÐËÆÁ»µ¯©£–‰‚{tng`YSMGA;61,(# ÈðíêçãàÛ×ÒÍǼ¶°©£–‰‚|unhaZTNHB<72-)%! ÊéåâÞÙÔÏÊľ·±«¤–‰‚|unha[UNHC=82.)%! ÌàÜ×ÒÍÇÁº´­¦Ÿ˜‘Šƒ|unha[UOIC>83/*&" ÏÔÏÊľ·°©¢š“Œ„}voha[UOIC>94/+&"  ÑÇÁ»´­¦ž–‡xpib[UOIC>94/+'#  Ô·°©¢š“‹ƒ{sld]VPJD>94/+'#  Ù¥ž—‡woh`YRKE?94/+'# Ù’‹ƒ{tld\UNGA;50,'# Ü~woh`YRKD=82-($  ßkd\UNGA;5/*%! âXQKD>82-(# åF@:5/*&!  è61,(# #í)%! &ð )ð ,ó /õ 1ú4ÀÀÀŒ*+++,,, , , , , , , , ,+++*)(&%#        ýE???>???       ø ???ý6a 0P(nco-4.5.4/doc/logo_qt.png000066400000000000000000000071061264355130400152310ustar00rootroot00000000000000‰PNG  IHDR@@ªiqÞbKGDùC» pHYs  šœ vpAg@@êóø` ÑIDATxÚÕ›{p]Å}Ç?{îSWoÉ’,[ò[6ømló°‘±!!…RHBgã;MfšLišô5mšB™L§m†‰ÃLÚ´iZâ’0iBÁ.%ðCÁ/ɲe[¶dKºÒ•®îólÿ8zœ{Ïî9çÚfH÷ûØýíîï÷Ýßùý~ûÛ=¿eg[%p#Ð*³ωַ¯®ªni × Av8 œF€TGû^é{Ž÷¡‚ןæÄ"X_Ú¶AC ‘. \zf@‘] NçòòJ0 Æ]€q`WÛbày$k*cþ`Mu¡«/ g@vƒ8"¥ìBô:Ú÷Nüú°³­xX ððÝ ,œ$žøéi ê%™q8yÜú¦·£}_æýàëÀ‹«Æøí­õH‡Ò‹"üc§+î[Ì–z,`Ä Ç@7¥¼`’íû²×ËàfMñõȽ̟ÑQ\篋À.ý¦Û$–‘í•Rv 8aJŽÝ ÎÃí{}ÔÔož- a ~Å ûYýâþhúëÚ¤QÔ!VV“9 LÇkwvc=BÇ. «£}ï°_6ØÿTÅ„BÓÔ®ˆ¦®XÍUôÅ ?:å˜P ²Ä Àý“õyàIàKŪ P èVÕk…âÛN/5tS¿…¦Í>ŒÓõÊÅV`Ÿ×Q¤í[eÀŠ¿í´:€ÜÀ‘êßB¥e½ R ¤ X6%º:t„Û Sûoa#‘ôÞ%èÚêÇ^a_1 ƒ!¬h1ošH)1&WN"1„ÁUR¡Ýˆ ÌR°Ë(UŒéåxçä8Ù‰¶-û [—m¢­q5å5 ò$2Wèë¦gè—œ9@&?¡˜Tg;t ·yk†?†¸€`fð\^òZç(OLðÄÝŸæ~c•Ñ Çá:š+–²~ö}Œ¤xýÜ¿r°ÿ'äeÎØíAš¡z´Šµ´˜W?øÞ¦NžÍ™<ÿêç.™|w×7øè†{|RiäÞ%±¤îf~ØõפóInN ö¼6H|4ÇÿF0C"3È™øANÿµñÖô(Rùÿg¿¡»w‚g¶Ñ·ðv—ÖÝÆö¿B@ 'ÓyºzSÄÄlV4mbeÃÜ6÷c¬hØæ²^Å®ôº @¢Ûs>ÅÛÝcüÖš­ìܲ]Ûs$5ÄKï¼ÊÛg:ÉäœÑêšu|`ÁïQìŠú‡²¤²&›ÛÖ0llH_úû*(UJÉÞq¢ _~à1F@Ù¥{è ¾uh'ÿtäÙöÔǸ÷é\I 9è64ßOsÅR솧·?Òäö¥}0爫À6ÙÙKi.e¹cÙFÖÎ[¡¤M_fO××Hå,iñ››êÙ{ò~÷ϲá fóÜíØ5 w MÐpëâu>VÅ,p ˆÉOÁ¯N%‘HºõþIËì,.½H*?6…7.ˆÑ\fÏáW8tö¨ƒ¾­îª#  Èäò\¼œ¢µ¶‰Öú9ž RøÛ]®YryÉé¾#ȇVÝ¡aIrrhÊRKS«ÆÈ˜&{üÔÑ'ˆ1Ú¿œgþ­Y™ó£Çžã¹]O —ÐUGYT}ÍåK¨6 ”Sèžía²³¸BSc8ЩJäH$ó¬l^BcÕ,å©Üé>GßÖÙ°¿ç ²ßò¦ ý3e:îZ¾YI³ f- jÖNÿóÂð³3ÿà&DAñÖ©h¦r`8K^Âúù+´CŒg†l‘ÞLi¨"œºrž‰LÊÑ~Óü•„5UW„˜Iµ±ò €«ë´7Jâ–+[Ö¼H;ÉXfsºÏT‰„ ÊÂ#ã#ŒL$ýZëæP[^M)Fmf {‹ û î³ñÑH“ÅM ´”ãÙ8Q„wÀ€XÔ 1–!1‘`vuCA{(âwï^Î‹Ç¾Ï ‡_æ/?òy6,ZS@s!~†c¿¢,PFY¨ŒKÉÞ’ðò l?--ÀØ„ RÒ\­~þÒùqT.JJˆF &Ò$ÒIeßu çñ¿Ç;Ù´‹ÏÞù°£ýJæ$û¾99žÅßÌcpµè6_Óurú+•±T»®¼V;IÖL[Ò¹H DB)%£ŠG >ÜàTvH›¯ÐBz7è·Î‡ÖöVŘw™Þ'¸çH°G˜êŒR©IQ×9=lÀ˜¦I&¯?ˆ1Œ`Ñ3̘‚PP}àš—YŸ˜«q6YÛëxÊÊã"„ƒVn`<­?ØÑ§{Éå­ÿ:’1S¸Wƒí­ž%n†ìi*˰F#ÖÃãqm¯P ŠÓB[ý³9kÌX¤\Ù7ó%ˆûÎOPš @A_^Î0T €\¹¢*¨PaMÉJ‚BPU0–ÆUÿ§eÓ­¸ê@Æ O#(§?«* Þ½rNËcy¨Æÿ ˜Jç ‚”GÔþ~$=€ÿ¢Êý|À¿t„ÂVi¨¶Œ×ÉKïê×bØ«äMÉxÚ$Š(5 ›O‘È zËìË£^kV¸àBÇŒuUÄÐyþ„€P-‘‚ˆÎl"m’ÉJê*j©*«tôN]$“OâY !G¥Ç®(NRW$18Ú×£ç£Á5ÑÙELHâ9Ú[ +Ü`ߨ $&žeú˜¬Xpï¨ÐÝ ºæ¬ïHØ`nC„d6­Íì€`~ÕjGݹþ4Éæ%땽NÅà¥ß!#¢Ø¡ø?s÷®¡åä/ +”!<ÿÖO´Ã­lØVÀ„”’wN'‰B|xý‡ô©Ügâ‡,Ö'72y3ï kªXŒ ÈàH–îÞ™d§ÐþPÊ®>k[6¿ŒòˆÁ ‡÷r9¡6Zs*o`IíÍÓý:{’\Žgxè–ûX>w©ƒ¾kp?ãYëFK¬Ì:E¾4껾¬…û|•õUòø-Ïgo} £±ü»A‚HÈ`ã \³ûÕïkzhûCZ+WrôÔ8/ÿr„×ÞÅ3ŸüsmÖLóÆ…Ÿž§¥!ÞzG=&øä?>ƹÁ §II:7Ωá·xåì·m X;¯¥ÜPçãn@kS˜·Ô³çµÃìxös<÷©oP«Â_‘ô ¿Åó]_ÙÚÚšjC|æ&Î^ºÀ/>ÄmKnb^ý Ãd8u‘ä’Ù‘¢´¸÷åMÿ€c?¡¾ ¶l~”G*›øé›o°õkÛyê_bÛ›´¦`½û ô\öÑ×ëÞ±½N{…wøºî%ï ¾'ÒÑ̔Ջc,jŽÐÕ»ŸO}ïÜÞ¶™›¬ ±²ŽœL1š¹L_¢ÛæÏ½<•ðhGûÞA‰¸ÝÊ´ÓH[s!ME,Àú*&¹{×ûŽè/ì/cë.eëT_œùû ^t“ÈýtØõ²´ª¾ˆ1¿wž‡™^ Ú³À8Èó Nò¿;¶ìó| Í;.¥´mŒŠŸW¿ÁŒJ……G?‘âÀ  äQÇXo–Žáö €þA{ÌìþxØ5CÑMÓK&_ˆšî8ˆ#@7È>Ãí{©¡«,: è/q…Ъky˜ZÍ#–Àò\û+qW<4Oàp•^þ¸Ø™Î[Âq)#8ôt´ïó8ü{?øÎI“]mÄ‘|°å¬Uj+Àz3+¢èŽ`½äØ…½ïhßwý¶qï)»OæÙÙö$0 |°¿59œÑ…µªGAž°„—ñŽö}9þŸ÷8ÀÒ„gë«BýÖa­jˆ^¤ïØòÞ?£ïuù?9Œ#µ>ÅëIEND®B`‚nco-4.5.4/doc/logo_srl.png000066400000000000000000001011371264355130400154040ustar00rootroot00000000000000‰PNG  IHDRú\G©¨ÎsRGB®ÎébKGDÿÿÿ ½§“ pHYs\F\F”CAtIMEÙ5Æ"6 IDATxÚìw˜eU•ö{ŸpsåÜÕÕ™¦›ÐäØHè€L€ˆ#ŽFgDçGEtFAAE‘œ¡‰èX]Õ•Ó­›ï {œsoUu@ºéo>ÎóTߺaß}ö»×Zïz×ÚBk­yëzëú_|i­Bìðq¥A«àw­A£É<²yE±äP*ƒçƒmA,"‰Ç,jk lÓB€þ¾íçìì³w÷%Þú[×ÿO/–|JeEÙQlé+±~sž½e6÷–Ø:Pf,íR( …©ÿëð?Zƒ”šºƒ–F‹¹QæÏ‰²°+Æâqêjl"¶ 50 ±Çþ- ¿uý¯7¦cjbÒetÜ¥o¨Ì³+³¼°&Çê E&³>R ŒðGJÄÔ{MA=x_­§¼åk|¾ÒHs;m–-IrÈþIÍÓÚdÓÚdWA^Ûîý[@ëú_i½KeŸõÝEÖm*òÌKž_gso !¦)0 U¬ \w¥÷]ëâ†Xuß>VqÑ…)R€¯Àó4Ž«h¬79`I‚C÷¯aßÅqÏSWc½)Vþ- ¿uý¯º&³.?=É“Ïgyéå»Ë( ¦XmÐxžÆóÁóµ5’Ö¦-͵)“TB’Œ›X¦Ä04R‚ï <_Sv|²9E&ç11é14ê04ê24ê¢ÕMÄ0JŸåúšÎ6‹eK’ºŠãލ¥­9º[ÿÐß²€»õµ»ê;ä ·þq„Ÿœdso‰ñI/t˃纞Æq4Ѩ`¿ÅqöYgïq:Z#Ô$M’ ƒdÜ ‘D#!äÎ>×ӔˊBÉ'›÷Éæ|&2.»‹¬Z_à¹U9†]LSb[!ÐûJ“ˆKtÅX~hŠœÑLC]d·Ìé[@ÿÿü*x“¼4?§\UÀ×Bƒ)£˜2JTƉ™u¤Ì& i½éÀŸ‡ûJqão†¸ýÞ1†Ç\òÆÚ_à–RsÌ¡)N8ªžeK’Ô×XÄcñ˜|ÅqëB¼ªï踊|Ñ'_ðÙ¸¥À}§ùóÃLL*lKbšÁûø bAsƒÅûNkä¼÷wìòyÜ%@£¼ûR›½ŽÏÚ­€Ò}…UôÖ0TZÏH©›œ7Ò~“jÂètúòbÒ0$Ø2Fc¤“–è:â{әؗ”Ù¼Ûæ`ú{ßûèW_ßÏИ‡ëª*É¥”¦TV,èŠðþÓšxû± ÔÕÚX¦˜Á„¿QãÝÑë•Ò¡¡xàÉqn¹c„/ˆD$†URÎ4-_º “£®ßeó÷†}úû +yxè†JëQÚ}pSDd-{Õű­ŸÄ6bÒs·£'ÿ<ßÄpië»%ãÌIÄ1­çQg·¿© žÎêNº¼<ù0ë3Ñ[XÖ~[)R( ¨|j¢uõ/F¢(ü„[#uv3 RG²¸æf'öCbVÇðÆ)[ï@‘ïü¤—ÇV䘹|Bh–.Šñ±³[Y~H=–)_q o¨vô>ÛÞ—×f¹öæžz>Îñ”· ¥à´ãêøò]$ævÅiÑ7çžá¶žo Õ( 2»C|ê ¶2˜²¶÷£´Å÷å¼…×Ës7XËõ™G¹³ï»¸Þ áUÙÔéc›y3ƒEŸU&Íñ%¼·ë êíY»Í²Oÿ_¹ý,›sÏðìøïØš_hL!‰H ©Zˆ /,¦îEÔÓïÏÔÿ i-ª¯Qø”x(”öI˜õ,©=–eõ§Ñé–1¤0þfPMM±äó—ÇÆ¹ò§}ŒŒyXÖÔ{Å¢’ù]Q.<§£©Û)w6† q懱´R Uàßh-@èqâ~)ï B¼½– dÅK“üè¬ÞP¤ì¨ê㞯™7;ÂW.îâÐýkÞ°r—ýÖî¯Ò—»ãí§‰á“µ Pf>&ª ©ØM·êd¥·€ãÛ>Éͺջ4®*qWÿ÷Y7~+K¬a"¢¼Í‚3Ƭ Á‚ §lò;8¦õãÝò¡Ý pO9Œ—{y9ó0ÏŽÿŒÓGDZĤÂ~8ˆê=x5@Ûƒ |-PZâ#pµ‹¯}æ$äÀ†wЕXFÕ‚!Ì×´pgxY}E®ÿÍ ¿úÃ([bÏÓÄc’y³£œûî&Î8¾y§ÖtÛÏóV¼T •0P*ÈS/œåôãëùл[‰Egn"Bˆ€oÐbà{úÜË›‹¬^Ÿc͆›{ËxžÀ0¼¸œ’µ†Ú™ª2ndL±©ÇAë@$ãûÁº:lϳÿÞ ö^§«#œY1¤Û¼òû»Oiám‡×rÝ­CÜûHšÞ‡ˆ-)•5Wþ´Ÿî­e>ùÁv:Û¢¯{Ý¿á@WZ¡YY2¡{È4@ÏþÔ¿-t•ò‘,26ó”×À£·pbÛ…»ÔÖ(~0J¡§\Êgú÷Ø~Ax¡vÙf4}¼4/¥ÿÄóãb´´š”„6Sa‰|ø]$aWåûxÚÄGâc ´D!ª›™žN‰iXÖÓ¾ñÔ³„Øöñ)M¨Ä,a`’`¼Üýײ*}/ûÖÌ>u'’²šwŽUSJqóíÃüç/Hg|R ×UÄb’Ó®çÜ3[Xº(¹=À§«ÏŒ§ž[ãùÕy^Z›cíÆ"錸ަ 1 "ª‚¥á‹Ö•8yjTÜw)Á2§<ÌÑqŸÁ‘ yt’dB²÷‚Ë–$9pŸ$‡-KQ“´vèi4ÔFøÂ'»8â€7ýn˜GžÉb™ËÜrÇ(ýCŸ=¯ƒý§^—ªÎÜp3W?J ¶êüf¤P3â]1ýáƒóR"R"O›ìgíä“ì_w*ÍÑy»Ðª‹p‹ G.æ!ÕDNÇ lÄ”÷Ñ,'HPØ&(Ùõlsoþ%ù›rO#K«áb /˜Ë0”¨\¸ÚÄÅÂÕfp€ký·S„$¦4b†Ï3s;7…ÄÀd¸¸‘ʽlÈ>ÁÁg²¤öøZ»lÞå‡7öóÛ?áºË8®¢½ÙâSç´súq Äcæ´1‰í€Ð7Tä®&xê…,·q¹«!HÄe(‚Ç @^›Rt´*š5u)E,¦‰Ø`™¥™œÂu ryÁXZ20$—/ˆØ¥qM‘çVå¹ë ÏqÔÁ)ÞyBuµÖÝùå‡Ö³pnœ›oâ¿?‚ëB"fðØŠ,c[øÂ';9êະøæµ¯“Ýpi“*EŸjÅÄe‰-\ÉMB¡µ`®ìãI·…çÆï䔎‹w¡U×숲Èë8ªš1ÎZ‘#±2iÓoì ãwòððͽ>D[¸Ht•ߨlN%mSÔÑ)po ìmÜø×6Gb†{_µúá{ÊióT¹ÿBºô>[ò/0RÚLwno︘Ɍ§¾ýã^î}4]åe|ûïçò‹ºXºW¹ÍÆ0}Ž&&nøŸ!y:ÃÖÁ2ÅR n‹F ”ÇÏtv(ö_â1v‰ÖËtY4ׯ¶4ýC%:Ú,Úš,¤[¶–)9­­MÖu;heÒÓo±u0Ê“Ïôô™˜fPíf™’‰IGWdyaMž»HsúquœýŽlËØnfÛš#|æ#Ì™á?ïg"£ˆF${ÊüËzøûó]Þ~l3 ­¶[€^Y …ú•·­Ùê·1K’"¢ºÌlÙËúì³ìSXŬø>»ÄªoëªM{žÝ5wB ´Ïc#7ñèð!G“Èa æÀepAQGÉë8F•(Ü9°Å4ྪ›XÕzÏþ WF`å¶|%Ud`Ròs<7~'I³™cZ?Z½Ÿ“.ߺ¶—??’®jÊ]OsÌ¡IþíKó·s+k ’?¿åŽAnúÝ(#c.®¯C½º@i(•¡±Nqê±.‡.+ÐÖâ2§Ã¶ƒ›¾fƒÃ>‹l@‹˜†&>§Xv9hŸCc.Z9˜–âà} l[qRÔ§Tγns™R9Êã+bÜù€Íð¨À¶À4 TV¬ÝX`ã–"w=8ÁçÎïàÐeuá&557[òþÓZii´øÆÕ½ŒNx˜†`hÔå{?ëǶ'Ùôš×ÿnúkYI¾6èV,•ë‚‚¡h“cô:«Y3ùí±½«)›7ÞzîY3¢µF£øËÀµ<9z+uÒ£Vf§æKW\t‹´Náh !¦WÌ„¶Þ.Oäž ¡ZoÇžÌ ëôö$Ýô÷×Ó@cš…ßöu¡ÏŒÝÆ1­­‚ü›×láîÓX¡tÔu5çœÙÀeÍ{EF}SOž¯ ϯ)ban:Ìh {ÍwùЙ%ÍÏ3g–…ïkG}b1ÓŒ§}q³ºrjó*—¶%b—’«Èåc>‰¸ë9,]§¹2Ù§›ã¼³¢<õB”ën‰±©Ç7¥@D³fC‘ ¿º‘œÑÈgÏ›M4jT+â*›ÖÛkàß/7øÂ¿u3‘öó¸ò§¤â‡.«}M`—»¬¯óÕR(úüVò$ª /N‰.9ÂêÉé/®åûU¹éÅÝýWòÄèSo¸ÔÉI„ÖUÄjgX5TA^‘‡V³@ô¦Ã®°„K\–¨‘9êå$u"CJçHˆ1Q"&JDE™¨(e┈‹"qY$&KD¤ƒ%=¤˜fËõÔ½ŸF­†bµæ^IÖ`|ÒåŠïoæŽû&°mê4žÛÌeͫƦÛz¾×ý¦Ÿ÷\°–ÖV@l~¦Ë––ùÜLJøÕ&yûñ[W›L%©Á\÷ –™Ý™òA¦ TJò·SÌ›añÜÙœ‡ºÚ#ì·W‚Ú×ó9ã8—ÿ¹v’«®È1g–‹aL'r7Þ6Êß}n5ë7ç·Sdj­9pŸZ~ô…ÔךÕqlé+ó½ëúØÐßN$µ›¾caÉkwó5ëýyUË$…¢Å˜ÄqV³fòa\UÚEnòžòÀ]÷¸§ïVŒýŽFCQ/&g°˜®6Ó dtr°EÕ¶j- ¡°„GR¨jÉÓ%,¼*µ;1MO¡I4>–öˆˆ2¶po@èªG0Ý/3Üûg*FÇ=þé»ÝüéÁIâ1ß׆à³çµòéwmǨWTr[úK|æk/ó?éRcB X¦â€¥ÿñÕ,—œ7È»O”€hؒɬÏĤG2n %8n ’‰G$BW‹P”ÒD­`]”×S$b’š¤AÙÑÊ>–䘊%E¡¬ð¼`üޝɗ4GXâk—pùÅEºfùF ȉD$›z>pÉþxß(eGÍ µÖ,žŸàšo, ¡ÎÄó5¶%ynUžÞØÏð˜óªYxãŠ+®¸â¬œ|Û_G³œs¹’QÝȸ®ý+1úLw2§ãÔË, Q@#±qñˆ±¡8Æ‚šÃIYMo(ÀÊ*ÇúÜøîzR²TµLi]KQGglAÌåÐÅ5HëM±e,Lþ†T†=<|#þ’&ã^L±8Ø¥¤£Œë:\m†s*¶‰¹†ð‰—„(ELáOåE¶ŸØF g$ÎÂw×l×z¥‹RÚé;¥˜fá+¹Á”L'øÍ4¿ºæ~*G"nàyšdBrñGÚùè{;fÄᕹñ•æ‘§Ó\ö­nV¯/‰ÈªAX<ßç¬3 |é­®'È5ù‚O]…m ÆÓ.hhm²° IÙñin4‘†d2'ééÓlìÑôöÃШA6oR,™¼¸ÖÅó êj"Ô$ Š%—‰ŒË¼®(†!è„6ñ¨Ak“E&ë32î0žö™Ýွ'ãR, ú†$…¢¨†~8MÙõYº(N,:3,mnˆ°dAŒÇžÍÍÝšELCsð~5˜Æ__k» F¯Éy¯x:tõ¦¬(Ö©¹4ˆ‰àqmÆ8ýN+ÆnçôYÿ€@¾Á¤Ü›¤O¼0ñGùu²L­È„¬yà“tœIÂײ’$¯Ž[ë`“Œâ%lá„9õ™‚…rê:ˆ }­Cq Ó²âS@•¦Õê$D(ŠÕH*9úʆ±#°âó«rÄ£ž¯©­1¸èÜ6Î>£e†u«X.×SüÏ]#üøæÆ'¬çC4¢yçIçœYb~§nR& f›ÓøM4"YØ«Îøà˜ §/Jß Aï€d`X26!Éæù¢ ìM', â1H%4µ)E[³bvG”Y­ ­|ævúÌ›e3%þ‚†Z“ÆÐíÖá7Õ).¿¨À¡Ë<®¿5ÊK/eÁM¿adÜåÒuÒÖ™aÙ]VË—/ìäëßï!WPÄ¢’oaѼ8ï:©ù¯Æëo2,KxÄE‘œJàiYµPBhò*ÎVÙÆ\ч«M’"O‡Y`ÕÄ]ÔðN:âKö˜Š±7h:Ø’ž‡†n&J†z™™Â”tlȧS_1gŸ¤(†žÆ9V!è, ʾÆÕ -4I«…¤ÙH̨Á–1,E _—qU‰²_ à§É¹#½4RH a` cFœ>%˜QÈpK¨äí_©*ɲž£©I\ú±Î<¹)Åv©3×SüìÖ~~qÛÙ¼Â2—|v»ââ9y¹CÄ"Au_Ü&NÕäË‚'Ÿ³Xñ’ņnIo¿Áà°¤P&Ô±3ÕìqY¥ƒ4@S½¦³ÝgîlÅþ{{}ˆËì6™b›­Í×AˆqÒQó»|®»%ÆíŽâ©¹ç¡4¥’ÏeuÑÞ±Ñtt}ƒ?¸¡?¤DßûYKÆY47ñŠ80w]zµÖ\e2Wa —ÕÈ:ž6¦‘Jš^¿ƒ61‚)|4‚Ùrˆ¿Žûÿ‹sç_¹G‘‰¯7.Ϲc<>r e·—™E¢Q–»¤#Lè”–3<Ÿ “n ‘Å£R€RÉ«u”¢2()—¸YÏüš™Ü–è<¢2…-c˜ÒÆ&R˜$ ¥=|åâê2Ž_$ç2XÚ@oîEz / ”‡%,L!v(˜©ð-z´ èÃ0—]ØÉéÇ7n—¯Ää?¸¡—[þ0FÉÑX&ä ’Cö/óŸ)±tGÑѬÝ\¢&iÒÜhaJAÏ@™’£hi40 ›_ßáá'mz$#c¥¨öŠ‹Gu(mj-µ­2NJ‚6Tá†’Í V­3yéexð ‹Ûî¶9p¾³ÌœN—î~ÇÕ$b-6(9ŠlÎgn§æ ŸÊcÛEnýC¶ Zhz*‹¯¶ðKçÑPgW‰H)gÞ̦Þ"·Ý=N4"ðø??ØÂ ßÝûšeì"×ýµiÚäõ2B2K2¡jèÓm¡°FkAIDØ¢:YllÂÕ&Qf¶9Á†ü³lÌ>Å‚ÔaoˆU×: _Þ”Äb¨Í~)}›sOÒ*+€ ¦ÔÓ&ãºv;W|gKq¼n†5S8Ú&«b8ZÓ[ÀÉg1'q1#…eD1„õšÇº unc‰¢ŸaCöqžû#C¥uØ2ŠvÓÁ¾½˜yŸ|¥ù×ÏÏá´ãwš>»ö¦~núí(Zlz./y÷©%N?aœ% "8>ôô—ikŽ01é‘Éú8nÐtbNG„«®3yä飂RITÃ)æ¾TÖ(­i¨3X8'ʬÖµ)ƒh$pÛËäršÁQ‡-}%zú\¬PFkJA±$X·Ùds¯Á}E8â "ç¾;ËÂ9&¾ ÄZ3žöqˆÇbÔ¤4}Ø¥&9ÆÏniÄ22äá§s|û'=|ãÒùDlYµìÉ„ÉyïkeCw‰Uë Ø–äŵE~|sž;{§8Ø%®ûk›-¼êÞoâÑ.‡™Ðµ”t¤º •–Œ¨:ä1QB!™-ûè-Ü;ðC¤n|Ã\÷7#^¹9ƒ…õ<=z;5䈅$_cº_ÛU–h¦ðii$jjü²:I^ÙÄŒ:NŸu1KjŽ$r›_‡ É_M÷‰ ·dKFˆ›µÔÛÔp&½ùxhøçlͯĆÐÓ4ðbö}yëjþíËó8õèƒüú_oå'ÿ=„ ÝéRIð¡÷–¸ð܃#*(ÎQŠbIQ—4Éç}Š%EmJpï#®ÿuýCA9màZ}ãLC³üÐÇYÇÁû¦˜Õ­¤ù« §¤Å¥G%³«ÖçxøéIþüHš¡Ñ@ØbHï Æ&àÎûb<±"Æšä]'»L2yÇUÔ¦LT˜’l¬38ìÀ‹çEùҿű,!5wÞ—fVK—œ×9c>ÌIpÖéMô ö“+ø7ß>ÆéÇ5Ò5+¾C°ï‚=MœÑ"ÇèW­ êæX &¹@Œ>ÕÆ"c3æ}¬ubò9›}p”ù]éI! “!Áx@gžR¦w@póoƒ”]4jðßÙÂÂ91ÎI̘£O~°•/wÑZ³r]‘‡Ÿšà˜Ãê·›ì]’G_5ùÖ«È£kM2MƒLOåmµ ! ¤©!O|F0P66.u2¡À#N‰­^-¦0˜Øïu-æ²Ê².û8ÊÛyt ûÊXñEšŒbuŽ´– 릀Þ®š ç#%ó$(NYrm0©bf;ïèü"ûÔøW-òé•T¡)m¦Ž ÞjgÔ饠&¦qpÓóëAWœcÛ>6ck ¿¼½Ÿ«o ÙíృöuøäßM2§Sãù‚Ñ |ÁGJI2.™Èø<ðx„kn¨cs¯‰m’R°daœO~°•Ë.šËÜÎéŒËÚ ~s×0Wþ¬—Ý4È3/æÙ:èà¸AAŠm LSbU~ì |Ôqaë€ËS/äùÕFyà‰ Æ&\bQIg[”wœÐÄâyGFÆ<|¨ÚÆÓݽ Ž8@ÒÙ®ii´ˆX’—|QaHA]¤³Ýes¯¤hª¥Ôs«²¼ë¤Æjk¬ ¿n3Ò™@ S, N>Æá²OhoÒhŒ*§N‘|×þ2Êõ·FqÜ b,_ô9dßçŸÕƉGnú“ÏOrÛÝ£<üt†tÆ'b bQ‰ç Š%ˆE`¯ù>³;|Úš4uµŠXTcÈ E¹,˜È†GƒÜûúÍùb ˆF‚TÝ÷¥yìÙ,'æÃïiå³çÍfñü8?¸±Í=шdËVÉwÿ+A*™ç }]1c_¥€%ó=>ñÁßø~œ²|Ë?üe‚·VÇ¡û×Vïo*añ‘÷µð¯?ÜJÄ–ŒŽ»ÜÿDšå‡ÖÎ(…Ý%yô¿äº*Ãô1X {T-¸Ú¬Zu©[U-r”Eš„.Ò,zY›y’¥µÇ½Žæz·ÒîB\U⥉»IJ-|m …"­jðÂE-fDô’%"¡RL¢dU’Îä~Þt6BÈ7 ä•Ï}aM–+ÖÏx¦ŒÐQVýùjíö?ù¶¤71ÜøNŽnþpõµ?=Áwÿ³ÑqÛä ‚“–»üãÅZݸe‚mŠ0SÄ"šþ"Á ¿‰âz[],)N;¶ŽOx‹æÆñ|Å5¿èãî&èp°ÌàŽXéƒ÷ó8ꇖz´4jë5–哊Ï4[ާÐ ‚‘qÁàˆdÕË÷?aóÂj‹HD²9ÅmwñÜê<?»•wžØL{‹Í7¯éå…5yâ1ƒî­’ýAœ«¾–cV›_匰òÎÓpÊÛJ<ºÂäÎû‚C2YŸ›~;Ìþ{'‰ØFÕszï©Í\ÿëAFÆ|„<»2ÏêõXšªÞ=†ŒhÊDÂÆeÐ` ‡yF/k½a^=`ámÓ§ÚX(·@XÆÚaŒóBy5k&¢92ïo[äz÷ `×N>HÉÏÑd A˧Ñ*!7ÝšK¡ˆ‹RPú bò:†iÔ±¼å\"FâMyO‘«®ëcËÖr’+šëc|þŒshh}'Ù–I aQk·5R¬Z—㊫zª /–$ËuøÇÏäiiT¬ë.Uehi´(–†áó£›’üúQò~¥²Ä"‡G õé[Ê̵&i°qK Ó×s˜Ý¡¹Ñ'bû45hævA˜¦¥I¡4¤³> »bÔ$ &³>Í+צ¸ýOIG„œ¼¼žË?ÝEKS„•/gùø—×óš<žr®'h¬÷øöåY®úZžå‡8,?Ä&×Ç׊š†z‹y³£ô •ÑZ3·3Âìö‰¨AzÒ£6eÑÙ!—,]$9ê`‡Ï~l˜¯^’ö¾˜f3ÿæî1.ÿÎÏóå‹fÓÕaãyÿâZ‹;îmdÎ,‹Ym 8É%™0˜Ó¥½.þHÏ òÿ“YŸ¿<šf"ãÌ(øy×IM$ãS%ºO=Ÿapĩޛ= è͈j`B×Îxl¡±#ôªÃ› lö»ªBPÆš![z‘—'ÃSÎk·jaòîËgé˯!)‹L¯?-&Ž™j… A·YSxÕtUN'Ââ¨æsvþÓïSö¹ñ¹ëô´ÓE5ÿñ•¹,žŸœQ¤Q¹29‡ó¿¸–ôdàvzž`¯ù>_¼ Og»_–ÖF‹ÇŸË02æÒÚhÒ7dpõÏãä ²:wË–Æùú¥]Ô$Mžyq’/|s3ýCNU{ ¥æýóüëF˜3+M¾„?†!ª2[)¦žðè¤|~ªÇás«ò »4ÖjBCFœ@ÚªÁq\Ž8p’¯ýýs;ËÕö]JÁŸÉpÙ·7pÐ>5\ü‘’‰ÀB›†æ÷÷ƹåÅšAcϨ-)O¿”c2çsÚ EZš” 9O¿ãùUù›l"nrÆ 8®Æ4O¿˜§¸\½7{\ã €^ÕAIGª9ô&1”iN+ŽB1¤ɪd5O›9ÚÌÏNü §ÿob”Ú}àØ}Ëpkîh G[;´æ¦rì•iÖò*Jg|šB^âͰäôI¿ã¾1þóWƒØÖÔÿ§ÏtrôÁõ3 T*k¤PtùÔåñÂtt´*¾pAýöÒR•khÔå°’4Ö›ôx\ýó8=}SdÓ¬¶ß¹l>ɸÅó«³|ýê^†Ýjº.Wœvž+.dŸ½LæÏ‰‘ËÍüŒ@¸"h¨5qéé/!e8÷†àÐý’´6Yô •‘@:çQ› jÚ5ÍIpð~ðïÿ8ÉÛs0Œ°Fiî{,ÃU×÷ðŽš8ó”†P¡RÀ-¿o$1Ïx´4Xì³0Î^óbŒŒ»Ä#’‹?ZÂõÐŽMz<º"M¾àMÛ¼ýØ|_#䋊çVfq£ªö¸ÆͨªgB×UÛøÌ5¶N³lºúÜ jNuáK­rÇÝÈ‹Â×Þk^üBì>plÌ>Dr×p˜n•:™yˆ‚-Ü W9˜ÆGsHÃ{Þ$K>ÚGWLòÍõV›0h çŸÕÌûOoÛŽ3 EŸË¾½™—7« ¯¯ ªÐŽ<À%—׸npH"Pmpǽ[aVÇIþù’NZ#lè.ðïÿÙ˦ž¦)ð}¨My|ø½ã|꜖iÉ)2YŸˆ-‘"hœ×¦ñ´&3XÐ¥©Î¢£508¹¼O®èã+iÂÀK{s ê’êkMÒ9|QÑP§ù×/e9ñh'ì5ô¾»íîqîzpŒóß߯’ñª1Û:(ùõqR‰ UU¾¤Èæý€Í×pü‘.ó:ƒ)bIz*CïÀ”Ť±1ͳñ}°-ÁcÏfBÑÎ.úë·*ý®mjÔëÄ$Mr<¨äbÊ…O«FT#…Ò‚‘¥Õtxvü6Òåþ©Fþ¯ä»+SçÓ­%JaƬ¹ÚÄ׿vބИá‘JÁß4!f¤XXsø›—óõìª ÿ|åé„=ä‰FV}v‡â‹d8ë KZÔÕ˜8®¢Xòin´1¤`tÜ 7“ž§)}zÊ®¦¥É êFG\@ÐÞl£ jçãq£š ŸÕf34â`‚TÂ$•|óKN8Ú©ÆØiënÄóàœ3›‰Fd¨ú<ñl’\Á —÷è,ãûšÖ&;°âãï:¥€ãíª»{V®ËáûSk;58òà:\Oaš‚çVåÉä¼]tñºœw…OK´‹u ¨–ª³n —9Œ%¼iV=pá·ø³ð0C fÉð'xdäÆ×¸÷ˆÝfÓN?eU¨ nDØÓÅšqpÂô¬DD8Õ’T ¤% RGTÓioù¶¾;ÏßÛÂĤW=&iù!5üýùD#ÆŒ¸¼RSþóß rÇ_Æ«•‚ZÃùg9÷Ì ˆÇ ævDXÔ¥µÉBkhª³˜?;ΆÍ)Ön´°Ì âlù!)>vVJin½c˜{J ooQ|å’<§õ©¾ÖDlɼYQvŰ-ÒAuÛ®s:"Ø–¤6e²¨+ÊÜŽ¦<ǽæÆXØev«ôÓšŽf{ÚɨÁA‹çŘÝÁ²dP{Žæ«Ÿ-pè¥r __½¾À· rÒòzöY«®¹áqÉí÷Dhª³ØknŒùÑjºmAW”ÓŽÓ47(|¶-¸ÿñIòÅ©öéñ˜ä}“( 0WЬÛ\@©=ŒŒðµË¼äÁÌKîC·šKY[Õ£^LÒ &*M‹ª®|(~ JhÛÍ‹RGìv·½Zm7RâëWm¡»ÏÁ²$ž¯Øg¯8Ÿÿx'Í övÏ×Zóû?ð‹ßSr‚^ëÅ’ä,qþÙe*R×m»ÖV¾ÚÖÉ­wØ?¡55IÉ¥ïDÁó«³\ÿëa,+èaŸˆi>ÿ‰G,óªs)„Øþ¼!ðõ”ÏW9·¦P†µ› }Öâ¡§mžYi²uP†Y!f¾ÇŽÖWÅðÔÄu hRø¾À²$¿»gŒµ |ììJhÅ’à±…²ØnŒ MmJsüQŽñäsY2Y—©ó³Ú¢´7Y(¥±-ÁŠ—²(ý&7žØ©;ˆdyˇøe~›TKõxÚÀ­rŒ´®­ºõ•2ÖAÝD“Ã. I§dPÕsïÀøÈüìV2ñÕ\c¥^”ö+­+)rZ|¾½ÎÀnÕ]v±PZ1;±ìM±äù‚Ç¿\ÝêõE,3Èo·7Û|é‚N̉Ïxnåzä™4W]ßO.¯0MÈæ$ÿ`‘óÏ.â:оq—®¶ã‘±à¸ê9,S°©Ïáö{ôôD#šlNñ‰´3ov ¥4ßúIo(3•¸žà¼³Jœx´Ë–2Å’¢¾Æ¤¹ÑdpÔ%ñ‘ë-êkŒj81™óèéKrÇ_lÖwKò… ƒM¥>Ñ45(Ž>Äã”·к„e™4ÔšAÆÀ×ôö—Q :Zm¤„þ!×Ó$ã’KÎ3¹ì[ ’ ÍdVñ«ßñõKç3¿+ÂÆž2AO¿Á3/™ì½ ÏȘ¤ôâ2ä)<:Ûsh²yŸÖæèh’gצ æÍŽ0úRü¸6·«,ºxC¬zGl)Kk¥OµÇ!‰ –¹YŽQ+²U’ªÒÒ¸ c ªŒ°&Û.]r„þÂ˼œyøUYõÝÓx"xÿ ·ƒÒŒ2N… âó€¼r˜R幎ÔG:‰5»äZ+¾ýãž|>–kbÉ?ÕÁûÔlgÅ^Þ”ç+ÿÑM6€¼P”¼çÔ2œ["u›‹aÿrA<&™Ó¡¹Ñ¢{k9Ü,Lî~ ŽiÕjs:mN;¾ÓüúÎ!Ö†ŽëÁ’…N\^`,퀆y†Ç]Š%MS½ÅÂ9ÑÝc$š{öøû+êø‡ÿ“àÎû-Ön0éí7“ŒŒ½ä6÷<ó¢ÅoŠrÞçë¸ç¡8éI/Ì0húËÔ՘̙!äò>¦)˜?;Jk“Íч8s¸‹ã¢ÁïOÓ7Tæ=§6âûÁ><*¹ïÑ E¶h^ŒHd O›zJÔ¤º:J]yž|>°Ø• µ6eÒ5+üÝ€µK».þFØD_»×ú Àd?/PÆ… |»Ùç©OSZ2¦ëÈéDµ¦Ý"B‰‡þªÝÛ]êVòáigC—¦Á_àaNÿJ3&ÔÞŒ‡-hŠÎ ªøvC|>½ÍòOnîç®'‚ÒÊñ½ðÜNZÞ´È…ŒŒ•ùô?­'›SFP,²da‘‹?š§6©q¨­5‘2xÿˆ%q]ÍXÚ#–q®ï޲¥ÏÀA+¦wÔÀ¬Ö¾ïó£›0Í CÓÜ 9íØ5É€+–Up“¸²•³Ìµ†¨-0\{s”¯_ÕʆîùBРBJžªþ„ÝhÊŽ`d\ò½ŸÖq˵! ƒ£.C#AšJškxÔe}w²«hnмç”R˜Ò šZþöO#œq|Cuáy ŽX¬ß¬xyS1Ü‚“ZjR&Í ŠEs}üèϯÊ縇¯O% :ZíªÁÊ5Ãcå=/FŸZXФUÏáMg3ªŒêz„P(-i•#¤D~Z3à5YdD5ÌxŸ¹ÆV&Ü!žÿÃñ½‚Eáãø¥@ø2}sÃØéFiàM{ž ÚÙA ÆÝŸW€{ÛÝ#\÷›a£ã.ýɘA"j°lqŒ#$â†ß²=3É~KâUw<-ÙÒ§é*ÓÜÌÑþ{ÅY¼ Ng{„¥ Mq…&°ê›{‹3îYÂÒÚ㨱[wRáµ{Ü`WPÚÃÚæ´Ñèz‡^Ž1ƒ´ Ò-q³v—Zô©’ÓW|¿›¾!—ˆ-)•G˜äŠÏÍ©æÊ§ƒ¼ì(®¹±??<t¶©9ÿì~·O¡lS› òåÁ÷ 䜎Š$B€‘4¨‰K®|2h ¥5´·Ø,ž°ú÷<2ë–×¶5ÇéÒÚ, ËÄ#TÇÛÒÃaÀš qîy0Šë cê+š\$ãšC—y~€Ë¢y>5IM±$ØÔ#yô+H•¦1Õ’<“Üÿx’ GÙ‘Ä"ÏîY\jÛ |¤å:Ú|Ú[›{ Cðìª<§¼­?ìmWv$…¢¤£5”£†£3 ˜Õb³e«¢6¥ ŒÙÖòL Ç$ñ˜¬öµŸ˜ôöLÖ}Û+*“Õtc*ɨ®Ï‡¤(Ò!‡¦$ÐtŒÕX=ýS ™%Ç-­eÍ䃻=ï¼íåé2 …S,º‰ºjúÄ•oËè.ùÊ—3\qU7Ý[§@~ÀÒ8—]8›¶æèv1¹ç+núÝ ¿¾s,ˆ9EÐÐñü³JœûîˆEŒj³…JÏr!‚6MZk,SR—2IŃç<»Ò š?„i«s¢(­X³¡XU†E,8ãDÛ0± Q=%jKêSSDßÈ„ä÷F“Ó@̽ç :ZŸÿD‘ù‡<缫ġû¹,žçqÀ—÷žZæÿçÃï+‘Jèi–=à~ÊÂñH`M CP›4©I3¶ôöfMSƒF…:÷ [Š´4F† aDe`™Æ ¯ªrRN"¦ˆÇ‚øVŠ€s˜~Ù–À¶dUQ*«=S»ý‚“ÌIÀìäÑôû5AÓHX¶.Ù?•‹žŠ>Õ†ƒ]=ø/)Š4ˆ^š|ñrïNbõÝÓxÂUJûÛL¾˜!ÚQŠm:C¯ÑDdb—„à½ôò$_û^›zÊDl‰ã*Ï‹ñ¥ f³h^b; j´ºîÖ¡`qÉ ö¾Ó |üƒ¥à0 …’ëOw!K@ƉéLÑ7d0™­”¡jš,Z›"¬Z—'“õ«üL×,Ÿ¶FÇSxþÔ˜ŠŽ"WTaGZx~µÅ£ÏXU²júÕÒ¨¸âsyÞZ™hÄÇñ¨-åú-*âQͧþ®ÄqG:ajqê¤3‚þAÙó§5¦«ýÜEØ//™PÄ¢*´¸Á!“B("öáW( Še]ÓUp‚h”àTØpþ&³3I]Ó†¬ªŠ%oÏeÝ·½RVËêOaB·’Ö©*.-á2ÇØ2ÖS®”§ ¶ªö*ygàÓ"³ŒŸg}æI”ö··ê»©ñÄÔóú>Í”‘7܃š ò^6õ–ƒâ¥io±¸ìÓ³X¶$5㹕y|àÉ4Wþ´|!H£å‹‚3O.òwdxySׇ‘ f]³¡@&[):Òô–yqmCÒ•/ç)³zƒQÕÃGlIg[ ¸[·©H¡8e'ÚÇc<ãÒÛïðâÚ<#ã.¹¼Ïà°Ãè„ËÊõ²ÉÃO™K•TÙTÛ •tx Ž:lÞZfíÆ`Œ›·–Éæzú‹HéqâQ%êü™ÜKY³n“ËȘG¡X)&‘<·*Gß T¼e=z HéWy!ßdó>•vûðöô•);Á8_X›gxÌeCO!O™ÕåN±¤wjjE˜ãßã>½(e^ò 榎 Çί€¸EŒ‘’ùjýoÅø-t´j S"O£ÌðÌøïɸÃÛ[õÝÕxB¼^_H°ã„ûòÕë3|ýª^6÷–«‚˜TÂàŸ.éâ°eu;ļ°&ÃåßÞL¡€¼Tœ¼Üå+—Y4×FJ‰ãjÚ›­P@b‘Éùa7á‰AV[cÒÖ(Ë6o5þ/uïoYUÞq×Úåôsn¯sït˜†* UE1–Dc‹%ͨ¯ÓLõMbLb4Fc¢Æ(VŒ…¢6Ã0L»3·×sïég×õþ±öÙçÞ™Áò~Èù|ø00÷ž³ÏÚûYϳžçWâ{’JÉHœŽN7h8í@;m‡OWÞfÝ MGÎÄ2%ÙŒÁèp‚Ñ¡ž¯X* |̲֮R‚“77¸ò/Ð,¶Þ.‹Íë“L͹(¥Jð?ßê䃟èâÇ,vlUä³k ÀdB°qĤ»Ó"“6À‘©&]×Sx¢Tñéí2±¬U5škÃ…¡¢³ tZ|R3íÖ'Èe –½ðTصê1±,ñ#£ ô•µºÙž¿ˆŠØ@Yecú¦…Ϩœ"DÆ_ZD ¯#ÁHŒªkeõŠó{Kw(omVWŠÿ?™Ž·ÞûE»ºÉ¨à—¾©îy²ÊûþyœGÚ#œDBòþw¯çâs:;îhbKßþ³CÑØM«¸œµÓçÏßQ#}Ù[ÃñB2I-[-…`¡è“LÊh´VgËúT ò´ýЦgÛhÂôvk®þÜ¢QXõ5nÙ ×¢Zr‰@³ÅÚS%a KR$/»¬!̈ýÑýjõ!à›·%ù·Ï¦øþ})>ûÕ wÝgSoŠø9Óª:‡Ž6XZö¨;!^ ÈeÛ‹+>Óó>ŽClN"€rÕ‰ÏçZ€Ãã‘'*”ª>¦)p]]½4E³¹Ê‘GÛ/Ç p]?"9*ÒIûÿF3nuól{áFÓ; †´ KtFëÚytµåŠbX äu§^ ¢Láqß©ù+k²ºBï¬Ï~ Ë¨E¸6xÅOÉéê›EÓ/?cTÜêcÄC{Ê\ÿCì?¬¹Üa¨H%%ý.y~çqÝu€£“uÞtý>šÍ0’k†m›|þâ]uz;C Y“ç’%Ÿ1˜]òÀ‘)‡LZÒÝa²\Òã±JÕÇqBêN»S!,-·$mKÒYÐ5k½¶“†BB á†À65»§ÓâìYüPð“Çôxn­F>ôõ„œµ3 D,<1¿ä11ã`DІïüÀƶµÛÛ|è“)æe,aešŠ žWcãp†®‹ €±É&Ù”–¾ªGÔÛ|FÒ×B#vÇL$ R‹z3së&“'GÂII>kðø:µºOj;çVÆÎfŒc]é¿6²|N<÷„'~ÖCiiN뼌¦\Ǣꈭ‹ÂePη­ŒVׄýfá IDATÑ“‰~ŸYÄõg¹ñÆÎÒŸí—-SHaj‡Ñ5'‡ŸèrU³QogA¬÷ÌJõ0TÜ}‰?ú‡1ƧgŸæsÙÙ”qm]ß~Ÿ0Zë„-IF×e’¦“biÅ@ ÅŽ-)>ò™YLC+ÑŽ+ÎÚiÒÓ¡ÑJ)6 'ã­©¸¥ŠŒaÈ£C‰5‰p¹ìÓh„$’ TŒ Úÿ7q'Êê²ÏcsötŽTª ÊÍÕFÐ#‹Ì‡Ý¬¨|LcÕâ)æU7Cb–P™¤D“~£Ìò}êøº!“TüÁ›\u¹Kµ™”–©JÙaÎ9~bs"õÕbIòðÏÓ³ð„ a¨=Ó,SkØm èéhã"NÁü’¤Ñ„tJß³­Skq³ón¼Š¦ £ƒ©çžðÄ/òÀ^6ð6>Qþ1GÂul7â)[xôÉ%ª*¯ÌøNµK­ÄâÃrŽ…°‹ÚÀWxðKï¢0Ð$sfcäŸÖlÛ\ £=¡WµLb ;º¾öùÜPþª‚ríï«n•A€‚¢3ýs]è±ÁúÛçù¯çŸv"áBMÜxÑÅüÑïŒÒÓiŸðÚwï«ð§ÿ8ÆøŒ¹ ä/ÞYâ³¥ZÀÂ’GO—E!k„ŠÃSž§·Ž&ñCÅô¢ÇrÉgdÐ&—1âÒBÑcý`‚¥’žE§S ÛÌÆìûŠJ-`Ý€ÔJ³ªu&Õרh†™jRÈô÷ؘ†`lJ Oä2&ƒ}‰ãT~¥€½M¼ `n)d]ŸÍâŠÆÇ›†`ÃHË”oâûŠ®ƒ­ëmšnÈ̼K&cÐÝ¡1󾯟r h²ÌÔl[xbd Á‘Iƒ{²°-½i]r^–[î\‰c»;C¶mñ™_v˜[ X?Ôžh8!G§B¦æ2º’RŠ\F0Ô×FH–«“³íJkdÀ&™4ž{šq¿HVïNŒrV×K˜ r”UNÓX‘ ÈE2¢±j7×ODEe)F <”˜ur–Îá9¶<ÿ”o?Uåüsùý–øò­³WÜ5תÚP)=Ó·ºðI¬š–)LÄý÷ã3º±#` Á¢s$Ξ?k½„Tkõ/‡ùÛM21ãÄëð†—÷ò÷n>.È[ï½÷@•wþÍa&f<­} ¶âÓÿT#ª ÉÃTkaŒt«7B¶nH²a8—5;mûæ4é¤lèÆ‘ˆƒö9ß8š¤¯ÛBH/Îl^ (WC„ÔXrE›E7¿$˜œuLâùPªÌ,hÖ-ë“,—=z=}¶_uƒ¥„Ç÷<ú„³Û²“-Rò&S³Ú’¸3o°a]‚F3daÙC‚LÆ TâÑÙÔœCg§ÉÆ‘©„ÁX–`Ëú$ƒ}6Õ|ë{6Ë%™G*6ޤ8pĉÏÓëCÖ¯«†‚m›S$W O<ÚàÈdÈÑ ÃÐ÷픓Ò_§•²ÏØDCjÅ›'kôäÿdÜSe©Kú Dš#Á 2 `AÈ:9‹$X“µ8E' •ŒG½²HÎ.³ý’{ IÚòiW$†!›pøà'¦¸â5»yÓõOpã·f)W¼ã²zgbˆ€ÔšZUbˆà¸FSXÍ5ÿÛ!‹Îa‚Ð{JÜþjaÆ+ñêwìãk·/ãûíLmš‚þÉzÞõ[£«DÖ6ßy¼Ì›Þû$Å?Ê$‚B^ñ¡?/ÑßÓ •ЛPÂ’$lŸM…T*>OjPªúø¢VYZòÙ{ Žëé÷Ÿ™wèì°ÖO¸nÈ|Ñg°¯pœ…¢Þ@;;Œ( êÏ:8.ñý|ÚÀ2¡ÑHX‚†à¸z.¾iDÑÓFõvêû‚Çöå1 î­hn½\òâlÚÕaÅë„`B?+Ñ燡֞Ÿ›w›lâG”ÓùEýcuNÈþÃ&_ýv‚„­³ÿ™§¤¸ç'e‚@?©„âŒS\:ó>3sOhÄ÷jvÁ¥«ÃbiE²ï3Ÿ·3§1ðÑý\Zö8<ÑÄ0tYÆŽ R>G3êçòØ÷9̳3ó*Ša‚bØù„ zäYQGm-v[)ÌQjAh£ì8"§é_¿Ì»ÿôgn/œ°ió _¿<ôx¿þÈ$/xÕ£¼ã¯ös÷ýËTê>*@‹F +žŸ„ZÎù„ï)ð±Úª¸ø¡ÇLóÉ5ë²:»,,¹¼ïC‡yû05£UWZ[ßÖ IþçcÛyÑÅ='tQøÎ—xãõûqÝH¤0ôw‡|è}UNÝæáy¡Ö»SÇŸ±¥œ{FŽm›SŒO¹Tëž§ì·Ø°.ÁÔœ Oh´˜´}®¯é¢½ÝmÂF£FÎ+02˜ ™h?¾[tä%‡&,}7Ä´$® ÓóZx¢£ 8k§ç·Ÿ²ÖsôÅ›R42~&\_ð›N¯KqÅ£R éí29K‚À‡­S$mÉb$ðï™øè $tä%3smïÞîkv9”«Š‘!›Ña›‰Ç Y\öéÌ[Œ[”«º÷ŠçŸ™‹›‘®²gÏk÷ÎÜ‘Õ=˜ç\³-º@õ3Κ®rt²ÁGþ{’þÅIÔk̉n]öFRRI¤PmqŠè]çÂœÈ F)(ˆ ¦?ÅËwQq‹!Ÿv„›¦ˆ»©"ÊR îüQ™·þÉA®{Û>ò™iæÇ{Ê ©ìUóñPËYŸ`»SˆØÁ%°„‡) Æ*´"ÚÙ=?df¾Éç¾>Ë5oÝÃ7n[&™”±æz>cðêkzøÜ?ocd(u\oQM?ûµÞó·c1£5'¿þwÊœ¾Ã%a hÉãZ#@¡³ˆ(ˆÎÑoÈgµ®›"p±ÉPG ‰%aù.x  ÅO4øñÃe¾úíEÆ&4ë̶ôhɲgìÈðº_íãçv®9ï®’—]>ñ…)nüV#’K CضÅçͯªrÙù奥À0 ›6h4C Ïl4uuQªÚ8€Þ.‹•ŠÏòŠO¹êÒÝiÒÝaÑßeᇊ#S½6ŲG½â!gŸ.H$®«·é¹E—rÕã”­i2)ƒâŠ>WïÙ/Y\ ñ|E*©m‘û{-æ<\?Äó §ËàŒS|¶¬›4°L÷²Ãî4ËOvKÎ=£N­¡¿ËPŸ9Ä6éé´Y.ûrºùV©„¡b¥ìÓÓi2Øg3>倀žNß ŸQ|å–4·ß"• QJ—è†Þè²_°iÔçê+ª„Ê$›1(W|Š%Ÿ¾n‹®‚I—Åžý&ûǘ†®n.¿ ›TRÆ‘³Pôxà±–)h4CÎ?3÷AžóãµÕ`¹êñí»Š|ý¶EöìoÄ=ž+9òÈN: …þ 9UEŠÉzcŠ¢êˆçЭy*ì§ÃXÁ"@E†:ݲÄ|Øó´¯5Û7eØuþzJÇöUyl_ÝOVÙ{ Îü¢mIÒ)ÛÈS]ì&_(ÆòYB(lå#E¸Ö29¢Cº˜„¢M?L EçŒ=ÉÄ¡ÝWáG•›p°LI2a†-¶ms’«.ëâš]='l¸µÖxï*ýÜ÷>X×Ëõà’ó<ÞþúÛ6…J’Nµ«¯á>;&O¬LD(8h9¥¡~ÝŒ+äLÑÙ6•\+<1:¨…'²iígf¹”dÇ–€‡ö˜H³ ‡Ç›œ±#Çð€Íä¬m,’‡÷&¹èì&¦aa‚tB’°4‡¾¿ÛB ز>àò‹\>ý•T[…(Êê+%Á¿|*Å;+ä¼³št ’‘ðÃέ™8…Y¦ˆJm‹Þn+Öëí²H§$–)HZ‚ÓÿœÍwïiy+‰Õ’0Ô›—m+®ÿ£C¶ÛU0£&œÞ°B¥Ÿ¯~ÛÆ÷Á4¶-¸èœB\Õ|ÿ¾eŽ"“Ò;óÎÊÇo>;Å÷/¿Ã~ßÃ+|þ› Üÿh…zC#ª”‚z3d놯|Ù)ô _ÃcÎ8=²D§(*H ‡A9ÇÑ`8:ÿêóMS%˜W=¬c–)ºå2˪ðŒj-„ (ä,.>§“‹ÏédfÁáàXƒÇž¬rïOÊìÞWÇñ]fžÜJÏÆ1ò%nÿä+¨º5lK’J¡¢Vê7yùKz¹ü‚N¶o9~6¾:Èo¹sO}eN{úAk4¯½®É›^Õd°' Dã» !âÑX«óoËkêº\ZÓLÃUK*!×ü^ëZ,S—Ħ©Z™êÂs<xÔIJ´NúÁ# ÎØ‘㢳s<´§†ë)šÜuo‚]x1k ŒœY4XEÿ·eÀ5»\îý‰Í L³Ý¬•¦f%ÿôŸ^÷r“W_ݤÅ\Ýh}7sƒ,Œxã¹(°î¸Ç憯'yä Û¢½©E3ÒŠ…ãÞóÖÏ?ÍCÑV“I'Ûk+„bzÖàÖ;m ð<ÅÙ§eغ!©|?ä«ß^ •œ¼)Ŧ‘TŒ xΕîǾ‹ë…ü˧'øÎW˜_ôR—ÀfH.+ùÝßâEw1:˜¢^Äüø½ÌÔu#ÎŒì›äóa/®2ã\2öÑg±”äDQþ (Ç¿¼àxÐË`o‚ÁÞç•çÚ]=™jòýû*›ä¾‡L^÷ò&眪í•ëŽÂ¶%†ø¡îä ¡%žŒè{<ºÏâK7'¸ï!“å²ÀˆU}"¥DÌR+U$¿ýÚ×½¸5ÿˆ' ~¨×ÑSÂ~1E£)°-ýs—_ÐÉ`Ÿ÷ñiTÒ V¸øœ|Lé}–Îè¿$˜¨aðãGVøÀ'&™œÖ ÓÔ¾FÓçê+ºøí× 3ܯý²rr€“²òÝÊ^†ÌòTA€­<†å ƒ ‘òjKœB2²Y!PSøtоxzgô„-øß»–¹ñá'ØuQ'¿ò¢òY«ò2%ÃI†œuJÏá ³7Pñ:)2"$C]$ •<®|w”E#öˆÏ‰µLš“.þ÷ý¥œ¼UñÊ—õréyôvÛ$l¹&¨mºÝÿè2ÿñ)&f\}Ž7ÁuÝ]!×]9ÇåšdÒã3.A ÝMû{u÷bÖ%ik}²Á>›¥e£Óƒ}6C½6õfÀÔ¼‡eÂá‰&;¶¤™[ô¨75›kýp‚|VóÍÇg\‹Ï;% H8r&ëm†B¶oö8Ÿúòßü~/§¾|„©Í‹d©Ç^Z]¢DNÖ¨…)­ÕýæbØÁ€H‘ A‡(ã`?í‹wܽ"ìbz÷it Î1”^ C–ck¿Xà£ÑÞjD &Â!¶‡H’¢ùŒÊw5O„‚»~TáÎ{*ŒY¼þ×úÙuQÙ´‰”úóO︒»ç>CEeéË„Jb sM¶ÑUˆIS$°ñt¶PU­eªÝß@ïŒÏe'‚±z¾âîùÇÿœbfÁ[£inÛŠ_{©Ëk®-“N*JU¹f&ÿƹœ´±5b‚GšH©âfÕj쎌$‘;šf‘[Ž|—#µ1¤Ÿâ‚¾‹§³ÿˆÃÖõ)m¬ÙðWw}®}‘Ï7o×´)ß¾k‰ Ï.°óäøÇUÞý·9¾w¯ÙÁ®2sˆÑ}Ö$s ÇîïíMbõïûL€V}ÕUW^º„RB˜$’Ããz#ÐÍ1‰”z¤vòæW_ѵæûÑÏÎÆâù¬Á…gç(ä¬5÷þ9)=^å÷ÿ|?ïøëÃÌFXn¥†„õë~ÿõeÞøŠ"àk%'d¥Ä>_;·fèµX,údR[F’œvr†zS+©«›F\é3OIã¦føÔãŸå@y¿Vo1êܱp?8ú0†”#á‰Z,<±vÆZª4xÙeŽ«»ûw?PáÀ˜ö–Ï›‡cÏx|ÿ¾$ûéffKx¡X.ûd³:SnݤRóñø§?©pÍ®©¤"Pb•žÁ àÝ‚ãþùéÏ|›HÓÝðë×Tø£ß«±u£E­¡¿ëöMi¶oN“M,•|z;-vlN#èàÆ[Óº;¯ •”\uY£C©ø=?ýåf罘˿}Kš—\ÚuYèYÉèê—°Ux¾Ö÷¾èìïú­aú{ÚÙ}iÙå–;ùØçf©7B²#æçs>'¯Wœœ:épŽÙE¿\ TiÑ [,Sé8«·`4³ay£úŒö)χ žçpqç >–æÈ¤ÅÔ¬¤\ÕÁžN”+!¿aŽÏ}}+.ìà%—t3Ðu5‡Ô¨¨,yQ!D’M’Ê¥&Rk`¼-á˺Ha)_—é(²¢É‚?ͽ _¤+±Ž¾ä&mü7ç°ÿH›ïXä;?,ÑòñC­Õ6زck“ßýÍ?ôté™x¹D¤E¥¦UK]Ov7Äq#S?7ж0ÐJRvšL¸ûùAíñ¥‹)Ìv!’oþõ›Gë,5ç?44,¸¡7S?P$ǘ_”|蓪µ6=ùÌS2¼öÚþ¸r82Yç 7-ÄãLJò+»ºÈ¦­ã*¹çd×ÝõB¶nLòò]ƒ¼òeýkÞûÇ*|ú+3Üó &ê[–Äó!•T\|ŽÇ¥çÕ9m{“¡¾Sùü‘‡9Ú¨Ñ-–µË*‚n±ÌTÈÄ]m¥UR,…ôÈ¢„O§d˜fÀEç6yåKCÆg´´ðOv›ìyÒd|Zbš‚tÊ 7w™›î(ræ©F^²‘üºÃdT=Îê¢D3L¹ºAE5L“”. ÕŒè¸!Òa®þw/ü'ÃÕ7±çá,÷<´ÂýVBD9A³ …¼6)¸îJ‡m›+xx¾d ×F™¤mI,KÄà/2*ìé²h4CV*¾¯Ø¼^q\Wo Ò„žÁ¢»À÷ÞÏFÒîL«6•†ªÐÕ!QÊÀ²ôì»ÖÔ¸:ËÒÀLÚ`ÓH’‰™&—é”à›·Û¬´xñ%ay‹BÖÀ¶uÙ„Š¡î†T*¹¬ÉEç49û4ÅÍw¤¸û~‹}‡ -/eµ~zæŽF]ø¾`°OqÚ6Ÿœç°ë¢&¹´¤áØ”*†t´ÊÎJYo<=]&™¤àÈTÈ?þG‚ÝO¶µæz-Þý–uí Lò±ÏM³\nC¦Oß‘áêË{ŽËæÏÚý™8sG†¿x”›Ûà•¦ð…›æøò-‹Lͺš¦ˆV 9㔀W_Ýä’ó<:²! .í¿”Æ>ÏT8ÀÙ§è–ËÔÃTБ¿2XRTEÛ=MpO6m2ГB£ƒ£WüÊ.Á#Þæ¼ IDAT{MÜmq÷õ¤Ù^ºDܳϧ–ºœÞ×¥î§ÈR‹GmyY¥"lgõ¨1WR9º¥‡¡Â¨1çÓiŽTïå'G‹Ü}ÛU¬L’L¶¨ `[ürå¥.—žç‘Ï„@r¯-˜Ëñ:¬ë·×üÌjQ‡ÖÌ:2Ø8l!ûÊ{ypéA&ÄQŒ(¢ŽI-:°v0‘ôtjá‰TR2’L¬zoèÈ™tæàÚ{<´Ç¦ÞЕɿü×4çžQ`°/ÁÛ_?ÄŸýÓ¸Æü#øÜÿdÙ¾EpÑó¼ØÐ!aKF£±Së»÷Ûkö÷~³Î®˜<ø˜ÉC»-Ûg0>¥…0 ã뮨†”Ï*NßpúŸ3wø<ïT\ZiÜ£R$’ CíÏ7MÁ†¡öú7=¸éŽ<–ŒÇpRÂ{Þ2̦‘t\Ü}ý¶îùI%ñeR’w¾q˜§âÔ?çšq¾¯8õä4Û3ñÿ›˜nðÿ9É©Po*¶.‰,SðolpÕå.#k™jŠ€õÙ œ\ØÊXÉ¡O,’.!‚>¹È¢ê¢J»„WJPUVT±´™ö Õ3*¾Ž@é,–NÂgùœsºÏU—;<¾ßäö»|ÿǾ¯Çró‡63õä’'=B20cɼ¨RIe¯*#õ5{Ê`%,Ð%—[l’ÂE„ F÷qéÊVÐðkˆh3•?µÚkzÞkëC±êVœ–Ï%çyÜô›„-˜žóøà'&øû÷næ²ó»xÅKkÜðõRIƒ•Šà¯?œæƒRãômÞqI¨%êD 7ú»êï~Òú€“Ö¼èb—™yÉâ²Áá£3’…¢ ÑÐÑn[Š|6d 7dÃHÀ†u!}ÝŠþžË8¾ó®”"'f“ù!ü×W’|þ G7jõ€÷½}”Ë/ìŽ/úÑ'*|ökó‘~¾®zÞõ¦¶nÌÄ}­c_ÏIá ¥4xÂpë÷øèÏ2·èj˜¥)¨7[6x¼úê";Nòq}(×´ødDôê³éÌ›¼ ÷2ö÷1e °UŒá)K È#´=<4 ¥¨ äUå8KãŸw4ŠÉ9—î‹TB26Õ¤Þ ±M­Ë=2ä£Â:yÅk®Kóýû’üÏ·,–æsì»ûBz7&aød#ü» ¤[¬0K/᪾B«Yå(›U S”ôæ¤Àª†Ñ?ÅWßĆÓ÷påúò‚í}`ºÌÌ7Y,†lMa›‚ÇÖcØjo§EgÞdzÁ¥XòéÌ›10ÃqCŠ+>½]Ž25㆒‘þ¤+ühþGÀØx“{ª’LHæ%ïý» ïÿà gïô™š÷Y.ûH©¿kW‡îÆWj¥ªÏH‚…eÙEËlZŸ §#äàD•Ž<\|®Iow‚JUëÊås½¶¥0 Åôl“F\ÏÆó“³Z°"›6Ô0à¦P*tv˜X¦àÈŒK„Üzg7Ÿûšþ=ÀrÕç÷_7À¯½´/^§…¢ËÇn˜f|ÊÅ04¹ë…çgùõ_éŠ-8‚}ÿå_þå_þ2ÃÜ /Ý…ì§W.G:Ù’EÕMQ"R›‘Õ#Wè’+€ÀÇd6(Ð=— é3xÿG¦øÔWæ)WýøPàûðŠ—9üÍ{êœ}š ¯ÛdzÞ£§Ó¢Í]·nЄ}CÉ|Ž6fÉKGÛ7!ȈEÕgHG%H‹)áÄédYhªäš‘BÐ!«$…•a%2gFi˜îN‹¤-9p¤ÉéÛ3tä5zrÖŶ%[7&X)U¹ê2Éo\ëpúö€Ù©%§FfÝ ©ÐÓ]÷¨|³ð©«ôšft«„÷1ð1õ5¯š'ð0L«k…¢½›’šÃ¯äèNÈe ––=r9ƒî‹ŽœI½©°,I¹æ†Úô0•ÔbA¨˜žóX©ø²&)Û¤§3AÍšæÖ£ßáÞåï2U›Â š˜X¤u•bÕ±cõŸ!T!õ_Ì“‡š8NÈ@OÃzý’’Éi—ž.  õ'(Uú{<ŽÅãû¨dV<¾¿Á9§eÙ<šfÃp‚GŸ¨R,˜† VÜó ÍI›BvlVôtÙWôä iÍ?q°ã)ú»-LKÒÓ¥§;‹EM7Àp¿EÓñ1ŒÞ.I*¥p]Ÿ^-19ëÐQ°èµ±L‹RlX—$—5b,Ãü’Ç̼Gg‡‰!ÿúÃyn½3Ijœz­ðÚk{øÝ×®‹Í(ë€}z‚ÛPŠä¸¡»Ãäßþf+¹ŒõÆ¡<[ãµgöÒÁÐäuÿÏ>nºC»e¶2X2ðÖ×”øÃ·UéëR†¾É­¦R0³àràH×SøJã½{gŠsª{Mù8"gÖÌ8[M°yÕ«ýÝOY”ÃÜO•b^wî*˜ä³fü1^ Ø{°ÎÜ¢Ö47 7`’ ‰e)rY¸ðœïz]ë¯ÝNZ³¬²mdœ‚”hRePb•G·ˆý¿*¡uòVÕ¹BAFÔé–+ˆ°Äîâ£ÜZú ·,ÿ7{›0^ž# µ4q*Ê5Ÿž“Z=`~ÉcÏþ•šfŸ5›ÕºO62Vã{ ßáßö˜/½9±ßw0•‡)‚®•>ÐHŽ•ðBã×»:Û¶©yàóK>Ùˆúٙפ”Àq¿ýšÛ·ѱ@;†þÕ‡²\r9m{Ž÷¼uýÝfŒ'(®HÞû÷n¾3~ÂÖ0Ù±‰&£Ã‰Ø@Â2޲TòbZmgÁŠ\ƒ´ð„eVÛ0D«ÜxÌλ„'¤`~ÉãÉÃuM=J+UuSëÓÃÂ’ä-ïíàG¥âUr½ë^Üża„\„ù÷ü¾1ÍWnYj#Þ|à7ÒÓiÿÔ NžÑmKðÝ»+špQ$´c¤TlÝòÇ¿[g ·ÁbQ»jš†`bÆadÐF¡èé4éïÎ1_ÔÊuƒ šŽâ’3{hΟÏ}³·Ñcå)ˆ ¡’tŠò¢FIeYíÆZ ÓP›H‹e•JÏŸcÌ¢@ºñ¤9ÙpÎi )94Þ`vÑ%™”*Ú¬¥^¢ñߊ@)¶æ6±£r*÷.•I õ5iP ׎cL•$zoÆA`ˆ€¼¨’Q Ì7§˜®O¢DÈ}ûRô%úÉ„JÓ,昩„¤&’ÛTèé ˜)©R¤¼TÄ$S,¡0¢y¨X…ÏoYRHBVëƒC«¢lß”`±èFÙÇ÷5ν鶅–V|*5Ÿ“6¦° ÅýNß{_†•²n”íkò7ÿz”¿z×.>§“?úÅß}|‚Åe)åŠäýÉðОW¼Ì'•”ÔMGð°%¢ð|3o6W¾GµÆ%ø±™žH33ï°°äGPÔ,®òО眖¥\ñÉçL‹>ß¹Ûæ_>¥\•RÅçëk®èäú·ŽPÈ[qßêÆ[çùçOÎ’IkF¢Rpýoñ¼ùŸËø9è-»Y)À › ¹ô|w¿¹NW!dvIS4úL±°ä³e$E ô—w}E*!(†z”MKÂÀ`Sr? e1¬‘3j±8ŨœfÚº&Eˆ£,šJC#ÞYª‚RÙg¹æ#ä²a Å²iƒ¦§pý€Î‚Á@ÍýUJ ,,y‘Y€ÏFy‡Ô s¡‡!’ÂÑGRe”„ºJÇ C±ªiª&YQÃR~Ô­'¢H†dTƒMÃÀÃÂW æGc×Ï}“º1¥ê j`˜0¶¨›m†K@Â`LW‡ªå‚Šd¶ÃUðÝ­¡ ÁáI‡J- ¸âQÈ›dÓ…œÁƒ»«l…¥eŸ‰i‡m›SH©›f'ov¸ú —/ßÜ…ãj°Ñwï-ÑY˜âoZÇet‘J þþãSŒMjFžë ¾tsŽ™ù$oý&]… ŽL6©ÕŠ%Ÿ|Î ›Ñú𻟬±nÐf~ÉcjÖ唓Òqõæùšgïù:{g³r•űÎòA¨·¹dB„!åªâ±'Bn¹#Ï}§1 X BȦ%×îêæÞ0“šNÀožçÿ>¹ðšk{¹îE}‘¼ú™ÁþK ôSküÜN”ÖáÞ4põ®oú5—R-`r.¤Ñ èî°°LA¥0ØoÇ»k½R©ùÔ›!=]ºì³™žsðUŠÓ g°§¶H*‘5P‚Œ¨Ñ#–™S=5F@Åï,~î5èê0íHÐÝa!Ì}¤Ô¸íÑ¡„núTÆgúºí˜Ó Ϙ„(ú:œÛ¼„;5æÝ€~¹BR8Jb¨QÑ6º*{Ûn¸¨YQyRÂ!™Ã8Asò ô™^EZéaœ}Ûçj…Bs|ü ªZŠ3kVGÅÁÝþ÷±½|q\ÃH)ر)C Æ‚ž-FÊ“ùÌ·Jk¹*h5ÿV«;q¬ŠÈC\ojU€‹ØšBs6_»È¾RH!Y·JxBg:ƒLJ?à[7&QQim™z#îî0A˜üÞë]‰&ÿñ…$RèFäoš§Rõyç›Ö±eC†¼wŸùê _¿}‰Åb@2!¨7¿!Áí?°¸ø\sN3)äºó’F„0õ9ر5oÈ–©×¡%<Ѫæz:µð„m lCDˆB‹G÷šì=˜ä‡˜ì3°-H&ôY\J¸ê²N^}uol˜06Qç㟟涻KfDó_òÂNÞñÆa:òÖÏä¿´@o}Ø·ï*òùoMÐÿB—‘O/b\.:ÇåªMuzóV4þËÛ4Ö`ï̘-báƒÕb G;¹È¢§‹N)lãÞùYú)ë–Ò4 †bë3m(¶Â%•”ñ#>…ð‚Ëh/#d0=ÀÕ#WñÍño2× é5$IÑ@)‰PЬ¨aâS!CS%ôJ“ÝCMeã( C±eëÏ’Yzª5eöñ3O!V»…Ô¸ðV_Åhkð mŒþOÆŠU\lÓäÍÕ ÛköPkÄ ~ëU ð‰(ØMCrów—™[ðx×›‡ÙyRŽ·¿agìÈòÙ¯Íqÿ£ULS’Ik±‰Ï=Áwï±Ø¼>à”“|Î>5`çÉ>I+@ HÙǯ‰e‹ã¡Ù¤¤X–<¶Ïäá=&O68XsÚþÙðfu¼ó1™6jhžÀZƒJs•ÇY]Ïàè´ÃbÑåìyŠeñ)‡B^ƒL@±ïpË”Ñ1È¢Ù i8!~ä³q$A¹êrÙMM—/ÝœÇ÷%¦ 3ó.ÿúß3üdwE;Ñt%xÕU\yI_¿mÏÜ8Ër9IJ¦)ð}ÁbQ°°G&$?Ù­/ Ú»!JE¦‹aã¾Ú Ê45øËóyƒ·ýF?×ìꡯ;±FŠêñÞÿÑqq𣎿6šT|èÏ6rù…]X¦ü…3ùÓôÕô_7Nóñfc¡%R=Ã*Á²' ¥xx·?]&=‡&šd3MG+{öY¤’z¦Yªä²ÚQ£Õ‰BÁô¬Kg^ÓçŠMNNŸÉTx€qoÆ¡qV²¢NM%cy¡_ôÚÓ)ɦá$¦¡Ïv[6¤8x¤¡G"@_nÇ 9t´I_Ö8o9f–Ê>†“²&‹Ë^̃®,¦¹vôZ~¸t'‡š{q…¥›r«„$  ¢BF6¨©(àU;àc¨X[:¯–>þÙ›Ùñë¢V±Ú5gþc‘qJA€ÏÆÌ&.¸ Ç )U‚¨£…'ÂP›=´^µFÈ9;3Ì.¹T«£C B¥µë~ôh…-£I†úm|_ñŠ«Œ Â'¾g¹¤{%fÈ÷–yä‰}üÞorõå=twXüÖ+yÝuýÜrç"7~k‘½‘ò-ñQÅó‰´àvcVˆµ[ZÀ©ÛR\÷ân^öÂöÚZ©âñáOOòïc@”ZµwdÐâþxÛ·dŽÓ÷û¥ºR«3‚¾IÔøë=ÊcûÚg€„%¸âÂ<ÝC6*T1G†ÐšåíÎ6‘a`øsQc„ÐÚáȤ ê =ŠÉ¤%c›×§H§$¥ŠÏÃWîO0Ðksp¬Î¦õ‰X¼é†TJ ¶vr¿[b%\¤ K(%5U.ã„ý?5é ’ÇýŒ‚z#䑽5Ö'éé47ŒÊÐɇ\Tq„ öî¯áûŠm›Óq¡;9ã°msš0Ô€”Å)ìÂ&ģ̅ :X!/´R`¨€¼¨‘uš*A“DÄ_W'ÈÌ¿èf¶zãh£®$¡>µ¦´_Ü­HH6]µ³yÑÈ H6{ÖØrŒðı¯ÞN“û)“NI6Ž$㵜žwãŒÊ5߇W¾,à¬S«üÙ3—øQG~iÙçOÿñ(7Þ:Ï»Þ<ÂŽ-Y’ ɯ^Ùϯ^ÙÏÔlƒÛî.òƒJ™tñ<‘ÃPEÇ Ž,µŽhR )°mÁI“\|nŽ+.袿7¹æI ÅrÙåkÿ»À}užFS­q‘^|I?úQº öq½°_z ¯ÞAÂP13ïðÛùï¯ÍÓt´¬Më6¬Kðškú¹à|¸yÞ`µ_ !Ûl3®BIµG4at®<Ñc×" R 0¤ “Ô¾Ý&ëä3³ó.'oL“ß`âø!‡Ž6Ȧ OÑh*jJ-D ’œÕ}O>ñGƒAN•eý€*è— ôËÅøŒ¹¶ëÌšó§ŠÚÖjÕzuLNÎ¥XXÒ8qË\³Õ£”bfÁ#a¸_n §ŸœeaÙejÎá¤õ)êNˆaJl[—†©¤dóú$•j@ŸóBŽ6Gx¤þCJAS•ÉÑÐõHK®åç–MR8B⩨÷®L-Ô¸f«úÙüêŸ(¤Ûgp¥çéÇfôî #ÅPj˜õþóY7LoÁd¥äcüí[lWÇçÌmg<»ë[lÇvì8Ø.m”¦EQZJKÕ¨Bˆ[‹*UH}¢ÏðÊ+ï<Àð‚„Zñ„à¡B\ j-Tõ‚š¦IŒã¸µãËz×»;³»sæðpfo¶×Tm‚„ÄH¶¥3ã3³ç;ßíÿý?Ë0ÑÄ”Zœ2”“ô3¼˜vG?gýv“íRB>0|p·wZœ¿wÈ8[ÚÔ±Û¶é6¿8—ðÂ+üð§/½lS®jγx÷jƒç¾÷>_,ò­¯sßRH1o33åóü³3<ÿì ͖⃕:7nF¬o6¹½P®¶ˆš$I°mÏŒŽ8LŒØÌLy,-ø,/‡@§J¥¦Üfƒß¿²Ã¯~·ËNÉDÿ-iä˲sÓ.Ï==Á3_žèq“?)è]ÿ»kН¬Å¼ñö>/þf“+7b|Ïh­ ‡$K§}¾vÉø?øÑ¿ޏ0ßÖÚý‘ÒþRË~!èÕœ•šB§š½ý„Bh(Ñš¬˜·ØØ‚ÝJBy?¡X°ˆ›ŠzœRANâ:’S'=Z­Ôä÷1T;õ8¥\eç!^O~ËV:Æ”Üêid¨9ºÛ¢ñéq#¥”x«”P­+š-Å |I¹’°±Õdö¤×©µn×#G4‹ÈM5=át^Ïè°Íí­$ÅsSÎM,³”ÌñNõ¼½s…½««2Éòæý5R§†¢J7³àšDeÉ6•ASûsèØÖnw™U ‡ðºqPZáŠÎ$&Ï3ž,³»«ðrš¸iiS™+cI³îZJÅŠ(N©G)C©‹ß«šw鹂rMqýfÌâ|Žr5¡ÚÄM““žs²âMÜT|÷ù2‹ |µÀ;WlöÊÆ›¿¿¹Ï_^«ðÙEKŸá¹<''\Ó6ïpv9ÏÙåü'®¸a:Ïln7¹z£Î+o”yýÍ}j‘ÉÆøžì°ÉžžõxèÁ<ß~f’™)ÿ¢ýÔÐòA©²Z”ðÞµ:o¾[åå×öxë½–” ùý ©C¾ J~öË ®¯6p]Á¥ó6{º@*^¦¿Ó#ªÛt'šX»TµKh‡ÔëprÒ¥ZSºè|hø¦‹¸%3S.å}…çH&Ç\*UE¥š „`jÂÅužk£1uÈæs$i)a·sñäýÜÚx‹õz̰¨q'×kqtg¨{Æt_Î8Á¢E¡\ÜœÍØ¨…%Md¸Z¤šNûàñQ‡FÓˆÇP`Q‹RÒTãdç@S­¬#ˆYü“ã.[2\°É¹)>_ ž`Ö¹‡õô}®Un°Y_GR#à“F“èž ·4cDÜ”3ïë}'¢Ó¶"Úï#Ñ¥ÃÞsCsÌz œò9Q(PÚ(qÓ¿Š¡EÎ5@¡œ' ¹N’T¯¬E¤Úì@Ýnr}5âÚjÌÕ•ˆ•µ†á–¶¾±Ö]\°”ÕrXü«|î©_3Ÿ[£¨kí}U¬W*,¶ ‘¹y¾9ÿ cbîz§uI‰[¼pãÈæmXcš´#ʽR!¨ ¡`†§çžb„ù,žýqz¯ÑÐdƒ,ŠÞsfa7Ùf­¹ÆJu…•êujÍ Bi¤KkÚ:œŒ˜¬HãxïO—µº(£ S„¥°„Ǹ}Š…p™¡Y¦ý\á ÕN—Ñ%”èô+×í&Žºë¥sîÄ6LQIOÜ(ó™;Ÿ“AOÛ¯Uˆì;ʄDz4nZ\~ËáOsøçûVÖJ¹»žerÝZk yÓÿ¼šVI¹œÄsMž*U´ZeÖ媢TN(•”2‘zÛÊd#5tÙBjÎ-\zd˜‹ç œ¿7<ĵ§ñï_Ñ[;I'WRö* ­–‰þ™œµ8Æïµ¼ OV&œ}ì2#÷½Æðø‡™þÇŸ´v×çð·åTnÁ4:Ô>…¾€N7 "º üí»öˆóßZÃjôΙ¿2~ê¶• `€ ‡U-‡µyªWcÒ:Ó!êcÐÜ3ŸöÐ|u ‹ü ÝqÑw^bÚ÷ÔZ5öeœÑ5&?`â3× GvH‰H%"«wéE£€ët6´Þ {Õù.«¯IDAT´Uja¥$M­•6¯-RZ]ÀU£Ü<¶°I³º„CNÎQ<œGŒÕú]8v`\V†Ã¸½-ÙÙ³íïªÈÓÙ/= µ*8L©RM’˜Ÿ£O<2Ìã¹çÌÓ.–%婢wæ÷ÀW.ëAyÑOrc±uØŽBzÒJ:‘ØãÿÑX$¾IÒèãuààpø€ác®¤[ÇrZo®æžÄ>Z`RчsÍÇmž§øç8ƒG v‚í6±½áè.'n02{‹áéÈm™ï¦Ízª{0mºóX=é¸nD=ª)oL³{k†ÕÓ”Ögh5<’¦‹j:¤âY¡wiáÓ¯ >©µ#ðíÇUØ©m,-ä¸pžÇ/9»ø/ûîw·…@<øÕËúÎÞDw´íÿÿÆq”{pØú0<ö:kî ‘–Â/– †÷ðóû¸C5/FÚ R¦Æ´VIÓ¥ÄÕúÞ0µÒIœëZE©<¤? ²ðêÍgñ Ï• 6©Ò\| äÌ\Ž¥Ó>÷-„)®’–á¹ïzs×¼}üþ±í˜ƒIEND®B`‚nco-4.5.4/doc/logo_srl.svg000066400000000000000000000516011264355130400154170ustar00rootroot00000000000000 image/svg+xml 4438689474631312797324428448535143446446468641977656132843595465143888559155814893416965129265551414261998826794499377388447675639577666478548527727253135942285926194957683338188713961757752948429637579195739126436373998812978124726622389426825148246342239771854676796713439265638986591159988417221665312246548145616919612491257514386249744386953564331759549659656226577764441444688311291124989773683171482138134512358786493539376255891825576739814514445464283376655795435434998738788315663832417924223741374499733596656694165592352682721457412543692942549182596248835736732431864561697489696276811498696892397322557541299211122583596987761266592213752564617682671951515477621138598239683165426542942439756258937979345598379255222516293467471281299278954668167738997791564224519932482144588237282558878976869587667641378774117176561716452529931939963223844357822196827927293848189858146472216119419238628464562728741566264137776188349472361245986467978964333189511494596267627669752873439458747365727 NC NC nco-4.5.4/doc/logo_srl.xcf000066400000000000000000037425621264355130400154200ustar00rootroot00000000000000gimp xcf fileêKDÿìDÿìgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) ‹ 1°œìêK Backgroundÿ     2êK^ 1h 1t 1€ 1Œ 1˜ 1¤êK J V f v † – ¦ ¶ Æ Ö æ ö   & 6 F V f v † – ¦ ¶ Æ ÖtŒÿ…ba â ò!!!"".">"N(ò),/00$046V6ò<Í<Ý<í<ý>~D-H½K£ObS÷YYÔ[ªb„g\k´m¦nñqSv%}%‚E‚U‚e‚uƒƒ‘ƒ¡‘v‘˜— Û ë û«=¯‘¹è¹øº¾ ÇʻΠÏAЄԠÚäxìzòùNýŽŒ ì]±ÆÖæ ò!!/3B8÷CðE¯E¿PT…_ _`Ik2p w€}]ú‚ÿˆš‘™ÅŸ¢¨n­Ÿ³äº½)ÄfÊYωØ|àžåªåºæÆæÖææôèú,£p0@‚!+Š+š4¶:ª@ãJ JJ,J<K¸Vs_œh¨n£x®…!†½‹í–7Ÿ÷¦Ë®ã¸,¸<¹H¹X¹hÇjÌ®ÚKàMêõío÷±ü5¹Éï"î#Ê#Ú#ê$8,¡2î<>‡I‹TyW‚Z„\§^²e7quwŒ#/?OžQ£•± ºÐÀ‹ʳÔõÙyãýä î4òÝþþþ!þ1b æãPq*L1Ž7Lœ;¤Ç©K©[©k­ ±µä½Ú¾¬Ç/ÈÈìË€ÒØÓÛkÜ4ÝÞâ0èëî$ð”óÍù Q Ü Ä ­  ð ñ } z  !t #ê #ú $ $ %* %‚ %Ü &6 & &ê 'A '¡ ( (a (Á )! )ƒ )å *G *© + +j ,( ,® - -p -Ò .4 .– .õ /W /¹ 0 0à 1 1 1. 1B 1Vÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ =ÿüãQÿ9ÿú[422ÿ6ÿüªd7224ÿü¸n;221ÿüÆyA2 2.ÿüß…H2 2,ÿü»e522*ÿý˜L22'ÿüÖy;22%ÿü°]322"ÿüøŽF22 ÿüÊp822ÿý¥V22ÿüá…A22ÿü¿h52!2ÿý›N2$2ÿüí<2&2ÿüè}92(2ÿüä{82*2ÿüáy72,2 =ÿüè hÿ9ÿú«pMLLÿ6ÿü¶yPLL4ÿüÂTLL1ÿüÏ‹YL L.ÿüæ–_L L,ÿüÆyNLL*ÿý¦cLL'ÿüÝ‹TLL%ÿü¼rMLL"ÿüúž]LL ÿüÓƒQLLÿý²lLLÿüç•YLLÿüÉ|OL!Lÿý©eL$Lÿüñ’UL&LÿüìRL(LÿüéRL*Lÿüç‹QL,L =ÿü µÅÿ9ÿý²ÃÍÍ7ÿü¯ÀÌÍÍ4ÿü«¾ËÍÍ1ÿü¨»ÉÍ Í.ÿü¡¸ÇÍ Í,ÿüªÀÌÍÍ*ÿý³ÆÍÍ'ÿü¤»ËÍÍ%ÿý­ÂÍÍ"ÿüà¶ÈÍÍ ÿü§½ÌÍÍÿý°ÄÍÍÿü¡¸ÉÍÍÿü©¿ÌÍ!Íÿý²ÆÍ$Íÿü¸¹ÊÍ&Íÿü©ºËÍ(Íÿü »ËÍ*Íÿü¡»ÌÍ,Í =ÿü¯Íìÿ9ÿüÇæþÿ8ÿüÂáüÿ8ÿü½Üùÿ8ÿü¸×öÿ8ÿü°Ññÿ9ÿü¼áýÿ9ÿýÊïÿ9ÿü³×ùÿ9ÿüÀåþÿ8ÿüÞÎóÿ9ÿü·Ûûÿ9ÿýÄéÿ9ÿü¯Òöÿ9ÿüºàýÿ9ÿýÈíÿ9ÿü½Ôøÿ9ÿü³Õûÿ9ÿü®Öûÿ9ÿü¯×üÿ,ÿ¿ÿþ¶ÿ8ÿùМpL42ÿ3ÿúý´„]<220ÿúΚoJ322+ÿúø²‚[:2 2'ÿúÌ™mI322#ÿûÒ]:22 ÿü®tE22ÿûÑ[622ÿü­sD2!2ÿûÐŽZ62$2ÿü­sD2(2ÿûÐŽZ62+2 ÿü­rD2/2ÿü«e7222ÿü¹o;252ÿüÇyA282üÖ…I2{2þF282ù8W~¬åÿ242ûFj”Çÿÿ02ú8X­åÿÿ¿ÿþÁÿ8ÿùتƒcMLÿ3ÿúý¿•rTLL0ÿúÖ¨‚bMLL+ÿúú½“qTL L'ÿûÕ§`LL#ÿûÚŸrSLL ÿüº†]LLÿûÙžpPLLÿü¹†\L!LÿûØžpPL$Lÿü¹†\L(LÿûØžpOL+L ÿü¹…\L/Lÿü·yQL2LÿüÂTL5LÿüЋYL8LüÝ•`L{Lþ]L8LùRm¸êÿL4Lû^~£Ðÿÿ0LúRm¹êÿÿ¿ÿþ¬ÿ8ÿù¥²½ÆÍÍÿ3ÿúõ¬¸ÂËÍÍ0ÿû¦³¾ÇÍ Í+ÿúà­¹ÃËÍ Í'ÿû¦³¾ÇÍÍ#ÿû¤µÂËÍÍ ÿü®¼ÈÍÍÿû¥¶ÃÌÍÍÿü®½ÈÍ!Íÿû¥¶ÃÌÍ$Íÿü®½ÈÍ(Íÿû¥¶ÃÌÍ+Í ÿü®½ÈÍ/Íÿü¯ÀÌÍ2Íÿü«¾ËÍ5Íÿü§»ÉÍ8Íü¤¸ÇÍ{ÍþÈÍ8ÍùËĺ® ÿÍ4ÍûÈ¿´§ÿÿ0ÍúËĺ® ÿÿ¿ÿþ¾ÿ8ÿú´ÈÛïþÿ4ÿúô¾Òåùÿ5ÿúµÈÜðþÿ4ÿúÞ¿Óæùÿ5ÿû¶ÉÝñÿ6ÿû´Íåúÿ7ÿüÁÚóÿ7ÿû´Íæüÿ7ÿüÁÚóÿ7ÿû´Îçüÿ7ÿüÁÚóÿ7ÿû´Îçýÿ7ÿüÁÚôÿ8ÿüÂáüÿ8ÿü½Üùÿ8ÿü¸×õÿ8ÿü³Òñÿ{ÿþóÿ8ÿúûéÕ®ÿ5ÿûòß˸ÿ5ÿúûèÕÁ®ÿÿ¾ÿýåÜÿ/ÿôÝÄ­™…tcTF:422%ÿôíͶ ŒziYJ=32 2ÿöЬ“€o_PB522ÿùž~aI52!2ÿùݵ’sXA2(2 ÿùΨ†iP92.2ÿøøÀ›|`G4242ü†^@2±2ô6CQaqƒ—¬·¾Æ2(2ô3=KYi{¡¸Ïõÿ ÿ 2öÿøÈµ¾ÆÏØàÿÿÿ÷XiyŒ¡¸Ïøÿ6ÿ2ö7DSct…™¯Íÿ-ÿ2ù4Ga}žÅÿ'ÿ2ø3C]y™¿øÿ ÿ2ùAYu•ºåÿÿ#2ù=Vqµßÿÿ)2ú:RqšÏÿÿ.2ú;[ƒ³ýÿ ÿ22ú3JošÏÿÿ72ú;[ƒ³ýÿÿ;2û3Još22üWH:2;2ÿö×¾§’m]M8212 ÿùÚ°oT<2+2ÿùã¹”tYA2%2ÿøýÀ›z^E322ÿùÈ¢cJ522%ÿûÁeB22)ÿúß§yT622.ÿûÂfC2 22ÿúà©{T7227ÿûÄ‘b:22ÿ÷n|‹œ®Â×úÿ6ÿLöP\iw†–¨»Öÿ-ÿLùM^u¬Îÿ'ÿLù[r‹¨Éúÿ ÿLùYn‡¤Åêÿÿ#LùVl„ Àæÿÿ)LúTh„¨×ÿÿ.LúTq”¾ýÿ ÿ2LúMb‚¨×ÿÿ7LúTq”¾ýÿÿ;LûMb‚¨LLüm_TL;LÿöÞÈ´¡rdQL1L ÿùἂjTL+Lÿùèã‡nYL%LÿøýÊ©Œs]MLLÿùѯ’xaOLL%ÿûËžyZLL)ÿúæ´‹jPLL.ÿûÌŸ{[L L2ÿúæµkPLL7ÿûΠvSLLÿ÷ÿ»¶±«¥àÿ6ÿÍöÌÈÅÁ¼¸³­¦ÿ-ÿÍúÈÁº²¨ÿ'ÿÍùÉ»³©àÿ ÿÍùÉü´« ÿÿ#ÍùÊĽµ¬¡ÿÿ)ÍúËŽ³¥ÿÿ.ÍúËù¬õÿ ÿ3ÍûǾ³¥ÿÿ7ÍúËù¬õÿÿ<ÍüǾ³ÍÍüÄÇËÍ;Íÿö£ª¯µ¹¾ÂÆÌÍ1Í ÿù£­¶¾ÄËÍ+Íÿù «´¼ÃÉÍ%Íÿùõ©²»ÂÈÍÍÿù§±¹ÁÇÌÍÍ%ÿû©¶ÀÉÍÍ)ÿú¡¯»ÄÌÍÍ.ÿû©µÀÉÍ Í2ÿú¡¯»ÄÌÍÍ7ÿû¨µÁËÍÍÿ÷èß×ÎÆ½µÞÿ>ÿöüóëâÚÑÉÀµÿ>ÿùþòãÕǸÿ?ÿùôå×ɺÞÿ>ÿùöèÙ˼®ÿ>ÿùøéÛ;°ÿ>ÿúùëÛȵÿ>ÿúùæÒ¿ôÿ=ÿúþðÜȵÿ>ÿúùæÒ¿ôÿ=ÿûþðÜÈÿÿüéñùÿ?ÿö²»ÃÌÔÝåîûÿ>ÿù±ÀÎÜêùÿ>ÿù¯½ËÙèöÿ>ÿøôºÈ×åóþÿ>ÿù·ÅÔâðýÿ>ÿûºÍáõÿ>ÿú°Ã×êüÿ>ÿû¹Íàôÿ>ÿú¯ÃÖêüÿ>ÿû¹Ìãúÿÿ€ÿþÏÿ=ÿú2=f›Þÿ9ÿ2üJy²ÿ6ÿ2û7ZŒÌÿ2ÿ 2ûAl¢èÿ.ÿ2û3Oºÿ+ÿ2û9_“Ûÿ'ÿ2û3Q‹Øÿ$ÿ2üOˆÕÿ!ÿ2üM†Òÿÿ2üK„Ïÿÿ"2üJ‚Ìÿÿ%2üH€Éÿÿ(2üG€Õÿÿ*2ü3WŸÿÿ-2ü:rÅÿ ÿ02üM‘ñÿ ÿ22ü6f¶ÿÿ52üD…Üÿÿ72ü3\¦ÿÿ:2ú=xÍÿÿ2<2ýU¨2ÿ2€ÿþ×ÿ=ÿúLV{©åÿ9ÿLüb‹½ÿ6ÿLûPpœÕÿ2ÿ LûY¯ìÿ.ÿLûMfÄÿ+ÿLûRt¢âÿ'ÿLüg›ßÿ$ÿLüf™Üÿ!ÿLüd—ÚÿÿLüc•×ÿÿ"Lüa“Õÿÿ%Lü_‘Òÿÿ(Lü^‘Üÿÿ+Lým­ÿÿ-LüT…Îÿ ÿ0Lüd ôÿ ÿ2LüP{Áÿÿ5Lü\•ãÿÿ7LüMq³ÿÿ:LúVŠÖÿÿLÿûøàȰÿ>ÿüð׿ÿ>ÿûüçζÿ>ÿûöÞųÿ=ÿûþíÕ¼ÿ>ÿûûä̱ÿ>ÿüìϲÿ>ÿüíгÿ>ÿüîÑ´ÿ>ÿüïÒµÿ>ÿüðÓ¶ÿ>ÿüñÔ·ÿ>ÿüòÔ³ÿ>ÿýéÆÿ>ÿüùÚ¸ÿ>ÿüîÌÈÿ=ÿüüà¾ÿ>ÿüôÒ±ÿ=ÿüþæÄÿ>ÿüøØµÿ>ÿýêÃÿÿÿ ÿýEÿ<ÿ2ü:zÛÿ9ÿ2ü4fÁÿ7ÿ2ýS¦ÿ5ÿ2ýDŽÿ3ÿ 2ü9xÙÿ0ÿ 2ü4d¿ÿ.ÿ2ýRªÿ,ÿ2ýM«ÿ*ÿ2ýN¬ÿ(ÿ2ýN­ÿ&ÿ2ýO®ÿ$ÿ ÿý]Ÿÿ<ÿLüSŒâÿ9ÿLüNzËÿ7ÿLýi³ÿ5ÿLý\žÿ3ÿ LüSŠàÿ0ÿ LüMxÉÿ.ÿLýh¶ÿ,ÿLýd·ÿ*ÿLýe¸ÿ(ÿLýe¹ÿ&ÿLýfºÿ$ÿ ÿýȵÿ<ÿÍüË»¢ÿ9ÿÍüÌÀ©ÿ7ÿÍýŰÿ5ÿÍýȶÿ3ÿ ÍüË»£ÿ0ÿ ÍýÀ©ÿ.ÿÍýůÿ,ÿÍýƯÿ*ÿÍýÆ®ÿ(ÿÍýÆ®ÿ&ÿÍýÆ®ÿ$ÿ ÿýóÍÿ>ÿüú×±ÿ=ÿüþáºÿ>ÿýëÄÿ>ÿýôÎÿ>ÿüúزÿ=ÿüþâºÿ>ÿýëÂÿ>ÿýîÂÿ>ÿýîÂÿ>ÿýíÁÿ>ÿýíÁÿ$ÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿüàÌ»²²ÿúß¶¨›‡!‡ÿýÌœ‡&‡ÿýº‘‡(‡ÿü諊‡*‡ÿýÎŒ‡,‡ÿþ¶‡.‡ ÿþ¡‡/‡ ÿýⓇ0‡ ÿý΋‡1‡ ÿýኇ2‡ ÿþ–‡3‡ÿþ®‡4‡ÿþχ‡þ‹’’ÿþއ‡ú‹—£¯»ÃÃÿþŸ‡‡ý´Ã#Ãÿþ҇ý¡ÁÃ$Ãÿþ›‡ ‡ý´Ã&Ãÿþè‡ ‡ýžÁÃ'Ãÿþµ‡ ‡þ•Ã)Ãÿþ‘‡ ‡ý‰»Ã)ÃÿþÕ‡ ‡þ©Ã*Ãÿþ©‡ ‡þ”Ã+Ãÿþ‹‡ ‡ý‰ºÃ+ÃÿþÛ‡ ‡þžÃ,Ãÿþˇ ‡þªÃ,Ãÿþ¾‡ ‡þ¶Ã,Ãÿþ±‡ ‡ýˆÁÃ,Ãÿþ¦‡ ‡þ‘Ã-Ãÿþ›‡ ‡þÃ-Ãÿþ“‡ ‡þ§Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-ÃÿüôíçããÿúôåßÚÖÓ!ÓÿýíÛÓ&Óÿýæ×Ó(Óÿü÷áÔÓ*ÓÿýîÕÓ,ÓÿþäÓ.Ó ÿþÝÓ/Ó ÿýõØÓ0Ó ÿýîÔÓ1Ó ÿýõÔÓ2Ó ÿþÙÓ3ÓÿþâÓ4ÓÿþîÓÓÔÿþÖÓÓûÔÕÖרØÿþÜÓÓýÔר#ØÿþêÓÓþÕØ%ØÿþÛÓ ÓýÔר&Øÿþ÷Ó ÓýÕר'ØÿþäÓ ÓþÔØ)Øÿþ×Ó Óþר)ØÿþðÓ ÓþÖØ*ØÿþàÓ ÓþÔØ+ØÿþÔÓ Óþר+ØÿþòÓ ÓþÕØ,ØÿþíÓ ÓþÖØ,ØÿþèÓ Óþר,ØÿþãÓ Ó.ØÿþßÓ ÓþÔØ-ØÿþÛÓ ÓþÕØ-ØÿþØÓ ÓþÕØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿû…wjdccÿú…g\RJD!DÿýwTD&DÿýjKD(Dÿü”^FD*DÿýxGD,DÿþfD.D ÿþWD/D ÿý‡MD0D ÿýxGD1D ÿý†FD2D ÿþOD3DÿþaD4DÿþyDDþ@::ÿþIDDú@6+ ÿþUDDý<#ÿþqDDý-$ÿþSD Dý=&ÿþ”D Dý/'ÿþfD Dþ7)ÿþKD DýB)ÿþ}D Dþ&*ÿþ]D Dþ8+ÿþGD DýB+ÿþD Dþ0,ÿþvD Dþ%,ÿþlD Dþ,ÿþcD DýC,ÿþ[D Dþ;-ÿþSD Dþ1-ÿþMD Dþ(-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿü¶ÂÎÖÖÿú·ÒÞêöÿ7ÿýÃéÿ:ÿýÏôÿ9ÿü¸Ûüÿ:ÿýÁúÿ;ÿþÓÿ<ÿþäÿ;ÿýµòÿ;ÿýÁûÿ;ÿýµüÿ<ÿþïÿ<ÿþÙÿ<ÿþÁÿ=ÿþ÷ÿ<ÿþæÿ<ÿþÇÿ=ÿþêÿ<ÿþ¸ÿ=ÿþÔÿ=ÿþôÿ<ÿþ½ÿ=ÿþÞÿ=ÿþûÿ<ÿþ¹ÿ=ÿþÃÿ=ÿþÍÿ=ÿþÖÿ=ÿþàÿ=ÿþêÿ=ÿþòÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿÿ?²‡?’€Ãÿ?ãÓ?Ô€Øÿ?cD?:€ÿ?Ö Àÿÿ²ü·ÇÛÿÿ‡ú™¦µÒÿÿ$‡ý”¿ÿÿ&‡üŒ¯èÿÿ(‡üˆ¡Öÿÿ+‡þ¶ÿÿ,‡þ¢ÿÿ-‡ý”äÿÿ.‡ýŒÐÿ ÿ/‡ýˆ¹ÿ ÿ1‡þÆÿ ÿ1‡ý‹èÿ ÿ2‡þ™ÿ ÿ’þ‡‡þ³ÿ ÿÃú¹°§‘‡‡ýˆÕÿÿ!Ãý­Ž‡‡þÿÿ"Ãü©Œ‡‡þ¦ÿÿ$ÃýÀ£‡‡þÝÿÿ&Ãþ ‡ ‡þŸÿÿ&Ãý–‡ ‡þÕÿÿ'Ãý¿‡ ‡þšÿÿ(Ãý¹Š‡ ‡þÍÿÿ)Ãþ°‡ ‡þ•ÿÿ*Ãþ—‡ ‡þÅÿÿ*Ãþ·‡ ‡þ‘ÿÿ+Ãþ›‡ ‡þ¾ÿÿ+Ãýºˆ‡ ‡þŽÿÿ,ÃþŸ‡ ‡þ¶ÿÿ,Ãý½‰‡ ‡þ‹ÿÿ-Ãþ¢‡ ‡ü°ÿÿÃ,Ãý¿‹‡ ‡ü‰õÿÃ-Ãþ¦‡ ‡ýªÿÃ-ÃýÁŒ‡ ‡ýˆãÃ.Ãþª‡ ‡þ£Ã.Ãý‡ ‡0Ãþ­‡ ‡1Ãþ‘‡ ‡1Ãþ±‡ ‡2Ãþ•‡ ‡2Ãþµ‡ ‡3Ãþ˜‡ ‡3Ãþ¸‡ ‡4Ãþœ‡‡4Ãý»ˆ‡‡ÿãüåëòÿÿÓúÕÚßäïÿÿ$ÓýØèÿÿ&ÓüÕâ÷ÿÿ)ÓýÝñÿÿ+Óþäÿÿ,ÓþÝÿÿ-ÓýØöÿÿ.ÓýÕîÿ ÿ0Óþæÿ ÿ1Óþëÿ ÿ1ÓýÕ÷ÿ ÿ2ÓþÚÿ ÿÔÓþäÿ ÿØû×ÖÕÔÓÓþðÿÿ!ØýÖÔÓÓþÖÿÿ#ØþÖÓÓþßÿÿ$Øý×ÕÓÓþóÿÿ&ØþÕÓ ÓþÜÿÿ'ØþÔÓ Óþðÿÿ'Øý×ÔÓ ÓþÚÿÿ(Øþ×Ó Óþíÿÿ)ØþÖÓ ÓþØÿÿ*ØþÔÓ Óþêÿÿ*Øþ×Ó Óþ×ÿÿ+ØþÕÓ Óþèÿÿ+Øþ×Ó ÓþÖÿÿ,ØþÕÓ Óþåÿÿ,Øþ×Ó ÓþÕÿÿ-ØþÕÓ ÓüâÿÿØ,Øþ×Ó ÓüÔûÿØ-ØþÕÓ ÓýàÿØ.ØÓþõØ.ØþÖÓ ÓþÞØ/ØþÔÓ Ó0ØþÖÓ Ó1ØþÔÓ Ó1ØþÖÓ Ó2ØþÔÓ Ó2Øþ×Ó Ó3ØþÔÓ Ó3Øþ×Ó Ó4ØþÕÓÓ4Øþ×ÓÓÿcügsÿÿDúHQ[f{ÿÿ$DýMmÿÿ&DüGa”ÿÿ)DýW~ÿÿ+Dþfÿÿ,DþXÿÿ-DýNˆÿÿ.DýHzÿ ÿ0Dþiÿ ÿ1Dþrÿ ÿ1DýG”ÿ ÿ2DþQÿ ÿ:þ=DDþeÿ ÿú (;DDþ}ÿÿ!ý#>DDþKÿÿ"ü&@DDþ[ÿÿ$ý,DDþƒÿÿ&þ.D DþVÿÿ&ý7D Dþ}ÿÿ'ý=D DþRÿÿ(ýAD Dþwÿÿ)þ D DþNÿÿ*þ6D Dþqÿÿ*þD DþKÿÿ+þ2D Dþlÿÿ+ýCD DþIÿÿ,þ/D Dþgÿÿ,ýBD DþGÿÿ-þ,D Dübÿÿ,ýAD DüFÌÿ-þ)D Dý^ÿ-ý?D DýE‡.þ%D DþY.ý=D D0þ"D D1þ;D D1þD D2þ8D D2þD D3þ5D D3þD D4þ2DD4ýCDDÿÖüÒÆ¹ÿ?ÿúùìàÔ¿ÿ>ÿýñÌÿ>ÿüúظÿ=ÿüþä¼ÿ>ÿþÓÿ>ÿþãÿ>ÿýñ´ÿ=ÿýùÀÿ=ÿýþÐÿ>ÿþÇÿ=ÿýú¸ÿ=ÿþìÿ>ÿþÕÿ=ÿýþ½ÿ=ÿþõÿ>ÿþàÿ>ÿþ¸ÿ=ÿþæÿ>ÿþ½ÿ=ÿþëÿ>ÿþÂÿ=ÿþðÿ>ÿþÇÿ=ÿþôÿ>ÿþÍÿ=ÿþ÷ÿ>ÿþÒÿ=ÿþúÿ>ÿþ×ÿ=ÿýüÕÿ=ÿþÜÿ=ÿýþ´ÿ=ÿþâÿÿ €ÿþÛÿ=ÿþžÿ=ÿý‡Óÿ<ÿý‡™ÿ<ÿ‡þËÿ;ÿ‡þ”ÿ;ÿ‡þÃÿ:ÿ‡þÿ:ÿ‡þ¼ÿ9ÿ‡þÿ9ÿ €ÿþóÿ=ÿþÜÿ=ÿýÓðÿ<ÿýÓÚÿ<ÿÓþíÿ;ÿÓþØÿ;ÿÓþêÿ:ÿÓþ×ÿ:ÿÓþçÿ9ÿÓþÕÿ9ÿ €ÿþ‚ÿ=ÿþUÿ=ÿýD|ÿ<ÿýDQÿ<ÿDþvÿ;ÿDþNÿ;ÿDþpÿ:ÿDþKÿ:ÿDþkÿ9ÿDþIÿ9ÿ €ÿþ¹ÿ=ÿþçÿ>ÿþ¾ÿ=ÿþìÿ>ÿþÃÿ=ÿþñÿ>ÿþÈÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿ9ÿÿÿÿÿÿÿÿÿÿþ¾ÿ:ÿûß©‰‡ÿ8ÿýËœ‡‡7ÿýº‘‡‡5ÿýñ—‡‡4ÿýÓ‡‡3ÿý»ˆ‡‡2ÿþ¥‡ ‡0ÿýñ–‡ ‡0ÿþ˜‡ ‡/ÿþ±‡ ‡.ÿþÓ‡‡.ÿþ‡‡-ÿþ¢‡‡,ÿþÀ‡‡þ‰ÿ+ÿþЇ‡ý”ºÿ*ÿþ»‡ ‡û‰§ÃÃÿ*ÿþ–‡ ‡ý‘¹ÃÃ*ÿþ݇ ‡ý‰»ÃÃ*ÿþ®‡ ‡þ©ÃÃ*ÿþ‡ ‡þ•ÃÃ)ÿþ͇ ‡ý‰»ÃÃ)ÿþ£‡ ‡þ©ÃÃ)ÿþ‡ ‡þŒÃÃ)ÿþˆ‡ ‡þ—ÃÃ(ÿþõ‡ ‡þ£ÃÃ(ÿþ؇ ‡þ¯ÃÃ(ÿþɇ ‡þ»ÃÃ(ÿþ¼‡ ‡þŠÃÃ(ÿþ±‡ ‡þ”ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃÿþèÿ:ÿûôàÔÓÿ8ÿýíÛÓÓ7ÿýæ×ÓÓ5ÿýúÙÓÓ4ÿýðÕÓÓ3ÿþçÓ Ó2ÿþÞÓ Ó0ÿýúÙÓ Ó0ÿþÙÓ Ó/ÿþãÓ Ó.ÿþïÓÓ.ÿþÖÓÓ-ÿþÝÓÓ,ÿþèÓÓ,ÿþÔÓÓýÔ×ÿ*ÿþçÓÓüÕØØÿ*ÿþÙÓ ÓýÔרØ*ÿþóÓ ÓþרØ*ÿþâÓ ÓþÖØØ*ÿþÕÓ ÓþÔØØ)ÿþíÓ ÓþרØ)ÿþÝÓ ÓþÖØØ)ÿþÖÓ ÓØ)ÿ ÓþÔØØ(ÿþûÓ ÓþÕØØ(ÿþòÓ ÓþÖØØ(ÿþìÓ ÓþרØ(ÿþçÓ ÓØ(ÿþãÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØÿþmÿ:ÿû„]FDÿ8ÿývSDD7ÿýiKDD5ÿý»PDD4ÿý|IDD3ÿýjEDD2ÿþZD D0ÿý»OD D0ÿþPD D/ÿþcD D.ÿþ|DD.ÿþJDD-ÿþXDD,ÿþnDDþBÿ+ÿþFDDý8ÿ*ÿþjD DûC(ÿ*ÿþOD Dý;*ÿþƒD DýB*ÿþaD Dþ&*ÿþID Dþ7)ÿþwD DýB)ÿþXD Dþ&)ÿþJD Dþ@)ÿ Dþ6(ÿþÌD Dþ+(ÿþ€D Dþ!(ÿþuD Dþ(ÿþkD DþA(ÿþcD Dþ8(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7ÿþÌÿ:ÿü·Ýüÿ9ÿýÃéÿ:ÿýÏôÿ:ÿýÌîÿ;ÿý¾øÿ;ÿýÏþÿ;ÿþàÿ;ÿýËïÿ<ÿþíÿ<ÿþÖÿ<ÿþ¾ÿ=ÿþöÿ<ÿþäÿ<ÿþËÿ=ÿþüÿ<ÿþÎÿ=ÿþïÿ<ÿþ¸ÿ=ÿþÙÿ=ÿþøÿ<ÿþÂÿ=ÿþãÿ=ÿþöÿ=ÿþþÿ<ÿþÕÿ=ÿþ»ÿ=ÿþÄÿ=ÿþÎÿ=ÿþÖÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿÿûèÒÁ³²6²û¬Ÿ’ˆ‡‡ýˆ‘’6’ø‡ˆ“Ÿ«¸ÂÃ7Ãý©ÂÃ=Ãÿû÷ïéäã6ãüáÜ×ÓÓ8ÔÓûÔÕÖר8ØþÖØ>Øÿû”{nec6cû_ULEDDýC;:6:øDC9.$7ý&=ÿû·¾ËÕÖ6ÖûÚæóþÿ »ÿÿ²û¸ÅÔèÿÿ$‡ûŽš»úÿÿ'‡üˆŸÇÿÿ*‡ü‹©Õÿÿ-‡ýœõÿÿ.‡ýÌÿ ÿ0‡þ¬ÿ ÿ1‡ý•àÿ ÿ2‡ý‰Áÿ ÿ4‡þÉÿÿ4‡ýŠßÿÿ5‡þ’ÿÿ6‡þžÿÿ’þ‡‡þ±ÿÿ Ãú¾²¦š‡‡þÉÿÿ%Ãý¹“‡‡þÿÿ'Ãý§‰‡‡þÂÿÿ(Ãýº”‡ ‡þ–ÿÿ*Ãþ§‡ ‡þÕÿÿ+Ãþœ‡ ‡þ£ÿÿ+Ãý¿‡ ‡ýˆñÿÿ,Ãþ±‡ ‡þ²ÿÿ-Ãþ‡ ‡þÿÿ-ÃýÀ‡ ‡ÿ.Ãþ¦‡ ‡üØÿÿÃ-Ãþ²‡ ‡üÅÿÿÃ-Ãþ¾‡ ‡üµÿÿÃ.Ãþ‡ ‡ü§ÿÿÃ.Ãþ™‡ ‡üšÿÿÃ.Ãþ¦‡ ‡üŽÿÿÃ.Ãþ°‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿÿãûåêð÷ÿÿ$ÓûÖÚçýÿÿ(ÓýÜëÿÿ*ÓüÕàñÿÿ-ÓýÛûÿÿ.ÓýÕíÿ ÿ0Óþáÿ ÿ1ÓýØôÿ ÿ2ÓýÔéÿ ÿ4Óþìÿÿ4ÓýÔôÿÿ5Óþ×ÿÿ6ÓþÜÿÿÔÓþãÿÿ Øú×ÖÕÕÔÓÓþìÿÿ%Øý×ÔÓÓþÕÿÿ'ØþÖÓÓþéÿÿ(Øý×ÔÓ ÓþÙÿÿ*ØþÕÓ Óþðÿÿ+ØþÕÓ ÓþÝÿÿ+Øþ×Ó Óþúÿÿ,ØþÖÓ Óþãÿÿ-ØþÕÓ ÓþÕÿÿ-Øþ×Ó Óÿ.ØþÕÓ ÓüñÿÿØ-ØþÖÓ ÓüêÿÿØ-Øþ×Ó ÓüäÿÿØ.Ø ÓüßÿÿØ.ØþÔÓ ÓüÚÿÿØ.ØþÕÓ ÓüÖÿÿØ.ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿÿcûhr}”ÿÿ$DûIRjèÿÿ'DüEVsÿÿ*DüG]~ÿÿ-DýSÌÿÿ.DýHwÿ ÿ0Dþ_ÿ ÿ1DýN…ÿ ÿ2DýFoÿ ÿ4Dþuÿÿ4DýF…ÿÿ5DþLÿÿ6DþUÿÿ:þ?DDþcÿÿ ú(3=DDþtÿÿ%ý9DDþHÿÿ'ý(CDDþoÿÿ(ý8D DþOÿÿ*þ(D Dþ}ÿÿ+þ1D DþXÿÿ+ý?D DýE»ÿÿ,þD Dþcÿÿ-þ0D DþIÿÿ-ý>D Dÿ.þ)D Düÿÿ-þD Dürÿÿ-þD Düfÿÿ.þ>D Dü[ÿÿ.þ4D DüRÿÿ.þ)D DüIÿÿ.þ D Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD Dÿ/þD DÿÿÖûÑǽ¸ÿ?ÿû÷ëÏêÿ=ÿüþæÆÿ>ÿüúݼÿ>ÿýéÕÿ=ÿýùÃÿ>ÿþÛÿ>ÿýð¶ÿ=ÿýüÊÿ>ÿþÄÿ=ÿýû·ÿ=ÿþóÿ>ÿþçÿ>ÿþÖÿ>ÿþÅÿ=ÿþùÿ>ÿþÊÿ=ÿþïÿ>ÿþ½ÿ=ÿþãÿ=ÿýþËÿ=ÿþÖÿ=ÿþøÿ~ÿþ»ÿ=ÿþÇÿ=ÿþÓÿ=ÿþßÿ=ÿþëÿ=ÿþ÷ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ þÿýÉ’ÿ:ÿûÔ˜‡‡ÿ8ÿý袇‡8ÿý²‰‡‡6ÿýÄŽ‡‡4ÿýؘ‡‡3ÿþ©‡ ‡1ÿýÇ ‡/ÿýßš‡ ‡.ÿý°ˆ‡ ‡,ÿýχ‡+ÿþ§‡‡)ÿýÊŽ‡‡ þÿýì×ÿ:ÿûðÙÓÓÿ8ÿý÷ÝÓÓ8ÿýãÔÓÓ6ÿýêÖÓÓ4ÿýñÙÓÓ3ÿþàÓ Ó1ÿýêÕÓ Ó/ÿýôÚÓ Ó.ÿþãÓÓ,ÿýîÖÓÓ+ÿþßÓÓ)ÿýìÖÓÓ þÿýtLÿ:ÿû}QDDÿ8ÿý”XDD8ÿýdFDD6ÿýqIDD4ÿýPDD3ÿþ]D D1ÿýpHD D/ÿý…RD D.ÿýbED D,ÿýyKDD+ÿþ[DD)ÿýuIDD þÿýÅóÿ:ÿý½íÿ:ÿý¸ãÿ;ÿýÖýÿ:ÿýÈ÷ÿ:ÿý»íÿ;ÿþÝÿ;ÿýÉøÿ:ÿý·ëÿ;ÿý×þÿ:ÿýÁõÿ;ÿþßÿ;ÿýÄ÷ÿÿ?ÿþÊÿ9ÿúõ¿ž‰‡ÿ6ÿüá·˜‡‡4ÿüÚ±“‡‡1ÿüÞ²’‡ ‡.ÿüã¶”‡ ‡+ÿüø¹–‡‡)ÿüÇžˆ‡‡&ÿüØ«Œ‡‡#ÿüõ¸“‡‡!ÿüΠˆ‡‡ÿüú¶‡‡ÿüÑ¢ˆ‡‡ÿý¼’‡!‡ÿü讋‡!‡ý ÿÿüÔ¢ˆ‡ ‡ú£¶ÃÃÿÿýÅ–‡ ‡ü‘¦¹ÃÃÿý¼‡‡ü¤¹ÃÃÿýµ‡‡üŽ¢·Ã à ÿüñ®Š‡‡üŠž´Ã à ÿü娈‡‡ü—­ÁÃÃÿü詈‡‡ü¦¼ÃÃÿüí©ˆ‡‡ü‰µÃÃÿüñª‰‡‡ü¨¿ÃÃÿüý¬‰‡‡üˆ›´ÃÃÿý´Š‡‡ü¦¾ÃÃý¾Ž‡‡ü“­ÂÃÇýšµÃ ÇüŠ¢¼Ã"Çü§ÀÃ$Çü«ÂÃ&Çý“¯Ã)Çý”³Ã+Çý”²Ã-à ‡ý“²Ã/à ‡ý“±Ã1Çý‘±Ã3ÇýެÃ5Çü‹§ÁÃ6Çü‰¢¿Ã8Ã?ÿþìÿ9ÿúûèÛÔÓÿ6ÿüõåÙÓÓ4ÿüòã×ÓÓ1ÿüôã×Ó Ó.ÿüõäØÓ Ó+ÿüüæÙÓÓ)ÿýëÜÓÓ&ÿüòàÕÓÓ#ÿüûåØÓÓ!ÿýîÜÓÓÿüýåÖÓÓÿýïÝÓÓÿýç×Ó!Óÿü÷âÔÓ"ÓþÕÿÿýðÝÓ!ÓúÔÕרØÿÿýêÙÓ ÓüÔÕרØÿýçÖÓÓüÔÕרØÿýäÕÓÓüÔÕר Ø ÿüúâÔÓÓýÕר Ø ÿýößÓÓýÔÖØØÿý÷àÓÓüÔÕרØÿýùàÓÓýÕרØÿüúàÔÓÓüÔÖרØÿüþáÔÓÓýÕרØÿýäÔÓÓýÕרØýèÖÓÓýÔÖØØÓýÔר ØÓýÕר"ØÓýÖר$ØÓýÔÖØ'ØÓýÔÖØ)ØÓýÔÖØ+ØÓýÔÖØ-Ø ÓýÔÖØ/Ø ÓýÔÖØ1ØÓýÔÖØ3ØÓýÔÖØ5ØÓþÖØ7ØÓýÕר8Ø?ÿþuÿ9ÿúÌmUEDÿ6ÿü†gPDD4ÿücMDD1ÿü„dLD D.ÿü‡fMD D+ÿüÛiODD)ÿýsUDD&ÿü€^GDD#ÿüÌhMDD!ÿýxVDDÿüègKDDÿüzXEDDÿýkLD!Dÿü”aGD!Dý?.ÿÿý}XD!Dú<,ÿÿýqOD Dü;)ÿýkKDDü=*ÿýfHDDü>,  ÿü»aFDDüA0  ÿü‰\EDDü6"ÿü”]EDDü=)ÿü©]EDDüC1ÿü»^EDDü<'ÿüô_EDDüC2ÿýeFDDü?)ýmIDDü:"Dý3 DüA,"Dü?'$Dü<$&Dý9 )Dý8+Dý9- Dý9/ Dý:1Dý;3Dý>#5DüA(6DüC,8?ÿþÄÿ9ÿûÕÌèýÿ7ÿüµÑíÿ8ÿüº×òÿ8ÿü·Õóÿ8ÿü´Óñÿ8ÿüßÐïÿ9ÿüÆçþÿ8ÿü»Üúÿ8ÿüÕÑòÿ9ÿüÁåþÿ8ÿüêÒõÿ9ÿüÀãþÿ9ÿýÎóÿ9ÿü¸Ùûÿ9ÿü½äþÿ9ÿýÇîÿ:ÿýÎõÿ:ÿýÔùÿ9ÿüËÙüÿ9ÿü³Þþÿ9ÿü¸Þþÿ9ÿüÁÝþÿ9ÿüËÜýÿ9ÿüôÛýÿ:ÿýÔûÿ:ÿýÌ÷ÿ}ÿýÿüàÑÁÿ4ÿùÛÈ·¨›Ž‡‡.ÿùä͹¨™‡ ‡(ÿùãÉ´£•‰‡‡#ÿúØÀ«™Š‡‡ÿûÓ¸£’‡‡ÿûÙ¾§“‡ ‡ÿúøÉ®—‰‡$‡ÿûß¿¦‘‡)‡ ÿûß¼ ‹‡-‡ÿûèÂ¥Ž‡1‡ÿüǪ‘‡5‡ÿûÜ·šˆ‡8‡ý©Ž‡;‡þˆ‡6‡÷‰‘š¢ª²»Â‡0‡ù™¢¬µ¾ÃÃ*‡øˆ‘›¥®¸Áà Ã%‡ù‹–¡¬·ÁÃà ‡úŒ™¥±¼ÃÇúŠ–¢¯¼ÃÇûŽ«¹Ã"Çû’ ®½Ã&Çû’¢±ÀÃ*à ‡ûŸ¯¾Ã.Çû‹œ¬¼Ã2Çü’¤µÃ6Ãú‡‹š¬½Ã9Ãý³ÂÃ:Ãü¾¶®Ã4ÃøÁ¸¯¥œ’Ї‡/Ãù¸¬¢™‡‡*Ãù¾³¨œ‘ˆ‡ ‡%Ãú¾²¦™‡‡ ÃúÁ´§›Ž‡‡ýÿüôïéÿ4ÿùòëåßÚÖÓÓ.ÿùöíæßÚÕÓ Ó(ÿùöìäÞØÔÓÓ#ÿúñèáÚÔÓÓÿûïåÝ×ÓÓÿûòèßØÓ ÓÿúüìâÙÔÓ$Óÿûôèß×Ó)Ó ÿûôçÜÕÓ-Óÿû÷éÞÖÓ1Óÿüëà×Ó5ÓÿüóåÚÓ9ÓýàÖÓuÓÔúÕÖÖרÓ0ÓÔûÕÖ×רØ+ÓúÔÕÕÖר Ø&ÓûÔÕÖרØ!ÓûÔÕÖרØÓûÔÕÖרØÓûÔÕÖר"ØÓûÔÕÖר&ØÓûÔÕÖר*Ø ÓûÔÕÖר.ØÓüÕÖר2ØÓüÔÕר6ØÓüÔÖר9ØþÖØ;Ø×þÖØ5Øú×ÖÕÕÔÓÓ0Øú×ÖÕÔÔÓÓ*Øú×ÖÖÕÔÓÓ%Øû×ÖÕÔÓÓ!Øû×ÖÕÔÓÓýÿü…zoÿ4ÿùtg\RIDD.ÿùˆwi\QHD D(ÿùˆueYNEDD#ÿún^QFDDÿû|hXLDDÿû€l[MD DÿúÛtaPED$Dÿû„m[KD)D ÿû„kVGD-Dÿû”oZID1Dÿüs^LD5DÿüƒgRD9Dý]ID;DþCD6D÷B;3,%D0Dù=5,$*DøC;2*! %DùA7-# Dú@5)DúA7, Dû>1$"Dû:.!&Dû;-* Dû=/!.Dû@2#2Dü:+6úDA3$9ý:ü"4ø!)2:ADD/ù#,5=DD*ù'1;CD D%ú)4?DD ú(3>DDýÿü¶ÀÊÿ4ÿù¹ÅÒÞê÷ÿ1ÿù´ÂÐÞìùÿ2ÿù´ÄÔâðýÿ3ÿú»ËÛìûÿ4ÿû¾Ñãóÿ5ÿûºÍßòÿ5ÿúßÅÙíýÿ5ÿû·Ìàôÿ6ÿû·Îåúÿ6ÿû·Êá÷ÿ7ÿüÆÜôÿ7ÿû¸Òëþÿ8ÿýÞ÷ÿ ýÿ ÿèåÞ×ÐÊÅÁ¾º·´°­ª¨§¦¥¤£¢¡ ŸŸù ¡¢¢£¤ÿÿòñÛÑÇ¿·°¨¢›”Ž‹‡!‡ÿõýÛÌÁ¶¬£›“‹‡/‡ú´§œ’‰‡Ÿ‡í‰‹‘’”–˜™š››œžžŸŸþžþœ‡‡ïŠŽ“—› ¤¨¬¯±´·º½ÀÃÇ󈓘£¨®³¹¾ÂÃ*Ã÷Ž•œ¢©°·½Ã©ÃÂÁÀÁÂÃê¿»·²®«¨¥¢ š˜–”’ŽŒŠˆ‡‡ Ãô½¸²¬§¡›—“‹‡%‡Ãö¼µ®§ ™’Œ‡1‡û¥•‡{‡ ÿñöôñîìêéèæåäãáàßßÞÝÜÝÞÿòúòïëèåâßÝÛØÖÔÓ!ÓÿõþòíéåáÞÚ×ÕÓ/ÓúäßÛ×ÔÓ¢ÓÔÕÓÔÕÖר ÓÔÕÖ×,ØÔÕÖ×®Ø×Ø×ÖÕÔÓ Ø×ÖÕÔ'ÓØ×úÖÕÕÔÔÓ2ÓÕþÔÓ|Ó ÿ艄zuromjgeb`^\\[ZYYXWWVVúWXXYYÿÿò»zsmgb\XSNIGD!Dÿõôwng_YRMGD/Dúe\TLFDŸDçB@?=;:87543221100//.//0011DïA>:62.*'$!DóC?:50+'"*÷>82,& ©ê"$'),.13578:<>?ACDD ô#(-26:=AD%Dö"(.4:?D1Dû)18?D{D ÿè³·»ÀÄÇÊÌÏÒÔ×ÚÜÞßààáâãäåææùåääãâáÿÿò̹ÀÆÌÒØÞäêñ÷ûÿ&ÿõô¹ÂËÒÚâêòúÿ/ÿúÔßéóýÿ :ÿÿ©«®±´¶ºÀÅÊÐÕÜâõÿ-ÿ‡òˆŒ‘–›¡§®·ÁËÖâÿÿ‡õˆŽ–ž§²¼ÈÖñÿÿ)‡÷ˆš¥²¿Îáÿ ÿ2‡ùŽš¦´ÅÚÿÿ9‡ù›©¹Ìㇿ‡ôš˜—•”’‘Ž‹‰‡3‡ ÃïÀ¾»¹´±­ª¦¢Ÿœ˜“މ‡"‡ÃôÁ¼·±¬¦ š•‰‡‡&Ã÷¿¸²«¤–އ‡.Ã÷º²«¢š’‰‡‡6Ãù¼³ª¡˜‡‡<ÃüÁ·¬Ã¿Ãé‡ˆŠ‹‘’”—™œŸ¢¥¨¬¯³¶º¾Ã(Çô‹•šž¤ª¯µºÀÃÃ!‡ö‰—ž¥¬³ºÁÃÃ*‡ø•¥­µ½Ã Ã1‡øŠ”¦¯¹ÂÃÃ7‡÷ˆ›¥¯¹ÂÇ<‡ýˆ“‡~‡ÿîÞßàáâãäåæèêìîñóõûÿ-ÿÓóÕ×ÙÛÝßâåéíñõÿÿ ÓöÖÙÜßãçëñúÿÿ*ÓøÖÚÞãèîõÿ ÿ2ÓùÖÚßäêòÿÿ9ÓùÕÚàæíõÓ¿ÓþÕÔÔ6Ó Ø×ÖÕÔ$ÓØ×ÖÕÔÓ&Ø×ÖÕÔÓ/Øù×ÖÖÕÕÔÓÓ6Øù×ÖÖÕÔÔÓÓ<Ø×þÖØ¿ØÓÔÕÖ×)ØÓÔÕÖר"ÓÔÕÖþרØ+ÓùÔÕÕÖ×ר Ø2ÓúÔÕÕÖרØ8ÓøÔÕÕÖרØÓ=ÓþÔÓ~ÓÿîZ[]_aceginqvz~‚‡Ìÿ-ÿDóHKOSW[agov~‡ÿÿ DöIOU\ckt~»ÿÿ)D÷EKRZcmx†ÿ ÿ2DùIR[eqÿÿ9DùIR]iw‡D¿Dô35679:;=>@BD3D ï"%(,/25:>BD"Dô$).38=BDD&÷$*16>DD.÷%,3:BDD6ù%-5=DD<ü#¿éDCB@>=;;8641/,*'# (Dô@<83/+% !DöB<60*#*Dø?81)" 1DøA91( 7D÷C<3*!Dÿ÷þõëàÖÌÁµÿ?ÿù÷ëàÔǺÿ?ÿùøêÝÐôÿ ÿ€ÿù‰–§ºÏõÿ8ÿ‡úŒ›­ÃÝÿ3ÿ ‡ú‰—©ÀÜÿ.ÿ‡ú‰™­Åâÿ)ÿ‡û‹ž¶Óÿ%ÿ‡ûˆ—®Éÿ!ÿ‡ü•­Ëÿÿ!‡ü–®Ëÿÿ$‡ûˆ˜³Õÿÿ(‡û‹¡¾ãÿÿ,‡ü’®Òÿÿ/‡ü‹¢Âÿ ÿ2‡ûˆš¹àÿÿü¢˜Ž‡2‡ü’¯ÔÿÿÃùÀµªž’ˆ‡/‡ü©ÏÿÿÃù¸¬ ”ˆ‡-‡üŒ¦Ëà Ãú·ª‡,‡ÃúÀ³¥—Ї'‡Ãú·©›‡#‡Ãû»«œ‡‡Ãûº«›‹‡‡"Ãû¶¦•ˆ‡‡%ÃûÀ°ŸŽ‡‡)Ãû¸§•ˆ‡‡,Ãû¿®‹‡ ‡0Ãüµ¢‡ ‡3Ãüº¨”‡‡6Ãü¼©•‡‡9Ãù½ª–ˆ‡‡Ã;Ãü¾ª•Ã?Ãûžª¶ÁÃ:Çúœ©¶ÂÃ5Çúˆ“ ­ºÃ1ÀÿùÔÙßæîûÿ8ÿÓúÕÚáêóÿ3ÿ ÓúÔÙàèóÿ.ÿÓúÔÚáêõÿ)ÿÓûÕÜåðÿ%ÿÓüÙâìÿ!ÿÓüØáíÿÿ!ÓüÙâíÿÿ%ÓüÙäñÿÿ(ÓûÔÝèõÿÿ,Óü×âïÿÿ/ÓüÔÝéÿ ÿ3ÓüÚæõÿÿüÕÔÔÓ2Óü×âðÿÿØ×üÖÕÔÓ0ÓüÕàîÿÿØû×ÖÕÔÓ.ÓüÕßíØ Øû×ÖÕÔÓ,ÓØû×ÖÕÔÓ(ÓØü×ÖÕÓ$ÓØü×ÖÕÓ ÓØü×ÖÕÓÓ"Øü×ÕÔÓÓ%Øû×ÖÕÔÓÓ)Øü×ÕÔÓÓ,Øü×ÖÕÓÓ0Øü×ÕÔÓ Ó3Øü×ÖÔÓÓ6Øü×ÖÔÓÓ9Øü×ÖÔÓÓ<Øü×ÖÔØ?ØüÕÖר;ØÓûÔÕÖר6ØÓûÔÕÖר1Ø€ÿùFO[iyÌÿ8ÿDúGR`p„ÿ3ÿ DúEP]nƒÿ.ÿDúFQ`r‡ÿ)ÿDûGUg|ÿ%ÿDûEPauÿ!ÿDüN`vÿÿ!DüOavÿÿ%DüQe~ÿÿ(DûGWl‡ÿÿ,DüLa{ÿÿ/DüGXpÿ ÿ3DüRh†ÿÿü,5>D2DüLa|ÿÿù%0:CD/DüH]yÿÿù#.9CD-DüG[v ú%1D#Dû$1?DDû$2ADD"û)8CDD%û.>DD)û(8CDD,û!1@D D0ü,ÿúúêÙȸÿ>ÿúýîÝ˸ÿ>ÿúýìÚǵÿ>ÿûúçÒ¾ÿ>ÿûþíÙÄÿ?ÿüðÙÃÿ?ÿüïÙÃÿ>ÿûþíÕ¼ÿ>ÿûûäÍ´ÿ>ÿüóÙ¿ÿ>ÿüûãÉÿ>ÿûþëжÿ>ÿüóؽÿ>ÿüøÝÁÿ>ÿüúàÃÿÿ€ÿüФËÿ;ÿ‡üŒ©Òÿ8ÿ‡üŽ®Úÿ5ÿ‡ü“¸õÿ2ÿ ‡üˆÅÿ0ÿ ‡ü‹©Ùÿ-ÿ‡ý•¼ÿ+ÿ‡ü‰¤Òÿ(ÿ‡ý‘¸ÿ&ÿ‡ü‰§Ùÿ#ÿ‡ý—Ãÿ!ÿ‡üŒ°ñÿÿ‡üˆ¤Øÿÿ!‡ý™Èÿÿü¼§’‡‡ý‘¾ÿÿÃü¹¤Ž‡‡ýµÿÿÃü´Š‡‡üŠ­íÿÿÃüÁ­—‡‡üˆ¦àÿÿ Ãü»£‡‡ý£Ýÿÿ Ãû±™ˆ‡‡ý Ùÿ ÿÃü½¦Ž‡‡ýžÕÿ ÿÃý±˜‡‡ýØÿ ÿÃü»¢‹‡‡ýŸÜÿÿÃüÁ«‘‡‡ý¢ßÿÿÃý³˜‡‡ý§ñÿÿÃüº ‰‡‡ý‰¯ÿÿÃü¿¦Œ‡‡û‹¶ÿÿÃÃüÁ«‡‡ýŽ¿Ã!Ãý¯”‡‡$Ãý´—‡‡&Ãý¶™‡‡(Ãý¸š‡‡*Ãý¹›‡‡,Ãý¸™‡‡€ÿüÔÞíÿ;ÿÓüÕàïÿ8ÿÓüÖâòÿ5ÿÓüØåûÿ2ÿ ÓýÛêÿ0ÿ ÓüÔàòÿ-ÿÓýØçÿ+ÿÓüÔÞïÿ(ÿÓý×åÿ&ÿÓüÔßòÿ#ÿÓýÙêÿ!ÿÓüÕãúÿÿÓýÞòÿÿ!ÓýÚìÿÿü×ÕÔÓÓý×èÿÿØü×ÕÔÓÓýÕäÿÿØý×ÕÓÓüÔáùÿÿØýÖÔÓÓýßõÿÿ Øý×ÕÓÓýÝóÿÿ ØýÖÔÓÓýÝòÿ ÿØü×ÕÔÓÓýÜñÿ ÿØýÖÔÓÓýÛòÿ ÿØý×ÕÓÓýÜóÿÿØýÖÔÓÓýÝôÿÿØýÖÔÓÓýßúÿÿØý×ÕÓÓýÔâÿÿØý×ÕÓÓûÔåÿÿØØýÖÔÓÓýÖèØ!ØýÖÔÓÓ$Øý×ÔÓÓ&Øý×ÔÓÓ(Øý×ÕÓÓ*Øý×ÕÓÓ,Øý×ÔÓÓ€ÿüFYvÿ;ÿDüG]{ÿ8ÿDüIaÿ5ÿDüMhÌÿ2ÿ DýTrÿ0ÿ DüG]ÿ-ÿDýNkÿ+ÿDüEY{ÿ(ÿDýKhÿ&ÿDüF[ÿ#ÿDýPpÿ!ÿDüHb»ÿÿDüEY€ÿÿ!DýQtÿÿü(:DDýKlÿÿü*>DDýHfÿÿü0ADDüF`©ÿÿü"6DDüE[†ÿÿ ü+?DDýXƒÿÿ û4CDDýWÿ ÿü(>DDýU~ÿ ÿý5DDýT€ÿ ÿü,ADDýV‚ÿÿü$;DDýX„ÿÿý5DDý[»ÿÿü.BDDýEaÿÿü(?DDûGgÿÿü$ÿüúÞ¾ÿ>ÿü÷Ùºÿ>ÿüòÑÕÿ=ÿüþèÇÿ>ÿüûݺÿ>ÿýðÎÿ>ÿüýá¿ÿ>ÿýôÑÿ>ÿüýߺÿ>ÿýíÈÿ>ÿüù×Ëÿ=ÿüþá»ÿ>ÿýìÅÿ>ÿýôÍÿ>ÿýøÓÿ>ÿüüÚÁÿ=ÿüþà¶ÿ>ÿýã¸ÿ>ÿýåºÿ>ÿýç¼ÿ>ÿýè»ÿ>ÿýæ¹ÿ>ÿýã·ÿ>ÿýßÌÿ=ÿýýØÿ>ÿýûÒÿ>ÿý÷Ìÿÿ€ÿý”Ïÿ<ÿ‡ýÞÿ:ÿ‡üˆ©úÿ8ÿ‡ý‹·ÿ7ÿ‡ý‘Ëÿ5ÿ‡ýžâÿ3ÿ€ÿýØîÿ<ÿÓýÛôÿ:ÿÓýàýÿ8ÿÓýÔåÿ7ÿÓý×íÿ5ÿÓýÜõÿ3ÿ€ÿýMyÿ<ÿDýT„ÿ:ÿDý]èÿ8ÿDýGgÿ7ÿDýLvÿ5ÿDýU‡ÿ3ÿ€ÿýñÁÿ>ÿýè·ÿ=ÿüþÝêÿ=ÿýûÒÿ>ÿýôÃÿ>ÿýçµÿ3ÿ ?ÿþ†ÿ;ÿüãZ2ÿ:ÿû¸?22ÿ9ÿý‚3228ÿýàX227ÿý³>226ÿý3224ÿýáU223ÿýÊB222ÿý®92 21ÿý42 20ÿþq2 2.ÿýøZ2 2-ÿýÖI22,ÿý¼=22+ÿýž622 ?ÿþ—ÿ;ÿüèpLÿ:ÿûÂXLLÿ9ÿý“MLL8ÿýæmLL7ÿý¾WLL6ÿýMLL4ÿýçkLL3ÿýÓZLL2ÿýºRL L1ÿýžML L0ÿþ„L L.ÿýúpL L-ÿýÝ`LL,ÿýÇULL+ÿý¬OLL ?ÿþ¸ÿ;ÿü ÃÍÿ:ÿû«ÊÍÍÿ9ÿþ¹ÍÍ8ÿý¡ÄÍÍ7ÿý¬ÊÍÍ6ÿþºÍÍ4ÿý¡ÄÍÍ3ÿý§ÉÍÍ2ÿý®ËÍ Í1ÿþ¶Í Í0ÿþ½Í Í.ÿýàÃÍ Í-ÿý¤ÇÍÍ,ÿýªÊÍÍ+ÿý²ÌÍÍ ?ÿþÑÿ;ÿý¯çÿ;ÿý½öÿ;ÿýÓþÿ:ÿý¯èÿ;ÿý¿÷ÿ;ÿýÕþÿ:ÿý¯êÿ;ÿý·õÿ;ÿýÁûÿ;ÿýÍþÿ;ÿþÛÿ;ÿýÞçÿ;ÿý³ñÿ;ÿý»øÿ;ÿýÇýÿÿÿÿþÐÿ;ÿüÎf3ÿ9ÿúÞj322ÿ8ÿý…8227ÿý£B225ÿýÃS223ÿüßk3222ÿý†82 20ÿý¥C2 2.ÿýÆU2 2,ÿüám322+ÿýˆ922)ÿý§D22'ÿýÈV22%ÿüão322$ÿý‹922"ÿý¹G22!ÿýq322ÿý±B22ÿýñk22ÿý©?22ÿýäe2!2ÿý¢=2"2ÿýß`2$2ÿýš:2%2ÿýÚZ2'2ÿý“82(2ÿýÓV2*2ÿýŒ72+2ÿýÍQ2-2 ÿý…62.2 ÿýÊM202 ÿý“6212ÿýøc232ÿýÃD242ÿý5252ÿýñ`272ÿý¿C282ÿý‹4282û8ÿè]282ú3là»A282úTÅÿÿ4272ýC¥ÿÿ72ý8‡ÿÿ52ü3màÿÿ42ýQÅÿÿ22ý7ÿ ÿ12ýVÕÿ ÿ/2ý9”ÿ ÿ.2ýZÚÿ ÿ,2ý:šÿÿ+2ý_Þÿÿ)2ý=¡ÿÿ(2ýdãÿÿ&2ý?§ÿÿ%2ýiíÿÿ#2ýA®ÿÿ"2ýoýÿÿÿÿþØÿ;ÿüÖ{Mÿ9ÿúå~MLLÿ8ÿý•QLL7ÿý°ZLL5ÿýÍiLL3ÿýæLL2ÿý—RL L0ÿý²[L L.ÿýÏkL L,ÿüçMLL+ÿý™RLL)ÿý´\LL'ÿýÑlLL%ÿüè‚MLL$ÿý›SLL"ÿýÃ_LL!ÿþ„LLÿý½ZLLÿýôLLÿýµXLLÿýéyL!Lÿý¯UL"LÿýæuL$Lÿý¨TL%LÿýápL'Lÿý¢RL(LÿýÛlL*LÿýœPL+LÿýÖgL-L ÿý–OL.L ÿýÓdL0L ÿý¢OL1LÿýúxL3LÿýÍ\L4LÿýžOL5LÿýôuL7LÿýÉ[L8Lÿý›NL8LûRÿìrL8LúMæÆYL8LúkÎÿÿML7Lý[²ÿÿ7LýR—ÿÿ5LüM€æÿÿ4LýhÎÿÿ2LýQÿ ÿ1LýlÜÿ ÿ/LýR£ÿ ÿ.Lýpáÿ ÿ,LýT¨ÿÿ+Lýtåÿÿ)LýU®ÿÿ(Lýxèÿÿ&LýW´ÿÿ%Lý}ñÿÿ#LýYºÿÿ"Lý‚ýÿÿÿÿþ¥ÿ;ÿü¦ÀÍÿ9ÿý¢¿ÍÍ9ÿý¸ÌÍÍ7ÿý±ÉÍÍ5ÿý¨ÅÍÍ3ÿý¡¿ÍÍ2ÿý¸ËÍ Í0ÿý°ÉÍ Í.ÿý¨ÄÍ Í,ÿý¡¾ÍÍ+ÿý·ËÍÍ)ÿý¯ÈÍÍ'ÿý§ÄÍÍ%ÿý ¾ÍÍ$ÿý·ËÍÍ"ÿý«ÈÍÍ!ÿþ½ÍÍÿý­ÉÍÍÿýÇ¿ÍÍÿý¯ÊÍÍÿý ÀÍ!Íÿý±ÊÍ"Íÿý¡ÁÍ$Íÿý³ËÍ%Íÿý£ÃÍ'ÍÿýµËÍ(Íÿý¤ÄÍ*Íÿý¶ÌÍ+Íÿý¦ÅÍ-Í ÿý¸ÌÍ.Í ÿý§ÆÍ0Í ÿýµÌÍ1ÍÿýàÁÍ3Íÿý¨ÈÍ4Íÿý¶ÌÍ5ÍÿýÇÁÍ7Íÿý©ÉÍ8Íÿý·ÌÍ8ÍûËÿ©ÂÍ9Íû¾¡ªÉÍ8ÍûĨÿÿÍ8Íýɰÿÿ7Íý˸ÿÿ6Íý¾¡ÿÿ4ÍýŨÿÿ2Íý̶ÿ ÿ1ÍýĤÿ ÿ/ÍýË´ÿ ÿ.Íýãÿ ÿ,Íý˳ÿÿ+Íý¢ÿÿ)Íýʱÿÿ(ÍýÀ ÿÿ&Íýʯÿÿ%Íý¿¸ÿÿ#ÍýÉ®ÿÿ"Íý¾õÿÿÿÿþ´ÿ;ÿüµàþÿ9ÿü°ßþÿ:ÿýÒûÿ:ÿýÅõÿ:ÿý¹ëÿ:ÿý°Þÿ;ÿýÑûÿ:ÿýÄôÿ:ÿý¸êÿ:ÿü¯Ýþÿ:ÿýÐûÿ:ÿýÃóÿ:ÿý·éÿ:ÿü¯Üþÿ:ÿýÏúÿ:ÿý½òÿ;ÿþÛÿ;ÿýÀõÿ:ÿýÈÞÿ;ÿýÃöÿ:ÿý®áÿ;ÿýÅøÿ:ÿý°äÿ;ÿýÈùÿ:ÿý±çÿ;ÿýÌûÿ:ÿý³éÿ;ÿýÎüÿ:ÿýµìÿ;ÿýÑýÿ:ÿý·îÿ;ÿýÌýÿ:ÿýÞâÿ;ÿý¹óÿ;ÿýÍýÿ:ÿýÈäÿ;ÿýºôÿ;ÿýÏþÿ8ÿûûÿ³åÿ8ÿúþÞ¯¼õÿ8ÿúê¸ÿÿþÿ7ÿýôÄÿ:ÿýûÑÿ:ÿüþݯÿ:ÿýì¸ÿ:ÿýüÎÿ;ÿýé³ÿ:ÿýûËÿ;ÿýç±ÿ:ÿýùÈÿ;ÿýä°ÿ:ÿýøÆÿ;ÿýâ¯ÿ:ÿý÷Ãÿ;ÿýß½ÿ:ÿýõÁÿ;ÿýÜôÿÿ ÿüßv72.2 ÿüÝu6202ÿüÜs6222ÿüÙq5242ÿü×o5262ÿüÕm4282ûÿÒk42:2ýi42;2ýD~292ú6k¿ÿÿ272üCˆåÿÿ52ü3Yªÿÿ32ü9tÐÿÿ12ýJ”ÿ ÿ.2ü4c·ÿ ÿ,2ü>Üÿÿ*2ýQŸÿÿ'2ü6lÄÿÿ%2üC‰èÿÿ#2ýY¬ÿÿ!2ý]Áÿÿ2ý_Ãÿÿ2ü3aÆÿÿ2ü3cÉÿ ÿ2ü3eÌÿ"ÿ2ü3gÎÿ$ÿ2ü4iÑÿ&ÿ2ü4kÓÿ(ÿ2ü5mÖÿ*ÿ2ü5oÙÿ,ÿ 2ü6qÛÿ.ÿ 2ü3lÝÿ0ÿ 2ýTÄÿ2ÿ2ýC¥ÿ4ÿ2ý8†ÿ6ÿ2ü3làÿ7ÿ2ýTÅÿ9ÿü2C¥ÿ;ÿþ‡ÿ¾ÿ ÿüæ‰PL.L ÿüä‡PL0Lÿüã†OL2Lÿüà„OL4LÿüÞ‚NL6LÿüÜ€NL8LûÿÚ~NL:Lý|ML;Lý\L9LúP~ÉÿÿL7Lü[™êÿÿ6Lýo¶ÿÿ3LüS‡Øÿÿ1Lýa£ÿ ÿ.LüMwÂÿ ÿ,LüVãÿÿ*Lýh­ÿÿ'LüPÎÿÿ%Lü[™ìÿÿ#Lýn¸ÿÿ!LýrËÿÿLýtÍÿÿLývÏÿÿLýxÒÿ ÿLüMyÕÿ"ÿLüM{Öÿ$ÿLüM}Ùÿ&ÿLüNÛÿ(ÿLüNÝÿ*ÿLüO‚àÿ,ÿ LüO„âÿ.ÿ Lýäÿ0ÿ LýkÎÿ2ÿLý[²ÿ4ÿLýR—ÿ6ÿLüMæÿ7ÿLýkÎÿ9ÿüL[²ÿ;ÿþ—ÿ¾ÿ ÿü¡¼ÌÍ.Í ÿü¢¼ÌÍ0Íÿü¢½ÌÍ2Íÿü£½ÌÍ4Íÿü£¾ÌÍ6Íÿü¤¾ÌÍ8Íûÿ¤¿ÌÍ:Íþ¿Í<ÍýȺÍ9ÍúÌ¿©ÿÿÍ7ÍüÉ· ÿÿ6Íýïÿÿ3Íü˼¥ÿÿ1ÍýÇ´ÿ ÿ/ÍýÁ«ÿ ÿ,Íüʺ¢ÿÿ*Íýűÿÿ'Íü̾¨ÿÿ%ÍüÉ·©ÿÿ#Íýîÿÿ!Íý©ÿÿÍý¨ÿÿÍýÁ¨ÿÿÍýÁ§ÿ ÿÍýÀ¦ÿ"ÿÍýÀ¦ÿ$ÿÍý¿¥ÿ&ÿÍüÌ¿¤ÿ(ÿÍü̾¤ÿ*ÿÍü̾£ÿ,ÿ Íü̽¢ÿ.ÿ Íý¾¢ÿ0ÿ ÍýĨÿ2ÿÍýɰÿ4ÿÍý˸ÿ6ÿÍý¾¡ÿ7ÿÍýĨÿ9ÿüÍɰÿ;ÿþ¸ÿ¾ÿ ÿü°Øüÿ9ÿü°Ùüÿ9ÿü±Úýÿ9ÿü²Ûýÿ9ÿü²Üýÿ9ÿü³Ýþÿ9ÿü´Þþÿ:ÿýßþÿ;ÿýôÕÿ9ÿüüÞºÿ9ÿüôЮÿ9ÿýçÂÿ9ÿüúÙ´ÿ9ÿýðËÿ9ÿüþâ½ÿ9ÿü÷Õ±ÿ9ÿýìÆÿ9ÿüüÞ¹ÿ9ÿüôгÿ9ÿýèÂÿ:ÿýåºÿ:ÿýä¹ÿ:ÿýã¸ÿ:ÿýâ·ÿ9ÿüþá¶ÿ9ÿüþàµÿ9ÿüþß´ÿ9ÿüþÞ³ÿ9ÿüýݳÿ9ÿüýܲÿ9ÿüýÛ±ÿ:ÿýÞ°ÿ:ÿýê¹ÿ:ÿýôÄÿ:ÿýûÑÿ:ÿüþÞ¯ÿ:ÿýê¸ÿ:ÿýôÄÿ;ÿþÑÿ¾ÿ,2û=h”Èÿ ÿ(2û3QƒÂÿÿ%2û>i¡èÿÿ!2û3R„Ãÿÿ2û>i¡íÿÿ2û4R„Ãÿÿ2û>j¢íÿ"ÿ2üM…Äÿ&ÿ2üF€Ïÿ)ÿ2ü?vÂÿ,ÿ 2ü:mµÿ/ÿ2ü7d©ÿ2ÿ2ü4[žÿ5ÿ2û3S“äÿ7ÿû2KˆÙÿ:ÿþÌÿzÿûÛŸpIÿ6ÿûјjC223ÿûÜ•d>220ÿüÉ„N2 2-ÿü¸vD2 2*ÿü¦i<22&ÿûà—]622#ÿûΈQ322 ÿü¼zG22ÿü­m>22ÿüÉv=2 2ÿüí‘N2#2ÿü¯d52%2ÿüÐ|@2(2ÿüý˜S2+2 ÿü·i72-2,LûV|£Ñÿ ÿ(LûMh”Ìÿÿ%LûV}®ìÿÿ!LûMh•ÍÿÿLûV}®ñÿÿLûMh•ÍÿÿLûW~¯ñÿ"ÿLüd•Îÿ&ÿLü]‘×ÿ)ÿLüX‰Ìÿ,ÿ LüTÀÿ/ÿLüPxµÿ2ÿLüNq«ÿ5ÿLüi¢éÿ7ÿûLc˜àÿ:ÿþÕÿzÿûâ­ƒ`ÿ6ÿûÙ¦~[LL3ÿûã¤xWLL0ÿüÒ•eL L-ÿü‰\L L*ÿü³}TLL&ÿûæ¥rPLL#ÿüÖ˜hLL ÿüÇŒ^LLÿü¹€VLLÿüÒ‰UL Lÿüñ eL#Lÿü»xOL%LÿüØŽXL(Lÿüý¦iL+L ÿüÂ}QL-L,ÍûÊ¿´§ÿ ÿ)ÍüŹ©ÿÿ%ÍûÊ¿±©ÿÿ"ÍüŸ¨ÿÿÍûÊ¿±¸ÿÿÍüŸ¨ÿÿÍûÊ¿±¸ÿ"ÿÍüƸ¨ÿ&ÿÍüȹ¥ÿ)ÿÍüʼ©ÿ,ÿ Íü˾¬ÿ/ÿÍüÌÀ¯ÿ2ÿÍüÌòÿ5ÿÍüŵ ÿ7ÿûÍÇ·£ÿ:ÿþ¦ÿzÿû¢±½Çÿ6ÿû¥³¿ÉÍÍ3ÿû¢´ÀÊÍÍ0ÿü§¸ÆÍ Í-ÿü«¼ÈÍ Í*ÿü°¿ËÍÍ&ÿû¡´ÂÌÍÍ#ÿü¦·ÅÍÍ ÿüª»ÈÍÍÿü®¾ÊÍÍÿü§¼ÊÍ Íÿü¸µÆÍ#Íÿü­ÀÌÍ%Íÿü¥ºÉÍ(Íÿüõ³ÅÍ+Í ÿü«¿ÌÍ-Í,ÿûøàË·ÿ6ÿûþìÒ¹ÿ7ÿû÷߯³ÿ6ÿûþëÒ¹ÿ7ÿû÷߯½ÿ6ÿûþëÒ¹ÿ7ÿû÷ߎÿ7ÿüîÒ¹ÿ8ÿüóÔµÿ8ÿüöعÿ8ÿüùݾÿ8ÿüüâÃÿ8ÿüþæÇÿ9ÿüëÌ®ÿ8ÿüïвÿ:ÿþ¶ÿzÿû±ÆÛñÿ6ÿû´Êßôÿ6ÿû±Ëâ÷ÿ7ÿü·Òíÿ8ÿü½Øôÿ8ÿüÄßùÿ7ÿû¯Êåüÿ7ÿüµÐìÿ8ÿü»×òÿ8ÿüÁÝ÷ÿ8ÿü·Øøÿ8ÿü½Ìîÿ9ÿüÀâýÿ8ÿü´Ööÿ8ÿüôÊëÿ9ÿü½ßüÿ-ÿ ÿþÞÿ3ÿôÞÁ§{gUD622ÿ*ÿöØ»¢‹vcQA42 2#ÿ÷Ç¡†q_N>322ÿùѦ‚cH422ÿùÛ¯ŠjM62 2ÿùè¹’pS:2&2 ÿúÆ™wY?2,2ÿû¹„Y8212ÿúý°}S5252úä¨vN42:2 ÿþåÿ3ÿôåË´Ÿ{k\PLLÿ*ÿö߯¯›‰xhYML L#ÿøÐ®—„teVLLÿùÙ³“x_MLLÿù⻚~dPL LÿùìáƒiSL&L ÿúϨ‰oWL,LÿûÕnQL1Lÿúý¼iOL5Lú鵉eML:L ÿþ¢ÿ3ÿô¢©¯µ»ÀÄÈÌÍÍÿ*ÿ÷£ª±·¼ÁÅÉÍ Í#ÿø§±¸½ÂÆÊÍÍÿú¥°¹ÁÇÍÍÿù¢­·¿ÆÌÍ Íÿù©«µ½ÅËÍ&Í ÿú¨³¼ÃÊÍ,Íÿû«¸ÃÌÍ1Íÿúõ­ºÅÌÍ5Íû ¯¼ÆÍ;Í ÿþ°ÿ3ÿö°ºÃÍÖàêóüÿ,ÿö²¼ÅÏØâìõþÿ-ÿø¸ÆÑÛäî÷ÿ1ÿù´ÄÓâñþÿ2ÿù±ÀÏßîüÿ2ÿù³½ÌÛëúÿ3ÿú¸ÉØç÷ÿ5ÿû½Òèûÿ5ÿúôÀÕëýÿ5ÿú®ÃØîþÿ:ÿ ÿýøýÿ&ÿêÒȽ³©Ÿ–…}umf_XQJD>8322å47:>ADHKOSV[_cfkosw|‰™­ÃÛÿ ÿ42ô;HVeu‡™­ÄÜÿ2?2 ÿýúýÿ&ÿêÚÑǾµ­¥•‡ztmgb\WRMLLåMQTVY\_cfilptw{~‚†‰’™§¹Íâÿ ÿ4LôT_ly‡—¨¹ÎãÿL?L ÿýàõÿ&ÿ뤧ª¬¯±´¶¸º¼¾ÀÂÄÅÇÈÊËÍÍæÌËÊÉÈÇÇÆÅÄÃÂÁÀ¿¾½¼º¹·³®¨¢ÿ ÿ4ÍôËÇÄÀ¼¸³®¨¢ÿÍ?Í ÿýÞôÿ&ÿê´·»¿ÃÆÊÎÒÕÙÝáäèìðô÷ûþÿÿåþüù÷õóñïíëéæäâàÞÜÚØÖÔÐÉÁ¹±ÿ?ÿõùñéáÙÑÉÁ¹±ÿ@ÿ;ÿû¼€P3ÿ=ÿþèÿ ?ÿöÿùýñãÕÆ¸ÿ?ÿùôæØÊ¼³ÿ>ÿùøêÛÍ¿±ÿ>ÿùûíßѰÿ>ÿûõáͺÿ>ÿúüê×ïÿ>ÿûôà̹ÿ>ÿûüéÖÁÿ>ÿûýêѹÿ>ÿûøàǯÿ>ÿüîÖ½ÿ>ÿýûåÿÿÿ?2ü¢k@2;2ÿûÊ‹Y6272ÿü¯vH242 ÿûÚ—c9202 ÿüªh92-2ÿü«i92*2ÿü¬i:2'2ÿü­j:2$2ÿü­j:2!2ÿü­k:22ÿü¤Y322!ÿüÙB22$ÿü±c522&ÿüåJ22)ÿü¿n822,ÿý™S22.ÿüÎy=2 21ÿý N2 23ÿü¹_3225ÿüÒq7227ÿüí†?22:ÿýœL22<ÿüµ]3ÿ=ÿþÎÿÿý’Óÿ<ÿ2üDq³ÿ9ÿ2üÿû·Ïèýÿ>ÿüÀÙñÿ>ÿû±Êâûÿ>ÿüÂàúÿ>ÿüÂßúÿ>ÿüÂßúÿ>ÿüÁßúÿ>ÿüÁßùÿ>ÿüÁÞùÿ>ÿüÅçþÿ=ÿü²Ôõÿ>ÿüÀâýÿ=ÿü®Îðÿ>ÿüºÜûÿ>ÿýÉëÿ>ÿüµ×øÿ>ÿýÆîÿ>ÿý½äÿ>ÿü´Ûüÿ=ÿü½Ñöÿ>ÿýÈïÿ>ÿý¾åÿ>ÿþµÿÿý̳ÿ>ÿüóÛ¿ÿ>ÿüøÝÀÿ>ÿüùÞÀÿ>ÿüùÞÁÿ>ÿüúßÂÿ>ÿüúàÂÿ>ÿüùÚ¸ÿ>ÿüîÌÓÿ=ÿüüà¾ÿ>ÿüôÒ±ÿ=ÿüþæÄÿ>ÿüøØ¶ÿÿ2ýP¯ÿ"ÿ2ýQ°ÿ ÿ2ýQ²ÿÿ2ýR³ÿÿ!2ýS´ÿÿ#2ýXÈÿÿ$2ü3màÿÿ&2ý8†ÿÿ(2ýB¡ÿÿ*2ýQ¾ÿÿ,2ýfÙÿÿ-2ý6}ÿÿ/2ý>—ÿ ÿ12ýKµÿ ÿ32ý^Ðÿÿ42ý4vÿÿ62ýAªÿÿ82ýaÝÿÿ92ý9‘ÿÿ;2ûQÉÿÿ2;2ü4|ÿ2=2þD2~2ýo62<2ûÿäƒ>2:2ÿý‘@282ÿý?262ÿý?242 ÿýŽ?222 ÿýŒ>202 ÿýŒ>2.2ÿýŠ=2,2ÿý‰=2*2ÿýˆ:2(2ÿüäq42&2ÿýËZ2%2ÿý­H2#2ÿý<2!2ÿüñv522ÿýÑ_22ÿý´K22!ÿý–>22"ÿüý{622$ÿý×\22&ÿý£>22'ÿüõo322)ÿýºI22+ÿýƒ622,ÿýÐV22.ÿý™;2 2/ÿýãf2 21ÿý°D2 23ÿýz4224ÿýÄJ226ÿýw3227ÿý¶A228ÿýõf22:ÿý¡:22;ÿûÛX22ÿ<ÿýŒ6ÿ=ÿþËÿ~ÿLýg»ÿ"ÿLýg¼ÿ ÿLýh½ÿÿLýh¾ÿÿ!Lýi¿ÿÿ#LýnÑÿÿ$LüMæÿÿ&LýR—ÿÿ(LýZ®ÿÿ*LýhÈÿÿ,Lýzàÿÿ-LýPÿÿ/LýW¥ÿ ÿ1LýcÀÿ ÿ3LýsØÿÿ4LýN‰ÿÿ6LýY¶ÿÿ8Lýväÿÿ9LýR ÿÿ;LûgÒÿÿL;LüNÿL=Lþ\L~Lý‚PLÿýìÀÿ>ÿýì¿ÿ>ÿýë¿ÿ>ÿýë¾ÿ>ÿýè·ÿ=ÿüþݯÿ=ÿýûÑÿ>ÿýõÆÿ>ÿýì»ÿ>ÿýá²ÿ=ÿýüÕÿ>ÿý÷Êÿ>ÿýï¾ÿ>ÿýå´ÿ=ÿýþØÿ>ÿýõÂÿ>ÿýã°ÿ=ÿýûÌÿ>ÿýì·ÿ=ÿýþÖÿ>ÿþóÿ~ÿýÜüÿ=ÿü®Ò÷ÿ>ÿýÌöÿ>ÿýÍöÿ>ÿýÍ÷ÿ>ÿýÎ÷ÿ>ÿýÎ÷ÿ>ÿýÏ÷ÿ>ÿýÏøÿ>ÿýÐøÿ>ÿýÐúÿ=ÿü®Ûþÿ=ÿý¶çÿ>ÿýÁñÿ>ÿýÍùÿ=ÿüÈÙýÿ=ÿý´äÿ>ÿý¾ïÿ>ÿýÊ÷ÿ=ÿüôÖýÿ=ÿý²æÿ>ÿýÅ÷ÿ=ÿýÓÜÿ>ÿý¼ñÿ>ÿýÒýÿ=ÿý´éÿ>ÿýÉùÿ=ÿý¯àÿ>ÿýÀôÿ>ÿý×þÿ=ÿý¹ðÿ>ÿþØÿ>ÿý¾õÿ=ÿýÓàÿ>ÿýÆùÿ=ÿý±èÿ>ÿýÎýÿ=ÿþ¶ÿ~ÿ@ÿþ²ÿ=ÿü2häÿ;ÿ2ý<™ÿ:ÿ2ýVÐÿ8ÿ2ý6ƒÿ7ÿ2ýIÀÿ5ÿ2ý4€ÿ4ÿ 2ýPÐÿ2ÿ 2ý7“ÿ1ÿ 2ý\àÿ/ÿ 2ý<§ÿ.ÿ2þkÿ-ÿ2ýCºÿ+ÿ2ý3|ÿ*ÿ2ýMÌÿ(ÿ2ý6Žÿ'ÿ2ýXÜÿ%ÿ2ý;©ÿ$ÿ2þzÿ#ÿ2ýUàÿ!ÿ2ý?ºÿ ÿ2ý4Šÿÿ2ýaøÿÿ2ýFÉÿÿ 2ý7›ÿÿ"2þoÿÿ#2ýN×ÿÿ$2ý;­ÿÿ%2ý3~ÿÿ'2ýXãÿÿ(2ýAÆÿÿ)2ý8ªÿÿ*2ý3Œÿÿ,2þoÿÿ-2ýXõÿÿ.2ýHÕÿ ÿ/2ý=»ÿ ÿ02ý5žÿ ÿ22þÿ ÿ32þdÿ ÿþL222ýQáÿÿýz3212ýBÊÿÿý¹C212ý9¯ÿÿ@ÿþ½ÿ=ÿüL|éÿ;ÿLýT¨ÿ:ÿLýlØÿ8ÿLýO”ÿ7ÿLý`Êÿ5ÿLýM‘ÿ4ÿ LýfØÿ2ÿ LýQ¢ÿ1ÿ Lýqæÿ/ÿ LýU´ÿ.ÿLþÿ-ÿLý[Åÿ+ÿLýMÿ*ÿLýdÕÿ(ÿLýPžÿ'ÿLýnãÿ%ÿLýTµÿ$ÿLþŒÿ#ÿLýkæÿ!ÿLýWÄÿ ÿLýNšÿÿLýuúÿÿLý]Òÿÿ LýP©ÿÿ"Lþ‚ÿÿ#LýeÞÿÿ$LýT¹ÿÿ&Lþÿÿ'Lýmèÿÿ(LýYÏÿÿ)LýQ¶ÿÿ*LýM›ÿÿ,Lþ‚ÿÿ-Lýn÷ÿÿ.Lý_Üÿ ÿ/LýUÆÿ ÿ0LýO«ÿ ÿ2Lþÿ ÿ3Lþyÿ ÿþcL2LýgçÿÿýŒML1LýZÓÿÿýÃ[L1LýR»ÿÿ@ÿþ­ÿ=ÿüÍ¿ ÿ;ÿÍý˳ÿ:ÿÍýÄ¥ÿ8ÿÍý̹ÿ7ÿÍýÇ©ÿ5ÿÍþ¹ÿ4ÿ ÍýÆ¥ÿ2ÿ Íý̵ÿ1ÿ Íý¡ÿ/ÿ Íýʯÿ.ÿÍþ¿ÿ-ÿÍýÉ«ÿ+ÿÍþºÿ*ÿÍýƦÿ(ÿÍý̶ÿ'ÿÍýâÿ%ÿÍý˯ÿ$ÿÍþ»ÿ#ÿÍýÄ¡ÿ!ÿÍýÊ«ÿ ÿÍýÌ·ÿÿÍýÁàÿÿÍýȧÿÿ Íý̲ÿÿ"Íþ¾ÿÿ#ÍýÆ£ÿÿ$ÍýË®ÿÿ&Íþºÿÿ'ÍýÄ ÿÿ(Íýɨÿÿ)Íý̯ÿÿ+Íþ¶ÿÿ,Íþ¾ÿÿ-ÍýÃÕÿÿ.ÍýǤÿ ÿ/Íýʪÿ ÿ0Íý̲ÿ ÿ2Íþ¹ÿ ÿ3ÍþÀÿ ÿþÆÍ2ÍýÅ¡ÿÿþ»Í2Íýɧÿÿý«ÉÍ1ÍýË­ÿÿ@ÿþ¿ÿ>ÿýà®ÿ=ÿýùÉÿ>ÿýé´ÿ=ÿýýÒÿ>ÿýñºÿ=ÿýþÔÿ>ÿýí´ÿ=ÿýüÌÿ>ÿýæ¯ÿ=ÿýøÃÿ>ÿþÞÿ>ÿýô¼ÿ=ÿýþÖÿ>ÿýî¶ÿ=ÿýüÎÿ>ÿýè±ÿ=ÿýùÃÿ>ÿþ×ÿ>ÿýê¯ÿ=ÿý÷¼ÿ=ÿýþÏÿ>ÿýãÞÿ=ÿýó·ÿ=ÿýüÈÿ>ÿþÜÿ>ÿýî²ÿ=ÿýùÁÿ>ÿþÕÿ>ÿýè¯ÿ=ÿýõ¸ÿ=ÿýûÂÿ=ÿýþÏÿ>ÿþÜÿ>ÿýèÓÿ=ÿýñ³ÿ=ÿýø¼ÿ=ÿýýÇÿ>ÿþÔÿ>ÿþáÿ ÿþïÿ2ÿýì¯ÿÿý×þÿ1ÿýõ·ÿÿý½ôÿ1ÿýûÀÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨ÃÃþ· ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØ-Øÿþ×Ó ÓþÖØØþ×Ô Ôÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'-ÿþLD Dþ'þ= =ÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿÀÃ?‡ÀØ?ÔÓÀ?=Dÿ5Ãþ ‡‡5Ãý½‰‡‡6Ãþ£‡‡þ³Ã"Ãý¿‹‡‡þ“Ã#Ãþ§‡‡þ¯Ã"ÃýÁ‡‡ýÂÃ"Ãþ«‡‡þ«Ã"Ãý‡‡ýÁÃ"Ãþ®‡‡þ¨Ã#Ãþ’‡‡ý‹ÀÃ"Ãþ²‡‡þ¤Ã#Ãþ•‡‡ýоÃ"Ãþµ‡‡þ¡Ã#Ãþ™‡‡ýˆ¼Ã"Ãþ¹‡‡þÃ#Ãþ‡‡þ¹Ã"Ãý¼ˆ‡‡þ™Ã#Ãþ ‡‡þ¶Ã"Ãþ¾‡‡þ–Ã#Çþ²Ã"Çþ’Ã"Çþ®Ã!ÇýÂà Çþ«Ã ÇýÁÃÇþ§ÃÇý‹ÀÃÇþ£ÃÇý‰½ÃÇþ ÃÇýˆ»Ãà ‡þœÃÃ!‡þ¸ÃÃ!‡þ˜ÃÃ"‡þµÃÃ"‡þ•ÃÃ#‡þ±ÃÃ#‡þ’ÃÃ$‡þ®ÃÃ$‡ýÂÃÃ%‡þªÃÃ%‡ýŒÁÃÃ&‡þ¦ÃÃ&‡ý‹¿ÃÃ'‡þ¢ÃÃ'‡ý‰½ÃÃ(‡þŸÃÃ(‡ýˆºÃÃ)‡þ›ÃÃ*‡þ·ÃÃ*‡þ˜ÃÃ+‡þ´ÃÃ+‡þ”ÃÃ,‡þ°ÃÃ,‡þ‘ÃÃ-‡þ­ÃÃ-‡ýŽÂÃÃ.‡þ©ÃÃ.‡ýŒÀà Ã/‡þ¥Ã Ã/‡ýŠ¿Ã Ã0‡þ¢Ã Ã0‡ý‰¼Ã Ã5ØþÕÓÓ5Øþ×ÓÓ6ØþÕÓÓÔþÖØ"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ#ØÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÖØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØÓþÖØ"ØÓþÔØ"ØÓþÖØ!ØÓþÔØ!ØÓþÖØ ØÓ!ØÓþÕØØÓþרØÓþÕØØÓþרØÓþÕØØ ÓþרØ ÓþÕØØ!ÓþרØ!ÓþÔØØ"ÓþרØ"ÓþÔØØ#ÓþÖØØ#ÓþÔØØ$ÓþÖØØ$ÓþÔØØ%ÓþÖØØ&ÓØ&ÓþÕØØ'ÓþרØ'ÓþÕØØ(ÓþרØ(ÓþÕØØ)ÓþרØ)ÓþÕØØ*ÓþרØ*ÓþÔØØ+ÓþרØ+ÓþÔØØ,ÓþÖØØ,ÓþÔØØ-ÓþÖØØ-ÓþÔØØ.ÓþÖØØ/Óþר Ø/ÓþÕØ Ø0Óþר Ø0ÓþÕØ Ø1Óþר Ø5þ.DD5ýBDD6þ+DD=þ"ýADDþ9#þ(DDþ "ý?DDý<"þ%DDþ$"ý=DDý>"þ!DDþ'#þ:DDý@"þDDþ*#þ7DDýB"þDDþ-#þ4DDýC"þDDþ1#þ1DDþ"ýCDDþ4#þ.DDþ"þDDþ7#Dþ"Dþ:"Dþ!!Dý< Dþ$ Dý?Dþ(Dý@Dþ+DýBDþ.DýC Dþ1!Dþ!Dþ5"Dþ"Dþ8#Dþ#Dþ;$Dþ"$Dý=%Dþ%%Dý?&Dþ(&DýA'Dþ,'DýB(Dþ/(DýC)Dþ2*Dþ*Dþ5+Dþ+Dþ8,Dþ,Dþ;-Dþ#-Dý>.Dþ&.Dý@ /Dþ) /DýA 0Dþ, 0DýC ÿ‡þµÿ8ÿ‡þ‹ÿ8ÿ‡þ¯ÿ7ÿ‡ý‰ñÿ6ÿ‡þ¨ÿ6ÿ‡ýˆáÿ5ÿ‡þ¢ÿ5ÿ‡þÙÿ4ÿ‡þœÿ4ÿ ‡þÒÿ3ÿ ‡þ—ÿ3ÿ ‡þÉÿ2ÿ ‡þ“ÿ2ÿ ‡þÂÿ1ÿ ‡þÿ1ÿ ‡þºÿ0ÿ ‡þÿ0ÿ ‡þ´ÿ/ÿþЇ ‡þŠÿ/ÿþ¤‡ ‡þ­ÿ.ÿýÀ‹‡ ‡ý‰èÿ-ÿýè‡ ‡þ§ÿ-ÿüÃÁ‡ ‡ýˆàÿ,ÿÃþ«‡ ‡þ¡ÿ,ÿÃý‡ ‡þØÿ+ÿÃþ¯‡ ‡þ›ÿ+ÿÃþ“‡ ‡þÐÿ*ÿÃþ³‡ ‡þ–ÿ*ÿÃþ–‡ ‡þÈÿ)ÿÃþ¶‡ ‡þ’ÿ)ÿÃþš‡ ‡þÀÿ(ÿÃþ¹‡ ‡þÿ(ÿÃþž‡ ‡þ¹ÿ'ÿÃý¼‰‡ ‡þŒÿ'ÿÃþ¡‡ ‡þ²ÿ&ÿÃý¾Š‡ ‡ýŠúÿ%ÿÃþ¥‡ ‡þ¬ÿ%ÿÃýÀŒ‡ ‡ý‰åÿ$ÿ Ãþ©‡ ‡þ¥ÿ$ÿ ÃýÂŽ‡ ‡þÞÿ#ÿ Ãþ¬‡ ‡þ ÿ#ÿ Ãþ‘‡ ‡þÖÿ"ÿ Ãþ°‡ ‡þšÿ"ÿ Ãþ”‡ ‡þÎÿ!ÿ Ãþ´‡ ‡þ•ÿ!ÿ Ãþ—‡ ‡þÆÿ ÿ Ãþ·‡ ‡þ‘ÿ ÿÃþ›‡ ‡þ¿ÿÿÃýºˆ‡ ‡þŽÿÿÃþž‡ ‡þ·ÿÿÃý½‰‡ ‡þŒÿÿÃþ¢‡ ‡þ±ÿÿÃý¿Š‡ ‡ýŠøÿÿÃþ¦‡ ‡þªÿÿÃýÁŒ‡ ‡ýˆãÿÿÃþª‡ ‡þ¤ÿÿÃý‡ ‡þÜÿÿÃþ­‡ ‡þŸÿÿÃþ‘‡ ‡þÔÿÿÃþ±‡ ‡þ™ÿÿÃþ”‡ ‡þÌÿÿÃþ´‡ ‡þ”ÿÿÃþ˜‡ ‡þÄÿÿÃþ¸‡ ‡þ‘ÿÿÓþäÿ8ÿÓþÔÿ8ÿÓþâÿ7ÿÓýÔúÿ6ÿÓþßÿ6ÿÓþõÿ5ÿÓþÝÿ5ÿÓþòÿ4ÿÓþÛÿ4ÿ Óþïÿ3ÿ ÓþÙÿ3ÿ Óþìÿ2ÿ ÓþØÿ2ÿ Óþéÿ1ÿ ÓþÖÿ1ÿ Óþæÿ0ÿ ÓþÕÿ0ÿ Óþäÿ/ÿ ÓþÔÿ/ÿþÕÓ Óþáÿ.ÿþ×Ó ÓýÔ÷ÿ-ÿýØÖÓ Óþßÿ-ÿØÓþôÿ,ÿØþÖÓ ÓþÝÿ,ÿØþÔÓ Óþñÿ+ÿØþÖÓ ÓþÛÿ+ÿØþÔÓ Óþîÿ*ÿØþÖÓ ÓþÙÿ*ÿØþÔÓ Óþëÿ)ÿØþ×Ó Óþ×ÿ)ÿØþÔÓ Óþèÿ(ÿØþ×Ó ÓþÖÿ(ÿØþÕÓ Óþæÿ'ÿØþ×Ó ÓþÕÿ'ÿØþÕÓ Óþãÿ&ÿØþ×Ó ÓýÔýÿ%ÿØþÕÓ Óþáÿ%ÿØþ×Ó ÓýÔöÿ$ÿ ØþÖÓ ÓþÞÿ$ÿ ØþÔÓ Óþôÿ#ÿ ØþÖÓ ÓþÜÿ#ÿ ØþÔÓ Óþñÿ"ÿ ØþÖÓ ÓþÚÿ"ÿ ØþÔÓ Óþîÿ!ÿ ØþÖÓ ÓþØÿ!ÿ ØþÔÓ Óþëÿ ÿ Øþ×Ó Óþ×ÿ ÿØþÕÓ ÓþèÿÿØþ×Ó ÓþÖÿÿØþÕÓ ÓþåÿÿØþ×Ó ÓþÕÿÿØþÕÓ ÓþãÿÿØþ×Ó ÓýÔüÿÿØþÕÓ ÓþàÿÿØþ×Ó ÓþöÿÿØþÖÓ ÓþÞÿÿØþÔÓ ÓþóÿÿØþÖÓ ÓþÜÿÿØþÔÓ ÓþðÿÿØþÖÓ ÓþÚÿÿØþÔÓ ÓþíÿÿØþ×Ó ÓþØÿÿØþÔÓ ÓþêÿÿØþ×Ó Óþ×ÿÿDþfÿ8ÿDþGÿ8ÿDþaÿ7ÿDýF»ÿ6ÿDþ\ÿ6ÿDýE†ÿ5ÿDþXÿ5ÿDþÿ4ÿDþTÿ4ÿ Dþ{ÿ3ÿ DþPÿ3ÿ Dþuÿ2ÿ DþMÿ2ÿ Dþoÿ1ÿ DþJÿ1ÿ Dþjÿ0ÿ DþHÿ0ÿ Dþeÿ/ÿþBD DþFÿ/ÿþ*D Dþ`ÿ.ÿý@D DýE”ÿ-ÿý'D Dþ[ÿ-ÿü>D Dþ…ÿ,ÿþ$D DþWÿ,ÿýD Dþ„ÿ#ÿ þ#D DþVÿ#ÿ þ;D Dþ~ÿ"ÿ þ D DþRÿ"ÿ þ9D Dþxÿ!ÿ þD DþOÿ!ÿ þ6D Dþrÿ ÿ þD DþLÿ ÿþ2D DþmÿÿýCD DþIÿÿþ/D DþgÿÿýBD DþGÿÿþ,D DþcÿÿýAD DýFÛÿÿþ)D Dþ^ÿÿý?D DýEˆÿÿþ%D DþYÿÿý=D Dþƒÿÿþ"D DþUÿÿþ;D Dþ}ÿÿþD DþQÿÿþ8D DþwÿÿþD DþNÿÿþ5D DþqÿÿþD DþKÿÿÿþÓÿ=ÿþûÿ>ÿþØÿ=ÿýýËÿ=ÿþÞÿ=ÿýþµÿ=ÿþãÿ>ÿþºÿ=ÿþéÿ>ÿþ¿ÿ=ÿþíÿ>ÿþÄÿ=ÿþòÿ>ÿþÊÿ=ÿþõÿ>ÿþÏÿ=ÿþùÿ>ÿþÔÿ=ÿþûÿ>ÿþÚÿ=ÿýý·ÿ=ÿþßÿ=ÿýþ¶ÿ=ÿþäÿ>ÿþ»ÿ=ÿþêÿ>ÿþÀÿ=ÿþîÿ>ÿþÅÿ=ÿþóÿ>ÿþËÿ=ÿþöÿ>ÿþÐÿ=ÿþùÿ>ÿþÖÿ=ÿýüêÿ=ÿþÛÿ=ÿýý³ÿ=ÿþàÿ>ÿþ·ÿ=ÿþåÿ>ÿþ¼ÿ=ÿþëÿ>ÿþÁÿ=ÿþïÿ>ÿþÇÿ=ÿþôÿ>ÿþÌÿ=ÿþ÷ÿ>ÿþÑÿ=ÿþúÿ>ÿþ×ÿ=ÿýüßÿ=ÿþÜÿ=ÿýþ´ÿ=ÿþáÿ>ÿþ¸ÿ=ÿþæÿ>ÿþ½ÿ=ÿþìÿ>ÿþÃÿ=ÿþñÿ>ÿþÈÿ=ÿþôÿÿÿÿÿÿÿÿÿÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿØÃþ’%Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡ØØ'ÔØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØþ:=%=þ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿ/Ãþ±‡ ‡ÿþ¯ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ/ØþÖÓ Óÿ/ØþÖÓ Óÿ/ØþÖÓ ÓÿÔþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ Óÿ/þD Dÿ/þD Dÿ/þD Dÿ=þ!þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿÿÿÿÿÿþ³ÿ<ÿý¬‡ÿ;ÿü©‡‡ÿ:ÿþ§‡‡:ÿþ¥‡‡9ÿþ£‡‡8ÿþ¢‡‡7ÿþ ‡‡6ÿþ ‡‡5ÿþ£‡‡4ÿþ¥‡‡3ÿþ¨‡ ‡2ÿþ«‡ ‡1ÿþ®‡ ‡0ÿþ²‡ ‡/ÿþº‡ ‡.ÿþć‡-ÿý͈‡‡,ÿýÖ‰‡‡þ‹ÿ*ÿýߌ‡‡ýжÿ)ÿý莇‡ü‰´Ãÿ)ÿþ’‡‡ûˆ²ÃÃÿ(ÿþ™‡‡ýˆ°ÃÃ(ÿþ£‡‡ýˆ¯ÃÃ'ÿþ°‡‡þ®ÃÃ&ÿþ¾‡‡þ©ÃÃ%ÿý͈‡‡þ£ÃÃ$ÿýÛŠ‡‡þžÃÃ#ÿýø‡‡ý™ÂÃÃ#ÿþ˜‡‡ý•ÁÃÃ"ÿþ¦‡‡ý’ÀÃÃÿþäÿ<ÿýáÓÿ;ÿüàÓÓÿ:ÿþßÓÓ:ÿþÞÓÓ9ÿþÞÓÓ8ÿþÝÓÓ7ÿþÜÓÓ6ÿþÜÓÓ5ÿþÝÓÓ4ÿþÞÓÓ3ÿþßÓ Ó2ÿþáÓ Ó1ÿþâÓ Ó0ÿþãÓ Ó/ÿþæÓ Ó.ÿþêÓÓ-ÿþíÓÓ,ÿýñÔÓÓ+ÿýôÕÓÓþ×ÿ)ÿý÷ÖÓÓýרÿ)ÿþ×ÓÓüÖØØÿ(ÿþÚÓÓþÖØØ(ÿþÝÓÓþÖØØ'ÿþâÓÓþÖØØ&ÿþèÓÓþÖØØ%ÿþíÓÓþÕØØ$ÿýóÔÓÓþÕØØ#ÿýüÖÓÓþÔØØ#ÿþÙÓÓþÔØØ"ÿþßÓÓýÔרØÿþeÿ<ÿý_Dÿ;ÿü]DDÿ:ÿþ[DD:ÿþZDD9ÿþYDD8ÿþXDD7ÿþVDD6ÿþVDD5ÿþXDD4ÿþZDD3ÿþ\D D2ÿþ_D D1ÿþaD D0ÿþdD D/ÿþiD D.ÿþqDD-ÿýwEDD,ÿý~FDDþAÿ*ÿý„GDDýBÿ)ÿý”IDDüBÿ)ÿþLDDûCÿ(ÿþQDDýC(ÿþXDDýC!'ÿþbDDþ"&ÿþmDDþ&%ÿþwDDþ+$ÿý‚FDDþ0#ÿýÛJDDý4#ÿþQDDý8"ÿþ[DDý;ÿþÕÿ<ÿþÛÿ<ÿþÞÿ<ÿþßÿ<ÿþáÿ<ÿþâÿ<ÿþäÿ<ÿþåÿ<ÿþåÿ<ÿþãÿ<ÿþàÿ<ÿþÞÿ<ÿþÛÿ<ÿþÙÿ<ÿþÖÿ<ÿþÏÿ<ÿþÈÿ<ÿýÂþÿ;ÿý¼üÿ;ÿý·úÿ;ÿý¸÷ÿ<ÿþóÿ<ÿþìÿ<ÿþãÿ<ÿþØÿ<ÿþÌÿ<ÿýÂþÿ;ÿý¹üÿ;ÿýßöÿ<ÿþíÿ<ÿþàÿÿ(ÿþ£‡‡&ÿý҇$ÿýúŸ‡‡ý¬ÿ"ÿýɇ‡û‰£ÀÃÿ!ÿþ¦‡‡ý™»Ãà ÿýÓ‡‡ýްÃÃÿþ¯‡‡üˆ¢ÁÃÃÿýᕇ‡ý”¸ÃÃÿýʇ‡ý‹¬ÃÃÿþ¦‡‡ýš¾Ã ÃÿýÜ“‡‡ýŒ¯Ã Ãÿý¾‰‡‡ýœ¿Ã Ãÿþ¢‡‡ý±ÃÃÿýà“‡‡ý¿ÃÃÿýÇŠ‡‡ý‹¯ÃÃÿþ®‡‡ý˜½ÃÃÿýý›‡‡ý‰ªÃÃÿý؇‡ý“ºÃÃÿýɇ‡ý¢ÂÃÃÿþ¯‡‡ýŒ²Ãà ÿþŸ‡‡ý–½Ãà ÿý㓇‡þ¥Ãà ÿýÒŒ‡‡ý´Ãà ÿýÁˆ‡‡ý—¾ÃÃÿþ³‡‡þ£ÃÃÿþ§‡‡ýŠ°Ã Ãÿþœ‡‡ý‘»Ã!Ãÿýñ•‡‡ýœÁÃ"Ãÿý݇‡þ¨Ã$ÃÿýÒ‹‡‡ýвÃ%Ãÿýˉ‡‡ý¹Ã&Ãüÿȇ‡ý–¿Ã'Ãþ»‡‡ýŸÂÃ(Çýˆ©Ã*Çý‰±Ã+ÇýŒ¶Ã,Çý»Ã-à ‡ý”¾Ã.à ‡ý™ÁÃ/à ‡þžÃ1à ‡þ¢Ã2à ‡þ¦Ã2Ãþ±‡‡þ«Ã1ÃýÁŸ‡‡ýˆ¯Ã1Ãýµ‡‡ý‰³Ã0Ãý£‡‡ýŠ´Ã0Ãý»“‡‡ýеÃ0Ãý¯Š‡‡ý‹¶Ã/ÃýÁŸ‡‡ý‹·Ã/Ãýº‘‡‡ý‹¸Ã/Ãý­‰‡‡ý‹¹Ã.Ãý ‡ ‡þ·Ã.Ãý½”‡ ‡/Ãý´Œ‡ ‡.Ãý¨ˆ‡ ‡,ÃýÁœ‡‡+Ãý½“‡‡*Ãý¶‡‡)Ãý®‰‡‡(Ãþ£‡‡&Ãýœ‡‡%Ãý¿–‡‡$Ãý¼‘‡‡#Ãý¸‡‡"Ãý³Š‡‡(ÿþÞÓÓ&ÿýêÕÓÓ$ÿýýÜÓÓþÖÿ"ÿýìÕÓÓüÕרÿ!ÿþßÓÓýÔרØ ÿýðÖÓÓýÔÖØØÿþâÓÓýÕרØÿýõØÓÓýÔרØÿýêÔÓÓþÖØØÿþßÓÓýÕר Øÿýó×ÓÓþÖØ ØÿýèÔÓÓýÕר ØÿþÝÓÓþÖØØÿýô×ÓÓýÕרØÿýëÔÓÓþÖØØÿþâÓÓýÔרØÿýþÛÓÓþÖØØÿýñÖÓÓýÔרØÿýêÔÓÓþÕØØÿþâÓÓþÖØØ ÿþÜÓÓýÔרØ ÿýöØÓÓþÕØØ ÿýïÕÓÓþרØ ÿþéÓÓýÔרØÿþäÓÓþÕØØÿþßÓÓþÖØ ØÿþÛÓÓýÔר!ØÿýúØÓÓþÕØ#ØÿýóÖÓÓþÖØ$ØÿýïÔÓÓþÖØ%ØÿýíÔÓÓýÔר&ØýÿêÓÓýÔר'ØþçÓÓþÕØ)ØÓþÖØ*ØÓþÖØ+ØÓþר,ØÓýÔר-Ø ÓýÔר.Ø ÓþÔØ0Ø ÓþÕØ1Ø ÓþÕØ2Ø ÓþÕØ2ØþÖÓÓþÖØ1Øý×ÕÓÓþÖØ1Øý×ÔÓÓþÖØ1ØþÕÓÓþר0Øý×ÔÓÓþר0ØþÖÓ Óþר0ØþÕÓ Óþר/Øý×ÔÓ Óþר/ØþÖÓ Óþר/ØþÕÓ Óþר.Øý×ÔÓ Ó/Øþ×Ó Ó.ØþÖÓÓ-ØþÕÓÓ+Øý×ÔÓÓ*Øþ×ÓÓ)ØþÖÓÓ(ØþÕÓÓ'ØþÕÓÓ%Øý×ÔÓÓ$Øý×ÔÓÓ#Øþ×ÓÓ"ØþÖÓÓ(ÿþYDD&ÿýqHDD$ÿýèVDDý?#ÿ"ÿýtHDDûC+ÿ!ÿþ[DDý5 ÿý|KDDý> ÿþaDDüC,ÿý†ODDý8ÿýpFDDý@$ÿþ[DDý3 ÿýƒMDDý@  ÿýlFDDý2 ÿþXDDý?ÿý…MDDý1ÿýsFDDý@!ÿþaDDý5ÿýôSDDýB%ÿýJDDý9ÿýpEDDý,ÿþaDDý@ ÿþUDDý7 ÿýˆMDDþ* ÿý{HDDý? ÿýoEDDý6ÿþeDDþ+ÿþ[DDýA ÿþTDDý;!ÿý»NDDý1"ÿýƒJDDþ'$ÿý{GDDýA%ÿývEDDý=&üÿpEDDý7'þjDDý/(DýC&*DýB+Dý@,Dý=- Dý9. Dý4/ Dþ01 Dþ,2 Dþ(2þDDþ$1ý/DDýC!1ý=DDýB0ý+DDýB0ý:DDýA0ý!ADDýA/ý/DDý@/ý;DDý@/ý"BDDý@.ý.D Dþ.ý8D D/ý?D D.ý'CD D,ý2DD+ý9DD*ý?DD)ý"CDD(þ+DD&ý2DD%ý7DD$ý;DD#ý?DD"ýADD(ÿþâÿ;ÿýÇùÿ:ÿýêæÿ;ÿýÅùÿ;ÿþàÿ;ÿý¾õÿ;ÿþØÿ;ÿýµïÿ;ÿýÉüÿ;ÿþàÿ;ÿý¸òÿ;ÿýÍýÿ;ÿþãÿ;ÿý¶òÿ;ÿýÆûÿ;ÿþÙÿ;ÿýôêÿ;ÿý»öÿ;ÿýÉýÿ;ÿþØÿ<ÿþæÿ;ÿý´òÿ;ÿý¿ùÿ;ÿýÊþÿ;ÿþÕÿ<ÿþßÿ<ÿþéÿ;ÿýËðÿ;ÿý¸öÿ;ÿý¾ûÿ;ÿýÃýÿ;ÿýÉþÿ;ÿþÏÿþÿ‡ýœ¼Ã:Ãý“µÃ;ÃýÁ¯Ã:Ãû³Š‡Ã7Ãüº£‡‡5Ãü¿«”‡‡3Ãü´œ‰‡‡0Ãü¿¨‡ ‡.Ãüµœ‰‡ ‡+ÃüÁ«‘‡‡)Ãü½¤‹‡‡'Ãü·œˆ‡‡%Ãý±•‡‡"Ãü­‘‡‡ ÃüÁªŽ‡‡ÃüÁ§Œ‡‡ÃüÁ¨Œ‡‡ÃüÁ¨Œ‡ ‡Ãü©‡"‡Ãý­Ž‡$‡Ãý²’‡&‡Ãý¶–‡(‡Ãý»š‡*‡ÃüÀ£‰‡+‡Ãý¬‡-‡ Ãýµ“‡/‡ Ãý¿‡1‡ Ãý¬‹‡2‡Ãý¸•‡4‡ÃüÁ¢ˆ‡5‡Ãý´‡7‡ÃýÀŸ‡9‡Ãý±‡:‡ý¾œ‡<‡þŒ‡½‡þ•‡;‡ü’²Ã‡9‡ý¯ÃÃ8‡ü¬ÂÃÃ6‡ü‰¥ÁÃÃÓýÕר:ØýÔר<ØþÖØ:ØûÖÕÓÓØ7Øý×ÕÓÓ5Øü×ÖÔÓÓ3ØýÖÕÓÓ0Øü×ÖÔÓ Ó.Øý×ÕÓ Ó,ØýÖÔÓÓ)Øý×ÕÓÓ'Øý×ÕÓÓ%ØýÖÔÓÓ#ØýÖÔÓÓ!ØýÖÔÓÓØþÖÓÓØþÖÓÓØþÖÓ!ÓØþÖÓ#ÓØýÖÔÓ$ÓØýÖÔÓ&ÓØý×ÔÓ(ÓØý×ÕÓ*ÓØý×ÕÓ,ÓØþÖÓ.Ó Øý×ÔÓ/Ó Øý×ÕÓ1Ó ØþÖÓ3ÓØý×ÔÓ4ÓØþÕÓ6ÓØýÖÔÓ7ÓØý×ÕÓ9ÓØþÖÓ;Óý×ÕÓüÓþÔÓ;ÓüÔÖØÓ9ÓýÔÖØØ9ÓþÖØØ7ÓþÕØØDý2:ý9;ý :û1AD7ü+>DD5ü%8DD3ü2CDD0ü'DDü(@DDü'@DDü'?D Dü&?D"Dý">D$Dý;D&Dý7D(Dý3D*Dü+CD+Dý#?D-D ý9D/D ý0D1D ý$@D2Dý8D4Dü,CD5Dý=D7Dý/D9Dý?D:Dý2DÃØû×ÖÕÔÓÓØû×ÖÕÔÓ!ÓØû×ÖÕÔÓ%ÓØüÖÕÔÓ)Ó Øü×ÖÔÓ-Ó Øü×ÕÔÓ0ÓØýÖÕÓ4ÓØü×ÖÕÓ7ÓûØ×ÖÔÓ:ÓþÕÓzÓûÔÕÖÖÓ6ÓûÔÕÖרØ2ÓûÔÕÖרØ.ÓûÔÕÖר Ø+ÓüÕÖרØ'ÓüÔÖרØ$ÓüÕÖרØ ÓüÔÕרØÓüÔÕרØÓüÔÕר ØÓýÕר#ØÓýÔÖØ&ØÓüÔÖר(ØÓýÕר+Ø ÓüÔÖר-Ø ÓýÔÖØ0Ø ÓýÕר2ØÓýÕר4ØÓýÔÖØ7ØÓýÔÖØ9ØüÓÔÖØ;Øþר>Øú,8CDDû"/;D!Dû .-Dü;*Dü=* Dü?-#DüC3&Dü;'(DüB/+ Dü<&- DüC30DüA-2Dü?(4Dü;#6Dý99üD8;þ>ÿ.‡ñ‰’“•—™š››œœ‡ðˆ“˜œ ¥©®²´·º½ÀÃÇõˆ”›¢¨®´¹¿Ã à ‡÷‹“œ¤¬µ½ÂÃ)Çøˆ™£­·¿Ã1Ãø‡™¤¯¹ÂÃ7Ãþ¾Ã~Ã0ÓÔÕÓÔÕÖרÓüÔÕÕÖÖ×!Ø ÓùÔÕÕÖ×ר*ØÓÔûÕÖ×ר1ØÓûÔÕÖר8Øþר~Ø.DõB?=<:986432210þ1DDðC>:51.*&"DõC>82,'!  D÷@92*#)DøC<4+#1øD?5*!7þ~ÿ‡òœ›š™™˜—”’ŽŒŠ‡1‡ ÃñÀ½¹¶³¯¬§¢ž™”‹‡"‡ÃöÁ»µ¯¨¢œ–އ‡$Ã÷»³«¤œ”‹‡‡,Ãù¾µ«¢™‡ ‡2ÃùÀ¶«¡–‹‡‡8Ãø½±¥™Œ‡‡Ã<Ãý½°ÃÿÃÓÕÔ4Ó Ø×ÖÕÔ$ÓØ×ÖÕÔÓ%Øù×ÖÖÕÕÔÓÓ,Ø×ûÖÕÔÔÓ Ó2Ø×üÖÕÔÓÓ8Øû×ÖÕÔÓÓ=Øý×ÖØÿØD2ô344568:<>?AD1D ñ!$(,048DD$÷$+29ADD,ù$,4D D2ý4D D4ü+@DD6ü#:DD9ý3DD;û.BD<ý(¿ÿ.Ãý·˜‡ ‡0Ãýµ–‡ ‡2Ãý³“‡ ‡4Ãý¯‡‡5Ãü«‡‡7ÃüÁ¥‰‡‡9Ãý½‡‡;Ãû¸–‡‡Ã<Ãý±Ã=ÃþÂÃ?Ãý¬ÁÃ<Ãû‡ŠŸ·Ã:Çü’ªÀÃ7ÇüŠ ¹Ã5Çü•¯ÂÃ2à ‡üŒ¥¾Ã0à ‡ü‰ž¸Ã.Çý–±Ã,Çü‘­ÂÃ)Çü¨ÀÃ'Çü‹¥¿Ã%ÇüŠ£¾Ã#Çü‰¡½Ã!Çüˆ ½ÃÇü‰¢¾ÃÇüŠ£¿ÃÃ!‡üŠ¥ÀÃÃ#‡ü‹©ÂÃÃ%‡ýŽ­ÃÃ'‡ý‘²ÃÃ)‡ý˜¹ÃÃ*‡üˆŸ¾ÃÃ,‡üЧÂÃÃ.‡ý±Ã Ã0‡ý˜ºÃ Ã1‡üˆ¢Àà Ã3‡ý®ÃÃ5‡ý—ºÃÃ6‡üˆ¤ÁÃÃ8‡ý²ÃÃ:‡ý¿ÃÃ;‡ûŒ®ÃÇ<‡ý¢Ã‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡ýšÃ‡<‡üšÃ‡;‡úšÃ«‡9‡þšÃÃü®‘‡7‡þšÃÃý°”‡5‡þšÃ.Øý×ÔÓ Ó0Øý×ÔÓ Ó2ØýÖÔÓ Ó4ØýÖÔÓÓ6ØþÖÓÓ8ØþÕÓÓ9Øý×ÕÓÓ;Øû×ÔÓÓØ<ØýÖÔØØýÖר<ØÓýÕר:ØÓüÔÖר7ØÓýÕר5ØÓýÔÖØ3Ø ÓýÕר0Ø ÓýÕר.ØÓýÔÖØ,ØÓýÔÖØ*ØÓýÖר'ØÓýÕר%ØÓýÕר#ØÓýÕר!ØÓýÕרØÓýÕרØ ÓýÕרØ"ÓýÕרØ$ÓþÖØØ%ÓýÔÖØØ'ÓýÔÖØØ)ÓýÔרØ+ÓýÕרØ-ÓþÖØØ.ÓýÔÖØ Ø0ÓýÔר Ø2ÓýÕר Ø4ÓþÖØØ5ÓýÔרØ7ÓþÕØØ8ÓýÔÖØØ:ÓýÕרØ<ÓüÖØØÓ<ÓýÕØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓúÔØØÖÔÓ9ÓþÔØØýÖÔÓ7ÓþÔØØýÖÔÓ5ÓþÔØ.ý5D D0ý7D D2ý9D D4ý ''DüA*%DüA+#DüB-!DüC.DüB,DüB+!DüA*#Dü@&%Dý>"'Dý;)Dý5*DüC.,DüA(.Dý= 0Dý5 1DüC, 3Dý?!5Dý66DüC*8Dý=:Dý1;Dû@"D22à ‡þÌÿÿýÁ;2 2à ‡þÌÿÿýº92 2à ‡þÌÿÿý²72 2à ‡úÌÿÿª62 2à ‡ûÌÿ¡42 2à ‡üÌ™322à ‡ý322à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22 ÓýÔâÿ2ÿ ÓýÖëÿ0ÿ ÓýÛöÿ.ÿÓýÔäÿ-ÿÓý×ïÿ+ÿÓþÞÿ*ÿÓýÕêÿ(ÿÓýÛöÿ&ÿÓýÔæÿ%ÿþÖÓÓýÙôÿ#ÿüØ×ÕÓÓýÔäÿ"ÿØý×ÔÓÓýÙôÿ ÿØþÖÓÓýÔäÿÿØý×ÕÓÓýÙõÿÿØý×ÔÓÓýÕîÿÿ ØþÖÓÓþåÿÿ Øý×ÕÓÓþÝÿÿ ØþÖÓÓþßÿÿ Øý×ÕÓÓþèÿÿØý×ÔÓÓþðÿÿØþÕÓÓýÕûÿÿØý×ÔÓÓþÙÿÿØþÕÓÓþßÿÿØý×ÔÓÓþðÿÿØþÕÓÓþÝÿÿØþÖÓÓþúÿÿØþ×Ó ÓþãÿÿØþÖÓ ÓþÕÿÿØþÕÓ ÓþéÿÿØþ×Ó ÓþÙÿÿØþÖÓ ÓþóÿÿØþÕÓ ÓþëÿÿØþ×Ó ÓþäÿÿØ ÓþßÿÿØþÔÓ ÓþÚÿÿØþÕÓ ÓþÖÿÿØþÖÓ ÓÿØþ×Ó ÓþôÿÿØ ÓþîÿÿØ ÓþíÿÿØ ÓþíÿÿØ Óþíÿÿþ€ØØ ÓþíÿÿýzLØØ Óþíÿ ÿüuLLØØ Óþíÿ ÿþpLLØ Óþíÿ ÿþkLLØ Óþíÿ ÿýôfLLØ ÓþíÿÿýècLLØ Óþíÿÿýä_LLØ ÓþíÿÿýÞ\LLØ ÓþíÿÿýØYLLØ ÓþíÿÿýÒVLLØ ÓþíÿÿýËTL LØ ÓþíÿÿýÄRL LØ Óþíÿÿý½QL LØ Óúíÿÿ¶OL LØ Óûíÿ®NL LØ Óüí§MLLØ Óþ²LLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLL DýEbÿ2ÿ DýIsÿ0ÿ DýUˆÿ.ÿDýFfÿ-ÿDýLzÿ+ÿDþZÿ*ÿDýHpÿ(ÿDýT‰ÿ&ÿDýFiÿ%ÿý'ADDýO„ÿ#ÿü0DDýEfÿ"ÿý9DDýO„ÿ ÿý#?DDýEfÿÿý.DDýO‡ÿÿý:DDýGxÿÿ ý&ADDþgÿÿ ý3DDþXÿÿ ý ?DDþ\ÿÿ ý/DDþlÿÿýÿý÷Æÿ>ÿýè´ÿ=ÿýýÔÿ>ÿýóÀÿ>ÿþáÿ>ÿýùÉÿ>ÿýè³ÿ=ÿýüÐÿ>ÿýî·ÿ=ÿýýÓÿ>ÿýî·ÿ=ÿýýÓÿ>ÿýî´ÿ=ÿýúÁÿ>ÿþÒÿ>ÿþãÿ>ÿþÞÿ>ÿþÍÿ=ÿýþ½ÿ=ÿýøÕÿ=ÿþíÿ>ÿþßÿ>ÿþ¾ÿ=ÿþãÿ=ÿýþÌÿ=ÿþ×ÿ=ÿþùÿ>ÿþÊÿ=ÿþïÿ>ÿþ¸ÿ=ÿþÇÿ=ÿþÓÿ=ÿþßÿ=ÿþëÿ=ÿþ÷ÿ~ÿþ·ÿ=ÿþÁÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿÿþÝÿ+ÿþÂÿÿþáÿ,ÿþÂÿ ÿþäÿ-ÿþÂÿ ÿþçÿ.ÿþÂÿ ÿþêÿ/ÿþÂÿ ÿýÈíÿ0ÿþÂÿÿý¯ïÿ1ÿþÂÿÿý°òÿ2ÿþÂÿÿý²ôÿ3ÿþÂÿÿý´öÿ4ÿþÂÿÿý·÷ÿ5ÿþÂÿÿýºùÿ6ÿþÂÿÿý¼ûÿ7ÿþÂÿÿý¿üÿ8ÿúÂÿÿÂýÿ9ÿûÂÿÆþÿ:ÿüÂÉþÿ;ÿþÜÿQÿ*ÿþ22)ÿþd22'ÿýàP22&ÿýÉB22%ÿý­822$ÿýŽ322#ÿþp22!ÿýõY22 ÿýÖH22ÿý»=22ÿý§622ÿýž422ÿý—322ÿý32 2ÿþ‡2"2ÿþ2#2ÿþx2$2ÿþq2%2ÿþj2&2ÿþd2'2ÿþ_2(2ÿþY2)2ÿþT2*2ÿýñP2+2ÿýäL2,2ÿýÞI2-2 ÿýÙE2-2þ6ÿ ÿýÓB2-2ý=¼ÿ ÿýÍ?2-2ýI×ÿ ÿýÇ=2-2ý[ýÿ ÿýý@2-2þsÿ ÿþM2,2ý4‘ÿ ÿýÇD2,2ý9°ÿ ÿý°62,2ýCÌÿ ÿý¨52,2ýRäÿ ÿýŸ42,2þ[ÿ ÿý—32,2þ`ÿ ÿþŽ2-2þfÿ ÿþ…2-2þlÿ ÿþ|2-2þsÿ ÿþt2-2þzÿ ÿ.2þ‚ÿÿ-2þŠÿÿ+2ý3’ÿÿ*2ý3™ÿÿ)2ý4¢ÿÿ(2ý5©ÿÿ'2ý7±ÿÿ&2ý8¹ÿÿ%2ý:¿ÿÿ$2ý=Æÿÿ#2ý?Ìÿÿ"2ýBÒÿÿ!2ýEÙÿÿ 2ýcýÿÿ2þrÿÿ2þVÿÿ2ýNåÿÿ2ýSøÿÿ2þXÿ!ÿ2þ]ÿ"ÿ2þdÿ#ÿ2þkÿ$ÿ2þrÿ%ÿ*ÿþLL)ÿþyLL'ÿýægLL&ÿýÒZLL%ÿý¹RLL$ÿýžMLL#ÿþƒLL!ÿý÷nLL ÿýÝ_LLÿýÆULLÿý´OLLÿý¬MLLÿý¥MLLÿþžL!Lÿþ—L"LÿþL#LÿþŠL$Lÿþ„L%Lÿþ~L&LÿþxL'LÿþtL(LÿþoL)LÿþkL*LÿýôgL+LÿýécL,Lÿýå`L-L ÿýà]L-LþOÿ ÿýÛZL-LýVÇÿ ÿýÖXL-Lý`Þÿ ÿýÐUL-Lýpýÿ ÿýýYL-Lþ†ÿ ÿþeL,LýM ÿ ÿýÐ\L,LýS¼ÿ ÿý¼PL,Lý[Õÿ ÿýµOL,Lýhéÿ ÿý­NL,Lþpÿ ÿý¥ML,Lþuÿ ÿþžL-Lþzÿ ÿþ–L-Lþÿ ÿþŽL-Lþ†ÿ ÿþ‡L-LþŒÿ ÿ.Lþ“ÿÿ-Lþšÿÿ,Lþ¡ÿÿ*LýM¨ÿÿ)LýN¯ÿÿ(LýOµÿÿ'LýP½ÿÿ&LýRÃÿÿ%LýTÉÿÿ$LýUÏÿÿ#LýWÕÿÿ"LýZÚÿÿ!Lý]àÿÿ LýxýÿÿLþ…ÿÿLþlÿÿLýeêÿÿLýiúÿÿLþmÿ!ÿLþrÿ"ÿLþxÿ#ÿLþ~ÿ$ÿLþ…ÿ%ÿ*ÿþ¹ÍÍ)ÿþÀÍÍ'ÿý¡ÅÍÍ&ÿý§ÉÍÍ%ÿý®ËÍÍ$ÿþ¶ÍÍ#ÿþ½ÍÍ!ÿýÕÃÍÍ ÿý¤ÇÍÍÿýªÊÍÍÿý¯ÌÍÍÿþ²ÍÍÿþ´Í Íÿþ¶Í!Íÿþ¸Í"Íÿþ¹Í#Íÿþ»Í$Íÿþ½Í%Íÿþ¿Í&ÍÿþÀÍ'ÍÿþÂÍ(ÍÿþÃÍ)ÍÿþÄÍ*ÍÿýÇÅÍ+Íÿý ÆÍ,Íÿý¢ÇÍ-Í ÿý£ÈÍ-ÍþÌÿ ÿý¤ÉÍ-Íýʪÿ ÿý¦ÊÍ-ÍýÇ£ÿ ÿý§ÊÍ-ÍýÃõÿ ÿýõÉÍ-Íþ½ÿ ÿþÆÍ-Íþµÿ ÿý§ÈÍ,ÍýË­ÿ ÿý­ÌÍ,Íýɦÿ ÿý¯ÌÍ,ÍýÅ ÿ ÿý±ÌÍ,ÍþÃÿ ÿþ´Í-ÍþÁÿ ÿþ¶Í-ÍþÀÿ ÿþ¸Í-Íþ¾ÿ ÿþºÍ-Íþ½ÿ ÿþ¼Í-Íþ»ÿ ÿ.Íþ¹ÿÿ-Íþ·ÿÿ,Íþµÿÿ+Íþ³ÿÿ)Íý̱ÿÿ(Íý̯ÿÿ'ÍýÌ­ÿÿ&ÍýË«ÿÿ%ÍýË©ÿÿ$Íýʨÿÿ#Íýʦÿÿ"Íýɤÿÿ!ÍýÈ£ÿÿ ÍýÀõÿÿÍþ½ÿÿÍþÄÿÿÍýÆ ÿÿÍýÅàÿÿÍþÄÿ!ÿÍþÂÿ"ÿÍþÀÿ#ÿÍþ¿ÿ$ÿÍþ½ÿ%ÿ*ÿþÔÿ<ÿþáÿ;ÿý¯ìÿ;ÿý·õÿ;ÿýÁûÿ;ÿýÎþÿ;ÿþÛÿ;ÿýÓèÿ;ÿý³ñÿ;ÿý¼øÿ;ÿýÃýÿ;ÿýÇþÿ;ÿýÊþÿ;ÿþÍÿ<ÿþÑÿ<ÿþÔÿ<ÿþØÿ<ÿþÛÿ<ÿþßÿ<ÿþâÿ<ÿþäÿ<ÿþçÿ<ÿþêÿ;ÿýÈìÿ;ÿý®ïÿ;ÿý°ñÿ;ÿý²óÿ-ÿþýÿ ÿý³õÿ-ÿýø»ÿ ÿýµöÿ-ÿýñ²ÿ ÿý¸øÿ-ÿýæôÿ ÿýôöÿ-ÿþÚÿ ÿþîÿ,ÿýþÌÿ ÿý¸ôÿ,ÿýúÀÿ ÿýÀüÿ,ÿýô¶ÿ ÿýÃýÿ,ÿýë®ÿ ÿýÆþÿ,ÿþæÿ ÿýÊþÿ,ÿþäÿ ÿþÎÿ-ÿþáÿ ÿþÑÿ-ÿþÞÿ ÿþÖÿ-ÿþÚÿ ÿþÙÿ-ÿþ×ÿ<ÿþÓÿ<ÿþÏÿ<ÿþÌÿ;ÿýþÉÿ;ÿýþÅÿ;ÿýýÃÿ;ÿýüÀÿ;ÿýû½ÿ;ÿýùºÿ;ÿýø¸ÿ;ÿý÷¶ÿ;ÿýõ´ÿ;ÿýó²ÿ;ÿýâôÿ;ÿþÚÿ<ÿþéÿ<ÿýî®ÿ;ÿýëÞÿ;ÿþèÿ<ÿþåÿ<ÿþâÿ<ÿþÞÿ<ÿþÚÿ%ÿ 2ýDµÿÿ2ý3tÿÿ2ý?·ÿÿ2ýZãÿÿ2ý4‡ÿ!ÿ2ýA»ÿ"ÿ2ý]èÿ#ÿ2ý5‹ÿ%ÿ2ýC¿ÿ&ÿ2ýañÿ'ÿ2ý5ÿ)ÿ2ýDÃÿ*ÿ2ýdøÿ+ÿ2ý6”ÿ-ÿ 2ýGÇÿ.ÿ 2þgÿ0ÿ 2ý7˜ÿ1ÿ 2ýGËÿ2ÿ2ýXñÿ3ÿ2þoÿ5ÿ2ý3Œÿ6ÿ2ý8¬ÿ7ÿ2ýBÈÿ8ÿ2ýPàÿ9ÿ2þdÿ;ÿý2ÿ<ÿþžÿýÿþ¹ÿ<ÿý|3ÿ:ÿûÏN22ÿ9ÿý“7228ÿýá]227ÿý¬=226ÿþp224ÿýÃG223ÿý…4221ÿýØT2 20ÿý¨:2 2/ÿý€32 2-ÿýý_22,ÿýÑH22+ÿý­:22*ÿý†322)ÿþc22'ÿý×K22&ÿý´<22%ÿýŒ422$ÿþi22"ÿýÛN22!ÿýº>22 Lý\ÀÿÿLþ‡ÿÿLýXÂÿÿLýpèÿÿLýM—ÿ!ÿLýYÆÿ"ÿLýrìÿ#ÿLýN›ÿ%ÿLý[Éÿ&ÿLýuôÿ'ÿLýOŸÿ)ÿLý\Íÿ*ÿLýxúÿ+ÿLýO£ÿ-ÿ Lý^Ðÿ.ÿ Lþ{ÿ0ÿ LýP¦ÿ1ÿ Lý^Ôÿ2ÿLýmôÿ3ÿLþ‚ÿ5ÿLýMœÿ6ÿLýR¸ÿ7ÿLýZÑÿ8ÿLýgæÿ9ÿLþxÿ;ÿýLÿ<ÿþ¬ÿýÿþÃÿ<ÿýMÿ:ÿû×eLLÿ9ÿý¢PLL8ÿýçrLL7ÿý¸VLL6ÿþƒLL4ÿýÍ^LL3ÿý–NLL1ÿýßjL L0ÿýµSL L/ÿþ‘L L-ÿýýtLL,ÿýÙ_LL+ÿý¹SLL*ÿý—MLL)ÿþxLL'ÿýÞbLL&ÿý¿TLL%ÿýœMLL$ÿþ|LL"ÿýâeLL!ÿýÅVLL ÍýȬÿÿÍþ¼ÿÿÍýÊ«ÿÿÍýàÿÿÍþ¸ÿ!ÿÍýɪÿ"ÿÍý©ÿ#ÿÍýÌ·ÿ%ÿÍýÉ©ÿ&ÿÍýÁÇÿ'ÿÍý̵ÿ)ÿÍýȨÿ*ÿÍýÀàÿ+ÿÍýÌ´ÿ-ÿ Íýȧÿ.ÿ ÍþÀÿ0ÿ Íý̳ÿ1ÿ ÍýȦÿ2ÿÍýÄÇÿ3ÿÍþ¾ÿ5ÿÍþ¶ÿ6ÿÍýË®ÿ7ÿÍýɧÿ8ÿÍýÅ¡ÿ9ÿÍþÀÿ;ÿý͹ÿ<ÿþ²ÿýÿþ«ÿ<ÿýºÍÿ:ÿû¥ÆÍÍÿ9ÿýµÌÍÍ8ÿý¡ÂÍÍ7ÿý®ÊÍÍ6ÿþ½ÍÍ4ÿý¨ÈÍÍ3ÿý¸ÌÍÍ1ÿý£ÄÍ Í0ÿý¯ËÍ Í/ÿþ¹Í Í-ÿýõÂÍÍ,ÿý¥ÇÍÍ+ÿý®ËÍÍ*ÿþ¸ÍÍ)ÿþÁÍÍ'ÿý£ÇÍÍ&ÿý¬ËÍÍ%ÿþ¶ÍÍ$ÿþ¿ÍÍ"ÿý¢ÆÍÍ!ÿý«ÊÍÍ ÿýô¾ÿ;ÿþÙÿ;ÿýö½ÿ;ÿýç¯ÿ:ÿýþÑÿ;ÿýõ¼ÿ;ÿýå³ÿ:ÿýýÏÿ;ÿýôºÿ;ÿýãÈÿ:ÿýýÍÿ;ÿýó¹ÿ;ÿýâÞÿ:ÿýýËÿ;ÿýò¸ÿ;ÿþàÿ;ÿýüÊÿ;ÿýò¶ÿ;ÿýèÈÿ;ÿþÜÿ;ÿýþÎÿ;ÿýûÂÿ;ÿýõ·ÿ;ÿýì¯ÿ;ÿþâÿ<ÿþÔÿ<ÿþÇÿýÿþ½ÿ<ÿýÖþÿ:ÿýµîÿ;ÿýÌüÿ:ÿý¯åÿ;ÿýÂøÿ;ÿþÛÿ;ÿý¹òÿ;ÿýÑþÿ:ÿý²êÿ;ÿýÃúÿ;ÿþÔÿ;ÿýôäÿ;ÿý´ñÿ;ÿýÁúÿ;ÿýÑþÿ;ÿþâÿ;ÿý²ïÿ;ÿý¾ùÿ;ÿýÎþÿ;ÿþßÿ;ÿý±íÿ;ÿý¼÷ÿÿÿþýÿ;ÿüÛy9ÿ9ÿúÆh422ÿ7ÿý°X226ÿýšJ223ÿüñ‡?221ÿü×u82 2/ÿüÊd42 2-ÿüÖh32 2+ÿüás522)ÿüø822(ÿý‹<22&ÿý™A22$ÿý¦G22"ÿýµP22 ÿýÃY22ÿüÐc322ÿüÝn422ÿüíz62 2ÿýŽ:2"2ÿýÀM2$2ÿüñp32%2ÿýž>2'2ÿýÏW2)2ÿý52*2ÿý¯D2,2 ÿýÝc2.2 ÿý92/2 ÿýÀM212ÿüñp3222ÿýž>242ÿýÏV262ÿýˆ6272ÿýÚV292ÿý :2:2ýøg2<2þB2{2ý4o2:2û3fÓü292ý]Çüü82ýSºüü62ýK­üü42üDŸúüü22ü?“öüü02ü:ˆðü ü.2ü7|èü ü,2ü5qßüü*2ü3gÕüü)2ýK¼üü'2ü8‹÷üü&2ýaÛüü$2ýC¬üü"2ü5|ðüü!2ýUÍüü2ý=›üü2ü3nçüü2ýK½üü2ü8Œ÷ü ü2ýaÛü"üÿþýÿ;ÿüâ‹Sÿ9ÿúÏ|NLLÿ7ÿý¼nLL6ÿý¨aLL3ÿüô—XLL1ÿüÞ‡QL L/ÿüÓyML L-ÿýÝ|LL+ÿüç†NLL)ÿüúQLL(ÿý›TLL&ÿý§YLL$ÿý³_LL"ÿýÀfLL ÿýÍnLLÿýØxLLÿüäMLLÿüñŒPL LÿýžTL"LÿýÊdL$LÿüôƒML%Lÿý«VL'Lÿý×mL)LÿýOL*Lÿý»\L,L ÿýäwL.L ÿýRL/L ÿýÊdL1LÿýôƒL3Lÿý«VL4Lÿý×lL6Lÿý™OL7LÿýálL9Lÿý®SL:Lýú{Ln­òüü252ûI|¿ûüü22û4TŒÒüü/2û7a›åü ü,2û>n­òü ü)2ûI|¾ûüü&2ü@|Ïüü#2û5c¯øüü!2üMçüü2ü=vÈüü2û4^§öüü2üIŠàü!ü2ü:pÀü$ü2û3Y ñü&ü2ü;}Úü)ü2üCïü+ü 2üP¤øü-ü 2ü3_ºü0ü2ü6nÏü2ü2ü<áü4ü2üE’ðü6ü2üQ¦úü8üü3a¼ü;üþÑü~ü ÿüß“[L0Lÿý¬mL3LÿüÕƒSL5LÿýÀqL8Lÿý­dL:Lý›ZLzLüQs›L8LùW¹÷ÿÿL5Lû`ŽÉþÿÿ2LûMk›Úÿÿ/LûQu©êÿ ÿ,LûW¹÷ÿ ÿ)Lû`ŽÈþÿÿ&LüXŽ×ÿÿ#LûOx»üÿÿ!Lüd ìÿÿLüUˆÑÿÿLûNs´úÿÿLü`šæÿ!ÿLüSƒÊÿ$ÿLûMn®öÿ&ÿLüTáÿ)ÿLü[Ÿóÿ+ÿ Lüf±üÿ-ÿ LýtÄÿ0ÿLüO×ÿ2ÿLüUçÿ4ÿLü]¡ôÿ6ÿLüh³ýÿ8ÿüMuÇÿ;ÿþÙÿ~ÿ ÿü£¹ÉÍ0Íÿý²ÄÍ3Íÿü¦½ËÍ5Íÿý¬ÃÍ8Íÿý±ÆÍ:Íý¶ÉÍzÍüÌ·Í8Íùʾ®œššÍ5ÍüǺ©šš3Íüͤšš/ÍûÌÁ² š š,Íûʾ®œš š)ÍüǺªšš&Íüɺ¥šš#ÍûÌÁ­›šš!ÍüƵŸššÍüʼ§ššÍû̯œššÍüÇ·¡š!šÍü˽©š$šÍüñš&šÍü˺£š)šÍüɵš+š Íüư›š-š Íý«š0šÍü̾¥š2šÍüʹ¡š4šÍüȵš6šÍüŰ›š8šüÍÁªš;šþ¥š~š ÿü²Óôÿ9ÿýÇèÿ9ÿü¶Ûúÿ9ÿý¾æÿ:ÿýÆîÿ:ÿýÏõÿzÿüûåÏÿ8ÿù÷ÜÁª§§ÿ5ÿüñÖº§§2ÿûþêÏ´§§/ÿûüãÈ®§ §,ÿû÷ÜÁª§ §)ÿüñÖ»§§&ÿüöÖµ§§#ÿûýâÀ¨§§!ÿüîÍ­§§ÿüøÙ·§§ÿûþåé§§ÿüñϯ§!§ÿüúÛº§$§ÿûþèÆª§&§ÿüùÕ±§)§ÿüôÍ«§+§ ÿüíŨ§-§ ÿýä¼§0§ÿüýܵ§2§ÿüøÔ¯§4§ÿüó̪§6§ÿüìĨ§8§üþã»§;§þ´§~§ù2ø6DTfy¥2.2ö:IZl€•­Çåüü'2÷>Xr†µÐîüü!2ù8Pm¶äüü2ø4Id…ªÖûüü2ùA\{žÈôü!ü2úCi“ºéü'ü 2ûHoŸÛü,ü2ú4Nv§äü0ü2ú5S|¯ìü4üù28Y„¸ñü8üýÀ÷ü ;üýñßü3üöö×¹ž…oZH822ùLøO\k{‹ž²L.LöS`p‘¤¹Ðêÿÿ'L÷Wn…—«ÀØòÿÿ!LùQgžÁéÿÿLøN`y•¶ÝþÿÿLùYq¬Ñøÿ!ÿLú[}¢Åîÿ'ÿ Lû_‚­âÿ,ÿLúMeˆ´éÿ0ÿLúOiŽ»ðÿ4ÿùLQn•Âöÿ8ÿýÊûÿ ;ÿýöæÿ3ÿöúÞë•‚p_QLLùÍøÌÈÄÀ»¶°Í.ÍöËÇþ¹´®§ šš'Í÷Êý¸²¬¥žšš!ÍùÌž¶¬ ššÍùÌÇÀ¸¯¤ššÍùÉ»²§œš!šÍúÉ¿µ«Ÿš'š ÍûǾ±¢š,š ÍûƼ¯ š0šÍúÌź­žš4šùÍÌø«š8šý©›š ;šý¡š3šöœ£«²¸¾ÃÇÌÍÍùÿøýóêà×ÍÄÿ.ÿöúñçÞÔËÁ¸®§§'ÿ÷÷èÚÑǾ´«§§!ÿùûìÝ;®§§ÿùþñáÒ³§§ÿùõæÖÇ·©§!§ÿúôß̼­§'§ ÿûñÜÆ±§,§ÿúþîÙî§0§ÿúýëÖÀ¬§4§ùÿûèÒ½ª§8§ýº¨§ ;§ýª°§3§ö©²½ÇÒÜçñûÿÿ…2Ô38=CIOV\cjqy€ˆ™¢«®©¤ž™”‹…|xtokgc_[WSPJ>322ú¿ÏÚåñü(üóúáɳž‹yiYK>3229üùøáȲž‹ü ü÷û÷ôðíêíøü!üêͽ®Ÿ’…ymcXND?=<:8754322î6ÿüõÏÞÿ=ÿüûزÿ=ÿüþâ»ÿ>ÿýìÄÿ>ÿýôÎÿ>ÿüú×±ÿ=ÿüþàµÿ=ÿüþàµÿ=ÿüþà´ÿ=ÿüþß´ÿ=ÿüþß³ÿ=ÿüþÞ³ÿ=ÿþþÿÿÿýÕòÿ<ÿ§ü·Ôñÿ9ÿ§ü¶Óðÿ6ÿ§üµÔõÿ3ÿ §û¨Àâýÿ0ÿ §ü®Ïñÿ.ÿ§ü»Ýûÿ+ÿ§ü«Éìÿ)ÿ§üµØøÿ&ÿ§ü©Åìÿ$ÿ§ü»ãþÿ!ÿ§ü³Ùûÿÿ§ü­Ðõÿÿ§ü¨Æíÿÿ"§ü¼äþÿÿ$§ü´Úüÿÿ&§ü°Ùýÿÿ(§ü°Úýÿÿ*§ü±Ûýÿÿ,§ü±Üýÿÿ.§ü²Üýÿ ÿ0§ü²Ýþÿ ÿ2§ý³ßÿ ÿ4§ý¹êÿÿ6§ýÄóÿÿ7§ü©Ïúÿÿ9§ü®Ûþÿÿ;§û¶çÿÿ§<§ýÁñ§=§þ¨§ÿ§@ÿýlÖÿ<ÿû24m×ÿ:ÿ2ü5tèÿ8ÿ2ý;ÿ7ÿ2ýF©ÿ5ÿ2ýVÅÿ3ÿ 2ü3kÞÿ1ÿ 2ý8‚ÿ0ÿ 2ýAÿ.ÿ2ýNºÿ,ÿ2ýcØÿ*ÿ2ý7‰ÿ)ÿ2ýLÁÿ'ÿ2ý3uÿ&ÿ2ýA«ÿ$ÿ2ýbÞÿ"ÿ2ý9“ÿ!ÿ2ýRËÿÿ2ý5~ÿÿ2ýFµÿÿ!2þmÿÿ"2ýE¾ÿÿ#2ý4€ÿÿ%2ýPÑÿÿ&2ý7”ÿÿ(2ý]áÿÿ)2ý=«ÿÿ+2þoÿÿ,2ýF¿ÿÿ-2ý4‚ÿÿ/2ýTßÿ ÿ02ý>¸ÿ ÿ12ý4ˆÿ ÿ32ý_õÿÿ42ýDÆÿÿ52ý6˜ÿÿ72þkÿÿ82ýKÓÿÿý<262ý:¨ÿÿûüèu4262þyÿÿüýÄM262üXñÿüüüøŒ7252ýGÓüüýØ\252þ<üüý¢>242üüèn3222 üýºH212 üüô‚52/2 üýÏQ2.2üüú‡52,2üýÆI2+2üüòu32)2@ÿýÝÿ<ÿûLNÞÿ:ÿLüN‡ìÿ8ÿLýTÿ7ÿLý]µÿ5ÿLýlÎÿ3ÿ Lýåÿ1ÿ LýQ“ÿ0ÿ LýY«ÿ.ÿLýeÅÿ,ÿLýwßÿ*ÿLýP™ÿ)ÿLýcËÿ'ÿLýM‡ÿ&ÿLýY·ÿ$ÿLývåÿ"ÿLýS¢ÿ!ÿLýhÔÿÿLýNÿÿLý]Àÿÿ!Lþÿÿ"Lý]Èÿÿ#LýM‘ÿÿ%LýfÙÿÿ&LýQ£ÿÿ(Lýrçÿÿ)LýV·ÿÿ+Lþ‚ÿÿ,Lý]Éÿÿ-LýM“ÿÿ/Lýkæÿ ÿ0LýWÂÿ ÿ1LýM™ÿ ÿ3Lýt÷ÿÿ4Lý\Ïÿÿ5LýP¦ÿÿ7Lþÿÿ8LýcÛÿÿý TL6LýSµÿÿüí‡ML6Lþ‹ÿÿýÎdL6Lýmôÿÿüü›QL5Lý_ÛÿÿýßqL5LþUÿÿý¯WL4LÿýíL3L ÿýÄ_L1L ÿüø“OL/L ÿý×hL.Lÿüý—NL,LÿýÏ`L+Lÿý÷‡L*L@ÿý¾¤ÿ<ÿûÍ̾£ÿ:ÿÍü̼©ÿ8ÿÍý˶ÿ7ÿÍýȯÿ5ÿÍýĨÿ3ÿ Íý¿¢ÿ1ÿ Íý̹ÿ0ÿ Íýɲÿ.ÿÍýÆ«ÿ,ÿÍýÁ£ÿ*ÿÍýÌ·ÿ)ÿÍýÆ©ÿ'ÿÍþ¼ÿ&ÿÍýɯÿ$ÿÍýÁ¢ÿ"ÿÍý˵ÿ!ÿÍýŦÿÿÍý̺ÿÿÍýȬÿÿ!Íþ¾ÿÿ"ÍýȪÿÿ$Íþ¹ÿÿ%ÍýÆ¥ÿÿ&ÍýÌ´ÿÿ(Íý¡ÿÿ)Íýʯÿÿ+Íþ¾ÿÿ,ÍýÈ©ÿÿ.Íþ¹ÿÿ/ÍýÄ¡ÿ ÿ0ÍýÊ«ÿ ÿ2Íþ·ÿ ÿ3ÍýÂÕÿÿ4ÍýȨÿÿ5Íý̳ÿÿ7Íþ¿ÿÿ8ÍýǤÿÿýµËÍ6Íý˯ÿÿüšŸ¼Í7Íþ»ÿÿšý¨ÆÍ6ÍüÄÇÿššü›¶ÌÍ5ÍýȤššý£ÂÍ5ÍþÊššý±ÊÍ4ÍšýŸ¾Í3Í šý«ÇÍ1Í šüœ¹ÌÍ/Í šý¥ÅÍ.Íšü›¸ÌÍ,Íšý¨ÇÍ+Íšýœ¼Í*Í@ÿýÞ³ÿ=ÿüþݲÿ=ÿüýÙ³ÿ=ÿýùÎÿ>ÿýóÃÿ>ÿýé¸ÿ>ÿýÞ°ÿ=ÿýûÓÿ>ÿýöÇÿ>ÿýí¼ÿ>ÿýâ²ÿ=ÿýüÐÿ>ÿýïºÿ=ÿýþÙÿ>ÿýõÂÿ>ÿýã°ÿ=ÿýúÌÿ>ÿýë¶ÿ=ÿýýÕÿ>ÿýó¾ÿ>ÿþÝÿ>ÿýó»ÿ=ÿýþÔÿ>ÿýí´ÿ=ÿýüËÿ>ÿýå¯ÿ=ÿýøÂÿ>ÿþÜÿ>ÿýóºÿ=ÿýþÓÿ>ÿýê°ÿ=ÿý÷½ÿ=ÿýþÐÿ>ÿýäÓÿ=ÿýó¸ÿ=ÿýüÊÿ>ÿþÞÿ>ÿýï³ÿÿýÍùÿ6ÿýúÃÿÿû§­Ùþÿ6ÿþ×ÿÿ§ý¹îÿ6ÿüèÈÿ§§ü¨Ïüÿ5ÿýò³§§ý²æÿ5ÿþø§§ýÅ÷ÿ4ÿ§ý­Üÿ3ÿ §ý¼ñÿ1ÿ §ü©Óýÿ/ÿ §ýµìÿ.ÿ§ü¨Ñýÿ,ÿ§ý¸ñÿ+ÿ§ýªÙÿ*ÿÿýøi212ý4”ÿ ÿýž7212þ„ÿ ÿýËG212þvÿ ÿþd212þkÿ ÿý5202þaÿ ÿý¾A202þXÿ ÿýåY202þPÿ ÿý32/2 ÿý±<2.2ÿýÛQ2-2ÿþt2,2ÿý£82*2ÿýÏI2)2ÿýøZ2(2ÿþr2'2ÿý42%2ÿý®92$2ÿýÊC2#2ÿýáQ2"2ÿþf2!2ÿþ2 2ÿý 622ÿý½=22ÿýØJ22 ÿýý[22"ÿþm22#ÿþ|22$ÿþˆ22%ÿý”322&ÿý¡522'ÿý­722(ÿýº922)ÿýÄ=22*ÿýÎA22+ÿýØF22,ÿýáK22-ÿýñR22/ÿþY2 20ÿþa2 21ÿþa2 22ÿþ_2 23ÿþ\2 24ÿþY225ÿþX226ÿþU227ÿþS228ÿþQ228ÿýøO229ÿýñM22:ÿýèK22;ÿûäJ22ÿ;ÿüáH2ÿ<ÿýÚ@ÿ=ÿþÉÿ>ÿþºÿ=ÿý5œÿ<ÿ2þ~ÿ;ÿ2þcÿ:ÿ2ýPàÿ8ÿ2ýBÉÿ7ÿ2ý8­ÿ6ÿ2ý3Žÿ5ÿ2þqÿ4ÿÿýú}L1LýM£ÿ ÿý«QL1Lþ•ÿ ÿýÔ_L1Lþ‰ÿ ÿþxL1Lþÿ ÿýžNL0Lþvÿ ÿýÈYL0Lþnÿ ÿýêoL0Lþgÿ ÿý’ML/L ÿý½UL.LÿýâgL-Lÿþ†L,Lÿý°RL*Lÿý×`L)LÿýúpL(Lÿþ…L'LÿýŸML%LÿýºRL$LÿýÓ[L#LÿýçhL"LÿþzL!Lÿþ’L Lÿý®OLLÿýÇVLLÿýßaLL ÿýýpLL"ÿþ€LL#ÿþLL$ÿþ˜LL%ÿý£MLL&ÿý®NLL'ÿý¹PLL(ÿýÄSLL)ÿýÎULL*ÿýÖYLL+ÿýß]LL,ÿýçcLL-ÿýôhLL/ÿþoL L0ÿþvL L1ÿþvL L2ÿþtL L3ÿþqL L4ÿþoLL5ÿþmLL6ÿþkLL7ÿþiLL8ÿþgLL8ÿýúfLL9ÿýôdLL:ÿýìcLL;ÿûéaLLÿ;ÿüç_Lÿ<ÿýáXÿ=ÿþÒÿ>ÿþÄÿ=ÿýOªÿ<ÿLþÿ;ÿLþxÿ:ÿLýfæÿ8ÿLýZÒÿ7ÿLýR¹ÿ6ÿLýMžÿ5ÿLþ„ÿ4ÿÿýà¿Í2Íþ´ÿ ÿý²ÌÍ1Íþ¸ÿ ÿý¦ÈÍ1Íþ¼ÿ ÿþÀÍ1Íþ¿ÿ ÿý¶ÌÍ0ÍþÁÿ ÿýªÉÍ0ÍþÃÿ ÿý ÃÍ0ÍþÅÿ ÿþ¹Í0Í ÿý­ÊÍ.Íÿý¢ÅÍ-Íÿþ¼Í,Íÿý±ËÍ*Íÿý¥ÇÍ)ÍÿýàÃÍ(Íÿþ½Í'ÍÿþµÍ&Íÿý®ËÍ$Íÿý§ÉÍ#Íÿý¡ÅÍ"ÍÿþÀÍ!Íÿþ¹Í Íÿý±ÌÍÍÿýªÊÍÍÿý£ÇÍÍ ÿýõÃÍÍ"ÿþ¾ÍÍ#ÿþºÍÍ$ÿþ·ÍÍ%ÿþ´ÍÍ&ÿý±ÌÍÍ'ÿý®ÌÍÍ(ÿý«ËÍÍ)ÿý¨ÊÍÍ*ÿý¦ÉÍÍ+ÿý£ÈÍÍ,ÿý¡ÇÍÍ-ÿýÇÅÍÍ/ÿþÃÍ Í0ÿþÁÍ Í1ÿþÁÍ Í2ÿþÂÍ Í3ÿþÂÍ Í4ÿþÃÍÍ5ÿþÄÍÍ6ÿþÄÍÍ7ÿþÅÍÍ8ÿþÅÍÍ8ÿýàÆÍÍ9ÿýÇÆÍÍ:ÿý©ÇÍÍ;ÿû ÇÍÍÿ;ÿü¡ÇÍÿ<ÿý£Éÿ=ÿþ§ÿ>ÿþ«ÿ=ÿý̲ÿ<ÿÍþºÿ;ÿÍþÁÿ:ÿÍýÆ¡ÿ8ÿÍýɧÿ7ÿÍýË®ÿ6ÿÍþ¶ÿ5ÿÍþ½ÿ4ÿÿýÞßÿ1ÿýþËÿ ÿýÇüÿ1ÿþÒÿ ÿý¶òÿ1ÿþØÿ ÿþâÿ1ÿþÞÿ ÿýÍýÿ0ÿþãÿ ÿý»õÿ0ÿþèÿ ÿý®çÿ0ÿþìÿ ÿýÔþÿ=ÿýÀøÿ=ÿý±ìÿ>ÿþÚÿ>ÿýÅûÿ=ÿýµñÿ=ÿýÞçÿ>ÿþÚÿ>ÿýÍþÿ=ÿýÁûÿ=ÿý·ôÿ=ÿý¯ìÿ>ÿþáÿ>ÿþÔÿ>ÿýÆýÿ=ÿý»øÿ=ÿý²ðÿ=ÿýôæÿ>ÿþÝÿ>ÿþÖÿ>ÿþÐÿ>ÿýËþÿ=ÿýÆýÿ=ÿýÁüÿ=ÿý¼úÿ=ÿý¹øÿ=ÿýµöÿ=ÿý²óÿ=ÿý¯ïÿ=ÿýÈëÿ>ÿþçÿ>ÿþãÿ>ÿþãÿ>ÿþäÿ>ÿþæÿ>ÿþçÿ>ÿþèÿ>ÿþêÿ>ÿþëÿ>ÿþìÿ=ÿýÞíÿ=ÿýÈîÿ=ÿý³ïÿ=ÿý®ðÿ=ÿý¯ñÿ=ÿý±öÿ=ÿþ·ÿ>ÿþ¼ÿ=ÿýýÈÿ>ÿþÕÿ>ÿþâÿ>ÿýí¯ÿ=ÿýõ·ÿ=ÿýûÁÿ=ÿýþÎÿ>ÿþÛÿ4ÿ€ÿþíÿ=ÿýJÞÿ<ÿü2DÕÿ;ÿ2ý?Êÿ:ÿ2ý;¿ÿ9ÿ2ý8³ÿ8ÿ2ý5¦ÿ7ÿ2ý4™ÿ6ÿ2þÿ5ÿ2þÿ4ÿ 2þ”ÿ3ÿ 2ý3™ÿ2ÿ 2ý3žÿ1ÿ 2ý4¡ÿ0ÿ 2ý4¥ÿ/ÿ 2ý5ªÿ.ÿ2ý5­ÿ-ÿ2ý6±ÿ,ÿ2ý7µÿ+ÿ2ý7ºÿ*ÿ2ý8¼ÿ)ÿ2ý9Àÿ(ÿ2ý:Äÿ'ÿ2ý<Ëÿ&ÿ2ýAÛÿ%ÿ2ýJõÿ$ÿ2þUÿ$ÿ2þdÿ#ÿ2þvÿ"ÿ2þ‹ÿ!ÿ2ý3 ÿ ÿ2ý5¶ÿÿ2ý9Èÿÿ2ý@Úÿÿ2ýIñÿÿ 2þTÿÿ!2þbÿÿ"2þsÿÿ#2þ‰ÿÿ#2ý3«ÿÿ$2ý9Îÿÿ%2ýFõÿÿ&2þ[ÿÿ'2þyÿÿ(2þŸÿÿ(2ý7Äÿÿ)2ýAáÿÿþ:2(2þSÿÿý·52(2þoÿÿý£32(2þ”ÿÿþ2(2ý5ºÿÿþx2(2ý=Úÿÿþf2(2þMÿÿþX2(2þfÿÿýýL2(2þ‰ÿÿýÞC2'2ý4½ÿÿýÏ<2'2ýBñÿÿý½72'2þaÿ ÿ€ÿþñÿ=ÿýaåÿ<ÿüL\Üÿ;ÿLýWÓÿ:ÿLýTÉÿ9ÿLýQ¾ÿ8ÿLýO³ÿ7ÿLýM§ÿ6ÿLþžÿ5ÿLþ ÿ4ÿ Lþ£ÿ3ÿ Lþ¨ÿ2ÿ LýM«ÿ1ÿ LýM®ÿ0ÿ LýM²ÿ/ÿ LýN¶ÿ.ÿLýO¹ÿ-ÿLýO½ÿ,ÿLýPÀÿ+ÿLýQÄÿ*ÿLýRÇÿ)ÿLýSÊÿ(ÿLýTÎÿ'ÿLýTÔÿ&ÿLýYâÿ%ÿLýa÷ÿ$ÿLþkÿ$ÿLþxÿ#ÿLþˆÿ"ÿLþ›ÿ!ÿLþ®ÿ ÿLýOÁÿÿLýSÑÿÿLýXáÿÿLý`ôÿÿ Lþjÿÿ!Lþvÿÿ"Lþ†ÿÿ#Lþ™ÿÿ$Lþ·ÿÿ$LýRÖÿÿ%Lý^÷ÿÿ&Lþpÿÿ'Lþ‹ÿÿ(Lþ­ÿÿ(LýPÎÿÿ)LýYçÿÿþSL(LþiÿÿýÂOL(Lþ‚ÿÿþ°L)Lþ£ÿÿþL(LýNÄÿÿþŠL(LýVáÿÿþzL(LþdÿÿþmL(LþzÿÿýýcL(Lþ™ÿÿýå[L'LýNÇÿÿý×TL'LýZôÿÿýÇPL'Lþvÿ ÿ€ÿþ¸ÿ=ÿýÇ¢ÿ<ÿüÍȤÿ;ÿÍýʧÿ:ÿÍýË©ÿ9ÿÍý̬ÿ8ÿÍý̰ÿ7ÿÍþ³ÿ6ÿÍþ¶ÿ5ÿÍþµÿ4ÿ Íþ´ÿ3ÿ Íþ³ÿ2ÿ Íþ²ÿ1ÿ Íþ±ÿ0ÿ Íþ°ÿ/ÿ Íý̯ÿ.ÿÍýÌ®ÿ-ÿÍýÌ­ÿ,ÿÍý̬ÿ+ÿÍýÌ«ÿ*ÿÍý˪ÿ)ÿÍýË©ÿ(ÿÍý˨ÿ'ÿÍý˦ÿ&ÿÍýÉ¢ÿ%ÿÍýÇÕÿ$ÿÍþÄÿ$ÿÍþÀÿ#ÿÍþ¼ÿ"ÿÍþ·ÿ!ÿÍþ±ÿ ÿÍý̬ÿÿÍý˧ÿÿÍýÉ£ÿÿÍÇÿ ÍþÄÿÿ!ÍþÁÿÿ"Íþ½ÿÿ#Íþ·ÿÿ$Íþ¯ÿÿ$Íý˦ÿÿ%ÍýÈÕÿÿ&ÍþÃÿÿ'Íþ»ÿÿ(Íþ±ÿÿ(Íý̨ÿÿ)ÍýÉ¡ÿÿþËÍ(ÍþÅÿÿý«ÌÍ(Íþ¾ÿÿþ±Í)Íþ´ÿÿþ¶Í(ÍýÌ«ÿÿþ»Í(ÍýÊ£ÿÿþÀÍ(ÍþÆÿÿþÄÍ(ÍþÀÿÿýõÆÍ(Íþ·ÿÿý¢ÉÍ'Íý̪ÿÿý¥ËÍ'ÍýÉÇÿÿýªÌÍ'ÍþÁÿ ÿ€ÿþ½ÿ=ÿýð°ÿ=ÿýô³ÿ=ÿý÷·ÿ=ÿýùºÿ=ÿýû¿ÿ=ÿýýÄÿ=ÿýþÉÿ>ÿþÍÿ>ÿþÍÿ>ÿþËÿ>ÿþÉÿ=ÿýþÇÿ=ÿýþÆÿ=ÿýþÄÿ=ÿýýÂÿ=ÿýýÁÿ=ÿýýÀÿ=ÿýü¾ÿ=ÿýü¼ÿ=ÿýû»ÿ=ÿýúºÿ=ÿýù¹ÿ=ÿýù¶ÿ=ÿýö±ÿ=ÿýðÓÿ=ÿþêÿ>ÿþâÿ>ÿþÙÿ>ÿþÏÿ>ÿþÆÿ=ÿýý¾ÿ=ÿýú·ÿ=ÿýö±ÿ=ÿýñÈÿ=ÿþêÿ>ÿþãÿ>ÿþÚÿ>ÿþÐÿ>ÿþÂÿ=ÿýûµÿ=ÿýòÓÿ=ÿþæÿ>ÿþ×ÿ>ÿþÆÿ=ÿýü¹ÿ=ÿýõ¯ÿÿþúÿ(ÿþëÿÿý½ýÿ(ÿþÜÿÿþÅÿ)ÿþËÿÿþÎÿ(ÿýý¼ÿÿþØÿ(ÿýø±ÿÿþáÿ(ÿþîÿÿþèÿ(ÿþáÿÿýôïÿ(ÿþÐÿÿý°ôÿ'ÿýþ»ÿÿýµùÿ'ÿýõÈÿÿý»üÿ'ÿþãÿ ÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ5‡õ‹œ®¶°«¥Ÿš’‡1‡ûŽ¡³ÂÃÃþ²‡.‡ý‰®Ã Ã.‡ý·Ã Ã-‡ý“½ÃÃ,‡ý›ÁÃÃ+‡þ›ÃÃ*‡ýˆ»ÃÃ*‡þŸÃÃ)‡ý‰½ÃÃ)‡þ¡ÃÃ(‡ýоÃÃ(‡þšÃÃ(‡þ£ÃÃ(‡þ¬ÃÃ(‡þ´ÃÃ(‡þ½ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ6ÓöÕÖ×ÖÖÕÕÔÔÓ1ÓüÔÕÖØØþÖÓ/ÓþÖØ Ø/Óþר Ø-ÓýÔרØ,ÓþÕØØ+ÓþÕØØ+ÓþרØ*ÓþÕØØ*ÓþרØ)ÓþÕØØ)ÓþרØ(ÓþÕØØ(ÓþÕØØ(ÓþÖØØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ5DõA2! %).3;D1Dû>-þD.DýB! .Dý? -Dý9,Dý2+Dþ2*DýC*Dþ/)DýC)Dþ-(DýB(Dþ3(Dþ+(Dþ$(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ1‡þžÃ Ã1‡ýˆºÃ Ã2‡þšÃ Ã3‡þ·Ã Ã3‡þ—à Ã4‡þ³ÃÃ4‡þ“ÃÃ5‡þ¯ÃÃ5‡þÃÃ6‡þ¬ÃÃ6‡ýŽÁÃÃ7‡þ¨ÃÃ7‡ý‹ÀÃÃ8‡þ¥ÃÃ8‡ýоÃÃ9‡þ¡ÃÃ9‡ýˆ¼ÃÃþ’‡8‡þÃÃý®‡7‡þ¹ÃÃü©‹‡5‡þ™ÃÃý·‰‡5‡þ¶ÃÃþ®‡5‡þ–ÃÃþ£‡5‡þ²ÃÃþ™‡4‡þ“ÃÃýÀ‡4‡þ¯ÃÃþ´‡4‡þÃÃþ˜‡4‡Ãþ¸‡4‡ Ãþ›‡3‡ Ãý»ˆ‡2‡ ÃþŸ‡2‡ Ãý½‰‡1‡ Ãþ£‡1‡ Ãý¿‹‡0‡ Ãþ¦‡0‡ ÃýÁ‡/‡ Ãþª‡/‡ Ãý‡.‡Ãþ®‡.‡Ãþ’‡-‡Ãþ±‡-‡Ãþ•‡,‡Ãþµ‡,‡Ãþ™‡+‡Ãþ¸‡+‡Ãþœ‡*‡Ãý»ˆ‡)‡Ãþ ‡)‡Ãý¾‰‡(‡Ãþ¤‡(‡ÃýÀ‹‡'‡Ãþ§‡'‡ÃýÁ‡&‡Ãþ«‡&‡Ãý‡%‡Ãþ¯‡%‡Ãþ“‡$‡Ãþ²‡$‡Ãþ–‡#‡Ãþ¶‡#‡Ãþ™‡"‡Ãþ¹‡"‡Ãþ‡!‡Ãý¼ˆ‡ ‡1ÓþÕØ Ø2Óþר Ø2ÓþÕØ Ø3Óþר Ø3ÓþÔØ Ø4ÓþÖØØ4ÓþÔØØ5ÓþÖØØ5ÓþÔØØ6ÓþÖØØ6ÓþÔØØ7ÓþÖØØ8ÓþרØ8ÓþÕØØ9ÓþרØ9ÓþÕØØ:ÓþרØþÔÓ8ÓþÕØØýÖÔÓ7ÓþרØþÖÓ6ÓþÔØØþ×Ó6ÓþרØþÖÓ5ÓþÔØØþÕÓ5ÓþÖØØþÔÓ4ÓþÔØØý×ÔÓ4ÓþÖØØþ×Ó4ÓþÔØØþÔÓ4ÓØþ×Ó4Ó ØþÕÓ3Ó Øþ×Ó3Ó ØþÕÓ2Ó Øþ×Ó2Ó ØþÕÓ1Ó Øþ×Ó1Ó ØþÕÓ0Ó Ø1Ó ØþÖÓ/ÓØþÔÓ.ÓØþÖÓ.ÓØþÔÓ-ÓØþÖÓ-ÓØþÔÓ,ÓØþ×Ó,ÓØþÔÓ+ÓØþ×Ó+ÓØþÕÓ*ÓØþ×Ó*ÓØþÕÓ)ÓØþ×Ó)ÓØþÕÓ(ÓØþ×Ó(ÓØþÖÓ'ÓØ(ÓØþÖÓ&ÓØþÔÓ%ÓØþÖÓ%ÓØþÔÓ$ÓØþÖÓ$ÓØþÔÓ#ÓØþ×Ó#ÓØþÔÓ"ÓØþ×Ó"ÓØþÕÓ!ÓØþ×Ó!Ó1Dþ0 1DýC 2Dþ3 3Dþ 3Dþ6 4Dþ4Dþ95Dþ 5Dþ<6Dþ#6Dý>7Dþ'7Dý@8Dþ*8DýA9Dþ-9DýCþ:D8Dþ0ý"=D7Dþü&@D5Dþ4ýBD5Dþþ!D5Dþ7þ+D5Dþþ5D4Dþ:ýD Dü„ÿÿDDý="þ#D DüWÿÿDDþ%#þDDý>"þ#DDþ&#þ;DDý?"þDDþ)#þ8DDýA"þDD&ÿþÍÿ=ÿþøÿ>ÿþÒÿ=ÿþûÿ>ÿþØÿ=ÿýýÕÿ=ÿþÝÿ=ÿýþµÿ=ÿþâÿ>ÿþ¹ÿ=ÿþèÿ>ÿþ¾ÿ=ÿþíÿ>ÿþÄÿ=ÿþñÿ>ÿþÉÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿ>ÿþÔÿ=ÿþûÿ>ÿþÙÿ=ÿýýÌÿ=ÿþÞÿ=ÿýþ¶ÿ=ÿþäÿ>ÿþºÿ=ÿþéÿ>ÿþÀÿ=ÿþîÿ>ÿþÅÿ=ÿþòÿ>ÿþÊÿ=ÿþöÿ>ÿþÏÿ=ÿþùÿ>ÿþÕÿ=ÿýûôÿ=ÿþÚÿ=ÿýý¸ÿ=ÿþàÿ=ÿýþ·ÿ=ÿþåÿ>ÿþ»ÿ=ÿþêÿ>ÿþÁÿ=ÿþïÿ?ÿ ÀÿþÇÿ=ÿþ’ÿ=ÿý‡Àÿ<ÿý‡Žÿ<ÿ‡þ¸ÿ;ÿ‡þŒÿ;ÿ‡þ²ÿ:ÿ‡ýŠúÿ9ÿ‡þ«ÿ9ÿ‡ýˆåÿ8ÿ‡þ¥ÿ8ÿ‡þÝÿ7ÿ‡þŸÿ7ÿ‡þÕÿ6ÿ‡þšÿ6ÿ‡þÍÿ5ÿ‡þ•ÿ5ÿ Àÿþëÿ=ÿþ×ÿ=ÿýÓèÿ<ÿýÓÖÿ<ÿÓþåÿ;ÿÓþÕÿ;ÿÓþãÿ:ÿÓýÔýÿ9ÿÓþáÿ9ÿÓþöÿ8ÿÓþÞÿ8ÿÓþóÿ7ÿÓþÜÿ7ÿÓþñÿ6ÿÓþÚÿ6ÿÓþíÿ5ÿÓþØÿ5ÿ Àÿþsÿ=ÿþLÿ=ÿýDnÿ<ÿýDIÿ<ÿDþhÿ;ÿDþHÿ;ÿDþcÿ:ÿDýFèÿ9ÿDþ^ÿ9ÿDýE‰ÿ8ÿDþZÿ8ÿDþ„ÿ7ÿDþVÿ7ÿDþ~ÿ6ÿDþRÿ6ÿDþwÿ5ÿDþNÿ5ÿ ÀÿþÆÿ=ÿþóÿ>ÿþËÿ=ÿþ÷ÿ>ÿþÑÿ=ÿþùÿ>ÿþÖÿ=ÿýüêÿ=ÿþÛÿ=ÿýþ³ÿ=ÿþáÿ>ÿþ¸ÿ=ÿþæÿ>ÿþ¼ÿ=ÿþëÿ>ÿþÂÿ=ÿþðÿ5ÿÿÿÿÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿ ?ÿþÏÿ=ÿþ•ÿ<ÿýćÿ<ÿý‡ÿ;ÿü¿‡‡ÿ;ÿü‡‡ÿ:ÿþ½‡‡;ÿþއ‡:ÿþº‡‡:ÿþ‡‡9ÿþ¸‡‡9ÿþŒ‡‡ ?ÿþîÿ=ÿþØÿ<ÿýêÓÿ<ÿý×Óÿ;ÿüèÓÓÿ;ÿüÖÓÓÿ:ÿþçÓÓ;ÿþÖÓÓ:ÿþæÓÓ:ÿþÕÓÓ9ÿþåÓÓ9ÿþÕÓÓ ?ÿþyÿ=ÿþOÿ<ÿýqDÿ<ÿýKDÿ;ÿümDDÿ;ÿüJDDÿ:ÿþlDD;ÿþIDD:ÿþiDD:ÿþIDD9ÿþhDD9ÿþHDD ?ÿþÁÿ=ÿþïÿ<ÿþÈÿ=ÿþõÿ<ÿþÌÿ=ÿþöÿ<ÿþÍÿ=ÿþ÷ÿ<ÿþÏÿ=ÿþøÿ<ÿþÑÿ=ÿþùÿÿ!ÿþº‡‡ý½Ã à ÿýψ‡ ‡ýŠ¸Ã Ãÿý⌇ ‡ýˆ²Ã Ãÿþ“‡‡þ«Ã Ãÿþ ‡‡þ¢Ã Ãÿþ·‡‡þšÃÃÿýш‡ ‡ý’ÁÃÃÿýñ‡ ‡ýŒ¼ÃÃÿþ˜‡ ‡ýˆµÃÃÿþ«‡‡þ«ÃÃÿþ҇þ¡ÃÃÿý⊇ ‡ý—ÂÃÃÿþ–‡ ‡ýŽ¿ÃÃÿþ­‡ ‡ýˆ¶ÃÃÿþ͇‡þ«ÃÃÿýø‡ ‡þÃÃÿþœ‡ ‡ý’ÁÃÃÿþ¶‡ ‡ý‹»ÃÃÿýÚˆ‡ ‡þ±ÃÃÿþ“‡ ‡þ£ÃÃÿþ¬‡ ‡ý”ÂÃÃÿþч ‡ýŠ»ÃÃÿþ‡ ‡þ®ÃÃÿþ¥‡ ‡þžÃÃÿþLJ ‡ýÁÃÃÿýúŒ‡ ‡ý‰¸ÃÃÿþ¢‡ ‡þ¨Ãà ÿþɇ ‡þ–Ãà ÿþއ ‡ýмÃà ÿþ§‡ ‡þ¬Ã à ÿþЇ ‡þšÃ!à ÿþ‡ ‡ýŒ¾Ã!à ÿþ¬‡ ‡þ°Ã"à ÿýÙˆ‡ ‡þœÃ#à ÿþ–‡ ‡ýŒ¾Ã#Ãÿþ¼‡ ‡þ®Ã$Ãÿýø‹‡ ‡þ™Ã%Ãÿþ£‡ ‡ýнÃ%ÃÿþЇ ‡þ«Ã%Ãþ¼ÿÿþ‘‡ ‡þ–Ã%Ãý”ÿÿþ²‡ ‡ý‰»Ã%Ãý£‡ÿÿý艇 ‡þ¥Ã%Ãü³‡‡ÿÿþ¢‡ ‡ýÁÃ$Ãû¾‡‡ÿÿþÔ‡ ‡þ³Ã%Ãþ˜‡‡ÿþ–‡ ‡þ›Ã%Ãþ¨‡‡ÿþÀ‡ ‡ýнÃ$Ãý¸ˆ‡‡ÿþ‡ ‡þ©Ã$ÃýÁ‘‡‡ÿþ¯‡ ‡ý‘ÂÃ$Ãþ¢‡‡üÿ則 ‡þ³Ã$Ãþ´‡‡ýÿ¥‡ ‡þšÃ$ÃýÀއ‡þÛ‡ ‡ý‰»Ã$Ãþ‡‡þœ‡ ‡þ£Ã$Ãþ±‡‡ýÁÃ#ÃýÀ‡‡þ­Ã$Ãþž‡‡þ”Ã$Ãþ³‡‡þ´Ã#ÃýÁ‡‡þ™Ã$Ãþ¡‡‡þ¹Ã#Ãþµ‡‡þžÃ#Ãý‘‡‡ý‰½Ã#Ãþ§‡‡þ£Ã#Ãý¼‰‡‡ý‹ÀÃ#Ãþ™‡‡þ¦Ã#Ãþ°‡‡ý‹ÀÃ"ÃýÁއ‡!ÿþæÓÓþר Ø ÿþîÓÓþר ØÿýõÕÓÓþÖØ ØÿþØÓÓþÖØ ØÿþÜÓÓþÕØ ØÿþåÓÓþÔØØÿþïÓÓýÔרØÿýúÕÓÓþרØÿþÙÓÓþרØÿþáÓÓþÖØØÿþêÓÓþÕØØÿýõÔÓ ÓþÔØØÿþÙÓ ÓýÔרØÿþáÓÓþרØÿþíÓÓþÖØØÿýüÕÓ ÓþÕØØÿþÛÓ ÓþÔØØÿþåÓÓþרØÿþòÓÓþÖØØÿþØÓ ÓþÕØØÿþáÓ ÓþÔØØÿþïÓÓþרØÿþÖÓ ÓþÖØØÿþÞÓ ÓþÕØØÿþëÓ ÓþÔØØÿýýÕÓ ÓþרØÿþÝÓ ÓþÖØØ ÿþìÓ ÓþÔØØ ÿþÖÓ ÓþרØ ÿþßÓ ÓþÖØ Ø ÿþîÓ ÓþÔØ!Ø ÿþÖÓ Óþר!Ø ÿþáÓ ÓþÖØ"Ø ÿþòÓ ÓþÕØ#Ø ÿþÙÓ Óþר#ØÿþçÓ ÓþÖØ$ØÿýüÔÓ ÓþÔØ%ØÿþÞÓ Óþר%ØÿþîÓ ÓþÖØ%Øþ×ÿÿþ×Ó ÓþÔØ&ØþÔÿÿþãÓ Óþר%ØýÕÓÿÿý÷ÔÓ ÓþÕØ%ØüÖÓÓÿÿþÝÓ ÓþÔØ%Øþ×ÓÓÿþðÓ ÓþÖØ%ØþÔÓÓÿþÙÓ ÓþÕØ%ØþÖÓÓÿþèÓ Óþר$Øþ×ÓÓÿþÕÓ ÓþÖØ%ØþÔÓÓÿþâÓ ÓþÔØ%ØþÕÓÓüÿöÔÓ ÓþÖØ$Øþ×ÓÓýÿÞÓ ÓþÔØ$Øý×ÔÓÓþóÓ Óþר$ØþÕÓÓþÛÓ ÓþÕØ$ØþÖÓÓþר#Øþ×ÓÓþÖØ$ØþÕÓÓþÔØ$ØþÖÓÓþר$ØþÔÓÓþÔØ$ØþÕÓÓþר#Øþ×ÓÓþÕØ$ØþÔÓÓþר#ØþÖÓÓþÕØ#Øþ×ÓÓþר#ØþÔÓÓþÕØ#ØþÖÓÓþר#ØþÔÓÓ!ÿþiDDý?  ÿþyDDýA ÿý‡GD DýC ÿþMDDþ% ÿþVDDþ, ÿþgDDþ3ÿþ{DDý:ÿý»HD Dý@ÿþQD DýCÿþ^DDþ$ÿþqDDþ-ÿý‡FD Dý6ÿþOD Dý>ÿþ`D DýCÿþwDDþ%ÿýÛHD Dþ1ÿþSD Dý:ÿþgD DýAÿýED DþÿþMD Dþ,ÿþ_D Dý9ÿþzD DýAÿþJD Dþ!ÿþZD Dþ0ÿþsD Dý<ÿýèHD DýCÿþXD Dþ' ÿþuD Dþ7 ÿþID DýA ÿþ[D Dþ#  ÿþyD Dþ3! ÿþKD Dý?! ÿþ_D Dþ" ÿþD Dþ2# ÿþOD Dý@#ÿþkD Dþ!$ÿýÛGD Dþ4%ÿþYD DýA%ÿþyD Dþ$%þÿÿþLD Dþ6%ý8ÿÿþdD DýC%ý+Dÿÿý”FD Dþ*%üDDÿÿþXD Dý=$û?DDÿÿþ|D Dþ%þ5DDÿþOD Dþ2%þ'DDÿþnD DýA$ýCDDÿþID Dþ&$ý;DDÿþaD Dý;$þ,DDüÿ‰ED Dþ$þDDýÿZD Dþ3$ý>DDþ‚D DýC$þ0DDþTD Dþ+$þDDý?#ý>DDþ"$þ/DDþ9$þDDþ#ý=DDþ4$þ-DDþ#þDDþ0#ý;DDýB#þ(DDþ+#ýBDDý@#þ4DDþ)#þDDý@"ý>DD!ÿþÐÿ<ÿýÁþÿ;ÿýµúÿ<ÿþòÿ<ÿþåÿ<ÿþÒÿ<ÿý¿þÿ;ÿýËøÿ<ÿþíÿ<ÿþÛÿ<ÿþÇÿ<ÿýµüÿ<ÿþïÿ<ÿþÚÿ<ÿþÂÿ<ÿýßøÿ<ÿþéÿ<ÿþÒÿ<ÿýºþÿ<ÿþòÿ<ÿþÚÿ<ÿþÀÿ=ÿþöÿ<ÿþáÿ<ÿþÆÿ<ÿýêùÿ<ÿþãÿ<ÿþÄÿ=ÿþ÷ÿ<ÿþßÿ<ÿþÀÿ=ÿþõÿ<ÿþÚÿ<ÿýºþÿ<ÿþîÿ<ÿþÎÿ<ÿýßûÿ<ÿþâÿ<ÿþÀÿ=ÿþôÿ<ÿþÕÿ<ÿý¸ýÿ<ÿþãÿ<ÿþ½ÿ=ÿþïÿ<ÿþËÿ=ÿþøÿ<ÿþØÿ<ÿý³ýÿ<ÿþáÿ<ÿþ¹ÿ=ÿþéÿ>ÿ!Ãý¯ˆ‡‡ Ãþ«‡‡Ãþ¦‡‡Ãþ¢‡‡Ãþž‡‡Ãý›‡ ‡Ãýš‡!‡Ãý™‡"‡Ãý™‡#‡Ãý˜‡$‡Ãý˜‡%‡Ãýš‡&‡Ãþ›‡'‡Ãþ‡(‡Ãþž‡)‡Ãþ ‡*‡Ãþ¥‡+‡Ãþª‡,‡Ãþ®‡-‡Ãý³ˆ‡-‡ Ãý¶Š‡.‡ Ãýº‹‡/‡ Ãý¾‡0‡ ÃýÁ”‡1‡ Ãþš‡2‡ Ãþ¢‡3‡Ãþª‡4‡Ãý³ˆ‡4‡Ãýº‹‡5‡ÃýÀ‡6‡Ãþ—‡7‡Ãþ¡‡8‡Ãþ¬‡9‡Ãý·‰‡9‡Ãý¿‡:‡Ãþ˜‡;‡ýÃ¥‡<‡þ²‡=‡þ‹‡ý‡þ‡<‡ý‰¸‡<‡ý°Ã‡;‡ü§ÃÇ:‡þžÃÃ:‡ý•ÂÃÃ9‡ý¾ÃÃ8‡ýˆ¶ÃÃ8‡þ«ÃÃ7‡þŸÃÃ6‡ý“ÂÃÃ5‡ýŠ»ÃÃ5‡þ¯ÃÃ4‡þ ÃÃ3‡ý“ÂÃÃ2‡ýŠ»Ã Ã2‡þ­Ã Ã1‡þ›Ã Ã0‡ýŽ¿Ã Ã!ØþÖÓÓ ØþÖÓÓØþÕÓÓØþÕÓÓØþÕÓÓØþÕÓ ÓØþÔÓ!ÓØþÔÓ"ÓØþÔÓ#ÓØþÔÓ$ÓØþÔÓ%ÓØþÔÓ&ÓØþÕÓ'ÓØþÕÓ(ÓØþÕÓ)ÓØþÕÓ*ÓØþÕÓ+ÓØþÖÓ,ÓØþÖÓ-ÓØþÖÓ.Ó Øþ×Ó/Ó Øþ×Ó0Ó Øý×ÔÓ0Ó ØþÔÓ1Ó ØþÕÓ2Ó ØþÕÓ3ÓØþÖÓ4ÓØþÖÓ5ÓØþ×Ó6ÓØý×ÔÓ6ÓØþÔÓ7ÓØþÕÓ8ÓØþÖÓ9ÓØþ×Ó:ÓØý×ÔÓ:ÓØþÔÓ;ÓýØÕÓ<ÓþÖÓ}Óþ×Ó<ÓýÖØÓ;ÓüÖØØÓ:ÓþÕØØ:ÓþÔØØ:ÓþרØ9ÓþרØ8ÓþÖØØ7ÓþÕØØ6ÓþÔØØ6ÓþרØ5ÓþÖØØ4ÓþÕØØ3ÓþÔØ Ø3Óþר Ø2ÓþÖØ Ø1ÓþÕØ Ø0ÓýÔר Ø!ý!CDD þ$DDþ(DDþ,DDþ0DDý3D Dý3D!Dý4D"Dý4D#Dý5D$Dý5D%Dý3D&Dþ2D'Dþ1D(Dþ0D)Dþ.D*Dþ*D+Dþ%D,Dþ!D-DýCD-D ýBD.D ý@D/D ý=D0D ý8D1D þ3D2D þ,D3Dþ%D4DýCD4DýAD5Dý ÿ5‡ý½ÃÃ3‡ý•¸ÃÃ1‡ýŒ­Ã Ã0‡ý Àà Ã.‡ý”¸Ã Ã,‡ýŠ©ÃÃ+‡ý˜¼ÃÃ)‡ý‹­ÃÃ(‡ýš¾ÃÃ&‡ý‹­ÃÃ%‡ý—½ÃÃ#‡ý‰ªÃÃ"‡ý‘¹ÃÃ!‡ýžÁÃÇýŠ®ÃÇý’»ÃÇýÁÃÇýˆªÃ Çý޶Ã!Çý•¾Ã"ÇýžÂÃ#Çþ¨Ã%ÇýбÃ&Çý޹Ã'Çý“½Ã(Çý˜ÀÃ)ÇýžÂÃ*Çþ£Ã,Çþ¨Ã-Çþ«Ã.à ‡ýˆ¯Ã/à ‡ý‰²Ã0à ‡ý‰³Ã1à ‡ý‰³Ã1ÃþÁ‡‡ý‰´Ã1Ãý´‡‡ý‰´Ã0ÃýÀŸ‡‡ý‰³Ã0Ãý´Ž‡‡ýˆ±Ã/ÃýÁ¡‡ ‡þ®Ã/Ãý·‡ ‡þ«Ã/Ãý§ˆ‡ ‡þ§Ã.Ãý¾—‡ ‡þ¡Ã.Ãý³Œ‡ ‡þ›Ã.Ãþ¥‡ ‡ý•ÂÃ,Ãý¿˜‡ ‡ý‘ÀÃ,Ãý¸‡ ‡þ½Ã,Ãý®‰‡ ‡-Ãþ¤‡‡+ÃýÁ›‡‡*Ãý½“‡‡)Ãý¹Ž‡‡þ‰Ã'Ãý´‹‡‡ý’ÛÃ&Ãý®ˆ‡‡ü¥ÿÿÃ%Ãþ©‡‡ý‰Áÿÿ%Ãþ¥‡‡ý‘Üÿÿ$Ãþ¡‡‡þ ÿÿ#Ãþž‡‡þµÿÿ"Ãþ‡‡ýŠÊÿÿ!Ãþ‡‡ýÝÿÿ Ãþž‡‡þ™ÿ ÿÃþŸ‡‡þ¢ÿ ÿÃþ¡‡‡þ¬ÿ ÿÃþ£‡‡þ¹ÿ ÿÃþ¦‡‡ýˆÂÿ ÿÃþª‡‡ý‰Êÿÿ5ÓýÕרØ3ÓýÔרØ2ÓþÖØ Ø0ÓýÕר Ø.ÓýÔר Ø-ÓþÖØØ+ÓýÔרØ*ÓþÖØØ(ÓýÔרØ'ÓþÖØØ%ÓýÔרØ$ÓþÖØØ"ÓýÔרØ!ÓþÕØØ ÓþÖØØÓýÔרØÓþÕØØÓþÖØ ØÓýÔר!ØÓýÔר"ØÓþÕØ$ØÓþÖØ%ØÓþÖØ&ØÓýÔר'ØÓýÔר(ØÓýÔר)ØÓþÕØ+ØÓþÕØ,ØÓþÖØ-ØÓþÖØ.Ø ÓþÖØ/Ø ÓþÖØ0Ø ÓþÖØ1Ø ÓþÖØ2Ø ÓþÖØ1Øý×ÔÓÓþÖØ0Øý×ÕÓÓþÖØ0ØýÖÔÓÓþÖØ0ØþÕÓ ÓþÖØ/Øý×ÔÓ ÓþÖØ/ØþÕÓ ÓþÕØ.Øý×ÔÓ ÓþÕØ.ØþÖÓ ÓþÕØ.ØþÕÓ ÓþÔØ-Øý×ÔÓ ÓýÔר,Øý×ÔÓ Óþר,ØþÖÓÓ-ØþÕÓÓ,ØþÕÓÓ*Øý×ÔÓÓ)Øý×ÔÓÓþÔØ'Øþ×ÓÓý×òØ&ØþÖÓÓüÞÿÿØ%ØþÖÓÓýÔéÿÿ%ØþÕÓÓý×óÿÿ$ØþÕÓÓþÜÿÿ#ØþÕÓÓþäÿÿ"ØþÕÓÓýÔìÿÿ!ØþÕÓÓý×óÿÿ ØþÕÓÓþÚÿ ÿØþÕÓÓþÝÿ ÿØþÕÓÓþáÿ ÿØþÕÓÓþæÿ ÿØþÕÓÓþéÿ ÿØþÖÓÓýÔìÿÿ5Dý03Dý71Dý?# 0Dý. .Dý9 ,DýB&+Dý5)Dý@#(Dý3&DýA#%Dý6#DýB%"Dý;!Dý/DýA!Dý:Dý1DýC% Dý>!Dý7"Dý0#Dþ'%DýA&Dý>'Dý:(Dý5)Dý0*Dþ+,Dþ'-Dþ$. DýC!/ DýB0 DýB1 DýB1þDDýB1ýDDýC/ý-D Dþ"/ýDDþE'ýADDýL&ý"CDDüZÿÿ%þ&DDýFoÿÿ%þ)DDýLƒÿÿ$þ-DDþVÿÿ#þ0DDþfÿÿ"þ1DDýFvÿÿ!þ0DDýK„ÿÿ þ0DDþQÿ ÿþ/DDþXÿ ÿþ-DDþ_ÿ ÿþ+DDþhÿ ÿþ)DDþpÿ ÿþ%DDýEuÿÿ ÿþýÿ<ÿýó¹ÿ;ÿþáÿ;ÿýüÊÿ;ÿýô¸ÿ;ÿþåÿ<ÿþÓÿ;ÿýûÄÿ;ÿýõ¸ÿ;ÿþìÿ<ÿþäÿ<ÿþÛÿ<ÿþÐÿ;ÿýþÉÿ;ÿýýÄÿÿ<ÃûÁ´¥˜Ã6Ãú¿°¢”ˆ‡‡3ÃûÁ³£“‡‡0Ãûº¨–ˆ‡ ‡,Ãû³¡‡ ‡)ÃûÁ¯œŠ‡‡&ÃûÁ®š‰‡‡#Ãû±›‰‡‡!ÃüµŸ‹‡‡Ãü½§‡‡Ãü²™ˆ‡‡Ãü¾§‡!‡Ãü·‰‡#‡Ãý±•‡%‡þ‹ÃÃü«‡#‡úŽ¥¾ÝÿÃÃüÁ©‡!‡û‹ ½àÿÿÃüÀ¦Œ‡ ‡ü•²Õÿÿ ÃüÁ¦‹‡‡û‰ŸÀñÿ ÿ Ãü©Œ‡‡ü‰¢Åÿÿ Ãý­Ž‡‡ü‰ ÇÿÿÃý´’‡‡ýœÁÿÿÃý¹™‡‡ü‘¶ñÿÿÃüÀ¡ˆ‡‡ü‰¥ÒÿÿÃý­Œ‡‡ý‘¹ÿÿüø•‡‡ýŸÏÿÿý£ˆ‡‡ü‰ªâÿ ÿ‡ýµÿ#ÿ‡ýºÿ%ÿ‡ýŽ»ÿ'ÿ‡ý޽ÿ)ÿ‡ýŒ¹ÿ+ÿ‡ý‰³ÿ-ÿ ‡ý¦ñÿ.ÿ ‡ý™Úÿ0ÿ ‡ýÃÿ2ÿ‡ýˆ­ÿ4ÿ‡ý˜Üÿ5ÿ‡ýмÿ7ÿ‡ýŸñÿ8ÿ‡ý‹Âÿ:ÿü‡šèÿ;ÿþ¸ÿ¾ÿ=ØüÖÕÔØ6Øû×ÖÕÔÓÓ4ØüÖÕÔÓÓ0Øü×ÖÔÓ Ó-ØüÖÕÔÓ Ó*ØýÖÕÓÓ&Øü×ÖÔÓÓ$ØýÖÕÓÓ!Øý×ÕÓÓØü×ÕÔÓÓØýÖÔÓÓØü×ÖÔÓ!ÓØý×ÕÓ$ÓØýÖÔÓ%ÓþÔØØýÖÔÓ#ÓúÖÞèóÿØØþÖÓ"ÓûÔÝçôÿÿØý×ÕÓ!ÓüØãñÿÿ Øý×ÕÓÓûÔÜèúÿ ÿ ØþÖÓÓüÔÝêÿÿ ØýÖÔÓÓüÔÜëÿÿØýÖÔÓÓýÛéÿÿØý×ÔÓÓü×åúÿÿØý×ÕÓÓüÔÞïÿÿØþÖÓÓý׿ÿÿüØ×ÔÓÓýÜîÿÿþÕÓÓüÔàõÿ ÿÓýÕäÿ#ÿÓýÕæÿ%ÿÓýÖçÿ'ÿÓýÖçÿ)ÿÓýÕæÿ+ÿÓýÔäÿ-ÿ Óýßúÿ.ÿ ÓýÚòÿ0ÿ ÓýÕêÿ2ÿÓþáÿ4ÿÓýÙóÿ5ÿÓýÔçÿ7ÿÓýÜúÿ8ÿÓýÔéÿ:ÿüÓÚ÷ÿ;ÿþåÿ¾ÿ<û)56ú,9CDD3û+9DD0û'7CD D,û-=D D)û 2ADD&û"3BDD#û2BDD!ü/@DDü(DDüEVsÿÿý:DDýSnÿÿý5DDüKg»ÿÿü-CDDüEZ{ÿÿý#?DDýKhÿÿü8DDýVyÿÿý,CDDüF^‡ÿ ÿDýHfÿ#ÿDýIiÿ%ÿDýIjÿ'ÿDýIlÿ)ÿDýHhÿ+ÿDýFdÿ-ÿ Dý[»ÿ.ÿ DýQÿ0ÿ DýIpÿ2ÿDýE`ÿ4ÿDýP‚ÿ5ÿDýFkÿ7ÿDýU»ÿ8ÿDýGoÿ:ÿüDR”ÿ;ÿþhÿ¾ÿÿþûÿ9ÿû÷á̸ÿ6ÿûûåͶÿ7ÿüðÖ¼ÿ7ÿûýæËËÿ7ÿüüäÇÿ8ÿüýåÆÿ9ÿýéËÿ9ÿüôÒËÿ8ÿüýá¿ÿ9ÿýôÐÿ:ÿýæÁÿ9ÿüüܵÿ9ÿýøÔÿ:ÿýøÐÿ:ÿý÷Îÿ:ÿý÷Íÿ:ÿýùÐÿ:ÿýüÕÿ;ÿýàËÿ:ÿýìºÿ:ÿýøÈÿ:ÿýþÚÿ;ÿýí¹ÿ:ÿýûÎÿ;ÿýæÌÿ:ÿýûÊÿ;ÿýë¸ÿ;ÿþÑÿ¾ÿyÃÂûÁÀÀÁÃ"Ãë¿»¶²®©¦£ š—”’ŽŒŠˆˆ‡‡ÃõÁº³­¨¢—’Œ‡‡Ã÷¼³«£›”Œ‡%‡ ÃøÁ·­£™ˆ‡,‡Ãúº®£˜‡3‡ùû®¡”‰‡8‡þ‹‡æ‡ç‰’–›Ÿ¤©®¶¹¼ÀÃÆÈÉÊÌÍÏÐÐχ‡õ–ž§±»ÆÒÝõÿÿ‡ø™¦´ÂÒâÿ"ÿ ‡ùŠ–¥¶ÈÜÿ*ÿ‡ú’£·Íèÿ0ÿ‡û“¦½Øÿ6ÿüž¶Ñÿ ¼ÿ|Ø×$Ø×ÖÕÔ ÓØþ×ÖÖÕÔÓØù×ÖÖÕÕÔÓ&Ó Øú×ÖÕÔÔÓ-ÓØú×ÖÕÔÔÓ3ÓúØ×ÖÕÔÓ"ÓðÔÖ×ÙÚÜÞàâäæçèêëììíîÓõÕÙÜßãçëïóûÿÿÓøÕÚßäéïõÿ"ÿ ÓùÔÙÞåìóÿ*ÿÓú×Þåí÷ÿ0ÿÓû×ßçñÿ6ÿüÜåïÿ ¼ÿyû"ë"&),.1368:<>@ACCDDõ#',16;@DD÷$+29?D%D ø"+4<:8641.+(%!'DõA=93-(" Dø?81*$'DøA:2*!-DùC;2( 3Dú?4)8Dø?3'D;DüC8,D?Díxwvuspmjgeb^ZVRNKGD,Dÿõè„|umf^VOHD!Dÿøˆ|odYPHDD%ÿùqdYOEDD+ÿú†scVJD D1ÿû{gXJDD5ÿúèwdSFDD:ÿúlYIDÿ=ÿþ…ÿ ÿÿÀÿíÂÃÄÄÆÉÌÏÒÕØÜàåëðõûÿ?ÿõê·¾ÄÌÓÜæïùÿ?ÿø´¾ÊÖáíùÿ?ÿùºÇÕâïýÿ>ÿú¶ÆÖæöÿ?ÿû¿Ñäöÿ>ÿúêÂÕéüÿ>ÿû¹Íá÷ÿ>ÿþ¶ÿ ÿÿ@Ãý°¿Ã<Çû’¢²ÁÃ8Çûˆ•¥¶Ã5Çû‹œ­½Ã1à ‡ü’¥¸Ã.ÇûŽ ³ÂÃ*Çû‹±ÂÃ'Çû‹ž³ÂÃ$ÇüŒ ¶Ã"Çü¦¼ÃÇü•¬ÁÃà ‡üŠŸ·ÃÃ#‡ü“«ÀÃÃ%‡ü‰ž¸ÃÃü½¢Œ‡$‡ü”®ÂÃÃÿûÛ¸›ˆ‡"‡üŒ¤½ÃÃÿüʪ‡!‡üˆ¹Ãà ÿüܳ•‡!‡ý˜³Ã à ÿü亚‡ ‡ü’­Âà Ãÿüú½š‡‡ü«ÂÃÃÿüø½™‡‡ü©ÁÃÃÿüè¶’‡‡üŒ§ÁÃÃÿü׫Œ‡‡üŒ¨ÁÃÃÿýÇœ‡‡ûŒ©ÁÃÿÿü岎‡‡ý«ÿÿýÊœ‡‡"ÿüଋ‡‡%ÿý½“‡‡'ÿý·‡)ÿüÞ¨‰‡‡+ÿüý²‹‡‡.ÿýµŒ‡ ‡0ÿý¹‡ ‡2ÿý¼Ž‡ ‡4ÿýº‡‡6ÿý¸‡‡8ÿý³Š‡‡9ÿüú«ˆ‡‡;ÿû䤇‡ÿ<ÿýÙšÿ¿ÿ@ØýÖר<ØÓûÔÕÖר8ØÓüÔÕר5Ø ÓüÕÖר1Ø ÓüÔÕר.ØÓüÔÕÖØ+ØÓýÕÖØ(ØÓýÕÖØ%ØÓýÕר"ØÓüÔÕרØÓýÔÖØØ!ÓýÕרØ#ÓüÔÖרØ&ÓýÕרØüçÝÕÓ$ÓýÔÖØØÿüóåÛÓ$ÓýÕרØÿüìàÖÓ"ÓýÕרØ ÿüóäØÓ!ÓýÔÖØ Ø ÿüöæÚÓ ÓýÔÖØ ØÿüýçÚÓÓýÔÖØØÿüüçÚÓÓþÖØØÿü÷ä×ÓÓþÖØØÿüñàÕÓÓþÖØØÿýëÛÓÓüÖØØÿÿüöãÖÓÓþÖÿÿýìÛÓÓ"ÿüõáÔÓÓ%ÿýç×ÓÓ'ÿýîÛÓÓ)ÿüôßÔÓÓ+ÿüþãÔÓÓ.ÿýäÕÓ Ó0ÿýæÕÓ Ó2ÿýçÖÓ Ó4ÿýæÕÓÓ6ÿýåÕÓÓ8ÿýäÔÓÓ9ÿýýáÓÓ;ÿûöÞÓÓÿ<ÿýòÚÿ¿ÿ@ý <Dû:,8DûC8)5Dû@2#1 Dü:*.Dû>.*DûA1'DûA0$Dü@."Dü<)Dü7# DüA.#Dü:%%DüB0ülXHD$Dü8"ÿû‚hSED"Dü?*ÿüv^JD!DüC0 ÿü‚eND!Dý5  ÿüˆiRD Dü;" ÿüèlRDDü=$ÿüÛlQDDü?&ÿü”fLDDü@(ÿü^HDDü@'ÿýsTDDû?&ÿÿü‰cIDDý?$ÿÿýuTDD"ÿü†_GDD%ÿýlMDD'ÿýxTDD)ÿü„\EDD+ÿüôcGDD.ÿýfHD D0ÿýhID D2ÿýkID D4ÿýiIDD6ÿýhHDD8ÿýeFDD9ÿüè_EDD;ÿûˆYDDÿ<ÿýRÿ¿ÿÀÿüÍäùÿ>ÿû¹Ñêþÿ>ÿüÄÜöÿ>ÿü¹Õðÿ>ÿü´Ïëÿ>ÿüêÍëÿ>ÿüßÍìÿ>ÿü¸Óóÿ>ÿü»Üùÿ>ÿýÆéÿ>ÿü³Ö÷ÿ>ÿýÄéÿ>ÿü¶Ûûÿ>ÿýÍòÿ>ÿýÁèÿ>ÿü·Þýÿ=ÿüôÖûÿ>ÿýÓùÿ>ÿýÐøÿ>ÿýÎ÷ÿ>ÿýÏøÿ>ÿýÑùÿ>ÿýÕüÿ=ÿüêÛþÿ=ÿý´âÿ>ÿýºëÿ¿ÿÃý³”‡3‡þšÃÃý²“‡1‡þšÃ Ãý±’‡/‡þšÃ Ãý°‘‡-‡þšÃÃý¬Ž‡+‡þšÃÃüÁ¨‹‡)‡þšÃÃüÀ£‰‡'‡þšÃÃý½œ‡&‡þšÃÃý¶”‡$‡þšÃÃý®Ž‡"‡þšÃÃüÁ¦Š‡ ‡þšÃÃý½›‡‡þšÃÃý³‡‡þšÃÃü§‰‡‡þšÃÃý¼š‡‡þšÃ!Ãý±Ž‡‡þšÃ"ÃüÁ¢ˆ‡‡þšÃ$Ãý·“‡‡þšÃ&Ãý¨‰‡‡þšÃ'Ãý»–‡‡þšÃ)ÃýªŠ‡‡þšÃ*Ãý»–‡‡þšÃ,ÃýªŠ‡ ‡þšÃ-Ãý¼•‡ ‡þšÃ/Ãý¦ˆ‡ ‡þšÃ0Ãý·‡ ‡þšÃ1ÃýÁ¡‡‡þšÃ3Ãý³‡‡þšÃ4Ãý¿™‡‡þšÃ6Ãý©ˆ‡‡þšÃ7Ãý¸‡‡þšÃ8ÃýÀ‡‡þšÃ:Ãû¬‰‡šÃ;Ãù¸šÃ±Ã9ÃøÀ«Ã‡‡•¶Ã:Çýš»Ã8Çüˆ¢ÀÃ6Çü‹ªÂÃ4Çý‘²Ã3à ‡ýš¼Ã1à ‡ü‰¦ÂÃ/à ‡ý³Ã.Çý›½Ã,ÇýŠ«Ã+Çý•ºÃ)Çüˆ¦ÂÃ'Çý‘¶Ã&Çüˆ£ÁÃ$ÃýLJ‡ý¶Ã#Ãÿý¶Š‡‡üˆ£ÁÃ!Ãÿýø¥‡‡ý‘¸Ã ÃÿýÓ”‡‡ýˆ¨ÃÃÿý¹Š‡‡ý–½ÃÃÿýõ£‡‡ý‹®Ãà ÿý͇‡ýœÀÃà ÿý­ˆ‡‡ý·Ãà ÿýØ•‡‡ýˆ©ÃÃÿý¶‰‡‡ý™¿ÃÃÿýß—‡‡ýµÃÃÿý¶‰‡‡ýˆ¨ÃÃÿýÞ–‡‡ýšÀÃÃÿý´ˆ‡‡ý¹ÃÃÿýØ’‡‡ý‰®ÃÃØýÖÔÓ3ÓþÔØØýÖÔÓ1ÓþÔØ ØýÖÔÓ/ÓþÔØ ØýÖÔÓ-ÓþÔØØýÖÔÓ+ÓþÔØØþÖÓ*ÓþÔØØý×ÕÓ(ÓþÔØØý×ÕÓ&ÓþÔØØý×ÔÓ$ÓþÔØØýÖÔÓ"ÓþÔØØþÕÓ!ÓþÔØØý×ÕÓÓþÔØØýÖÔÓÓþÔØØþÕÓÓþÔØØý×ÔÓÓþÔØ!ØýÖÔÓÓþÔØ"Øý×ÕÓÓþÔØ$Øý×ÔÓÓþÔØ&ØþÖÓÓþÔØ'Øý×ÔÓÓþÔØ)ØþÖÓÓþÔØ*Øý×ÔÓÓþÔØ,ØþÖÓÓþÔØ-Øý×ÔÓ ÓþÔØ/ØþÕÓ ÓþÔØ0Øý×ÔÓ ÓþÔØ2ØþÕÓÓþÔØ3ØþÖÓÓþÔØ4Øý×ÔÓÓþÔØ6ØþÖÓÓþÔØ7Øý×ÔÓÓþÔØ8Øý×ÕÓÓþÔØ:ØûÖÓÓÔØ;Øù×ÔÔØÔÖØ9Øø×ÖØÓÓÔר:ØÓýÕר8ØÓýÕר6ØÓþÖØ5ØÓýÔÖØ3Ø ÓýÔר1Ø ÓþÕØ0Ø ÓýÔÖØ.ØÓýÕר,ØÓþÖØ+ØÓýÔר)ØÓþÕØ(ØÓýÔר&ØÓþÕØ%ØýëÖÓÓýÔר#ØÿýåÔÓÓþÕØ"ØÿýüÞÓÓýÔר ØÿýðØÓÓþÖØØÿýæÔÓÓýÔרØÿýûÞÓÓþÖØØ ÿýíÖÓÓýÕרØ ÿþáÓÓýÔרØ ÿýòØÓÓþÖØØÿýåÔÓÓýÔרØÿýôÙÓÓþרØÿýåÔÓÓþÖØØÿýôÙÓÓýÕרØÿþäÓÓýÔרØÿýò×ÓÓþÖØØý9D3Dþ3ý9D1Dþ3 ý:D/Dþ3 ý ;D-Dþ3ý#>D+Dþ3ü'@D)Dþ3ü+BD'Dþ3ý1D&Dþ3ý8D$Dþ3ý!>D"Dþ3ü(AD Dþ3ý2DDþ3ýDDþ3"ü-CDDþ3$ý:DDþ3&ý'BDDþ3'ý7DDþ3)ý%BDDþ3*ý7DDþ3,ý%BD Dþ3-ý8D Dþ3/ý)CD Dþ30ýÿýÒûÿ=ÿýßáÿ>ÿý¾ñÿ>ÿýÐûÿ=ÿýÕâÿ>ÿýÂõÿ>ÿýÚþÿ=ÿý»ðÿ>ÿýÒýÿ=ÿý·îÿ>ÿýÒýÿ=ÿý·îÿ>ÿýÔþÿ=ÿý»óÿ&ÿà ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22à ‡þL22þaÃà ‡þL22ý^ÿÃà ‡þL2 2ü[ÿÿÃà ‡þL2 2þYÿÿà ‡þL2 2þVÿÿà ‡þL2 2þTÿÿà ‡þL2 2þRÿÿà ‡þL22ýPýÿÿà ‡þL22ýNõÿÿà ‡þL22ýLíÿÿà ‡þL22ýJåÿÿà ‡þL22ýIãÿÿà ‡þL22ýGàÿ ÿà ‡þL22ýEÝÿ ÿà ‡þL22ýDÛÿ ÿà ‡úL22BØÿ ÿà ‡ûL2AÖÿ ÿà ‡üL?Òÿÿà ‡ýUÏÿÿà ‡þ±ÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLØ ÓþvLLþuØØ ÓþvLLýsÿØØ ÓþvL LüqÿÿØØ ÓþvL LþnÿÿØ ÓþvL LþlÿÿØ ÓþvL LþkÿÿØ ÓþvL LþhÿÿØ ÓþvLLýgýÿÿØ ÓþvLLýe÷ÿÿØ ÓþvLLýcñÿÿØ ÓþvLLýbêÿÿØ ÓþvLLý`èÿÿØ ÓþvLLý^æÿ ÿØ ÓþvLLý]äÿ ÿØ ÓþvLLý\âÿ ÿØ ÓúvLLZßÿ ÿØ ÓûvLYÝÿ ÿØ ÓüvXÚÿÿØ Óý~×ÿÿØ ÓþÔÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ Óþíÿÿ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍ Dþ£ÍÍþÁ Dþ£ÍÍýÂÿ Dþ£Í ÍüÃÿÿ Dþ£Í ÍþÃÿÿ Dþ£Í ÍþÄÿÿ Dþ£Í ÍþÄÿÿ Dþ£Í ÍþÅÿÿ Dþ£ÍÍýÅõÿÿ Dþ£ÍÍýÆÕÿÿ Dþ£ÍÍýƸÿÿ Dþ£ÍÍýÇ ÿÿ Dþ£ÍÍýÇ ÿÿ Dþ£ÍÍýÈ¡ÿ ÿ Dþ£ÍÍýÈ¢ÿ ÿ Dþ£ÍÍýÈ¢ÿ ÿ Dú£ÍÍÉ£ÿ ÿ Dû£Íɤÿ ÿ Dü£Ê¤ÿÿ Dý ¥ÿÿ Dþ€ÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿÿÿþãÿ<ÿþåÿ<ÿþæÿ<ÿþèÿ<ÿþéÿ<ÿþêÿ<ÿþëÿ<ÿýìôÿ;ÿýîÓÿ;ÿýï½ÿ;ÿýð®ÿ;ÿýñ¯ÿ;ÿýò¯ÿ;ÿýó°ÿ;ÿýô±ÿ;ÿýõ²ÿ;ÿýõ³ÿ;ÿýö´ÿ;ÿýùµÿ<ÿþÍÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿÿ2þ{ÿ&ÿ2þ„ÿ'ÿ2þÿ(ÿ2ý3–ÿ)ÿ2ý4Ÿÿ*ÿ2ý5¨ÿ+ÿ2ý7°ÿ,ÿ2ý9¹ÿ-ÿ 2ý;Áÿ.ÿ 2ý>Èÿ/ÿ 2ýAÏÿ0ÿ 2ýD×ÿ1ÿ 2ýHÝÿ2ÿ2ýLãÿ3ÿ2ýQñÿ4ÿ2þVÿ6ÿ2þ[ÿ7ÿ2þaÿ8ÿ2þiÿ9ÿ2þlÿ:ÿ2þiÿ;ÿý2fÿ<ÿþcÿ½ÿþñÿ=ÿþPÿ<ÿýN2ÿ;ÿüK22ÿ:ÿþN22:ÿþ^229ÿþ…228ÿþœ227ÿýž3226ÿý3225ÿý3224ÿýœ3223ÿýœ3222ÿý›32 21ÿý›32 20ÿýš32 2/ÿýš32 2.ÿý™32 2-ÿý™322,ÿý™322+ÿý™322*ÿý˜322)ÿý˜322(ÿý—322'ÿý—322&ÿý–322%ÿý–322$ÿý•322#ÿý•322"ÿý”322!ÿý”322 ÿý”322Lþÿ&ÿLþ•ÿ'ÿLþÿ(ÿLýM¥ÿ)ÿLýN­ÿ*ÿLýOµÿ+ÿLýP¼ÿ,ÿLýRÃÿ-ÿ LýTËÿ.ÿ LýVÑÿ/ÿ LýY×ÿ0ÿ Lý\Þÿ1ÿ Lý_äÿ2ÿLýcèÿ3ÿLýgôÿ4ÿLþlÿ6ÿLþqÿ7ÿLþvÿ8ÿLþ|ÿ9ÿLþÿ:ÿLþ}ÿ;ÿýLzÿ<ÿþxÿ½ÿþôÿ=ÿþfÿ<ÿýeLÿ;ÿübLLÿ:ÿþeLL:ÿþsLL9ÿþ–LL8ÿþªLL7ÿý«MLL6ÿý«MLL5ÿý«MLL4ÿýªMLL3ÿýªMLL2ÿý©ML L1ÿý©ML L0ÿý¨ML L/ÿý¨ML L.ÿý¨ML L-ÿþ¨LL,ÿþ§LL+ÿþ§LL*ÿþ¦LL)ÿþ¦LL(ÿþ¥LL'ÿþ¥LL&ÿþ¥LL%ÿþ¥LL$ÿþ¤LL#ÿþ¤LL"ÿþ£LL!ÿþ£LL ÿþ£LLÍþ»ÿ&ÿÍþ¸ÿ'ÿÍþ¶ÿ(ÿÍþ´ÿ)ÿÍý̱ÿ*ÿÍý̯ÿ+ÿÍýÌ­ÿ,ÿÍýË«ÿ-ÿ ÍýË©ÿ.ÿ Íýʧÿ/ÿ ÍýÉ¥ÿ0ÿ ÍýÈ£ÿ1ÿ ÍýÇ¢ÿ2ÿÍýÆ ÿ3ÿÍýÅÇÿ4ÿÍþÄÿ6ÿÍþÃÿ7ÿÍþÁÿ8ÿÍþ¿ÿ9ÿÍþ¾ÿ:ÿÍþ¿ÿ;ÿýÍÀÿ<ÿþÁÿ½ÿþÇÿ=ÿþÆÿ<ÿýÆÍÿ;ÿüÇÍÍÿ:ÿþÆÍÍ:ÿþÂÍÍ9ÿþ¸ÍÍ8ÿþ²ÍÍ7ÿþ²ÍÍ6ÿþ²ÍÍ5ÿþ²ÍÍ4ÿþ²ÍÍ3ÿþ²Í Í2ÿþ²Í Í1ÿþ²Í Í0ÿþ³Í Í/ÿþ³Í Í.ÿþ³ÍÍ-ÿþ³ÍÍ,ÿþ³ÍÍ+ÿþ³ÍÍ*ÿþ³ÍÍ)ÿþ³ÍÍ(ÿþ´ÍÍ'ÿþ´ÍÍ&ÿþ´ÍÍ%ÿþ´ÍÍ$ÿþ´ÍÍ#ÿþ´ÍÍ"ÿþ´ÍÍ!ÿþ´ÍÍ ÿþ´ÍÍÿþÖÿ<ÿþÒÿ<ÿþÎÿ;ÿýþÊÿ;ÿýþÆÿ;ÿýýÃÿ;ÿýüÀÿ;ÿýû½ÿ;ÿýùºÿ;ÿý÷·ÿ;ÿýöµÿ;ÿýô²ÿ;ÿýñ°ÿ;ÿýï¯ÿ;ÿýìÈÿ;ÿþéÿ<ÿþæÿ<ÿþãÿ<ÿþßÿ<ÿþÞÿ<ÿþßÿ<ÿþáÿ<ÿþâÿ½ÿþÈÿ=ÿþíÿ<ÿþîÿ<ÿþðÿ<ÿþîÿ<ÿþåÿ<ÿþÒÿ<ÿþÈÿ<ÿýÇþÿ;ÿýÇþÿ;ÿýÇþÿ;ÿýÈþÿ;ÿýÈþÿ;ÿýÈþÿ;ÿýÈþÿ;ÿýÈþÿ;ÿýÈþÿ;ÿýÉþÿ;ÿþÉÿ<ÿþÉÿ<ÿþÉÿ<ÿþÊÿ<ÿþÊÿ<ÿþÊÿ<ÿþÊÿ<ÿþÊÿ<ÿþÊÿ<ÿþËÿ<ÿþËÿ<ÿþËÿ<ÿþËÿ<ÿþËÿÿ ÿý“522ÿþn22ÿýãR22ÿýÓD22ÿýÇ>2 2ÿý¹92!2ÿý©62"2ÿý™42#2ÿþˆ2%2ÿþx2&2ÿþj2'2ÿþ]2(2ÿýõS2)2ÿýßK2*2ÿýÒC2+2ÿýÅ>2,2ÿý·92-2 ÿý§62.2 ÿý—42.2þ5ÿ ÿþŽ2/2ý?¾ÿ ÿþ”2/2üQÞüÿÿýœ32.2ûmôüüÿÿý¥42-2ý5“üüÿý­52-2ý>ºüüÿý´62-2ýOÜüüÿý¼82-2ýjòüüÿýÃ92,2ý4üüÿýÊ<2,2ý=·üüÿýÑ>2,2ýF×ü üÿýØA2,2ýMãü üüÿÝD2,2ýVìü üýãH2,2ý_òü üþK2,2ýkøü ü-2ýyûüü,2þˆüü*2ý4˜üü)2ý6§üü(2ý9¶üü'2ý=Ãüü&2ýBÐüü%2ýIÜüü$2ýPæüü#2ýYîüü"2ý]õüü!2ýXòüü 2ýSïüü2ýOìüü2ýKçüü2ýGãüü2ýDÝüü2ýAØü ü2ý>Ñü!ü2ý<Ëü"ü2ý:Åü#ü2ý6¾ü$ü2ý4·ü%ü2þ¢ü&ü2þyü'ü2þQü(ü2ýHðü(ü2ýKñü)ü2ýTñü*ü2ýXñü+ü2ýYñü,ü ÿý¢NLLÿþLLÿýèhLLÿýÛ\LLÿýÐWL LÿýÃSL!LÿýµPL"Lÿý§ML#Lÿþ˜L%LÿþŠL&Lÿþ~L'LÿþrL(Lÿý÷iL)LÿýæbL*LÿýÚ[L+LÿýÎVL,LÿýÂSL-L ÿý´OL.L ÿý¥ML.LþOÿ ÿþžL/LýXÈÿ ÿþ£L/Lýhåÿ ÿþªL/Lýøÿ ÿý²ML-LýN¢ÿ ÿý¹NL-LýVÅÿ ÿý¿OL-Lýfãÿ ÿýÇQL-Lý~÷ÿ ÿýÍSL,LýNžÿ ÿýÓTL,LýUÂÿ ÿýÙWL,Lý]Þÿ ÿýßYL,Lýdèÿ ÿýä\L,Lýlðÿ ÿýè_L,Lýt÷ÿ ÿþcL,Lýüÿ ÿ-Lý‹þÿÿ,Lþ˜ÿÿ*LýM¦ÿÿ)LýO´ÿÿ(LýRÁÿÿ'LýUÍÿÿ&LýZØÿÿ%Lý`ãÿÿ$Lýgëÿÿ#Lýnòÿÿ"Lýrùÿÿ!Lým÷ÿÿ LýióÿÿLýfðÿÿLýbìÿÿLý_èÿÿLý\äÿÿLýYßÿ ÿLýWÙÿ!ÿLýUÔÿ"ÿLýSÎÿ#ÿLýPÈÿ$ÿLýMÂÿ%ÿLþ®ÿ&ÿLþŠÿ'ÿLþgÿ(ÿLý_ôÿ(ÿLýböÿ)ÿLýjöÿ*ÿLýnöÿ+ÿLýnöÿ,ÿ ÿýµÌÍÍÿþ¾ÍÍÿý ÅÍÍÿý¤ÈÍÍÿý§ÊÍ Íÿý«ËÍ!Íÿý¯ÌÍ"Íÿþ³Í$Íÿþ·Í%Íÿþ»Í&Íÿþ¿Í'ÍÿþÂÍ(ÍÿýÕÅÍ)Íÿý¡ÇÍ*Íÿý¤ÉÍ+Íÿý¨ÊÍ,Íÿý«ËÍ-Í ÿý¯ÌÍ.Í ÿþ´Í/ÍþÌÿ ÿþ¶Í/Íýʪÿ ÿþ´Í/ÍüÅ¢šÿÿþ²Í/Íû¾œššÿÿþ°Í.Íý̵ššÿý®ÌÍ-ÍýÊ«ššÿý¬ÌÍ-ÍýÆ¢ššÿýªÌÍ-Íý¿œššÿý¨ËÍ,Íý̶ššÿý§ËÍ,ÍýÊ«ššÿý¥ÊÍ,ÍýÈ£š šÿý£ÉÍ,ÍýÆ š šüÿ¢ÈÍ,ÍýÄžš šý ÇÍ,Íýœš šþÇÍ,Íý¿›š š-Íþ»šš,Íþ·šš+Íþ³šš)Íý̯šš(Íýˬšš'Íýʨšš&ÍýÉ¥šš%ÍýÇ¢šš$ÍýÅ šš#ÍýÞšš"Íýœšš!ÍýÄœšš ÍýÅššÍýÆžššÍýÇŸššÍýÈ ššÍýÈ¢ššÍýÉ£š šÍýÊ¥š!šÍýʦš"šÍý˨š#šÍý̪š$šÍþ«š%šÍþ±š&šÍþ¼š'šÍþÆš(šÍýÈš(šÍýÇš)šÍýÄš*šÍýÚ+šÍýÚ,š ÿýÌýÿ;ÿþÜÿ;ÿý¯ëÿ;ÿý³ôÿ;ÿý¸÷ÿ;ÿý½úÿ;ÿýÃüÿ;ÿýÉþÿ;ÿþÐÿ<ÿþØÿ<ÿþßÿ<ÿþåÿ;ÿýÓëÿ;ÿý°ïÿ;ÿý´ôÿ;ÿý¸÷ÿ;ÿý½úÿ;ÿýÃýÿ;ÿýÊþÿ.ÿþýÿ ÿþÎÿ/ÿýö»ÿ ÿþËÿ/ÿüì°§ÿÿþÈÿ/ÿûÝ©§§ÿÿýÄþÿ-ÿýý̧§ÿýÁýÿ-ÿý÷¼§§ÿý¾ýÿ-ÿýí±§§ÿý»ûÿ-ÿýߪ§§ÿý¹úÿ,ÿýþͧ§ÿý·ùÿ,ÿýø½§§ÿý´÷ÿ,ÿýó²§ §ÿý²õÿ,ÿý §üÿ°óÿ,ÿý鬧 §ý¯ñÿ,ÿý䪧 §þïÿ,ÿýÞ¨§ §-ÿþ×§§,ÿþЧ§*ÿýþʧ§)ÿýýç§(ÿýû¾§§'ÿýø¹§§&ÿýõ´§§%ÿýñ±§§$ÿýì®§§#ÿýè«§§"ÿýå©§§!ÿý誧§ ÿýë«§§ÿýí¬§§ÿýï­§§ÿýò¯§§ÿýô°§§ÿýõ²§ §ÿý÷´§!§ÿýø¶§"§ÿýú¸§#§ÿýü»§$§ÿýþ½§%§ÿþƧ&§ÿþ×§'§ÿþì§(§ÿýñª§(§ÿý盛)§ÿýꪧ*§ÿý誧+§ÿý誧,§2ýC­ü$ü2ýqðü%ü2ý>­ü'ü2ý]ãü(ü2ý7”ü*ü2ýNÏü+ü2ü3|öü,ü 2ýB¹ü.ü 2ýféü/ü 2ý:Ÿü1ü 2ýTÙü2ü2ü5†úü3ü2ýGÃü5ü2ýoðü6ü2ý6›ü8ü2ýAÁü9ü2ýSáü:üü2qöü;üþ—üýüþéü<üý¥?ü:üûÜ_22ü8üüú’9228üýÌR226üüô5225üýÄI223üüú†5222üýØT2 21üýœ92 2/üýçc2 2.üý³@2 2,üüòv322+üýÈJ22)üüûŒ522(üýìa22'üýËF22&üý 722$üýöt22#üýÝS22"üý¸>22!üýŠ422üýíc22Lý[¹ÿ$ÿLý„ôÿ%ÿLýV¹ÿ'ÿLýrèÿ(ÿLýP£ÿ*ÿLýe×ÿ+ÿLüMúÿ,ÿ LýZÃÿ.ÿ Lý{îÿ/ÿ LýS­ÿ1ÿ Lýkàÿ2ÿLüN—ýÿ3ÿLý_Íÿ5ÿLý‚ôÿ6ÿLýO©ÿ8ÿLýYËÿ9ÿLýiçÿ:ÿüL„úÿ;ÿþ¥ÿýÿþîÿ<ÿý²Wÿ:ÿûãtLLÿ8ÿüý¡RLL8ÿýÕhLL6ÿüø’OLL5ÿýÎ`LL3ÿüý—NLL2ÿýßjL L1ÿýªRL L/ÿýìxL L.ÿý¾XL L,ÿý÷ˆLL+ÿýÑaLL)ÿüþœOLL(ÿýðuLL'ÿýÔ^LL&ÿý®QLL$ÿýú‡LL#ÿýäiLL"ÿýÂVLL!ÿýšMLLÿýñwLLÍýÉ®š$šÍý½š%šÍýÊ®š'šÍý š(šÍýÌ´š*šÍýÆ¥š+šÍýºœš,š ÍýÉ«š.š ÍýÀŸš/š Íý˱š1š ÍýÄ£š2šÍü̸›š3šÍýȨš5šÍý¾š6šÍý̲š8šÍýÉ©š9šÍýÅ¡š:šüͽœš;šþ´šýšþŸš<šý°Êš:šû¢ÂÍÍš8šü›µËÍÍ8šý¦ÅÍÍ6šüœ¹ÌÍÍ5šý¨ÇÍÍ3šü›¸ÌÍÍ2šý£ÄÍ Í1šý²ËÍ Í/šýŸÁÍ Í.šý¬ÉÍ Í,šýœ¼ÍÍ+šý§ÇÍÍ*šý¶ÌÍÍ(šýžÁÍÍ'šý¦ÈÍÍ&šý±ÌÍÍ$šýœ¼ÍÍ#šý¢ÅÍÍ"šý«ÊÍÍ!šþ·ÍÍšýžÁÍÍÿýôÁ§$§ÿýÛª§%§ÿý÷Á§'§ÿý寧(§ÿýü˧*§ÿýîµ§+§ÿüþÖ©§,§ ÿýõ½§.§ ÿýà­§/§ ÿýúƧ1§ ÿýê²§2§ÿüýѨ§3§ÿýò¹§5§ÿýܪ§6§ÿýýȧ8§ÿýöº§9§ÿý믧:§üÿÛ©§;§þʧý§þ­§<§ýÄ÷§:§û±äÿÿ§8§ü¨Ìûÿÿ8§ý¶ëÿÿ6§ü©Ôýÿÿ5§ý¹ñÿÿ3§ü¨Ñýÿÿ2§ý²êÿ ÿ1§ýÈûÿ ÿ/§ý­âÿ ÿ.§ý¿öÿ ÿ,§ýªÙÿÿ+§ý·ðÿÿ*§ýÎýÿÿ(§ý¬ãÿÿ'§ý¶òÿÿ&§ýÆüÿÿ$§ý©Ùÿÿ#§ý°ëÿÿ"§ý½÷ÿÿ!§ýÏþÿÿ§ý«âÿÿÿüþõü:üûö®k:ü7üûö¯k;225üû÷±m;223üüÓ|?220üûô¡W32 2.üüÌv<2 2+üüï™R22)üüÄp922&üüöžN22$üüé‰A22"üüØv822 üüÀd422üüú©T22üüð“F22üüî†<2!2üüðŠ=2#2üüò>2%2üüõ“A2'2üü÷—B2)2üüø›D2+2üý¥G2-2 üýÅT2/2 üüßl3202üüò†8222üý¤C242üýÃT262üüÞk3272üüô…8292üü¹G2;2ýn32º2ü3[¥292úB‚Úÿÿ262ü5c±ÿÿ52üFŒäÿÿ32ýTªÿÿ02ü4fÂÿ ÿ.2ü9xÚÿ ÿ,2üBŒýÿÿ*2ýN¡ÿÿ(2ýP¯ÿÿ&2ýM¬ÿÿ$2ýK¨ÿÿ"2ýI¥ÿÿ 2ýG¡ÿÿ2ýFžÿÿ2ý;ÿÿ2ü4sèÿ ÿÿÿþùÿ:ÿûúº~Tÿ7ÿûú»TLL5ÿûû½€TLL3ÿüÛWLL0ÿüø®mL L.ÿüÕˆTL L+ÿüó¨hLL)ÿü΃RLL&ÿüú¬eLL$ÿüî™YLL"ÿü߈RLL ÿüÊxMLLÿüýµjLLÿüô¢]LLÿüò—UL!LÿüôšUL#Lÿü÷žWL%Lÿüù¢YL'Lÿüû¥ZL)Lÿüü©\L+Lÿý²^L-L ÿýÎkL/L ÿüæML0Lÿü÷—RL2Lÿý±[L4LÿýÍjL6Lÿýå~L8Lÿüø–QL9LüÿÃ^L;LþL»LüMp²L9LúZ“áÿÿL6LüNx½ÿÿ5Lü^›éÿÿ3Lýk¶ÿÿ0LüNzÌÿ ÿ.LüSŠáÿ ÿ,LüZ›ýÿÿ*Lýe®ÿÿ(Lýf»ÿÿ&Lýd¸ÿÿ$Lýcµÿÿ"Lý`²ÿÿ Lý_®ÿÿLý]«ÿÿLýTžÿÿLüM†ìÿ ÿÿšþœš:šûœ®¿Ëš7šûœ­¿ËÍÍ5šû›­¾ËÍÍ3šü¤ºÊÍÍ0šüœ±ÄÍ Í.šü¦¼ËÍ Í+šü³ÅÍÍ)šü¨½ËÍÍ&šüœ²ÆÍÍ$šüŸ·ÉÍÍ"šü£¼ËÍÍ šý©ÀÍÍšü›¯ÄÍÍšüµÈÍÍšüž¸ÊÍ!Íšü·ÊÍ#Íšüœ¶ÊÍ%ÍšüœµÉÍ'Íšü›´ÉÍ)Íšü›²ÈÍ+Íšý°ÈÍ-Í šý¨ÄÍ/Í šý¡¾Í1Íšüœ¸ËÍ2Íšý°ÉÍ4Íšý¨ÄÍ6Íšý¢¿Í8Íšüœ¸ÌÍ9Íüš«ÈÍ;Íþ¾Í¼ÍýðÍ9Íúɹ£ÿÿÍ6ÍüÌÁ­ÿÿ5Íüȶ ÿÿ3Íýįÿÿ0ÍüÌÀ©ÿ ÿ.ÍüË»£ÿ ÿ,Íüɶõÿÿ*ÍýƱÿÿ(ÍýÆ­ÿÿ&ÍýÆ®ÿÿ$Íýǯÿÿ"Íýǰÿÿ ÍýȱÿÿÍýȲÿÿÍý˶ÿÿÍý½©ÿ ÿÿ§þ©§:§û©ÁÞù§7§û©ÀÞùÿÿ5§û¨ÀÝùÿÿ3§ü³Ö÷ÿÿ0§ü©Æéÿ ÿ.§ü¶Ùùÿ ÿ+§ü«Éëÿÿ)§ü¹Ûûÿÿ&§ü©Çíÿÿ$§ü­Ðöÿÿ"§ü²Ùûÿÿ §üºâþÿÿ§ü¨Ãêÿÿ§üªÌóÿÿ§ü«Ñøÿ!ÿ§üªÏøÿ#ÿ§üªÍ÷ÿ%ÿ§ü©Ìöÿ'ÿ§ü¨Êõÿ)ÿ§ü¨Èóÿ+ÿ§ýÄòÿ-ÿ §ý¸êÿ/ÿ §ü°Þþÿ0ÿ§üªÑûÿ2ÿ§ýÅôÿ4ÿ§ý¹êÿ6ÿ§ý°Þÿ8ÿ§ü©Ñûÿ9ÿü§½òÿ;ÿþÜÿ»ÿüþæÄÿ9ÿüõÓ±ÿ8ÿüýâÀÿ9ÿüòÏ®ÿ9ÿýêÂÿ9ÿüþá¹ÿ9ÿüúرÿ9ÿüõÏôÿ9ÿýíÆÿ:ÿýíÀÿ:ÿýîÂÿ:ÿýïÃÿ:ÿýñÄÿ:ÿýòÆÿ:ÿýóÇÿ:ÿýùÍÿ:ÿüþÚ³ÿ ÿ,üöøÒ­“|fSA322'üùÚ®‰iM622!üùáµnR922üúç­}X=22üùûÏ™mH32 2üúñ¹‡^<2%2üúï¬vP52)2 üûË‹X52-2üûé¥mA212üúûÃ…S4242üûõ¬k=282ü­j:2v2ùTnŒ­Òÿÿ<2ü5Ia227L÷O]rŠ¥ÅèÿL=LþTLCLÚPW_hqz„Ž™£¦¨«­¯²´¶¹»½À½³«¢š’‹ƒ|uohaULLüÈØçÿ%ÿõàɵ¢rdWML L3ÿøæÇ¨Œt^NLL:ÿúÖµ˜~hÿÅÿØéÙ˽±¤™Ž„yqljhgfdca`^][[`flrx†•œ¤®¾Ôìÿÿú™…scTL&LõOZgu„•¦¹Î÷ÿÿ6LùVk›¹Úÿÿÿø°»É×äòþÿ>ÿúµÃÐÞìÿÅÿØ®´º¿ÅËÐÖÛáæéêëìíîïðñòóôôñíéåâÞÚÖÒÎËÆ¿¶³ÿÿúÐÚåïùÿ&ÿõýõìãÛÒÊÁ¸Óÿ>ÿù÷êÜÏÁ´ÿ>ÿüýñãÿÿ?üùRlˆªÐ÷ü8ü2ù4Ga‚®åü3ü 2úDf¼ñü.ü2ù4Mp™Ìúü)ü2ú8V}´òü%ü2ú6YˆÅûü!ü2û22þ:2=2ùÿÝ©~Y:282ÿúÑŸvR7232 ÿûÆ–nJ2/2ÿûáŸkA2+2ÿûÏ_92'2ÿû½ƒT52#2ÿûøža62 2ÿü¥e822 ÿü«j:22#ÿü²k822&ÿüšU322(ÿüÖ€C22+ÿüµi722-ÿüýF2 20ÿý®Z2 22ÿüÎq7224ÿüñŠC227ÿý¦N22ü|›Ãÿ5ÿý®Q22ú6PtžÏÿ2ÿý´U22ú:X|¨Ýÿ/ÿýºX2 2û?aÌÿ-ÿ2üCr¯ÿ*ÿ2û7^”Ûÿ&ÿ2üK|¼ÿ#ÿ2ûÿú°ÃÕèùÿ>ÿú´ÆÙëüÿ>ÿû¸ÊÜðÿ>ÿû¯ÆÞõÿ>ÿûµÍäúÿ>ÿû»Òêýÿ=ÿûÞÇãüÿ>ÿüÄáûÿ>ÿüÂßùÿ>ÿü¿Þûÿ>ÿýÈêÿ>ÿü³Ôôÿ>ÿü¾ßüÿ=ÿüôÍòÿ>ÿýÁçÿ>ÿüµÛüÿ=ÿüÈÏôÿ>ÿýÄíÿÿüÖȹÿ5ÿýÁìÿÿúýìÚǵÿ2ÿý¾êÿÿúúèÖðÿ/ÿý¼èÿ ÿûöãζÿ>ÿüôÚÀÿ>ÿûüå˱ÿ>ÿüïÖ»ÿ>ÿûùàÆ½ÿ=ÿûþëÑ·ÿ>ÿüõÖµÿ>ÿýêÆÿÿÀüýàü<üû25iÄü:ü2üS¥øü7ü2üB‹ïü5ü2ü=‡íü3ü 2ü;„êü1ü 2ü:€çü/ü 2ü9}åü-ü2ü8yåü+ü2ü9‡ñü)ü2üBûü'ü2ýMµü&ü2ý]Ìü$ü2ü4oàü"ü2ü8‚ïü ü2ýA¥üü2ý[Õüü2ü6ƒôüü!2ýF´üü#2ýfßüü$2ü9øüü&2ýOÌüü'2ü6Šúüü)2ýSÓüü*2ü7’ûüü,2ýXÚüü-2ý9™üü/2ý^àü ü02ý<­ü ü12ü3z÷ü ü32ýSÛüü42ý<­üü52ü3y÷üü72ýRÚüü82ý<­üü92ü3y÷üü;2ùXçüü¾\292øEÍüÿÿÀW282ý9­ÿÿý­I272þ3ÿÿý”>262ÿý7242ÿüÜj3222 ÿýÆX212 ÿý¥A2/2Àÿý’æÿ<ÿûLO|Îÿ:ÿLüi²üÿ7ÿLüZ›óÿ5ÿLüU—ñÿ3ÿ LüT•ïÿ1ÿ LüS‘ìÿ/ÿ LüRêÿ-ÿLüQ‹êÿ+ÿLüS—öÿ)ÿLüZ«þÿ'ÿLýdÀÿ&ÿLýrÕÿ$ÿLüM‚æÿ"ÿLüQ“óÿ ÿLýY²ÿÿLýqÜÿÿLüP”øÿÿ!Lý^¿ÿÿ#Lýzæÿÿ$LüSŸüÿÿ&LýfÕÿÿ'LüOšýÿÿ)LýiÛÿÿ*LüQ¡þÿÿ,Lýnáÿÿ-LýS¨ÿÿ/Lýsæÿ ÿ0LýU¹ÿ ÿ2LýŒûÿ ÿ3Lýiâÿÿ4LýT¹ÿÿ6Lý‹ûÿÿ7Lýháÿÿ8LýT¹ÿÿ:Lý‹ûÿÿ;LùmìÿÿÈqL9Lý]ÖÿÿýÊmL8LýR¹ÿÿý¹`L7LþMÿÿý£VL6LÿýPL4Lÿüã~ML2L ÿýÏnL1L ÿý²YL/LÀšý¹¡š<šûÍÌ¿¨š:šÍüŰ›š7šÍüÉ·š5šÍüʸžš3š Íü˸žš1š Íü˹Ÿš/š Íü˺ š-šÍüÌ» š+šÍü˸š)šÍýɲš(šÍýƬš&šÍý¦š$šÍý¾¡š"šÍü̹š šÍýɰššÍýäššÍü̹œšš!ÍýȬšš#ÍýÀ¡šš$Íü˵›šš&ÍýƦšš'ÍüÌ·›šš)ÍýŤšš*Íý̵šš,Íýãšš-Íý˳šš/Íý¡š š0ÍýÊ®š š2Íý»›š š3ÍýÅ¢šš4ÍýË®šš6Íý»›šš7ÍýÅ£šš8ÍýË®šš:Íý»›šš;ÍùÄŸššªÂÍ9ÍøÈ¦šÿÿ©ÄÍ8ÍýË®ÿÿý®ÇÍ8Íÿý´ÊÍ6ÍÿýºÌÍ4Íÿý¢¿Í3Í ÿý¨ÃÍ1Í ÿý°ÉÍ/ÍÀ§ýÔ¯§<§ûÿýß¹§:§ÿüëĨ§7§ÿüõÏ«§5§ÿüøÑ«§3§ ÿüùÒ¬§1§ ÿüúÔ­§/§ ÿüûÕ®§-§ÿüû×®§+§ÿüúѪ§)§ÿýõǧ(§ÿýî¾§&§ÿýå¶§$§ÿüþܯ§"§ÿüûÓ«§ §ÿýöħ§ÿýæ³§§ÿüüÒ©§§!ÿýò¾§§#ÿýá°§§$ÿüúͨ§§&ÿýí¶§§'ÿüýϨ§§)ÿýë³§§*ÿýü̧§,ÿýè±§§-ÿýúɧ§/ÿý寧 §0ÿýøÁ§ §2ÿýר§ §3ÿýë±§§4ÿýùÁ§§6ÿýר§§7ÿýë±§§8ÿýùÁ§§:ÿýר§§;ÿùè­§§»æÿ9ÿøóµ§ÿÿºéÿ8ÿýûÁÿÿýÁñÿ7ÿþþÿÿýË÷ÿ>ÿýÕüÿ=ÿü±ßþÿ=ÿý¸èÿ>ÿýÄöÿ/ÿüý²@2(2üýçd2'2üýž92%2üýÙV2$2üüú‰52"2üýÈJ2!2üýñk2 2üý–622üýÄC22üýç\22 üüûƒ322"üý±<22#üýÚP22$üýõq22&üýž722'üýÊE22(üýåT22)üýõi22+üý…322,üý¤622-üýÀ>22.üýÙK2 2/üýí\2 20üýøt2 22üý’42 23üý«7224üýº9225üýÅ=226üýÏA227üýÙF228üýáK229üýèR22:üýïY22;üûõb22ü;üüøk2ü<üýûvüüþˆü=üü2hòü;ü2ýPßü:ü2ý@Âü9ü2ý6¤ü8ü2ý3ü7üÿý½XL(LÿýìxL'Lÿý«SL%LÿýàlL$Lÿüý™OL"LÿýÑbL!LÿýöL Lÿý¥OLLÿýÎ[LLÿýìqLL ÿüþ”MLL"ÿý½ULL#ÿýáfLL$ÿýù„LL&ÿý«QLL'ÿýÓ]LL(ÿýêjLL)ÿýù}LL+ÿþ•LL,ÿý±PLL-ÿýÊWLL.ÿýàbL L/ÿýñqL L0ÿýü‡L L2ÿý¡ML L3ÿý·PLL4ÿýÄSLL5ÿýÎULL6ÿý×YLL7ÿýà]LL8ÿýçcLL9ÿýíhLL:ÿýóoLL;ÿûùvLLÿ;ÿüüLÿ<ÿýþˆÿÿþ™ÿ=ÿüL|÷ÿ;ÿLýgæÿ:ÿLýXÌÿ9ÿLýP±ÿ8ÿLþžÿ7ÿšý­ÉÍ(ÍšýŸÀÍ'Íšý²ËÍ%Íšý£ÄÍ$Íšü›·ÌÍ"Íšý§ÇÍ!Íšý¿Í Íšý´ÌÍÍšý¨ÉÍÍšýŸÂÍÍ!šþ¹ÍÍ"šý­ÊÍÍ#šý£ÆÍÍ$šýœ½ÍÍ&šý²ÌÍÍ'šý§ÈÍÍ(šý ÄÍÍ)šýœ¿ÍÍ+šþ¸ÍÍ,šý°ÌÍÍ-šý©ÊÍÍ.šý£ÇÍ Í/šýžÂÍ Í0šý›¼Í Í2šþµÍ Í3šý¯ÌÍÍ4šý«ËÍÍ5šý¨ÊÍÍ6šý¥ÉÍÍ7šý£ÈÍÍ8šý¡ÇÍÍ9šýŸÅÍÍ:šýÃÍÍ;šûœÁÍÍš;šü›¿Íš=šþ¼ššþ·š=šüÍ¿œš;šÍýÅ¡š:šÍýÉ©š9šÍý̰š8šÍþ¶š7š§ý¿öÿ(ÿ§ý­âÿ'ÿ§ýÇúÿ%ÿ§ý²éÿ$ÿ§ü¨Ðýÿ"ÿ§ý·ðÿ!ÿ§ýªÞÿ ÿ§ýÊýÿÿ§ý¹ôÿÿ§ý­æÿÿ!§ýÒþÿÿ"§ýÀøÿÿ#§ý±íÿÿ$§ý©Ûÿÿ&§ýÇüÿÿ'§ý·óÿÿ(§ý®êÿÿ)§ý©ßÿÿ+§þÒÿÿ,§ýÅüÿÿ-§ýº÷ÿÿ.§ý²ïÿ ÿ/§ý«æÿ ÿ0§ý¨Ùÿ ÿ2§ýÌþÿ ÿ3§ýÂüÿÿ4§ý¼úÿÿ5§ý¸øÿÿ6§ýµõÿÿ7§ý²óÿÿ8§ý¯ïÿÿ9§ý­ëÿÿ:§ý«çÿÿ;§û©ãÿÿ§;§ü¨Þÿ§=§þÙ§§þЧ=§üÿધ;§ÿýì°§:§ÿýö¹§9§ÿýüŧ8§ÿþͧ7§ 2þ[ÿ3ÿ 2ýRñÿ1ÿ 2ýKàÿ0ÿ 2ýEØÿ/ÿ 2ý@Íÿ.ÿ2ý<Âÿ-ÿ2ý8·ÿ,ÿ2ý6ªÿ+ÿ2ý4ÿ*ÿ2ý3ÿ)ÿ2þ‚ÿ(ÿ2þvÿ'ÿ2þmÿ&ÿ2þpÿ%ÿ2þtÿ$ÿ2þwÿ#ÿ2þ{ÿ"ÿ2þÿ!ÿ2þƒÿ ÿ2þˆÿÿ2þŒÿÿ2þÿÿ 2þ”ÿÿ 2ý3˜ÿÿ!2ý3¥ÿÿ"2ý6ºÿÿ#2ý:Ìÿÿ$2ýAÜÿÿ%2ýJõÿÿ&2þUÿÿ'2þdÿÿ(2þuÿÿ)2þ‰ÿÿ)2ý3Ÿÿÿ*2ý5´ÿÿ+2ý9Çÿÿþ2*2ý?Øÿÿýü|2*2þJÿÿüþw2*2þaÿÿüþs2*2þ‚ÿ ÿüýûo2)2ý3¨ÿ ÿüýûk2)2ý8Ìÿ ÿüýúf2)2ýEñÿ ÿüýøc2)2þYÿ ÿüýö`2)2þxÿ ÿüýõ]2)2þžÿÿüýòY2(2ý6Ãÿÿ üýñT2(2ýAáÿÿ üýèI2(2þSÿÿ üýÚ@2(2þoÿÿ üýÉ:2(2þ–ÿÿ üý·52'2ý6Éÿÿüý£32'2þHÿÿüþ2(2þmÿÿüþy2(2þ¡ÿÿüýûf2'2û9ÕÿÿüüýõX2'2üOÿÿüüýìL2'2ýyÿüüýÞB2&2ý3¯üüýÉ82&2þ=üüþ¤2'2üþ}2&2üýú]2%2üýêG2$2 Lþqÿ3ÿ Lýhôÿ1ÿ Lýbæÿ0ÿ Lý]ßÿ/ÿ LýXÖÿ.ÿLýUÌÿ-ÿLýRÂÿ,ÿLýO¶ÿ+ÿLýN«ÿ*ÿLþŸÿ)ÿLþ“ÿ(ÿLþˆÿ'ÿLþÿ&ÿLþƒÿ%ÿLþ†ÿ$ÿLþ‰ÿ#ÿLþÿ"ÿLþÿ!ÿLþ”ÿ ÿLþ˜ÿÿLþ›ÿÿLþŸÿÿ Lþ£ÿÿ!Lþ¦ÿÿ!LýM²ÿÿ"LýOÄÿÿ#LýTÕÿÿ$LýYãÿÿ%Lýb÷ÿÿ&Lþkÿÿ'Lþxÿÿ(Lþ‡ÿÿ)Lþ™ÿÿ*Lþ­ÿÿ*LýN¿ÿÿ+LýRÐÿÿþL*LýWßÿÿþL*Lþaÿÿþ‰L*Lþuÿÿþ†L*Lþ“ÿÿýþ‚L*Lþµÿÿýþ~L)LýRÕÿÿýý{L)Lý]ôÿÿýüxL)LþoÿÿýúuL)LþŠÿÿýùrL)Lþ¬ÿÿý÷oL(LýPÍÿÿýöjL(LýYçÿÿýí`L(LþiÿÿýáXL(Lþ‚ÿÿýÒSL(Lþ¥ÿÿýÂOL'LýPÒÿÿþ°L(Lþ_ÿÿþL(Lþ€ÿÿþ‹L(Lþ®ÿÿýþ{L'LýSÜÿÿýùmL'LþfÿÿýðcL'Lþ‹ÿÿýåZL'Lþ»ÿÿýÒQL&LþVÿÿþ±L'LÿþL&LÿýýrL%Lÿýï^L$L ÍþÃÿ3ÿ ÍýÅÇÿ1ÿ ÍýÇ¡ÿ0ÿ ÍýÈ£ÿ/ÿ Íýɦÿ.ÿÍýÊ©ÿ-ÿÍýË«ÿ,ÿÍý̯ÿ+ÿÍý̲ÿ*ÿÍþµÿ)ÿÍþ¹ÿ(ÿÍþ¼ÿ'ÿÍþ¾ÿ&ÿÍþ½ÿ%ÿÍþ¼ÿ$ÿÍþ¼ÿ#ÿÍþ»ÿ"ÿÍþ¹ÿ!ÿÍþ¹ÿ ÿÍþ·ÿÿÍþ¶ÿÿÍþµÿÿ Íþ´ÿÿ!Íþ³ÿÿ"Íþ°ÿÿ"ÍýÌ«ÿÿ#Íý˦ÿÿ$ÍýÉ¢ÿÿ%ÍýÇÕÿÿ&ÍþÄÿÿ'ÍþÀÿÿ(Íþ¼ÿÿ)Íþ·ÿÿ*Íþ±ÿÿ*Íý̬ÿÿ+Íý˧ÿÿþ¹Í*ÍýÊ£ÿÿýšºÍ*ÍþÇÿÿšþ¼Í*ÍþÁÿÿšþ½Í*Íþ¹ÿ ÿšþ¾Í*Íþ¯ÿ ÿšþ¿Í)Íý˦ÿ ÿšý›ÀÍ)ÍýÈÇÿ ÿšý›ÁÍ)ÍþÃÿ ÿšýœÁÍ)Íþ»ÿ ÿšýœÂÍ)Íþ²ÿÿšýœÃÍ(Íý̨ÿÿ šýÄÍ(ÍýÉ¡ÿÿ šýŸÇÍ(ÍþÅÿÿ šý£ÉÍ(Íþ¾ÿÿ šý§ËÍ(Íþ´ÿÿ šý«ÌÍ'Íý̧ÿÿšþ±Í(ÍþÇÿÿšþ¶Í(Íþ¾ÿÿšþ»Í(Íþ±ÿÿšþÀÍ'ÍûˤÿÿššýœÄÍ'ÍüÆÿÿššýžÆÍ'Íý»ÿššý¢ÉÍ'Íþ­ššý§ÌÍ&ÍþÊššþ°Í'ÍšþºÍ&Íšý›ÂÍ%ÍšýžÈÍ$Í ÿþæÿ>ÿýëÈÿ=ÿýï¯ÿ=ÿýó²ÿ=ÿýöµÿ=ÿýø¹ÿ=ÿýû½ÿ=ÿýýÂÿ=ÿýþÇÿ>ÿþÍÿ>ÿþÓÿ>ÿþÙÿ>ÿþÝÿ>ÿþÛÿ>ÿþÚÿ>ÿþØÿ>ÿþÖÿ>ÿþÔÿ>ÿþÒÿ>ÿþÐÿ>ÿþÏÿ>ÿþÍÿ>ÿþËÿ>ÿþÊÿ=ÿýþÄÿ=ÿýý¼ÿ=ÿýù¶ÿ=ÿýõ±ÿ=ÿýðÓÿ=ÿþêÿ>ÿþâÿ>ÿþÙÿ>ÿþÐÿ>ÿþÆÿ=ÿýý¾ÿ=ÿýû¸ÿÿþÔÿ*ÿý÷²ÿÿý§Öÿ*ÿþðÿÿ§þØÿ*ÿþãÿÿ§þÚÿ*ÿþÓÿ ÿ§þÜÿ*ÿþÃÿ ÿ§þÞÿ)ÿýû¶ÿ ÿ§ý¨àÿ)ÿýóÈÿ ÿ§ý¨âÿ)ÿþçÿ ÿ§ý©äÿ)ÿþØÿ ÿ§ý©åÿ)ÿþÇÿÿ§ýªçÿ(ÿýü¹ÿÿ §ýªêÿ(ÿýõ¯ÿÿ §ý­ñÿ(ÿþëÿÿ §ý±öÿ(ÿþÜÿÿ §ý·úÿ(ÿþÊÿÿ §ý½ýÿ'ÿýü·ÿÿ§þÅÿ(ÿþñÿÿ§þÎÿ(ÿþÝÿÿ§þ×ÿ(ÿþÆÿÿ§þàÿ'ÿûú³ÿÿ§§ý©èÿ'ÿüíÿÿ§§ý¬ïÿ'ÿý×ÿ§§ý°õÿ'ÿþÀ§§ý·ûÿ&ÿþø§§þÅÿ'ÿ§þÕÿ&ÿ§ý¨åÿ%ÿ§ý¬òÿ$ÿÿý©42'2þ’ÿÿþ”2'2ý6Èÿÿþz2'2þGÿÿþ\2'2þkÿÿýõF2'2þžÿÿýÎ92&2ý8Ñÿÿý¬32&2þMÿÿþ…2'2þtÿÿþc2'2þªÿÿþK2&2ý<ÛÿÿýÖ<2&2þTÿÿý´42&2þÿÿþ2&2ý3¶ÿÿþi2&2ý@íÿÿþP2&2þgÿÿýÜ>2&2þ©ÿÿý¼52%2þ>ÿÿþ”2&2ÿþc2%2ÿýøC2$2ÿýÀ52#2ÿþ‰2#2ÿþ[2"2ÿýã?2!2ÿýµ32 2ÿþ2 2ÿþT22ÿýÛ<22ÿþª22ÿþt22 ÿþM22 ÿýÑ822!ÿþ›22"ÿþ_22"ÿýß;22#ÿþ22$ÿþ]22$ÿýÞ:22%ÿþ›22&ÿþ]22&ÿýÝ:22'ÿþš22(ÿþ[22(ÿýÜ:22)ÿþ™22*ÿþ[22*ÿýÛ922+ÿþ˜22,ÿþY22,ÿýÒ522-ÿþ}22.ÿþB22.ÿþ¥22/ÿþY2 2/ÿýÏ52 20ÿþ{2 21ÿþA2 21ÿþ£2 22ÿþW2 2þßÿ0ÿýÍ42 2þXÿ1ÿþy2 2þ…ÿ1ÿþ?2 2ý4¼ÿ0ÿþŸ2 2ýBñÿ0ÿþU22ÿýµML'Lþ¡ÿÿþ£L'LýOÑÿÿþŒL'Lþ_ÿÿþqL'Lþ~ÿÿý÷^L'Lþ«ÿÿýÖSL&LýRÙÿÿþ¸L'Lþdÿÿþ•L'Lþ‡ÿÿþwL'Lþ¶ÿÿþbL&LýTâÿÿýÝTL&Lþjÿÿý¿ML&LþÿÿþL&LýMÁÿÿþ}L&LýXñÿÿþfL&Lþ{ÿÿýãWL&LþµÿÿýÇOL%LþWÿÿþ£L&LÿþxL%Lÿýú[L$LÿýÊNL#Lÿþ™L#LÿþpL"LÿýèWL!LÿýÀML LÿþL LÿþjLLÿýâTLLÿþ¶LLÿþ‡LL ÿþdLL ÿýÙRLL!ÿþ©LL"ÿþtLL"ÿýæTLL#ÿþ«LL$ÿþrLL$ÿýåTLL%ÿþ©LL&ÿþrLL&ÿýäSLL'ÿþ¨LL(ÿþqLL(ÿýãSLL)ÿþ§LL*ÿþpLL*ÿýâSLL+ÿþ¦LL,ÿþoLL,ÿýÚOLL-ÿþLL.ÿþZLL.ÿþ²LL/ÿþnL L/ÿý×NL L0ÿþL L1ÿþYL L1ÿþ°L L2ÿþmL Lþæÿ0ÿýÖNL Lþmÿ1ÿþ‹L Lþ–ÿ1ÿþXL LýMÇÿ0ÿþ­L LýZôÿ0ÿþkLLÿþ¯Í(Íþµÿÿþ´Í'Íý̧ÿÿþ»Í'ÍþÈÿÿþÂÍ'Íþ¿ÿÿýÕÈÍ'Íþ²ÿÿý¦ËÍ&ÍýË¥ÿÿþ®Í'ÍþÆÿÿþ¸Í'Íþ¼ÿÿþÁÍ'Íþ¯ÿÿþÇÍ&ÍýË¢ÿÿý¤ËÍ&ÍþÄÿÿþ¬Í'Íþ¹ÿÿþ¶Í'Íþ¬ÿÿþ¿Í&ÍýɸÿÿþÆÍ&ÍþÀÿÿý¢ÊÍ&Íþ¯ÿÿýªÌÍ%ÍþÊÿÿþ´Í&ÍÿþÁÍ%ÍÿýàÉÍ$Íÿý©ÌÍ#Íÿþ·Í#ÍÿþÃÍ"Íÿý ÊÍ!Íÿþ¬Í!ÍÿþºÍ ÍÿþÄÍÍÿý¢ËÍÍÿþ¯ÍÍÿþ¼ÍÍ ÿþÆÍÍ ÿý¥ËÍÍ!ÿþ²ÍÍ"ÿþÂÍÍ"ÿý¡ËÍÍ#ÿþ²ÍÍ$ÿþÂÍÍ$ÿý¢ËÍÍ%ÿþ²ÍÍ&ÿþÂÍÍ&ÿý¢ËÍÍ'ÿþ³ÍÍ(ÿþÃÍÍ(ÿý¢ËÍÍ)ÿþ³ÍÍ*ÿþÃÍÍ*ÿý¢ËÍÍ+ÿþ³ÍÍ,ÿþÃÍÍ,ÿý¤ÌÍÍ-ÿþºÍÍ.ÿþÉÍÍ.ÿþ°ÍÍ/ÿþÃÍ Í/ÿý¥ÌÍ Í0ÿþ»Í Í1ÿþÉÍ Í1ÿþ±Í Í2ÿþÄÍ Íþ¡ÿ0ÿý¦ÌÍ ÍþÄÿ1ÿþ»Í Íþ¸ÿ1ÿþÊÍ Íþªÿ0ÿþ±Í ÍýÉÇÿ0ÿþÄÍÍÿýÃþÿ'ÿþÌÿÿþËÿ'ÿýý·ÿÿþ×ÿ'ÿþòÿÿþæÿ'ÿþÞÿÿýÓòÿ'ÿþÇÿÿýµúÿ&ÿýû´ÿÿþÂÿ'ÿþîÿÿþÒÿ'ÿþÙÿÿþâÿ'ÿþÂÿÿþïÿ&ÿýù±ÿÿý³ùÿ&ÿþêÿÿý¾þÿ&ÿþÔÿÿþÎÿ&ÿýþ¾ÿÿþßÿ&ÿýö½ÿÿþíÿ&ÿþàÿÿý±÷ÿ&ÿþÃÿÿý»ýÿ%ÿþ÷ÿÿþËÿ>ÿþâÿ=ÿýÞôÿ=ÿýºýÿ=ÿþÐÿ>ÿþæÿ=ÿý¯÷ÿ=ÿý¾þÿ=ÿþÕÿ>ÿþêÿ=ÿý±ùÿ=ÿþÂÿ>ÿþÙÿ>ÿþîÿ=ÿý´ûÿ=ÿþÈÿ>ÿþäÿ=ÿý°ùÿ=ÿþÇÿ>ÿþåÿ=ÿý°ùÿ=ÿþÈÿ>ÿþåÿ=ÿý°úÿ=ÿþÈÿ>ÿþæÿ=ÿý±úÿ=ÿþÉÿ>ÿþæÿ=ÿý±úÿ=ÿþÊÿ>ÿþçÿ=ÿý´ýÿ=ÿþÕÿ>ÿþõÿ=ÿþÄÿ>ÿþèÿ=ÿýµýÿ=ÿþÖÿ>ÿþöÿ=ÿþÅÿ>ÿþéÿ ÿþ°ÿ0ÿýµþÿ ÿþèÿ1ÿþ×ÿ ÿþÑÿ1ÿþöÿ ÿýþ»ÿ0ÿþÆÿ ÿýõÈÿ0ÿþêÿÿÿþèÿ=ÿþfÿ=ÿý2¨ÿ<ÿü2>èÿ;ÿ2þfÿ;ÿ2þ§ÿ:ÿ2ý>åÿ9ÿ2þeÿ9ÿ2þ¦ÿ8ÿ2ý>åÿ7ÿ2þdÿ7ÿ2þ¥ÿ6ÿ2ý=äÿ5ÿ2þdÿ5ÿ2þ«ÿ4ÿ2þDÿ4ÿ 2þÿ3ÿ 2ý6Õÿ2ÿ 2þ]ÿ2ÿ 2þ«ÿ1ÿ 2þCÿ1ÿ 2þ€ÿ0ÿ 2ý6Õÿ/ÿ 2þ]ÿ/ÿ2þªÿ.ÿ2þCÿ.ÿ2þ€ÿ-ÿ2ý6Óÿ,ÿ2þ\ÿ,ÿ2þªÿ+ÿ2þCÿ+ÿ2þ€ÿ*ÿ2ý7Üÿ)ÿ2þmÿ)ÿ2ý4Íÿ(ÿ2þ`ÿ(ÿ2þ½ÿ'ÿ2þTÿ'ÿ2þ¬ÿ&ÿ2þJÿ&ÿ2þ›ÿ%ÿ2þBÿ%ÿ2þ‹ÿ$ÿ2ý<õÿ#ÿ2þ|ÿ#ÿ2ý7Þÿ"ÿ2þoÿ"ÿ2ý4Ïÿ!ÿÿþìÿ=ÿþ{ÿ=ÿýLµÿ<ÿüLWìÿ;ÿLþzÿ;ÿLþ´ÿ:ÿLýVêÿ9ÿLþyÿ9ÿLþ³ÿ8ÿLýVêÿ7ÿLþyÿ7ÿLþ²ÿ6ÿLýVéÿ5ÿLþxÿ5ÿLþ·ÿ4ÿLþ\ÿ4ÿ Lþ’ÿ3ÿ LýOÜÿ2ÿ Lþrÿ2ÿ Lþ·ÿ1ÿ Lþ[ÿ1ÿ Lþ‘ÿ0ÿ LýOÜÿ/ÿ Lþrÿ/ÿLþ¶ÿ.ÿLþ[ÿ.ÿLþ‘ÿ-ÿLýOÛÿ,ÿLþqÿ,ÿLþ¶ÿ+ÿLþ[ÿ+ÿLþ‘ÿ*ÿLýPãÿ)ÿLþ€ÿ)ÿLýMÖÿ(ÿLþuÿ(ÿLþÇÿ'ÿLþjÿ'ÿLþ¸ÿ&ÿLþaÿ&ÿLþ©ÿ%ÿLþZÿ%ÿLþ›ÿ$ÿLýT÷ÿ#ÿLþŽÿ#ÿLýPåÿ"ÿLþ‚ÿ"ÿLýM×ÿ!ÿÿþ©ÿ=ÿþÀÿ=ÿýͯÿ<ÿüÍÊ©ÿ;ÿÍþÀÿ;ÿÍþ¯ÿ:ÿÍýÊ ÿ9ÿÍþÀÿ9ÿÍþ°ÿ8ÿÍýÊ ÿ7ÿÍþÀÿ7ÿÍþ°ÿ6ÿÍýÊ ÿ5ÿÍþÀÿ5ÿÍþ¯ÿ4ÿÍþÈÿ4ÿ Íþ¹ÿ3ÿ Íý̤ÿ2ÿ ÍþÂÿ2ÿ Íþ¯ÿ1ÿ ÍþÉÿ1ÿ Íþ¹ÿ0ÿ Íý̤ÿ/ÿ ÍþÂÿ/ÿÍþ¯ÿ.ÿÍþÉÿ.ÿÍþ¹ÿ-ÿÍý̤ÿ,ÿÍþÂÿ,ÿÍþ¯ÿ+ÿÍþÉÿ+ÿÍþ¹ÿ*ÿÍýÌ¢ÿ)ÿÍþ¾ÿ)ÿÍþ¦ÿ(ÿÍþÁÿ(ÿÍþªÿ'ÿÍþÄÿ'ÿÍþ®ÿ&ÿÍþÇÿ&ÿÍþ²ÿ%ÿÍþÉÿ%ÿÍþ·ÿ$ÿÍýËÕÿ#ÿÍþºÿ#ÿÍýÌ¢ÿ"ÿÍþ¾ÿ"ÿÍþ¥ÿ!ÿÿþ³ÿ=ÿþàÿ>ÿþÃÿ=ÿý÷³ÿ=ÿþáÿ>ÿþÃÿ=ÿý÷®ÿ=ÿþáÿ>ÿþÄÿ=ÿý÷®ÿ=ÿþáÿ>ÿþÄÿ=ÿýø®ÿ=ÿþâÿ>ÿþÂÿ=ÿþôÿ>ÿþÔÿ=ÿýý³ÿ=ÿþåÿ>ÿþÂÿ=ÿþôÿ>ÿþÔÿ=ÿýý³ÿ=ÿþåÿ>ÿþÂÿ=ÿþôÿ>ÿþÔÿ=ÿýý³ÿ=ÿþæÿ>ÿþÂÿ=ÿþôÿ>ÿþÔÿ=ÿýü±ÿ=ÿþÝÿ=ÿýþµÿ=ÿþäÿ>ÿþ»ÿ=ÿþêÿ>ÿþÂÿ=ÿþðÿ>ÿþÈÿ=ÿþõÿ>ÿþÏÿ=ÿýùÓÿ=ÿþÖÿ=ÿýü°ÿ=ÿþÜÿ=ÿýþµÿ!ÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(DþÿÃþ¡‡ ‡Ãý¾Š‡‡Ãþ¥‡‡ÃýÀ‹‡‡Ãþ¨‡‡ÃýÁއ‡Ãþ¬‡‡ Ãþ‡‡ Ãþ°‡‡!Ãþ“‡‡!Ãþ³‡‡"Ãþ—‡‡"Ãþ·‡‡#Ãþš‡‡#Ãýºˆ‡‡$Ãþž‡‡$Ãý½‰‡‡%Ãþ¢‡‡%Ãý¿Š‡‡&Ãþ¦‡‡&ÃýÁŒ‡‡'Ãþ©‡‡'ÃýÂŽ‡‡(Ãþ­‡‡)Ãþ‘‡‡)Ãþ°‡‡*Ãþ”‡‡*Ãþ´‡‡+Ãþ˜‡‡+Ãþ¸‡‡,Ãþ›‡‡,Ãý»ˆ‡‡-ÃþŸ‡‡-Ãý½‰‡‡.Ãþ£‡‡ ÃþÂÃ"Ãý¿‹‡ ‡ Ãþ«Ã#Ãþ¦‡ ‡ Ãýž¯Ã"ÃýÁ‡ ‡ ÃýžÃ#Ãþª‡ ‡ Ãüž‡¬Ã"Ãý‡ ‡ Ãûž‡ŽÁÃ"Ãþ®‡ ‡ Ãûž‡‡¨Ã#Ãþ’‡ ‡ Ãúž‡‡‹ÀÃ"Ãþ±‡ ‡ Ãþž‡‡þ¤Ã#Ãþ•‡ ‡ Ãþž‡‡ýоÃ"Ãþµ‡ ‡ Ãþž‡‡þ¡Ã#Ãþ™‡‡ Ãþž‡‡ýˆ¼Ã"Ãþ¸‡‡ Ãþž‡‡þÃ#Ãþœ‡‡ Ãþž‡‡þ¹Ã"Ãý»ˆ‡‡ Ãþž‡‡þ™Ã#Ãþ ‡‡ Ãþž‡‡þ¶Ã"Ãý¾‰‡‡ Ãþž‡‡þ–Ã#Ãþ¤‡‡ Ãþž‡‡þ²Ã"ÃýÀ‹‡‡ Ãþž‡‡þ’Ã#Ãþ§‡‡ Ãþž‡‡þ¯Ã"ÃýÁ‡‡ Ãþž‡‡ýÂÃ"Ãþ«‡‡ Ãþž‡‡þ«Ã"Ãý‡‡ Ãþž‡‡ýÁÃ"Ãþ¯‡‡ Ãþž‡ ‡þ§Ã#Ãþ“‡‡ Ãþž‡ ‡ý‹ÀÃ"Ãþ²‡‡ Ãþž‡ ‡þ£Ã#Ãü–‡‡ÃÃþž‡ ‡ý‰½Ã"Ãü¶‡‡ÃÃþž‡ ‡þ Ã#Ãý™‡ÃÃþž‡ ‡ýˆ»Ã"Ãþ¹‡ØþÕÓ ÓØþ×Ó ÓØþÕÓÓØþ×ÓÓØþÖÓÓØþÔÓÓØþÖÓÓ ØþÔÓÓ ØþÖÓÓ!ØþÔÓÓ!ØþÖÓÓ"ØþÔÓÓ"Øþ×ÓÓ#ØþÕÓÓ#Øþ×ÓÓ$ØþÕÓÓ$Øþ×ÓÓ%ØþÕÓÓ%Øþ×ÓÓ&ØþÕÓÓ&Øþ×ÓÓ'ØþÖÓÓ(ØþÔÓÓ(ØþÖÓÓ)ØþÔÓÓ)ØþÖÓÓ*ØþÔÓÓ*Øþ×ÓÓ+ØþÔÓÓ+Øþ×ÓÓ,ØþÕÓÓ,Øþ×ÓÓ-ØþÕÓÓ-Øþ×ÓÓ.ØþÕÓÓ.Øþ×ÓÓ ØþÖØ#ØþÕÓ Ó ØýÕÖØ#ØÓ ØýÕÔØ#ØþÖÓ Ó ØüÕÓÖØ#ØþÔÓ Ó ØüÕÓÔØ#ØþÖÓ Ó ØûÕÓÓÖØ#ØþÔÓ Ó ØþÕÓÓþר"ØþÖÓ Ó ØþÕÓÓþÕØ#ØþÔÓ Ó ØþÕÓÓþר"Øþ×Ó Ó ØþÕÓÓþÕØ#ØþÔÓÓ ØþÕÓÓþר"Øþ×ÓÓ ØþÕÓÓþÕØ#ØþÕÓÓ ØþÕÓÓþר"Øþ×ÓÓ ØþÕÓÓþÔØ#ØþÕÓÓ ØþÕÓÓþר"Øþ×ÓÓ ØþÕÓÓþÔØ#ØþÕÓÓ ØþÕÓÓþÖØ"Øþ×ÓÓ ØþÕÓÓþÔØ#ØþÖÓÓ ØþÕÓÓþÖØ#ØÓ ØþÕÓÓþÔØ#ØþÖÓÓ ØþÕÓÓþÖØ#ØþÔÓÓ ØþÕÓ Ó$ØþÖÓÓ ØþÕÓ ÓþÖØ#ØþÔÓÓ ØþÕÓ Óþר"ØþÖÓÓ ØþÕÓ ÓþÕØ#ØüÔÓÓØØþÕÓ Óþר"Øü×ÓÓØØþÕÓ ÓþÕØ#ØýÔÓØØþÕÓ Óþר"Øþ×Óþ-D DýADDþ*DDý@DDþ'DDý>DDþ#DD þDD(þ#DD)þ;DD)þDD*þ8DD*þDD+þ5DD+þDD,þ2DD,ýCDD-þ/DD-ýBDD.þ,DD þ"ýAD D þ$#þ(D D ý/ "ý?D D ý/<#þ%D D ü/D$"ý=D D û/D>"þ"D D û/DD'#þ;D D ú/DD@"þD D þ/DDþ*#þ8D D þ/DDýB"þD D þ/DDþ-#þ5DD þ/DDýC"þDD þ/DDþ1#þ1DD þ/DDþ"ýCDD þ/DDþ4#þ.DD þ/DDþ"ýBDD þ/DDþ7#þ+DD þ/DDþ"ý@DD þ/DDþ:#þ(DD þ/DDþ!"ý?DD þ/DDý<"þ$DD þ/DDþ$"ý"Dþ'"Dý@!Dþ*!DýA Dþ- DýCDþ0DþDþ3DþDþ7 Dþ Dþ:!Dþ!!Dý<"Dþ$"Dý>#Dþ'#Dý@$Dþ*$DýB%Dþ.%DýC&Dþ1'Dþ'Dþ4(Dþ(Dþ7)Dþ)Dþ:*Dþ!*Dý=+Dþ%+Dý?,Dþ(,DýA-Dþ+-DýB.Dþ..DýC /Dþ2 0Dþ 0Dþ5 1Dþ 1Dþ8 2Dþ 2Dþ; 3Dþ" 3Dý=4Dþ%4Dý?ÿ‡þÅÿ4ÿ‡þ‘ÿ4ÿ ‡þ¾ÿ3ÿ ‡þŽÿ3ÿ ‡þ·ÿ2ÿ ‡þ‹ÿ2ÿ ‡þ°ÿ1ÿ ‡ý‰õÿ0ÿ ‡þªÿ0ÿ ‡ýˆãÿ/ÿ ‡þ¤ÿ/ÿþ‡ ‡þÜÿ.ÿþ®‡ ‡þžÿ.ÿýÃ’‡ ‡þÓÿ-ÿýñ‡ ‡þ™ÿ-ÿÃþ•‡ ‡þËÿ,ÿÃþµ‡ ‡þ”ÿ,ÿÃþ™‡ ‡þÃÿ+ÿÃþ¸‡ ‡þÿ+ÿÃþœ‡ ‡þ¼ÿ*ÿÃý»ˆ‡ ‡þÿ*ÿÃþ ‡ ‡þ¶ÿ)ÿÃý¾‰‡ ‡þ‹ÿ)ÿÃþ¤‡ ‡þ¯ÿ(ÿÃýÀ‹‡ ‡ý‰ñÿ'ÿÃþ§‡ ‡þ©ÿ'ÿÃýÁ‡ ‡ýˆâÿ&ÿÃþ«‡ ‡þ¢ÿ&ÿÃý‡ ‡þÚÿ%ÿÃþ¯‡ ‡þÿ%ÿ Ãþ“‡ ‡þÒÿ$ÿ Ãþ²‡ ‡þ—ÿ$ÿ Ãþ–‡ ‡þÉÿ#ÿ Ãþ¶‡ ‡þ“ÿ#ÿ Ãþ™‡ ‡þÂÿ"ÿ Ãþ¹‡ ‡þÿ"ÿ Ãþ‡ ‡þ»ÿ!ÿ Ãý¼ˆ‡ ‡þÿ!ÿ Ãþ¡‡ ‡þ´ÿ ÿ Ãý¾Š‡ ‡þŠÿ ÿÃþ¥‡ ‡þ­ÿÿÃýÀ‹‡ ‡ý‰íÿÿÃþ¨‡ ‡þ§ÿÿÃýÁއ ‡ýˆàÿÿÃþ¬‡ ‡þ¡ÿÿÃþ‡ ‡þØÿÿÃþ¯‡ ‡þ›ÿÿÃþ“‡ ‡þÐÿÿÃþ³‡ ‡þ–ÿÿÃþ—‡ ‡þÈÿÿÃþ·‡ ‡þ’ÿÿÃþš‡ ‡þÁÿÿÃýºˆ‡ ‡þÿÿÃþž‡ ‡þ¹ÿÿÃý¼‰‡ ‡þŒÿÿÃþ¢‡ ‡þ²ÿÿÃý¿Š‡ ‡ýŠýÿÿÃþ¥‡ ‡þ¬ÿÿÃýÀŒ‡ ‡ý‰åÿÿÃþ©‡ ‡þ¦ÿÿÃýÂŽ‡ ‡þÞÿÿÃþ­‡ ‡þ ÿÿÃþ‘‡ ‡þÖÿÿÃþ°‡ ‡þšÿÿÓþêÿ4ÿÓþ×ÿ4ÿ Óþèÿ3ÿ ÓþÖÿ3ÿ Óþåÿ2ÿ ÓþÕÿ2ÿ Óþâÿ1ÿ ÓýÔûÿ0ÿ Óþàÿ0ÿ Óþõÿ/ÿ ÓþÞÿ/ÿþÔÓ Óþóÿ.ÿþÖÓ ÓþÜÿ.ÿýØÔÓ Óþðÿ-ÿýØÖÓ ÓþÚÿ-ÿØþÔÓ Óþíÿ,ÿØþ×Ó ÓþØÿ,ÿØþÔÓ Óþêÿ+ÿØþ×Ó Óþ×ÿ+ÿØþÕÓ Óþçÿ*ÿØþ×Ó ÓþÕÿ*ÿØþÕÓ Óþäÿ)ÿØþ×Ó ÓþÔÿ)ÿØþÕÓ Óþâÿ(ÿØþ×Ó ÓýÔúÿ'ÿØþÖÓ Óþàÿ'ÿØÓþõÿ&ÿØþÖÓ ÓþÝÿ&ÿØþÔÓ Óþòÿ%ÿØþÖÓ ÓþÛÿ%ÿ ØþÔÓ Óþïÿ$ÿ ØþÖÓ ÓþÙÿ$ÿ ØþÔÓ Óþìÿ#ÿ Øþ×Ó ÓþØÿ#ÿ ØþÔÓ Óþéÿ"ÿ Øþ×Ó ÓþÖÿ"ÿ ØþÕÓ Óþçÿ!ÿ Øþ×Ó ÓþÕÿ!ÿ ØþÕÓ Óþäÿ ÿ Øþ×Ó ÓþÔÿ ÿØþÕÓ ÓþáÿÿØþ×Ó ÓýÔùÿÿØþÖÓ ÓþßÿÿØþÔÓ ÓþôÿÿØþÖÓ ÓþÝÿÿØþÔÓ ÓþòÿÿØþÖÓ ÓþÛÿÿØþÔÓ ÓþîÿÿØþÖÓ ÓþÙÿÿØþÔÓ ÓþëÿÿØþ×Ó Óþ×ÿÿØþÕÓ ÓþéÿÿØþ×Ó ÓþÖÿÿØþÕÓ ÓþæÿÿØþ×Ó ÓþÕÿÿØþÕÓ ÓþãÿÿØþ×Ó ÓýÔþÿÿØþÕÓ ÓþáÿÿØþ×Ó ÓýÔöÿÿØþÖÓ ÓþßÿÿØþÔÓ ÓþôÿÿØþÖÓ ÓþÜÿÿØþÔÓ ÓþñÿÿØþÖÓ ÓþÚÿÿDþrÿ4ÿDþKÿ4ÿ Dþlÿ3ÿ DþIÿ3ÿ Dþgÿ2ÿ DþGÿ2ÿ Dþbÿ1ÿ DýFÌÿ0ÿ Dþ^ÿ0ÿ DýE‡ÿ/ÿ DþYÿ/ÿþ=D Dþ‚ÿ.ÿþ"D DþUÿ.ÿý:D Dþ|ÿ-ÿýD DþQÿ-ÿþ8D Dþvÿ,ÿþD DþNÿ,ÿþ5D Dþpÿ+ÿþD DþKÿ+ÿþ1D Dþkÿ*ÿýCD DþIÿ*ÿþ.D Dþfÿ)ÿýBD DþGÿ)ÿþ+D Dþaÿ(ÿý@D DýF»ÿ'ÿþ(D Dþ]ÿ'ÿý?D DýE‡ÿ&ÿþ$D DþXÿ&ÿýD Dþ…ÿÿþ$D DþWÿÿþD Dþ„ÿÿþ#D DþVÿÿþ;D Dþ~ÿÿþD DþRÿÿÿþÇÿ=ÿþôÿ>ÿþÍÿ=ÿþ÷ÿ>ÿþÒÿ=ÿþúÿ>ÿþ×ÿ=ÿýüÕÿ=ÿþÜÿ=ÿýþ´ÿ=ÿþâÿ>ÿþ¹ÿ=ÿþçÿ>ÿþ¾ÿ=ÿþìÿ>ÿþÃÿ=ÿþñÿ>ÿþÈÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿ>ÿþÓÿ=ÿþûÿ>ÿþØÿ=ÿýýËÿ=ÿþÞÿ=ÿýþµÿ=ÿþãÿ>ÿþºÿ=ÿþèÿ>ÿþ¿ÿ=ÿþíÿ>ÿþÄÿ=ÿþòÿ>ÿþÊÿ=ÿþõÿ>ÿþÏÿ=ÿþøÿ>ÿþÔÿ=ÿþûÿ>ÿþÙÿ=ÿýýÁÿ=ÿþßÿ=ÿýþ¶ÿ=ÿþäÿ>ÿþ»ÿ=ÿþêÿ>ÿþÀÿ=ÿþîÿ>ÿþÅÿ=ÿþóÿ>ÿþËÿ=ÿþöÿ>ÿþÐÿ=ÿþùÿ>ÿþÕÿ=ÿýüôÿ=ÿþÛÿ=ÿýý³ÿ=ÿþàÿ>ÿþ·ÿ=ÿþåÿ>ÿþ¼ÿ=ÿþëÿÿÿÿÿÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿ8ÿþ¹‡‡8ÿþއ‡7ÿþ¾‡‡7ÿþ‡‡6ÿþć‡6ÿþ“‡‡5ÿþʇ‡5ÿþ˜‡‡4ÿþÖ‡‡4ÿþ¢‡‡3ÿý切‡3ÿþ¬‡ ‡3ÿþЇ ‡2ÿþ¸‡ ‡2ÿþއ ‡1ÿþć ‡1ÿþ–‡ ‡0ÿþׇ ‡0ÿþ¦‡ ‡þÿ/ÿþ‰‡ ‡þ©ÿ.ÿþ¸‡ ‡ý‹Àÿ.ÿþ‡ ‡ý¢Ãÿ-ÿþ͇ ‡ý»Ãÿ-ÿþŸ‡ ‡ü˜ÃÃÿ,ÿþè‡ ‡ü²ÃÃÿ,ÿþ³‡ ‡þÃÃ-ÿþ‡ ‡þ§ÃÃ,ÿþЇ ‡ý‰¿ÃÃ,ÿþ£‡ ‡þÃÃ,ÿþ‰‡ ‡þµÃÃ+ÿþ¼‡ ‡þÃÃ+ÿþ•‡ ‡þ§ÃÃ*ÿþ܇ ‡ýˆ¾ÃÃ*ÿþ®‡ ‡þ™ÃÃ*ÿþއ ‡þ±ÃÃ)ÿþч ‡ýŒÂÃÃ)ÿþ§‡ ‡þ¢ÃÃ)ÿþЇ ‡þºÃÃ(ÿþƇ ‡þ”ÃÃ(ÿþŸ‡ ‡þªÃÃ(ÿþˆ‡ ‡ýˆ¾ÃÃ'ÿþ¾‡ ‡þ˜ÃÃ'ÿþ›‡ ‡þ®ÃÃ&ÿýýˆ‡ ‡ýŠÁÃÃ&ÿþ¿‡ ‡þÃÃ&ÿþœ‡ ‡þ²ÃÃ&ÿþˆ‡ ‡ý‹ÂÃÃ%ÿþÁ‡ ‡þžÃ Ã%ÿþ‡ ‡þ²Ã Ã%ÿþˆ‡ ‡ý‹Âà Ã$ÿþÇ ‡þà Ã$ÿþ¢‡ ‡þ±Ã Ã$ÿþЇ ‡ýŠÁà Ã#ÿþ· ‡þœÃ Ã#ÿþª‡ ‡þ°Ã Ã#ÿþ‡ ‡ý‰Áà Ã"ÿþÚ‡ ‡þ˜Ã Ã"ÿþ´‡ ‡þ«Ã Ã"ÿþ–‡ ‡þ½Ã Ã!ÿþõ‡ ‡þ“à Ã!ÿþ‡ ‡þ¥Ã Ã!ÿþ£‡ ‡þ¸Ã Ã!ÿþŒ‡ ‡þŽÃà ÿþׇ ‡þ ÃÃ8ÿþæÓÓ8ÿþÖÓÓ7ÿþèÓÓ7ÿþ×ÓÓ6ÿþêÓÓ6ÿþØÓÓ5ÿþìÓÓ5ÿþÙÓÓ4ÿþñÓÓ4ÿþÝÓÓ3ÿþöÓ Ó3ÿþáÓ Ó3ÿþÔÓ Ó2ÿþåÓ Ó2ÿþÖÓ Ó1ÿþêÓ Ó1ÿþÙÓ Ó0ÿþñÓ Ó0ÿþßÓ ÓþÔÿ/ÿþÔÓ ÓþÖÿ.ÿþåÓ Óþ×ÿ.ÿþ×Ó ÓýÕØÿ-ÿþíÓ Óýרÿ-ÿþÜÓ ÓüÔØØÿ,ÿþ÷Ó ÓüÖØØÿ,ÿþäÓ ÓþÔØØ-ÿþÖÓ ÓþÖØØ,ÿþîÓ ÓþרØ,ÿþÞÓ ÓþÕØØ,ÿþÔÓ ÓþרØ+ÿþçÓ ÓþÔØØ+ÿþØÓ ÓþÖØØ*ÿþóÓ ÓþרØ*ÿþâÓ ÓþÔØØ*ÿþÖÓ ÓþÖØØ)ÿþïÓ ÓØ)ÿþßÓ ÓþÕØØ)ÿþÔÓ ÓþרØ(ÿþëÓ ÓþÔØØ(ÿþÜÓ ÓþÖØØ(ÿ ÓþרØ'ÿþèÓ ÓþÔØØ'ÿþÛÓ ÓþÖØØ&ÿþþÓ Ó Ø&ÿþèÓ ÓþÕØØ&ÿþÛÓ ÓþÖØØ&ÿ Ó Ø%ÿþéÓ ÓþÕØ Ø%ÿþÛÓ ÓþÖØ Ø%ÿ Ó Ø$ÿþêÓ ÓþÕØ Ø$ÿþÝÓ ÓþÖØ Ø$ÿþÔÓ Ó Ø#ÿþîÓ ÓþÕØ Ø#ÿþàÓ ÓþÖØ Ø#ÿþÖÓ Óþר Ø"ÿþòÓ ÓþÔØ Ø"ÿþäÓ ÓþÖØ Ø"ÿþÙÓ Óþר Ø!ÿþûÓ ÓþÔØ Ø!ÿþéÓ ÓþÕØ Ø!ÿþÞÓ Óþר Ø!ÿþÕÓ ÓþÔØØ ÿþñÓ ÓþÕØØ8ÿþhDD8ÿþIDD7ÿþmDD7ÿþKDD6ÿþqDD6ÿþMDD5ÿþuDD5ÿþPDD4ÿþ~DD4ÿþXDD3ÿþ‰D D3ÿþ_D D3ÿþFD D2ÿþhD D2ÿþID D1ÿþqD D1ÿþOD D0ÿþD D0ÿþ[D Dþ=ÿ/ÿþED Dþ&ÿ.ÿþhD DýAÿ.ÿþKD Dý,ÿ-ÿþwD Dýÿ-ÿþUD Dü5ÿ,ÿþ”D Düÿ,ÿþeD Dþ=-ÿþJD Dþ',ÿþyD DýC,ÿþYD Dþ0,ÿþED Dþ+ÿþkD Dþ<+ÿþOD Dþ'*ÿþ‚D DýC*ÿþaD Dþ4*ÿþID Dþ)ÿþzD Dý?)ÿþ[D Dþ,)ÿþFD Dþ(ÿþsD Dþ9(ÿþVD Dþ%(ÿþED DýC'ÿþmD Dþ5'ÿþSD Dþ!&ÿþôD DýB&ÿþmD Dþ1&ÿþSD Dþ&ÿþED Dý@%ÿþnD Dþ0 %ÿþTD Dþ %ÿþED DýA $ÿþpD Dþ1 $ÿþXD Dþ $ÿþFD DýA #ÿþxD Dþ2 #ÿþ^D Dþ  #ÿþJD DýC "ÿþD Dþ5 "ÿþeD Dþ% "ÿþOD Dþ !ÿþÌD Dþ: !ÿþpD Dþ) !ÿþYD Dþ !ÿþHD Dþ> ÿþD Dþ.8ÿþÐÿ=ÿþ÷ÿ<ÿþÌÿ=ÿþõÿ<ÿþÈÿ=ÿþòÿ<ÿþÄÿ=ÿþíÿ<ÿþ¼ÿ=ÿþäÿ<ÿý³þÿ<ÿþÚÿ=ÿþüÿ<ÿþÑÿ=ÿþ÷ÿ<ÿþÈÿ=ÿþïÿ<ÿþ»ÿ=ÿþàÿ=ÿþýÿ<ÿþÑÿ=ÿþõÿ<ÿþÂÿ=ÿþæÿ<ÿþ¸ÿ=ÿþÕÿ=ÿþõÿ<ÿþÀÿ=ÿþâÿ=ÿþýÿ<ÿþÎÿ=ÿþïÿ<ÿþ¹ÿ=ÿþÙÿ=ÿþ÷ÿ<ÿþÀÿ=ÿþßÿ=ÿþûÿ<ÿþÆÿ=ÿþæÿ=ÿþþÿ<ÿþÌÿ=ÿþêÿ<ÿýôþÿ<ÿþÌÿ=ÿþéÿ=ÿþþÿ<ÿþËÿ=ÿþèÿ=ÿþþÿ<ÿþÉÿ=ÿþäÿ=ÿþüÿ<ÿþÁÿ=ÿþÜÿ=ÿþöÿ<ÿþºÿ=ÿþÔÿ=ÿþïÿ<ÿþÕÿ=ÿþÉÿ=ÿþâÿ=ÿþùÿ<ÿþ»ÿÿ‡þ§Ã#Ãþ¤‡‡ýŒÁÃ"Ãý¼‰‡‡þ©Ã#Ãþ›‡‡ýÁÃ"Ãþ´‡‡þ«Ã#Ãþ’‡‡ýÂÃ"Ãþ«‡‡þ©Ã"ÃýÀŒ‡‡ýŒÁÃ"Ãþ¤‡‡þ¦Ã"Ãý½‰‡‡ýŠÀÃ"ÃþŸ‡‡þ£Ã"Ãýºˆ‡‡ý‰¾Ã"Ãþš‡‡þ Ã"Ãþ¶‡‡ýˆ¼Ã"Ãþ–‡‡þœÃ"Ãþ³‡‡þ·Ã"Ãþ”‡‡þ•Ã"Ãþ±‡‡þ°Ã"Ãþ“‡‡#Ãþ°‡‡#Ãþ‘‡‡"Ãþ¯‡‡"Ãþ’‡‡!Ãþ²‡‡!Ãþ•‡‡ Ãþ´‡‡ Ãþ˜‡‡Ãþ·‡‡Ãþ›‡‡Ãý¼ˆ‡‡Ãþ¢‡‡ÃýÀЇ‡Ãþ©‡‡Ãþ‡‡Ãþ¯‡ ‡Ãþ•‡ ‡Ãþ¸‡!‡ÃþŸ‡!‡ÃýÀЇ!‡Ãþª‡"‡Ãþ‡"‡Ãþ´‡#‡Ãþš‡#‡Ãý¾ˆ‡#‡Ãþ¨‡$‡Ãþ‘‡$‡Ãþ¶‡%‡ÃþŸ‡%‡ÃýÁЇ%‡Ãþ­‡&‡Ãþ•‡&‡Ãþ¼‡'‡Ãþ¦‡'‡Ãþ‡'‡Ãþ·‡(‡Ãþ¢‡(‡Ãþ‡(‡Ãþ´‡)‡Ãþ¡‡)‡Ãþ‡)‡Ãþµ‡*‡Ãþ¡‡*‡Ãþ‡*‡Ãþµ‡+‡Ãþ¡‡+‡ÓþÖØ#ØþÕÓÓ$Øþ×ÓÓþÖØ#ØþÕÓÓ$Øþ×ÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÖØ"Øþ×ÓÓ$ØþÕÓÓþÕØ"Øþ×ÓÓþר"ØþÕÓÓþÕØ"Øþ×ÓÓþר"ØþÔÓÓþÕØ"Øþ×ÓÓþר"ØþÔÓÓþÕØ"ØþÖÓÓþר"ØþÔÓÓþÔØ"ØþÖÓÓþÖØ"ØþÔÓÓ#ØþÖÓÓ#ØþÔÓÓ"ØþÖÓÓ"ØþÔÓÓ!ØþÖÓÓ!ØþÔÓÓ Øþ×ÓÓ ØþÔÓÓØþ×ÓÓØþÕÓÓØþ×ÓÓØþÕÓÓØþ×ÓÓØþÖÓÓØþÔÓÓØþÖÓ ÓØþÔÓ ÓØþ×Ó!ÓØþÕÓ!ÓØþ×Ó"ÓØþÖÓ"ÓØþÔÓ"ÓØþÖÓ#ÓØþÕÓ#ÓØþ×Ó$ÓØþÖÓ$ÓØþÔÓ$ÓØþ×Ó%ÓØþÕÓ%ÓØ'ÓØþÖÓ&ÓØþÔÓ&ÓØþ×Ó'ÓØþÕÓ'ÓØþÔÓ'ÓØþ×Ó(ÓØþÕÓ(ÓØ*ÓØþ×Ó)ÓØþÕÓ)ÓØ+ÓØþ×Ó*ÓØþÕÓ*ÓØ,ÓØþ×Ó+ÓØþÕÓ+ÓDþ(#þ*DDý?"ýBDDþ&#þ3DDý>"þDDþ%#þ:DDý>"þ$DDþ&"ý@DDý@"þ*DDþ)"ýBDDýA"þ/DDþ+"ýCDDýB"þ3DDþ."þDDýC"þ7DDþ2"þDDþ"þ8DDþ8"þDDþ "þ:DD#þ DD#þ;DD"þ!DD"þ:DD!þDD!þ8DD þDD þ5DDþDDþ2DDýCDDþ,DDýADDþ&DDþ=DDþ D Dþ7D DþD!Dþ.D!DýBD!Dþ%D"DþDDýGÿÿý9DDýF}ÿÿþ2DDýEzÿÿþ+DDýEwÿÿþ"DDþtÿÿýBDDþnÿÿý=DDþeÿÿþ5DDþ\ÿÿþ*DDþUÿÿþDDþNÿÿý@D DýI»ÿÿý8D DýFÿÿþ,DDþuÿÿ þDDþeÿÿ ý?D DþVÿÿ þ2D DþLÿ ÿ þ"D DýF…ÿ ÿ ýAD Dþqÿ!ÿ þ6D Dþ]ÿ"ÿ þ$D DþOÿ#ÿýAD DýF‡ÿ#ÿþ6D Dþpÿ$ÿþ"D DþXÿ%ÿý@D DþIÿ&ÿþ0D Dþyÿ&ÿþD Dþ^ÿ'ÿýD Dþiÿ,ÿý(D DþMÿ-ÿýAD Dþ{ÿ-ÿþ-D DþXÿ.ÿþCD DýF»ÿ.ÿ Dþdÿ/ÿ DþIÿ0ÿ Dþmÿ0ÿ DþMÿ1ÿ Dþvÿ1ÿ DþPÿ2ÿ Dþyÿ2ÿ DþRÿ3ÿ Dþ|ÿ3ÿDþSÿ4ÿDþ|ÿ4ÿDþRÿ5ÿDþyÿ5ÿDþPÿ6ÿDþtÿ6ÿDþKÿ7ÿDþkÿ7ÿDþGÿ8ÿDþcÿ8ÿDýEÌÿ8ÿDþZÿ9ÿDþÿ9ÿDþPÿ:ÿ,ÿýüÀÿ;ÿýû¼ÿ;ÿýû¼ÿ;ÿýû¼ÿ;ÿýü½ÿ;ÿýýÀÿ;ÿýþÂÿ;ÿýþÅÿ<ÿþËÿ<ÿþÔÿ<ÿþÞÿ<ÿþæÿ<ÿþðÿ<ÿý÷Ìÿ;ÿýüºÿ<ÿþÄÿ<ÿþÕÿ<ÿþæÿ<ÿþóÿ<ÿýü·ÿ<ÿþÇÿ<ÿþÝÿ<ÿþïÿ<ÿýü´ÿ<ÿþÉÿ<ÿþäÿ<ÿþ÷ÿ=ÿþÁÿ<ÿþÜÿ<ÿþõÿ=ÿþÀÿ<ÿþÞÿ<ÿþöÿ=ÿþÄÿ<ÿþåÿ<ÿýûÌÿ<ÿþÐÿ<ÿþòÿ=ÿþ¿ÿ<ÿþãÿ<ÿýüÌÿ<ÿþÕÿ<ÿþøÿ=ÿþÌÿ<ÿþòÿ=ÿþÄÿ<ÿþíÿ=ÿþÁÿ<ÿþëÿ=ÿþ¾ÿ<ÿþéÿ=ÿþ¾ÿ<ÿþëÿ=ÿþÁÿ<ÿþîÿ=ÿþÅÿ<ÿþôÿ=ÿþÎÿ<ÿþúÿ=ÿþ×ÿ<ÿýþÕÿ<ÿþáÿ=ÿþ»ÿ<ÿþíÿ:ÿÿÿÿÿÿÿÿÿÿÿÿÿ ¿ÿþøÿ=ÿþXÿ<ÿým2ÿ;ÿü‡22ÿ:ÿû£322ÿ9ÿý½6229ÿýÕ=228ÿýíG228ÿþV227ÿþi226ÿþ‚225ÿþž224ÿý¹5223ÿýÑ<22 ¿ÿþúÿ=ÿþnÿ<ÿý€Lÿ;ÿü—LLÿ:ÿþ°LL:ÿýÇPLL9ÿýÜULL8ÿýñ_LL8ÿþlLL7ÿþ}LL6ÿþ“LL5ÿþ¬LL4ÿýÃOLL3ÿýÙTLL ¿ÿþàÿ=ÿþÃÿ<ÿý¾Íÿ;ÿü¸ÍÍÿ:ÿþ±ÍÍ:ÿýªÌÍÍ9ÿý¤ÊÍÍ8ÿý¸ÈÍÍ8ÿþÄÍÍ7ÿþ¿ÍÍ6ÿþ¹ÍÍ5ÿþ²ÍÍ4ÿý«ÌÍÍ3ÿý¥ËÍÍ ¿ÿþÞÿ=ÿþèÿ<ÿþÝÿ<ÿþÑÿ<ÿþÅÿ<ÿý»üÿ;ÿý³øÿ;ÿý½òÿ<ÿþéÿ<ÿþßÿ<ÿþÓÿ<ÿþÇÿ<ÿý½ýÿ;ÿý´ùÿÿÿþª‡‡þ¢ÃÃÿý͇‡ý—¿Ã Ãÿýú‡‡ýŽ¸Ã Ãÿý¶ˆ‡‡ý‰®Ã ÃÿýÕ‡‡þ¢Ã Ãÿþ ‡‡ý™ÁÃÃÿý¹ˆ‡‡ý’¼Ãà ÿýÕ‡‡ý¶ÃÃ"ÿþœ‡‡ý‰¯ÃÃ"ÿýŒ^‡‡þ¦ÃÃ!ÿú¢32L‚‡‡ýžÂÃà ÿý·522ý?z‡‡ý˜ÁÃÃÿýÊ:22ý7n‡‡û“¾ÃÃÿÿýÛA22ý3^‡‡üºÃÿÿýõI22ýMƒ‡‡ý‹¶ÿÿþV2 2ýB~‡‡þŠÿÿþj2 2ý:u‡‡ÿþƒ22ý5j‡‡ÿþŸ22þ]‡‡ÿýº522ýQ…‡ ‡ÿýÑ<22ýH‚‡ ‡ÿýåF22ýA}‡ ‡ÿþS22ý;w‡ ‡ÿþf22ý6o‡‡ÿþ22ý4i‡‡ÿþš22þb‡‡ÿý¶52 2þ[‡‡ÿýÎ:2"2ýT†‡‡ÿýãC2$2ýM„‡‡ÿþQ2&2ý@w‡‡ÿþc2(2û4‰ˆ‡ÿÿþz2)2ûvÿØ’ÿ ÿþ•2)2þdÿÿý±42(2þVÿÿýÊ92(2ýJõÿÿýßB2(2ýAÜÿÿþN2(2ý:Ëÿÿþ_2(2ý5·ÿÿþu2)2þ›ÿÿþ2)2þÿÿý­42(2þfÿÿýÆ82(2þTÿÿýÜ@2(2ýFèÿÿþK2(2ý<Òÿÿþ[2(2ý6ºÿÿþq2)2þ ÿÿþŒ2)2þ„ÿÿý¨32(2þkÿÿýÁ72(2þWÿÿýÙ>2(2ýHñÿÿþI2(2ý=×ÿÿ)2ý6¿ÿÿ(2ý3¥ÿÿ(2þˆÿÿ'2þoÿÿ&2þYÿÿ%2ýJýÿÿ$2ý?Úÿÿ#2ý7Ãÿÿ"2ý3ªÿÿ"2þÿÿ!2þsÿÿ 2þ]ÿÿ2þMÿÿÿþàÓÓþÕØØÿýíÕÓÓýÔר ØÿýýÛÓÓýÔר ØÿþåÓÓþÖØ ØÿýñÖÓÓþÕØ ØÿþÜÓÓýÔרØÿþæÓÓýÔרØ ÿýðÖÓÓþרØ"ÿþÛÓÓþÖØØ"ÿü’ÒÓÓþÕØØ!ÿú¯LLuÌÓÓþÕØØ ÿýÂOLLýa¿ÓÓýÔרØÿýÓSLLýT«ÓÓûÔרØÿÿýâYLLüM’ÒÓÓüÔרÿÿý÷`LLýwÍÓÓþ×ÿÿþlL LýeÄÓÓÿþ~L LýY·ÓÓÿþ”LLýQ¥ÓÓÿþ­LLýM‘ÓÓÿýÄOLLý~ÐÓ ÓÿýÙTLLýoËÓ Óÿýê]LLýcÄÓ ÓÿþiLLýZºÓ ÓÿþzLLýR­ÓÓÿþLLýO¤ÓÓÿþ¨LLýM™ÓÓÿýÁNL LþÓÓÿýÖTL"LýÑÓÓÿýè[L$LýwÏÓÓÿþgL&Lýc¹ÓÓÿþwL(LûO»ÓÓÿÿþŒL)Lû‰ÿñ×ÿ ÿþ¤L)Lþyÿÿý½NL(LþlÿÿýÓRL(Lýb÷ÿÿýæZL(LýYãÿÿþeL(LýTÔÿÿþtL(LýNÂÿÿþ‡L)Lþ©ÿÿþ L)Lþÿÿý¹ML(Lþ{ÿÿýÏQL(LþjÿÿýãXL(Lý]ìÿÿþcL(LýUÚÿÿþqL(LýOÅÿÿþ„L)Lþ®ÿÿþ›L)Lþ•ÿÿýµML(Lþ~ÿÿýËPL(LþmÿÿýàWL(Lý_ôÿÿþ`L(LýVÞÿÿ)LýPÉÿÿ)Lþ²ÿÿ(Lþ™ÿÿ'Lþ‚ÿÿ&Lþoÿÿ%Lýbýÿÿ$LýWáÿÿ#LýQÍÿÿ"LýM¶ÿÿ"Lþÿÿ!Lþ†ÿÿ LþrÿÿLþdÿÿÿþ^DDþ-ÿýwIDDý6 ÿýèTDDý> ÿýgEDDýB! ÿý~JDDþ, ÿþVDDý4ÿýhEDDý: ÿý}JDDý?"ÿþTDDýB!"ÿü´†EDDþ)!ÿú±ÍÍ£LDDý/ ÿý«ÌÍÍý¸XDDý5ÿý§ËÍÍýÅlDDû9ÿÿý¢ÉÍÍü̆EDDü=ÿÿýÕÇÍÍý¡JDDý@ÿÿþÄÍ Íý³SDDþBÿÿþ¿Í ÍýÀ`DDÿþ¹ÍÍýÈrDDÿþ±ÍÍý̇DDÿý«ÌÍÍýšGD Dÿý¥ËÍÍý©LD Dÿý ÈÍÍýµTD DÿþÅÍÍý¿^D DÿþÀÍÍýÇjDDÿþºÍÍýÊtDDÿþ³ÍÍýÌDDÿý¬ÌÍ Íþ‹DDÿý¦ËÍ"Íý—FDDÿý ÉÍ$Íý¡HDDÿþÅÍ&Íý¶^DDÿþÁÍ(ÍûÊuEDÿÿþ»Í)Íû¼ÿLÿ ÿþ´Í)ÍþÀÿÿý­ÌÍ(ÍþÄÿÿý§ËÍ(ÍýÇÕÿÿý¡ÉÍ(ÍýÉ¢ÿÿþÆÍ(Íý˦ÿÿþÂÍ(ÍýÌ«ÿÿþ¼Í)Íþ²ÿÿþµÍ)Íþ¹ÿÿþ®Í)ÍþÀÿÿý¨ÌÍ(ÍþÄÿÿý¢ÉÍ(ÍýÈ©ÿÿþÇÍ(ÍýʤÿÿþÃÍ(ÍýÌ«ÿÿþ½Í)Íþ±ÿÿþ¶Í)Íþ¸ÿÿþ¯Í)Íþ¿ÿÿý©ÌÍ(ÍþÄÿÿý£ÊÍ(ÍÇÿþÇÍ(ÍýÊ£ÿÿ)ÍýÌ©ÿÿ)Íþ°ÿÿ(Íþ·ÿÿ'Íþ¾ÿÿ&ÍþÃÿÿ%ÍýÇõÿÿ$ÍýÊ£ÿÿ#Íý̨ÿÿ#Íþ¯ÿÿ"Íþ¶ÿÿ!Íþ½ÿÿ ÍþÂÿÿÍþÆÿÿÿþÜÿ>ÿýÂøÿ=ÿýêèÿ>ÿýÒþÿ=ÿý¼öÿ>ÿþåÿ>ÿýÐþÿ=ÿý½öÿ>ÿþéÿ=ÿþÏÿ<ÿþÅÿ<ÿý½ýÿ;ÿý·úÿ;ÿý±öÿ;ÿýÓñÿ<ÿþéÿ<ÿþßÿ<ÿþÒÿ<ÿþÆÿ<ÿý¼ýÿ;ÿý´ùÿ;ÿý®óÿ<ÿþëÿ<ÿþáÿ<ÿþÕÿ<ÿþÈÿ<ÿý¾ýÿ;ÿýµùÿ;ÿý¯ôÿ<ÿþìÿ<ÿþâÿ)ÿýèþÿÿþ×ÿ)ÿûØÿ»óÿ ÿþËÿ)ÿþáÿÿýÀþÿ(ÿþéÿÿý·ûÿ(ÿýðÓÿÿý°õÿ(ÿýõ±ÿÿþîÿ(ÿýù¶ÿÿþäÿ(ÿýý½ÿÿþÙÿ)ÿþÈÿÿþÍÿ)ÿþÔÿÿýÁþÿ(ÿþàÿÿý¸ûÿ(ÿþêÿÿý±öÿ(ÿýó³ÿÿþïÿ(ÿýø´ÿÿþæÿ(ÿýý¼ÿÿþÛÿ)ÿþÆÿÿþÏÿ)ÿþÒÿÿýÃþÿ(ÿþÞÿÿýºüÿ(ÿþéÿÿý²÷ÿ(ÿýñÈÿÿþñÿ(ÿýø²ÿ;ÿýüºÿ<ÿþÄÿ<ÿþÐÿ<ÿþÜÿ<ÿþçÿ<ÿýðôÿ;ÿý÷±ÿ;ÿýü¹ÿ;ÿýþÂÿ<ÿþÎÿ<ÿþÚÿ<ÿþåÿ<ÿþîÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÌÿÿà ‡þÍÿÿÃþ»‡ ‡þÔÿÿÃþ±‡ ‡þÞÿÿÃþ¦‡ ‡þõÿÿÃþœ‡ ‡ÿÃþ’‡ ‡þÿÿÃý»ˆ‡ ‡þ©ÿÿÃþ˜‡ ‡þËÿÿÃþ±‡ ‡þ‰ÿÿþ³ÃÃý‡ ‡þžÿÿýˆ®ÃÃþ¦‡ ‡þ½ÿÿ‡þªÃÃý¼Š‡ ‡þåÿÿ‡þ¥ÃÃý´Œ‡ ‡þ“ÿÿ‡ý˜ºÃÃþ¥‡‡þÅÿÿ‡üˆ¤Áà Ãý¾—‡‡þœÿÿ‡ýŽ°Ã Ãü°Œ‡‡ý‰âÿÿ‡ú—¦¯¸ÁÃÃúµ¦–‰‡‡þ´ÿÿ ‡û––‰‡‡þ’ÿÿ&‡þÑÿÿ%‡þ¥ÿÿ$‡þ¢ÿÿ#‡þ©ÿÿ"‡þ°ÿÿ!‡þ¹ÿÿ‡ýˆÂÿÿ‡ý—Óÿÿþª‡‡ý•Ëÿ ÿüОˆ‡‡ý“Çÿ%ÿý¿›‡‡ý’Äÿ)ÿüõ»˜‡ ‡úŠš®Çäÿ$ÿþ´ÿÿõà×ÎŽ¶®¬ÁÝÿ(ÿýÃ8ÿ;ÿüÒ=2ÿ:ÿûßC22ÿ9ÿýøK22:ÿþU229ÿþa228ÿþn227ÿþ226ÿþ225ÿý¢3224ÿý³5223ÿýÃ8222ÿýÒ=2 21ÿýßC2 20ÿýõK2 20ÿþT2 2/ÿþ`2 2.ÿþn22-ÿþ22,ÿþ22+ÿý¢322*ÿý³522)ÿýÃ822(ÿýÑ=22'ÿýÞC22&ÿýøK22&ÿþW22%ÿþf22Ø ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØþ×Ó ÓþðÿÿØþÖÓ ÓþôÿÿØþÕÓ ÓþûÿÿØþÕÓ ÓÿØþÔÓ ÓþÖÿÿØþ×Ó ÓþàÿÿØþÔÓ ÓþíÿÿØþÖÓ ÓþÔÿÿþÖØØþÔÓ ÓþÜÿÿýÓÖØØþÕÓ ÓþçÿÿÓþÖØØþ×Ó ÓþöÿÿÓþÕØØþÖÓ ÓþØÿÿÓýÔרØþÕÓÓþêÿÿÓþÕØØý×ÔÓÓþÛÿÿÓýÔÖØ ØþÖÓÓýÔõÿÿÓúÔÕÖ×רØü×ÕÔÓÓþäÿÿÓÔÓþ×ÿÿ&Óþïÿÿ%ÓþÞÿÿ$ÓþÝÿÿ#Óþàÿÿ"Óþãÿÿ!Óþæÿÿ ÓþéÿÿÓýÙïÿÿþàÓÓýØíÿ ÿýîÜÓÓýØëÿ%ÿýèÛÓÓý×êÿ)ÿüûçÙÓ ÓúÔÚâëöÿ$ÿþ¿ÿÿõõñîêçäâáéóÿ(ÿýÍRÿ;ÿüÚVLÿ:ÿûæ[LLÿ9ÿýúcLL:ÿþkLL9ÿþuLL8ÿþLL7ÿþLL6ÿþ LL5ÿþ¯LL4ÿý¾OLL3ÿýÍRLL2ÿýÚVL L1ÿýæ[L L0ÿý÷cL L0ÿþkL L/ÿþuL L.ÿþLL-ÿþLL,ÿþ LL+ÿþ¯LL*ÿý¾OLL)ÿýÍRLL(ÿýÙVLL'ÿýå[LL&ÿýúcLL&ÿþmLL%ÿþ{LL Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ Dþwÿÿ DþwÿÿþD Dþ|ÿÿþD Dþ„ÿÿþ(D DþÌÿÿþ1D Dÿþ;D DþJÿÿýCD Dþ]ÿÿþ5D DþvÿÿþD DþEÿÿþý=D DþUÿÿýC!þ(D DþlÿÿDþ%ýBD Dþ‰ÿÿDþ*ý?D DþMÿÿDý5þ)DDþqÿÿDüC+ ý6DDþSÿÿDý>  ü?DDýE‡ÿÿDú6( ú)6BDDþeÿÿ Dû?76BDDþLÿÿ&Dþzÿÿ%DþZÿÿ$DþXÿÿ#Dþ]ÿÿ"Dþbÿÿ!DþiÿÿDýEpÿÿDýP|ÿÿþ^DDýNvÿ ÿüyUEDDýMsÿ%ÿýmSDDýLqÿ)ÿüÌjPD DúFRasˆÿ$ÿþ¬ÿÿõ†xrlfa_oƒÿ(ÿý¨Ëÿ;ÿü¤ÊÍÿ:ÿû¡ÉÍÍÿ9ÿýàÇÍÍ:ÿþÄÍÍ9ÿþÁÍÍ8ÿþ¾ÍÍ7ÿþºÍÍ6ÿþµÍÍ5ÿþ±ÍÍ4ÿý¬ÌÍÍ3ÿý¨ËÍÍ2ÿý¤ÊÍ Í1ÿý¡ÉÍ Í0ÿýÕÇÍ Í0ÿþÄÍ Í/ÿþÁÍ Í.ÿþ¾ÍÍ-ÿþºÍÍ,ÿþµÍÍ+ÿþ±ÍÍ*ÿý¬ÌÍÍ)ÿý¨ËÍÍ(ÿý¥ÊÍÍ'ÿý¢ÉÍÍ&ÿýàÇÍÍ&ÿþÄÍÍ%ÿþÀÍÍ,ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþÂÿ=ÿþ½ÿ=ÿþ·ÿ=ÿþÕÿ|ÿþöÿ=ÿþÝÿ=ÿþÃÿ<ÿþýÿ=ÿþçÿ=ÿþÍÿ=ÿþ³ÿ<ÿþòÿ=ÿþÇÿ<ÿþéÿ<ÿýýµÿ<ÿþÔÿ<ÿþóÿ=ÿþÀÿ<ÿþàÿ<ÿþäÿ<ÿþÞÿ<ÿþ×ÿ<ÿþÐÿ;ÿýþÉÿ;ÿýî¾ÿÿþÜÿÿýðÃÿ ÿüÀçþÿÿýòÆÿ%ÿýÌêÿÿýóÈÿ)ÿüÕÎíÿ ÿúüëÙÆ´ÿ$ÿþ¾ÿÿõ¶»ÁÇÍÓÙÚʸÿ(ÿý¹ûÿ;ÿý´øÿ;ÿý°ôÿ;ÿýÞïÿ<ÿþêÿ<ÿþãÿ<ÿþÜÿ<ÿþÕÿ<ÿþÍÿ<ÿþÅÿ<ÿý¿ýÿ;ÿý¹ûÿ;ÿý´øÿ;ÿý°ôÿ;ÿýÓïÿ<ÿþêÿ<ÿþäÿ<ÿþÜÿ<ÿþÕÿ<ÿþÍÿ<ÿþÅÿ<ÿý¿ýÿ;ÿý¹ûÿ;ÿý´øÿ;ÿý°ôÿ;ÿýÞïÿ<ÿþéÿ<ÿþàÿÿÿý322ÿý§422ÿý±522ÿýº722ÿýÄ92 2ÿýÌ<2!2ÿýÕ?2"2ÿýÜC2#2ÿýãG2$2ÿýõL2%2ÿþQ2&2ÿþX2'2ÿþ_2(2ÿþf2)2ÿþn2*2ÿþw2+2ÿþ‚2+2þ]ÿÿþŒ2+2ý]õÿ ÿþ—2+2ü^õüÿ ÿý¡32*2û^õüüÿ ÿý«42*2ý_õüü ÿýµ62*2ý_õüü ÿý¾82*2ý_õüü ÿýÇ:2*2ýZõüüÿýÏ=2*2ýTðüüÿýØA2*2ýNìüüÿýßD2*2ýJæüüÿýåI2*2ýEßüüÿýýN2*2ýAØü üÿþT2*2ý>Ðü üÿþa2*2ý;Èü üÿþn2*2ý8¿ü üÿþ2*2ý6·ü üýÿ2*2ý5­üüý£32)2ý3£üüþ52)2ý3™üü+2þüü*2þ…üü)2þzüü(2þqüü'2ýiûüü&2ýaøüü%2ýZõüü$2ýTðüü#2ýNìüü"2ýJæüü!2ýEßüü 2ýAØüü2ý>Ðüü2ý;Èüü2ý8¿üü2ý6·üü2ý3Ÿü ü2þü!ü2þ|ü"ü2þlü#ü2ý_øü#ü2ýTñü$ü2ýJéü%ü2ýCÞü&ü2ý=Ñü'ü2ý8Ãü(ü2ý5³ü)ü2ý3¢ü*üÿþ«LLÿý´MLLÿý½OLLÿýÅQLLÿýÎSL LÿýÕUL!LÿýÜXL"Lÿýã[L#Lÿýè_L$Lÿý÷cL%LÿþhL&LÿþmL'LÿþtL(LÿþzL)LÿþL*Lÿþ‰L+Lÿþ“L+LþrÿÿþœL+Lýrùÿ ÿþ¥L+Lýsùÿ ÿý®ML*Lýsùÿ ÿý·NL*Lýtùÿ ÿýÀOL*Lýtùÿ ÿýÈQL*Lýtùÿ ÿýÐTL*Lýpùÿ ÿý×VL*Lýjôÿ ÿýßYL*Lýeðÿ ÿýæ\L*Lýaëÿ ÿýê`L*Lý]æÿ ÿýýeL*LýYßÿÿþkL*LýVØÿÿþuL*LýTÑÿÿþL*LýRÉÿÿþL*LýPÂÿÿþ L*LýN¹ÿÿþ°L*LýM°ÿÿþOL*Lþ¨ÿÿ+Lþžÿÿ*Lþ•ÿÿ)LþŒÿÿ(Lþ„ÿÿ'Lý|þÿÿ&Lývüÿÿ%Lýpùÿÿ$Lýjôÿÿ#Lýeðÿÿ"Lýaëÿÿ!Lý]æÿÿ LýYßÿÿLýVØÿÿLýTÑÿÿLýRÉÿÿLýPÂÿÿLþ­ÿ ÿLþÿ!ÿLþÿ"ÿLþÿ#ÿLýtüÿ#ÿLýjöÿ$ÿLýbîÿ%ÿLý[åÿ&ÿLýUÙÿ'ÿLýRÍÿ(ÿLýO¾ÿ)ÿLþ¯ÿ*ÿÿþ²ÍÍÿþ¯ÍÍÿý­ÌÍÍÿý«ÌÍÍÿý¨ËÍ Íÿý¦ÊÍ!Íÿý¤ÊÍ"Íÿý¢ÉÍ#Íÿý ÈÍ$ÍÿýÕÆÍ%ÍÿþÅÍ&ÍÿþÄÍ'ÍÿþÂÍ(ÍÿþÀÍ)Íÿþ¾Í*Íÿþ¼Í+Íÿþ¹Í+ÍþÂÿÿþ¶Í+Íýœÿ ÿþ´Í+Íüœšÿ ÿþ±Í+Íûœššÿ ÿý¯ÌÍ*Íýœšš ÿý¬ÌÍ*Íýœšš ÿýªÌÍ*Íýœšš ÿý§ËÍ*ÍýÜššÿý¥ÊÍ*ÍýÄššÿý£ÉÍ*ÍýÆžššÿý¡ÈÍ*ÍýÇ ššÿý ÇÍ*ÍýÈ¡ššÿýõÆÍ*ÍýÉ£š šÿþÄÍ*ÍýÊ¥š šÿþÁÍ*Íý˧š šÿþ¾Í*ÍýË©š šÿþºÍ*ÍýÌ«š šýÿµÍ*ÍýÌ®ššþ±Í+Íþ±ššþÌÍ*Íþ³šš+Íþ¶šš*Íþ¸šš)Íþ»šš(Íþ½šš'Íþ¿šš&ÍýÁ›šš%ÍýÜšš$ÍýÄšš#ÍýÆžšš"ÍýÇ šš!ÍýÈ¡šš ÍýÉ£ššÍýÊ¥ššÍý˧ššÍýË©ššÍýÌ«ššÍþ±š šÍþ¶š!šÍþºš"šÍþ¾š#šÍý›š#šÍýÄš$šÍýÇŸš%šÍýÉ¢š&šÍýÊ¥š'šÍý˨š(šÍý̬š)šÍþ±š*šÿþÇÿ<ÿýÃþÿ;ÿýÀýÿ;ÿý¼üÿ;ÿý¹úÿ;ÿý¶øÿ;ÿý³öÿ;ÿý±ôÿ;ÿý¯òÿ;ÿýÓïÿ<ÿþìÿ<ÿþèÿ<ÿþäÿ<ÿþáÿ<ÿþÜÿ<ÿþØÿ<ÿþÓÿ+ÿþåÿÿþÎÿ+ÿýå©ÿ ÿþÊÿ+ÿüå©§ÿ ÿýÆþÿ*ÿûå©§§ÿ ÿýÂþÿ*ÿýä©§§ ÿý¾ýÿ*ÿýä©§§ ÿý»ûÿ*ÿýä©§§ ÿý¸ùÿ*ÿýç©§§ÿýµøÿ*ÿýꪧ§ÿý²öÿ*ÿýí¬§§ÿý°óÿ*ÿýð®§§ÿý®ñÿ*ÿýó°§§ÿýôíÿ*ÿýõ²§ §ÿþêÿ*ÿý÷´§ §ÿþãÿ*ÿýù·§ §ÿþÜÿ*ÿýûº§ §ÿþÕÿ*ÿýü½§ §ýÿÍÿ*ÿýýÁ§§þÅÿ*ÿýþŧ§þýÿ*ÿþɧ§+ÿþͧ§*ÿþÒ§§)ÿþ×§§(ÿþÛ§§'ÿþß§§&ÿý㨧§%ÿýç©§§$ÿýꪧ§#ÿýí¬§§"ÿýð®§§!ÿýó°§§ ÿýõ²§§ÿý÷´§§ÿýù·§§ÿýûº§§ÿýü½§§ÿþƧ §ÿþΧ!§ÿþÖ§"§ÿþÞ§#§ÿý䨧#§ÿýꪧ$§ÿýð­§%§ÿýô°§&§ÿýø´§'§ÿýû¹§(§ÿýý¿§)§ÿþŧ*§2ýYñü-ü 2ýYñü.ü 2ýYòü/ü 2ýYòü0ü 2ýZòü1ü 2ýZòü2ü2ý[òü3ü2ý[òü4ü2ý[òü5ü2ý[ôü6ü2ý[ôü7ü2ý\ôü8ü2ý\ôü9ü2ý]ôü:üü2]ôü;üý]ôü<üþõü½üþàü<üýîNü;üü÷[2ü;üüm22ü:üþ‚22:üþ™229üý¯4228üýÄ8227üý×>226üýæG225üýòS225üþg224üþŠ223üý²4222üýÕ;2 21üýîJ2 20üýûa2 20üþƒ2 2/üý«32 2.üýÎ92 2-üýéF22,üýú\22,üþ22+üýµ322*üýä?22)üýû\22)üþŒ22(üýÄ522'üýíF22'üþi22&üþ22%üýÒ822$üýõN22$üþw22Lýnöÿ-ÿ Lýnöÿ.ÿ Lýo÷ÿ/ÿ Lýo÷ÿ0ÿ Lýp÷ÿ1ÿ Lýp÷ÿ2ÿLýp÷ÿ3ÿLýp÷ÿ4ÿLýp÷ÿ5ÿLýqøÿ6ÿLýqøÿ7ÿLýqøÿ8ÿLýqøÿ9ÿLýrøÿ:ÿüLrøÿ;ÿýrøÿ<ÿþùÿ½ÿþæÿ<ÿýòeÿ;ÿüûqLÿ;ÿü€LLÿ:ÿþ“LL:ÿþ§LL9ÿý»NLL8ÿýÎRLL7ÿýÞWLL6ÿýë_LL5ÿý÷iLL5ÿþ{LL4ÿþšLL3ÿý½MLL2ÿýÜTL L1ÿýòaL L0ÿýþvL L0ÿþ”L L/ÿþ·L L.ÿýÖRL L-ÿýî^LL,ÿýýqLL,ÿþLL+ÿýÀMLL*ÿýéXLL)ÿýþqLL)ÿþœLL(ÿýÎOLL'ÿýñ]LL'ÿþ|LL&ÿþ«LL%ÿýÚRLL$ÿýùeLL$ÿþ‰LLÍýÚ-š ÍýÚ.š ÍýÜš/š ÍýÜš0š ÍýÜš1š ÍýÜš2šÍýÜš3šÍýÜš4šÍýÜš5šÍýÜš6šÍýÜš7šÍýœš8šÍýœš9šÍýœš:šüÍœš;šýœš<šþœš½šþ¡š<šýžÆš;šü›ÃÍš;šü¾ÍÍš:šþ¹ÍÍ:šþ³ÍÍ9šý­ÌÍÍ8šý¨ËÍÍ7šý£ÊÍÍ6šý ÈÍÍ5šýœÅÍÍ5šþÀÍÍ4šþ·ÍÍ3šþ­Í Í2šý¤ËÍ Í1šýžÇÍ Í1šþÁÍ Í0šþ¹Í Í/šþ¯Í Í.šý¦ËÍ Í-šýŸÈÍÍ,šý›ÂÍÍ,šþ¹ÍÍ+šþ¬ÍÍ*šý ÊÍÍ*šþÂÍÍ)šþ¶ÍÍ(šý¨ÌÍÍ'šýžÈÍÍ'šþ¿ÍÍ&šþ²ÍÍ%šý¤ËÍÍ$šýœÆÍÍ$šþ¼ÍÍÿý誧-§ ÿý誧.§ ÿý窧/§ ÿý窧0§ ÿý窧1§ ÿý窧2§ÿý檧3§ÿý檧4§ÿý檧5§ÿýæ©§6§ÿýæ©§7§ÿýæ©§8§ÿýæ©§9§ÿýå©§:§üÿå©§;§ýå©§<§þ©§½§þ¯§<§ý«î§;§ü¨æÿ§;§üÝÿÿ§:§þÓÿÿ:§þÉÿÿ9§ýÀþÿÿ8§ý¹ûÿÿ7§ý²÷ÿÿ6§ý®òÿÿ5§ýªëÿÿ5§þàÿÿ4§þÏÿÿ3§ý¿þÿÿ2§ý³ùÿ ÿ1§ý«ðÿ ÿ1§þãÿ ÿ0§þÒÿ ÿ/§þÂÿ ÿ.§ýµûÿ ÿ-§ý­òÿÿ,§ý¨æÿÿ,§þÔÿÿ+§ý¾þÿÿ*§ý®öÿÿ*§þæÿÿ)§þÎÿÿ(§ý¹ýÿÿ'§ý«óÿÿ'§þßÿÿ&§þÇÿÿ%§ý´ûÿÿ$§ý©îÿÿ$§þØÿÿüýÎG22üý³:22üý—422üýûz2!2üýñb2"2üýàP2#2üýËB2$2üý±92%2üý”42&2üýúx2(2üýõb2)2üýïY2*2üýéS2+2üýãM2,2üýÛG2-2 üýÒB2.2 üýÉ>2/2 üý¿;2/2þ4ü üýµ82/2ýC¾üüý¬62/2ü[íÿüüý­52.2ý3‚ÿÿüý²62.2ý;¯ÿÿüý·72.2ýM×ÿÿüý»82.2þlÿÿüý¿92-2ý6—ÿÿüýÃ:2-2ýCÃÿÿüýÇ;2-2ýXèÿÿüýË=2-2þmÿ ÿüüÏ>2,2ý3ˆÿ ÿýÓ@2,2ý7¥ÿ ÿþD2,2ý>Áÿ ÿ-2ýJÙÿÿ,2ýZýÿÿ+2þqÿÿ)2ý3‹ÿÿ(2ý4žÿÿ'2ý6ªÿÿ&2ý8µÿÿ%2ý;¿ÿÿ$2ý>Éÿÿ#2ýCÒÿÿ"2ýGÛÿÿ!2ýMãÿÿ 2ýPøÿÿþd22ýMõÿÿýãQ22ýKèÿÿýÍC22ýIäÿÿý³:22ýGàÿÿý–422ýEÝÿÿþy22ýCÚÿÿþc22ýB×ÿÿþY22ý@ÓÿÿýõR22ý=ÐÿÿýáK22ý7¿ÿÿýÚF22ý4«ÿÿýÐB2 2þ•ÿÿýÇ>2 2þÿÿý½:2 2þkÿÿý³72 2þ[ÿÿýµ62 2þNÿÿýº72 2ýDáÿÿý¿92 2ý<ÑÿÿýÅ:2 2ý6»ÿÿýÊ<2!2þ™ÿÿýÎ>22ÿýÖ_LLÿý¾SLLÿý¥NLLÿýþŒL!LÿýövL"LÿýæfL#LÿýÔZL$Lÿý½SL%Lÿý£NL&LÿýýŠL(LÿýùvL)LÿýóoL*LÿýîiL+LÿýèdL,Lÿýâ_L-L ÿýÚZL.L ÿýÒWL/L ÿýÉTL/LþMÿ ÿýÀRL/Lý[Èÿÿý¸OL/Lýqñÿÿý¹OL/Lþ“ÿ ÿý½OL.LýT»ÿ ÿýÂPL.LýdÞÿ ÿýÆQL.Lþÿ ÿýÉRL-LýO¥ÿ ÿýÍSL-Lý[Íÿ ÿýÐTL-Lýmìÿ ÿýÔUL-Lþ€ÿ ÿý×WL-Lþ˜ÿ ÿýÛXL,LýP²ÿ ÿþ\L,LýWËÿ ÿ-Lýaàÿÿ,Lýpýÿÿ+Lþ„ÿÿ*Lþ›ÿÿ(LýN¬ÿÿ'LýO¶ÿÿ&LýRÀÿÿ%LýTÉÿÿ$LýWÒÿÿ#Lý[Úÿÿ"Lý_âÿÿ!Lýdèÿÿ LýfúÿÿþyLLýd÷ÿÿýèhLLýcìÿÿýÖ[LLý`éÿÿý¾SLLý_æÿÿý¥NLLý]äÿÿþ‹LLý[áÿÿþwLLýZÞÿÿþnLLýXÛÿÿý÷hLLýUØÿÿýçcLLýPÉÿÿýá^LLýM·ÿÿýØZL Lþ¤ÿÿýÐVL LþÿÿýÇSL Lþ~ÿÿý¾QL LþpÿÿýÀPL LþeÿÿýÅQL Lý\çÿÿýÉRL LýUÙÿÿýÎTL LýOÆÿÿýÓUL!Lþ¨ÿÿýÖVLLšý¦ÈÍÍšý¬ËÍÍšý´ÌÍÍšþ»Í!ÍšýÁÍ"Íšý¡ÆÍ#Íšý¦ÉÍ$Íšý­ËÍ%Íšý´ÌÍ&Íšý›»Í(ÍšýœÁÍ)ÍšýÃÍ*ÍšýŸÅÍ+Íšý ÆÍ,Íšý¢ÈÍ-Í šý¤ÉÍ.Í šý§ÊÍ/Í šý©ËÍ0Í šý¬ËÍ/Íýɪššý®ÌÍ/Íüøÿššý®ÌÍ/Íþ¹ÿÿšý­ÌÍ.ÍýË­ÿÿšý«ÌÍ.ÍýÆ£ÿÿšýªÌÍ.Íþ¾ÿÿšý©ËÍ-ÍýÌ´ÿÿšý¨ËÍ-Íýɨÿÿšý§ËÍ-ÍýÄ©ÿÿšý¦ÊÍ-Íþ¾ÿ ÿüš¥ÊÍ-Íþ·ÿ ÿý¤ÉÍ,Íý̰ÿ ÿþÈÍ,ÍýÊ©ÿ ÿ-ÍýÇ£ÿÿ,ÍýÃõÿÿ+Íþ½ÿÿ*Íþ·ÿÿ(Íý̲ÿÿ'Íý̯ÿÿ&Íýˬÿÿ%ÍýË©ÿÿ$Íýʧÿÿ#Íýɤÿÿ"ÍýÈ¢ÿÿ!ÍýÆ ÿÿ ÍýÆàÿÿþÀÍÍýÆÕÿÿý ÅÍÍýÇ©ÿÿý¦ÉÍÍýÇ ÿÿý¬ËÍÍýÈ¡ÿÿý´ÌÍÍýÈ¢ÿÿþ»ÍÍýÉ£ÿÿþÁÍÍýÉ£ÿÿþÃÍÍýɤÿÿýÕÅÍÍýÊ¥ÿÿý¡ÇÍÍýÌ©ÿÿý£ÈÍ Íþ¯ÿÿý¥ÉÍ Íþ´ÿÿý§ÊÍ ÍþºÿÿýªËÍ Íþ¿ÿÿý¬ÌÍ ÍþÃÿÿý¬ÌÍ ÍþÆÿÿý«ÌÍ ÍýÈ¡ÿÿý©ËÍ ÍýÊ¥ÿÿý¨ËÍ Íý̪ÿÿý§ÊÍ!Íþ³ÿÿý¦ÊÍͧýµòÿÿ§ý¿úÿÿ§ýÊþÿÿ§þ×ÿ!ÿ§ýªãÿ"ÿ§ý¯íÿ#ÿ§ý¶õÿ$ÿ§ýÀúÿ%ÿ§ýËþÿ&ÿ§ý¨Øÿ(ÿ§ý©ãÿ)ÿ§ý«çÿ*ÿ§ý­ëÿ+ÿ§ý¯îÿ,ÿ§ý±òÿ-ÿ §ý´õÿ.ÿ §ý·÷ÿ/ÿ §ýºùÿ/ÿþþ§ §ý¾ûÿ/ÿýô»§§ýÂýÿ/ÿüæ½ÿ§§ýÁýÿ/ÿþÓÿÿ§ý¿ýÿ.ÿýùÀÿÿ§ý½üÿ.ÿýî²ÿÿ§ý¼ûÿ.ÿþÞÿÿ§ýºûÿ-ÿýýÊÿÿ§ý¹úÿ-ÿýô¹ÿÿ§ý¸ùÿ-ÿýè³ÿÿ§ý¶øÿ-ÿþÝÿ ÿü§µ÷ÿ-ÿþÐÿ ÿý³öÿ,ÿýüÄÿ ÿþôÿ,ÿý÷ºÿ;ÿýð²ÿ;ÿýçôÿ;ÿþÛÿ<ÿþÏÿ;ÿýþÇÿ;ÿýýÂÿ;ÿýû¾ÿ;ÿýùºÿ;ÿý÷·ÿ;ÿýô´ÿ;ÿýò±ÿ;ÿýî¯ÿ;ÿýíÞÿÿþáÿÿýîÓÿÿý¯ìÿÿýï³ÿÿýµôÿÿýñ®ÿÿý¿úÿÿýò¯ÿÿýÊþÿÿýó°ÿÿþ×ÿÿýô±ÿÿþâÿÿýõ²ÿÿþèÿÿýö³ÿÿýÓëÿÿýø´ÿÿý¯ïÿÿýüºÿÿý±òÿÿýþÂÿÿý´õÿ ÿþËÿÿý¸÷ÿ ÿþÕÿÿý»úÿ ÿþÞÿÿý¿üÿ ÿþæÿÿý¾üÿ ÿþîÿÿý¼üÿ ÿýô¯ÿÿýºûÿ ÿýø´ÿÿý¸ùÿ ÿýý¼ÿÿý·øÿ!ÿþÉÿÿýµ÷ÿÿ2ýYÌÿ"ÿ2ýF¬ÿ$ÿ2ý:Œÿ&ÿ2ü4päÿ'ÿ2ýMÄÿ'ÿý½h22ý7Œÿ'ÿý¥Q22ý[Øÿ&ÿýD22ý>¡ÿ%ÿüß};22ýmñÿ$ÿüÊk522ýG¸ÿ$ÿý¹[22ý5€ÿ$ÿý¼X22ýKÈÿ#ÿýÁ[22ý3wÿ#ÿýÅ^22ý@³ÿ"ÿýÉa22ýbèÿ!ÿüÎd322ý8™ÿ!ÿüám322ýQÕÿ!ÿýˆ922þ‚ÿ!ÿý¦D22!ÿýÆU22ÿüàm322ÿýˆ922ÿýÁK22ÿýt32 2ÿý«A2"2ÿýßc2$2ÿý”:2%2ÿýÍS2'2ÿý…52(2ÿý×S2*2ÿýœ92+2ÿýíc2-2 ÿýµA2.2 ÿýx32/2 ÿýËK212 ÿý˜6222ÿþm242ÿý×M252ÿý®;262ÿý3272ÿýí[292ÿýÃC292û9ÿœ6282û8~è~282ú7yåüü272ü6uàüü72ýfÛüü52ýP½üü32ü@ûüü12ü7ïü ü02ýfÚü ü.2ýO½ü ü,2ü8Žøüü+2ý\Ùüü)2ý= üü(2ýkæüü&2ýD´üü%2ýqîüü#2ý=¬üü"2ý]áüü 2ý7“üü2ýNÏüü2ü3|öüü2ý>¶üü2ýRÝü ü2ýtöü!üLýoÕÿ"ÿLý^¸ÿ$ÿLýS›ÿ&ÿLüMƒéÿ'ÿLýdÎÿ'ÿýÇ|LLýQ›ÿ'ÿý²gLLýqßÿ&ÿý \LLýV®ÿ%ÿüæTLLý€ôÿ$ÿüÓ~OLLý^Âÿ$ÿýÃpLLýN‘ÿ$ÿýÇmLLýbÑÿ#ÿýËpLLþ‰ÿ#ÿýÎsLLýX¾ÿ"ÿýÒvLLývìÿ!ÿýÖxLLýR¨ÿ!ÿüçMLLýhÜÿ!ÿý˜RLLþ“ÿ!ÿý³\LL!ÿýÏkLLÿüæ€MLLÿý˜RLLÿýËcLLÿý‡ML Lÿý·YL"LÿýæwL$Lÿý£SL%LÿýÖiL'Lÿý•OL(LÿýÞiL*LÿýªRL+LÿýñxL-L ÿýÀYL.L ÿþŠL0L ÿýÔcL1L ÿý¦PL2Lÿþ€L4LÿýÞdL5LÿýºTL6Lÿþ’L8LÿýñpL9LÿýÍ[L9LûSÿªOL8LûRíL8LúP‹êÿÿL7LüO‡æÿÿ7Lý{âÿÿ5LýfÇÿÿ3LüX«þÿÿ1LüPóÿ ÿ0Lýzáÿ ÿ.LýfÇÿ ÿ,LüQžüÿÿ+Lýqàÿÿ)LýV®ÿÿ(Lý~ëÿÿ&Lý\¿ÿÿ%Lý„òÿÿ#LýV¸ÿÿ"Lýrçÿÿ LýP¢ÿÿLýe×ÿÿLüMúÿÿLýVÁÿÿLýhäÿ ÿLý†úÿ!ÿÍýæÿ"ÿÍýÈ®ÿ$ÿÍý˶ÿ&ÿÍý½ ÿ'ÿÍýƨÿ'ÿýª¿ÍÍý̶ÿ'ÿý°ÅÍÍýãÿ&ÿýµÈÍÍýʱÿ%ÿü¡ºËÍÍý¾Çÿ$ÿü§¿ÌÍÍýÈ«ÿ$ÿý«ÃÍÍý̹ÿ$ÿýªÄÍÍýǧÿ#ÿý©ÃÍÍþ¼ÿ#ÿý¨ÂÍÍýɬÿ"ÿý§ÁÍÍýÁ©ÿ!ÿý¦ÀÍÍý˳ÿ!ÿý¡¾ÍÍýŤÿ!ÿý·ËÍÍþ¹ÿ!ÿý°ÈÍÍ!ÿý¨ÄÍÍÿý¡¾ÍÍÿý·ËÍÍÿý©ÇÍÍÿþ¼Í!Íÿý¯ÉÍ"Íÿý¡ÁÍ$Íÿý´ËÍ%Íÿý¦ÅÍ'Íÿý¸ÌÍ(Íÿý£ÅÍ*Íÿý²ËÍ+Íÿý¸ÁÍ-Í ÿý¬ÉÍ.Í ÿþ»Í0Í ÿý¦ÇÍ1Í ÿý³ÌÍ2Íÿþ¾Í4Íÿý£ÆÍ5Íÿý®ËÍ6Íÿþ¹Í8Íÿý¸ÃÍ9Íÿý¨ÉÍ9ÍûËÿ²ÌÍ8Íû˺ŸºÍ8ÍúÌ» ššÍ7Íü̼¡šš7ÍýÀ¢šš5Íýƪšš3Íýɲšš1Íü̹š š0ÍýÀ£š š.Íýƪš š,Íü̶›šš+Íý£šš)Íýʱšš(Íý¿ šš&ÍýȬšš%Íý½žšš#ÍýÊ®šš"Íý¡šš Íý̵ššÍýÆ¥ššÍýºœššÍýʬššÍýÅ¢š šÍý¼œš!šÿýç¶ÿ:ÿýòÂÿ:ÿýúÏÿ:ÿüþÛ®ÿ:ÿýî¹ÿ'ÿý»àÿÿýüÏÿ'ÿýÄìÿÿýæ²ÿ&ÿýÍôÿÿý÷Æÿ%ÿü°ÕùÿÿýÝÈÿ$ÿü·Þýÿÿýò½ÿ$ÿý½æÿÿýýÔÿ$ÿý»èÿÿýï·ÿ#ÿýºæÿÿþØÿ#ÿý¸åÿÿýö¿ÿ"ÿý·ãÿÿýã³ÿ!ÿýµâÿÿýûÉÿ!ÿü¯Ýþÿÿýì³ÿ!ÿýÐûÿÿþÓÿ!ÿýÄôÿ:ÿý¸êÿ:ÿü¯Ýþÿ:ÿýÐûÿ:ÿýºïÿ;ÿýÙþÿ:ÿýÂõÿ:ÿý°âÿ;ÿýËúÿ:ÿýµëÿ;ÿýÒýÿ:ÿý²ëÿ;ÿýÈûÿ:ÿý½âÿ;ÿý¾öÿ;ÿþØÿ;ÿý¶ïÿ;ÿýÊüÿ;ÿþÝÿ;ÿý²îÿ;ÿýÁùÿ;ÿþÔÿ;ÿý½æÿ;ÿý¹ôÿ9ÿûúÿÈýÿ8ÿûûÕ­Õÿ8ÿúü×®§§ÿ7ÿüýÙ¯§§7ÿýà±§§5ÿýí»§§3ÿýöǧ§1ÿüüÔ«§ §0ÿýá±§ §.ÿýí»§ §,ÿüûΨ§§+ÿýæ²§§)ÿýøÆ§§(ÿýÞ®§§&ÿýô¾§§%ÿýÛ«§§#ÿýøÂ§§"ÿý寧§ ÿýü̧§ÿýîµ§§ÿüþÖ©§§ÿý÷¾§§ÿýë°§ §ÿýÚ©§!§ÿüÍx?232ÿýšR262ÿüÂo9282üñ‘L2;2þ62x2ù:So©Æ222ù7NjНÛüü.2ù3KqžÒúü ü*2ú8X€±êüü&2ú=f‘Æøüü"2ú4RƒÂúüü2û?l¤èüü2üI‚Èüü2üH€Ëü!ü2üGÊü$ü2ü?|Èü'ü2û4_«÷ü)ü2üD†Þü,ü 2û6f¶ûü.ü 2ü?…çü1ü2üKœõü3ü2ü3]µü6ü2ü7oÏü8üû2;åü:üý‚êüýüÿüÖŠWL3Lÿý¨hL6LÿüÌ‚RL8Lüô cL;LþPLxLùSi‚žµÏL2LùPe~š»âÿÿ.LùMb„«Úýÿ ÿ*LúRn‘½ïÿÿ&LúU{ Ïüÿÿ"LúMh”ÌýÿÿLûX±íÿÿLü`“ÑÿÿLü_‘Ôÿ!ÿLü^Óÿ$ÿLüXÑÿ'ÿLûMt·ûÿ)ÿLü\—åÿ,ÿ LûO{Áþÿ.ÿ LüW–ìÿ1ÿLücªùÿ3ÿLýrÀÿ6ÿLüP‚×ÿ8ÿûLT’êÿ:ÿý“ïÿýÿÿü¦»ÊÍ3Íÿý³ÅÍ6Íÿü©¾ËÍ8ÍüǵÆÍ;ÍþÌÍxÍùËž¶¯¨Í2ÍùÌÆ¿·­¢šš/Íúǽ²¤›š š*ÍúËù­žšš&ÍúÊÀµ¨›šš#ÍûŹ©›ššÍûʾ°ŸššÍüǹ§ššÍüǹ¦š!šÍüȹ§š$šÍüʺ§š'šÍü¯›š)šÍüȸ¢š,š ÍüÌÀ¬š/š ÍüʸŸš1šÍüDzœš3šÍý¬š6šÍü̾¥š8šûÍ˹ š:šý¹žšýšÿüµØ÷ÿ9ÿýÈëÿ9ÿü¹Üûÿ8ÿüÈÌïÿ;ÿþüÿxÿùúëÜÍøÿ2ÿùüîßÏÀ±§§.ÿùþïÛÇ´¨§ §*ÿúûèÔÀ¬§§&ÿúøà̸¨§§"ÿúþëÒ¹¨§§ÿûöÞÅ­§§ÿüñÓ·§§ÿüñÔ¶§!§ÿüòÔ·§$§ÿüöÖ·§'§ÿûþ䨧)§ÿüóѰ§,§ ÿüýྦྷ/§ ÿü÷Ñ­§1§ÿüïÈ©§3§ÿýå¾§6§ÿüüܵ§8§ûÿùÔ®§:§ýÓ¬§ý§Ë2á5=FOYcnvy{}‚„†ˆ‹‹‚zrkc\UNH?422õ7HZn„œ¸ÍÝïüüôúàÆ®™„qaQA32 2þæü/üøñȤ„hO9228üøß¸•tP62ü<üýõÂü ÿüËLáNU]fnx‰‹“•—™››“Œ…~xqke_XMLLõQ_p•ªÂÖäóÿÿõýæÏº§•„ugYL Lþëÿ/ÿøöѱ•|fRLL8ÿøæÂ¤†gOLÿ<ÿýùÌÿ ÿÿËÍâÌÊÈÆÃÁ¾¼»»º¹¹¸¸··¶·¹»½¿ÁÂÄÆÇÊÍÍõÌÇþ¸²«¦¢ššõ›¡¨®³¸½ÁÅÉÍ Íþ š/šø§°¸¿ÆËÍÍ8šø¡«´¼ÅÌÍš<šýœ©š ÿšËÿáýøóíèâÜØ×ÖÕÔÓÒÑÐÏÎÏÓ×ÚÞâæêíñöþÿÿõüñçÜÒȽµ°«§§õ¨¯¸ÁÉÒÛãìõÿ ÿþ®§/§øª·ÅÒàíûÿÿ8§ø°½ËÚìýÿ§<§ý©¹§ ÿ§&2ü|Õÿÿ-2ü3Y¦ÿ ÿ02ü?Ùÿ ÿ22ü3\ªÿÿ52ýBŒÿÿ72ý>ÿÿ92ýB˜ÿÿ;2ûF¡ÿÿ2<2ýK«2ÿ2û’jH32:2üú굇a=262üûú¾M232 üûÝ–_82/2 üûô±tD2,2üûÏŒW52(2üûê¥k>2%2üû÷©[32"2üü×}>2 2üûö¥X322üüÓz=22!üüõ¡V22$üüÏv<22&üüòžN22)üý§I22*üüúžD22,üüö”@22.üüòŒ=2 20üüíƒ92 22üüç{7224üüàt5226üüÙk3228üýºG229üüò}422;üûÇN22ü;üüø‰6ü=üþÒüü&LüU‹Ùÿÿ)Lým°ÿÿ+LüVÜÿÿ.Lýo³ÿ ÿ0LüWàÿ ÿ2LüMq¶ÿÿ5LýZ›ÿÿ7LýWŸÿÿ9LýZ¦ÿÿ;Lû^®ÿÿLÿýéÅÿ>ÿü÷Ö³ÿ>ÿýçÄÿ>ÿü÷Õ²ÿ=ÿüþæÂÿ>ÿýõÏÿ>ÿý÷Íÿ>ÿýõÊÿ>ÿýòÆÿ>ÿýïÂÿÿÿüÌßñÿ;ÿ§ú¬¾Ñãøÿ6ÿ§û¨»Õîÿ3ÿ §û°Êäûÿ/ÿ §û©ÀÙóÿ,ÿ§ûµÏéýÿ(ÿ§û¬ÄÞ÷ÿ%ÿ§ü¨Ãæÿ#ÿ§ü²Õ÷ÿ ÿ§ü©Äèÿÿ§ü³×øÿÿ!§ü©Æéÿÿ$§üµØùÿÿ&§üªÇîÿÿ)§ýÃñÿÿ*§ü¨Çóÿÿ,§ü©Ëöÿÿ.§üªÏøÿ ÿ0§ü«Òúÿ ÿ2§ü­Öüÿÿ4§ü¯Úýÿÿ6§ý²Þÿÿ8§ý¼òÿÿ9§üªÕþÿÿ;§û¸îÿÿ§;§ü¨Ðü§=§þ´§§ÿýw42-2ÿýÈQ2,2ÿý–<2*2ÿýäk2)2ÿý¸D2'2ÿþo2&2ÿý°A2$2ÿýõi2#2ÿý¨>2!2ÿýäb2 2ÿý822ýQ´ÿÿýÏK22ýW¾ÿÿþn2 2ý^Çÿÿý 822ü3dÐÿÿýÑL2 2ü4lÜÿÿþq2!2ý8ˆÿÿý¤92!2ýMÅÿÿýÏF2!2ý4|ÿÿýñY2"2ýF¹ÿÿþt2"2ü3pýÿÿý—52"2ýA¬ÿÿýº=2#2ýeãÿÿý×J2#2ý<žÿÿþ_2$2ý[Ùÿÿþr2$2ý8ÿÿþ‚2%2ýRÎÿÿý”32$2ý6‘ÿÿý¦62%2þeÿÿý·92%2ýJÓÿÿýÆ>2%2ý:¬ÿÿýÕD2%2ý3ÿÿýàK2&2ý\ñÿÿýåK2&2ýDÉÿÿýèM2&2ý7ŸÿÿýíM2'2þuÿÿýñN2'2ýTàÿÿýñO2'2ý@½ÿÿýõP2'2ý5“ÿÿýøP2(2þkÿÿþè2)2ýUõÿÿ+2ýMäÿÿ,2ýHÝÿÿ-2ýD×ÿÿ.2ý@Îÿ ÿ/2ý=Æÿ ÿ02ý:½ÿ ÿ12ý8µÿ ÿ22ý6«ÿ ÿþV212ý4¡ÿÿüû–9202ý3˜ÿÿüýÝ_212þÿÿüý£>202þƒÿÿüýçj202þyÿÿüý±>2/2þ~ÿÿüýÝQ2/2þ‘ÿÿüýõq2.2ý3ªÿÿ üý›62-2û7Áÿÿü üýÅC2-2ü>Öÿü üýçZ2-2ýGèü üüú~32,2þSüüýª92,2üýÑI2+2üýîd2*2ÿý‰ML-LÿýÑhL,Lÿý¥TL*Lÿýé~L)LÿýÂ\L'Lÿþ‚L&Lÿý¼YL$Lÿý÷|L#LÿýµVL!LÿýévL Lÿý«QLLýg¿ÿÿý×bLLýmÈÿÿþL LýsÐÿÿý®RL LýyØÿÿýÙcL LüMãÿÿþ„L!LýQ˜ÿÿý±RL!LýdÎÿÿý×^L!LýNÿÿýônL"Lý^Ãÿÿþ‡L#Lýƒýÿÿý¥NL"LýY¸ÿÿýÄUL#LýyèÿÿýÞbL#LýU«ÿÿþtL$Lýpàÿÿþ…L$LýR ÿÿþ“L%LýhÖÿÿý£ML$LýP ÿÿý³OL%LþyÿÿýÂSL%LýbÛÿÿýÏWL%LýS¸ÿÿýÜ\L&Lþ’ÿÿýæbL&LýqôÿÿýêcL&Lý\ÒÿÿýìdL&LýQ­ÿÿýñdL'Lþ‡ÿÿýôeL'LýkæÿÿýôfL'LýXÇÿÿý÷fL'LýN¢ÿÿýúfL(Lþ~ÿÿþìL)Lýk÷ÿÿ+Lýdéÿÿ,Lý_äÿÿ-Lý\Þÿÿ.LýXÖÿ ÿ/LýVÏÿ ÿ0LýSÇÿ ÿ1LýQÀÿ ÿ2LýO·ÿ ÿþlL1LýN®ÿÿüþ¥SL0LýM¦ÿ ÿýätL1Lþÿ ÿý°VL0Lþ”ÿ ÿýì~L0Lþ‹ÿ ÿý½WL/Lþÿ ÿýähL/Lþ ÿ ÿýù„L.LýM¶ÿ ÿý©PL-LýQËÿ ÿýÎ[L-LýVÝÿ ÿýìpL-Lý^ìÿ ÿýýL-Lþiÿÿý¶SL,LÿýÙ`L+LÿýòyL*Lÿþ¼Í.Íÿý§ÅÍ,Íÿý´ËÍ*Íÿý ¿Í)Íÿý«ÈÍ'Íÿþ¾Í&Íÿý­ÉÍ$ÍÿýÕ¿Í#Íÿý¯ÊÍ!Íÿý ÁÍ Íÿý²ÌÍÍýŬÿÿý¥ÇÍÍýĪÿÿþ¾Í Íý§ÿÿý±ËÍ ÍýÀ¥ÿÿý¥ÆÍ!Íý¾¢ÿÿþ½Í!ÍýÌ·ÿÿý°ËÍ!Íýƨÿÿý¥ÈÍ!Íý̺ÿÿýÇÃÍ"ÍýÈ«ÿÿþ¼Í#Íý½õÿÿý´ÌÍ"ÍýÉ®ÿÿý«ÊÍ#ÍýÀ ÿÿý£ÇÍ#ÍýʲÿÿþÂÍ$Íýãÿÿþ½Í$Íý˵ÿÿþ¹Í%ÍýŦÿÿþ´Í%Íý̵ÿÿý°ÌÍ%ÍþÀÿÿý«ËÍ%ÍýǤÿÿý¨ÊÍ%ÍýË®ÿÿý¤ÈÍ&Íþ¹ÿÿý¡ÇÍ&ÍýÂÇÿÿý ÇÍ&Íýȧÿÿý©ÆÍ&Íý̱ÿÿý¸ÆÍ'Íþ¼ÿÿýÇÆÍ'ÍýÄ¡ÿÿýÇÆÍ'ÍýɪÿÿýÕÆÍ'Íý̵ÿÿýàÆÍ(Íþ¿ÿÿþ©Í)ÍýÄÕÿÿ+ÍýÆ ÿÿ,ÍýÇ¢ÿÿ-ÍýÈ£ÿÿ.Íýɦÿ ÿ/Íýʨÿ ÿ0Íý˪ÿ ÿ1Íý̬ÿ ÿ2Íý̯ÿ ÿþÄÍ1Íý̱ÿÿüš´ËÍ1Íþ³ÿÿšý¢ÂÍ1Íþ¶ÿÿšý±ÊÍ0Íþ¹ÿÿšýŸ¿Í0Íþ»ÿÿšý­ÊÍ/Íþºÿÿšý¢ÅÍ/Íþµÿÿšýœ½Í/Íþ¯ÿÿ šý²ÌÍ-ÍûÌ©ÿÿš šý¨ÉÍ-Íüʤÿš šýŸÃÍ-ÍýÈ©š šý›ºÍ-ÍþÅššý¯ËÍ,Íšý¥ÇÍ+ÍšýžÀÍ*ÍÿýØþÿ=ÿý·ìÿ>ÿýÊùÿ=ÿý®Þÿ>ÿý½ôÿ>ÿþÜÿ>ÿýÀöÿ=ÿýÓßÿ>ÿýÃ÷ÿ=ÿý®ãÿ>ÿýÇûÿÿýì¾ÿÿýµïÿÿýé»ÿÿþÜÿ ÿýå¸ÿÿýÆûÿ ÿýá´ÿÿý´ïÿ ÿüþÞ±ÿÿþÛÿ!ÿýûÐÿÿýÅûÿ!ÿýî¸ÿÿýµòÿ!ÿýþÖÿÿýÈèÿ"ÿýò½ÿÿþÙÿ#ÿýÛôÿÿýÊýÿ"ÿýöÂÿÿý¼øÿ#ÿýá¯ÿÿý²ðÿ#ÿýøÇÿÿþäÿ$ÿýæ²ÿÿþÚÿ$ÿýûÍÿÿþÓÿ%ÿýëµÿÿýËþÿ$ÿýüÌÿÿýÄýÿ%ÿþáÿÿý½úÿ%ÿýð³ÿÿý¸÷ÿ%ÿýúÂÿÿý³óÿ&ÿþÔÿÿý¯ïÿ&ÿýæÈÿÿý®ïÿ&ÿýó·ÿÿý³îÿ&ÿýüÆÿÿý½îÿ'ÿþÙÿÿýÈîÿ'ÿýê¯ÿÿýÈíÿ'ÿýö»ÿÿýÓíÿ'ÿýýÌÿÿýÞíÿ(ÿþÞÿÿþ³ÿ)ÿýêÓÿ=ÿýî®ÿ=ÿýñ°ÿ=ÿýô²ÿ=ÿýöµÿ=ÿýø¸ÿ=ÿýú»ÿ=ÿýû¾ÿ=ÿýýÂÿ ÿþéÿ1ÿýþÆÿÿü§Êúÿ0ÿýþÊÿÿ§ý°äÿ1ÿþÎÿÿ§ýÅ÷ÿ0ÿþÒÿÿ§ý­ßÿ0ÿþ×ÿÿ§ýÀ÷ÿ/ÿþÕÿÿ§ý°ìÿ/ÿþÌÿÿ§ý©Ûÿ.ÿýþÂÿÿ §ýÈüÿ-ÿûüºÿÿ§ §ý¸ôÿ-ÿü÷³ÿ§ §ý­çÿ-ÿýò³§ §ý¨Õÿ-ÿþë§§ýÂúÿ,ÿ§ý´ñÿ+ÿ§ý«áÿ*ÿ2þ|ü6ü2ýl÷ü4ü2ý^ñü3ü 2ýRçü2ü 2ýIÛü1ü 2ýAÍü0ü 2ý;½ü/ü 2ý7¶ü.ü2ý7µü-ü2ý7³ü,ü2ý6²ü+ü2ý6°ü*ü2ý6¯ü)ü2ý6­ü(ü2ý5­ü'ü2ý5­ü&ü2ý6ºü%ü2ý:Çü$ü2ý>Õü#ü2ýDàü"ü2ýLêü!ü2ýUòü ü2ý_øüü2þlüü2þ|üü2þ™üü2ý5¹üü 2ý<Õüü!2ýHêüü"2ýZøüü#2þtüü$2þ“üü$2ý4³üü%2ý:Ðüü&2ýGìüü'2þcüü(2þüü(2ý5¿üü)2ýBæüüþI2(2ý[ûüüýÜB2(2þ…üüüÿÐ=2'2ý4·üüÿýÄ92'2ý>ßüüÿý¶62'2ýUøüüÿý§42'2þüüÿþ™2'2ý4¿ü üÿþ‡2'2ýFðü üÿþk2'2þrü üÿþT2'2þ²ü üÿýåD2&2ýAèü üÿýÌ92&2þgü ü ÿý¯42&2þ¥ü ü ÿþŽ2&2ý<àüü ÿþo2&2þ]üü ÿþW2&2þüü ÿýäA2%2ý=çüü ÿý¼42%2þmüüÿþŒ2%2ý3»üüÿþa2%2ýJöüüÿýøE2%2þˆüüÿýÆ62$2ý7×üüþcÿÿþ–2%2þ]üüý2xÿÿþi2%2þ¥üü2þÿÿþG2$2ý@íüüLþŽÿ6ÿLýûÿ4ÿLýsöÿ3ÿ Lýhìÿ2ÿ Lý`âÿ1ÿ LýYÖÿ0ÿ LýTÇÿ/ÿ LýQÁÿ.ÿLýPÀÿ-ÿLýP¾ÿ,ÿLýP½ÿ+ÿLýP¼ÿ*ÿLýO»ÿ)ÿLýO¹ÿ(ÿLýO¹ÿ'ÿLýO¹ÿ&ÿLýPÄÿ%ÿLýSÐÿ$ÿLýWÜÿ#ÿLý\æÿ"ÿLýcïÿ!ÿLýk÷ÿ ÿLýtüÿÿLþÿÿLþÿÿLþ§ÿÿLýNÃÿÿ LýUÜÿÿ!Lý_ïÿÿ"Lýpüÿÿ#Lþ†ÿÿ$Lþ¢ÿÿ$LýN¾ÿÿ%LýTØÿÿ&Lý^ðÿÿ'Lþwÿÿ(Lþžÿÿ(LýNÉÿÿ)LýZëÿÿþ`L(LýqþÿÿýãZL(Lþ–ÿÿýØVL'LýMÂÿÿýÎRL'LýWæÿÿýÁOL'Lýküÿÿý´ML'Lþÿÿþ§L'LýMÉÿÿþ—L'Lý^ôÿÿþ~L'Lþ…ÿÿþjL'Lþ½ÿÿýê\L&LýYíÿÿýÕSL&Lþ{ÿÿý»ML&Lþ²ÿÿþžL&LýUæÿÿþ‚L&LþrÿÿþmL&Lþ«ÿÿýéYL%LýUìÿÿýÇNL%Lþÿÿþ›L&LþÆÿÿþuL%Lýaúÿÿýú]L%Lþ˜ÿÿýÏPL$LýPÞÿÿþxÿÿþ¥L%LþrÿÿýLŠÿÿþ}L%Lþ²ÿÿLþ ÿÿþ_L$LýXñÿÿÍþºš6šÍý¾›š4šÍýš3š ÍýÅŸš2š ÍýÇ¢š1š Íýɦš0š Íý˪š/š Íý̬š.šÍý̬š-šÍý̬š,šÍýÌ­š+šÍýÌ­š*šÍýÌ­š)šÍýÌ®š(šÍýÌ®š'šÍýÌ®š&šÍýÌ«š%šÍý˧š$šÍýʤš#šÍýÈ¡š"šÍýÆžš!šÍýÄœš šÍý›ššÍþ¾ššÍþºššÍþ³ššÍýÌ«šš Íýʤšš!ÍýÇžšš"ÍýÛšš#Íþ¼šš$Íþµšš$Íý̬šš%ÍýË¥šš&ÍýÈžšš'ÍþÁšš(Íþ¶šš(ÍýÌ©šš)ÍýÉ ššþÇÍ(ÍþÚšý¢ÉÍ(Íþ¸ššüÿ¥ÊÍ(Íþ«ššÿý¨ËÍ'ÍýÊ¡ššÿý¬ÌÍ'ÍýÄ›ššÿþ¯Í(Íþ¹ššÿþ³Í(Íþ©š šÿþ¸Í'ÍýÈš šÿþ¿Í'Íþ½š šÿþÄÍ'Íþ­š šÿý ÈÍ&ÍýÉŸš šÿý¦ËÍ&ÍþÀš š ÿþ­Í'Íþ°š š ÿþ¶Í&ÍýÊ¡šš ÿþ¾Í&Íþšš ÿþÄÍ&Íþ²šš ÿý ÉÍ%ÍýÊŸšš ÿýªÌÍ%Íþ¾ššÿþ¶Í&ÍþªššÿþÁÍ%ÍýÇœššÿýàÈÍ%Íþ·ššÿý¨ÌÍ$ÍýÌ£ššþÁÿÿþ´Í%ÍþššýÍ»ÿÿþ¿Í%Íþ°ššÍþµÿÿþÈÍ$ÍýÉžššÿþÖ§6§ÿýÞ¨§4§ÿý媧3§ ÿýë­§2§ ÿýñ±§1§ ÿýõµ§0§ ÿýù»§/§ ÿýü¾§.§ÿýü¾§-§ÿýü¿§,§ÿýü¿§+§ÿýüÀ§*§ÿýýÀ§)§ÿýýÁ§(§ÿýýÁ§'§ÿýýÁ§&§ÿýü¼§%§ÿýú¸§$§ÿý÷³§#§ÿýó¯§"§ÿýﬧ!§ÿýꪧ §ÿý䨧§ÿþÞ§§ÿþÖ§§ÿþɧ§ÿýý½§§ ÿýø³§§!ÿýñ¬§§"ÿý稧§#ÿþÚ§§$ÿþ̧§$ÿýþ¿§§%ÿýù´§§&ÿýò¬§§'ÿþâ§§(ÿþͧ§(ÿýýº§§)ÿýõ®§§þñÿ(ÿþæ§§ý±õÿ(ÿþѧ§üÿ´øÿ'ÿýþ½§§ÿý¹ûÿ'ÿý÷°§§ÿý¾ýÿ'ÿýꨧ§ÿýÃþÿ'ÿþÔ§§ÿþÉÿ'ÿýþº§ §ÿþÑÿ'ÿýòª§ §ÿþÞÿ'ÿþÚ§ §ÿþêÿ'ÿþ¿§ §ÿý®ôÿ&ÿýö­§ §ÿý¶úÿ&ÿþà§ § ÿýÀþÿ&ÿþħ § ÿþÎÿ&ÿýø¯§§ ÿþÜÿ&ÿþå§§ ÿþéÿ&ÿþǧ§ ÿý®öÿ%ÿýø­§§ ÿý»þÿ%ÿþݧ§ÿþÏÿ&ÿþ¼§§ÿþãÿ%ÿýð©§§ÿýÞóÿ%ÿþЧ§ÿý¸üÿ$ÿýü²§§þâÿÿþÊÿ%ÿþå§§ýÿØÿÿþßÿ%ÿþħ§ÿþÍÿÿþòÿ$ÿýö«§§üýÎ92#2üý«32"2üþƒ2"2üýûa2!2üýîJ2 2üýÕ;22üý²322üþ‚22üýúV22üýÝ=22 üý­322!üþx22!üýõO22"üýÕ922#üþ¢22$üþm22$üýðI22%üýË722&üþ–22'üþ]22'üýÝ:22(üþ›22)üþ]22)üýÝ:22*üþš22+üþ\22+üýÝ:22,üþš22-üþ\22-üýÜ:22.üþ™22/üþ[2 2/üýÜ82 20üþŠ2 20üýöH2 21üþ´2 22üþd2 22üýÛ82 23üþ‡2 23üýõG224üþ±225üþa225üýÙ7226üþ…226üýôE227üþ­228üþX228üýÃ3229üþd229üýÓ522:üþq22:üýá822;üþ€22;üûí=22ü;üü22ü;üüõC2ü<üýž2ü<üýúLü=üþ¯ü?üÿýÖSL#Lÿþ·L#Lÿþ”L"LÿýþvL!LÿýòaL LÿýÜTLLÿý½MLLÿþ“LLÿýýlLLÿýäULL ÿþ¹LL!ÿþŠLL!ÿýùfLL"ÿýÜSLL#ÿþ¯LL$ÿþLL$ÿýô`LL%ÿýÔPLL&ÿþ¥LL'ÿþrLL'ÿýäTLL(ÿþ©LL)ÿþrLL)ÿýäSLL*ÿþ¨LL+ÿþqLL+ÿýäSLL,ÿþ¨LL-ÿþqLL-ÿýãSLL.ÿþ¨LL/ÿþqL L/ÿýãRL L0ÿþšL L0ÿýú_L L1ÿþ¿L L2ÿþxL L2ÿýâQL L3ÿþ—L L3ÿýù^LL4ÿþ½LL5ÿþvLL5ÿýàPLL6ÿþ•LL6ÿýø]LL7ÿþ¹LL8ÿþnLL8ÿþÍLL9ÿþyLL9ÿýÛNLL:ÿþ„LL:ÿýçQLL;ÿþ‘LL;ÿûñULLÿ;ÿüžLLÿ;ÿüù[Lÿ<ÿý¬Lÿ<ÿýýcÿ=ÿþ»ÿ?ÿšý¦ËÍ#Íšþ¯Í#Íšþ¹Í"ÍšþÁÍ!ÍšýžÇÍ Íšý¤ËÍÍšþ­ÍÍšþ¹ÍÍšý›ÄÍÍšý¢ÊÍÍ šþ®ÍÍ!šþ»ÍÍ!šýœÆÍÍ"šý¤ËÍÍ#šþ±ÍÍ$šþ¾ÍÍ$šýÇÍÍ%šý¦ÌÍÍ&šþ´ÍÍ'šþÂÍÍ'šý¢ËÍÍ(šþ²ÍÍ)šþÂÍÍ)šý¢ËÍÍ*šþ³ÍÍ+šþÂÍÍ+šý¢ËÍÍ,šþ³ÍÍ-šþÂÍÍ-šý¢ËÍÍ.šþ³ÍÍ/šþÃÍ Í/šý¢ËÍ Í0šþ·Í Í0šýœÇÍ Í1šþ¬Í Í2šþÀÍ Í2šý¢ÌÍ Í3šþ¸Í Í3šýœÈÍÍ4šþ­ÍÍ5šþÁÍÍ5šý£ÌÍÍ6šþ¸ÍÍ6šýœÈÍÍ7šþ®ÍÍ8šþÃÍÍ8šþ¨ÍÍ9šþÀÍÍ9šý¤ÌÍÍ:šþ½ÍÍ:šý¡ÌÍÍ;šþ¹ÍÍ;šûžÊÍÍš;šü¶ÍÍš;šüœÉÍš<šý²Íš<šý›Æš=šþ­š?š§ýµúÿ#ÿ§þÂÿ#ÿ§þÒÿ"ÿ§þãÿ!ÿ§ý«ðÿ ÿ§ý³ùÿÿ§ý¿þÿÿ§þÓÿÿ§ý¨éÿÿ§ý°øÿÿ §þÁÿÿ!§þØÿÿ!§ý©íÿÿ"§ý³úÿÿ#§þÅÿÿ$§þÝÿÿ$§ýªñÿÿ%§ý¶üÿÿ&§þÊÿÿ'§þåÿÿ'§ý°ùÿÿ(§þÈÿÿ)§þåÿÿ)§ý°úÿÿ*§þÈÿÿ+§þæÿÿ+§ý°úÿÿ,§þÈÿÿ-§þæÿÿ-§ý±úÿÿ.§þÉÿÿ/§þæÿ ÿ/§ý±ûÿ ÿ0§þÏÿ ÿ0§ý©ñÿ ÿ1§þ¾ÿ ÿ2§þâÿ ÿ2§ý±ûÿ ÿ3§þÑÿ ÿ3§ý©òÿÿ4§þÀÿÿ5§þãÿÿ5§ý²üÿÿ6§þÒÿÿ6§ý©óÿÿ7§þÁÿÿ8§þèÿÿ8§þ¹ÿÿ9§þáÿÿ9§ý³ýÿÿ:§þÛÿÿ:§ý¯ûÿÿ;§þÔÿÿ;§û«øÿÿ§;§üÍÿÿ§;§ü©ôÿ§<§ýÇÿ§<§ý¨ï§=§þÀ§?§2þaÿ0ÿýÊ42 2þ¡ÿ0ÿþq2 2ý<áÿ/ÿýß72 2þbÿ0ÿþ~2 2þ£ÿ/ÿýø<2 2ý=äÿ/ÿþŒ2 2þcÿ0ÿþB2 2þ¥ÿ/ÿþ™2 2ý=åÿ/ÿþI2 2þeÿ/ÿþ©2 2þ§ÿ/ÿþQ2 2ý>èÿ.ÿþº2 2þfÿ/ÿþ]2 2þ©ÿ.ÿýÈ32 2ý?ñÿ.ÿþh2 2þqÿ.ÿý×52 2ý3Äÿ.ÿþt2 2þQÿ.ÿþã2 2þ˜ÿ.ÿ2ý=íÿ-ÿ2þqÿ-ÿ2ý3Ãÿ,ÿ2þPÿ,ÿ2þ—ÿ+ÿ2ý<íÿ*ÿ2þpÿ*ÿ2ý3Ãÿ)ÿ2þPÿ)ÿ2þ—ÿ(ÿ2þ?ÿ(ÿ2þ…ÿ'ÿ2ý9èÿ&ÿ2þxÿ&ÿ2ý6Úÿ%ÿ2þkÿ%ÿ2ý3Ëÿ$ÿ2þ_ÿ$ÿ2þ»ÿ#ÿ2þSÿ#ÿ2þ«ÿ"ÿ2þJÿ"ÿ2þ›ÿ!ÿ2þBÿ!ÿ2þŒÿ ÿ2þ=ÿ ÿ2þŽÿÿ2þAÿÿ2þ˜ÿÿ2þFÿÿ2þ¢ÿÿ2þKÿÿ 2þ­ÿÿ 2þRÿÿ!2þ¸ÿÿ!2þYÿÿ"2þÂÿÿ"2þaÿÿ"2ý3Íÿÿ#2þiÿÿþO2!2ý4Üÿÿþ§2"2þÿÿýûI2!2þ>ÿÿýü2"2þ¡ÿÿüü÷C2!2þSÿÿLþvÿ0ÿýÓNL Lþ®ÿ0ÿþ„L LýUçÿ/ÿýæQL Lþvÿ0ÿþL Lþ°ÿ/ÿýúTL LýUéÿ/ÿþ›L Lþxÿ0ÿþZL Lþ²ÿ/ÿþ¨L LýVêÿ/ÿþ`L Lþyÿ/ÿþµL Lþ´ÿ/ÿþhL LýVìÿ.ÿþÄL Lþ{ÿ/ÿþrL Lþµÿ.ÿþÑL LýWôÿ.ÿþ|L Lþ„ÿ.ÿýÞOL LýMÎÿ.ÿþ‡L Lþgÿ.ÿþèL Lþ¦ÿ.ÿLýUñÿ-ÿLþ„ÿ-ÿLýMÍÿ,ÿLþgÿ,ÿLþ¥ÿ+ÿLýUñÿ*ÿLþƒÿ*ÿLýMÍÿ)ÿLþfÿ)ÿLþ¥ÿ(ÿLþWÿ(ÿLþ–ÿ'ÿLýSìÿ&ÿLþŠÿ&ÿLýOáÿ%ÿLþ~ÿ%ÿLýMÔÿ$ÿLþtÿ$ÿLþÆÿ#ÿLþiÿ#ÿLþ·ÿ"ÿLþaÿ"ÿLþ©ÿ!ÿLþZÿ!ÿLþœÿ ÿLþUÿ ÿLþžÿÿLþYÿÿLþ¦ÿÿLþ]ÿÿLþ¯ÿÿLþcÿÿ Lþ¹ÿÿ Lþhÿÿ!LþÂÿÿ!Lþoÿÿ"LþÌÿÿ"Lþuÿÿ#LþÖÿÿ#Lþ|ÿÿþfL!LýNãÿÿþ´L"Lþÿÿýþ`L!LþWÿÿþ«L"Lþ®ÿÿýû[L!LþiÿÿÍþÁÿ0ÿý§ÌÍ Íþ±ÿ0ÿþ½Í ÍýÊ¡ÿ/ÿý¡ÌÍ ÍþÁÿ0ÿþºÍ Íþ±ÿ/ÿýàËÍ ÍýÊ ÿ/ÿþ¶Í ÍþÁÿ0ÿþÉÍ Íþ°ÿ/ÿþ³Í ÍýÊ ÿ/ÿþÇÍ ÍþÀÿ/ÿþ¯Í Íþ¯ÿ/ÿþÅÍ ÍýÊ©ÿ.ÿþ«Í ÍþÀÿ/ÿþÂÍ Íþ¯ÿ.ÿþ§Í ÍýÊÇÿ.ÿþ¿Í Íþ½ÿ.ÿý£ÌÍ Íþ¨ÿ.ÿþ¼Í ÍþÅÿ.ÿþ Í Íþ³ÿ.ÿÍýʸÿ-ÿÍþ½ÿ-ÿÍþ¨ÿ,ÿÍþÅÿ,ÿÍþ´ÿ+ÿÍýʸÿ*ÿÍþ½ÿ*ÿÍþ¨ÿ)ÿÍþÆÿ)ÿÍþ´ÿ(ÿÍþÊÿ(ÿÍþ¸ÿ'ÿÍýË©ÿ&ÿÍþ»ÿ&ÿÍýÌ£ÿ%ÿÍþ¿ÿ%ÿÍþ¦ÿ$ÿÍþÂÿ$ÿÍþªÿ#ÿÍþÅÿ#ÿÍþ¯ÿ"ÿÍþÇÿ"ÿÍþ²ÿ!ÿÍþÉÿ!ÿÍþ¶ÿ ÿÍþÊÿ ÿÍþ¶ÿÿÍþÉÿÿÍþ³ÿÿÍþÈÿÿÍþ±ÿÿÍþÇÿÿ Íþ®ÿÿ ÍþÅÿÿ!Íþ«ÿÿ!ÍþÃÿÿ"Íþ©ÿÿ"ÍþÁÿÿ#Íþ¦ÿÿ#Íþ¿ÿÿþÆÍ!ÍýÌ¢ÿÿþ¯Í"Íþ¹ÿÿýšÇÍ!ÍþÊÿÿýš²Í"Íþ±ÿÿüš›ÉÍ!ÍþÅÿÿÿþãÿ0ÿý·þÿ ÿþÆÿ0ÿþÛÿ ÿýø¯ÿ/ÿý°üÿ ÿþãÿ0ÿþÕÿ ÿþÅÿ/ÿýÞùÿ ÿýø®ÿ/ÿþÏÿ ÿþâÿ0ÿþõÿ ÿþÄÿ/ÿþÉÿ ÿýø®ÿ/ÿþñÿ ÿþáÿ/ÿþÃÿ ÿþÃÿ/ÿþìÿ ÿý÷³ÿ.ÿþ¼ÿ ÿþàÿ/ÿþåÿ ÿþÃÿ.ÿþ·ÿ ÿý÷Èÿ.ÿþàÿ ÿþÛÿ.ÿý²ýÿ ÿýþ¹ÿ.ÿþÙÿ ÿþìÿ.ÿþ¯ÿ ÿþÊÿ=ÿýø½ÿ=ÿþÛÿ=ÿýþ¹ÿ=ÿþìÿ>ÿþÊÿ=ÿýø½ÿ=ÿþÛÿ=ÿýþ¹ÿ=ÿþíÿ>ÿþÊÿ=ÿþ÷ÿ>ÿþÑÿ=ÿýú³ÿ=ÿþØÿ=ÿýý±ÿ=ÿþÞÿ=ÿýþ¶ÿ=ÿþäÿ>ÿþ¼ÿ=ÿþëÿ>ÿþÂÿ=ÿþðÿ>ÿþÈÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿ>ÿþÎÿ=ÿþöÿ>ÿþÊÿ=ÿþóÿ>ÿþÅÿ=ÿþïÿ>ÿþÁÿ=ÿþëÿ>ÿþ½ÿ=ÿþçÿ>ÿþ¹ÿ=ÿþãÿ>ÿþµÿ=ÿþßÿÿþíÿ!ÿýþ±ÿÿþÃÿ"ÿþÔÿÿý§ñÿ!ÿþ÷ÿÿý§Çÿ"ÿþÆÿÿü§¨ôÿ!ÿþëÿÿ2þbÿ!ÿ2þ¿ÿ ÿ2þZÿ ÿ2þÄÿÿ2þbÿÿ2ý3Íÿÿ2þiÿÿ2ý4×ÿÿ2þqÿÿ2ý6ßÿÿ 2þyÿÿ 2ý8íÿÿ!2þÿÿ!2þ;ÿÿ"2þŠÿÿ"2þ?ÿÿ#2þ“ÿÿþ92!2þCÿÿþ|2"2þœÿÿýá62!2þHÿÿþr2"2þ§ÿÿýØ42!2þVÿÿþi2"2þÌÿÿýÍ32!2þqÿÿþa2!2ý8ýÿÿþÂ2"2þÿÿþY2!2þHÿÿþ·2"2þµÿÿþQ2!2þaÿÿþ«2!2ý4ÚÿÿþJ2!2þ}ÿÿþ 2!2þ=ÿÿþD2!2þžÿÿþ•2!2þQÿÿþ?2!2þÄÿÿþ„2!2þkÿÿýà52 2ý6èÿÿþf2!2þŠÿÿþ»2!2þDÿÿþK2!2þ®ÿÿþ•2!2þdÿÿþ:2 2ý6ýÿÿþu2!2þ™ÿÿþÏ2!2þVÿÿþX2 2ý3Úÿÿþ¨2!2þ‡ÿÿþB2 2þIÿÿþ…2!2þÅÿÿýá52 2þvÿÿþf2 2þ>ÿÿþ¼2!2þ¯ÿÿþL2 2þgÿÿþ”2 2þ7ÿÿýñ52 2þœÿÿþa2 2þXÿÿþ§2 2ý3Ýÿÿþ:2 2þŠÿÿþo2 2þKÿÿþº2!2þÈÿÿþC2 2þ~ÿÿþ~2 2þIÿÿþÎ2!2þÓÿÿþN2 2þŒÿÿþŽ2 2þTÿÿLþvÿ!ÿLþÉÿ ÿLþpÿ ÿLþÎÿÿLþvÿÿLþÖÿÿLþ}ÿÿLýNÞÿÿLþ„ÿÿLýOæÿÿ Lþ‹ÿÿ LýRñÿÿ!Lþ’ÿÿ!LþTÿÿ"Lþšÿÿ"LþWÿÿ#Lþ¢ÿÿþRL!Lþ[ÿÿþL"LþªÿÿýçPL!Lþ_ÿÿþ…L"Lþ´ÿÿýßNL!Lþlÿÿþ}L"LþÕÿÿþÖL"Lþ„ÿÿþvL!LýRýÿÿþÌL"Lþ ÿÿþnL!Lþ_ÿÿþÂL"LþÀÿÿþhL!Lþuÿÿþ·L!LýMáÿÿþbL!Lþÿÿþ®L!LþVÿÿþ\L!Lþ¬ÿÿþ¤L!LþgÿÿþXL!LþÎÿÿþ•L!LþÿÿýæNL LýPìÿÿþzL!LþšÿÿþÆL!Lþ\ÿÿþcL!Lþºÿÿþ¤L!LþyÿÿþSL LýPýÿÿþ‡L!Lþ¨ÿÿþ×L!LþlÿÿþnL!LþáÿÿþµL!Lþ—ÿÿþZL Lþ`ÿÿþ–L!LþÎÿÿýçOL Lþ‰ÿÿþ{L LþWÿÿþÇL!Lþ»ÿÿþcL Lþ{ÿÿþ£L LþQÿÿýôOL LþªÿÿþvL Lþnÿÿþ´L LýMäÿÿþTL Lþšÿÿþ‚L LþbÿÿþÅL!LþÑÿÿþ[L LþÿÿþL Lþ`ÿÿþÖL!LþÛÿÿþeL Lþ›ÿÿþžL LþkÿÿÍþÁÿ!ÿÍþ©ÿ ÿÍþÃÿ ÿÍþ¨ÿÿÍþÁÿÿÍþ¦ÿÿÍþ¿ÿÿÍýÌ£ÿÿÍþ½ÿÿÍýÌ¡ÿÿ Íþ»ÿÿ Íý˸ÿÿ!Íþ¹ÿÿ!ÍþËÿÿ"Íþ·ÿÿ"ÍþÊÿÿ#ÍþµÿÿþËÍ!ÍþÉÿÿþºÍ"Íþ²ÿÿý¡ÌÍ!ÍþÇÿÿþ½Í"Íþ¯ÿÿý£ÌÍ!ÍþÄÿÿþ¿Í"Íþ¦ÿÿþ¦Í"Íþ½ÿÿþÁÍ!ÍýËõÿÿþ©Í"ÍþµÿÿþÃÍ!ÍþÇÿÿþ«Í"Íþ¬ÿÿþÅÍ!ÍþÁÿÿþ¯Í"Íþ£ÿÿþÇÍ!Íþºÿÿþ±Í!ÍþÊÿÿþÈÍ!Íþ²ÿÿþ´Í!ÍþÅÿÿþÊÍ!Íþ¨ÿÿþ¸Í!Íþ¿ÿÿý¡ÌÍ ÍýÌ©ÿÿþÀÍ!Íþ·ÿÿþªÍ!ÍþÈÿÿþÇÍ!Íþ®ÿÿþ´Í!ÍþÀÿÿþËÍ ÍýÌõÿÿþ¼Í!Íþ³ÿÿþ¥Í!ÍþÄÿÿþÃÍ!Íþ£ÿÿþ¯Í!Íþ¸ÿÿþÉÍ ÍþÇÿÿþ¸Í!Íþ¨ÿÿý¡ÌÍ Íþ¼ÿÿþÀÍ ÍþÊÿÿþªÍ!Íþ­ÿÿþÆÍ ÍþÀÿÿþ´Í ÍþÌÿÿýÇÌÍ Íþ²ÿÿþÁÍ ÍþÃÿÿþ¯Í!Íþ¢ÿÿþËÍ Íþ·ÿÿþ¾Í ÍþÇÿÿþ«Í!Íþ§ÿÿþÉÍ ÍþºÿÿþºÍ ÍþÇÿÿþ¦Í!Íþ¤ÿÿþÆÍ Íþ¶ÿÿþ¶Í ÍþÄÿÿÿþãÿ>ÿþºÿ=ÿþçÿ>ÿþ¹ÿ=ÿþãÿ>ÿþµÿ=ÿþßÿ=ÿýþ²ÿ=ÿþÛÿ=ÿýý°ÿ=ÿþ×ÿ=ÿýû½ÿ=ÿþÔÿ=ÿþùÿ>ÿþÏÿ=ÿþ÷ÿ>ÿþÌÿÿþûÿ!ÿþôÿÿþÖÿ"ÿþÈÿÿý¯üÿ!ÿþñÿÿþÚÿ"ÿþÃÿÿý²þÿ!ÿþéÿÿþßÿ"ÿþ¶ÿÿþµÿ"ÿþÛÿÿþãÿ!ÿýûôÿÿþ¹ÿ"ÿþÍÿÿþèÿ!ÿþñÿÿþ½ÿ"ÿþ¾ÿÿþìÿ!ÿþãÿÿþÂÿ!ÿýþ±ÿÿþðÿ!ÿþÕÿÿþÆÿ!ÿþøÿÿþóÿ!ÿþÇÿÿþËÿ!ÿþìÿÿþöÿ!ÿþ¹ÿÿþÒÿ!ÿþÞÿÿý¯ýÿ ÿýü³ÿÿþáÿ!ÿþÏÿÿþ¼ÿ!ÿþôÿÿþïÿ!ÿþÁÿÿþËÿ!ÿþáÿÿþúÿ ÿýüôÿÿþÙÿ!ÿþÉÿÿþµÿ!ÿþéÿÿþèÿ!ÿþ±ÿÿþÃÿ!ÿþÑÿÿþõÿ ÿþñÿÿþÑÿ!ÿþ¸ÿÿý¯ýÿ ÿþØÿÿþàÿ ÿþ÷ÿÿþ»ÿ!ÿþÀÿÿþïÿ ÿþàÿÿþËÿ ÿþüÿÿýÈýÿ ÿþÈÿÿþãÿ ÿþèÿÿþÃÿ ÿýþ°ÿÿþùÿ ÿþÏÿÿþÜÿ ÿþïÿÿþ¼ÿ!ÿþ·ÿÿþôÿ ÿþÕÿÿþÕÿ ÿþñÿÿþµÿ!ÿþ³ÿÿþíÿ ÿþÏÿÿþÎÿ ÿþêÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þœÃ#ÃþÃÃþž‡ ‡þ¸Ã"Ãþ¼ÃÃþž‡ ‡þ™Ã-Ãþž‡‡þµÃ,Ãþž‡‡þ•Ã,Ãþž‡‡þ±Ã+Ãþž‡‡þ’Ã+Ãþž‡‡þ®Ã*Ãþž‡‡ýÂÃ)Ãþž‡‡þªÃ)Ãþž‡‡ýŒÁÃ(Ãþž‡‡þ¦Ã(Ãþž‡‡ý‹¿Ã'Ãþž‡‡þ¢Ã'Ãþž‡‡ý‰½Ã&Ãþž‡‡þŸÃ&Ãþž‡‡ýˆºÃ%Ãþž‡‡þ›Ã%Ãþž‡‡þ·Ã$Ãþž‡‡þ˜Ã$Ãþž‡‡þ´Ã#Ãþž‡‡þ”Ã#Ãþž‡‡þ°Ã"Ãþž‡‡þ‘Ã"Ãþž‡‡þ­Ã!Ãþž‡ ‡þ‡ ‡ýŽÂà Ãþž‡ ‡ýž¥‡ ‡þ©Ã Ãþž‡ ‡üžåˆ‡ ‡ýŒÀÃÃþž‡ ‡üžÿ«‡ ‡þ¥ÃÃþž‡ ‡ûžÿúЇ ‡ýŠ¿ÃÃþž‡ ‡ûžÿÿ²‡ ‡þ¢ÃÃþž‡ ‡þžÿÿþŒ‡ ‡ý‰¼ÃÃþž‡ ‡þžÿÿþ¸‡ ‡þžÃÃþž‡ ‡þžÿÿþއ ‡ýˆºÃÃþž‡ ‡þžÿÿþÀ‡ ‡þšÃÃþž‡ ‡þžÿÿþ’‡ ‡þ·ÃÃþž‡ ‡þžÿÿþLJ ‡þ—ÃÃþž‡ ‡þžÿÿþ–‡ ‡þ³ÃÃþž‡ ‡þžÿÿþχ ‡þ“ÃÃþž‡ ‡þžÿÿþ›‡ ‡þ¯ÃÃþž‡ ‡þžÿÿþׇ ‡þÃÃþž‡ ‡þžÿÿþ ‡ ‡þ¬ÃÃþž‡ ‡þžÿÿý߈‡ ‡ýŽÁÃÃþž‡ ‡þžÿÿþ¦‡ ‡þ¨ÃÃþž‡ ‡þžÿÿý艇 ‡ý‹ÀÃÃþž‡ ‡þžÿÿþ­‡ ‡þ¤ÃÃþž‡ ‡þžÿ ÿþЇ ‡ýоÃÃþž‡ ‡þžÿ ÿþ³‡ ‡þ¡ÃÃþž‡ ‡þžÿ ÿþ‡ ‡ýˆ¼ÃÃþž‡ ‡þžÿ ÿþº‡ ‡þÃÃþž‡ ‡þžÿ ÿþ‡ ‡þ¹ÃÃþž‡ ‡þžÿ ÿþÁ‡ ‡þ™ÃÃþž‡ ‡þžÿ ÿþ“‡ ‡þ¶ÃÃþž‡ ‡þžÿ ÿþɇ ‡þ–ÃÃþž‡ ‡þžÿ ÿþ—‡ ‡þ²ÃÃþž‡ ‡þžÿ ÿþч ‡þ“ÃÃþž‡ ‡þžÿÿþœ‡ ‡þ¯ÃÃþž‡ ‡þžÿÿþÙ‡ ‡ýÂÃÃþž‡ ‡þžÿÿþ¢‡ ‡þ«ÃÃþž‡ ‡þžÿÿýሇ ‡ýÁÃÃþž‡ ‡þžÿÿþ¨‡ ‡þ§ÃÃþž‡ ‡þžÿÿýñ‰‡ ‡ý‹Àà Ãþž‡ ‡þžÿÿþ®‡ ‡þ¤Ã Ãþž‡ ‡þžÿÿþ‹‡ ‡ý‰½Ãà ØþÕÓ ÓþÕØ#ØþÕØØþÕÓ Óþר"ØþרØþÕÓ ÓþÔØ-ØþÕÓÓþר,ØþÕÓÓþÔØ,ØþÕÓÓþÖØ+ØþÕÓÓþÔØ+ØþÕÓÓþÖØ*ØþÕÓÓþÔØ*ØþÕÓÓþÖØ)ØþÕÓÓ*ØþÕÓÓþÕØ(ØþÕÓÓþר'ØþÕÓÓþÕØ'ØþÕÓÓþר&ØþÕÓÓþÕØ&ØþÕÓÓþר%ØþÕÓÓþÕØ%ØþÕÓÓþר$ØþÕÓÓþÔØ$ØþÕÓÓþר#ØþÕÓÓþÔØ#ØþÕÓÓþÖØ"ØþÕÓÓþÔØ"ØþÕÓÓþÖØ!ØþÕÓ ÓþÖÓ ÓþÔØ!ØþÕÓ ÓýÛÞÓ ÓþÖØ ØþÕÓ ÓýÛöÓ ÓþרØþÕÓ ÓüÛÿáÓ ÓþÕØØþÕÓ ÓûÛÿýÔÓ ÓþרØþÕÓ ÓûÛÿÿãÓ ÓþÕØØþÕÓ ÓþÛÿÿþÕÓ ÓþרØþÕÓ ÓþÛÿÿþåÓ ÓþÕØØþÕÓ ÓþÛÿÿþÖÓ ÓþרØþÕÓ ÓþÛÿÿþèÓ ÓþÕØØþÕÓ ÓþÛÿÿþ×Ó ÓþרØþÕÓ ÓþÛÿÿþëÓ ÓþÔØØþÕÓ ÓþÛÿÿþÙÓ ÓþÖØØþÕÓ ÓþÛÿÿþîÓ ÓþÔØØþÕÓ ÓþÛÿÿþÛÓ ÓþÖØØþÕÓ ÓþÛÿÿþñÓ ÓþÔØØþÕÓ ÓþÛÿÿþÝÓ ÓþÖØØþÕÓ ÓþÛÿÿþôÓ ÓþÔØØþÕÓ ÓþÛÿÿþßÓ ÓþÖØØþÕÓ ÓþÛÿÿý÷ÔÓ ÓþרØþÕÓ ÓþÛÿÿþáÓ ÓþÕØØþÕÓ ÓþÛÿ ÿþÔÓ ÓþרØþÕÓ ÓþÛÿ ÿþäÓ ÓþÕØØþÕÓ ÓþÛÿ ÿþÕÓ ÓþרØþÕÓ ÓþÛÿ ÿþæÓ ÓþÕØØþÕÓ ÓþÛÿ ÿþÖÓ ÓþרØþÕÓ ÓþÛÿ ÿþéÓ ÓþÔØØþÕÓ ÓþÛÿ ÿþ×Ó ÓþרØþÕÓ ÓþÛÿ ÿþìÓ ÓþÔØØþÕÓ ÓþÛÿ ÿþÙÓ ÓþÖØØþÕÓ ÓþÛÿ ÿþïÓ ÓþÔØØþÕÓ ÓþÛÿÿþÛÓ ÓþÖØØþÕÓ ÓþÛÿÿþòÓ ÓþÔØØþÕÓ ÓþÛÿÿþÝÓ ÓþÖØØþÕÓ ÓþÛÿÿþõÓ ÓØþÕÓ ÓþÛÿÿþßÓ ÓþÖØØþÕÓ ÓþÛÿÿýúÔÓ Óþר ØþÕÓ ÓþÛÿÿþâÓ ÓþÕØ ØþÕÓ ÓþÛÿÿþÔÓ ÓþרØ þ/D Dþ1#þ0þ/D Dþ"þþ/D Dþ5-þ/DDþ,þ/DDþ8,þ/DDþ+þ/DDþ;+þ/DDþ"*þ/DDý=)þ/DDþ%)þ/DDý?(þ/DDþ((þ/DDýA'þ/DDþ,'þ/DDýB&þ/DDþ/&þ/DDýC%þ/DDþ2%þ/DDþ$þ/DDþ5$þ/DDþ#þ/DDþ8#þ/DDþ"þ/DDþ;"þ/DDþ#!þ/D DþJD Dý> þ/D DýUZD Dþ& þ/D DüU‰ED Dý@þ/D DüUÿ^D Dþ)þ/D DûUÿèFD DýAþ/D DûUÿÿcD Dþ,þ/D DþUÿÿþHD DýCþ/D DþUÿÿþhD Dþ0þ/D DþUÿÿþID DýCþ/D DþUÿÿþnD Dþ3þ/D DþUÿÿþLD Dþþ/D DþUÿÿþsD Dþ6þ/D DþUÿÿþOD Dþþ/D DþUÿÿþyD Dþ9þ/D DþUÿÿþSD Dþ þ/D DþUÿÿþD Dþ<þ/D DþUÿÿþWD Dþ$þ/D DþUÿÿþ…D Dý>þ/D DþUÿÿþ[D Dþ'þ/D DþUÿÿý”ED Dý@þ/D DþUÿÿþ`D Dþ*þ/D DþUÿ ÿþFD DýAþ/D DþUÿ ÿþdD Dþ-þ/D DþUÿ ÿþHD DýCþ/D DþUÿ ÿþiD Dþ1þ/D DþUÿ ÿþJD Dþþ/D DþUÿ ÿþoD Dþ4þ/D DþUÿ ÿþMD Dþþ/D DþUÿ ÿþtD Dþ7þ/D DþUÿ ÿþPD Dþþ/D DþUÿ ÿþzD Dþ:þ/D DþUÿÿþSD Dþ!þ/D DþUÿÿþ€D Dý<þ/D DþUÿÿþXD Dþ$þ/D DþUÿÿþ†D Dý?þ/D DþUÿÿþ\D Dþ(þ/D DþUÿÿý»ED Dý@ þ/D DþUÿÿþaD Dþ+ þ/D DþUÿÿþGD DýBWÿþöÿ=ÿýèáÿ<ÿüè³þÿ;ÿüèÿÛÿ;ÿûèÿêüÿ:ÿûèÿÿÖÿ:ÿþèÿÿþùÿ9ÿþèÿÿþÑÿ9ÿþèÿÿþ÷ÿ8ÿþèÿÿþËÿ8ÿþèÿÿþóÿ7ÿþèÿÿþÆÿ7ÿþèÿÿþïÿ6ÿþèÿÿþÁÿ6ÿþèÿÿþêÿ5ÿþèÿÿþ»ÿ5ÿþèÿÿþåÿ4ÿþèÿÿý·þÿ3ÿþèÿÿþàÿ3ÿþèÿÿý¸ýÿ2ÿþèÿÿþÚÿ2ÿþèÿ ÿþûÿ1ÿþèÿ ÿþÕÿ1ÿþèÿ ÿþùÿ0ÿþèÿ ÿþÏÿ0ÿþèÿ ÿþöÿ/ÿþèÿ ÿþÊÿ/ÿþèÿ ÿþòÿ.ÿþèÿ ÿþÅÿ.ÿþèÿ ÿþîÿ-ÿþèÿ ÿþÀÿ-ÿþèÿÿþéÿ,ÿþèÿÿþºÿ,ÿþèÿÿþãÿ+ÿþèÿÿýµþÿ*ÿþèÿÿþÞÿ*ÿþèÿÿýÌýÿ)ÿþèÿÿþÙÿ)ÿþèÿÿþûÿÿ5‡þ¦ÃÃþˆ‡3‡ýŠ¿ÃÃþ¡‡4‡þ¢ÃÃý¾Š‡3‡ý‰½ÃÃþ¥‡4‡þŸÃÃýÀ‹‡3‡ýˆºÃÃþ¨‡4‡þ›ÃÃýÁއ4‡þ·ÃÃþ¬‡4‡þ—ÃÃþ‡4‡þ´ÃÃþ¯‡4‡þ”ÃÃþ“‡4‡þ°ÃÃþ³‡4‡þ‘ÃÃþ—‡4‡þ¬ÃÃþ·‡4‡ýŽÂÃÃþš‡4‡þ©ÃÃýºˆ‡3‡ýŒÀÃÃþž‡4‡þ¥ÃÃý½‰‡3‡þŠÃÃþ¢‡4‡Ãý¿Š‡3‡ Ãþ¦‡3‡ ÃýÁŒ‡2‡ Ãþ©‡2‡ ÃýÂŽ‡1‡ Ãþ­‡1‡ Ãþ‘‡0‡ Ãþ°‡0‡ Ãþ”‡/‡ Ãþ´‡/‡Ãþ˜‡.‡Ãþ¸‡.‡Ãþ›‡-‡Ãýºˆ‡,‡ÃþŸ‡,‡Ãý½‰‡+‡Ãþ£‡+‡Ãý¿‹‡*‡Ãþ¦‡*‡ÃýÁŒ‡)‡Ãþª‡)‡Ãý‡(‡Ãþ®‡(‡Ãþ’‡'‡Ãþ±‡'‡Ãþ•‡&‡Ãþµ‡&‡Ãþ™‡%‡Ãþ¸‡%‡Ãþœ‡$‡Ãý»ˆ‡#‡Ãþ ‡#‡Ãý½‰‡"‡Ãþ¤‡"‡ÃýÀ‹‡!‡Ãþ§‡!‡ÃýÁ‡ ‡Ãþ«‡ ‡Ãý‡‡Ãþ¯‡‡Ãþ’‡‡Ãþ²‡‡Ãþ–‡‡Ãþ¶‡‡5ÓþÕØØ6ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÖÓ4ÓþÕØØþÔÓ4ÓþרØþÖÓ4ÓþÔØØþÔÓ4ÓþÖØØþÖÓ4ÓþÔØØþÔÓ4ÓþÖØØþÖÓ4ÓþÔØØþÔÓ4ÓþÖØØþ×Ó4ÓþÔØØþÕÓ4ÓþÖØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓØþÕÓ4ÓØþ×Ó4Ó ØþÕÓ3Ó Øþ×Ó3Ó ØþÖÓ2Ó ØþÔÓ1Ó ØþÖÓ1Ó ØþÔÓ0Ó ØþÖÓ0Ó ØþÔÓ/Ó Øþ×Ó/ÓØþÔÓ.ÓØþ×Ó.ÓØþÕÓ-ÓØþ×Ó-ÓØþÕÓ,ÓØþ×Ó,ÓØþÕÓ+ÓØþ×Ó+ÓØþÕÓ*ÓØ+ÓØþÖÓ)ÓØþÔÓ(ÓØþÖÓ(ÓØþÔÓ'ÓØþÖÓ'ÓØþÔÓ&ÓØþ×Ó&ÓØþÔÓ%ÓØþ×Ó%ÓØþÕÓ$ÓØþ×Ó$ÓØþÕÓ#ÓØþ×Ó#ÓØþÕÓ"ÓØþ×Ó"ÓØþÖÓ!ÓØ"ÓØþÖÓ ÓØþÔÓÓØþÖÓÓØþÔÓÓØþÖÓÓØþÔÓÓØþ×ÓÓ5Dþ)þCD3DýAþ-D4Dþ,ýAD3DýBþ*D4Dþ/ý@D3DýCþ'D4Dþ2ý>D4Dþþ#D4Dþ6þþ3D4Dþ&ýCD3Dý@þ0D4Dþ)ýCD3DþAþ,D4DýAD3D þ)D3D ý@D2D þ&D2D ý>D1D þ#D1D þ;D0D þD0D þ8D/D þD/Dþ5D.DþD.Dþ2D-DýCD,Dþ/D,DýBD+Dþ,D+DýAD*Dþ(D*Dý?D)Dþ%D)Dý=D(Dþ"D(Dþ;D'DþD'Dþ8D&DþD&Dþ5D%DþD%Dþ1D$DýCD#Dþ.D#DýBD"Dþ+D"Dý@D!Dþ(D!Dý?D Dþ$D Dý"þ!D DþUÿÿDþ'#þ:D Dþ|ÿÿDý@"þD DþQÿÿDþ*#þ7D DüvÿÿDDýB"þD DüMÿÿDDþ-#þ4D DýpÿDDýC"þD DýKÿDDþ1#þ1D DþjD Dþ"ýCD DþID Dþ4#þ-DDþ"ýBDDþ7#þ*DDþ"ý@DDþ:#þ'DDþ!"ý>DDý<"þ$DDþ$"ýDDý="þ#DD*ÿþÁÿ=ÿþïÿ>ÿþÆÿ=ÿþóÿ>ÿþÌÿ=ÿþ÷ÿ>ÿþÑÿ=ÿþúÿ>ÿþ×ÿ=ÿýüßÿ=ÿþÜÿ=ÿýþ´ÿ=ÿþáÿ>ÿþ¸ÿ=ÿþæÿ>ÿþ½ÿ=ÿþìÿ>ÿþÂÿ=ÿþðÿ>ÿþÈÿ=ÿþôÿ>ÿþÍÿ=ÿþ÷ÿ>ÿþÒÿ=ÿþúÿ>ÿþØÿ=ÿýýÕÿ=ÿþÝÿ=ÿýþµÿ=ÿþâÿ>ÿþ¹ÿ=ÿþèÿ>ÿþ¾ÿ=ÿþíÿ>ÿþÄÿ=ÿþñÿ>ÿþÉÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿÿÿ ÿþµÿ=ÿþ‹ÿ=ÿý‡®ÿ<ÿü‡‰ñÿ;ÿ‡þ¨ÿ;ÿ‡ýˆáÿ:ÿ‡þ¢ÿ:ÿ‡þÙÿ9ÿ‡þœÿ9ÿ‡þÑÿ8ÿ‡þ—ÿ8ÿ‡þÉÿ7ÿ‡þ“ÿ7ÿ‡þÁÿ6ÿ‡þÿ6ÿ‡þºÿ5ÿ‡þÿ5ÿ‡þ³ÿ4ÿ‡þŠÿ4ÿ ‡þ­ÿ3ÿ ‡ý‰èÿ2ÿ ‡þ§ÿ2ÿ ‡ýˆßÿ1ÿ ‡þ ÿ1ÿ ÿþäÿ=ÿþÔÿ=ÿýÓâÿ<ÿüÓÔúÿ;ÿÓþßÿ;ÿÓþõÿ:ÿÓþÝÿ:ÿÓþòÿ9ÿÓþÛÿ9ÿÓþïÿ8ÿÓþÙÿ8ÿÓþìÿ7ÿÓþØÿ7ÿÓþéÿ6ÿÓþÖÿ6ÿÓþæÿ5ÿÓþÕÿ5ÿÓþäÿ4ÿÓþÔÿ4ÿ Óþáÿ3ÿ ÓýÔ÷ÿ2ÿ Óþßÿ2ÿ Óþôÿ1ÿ ÓþÝÿ1ÿ ÿþfÿ=ÿþGÿ=ÿýDaÿ<ÿüDE»ÿ;ÿDþ\ÿ;ÿDþ†ÿ:ÿDþXÿ:ÿDþ€ÿ9ÿDþSÿ9ÿDþzÿ8ÿDþPÿ8ÿDþtÿ7ÿDþMÿ7ÿDþoÿ6ÿDþJÿ6ÿDþiÿ5ÿDþHÿ5ÿDþeÿ4ÿDþFÿ4ÿ Dþ`ÿ3ÿ DýE”ÿ2ÿ Dþ[ÿ2ÿ Dþ…ÿ1ÿ DþWÿ1ÿ ÿþÔÿ=ÿþûÿ>ÿþÙÿ=ÿýýÌÿ=ÿþÞÿ=ÿýþµÿ=ÿþãÿ>ÿþºÿ=ÿþéÿ>ÿþÀÿ=ÿþîÿ>ÿþÅÿ=ÿþòÿ>ÿþÊÿ=ÿþöÿ>ÿþÏÿ=ÿþùÿ>ÿþÕÿ=ÿþûÿ>ÿþÚÿ=ÿýý·ÿ=ÿþßÿ=ÿýþ·ÿ=ÿþåÿ1ÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿ ÿþ´‡ ‡þ°Ãà ÿþ˜‡ ‡ýˆÀÃà ÿþˆ‡ ‡þ•ÃÃÿþLJ ‡þ¦ÃÃÿþ¨‡ ‡þ·ÃÃÿþ‘‡ ‡þŒÃÃÿþí‡ ‡þœÃÃÿþÇ ‡þ¬ÃÃÿþ§‡ ‡þ¼ÃÃÿþ‡ ‡þÃÃÿþè‡ ‡þžÃÃÿþÇ ‡þ­ÃÃÿþ§‡ ‡þ½ÃÃÿþ‡ ‡þÃÃÿþè‡ ‡þŸÃÃÿþŇ ‡þ¯ÃÃÿþ«‡ ‡þ¾ÃÃÿþ•‡ ‡þÃÃÿþˆ‡ ‡þÃÃÿþч ‡þ«ÃÃÿþµ‡ ‡þ¹ÃÃÿþž‡ ‡þŠÃÃÿþ‹‡ ‡þ˜ÃÃÿþ㇠‡þ¦ÃÃÿþƇ ‡þ³ÃÃÿþ®‡ ‡ýˆÁÃÃÿþš‡ ‡þ’ÃÃÿþЇ ‡þŸÃÃÿþÞ‡ ‡þ«ÃÃÿþ‡ ‡þ¸ÃÃÿþ«‡ ‡ý‰ÂÃÃÿþ—‡ ‡þ”ÃÃÿþ‰‡ ‡þ¡ÃÃÿþ݇ ‡þ­ÃÃÿþć ‡þ¹ÃÃÿþ¯‡ ‡ý‰ÂÃÃÿþœ‡ ‡þ“ÃÃÿþŒ‡ ‡þžÃÃÿþñ‡ ‡þ©ÃÃÿþ͇ ‡þ´ÃÃÿþ¶‡ ‡þ¿ÃÃÿþ¤‡ ‡þŽÃÃÿþ•‡ ‡þ™ÃÃÿþ‰‡ ‡þ¤ÃÃÿþä‡ ‡þ®ÃÃÿþ̇ ‡þ¸ÃÃÿþ¸‡ ‡þÁÃÃÿþ§‡ ‡þÃÃÿþ—‡ ‡þ™ÃÃÿþЇ ‡þ£ÃÃÿþí‡ ‡þ¬ÃÃÿþч ‡þ¶ÃÃÿþ¿‡ ‡þÀÃÃÿþ¯‡ ‡þÃÃÿþ¡‡ ‡þ–ÃÃÿþ”‡ ‡þžÃÃÿþ‰‡ ‡þ§ÃÃÿþñ‡ ‡þ¯ÃÃÿþÔ‡ ‡þ¸ÃÃÿþÁ‡ ‡þÀÃÃÿþ±‡ ‡þŒÃÃÿþ£‡ ‡þ•ÃÃÿþ—‡ ‡þÃÃÿþ‡ ‡þ¤Ãà ÿþäÓ ÓþÖØØ ÿþÙÓ ÓþרØ ÿ ÓþÔØØÿþëÓ ÓþÕØØÿþßÓ ÓþרØÿþ×Ó ÓØÿþùÓ ÓþÕØØÿþêÓ ÓþÖØØÿþßÓ ÓþרØÿþ×Ó ÓþÔØØÿþ÷Ó ÓþÕØØÿþêÓ ÓþÖØØÿþßÓ ÓþרØÿþÖÓ ÓþÔØØÿþ÷Ó ÓþÕØØÿþêÓ ÓþÖØØÿþáÓ ÓþרØÿþØÓ ÓþÔØØÿ ÓþÕØØÿþïÓ ÓþÖØØÿþäÓ ÓþרØÿþÛÓ ÓØÿþÕÓ ÓþÔØØÿþöÓ ÓþÕØØÿþëÓ ÓþÖØØÿþâÓ ÓØÿþÚÓ ÓþÔØØÿþÔÓ ÓþÕØØÿþôÓ ÓþÖØØÿþéÓ ÓþרØÿþàÓ ÓØÿþÙÓ ÓþÔØØÿþÔÓ ÓþÕØØÿþóÓ ÓþÖØØÿþêÓ ÓþרØÿþâÓ ÓØÿþÛÓ ÓþÔØØÿþÕÓ ÓþÕØØÿþúÓ ÓþÖØØÿþíÓ ÓþרØÿþåÓ ÓþרØÿþÞÓ ÓþÔØØÿþØÓ ÓþÔØØÿþÔÓ ÓþÕØØÿþöÓ ÓþÖØØÿþíÓ ÓþרØÿþåÓ ÓØÿþßÓ ÓþÔØØÿþÙÓ ÓþÔØØÿþÔÓ ÓþÕØØÿþùÓ ÓþÖØØÿþïÓ ÓþרØÿþèÓ ÓþרØÿþâÓ ÓØÿþÝÓ ÓþÔØØÿþØÓ ÓþÕØØÿþÔÓ ÓþÕØØÿþúÓ ÓþÖØØÿþðÓ ÓþרØÿþéÓ ÓþרØÿþãÓ ÓØÿþÝÓ ÓþÔØØÿþÙÓ ÓþÕØØÿþÕÓ ÓþÕØØ ÿþeD Dþ ÿþPD DýC ÿ Dþ7ÿþsD Dþ(ÿþ\D DþÿþKD Dþ@ÿþ©D Dþ2ÿþpD Dþ#ÿþ\D DþÿþKD Dþ=ÿþ”D Dþ0ÿþpD Dþ"ÿþ[D DþÿþJD Dþ<ÿþ”D Dþ/ÿþrD Dþ!ÿþ_D DþÿþOD Dþ=ÿ Dþ1ÿþ{D Dþ$ÿþfD DþÿþUD DþAÿþGD Dþ5ÿþˆD Dþ)ÿþsD DþÿþaD DýCÿþRD Dþ:ÿþFD Dþ/ÿþ„D Dþ$ÿþoD Dþÿþ^D DýBÿþPD Dþ8ÿþED Dþ-ÿþ„D Dþ"ÿþqD DþÿþaD DýCÿþSD Dþ:ÿþHD Dþ0ÿþ»D Dþ&ÿþxD DþÿþgD DþÿþYD Dþ>ÿþOD Dþ5ÿþFD Dþ+ÿþˆD Dþ"ÿþwD DþÿþhD Dþÿþ[D Dþ=ÿþPD Dþ4ÿþFD Dþ,ÿþ©D Dþ#ÿþ{D DþÿþmD DþÿþaD Dþ>ÿþWD Dþ7ÿþND Dþ/ÿþFD Dþ(ÿþ»D Dþ ÿþ|D DþÿþoD DþÿþcD Dþ?ÿþXD Dþ8ÿþPD Dþ1ÿþID Dþ* ÿþÔÿ=ÿþíÿ=ÿþþÿ<ÿþÆÿ=ÿþÞÿ=ÿþôÿ<ÿþÁÿ=ÿþÈÿ=ÿþßÿ=ÿþõÿ<ÿþ·ÿ=ÿþÉÿ=ÿþßÿ=ÿþöÿ<ÿþ¸ÿ=ÿþÇÿ=ÿþÛÿ=ÿþïÿ=ÿþþÿ<ÿþ¿ÿ=ÿþÔÿ=ÿþèÿ=ÿþúÿ<ÿþ´ÿ=ÿþÆÿ=ÿþÙÿ=ÿþëÿ=ÿþüÿ<ÿþ·ÿ=ÿþÊÿ=ÿþÜÿ=ÿþîÿ=ÿþýÿ<ÿþ¸ÿ=ÿþÈÿ=ÿþØÿ=ÿþéÿ=ÿþùÿ<ÿþËÿ=ÿþÂÿ=ÿþÒÿ=ÿþáÿ=ÿþïÿ=ÿþýÿ<ÿþ´ÿ=ÿþÂÿ=ÿþÑÿ=ÿþßÿ=ÿþíÿ=ÿþüÿ<ÿþÁÿ=ÿþ¿ÿ=ÿþÌÿ=ÿþØÿ=ÿþäÿ=ÿþñÿ=ÿþýÿ<ÿþËÿ=ÿþ½ÿ=ÿþÊÿ=ÿþ×ÿ=ÿþãÿ=ÿþíÿ=ÿþøÿ(ÿÃþ‡+‡Ãþ·‡,‡Ãþ¥‡,‡Ãþ“‡,‡Ãþ½‡-‡Ãþ«‡-‡Ãþ˜‡-‡ÃýÁ‰‡-‡Ãþ°‡.‡ÃþŸ‡.‡Ãþއ.‡ Ãþº‡/‡ Ãþ©‡/‡ Ãþ˜‡/‡ ÃýÁ‰‡/‡ Ãþ³‡0‡ Ãþ£‡0‡ Ãþ“‡0‡ ÃýÀˆ‡0‡ Ãþ±‡1‡ Ãþ¢‡1‡ Ãþ’‡1‡ Ãþ¿‡2‡ Ãþ°‡2‡ Ãþ¡‡2‡ Ãþ“‡2‡ ÃýÁˆ‡2‡ Ãþ´‡3‡ Ãþ¦‡3‡ Ãþ˜‡3‡ Ãþ‹‡3‡Ãþ¸‡4‡Ãþ«‡4‡ÃþŸ‡4‡Ãþ“‡4‡ÃýÁˆ‡4‡Ãþ¶‡5‡Ãþª‡5‡Ãþ‡5‡Ãþ‘‡5‡ÃþÁ‡6‡Ãþ¶‡6‡Ãþ«‡6‡ÃþŸ‡6‡Ãþ”‡6‡Ãþ‰‡6‡Ãþº‡7‡Ãþ®‡7‡Ãþ£‡7‡Ãþ˜‡7‡Ãþއ7‡ÃþÁ‡8‡Ãþ¸‡8‡Ãþ®‡8‡Ãþ¥‡8‡Ãþ›‡8‡Ãþ‘‡8‡Ãþˆ‡8‡Ãþ¹‡9‡Ãþ±‡9‡Ãþ¨‡9‡Ãþ ‡9‡Ãþ—‡9‡Ãþ‡9‡Ø-ÓØþ×Ó,ÓØþÕÓ,ÓØþÔÓ,ÓØþ×Ó-ÓØþÖÓ-ÓØþÔÓ-ÓØ/ÓØþÖÓ.ÓØþÕÓ.ÓØþÔÓ.Ó Øþ×Ó/Ó ØþÖÓ/Ó ØþÔÓ/Ó Ø1Ó ØþÖÓ0Ó ØþÕÓ0Ó ØþÔÓ0Ó Øþ×Ó1Ó ØþÖÓ1Ó ØþÕÓ1Ó ØþÔÓ1Ó Øþ×Ó2Ó ØþÖÓ2Ó ØþÕÓ2Ó ØþÔÓ2Ó Ø4Ó ØþÖÓ3Ó ØþÕÓ3Ó ØþÔÓ3Ó Ø5ÓØþ×Ó4ÓØþÖÓ4ÓØþÕÓ4ÓØþÔÓ4ÓØ6ÓØþ×Ó5ÓØþÖÓ5ÓØþÕÓ5ÓØþÔÓ5ÓØ7ÓØþ×Ó6ÓØþÖÓ6ÓØþÕÓ6ÓØþÔÓ6ÓØ8ÓØþ×Ó7ÓØþÖÓ7ÓØþÕÓ7ÓØþÔÓ7ÓØþÔÓ7ÓØ9ÓØþ×Ó8ÓØþÖÓ8ÓØþÕÓ8ÓØþÕÓ8ÓØþÔÓ8ÓØ:ÓØþ×Ó9ÓØþÖÓ9ÓØþÖÓ9ÓØþÕÓ9ÓØþÔÓ9ÓØþÔÓ9Óþ?D+DþD,Dþ*D,Dþ:D,DþD-Dþ%D-Dþ5D-DýCD-Dþ D.Dþ/D.Dþ>D.D þD/D þ&D/D þ5D/D ýBD/D þD0D þ,D0D þ9D0D ýCD0D þD1D þ,D1D þ:D1D þD2D þ D2D þ-D2D þ9D2D ýCD2D þD3D þ)D3D þ5D3D þAD3DþD4Dþ$D4Dþ/D4Dþ:D4DýCD4DþD5Dþ%D5Dþ0D5Dþ;D5DþD6DþD6Dþ%D6Dþ/D6Dþ9D6DþBD6DþD7Dþ!D7Dþ+D7Dþ5D7Dþ>D7DþD8DþD8Dþ!D8Dþ*D8Dþ2D8Dþ;D8DþCD8DþD9DþD9Dþ'D9Dþ.D9Dþ6D9Dþ=D9Dÿ‡þà ÃýÂŒ‡‡þ²Ã Ãþ¯‡‡ý‹Âà Ãþ—‡‡þžÃ Ãþ½‡‡þ±Ã Ãþ§‡‡ý‰Áà Ãþ‘‡‡þšÃ Ãþ·‡‡þ­Ã Ãþ¢‡‡ýˆ¿Ã Ãþ‡‡þ–à Ãþµ‡ ‡þ‡ ‡þ¨Ã Ãþ ‡ ‡þ°‡ ‡þ¹Ã ÃþŒ‡ ‡þ߇ ‡þŽÃ Ãþ´‡ ‡ý•ÿ‡ ‡þ Ã ÃþŸ‡ ‡ý·ÿ‡ ‡þ±Ã Ãþ‡ ‡ýåÿ‡ ‡ý‰ÁÃÃþ¶‡ ‡ü—ÿÿ‡ ‡þ˜Ã Ãþ¤‡ ‡üºÿÿ‡ ‡þ¨Ã Ãþ‘‡ ‡üñÿÿ‡ ‡þ¸ÃÃþ»‡ ‡þ—ÿÿ ‡þŒÃ Ãþ¨‡ ‡þ·ÿÿ ‡þœÃ Ãþ—‡ ‡þáÿÿ ‡þ¬ÃÃýÀˆ‡ ‡þ“ÿÿ ‡þ¼ÃÃþ°‡ ‡þ±ÿÿ ‡þà Ãþž‡ ‡þÓÿÿ ‡þŸÃ Ãþ‡ ‡þ‹ÿÿ ‡þ®ÃÃþ¸‡ ‡þ¢ÿÿ ‡þ¼ÃÃþ¨‡ ‡þÂÿÿ‡þŽÃ Ãþ˜‡ ‡þøÿÿ‡þÃÃý‰‡ ‡þ–ÿÿ‡þ¬ÃÃþ´‡ ‡þ±ÿÿ‡þºÃÃþ¤‡ ‡þÒÿÿ‡þ‹Ã Ãþ”‡ ‡þ‰ÿÿ‡þ˜ÃÃýÁˆ‡ ‡þžÿÿ‡þ¥ÃÃþ³‡ ‡þ¹ÿÿ‡þ²ÃÃþ¤‡ ‡þÜÿÿ‡þ¿ÃÃþ–‡ ‡þŒÿÿ‡þÃÃý‰‡ ‡þ ÿÿ‡þÃÃþµ‡ ‡þºÿÿ‡þªÃÃþ§‡ ‡þÙÿÿ‡þ¶ÃÃþ™‡ ‡þŠÿÿ‡ýˆÁÃÃþŒ‡ ‡þÿÿ‡þ’ÃÃþ»‡ ‡þ´ÿÿ‡þžÃÃþ­‡ ‡þÏÿÿ‡þªÃÃþ ‡ ‡ ÿ‡þ·ÃÃþ’‡ ‡þ“ÿÿ‡þÀÃÃýˆ‡ ‡þ¨ÿÿ‡þÃÃþ·‡ ‡þÀÿÿ‡þ™ÃÃþ«‡ ‡þÛÿÿ‡þ¥ÃÃþŸ‡ ‡þ‰ÿ ÿ‡þ¯ÃÃþ“‡ ‡þ—ÿ ÿ‡þºÃÃýˆ‡ ‡þªÿ ÿ‡þ‰ÃÃþ¸‡ ‡þÀÿ ÿ‡þ”ÃÃþ­‡ ‡þÚÿ ÿ‡þžÃÃþ¢‡ ‡þˆÿ ÿ‡þ§ÃÃþ˜‡ ‡þ•ÿ ÿ‡þ±ÃÃþ‡ ‡þ¥ÿ ÿ‡þºÃÃþ¿‡ ‡þ¹ÿ ÿ‡ýˆÂÃÃþµ‡ ‡þÏÿ ÿ‡þÃÃþª‡ ‡þõÿ ÿ‡þšÃÃþ¡‡ ‡þÿ ÿ‡þ¤ÃÃþ—‡ ‡þ›ÿ ÿ‡þ¬ÃÃþއ ‡þ«ÿ ÿ‡þ´ÃÃþÁ‡ ‡þ¼ÿ ÿ‡þ½ÃÃþ·‡ ‡þÑÿ ÿÓþÕØ!ØÓþÖØ ØþÖÓÓ"ØþÔÓÓþÕØ Øþ×ÓÓþÖØ ØþÕÓÓ"ØþÔÓÓþÔØ Øþ×ÓÓþÖØ ØþÕÓÓþר ØÓþÔØ Øþ×Ó ÓþÖÓ ÓþÖØ ØþÕÓ ÓþâÓ Óþר Ø ÓþôÓ ÓþÔØ Øþ×Ó ÓýØÿÓ ÓþÕØ ØþÕÓ ÓýåÿÓ ÓþÖØ Ø ÓýöÿÓ Ó!Øþ×Ó ÓüÙÿÿÓ ÓþÔØ ØþÕÓ ÓüæÿÿÓ ÓþÖØ ØþÔÓ ÓüúÿÿÓ ÓþרØþ×Ó ÓþÙÿÿ Ó!ØþÖÓ Óþåÿÿ ÓþÕØ ØþÔÓ Óþõÿÿ ÓþÖØØþ×Ó ÓþØÿÿ ÓþרØþÖÓ Óþãÿÿ ÓþÔØ ØþÕÓ Óþïÿÿ ÓþÕØ Ø ÓþÔÿÿ ÓþÖØØþ×Ó ÓþÝÿÿ ÓþרØþÖÓ ÓþéÿÿÓþÔØ ØþÔÓ ÓþüÿÿÓþÕØ Ø ÓþÙÿÿÓþÖØØþ×Ó ÓþãÿÿÓþרØþÕÓ ÓþïÿÿÓ!ØþÔÓ ÓþÔÿÿÓþÔØØþ×Ó ÓþÛÿÿÓþÕØØþÖÓ ÓþæÿÿÓþÖØØþÕÓ ÓþóÿÿÓþרØþÔÓ ÓþÕÿÿÓþÔØ Ø ÓþÜÿÿÓþÕØØþ×Ó ÓþæÿÿÓþÖØØþÕÓ ÓþòÿÿÓþרØþÔÓ ÓþÔÿÿÓ!Ø ÓþÛÿÿÓþÔØØþ×Ó ÓþäÿÿÓþÕØØþÖÓ ÓþîÿÿÓþÖØØþÕÓ Ó ÿÓþרØþÔÓ ÓþØÿÿÓþרØ ÓþßÿÿÓþÔØØþ×Ó ÓþèÿÿÓþÔØØþÖÓ ÓþóÿÿÓþÕØØþÕÓ ÓþÔÿ ÿÓþÖØØþÔÓ ÓþÙÿ ÿÓþרØ Óþàÿ ÿÓ Øþ×Ó Óþèÿ ÿÓþÔØØþÖÓ Óþòÿ ÿÓþÕØØþÕÓ Ó ÿÓþÖØØþÔÓ ÓþØÿ ÿÓþÖØØ ÓþÞÿ ÿÓþרØþ×Ó Óþæÿ ÿÓ Øþ×Ó Óþîÿ ÿÓþÔØØþÖÓ Óþûÿ ÿÓþÔØØþÕÓ ÓþÕÿ ÿÓþÕØØþÔÓ ÓþÛÿ ÿÓþÖØØþÔÓ Óþàÿ ÿÓþרØþ×Ó Óþçÿ ÿÓþרØþ×Ó Óþïÿ ÿDþ1 ý@DDþ þ DDý@ þ6DDþ0 þDDþ þ(DDýB þ;DDþ3 þDDþ" þ-DDýC þ>DDþ7 þD DþJD Dþ' þ.D DþbD Dþ þ?D Dþ„D Dþ> þD DýOÿD Dþ. þ.D DýgÿD Dþ þ?D Dý‰ÿD DýCþD DüPÿÿD Dþ5 þ+D DüiÿÿD Dþ' þ;D Dü»ÿÿD DþþD DþPÿÿ Dþ@ þ'D Dþgÿÿ Dþ2 þ6D Dþ†ÿÿ Dþ#ýCD DþMÿÿ Dþþ D Dþcÿÿ Dþ< þ/D Dþ|ÿÿ Dþ/ þ?D DþGÿÿ Dþ"þD DþXÿÿ Dþþ'D DþoÿÿDþ> þ5D DþÛÿÿDþ1ýBD DþOÿÿDþ$þD DþcÿÿDþþ*D Dþ{ÿÿDþA þ8D DþFÿÿDþ5ýCD DþUÿÿDþ*þD DþiÿÿDþþ*D Dþ‚ÿÿDþþ7D DþHÿÿDþ<ýBD DþVÿÿDþ0þD DþiÿÿDþ%þ(D Dþ€ÿÿDþþ4D DþFÿÿDýCþ@D DþTÿÿDþ:þD DþeÿÿDþ0þ"D DþyÿÿDþ%þ.D D ÿDþþ:D DþMÿÿDþýCD Dþ\ÿÿDþ=þD DþnÿÿDþ4þ$D Dþ‚ÿÿDþ*þ/D DþEÿ ÿDþ þ:D DþPÿ ÿDþýCD Dþ^ÿ ÿDþBþD Dþnÿ ÿDþ8þ"D Dþÿ ÿDþ0þ,D DþEÿ ÿDþ(þ5D DþNÿ ÿDþþ?D DþZÿ ÿDþþD Dþhÿ ÿDýCþD Dþyÿ ÿDþ<þ%D DþÌÿ ÿDþ3þ-D DþHÿ ÿDþ+þ6D DþSÿ ÿDþ#þ>D Dþ^ÿ ÿDþþD Dþkÿ ÿDþþD Dþzÿ ÿÿþöÿ=ÿþ×ÿ=ÿþ·ÿ<ÿþïÿ=ÿþÑÿ=ÿþ³ÿ<ÿþîÿ=ÿþÐÿ=ÿþÌÿ<ÿþíÿ=ÿþÑÿ=ÿþµÿ<ÿþòÿ=ÿþÖÿ=ÿþ¾ÿ<ÿþûÿ=ÿþãÿ=ÿþÊÿ=ÿþßÿ<ÿþïÿ=ÿþÖÿ=ÿþ¿ÿ<ÿþüÿ=ÿþèÿ=ÿþÐÿ=ÿþ¹ÿ<ÿþùÿ=ÿþåÿ=ÿþÐÿ=ÿþºÿ<ÿþüÿ=ÿþèÿ=ÿþÔÿ=ÿþÁÿ|ÿþòÿ=ÿþÞÿ=ÿþËÿ=ÿþ¹ÿ<ÿþýÿ=ÿþîÿ=ÿþÜÿ=ÿþËÿ=ÿþºÿ<ÿþþÿ=ÿþðÿ=ÿþàÿ=ÿþÐÿ=ÿþÁÿ=ÿþÕÿ<ÿþùÿ=ÿþêÿ=ÿþÜÿ=ÿþÎÿ=ÿþÀÿ ÿ‡þÅÿ:ÿ‡þÿ;ÿ‡þ¯ÿ;ÿ‡þàÿ;ÿý‡™ÿ<ÿý‡Áÿ<ÿþŠÿ=ÿþ¦ÿ=ÿþÐÿ þÿÓþêÿ:ÿÓþÕÿ;ÿÓþâÿ;ÿÓþõÿ;ÿýÓÚÿ<ÿýÓéÿ<ÿþÔÿ=ÿþßÿ=ÿþîÿ þÿDþqÿ:ÿDþIÿ;ÿDþaÿ;ÿDþ†ÿ;ÿýDQÿ<ÿýDoÿ<ÿþFÿ=ÿþ[ÿ=ÿþzÿ þÿÿþÇÿ<ÿþøÿ=ÿþØÿ=ÿþ¶ÿ<ÿþìÿ=ÿþÊÿ<ÿþüÿ=ÿþàÿ=ÿþÀÿ þÿÿÿÿÿÿÿÿÿÿþvÿ<ÿý‹2ÿ;ÿýŸ32ÿþˆÿ<ÿý›Lÿ;ÿþ­LLÿþ¼ÿ<ÿý·Íÿ;ÿþ±ÍÍÿþÙÿ<ÿþÏÿ<ÿþÆÿÿ2ÿýåE2 22ÿþS2 21ÿþe2 20ÿþ}2 2/ÿþ™2 2.ÿýµ52 2-ÿýÍ:22,ÿýáC22,ÿþP22+ÿþa22*ÿþw22)ÿþ’22(ÿý­422'ÿýÆ822&ÿýÜ@22&ÿþK22%ÿþ[22$ÿþp22#ÿþŠ22"ÿý¥322!ÿý¿622 ÿýÖ=22ÿýñH22ÿþV22ÿþi22ÿþ‚22ÿþž2 2ÿý¸52 2ÿýÏ;2!2ÿýäD2"2ÿþQ2#2ÿþc2$2ÿþz2%2ÿþ•2&2ÿý°42&2ÿýÉ92'2ÿýÞA2(2ÿþM2(2þ8ÿÿþ]2(2ý4¯ÿÿþs2)2þ”ÿÿþ2)2þyÿÿý¨32(2þbÿÿýÂ72(2þPÿÿýØ>2(2ýCãÿÿýøI2(2ý:ÎÿÿþX2(2ý5¶ÿÿþl2)2þ›ÿÿþ…2)2þÿÿý 32(2þgÿÿýº62(2þTÿÿýÒ<2(2ýGíÿÿýåF2(2ý=ÓÿÿþS2(2ý6¼ÿÿþe2(2ý3£ÿÿþ}2)2þ‡ÿÿþ™2)2þmÿÿý³42(2þYÿÿýË92(2ýJøÿÿýàB2(2ý?ÚÿÿþN2(2ý7Ãÿÿþ_2(2ý3ªÿÿ*2þŽÿÿ)2þtÿÿ(2þ^ÿÿ2ÿýê]L L2ÿþiL L1ÿþyL L0ÿþL L/ÿþ¨L L.ÿýÀNL L-ÿýÖSLL,ÿýç[LL,ÿþfLL+ÿþuLL*ÿþ‰LL)ÿþ¡LL(ÿý¹MLL'ÿýÏRLL&ÿýãXLL&ÿþcLL%ÿþqLL$ÿþƒLL#ÿþšLL"ÿþ²LL!ÿýÉPLL ÿýÝVLLÿýô_LLÿþlLLÿþ}LLÿþ“LLÿþ«L LÿýÂOL Lÿý×TL!Lÿýé\L"LÿþhL#LÿþxL$LÿþŒL%Lÿþ¤L&Lÿý¼NL&LÿýÒRL'LÿýåYL(LÿþdL(LþRÿÿþrL(LýM»ÿÿþ†L)Lþ£ÿÿþL)Lþ‹ÿÿýµML(LþvÿÿýÌQL(LþgÿÿýßWL(Lý[èÿÿýú`L(LýTÖÿÿþmL(LýNÁÿÿþL)Lþ©ÿÿþ•L)Lþÿÿþ®L)Lþ{ÿÿýÅOL(LþkÿÿýÚTL(Lý^ñÿÿýê]L(LýUÛÿÿþiL(LýOÇÿÿþyL)Lþ°ÿÿþL)Lþ—ÿÿþ§L)Lþÿÿý¾NL(LþnÿÿýÔSL(LýaúÿÿýæZL(LýWáÿÿþeL(LýQÍÿÿþtL(LýM¶ÿÿ*Lþžÿÿ)Lþ†ÿÿ(Lþsÿÿ2ÿý ÈÍ Í2ÿþÅÍ Í1ÿþÀÍ Í0ÿþºÍ Í/ÿþ³Í Í.ÿý¬ÌÍ Í-ÿý¦ËÍÍ,ÿý¡ÉÍÍ,ÿþÆÍÍ+ÿþÁÍÍ*ÿþ¼ÍÍ)ÿþµÍÍ(ÿþ®ÍÍ'ÿý¨ËÍÍ&ÿý¢ÉÍÍ&ÿþÇÍÍ%ÿþÃÍÍ$ÿþ½ÍÍ#ÿþ·ÍÍ"ÿþ°ÍÍ!ÿý©ÌÍÍ ÿý¤ÊÍÍÿÇÍÿþÄÍÍÿþ¿ÍÍÿþ¹ÍÍÿþ²Í Íÿý«ÌÍ Íÿý¥ËÍ!Íÿý ÈÍ"ÍÿþÅÍ#ÍÿþÁÍ$Íÿþ»Í%Íÿþ´Í&Íÿý­ÌÍ&Íÿý§ËÍ'Íÿý¢ÉÍ(ÍÿþÆÍ(ÍþËÿÿþÂÍ)Íþ­ÿÿþ½Í)Íþ´ÿÿþ¶Í)Íþ»ÿÿþ¯Í)ÍþÁÿÿý©ÌÍ(ÍþÅÿÿý£ÊÍ(ÍýÉ ÿÿýàÇÍ(Íý˦ÿÿþÄÍ(Íý̬ÿÿþ¾Í)Íþ²ÿÿþ¸Í)Íþ¹ÿÿþ±Í)ÍþÀÿÿý«ÌÍ(ÍþÄÿÿý¤ËÍ(Íýȸÿÿý ÈÍ(ÍýʤÿÿþÅÍ(Íý̪ÿÿþÀÍ)Íþ±ÿÿþºÍ)Íþ¸ÿÿþ³Í)Íþ¾ÿÿý¬ÌÍ(ÍþÃÿÿý¦ËÍ(ÍýÇàÿÿý¡ÉÍ(ÍýÊ£ÿÿþÆÍ(Íý̨ÿÿþÂÍ)Íþ¯ÿÿ*Íþ¶ÿÿ)Íþ¼ÿÿ(ÍþÂÿÿ2ÿý®óÿ<ÿþëÿ<ÿþáÿ<ÿþÕÿ<ÿþÉÿ<ÿý¾ýÿ;ÿýµúÿ;ÿý¯ôÿ<ÿþíÿ<ÿþãÿ<ÿþØÿ<ÿþÌÿ<ÿýÁþÿ;ÿý¸ûÿ;ÿý±öÿ<ÿþïÿ<ÿþæÿ<ÿþÛÿ<ÿþÏÿ<ÿþÄÿ<ÿýºüÿ;ÿý³øÿ;ÿýÈñÿ<ÿþéÿ<ÿþßÿ<ÿþÓÿ<ÿþÇÿ<ÿý½ýÿ;ÿýµùÿ;ÿý®óÿ<ÿþìÿ<ÿþâÿ<ÿþ×ÿ<ÿþËÿ<ÿýÀþÿ;ÿý·ûÿ;ÿý°õÿ<ÿþîÿ(ÿþûÿÿþåÿ(ÿýþÀÿÿþÚÿ)ÿþËÿÿþÎÿ)ÿþ×ÿÿýÃþÿ(ÿþãÿÿý¹üÿ(ÿþìÿÿý²÷ÿ(ÿýô¯ÿÿýÞñÿ(ÿýùµÿÿþèÿ(ÿýý¾ÿÿþÞÿ)ÿþÈÿÿþÒÿ)ÿþÔÿÿþÆÿ)ÿþàÿÿý¼ýÿ(ÿþêÿÿý´ùÿ(ÿýò½ÿÿý®óÿ(ÿýø³ÿÿþëÿ(ÿýý»ÿÿþáÿ)ÿþÅÿÿþÕÿ)ÿþÑÿÿþÉÿ)ÿþÝÿÿý¿þÿ(ÿþèÿÿý¶úÿ(ÿýðÞÿÿý¯õÿ(ÿý÷±ÿÿþíÿ(ÿýü¹ÿÿþäÿ(ÿýþÂÿ<ÿþÎÿ<ÿþÚÿ<ÿþåÿÿ2ýAÝÿÿ2ý8Çÿÿ2ý4®ÿÿ2þ“ÿ ÿ2þwÿ!ÿ2þaÿ"ÿ2þOÿ#ÿ2ýBàÿ#ÿ2ý9Ëÿ$ÿ2ý4³ÿ%ÿ2þ˜ÿ&ÿ2þ|ÿ'ÿ2þdÿ(ÿ2þQÿ)ÿ2ýDäÿ)ÿ2ý;Ïÿ*ÿ2ý5¸ÿ+ÿ2þœÿ,ÿ2þ€ÿ-ÿ2þhÿ.ÿ 2þTÿ/ÿ 2ýFíÿ/ÿ 2ý<Óÿ0ÿ 2ý6»ÿ1ÿ 2ý3¡ÿ2ÿ 2þ…ÿ3ÿ2þkÿ4ÿ2þXÿ5ÿ2ýIõÿ5ÿ2ý>Øÿ6ÿ2ý7Áÿ7ÿ2ý3¨ÿ8ÿ2þŒÿ9ÿ2þqÿ:ÿ2þ]ÿ;ÿý2Mÿ<ÿýAÝÿ<ÿþÈÿ½ÿþcÿ<ÿýv2ÿ;ÿüŒ22ÿ:ÿû£322ÿ9ÿý¹6229ÿýÌ:228ÿýÞB227ÿýýK227ÿþX226ÿþi225ÿþ}224ÿþ”223ÿý«4222ÿý¿72 21ÿýÒ=2 20ÿýãD2 20ÿþP2 2/ÿþ]2 2.ÿþo22-ÿþ„22,ÿþ›22LýYäÿÿLýRÐÿÿLýMºÿÿLþ¢ÿ ÿLþ‰ÿ!ÿLþuÿ"ÿLþfÿ#ÿLýZæÿ#ÿLýSÔÿ$ÿLýN¾ÿ%ÿLþ¦ÿ&ÿLþÿ'ÿLþxÿ(ÿLþhÿ)ÿLý\éÿ)ÿLýT×ÿ*ÿLýNÂÿ+ÿLþªÿ,ÿLþ‘ÿ-ÿLþ|ÿ.ÿ Lþkÿ/ÿ Lý^ñÿ/ÿ LýUÛÿ0ÿ LýOÆÿ1ÿ Lþ®ÿ2ÿ Lþ•ÿ3ÿLþÿ4ÿLþmÿ5ÿLý`÷ÿ5ÿLýWßÿ6ÿLýPËÿ7ÿLýMµÿ8ÿLþœÿ9ÿLþ„ÿ:ÿLþrÿ;ÿýLdÿ<ÿýYäÿ<ÿþÑÿ½ÿþxÿ<ÿýˆLÿ;ÿü›LLÿ:ÿþ°LL:ÿýÃOLL9ÿýÕTLL8ÿýåZLL7ÿýýcLL7ÿþnLL6ÿþ|LL5ÿþLL4ÿþ£LL3ÿý·MLL2ÿýÉPL L1ÿýÚUL L0ÿýè\L L0ÿþfL L/ÿþrL L.ÿþ‚LL-ÿþ•LL,ÿþ©LLÍýÉ¢ÿÿÍý˧ÿÿÍþ®ÿÿÍþµÿ ÿÍþ¼ÿ!ÿÍþÁÿ"ÿÍþÆÿ#ÿÍýÉ¡ÿ#ÿÍý˦ÿ$ÿÍý̬ÿ%ÿÍþ³ÿ&ÿÍþºÿ'ÿÍþÀÿ(ÿÍþÅÿ)ÿÍýÈ ÿ)ÿÍýË¥ÿ*ÿÍýÌ«ÿ+ÿÍþ²ÿ,ÿÍþ¹ÿ-ÿÍþ¿ÿ.ÿ ÍþÄÿ/ÿ Íýȸÿ/ÿ Íýʤÿ0ÿ Íý̪ÿ1ÿ Íþ±ÿ2ÿ Íþ¸ÿ3ÿÍþ¿ÿ4ÿÍþÄÿ5ÿÍýÇÕÿ5ÿÍýÊ£ÿ6ÿÍýÌ©ÿ7ÿÍþ¯ÿ8ÿÍþ¶ÿ9ÿÍþ½ÿ:ÿÍþÂÿ;ÿýÍÆÿ<ÿýÉ¢ÿ<ÿþ§ÿ½ÿþÁÿ<ÿý¼Íÿ;ÿü¶ÍÍÿ:ÿþ±ÍÍ:ÿý«ÌÍÍ9ÿý¦ËÍÍ8ÿý¢ÉÍÍ7ÿýõÇÍÍ7ÿþÃÍÍ6ÿþ¿ÍÍ5ÿþºÍÍ4ÿþ´ÍÍ3ÿþ¯Í Í2ÿý©ÌÍ Í1ÿý¤ÊÍ Í0ÿý ÈÍ Í0ÿþÆÍ Í/ÿþÂÍ Í.ÿþ¾ÍÍ-ÿþ¸ÍÍ,ÿþ²ÍÍÿýö°ÿ;ÿýû¸ÿ;ÿýþÁÿ<ÿþÌÿ<ÿþØÿ<ÿþãÿ<ÿþíÿ<ÿýõ¯ÿ;ÿýú¶ÿ;ÿýþ¿ÿ<ÿþÊÿ<ÿþÖÿ<ÿþâÿ<ÿþìÿ<ÿýó®ÿ;ÿýùµÿ;ÿýý½ÿ<ÿþÈÿ<ÿþÔÿ<ÿþàÿ<ÿþêÿ<ÿýò½ÿ;ÿýø³ÿ;ÿýý¼ÿ<ÿþÆÿ<ÿþÒÿ<ÿþÞÿ<ÿþèÿ<ÿýñÓÿ;ÿý÷²ÿ;ÿýüºÿ;ÿýþÃÿ<ÿþÎÿ<ÿþÛÿ<ÿþåÿ<ÿþîÿ<ÿýö°ÿ<ÿþ·ÿ½ÿþâÿ<ÿþÙÿ<ÿþÏÿ<ÿþÅÿ<ÿý½ýÿ;ÿý¶ùÿ;ÿý°õÿ;ÿýôïÿ<ÿþèÿ<ÿþßÿ<ÿþÕÿ<ÿþËÿ<ÿýÂþÿ;ÿýºüÿ;ÿý´øÿ;ÿý¯óÿ<ÿþíÿ<ÿþåÿ<ÿþÜÿ<ÿþÒÿ<ÿþÈÿÿ$ÿþy22#ÿþ22"ÿý¥322!ÿýº622 ÿýÍ:22ÿýÝB22ÿýøK22ÿþW22ÿþf22ÿþy2 2ÿþ2!2ÿý¥32!2ÿýº62"2ÿýÌ:2#2ÿýÝB2$2ÿýøK2%2ÿþW2&2ÿþf2'2ÿþy2(2ÿþ2)2ÿý¥32(2þ4ÿÿýº62)2þ›ÿÿýÌ:2)2ý…üÿÿýÝB2)2üpüüÿ ÿýøK2)2û_øüüÿ ÿþW2)2ýQñüü ÿþf2)2ýGæüü ÿþy2)2ý>×üü ÿþ‘2)2ý8Åüü ÿý«42(2ý4±üü ÿýÀ72)2þœüüÿýÒ=2)2þ…üüÿýãE2)2þqüüÿþP2)2ý`øüüÿþ]2)2ýRñü üÿþo2)2ýGæü üÿþ…2)2ý?Øü üÿþœ2)2ý8Æü üÿý²42(2ý5²ü üÿýÆ92)2þüüüÿÙ?2)2þ†üüýíH2)2þqüüþT2)2ýaúüü*2ýSñüü)2ýGæüü(2ý?Øüü'2ý9Æüü&2ý5³üü&2þžüü%2þ‡üü$2þsüü#2ýaúüü"2ýRñüü!2ýGæüü 2ý>×üü2ý8Äüü2ý4¯üü2þ™üü2þ‚üü2þlü ü2ý[÷ü ü2ýNîü!ü2ýCàü"ü2ý<Ðü#ü$ÿþ‹LL#ÿþžLL"ÿý²MLL!ÿýÄOLL ÿýÖTLLÿýäZLLÿýúbLLÿþmLLÿþ{LLÿþ‹L LÿþžL!Lÿý²ML!LÿýÄOL"LÿýÕTL#LÿýäZL$LÿýúbL%LÿþmL&LÿþzL'Lÿþ‹L(LÿþžL)Lÿý²ML(LþNÿÿýÄOL)Lþ©ÿÿýÕTL)Lþ•ÿÿýäZL)LþƒÿÿýúbL)LýtüÿÿþmL)LýhöÿÿþzL)Lý^ëÿÿþ‹L)LýWÞÿÿþ L)LýRÎÿÿý·ML(LýN½ÿÿýÊQL)LþªÿÿýÚUL)Lþ–ÿÿýè]L)Lþ„ÿÿþfL)LýuüÿÿþrL)Lýhöÿÿþ‚L)Lý_ëÿÿþ•L)LýWßÿÿþªL)LýRÏÿÿý½NL(LýN½ÿÿýÏRL)Lþ«ÿÿýàXL)Lþ—ÿÿýñ_L)Lþ„ÿÿþjL)Lýuýÿÿ*Lýiöÿÿ)Lý_ëÿÿ(LýWßÿÿ'LýRÏÿÿ&LýN¾ÿÿ&Lþ«ÿÿ%Lþ—ÿÿ$Lþ†ÿÿ#Lýuýÿÿ"Lýhöÿÿ!Lý^ëÿÿ LýWÞÿÿLýQÎÿÿLýN»ÿÿLþ§ÿÿLþ“ÿÿLþÿ ÿLýqûÿ ÿLýeòÿ!ÿLý[æÿ"ÿLýTØÿ#ÿ$ÿþ»ÍÍ#ÿþ¶ÍÍ"ÿþ°ÍÍ!ÿý«ÌÍÍ ÿý¦ËÍÍÿý¢ÉÍÍÿýàÇÍÍÿþÄÍÍÿþÀÍÍÿþ»Í Íÿþ¶Í!Íÿþ°Í"Íÿý«ÌÍ"Íÿý¦ËÍ#Íÿý¢ÉÍ$ÍÿýàÇÍ%ÍÿþÄÍ&ÍÿþÀÍ'Íÿþ»Í(Íÿþ¶Í)Íÿþ°Í)ÍþÌÿÿý«ÌÍ)Íþ²ÿÿý¦ËÍ)Íý¸šÿÿý¢ÉÍ)Íü½ššÿ ÿýàÇÍ)Íû›ššÿ ÿþÄÍ)ÍýÅšš ÿþÀÍ)ÍýÈ šš ÿþ»Í)ÍýÊ£šš ÿþµÍ)Íý˨šš ÿþ¯Í)ÍýÌ­šš ÿý©ÌÍ)Íþ²ššÿý¤ÊÍ)Íþ¸ššÿý ÈÍ)Íþ½ššÿþÆÍ)ÍýÁ›ššÿþÂÍ)ÍýÅš šÿþ¾Í)ÍýÈ š šÿþ¸Í)ÍýÊ£š šÿþ²Í)Íý˨š šÿý­ÌÍ(ÍýÌ­š šÿý¨ËÍ)Íþ²ššüÿ£ÊÍ)Íþ¸ššý¸ÇÍ)Íþ½ššþÄÍ)ÍýÁ›šš*ÍýÅšš)ÍýÈ šš(ÍýÊ£šš'Íý˨šš&Íý̬šš&Íþ²šš%Íþ¸šš$Íþ½šš#ÍýÁ›šš"ÍýÅšš!ÍýÈ šš ÍýÊ£ššÍý̨ššÍýÌ­ššÍþ³ššÍþ¹ššÍþ¾š šÍýÛš šÍýÆžš!šÍýÉ¡š"šÍýË¥š#š$ÿþ×ÿ<ÿþÍÿ<ÿýÄþÿ;ÿý¼ýÿ;ÿýµùÿ;ÿý°õÿ;ÿýÞïÿ<ÿþéÿ<ÿþàÿ<ÿþ×ÿ<ÿþÍÿ<ÿýÄþÿ;ÿý¼ýÿ;ÿý¶ùÿ;ÿý°õÿ;ÿýÞïÿ<ÿþéÿ<ÿþáÿ<ÿþ×ÿ<ÿþÍÿ<ÿýÄþÿ(ÿþþÿÿý¼ýÿ)ÿþÈÿÿý¶ùÿ)ÿýÒ§ÿÿý°õÿ)ÿüÛ§§ÿ ÿýÞïÿ)ÿû䨧§ÿ ÿþéÿ)ÿý쪧§ ÿþáÿ)ÿýò®§§ ÿþ×ÿ)ÿý÷²§§ ÿþÌÿ)ÿýû¸§§ ÿýÂþÿ(ÿýþÀ§§ ÿýºüÿ)ÿþȧ§ÿý´øÿ)ÿþѧ§ÿý¯óÿ)ÿþÛ§§ÿþíÿ)ÿý䨧§ÿþåÿ)ÿý몧 §ÿþÜÿ)ÿýò®§ §ÿþÒÿ)ÿý÷²§ §ÿþÈÿ)ÿýû¸§ §ÿý¿þÿ(ÿýý¿§ §ÿý¸ûÿ)ÿþǧ§üÿ²öÿ)ÿþѧ§ý½ñÿ)ÿþÛ§§þêÿ)ÿý㨧§*ÿý몧§)ÿýò®§§(ÿý÷²§§'ÿýû¸§§&ÿýý¿§§&ÿþǧ§%ÿþѧ§$ÿþÚ§§#ÿý㨧§"ÿý몧§!ÿýò®§§ ÿý÷²§§ÿýû¹§§ÿýþÀ§§ÿþɧ§ÿþÓ§§ÿþÞ§ §ÿý樧 §ÿýî«§!§ÿýô¯§"§ÿýù´§#§2þü+ü2þü,ü2þoü-ü2ýaøü-ü 2ýVòü.ü 2ýLêü/ü 2ýDàü0ü 2ý>Óü1ü 2ý9Åü2ü2ý6¶ü3ü2ý3¥ü4ü2þ”ü5ü2þ‚ü6ü2þqü7ü2ýdúü7ü2ýXõü8ü2ýNíü9ü2ýFãü:üü2?×ü;üý8Äü<üþ°ü þüLþ ÿ+ÿLþÿ,ÿLþ‚ÿ-ÿLývüÿ-ÿ Lýl÷ÿ.ÿ Lýcïÿ/ÿ Lý\æÿ0ÿ LýVÛÿ1ÿ LýRÎÿ2ÿLýOÁÿ3ÿLýM²ÿ4ÿLþ£ÿ5ÿLþ“ÿ6ÿLþ„ÿ7ÿLýxýÿ7ÿLýmùÿ8ÿLýeñÿ9ÿLý]èÿ:ÿüLWÞÿ;ÿýRÎÿ<ÿþ¼ÿ þÿÍþµš+šÍþºš,šÍþ¾š-šÍýÁ›š-š ÍýÄœš.š ÍýÆžš/š ÍýÈ¡š0š Íýʤš1š Íý˨š2šÍý̬š3šÍþ°š4šÍþ´š5šÍþ¹š6šÍþ½š7šÍýÀ›š7šÍýÄœš8šÍýÆžš9šÍýÈ š:šüÍÊ£š;šý˨š<šþ­š þšÿþͧ+§ÿþÕ§,§ÿþܧ-§ÿý㨧-§ ÿý骧.§ ÿýﬧ/§ ÿýó¯§0§ ÿý÷³§1§ ÿýû¸§2§ÿýý¾§3§ÿýþħ4§ÿþ˧5§ÿþÓ§6§ÿþÛ§7§ÿý⨧7§ÿýè©§8§ÿýî«§9§ÿýó¯§:§üÿ÷²§;§ýû¹§<§þÀ§ þ§#üýµ322"üýîC22"üþq22!üý·322 üýïD22 üþt22üýº322üýðE22üþv22üý»322üýñF22üþx2 2üýÅ42 2üýûQ2!2üþš2"2üýé=2"2üþt2#2üýÈ42#2üýûS2$2üþ2$2þ7üüýê>2$2þüüþv2$2ýSÿüüýÊ42#2ü6ÑÿüüþU2$2ü‹ÿÿüüþ¢2$2þQÿÿüýöD2#2ý6Ïÿÿüþ‘2$2þˆÿÿüýî>2#2þPÿÿüþƒ2#2ý5Ìÿÿüýå92#2þ„ÿÿüþv2#2þFÿÿüýÙ52#2þ®ÿÿüþj2#2þ`ÿÿüýÊ32"2ý7Øÿÿüþ^2#2þƒÿÿüþ»2#2þEÿÿüþS2#2þ­ÿÿ üþ®2#2þ_ÿ ÿ üþS2"2ý6×ÿ ÿ üþº2#2þ‚ÿ ÿ üþ[2"2þDÿ ÿ üþÅ2#2þ¡ÿ ÿ üþc2"2þMÿ ÿ üýÐ32"2þ±ÿ ÿ üþl2"2þVÿ ÿ üýÛ52"2þÁÿ ÿ üþu2"2þbÿÿüýä72!2ý4Ïÿÿüþ~2"2þnÿÿüýì:2!2ý7Ýÿÿüþˆ2"2þ{ÿÿüýøA2!2ý:ñÿÿüþ§2"2þˆÿÿüþX2!2þ<ÿÿüþÏ2"2þ‚ÿÿüþt2!2ý8íÿÿüýî92!2þxÿÿüþ”2!2ý5ÝÿÿüþJ2!2þmÿÿþ¥üüþº2!2ý3ÒÿÿþGüüþd2!2þdÿÿý—2üüýß52!2þÅÿÿýA2üüþ‚2!2þZÿÿø’22üü÷@2!2þ¸ÿÿþC22#ÿþÀLL"ÿýò[LL"ÿþ„LL!ÿþÂLL ÿýó\LL ÿþ†LLÿþÄLLÿýô]LLÿþˆLLÿýÆMLLÿýö^LLÿþŠL LÿýÎML LÿýþhL!Lÿþ¨L"LÿýîVL"Lÿþ†L#LÿýÑML#LÿýþiL$Lÿþ«L$LþPÿÿýïWL$LþÿÿþˆL$LþiÿÿýÓNL#LýPÙÿÿþkL$Lþ›ÿÿþ¯L$Lþhÿÿýú\L#LýO×ÿÿþ L$Lþ™ÿÿýòVL#Lþfÿÿþ”L#LýOÕÿÿýêRL#Lþ•ÿÿþˆL#Lþ]ÿÿýàOL#Lþºÿÿþ~L#LþuÿÿýÓML"LýPßÿÿþsL#Lþ”ÿÿþÆL#Lþ]ÿÿþiL#Lþ¹ÿÿþºL#LþtÿÿþiL"LýPÞÿÿþÄL#Lþ“ÿÿþpL"Lþ\ÿÿþÎL#Lþ®ÿÿþxL"LþdÿÿýØML"Lþ½ÿÿþL"LþlÿÿýâNL"LþËÿÿþ‡L"LþvÿÿýéPL!LýM×ÿÿþL"LþÿÿýðSL!LýPäÿÿþ™L"LþÿÿýüYL!LýTôÿÿþ´L"Lþ™ÿÿþmL!LþUÿÿþ×L"Lþ“ÿÿþ‡L!LýRñÿÿýòSL!LþŠÿÿþ£L!LýOäÿÿþbL!Lþÿÿþ²ÿÿþÄL!LýMÚÿÿþ^ÿÿþyL!Lþxÿÿý¥LÿÿýæNL!LþÎÿÿýYLÿÿþ“L!Lþpÿÿø¡LLÿÿûXL!LþÂÿÿþ[LL#šþ¬ÍÍ"šýžÉÍÍ"šþ½ÍÍ!šþ«ÍÍ šýÈÍÍ šþ¼ÍÍšþ«ÍÍšýÈÍÍšþ¼ÍÍšþªÍÍšýÈÍÍšþ»Í Íšþ¨Í!ÍšþÅÍ!Íšþ³Í"ÍšýŸÊÍ"Íšþ¼Í#Íšþ§Í$ÍšþÅÍ$Íšþ²Í$ÍþÌššýžÊÍ$Íþ¶ššþ¼Í$ÍýÅÿššý§ÌÍ#ÍüÌ¥ÿššþÄÍ$Íü·ÿÿššþ±Í$ÍþÅÿÿšýœÈÍ#ÍýÌ¥ÿÿšþµÍ$Íþ·ÿÿšýžÊÍ#ÍþÆÿÿšþ¹Í#Íý̦ÿÿšý ËÍ#Íþ¸ÿÿšþ¼Í#ÍþÈÿÿšý£ÌÍ#Íþ®ÿÿšþ¿Í#ÍþÁÿÿšþ§Í#ÍýÌ£ÿÿšþÂÍ#Íþ¹ÿÿšþªÍ#ÍþÈÿÿšþÅÍ#Íþ®ÿÿ šþ®Í#ÍþÂÿ ÿ šþÅÍ"ÍýÌ£ÿ ÿ šþ«Í#Íþ¹ÿ ÿ šþÃÍ"ÍþÈÿ ÿ šþ¨Í#Íþ±ÿ ÿ šþÁÍ"ÍþÆÿ ÿ šþ¥Í#Íþ­ÿ ÿ šþ¾Í"ÍþÄÿ ÿ šý¢ÌÍ"Íþ©ÿ ÿ šþ¼Í"ÍþÁÿÿšý ÌÍ"Íþ¥ÿÿšþºÍ"Íþ¾ÿÿšýžËÍ!ÍýÌ¢ÿÿšþ·Í"Íþ»ÿÿšý›ÉÍ!ÍýËÇÿÿšþ¯Í"Íþ·ÿÿšþÄÍ!ÍþÊÿÿšþ¥Í"Íþ¹ÿÿšþ¼Í!Íý˸ÿÿšýžËÍ!Íþ»ÿÿšþ´Í!ÍýÌ¢ÿÿšþÇÍ!Íþ¾ÿÿþ°ššþ«Í"Íþ¤ÿÿþÈššþÀÍ!ÍþÀÿÿý´Íššý¡ÌÍ!Íþ¨ÿÿýÉÍššþ¹Í!ÍþÃÿÿøµÍÍšš›ÉÍ!Íþ«ÿÿþÉÍÍ#§þ¾ÿÿ"§ý«ôÿÿ"§þÛÿÿ!§þ½ÿÿ §ý«ôÿÿ §þÚÿÿ§þ¼ÿÿ§ýªóÿÿ§þÙÿÿ§ý¼þÿÿ§ýªòÿÿ§þØÿ ÿ§ý¸þÿ ÿ§þìÿ!ÿ§þÈÿ"ÿ§ý­øÿ"ÿ§þÚÿ#ÿ§ý·þÿ#ÿ§þëÿ$ÿ§þÇÿ$ÿþü§§ý¬÷ÿ$ÿþΧ§þÙÿ$ÿýëÿ§§ý·þÿ#ÿüü´ÿ§§þêÿ$ÿüÏÿÿ§§þÅÿ$ÿþìÿÿ§ý©óÿ#ÿýýµÿÿ§þÌÿ$ÿþÐÿÿ§ý«÷ÿ#ÿþíÿÿ§þÒÿ#ÿýý¶ÿÿ§ý®ûÿ#ÿþÒÿÿ§þÙÿ#ÿþóÿÿ§ý²ýÿ#ÿþÁÿÿ§þßÿ#ÿþäÿÿ§ý·þÿ"ÿýü²ÿÿ§þåÿ#ÿþÒÿÿ§þ¼ÿ#ÿþóÿÿ§þëÿ#ÿþÁÿÿ §þÁÿ#ÿþäÿ ÿ §þëÿ"ÿýü²ÿ ÿ §þ¼ÿ#ÿþÓÿ ÿ §þæÿ"ÿþôÿ ÿ §þ¸ÿ#ÿþÆÿ ÿ §þâÿ"ÿþîÿ ÿ §ý´þÿ"ÿþÀÿ ÿ §þÞÿ"ÿþéÿ ÿ §ý±ýÿ"ÿþºÿ ÿ §þÙÿ"ÿþãÿÿ§ý®üÿ!ÿýþµÿÿ§þÕÿ"ÿþÜÿÿ§ý¬úÿ!ÿýü°ÿÿ§þÐÿ"ÿþÖÿÿ§ý¨õÿ!ÿýùÈÿÿ§þÃÿ"ÿþÐÿÿ§þèÿ!ÿþøÿÿ§þµÿ"ÿþÓÿÿ§þÙÿ!ÿýû½ÿÿ§ý«úÿ!ÿþØÿÿ§þËÿ!ÿýý°ÿÿ§þðÿ!ÿþÝÿÿþħ§þ¼ÿ!ÿýþ´ÿÿþò§§þáÿ!ÿþâÿÿýÊÿ§§ý°ýÿ!ÿþ¸ÿÿýöÿ§§þÓÿ!ÿþçÿÿøÌÿÿ§§¨öÿ!ÿþ½ÿÿþôÿÿ 2þsÿÿýÓ?2!2þUÿÿýØB2!2ýBäÿÿýáD2!2ý7ÅÿÿþN2"2þŸÿÿþ\2"2þxÿÿþm2"2þYÿÿþ‚2"2ýDíÿÿþ™2"2ý6Æÿÿý¯42"2þÿÿýÃ82"2þ_ÿÿýÖ>2"2ýBíÿÿýýI2"2ý4»ÿÿþ^2#2þ…ÿÿþ2#2þXÿÿý¦32"2ý=ßÿÿýÊ82"2ý3¯ÿÿýíD2#2þyÿÿþY2#2þPÿÿþw2$2þÒÿÿþž2%2ÿýÇ62%2ÿþG2&2ÿþk2'2ÿþ 2(2ÿýÖ92'2þ=ÿÿþP2'2ý7¿ÿÿþz2'2ü4¬üÿÿý²32'2ü–üüÿÿýá>2'2þ€üüÿþZ2'2þlüüÿþ‰2'2ý\÷üüÿýÍ52&2ýOïüüÿþP2&2ýCãüü ÿþŠ2&2ý8Éüü ÿýÐ62&2þ¤üü ÿþS2&2þ|üü ÿþŽ2&2ý[úüü ÿýÕ72%2ýEèüü ÿþU2%2ý8Ìü ü ÿþ’2%2ý3¦ü üÿýÜ82%2þ}ü üÿþd2%2ýTøü üÿþµ2%2ý<Üü üÿþI2%2þ¬ü üÿþ‹2%2þvüüÿýÞ92$2ýNõüüÿþg2$2ý9Õüüÿþº2%2þ¡üüÿþK2$2þmüüÿþ2$2ýFïüüÿýá:2#2ý3¼üüÿþo2$2þvüüÿýÐ42#2ýDðüüÿþc2#2ý3¸üüýÿÃ2$2þqüüýÿX2#2ýBíüüþ´2$2þ²üüþO2#2þmüü$2ý=çüü$2þ˜üü#2ýPûüü"2ý3Ãüü"2þqüü!2ý=çüü Lþ†ÿÿýÛXL!LþkÿÿýßZL!LýZéÿÿýç\L!LýPÎÿÿþeL"Lþ­ÿÿþqL"LþŠÿÿþ€L"Lþnÿÿþ“L"Lý\ñÿÿþ§L"LýOÏÿÿý»NL"LþŸÿÿýÍQL"LþtÿÿýÝWL"LýZñÿÿýý`L"LýMÆÿÿþsL#Lþ•ÿÿþL#Lþmÿÿþ³L#LýVæÿÿýÓQL#Lþ»ÿÿýñ\L#Lþ‹ÿÿþnL#Lþfÿÿþ‰L$LþÚÿÿþ«L%LÿýÐPL%Lÿþ^L&LÿþL'Lÿþ®L(LÿýÝSL'LþUÿÿþfL'LýQÉÿÿþŒL'LýM¸ÿÿþ½L(Lþ¥ÿÿýçWL'Lþ‘ÿÿþpL'Lþÿÿþ™L'LýqûÿÿýÖOL&LýfóÿÿþgL&Lý[èÿÿþšL&LýQÒÿÿýØPL&Lþ±ÿÿþiL&LþŽÿÿþžL&LýqýÿÿýÜQL%Lý]íÿÿþkL%LýRÕÿÿþ¡L&Lþ³ÿÿýãRL%LþÿÿþxL%LýküÿÿþÀL%LýUãÿÿþ`L%Lþ¸ÿÿþ›L%Lþ‰ÿÿýåRL$Lýeùÿÿþ{L$LýRÜÿÿþÄL%Lþ®ÿÿþbL$LþÿÿþžL$Lý]óÿÿýçSL#LýMÇÿÿþ‚L$LþˆÿÿýØNL#Lý\ôÿÿþxL$LþÂÿÿþÍL$Lþ„ÿÿþnL#LýZñÿÿþ¿L$Lþ½ÿÿþfL#Lþÿÿ$LýUìÿÿ$Lþ¦ÿÿ#Lýgþÿÿ"LýMÍÿÿ"Lþ„ÿÿ!LýUìÿÿ Íþ½ÿÿý¤ÊÍ!ÍþÄÿÿý£ÉÍ!ÍýÉ ÿÿý¡ÈÍ!Íý̨ÿÿþÆÍ"Íþ±ÿÿþÂÍ"Íþ»ÿÿþ¾Í"ÍþÃÿÿþ¹Í"Íýȸÿÿþ³Í"Íý̨ÿÿý­ÌÍ"Íþµÿÿý¨ÌÍ"ÍþÂÿÿý¤ÊÍ"ÍýɸÿÿýõÇÍ#ÍþªÿÿþÂÍ#Íþ¸ÿÿþºÍ#ÍþÄÿÿþ°Í#ÍýÊ¡ÿÿý§ÌÍ#Íþ­ÿÿý¸ÈÍ#Íþ»ÿÿþÃÍ#ÍþÆÿÿþ¼Í$Íþ¤ÿÿþ²Í%Íÿý§ÌÍ%ÍÿþÈÍ&Íÿþ¿Í'Íÿþ±Í(Íÿý¤ËÍ'ÍþÊÿÿþÆÍ'ÍýÌ©ÿÿþ»Í(Íý®šÿÿþ­Í(Íü´ššÿÿý¡ÊÍ'Íþ¹ššÿþÃÍ'Íþ¾ššÿþ·Í'Íý›ššÿý¦ÌÍ&ÍýÆššÿþÅÍ&ÍýÉ šš ÿþ·Í&Íý̧šš ÿý¥ÌÍ&Íþ°šš ÿþÅÍ&Íþºšš ÿþ¶Í&ÍýÛšš ÿý¤ÌÍ%ÍýÈŸšš ÿþÄÍ%ÍýË¦š š ÿþµÍ&Íþ°š šÿý¢ËÍ%Íþºš šÿþÀÍ%ÍýÄ›š šÿþ¬Í%ÍýÊ¢š šÿþÇÍ%Íþ®š šÿþ·Í%Íþ¼ššÿý¢ËÍ$ÍýÆœššÿþÀÍ$Íýˤššÿþ«Í%Íþ±ššÿþÇÍ$Íþ¾ššÿþ¶Í$ÍýÈššÿý¡ËÍ$Íþªššÿþ¾Í$Íþ¼ššÿý¥ÌÍ#ÍýÈššÿþÁÍ$Íþ«ššýÿ¨Í$Íþ½ššýÿÃÍ#ÍýÉžššþ¬Í$Íþ­ššþÆÍ#Íþ¾šš$ÍýÊŸšš$Íþ³šš#ÍþÅšš#Íþ¨šš"Íþ½šš!ÍýÊŸšš ÿþÚÿÿý³öÿ!ÿþêÿÿý²õÿ!ÿýõ®ÿÿý¯óÿ!ÿýü¸ÿÿþíÿ"ÿþÆÿÿþæÿ"ÿþØÿÿþÝÿ"ÿþèÿÿþÓÿ"ÿýô½ÿÿþÉÿ"ÿýý¸ÿÿýÀþÿ"ÿþÍÿÿý¹ûÿ"ÿþäÿÿý³÷ÿ"ÿýõ½ÿÿýôñÿ"ÿýþ¼ÿÿþåÿ#ÿþÒÿÿþÕÿ#ÿþèÿÿþÄÿ#ÿýø°ÿÿý·ûÿ#ÿþÀÿÿý½óÿ#ÿþ×ÿÿþèÿ#ÿþíÿÿþØÿ$ÿþ´ÿÿþÇÿ<ÿý¸üÿ<ÿþòÿ<ÿþÞÿ<ÿþÆÿ<ÿý³úÿ'ÿþøÿÿþíÿ'ÿýüºÿÿþ×ÿ'ÿüþ§ÿÿþ¿ÿ(ÿüʧ§ÿÿý¯÷ÿ'ÿþÔ§§ÿþçÿ'ÿþÞ§§ÿþÐÿ'ÿý樧§ÿýµýÿ&ÿýí«§§ÿþìÿ&ÿýô¯§§ ÿþÏÿ&ÿýû·§§ ÿý´üÿ&ÿþŧ§ ÿþëÿ&ÿþÖ§§ ÿþÎÿ&ÿý樧§ ÿý³üÿ%ÿýó­§§ ÿþêÿ%ÿýû¶§ § ÿþÌÿ&ÿþħ §ÿý±ûÿ%ÿþÕ§ §ÿþâÿ%ÿýꨧ §ÿþ¾ÿ%ÿýø±§ §ÿþñÿ%ÿþ§ §ÿþÏÿ%ÿþا§ÿý°ûÿ$ÿýí©§§ÿþàÿ$ÿýû³§§ÿþ¼ÿ%ÿþƧ§ÿþïÿ$ÿþݧ§ÿþÍÿ$ÿýó«§§ÿý¯úÿ#ÿýþ»§§ÿþÜÿ$ÿþÙ§§ÿý´þÿ#ÿý󪧧ÿþâÿ$ÿþ½§§ýÿ¹ÿ$ÿþÛ§§ýÿèÿ#ÿýõ«§§þ¾ÿ$ÿþ¿§§þíÿ#ÿþݧ§$ÿýø­§§$ÿþʧ§#ÿþì§§"ÿýþ¹§§"ÿþÛ§§!ÿýø­§§2ý7 ü#ü2ýFËü$ü2ýaìü%ü2þƒü'ü2ý6¡ü(ü2ý=½ü)ü2ýI×ü*ü2ýYêü+ü2ýo÷ü,ü 2ý3‹ü.ü 2ý5£ü/ü 2ý7¯ü0ü 2ý9ºü1ü 2ý<Âü2ü2ý?Ëü3ü2ýCÓü4ü2ýGÜü5ü2ýMãü6ü2ýKæü7ü2ýIãü8ü2ýFßü9ü2ýDÜü:üü2BØü;üý@Õü<üþÐü þüLýQ®ÿ#ÿLý^Ôÿ$ÿLýuðÿ%ÿLþ”ÿ'ÿLýO®ÿ(ÿLýVÇÿ)ÿLý`Þÿ*ÿLýnïÿ+ÿLý‚ûÿ,ÿLþ›ÿ.ÿ LýN°ÿ/ÿ LýP»ÿ0ÿ LýRÄÿ1ÿ LýTÌÿ2ÿLýWÔÿ3ÿLý[Ûÿ4ÿLý_ãÿ5ÿLýdèÿ6ÿLýbëÿ7ÿLý`èÿ8ÿLý^æÿ9ÿLý\ãÿ:ÿüLZßÿ;ÿýXÜÿ<ÿþØÿ þÿÍý̱š#šÍýȦš$šÍýÁžš%šÍþ¹š'šÍý̱š(šÍýʪš)šÍýÇ£š*šÍýÞš+šÍý¾›š,šÍþ·š.š Íý̱š/š ÍýÌ­š0š ÍýË«š1š ÍýË©š2šÍýʦš3šÍýɤš4šÍýÈ¢š5šÍýÆ š6šÍýÇ š7šÍýÇ š8šÍýÈ¡š9šÍýÈ¢š:šüÍÉ£š;šýɤš<šþ¥š þšÿýüƧ#§ÿýò¶§$§ÿý㬧%§ÿþÒ§'§ÿýýƧ(§ÿýø»§)§ÿýñ²§*§ÿý謧+§ÿýܨ§,§ÿþϧ.§ ÿýýŧ/§ ÿýüÀ§0§ ÿýû¼§1§ ÿýù¹§2§ÿý÷¶§3§ÿýô³§4§ÿýò±§5§ÿý6§ÿýï®§7§ÿýñ¯§8§ÿýò°§9§ÿýô±§:§üÿõ²§;§ýö³§<§þ´§ þ§ ½üüÞ£sü7üûИjD224üû÷®m?222üü¾s=22/üüÏD2 2,üüßN22)üûû®\322'üüø J22%üüô•D22#üüîŒ@22!üüç‚<22üüæz822üü÷‹922üý¹J22üýài2!2üüø:2"2üý¾M2$2üüåm32%2üý£=2'2üýðm2)2üýÌI2*2üý—72+2 ½ÿüå°†ÿ7ÿûئ~\LL4ÿûûº€WLL2ÿüȆULL/ÿü×\L L,ÿüæeLL)ÿûþºqMLL'ÿüü®bLL%ÿüø¤\LL#ÿüò›XLL!ÿüì“TLLÿüëŒRLLÿüû›RLLÿýÃaLLÿýæ|L!LÿüüŸSL"LÿýÈdL$Lÿýê€L&Lÿý°UL'LÿýôL)LÿýÕ`L*Lÿý¥PL+L ½šü¢±½š7šû¥³¿ÈÍÍ4šû›®¾ÊÍÍ2šüª½ÊÍÍ/šü¥¹ÈÍ Í,šü¡¶ÆÍÍ*šý®ÂÍÍ'šü›±ÇÍÍ%šüœ´ÈÍÍ#šüž¶ÉÍÍ!šüŸ¹ËÍÍšü »ËÍÍšü›·ËÍÍšý«ÇÍÍšý¡¿Í!Íšü›µËÍ"ÍšýªÆÍ$Íšý ¾Í&Íšý±ÊÍ'Íšý¾Í)Íšý¦ÇÍ*Íšý´ÌÍ+Í ½§ü°ÅÚ§7§û´Êßóÿÿ4§û¨ÁÝ÷ÿÿ2§ü»Úøÿÿ/§üµÔóÿ ÿ,§ü°Îíÿÿ*§üÁæþÿÿ'§ü¨Æðÿÿ%§ü©Ëóÿÿ#§ü«Ïöÿÿ!§ü­Óùÿÿ§ü®×ûÿÿ§ü¨Ïûÿÿ§ý½ðÿÿ§ý¯ßÿ!ÿ§ü¨Íúÿ"ÿ§ý»îÿ$ÿ§ý®Ýÿ&ÿ§ýÅøÿ'ÿ§ýªÝÿ)ÿ§ý¶ñÿ*ÿ§ýÊüÿ+ÿ ÏüïòßÑÏÎÍÌÌËÊÉÉÈÍÞôü&ü÷çÆ©wbN=2 2ö3?Qe{“­Ëíüüùé­‚aJ822ùíÿ ÿþ°2/2þoÿ ÿþY2.2ý3Åÿ ÿýÉ32.2þSÿ ÿþl2/2þžÿ ÿýÞ72.2þ?ÿ ÿþ|2/2þzÿ ÿýä82.2ý5Ðÿ ÿþy2/2þ[ÿ ÿýá72/2þ«ÿ ÿþv2/2þDÿ ÿýß62/2þ…ÿ ÿþt2/2ý7Üÿ ÿýÝ62/2þeÿ ÿþr202þ¹ÿ ÿýÛ52/2þKÿ ÿþm202þ‘ÿ ÿþÉ202ý;ñÿ ÿþV202þ~ÿ ÿþ¨202ý9øÿ ÿþC202þ‡ÿ ÿþŒ202þ>ÿ ÿýõ8202þ•ÿ ÿþq202þFÿ ÿýÏ3202þ¥ÿ ÿþX202þNÿ ÿþž212þµÿ ÿþ9202þYÿ ÿþn212þÅÿ ÿþ½212þdÿ ÿþG202ý4Õÿ ÿþ†212þqÿ ÿýÜ32 2þM2!2ý6áÿ ÿþZ2 2þº2"2þ~ÿ ÿþ¢2 2ýüV2!2þ:ÿ ÿþ:2 2ýü°2"2þŒÿ ÿþi2 2üþL2!2þCÿ ÿþ¨2 2üþ¡2"2þ¯ÿ ÿþ72 2üýøD2!2þhÿ ÿþb2 2üþ’2!2þ8ÿ ÿþž2 2üýñ=2!2þ¤ÿÿýõ52 2üþ…2!2þ`ÿ ÿþ[2 2LýMµÿÿýËNL$LþˆÿÿLýPÊÿÿþ‘L$LûNÖÿÿLLýVÜÿÿþeL$LürÿÿLLý^ìÿ ÿýÖPL$LýÀÿLLþiÿÿþœL$LýdýLLþyÿÿþlL$Lþ©LLþšÿ ÿýßRL#LþYLLýNÌÿ ÿþ¨L-Lþ]ÿÿþtL-Lþ}ÿ ÿýåSL-Lþ¬ÿ ÿþ L-LýRÜÿ ÿþfL-Lþgÿ ÿýÎML-LþŽÿ ÿþ‰L-LýMÀÿ ÿþYL-LýXêÿ ÿþµL.Lþtÿ ÿþtL.Lþ ÿ ÿýáQL-LýPÒÿ ÿþ“L.Lþ`ÿ ÿþWL.Lþƒÿ ÿþ¦L/Lþµÿ ÿþbL.LýVñÿ ÿþ¼L/Lþ‚ÿ ÿþoL.LýMÎÿ ÿýÒML.Lþiÿ ÿþL/Lþ«ÿ ÿýåQL.LþXÿ ÿþL/LþŒÿ ÿýéQL.LýNØÿ ÿþ‹L/Lþqÿ ÿýçPL/Lþ·ÿ ÿþ‰L/Lþ\ÿ ÿýæPL/Lþ–ÿ ÿþ‡L/LýQãÿ ÿýäOL/Lþyÿ ÿþ…L0LþÃÿ ÿýâOL/Lþbÿ ÿþ€L0Lþ ÿ ÿþÒL0LýTôÿ ÿþlL0Lþÿ ÿþµL0LýRúÿ ÿþ[L0Lþ—ÿ ÿþ›L0LþWÿ ÿý÷QL0Lþ¤ÿ ÿþ„L0Lþ]ÿ ÿþ×L1Lþ²ÿ ÿþmL0Lþeÿ ÿþ¬L1LþÀÿ ÿþSL0Lþoÿ ÿþL1LþÎÿ ÿþÇL1Lþyÿ ÿþ^L0LýMÜÿ ÿþ—L1Lþ„ÿ ÿýãML LþdL!LýPçÿ ÿþpL LþÅL"Lþÿ ÿþ¯L LýÿlL!LþTÿ ÿþSL Lýÿ¼L"Lþ›ÿ ÿþ}L LÿþcL!Lþ[ÿ ÿþµL Lÿþ®L"Lþ»ÿ ÿþQL Lÿýü\L!Lþ|ÿ ÿþvL Lÿþ¡L!LþRÿ ÿþ¬L LÿýöVL!Lþ±ÿÿý÷NL Lÿþ•L!Lþuÿ ÿþpL LÍþ¯ÿÿý©ÌÍ$Íþ¼ššÍýÌ©ÿÿþ¹Í$Íû̦ššÍÍýʤÿÿþÆÍ$ÍüššÍÍýÈ©ÿ ÿý¦ÌÍ$Íý¬šÍÍþÅÿÿþ¶Í$ÍýÆ›ÍÍþÀÿÿþÄÍ$Íþ²ÍÍþ·ÿ ÿý£ËÍ#ÍþÉÍÍýÌ©ÿ ÿþ³Í-ÍþÈÿÿþÂÍ-Íþ¿ÿ ÿý¢ËÍ-Íþ²ÿ ÿþµÍ-Íýˤÿ ÿþÆÍ-ÍþÅÿ ÿþ¨Í.Íþºÿ ÿþ¼Í.Íþ¬ÿ ÿþÉÍ-ÍýÉ ÿ ÿþ¯Í.ÍþÂÿ ÿþÂÍ.Íþµÿ ÿý£ÌÍ-Íý̧ÿ ÿþ¹Í.ÍþÇÿ ÿþÊÍ.Íþ½ÿ ÿþ³Í/Íþ¯ÿ ÿþÇÍ.Íýʸÿ ÿþ­Í/Íþ¾ÿ ÿþÃÍ/Íþ¨ÿ ÿþ§Í/ÍþÅÿ ÿþ¾Í/Íþ²ÿ ÿý¢ÌÍ.ÍþÊÿ ÿþºÍ/Íþ»ÿ ÿý ÌÍ.ÍýÌ¥ÿ ÿþ»Í/ÍþÃÿ ÿý¡ÌÍ/Íþ¯ÿ ÿþ¼Í/ÍþÈÿ ÿý¡ÌÍ/Íþ¸ÿ ÿþ¼Í/ÍýÌ¢ÿ ÿý¢ÌÍ/ÍþÀÿ ÿþ½Í0Íþ«ÿ ÿý¢ÌÍ/ÍþÇÿ ÿþ¾Í0Íþµÿ ÿþ§Í0ÍýËÇÿ ÿþÄÍ0Íþºÿ ÿþ¯Í0ÍýËàÿ ÿþÉÍ0Íþ¸ÿ ÿþ¶Í0ÍþÊÿ ÿýÕÌÍ0Íþ´ÿ ÿþ½Í0ÍþÈÿ ÿþ¥Í1Íþ°ÿ ÿþÄÍ0ÍþÆÿ ÿþ²Í1Íþ¬ÿ ÿþËÍ0ÍþÃÿ ÿþ¾Í1Íþ¨ÿ ÿþªÍ1ÍþÀÿ ÿþÈÍ1Íþ¤ÿ ÿþ¸Í1Íþ½ÿ ÿþ¢Í ÍþÆÍ!ÍýÌ¡ÿ ÿþÃÍ Íþ«Í"Íþºÿ ÿþ±Í ÍýšÄÍ!ÍþËÿ ÿþËÍ Íýš­Í"Íþ¶ÿ ÿþ¿Í ÍšþÆÍ!ÍþÉÿ ÿþ¯Í Íšþ±Í"Íþ­ÿ ÿþÌÍ Íšý›ÈÍ!Íþ¿ÿ ÿþÁÍ ÍšþµÍ!ÍþËÿ ÿþ²Í ÍšýÊÍ!Íþ°ÿÿýÕÌÍ Íšþ¸Í!ÍþÁÿ ÿþÃÍ ÍÿýþÃÿÿýºþÿ$ÿþÙ§§ÿýüºÿÿþÔÿ$ÿûþµ§§ÿÿýø³ÿÿþîÿ$ÿüå§§ÿÿýò³ÿ ÿýµüÿ$ÿý¾§ÿÿþëÿÿþÎÿ$ÿýî¨ÿÿþáÿÿþéÿ$ÿþÈÿÿþÏÿ ÿý²ûÿ#ÿþöÿÿýý¹ÿ ÿþÉÿ-ÿþóÿÿþäÿ-ÿþßÿ ÿý°úÿ-ÿþÇÿ ÿþÍÿ-ÿýû³ÿ ÿþíÿ-ÿþìÿ ÿý¸þÿ-ÿþÖÿ ÿþØÿ-ÿýþ¾ÿ ÿþõÿ-ÿýö®ÿ ÿþÃÿ.ÿþäÿ ÿþäÿ.ÿþÌÿ ÿý±üÿ-ÿýü·ÿ ÿþÓÿ.ÿþñÿ ÿþ÷ÿ.ÿþÛÿ ÿþÊÿ/ÿþÃÿ ÿþðÿ.ÿý÷½ÿ ÿþÀÿ/ÿþÜÿ ÿþçÿ.ÿýþ¸ÿ ÿý·þÿ.ÿþëÿ ÿþÞÿ/ÿþÇÿ ÿý°üÿ.ÿþöÿ ÿþÖÿ/ÿþ×ÿ ÿý®ûÿ.ÿýý´ÿ ÿþ×ÿ/ÿþæÿ ÿý¯üÿ/ÿþÂÿ ÿþØÿ/ÿþóÿ ÿý°üÿ/ÿþÑÿ ÿþÙÿ/ÿýü±ÿ ÿý°ýÿ/ÿþáÿ ÿþÚÿ0ÿþ½ÿ ÿý±ýÿ/ÿþïÿ ÿþÝÿ0ÿþÌÿ ÿþ·ÿ0ÿýùÈÿ ÿþéÿ0ÿþÕÿ ÿþÃÿ0ÿýûÞÿ ÿþôÿ0ÿþÑÿ ÿþÏÿ0ÿþ÷ÿ ÿýÓûÿ0ÿþËÿ ÿþÛÿ0ÿþóÿ ÿþµÿ1ÿþÄÿ ÿþèÿ0ÿþíÿ ÿþÇÿ1ÿþ¾ÿ ÿþúÿ0ÿþçÿ ÿþÜÿ1ÿþ¸ÿ ÿþ»ÿ1ÿþáÿ ÿþòÿ0ÿýþ³ÿ ÿþÑÿ1ÿþÛÿ ÿý±þÿ ÿþîÿ!ÿýü¯ÿ ÿþçÿ ÿþ¼ÿ"ÿþÕÿ ÿþÅÿ ÿý§éÿ!ÿþùÿ ÿþúÿ ÿý§Àÿ"ÿþÏÿ ÿþßÿ ÿ§þïÿ!ÿþôÿ ÿþÃÿ ÿ§þÆÿ"ÿþÀÿ ÿþüÿ ÿ§ý¨ôÿ!ÿþàÿ ÿþãÿ ÿ§þÌÿ!ÿþûÿ ÿþÇÿ ÿ§ýªøÿ!ÿþÅÿÿýÓýÿ ÿ§þÒÿ!ÿþäÿ ÿþæÿ ÿ€üþðü=üþƒü=üý8àü<üý2nü<üü23Êü;ü2þ]ü;ü2þÀü:ü2þ]ü:ü2þÃü9ü2þ_ü9ü2þÆü8ü2þaü8ü2ý3Éü7ü2þcü7ü2ý3Ëü6ü2þdü6ü2ý3Ïü5ü2þoü5ü2ý7æü4ü2þˆü4ü2ýA÷ü3ü 2þ£ü3ü 2þRü3ü 2þÁü2ü 2þgü2ü 2ý5Þü1ü 2þü1ü 2ý=ôü0ü 2þ ü0ü 2þYü0ü 2ý3Úü/ü 2þ„ü/ü 2ýDûü.ü2þºü.ü2þkü.ü2ý8îü-ü2þšü-ü2þUü-ü2þÕü,ü2þ‚ü,ü2þIü,ü2þÑü+ü2þˆü+ü2þPü+ü2ý3Ûü*ü2þü*ü2þVü*ü2ý4åü)ü2þ™ü)ü2þ]ü)ü2ý6íü(ü2þ¥ü(ü2þoü(ü2þDü(ü2þÖü'ü2þ•ü'ü2þcü'ü2ý<úü&ü€ÿþôÿ=ÿþ”ÿ=ÿýRæÿ<ÿýLÿ<ÿüLMÓÿ;ÿLþrÿ;ÿLþÊÿ:ÿLþrÿ:ÿLþÍÿ9ÿLþtÿ9ÿLþÏÿ8ÿLþuÿ8ÿLþÒÿ7ÿLþwÿ7ÿLþÔÿ6ÿLþyÿ6ÿLýM×ÿ5ÿLþ‚ÿ5ÿLýPëÿ4ÿLþ˜ÿ4ÿLýYûÿ3ÿ Lþ°ÿ3ÿ Lþhÿ3ÿ LþËÿ2ÿ Lþ{ÿ2ÿ LýNåÿ1ÿ Lþÿ1ÿ LýUøÿ0ÿ Lþ®ÿ0ÿ Lþnÿ0ÿ LýMáÿ/ÿ Lþ•ÿ/ÿ Lý\þÿ.ÿLþÄÿ.ÿLþÿ.ÿLýQòÿ-ÿLþ¨ÿ-ÿLþkÿ-ÿLþÜÿ,ÿLþ“ÿ,ÿLþ`ÿ,ÿLþÙÿ+ÿLþ˜ÿ+ÿLþfÿ+ÿLþâÿ*ÿLþ ÿ*ÿLþlÿ*ÿLýMêÿ)ÿLþ¨ÿ)ÿLþrÿ)ÿLýOñÿ(ÿLþ²ÿ(ÿLþ‚ÿ(ÿLþ\ÿ(ÿLþÝÿ'ÿLþ¤ÿ'ÿLþxÿ'ÿLýTýÿ&ÿ€šþš=šþ¹š=šýË¡š<šý;š<šÍþ§š;šÍþš;šÍþ©š:šÍþš:šÍþ¨š9šÍþš9šÍþ¨š8šÍþÁš8šÍþ§š7šÍþÁš7šÍþ¦š6šÍþÀš6šÍþ¥š5šÍþ¾š5šÍýÌ š4šÍþ·š4šÍýÉ›š3š Íþ±š3š ÍþÅš3š Íþ©š2š ÍþÀš2š ÍýÌ¢š1š Íþºš1š ÍýÊœš0š Íþ±š0š ÍþÚ0š Íþ£š/š Íþ¸š/š ÍþÈš/šÍþ«š.šÍþ¿š.šÍýÌžš-šÍþ³š-šÍþÄš-šÍþ¤š,šÍþ¹š,šÍþÇš,šÍþ¥š+šÍþ·š+šÍþÆš+šÍþ¢š*šÍþµš*šÍþÄš*šÍþ š)šÍþ³š)šÍþš)šÍýÌžš(šÍþ°š(šÍþ¾š(šÍþÈš(šÍþ¤š'šÍþ´š'šÍþÁš'šÍýË›š&š€§þª§=§þÒ§=§ýû¯§<§ýÿܧ<§üÿþ·§;§ÿþå§;§ÿþº§:§ÿþå§:§ÿþ¹§9§ÿþä§9§ÿþ¸§8§ÿþã§8§ÿþ·§7§ÿþâ§7§ÿþ¶§6§ÿþá§6§ÿýþµ§5§ÿþܧ5§ÿýü®§4§ÿþЧ4§ÿýõ¨§3§ ÿþŧ3§ ÿþë§3§ ÿþº§2§ ÿþà§2§ ÿýý°§1§ ÿþÕ§1§ ÿýø©§0§ ÿþƧ0§ ÿþè§0§ ÿýþ±§/§ ÿþÒ§/§ ÿþó§/§ÿþ¼§.§ÿþÞ§.§ÿýû«§-§ÿþȧ-§ÿþê§-§ÿþ³§,§ÿþÓ§,§ÿþñ§,§ÿþ´§+§ÿþЧ+§ÿþí§+§ÿþ±§*§ÿþͧ*§ÿþé§*§ÿýþ®§)§ÿþɧ)§ÿþå§)§ÿýý«§(§ÿþħ(§ÿþܧ(§ÿþô§(§ÿþ³§'§ÿþ˧'§ÿþâ§'§ÿýù¨§&§üþ“2"2þÈÿÿüýò>2!2þoÿÿüþˆ2!2ý7õÿÿüýí:2!2þŽÿÿüþ2!2þFÿÿüýå72!2þ²ÿÿüþv2!2þ_ÿÿüýÜ52 2ý3Ùÿÿüþm2!2þ|ÿÿüýÑ32 2þ=ÿÿüþ[2!2þžÿÿüþ¬2!2þRÿÿüýúC2!2þÒÿÿüþˆ2!2þ‚ÿÿüýå62 2þEÿÿüþj2!2þ¾ÿÿüþÁ2!2þqÿÿ üþO2 2þ<ÿÿ üþ›2!2þªÿÿ üýò<2 2þcÿÿ üþz2 2ý6õÿÿ üýÖ32 2þ˜ÿÿ üþ]2 2þUÿÿ üþ¥2 2ý3Ùÿ ÿ üýò:2 2þ†ÿ ÿ üþm2 2þIÿ ÿ üþ¹2!2þÅÿ ÿ üýûB2 2þ|ÿ ÿ üþ}2 2þHÿ ÿ üþÎ2!2þÑÿ ÿüþN2 2þŠÿ ÿüþ2 2þSÿ ÿüýá422ý3ãÿ ÿüþ\2 2þ™ÿ ÿüþ¡2 2þ_ÿ ÿüýð922þ7ÿ ÿüþk2 2þªÿ ÿüþµ2 2þlÿ ÿüýú=22þ=ÿ ÿüþk2 2þ»ÿÿüþ¨2 2þyÿÿüýï622þFÿÿüþ]2 2þÎÿÿüþ•2 2þŠÿÿüýÞ322þ[ÿÿüþO22þ8ÿÿüþ„2 2þ¾ÿÿüþÈ2 2þ†ÿÿüþC22þYÿÿüþt22þ7ÿÿüþ³2 2þ»ÿÿüýö922þ…ÿÿüþe22þXÿÿüþž22þ7ÿÿüþÛ2 2þºÿÿüþD22þ‚ÿÿüþm22þVÿÿüþž22þ6ÿÿüþÜ2 2þ·ÿÿüþE22þÿÿüþn22þXÿÿüþŸ22þ:ÿÿüþÝ2 2þÕÿÿüþF22þ¤ÿÿÿþ¢L"LþÑÿÿý÷WL!Lþ‚ÿÿþ™L!LýQ÷ÿÿýñTL!LþžÿÿþL!Lþ^ÿÿýêQL!Lþ½ÿÿþ‰L!LþtÿÿýãOL LýMàÿÿþL!LþŽÿÿþÙL!LþVÿÿþpL!Lþ«ÿÿþ¸L!Lþhÿÿýý[L!LþÚÿÿþ™L!Lþ“ÿÿýêOL Lþ]ÿÿþ~L!LþÈÿÿþËL!Lþ„ÿÿþfL LþUÿÿþ©L!Lþ¶ÿÿý÷TL LþxÿÿþŒL LýO÷ÿÿýÝML Lþ¦ÿÿþrL Lþkÿÿþ²L!Lþàÿÿý÷SL Lþ—ÿÿþL Lþ`ÿÿþÃL!LþÎÿÿýþZL LþÿÿþL Lþ_ÿÿþÖL!LþÙÿÿþeL LþšÿÿþžL LþiÿÿýçMLLýMèÿÿþqL Lþ¨ÿÿþ®L LþtÿÿýôRLLþPÿÿþ~L Lþ¶ÿÿþÀL LþÿÿýýVLLþVÿÿþL LþÆÿÿþµL Lþ‹ÿÿýóPLLþ^ÿÿþrL LþÖÿÿþ¤L LþšÿÿþåL LþpÿÿþfLLþQÿÿþ•L LþÈÿÿþÑL Lþ—ÿÿþ[LLþoÿÿþ†LLþQÿÿþ¾L LþÆÿÿýúSLLþ•ÿÿþyLLþmÿÿþ«LLþPÿÿþâL LþÄÿÿþ\LLþ“ÿÿþ€LLþlÿÿþ¬LLþOÿÿþãL LþÂÿÿþ]LLþ’ÿÿþLLþmÿÿþ­LLþSÿÿþäL LþÜÿÿþ]LLþ±ÿÿšþµÍ"Íþ§ÿÿšýœÊÍ!Íþ¾ÿÿšþ·Í!ÍýÌÕÿÿšýžËÍ!Íþ¶ÿÿšþ¹Í!ÍþÈÿÿšý ÌÍ!Íþ­ÿÿšþ¼Í!ÍþÂÿÿšý¢ÌÍ!Íþ£ÿÿšþ¾Í!Íþºÿÿšþ¥Í!ÍþÊÿÿšþÃÍ!Íþ²ÿÿšþ®Í!ÍþÅÿÿšý›ÉÍ!Íþ¤ÿÿšþ·Í!Íþ¹ÿÿšý ÌÍ ÍþÈÿÿšþ¿Í!Íþªÿÿšþ©Í!Íþ½ÿÿ šþÆÍ ÍþÊÿÿ šþ²Í!Íþ¯ÿÿ šýœËÍ ÍþÁÿÿ šþ»Í ÍýÌÕÿÿ šþ¤Í!Íþ³ÿÿ šþÂÍ ÍþÄÿÿ šþ°Í!Íþ£ÿ ÿ šýœËÍ Íþ¸ÿ ÿ šþ¾Í ÍþÇÿ ÿ šþ«Í!Íþ¨ÿ ÿ šþÉÍ Íþºÿ ÿ šþºÍ ÍþÇÿ ÿ šþ¦Í!Íþ¥ÿ ÿšþÆÍ Íþ·ÿ ÿšþ¶Í ÍþÅÿ ÿšþ¡Í!Íþ ÿ ÿšþÂÍ Íþ³ÿ ÿšþ±Í ÍþÂÿ ÿšýËÍÍþÌÿ ÿšþ¿Í Íþ¯ÿ ÿšþ¬Í Íþ¾ÿ ÿšý›ÊÍÍþÊÿ ÿšþ¿Í Íþªÿÿšþ¯Í Íþ»ÿÿšýÌÍÍþÈÿÿšþÂÍ Íþ¦ÿÿšþ´Í Íþ·ÿÿšþ¢Í ÍþÃÿÿšþÆÍÍþÌÿÿšþ¸Í Íþªÿÿšþ§Í Íþ¸ÿÿšþÉÍÍþÃÿÿšþ¼ÍÍþÌÿÿšþ¬Í ÍþªÿÿšýœËÍÍþ¸ÿÿšþÀÍÍþÄÿÿšþ²ÍÍþÌÿÿšþ¢Í Íþ«ÿÿšþÈÍÍþ¹ÿÿšþ¾ÍÍþÄÿÿšþ²ÍÍþÌÿÿšþ¢Í Íþ«ÿÿšþÈÍÍþ¹ÿÿšþ¾ÍÍþÄÿÿšþ±ÍÍþËÿÿšþ¢Í Íþ¤ÿÿšþÈÍÍþ°ÿÿ§þÌÿ"ÿþ·ÿÿ§ýª÷ÿ!ÿþÜÿÿ§þÐÿ!ÿýüÓÿÿ§ý«ùÿ!ÿþÎÿÿ§þÔÿ!ÿþòÿÿ§ý®üÿ!ÿþ¿ÿÿ§þØÿ!ÿþäÿÿ§ý±ýÿ ÿýþ²ÿÿ§þÝÿ!ÿþÖÿÿ§þ´ÿ!ÿþøÿÿ§þæÿ!ÿþÇÿÿ§þÂÿ!ÿþëÿÿ§ý¨ôÿ!ÿþ´ÿÿ§þÐÿ!ÿþÓÿÿ§ý®ýÿ ÿþóÿÿ§þßÿ!ÿþ»ÿÿ§þºÿ!ÿþÛÿÿ §þíÿ ÿþøÿÿ §þÈÿ!ÿþÂÿÿ §ýªùÿ ÿþâÿÿ §þ×ÿ ÿýýÓÿÿ §ý³þÿ ÿþÊÿÿ §þåÿ ÿþêÿÿ §þÄÿ!ÿþ²ÿ ÿ §ýªúÿ ÿþÑÿ ÿ §þÝÿ ÿþñÿ ÿ §þ½ÿ!ÿþ¸ÿ ÿ §þõÿ ÿþÖÿ ÿ §þÕÿ ÿþñÿ ÿ §þµÿ!ÿþ´ÿ ÿ§þíÿ ÿþÏÿ ÿ§þÍÿ ÿþëÿ ÿ§ý¯þÿÿýþ¯ÿ ÿ§þæÿ ÿþÉÿ ÿ§þÆÿ ÿþäÿ ÿ§ýªûÿÿþüÿ ÿ§þÞÿ ÿþÂÿ ÿ§þ¾ÿ ÿþÞÿ ÿ§ý¨øÿÿþøÿ ÿ§þÞÿ ÿþ¼ÿÿ§þÃÿ ÿþ×ÿÿ§ý«üÿÿþòÿÿ§þåÿ ÿþµÿÿ§þËÿ ÿþÏÿÿ§þ°ÿ ÿþæÿÿ§þíÿÿþûÿÿ§þÒÿ ÿþ»ÿÿ§þ·ÿ ÿþÑÿÿ§þôÿÿþçÿÿ§þÚÿÿþüÿÿ§þ¿ÿ ÿþ¼ÿÿ§ý©úÿÿþÒÿÿ§þáÿÿþèÿÿ§þÇÿÿþüÿÿ§þ±ÿ ÿþ¼ÿÿ§þóÿÿþÓÿÿ§þÝÿÿþéÿÿ§þÇÿÿþýÿÿ§þ±ÿ ÿþ½ÿÿ§þóÿÿþÔÿÿ§þÜÿÿþèÿÿ§þÆÿÿþúÿÿ§þ°ÿ ÿþ³ÿÿ§þóÿÿþÅÿÿÿýá422ý4åÿÿþ[2 2þœÿÿþŸ2 2þaÿÿþ822þ8ÿÿþi2 2þ­ÿÿþ²2 2þnÿÿþ=22þ>ÿÿþk2 2þ¾ÿÿþ¨2 2þ|ÿÿþ622þIÿÿþ]2 2þÒÿÿþ–2 2þ‹ÿÿýß322þTÿÿþP22ý3äÿÿþ†2 2þ›ÿÿþË2 2þfÿÿþD22þ>ÿÿþv2 2þÎÿÿþ¸2 2þ“ÿÿþ;22þdÿÿþi22þ=ÿÿþ¥2 2þËÿÿþ522þÿÿþ[22þbÿÿþ22þ<ÿÿþÊ2 2þÈÿÿþ=22þÿÿþc22þ`ÿÿþ“22þ;ÿÿþÍ2 2þÅÿÿþ>22þŒÿÿþe22þ^ÿÿþ•22þ9ÿÿþÑ2 2ÿþ@22ÿþg22ÿþ˜22ÿþÕ22ÿþB22ÿþi22ÿþš22ÿþØ22ÿþ?22ÿþ^22ÿþ‚22ÿþ­22ÿþà22 ÿþ@22 ÿþ_22 ÿþƒ22 ÿþ­22 ÿþà22!ÿþA22!ÿþ_22!ÿþ„22!ÿþ®22!ÿþá22"ÿþA22"ÿþ`22"ÿþ„22"ÿþ¯22"ÿþÙ22#ÿþ622#ÿþJ22ÿýçMLLýMêÿÿþqL Lþªÿÿþ­L LþvÿÿþQLLþQÿÿþ|L Lþ¹ÿÿþ½L LþÿÿþULLþWÿÿþ~L LþÈÿÿþµL LþŽÿÿþPLLþ`ÿÿþrL LþÚÿÿþ¥L Lþ›ÿÿþæL LþjÿÿþgLLýMéÿÿþ—L Lþ©ÿÿþÔL Lþzÿÿþ\LLþWÿÿþ‰L LþÖÿÿþÂL Lþ¢ÿÿþTLLþxÿÿþ|LLþVÿÿþ²L LþÔÿÿþOLLþ ÿÿþpLLþvÿÿþŸLLþUÿÿþÓL LþÑÿÿþULLþžÿÿþxLLþuÿÿþ¢LLþTÿÿþÖL LþÎÿÿþWLLþœÿÿþyLLþsÿÿþ¤LLþSÿÿþÙL LÿþXLLÿþ{LLÿþ¦LLÿþÜLLÿþZLLÿþ}LLÿþ¨LLÿþßLLÿþXLLÿþsLLÿþ“LLÿþ¹LLÿþæLL ÿþXLL ÿþtLL ÿþ”LL ÿþ¹LL ÿþæLL!ÿþYLL!ÿþtLL!ÿþ•LL!ÿþºLL!ÿþçLL"ÿþYLL"ÿþuLL"ÿþ•LL"ÿþ»LL"ÿþàLL#ÿþPLL#ÿþaLLÿþ¡Í!Íþ ÿÿþÃÍ Íþ²ÿÿþ±Í ÍþÁÿÿþÌÍÍþÌÿÿþ¿Í Íþ®ÿÿþ­Í Íþ¾ÿÿþÊÍÍþÊÿÿþ¿Í Íþªÿÿþ¯Í ÍþºÿÿþÌÍÍþÇÿÿþÂÍ Íþ¤ÿÿþ´Í Íþ·ÿÿþ¡Í ÍþÄÿÿþÅÍ Íþ ÿÿþ¸Í Íþ²ÿÿþ¦Í ÍþÀÿÿþÈÍÍþÊÿÿþ¼Í Íþ¦ÿÿþ«Í ÍþµÿÿþËÍÍþÀÿÿþ¿ÍÍþÊÿÿþ°Í Íþ¦ÿÿþÌÍÍþµÿÿþÃÍÍþÁÿÿþµÍÍþÊÿÿþ§Í Íþ§ÿÿþÊÍÍþ¶ÿÿþÁÍÍþÁÿÿþµÍÍþËÿÿþ¦Í Íþ¨ÿÿþÊÍÍþ¶ÿÿþÀÍÍþÂÿÿþ´ÍÍþËÿÿþ¥Í ÍÿþÉÍÍÿþÀÍÍÿþ³ÍÍÿþ¤ÍÍÿþÉÍÍÿþ¿ÍÍÿþ³ÍÍÿþ£ÍÍÿþÊÍÍÿþÂÍÍÿþ¹ÍÍÿþ®ÍÍÿþ¡ÍÍ ÿþÉÍÍ ÿþÂÍÍ ÿþ¹ÍÍ ÿþ®ÍÍ ÿþ¡ÍÍ!ÿþÉÍÍ!ÿþÂÍÍ!ÿþ¸ÍÍ!ÿþ®ÍÍ!ÿþ¡ÍÍ"ÿþÉÍÍ"ÿþÁÍÍ"ÿþ¸ÍÍ"ÿþ­ÍÍ"ÿþ£ÍÍ#ÿþÌÍÍ#ÿþÇÍÍÿý¯þÿÿýþ®ÿÿþæÿ ÿþÈÿÿþÆÿ ÿþãÿÿþûÿÿþûÿÿþßÿ ÿþÁÿÿþ¿ÿ ÿþÜÿÿþøÿÿþ÷ÿÿþÞÿ ÿþ»ÿÿþÃÿ ÿþÖÿÿþüÿÿþñÿÿþåÿ ÿþ´ÿÿþÊÿ ÿþÏÿÿþ°ÿ ÿþêÿÿþìÿÿýþ®ÿÿþÑÿ ÿþÈÿÿþ¶ÿ ÿþáÿÿþóÿÿþ÷ÿÿþØÿ ÿþµÿÿþ½ÿ ÿþÌÿÿþùÿÿþâÿÿþßÿÿþøÿÿþÄÿ ÿþ¶ÿÿþýÿÿþÍÿÿþæÿÿþãÿÿþÍÿÿþøÿÿþ·ÿ ÿþ·ÿÿþøÿÿþÍÿÿþâÿÿþäÿÿþÌÿÿþùÿÿþµÿ ÿþ¸ÿÿþ÷ÿÿþÎÿÿþáÿÿþåÿÿþËÿÿþúÿÿþ´ÿ>ÿþöÿ=ÿþàÿ=ÿþÊÿ=ÿþ³ÿ>ÿþõÿ=ÿþßÿ=ÿþÈÿ=ÿþ²ÿ>ÿþöÿ=ÿþåÿ=ÿþÓÿ=ÿþÁÿ=ÿþ¯ÿ>ÿþöÿ=ÿþäÿ=ÿþÒÿ=ÿþÁÿ=ÿþ¯ÿ>ÿþöÿ=ÿþäÿ=ÿþÒÿ=ÿþÁÿ=ÿþ¯ÿ>ÿþõÿ=ÿþäÿ=ÿþÒÿ=ÿþÀÿ=ÿþ²ÿ>ÿþüÿ=ÿþðÿÿjÿþÂÿ'ÿþŠÿ'ÿþ`ÿ'ÿþAÿ'ÿý2áÿ&ÿý2¯ÿ&ÿý2…ÿ&ÿý2aÿ&ÿý2Bÿ&ÿ2þåÿ%ÿ2þ±ÿ%ÿ2þ†ÿ%ÿ2þcÿ%ÿ2þCÿ%ÿ2þíÿ$ÿ2þ´ÿ$ÿ2þˆÿ$ÿ2þdÿ$ÿ2þEÿ$ÿ2þõÿ#ÿ2þ¶ÿ#ÿ2þŠÿ#ÿ2þfÿ#ÿ2þKÿ#ÿ2þ7ÿ#ÿ2þÜÿ"ÿ2þ¶ÿ"ÿ2þ•ÿ"ÿ2þxÿ"ÿ2þ_ÿ"ÿ2þGÿ"ÿjÿþÌÿ'ÿþšÿ'ÿþuÿ'ÿþYÿ'ÿýLçÿ&ÿýL»ÿ&ÿýL•ÿ&ÿýLuÿ&ÿýLZÿ&ÿLþêÿ%ÿLþ½ÿ%ÿLþ—ÿ%ÿLþwÿ%ÿLþ[ÿ%ÿLþñÿ$ÿLþ¿ÿ$ÿLþ™ÿ$ÿLþxÿ$ÿLþ]ÿ$ÿLþ÷ÿ#ÿLþÁÿ#ÿLþšÿ#ÿLþ{ÿ#ÿLþcÿ#ÿLþQÿ#ÿLþãÿ"ÿLþÁÿ"ÿLþ¤ÿ"ÿLþŠÿ"ÿLþtÿ"ÿLþ_ÿ"ÿjÿþ©ÿ'ÿþ·ÿ'ÿþÁÿ'ÿþÉÿ'ÿýÍ¡ÿ&ÿýÍ­ÿ&ÿý͸ÿ&ÿýÍÁÿ&ÿýÍÉÿ&ÿÍþ ÿ%ÿÍþ­ÿ%ÿÍþ¸ÿ%ÿÍþÁÿ%ÿÍþÉÿ%ÿÍþ¸ÿ$ÿÍþ¬ÿ$ÿÍþ·ÿ$ÿÍþÀÿ$ÿÍþÈÿ$ÿÍþÕÿ#ÿÍþ¬ÿ#ÿÍþ·ÿ#ÿÍþÀÿ#ÿÍþÇÿ#ÿÍþÌÿ#ÿÍþ¢ÿ"ÿÍþ¬ÿ"ÿÍþ´ÿ"ÿÍþ»ÿ"ÿÍþÂÿ"ÿÍþÈÿ"ÿjÿþ¹ÿ'ÿþÏÿ'ÿþäÿ'ÿþöÿ(ÿþ¯ÿ'ÿþÀÿ'ÿþÒÿ'ÿþãÿ'ÿþõÿ(ÿþ®ÿ'ÿþÀÿ'ÿþÑÿ'ÿþâÿ'ÿþôÿ(ÿþ½ÿ'ÿþ¾ÿ'ÿþÐÿ'ÿþâÿ'ÿþóÿ(ÿþÓÿ'ÿþ¾ÿ'ÿþÏÿ'ÿþàÿ'ÿþïÿ'ÿþüÿ(ÿþ±ÿ'ÿþ¾ÿ'ÿþËÿ'ÿþØÿ'ÿþäÿ'ÿþòÿ"ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þžÿÿþµ‡ ‡þ Ã Ãþž‡ ‡þžÿÿþ‡ ‡ýˆ»Ã Ãþž‡ ‡þžÿÿþ¼‡ ‡þœÃ Ãþž‡ ‡þžÿÿþ‡ ‡þ¸Ã Ãþž‡ ‡þžÿÿþÇ ‡þ™Ã Ãþž‡ ‡þžÿÿþ”‡ ‡þµÃ Ãþž‡ ‡þžÿÿþˇ ‡þ•à Ãþž‡ ‡þžÿÿþ˜‡ ‡þ±ÃÃþž‡ ‡þžÿÿþÓ‡ ‡þ’ÃÃþž‡ ‡þžÿÿþž‡ ‡ Ãþž‡ ‡þžÿÿþÛ‡ ‡ Ãþž‡ ‡þžÿÿþ£‡ ‡ Ãþž‡ ‡þžÿÿý∇ ‡ Ãþž‡ ‡þžÿÿþ©‡ ‡ Ãþž‡ ‡þžÿÿýõ‰‡ ‡ Ãþž‡ ‡þžÿÿþ°‡ ‡ Ãþž‡ ‡þžÿÿþ‹‡‡ Ãþž‡ ‡þžÿÿþ¶‡‡ Ãþž‡ ‡þžÿÿþއ‡ Ãþž‡ ‡þžÿÿþ½‡‡ Ãþž‡ ‡þžÿÿþ‘‡‡ Ãþž‡ ‡þžÿÿþ҇ Ãþž‡ ‡þžÿÿþ•‡‡ Ãþž‡ ‡þžÿÿþ̇‡ Ãþž‡ ‡þžÿÿþš‡‡ Ãþž‡ ‡þžÿÿþÕ‡‡ Ãþž‡ ‡þžÿ ÿþŸ‡‡ Ãþž‡ ‡þžÿ ÿþ݇‡ Ãþž‡ ‡þžÿ!ÿþ¥‡‡ Ãþž‡ ‡þžÿ!ÿý䈇‡ Ãþž‡ ‡þžÿ"ÿþ«‡‡ Ãþž‡ ‡þžÿ"ÿûúЇ‡ÃÃþž‡ ‡þžÿ#ÿü±‡‡ÃÃþž‡ ‡þžÿ$ÿýŒ‡ÃÃþž‡ ‡þžÿ$ÿý¸‡ÃÃþž‡ ‡þžÿ%ÿþŽÃÃþž‡ ‡þžÿ%ÿþ¿ÃÃþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ ØþÕÓ ÓþÛÿÿþäÓ ÓþÕØ ØþÕÓ ÓþÛÿÿþÕÓ Óþר ØþÕÓ ÓþÛÿÿþçÓ ÓþÕØ ØþÕÓ ÓþÛÿÿþÖÓ Óþר ØþÕÓ ÓþÛÿÿþêÓ ÓþÔØ ØþÕÓ ÓþÛÿÿþØÓ Óþר ØþÕÓ ÓþÛÿÿþíÓ ÓþÔØ ØþÕÓ ÓþÛÿÿþÙÓ ÓþÖØØþÕÓ ÓþÛÿÿþïÓ ÓþÔØØþÕÓ ÓþÛÿÿþÛÓ Ó ØþÕÓ ÓþÛÿÿþóÓ Ó ØþÕÓ ÓþÛÿÿþÞÓ Ó ØþÕÓ ÓþÛÿÿþõÓ Ó ØþÕÓ ÓþÛÿÿþàÓ Ó ØþÕÓ ÓþÛÿÿýûÔÓ Ó ØþÕÓ ÓþÛÿÿþâÓ Ó ØþÕÓ ÓþÛÿÿþÕÓÓ ØþÕÓ ÓþÛÿÿþåÓÓ ØþÕÓ ÓþÛÿÿþÖÓÓ ØþÕÓ ÓþÛÿÿþçÓÓ ØþÕÓ ÓþÛÿÿþ×ÓÓ ØþÕÓ ÓþÛÿÿþêÓÓ ØþÕÓ ÓþÛÿÿþØÓÓ ØþÕÓ ÓþÛÿÿþíÓÓ ØþÕÓ ÓþÛÿÿþÚÓÓ ØþÕÓ ÓþÛÿÿþðÓÓ ØþÕÓ ÓþÛÿ ÿþÜÓÓ ØþÕÓ ÓþÛÿ ÿþóÓÓ ØþÕÓ ÓþÛÿ!ÿþÞÓÓ ØþÕÓ ÓþÛÿ!ÿþöÓÓ ØþÕÓ ÓþÛÿ"ÿþáÓÓ ØþÕÓ ÓþÛÿ"ÿûýÔÓÓØØþÕÓ ÓþÛÿ#ÿüãÓÓØØþÕÓ ÓþÛÿ$ÿýÕÓØØþÕÓ ÓþÛÿ$ÿýåÓØØþÕÓ ÓþÛÿ%ÿþÖØØþÕÓ ÓþÛÿ%ÿþèØØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ þ/D DþUÿÿþfD Dþ. þ/D DþUÿÿþID DýC þ/D DþUÿÿþkD Dþ1 þ/D DþUÿÿþKD Dþ þ/D DþUÿÿþpD Dþ5 þ/D DþUÿÿþMD Dþ þ/D DþUÿÿþvD Dþ8 þ/D DþUÿÿþQD Dþþ/D DþUÿÿþ|D Dþ;þ/D DþUÿÿþUD D þ/D DþUÿÿþ‚D D þ/D DþUÿÿþYD D þ/D DþUÿÿý‡ED D þ/D DþUÿÿþ]D D þ/D DþUÿÿýÌFD D þ/D DþUÿÿþbD D þ/D DþUÿÿþGDD þ/D DþUÿÿþgDD þ/D DþUÿÿþIDD þ/D DþUÿÿþlDD þ/D DþUÿÿþKDD þ/D DþUÿÿþqDD þ/D DþUÿÿþNDD þ/D DþUÿÿþwDD þ/D DþUÿÿþRDD þ/D DþUÿÿþ}DD þ/D DþUÿ ÿþVDD þ/D DþUÿ ÿþƒDD þ/D DþUÿ!ÿþZDD þ/D DþUÿ!ÿýˆEDD þ/D DþUÿ"ÿþ^DD þ/D DþUÿ"ÿûèFDDþ/D DþUÿ#ÿücDDþ/D DþUÿ$ÿýHDþ/D DþUÿ$ÿýhDþ/D DþUÿ%ÿþIþ/D DþUÿ%ÿþmþ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿÿþèÿÿþÔÿ(ÿþèÿÿþøÿ'ÿþèÿÿþÎÿ'ÿþèÿÿþõÿ&ÿþèÿÿþÉÿ&ÿþèÿÿþñÿ%ÿþèÿÿþÃÿ%ÿþèÿÿþíÿ$ÿþèÿÿþ¾ÿ$ÿþèÿÿþèÿ#ÿþèÿÿþ¹ÿ#ÿþèÿÿþâÿ"ÿþèÿÿýµþÿ!ÿþèÿÿþÝÿ!ÿþèÿÿýÕüÿ ÿþèÿÿþØÿ ÿþèÿÿþúÿÿþèÿÿþÒÿÿþèÿÿþ÷ÿÿþèÿÿþÍÿÿþèÿÿþôÿÿþèÿÿþÇÿÿþèÿÿþðÿÿþèÿÿþÂÿÿþèÿÿþëÿÿþèÿÿþ½ÿÿþèÿ ÿþæÿÿþèÿ ÿþ¸ÿÿþèÿ!ÿþáÿÿþèÿ!ÿý´þÿÿþèÿ"ÿþÛÿÿþèÿ"ÿýêüÿÿþèÿ#ÿþÖÿÿþèÿ$ÿþùÿÿþèÿ$ÿþÑÿÿþèÿ%ÿþ÷ÿÿþèÿ%ÿþÌÿÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ&ÿ Ãþ™‡‡ Ãþ¹‡‡!Ãþ‡‡!Ãý¼ˆ‡‡"Ãþ¡‡‡"Ãý¾Š‡‡#Ãþ¤‡‡#ÃýÀ‹‡‡$Ãþ¨‡‡þ®Ã"ÃýÁއ‡ýÂÃ"Ãþ¬‡‡þªÃ#Ãþ‡‡ýŒÁÃ"Ãþ¯‡‡þ¦Ã#Ãþ“‡‡ý‹¿Ã"Ãþ³‡‡þ£Ã#Ãþ—‡‡ý‰½Ã"Ãþ·‡‡þŸÃ#Ãþš‡‡ýˆºÃ"Ãýºˆ‡‡þ›Ã#Ãþž‡‡þ¸Ã"Ãý¼‰‡‡þ˜Ã#Ãþ¢‡‡þ´Ã"Ãý¿Š‡‡þ”Ã#Ãþ¥‡‡þ°Ã"ÃýÀŒ‡‡þ‘Ã#Ãþ©‡‡þ­Ã"ÃýÂŽ‡‡ýŽÂÃ"Ãþ­‡‡þ©Ã#Ãþ‘‡‡ýŒÁÃ"Ãþ°‡‡þ¦Ã#Ãþ”‡‡ýŠ¿Ã"Ãþ´‡‡þ¢Ã#Ãþ˜‡‡ý‰½Ã"Ãþ¸‡‡þžÃ#Ãþ›‡‡ýˆºÃ"Ãýºˆ‡‡þšÃ#ÃþŸ‡ ‡þ’‡ ‡þ·Ã"Ãý½‰‡‡þLJ ‡þ—Ã#Ãþ£‡‡ýÿ–‡ ‡þ³Ã"Ãý¿‹‡‡ýÿχ ‡þ“Ã#Ãþ¦‡‡ÿþ›‡ ‡þ°Ã"ÃýÁŒ‡‡ÿþׇ ‡þÃ#Ãþª‡‡ÿþ ‡ ‡þ¬Ã"Ãý‡‡ÿý߈‡ ‡ýŽÁÃ"Ãþ®‡‡ÿþ¦‡ ‡þ¨Ã#Ãþ’‡‡ÿý艇 ‡ý‹ÀÃ"Ãþ±‡‡ÿþ¬‡ ‡þ¥Ã#Ãþ•‡‡ÿýýЇ ‡ýоÃ"Ãþµ‡‡ÿþ³‡ ‡þ¡Ã#Ãþ™‡‡ÿþŒ‡ ‡ýˆ¼Ã"Ãþ¸‡‡ÿþº‡ ‡þÃ#Ãþœ‡‡ÿþ‡ ‡þ¹Ã"Ãû»ˆ‡‡ÿÿþÁ‡ ‡þšÃ#Ãü ‡‡ÿÿþ“‡ ‡þ¶Ã"Ãü½‰‡ÿÿþȇ ‡þ–Ã#Ãý£‡ÿÿþ—‡ ‡þ²Ã"ÃýÀ‹ÿÿþч ‡þ“Ã#Ãþ§ÿ ÿþœ‡ ‡þ¯Ã"ÃþÁÿ ÿþÙ‡ ‡ýÂÃ"à ÿþ¢‡ ‡þ«Ã"à ÿýàˆ‡ ‡ýÁÃ!à ÿþ§‡ ‡þ§Ã!à ÿýñ‰‡ ‡ý‹Àà à ØþÔÓÓ Øþ×ÓÓ!ØþÕÓÓ!Øþ×ÓÓ"ØþÕÓÓ"Øþ×ÓÓ#ØþÕÓÓ#Øþ×ÓÓ$ØþÖÓÓþÖØ#ØþÔÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÕØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓ Óþ×Ó Óþר"Øþ×Ó ÓþëÓ ÓþÔØ#ØþÕÓÓýÿÙÓ ÓþÖØ"Øþ×ÓÓýÿîÓ ÓþÔØ#ØþÕÓÓÿþÚÓ ÓþÖØ#ØÓÿþñÓ ÓþÔØ#ØþÖÓÓÿþÜÓ ÓþÖØ#ØþÔÓÓÿþôÓ ÓþÔØ#ØþÖÓÓÿþßÓ ÓþÖØ#ØþÔÓÓÿý÷ÔÓ Óþר"ØþÖÓÓÿþáÓ ÓþÕØ#ØþÔÓÓÿýþÔÓ Óþר"Øþ×ÓÓÿþäÓ ÓþÕØ#ØþÔÓÓÿþÕÓ Óþר"Øþ×ÓÓÿþæÓ ÓþÕØ#ØþÕÓÓÿþÖÓ Óþר"Øþ×ÓÓÿþéÓ ÓþÔØ#ØüÕÓÓÿÿþ×Ó Óþר"Øü×ÓÓÿÿþìÓ ÓþÔØ#ØýÕÓÿÿþÙÓ ÓþÖØ"Øý×ÓÿÿþïÓ ÓþÔØ#ØþÖÿ ÿþÛÓ ÓþÖØ#Ø ÿþòÓ ÓþÔØ#Ø ÿþÝÓ ÓþÖØ"Ø ÿþõÓ Ó#Ø ÿþßÓ ÓþÖØ!Ø ÿýúÔÓ Óþר Ø þ4DD þDD!þ1DD!ýCDD"þ-DD"ýBDD#þ*DD#ý@DD$þ'DDþ""ý>DDý="þ$DDþ%#þDDý>"þ#DDþ&#þ;DDý@"þDDþ)#þ8DDýA"þDDþ,#þ5DDýC"þDDþ0#þ2DDýC"ýCDDþ3#þ/D DþLD Dþ"ýBDDþsD Dþ6#þ,DDýÿOD Dþ"ýADDýÿyD Dþ9#þ(DDÿþRD Dþ "ý?DDÿþD Dþ<#þ%DDÿþVD Dþ#"ý=DDÿþ„D Dý>"þ"DDÿþ[D Dþ'#þ;DDÿý”ED Dý@"þDDÿþ_D Dþ*#þ8DDÿýôFD DýA"þDDÿþdD Dþ-#þ5DDÿþHD DýC"þDDÿþiD Dþ0#þ1DDÿþJD Dþ"ûCDDÿÿþoD Dþ3#ü.DDÿÿþMD Dþ"üBDÿÿþtD Dþ7#ý+DÿÿþPD Dþ"ý@ÿÿþzD Dþ:#þ(ÿ ÿþSD Dþ!"þÿ ÿþ€D Dý<" ÿþXD Dþ$" ÿþ†D Dý?! ÿþ\D Dþ'! ÿý»ED Dý@  @ÿþóÿ=ÿþÆÿ>ÿþïÿ=ÿþÁÿ>ÿþêÿ=ÿþ¼ÿ>ÿþåÿ=ÿý·þÿ=ÿþàÿ=ÿý¸ýÿ=ÿþÚÿ=ÿýôüÿ=ÿþÕÿ>ÿþùÿ=ÿþÐÿ>ÿþöÿ=ÿþÊÿ>ÿþòÿ=ÿþÅÿ>ÿþîÿ=ÿþÀÿ>ÿþéÿ=ÿþºÿ>ÿþäÿ=ÿý¶þÿ=ÿþßÿ=ÿýÌýÿ/ÿ‡þªÃ#Ãþ‘‡‡ýŒÁÃ"Ãþ°‡‡þ¦Ã#Ãþ”‡‡ý‹¿Ã"Ãþ´‡‡þ¢Ã#Çý‰½Ã"ÇþŸÃ"ÇýˆºÃ!Çþ›Ã!Çþ¸Ã Çþ˜Ã Çþ´ÃÇþ”ÃÇþ°ÃÇþ‘ÃÇþ­ÃÇýŽÂÃà ‡þ©Ãà ‡ýŒÁÃÃ!‡þ¥ÃÃ!‡ýŠ¿ÃÃ"‡þ¢ÃÃ"‡ý‰½ÃÃ#‡þžÃÃ#‡ýˆºÃÃ$‡þšÃÃ%‡þ·ÃÃ%‡þ—ÃÃ&‡þ³ÃÃ&‡þ“ÃÃ'‡þ¯ÃÃ'‡þÃÃ(‡þ¬ÃÃ(‡ýŽÁÃÃ)‡þ¨ÃÃ)‡ý‹ÀÃÃ*‡þ¥ÃÃ*‡ýоÃÃ+‡þ¡ÃÃ+‡ýˆ¼ÃÃ,‡þÃÃ-‡þ¹ÃÃ-‡þ™ÃÃ.‡þ¶ÃÃ.‡þ–ÃÃ/‡þ²Ã Ã/‡þ“à Ã0‡þ¯Ã Ã0‡ýÂà Ã1‡þ«Ã Ã1‡ýÁà Ã2‡þ§Ã Ã2‡ý‹Àà Ã3‡þ¤Ã Ã3‡ý‰¾ÃÃ4‡þ ÃÃ4‡ýˆ»ÃÃ5‡þœÃÃþ‡4‡þ¸ÃÃþ«‡4‡þ™ÃÃý‡4‡þµÃÃþ¯‡4‡þ•ÃÃþ’‡4‡þ²ÃÃþ²‡4‡þ’ÃÃÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÕØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØÓþר"ØÓþÕØ"ØÓþר!ØÓþÕØ!ØÓþר ØÓþÔØ ØÓþרØÓþÔØØÓþÖØØÓþÔØØÓþÖØØÓþÔØØ ÓþÖØØ!ÓþרØ!ÓþÕØØ"ÓþרØ"ÓþÕØØ#ÓþרØ#ÓþÕØØ$ÓþרØ$ÓþÕØØ%ÓþרØ%ÓþÔØØ&ÓþÖØØ&ÓþÔØØ'ÓþÖØØ'ÓþÔØØ(ÓþÖØØ(ÓþÔØØ)ÓþÖØØ*ÓþרØ*ÓþÕØØ+ÓþרØ+ÓþÕØØ,ÓþרØ,ÓþÕØØ-ÓþרØ-ÓþÔØØ.ÓþרØ.ÓþÔØØ/ÓþÖØ Ø/ÓþÔØ Ø0ÓþÖØ Ø0ÓþÔØ Ø1ÓþÖØ Ø2Ó Ø2ÓþÖØ Ø3Óþר Ø3ÓþÕØ Ø4ÓþרØ4ÓþÕØØ5ÓþרØ5ÓþÕØØ6ÓþרØþÖÓ4ÓþÔØØþÔÓ4ÓþרØþÖÓ4ÓþÔØØþÔÓ4ÓþÖØØþÖÓ4ÓþÔØØDþ%#þ;DDý?"þ DDþ(#þ9DDýA"þDDþ,#DýB"Dþ/"DýC!Dþ2!Dþ Dþ5 DþDþ8DþDþ;Dþ#Dý> Dþ& Dý@!Dþ)!DýA"Dþ,"DýC#Dþ0#DýC$Dþ3%Dþ%Dþ6&Dþ&Dþ9'Dþ 'Dþ<(Dþ#(Dý>)Dþ')Dý@*Dþ**DýA+Dþ-+DýC,Dþ0-Dþ-Dþ4.Dþ.Dþ7/Dþ /Dþ: 0Dþ! 0Dý< 1Dþ$ 1Dý? 2Dþ' 2Dý@ 3Dþ+ 3DýB4Dþ.4DýC5Dþ1þ?D4Dþþ$D4Dþ4ýD DýE‡ÿÿþ$D DþXÿÿýÿþÁÿ=ÿþïÿ>ÿþÆÿ=ÿþóÿ>ÿþËÿ=ÿþöÿ>ÿþÐÿ=ÿþùÿ>ÿþÖÿ=ÿýüêÿ=ÿþÛÿ=ÿýþ³ÿ=ÿþáÿ>ÿþ¸ÿ=ÿþæÿ>ÿþ¼ÿ=ÿþëÿ>ÿþÂÿ=ÿþðÿ>ÿþÇÿ=ÿþôÿ>ÿþÌÿ=ÿþ÷ÿ>ÿþÒÿ=ÿþúÿ>ÿþ×ÿ=ÿýüÕÿ=ÿþÜÿ=ÿýþ´ÿ=ÿþâÿ>ÿþ¹ÿ=ÿþçÿ>ÿþ½ÿ=ÿþìÿ>ÿþÃÿ=ÿþñÿ>ÿþÈÿ=ÿþõÿ>ÿþÎÿ=ÿþøÿ>ÿþÓÿ=ÿþûÿ>ÿþØÿ=ÿýýËÿ=ÿþÞÿ=ÿýþµÿ=ÿþãÿ>ÿþºÿ=ÿþèÿ>ÿþ¿ÿ=ÿþíÿ>ÿþÄÿ=ÿþòÿ>ÿþÊÿ=ÿþõÿ>ÿþÏÿ=ÿþøÿ>ÿþÔÿ=ÿþûÿ>ÿþÙÿ=ÿýýÁÿ=ÿþßÿÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿÿ ‡þ«ÃÃÿþ⇠‡þ³ÃÃÿþЇ ‡þºÃÃÿþÁ‡ ‡þÁÃÃÿþ²‡ ‡þŒÃÃÿþ¦‡ ‡þ“ÃÃÿþ›‡ ‡þšÃÃÿþ’‡ ‡þ¢ÃÃÿþ‰‡ ‡þ©ÃÃÿ ‡þ¯ÃÃÿþᇠ‡þµÃÃÿþÓ‡ ‡þ»ÃÃÿþŇ ‡þÁÃÃÿþ¹‡ ‡þ‹ÃÃÿþ®‡ ‡þ‘ÃÃÿþ¤‡ ‡þ˜ÃÃÿþ›‡ ‡þžÃÃÿþ’‡ ‡þ¤ÃÃÿþŒ‡ ‡þ©ÃÃÿ ‡þ®ÃÃÿ ‡þ³ÃÃÿþà‡ ‡þ¸ÃÃÿþÕ‡ ‡þ½ÃÃÿþʇ ‡þÁÃÃÿþÁ‡ ‡þ‰ÃÃÿþ·‡ ‡þŽÃÃÿþ®‡ ‡þ“ÃÃÿþ¥‡ ‡þ˜ÃÃÿþŸ‡ ‡þœÃÃÿþš‡ ‡þ ÃÃÿþ”‡ ‡þ¤ÃÃÿþ‡ ‡þ§ÃÃÿþЇ ‡þ«ÃÃÿ ‡þ¯ÃÃÿ ‡þ²ÃÃÿþå‡ ‡þ¶ÃÃÿþ܇ ‡þºÃÃÿþÓ‡ ‡þ¾ÃÃÿþ͇ ‡þÁÃÃÿþLJ ‡ Ãÿþ‡ ‡þŠÃÃÿþ¼‡ ‡þÃÃÿþ·‡ ‡þÃÃÿþ²‡ ‡þ’ÃÃÿþ­‡ ‡þ•ÃÃÿþ©‡ ‡þ˜ÃÃÿþ¥‡ ‡þšÃÃÿþ¢‡ ‡þÃÃÿþŸ‡ ‡þžÃÃþÁÿÿþ‡ ‡þ ÃÃþ¿ÿÿþš‡ ‡þ¢ÃÃþ½ÿÿþ˜‡ ‡þ£ÃÃþ¼ÿÿþ•‡ ‡þ¥ÃÃþºÿÿþ“‡ ‡þ¦ÃÃþ¹ÿÿþ‡ ‡þ§ÃÃþ·ÿÿþއ ‡þ©ÃÃþµÿÿþŒ‡ ‡þ«ÃÃþ´ÿÿþЇ ‡þ¬ÃÃþ²ÿÿþ‰‡ ‡þ­ÃÃþ±ÿÿþˆ‡ ‡þ®ÃÃþ°ÿÿþˆ‡ ‡þ®ÃÃþ¯ÿÿ ‡þ¯ÃÃþ¯ÿÿ ‡þ¯ÃÃþ®ÿÿ ‡þ°Ãîÿ ÓþÖØØÿþõÓ ÓþÖØØÿþîÓ ÓþרØÿþéÓ ÓØÿþãÓ ÓØÿþßÓ ÓþÔØØÿþÚÓ ÓþÕØØÿþ×Ó ÓþÕØØÿþÔÓ ÓþÖØØÿ ÓþÖØØÿþõÓ ÓþרØÿþïÓ ÓþרØÿþêÓ ÓØÿþæÓ ÓØÿþâÓ ÓþÔØØÿþÞÓ ÓþÔØØÿþÚÓ ÓþÕØØÿþ×Ó ÓþÕØØÿþÕÓ ÓþÖØØÿ ÓþÖØØÿ ÓþÖØØÿþõÓ ÓþרØÿþðÓ ÓþרØÿþìÓ ÓØÿþéÓ ÓØÿþåÓ ÓþÔØØÿþâÓ ÓþÔØØÿþÞÓ ÓþÔØØÿþÜÓ ÓþÕØØÿþÚÓ ÓþÕØØÿþØÓ ÓþÕØØÿþÖÓ ÓþÖØØÿþÔÓ ÓþÖØØÿ ÓþÖØØÿ ÓþÖØØÿþöÓ ÓþרØÿþóÓ ÓþרØÿþðÓ ÓþרØÿþíÓ Ó ØÿþëÓ Ó ØÿþéÓ Ó ØÿþçÓ Ó ØÿþåÓ ÓþÔØØÿþãÓ ÓþÔØØÿþáÓ ÓþÔØØÿþàÓ ÓþÔØØÿþÞÓ ÓþÕØØÿþÝÓ ÓþÕØØÿþÜÓ ÓþÕØØÿþÛÓ ÓþÕØØþ×ÿÿþÚÓ ÓþÕØØþ×ÿÿþÙÓ ÓþÕØØþ×ÿÿþØÓ ÓþÕØØþ×ÿÿþ×Ó ÓþÕØØþ×ÿÿþ×Ó ÓþÖØØþ×ÿÿþÖÓ ÓþÖØØþ×ÿÿþÕÓ ÓþÖØØþÖÿÿþÔÓ ÓþÖØØþÖÿÿþÔÓ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØÖÿ Dþ$ÿþ‡D DþÿþzD DþÿþnD DþÿþdD Dþ@ÿþ[D Dþ9ÿþRD Dþ3ÿþLD Dþ,ÿþFD Dþ&ÿ Dþ!ÿþ†D Dþÿþ|D DþÿþrD DþÿþiD Dþ@ÿþaD Dþ;ÿþYD Dþ5ÿþRD Dþ0ÿþLD Dþ*ÿþHD Dþ&ÿ Dþ!ÿ Dþÿþ†D Dþÿþ}D DþÿþvD DþÿþnD DþBÿþgD Dþ>ÿþaD Dþ:ÿþZD Dþ5ÿþVD Dþ1ÿþRD Dþ.ÿþND Dþ+ÿþJD Dþ(ÿþFD Dþ$ÿ Dþ!ÿ Dþÿþ‰D Dþÿþ‚D Dþÿþ|D DþÿþxD DþÿþsD D ÿþoD DþAÿþkD Dþ?ÿþgD Dþ<ÿþdD Dþ:ÿþ`D Dþ8ÿþ]D Dþ5ÿþZD Dþ3ÿþXD Dþ1ÿþVD Dþ/þÿÿþTD Dþ.þÿÿþRD Dþ-þÿÿþPD Dþ+þÿÿþND Dþ*þÿÿþMD Dþ)þÿÿþKD Dþ'þÿÿþID Dþ&þÿÿþGD Dþ%þÿÿþFD Dþ#þÿÿþED Dþ#þÿÿþED Dþ"þ ÿÿ Dþ!þ ÿÿ Dþ!þ!ÿÿ Dþ þ!ÿÿ Dþ "Sÿþµÿ=ÿþÀÿ=ÿþËÿ=ÿþÕÿ=ÿþàÿ=ÿþêÿ=ÿþóÿ=ÿþüÿ|ÿþµÿ=ÿþ¾ÿ=ÿþÇÿ=ÿþÐÿ=ÿþÙÿ=ÿþâÿ=ÿþêÿ=ÿþóÿ=ÿþùÿ½ÿþ¶ÿ=ÿþ½ÿ=ÿþÄÿ=ÿþËÿ=ÿþÑÿ=ÿþÙÿ=ÿþàÿ=ÿþæÿ=ÿþëÿ=ÿþñÿ=ÿþöÿ=ÿþüÿ½ÿþ³ÿ=ÿþ¹ÿ=ÿþ¾ÿ=ÿþÂÿ=ÿþÆÿ=ÿþÊÿ=ÿþÎÿ=ÿþÑÿ=ÿþÕÿ=ÿþÙÿ=ÿþÝÿ=ÿþáÿ=ÿþäÿ=ÿþæÿ=ÿþèÿ=ÿþëÿ=ÿþíÿ=ÿþðÿ=ÿþòÿ=ÿþõÿ=ÿþ÷ÿ=ÿþúÿ=ÿþüÿ=ÿþýÿ=ÿþþÿ=ÿþþÿíÿÃýˆ‡9‡Ãþº‡:‡Ãþ²‡:‡Ãþ«‡:‡Ãþ£‡:‡Ãþœ‡:‡Ãþ”‡:‡Ãþ‡:‡Ãþ‡;‡Ãþ»‡;‡Ãþ³‡;‡Ãþ¬‡;‡Ãþ§‡;‡Ãþ¡‡;‡Ãþ›‡;‡Ãþ”‡;‡Ãþއ;‡Ãþˆ‡;‡ýþ‡<‡ýø‡<‡ýò‡<‡ýì‡<‡ýç‡<‡ýâ‡<‡ýÞ‡<‡ýÙ‡<‡ýÔ‡<‡ýÇ<‡ýʇ<‡þ‡<‡ý‰½‡<‡ý¹‡<‡ý‘¶‡<‡ý•²‡<‡ýš®‡<‡ýž«‡<‡ý¢§‡<‡ý¦£‡<‡ý© ‡<‡ý¬œ‡<‡ý¯™‡<‡ý²—‡<‡ýµ”‡<‡ý¸‘‡<‡ý¼‡<‡ý¾Œ‡<‡ýÁ‰‡<‡þÇ<‡ýˆÃ‡<‡ýŠÃ‡<‡ýŒÃ‡<‡ýŽÃ‡<‡ýÇ<‡ý’Ç<‡ý“Ç<‡ý”Ç<‡ý–Ç<‡ý—Ç<‡ý™Ã‡<‡ýšÃ‡<‡ý›Ã‡<‡ýœÃ‡<‡ýÇ<‡ýÇ<‡þÃØ;ÓØþ×Ó:ÓØþÖÓ:ÓØþÖÓ:ÓØþÕÓ:ÓØþÕÓ:ÓØþÔÓ:ÓØ<ÓØ<ÓØþ×Ó;ÓØþÖÓ;ÓØþÖÓ;ÓØþÖÓ;ÓØþÕÓ;ÓØþÕÓ;ÓØþÔÓ;ÓØþÔÓ;ÓØ=ÓýØ×Ó<ÓýØ×Ó<ÓýØÖÓ<ÓýØÖÓ<ÓýØÖÓ<ÓýØÕÓ<ÓýØÕÓ<ÓýØÔÓ<ÓýØÔÓ<ÓýØÔÓ<ÓþØÓ=ÓþØÓ=Óþ×Ó=Óþ×Ó<ÓýÔ×Ó<ÓýÔÖÓ<ÓýÔÖÓ<ÓýÕÖÓ<ÓýÕÖÓ<ÓÕ=ÓýÖÕÓ<ÓýÖÕÓ<ÓýÖÔÓ<ÓýÖÔÓ<Óý×ÔÓ<Óý×ÔÓ<Óý×ÔÓ<Óþ×Ó=Óþ×Ó=ÓþØÓ=ÓþØÓ=ÓþØÓ=ÓþØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓþÕØýCD9DþD:DþD:Dþ$D:Dþ+D:Dþ2D:Dþ8D:Dþ?D:DþD;DþD;DþD;Dþ#D;Dþ(D;Dþ-D;Dþ3D;Dþ8D;Dþ>D;DþCD;DýDDDþ1D DþQÿÿþ8þ6D DþXÿÿþ4þD Dþmÿÿþ@D DþoÿÿþAD DþqÿÿþBD Dþsÿÿ Dþvÿÿ DþxÿÿþD DþzÿÿþD Dþ{ÿÿþD Dþ{ÿÿþD Dþ|ÿÿ1ÿþËÿ<ÿþûÿ=ÿþíÿ=ÿþàÿ=ÿþÔÿ=ÿþÇÿ=ÿþ»ÿ|ÿþúÿ=ÿþîÿ=ÿþäÿ=ÿþÙÿ=ÿþÏÿ=ÿþÅÿ=ÿþºÿ=ÿþêÿ<ÿþýÿ=ÿþõÿ=ÿþìÿ=ÿþãÿ=ÿþÚÿ=ÿþÐÿ=ÿþÇÿ=ÿþ¾ÿ=ÿþ·ÿ|ÿþþÿ=ÿþ÷ÿ=ÿþïÿ=ÿþçÿ=ÿþàÿ=ÿþÚÿ=ÿþÔÿ=ÿþÎÿ=ÿþÈÿ=ÿþÂÿ=ÿþ»ÿ=ÿþ¶ÿ=ÿþßÿ|ÿþþÿ=ÿþúÿ=ÿþõÿ=ÿþñÿ=ÿþìÿ=ÿþçÿ=ÿþãÿ=ÿþàÿ=ÿþÝÿ=ÿþÚÿ=ÿþ×ÿ=ÿþÔÿ=ÿþÑÿ=ÿþÎÿ=ÿþÌÿ=ÿþÊÿ=ÿþÈÿ=ÿþÆÿ=ÿþÄÿ=ÿþÂÿ=ÿþÀÿ=ÿþ¿ÿ=ÿþ¾ÿ=ÿþ¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿ;ÿû³522ÿ9ÿýÅ8229ÿýÖ>228ÿýäF228ÿþP227ÿþ[226ÿþk225ÿþ}224ÿþ‘223ÿý¥3222ÿý¹62 21ÿýÊ:2 20ÿýÛA2 2/ÿýñI2 2/ÿþS2 2.ÿþ`22-ÿþp22,ÿþƒ22+ÿþ˜22*ÿý¬422)ÿý¿722(ÿýÐ<22'ÿýßC22&ÿýøL22&ÿþS22%ÿþY22$ÿþa22#ÿþk22"ÿþt22!ÿþ22 ÿþŒ22ÿþ˜22ÿý¤322ÿý®522ÿýº722ÿýÄ92 2ÿýÎ=2!2ÿý×A2"2ÿýßE2#2ÿýíJ2$2ÿþP2%2ÿþV2&2ÿþ^2'2ÿþf2(2ÿþp2)2ÿþ{2*2ÿþ‡2*2þ5ÿÿþ“2*2ý3£ÿÿýž32*2þ˜ÿÿý¥42*2þŒÿÿý¥42*2þÿÿý¥42*2þvÿÿý¥42*2þlÿÿý¥42*2þcÿÿý¥42*2þ[ÿÿý¤42*2þTÿÿý¤42*2ýNýÿ ÿý¤42*2ýIåÿ ÿý¤42*2ýDÞÿ ÿý£42*2ý@Öÿ ÿý£42*2ý<Íÿ ÿý£42*2ý9Ãÿ ÿý¢42*2ý7ºÿ ÿý¢42*2ý5¯ÿ ÿ;ÿû¾NLLÿ9ÿýÎRLL9ÿýÝWLL8ÿýé]LL8ÿþfLL7ÿþqLL6ÿþ~LL5ÿþLL4ÿþ LL3ÿý²MLL2ÿýÃOL L1ÿýÓTL L0ÿýâYL L/ÿýô`L L/ÿþiL L.ÿþuLL-ÿþƒLL,ÿþ”LL+ÿþ¦LL*ÿý¸MLL)ÿýÉQLL(ÿýØULL'ÿýæ[LL&ÿýúcLL&ÿþiLL%ÿþoLL$ÿþvLL#ÿþ~LL"ÿþ‡LL!ÿþLL ÿþ›LLÿþ¦LLÿý±MLLÿýºNLLÿýÄPLLÿýÎSL LÿýÖUL!LÿýÞYL"Lÿýæ]L#LÿýñaL$LÿþfL%LÿþlL&LÿþsL'Lÿþ{L(LÿþƒL)LÿþL*Lÿþ—L*LþNÿÿþ¢L*LýM°ÿÿþ¬L+Lþ¦ÿÿý²NL*Lþ›ÿÿý²NL*Lþ’ÿÿý²NL*Lþˆÿÿý²NL*Lþÿÿý²NL*Lþxÿÿý²NL*Lþqÿÿý±NL*Lþkÿÿý±NL*Lýeýÿ ÿý±NL*Lý`êÿ ÿý±ML*Lý\åÿ ÿý°ML*LýXÝÿ ÿý°ML*LýUÖÿ ÿý°ML*LýSÍÿ ÿý¯ML*LýPÄÿ ÿý¯ML*LýN»ÿ ÿ;ÿû¬ÌÍÍÿ9ÿý¨ËÍÍ9ÿý¤ÊÍÍ8ÿý ÈÍÍ8ÿþÆÍÍ7ÿþÃÍÍ6ÿþ¿ÍÍ5ÿþºÍÍ4ÿþµÍÍ3ÿþ°Í Í2ÿý«ÌÍ Í1ÿý§ËÍ Í0ÿý¢ÉÍ Í/ÿÇ Í/ÿþÅÍ Í.ÿþÁÍÍ-ÿþ½ÍÍ,ÿþ¹ÍÍ+ÿþ³ÍÍ*ÿþ®ÍÍ)ÿý©ÌÍÍ(ÿý¥ÊÍÍ'ÿý¡ÉÍÍ&ÿýàÆÍÍ&ÿþÅÍÍ%ÿþÃÍÍ$ÿþÁÍÍ#ÿþ¿ÍÍ"ÿþ¼ÍÍ!ÿþ¹ÍÍ ÿþ¶ÍÍÿþ³ÍÍÿþ°ÍÍÿý®ÌÍÍÿý«ÌÍÍÿý¨ËÍ Íÿý¦ÊÍ!Íÿý£ÉÍ"Íÿý¡ÈÍ#Íÿý¸ÇÍ$ÍÿþÆÍ%ÍÿþÄÍ&ÍÿþÂÍ'ÍÿþÀÍ(Íÿþ½Í)Íÿþ»Í*Íÿþ¸Í*ÍþÌÿÿþµÍ+Íþ±ÿÿþ²Í+Íþ³ÿÿý°ÌÍ*Íþ¶ÿÿý°ÌÍ*Íþ¹ÿÿý°ÌÍ*Íþ¼ÿÿý°ÌÍ*Íþ¾ÿÿý°ÌÍ*ÍþÁÿÿý°ÌÍ*ÍþÃÿÿý°ÌÍ*ÍþÄÿÿý°ÌÍ*ÍýÆõÿ ÿý°ÌÍ*ÍýÇ ÿ ÿþ°Í+ÍýÈ¢ÿ ÿþ±Í+Íýɤÿ ÿþ±Í+Íýʦÿ ÿþ±Í+Íý˨ÿ ÿþ±Í+ÍýÌ«ÿ ÿþ±Í+ÍýÌ­ÿ ÿ;ÿý¿ýÿ;ÿý¸ûÿ;ÿý³÷ÿ;ÿý®óÿ<ÿþíÿ<ÿþæÿ<ÿþÞÿ<ÿþÕÿ<ÿþÌÿ<ÿýÄþÿ;ÿý½ýÿ;ÿý·ùÿ;ÿý±öÿ;ÿýÈñÿ<ÿþëÿ<ÿþäÿ<ÿþÛÿ<ÿþÒÿ<ÿþÊÿ<ÿýÂþÿ;ÿýºüÿ;ÿý´øÿ;ÿý°ôÿ;ÿýÞïÿ<ÿþëÿ<ÿþçÿ<ÿþãÿ<ÿþÞÿ<ÿþÙÿ<ÿþÔÿ<ÿþÏÿ<ÿþÊÿ<ÿýÅþÿ;ÿýÁýÿ;ÿý¼üÿ;ÿý¹úÿ;ÿýµøÿ;ÿý²öÿ;ÿý°óÿ;ÿý½ðÿ<ÿþíÿ<ÿþéÿ<ÿþåÿ<ÿþàÿ<ÿþÛÿ<ÿþÖÿ<ÿþÑÿ*ÿþýÿÿþÌÿ*ÿýþÅÿÿþÇÿ+ÿþÊÿÿýÄþÿ*ÿþÏÿÿýÄþÿ*ÿþÔÿÿýÄþÿ*ÿþÙÿÿýÄþÿ*ÿþÞÿÿýÄþÿ*ÿþâÿÿýÄþÿ*ÿþæÿÿýÅþÿ*ÿþêÿÿýÅþÿ*ÿýíôÿ ÿýÅþÿ*ÿýñ®ÿ ÿýÅþÿ*ÿýô°ÿ ÿýÅþÿ*ÿýö³ÿ ÿýÅþÿ*ÿýøµÿ ÿýÅþÿ*ÿýú¹ÿ ÿýÅþÿ*ÿýü¼ÿ ÿýÅþÿ*ÿýýÀÿ ÿ'2þMÿÿ&2ýBÞÿÿ%2ý9Éÿÿ$2ý4±ÿÿ$2þ–ÿÿ#2þ{ÿÿ"2þcÿÿ!2þQÿÿ 2ýDäÿÿ2ý;Ïÿÿ2ý5¸ÿÿ2þžÿÿ2þ‚ÿÿ2þiÿ ÿ2þVÿ!ÿ2ýGñÿ!ÿ2ý=Öÿ"ÿ2ý6¾ÿ#ÿ2ý3¥ÿ$ÿ2þ‰ÿ%ÿ2þtÿ&ÿ2þdÿ'ÿ2þVÿ(ÿ2ýKøÿ(ÿ2ýBÞÿ)ÿ2ý<Ïÿ*ÿ2ý7¾ÿ+ÿ2ý4«ÿ,ÿ2þ—ÿ-ÿ2þƒÿ.ÿ 2þpÿ/ÿ 2þ`ÿ0ÿ 2þSÿ1ÿ 2ýIñÿ1ÿ 2ýAÛÿ2ÿ2ý:Ëÿ3ÿ2ý6ºÿ4ÿ2ý3¦ÿ5ÿ2þ’ÿ6ÿ2þ~ÿ7ÿ2þlÿ8ÿ2þ]ÿ9ÿ2þPÿ:ÿ2ýGåÿ:ÿü2?×ÿ;ÿý9Çÿ<ÿþ³ÿ=ÿþãÿ=ÿþNÿ<ÿýY2ÿ;ÿüf22ÿ:ÿþu22:ÿþ‡229ÿþ™228ÿý¬4227ÿý¼7226ÿýÌ;225ÿýÛA224ÿýåI223ÿýýN223ÿþU2 2'Lþdÿÿ&LýZåÿÿ%LýRÒÿÿ$LýN½ÿÿ$Lþ¥ÿÿ#Lþÿÿ"Lþxÿÿ!Lþhÿÿ Lý\éÿÿLýT×ÿÿLýOÂÿÿLþ«ÿÿLþ“ÿÿLþ}ÿ ÿLþlÿ!ÿLý_ôÿ!ÿLýVÝÿ"ÿLýPÈÿ#ÿLþ²ÿ$ÿLþ™ÿ%ÿLþ‡ÿ&ÿLþxÿ'ÿLþlÿ(ÿLýbúÿ(ÿLýZåÿ)ÿLýT×ÿ*ÿLýPÈÿ+ÿLýM·ÿ,ÿLþ¥ÿ-ÿLþ”ÿ.ÿ Lþƒÿ/ÿ Lþuÿ0ÿ Lþiÿ1ÿ Lý`ôÿ1ÿ LýYâÿ2ÿLýTÔÿ3ÿLýOÄÿ4ÿLýM³ÿ5ÿLþ¡ÿ6ÿLþÿ7ÿLþÿ8ÿLþrÿ9ÿLþgÿ:ÿLý^êÿ:ÿüLWÞÿ;ÿýRÐÿ<ÿþ¾ÿ=ÿþèÿ=ÿþeÿ<ÿýnLÿ;ÿüzLLÿ:ÿþ‡LL:ÿþ—LL9ÿþ¨LL8ÿý¸MLL7ÿýÇPLL6ÿýÕTLL5ÿýâYLL4ÿýê`LL3ÿýýeLL3ÿþkL L'ÍþÆÿÿ&ÍýÉ¢ÿÿ%Íý˧ÿÿ$ÍýÌ­ÿÿ$Íþ´ÿÿ#Íþ»ÿÿ"ÍþÁÿÿ!ÍþÅÿÿ ÍýÈ ÿÿÍýË¥ÿÿÍýÌ«ÿÿÍþ²ÿÿÍþ¹ÿÿÍþ¿ÿ ÿÍþÄÿ!ÿÍýÈÇÿ!ÿÍýʤÿ"ÿÍý̪ÿ#ÿÍþ°ÿ$ÿÍþ·ÿ%ÿÍþ¼ÿ&ÿÍþÀÿ'ÿÍþÄÿ(ÿÍýÇàÿ(ÿÍýÉ¢ÿ)ÿÍýË¥ÿ*ÿÍý̪ÿ+ÿÍþ¯ÿ,ÿÍþ´ÿ-ÿÍþ¹ÿ.ÿ Íþ½ÿ/ÿ ÍþÁÿ0ÿ ÍþÅÿ1ÿ ÍÇ2ÿ ÍýÉ¢ÿ2ÿÍý˦ÿ3ÿÍýÌ«ÿ4ÿÍþ°ÿ5ÿÍþµÿ6ÿÍþºÿ7ÿÍþ¾ÿ8ÿÍþÂÿ9ÿÍþÅÿ:ÿÍýÈ ÿ:ÿüÍÊ£ÿ;ÿý˧ÿ<ÿþ¬ÿ=ÿþ ÿ=ÿþÆÿ<ÿýÃÍÿ;ÿüÀÍÍÿ:ÿþ¼ÍÍ:ÿþ¸ÍÍ9ÿþ³ÍÍ8ÿþ®ÍÍ7ÿýªÌÍÍ6ÿý¦ËÍÍ5ÿý¢ÉÍÍ4ÿý ÇÍÍ3ÿýõÆÍÍ3ÿþÄÍ Í'ÿþîÿ<ÿýõ°ÿ;ÿýû·ÿ;ÿýþÀÿ<ÿþÊÿ<ÿþÖÿ<ÿþâÿ<ÿþìÿ<ÿýó®ÿ;ÿýùµÿ;ÿýý½ÿ<ÿþÇÿ<ÿþÓÿ<ÿþßÿ<ÿþéÿ<ÿýòÈÿ;ÿýø³ÿ;ÿýü»ÿ<ÿþÄÿ<ÿþÐÿ<ÿþÙÿ<ÿþâÿ<ÿþéÿ<ÿýïÞÿ;ÿýõ°ÿ;ÿýùµÿ;ÿýü»ÿ;ÿýþÂÿ<ÿþÊÿ<ÿþÒÿ<ÿþÛÿ<ÿþäÿ<ÿþëÿ<ÿýñÈÿ;ÿýö±ÿ;ÿýù¶ÿ;ÿýý¼ÿ;ÿýþÄÿ<ÿþÌÿ<ÿþÕÿ<ÿþÞÿ<ÿþåÿ<ÿþìÿ<ÿýò®ÿ;ÿý÷²ÿ;ÿýû¸ÿ<ÿþ¿ÿ=ÿþ¯ÿ=ÿþíÿ<ÿþèÿ<ÿþáÿ<ÿþÙÿ<ÿþÑÿ<ÿþÉÿ<ÿýÂþÿ;ÿý»üÿ;ÿý¶ùÿ;ÿý±õÿ;ÿý®ñÿ;ÿýôíÿ<ÿþêÿ ÿ+ÿý±422*ÿýÆ822)ÿýØ?22(ÿýíH22(ÿþT22'ÿþc22&ÿþu22%ÿþŒ22$ÿý£322#ÿý¹622"ÿýÌ:22!ÿýÝB22 ÿýýK22 ÿþX22ÿþi22ÿþ|22ÿþ“22ÿýª322ÿý¿72 2ÿýÒ=2!2ÿýãD2"2ÿþO2#2ÿþ]2$2ÿþo2%2ÿþ„2&2ÿþ›2'2ÿý±42'2ÿýÆ82(2ÿýØ?2)2ÿýíI2)2þyÿÿþR2)2ýeûÿÿþ]2)2üVôüÿÿþk2)2ûJéüüÿ ÿþ|2)2ý@Ûüü ÿþŽ2)2ý9Éüü ÿý 32(2ý5µüü ÿý²52(2ý3žüü ÿýÂ82)2þ‡üü ÿýÑ=2)2þqüüÿýßC2)2ý_øüüÿýøK2)2ýQñüüÿþV2)2ýFåüüÿþa2)2ý>Õü üÿþp2)2ý7Âü üÿþ2)2ý4­ü üÿþ”2*2þ–ü üÿý¦32)2þü üÿý¸62)2þküüüÿÇ92)2ýZöüüý×?2)2ýMíüüþF2)2ýCßüü*2ý;Íüü)2ý7¼üü(2ý4«üü(2þ™üü'2þ†üü&2þtüü%2ýdúüü$2ýXõüü#2ýMíüü"2ýEáüü!2ý>Õüü 2ý9Æüü2ý5µüü+ÿý½NLL*ÿýÏRLL)ÿýßWLL(ÿýñ_LL(ÿþjLL'ÿþwLL&ÿþ‡LL%ÿþ›LL$ÿþ°LL#ÿýÃOLL"ÿýÕTLL!ÿýäZLL ÿýýcLL ÿþnLLÿþ|LLÿþŽLLÿþ¢LLÿý¶MLLÿýÉPL LÿýÚUL!Lÿýè\L"LÿþfL#LÿþrL$Lÿþ‚L%Lÿþ•L&Lÿþ©L'Lÿý½NL'LÿýÏRL(LÿýßWL)Lÿýñ`L)Lþ‹ÿÿþhL)LýyþÿÿþrL)LýløÿÿþL)LýaîÿÿþL)LýXâÿÿþžL)LýSÒÿÿþ®L)LýNÀÿÿý½NL)Lþ¬ÿÿýÌRL)Lþ—ÿÿýÙVL)Lþ„ÿÿýæ[L)LýtüÿÿýúcL)LýhöÿÿþlL)Lý^êÿÿþvL)LýVÜÿÿþƒL)LýQÌÿÿþ’L)LýM¹ÿÿþ£L*Lþ¥ÿÿý³ML)LþÿÿýÂOL)Lþ~ÿÿýÐSL)LýpúÿÿýÞWL)Lýdñÿÿþ]L)Lý[æÿÿ*LýTÖÿÿ)LýPÇÿÿ(LýM·ÿÿ(Lþ§ÿÿ'Lþ—ÿÿ&Lþ†ÿÿ%Lýyýÿÿ$Lýnùÿÿ#Lýdñÿÿ"Lý]çÿÿ!LýWÜÿÿ LýRÏÿÿLýOÀÿÿ+ÿý­ÌÍÍ*ÿý¨ËÍÍ)ÿý£ÊÍÍ(ÿý¸ÇÍÍ(ÿþÄÍÍ'ÿþÁÍÍ&ÿþ¼ÍÍ%ÿþ¶ÍÍ$ÿþ±ÍÍ#ÿý«ÌÍÍ"ÿý¦ËÍÍ!ÿý¢ÉÍÍ ÿýõÇÍÍ ÿþÃÍÍÿþ¿ÍÍÿþºÍÍÿþµÍÍÿþ¯Í Íÿý©ÌÍ Íÿý¤ÊÍ!Íÿý ÈÍ"ÍÿþÆÍ#ÍÿþÂÍ$Íÿþ¾Í%Íÿþ¸Í&Íÿþ²Í'Íÿý­ÌÍ'Íÿý¨ËÍ(Íÿý£ÊÍ)Íÿý¸ÇÍ)Íþ»ÿÿþÅÍ)ÍýÀšÿÿþÂÍ)ÍüÄœšÿÿþ¿Í)ÍûÇŸššÿ ÿþºÍ)ÍýÉ¢šš ÿþ¶Í)Íý˧šš ÿþ±Í)Íý̬šš ÿý­ÌÍ)Íþ²šš ÿý©ËÍ)Íþ¸šš ÿý¥ÊÍ)Íþ½ššÿý¡ÉÍ)Íý›ššÿýàÇÍ)ÍýÅššÿþÄÍ)ÍýÈ ššÿþÁÍ)Íýʤš šÿþ½Í)ÍýÌ©š šÿþ¹Í*Íþ®š šÿþ´Í*Íþ´š šÿþ°Í*Íþ¹š šÿý«ÌÍ)Íþ¿ššüÿ§ËÍ)ÍýÜššý£ÊÍ)ÍýÆžššþÈÍ)ÍýÉ¡šš*Íý˦šš)Íý̪šš)Íþ¯šš(Íþ³šš'Íþ¸šš&Íþ¼šš%ÍýÀ›šš$ÍýÜšš#ÍýÆžšš"ÍýÈ¡šš!Íýʤšš Íý˨ššÍý̬šš+ÿýÀþÿ;ÿý¸ûÿ;ÿý²÷ÿ;ÿý½ñÿ<ÿþêÿ<ÿþâÿ<ÿþÙÿ<ÿþÏÿ<ÿþÅÿ<ÿý½ýÿ;ÿý¶ùÿ;ÿý°õÿ;ÿýôïÿ<ÿþèÿ<ÿþßÿ<ÿþÖÿ<ÿþÌÿ<ÿýÂþÿ;ÿýºüÿ;ÿý´øÿ;ÿý¯óÿ<ÿþíÿ<ÿþåÿ<ÿþÜÿ<ÿþÒÿ<ÿþÈÿ<ÿýÀþÿ;ÿý¸ûÿ;ÿý²÷ÿ;ÿý½ñÿ)ÿþ×ÿÿþëÿ)ÿýá§ÿÿþåÿ)ÿüé©§ÿÿþÞÿ)ÿûð­§§ÿ ÿþÖÿ)ÿýö±§§ ÿþÎÿ)ÿýú·§§ ÿþÆÿ)ÿýý¾§§ ÿý¿ýÿ)ÿþǧ§ ÿý¹ûÿ)ÿþѧ§ ÿý´øÿ)ÿþÛ§§ÿý°ôÿ)ÿý䨧§ÿýÞïÿ)ÿý쪧§ÿþéÿ)ÿýò®§§ÿþãÿ)ÿý÷³§ §ÿþÛÿ)ÿýü¹§ §ÿþÔÿ)ÿýþÁ§ §ÿþËÿ*ÿþʧ §ÿýÄþÿ)ÿþÔ§ §ÿý½ýÿ)ÿþÞ§§üÿ¸úÿ)ÿýç©§§ý²÷ÿ)ÿýî«§§þóÿ)ÿýô°§§*ÿýùµ§§)ÿýü»§§(ÿýþ§§(ÿþɧ§'ÿþѧ§&ÿþÚ§§%ÿýᨧ§$ÿýè©§§#ÿýî«§§"ÿý󯧧!ÿý÷³§§ ÿýû¸§§ÿýý¾§§2ý6¼ü$ü2ý3§ü%ü2þü&ü2þyü'ü2ýfûü'ü2ýVõü(ü2ýJéü)ü2ýAÛü*ü2ý9Éü+ü2ý5¶ü,ü2ý3Ÿü-ü2þˆü.ü 2þrü/ü 2ý`úü/ü 2ýQñü0ü 2ýFåü1ü 2ý>Öü2ü2ý8Ãü3ü2ý4®ü4ü2þ˜ü5ü2þ€ü6ü2þkü7ü2ý[÷ü7ü2ýMîü8ü2ýCàü9ü2ý<Ïü:üü26»ü;üý3¦ü<üþüþüLýPÇÿ$ÿLýM´ÿ%ÿLþ ÿ&ÿLþ‹ÿ'ÿLýzþÿ'ÿLýlùÿ(ÿLýbîÿ)ÿLýYâÿ*ÿLýSÒÿ+ÿLýOÁÿ,ÿLþ­ÿ-ÿLþ™ÿ.ÿ Lþ…ÿ/ÿ Lýuýÿ/ÿ Lýhöÿ0ÿ Lý^êÿ1ÿ LýVÝÿ2ÿLýQÍÿ3ÿLýMºÿ4ÿLþ¦ÿ5ÿLþ‘ÿ6ÿLþÿ7ÿLýpûÿ7ÿLýdòÿ8ÿLý[æÿ9ÿLýT×ÿ:ÿüLPÆÿ;ÿýM³ÿ<ÿþŸÿþÿÍý̪š$šÍþ¯š%šÍþµš&šÍþ»š'šÍþÀš(šÍýÄœš(šÍýÇŸš)šÍýÉ¢š*šÍý˧š+šÍý̬š,šÍþ±š-šÍþ·š.š Íþ½š/š ÍýÁ›š/š ÍýÅš0š ÍýÈ š1š Íýʤš2šÍý̨š3šÍþ®š4šÍþ³š5šÍþ¹š6šÍþ¿š7šÍýÛš7šÍýÆžš8šÍýÉ¡š9šÍýË¥š:šüÍ̪š;šýͰš<šþµšþšÿýü»§$§ÿýþç%§ÿþͧ&§ÿþ×§'§ÿþá§(§ÿýé©§(§ÿýð­§)§ÿýö±§*§ÿýú·§+§ÿýý¾§,§ÿþƧ-§ÿþЧ.§ ÿþÚ§/§ ÿý䨧/§ ÿý쪧0§ ÿýò®§1§ ÿý÷³§2§ÿýû¹§3§ÿýþÁ§4§ÿþʧ5§ÿþÔ§6§ÿþÞ§7§ÿý樧7§ÿýî«§8§ÿýô¯§9§ÿýùµ§:§üÿü¼§;§ýþħ<§þͧþ§?üþÆü=üþxü<üýø?ü<üý³2ü<üýi2ü;üüð82ü;üü¤22ü;üüf22ü:üûö:22ü:üþµ22;üþt22;üþC22:üþÈ22:üþƒ22:üþN229üþÜ229üþ”229üþ[228üýí5228üþ¥228üþi228üþ@227üþÑ227üþ–227üþf227üþ?226üþÑ226üþ–226üþf226üþ?225üþÐ225üþ•225üþf225üþ?224üþÐ224üþ•224üþm224üþM223üýô5223üþÄ2 23üþ—2 23üþq2 23üþP2 22üý÷62 22üþÊ2 22üþœ2 22üþu2 22üþT2 21üýú82 21üþÐ2 21üþ¡2 21üþy2 21üþY2 21üþA2 20üýò32 20üþÍ2 2?ÿþÏÿ=ÿþŠÿ<ÿýüXÿ<ÿý¾Lÿ<ÿý}Lÿ;ÿüôRLÿ;ÿü±LLÿ;ÿü{LLÿ:ÿûúSLLÿ:ÿþÀLL;ÿþ‡LL;ÿþ[LL:ÿþÑLL:ÿþ”LL:ÿþeLL9ÿþãLL9ÿþ£LL9ÿþpLL8ÿýñOLL8ÿþ²LL8ÿþ}LL8ÿþXLL7ÿþÙLL7ÿþ¥LL7ÿþ{LL7ÿþXLL6ÿþÙLL6ÿþ¥LL6ÿþzLL6ÿþXLL5ÿþØLL5ÿþ¤LL5ÿþzLL5ÿþWLL4ÿþØLL4ÿþ¤LL4ÿþ€LL4ÿþdLL3ÿýøNLL3ÿþÎL L3ÿþ¥L L3ÿþ„L L3ÿþgL L2ÿýûPL L2ÿþÓL L2ÿþªL L2ÿþ‡L L2ÿþjL L1ÿýýRL L1ÿþØL L1ÿþ®L L1ÿþ‹L L1ÿþnL L1ÿþYL L0ÿþ÷L L0ÿþÖL L?šþ¨š=šþ»š<šý›Êš<šý¬Íš<šý¿Íš;šüËÍš;šü°ÍÍš;šüÀÍÍš:šûœËÍÍš:šþ¬ÍÍ;šþ¼ÍÍ;šþÉÍÍ:šþ§ÍÍ:šþ¹ÍÍ:šþÆÍÍ9šþ¢ÍÍ9šþ´ÍÍ9šþÃÍÍ8šýžÌÍÍ8šþ°ÍÍ8šþ¿ÍÍ8šþÉÍÍ7šþ¥ÍÍ7šþ´ÍÍ7šþÀÍÍ7šþÊÍÍ6šþ¥ÍÍ6šþ´ÍÍ6šþÀÍÍ6šþÊÍÍ5šþ¥ÍÍ5šþ´ÍÍ5šþÀÍÍ5šþÊÍÍ4šþ¥ÍÍ4šþ´ÍÍ4šþ¾ÍÍ4šþÆÍÍ3šýœÌÍÍ3šþ¨Í Í3šþ´Í Í3šþ½Í Í3šþÅÍ Í2šý›ÌÍ Í2šþ§Í Í2šþ²Í Í2šþ¼Í Í2šþÄÍ Í1šý›ËÍ Í1šþ¥Í Í1šþ±Í Í1šþ»Í Í1šþÃÍ Í1šþÉÍ Í0šþœÍ Í0šþ¦Í Í?§þ¸§=§þا<§ý¨ö§<§ý¿ÿ§<§ýßÿ§;§üªûÿ§;§üÅÿÿ§;§üàÿÿ§:§û©úÿÿ§:§þ¾ÿÿ;§þÙÿÿ;§þôÿÿ:§þ·ÿÿ:§þÒÿÿ:§þíÿÿ9§þ±ÿÿ9§þËÿÿ9§þæÿÿ8§ý«ýÿÿ8§þÄÿÿ8§þßÿÿ8§þöÿÿ7§þ´ÿÿ7§þÊÿÿ7§þàÿÿ7§þöÿÿ6§þ´ÿÿ6§þÊÿÿ6§þáÿÿ6§þöÿÿ5§þ´ÿÿ5§þËÿÿ5§þáÿÿ5§þ÷ÿÿ4§þ´ÿÿ4§þËÿÿ4§þÝÿÿ4§þîÿÿ3§ý©ýÿÿ3§þ¹ÿ ÿ3§þÊÿ ÿ3§þÛÿ ÿ3§þìÿ ÿ2§ý¨üÿ ÿ2§þ·ÿ ÿ2§þÈÿ ÿ2§þÙÿ ÿ2§þêÿ ÿ1§ý¨ûÿ ÿ1§þ´ÿ ÿ1§þÆÿ ÿ1§þ×ÿ ÿ1§þèÿ ÿ1§þõÿ ÿ0§þªÿ ÿ0§þµÿ ÿüþª2!2þQÿÿþž22üþc2!2þ£ÿÿþJ22üüê62 2þ>ÿÿþ«22ýü˜2!2þÿÿþQ22ýüV2 2ý4Ûÿÿþ¹22ýÚ32 2þ`ÿÿþ[22þˆ2!2þ±ÿÿþÆ22þI2 2þEÿÿþd2'2þ‹ÿÿýÒ32&2ý6íÿÿþr2'2þkÿÿþ92'2þÀÿÿþ“2'2þNÿÿþJ2'2þ•ÿÿþ¹2'2ý5íÿÿþd2'2þaÿÿýß52'2þ¥ÿÿþƒ2'2þ:ÿÿþA2'2þmÿÿþ¦2(2þ·ÿÿþX2'2þAÿÿýÙ32'2þzÿÿþ†2(2þÉÿÿþI2'2þKÿÿþÄ2(2þˆÿÿþv2'2ý3Üÿÿþ?2'2þOÿÿþ±2(2þ„ÿÿþi2(2þÇÿÿþ82'2þBÿÿþž2(2þrÿÿþ[2(2þ°ÿÿýå42'2þ8ÿÿþš2(2þbÿÿþa2(2þ›ÿÿþ72'2ý3äÿÿþ­2(2þSÿÿþo2(2þˆÿÿþ?2(2þÉÿÿþÁ2(2þ<ÿÿþ2(2þaÿÿþK2(2þÿÿþØ2)2þÉÿÿþ2(2þ<ÿÿþX2(2þaÿÿþ62(2þÿÿþ·2)2þÉÿÿþ2(2þ<ÿÿþU2(2þaÿÿþ62(2þÿÿþ¸2)2þÈÿÿþ‚2(2þ7ÿÿþV2(2þQÿÿþ62(2þrÿÿþ¸2)2þ™ÿÿþ‚2)2þÇÿÿþX2(2þ6ÿÿþ92(2þOÿÿþÒ2)2þpÿÿþ¢2)2þ–ÿÿþy2)2þÃÿÿþX2(2þ5ÿÿþ:2(2þMÿÿþÕ2)2þmÿÿþ¤22ÿþ¶L!Lþhÿÿþ«LLÿþxL!Lþ°ÿÿþaLLüÿïOL LþWÿÿþ·LLýÿ¦L!LþÿÿþhLLýÿlL LýMâÿÿþÃLLþáL!LþuÿÿþpLLþ˜L!Lþ½ÿÿþÏLLþ`L Lþ]ÿÿþyL'Lþ›ÿÿýÚML&LýPñÿÿþ…L'Lþ~ÿÿþRL'LþÊÿÿþ¢L'LþeÿÿþaL'Lþ¤ÿÿþÃL'LýOñÿÿþyL'LþuÿÿýæNL'Lþ²ÿÿþ”L'LþSÿÿþYL'Lþÿÿþ³L(LþÂÿÿþmL'LþYÿÿþàL(LþŒÿÿþ—L(LþÒÿÿþ`L'LþbÿÿþÎL(Lþ™ÿÿþ‰L(LþãÿÿþWL'Lþfÿÿþ½L(Lþ•ÿÿþ|L(LþÐÿÿþQL'LþZÿÿþ¬L(Lþ…ÿÿþpL(Lþ¼ÿÿýêML'LþRÿÿþ¨L(LþvÿÿþuL(Lþ©ÿÿþQL'LýMéÿÿþ¹L(Lþiÿÿþ‚L(Lþ˜ÿÿþXL(LþÒÿÿþËL(LþUÿÿþL(LþvÿÿþbL(LþŸÿÿþßL)LþÒÿÿþŸL(LþUÿÿþnL(LþvÿÿþOL(LþŸÿÿþÂL)LþÒÿÿþ’L(LþUÿÿþkL(LþvÿÿþOL(LþŸÿÿþÂL)LþÑÿÿþ“L(LþPÿÿþlL(LþhÿÿþOL(Lþ…ÿÿþÂL)Lþ¨ÿÿþ“L)LþÐÿÿþmL(LþOÿÿþSL(LþfÿÿþÚL)Lþƒÿÿþ¯L)Lþ¥ÿÿþ‹L)LþÍÿÿþmL(LþNÿÿþTL(LþdÿÿþÜL)Lþÿÿþ±LLšþ¯Í!ÍþÅÿÿþ²ÍÍšþÁÍ!Íþ±ÿÿþÇÍÍüšžÌÍ ÍþÊÿÿþ¯ÍÍýš³Í!ÍþºÿÿþÅÍÍýšÄÍ!Íþ¢ÿÿþ«ÍÍþ£Í!ÍþÁÿÿþÃÍÍþ·Í!Íþ­ÿÿþ¨ÍÍþÇÍ ÍþÈÿÿþÀÍ'Íþ·ÿÿþ¤Í'Íý̸ÿÿþ½Í'Íþ¿ÿÿþËÍ'Íþ©ÿÿþµÍ'ÍþÆÿÿþÇÍ'Íþ´ÿÿþ«Í'Íý̸ÿÿþÀÍ'ÍþÁÿÿý¡ÌÍ'Íþ°ÿÿþ¹Í'ÍþËÿÿþÉÍ'Íþ¾ÿÿþ°Í(Íþ«ÿÿþÄÍ'ÍþÉÿÿþ£Í(Íþ»ÿÿþ¸Í(Íþ§ÿÿþÇÍ'ÍþÇÿÿþ¨Í(Íþ·ÿÿþ¼Í(Íþ¢ÿÿþÊÍ'ÍþÆÿÿþ­Í(Íþ¸ÿÿþ¿Í(Íþ§ÿÿþÌÍ'ÍþÉÿÿþ²Í(Íþ½ÿÿþÃÍ(Íþ­ÿÿþ Í(ÍþËÿÿþ³Í(ÍþÁÿÿþÁÍ(Íþ²ÿÿþÌÍ(Íþ ÿÿþ®Í(ÍþÅÿÿþ¾Í(Íþ·ÿÿþÊÍ(Íþ§ÿÿþ©Í(ÍþÊÿÿþºÍ(ÍþÁÿÿþÇÍ(Íþµÿÿþ£Í)Íþ§ÿÿþµÍ(ÍþÊÿÿþÃÍ(ÍþÁÿÿþÌÍ(Íþµÿÿþ«Í)Íþ§ÿÿþ¹Í(ÍþÊÿÿþÄÍ(ÍþÁÿÿþÌÍ(Íþµÿÿþ«Í)Íþ§ÿÿþ¹Í(ÍþÌÿÿþÄÍ(ÍþÅÿÿþÌÍ(Íþ½ÿÿþ«Í)Íþ³ÿÿþ¹Í)Íþ§ÿÿþÄÍ(ÍþÌÿÿþËÍ(ÍþÆÿÿþ¤Í)Íþ½ÿÿþ±Í)Íþ´ÿÿþ»Í)Íþ¨ÿÿþÄÍ(ÍþÌÿÿþËÍ(ÍþÆÿÿþ¤Í)Íþ¾ÿÿþ°ÍͧþÂÿ!ÿþìÿÿþÇÿÿ§þâÿ!ÿþÅÿÿþðÿÿü§¬ýÿ ÿþ÷ÿÿþÂÿÿý§Êÿ!ÿþÕÿÿþìÿÿý§éÿ ÿýþ±ÿÿþ½ÿÿþ±ÿ!ÿþäÿÿþæÿÿþÐÿ!ÿþÀÿÿþ¸ÿÿþñÿ ÿþóÿÿþáÿ'ÿþÏÿÿý´þÿ&ÿýü½ÿÿþÚÿ'ÿþÞÿÿþûÿ'ÿþºÿÿþÌÿ'ÿþîÿÿþðÿ'ÿþËÿÿþ½ÿ'ÿýý½ÿÿþáÿ'ÿþãÿÿý°ýÿ'ÿþÄÿÿþÒÿ'ÿþúÿÿþöÿ'ÿþÝÿÿþÄÿ(ÿþ½ÿÿþèÿ'ÿþõÿÿþ²ÿ(ÿþ×ÿÿþÑÿ(ÿþ·ÿÿþñÿ'ÿþïÿÿþ¹ÿ(ÿþÐÿÿþØÿ(ÿþ±ÿÿþ÷ÿ'ÿþíÿÿþÀÿ(ÿþÒÿÿþßÿ(ÿþ¸ÿÿþûÿ'ÿþõÿÿþÇÿ(ÿþÚÿÿþæÿ(ÿþÀÿÿý®þÿ'ÿþûÿÿþÈÿ(ÿþãÿÿþãÿ(ÿþÈÿÿþüÿ'ÿýþ®ÿÿþÁÿ(ÿþëÿÿþÜÿ(ÿþÐÿÿþöÿ(ÿþ·ÿÿþºÿ(ÿþøÿÿþÕÿ(ÿþãÿÿþïÿ(ÿþÍÿÿþ²ÿ)ÿþ·ÿÿþÍÿ(ÿþøÿÿþèÿ(ÿþãÿÿþýÿ(ÿþÍÿÿþ½ÿ)ÿþ·ÿÿþÔÿ(ÿþøÿÿþêÿ(ÿþãÿÿþýÿ(ÿþÍÿÿþ½ÿ)ÿþ·ÿÿþÓÿ(ÿþüÿÿþéÿ(ÿþìÿÿþýÿ(ÿþÚÿÿþ½ÿ)ÿþÉÿÿþÓÿ)ÿþ¸ÿÿþèÿ(ÿþýÿÿþúÿ(ÿþíÿÿþ´ÿ)ÿþÛÿÿþÅÿ)ÿþÊÿÿþ×ÿ)ÿþ¹ÿÿþèÿ(ÿþýÿÿþùÿ(ÿþîÿÿþ³ÿ)ÿþÝÿÿþÅÿÿ!2þ˜üü 2ýPûüü2ý3Ãüü2þküü2ý6Úüü2þwüü2ý9æüü2þ…üü2ý>ïüü2þ’ü ü2ýDöü ü2þ ü!ü2ýIûü!ü2þü"ü2ýC÷ü"ü2þ“ü#ü2ý?òü#ü2þ‰ü$ü2ý;íü$ü2þ€ü%ü2ý8æü%ü2þwü&ü2ý3×ü&ü2þ]ü'ü2þ¯ü'ü2ýDûü'ü2þ‹ü(ü2ý6æü(ü2þkü)ü2þÂü)ü2þPü*ü2þ›ü*ü2ý:òü*ü2þoü+ü2þºü+ü2ýCûü+ü2þü,ü2þÏü,ü2þOü-ü2þü-ü2ý4ãü-ü2þ]ü.ü2þžü.ü 2ý4çü.ü 2þVü/ü 2þŒü/ü 2þÓü/ü 2þIü0ü 2þ|ü0ü 2þ¾ü0ü 2ý>úü0ü 2þmü1ü 2þ¥ü1ü 2ý3äü1ü 2þJü2ü 2þsü2ü 2þ¥ü2ü 2þäü2ü 2þIü3ü 2þrü3ü 2þ¥ü3ü 2þãü3ü2þIü4ü2þkü4ü!Lþ¦ÿÿ LýgþÿÿLýMÍÿÿLþÿÿLýOáÿÿLþ‰ÿÿLýSëÿÿLþ•ÿÿLýWóÿÿLþ¡ÿ ÿLý\úÿ ÿLþ®ÿ!ÿLý`þÿ!ÿLþ«ÿ"ÿLý[ûÿ"ÿLþ¢ÿ#ÿLýW÷ÿ#ÿLþ™ÿ$ÿLýTñÿ$ÿLþ‘ÿ%ÿLýQëÿ%ÿLþ‰ÿ&ÿLýMÞÿ&ÿLþrÿ'ÿLþ»ÿ'ÿLý\þÿ'ÿLþ›ÿ(ÿLýPëÿ(ÿLþÿ)ÿLþÌÿ)ÿLþfÿ*ÿLþ©ÿ*ÿLýT÷ÿ*ÿLþ‚ÿ+ÿLþÄÿ+ÿLý[þÿ+ÿLþÿ,ÿLþ×ÿ,ÿLþfÿ-ÿLþŸÿ-ÿLýNèÿ-ÿLþrÿ.ÿLþ«ÿ.ÿ LýMìÿ.ÿ Lþlÿ/ÿ Lþœÿ/ÿ LþÛÿ/ÿ Lþ`ÿ0ÿ LþŽÿ0ÿ LþÈÿ0ÿ LýWýÿ0ÿ Lþÿ1ÿ Lþ²ÿ1ÿ Lþéÿ1ÿ Lþaÿ2ÿ Lþ†ÿ2ÿ Lþ²ÿ2ÿ Lþéÿ2ÿ Lþ`ÿ3ÿ Lþ…ÿ3ÿ Lþ²ÿ3ÿ Lþèÿ3ÿLþ`ÿ4ÿLþÿ4ÿ!Íþ³šš ÍþÅšš Íþ¨ššÍþ¿ššÍýÌ£ššÍþ¼ššÍýË ššÍþ¸ššÍýÊššÍþµš šÍýÈœš šÍþ±š!šÍþÇš"šÍþ²š"šÍýÉ›š"šÍþµš#šÍýÊœš#šÍþ·š$šÍýËžš$šÍþ¹š%šÍýÌ š%šÍþ¼š&šÍþ£š&šÍþš'šÍþ­š'šÍþÈš(šÍþ·š(šÍýÌ š(šÍþ¿š)šÍþ©š)šÍþÆš*šÍþ²š*šÍýËœš*šÍþ¾š+šÍþ«š+šÍþÉš,šÍþºš,šÍþ¥š,šÍþÆš-šÍþµš-šÍýÌ š-šÍþš.šÍþ²š.šÍþŸš.š ÍþÄš/š Íþ¶š/š Íþ¤š/š ÍþÇš0š Íþºš0š Íþªš0š ÍýÊ›š0š Íþ¾š1š Íþ°š1š Íþ š1š ÍþÇš2š Íþ½š2š Íþ°š2š Íþ š2š ÍþÇš3š Íþ½š3š Íþ°š3š Íþ š3šÍþÇš4šÍþ¿š4š!ÿþʧ§ ÿþì§§ÿýþ¹§§ÿþÞ§§ÿýý±§§ÿþا§ÿýú®§§ÿþÒ§§ÿý÷«§§ÿþ̧ §ÿýó©§ §ÿþƧ!§ÿþñ§"§ÿþǧ"§ÿýô¨§"§ÿþ̧#§ÿý÷ª§#§ÿþЧ$§ÿýù«§$§ÿþÔ§%§ÿýû®§%§ÿþا&§ÿýþ²§&§ÿþå§'§ÿþÀ§'§ÿþó§(§ÿþϧ(§ÿýü®§(§ÿþÞ§)§ÿþ¹§)§ÿþí§*§ÿþȧ*§ÿýùª§*§ÿþܧ+§ÿþ¼§+§ÿþô§,§ÿþÕ§,§ÿþµ§,§ÿþí§-§ÿþͧ-§ÿýþ¯§-§ÿþå§.§ÿþǧ.§ ÿýþ­§.§ ÿþé§/§ ÿþΧ/§ ÿþ³§/§ ÿþñ§0§ ÿþÖ§0§ ÿþ»§0§ ÿý÷¨§0§ ÿþݧ1§ ÿþħ1§ ÿþ®§1§ ÿþð§2§ ÿþÚ§2§ ÿþħ2§ ÿþ®§2§ ÿþñ§3§ ÿþÚ§3§ ÿþħ3§ ÿþ¯§3§ÿþñ§4§ÿþÞ§4§¿üþøü<üýûjü<üýr2ü;üü|22ü:üþ‡22:üþ’229üý¡3228üý¾6227üýá@226üý÷U226üþw225üþ£224üýÌ8223üýìG222üýûa2 22üþˆ2 21üýº42 20üýíB2 20üþr2 2/üýº32 2.üýòG2 2.üþ|22-üýÅ422,üý÷L22,üþ…22+üýÎ622*üýûS22*üþ›22)üýòA22)üþŒ22(üýí=22(üþƒ22'üýæ922'üþy22&üýÞ722&üþq22%üýÖ522%üþj22$üýÛ422$üþ|22#üýõ=22#üþ 22#üþS22"üþÊ22"üþq22!üýí822!üþ”22!üþK22 üþ»22 üþl22¿ÿþüÿ<ÿýþ~ÿ<ÿý…Lÿ;ÿüŽLLÿ:ÿþ—LL:ÿþ¡LL9ÿþ®LL8ÿýÈOLL7ÿýçXLL6ÿýûkLL6ÿþ‰LL5ÿþ°LL4ÿýÕQLL3ÿýð^LL2ÿýþuL L2ÿþ˜L L1ÿýÅML L0ÿýñZL L0ÿþ…L L/ÿþÅL L.ÿý÷^L L.ÿþLL-ÿýÎMLL,ÿýûcLL,ÿþ–LL+ÿýÖOLL*ÿýþiLL*ÿþ©LL)ÿý÷YLL)ÿþœLL(ÿýñULL(ÿþ”LL'ÿýëSLL'ÿþ‹LL&ÿýåPLL&ÿþ„LL%ÿýÝNLL%ÿþ~LL$ÿýâNLL$ÿþLL#ÿýùVLL#ÿþ®LL#ÿþiLL"ÿþÓLL"ÿþ„LL!ÿýñRLL!ÿþ£LL!ÿþbLL ÿþÆLL ÿþLL¿šþ›š=šþ¿š<šý½Íš;šüºÍÍš:šþ¸ÍÍ:šþµÍÍ9šþ±ÍÍ8šýªÌÍÍ7šý¡ÉÍÍ6šý›ÄÍÍ6šþ¼ÍÍ5šþ±ÍÍ4šý¦ÌÍÍ3šýžÈÍÍ3šþÁÍ Í2šþ·Í Í1šþ«Í Í0šýžÉÍ Í0šþ½Í Í/šþ«Í Í.šýœÈÍ Í.šþºÍÍ-šþ¨ÍÍ,šý›ÆÍÍ,šþ¸ÍÍ+šý¦ÌÍÍ+šþÅÍÍ*šþ²ÍÍ)šýœÉÍÍ)šþ¶ÍÍ(šýžÊÍÍ(šþ¹ÍÍ'šý ËÍÍ'šþ»ÍÍ&šý¢ÌÍÍ&šþ½ÍÍ%šý¤ÌÍÍ%šþ¿ÍÍ$šý¢ÌÍÍ$šþºÍÍ#šýœÊÍÍ#šþ±ÍÍ#šþÅÍÍ"šþ§ÍÍ"šþ½ÍÍ!šýžËÍÍ!šþ´ÍÍ!šþÇÍÍ šþªÍÍ šþ¾ÍÍ¿§þ¨§=§þß§<§ýÚÿ§;§üÖÿÿ§:§þÑÿÿ:§þÌÿÿ9§þÆÿÿ8§ý»ýÿÿ7§ý¯öÿÿ6§ý¨êÿÿ6§þØÿÿ5§þÅÿÿ4§ý¶ûÿÿ3§ý¬òÿÿ3§þãÿ ÿ2§þÐÿ ÿ1§ý¼þÿ ÿ0§ý«õÿ ÿ0§þÚÿ ÿ/§þ¼ÿ ÿ.§ýªòÿ ÿ.§þÖÿÿ-§ý¸þÿÿ,§ý¨ïÿÿ,§þÑÿÿ+§ýµýÿÿ+§þëÿÿ*§þÈÿÿ)§ýªõÿÿ)§þÎÿÿ(§ý«øÿÿ(§þÒÿÿ'§ý®úÿÿ'§þ×ÿÿ&§ý°üÿÿ&§þÛÿÿ%§ý³ýÿÿ%§þßÿÿ$§ý±þÿÿ$§þÖÿÿ#§ý©øÿÿ#§þÆÿÿ#§þëÿÿ"§þ·ÿÿ"§þÛÿÿ!§ý«ûÿÿ!§þËÿÿ!§þïÿÿ §þ¼ÿÿ §þÞÿÿüýìf2-2 üýÄE2.2 üýŽ52/2 üýía212 üýÝK222üýÌA232üý¹:242üý¥6252üýŽ3262üýûy282üýõf292üýïX2:2üüðT2;2ýõZ2<2þb2û2ü3`Á292ú4hÌüü282ýVÌüü72ýA¢üü52ü5|îüü42ýVÐüü22ü4…úüü12ýB½ü ü02ýcéü ü.2ý7”ü ü-2ý=Âüü,2ýEÓüü+2ýOãüü*2ý\ïüü)2ýl÷üü(2þrüü'2ýiûüü&2ýaøüü%2ýYôüü$2ýSïüü#2ýKêüü"2ý:Õüü!2ý3®üü!2þ‚üü 2ý^ûüü2ýFéüü2ý6ÊüüÿýðzL-L ÿýÎ]L.L ÿýžOL/L ÿýñvL1L ÿýäbL2LÿýÕYL3LÿýÃTL4Lÿý²OL5LÿþžL7Lÿýþ‹L8LÿýùzL9LÿýónL:LüÿôkL;LýùpLßüü&2ýWúüü'2þ‚üü'2ý4Äüü(2ýMøüü)2þüü)2ý9ßüü*2þfüü+2þ¶üü+2ýGõüü,2þ‹üü,2ý;êüü-2þ…üü-2ý=ïüü.2þŒüü.2ý?ôü ü/2þ”ü ü/2ýC÷ü ü02þ¥ü ü02þXü ü02ý3Úü ü12þ…ü ü12þGü ü22þ¿ü ü22þqü ü22ý;õü ü32þ²ü ü32þuü ü32þKü ü32ý3çüü42þ«üü42þyüüþS222þPüüýçH212ý4íüüý×:212þ·ü üþ¥212þŒü üþo202þnü üýñH2/2þZü üþ·2/2þHü üþi2.2þ7ü üýá:2.2þæü üþ2.2þÆü üýò?2-2þªü üþŒ2-2þœü üýï=2,2þ“üüþ}2,2þüüþÏ2,2þ“üüþP2+2þ–üüþ2+2þ™üüLþ‰ÿ$ÿLýƒþÿ"ÿLý}üÿ!ÿLýxúÿ ÿLýrøÿÿLýrúÿÿLþ~ÿÿLþ’ÿÿ Lþ¨ÿÿ LýN½ÿÿ!LýRÐÿÿ"LýYçÿÿ#Lýküÿÿ$Lþÿÿ$LýM¾ÿÿ%LýVæÿÿ&Lýmýÿÿ'Lþ“ÿÿ'LýMÎÿÿ(Lýdüÿÿ)LþŸÿÿ)LýSæÿÿ*Lþ{ÿÿ+LþÁÿÿ+Lý_ùÿÿ,Lþ›ÿÿ,LýTïÿÿ-Lþ–ÿÿ-LýUóÿÿ.Lþœÿÿ.LýXøÿ ÿ/Lþ£ÿ ÿ/Lý[ûÿ ÿ0Lþ²ÿ ÿ0Lþmÿ ÿ1Lþáÿ ÿ1Lþ–ÿ ÿ1Lþ^ÿ ÿ2LþÉÿ ÿ2Lþ„ÿ ÿ2LýTùÿ ÿ3Lþ½ÿ ÿ3Lþ‡ÿ ÿ3Lþbÿ ÿ4Lþìÿÿ4Lþ·ÿÿ4Lþ‹ÿÿþiL2Lþfÿÿýì_L1LýMñÿÿýÞSL1LþÂÿ ÿþ²L1Lþœÿ ÿþ‚L0Lþÿ ÿýö_L/Lþpÿ ÿþÂL/Lþ_ÿ ÿþ|L.LþQÿ ÿýçSL.Lþëÿ ÿþžL.LþÏÿ ÿý÷WL-Lþ¶ÿ ÿþœL-Lþªÿ ÿýóUL,Lþ¢ÿÿþL,LþŸÿÿþ×L,Lþ¢ÿÿþfL+Lþ¥ÿÿþ L+Lþ§ÿÿÍþ¼š$šÍþ½š#šÍý¿›š!šÍýÁœš šÍýœššÍýœššÍþ¿ššÍþ¹šš Íþ³šš ÍýÌ­šš!Íý˧šš"ÍýÉ¡šš#ÍýÄ›šš$Íþºšš%Íþ¬šš%ÍýÊ¡šš&ÍýÄ›šš'Íþ¹šš(Íþ¨šš(ÍýÆ›šš)Íþµšš)ÍýË¡šš*ÍþÀšš+Íþ¬šš+ÍýÈœšš,Íþ·šš,ÍýËžšš-Íþ¸šš-ÍýÊšš.Íþ¶šš.ÍýÊœš š/Íþ´š š/ÍýÉ›š š0Íþ°š š0ÍþÄš š1Íþ£š š1Íþ¸š š1ÍþÈš š2Íþ©š š2Íþ½š š2ÍýËœš š3Íþ­š š3Íþ¼š š3ÍþÇš š4ÍþŸšš4Íþ¯šš4Íþ»ššþÅÍ2ÍþÆššýŸÇÍ2Íþžššý£ËÍ1Íþ«š šþ°Í1Íþ¶š šþ¾Í0Íþ¾š šýÇÍ/ÍþÚ šþ«Í/ÍþÇš šþ¿Í.ÍþÌš šý¡ËÍ.Íþ š šþ¶Í.Íþ¨š šýœÊÍ-Íþ¯š šþ¶Í-Íþ²š šýÊÍ,ÍþµššþºÍ,Íþµššþ¥Í,ÍþµššþÆÍ+Íþ´ššþµÍ+Íþ³ššÿþا$§ÿþÛ§#§ÿýߨ§!§ÿýâ©§ §ÿýå©§§ÿýå©§§ÿþÞ§§ÿþÔ§§ ÿþɧ§ ÿýþÀ§§!ÿýû¸§§"ÿýõ¯§§#ÿýꨧ§$ÿþÕ§§$ÿýþ¿§§%ÿý÷°§§&ÿý騧§'ÿþÓ§§'ÿýþ¹§§(ÿý§)ÿþͧ§)ÿýú°§§*ÿþà§§+ÿþ¾§§+ÿýò©§§,ÿþϧ§,ÿýù¬§§-ÿþѧ§-ÿýø«§§.ÿþΧ§.ÿýö©§ §/ÿþ˧ §/ÿýô¨§ §0ÿþħ §0ÿþè§ §1ÿþ±§ §1ÿþѧ §1ÿþò§ §2ÿþº§ §2ÿþÛ§ §2ÿýù©§ §3ÿþ¿§ §3ÿþÙ§ §3ÿþï§ §4ÿþ­§§4ÿþ§§4ÿþ×§§þëÿ2ÿþí§§ý­ñÿ1ÿýþ«§§ý²úÿ1ÿþ½§ §þÄÿ1ÿþΧ §þÜÿ0ÿþܧ §ýªñÿ/ÿþç§ §þ½ÿ/ÿþñ§ §þßÿ.ÿþü§ §ý¯úÿ.ÿþ®§ §þÍÿ.ÿþ¸§ §ýª÷ÿ-ÿþ§ §þÎÿ-ÿþȧ §ý«øÿ,ÿþ̧§þÕÿ,ÿþͧ§þµÿ,ÿþ̧§þíÿ+ÿþʧ§þÍÿ+ÿþɧ§üÿš§üýè82 2ý5õÿÿþ•2 2üþw2!2þ™ÿÿýá322üýÜ52 2þXÿ ÿþT22üþk2 2ý3àÿÿþˆ22üýÍ32 2þÿÿþÃ22üþ_2 2þQÿ ÿþ:22üþ½2!2þÖÿÿþa22üþN2 2þ…ÿÿþ’22üþŒ2 2þJÿÿþÏ22üýÝ32 2þÉÿÿþA22üþV2 2þ|ÿÿþi22üþ–2 2þCÿÿþ22üýç52 2þ½ÿÿþÝ22 üþ^2 2þvÿÿþG22 üþ¡2 2þDÿÿþi22 üýï82 2þÖÿÿþ22 üþf2 2þœÿÿþÀ22 üþ¬2 2þnÿÿþ522 üýö<22þGÿÿþN22 üþo2 2þãÿÿþq22 üþ¸2 2þ§ÿÿþ›22 üýú@22þvÿÿþÌ22 üþx22þNÿÿþ922 üþ¼22þ4ÿÿþU22 üýõ622þ³ÿÿþq22 üþV22þ€ÿÿþ22 üþ22þVÿÿþ²22 üþ±22þ7ÿÿþÛ22 üýí422þ¾ÿÿþ822üþN22þ‰ÿÿþN22üþv22þ_ÿÿþh22üþ¦22þ;ÿÿþ…22üþá2 2þËÿÿþ¦22üþF22þ•ÿÿþÊ22üþm22þoÿÿþñ22üþ›22þTÿÿþ722üþÕ22þ<ÿÿþE22üþ?22þäÿÿþT22üþd22þºÿÿþf22üþ‘22þ•ÿÿþx22üþÅ22þvÿÿþŒ22üýñ322þ[ÿÿþ¡22üþD22þBÿÿþº22üþ]22þ3ÿÿþÓ22üþy22þËÿÿ2üþ™22þ±ÿÿü422üüþ½22þšÿÿü:22üüþè22þ…ÿÿüA22üüþ>22þrÿÿüI22üüþQ22þaÿÿüP22üüþb22þPÿÿüX22üüþt22þAÿÿü_22üüþˆ22þ4ÿÿüh22üüþ22þàÿÿüp22üüþ´22þÅÿÿüy22üüþÍ22þ¯ÿÿü|22üüþê22þ¥ÿÿüz22üüþ622þšÿÿüy22üüþ=22þÿÿüx22üüþC22þˆÿÿüw22üüþJ22þÿÿüv22üüþQ22þvÿÿüu22üüþX22þnÿÿüt22üüþ_22þfÿÿþs22ÿýíRL LýO÷ÿÿþ¤L Lÿþ‰L!Lþ§ÿÿýçMLLÿýãNL Lþnÿ ÿþjLLÿþL LýMæÿÿþ˜LLÿþÖL!LþžÿÿþÍLLÿþtL Lþgÿ ÿþTLLÿþÇL!LþÝÿÿþvLLÿþeL Lþ–ÿÿþ¡LLÿþœL Lþaÿÿþ×LLÿýäML LþÒÿÿþYLLÿþlL LþŽÿÿþ}LLÿþ¥L Lþ[ÿÿþ«LLÿýìNL LþÇÿÿþäLL ÿþsL Lþˆÿÿþ^LL ÿþ®L Lþ\ÿÿþ|LL ÿýóQL LþÝÿÿþ LL ÿþ{L LþªÿÿþÊLL ÿþ¸L LþÿÿþNLL ÿýúTLLþ_ÿÿþeLL ÿþ‚L Lþèÿÿþ„LL ÿþÂL Lþ´ÿÿþ©LL ÿýýXLLþ‰ÿÿþÕLL ÿþŠLLþeÿÿþRLL ÿþÇLLþMÿÿþkLL ÿýùPLLþ¾ÿÿþ„LL ÿþlLLþ‘ÿÿþŸLL ÿþLLþlÿÿþ½LL ÿþ½LLþPÿÿþâLL ÿýñMLLþÈÿÿþQLLÿþeLLþ™ÿÿþeLLÿþˆLLþtÿÿþ|LLÿþ³LLþTÿÿþ–LLÿþçL LþÔÿÿþ³LLÿþ^LLþ¤ÿÿþÓLLÿþ€LLþ‚ÿÿþôLLÿþ©LLþjÿÿþPLLÿþÜLLþUÿÿþ]LLÿþXLLþéÿÿþkLLÿþyLLþÄÿÿþzLLÿþ LLþ¤ÿÿþŠLLÿþÎLLþ‰ÿÿþ›LLÿýöMLLþpÿÿþ®LLÿþ\LLþZÿÿþÄLLÿþrLLÿþÛLLÿþ‹LLþÔÿÿLÿþ§LLþ½ÿÿüMLLÿÿþÇLLþ¨ÿÿüSLLÿÿþíLLþ–ÿÿüYLLÿÿþWLLþ…ÿÿü`LLÿÿþhLLþuÿÿüfLLÿÿþvLLþfÿÿümLLÿÿþ†LLþYÿÿütLLÿÿþ˜LLþNÿÿü|LLÿÿþ«LLþæÿÿüƒLLÿÿþ¿LLþÎÿÿü‹LLÿÿþÖLLþ»ÿÿüLLÿÿþïLLþ²ÿÿüŒLLÿÿþPLLþ¨ÿÿü‹LLÿÿþULLþ ÿÿüŠLLÿÿþ[LLþ˜ÿÿü‰LLÿÿþaLLþÿÿü‰LLÿÿþgLLþˆÿÿü‡LLÿÿþmLLþÿÿü‡LLÿÿþtLLþzÿÿþ†LLšýŸËÍ ÍýÌÕÿÿþ´Í Íšþ¼Í!Íþ³ÿÿþ¡Í Íšý¢ÌÍ ÍþÃÿ ÿþÄÍÍšþ¿Í!Íþ¡ÿÿþ·ÍÍšþ¦Í!Íþ¶ÿÿþ¨ÍÍšþÂÍ ÍþÅÿ ÿþËÍÍšþªÍ!Íþ¤ÿÿþÁÍÍšþÆÍ Íþ¸ÿÿþµÍÍšþ¶Í ÍþÇÿÿþ¥ÍÍšþ¢Í!Íþ§ÿÿþÉÍÍšþÄÍ Íþºÿÿþ¿ÍÍšþ´Í ÍþÉÿÿþ²ÍÍšýŸÌÍ Íþªÿÿþ¢ÍÍ šþÂÍ Íþ¼ÿÿþÈÍÍ šþ±Í ÍþÈÿÿþ¿ÍÍ šýÌÍ Íþ¤ÿÿþµÍÍ šþÀÍ Íþ²ÿÿþ©ÍÍ šþ®Í Íþ¾ÿÿþÌÍÍ šýœËÍÍþÈÿÿþÆÍÍ šþ¾Í Íþ ÿÿþ½ÍÍ šþ«Í Íþ¯ÿÿþ²ÍÍ šý›ÉÍÍþ¼ÿÿþ¦ÍÍ šþ»ÍÍþÆÿÿþËÍÍ šþªÍ Í ÿþÄÍÍ šýœÌÍÍþ¬ÿÿþ½ÍÍ šþÄÍÍþ¹ÿÿþµÍÍ šþºÍÍþÄÿÿþ­ÍÍ šþ­ÍÍþÌÿÿþ¢ÍÍ šþžÍ ÍþªÿÿþÌÍÍšþÆÍÍþ·ÿÿþÆÍÍšþ¼ÍÍþÂÿÿþ¿ÍÍšþ°ÍÍþËÿÿþ¸ÍÍšþ¡Í Íþ¦ÿÿþ°ÍÍšþÈÍÍþ´ÿÿþ§ÍÍšþ¾ÍÍþ¾ÿÿþÇÍÍšþ²ÍÍþÄÿÿþÌÍÍšþ¤ÍÍþÊÿÿþÈÍÍšþÊÍÍþ ÿÿþÄÍÍšþÀÍÍþ«ÿÿþÀÍÍšþµÍÍþ´ÿÿþ»ÍÍšþ¨ÍÍþ¼ÿÿþ¶ÍÍšþÍÍþÃÿÿþ±ÍÍšþÈÍÍþÉÿÿþ«ÍÍšþÂÍÍÿþ¤ÍÍšþ»ÍÍþ¦ÿÿÍšþ³ÍÍþ­ÿÿÍšþªÍÍþ³ÿÿüËÍÍššþŸÍÍþ¸ÿÿüÉÍÍššþÊÍÍþ½ÿÿüÇÍÍššþÅÍÍþÁÿÿüÆÍÍššþÁÍÍþÆÿÿüÄÍÍššþ¼ÍÍþÉÿÿüÂÍÍššþ·ÍÍþÌÿÿü¿ÍÍššþ²ÍÍþ¡ÿÿü½ÍÍššþ¬ÍÍþ¨ÿÿü»ÍÍššþ¦ÍÍþ­ÿÿüºÍÍššþžÍÍþ°ÿÿü»ÍÍššþÌÍÍþ³ÿÿü»ÍÍššþÊÍÍþµÿÿü»ÍÍššþÉÍÍþ·ÿÿü¼ÍÍššþÇÍÍþºÿÿü¼ÍÍššþÅÍÍþ¼ÿÿü¼ÍÍššþÄÍÍþ¾ÿÿü¼ÍÍššþÂÍÍþÀÿÿþ½Íͧý­ûÿ ÿýýÓÿÿþËÿ ÿ§þØÿ!ÿþÉÿÿý¯þÿÿ§ý±ýÿ ÿþèÿ ÿþêÿÿ§þÞÿ ÿýþ¯ÿÿþÐÿÿ§þµÿ!ÿþÍÿÿþ¹ÿÿ§þäÿ ÿþìÿ ÿþùÿÿ§þ»ÿ!ÿþ³ÿÿþãÿÿ§þíÿ ÿþÑÿÿþÌÿÿ§þÎÿ ÿþðÿÿþµÿÿ§ý°þÿ ÿþ·ÿÿþöÿÿ§þéÿ ÿþÖÿÿþßÿÿ§þÊÿ ÿþôÿÿþÇÿÿ§ý­ýÿ ÿþ»ÿÿþ°ÿÿ §þåÿ ÿþÙÿÿþòÿÿ §þÆÿ ÿþôÿÿþßÿÿ §ý«ûÿ ÿþ³ÿÿþÍÿÿ §þàÿ ÿþÈÿÿþºÿÿ §þÂÿ ÿþÜÿÿþýÿÿ §ý©ùÿÿþòÿÿþíÿÿ §þÜÿ ÿþ¯ÿÿþÛÿÿ §þ½ÿ ÿþÃÿÿþÈÿÿ §ý¨öÿÿþØÿÿþ¶ÿÿ §þØÿÿþíÿÿþûÿÿ §þ»ÿÿþþÿÿþêÿÿ §ý©üÿÿþ¿ÿÿþÛÿÿ §þéÿÿþÔÿÿþÍÿÿ §þÕÿÿþéÿÿþ¿ÿÿ §þÀÿÿþüÿÿþ±ÿÿ §ý«þÿÿþ»ÿÿþûÿÿ§þîÿÿþÐÿÿþíÿÿ§þÙÿÿþäÿÿþàÿÿ§þÄÿÿþùÿÿþÑÿÿ§þ¯ÿ ÿþ¶ÿÿþÄÿÿ§þòÿÿþËÿÿþ·ÿÿ§þÝÿÿþÜÿÿþÈÿÿ§þÈÿÿþêÿÿþüÿÿ§þ³ÿÿþøÿÿþóÿÿ§þöÿÿþ®ÿÿþêÿÿ§þáÿÿþ¼ÿÿþáÿÿ§þÌÿÿþËÿÿþØÿÿ§þ¸ÿÿþØÿÿþÏÿÿ§ýªþÿÿþæÿÿþÆÿÿ§þôÿÿþõÿÿþ¼ÿÿ§þåÿ'ÿþ³ÿÿ§þ×ÿÿþ¶ÿ ÿ§þÉÿÿþÀÿÿüþÿÿ§§þ»ÿÿþÈÿÿüúÿÿ§§þ­ÿÿþÑÿÿüõÿÿ§§þ÷ÿÿþÚÿÿüñÿÿ§§þìÿÿþãÿÿüíÿÿ§§þãÿÿþíÿÿüèÿÿ§§þÚÿÿþöÿÿüäÿÿ§§þÐÿÿþþÿÿüàÿÿ§§þÇÿÿþ¯ÿÿüÛÿÿ§§þ¾ÿÿþ¸ÿÿü×ÿÿ§§þµÿÿþÀÿÿüÖÿÿ§§þ¬ÿÿþÄÿÿü×ÿÿ§§þüÿÿþÈÿÿü×ÿÿ§§þøÿÿþÍÿÿüØÿÿ§§þôÿÿþÐÿÿüØÿÿ§§þðÿÿþÕÿÿüØÿÿ§§þìÿÿþÙÿÿüÙÿÿ§§þèÿÿþÜÿÿüÙÿÿ§§þäÿÿþáÿÿþÚÿÿ2þÃü&ü2þˆü&ü2þXü&ü2ý6ñü%ü2þ´ü%ü2þ‚ü%ü2þ\ü%ü2þ<ü%ü2þÕü$ü2þ ü$ü2þvü$ü2þQü$ü2ý6öü#ü2þÃü#ü2þ’ü#ü2þiü#ü2þGü#ü2ý3ðü"ü2þÆü"ü2þ¡ü"ü2þü"ü2þdü"ü2þKü"ü2ý7úü!ü2þØü!ü2þ°ü!ü2þŽü!ü2þpü!ü2þVü!ü2þ?ü!ü2þõü ü2þØü ü2þ½ü ü2þ¥ü ü2þü ü2þ{ü ü2þiü ü2þWü ü2þGü ü2þ9ü ü2þîüü2þÑüü2þ¿üü2þ³üü2þ¨üü2þüü2þ“üü2þ‰üü2þüü2þvüü2þnüü2þeüü2þ]üü2þVüü2þOüü2þMüü2þNüü2þPüü2þQüü2þRüü2þSüü2þTüü2þVüü2þWüüLþÍÿ&ÿLþ˜ÿ&ÿLþnÿ&ÿLýPöÿ%ÿLþ¿ÿ%ÿLþ“ÿ%ÿLþqÿ%ÿLþUÿ%ÿLþÜÿ$ÿLþ®ÿ$ÿLþˆÿ$ÿLþhÿ$ÿLýOúÿ#ÿLþÍÿ#ÿLþ¡ÿ#ÿLþ}ÿ#ÿLþ_ÿ#ÿLýMôÿ"ÿLþÏÿ"ÿLþ®ÿ"ÿLþ’ÿ"ÿLþyÿ"ÿLþcÿ"ÿLýPýÿ!ÿLþßÿ!ÿLþ¼ÿ!ÿLþžÿ!ÿLþƒÿ!ÿLþlÿ!ÿLþXÿ!ÿLþùÿ ÿLþßÿ ÿLþÇÿ ÿLþ²ÿ ÿLþžÿ ÿLþÿ ÿLþ|ÿ ÿLþmÿ ÿLþ_ÿ ÿLþRÿ ÿLþòÿÿLþÙÿÿLþÉÿÿLþ¾ÿÿLþµÿÿLþ«ÿÿLþ¢ÿÿLþ™ÿÿLþÿÿLþ‰ÿÿLþÿÿLþyÿÿLþrÿÿLþlÿÿLþfÿÿLþdÿÿLþeÿÿLþfÿÿLþgÿÿLþhÿÿLþiÿÿLþkÿÿLþlÿÿLþmÿÿÍþ¨š&šÍþ·š&šÍþÚ&šÍýÌš%šÍþ¬š%šÍþ¹š%šÍþš%šÍþÊš%šÍþ¤š$šÍþ±š$šÍþ¼š$šÍþÅš$šÍýÌœš#šÍþ¨š#šÍþµš#šÍþ¿š#šÍþÈš#šÍþš"šÍþ¨š"šÍþ±š"šÍþ¹š"šÍþÀš"šÍþÇš"šÍýÌ›š!šÍþ£š!šÍþ­š!šÍþ¶š!šÍþ½š!šÍþÄš!šÍþÊš!šÍþœš šÍþ£š šÍþªš šÍþ°š šÍþ¶š šÍþ»š šÍþ¿š šÍþÄš šÍþÈš šÍþËš šÍþžššÍþ¥ššÍþ©ššÍþ¬ššÍþ¯ššÍþ²ššÍþµššÍþ·ššÍþ¹ššÍþ¼ššÍþ¾ššÍþÀššÍþššÍþÄššÍþÆššÍþÆššÍþÆššÍþÆššÍþÅššÍþÅššÍþÅššÍþÄššÍþÄššÍþÄššÿþ¹§&§ÿþЧ&§ÿþè§&§ÿýüª§%§ÿþ¾§%§ÿþÓ§%§ÿþæ§%§ÿþø§%§ÿþ³§$§ÿþƧ$§ÿþÙ§$§ÿþì§$§ÿýý©§#§ÿþ¹§#§ÿþ̧#§ÿþß§#§ÿþò§#§ÿýþª§"§ÿþ¸§"§ÿþƧ"§ÿþÔ§"§ÿþá§"§ÿþï§"§ÿýü¨§!§ÿþ²§!§ÿþÀ§!§ÿþΧ!§ÿþÛ§!§ÿþé§!§ÿþö§!§ÿþ©§ §ÿþ²§ §ÿþ»§ §ÿþħ §ÿþͧ §ÿþÖ§ §ÿþß§ §ÿþé§ §ÿþò§ §ÿþû§ §ÿþ«§§ÿþ´§§ÿþº§§ÿþ¿§§ÿþç§ÿþǧ§ÿþ̧§ÿþЧ§ÿþÔ§§ÿþا§ÿþܧ§ÿþá§§ÿþå§§ÿþé§§ÿþí§§ÿþî§§ÿþí§§ÿþí§§ÿþì§§ÿþë§§ÿþë§§ÿþê§§ÿþé§§ÿþé§§üþo22þ{ÿÿüþ 22þXÿÿüþÞ22þ;ÿÿüþF22þ×ÿÿüþk22þ¥ÿÿüþ‘22þ}ÿÿüþ¾22þZÿÿüýð422þ=ÿÿüþJ22üÚÿÿüüþk22ü¨ÿÿüüþ22üÿÿüüþ½22ü[ÿÿüüýð422ü>ÿÿüüþJ22ýßÿüüþj22ý¸ÿüüþ22ý–ÿüüþ½22ýyÿüüýð422ý`ÿüüþH22ýIÿüüþ`22ý6ÿüüþy22þØüüþ—22þ²üüþ¸22þ’üüþÝ22þvüüþ822þ\üüþL22þFüüþd22þ4üüþ~22üþ›22üþ½22üþä22üþ:22üþP22üþg22üþ‚22üþ—22üþ«22üþÀ22üþÙ22üþò22üþ922üþG22üþT22üþc22üþt22üþ…22üþ—22üþ¬22üþÁ22üþÙ22üþé22üþö22 üþ522 üþ:22 üþA22 üþG22 üþM22 üþT22 üþZ22 üþa22 üþi22 üþp22 üþx22 üþ€22ÿþ‚LLþÿÿþ®LLþnÿÿþåLLþTÿÿþ^LLþÞÿÿþ~LLþ²ÿÿþ LLþÿÿþÈLLþpÿÿýôMLLþUÿÿþbLLþáÿÿþ~LLþµÿÿþ LLþÿÿþÇLLþqÿÿýôMLLþVÿÿþaLLþæÿÿþ~LLþÂÿÿþŸLLþ¥ÿÿþÇLLþ‹ÿÿýôMLLþuÿÿþ_LLþ`ÿÿþuLLþOÿÿþ‹LLþßÿÿþ¥LLþ½ÿÿþÂLLþ¡ÿÿþäLLþˆÿÿþQLLþqÿÿþcLLþ]ÿÿþxLLþNÿÿþLLÿþ©LLÿþÇLLÿþéLLÿþTLLÿþfLLÿþ{LLÿþ“LLÿþ¥LLÿþ·LLÿþÊLLÿþàLLÿþ÷LLÿþSLLÿþ^LLÿþkLLÿþxLLÿþ†LLÿþ•LLÿþ¥LLÿþ¸LLÿþËLLÿþàLLÿþîLLÿþúLL ÿþNLL ÿþTLL ÿþYLL ÿþ^LL ÿþdLL ÿþjLL ÿþpLL ÿþvLL ÿþ|LL ÿþƒLL ÿþŠLL ÿþ‘LLšþ¾ÍÍþ»ÿÿšþ±ÍÍþÃÿÿšþ¢ÍÍþËÿÿšþÈÍÍþ£ÿÿšþ¿ÍÍþ°ÿÿšþµÍÍþºÿÿšþªÍÍþÃÿÿšþÍÍþÊÿÿšþÇÍÍü£ÿÿššþ¿ÍÍü¯ÿÿššþµÍÍüºÿÿššþªÍÍüÃÿÿššþÍÍüÊÿÿššþÇÍÍý¡ÿššþ¿ÍÍý«ÿššþµÍÍý´ÿššþªÍÍý»ÿššþÍÍýÁÿššþÇÍÍýÇÿššþÁÍÍýÌÿššþ»ÍÍþ£ššþ´ÍÍþ­ššþ«ÍÍþµššþ¢ÍÍþ¼ššþÌÍÍþššþÆÍÍþÈššþÀÍÍþÌššþºÍÍšþ²ÍÍšþªÍÍšþ ÍÍšþËÍÍšþÆÍÍšþÀÍÍšþ¹ÍÍšþ´ÍÍšþ¯ÍÍšþ©ÍÍšþ£ÍÍšþœÍÍšþËÍÍšþÈÍÍšþÄÍÍšþÁÍÍšþ¼ÍÍšþ¸ÍÍšþ´ÍÍšþ®ÍÍšþ©ÍÍšþ£ÍÍšþŸÍÍšþœÍÍ šþÌÍÍ šþËÍÍ šþÉÍÍ šþÈÍÍ šþÆÍÍ šþÄÍÍ šþÃÍÍ šþÁÍÍ šþ¿ÍÍ šþ½ÍÍ šþ»ÍÍ šþ¹ÍͧþÜÿÿþÖÿÿ§þÆÿÿþèÿÿ§þ°ÿÿþùÿÿ§þòÿÿþ²ÿÿ§þÞÿÿþÄÿÿ§þÌÿÿþÕÿÿ§þ»ÿÿþçÿÿ§ýªþÿÿþøÿÿ§þðÿÿü±ÿÿ§§þÞÿÿüÃÿÿ§§þÍÿÿüÕÿÿ§§þ»ÿÿüæÿÿ§§ýªþÿÿü÷ÿÿ§§þðÿÿý°ÿ§§þßÿÿý½ÿ§§þÍÿÿýÊÿ§§þ»ÿÿý×ÿ§§ýªþÿÿýäÿ§§þñÿÿýñÿ§§þäÿÿýýÿ§§þ×ÿÿþ²§§þÊÿÿþ¿§§þ½ÿÿþ̧§þ°ÿÿþÙ§§þûÿÿþæ§§þïÿÿþó§§þâÿÿþþ§§þÕÿÿ§þÈÿÿ§þ»ÿÿ§þ®ÿÿ§þùÿÿ§þíÿÿ§þàÿÿ§þÓÿÿ§þÊÿÿ§þÂÿÿ§þºÿÿ§þ²ÿÿ§þªÿÿ§þúÿÿ§þòÿÿ§þêÿÿ§þâÿÿ§þÚÿÿ§þÒÿÿ§þÊÿÿ§þÂÿÿ§þºÿÿ§þ²ÿÿ§þ­ÿÿ§þ©ÿÿ §þýÿÿ §þùÿÿ §þöÿÿ §þòÿÿ §þîÿÿ §þêÿÿ §þçÿÿ §þãÿÿ §þßÿÿ §þÛÿÿ §þØÿÿ §þÔÿÿ#ÿþa22#ÿþ{22#ÿþ™22#ÿþº22#ÿþà22$ÿþ922$ÿþN22$ÿþe22$ÿþ€22$ÿþž22$ÿþÀ22$ÿþñ22%ÿþ<22%ÿþR22%ÿþj22%ÿþ…22%ÿþœ22%ÿþ±22%ÿþÇ22%ÿþà22&ÿþ322&ÿþ>22&ÿþK22&ÿþZ22&ÿþj22&ÿþ{22&ÿþŒ22þÑÿ$ÿþ 22þ­ÿ$ÿþ¶22þŽÿ$ÿþÍ22þvÿ$ÿþè22þdÿ%ÿþ522þTÿ%ÿþA22þFÿ%ÿþO22þ8ÿ%ÿþ]22&ÿþk22þÕÿ$ÿþt22þ¼ÿ$ÿþ|22þ¥ÿ$ÿþ„22þ‘ÿ$ÿþŒ22þÿ$ÿþ•22þmÿ$ÿþž22þ]ÿ$ÿþ¨22þNÿ$ÿþ²22þ@ÿ$ÿþ¼22þ4ÿ$ÿþÇ22þãÿ#ÿþÒ22þËÿ#ÿþÞ22þ»ÿ#ÿþø22þ²ÿ$ÿ2þ©ÿ$ÿþ522þ ÿ$ÿþ;22þ˜ÿ$ÿþA22þÿ$ÿþG22þˆÿ$ÿþK22þ€ÿ$ÿþJ22þyÿ$ÿþI22þqÿ$ÿþF22þjÿ$ÿþD22þcÿ$ÿþC22þ]ÿ$ÿþA22þVÿ$ÿþ?22þPÿ$ÿþ=22þJÿ$ÿþ<22#ÿþvLL#ÿþLL#ÿþ§LL#ÿþÄLL#ÿþæLL$ÿþRLL$ÿþeLL$ÿþyLL$ÿþ‘LL$ÿþ«LL$ÿþÊLL$ÿþôLL%ÿþULL%ÿþhLL%ÿþ~LL%ÿþ–LL%ÿþªLL%ÿþ½LL%ÿþÐLL%ÿþæLL&ÿþMLL&ÿþWLL&ÿþcLL&ÿþpLL&ÿþ~LL&ÿþLL&ÿþœLLþÙÿ$ÿþ®LLþ¹ÿ$ÿþÁLLþžÿ$ÿþÖLLþˆÿ$ÿþìLLþxÿ%ÿþNLLþkÿ%ÿþYLLþ^ÿ%ÿþfLLþRÿ%ÿþrLL&ÿþLLþÜÿ$ÿþ†LLþÇÿ$ÿþLLþ²ÿ$ÿþ•LLþ ÿ$ÿþœLLþÿ$ÿþ¤LLþ€ÿ$ÿþ¬LLþrÿ$ÿþµLLþeÿ$ÿþ½LLþXÿ$ÿþÇLLþMÿ$ÿþÐLLþèÿ#ÿþÚLLþÔÿ#ÿþåLLþÆÿ#ÿþúLLþ½ÿ$ÿLþµÿ$ÿþOLLþ®ÿ$ÿþTLLþ¦ÿ$ÿþYLLþŸÿ$ÿþ_LLþ˜ÿ$ÿþcLLþ‘ÿ$ÿþbLLþ‹ÿ$ÿþ`LLþ„ÿ$ÿþ^LLþ~ÿ$ÿþ\LLþxÿ$ÿþ[LLþrÿ$ÿþYLLþlÿ$ÿþXLLþgÿ$ÿþVLLþbÿ$ÿþTLL#ÿþÁÍÍ#ÿþ»ÍÍ#ÿþ³ÍÍ#ÿþ«ÍÍ#ÿþ¡ÍÍ$ÿþËÍÍ$ÿþÆÍÍ$ÿþÀÍÍ$ÿþ¹ÍÍ$ÿþ²ÍÍ$ÿþ©ÍÍ$ÿþÇÍÍ%ÿþÊÍÍ%ÿþÅÍÍ%ÿþ¿ÍÍ%ÿþ¸ÍÍ%ÿþ²ÍÍ%ÿþ­ÍÍ%ÿþ§ÍÍ%ÿþ¡ÍÍ&ÿÍ&ÿþÊÍÍ&ÿþÇÍÍ&ÿþÃÍÍ&ÿþ¿ÍÍ&ÿþ»ÍÍ&ÿþ¶ÍÍþ¥ÿ$ÿþ±ÍÍþ®ÿ$ÿþ¬ÍÍþ¶ÿ$ÿþ¦ÍÍþ¼ÿ$ÿþ©ÍÍþÀÿ%ÿþÌÍÍþÄÿ%ÿþÉÍÍþÈÿ%ÿþÆÍÍþËÿ%ÿþÂÍÍ&ÿþ¿ÍÍþ¤ÿ$ÿþ¼ÍÍþªÿ$ÿþºÍÍþ°ÿ$ÿþ¸ÍÍþµÿ$ÿþ¶ÍÍþºÿ$ÿþ´ÍÍþ¾ÿ$ÿþ²ÍÍþÂÿ$ÿþ¯ÍÍþÆÿ$ÿþ­ÍÍþÉÿ$ÿþªÍÍ%ÿþ§ÍÍþ ÿ#ÿþ¤ÍÍþ¦ÿ#ÿþ¢ÍÍþªÿ#ÿþàÍÍþ­ÿ$ÿÍþ¯ÿ$ÿþÌÍÍþ±ÿ$ÿþËÍÍþ³ÿ$ÿþÉÍÍþµÿ$ÿþÈÍÍþ·ÿ$ÿþÇÍÍþ¹ÿ$ÿþÇÍÍþ»ÿ$ÿþÇÍÍþ½ÿ$ÿþÈÍÍþ¿ÿ$ÿþÈÍÍþÁÿ$ÿþÉÍÍþÂÿ$ÿþÉÍÍþÄÿ$ÿþÊÍÍþÅÿ$ÿþÊÍÍþÇÿ$ÿþËÍÍ#ÿþãÿ=ÿþÖÿ=ÿþÉÿ=ÿþ¼ÿ=ÿþ¯ÿ>ÿþûÿ=ÿþîÿ=ÿþáÿ=ÿþÔÿ=ÿþÇÿ=ÿþºÿ=ÿþÈÿ>ÿþøÿ=ÿþëÿ=ÿþßÿ=ÿþÑÿ=ÿþÈÿ=ÿþÀÿ=ÿþ¸ÿ=ÿþ¯ÿ>ÿþþÿ=ÿþ÷ÿ=ÿþïÿ=ÿþçÿ=ÿþßÿ=ÿþÖÿ=ÿþÎÿÿþ´ÿ$ÿþÆÿÿþÁÿ$ÿþ¾ÿÿþÎÿ$ÿþµÿÿþÙÿ$ÿþ³ÿÿþâÿ%ÿþýÿÿþêÿ%ÿþõÿÿþòÿ%ÿþíÿÿþûÿ%ÿþåÿ=ÿþÞÿÿþ³ÿ$ÿþÚÿÿþ»ÿ$ÿþÖÿÿþÄÿ$ÿþÒÿÿþÌÿ$ÿþÎÿÿþÕÿ$ÿþËÿÿþÝÿ$ÿþÇÿÿþåÿ$ÿþÃÿÿþîÿ$ÿþ¿ÿÿþöÿ$ÿþ»ÿÿþþÿ$ÿþ¸ÿÿþ¯ÿ#ÿþ´ÿÿþ¶ÿ#ÿþ°ÿÿþ¼ÿ#ÿþÞÿÿþ¿ÿ=ÿþÃÿ$ÿþýÿÿþÆÿ$ÿþùÿÿþÊÿ$ÿþõÿÿþÍÿ$ÿþòÿÿþÐÿ$ÿþïÿÿþÔÿ$ÿþðÿÿþ×ÿ$ÿþñÿÿþÛÿ$ÿþòÿÿþßÿ$ÿþóÿÿþâÿ$ÿþôÿÿþåÿ$ÿþõÿÿþéÿ$ÿþöÿÿþìÿ$ÿþøÿÿþðÿ$ÿþùÿÿ2þ5ÿ"ÿ2þÕÿ!ÿ2þ¯ÿ!ÿ2þÿ!ÿ2þsÿ!ÿ2þZÿ!ÿ2þCÿ!ÿ2þ3ÿ!ÿ2þÍÿ ÿ2þªÿ ÿ2þŠÿ ÿ2þoÿ ÿ2þZÿ ÿ2þKÿ ÿ2þ=ÿ ÿ2þ3ÿ ÿ2þÞÿÿ2þÅÿÿ2þ®ÿÿ2þ™ÿÿ2þ†ÿÿ2þtÿÿ2þdÿÿ2þTÿÿ2þFÿÿ2þ9ÿÿ2 ÿ2þÖÿÿ2þ½ÿÿ2þ§ÿÿ2þ“ÿÿ2þ€ÿÿ2þoÿÿ2þbÿÿ2þZÿÿ2þTÿÿ2þNÿÿ2þHÿÿ2þBÿÿ2þ<ÿÿ2þ7ÿÿ 2ÿ 2ÿ 2þäÿÿ 2þÙÿÿ 2þÍÿÿ 2þÃÿÿ 2þºÿÿ 2þ¯ÿÿ 2þ¦ÿÿ 2þžÿÿ 2þ•ÿÿ 2þŒÿÿ 2þ…ÿÿ 2þ‚ÿÿ 2þ„ÿÿ 2þ†ÿÿ 2þˆÿÿ 2þ‹ÿÿ 2þÿÿ 2þÿÿ 2þ“ÿÿ 2þ•ÿÿ 2þ˜ÿÿLþNÿ"ÿLþÜÿ!ÿLþ»ÿ!ÿLþŸÿ!ÿLþ†ÿ!ÿLþpÿ!ÿLþ[ÿ!ÿLþMÿ!ÿLþÖÿ ÿLþ¶ÿ ÿLþšÿ ÿLþ‚ÿ ÿLþpÿ ÿLþbÿ ÿLþVÿ ÿL!ÿLþåÿÿLþÎÿÿLþºÿÿLþ¨ÿÿLþ—ÿÿLþ‡ÿÿLþxÿÿLþkÿÿLþ^ÿÿLþRÿÿL ÿLþÝÿÿLþÇÿÿLþ´ÿÿLþ¢ÿÿLþ‘ÿÿLþ‚ÿÿLþvÿÿLþpÿÿLþjÿÿLþeÿÿLþ_ÿÿLþZÿÿLþUÿÿLþPÿÿ Lÿ Lÿ Lþéÿÿ Lþàÿÿ LþÖÿÿ LþÍÿÿ LþÄÿÿ Lþ»ÿÿ Lþ³ÿÿ Lþ«ÿÿ Lþ¤ÿÿ Lþœÿÿ Lþ•ÿÿ Lþ“ÿÿ Lþ•ÿÿ Lþ—ÿÿ Lþ™ÿÿ Lþ›ÿÿ Lþÿÿ Lþ ÿÿ Lþ¢ÿÿ Lþ¤ÿÿ Lþ¦ÿÿÍþÌÿ"ÿÍþ¤ÿ!ÿÍþ­ÿ!ÿÍþµÿ!ÿÍþ½ÿ!ÿÍþÃÿ!ÿÍþÉÿ!ÿÍ"ÿÍþ¦ÿ ÿÍþ¯ÿ ÿÍþ·ÿ ÿÍþ¾ÿ ÿÍþÃÿ ÿÍþÇÿ ÿÍþÊÿ ÿÍ!ÿÍþ¢ÿÿÍþ¨ÿÿÍþ®ÿÿÍþ³ÿÿÍþ¸ÿÿÍþ¼ÿÿÍþÀÿÿÍþÄÿÿÍþÈÿÿÍþËÿÿÍ ÿÍþ¤ÿÿÍþªÿÿÍþ¯ÿÿÍþµÿÿÍþ¹ÿÿÍþ¾ÿÿÍþÁÿÿÍþÃÿÿÍþÄÿÿÍþÆÿÿÍþÇÿÿÍþÉÿÿÍþÊÿÿÍþÌÿÿ Íÿ Íÿ Íþ ÿÿ Íþ£ÿÿ Íþ¦ÿÿ Íþ¨ÿÿ Íþ«ÿÿ Íþ­ÿÿ Íþ°ÿÿ Íþ²ÿÿ Íþ´ÿÿ Íþ¶ÿÿ Íþ¸ÿÿ Íþ¹ÿÿ Íþ¸ÿÿ Íþ¸ÿÿ Íþ·ÿÿ Íþ·ÿÿ Íþ¶ÿÿ Íþµÿÿ Íþµÿÿ Íþ´ÿÿ Íþ³ÿÿÿþýÿ(ÿþ³ÿ'ÿþÀÿ'ÿþÍÿ'ÿþÚÿ'ÿþçÿ'ÿþôÿ'ÿþþÿ(ÿþµÿ'ÿþÂÿ'ÿþÏÿ'ÿþÜÿ'ÿþçÿ'ÿþïÿ'ÿþøÿRÿþ°ÿ'ÿþ¸ÿ'ÿþÁÿ'ÿþÉÿ'ÿþÑÿ'ÿþÙÿ'ÿþâÿ'ÿþêÿ'ÿþòÿ'ÿþûÿRÿþ³ÿ'ÿþ»ÿ'ÿþÃÿ'ÿþÌÿ'ÿþÔÿ'ÿþÜÿ'ÿþãÿ'ÿþçÿ'ÿþêÿ'ÿþîÿ'ÿþñÿ'ÿþõÿ'ÿþøÿ'ÿþüÿ|ÿþ®ÿ'ÿþ²ÿ'ÿþµÿ'ÿþ¹ÿ'ÿþ¼ÿ'ÿþÀÿ'ÿþÄÿ'ÿþÇÿ'ÿþËÿ'ÿþÎÿ'ÿþÒÿ'ÿþÓÿ'ÿþÒÿ'ÿþÑÿ'ÿþÐÿ'ÿþÏÿ'ÿþÎÿ'ÿþÍÿ'ÿþÌÿ'ÿþËÿ'ÿþÊÿÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ&ÿ ÿþ®‡ ‡þ¤Ã Ãÿþ‹‡ ‡ý‰¾ÃÃÿþ´‡ ‡þ ÃÃÿþ‡ ‡ýˆ»ÃÃÿþ»‡ ‡þœÃÃÿþ‡ ‡þ¸ÃÃÿþ‡ ‡þ™ÃÃÿþ”‡ ‡þµÃÃÿþʇ ‡þ•ÃÃÿþ˜‡ ‡þ²ÃÃÿþÒ‡ ‡þ’ÃÃÿþ‡ ‡þ®ÃÃÿþÛ‡ ‡ýÂÃÃÿþ£‡ ‡þªÃÃÿý∇ ‡ýÁÃÃÿþ©‡ ‡þ¦ÃÃÿýõ‰‡ ‡ý‹¿ÃÃÿþ°‡ ‡þ£ÃÃÿþ‹‡ ‡ý‰½ÃÃÿþ¶‡ ‡þŸÃÃÿþ‡ ‡ýˆ»ÃÃÿþ½‡ ‡þœÃÃÿþ‘‡ ‡þ¸ÃÃÿþć ‡þ˜ÃÃÿþ•‡ ‡þ´ÃÃÿþ̇ ‡þ”ÃÃÿþ™‡ ‡þ±ÃÃÿþÔ‡ ‡þ‘ÃÃÿþŸ‡ ‡þ­ÃÃÿþ܇ ‡ýŽÂÃÃÿþ¤‡ ‡þ©ÃÃÿý䈇 ‡ýŒÁÃÃÿþ«‡ ‡þ¦ÃÃÿýøŠ‡ ‡ýŠ¿ÃÃÿþ±‡ ‡þ¢Ãà ÿþŒ‡ ‡ý‰½Ã à ÿþ¸‡ ‡þžÃ Ã!ÿþއ ‡ýˆºÃ Ã!ÿþ¿‡ ‡þ›Ã Ã"ÿþ’‡ ‡þ·Ã Ã"ÿþƇ ‡þ—à Ã#ÿþ–‡ ‡þ´Ã Ã#ÿþ· ‡þ”à Ã$ÿþš‡ ‡þ°Ã Ã$ÿþׇ ‡þà Ã%ÿþ ‡ ‡þ¬ÃÃ%ÿþÞ‡ ‡ýŽÂÃÃ&ÿþ¦‡ ‡þ¨ÃÃ&ÿý則 ‡ýŒÀÃÃ'ÿþ¬‡ ‡þ¥ÃÃ'ÿýýЇ ‡ýоÃÃ(ÿþ²‡ ‡þ¡ÃÃ)ÿþŒ‡ ‡ýˆ¼ÃÃ)ÿþº‡ ‡þÃÃ*ÿþ‡ ‡þ¹ÃÃ*ÿþÁ‡ ‡þšÃÃ+ÿþ’‡ ‡þ¶ÃÃ+ÿþȇ ‡þ–ÃÃ,ÿþ—‡ ‡þ³ÃÃ,ÿþЇ ‡þ“ÃÃ-ÿþœ‡ ‡ü¯ÃÃÿ,ÿþ؇ ‡üÂÃÿ-ÿþ¡‡ ‡ý«Ãÿ-ÿýàˆ‡ ‡þÁ ÿþâÓ ÓþÕØ ØÿþÔÓ ÓþרØÿþäÓ ÓþÕØØÿþÕÓ ÓþרØÿþçÓ ÓþÕØØÿþÖÓ ÓþרØÿþéÓ ÓþÔØØÿþØÓ ÓþרØÿþìÓ ÓþÔØØÿþÙÓ ÓþÖØØÿþïÓ ÓþÔØØÿþÛÓ ÓþÖØØÿþòÓ ÓþÔØØÿþÞÓ ÓþÖØØÿþõÓ ÓØÿþàÓ ÓþÕØØÿýûÔÓ ÓþרØÿþâÓ ÓþÕØØÿþÕÓ ÓþרØÿþåÓ ÓþÕØØÿþÕÓ ÓþרØÿþçÓ ÓþÕØØÿþ×Ó ÓþרØÿþêÓ ÓþÔØØÿþØÓ ÓþרØÿþíÓ ÓþÔØØÿþÚÓ ÓþÖØØÿþðÓ ÓþÔØØÿþÜÓ ÓþÖØØÿþóÓ ÓþÔØØÿþÞÓ ÓþÖØØÿþöÓ ÓþרØÿþàÓ ÓþÕØØÿýüÔÓ ÓþרØÿþãÓ ÓþÕØØ ÿþÕÓ Óþר Ø ÿþåÓ ÓþÕØ Ø!ÿþÖÓ Óþר Ø!ÿþèÓ ÓþÕØ Ø"ÿþ×Ó Óþר Ø"ÿþëÓ ÓþÔØ Ø#ÿþÙÓ ÓþÖØ Ø#ÿþîÓ ÓþÔØ Ø$ÿþÚÓ ÓþÖØ Ø$ÿþñÓ ÓþÔØ Ø%ÿþÜÓ ÓþÖØØ%ÿþôÓ ÓþÔØØ&ÿþßÓ ÓþÖØØ&ÿýöÔÓ ÓþרØ'ÿþáÓ ÓþÕØØ'ÿýþÔÓ ÓþרØ(ÿþãÓ ÓþÕØØ)ÿþÕÓ ÓþרØ)ÿþæÓ ÓþÕØØ*ÿþÖÓ ÓþרØ*ÿþéÓ ÓþÔØØ+ÿþ×Ó ÓþרØ+ÿþìÓ ÓþÔØØ,ÿþÙÓ ÓþÖØØ,ÿþîÓ ÓþÔØØ-ÿþÛÓ ÓüÖØØÿ,ÿþòÓ ÓüÔØØÿ-ÿþÝÓ ÓýÖØÿ-ÿþôÓ ÓØ ÿþaD Dþ+ ÿþGD DýBÿþeD Dþ.ÿþHD DýCÿþjD Dþ1ÿþKD DþÿþpD Dþ4ÿþMD DþÿþvD Dþ7ÿþQD Dþÿþ{D Dþ:ÿþTD Dþ"ÿþD Dý=ÿþYD Dþ%ÿý‡ED Dý?ÿþ]D Dþ(ÿýÌFD DýAÿþbD Dþ+ÿþGD DýBÿþgD Dþ/ÿþID DýCÿþlD Dþ2ÿþKD DþÿþqD Dþ5ÿþND DþÿþwD Dþ8ÿþQD Dþÿþ}D Dþ;ÿþUD Dþ#ÿþƒD Dý>ÿþYD Dþ&ÿýˆED Dý?ÿþ^D Dþ)ÿýÛFD DýAÿþcD Dþ, ÿþGD DýC  ÿþhD Dþ0 !ÿþID DýC !ÿþmD Dþ3 "ÿþLD Dþ "ÿþsD Dþ6 #ÿþOD Dþ #ÿþxD Dþ9 $ÿþRD Dþ  $ÿþD Dþ< %ÿþVD Dþ#%ÿþ„D Dý>&ÿþ[D Dþ'&ÿý‰ED Dý@'ÿþ_D Dþ*'ÿýôFD DýA(ÿþdD Dþ-)ÿþHD DýC)ÿþiD Dþ0*ÿþJD Dþ*ÿþnD Dþ3+ÿþLD Dþ+ÿþtD Dþ7,ÿþPD Dþ,ÿþzD Dþ:-ÿþSD Dü!ÿ,ÿþ€D Dü<ÿ-ÿþWD Dý$ÿ-ÿþ…D Dþ? ÿþÙÿ>ÿþûÿ=ÿþÔÿ>ÿþøÿ=ÿþÎÿ>ÿþõÿ=ÿþÉÿ>ÿþñÿ=ÿþÄÿ>ÿþíÿ=ÿþ¾ÿ>ÿþèÿ=ÿþ¹ÿ>ÿþâÿ=ÿýµþÿ=ÿþÝÿ=ÿýÕýÿ=ÿþØÿ>ÿþúÿ=ÿþÒÿ>ÿþøÿ=ÿþÍÿ>ÿþôÿ=ÿþÈÿ>ÿþðÿ=ÿþÂÿ>ÿþìÿ=ÿþ½ÿ>ÿþæÿ=ÿþ¸ÿ>ÿþáÿ=ÿý´þÿ=ÿþÜÿ=ÿýßüÿ=ÿþ×ÿ>ÿþúÿ=ÿþÑÿ>ÿþ÷ÿ=ÿþÌÿ>ÿþóÿ=ÿþÆÿ>ÿþïÿ=ÿþÁÿ>ÿþëÿ=ÿþ¼ÿ>ÿþåÿ=ÿþ·ÿ>ÿþàÿ=ÿý³ýÿ=ÿþÚÿ=ÿýôüÿ=ÿþÕÿ>ÿþùÿ=ÿþÐÿ>ÿþöÿ=ÿþËÿ>ÿþóÿ=ÿþÅÿ>ÿþîÿ=ÿþÀÿ>ÿþéÿ=ÿþ»ÿ>ÿþäÿ=ÿý¶þÿ ÿÃþ–‡4‡þ®ÃÃþ¶‡4‡ýÂÃÃþ™‡4‡þªÃÃþ¹‡4‡ýÁÃÃþ‡4‡þ¦ÃÃý¼ˆ‡3‡ý‹¿ÃÃþ¡‡4‡þ£ÃÃý¾Š‡3‡ý‰½ÃÃþ¤‡4‡þŸÃÃýÀ‹‡3‡ýˆ»ÃÃþ¨‡4‡þœÃÃýÁއ4‡Ãþ¬‡4‡ Ãþ‡3‡ Ãþ¯‡3‡ Ãþ“‡2‡ Ãþ³‡2‡ Ãþ—‡1‡ Ãþ·‡1‡ Ãþš‡0‡ Ãýºˆ‡/‡ Ãþž‡/‡ Ãý¼‰‡.‡Ãþ¢‡.‡Ãý¿Š‡-‡Ãþ¥‡-‡ÃýÀŒ‡,‡Ãþ©‡,‡ÃýÂŽ‡+‡Ãþ­‡+‡Ãþ‘‡*‡Ãþ°‡*‡Ãþ”‡)‡Ãþ´‡)‡Ãþ˜‡(‡Ãþ·‡(‡Ãþ›‡'‡Ãýºˆ‡&‡ÃþŸ‡&‡Ãý½‰‡%‡Ãþ¢‡%‡Ãý¿‹‡$‡Ãþ¦‡$‡ÃýÁŒ‡#‡Ãþª‡#‡Ãý‡"‡Ãþ®‡"‡Ãþ’‡!‡Ãþ±‡!‡Ãþ•‡ ‡Ãþµ‡ ‡Ãþ˜‡‡Ãþ¸‡‡Ãþœ‡‡Ãý»ˆ‡‡Ãþ ‡‡Ãý½‰‡‡ Ãþ£‡‡ ÃýÀ‹‡‡!Ãþ§‡‡!ÃýÁ‡‡"Ãþ«‡‡"Ãý‡‡#Ãþ¯‡‡ØþÔÓ4ÓþÖØØþ×Ó4ÓþÔØØþÔÓ4ÓþÖØØþ×Ó5ÓØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÖÓ4ÓþÕØØþÔÓ4ÓØþÖÓ4Ó ØþÔÓ3Ó ØþÖÓ3Ó ØþÔÓ2Ó ØþÖÓ2Ó ØþÔÓ1Ó Øþ×Ó1Ó ØþÔÓ0Ó Øþ×Ó0Ó ØþÕÓ/Ó Øþ×Ó/ÓØþÕÓ.ÓØþ×Ó.ÓØþÕÓ-ÓØþ×Ó-ÓØþÖÓ,ÓØþÔÓ+ÓØþÖÓ+ÓØþÔÓ*ÓØþÖÓ*ÓØþÔÓ)ÓØþ×Ó)ÓØþÔÓ(ÓØþ×Ó(ÓØþÕÓ'ÓØþ×Ó'ÓØþÕÓ&ÓØþ×Ó&ÓØþÕÓ%ÓØþ×Ó%ÓØþÕÓ$ÓØ%ÓØþÖÓ#ÓØþÔÓ"ÓØþÖÓ"ÓØþÔÓ!ÓØþÖÓ!ÓØþÔÓ ÓØþ×Ó ÓØþÔÓÓØþ×ÓÓØþÕÓÓØþ×ÓÓØþÕÓÓØþ×ÓÓ ØþÕÓÓ Øþ×ÓÓ!ØþÖÓÓ"ØÓ"ØþÖÓÓ#ØþÔÓÓ#ØþÖÓÓþ7D4Dþ"þD4Dý=þ4D4Dþ%þD4Dý?þ1D4Dþ(ýCD3DýAþ-D4Dþ+ýBD3DýBþ*D4Dþ/ý@D3DýCþ'D4Dþ2ý>D4Dþ$D4D þD+Dþ#D+Dþ;D*Dþ D*Dþ8D)DþD)Dþ5D(DþD(Dþ2D'DýCD&Dþ/D&DýBD%Dþ,D%DýAD$Dþ(D$Dý?D#Dþ%D#Dý=D"Dþ"D"Dþ;D!DþD!Dþ8D DþD Dþ5DDþDDþ1DDýCDDþ.DDýBDD þ+DD ý@DD!þ(DD!ý?DD"þ$DD"ýD Dþ…ÿÿþ#D DþWÿÿ þ"þ"DDþ&#þ:DDý@"þDDþ*#þ7DDýA"þDDþ-#þ4DDýC"þDDþ0#þ1DDþ"ýCDDþ3#þ.DDþ"ýBDDþ7#þ+DDþ"ý@DDþ:#þ'DDþ!"ý?DDý<"þ$DDþ$"ý"þ!DDþ'#þ:DDý@"þDDþ*#þ7DDýB"þDDþ.#þ3DDýC"þDDþ1#þ0DDþ"þDDþ4#Dþ"Dþ7"-ÿýþ¶ÿ=ÿþäÿ>ÿþ»ÿ=ÿþéÿ>ÿþÀÿ=ÿþîÿ>ÿþÅÿ=ÿþóÿ>ÿþËÿ=ÿþöÿ>ÿþÐÿ=ÿþùÿ>ÿþÕÿ=ÿýüôÿ=ÿþÚÿ=ÿýý¸ÿ=ÿþàÿ>ÿþ·ÿ=ÿþåÿ>ÿþ¼ÿ=ÿþêÿ>ÿþÁÿ=ÿþïÿ>ÿþÆÿ=ÿþóÿ>ÿþÌÿ=ÿþ÷ÿ>ÿþÑÿ=ÿþúÿ>ÿþÖÿ=ÿýüêÿ=ÿþÜÿ=ÿþþÿ¿ÿ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃ(ÿþ°‡ ‡þ•ÃÃþäÿ&ÿþ°‡ ‡þ•ÃÃþ¥ÿ&ÿþ°‡ ‡þ•ÃÃý‡Ýÿ%ÿþ°‡ ‡þ•ÃÃý‡Ÿÿ%ÿþ°‡ ‡þ•ÃÇþÕÿ$ÿþ°‡ ‡þ•ÃÇþ™ÿ$ÿþ°‡ ‡þ•ÃÇþÌÿ#ÿþ°‡ ‡þ•ÃÇþ•ÿ#ÿþ°‡ ‡þ•ÃÇþÅÿ"ÿþ°‡ ‡þ•ÃÇþ‘ÿ"ÿþ°‡ ‡þ•ÃÇþ½ÿ!ÿþ°‡ ‡þ•ÃÇþŽÿ!ÿþ°‡ ‡þ•ÃÇþ¶ÿ ÿþ°‡ ‡þ•ÃÇþ‹ÿ ÿþ°‡ ‡þ•ÃÇþ°ÿÿþ°‡ ‡þ•ÃÇý‰õÿÿþ°‡ ‡þ•ÃÇþ©ÿÿþ°‡ ‡þ•ÃÇýˆãÿÿþ°‡ ‡þ•ÃÇþ£ÿÿþ°‡ ‡þ•Ãà ‡þÛÿÿþ°‡ ‡þ•Ãà ‡þžÿÿþ°‡ ‡þ•Ãà ‡þÓÿÿþ°‡ ‡þ•Ãà ‡þ˜ÿÿþ°‡ ‡þ•Ãà ‡þËÿÿþ°‡ ‡þ•Ãà ‡þ”ÿÿþ°‡ ‡þ•Ãà ‡þÃÿÿêåÝÕÍž¸°ª£–‹…ytojy‡ ‡þ•Ãà ‡útcTG:22þa‡ ‡þ•Ãà ‡þX22þa‡ ‡þ•ÃÃþˆ‡ ‡ý€622þa‡ ‡þ•ÃÃþ¡‡ ‡þ]22þa‡ ‡þ•ÃÃý¾Š‡ ‡ýƒ922þa‡ ‡þ•ÃÃþ¥‡ ‡þb22þa‡ ‡þ•ÃÃ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØ(ÿþâÓ ÓþÔØØþöÿ&ÿþâÓ ÓþÔØØþÞÿ&ÿþâÓ ÓþÔØØýÓóÿ%ÿþâÓ ÓþÔØØýÓÜÿ%ÿþâÓ ÓþÔØØÓþðÿ$ÿþâÓ ÓþÔØØÓþÚÿ$ÿþâÓ ÓþÔØØÓþíÿ#ÿþâÓ ÓþÔØØÓþØÿ#ÿþâÓ ÓþÔØØÓþêÿ"ÿþâÓ ÓþÔØØÓþ×ÿ"ÿþâÓ ÓþÔØØÓþçÿ!ÿþâÓ ÓþÔØØÓþÖÿ!ÿþâÓ ÓþÔØØÓþåÿ ÿþâÓ ÓþÔØØÓþÕÿ ÿþâÓ ÓþÔØØÓþâÿÿþâÓ ÓþÔØØÓýÔûÿÿþâÓ ÓþÔØØÓþàÿÿþâÓ ÓþÔØØÓþõÿÿþâÓ ÓþÔØØÓþÞÿÿþâÓ ÓþÔØØ ÓþóÿÿþâÓ ÓþÔØØ ÓþÛÿÿþâÓ ÓþÔØØ ÓþïÿÿþâÓ ÓþÔØØ ÓþÙÿÿþâÓ ÓþÔØØ ÓþíÿÿþâÓ ÓþÔØØ ÓþØÿÿþâÓ ÓþÔØØ ÓþêÿÿêêäÜÖÎȼ¶°«¥ ›•‹‡‚~®Ó ÓþÔØØ Óù͈xk^SLLþ–Ó ÓþÔØØ ÓþˆLLþ–Ó ÓþÔØØ ÓýÈSLLþ–Ó ÓþÔØØþÕÓ ÓþLLþ–Ó ÓþÔØØþ×Ó ÓýÍWLLþ–Ó ÓþÔØØþÕÓ Óþ˜LLþ–Ó ÓþÔØØ(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7(ÿþbD Dþ7þˆÿ&ÿþbD Dþ7þZÿ&ÿþbD Dþ7ýDƒÿ%ÿþbD Dþ7ýDUÿ%ÿþbD Dþ7Dþ}ÿ$ÿþbD Dþ7DþQÿ$ÿþbD Dþ7Dþwÿ#ÿþbD Dþ7DþNÿ#ÿþbD Dþ7Dþqÿ"ÿþbD Dþ7DþKÿ"ÿþbD Dþ7Dþlÿ!ÿþbD Dþ7DþIÿ!ÿþbD Dþ7Dþgÿ ÿþbD Dþ7DþGÿ ÿþbD Dþ7DþbÿÿþbD Dþ7DýFÌÿÿþbD Dþ7Dþ]ÿÿþbD Dþ7DýE‡ÿÿþbD Dþ7DþYÿÿþbD Dþ7 Dþ‚ÿÿþbD Dþ7 DþUÿÿþbD Dþ7 Dþ|ÿÿþbD Dþ7 DþQÿÿþbD Dþ7 DþvÿÿþbD Dþ7 DþMÿÿþbD Dþ7 Dþpÿÿê ¢¤¦¨ª«­¯±²´µ·¸¹»¼¾¿xD Dþ7 DùO¹ÁÄÈËÍÍþ‚D Dþ7 DþÍÍþ‚D Dþ7þCD DýOÆÍÍþ‚D Dþ7þ-D DþˆÍÍþ‚D Dþ7ýAD DýJÂÍÍþ‚D Dþ7þ*D Dþ€ÍÍþ‚D Dþ7(ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿ=ÿþ×ÿÿþ´ÿ&ÿþ×ÿÿþáÿ&ÿþ×ÿÿþ¸ÿ%ÿþ×ÿÿþæÿ%ÿþ×ÿÿþ½ÿ$ÿþ×ÿÿþìÿ$ÿþ×ÿÿþÂÿ#ÿþ×ÿÿþðÿ#ÿþ×ÿÿþÇÿ"ÿþ×ÿÿþôÿ"ÿþ×ÿÿþÍÿ!ÿþ×ÿÿþ÷ÿ!ÿþ×ÿÿþÒÿ ÿþ×ÿÿþúÿ ÿþ×ÿÿþØÿÿþ×ÿÿýüÕÿÿþ×ÿÿþÝÿÿþ×ÿÿýþ´ÿÿþ×ÿÿþâÿÿþ×ÿÿþ¹ÿÿþ×ÿÿþèÿÿþ×ÿÿþ¾ÿÿþ×ÿÿþíÿÿþ×ÿ ÿþÃÿÿþ×ÿ ÿþñÿÿþ×ÿ!ÿþÉÿÿê®°³µ¸»½ÀÂÅÇÊÍÏÒÔ×ÙÜßñÿ!ÿùúÛâêòúÿlÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dÿÿÿÿÿÿÿ ‡þ°ÃÃþ­ÿÿ ‡þ±ÃÃþ¬ÿÿ ‡þ±ÃÃþ¬ÿÿ ‡þ²ÃÃþ«ÿÿ ‡þ³ÃÃþ«ÿÿ ‡þ²ÃÃþ«ÿÿ ‡þ²ÃÃþ¬ÿÿ ‡þ±ÃÃþ¬ÿÿ ‡þ°ÃÃþ­ÿÿ ‡þ°ÃÃþ®ÿÿ ‡þ¯ÃÃþ®ÿÿ ‡þ¯ÃÃþ¯ÿÿ ‡þ®ÃÃþ¯ÿÿþˆ‡ ‡þ®ÃÃþ°ÿÿþ‰‡ ‡þ­ÃÃþ±ÿÿþЇ ‡þ¬ÃÃþ²ÿÿþŒ‡ ‡þ«ÃÃþ´ÿÿþއ ‡þ©ÃÃþµÿÿþ‡ ‡þ¨ÃÃþ·ÿÿþ“‡ ‡þ¦ÃÃþ¹ÿÿþ•‡ ‡þ¥ÃÃþºÿÿþ—‡ ‡þ£ÃÃþ¼ÿÿþš‡ ‡þ¢ÃÃþ½ÿÿþ‡ ‡þ ÃÃþ¿ÿÿþŸ‡ ‡þžÃÃþÁÿÿþ¢‡ ‡þÃÃÿþ¤‡ ‡þšÃÃÿþ©‡ ‡þ˜ÃÃÿþ­‡ ‡þ•ÃÃÿþ²‡ ‡þ’ÃÃÿþ·‡ ‡þÃÃÿþ¼‡ ‡þÃÃÿþ‡ ‡þŠÃÃÿþLJ ‡þˆÃÃÿþ͇ ‡þÁÃÃÿþÓ‡ ‡þ¾ÃÃÿþ܇ ‡þºÃÃÿþå‡ ‡þ¶ÃÃÿ ‡þ²ÃÃÿ ‡þ¯ÃÃÿþЇ ‡þ«ÃÃÿþ‡ ‡þ§ÃÃÿþ”‡ ‡þ£ÃÃÿþš‡ ‡þ ÃÃÿþŸ‡ ‡þœÃÃÿþ¥‡ ‡þ˜ÃÃÿþ®‡ ‡þ“ÃÃÿþ·‡ ‡þŽÃÃÿþÁ‡ ‡þ‰ÃÃÿþʇ ‡þÁÃÃÿþÕ‡ ‡þ¼ÃÃÿþà‡ ‡þ¸ÃÃÿ ‡þ³ÃÃÿ ‡þ®ÃÃÿþŒ‡ ‡þ©ÃÃÿþ“‡ ‡þ¤ÃÃÿþ›‡ ‡þÃÃÿþ¤‡ ‡þ—ÃÃÿþ¯‡ ‡þ‘ÃÃÿþº‡ ‡þ‹ÃÃÿþƇ ‡þÁÃÃÿþÓ‡ ‡þ»ÃÃÿþ⇠‡þµÃÃÿ ‡þ®ÃÃÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿ ÓþÖØØþÖÿÿþÔÓ ÓþÖØØþÖÿÿþÔÓ ÓþÖØØþÖÿÿþÕÓ ÓþÖØØþÖÿÿþÖÓ ÓþÖØØþ×ÿÿþ×Ó ÓþÖØØþ×ÿÿþ×Ó ÓþÕØØþ×ÿÿþØÓ ÓþÕØØþ×ÿÿþÙÓ ÓþÕØØþ×ÿÿþÚÓ ÓþÕØØþ×ÿÿþÛÓ ÓþÕØØþ×ÿÿþÜÓ ÓþÕØØþ×ÿÿþÝÓ ÓþÕØØÿþÞÓ ÓþÕØØÿþàÓ ÓþÔØØÿþáÓ ÓþÔØØÿþãÓ ÓþÔØØÿþåÓ ÓþÔØØÿþçÓ Ó ØÿþéÓ Ó ØÿþëÓ Ó ØÿþíÓ Ó ØÿþðÓ ÓþרØÿþóÓ ÓþרØÿþöÓ ÓþרØÿ ÓþÖØØÿ ÓþÖØØÿþÔÓ ÓþÖØØÿþÖÓ ÓþÖØØÿþØÓ ÓþÕØØÿþÚÓ ÓþÕØØÿþÜÓ ÓþÕØØÿþÞÓ ÓþÔØØÿþâÓ ÓþÔØØÿþåÓ ÓþÔØØÿþéÓ ÓØÿþìÓ ÓØÿþðÓ ÓþרØÿþõÓ ÓþרØÿ ÓþÖØØÿ ÓþÖØØÿþÕÓ ÓþÖØØÿþ×Ó ÓþÕØØÿþÚÓ ÓþÕØØÿþÞÓ ÓþÔØØÿþâÓ ÓþÔØØÿþæÓ ÓØÿþëÓ ÓØÿþïÓ ÓþרØÿþõÓ ÓþרØÿ ÓþÖØØÿ Dþþ"ÿÿ Dþþ#ÿÿ Dþþ#ÿÿ Dþþ$ÿÿ Dþþ$ÿÿ Dþþ$ÿÿ Dþþ#ÿÿ Dþþ#ÿÿ Dþþ"ÿÿ Dþ þ"ÿÿ Dþ þ!ÿÿ Dþ!þ!ÿÿ Dþ!þ ÿÿþED Dþ"þ ÿÿþED Dþ"þÿÿþFD Dþ#þÿÿþGD Dþ%þÿÿþID Dþ&þÿÿþKD Dþ'þÿÿþMD Dþ)þÿÿþND Dþ*þÿÿþPD Dþ+þÿÿþRD Dþ-þÿÿþTD Dþ.þÿÿþVD Dþ/þÿÿþXD Dþ1ÿþYD Dþ3ÿþ]D Dþ5ÿþ`D Dþ8ÿþdD Dþ:ÿþgD Dþ<ÿþkD Dþ?ÿþoD DþAÿþsD DþCÿþxD Dþÿþ|D Dþÿþ‚D Dþÿþ‰D Dþÿ Dþÿ Dþ!ÿþFD Dþ$ÿþJD Dþ(ÿþND Dþ+ÿþRD Dþ.ÿþVD Dþ1ÿþZD Dþ5ÿþaD Dþ:ÿþgD Dþ>ÿþnD DþBÿþvD Dþÿþ}D Dþÿþ†D Dþÿ Dþÿ Dþ!ÿþHD Dþ&ÿþMD Dþ+ÿþRD Dþ0ÿþYD Dþ6ÿþaD Dþ;ÿþiD DþAÿþrD Dþÿþ|D Dþÿþ‡D Dþÿ Dþ!Qÿþþÿ=ÿþýÿ=ÿþüÿ=ÿþúÿ=ÿþ÷ÿ=ÿþõÿ=ÿþòÿ=ÿþðÿ=ÿþíÿ=ÿþëÿ=ÿþèÿ=ÿþæÿ=ÿþäÿ=ÿþáÿ=ÿþÝÿ=ÿþÙÿ=ÿþÖÿ=ÿþÑÿ=ÿþÎÿ=ÿþÊÿ=ÿþÆÿ=ÿþÂÿ=ÿþ¾ÿ=ÿþ¹ÿ=ÿþ³ÿ¿ÿþüÿ=ÿþöÿ=ÿþñÿ=ÿþëÿ=ÿþæÿ=ÿþàÿ=ÿþÙÿ=ÿþÑÿ=ÿþËÿ=ÿþÄÿ=ÿþ½ÿ=ÿþ¶ÿ¿ÿþùÿ=ÿþòÿ=ÿþêÿ=ÿþáÿ=ÿþØÿ=ÿþÐÿ=ÿþÇÿ=ÿþ¾ÿ=ÿþµÿjÿ=‡ýžÃ‡<‡ýžÃ‡<‡ýŸÃ‡<‡ýŸÃ‡<‡ý Ã‡<‡ýŸÃ‡<‡ýŸÃ‡<‡ýžÃ‡<‡ýžÃ‡<‡ýÇ<‡ýÇ<‡ýÇ<‡ýœÃ‡<‡ý›Ã‡<‡ýšÃ‡<‡ý™Ã‡<‡ý—Ç<‡ý–Ç<‡ý”Ç<‡ý“Ç<‡ý’Ç<‡ýÇ<‡ýÇ<‡ýŒÃ‡<‡ýŠÃ‡<‡üˆÃ‰‡<‡ýÃŒ‡<‡ýÁ‡<‡ý¾‘‡<‡ý¼”‡<‡ý¸—‡<‡ýµ™‡<‡ý²œ‡<‡ý¯ ‡<‡ý¬¤‡<‡ý©§‡<‡ý¦«‡<‡ý¢¯‡<‡ýž²‡<‡ýš¶‡<‡ý•¹‡<‡ý‘½‡<‡ý‡<‡ü‰ÃЇ<‡ýÇ<‡ýÔ‡<‡ýÙ‡<‡ýÞ‡<‡ýã‡<‡ýè‡<‡ýí‡<‡ýò‡<‡ýø‡<‡ýÿ‡<‡Ãþ‰‡;‡Ãþ‡;‡Ãþ•‡;‡Ãþ›‡;‡Ãþ¡‡;‡Ãþ¨‡;‡Ãþ­‡;‡Ãþ´‡;‡Ãþ»‡;‡=ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÕØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ<ÓýÔØÓ=ÓþØÓ=ÓþØÓ=ÓþØÓ=ÓþØÓ=Óý×ÔÓ<Óý×ÔÓ<Óý×ÔÓ<Óý×ÔÓ<Óý×ÔÓ<ÓýÖÕÓ<ÓýÖÕÓ<ÓýÖÕÓ<ÓÖ=ÓýÕÖÓ<ÓýÕÖÓ<ÓýÕÖÓ<ÓýÔ×Ó<ÓýÔ×Ó<ÓýÔ×Ó=ÓþØÓ=ÓþØÓ=ÓýØÔÓ<ÓýØÔÓ<ÓýØÔÓ<ÓýØÕÓ<ÓýØÕÓ<ÓýØÖÓ<ÓýØÖÓ<ÓýØÖÓ<ÓýØ×Ó<ÓýØ×Ó<ÓØ=ÓØþÔÓ;ÓØþÔÓ;ÓØþÕÓ;ÓØþÕÓ;ÓØþÖÓ;ÓØþÖÓ;ÓØþÖÓ;ÓØþ×Ó;Ó=Dý0Dþ0D DþQÿÿþCþ+D DþJÿÿýDþ%D DþEÿÿýDþ D DþÌÿ ÿýDþD Dþÿ ÿýD$þD Dþsÿ ÿýD*þBD Dþiÿ ÿýD0þ;D Dþ_ÿ ÿýD6þ5D DþWÿ ÿýD<þ.D DþOÿ ÿ,ÿþ½ÿ=ÿþ¼ÿ=ÿþ»ÿ=ÿþ»ÿ=ÿþºÿ=ÿþ»ÿ=ÿþ»ÿ=ÿþ¼ÿ=ÿþ½ÿ=ÿþ½ÿ=ÿþ¾ÿ=ÿþ¿ÿ=ÿþÀÿ=ÿþÂÿ=ÿþÄÿ=ÿþÆÿ=ÿþÈÿ=ÿþÊÿ=ÿþÌÿ=ÿþÎÿ=ÿþÑÿ=ÿþÔÿ=ÿþ×ÿ=ÿþÚÿ=ÿþÝÿ=ÿþàÿ=ÿþãÿ=ÿþçÿ=ÿþìÿ=ÿþñÿ=ÿþõÿ=ÿþúÿ¿ÿþßÿ=ÿþ¶ÿ=ÿþ¼ÿ=ÿþÂÿ=ÿþÈÿ=ÿþÎÿ=ÿþÔÿ=ÿþÚÿ=ÿþàÿ=ÿþèÿ=ÿþðÿ=ÿþ÷ÿ=ÿþþÿ~ÿþ·ÿ=ÿþ¿ÿ=ÿþÈÿ=ÿþÑÿ=ÿþÚÿ=ÿþãÿ=ÿþìÿ=ÿþõÿ=ÿþþÿ>ÿþÕÿ=ÿþ»ÿ=ÿþÆÿ=ÿþÐÿ=ÿþÚÿ=ÿþåÿ=ÿþïÿ ÿÿÿÿÿ¿ÿþnÿ;ÿüÖM2ÿ:ÿû¬:22ÿ9ÿý|3228ÿýáW227ÿý»@22¿ÿþÿ;ÿüÝdLÿ:ÿû¸TLLÿ9ÿþŽLL8ÿýçmLL7ÿýÆXLL¿ÿþ¾ÿ;ÿü¤ÆÍÿ:ÿû®ËÍÍÿ9ÿþºÍÍ8ÿý¡ÄÍÍ7ÿýªÉÍÍ¿ÿþÜÿ;ÿý³îÿ;ÿýÂùÿ;ÿþÖÿ;ÿý¯éÿ;ÿý¼öÿÿ~ÿþ¢ÿ<ÿý¡4ÿ;ÿü¡42ÿ:ÿû¡422ÿ9ÿý 4229ÿý 4228ÿý 4227ÿý 4226ÿý4225ÿý3224ÿþ223ÿþq2 22ÿþe2 21ÿþ[2 2/ÿýñR2 2.ÿýßJ2 2-ÿýÕD22,ÿýÈ>22+ÿý»:22*ÿý­722)ÿýŸ422(ÿý322'ÿþ22&ÿþs22%ÿþf22$ÿþ\22"ÿýõS22!ÿýßK22 ÿýÖD22ÿýÉ?22ÿý¼:22ÿý¬722ÿýŒ322ÿþm2!2ÿýèV2"2ÿýÏE2#2ÿý³:2$2ÿý“42%2ÿþt2'2ÿýøZ2(2ÿýÕI2)2ÿýº<2*2ÿý™52+2ÿþz2-2ÿþ_2.2 ÿýÚL2/2 ÿýÀ>2/2þnÿ ÿý¡62/2þ|ÿ ÿþ202þ‹ÿ ÿþd2/2ý4šÿÿýßP2/2ý6©ÿÿýÆA2/2ý9·ÿÿý¨82/2ý=Äÿÿý†32/2ýBÐÿÿýøa202ýIÜÿÿýÈF202ýPèÿÿý›7202þYÿ ÿ22þmÿ ÿ02ý3Œÿ ÿ/2ý9­ÿ ÿ.2ýCÊÿ ÿ-2ýSãÿÿ,2þiÿÿ~ÿþ¯ÿ<ÿý®Mÿ;ÿü®MLÿ:ÿû®MLLÿ9ÿý®MLL9ÿý®MLL8ÿý®MLL7ÿý®MLL6ÿý«MLL5ÿþžLL4ÿþLL3ÿþ„L L2ÿþyL L1ÿþpL L/ÿýôhL L.ÿýæbL L-ÿýÜ\LL,ÿýÑWLL+ÿýÆSLL*ÿý¹PLL)ÿý­NLL(ÿþŸLL'ÿþ’LL&ÿþ†LL%ÿþ{LL$ÿþqLL"ÿý÷iLL!ÿýæbLL ÿýÝ\LLÿýÒWLLÿýÇTLLÿý¸QLLÿý›MLLÿþL!LÿýìlL"Lÿý×]L#Lÿý¾TL$Lÿý¢NL%Lÿþ†L'LÿýúpL(LÿýÜ`L)LÿýÄUL*Lÿý¨OL+LÿþŒL-LÿþtL.L ÿýácL/L ÿýÊWL/Lþÿ ÿý®PL/Lþÿ ÿþ’L0Lþ›ÿ ÿþyL/LýM¨ÿÿýæfL/LýOµÿÿýÏYL/LýRÂÿÿýµQL/LýVÎÿÿþ—L0LýZØÿÿýúuL0Lý`ãÿÿýÑ]L0Lýfìÿÿý©PL0Lþnÿ ÿ2Lþÿ ÿ0LýM›ÿ ÿ/LýR¹ÿ ÿ.Lý[Óÿ ÿ-Lýièÿÿ,Lþ}ÿÿ~ÿþ±ÿ<ÿý±Íÿ;ÿü±ÍÍÿ:ÿþ±ÍÍ:ÿþ±ÍÍ9ÿþ±ÍÍ8ÿþ±ÍÍ7ÿþ±ÍÍ6ÿþ²ÍÍ5ÿþ¶ÍÍ4ÿþ¹ÍÍ3ÿþ½Í Í2ÿþÀÍ Í1ÿþÃÍ Í/ÿýÇÅÍ Í.ÿý¡ÇÍ Í-ÿý¤ÈÍÍ,ÿý§ÊÍÍ+ÿýªËÍÍ*ÿý®ÌÍÍ)ÿý±ÌÍÍ(ÿþµÍÍ'ÿþ¹ÍÍ&ÿþ½ÍÍ%ÿþÀÍÍ$ÿþÂÍÍ"ÿýÕÅÍÍ!ÿý¡ÇÍÍ ÿý¤ÈÍÍÿý§ÊÍÍÿýªËÍÍÿý®ÌÍÍÿþ¶Í Íÿþ¾Í!Íÿý©ÄÍ"Íÿý¥ÈÍ#Íÿý¬ËÍ$ÍÿýµÌÍ%Íÿþ¼Í'ÍÿýàÃÍ(Íÿý¤ÇÍ)Íÿý«ÊÍ*Íÿý³ÌÍ+Íÿþ»Í-ÍÿþÂÍ.Í ÿý£ÆÍ/Í ÿý©ÊÍ/Íþ¾ÿ ÿý±ÌÍ/Íþºÿ ÿþ¹Í0Íþ·ÿ ÿþÀÍ0Íþ³ÿÿý¡ÆÍ/Íý̯ÿÿý¨ÉÍ/ÍýË«ÿÿý¯ÌÍ/Íýʨÿÿþ¸Í0ÍýÉ¥ÿÿýàÁÍ0ÍýÇ¢ÿÿý§ÈÍ0ÍýÆ©ÿÿý²ÌÍ0ÍþÃÿ ÿ2Íþ¾ÿ ÿ1Íþ¶ÿ ÿ/ÍýË®ÿ ÿ.Íýɧÿ ÿ-ÍýÅ ÿÿ,Íþ¿ÿÿ~ÿþÅÿ<ÿýÆþÿ;ÿýÆþÿ;ÿýÆþÿ;ÿýÆþÿ;ÿýÆþÿ;ÿýÆþÿ;ÿýÆþÿ;ÿýÇþÿ;ÿþÍÿ<ÿþÔÿ<ÿþÛÿ<ÿþáÿ<ÿþæÿ;ÿýÈëÿ;ÿý°ðÿ;ÿý³ôÿ;ÿý·÷ÿ;ÿý¼úÿ;ÿýÁüÿ;ÿýÆþÿ;ÿþÍÿ<ÿþÔÿ<ÿþÚÿ<ÿþàÿ<ÿþæÿ;ÿýÓëÿ;ÿý°ïÿ;ÿý³óÿ;ÿý·÷ÿ;ÿý»ùÿ;ÿýÂüÿ;ÿýÏþÿ;ÿþÝÿ;ÿý³éÿ;ÿýµóÿ;ÿý¿ùÿ;ÿýÌþÿ;ÿþÚÿ;ÿýÞçÿ;ÿý³ñÿ;ÿý¼øÿ;ÿýÉýÿ;ÿþ×ÿ<ÿþäÿ;ÿý±ïÿ;ÿýº÷ÿ/ÿþÜÿ ÿýÆüÿ/ÿþÖÿ ÿþÔÿ0ÿþÏÿ ÿþáÿ/ÿýþÈÿÿý°íÿ/ÿýýÃÿÿý¸õÿ/ÿýû½ÿÿýÃûÿ/ÿýø¹ÿÿþÑÿ0ÿýõ´ÿÿýÞãÿ0ÿýñ±ÿÿý·óÿ0ÿýí³ÿÿýÈüÿ0ÿþèÿ<ÿþÝÿ;ÿýþÏÿ;ÿýûÁÿ;ÿýô·ÿ;ÿýë¯ÿ;ÿþßÿÿý¢42*2ý3¥ÿÿþ42*2ý3™ÿÿ,2þŽÿÿ+2þ‚ÿÿ*2þwÿÿ)2þmÿÿ(2þdÿÿ'2þ]ÿÿ&2þUÿÿ%2þTÿÿ$2þTÿÿ#2þTÿÿ"2þUÿÿ!2þUÿÿ 2þVÿÿ2þVÿÿ2þVÿÿ2þVÿÿ2þVÿ ÿ2þWÿ!ÿ2þWÿ"ÿ2þXÿ#ÿ2þXÿ$ÿ2þXÿ%ÿ2þXÿ&ÿ2þYÿ'ÿ2þYÿ(ÿ2þYÿ)ÿ2þYÿ*ÿ2þZÿ+ÿ2þZÿ,ÿ2þ[ÿ-ÿ2þ[ÿ.ÿ 2þ[ÿ/ÿ 2þcÿ0ÿ 2þnÿ1ÿ 2þ|ÿ2ÿ 2þ‹ÿ3ÿ2ý4™ÿ4ÿ2ý6©ÿ5ÿ2ý9·ÿ6ÿ2ý=Äÿ7ÿ2ýBÐÿ8ÿ2ýIÜÿ9ÿ2ýPèÿ:ÿý2Xÿ<ÿþcÿ=ÿþZÿ<ÿý[2ÿ;ÿü]22ÿ:ÿþ^22:ÿþ^229ÿþW227ÿýñQ226ÿýáK225ÿýÚG224ÿýÒB22ý¯ML*LýM²ÿÿþML+Lþ¨ÿÿ,Lþžÿÿ+Lþ“ÿÿ*Lþ‰ÿÿ)Lþÿÿ(Lþyÿÿ'Lþrÿÿ&Lþkÿÿ%Lþjÿÿ$Lþkÿÿ#Lþkÿÿ"Lþkÿÿ!Lþkÿÿ LþlÿÿLþlÿÿLþlÿÿLþlÿÿLþlÿ ÿLþmÿ!ÿLþmÿ"ÿLþmÿ#ÿLþmÿ$ÿLþnÿ%ÿLþnÿ&ÿLþnÿ'ÿLþnÿ(ÿLþoÿ)ÿLþoÿ*ÿLþpÿ+ÿLþpÿ,ÿLþpÿ-ÿLþpÿ.ÿ Lþqÿ/ÿ Lþwÿ0ÿ Lþÿ1ÿ Lþÿ2ÿ Lþ›ÿ3ÿLýM¨ÿ4ÿLýOµÿ5ÿLýRÂÿ6ÿLýVÎÿ7ÿLýZØÿ8ÿLý`ãÿ9ÿLýfìÿ:ÿýLnÿ<ÿþwÿ=ÿþpÿ<ÿýqLÿ;ÿürLLÿ:ÿþsLL:ÿþsLL9ÿþmLL7ÿýôgLL6ÿýçcLL5ÿýá^LL4ÿýÚZLLþ±Í,Íþ°ÿÿ-Íþ³ÿÿ,Íþ¶ÿÿ+Íþ¹ÿÿ*Íþ¼ÿÿ)Íþ¾ÿÿ(ÍþÀÿÿ'ÍþÂÿÿ&ÍþÄÿÿ%ÍþÄÿÿ$ÍþÄÿÿ#ÍþÄÿÿ"ÍþÄÿÿ!ÍþÄÿÿ ÍþÄÿÿÍþÄÿÿÍþÄÿÿÍþÄÿÿÍþÄÿ ÿÍþÄÿ!ÿÍþÄÿ"ÿÍþÄÿ#ÿÍþÄÿ$ÿÍþÃÿ%ÿÍþÃÿ&ÿÍþÃÿ'ÿÍþÃÿ(ÿÍþÃÿ)ÿÍþÃÿ*ÿÍþÃÿ+ÿÍþÃÿ,ÿÍþÃÿ-ÿÍþÃÿ.ÿ ÍþÃÿ/ÿ ÍþÁÿ0ÿ Íþ¾ÿ1ÿ Íþºÿ2ÿ Íþ·ÿ3ÿÍþ³ÿ4ÿÍý̯ÿ5ÿÍýË«ÿ6ÿÍýʨÿ7ÿÍýÉ¥ÿ8ÿÍýÇ¢ÿ9ÿÍýÆ©ÿ:ÿýÍÃÿ<ÿþÁÿ=ÿþÃÿ<ÿýÃÍÿ;ÿüÂÍÍÿ:ÿþÂÍÍ:ÿþÂÍÍ9ÿþÄÍÍ7ÿýÇÅÍÍ6ÿý¡ÇÍÍ5ÿý£ÈÍÍ4ÿý¤ÉÍÍýÅþÿ*ÿýþÄÿÿþþÿ+ÿþÉÿ<ÿþÎÿ<ÿþÓÿ<ÿþØÿ<ÿþÝÿ<ÿþáÿ<ÿþåÿ<ÿþêÿ<ÿþêÿ<ÿþêÿ<ÿþêÿ<ÿþêÿ<ÿþêÿ<ÿþéÿ<ÿþéÿ<ÿþéÿ<ÿþéÿ<ÿþéÿ<ÿþéÿ<ÿþéÿ<ÿþèÿ<ÿþèÿ<ÿþèÿ<ÿþèÿ<ÿþèÿ<ÿþèÿ<ÿþçÿ<ÿþçÿ<ÿþçÿ<ÿþçÿ<ÿþæÿ<ÿþæÿ<ÿþæÿ<ÿþâÿ<ÿþÜÿ<ÿþÖÿ<ÿþÏÿ;ÿýþÉÿ;ÿýýÃÿ;ÿýû½ÿ;ÿýø¹ÿ;ÿýõ´ÿ;ÿýñ±ÿ;ÿýí³ÿ;ÿþèÿ<ÿþâÿ=ÿþçÿ<ÿþæÿ<ÿþåÿ<ÿþåÿ<ÿþåÿ<ÿþéÿ;ÿýÈìÿ;ÿý¯ïÿ;ÿý±òÿ;ÿý´õÿÿ2ÿþ]2 21ÿþd2 20ÿþn2 2/ÿþy2 2.ÿþ„22-ÿþ22,ÿýœ322+ÿý§422*ÿý³522)ÿý½822(ÿýÇ:22'ÿýÑ>22&ÿýÚB22%ÿýáF22$ÿýõL22$ÿþR22#ÿþY22"ÿþa22!ÿþj22 ÿþt22ÿþ22ÿþ‹22ÿþ—22ÿý¢322ÿý­52 2ÿý¹72!2ÿýÃ92"2ÿýÍ<2#2ÿýÐ?2$2ÿýÑ?2%2ÿýÓA2&2ÿýÖA2'2ÿý×B2(2ÿýÙC2)2ÿýÚC2*2ÿýÜD2*2þ<ÿÿýÝE2*2ý9Âÿ ÿýÞF2*2ü6¸üÿ ÿýàG2*2û4­üüÿ ÿýáH2*2ý3¢üü ÿýãI2+2þ–üü ÿýäJ2+2þŠüü ÿýèK2+2þüüÿýíL2+2þtüüÿýñM2+2ýjûüüÿýõN2+2ýaøüüÿýøP2+2ýYôüüÿýýQ2+2ýSïüüÿþR2+2ýMéü üÿþS2+2ýGãü üÿþT2+2ýBÛü üÿþV2+2ý?Ñü üýÿW2+2ý>Îü üþX2+2ý=Ìüü,2ý=Êüü+2ý<Èüü*2ý<Çüü)2ý;Åüü(2ý:Ãüü'2ý9Áüü&2ý9¿üü%2ý9½üü$2ý8»üü#2ý8ºüü2ÿþrL L1ÿþyL L0ÿþL L/ÿþ‹L L.ÿþ•LL-ÿþ LL,ÿþªLL+ÿý´MLL*ÿý¾OLL)ÿýÇQLL(ÿýÐTLL'ÿýÙVLL&ÿýáZLL%ÿýç^LL$ÿý÷cLL$ÿþhLL#ÿþnLL"ÿþuLL!ÿþ~LL ÿþ†LLÿþLLÿþ›LLÿþ¥LLÿý¯MLLÿý¹NL LÿýÃPL!LÿýÍRL"LÿýÖUL#LÿýØWL$LÿýÙXL%LÿýÛYL&LÿýÝYL'LÿýÞZL(Lÿýà[L)Lÿýá[L*Lÿýã\L*LþTÿÿýä]L*LýRÌÿ ÿýå^L*LýPÂÿ ÿýæ_L*LýN¹ÿ ÿýç_L*LýM¯ÿ ÿýè`L+Lþ¥ÿ ÿýébL+Lþšÿ ÿýìcL+Lþÿ ÿýñcL+Lþ†ÿ ÿýôdL+Lý~þÿ ÿý÷eL+Lývüÿ ÿýúfL+Lýoøÿ ÿýýgL+Lýióÿ ÿþhL+Lýdîÿ ÿþiL+Lý^èÿ ÿþkL+LýZâÿ ÿþlL+LýWÙÿ ÿþmL+LýVÖÿ ÿþnL+LýVÕÿÿ,LýUÓÿÿ+LýUÑÿÿ*LýTÐÿÿ)LýTÎÿÿ(LýSÍÿÿ'LýSËÿÿ&LýRÉÿÿ%LýRÇÿÿ$LýRÆÿÿ#LýQÄÿÿ2ÿþÂÍ Í1ÿþÀÍ Í0ÿþ¾Í Í/ÿþ»Í Í.ÿþ¸ÍÍ-ÿþµÍÍ,ÿþ²ÍÍ+ÿþ¯ÍÍ*ÿý¬ÌÍÍ)ÿýªÌÍÍ(ÿý§ËÍÍ'ÿý¥ÊÍÍ&ÿý£ÉÍÍ%ÿý¡ÈÍÍ$ÿýÕÆÍÍ$ÿþÅÍÍ#ÿþÃÍÍ"ÿþÁÍÍ!ÿþ¿ÍÍ ÿþ¼ÍÍÿþºÍÍÿþ·ÍÍÿþ´ÍÍÿþ±Í Íÿý®ÌÍ Íÿý«ÌÍ!Íÿý¨ËÍ"Íÿý¦ÊÍ#Íÿý¥ÊÍ$Íÿý¥ÊÍ%Íÿý¤ÉÍ&Íÿý¤ÉÍ'Íÿý£ÉÍ(Íÿý£ÉÍ)Íÿý£ÉÍ*Íÿý¢ÈÍ*ÍþËÿÿý¢ÈÍ*ÍýË©ÿ ÿý¢ÈÍ*ÍüÌ«šÿ ÿý¡ÈÍ*ÍûÌ®ššÿ ÿý¡ÇÍ+Íþ±šš ÿý ÇÍ+Íþ´šš ÿý ÇÍ+Íþ·šš ÿý©ÇÍ+Íþºššÿý¸ÆÍ+Íþ¼ššÿýÇÆÍ+Íþ¿ššÿýÕÆÍ+ÍýÁ›ššÿýàÆÍ+ÍýÜššÿýõÅÍ+ÍýÅššÿþÅÍ+ÍýÆŸš šÿþÅÍ+ÍýÈ š šÿþÄÍ+ÍýÉ¢š šÿþÄÍ+ÍýÊ¥š šýÿÄÍ+Íýʦš šþÃÍ+Íýʦšš,Íýʧšš+Íýʧšš*Íý˧šš)Íý˨šš(Íý˨šš'ÍýË©šš&ÍýË©šš%Íý˪šš$Íý˪šš#ÍýÌ«šš2ÿþåÿ<ÿþáÿ<ÿþÜÿ<ÿþ×ÿ<ÿþÒÿ<ÿþÍÿ<ÿþÈÿ<ÿýÃþÿ;ÿý¿ýÿ;ÿý»ûÿ;ÿý¸ùÿ;ÿý´÷ÿ;ÿý±õÿ;ÿý¯òÿ;ÿýÓïÿ<ÿþëÿ<ÿþèÿ<ÿþãÿ<ÿþßÿ<ÿþÚÿ<ÿþÕÿ<ÿþÏÿ<ÿþÊÿ<ÿýÅþÿ;ÿýÁýÿ;ÿý½üÿ;ÿý¹ûÿ;ÿýµøÿ;ÿý´÷ÿ;ÿý´öÿ;ÿý³öÿ;ÿý³õÿ;ÿý²õÿ;ÿý²ôÿ;ÿý±ôÿ;ÿý±óÿ*ÿþùÿÿý°óÿ*ÿýû¹ÿ ÿý°òÿ*ÿüü½§ÿ ÿý¯òÿ*ÿûþÁ§§ÿ ÿý¯ñÿ*ÿýþŧ§ ÿý¯ñÿ+ÿþʧ§ ÿý®ðÿ+ÿþϧ§ ÿý³ïÿ+ÿþÕ§§ÿý½ïÿ+ÿþÚ§§ÿýÈîÿ+ÿþß§§ÿýÓíÿ+ÿý㨧§ÿýÞíÿ+ÿýç©§§ÿýôìÿ+ÿýë«§§ÿþëÿ+ÿýî­§ §ÿþëÿ+ÿýò¯§ §ÿþêÿ+ÿýõ±§ §ÿþéÿ+ÿý÷´§ §ýÿéÿ+ÿý÷µ§ §þèÿ+ÿýø¶§§,ÿýø·§§+ÿýø·§§*ÿýù¸§§)ÿýù¸§§(ÿýú¹§§'ÿýúº§§&ÿýûº§§%ÿýû»§§$ÿýû¼§§#ÿýû¼§§2ý3¤üü2þ‘üü2þüü2þmü ü2ý_øü ü2ýSñü!ü2ýJèü"ü2ýBÝü#ü2ý<Îü$ü2ý7¿ü%ü2ý4®ü&ü2þœü'ü2þ‰ü(ü2þwü)ü2ýgûü)ü2ýZöü*ü2ýOîü+ü2ýFäü,ü2ý?×ü-ü 2ý9Èü.ü 2ý7ºü/ü 2ý5¯ü0ü 2ý3¥ü1ü 2ý3™ü2ü 2þü3ü2þ‚ü4ü2þvü5ü2ýmûü5ü2ýcøü6ü2ý[õü7ü2ýTñü8ü2ýNìü9ü2ýIåü:üü2CÝü;üý?Õü<üþËü>üLýM±ÿÿLþ ÿÿLþÿÿLþÿ ÿLýtüÿ ÿLýiöÿ!ÿLýaíÿ"ÿLýZäÿ#ÿLýUÖÿ$ÿLýQÉÿ%ÿLýNºÿ&ÿLþªÿ'ÿLþ™ÿ(ÿLþ‰ÿ)ÿLý{þÿ)ÿLýpúÿ*ÿLýfòÿ+ÿLý^éÿ,ÿLýXÞÿ-ÿ LýSÑÿ.ÿ LýPÅÿ/ÿ LýN»ÿ0ÿ LýM²ÿ1ÿ Lþ¨ÿ2ÿ Lþÿ3ÿLþ“ÿ4ÿLþ‰ÿ5ÿLý€þÿ5ÿLýxüÿ6ÿLýqùÿ7ÿLýköÿ8ÿLýeðÿ9ÿLý`êÿ:ÿüL[äÿ;ÿýXÜÿ<ÿþÔÿ>ÿÍþ°ššÍþµššÍþºššÍþ¾š šÍý›š šÍýÅš!šÍýÇŸš"šÍýÉ¢š#šÍýʦš$šÍýÌ©š%šÍýÌ®š&šÍþ²š'šÍþ·š(šÍþ¼š)šÍþÀš*šÍýÜš*šÍýÆžš+šÍýÈ š,šÍýÊ£š-š Íý˧š.š ÍýÌ«š/š ÍýÌ­š0š Íþ°š1š Íþ³š2š Íþ¶š3šÍþ¹š4šÍþ¼š5šÍþ¾š6šÍýÁ›š6šÍýÜš7šÍýÄš8šÍýÆžš9šÍýÇ š:šüÍÉ¢š;šýʤš<šþ¦š>šÿýþŧ§ÿþ̧§ÿþÕ§§ÿþݧ §ÿý䨧 §ÿý몧!§ÿýð­§"§ÿýõ°§#§ÿýøµ§$§ÿýüº§%§ÿýþÁ§&§ÿþȧ'§ÿþЧ(§ÿþا)§ÿþà§*§ÿýç©§*§ÿýí«§+§ÿýò®§,§ÿýö²§-§ ÿýú·§.§ ÿýü¼§/§ ÿýýÀ§0§ ÿýþħ1§ ÿþɧ2§ ÿþΧ3§ÿþÓ§4§ÿþا5§ÿþݧ6§ÿý⨧6§ÿýæ©§7§ÿýꪧ8§ÿý9§ÿýñ®§:§üÿô°§;§ýö³§<§þ¶§>§üÿš§0üþ«2 20üþŒ2 20üþq2 20üþY2 20üþD2 2/üýö42 2/üþÑ2 2/üþ®2 2/üþ2 2/üþt2 2/üþ\2 2/üþF2 2.üýø52 2.üþÙ22.üþ¿22.üþ¬22.üþ™22.üþ‡22.üþw22.üþh22.üþY22.üþL22.üþ@22.üþ522-üþè22-üþÑ22-üþ»22-üþ§22-üþ•22-üþ„22-üþt22-üþj22-üþd22-üþ`22-üþ[22-üþV22-üþQ22-üþM22-üþI22-üþD22-üþA22-üþ<22-üþ822-üþ422,üþú22,üþð22,üþè22,üþá22,üþã22,üþé22,üþð22,üþ÷22-üþ322-üþ622-üþ922-üþ<22-üþ?22-üþC22-üþF22-üþJ22-üþM22-üþQ22-üþT22-üþX220ÿþ·L L0ÿþœL L0ÿþ„L L0ÿþoL L0ÿþ\L L/ÿýúML L/ÿþÙL L/ÿþºL L/ÿþŸL L/ÿþ‡L L/ÿþqL L/ÿþ^L L.ÿýüNL L.ÿþàLL.ÿþÉLL.ÿþ¸LL.ÿþ§LL.ÿþ—LL.ÿþ‰LL.ÿþ|LL.ÿþoLL.ÿþcLL.ÿþXLL.ÿþNLL-ÿþíLL-ÿþÙLL-ÿþÆLL-ÿþ´LL-ÿþ¤LL-ÿþ•LL-ÿþ‡LL-ÿþ~LL-ÿþyLL-ÿþuLL-ÿþpLL-ÿþlLL-ÿþhLL-ÿþdLL-ÿþ`LL-ÿþ\LL-ÿþYLL-ÿþULL-ÿþRLL-ÿþNLL,ÿþýLL,ÿþôLL,ÿþíLL,ÿþçLL,ÿþèLL,ÿþîLL,ÿþôLL,ÿþûLL-ÿL-ÿþOLL-ÿþRLL-ÿþULL-ÿþXLL-ÿþ[LL-ÿþ^LL-ÿþaLL-ÿþdLL-ÿþgLL-ÿþkLL-ÿþnLL0šþ¯Í Í0šþ¶Í Í0šþ½Í Í0šþÃÍ Í0šþÈÍ Í/šþœÍ Í/šþ¥Í Í/šþ®Í Í/šþµÍ Í/šþ¼Í Í/šþÂÍ Í/šþÈÍ Í.šý›ÌÍ Í.šþ£ÍÍ.šþ©ÍÍ.šþ®ÍÍ.šþ³ÍÍ.šþ¸ÍÍ.šþ¼ÍÍ.šþ¿ÍÍ.šþÃÍÍ.šþÆÍÍ.šþÉÍÍ.šþÌÍÍ-šþŸÍÍ-šþ¥ÍÍ-šþªÍÍ-šþ¯ÍÍ-šþ´ÍÍ-šþ¸ÍÍ-šþ¼ÍÍ-šþ¿ÍÍ-šþÀÍÍ-šþÁÍÍ-šþÃÍÍ-šþÄÍÍ-šþÅÍÍ-šþÆÍÍ-šþÇÍÍ-šþÈÍÍ-šþÉÍÍ-šþÊÍÍ-šþËÍÍ-šþÌÍÍ,šþ›ÍÍ,šþÍÍ,šþŸÍÍ,šþ¡ÍÍ,šþ ÍÍ,šþŸÍÍ,šþÍÍ,šþ›ÍÍ-šÍ-šþÌÍÍ-šþËÍÍ-šþÊÍÍ-šþÊÍÍ-šþÉÍÍ-šþÈÍÍ-šþÇÍÍ-šþÆÍÍ-šþÅÍÍ-šþÄÍÍ-šþÃÍÍ0§þÂÿ ÿ0§þÎÿ ÿ0§þÛÿ ÿ0§þçÿ ÿ0§þôÿ ÿ/§ý©þÿ ÿ/§þ´ÿ ÿ/§þÁÿ ÿ/§þÍÿ ÿ/§þÙÿ ÿ/§þæÿ ÿ/§þòÿ ÿ.§ý¨ýÿ ÿ.§þ²ÿÿ.§þºÿÿ.§þÂÿÿ.§þÉÿÿ.§þÑÿÿ.§þØÿÿ.§þàÿÿ.§þçÿÿ.§þïÿÿ.§þöÿÿ.§þýÿÿ-§þ­ÿÿ-§þ´ÿÿ-§þ¼ÿÿ-§þÃÿÿ-§þËÿÿ-§þÒÿÿ-§þÙÿÿ-§þßÿÿ-§þáÿÿ-§þäÿÿ-§þæÿÿ-§þéÿÿ-§þìÿÿ-§þîÿÿ-§þñÿÿ-§þóÿÿ-§þöÿÿ-§þøÿÿ-§þûÿÿ-§þþÿÿ,§þ¨ÿÿ,§þªÿÿ,§þ­ÿÿ,§þ¯ÿÿ,§þ¯ÿÿ,§þ­ÿÿ,§þªÿÿ,§þ¨ÿÿ-§ÿ-§þýÿÿ-§þûÿÿ-§þøÿÿ-§þöÿÿ-§þôÿÿ-§þòÿÿ-§þðÿÿ-§þîÿÿ-§þìÿÿ-§þêÿÿ-§þèÿÿ2þ“ÿÿþ|2)2þÀÿÿþY2)2ÿþ<2(2þ>ÿÿþØ2)2þSÿÿþ¦2)2þkÿÿþ~2)2þ…ÿÿþa2)2þ¢ÿÿþJ2)2þÃÿÿþ72)2þñÿÿþß2)2þ<ÿÿþ»2)2þPÿÿþ›2)2þgÿÿþ2)2þÿÿþf2)2þžÿÿþP2)2þ¾ÿÿþ<2)2þäÿÿþõ2)2þ9ÿÿþÄ2)2þFÿÿþ£2)2þRÿÿþ†2)2þ_ÿÿþm2)2þmÿÿþ]2)2þ|ÿÿþP2)2þÿÿþC2)2þžÿÿþ72)2þ±ÿÿ+2þÅÿÿþØ2*2þÛÿÿþÁ2*2ÿþ­2)2þ8ÿÿþš2)2þDÿÿþ‰2)2þQÿÿþy2)2þ^ÿÿþi2)2þgÿÿþ[2)2þmÿÿþS2)2þqÿÿþN2)2þwÿÿþI2)2þ|ÿÿþD2)2þ‚ÿÿþ@2)2þˆÿÿþ<2)2þŽÿÿþ82)2þ”ÿÿþ42)2þšÿÿ+2þ¡ÿÿ+2þ§ÿÿþå2*2þ®ÿÿþÜ2*2þµÿÿþÕ2*2þ¼ÿÿþÌ2*2þ¼ÿÿþÈ2*2þ·ÿÿþË2*2þ±ÿÿþÑ2*2þ«ÿÿþØ2*2þ¥ÿÿþÞ2*2þ ÿÿþå2*2þ›ÿÿ+2þ•ÿÿ+2þÿÿ+2þŒÿÿþ42)2þ‡ÿÿþ72)2þ‚ÿÿþ:2)2þ}ÿÿþ>2)2þyÿÿþA2)2þtÿÿþE2)2þoÿÿþN22Lþ¢ÿÿþL)LþÊÿÿþnL)LÿþTL(LþWÿÿþßL)Lþiÿÿþ³L)Lþ~ÿÿþL)Lþ•ÿÿþuL)Lþ¯ÿÿþbL)LþÍÿÿþQL)LþôÿÿþæL)LþTÿÿþÆL)Lþgÿÿþ©L)Lþ{ÿÿþL)Lþ’ÿÿþ{L)Lþ«ÿÿþfL)LþÈÿÿþTL)Lþéÿÿþ÷L)LþRÿÿþÎL)Lþ]ÿÿþ°L)Lþhÿÿþ—L)LþtÿÿþL)LþÿÿþrL)LþŽÿÿþgL)Lþÿÿþ[L)Lþ¬ÿÿþQL)Lþ½ÿÿ+LþÎÿÿþßL*LþâÿÿþËL*Lÿþ¹L)LþRÿÿþ¨L)Lþ\ÿÿþ™L)Lþgÿÿþ‹L)Lþsÿÿþ}L)Lþ{ÿÿþqL)Lþ€ÿÿþiL)Lþ„ÿÿþeL)Lþ‰ÿÿþ`L)LþŽÿÿþ\L)Lþ“ÿÿþXL)Lþ˜ÿÿþTL)LþžÿÿþQL)Lþ£ÿÿþML)Lþ¨ÿÿ+Lþ®ÿÿ+Lþ´ÿÿþêL*LþºÿÿþãL*LþÀÿÿþÜL*LþÇÿÿþÕL*LþÇÿÿþÑL*LþÂÿÿþÔL*Lþ½ÿÿþÙL*Lþ·ÿÿþßL*Lþ²ÿÿþåL*Lþ®ÿÿþêL*Lþ©ÿÿ+Lþ¤ÿÿ+Lþ ÿÿ+Lþ›ÿÿþNL)Lþ—ÿÿþQL)Lþ“ÿÿþTL)LþÿÿþVL)Lþ‹ÿÿþYL)Lþ‡ÿÿþ]L)Lþ‚ÿÿþeLLÍþµÿÿþºÍ)Íþ©ÿÿþÃÍ)ÍÿþËÍ(ÍþÊÿÿþ£Í)ÍþÅÿÿþ°Í)Íþ¿ÿÿþºÍ)Íþ¸ÿÿþÁÍ)Íþ±ÿÿþÇÍ)Íþ¨ÿÿþÌÍ)ÍþÇÿÿþ¡Í)ÍþËÿÿþªÍ)ÍþÅÿÿþ²Í)ÍþÀÿÿþ¹Í)Íþ¹ÿÿþÀÍ)Íþ²ÿÿþÆÍ)ÍþªÿÿþËÍ)Íþ ÿÿþÕÍ)ÍþËÿÿþ¨Í)ÍþÈÿÿþ±Í)ÍþÅÿÿþ¸Í)ÍþÂÿÿþ¾Í)Íþ¾ÿÿþÂÍ)ÍþºÿÿþÅÍ)Íþ¶ÿÿþÉÍ)Íþ²ÿÿþÌÍ)Íþ­ÿÿ+Íþ¨ÿÿþ£Í*Íþ¢ÿÿþ©Í*Íÿþ®Í)ÍþËÿÿþ³Í)ÍþÈÿÿþ·Í)ÍþÅÿÿþ»Í)ÍþÂÿÿþ¿Í)ÍþÀÿÿþÃÍ)Íþ¾ÿÿþÅÍ)Íþ½ÿÿþÆÍ)Íþ¼ÿÿþÇÍ)ÍþºÿÿþÈÍ)Íþ¹ÿÿþÉÍ)Íþ·ÿÿþËÍ)Íþ¶ÿÿþÌÍ)Íþ´ÿÿ+Íþ³ÿÿ+Íþ±ÿÿ+Íþ¯ÿÿþ Í*Íþ®ÿÿþ¢Í*Íþ¬ÿÿþ¤Í*Íþªÿÿþ¦Í*Íþªÿÿþ§Í*Íþ«ÿÿþ¦Í*Íþ­ÿÿþ¥Í*Íþ¯ÿÿþ£Í*Íþ°ÿÿþ¢Í*Íþ±ÿÿþ Í*Íþ²ÿÿ+Íþ´ÿÿ+Íþµÿÿ+Íþ¶ÿÿþÌÍ)Íþ¸ÿÿþÌÍ)Íþ¹ÿÿþËÍ)ÍþºÿÿþÊÍ)Íþ»ÿÿþÉÍ)Íþ¼ÿÿþÈÍ)Íþ¾ÿÿþÆÍÍÿþÌÿÿþÖÿ)ÿþºÿÿþèÿ=ÿþùÿ(ÿþ÷ÿÿþ²ÿ)ÿþëÿÿþÄÿ)ÿþÞÿÿþÕÿ)ÿþÒÿÿþãÿ)ÿþÅÿÿþðÿ)ÿþ¹ÿÿþüÿ)ÿþÈÿÿþ°ÿ)ÿþùÿÿþ¼ÿ)ÿþìÿÿþÈÿ)ÿþàÿÿþÔÿ)ÿþÔÿÿþàÿ)ÿþÇÿÿþíÿ)ÿþ»ÿÿþùÿ)ÿþ®ÿÿþÓÿ)ÿþûÿÿþ¹ÿ)ÿþóÿÿþÅÿ)ÿþëÿÿþÑÿ)ÿþäÿÿþÝÿ)ÿþÝÿÿþåÿ)ÿþÖÿÿþìÿ)ÿþÎÿÿþôÿ)ÿþÇÿÿþüÿ)ÿþÀÿ=ÿþ¸ÿÿþ²ÿ*ÿþ±ÿÿþºÿ=ÿþÁÿ)ÿþûÿÿþÈÿ)ÿþôÿÿþÐÿ)ÿþìÿÿþ×ÿ)ÿþåÿÿþßÿ)ÿþàÿÿþæÿ)ÿþÝÿÿþëÿ)ÿþÛÿÿþîÿ)ÿþØÿÿþñÿ)ÿþÖÿÿþóÿ)ÿþÓÿÿþöÿ)ÿþÐÿÿþùÿ)ÿþÎÿÿþûÿ)ÿþËÿÿþþÿ)ÿþÈÿ=ÿþÆÿ=ÿþÃÿÿþ®ÿ*ÿþÁÿÿþ±ÿ*ÿþ¾ÿÿþ³ÿ*ÿþ»ÿÿþ¶ÿ*ÿþ»ÿÿþ·ÿ*ÿþ½ÿÿþ¶ÿ*ÿþÀÿÿþ´ÿ*ÿþÂÿÿþ²ÿ*ÿþÄÿÿþ°ÿ*ÿþÆÿÿþ®ÿ*ÿþÈÿ=ÿþËÿ=ÿþÍÿ=ÿþÏÿÿþþÿ)ÿþÑÿÿþüÿ)ÿþÓÿÿþùÿ)ÿþÕÿÿþ÷ÿ)ÿþ×ÿÿþõÿ)ÿþÙÿÿþóÿ)ÿþÜÿÿþîÿÿ2þü4ü2þ¼ü4ü2ý3ïü4ü2þHü5ü2þgü5ü2þŒü5ü2þ·ü5ü2þéü5ü2þDü6ü2þcü6ü2þ‡ü6ü2þ±ü6ü2þÙü6ü2ý6úü6ü2þHü7ü2þ^ü7ü2þvü7ü2þ’ü7ü2þ±ü7ü2þÕü7ü2ý4÷ü7ü2þFü8ü2þ[ü8ü2þqü8ü2þ‚ü8ü2þ“ü8ü2þ¥ü8ü2þºü8ü2þÏü8ü2þçü8ü2ý4ûü8ü2þ?ü9ü2þKü9ü2þYü9ü2þgü9ü2þvü9ü2þ…ü9ü2þü9ü2þ“ü9ü2þ™ü9ü2þŸü9ü2þ¥ü9ü2þ¬ü9ü2þ³ü9ü2þºü9ü2þÀü9ü2þÈü9ü2þÏü9ü2þ×ü9ü2þÒü9ü2þÌü9ü2þÅü9ü2þ¿ü9ü2þ¹ü9ü2þ³ü9ü2þ­ü9ü2þ§ü9ü2þ¢ü9ü2þü9ü2þ—ü9ü2þ’ü9ü2þ‹ü9ü2þ|ü9ü2þnü9üLþ ÿ4ÿLþÇÿ4ÿLýMóÿ4ÿLþ_ÿ5ÿLþ{ÿ5ÿLþ›ÿ5ÿLþÂÿ5ÿLþîÿ5ÿLþ\ÿ6ÿLþxÿ6ÿLþ—ÿ6ÿLþ½ÿ6ÿLþàÿ6ÿLýOýÿ6ÿLþ_ÿ7ÿLþsÿ7ÿLþ‰ÿ7ÿLþ¡ÿ7ÿLþ½ÿ7ÿLþÜÿ7ÿLýNûÿ7ÿLþ]ÿ8ÿLþqÿ8ÿLþ„ÿ8ÿLþ“ÿ8ÿLþ¢ÿ8ÿLþ²ÿ8ÿLþÄÿ8ÿLþ×ÿ8ÿLþìÿ8ÿLýNþÿ8ÿLþWÿ9ÿLþcÿ9ÿLþnÿ9ÿLþ{ÿ9ÿLþ‰ÿ9ÿLþ–ÿ9ÿLþÿ9ÿLþ¢ÿ9ÿLþ§ÿ9ÿLþ­ÿ9ÿLþ²ÿ9ÿLþ¸ÿ9ÿLþ¾ÿ9ÿLþÄÿ9ÿLþÊÿ9ÿLþÑÿ9ÿLþ×ÿ9ÿLþÞÿ9ÿLþÚÿ9ÿLþÕÿ9ÿLþÎÿ9ÿLþÉÿ9ÿLþÃÿ9ÿLþ¾ÿ9ÿLþ¹ÿ9ÿLþ´ÿ9ÿLþ¯ÿ9ÿLþ«ÿ9ÿLþ¥ÿ9ÿLþ¡ÿ9ÿLþ›ÿ9ÿLþŽÿ9ÿLþÿ9ÿÍþµš4šÍþªš4šÍþš4šÍþÇš5šÍþÀš5šÍþ¶š5šÍþ«š5šÍþŸš5šÍþÈš6šÍþÁš6šÍþ¸š6šÍþ­š6šÍþ£š6šÍýÌ›š6šÍþÇš7šÍþš7šÍþ¼š7šÍþµš7šÍþ­š7šÍþ¤š7šÍýÌ›š7šÍþÈš8šÍþÚ8šÍþ½š8šÍþ¹š8šÍþµš8šÍþ°š8šÍþ«š8šÍþ¥š8šÍþŸš8šÍþÌš9šÍþÊš9šÍþÇš9šÍþÚ9šÍþÀš9šÍþ¼š9šÍþ¸š9šÍþ¶š9šÍþµš9šÍþ³š9šÍþ±š9šÍþ°š9šÍþ®š9šÍþ¬š9šÍþ«š9šÍþ©š9šÍþ§š9šÍþ¥š9šÍþ£š9šÍþ¤š9šÍþ¦š9šÍþ¨š9šÍþ©š9šÍþ«š9šÍþ¬š9šÍþ®š9šÍþ¯š9šÍþ±š9šÍþ²š9šÍþ´š9šÍþµš9šÍþ·š9šÍþºš9šÍþ¾š9šÿþͧ4§ÿþ»§4§ÿýþ«§4§ÿþñ§5§ÿþà§5§ÿþϧ5§ÿþ½§5§ÿþ­§5§ÿþó§6§ÿþâ§6§ÿþѧ6§ÿþÀ§6§ÿþ²§6§ÿýý¨§6§ÿþñ§7§ÿþå§7§ÿþا7§ÿþ̧7§ÿþÀ§7§ÿþ³§7§ÿýþ¨§7§ÿþó§8§ÿþæ§8§ÿþÛ§8§ÿþÓ§8§ÿþ̧8§ÿþħ8§ÿþ¼§8§ÿþµ§8§ÿþ­§8§ÿþþ§9§ÿþ÷§9§ÿþï§9§ÿþè§9§ÿþà§9§ÿþا9§ÿþѧ9§ÿþΧ9§ÿþ̧9§ÿþɧ9§ÿþƧ9§ÿþħ9§ÿþ§9§ÿþ¿§9§ÿþ¼§9§ÿþº§9§ÿþ·§9§ÿþµ§9§ÿþ²§9§ÿþ´§9§ÿþ¶§9§ÿþ¸§9§ÿþº§9§ÿþ½§9§ÿþ¿§9§ÿþÁ§9§ÿþç9§ÿþŧ9§ÿþǧ9§ÿþʧ9§ÿþ̧9§ÿþϧ9§ÿþÖ§9§ÿþܧ9§üýõ:22üþ´22üþw22üþH22üþ×22üþ“22üþ]22üýò722üþ±22üþu22üþF22üþÓ2 2üþ2 2üþ[2 2üýñ62 2üþ®2!2üþz2!2üþT2!2üþ92!2üþÛ2"2üþ²2"2üþŽ2"2üþo2"2üþS2"2üþ;2"2üþá2#2üþ·2#2üþ’2#2üþr2#2üþV2#2üþ>2#2üþç2$2üþ»2$2üþœ2$2üþ…2$2üþw2$2üþo2$2üþg2$2üþ`2$2üþY2$2üþR2$2üþK2$2üþD2$2üþ>2$2üþ82$2üþ32$2üþñ2%2üþä2%2üþØ2%2üþÌ2%2üþÇ2%2üþÈ2%2üþÕ2%2üþè2%2üýû32$2üþ<2$2üþF2$2üþQ2$2üþ]2$2üþi2$2üþu2$2üþƒ2$2üþ‘2$2üþ¡2$2ÿýùSLLÿþ¿LLÿþ‰LLÿþ_LLÿþÞLLÿþ¢LLÿþrLLÿý÷QLLÿþ½LLÿþ‡LLÿþ^LLÿþÛL Lÿþ L LÿþqL LÿýöPL LÿþºL!LÿþŒL!LÿþjL!LÿþRL!LÿþâL"Lÿþ½L"LÿþžL"Lÿþ‚L"LÿþiL"LÿþTL"LÿþçL#LÿþÂL#Lÿþ¡L#Lÿþ…L#LÿþlL#LÿþWL#LÿþìL$LÿþÆL$LÿþªL$Lÿþ•L$Lÿþ‰L$Lÿþ‚L$Lÿþ{L$LÿþuL$LÿþnL$LÿþhL$LÿþcL$Lÿþ\L$LÿþWL$LÿþRL$LÿþML$LÿþöL%LÿþéL%LÿþßL%LÿþÕL%LÿþÐL%LÿþÑL%LÿþÜL%LÿþíL%LÿýþML$LÿþUL$Lÿþ^L$LÿþgL$LÿþrL$Lÿþ|L$Lÿþ‡L$Lÿþ”L$Lÿþ L$Lÿþ®L$LšýœËÍÍšþ¬ÍÍšþ¼ÍÍšþÇÍÍšþ£ÍÍšþµÍÍšþÂÍÍšýœÌÍÍšþ­ÍÍšþ¼ÍÍšþÈÍÍšþ¤Í ÍšþµÍ ÍšþÃÍ ÍšýÌÍ Íšþ®Í!Íšþ»Í!ÍšþÄÍ!ÍšþËÍ!Íšþ¢Í"Íšþ­Í"Íšþ¶Í"Íšþ¾Í"ÍšþÅÍ"ÍšþËÍ"Íšþ¡Í#Íšþ«Í#ÍšþµÍ#Íšþ½Í#ÍšþÄÍ#ÍšþÊÍ#ÍšþŸÍ$ÍšþªÍ$Íšþ²Í$Íšþ¸Í$Íšþ¼Í$Íšþ¾Í$ÍšþÀÍ$ÍšþÁÍ$ÍšþÃÍ$ÍšþÅÍ$ÍšþÇÍ$ÍšþÈÍ$ÍšþÊÍ$ÍšþËÍ$Íš&ÍšþÍ%Íšþ Í%Íšþ£Í%Íšþ¦Í%Íšþ§Í%Íšþ§Í%Íšþ¤Í%ÍšþŸÍ%Íš&ÍšþÊÍ$ÍšþÈÍ$ÍšþÅÍ$ÍšþÂÍ$Íšþ¿Í$Íšþ¼Í$Íšþ¹Í$ÍšþµÍ$Íšþ±Í$ͧý©úÿÿ§þ¾ÿÿ§þØÿÿ§þñÿÿ§þ²ÿÿ§þÌÿÿ§þåÿÿ§ýªüÿÿ§þÀÿÿ§þÙÿÿ§þòÿÿ§þ³ÿ ÿ§þÍÿ ÿ§þæÿ ÿ§ýªüÿ ÿ§þÁÿ!ÿ§þ×ÿ!ÿ§þêÿ!ÿ§þûÿ!ÿ§þ±ÿ"ÿ§þ¿ÿ"ÿ§þÎÿ"ÿ§þÜÿ"ÿ§þëÿ"ÿ§þùÿ"ÿ§þ¯ÿ#ÿ§þ½ÿ#ÿ§þÌÿ#ÿ§þÚÿ#ÿ§þéÿ#ÿ§þ÷ÿ#ÿ§þ­ÿ$ÿ§þ¼ÿ$ÿ§þÈÿ$ÿ§þÒÿ$ÿ§þØÿ$ÿ§þÜÿ$ÿ§þàÿ$ÿ§þäÿ$ÿ§þèÿ$ÿ§þëÿ$ÿ§þïÿ$ÿ§þóÿ$ÿ§þ÷ÿ$ÿ§þûÿ$ÿ§þþÿ$ÿ§þªÿ%ÿ§þ®ÿ%ÿ§þ²ÿ%ÿ§þ¶ÿ%ÿ§þ¸ÿ%ÿ§þ·ÿ%ÿ§þ³ÿ%ÿ§þ­ÿ%ÿ§þþÿ$ÿ§þøÿ$ÿ§þòÿ$ÿ§þìÿ$ÿ§þåÿ$ÿ§þßÿ$ÿ§þÙÿ$ÿ§þÒÿ$ÿ§þÌÿ$ÿ§þÆÿ$ÿ2þ…üü2ýL÷üü2ý4Åüü2þ|ü ü2ýGòü ü2þ»ü!ü2þaü"ü2ý3Ìü"ü2þiü#ü2ý5Öü#ü2þqü$ü2ý7Þü$ü2þvü%ü2ý3Òü%ü2þXü&ü2þ¦ü&ü2ý?÷ü&ü2þü'ü2ý4Ûü'ü2þVü(ü2þŠü(ü2þÍü(ü2þCü)ü2þqü)ü2þ­ü)ü2ý6ðü)ü2þ[ü*ü2þ‘ü*ü2þÖü*ü2þGü+ü2þfü+ü2þ„ü+ü2þ¥ü+ü2þÍü+ü2ý4öü+ü2þHü,ü2þbü,ü2þü,ü2þ ü,ü2þÇü,ü2þæü,ü2þôü,ü2þ5ü-ü2þ;ü-ü2þBü-ü2þIü-ü2þPü-ü2þWü-ü2þ_ü-ü2þfü-ü2þnü-ü2þfü-ü2þ[ü-ü2þOü-ü2þDü-ü2þ:ü-ü2ý3øü,ü2þæü,ü2þÒü,ü2þ¿ü,ü2þ®ü,ü2þŽü,ü2þkü,ü2þMü,üLþ–ÿÿLýcûÿÿLýNÎÿÿLþŽÿ ÿLý_÷ÿ ÿLþÆÿ!ÿLþuÿ"ÿLýMÕÿ"ÿLþ|ÿ#ÿLýNÝÿ#ÿLþ„ÿ$ÿLýPåÿ$ÿLþ‰ÿ%ÿLþÚÿ%ÿLþnÿ&ÿLþ³ÿ&ÿLýXûÿ&ÿLþÿ'ÿLýMâÿ'ÿLþlÿ(ÿLþšÿ(ÿLþÖÿ(ÿLþ[ÿ)ÿLþ„ÿ)ÿLþ¹ÿ)ÿLýPôÿ)ÿLþqÿ*ÿLþ ÿ*ÿLþÝÿ*ÿLþ^ÿ+ÿLþzÿ+ÿLþ•ÿ+ÿLþ²ÿ+ÿLþÖÿ+ÿLýNúÿ+ÿLþ_ÿ,ÿLþvÿ,ÿLþÿ,ÿLþ®ÿ,ÿLþÐÿ,ÿLþëÿ,ÿLþøÿ,ÿLþNÿ-ÿLþTÿ-ÿLþZÿ-ÿLþ`ÿ-ÿLþfÿ-ÿLþmÿ-ÿLþtÿ-ÿLþ{ÿ-ÿLþÿ-ÿLþ{ÿ-ÿLþpÿ-ÿLþfÿ-ÿLþ\ÿ-ÿLþTÿ-ÿLþüÿ,ÿLþëÿ,ÿLþÚÿ,ÿLþÉÿ,ÿLþºÿ,ÿLþžÿ,ÿLþÿ,ÿLþdÿ,ÿÍþ¸ššÍýÆ›ššÍý̨ššÍþºš šÍýÈœš šÍþªš!šÍþÁš"šÍþ¦š"šÍþ¿š#šÍý̤š#šÍþ½š$šÍýÌ¢š$šÍþ¼š%šÍþ¤š%šÍþÚ&šÍþ°š&šÍýÊ›š&šÍþ¹š'šÍþ¢š'šÍþÄš(šÍþ·š(šÍþ¦š(šÍþÉš)šÍþ½š)šÍþ®š)šÍýÌš)šÍþÚ*šÍþµš*šÍþ¤š*šÍþÈš+šÍþÀš+šÍþ¸š+šÍþ°š+šÍþ¦š+šÍýÌœš+šÍþÇš,šÍþÁš,šÍþºš,šÍþ±š,šÍþ§š,šÍþ š,šÍþœš,šÍþÌš-šÍþËš-šÍþÉš-šÍþÇš-šÍþÆš-šÍþÄš-šÍþš-šÍþÀš-šÍþ¾š-šÍþÀš-šÍþÚ-šÍþÆš-šÍþÈš-šÍþËš-šÍþ›š,šÍþ š,šÍþ¤š,šÍþ©š,šÍþ®š,šÍþ¶š,šÍþ¿š,šÍþÆš,šÿþѧ§ÿý﨧§ÿýþ¸§§ÿþÖ§ §ÿýòª§ §ÿþ¼§!§ÿþã§"§ÿýþ¶§"§ÿþß§#§ÿýý³§#§ÿþÛ§$§ÿýü°§$§ÿþا%§ÿþ´§%§ÿþè§&§ÿþħ&§ÿýö¨§&§ÿþÔ§'§ÿýþ±§'§ÿþé§(§ÿþϧ(§ÿþµ§(§ÿþô§)§ÿþÛ§)§ÿþÁ§)§ÿýüª§)§ÿþæ§*§ÿþ̧*§ÿþ³§*§ÿþò§+§ÿþá§+§ÿþÒ§+§ÿþħ+§ÿþµ§+§ÿýþ©§+§ÿþñ§,§ÿþã§,§ÿþÕ§,§ÿþƧ,§ÿþ¸§,§ÿþ®§,§ÿþ©§,§ÿþý§-§ÿþù§-§ÿþõ§-§ÿþñ§-§ÿþí§-§ÿþé§-§ÿþä§-§ÿþà§-§ÿþܧ-§ÿþà§-§ÿþæ§-§ÿþí§-§ÿþó§-§ÿþù§-§ÿþ¨§,§ÿþ®§,§ÿþ´§,§ÿþº§,§ÿþÁ§,§ÿþΧ,§ÿþÞ§,§ÿþî§,§oüú쿚´îü4üú÷ y\B22ú4Nv¦áü/üýÀK2 2ýaæü+üüìs32 2ýA·ü)üý¦@22ü3}÷ü&üþ†22ýQØü$üýÂ422ýMøü"üýïF22þü"üþn22ý8Üü üþ©22þbüüýò<22 üþº22 üþˆ22 üþV22üýô422üþp22üþ<22üþÜ22üþ¢22üþr22üþK22üýê322üþÑ22üþÈ22üþÀ22üþ»22üþÉ22üþÙ22üþê22üþ:22üþS22üþq22üþ¡22üýí622üþ^22üþ›22üýê922 üþy22 üýÜ622!üþŠ22!üýøP22"üýË522#üþ†22$üþl22$üý÷c22%üýúw22'üý322(üý®?22)üüèm322+üüÍe322-üüÍo:2 2/üúò¥sM42 23üó︚‡udVJJMOUüüoÿúðɨ¿òÿ4ÿúû®‹qZLLúMeˆ³çÿ/ÿýÊcL Lývëÿ+ÿüð†ML LýYÂÿ)ÿý³XLLüMûÿ&ÿþ—LLýgßÿ$ÿýÌNLLýdüÿ"ÿýó^LLþÿ"ÿþLLýRãÿ ÿþµLLþvÿÿý÷ULL ÿþÅLL ÿþ˜LL ÿþlLLÿýøNLLÿþƒLLÿþULLÿþãLLÿþ¯LLÿþ…LLÿþbLLÿþïLLÿþÙLLÿþÑLLÿþÊLLÿþÆLLÿþÒLLÿþàLLÿþïLLÿþSLLÿþiLLÿþ„LLÿþ®LLÿýñOLLÿþsLLÿþ©LLÿýïRLL ÿþ‹LL ÿýãPLL!ÿþšLL!ÿýüfLL"ÿýÔNLL#ÿþ—LL$ÿþLL$ÿýûxLL%ÿýý‰LL'ÿý MLL(ÿýºWLL)ÿüí€MLL+ÿüÖyMLL-ÿüÖ‚SL L/ÿú÷²†dML L3ÿóó¨—‡ylabdfkÿÿošúž©³¬žš4šú›±»ÂÉÍÍûƼ°¡š/šý©ÇÍ ÍýÁ š+šýž½ÍÍýÉ«š)šý°ÉÍÍýº›š&šþ¸ÍÍýÅ£š$šý©ÌÍÍýÆ›š"šýÈÍÍþ¶š"šþ¾ÍÍýË¢š šþ¯ÍÍþÁššýœÊÍÍ šþ«ÍÍ šþ·ÍÍ šþÄÍÍšþœÍÍšþ½ÍÍšþËÍÍšþ¢ÍÍšþ±ÍÍšþ½ÍÍšþÇÍÍšþžÍÍšþ¥ÍÍšþ§ÍÍšþ©ÍÍšþªÍÍšþ§ÍÍšþ£ÍÍšþžÍÍšþËÍÍšþÅÍÍšþ½ÍÍšþ±ÍÍšýžÌÍÍšþÂÍÍšþ²ÍÍšýžËÍÍ šþ»ÍÍ šý¢ÌÍÍ!šþ·ÍÍ!šý›ÆÍÍ"šý¦ÌÍÍ#šþ¸ÍÍ$šþ¾ÍÍ$šý›ÁÍÍ%šý›¼ÍÍ'šþµÍÍ(šý®ÊÍÍ)šýŸ¾ÍÍ+šý¦ÀÍÍ-šü¦¾ËÍ Í/šûœ°½ÆÍ Í3šó«³¸¼ÀÄÇÇÆÆÄššo§ú¬ºÈ¾«§4§ú¨Æ×æõÿÿúþíÙį§/§ýºïÿ ÿýã®§+§ü¬Úþÿ ÿýö½§)§ýÄöÿÿüþÕ¨§&§þÑÿÿýì²§$§ý¹þÿÿý"§ý«òÿÿþΧ"§þÜÿÿýû±§ §þÃÿÿþã§§ýªøÿÿ §þ¼ÿÿ §þÐÿÿ §þéÿÿ§ý©þÿÿ§þÛÿÿ§þøÿÿ§þ±ÿÿ§þÅÿÿ§þÚÿÿ§þïÿÿ§þ¬ÿÿ§þ´ÿÿ§þ·ÿÿ§þºÿÿ§þ¼ÿÿ§þ·ÿÿ§þ²ÿÿ§þ¬ÿÿ§þúÿÿ§þëÿÿ§þÛÿÿ§þÆÿÿ§ý«ýÿÿ§þåÿÿ§þÈÿÿ§ý¬ûÿÿ §þ×ÿÿ §ý±üÿÿ!§þÏÿÿ!§ý¨íÿÿ"§ý¶ýÿÿ#§þÑÿÿ$§þÞÿÿ$§ý¨âÿÿ%§ý¨Øÿÿ'§ýÍþÿÿ(§ýÁ÷ÿÿ)§ü­Ýþÿÿ+§üµáþÿÿ-§üµÜúÿ ÿ/§úªÄÚîþÿ ÿ3§ó«½ÈÑÙáéððîíê§§üþÎ2+2þœüüýû<2*2þžüüþ_2*2þ£üüþ2*2þ´üüþ›2*2þËüüþ¹2*2þíüüþÓ2)2þAüüþÒ2)2þYüüþÍ2)2þvüüþÅ2)2þ•üüþ¥2)2þºüüþƒ2)2þåüüþd2(2þFüüý÷<2(2þmüüþ´2)2þ¤üüþ­üüþo2(2ý6íüüþHüüýß62(2þ]ü üý3ðüüþt2)2þ™ü üý2ÇüüýÕ62(2ý4äü üý2£üüýöP2)2þVü üý2ƒüüþy2*2þü üù2güêÀ[2*2ý7èü üü28=2-2þmü ü02ý3Îü ü02þgü ü/2ý4Ñü ü/2þjü ü.2ý4Õü ü.2þmüü-2ý7Ùüü-2þ…üü,2ýIõüü+2ý6Èüü+2þüü*2þ]üü)2ý>ãüü(2ý3±üü(2þ|üü'2ýfûüü&2ýYõüü%2ýTíüü$2ýfôüü#2ý}ûüü!2ý4—üü 2ý=±üü2ý]àüü2ý<—üü2ü7|éüü2ü4nÝü!ü2ýaÎü#ü2ü4iÃü%ü2üGŒáü'ü2ü5eØü*ü2üAŒòü,ü 2ü?wÁü/ü2üCyÁü2ü2ûAcŽÆü5üúk†¥ÇïüºüÿþÖL+LþªÿÿýþUL*Lþ¬ÿÿþtL*Lþ°ÿÿþ’L*Lþ¿ÿÿþ©L*LþÔÿÿþÃL*LþñÿÿþÛL)LþYÿÿþÚL)LþoÿÿþÖL)LþˆÿÿþÎL)Lþ¤ÿÿþ²L)LþÄÿÿþ”L)LþêÿÿþxL(Lþ^ÿÿýûTL(Lþÿÿþ¿L)Lþ±ÿÿþ¹ÿÿþ‚L(LýOñÿÿþ_ÿÿýæPL(Lþrÿ ÿýLôÿÿþ‡L)Lþ§ÿ ÿýLÐÿÿýÜOL(LýMéÿ ÿýL°ÿÿýúfL)Lþlÿ ÿýL”ÿÿþ‹L*Lþ ÿ ÿùL{ÿïÊpL*LýPíÿ ÿüLQVL-Lþ€ÿ ÿ0LýMÖÿ ÿ0Lþ{ÿ ÿ/LýMÙÿ ÿ/Lþ~ÿ ÿ.LýNÜÿ ÿ.Lþ€ÿÿ-LýPàÿÿ-Lþ–ÿÿ,Lý`ùÿÿ+LýOÑÿÿ+Lþžÿÿ*Lþrÿÿ)LýWèÿÿ)Lþ½ÿÿ(Lþÿÿ'Lý{þÿÿ&Lýnùÿÿ%Lýkñÿÿ$Lý{øÿÿ#Lýþÿÿ!LýN¥ÿÿ LýU½ÿÿLýræÿÿLýT¥ÿÿLüPîÿÿLüMäÿ!ÿLýuÖÿ#ÿLüN|Íÿ%ÿLü_œçÿ'ÿLüOyßÿ*ÿLüY›÷ÿ,ÿ LüW‰Ëÿ/ÿLü[‹Ëÿ2ÿLûYwžÏÿ5ÿú—²Ðóÿºÿšþ¦Í+Íþ²ššþÊÍ*Íþ²ššþÂÍ*Íþ±ššþ¹Í*Íþ¬ššþ²Í*Íþ¦ššþ«Í*Íþžššþ¤Í)ÍþÉššþ¤Í)ÍþÚšþ¦Í)Íþ¼ššþ¨Í)Íþ´ššþ°Í)Íþ«ššþ¹Í)Íþ ššþÀÍ(ÍþÈššý›ËÍ(Íþ¾ššþ¬Í)Íþ°ššþ®ššþ¾Í(ÍýÌžššþÇššý¡ÌÍ(Íþš šýÍššþ¼Í)Íþ³š šýͧššý¤ÌÍ)Íþ š šýͱššýœÆÍ)ÍþÄš šý͹ššþ»Í*Íþµš šùÍÀšž©ÃÍ*ÍýÌŸš šüÍÌÊÍ-Íþ¾š š1Íþ¦š š0ÍþÀš š0Íþ¥š š/Íþ¿š š.Íý̤š š.Íþ¾šš-ÍýÌ£šš-Íþ¸šš,ÍýÇœšš+Íý̧šš+Íþ¶šš*Íþšš)ÍýÊ šš)Íþ­šš(Íþºšš'ÍþÀšš&ÍýÜšš%ÍýÄžšš$ÍýÀœšš#Íþºšš!ÍýÌ´šš ÍýÊ­ššÍý¡ššÍýË´ššÍü̺ŸššÍý¾¢š!šÍýÁ¦š#šÍüÌ¿¨š%šÍüȶ¡š'šÍüÌÀ£š*šÍüÉ·œš,š Íüʼ©š/šÍüÉ»©š2šÍûÉÁ¶¨š5šú¿¸°§šºš§þµÿ+ÿþȧ§þøÿ*ÿþǧ§þäÿ*ÿþŧ§þÔÿ*ÿþ¾§§þÈÿ*ÿþ¶§§þ½ÿ*ÿþ«§§þ³ÿ)ÿþõ§§þ´ÿ)ÿþç§§þµÿ)ÿþÙ§§þ¸ÿ)ÿþ˧§þÄÿ)ÿþ¼§§þÒÿ)ÿþ®§§þâÿ(ÿþò§§ý¨ùÿ(ÿþݧ§þ¾ÿ)ÿþŧ§þÁ§§þÜÿ(ÿýý«§§þñ§§ý°üÿ(ÿþå§ §ýÿª§§þÙÿ)ÿþɧ §ýÿ¸§§ý³ýÿ(ÿýþ®§ §ýÿŧ§ý©íÿ)ÿþé§ §ýÿÒ§§þ×ÿ*ÿþͧ §ùÿ৬ºçÿ*ÿýü­§ §üÿûøÿ-ÿþݧ §0ÿýþµ§ §0ÿþà§ §/ÿýþ´§ §/ÿþß§ §.ÿýþ³§ §.ÿþݧ§-ÿýü²§§-ÿþѧ§,ÿýñ©§§+ÿýý·§§+ÿþͧ§*ÿþå§§)ÿý÷¯§§)ÿþÀ§§(ÿþÖ§§'ÿþà§§&ÿýè©§§%ÿýê«§§$ÿýà©§§#ÿþÕ§§!ÿýþʧ§ ÿýøÀ§§ÿý寧§ÿýùʧ§ÿüüÖ­§§ÿüþܰ§!§ÿýãµ§#§ÿüýß¹§%§ÿüòί§'§ÿüýá²§*§ÿüõΪ§,§ ÿü÷غ§/§ÿüô׺§2§ÿûöâθ§5§úÞÑĸ«§º§üÿš§üþf22þ^ÿÿür22üüþo22þXÿÿüq22üüþu22þWÿÿül22üüþu22þXÿÿüb22üüþt22þYÿÿüX22üüþr22þZÿÿüN22üüþq22þ[ÿÿüF22üüþo22þ\ÿÿü=22üüþn22þ]ÿÿü522üüþm22þ^ÿÿ2üþk22þ_ÿÿþà22üþd22þaÿÿþÐ22üþZ22þgÿÿþ¾22üþP22þqÿÿþ£22üþG22þ|ÿÿþ‹22üþ?22þˆÿÿþu22üþ622þ•ÿÿþa22üþõ22þ¢ÿÿþP22üþä22þ°ÿÿþ?22üþÏ22þ¾ÿÿþ322üþ´22þÎÿÿþ×22üþš22þßÿÿþº22üþ‚22ÿþŸ22üþm22þ=ÿÿþ…22üþZ22þNÿÿþe22üþI22þ`ÿÿþI22üþ822þtÿÿþ422üþè22þŠÿÿþÉ22üþ¾22þ£ÿÿþŸ22üþ–22þ½ÿÿþ|22üþt22þÛÿÿþ]22üþV22þ4ÿÿþB22üþ<22þBÿÿþø22üþß22þYÿÿþ¼22üþ²22þwÿÿþ”22üþŒ22þšÿÿþn22üþk22þÃÿÿþH22üþM22þ3ÿÿýè322üýî422þFÿÿþ¬22üþµ22þaÿÿþ|22üþƒ22þÿÿþS22üþZ22þ¥ÿÿþ622üýú922þÐÿÿþ½22üþÈ22þ7ÿÿþŠ22üþ“22þSÿÿþ`22üþg22þzÿÿþ=22 üýû?22þªÿÿþÄ22 üþ½2 2þåÿÿþ22 üþy22þGÿÿþI22 üþD22þmÿÿþÐ22 üþÈ2 2þšÿÿþ‡22 üþ2 2þÒÿÿþP22 üþJ22þ>ÿÿþÜ2 2 üþÒ2 2þaÿÿþ2 2 üþ‰2 2þŽÿÿþW2 2 üþQ2 2þÎÿÿýå42 2 üýÝ322þGÿÿþš2 2 üþ’2 2þ|ÿÿþ^2 2 üþX2 2þ¿ÿÿþ62 2 üýæ422þ@ÿÿþ¤2 2 üþ2 2þqÿÿþf2 2üýûG2 2þ³ÿÿþ92 2üþ°2 2þ:ÿÿþ®2 2üþ]2 2þhÿÿþg2 2ÿþ{LLþsÿÿü…LLÿÿþ‚LLþmÿÿü„LLÿÿþ‡LLþmÿÿüLLÿÿþ‡LLþmÿÿüvLLÿÿþ†LLþnÿÿünLLÿÿþ…LLþpÿÿüeLLÿÿþ„LLþpÿÿü]LLÿÿþ‚LLþqÿÿüVLLÿÿþLLþrÿÿüOLLÿÿþ€LLþsÿÿLÿþLLþtÿÿþæLLÿþxLLþuÿÿþØLLÿþpLLþ{ÿÿþÈLLÿþgLLþ„ÿÿþ°LLÿþ_LLþŽÿÿþ›LLÿþWLLþ™ÿÿþ‡LLÿþPLLþ¤ÿÿþvLLÿþùLLþ¯ÿÿþfLLÿþéLLþ¼ÿÿþWLLÿþ×LLþÈÿÿLÿþ¿LLþÖÿÿþÞLLÿþ¨LLþæÿÿþÄLLÿþ“LLÿþ­LLÿþLLþUÿÿþ–LLÿþpLLþeÿÿþyLLÿþ`LLþuÿÿþ`LLÿþRLLþ‡ÿÿþNLLÿþíLLþšÿÿþÒLLÿþÈLLþ°ÿÿþ­LLÿþ¥LLþÇÿÿþLLÿþ†LLþâÿÿþrLLÿþlLLþMÿÿþZLLÿþULLþZÿÿþúLLÿþæLLþnÿÿþÇLLÿþ½LLþ‰ÿÿþ£LLÿþœLLþ¨ÿÿþLLÿþLLþÍÿÿþ_LLÿþdLLþMÿÿþìLLÿýòMLLþ]ÿÿþ¸LLÿþÀLLþvÿÿþLLÿþ”LLþ’ÿÿþiLLÿþpLLþ²ÿÿþOLLÿýýSLLþØÿÿþÇLLÿþÑLLþPÿÿþšLLÿþ¢LLþiÿÿþuLLÿþ{LLþŒÿÿþULL ÿýþWLLþ¶ÿÿþÎLL ÿþÇL LþêÿÿþLL ÿþ‹LLþ_ÿÿþ`LL ÿþ\LLþÿÿþØLL ÿþÑL Lþ¨ÿÿþ—LL ÿþ’L LþÚÿÿþfLL ÿþbLLþVÿÿþãL L ÿþÚL Lþvÿÿþ L L ÿþ™L LþžÿÿþmL L ÿþgL LþÖÿÿýêML L ÿþäL Lþ^ÿÿþ¨L L ÿþ¡L LþÿÿþsL L ÿþmL LþÉÿÿþOL L ÿýëNLLþXÿÿþ±L L ÿþŸL Lþ„ÿÿþzL Lÿýþ^L Lþ¾ÿÿþRL Lÿþ¼L LþTÿÿþºL LÿþrL Lþ|ÿÿþ{L LšþÀÍÍþÂÿÿü½ÍÍššþ¾ÍÍþÄÿÿü½ÍÍššþ¼ÍÍþÄÿÿü¾ÍÍššþ¼ÍÍþÄÿÿüÁÍÍššþ¼ÍÍþÃÿÿüÃÍÍššþ½ÍÍþÃÿÿüÆÍÍššþ½ÍÍþÃÿÿüÈÍÍššþ¾ÍÍþÂÿÿüÊÍÍššþ¾ÍÍþÂÿÿüÌÍÍššþ¾ÍÍþÂÿÿÍšþ¿ÍÍþÂÿÿþ¡ÍÍšþÀÍÍþÁÿÿþ¥ÍÍšþÃÍÍþÀÿÿþªÍÍšþÅÍÍþ½ÿÿþ±ÍÍšþÈÍÍþºÿÿþ·ÍÍšþÊÍÍþ·ÿÿþ¼ÍÍšþÌÍÍþ´ÿÿþÁÍÍšþœÍÍþ±ÿÿþÆÍÍšþ ÍÍþ­ÿÿþÊÍÍšþ¥ÍÍþªÿÿÍšþ¬ÍÍþ¦ÿÿþ£ÍÍšþ³ÍÍþ¡ÿÿþ«ÍÍšþ¹ÍÍÿþ±ÍÍšþ¾ÍÍþÊÿÿþ¸ÍÍšþÃÍÍþÆÿÿþÀÍÍšþÇÍÍþÁÿÿþÇÍÍšþËÍÍþ¼ÿÿþÌÍÍšþŸÍÍþ·ÿÿþ§ÍÍšþªÍÍþ±ÿÿþ±ÍÍšþ´ÍÍþªÿÿþºÍÍšþ¼ÍÍþ¢ÿÿþÂÍÍšþÄÍÍÿþÉÍÍšþÊÍÍþÉÿÿþàÍÍšþ¡ÍÍþÃÿÿþªÍÍšþ­ÍÍþ¼ÿÿþ´ÍÍšþ¶ÍÍþ³ÿÿþ¾ÍÍšþ¿ÍÍþ¨ÿÿþÇÍÍšþÆÍÍÿþ©ÍÍšþžÍÍþÈÿÿþ®ÍÍšþ¬ÍÍþÁÿÿþºÍÍšþ¹ÍÍþ¹ÿÿþÅÍÍšþÃÍÍþ°ÿÿþÌÍÍšý›ËÍÍþ¥ÿÿþªÍÍšþ§ÍÍþÌÿÿþ·ÍÍšþµÍÍþÅÿÿþÁÍÍšþÀÍÍþ»ÿÿþÊÍÍšþÊÍÍþ¯ÿÿþ¨ÍÍ šþªÍ Íþ ÿÿþºÍÍ šþ»ÍÍþÈÿÿþÇÍÍ šþÈÍÍþ¾ÿÿþ¥ÍÍ šþ§Í Íþ³ÿÿþ¸ÍÍ šþ¹Í Íþ¤ÿÿþÆÍÍ šþÇÍÍþÊÿÿþ¢Í Í šþ¤Í ÍþÁÿÿþµÍ Í šþ·Í Íþ¶ÿÿþÄÍ Í šþÅÍ Íþ¦ÿÿþ Í Í šþ¢Í ÍþÈÿÿþ³Í Í šþµÍ ÍþºÿÿþÂÍ Í šþÄÍ Íþ©ÿÿþÌÍ Í šý ÌÍÍþÉÿÿþ°Í Í šþµÍ Íþ½ÿÿþÀÍ Í šþÈÍ Íþ¬ÿÿþËÍ Íšþ­Í ÍþËÿÿþ®Í ÍšþÂÍ Íþ¿ÿÿþÀÍ Í§þàÿÿþåÿÿüÚÿÿ§§þÜÿÿþèÿÿüÛÿÿ§§þÙÿÿþéÿÿüÞÿÿ§§þÙÿÿþèÿÿüãÿÿ§§þÚÿÿþèÿÿüèÿÿ§§þÚÿÿþçÿÿüíÿÿ§§þÛÿÿþæÿÿüóÿÿ§§þÜÿÿþæÿÿüøÿÿ§§þÜÿÿþåÿÿüýÿÿ§§þÝÿÿþåÿÿ§þÞÿÿþäÿÿþ¯ÿÿ§þâÿÿþãÿÿþ´ÿÿ§þçÿÿþàÿÿþ»ÿÿ§þìÿÿþÛÿÿþÅÿÿ§þòÿÿþÖÿÿþÏÿÿ§þ÷ÿÿþÐÿÿþÙÿÿ§þüÿÿþËÿÿþãÿÿ§þ©ÿÿþÅÿÿþíÿÿ§þ®ÿÿþÀÿÿþ÷ÿÿ§þµÿÿþ»ÿÿ§þ¾ÿÿþµÿÿþ²ÿÿ§þÈÿÿþ°ÿÿþ¼ÿÿ§þÓÿ%ÿþÆÿÿ§þÝÿÿþøÿÿþÑÿÿ§þçÿÿþîÿÿþáÿÿ§þñÿÿþäÿÿþñÿÿ§þûÿÿþÙÿÿþþÿÿ§þ­ÿÿþÏÿÿþ·ÿÿ§þ»ÿÿþÅÿÿþÆÿÿ§þÊÿÿþ»ÿÿþÖÿÿ§þÚÿÿþ±ÿÿþåÿÿ§þéÿÿþþÿÿþõÿÿ§þøÿÿþõÿÿþÞÿÿ§þ°ÿÿþèÿÿþ»ÿÿ§þ¿ÿÿþØÿÿþËÿÿ§þÎÿÿþÈÿÿþÜÿÿ§þÞÿÿþ¹ÿÿþñÿÿ§þîÿÿþþÿÿþ³ÿÿ§ý«þÿÿþóÿÿþÂÿÿ§þ¾ÿÿþãÿÿþÖÿÿ§þÒÿÿþÔÿÿþëÿÿ§þçÿÿþÄÿÿþýÿÿ§ý¨úÿÿþ´ÿÿþ»ÿÿ§þ·ÿÿþüÿÿþÏÿÿ§þÌÿÿþëÿÿþäÿÿ§þàÿÿþ×ÿÿþøÿÿ§þ÷ÿÿþÂÿÿþ¹ÿÿ §þ»ÿ ÿþ®ÿÿþÕÿÿ §þ×ÿÿþòÿÿþñÿÿ §þóÿÿþÝÿÿþ´ÿÿ §þ·ÿ ÿþÈÿÿþÑÿÿ §þÔÿ ÿþ´ÿÿþíÿÿ §þðÿÿþ÷ÿÿþ±ÿ ÿ §þ´ÿ ÿþãÿÿþÍÿ ÿ §þÐÿ ÿþÎÿÿþéÿ ÿ §þìÿ ÿþµÿÿý®þÿ ÿ §þ°ÿ ÿþòÿÿþÈÿ ÿ §þÌÿ ÿþÖÿÿþåÿ ÿ §þèÿ ÿþºÿÿþýÿ ÿ §ý®þÿÿþöÿÿþÅÿ ÿ §þÍÿ ÿþÛÿÿþáÿ ÿ §þòÿ ÿþ¿ÿÿþûÿ ÿ§þÀÿ ÿþùÿÿþÁÿ ÿ§þåÿ ÿþàÿÿþàÿ ÿ2þXüü2þYüü2þ[üü2þ_üü2þiüü2þtüü2þüü2þ‹üü2þ—üü2þ¥üü2þ²üü2þÁüü2þÐüü2þáüü2þòüü2þ6ü ü2þDü ü2þVü ü2þjü ü2þü ü2þ—ü ü2þ²ü ü2þÏü ü2þðü ü2þ<ü!ü2þNü!ü2þaü!ü2þuü!ü2þŒü!ü2þ­ü!ü2þÙü!ü2þ9ü"ü2þRü"ü2þoü"ü2þ‘ü"ü2þ¹ü"ü2þçü"ü2þ@ü#ü2þ[ü#ü2þyü#ü2þü#ü2þÈü#ü2ý8øü#ü2þXü$ü2þ‚ü$ü2þ³ü$ü2ý4íü$ü2þMü%ü2þtü%ü2þ£ü%ü2þÝü%ü2þCü&ü2þhü&ü2þ”ü&ü2þÏü&ü2þDü'ü2þxü'ü2þ»ü'ü2ý>úü'ü2þoü(ü2þ¯ü(ü2ý9õü(ü2þfü)ü2þ¥ü)üLþnÿÿLþoÿÿLþpÿÿLþtÿÿLþ|ÿÿLþ†ÿÿLþÿÿLþ›ÿÿLþ¥ÿÿLþ²ÿÿLþ½ÿÿLþËÿÿLþØÿÿLþçÿÿLþ÷ÿÿLþPÿ ÿLþ\ÿ ÿLþlÿ ÿLþ~ÿ ÿLþÿ ÿLþ¥ÿ ÿLþ½ÿ ÿLþ×ÿ ÿLþôÿ ÿLþUÿ!ÿLþeÿ!ÿLþuÿ!ÿLþ‡ÿ!ÿLþœÿ!ÿLþ¹ÿ!ÿLþàÿ!ÿLþSÿ"ÿLþhÿ"ÿLþ‚ÿ"ÿLþ ÿ"ÿLþÃÿ"ÿLþìÿ"ÿLþXÿ#ÿLþpÿ#ÿLþ‹ÿ#ÿLþ«ÿ#ÿLþÑÿ#ÿLýRüÿ#ÿLþnÿ$ÿLþ“ÿ$ÿLþ¾ÿ$ÿLýMñÿ$ÿLþdÿ%ÿLþ‡ÿ%ÿLþ°ÿ%ÿLþäÿ%ÿLþ[ÿ&ÿLþ|ÿ&ÿLþ£ÿ&ÿLþ×ÿ&ÿLþ\ÿ'ÿLþŠÿ'ÿLþÆÿ'ÿLýWýÿ'ÿLþ‚ÿ(ÿLþ»ÿ(ÿLýSùÿ(ÿLþ{ÿ)ÿLþ²ÿ)ÿÍþÚšÍþÚšÍþÚšÍþššÍþ¿ššÍþ¼ššÍþºššÍþ·ššÍþ´ššÍþ°ššÍþ­ššÍþ©ššÍþ¥ššÍþ¡ššÍþœššÍþÌš šÍþÈš šÍþÄš šÍþ¿š šÍþ¹š šÍþ´š šÍþ­š šÍþ¥š šÍþš šÍþÊš!šÍþÆš!šÍþÁš!šÍþ¼š!šÍþ¶š!šÍþ®š!šÍþ£š!šÍþËš"šÍþÅš"šÍþ¾š"šÍþµš"šÍþ«š"šÍþŸš"šÍþÉš#šÍþÚ#šÍþ»š#šÍþ²š#šÍþ§š#šÍýË›š#šÍþÚ$šÍþ¹š$šÍþ¬š$šÍþžš$šÍþÆš%šÍþ¼š%šÍþ±š%šÍþ¢š%šÍþÉš&šÍþ¿š&šÍþ´š&šÍþ¥š&šÍþÈš'šÍþ»š'šÍþªš'šÍýÊ›š'šÍþ¾š(šÍþ­š(šÍýËœš(šÍþÀš)šÍþ°š)šÿþè§§ÿþç§§ÿþæ§§ÿþä§§ÿþß§§ÿþÚ§§ÿþÕ§§ÿþϧ§ÿþʧ§ÿþħ§ÿþ¿§§ÿþº§§ÿþ´§§ÿþ¯§§ÿþª§§ÿþü§ §ÿþó§ §ÿþé§ §ÿþß§ §ÿþÔ§ §ÿþʧ §ÿþ¿§ §ÿþµ§ §ÿþª§ §ÿþø§!§ÿþî§!§ÿþã§!§ÿþÙ§!§ÿþΧ!§ÿþÁ§!§ÿþ²§!§ÿþú§"§ÿþë§"§ÿþܧ"§ÿþ̧"§ÿþ½§"§ÿþ­§"§ÿþö§#§ÿþæ§#§ÿþ×§#§ÿþǧ#§ÿþ·§#§ÿýû¨§#§ÿþè§$§ÿþÓ§$§ÿþ¿§$§ÿýþ«§$§ÿþî§%§ÿþÙ§%§ÿþŧ%§ÿþ°§%§ÿþô§&§ÿþà§&§ÿþ˧&§ÿþµ§&§ÿþó§'§ÿþا'§ÿþ¼§'§ÿý÷¨§'§ÿþܧ(§ÿþÀ§(§ÿýú©§(§ÿþà§)§ÿþħ)§ üþˆ22 üþŽ22 üþŒ22 üþ‰22 üþ‡22 üþ…22 üþ‚22 üþ€22 üþ~22 üþ|22 üþy22 üþw22 üþu22 üþs22 üþq22 üþo22 üþm22 üþi22 üþ_22 üþT22 üþJ22 üþ?22 üþ622üþò22üþß22üþÍ22üþ»22üþ¬22üþ22üþ22üþ22üþt22üþi22üþ]22üþP22üþ=22üþð22üþÎ22üþ°22üþ”22üþ|22üþf22üþR22üþ?22üýô322üþÒ22üþ´22üþ˜22üþ22üþi22þ:üüþQ22þKüüýû822þ_üüþÖ22þsüüþª22þŠüüþ…22þ¥üüþd22þÍüüþI22ý6ÿüüýô422ýLÿüüþÇ22ýiÿüüþ22ýŠÿüüþy22ý°ÿüüþ[22ýÝÿüüþ@22ü<ÿÿüüþç22þVÿÿ ÿþ™LL ÿþžLL ÿþ›LL ÿþ™LL ÿþ—LL ÿþ•LL ÿþ“LL ÿþ‘LL ÿþLL ÿþLL ÿþ‹LL ÿþ‰LL ÿþ‡LL ÿþ†LL ÿþ„LL ÿþ‚LL ÿþ€LL ÿþ}LL ÿþtLL ÿþjLL ÿþaLL ÿþXLL ÿþPLLÿþ÷LLÿþæLLÿþÖLLÿþÆLLÿþ¸LLÿþ«LLÿþžLLÿþ’LLÿþ‡LLÿþ|LLÿþrLLÿþfLLÿþVLLÿþôLLÿþÖLLÿþ¼LLÿþ£LLÿþŽLLÿþzLLÿþhLLÿþXLLÿþøLLÿþÚLLÿþ¿LLÿþ¦LLÿþLLÿþ|LLþSÿÿþhLLþcÿÿýþRLLþtÿÿþÝLLþ†ÿÿþ¶LLþšÿÿþ•LLþ²ÿÿþyLLþÖÿÿþ`LLþOÿÿýøMLLþcÿÿþÐLLþ}ÿÿþ«LLþšÿÿþ‹LLþ¼ÿÿþpLLþäÿÿþXLLþTÿÿþìLLþlÿÿ šþ·ÍÍ šþ¶ÍÍ šþ¶ÍÍ šþ·ÍÍ šþ¸ÍÍ šþ¸ÍÍ šþ¹ÍÍ šþ¹ÍÍ šþºÍÍ šþºÍÍ šþ»ÍÍ šþ¼ÍÍ šþ¼ÍÍ šþ½ÍÍ šþ½ÍÍ šþ¾ÍÍ šþ¾ÍÍ šþ¿ÍÍ šþÂÍÍ šþÄÍÍ šþÇÍÍ šþÊÍÍ šþÌÍÍšþœÍÍšþ¡ÍÍšþ¦ÍÍšþªÍÍšþ®ÍÍšþ²ÍÍšþ¶ÍÍšþ¹ÍÍšþ¼ÍÍšþ¿ÍÍšþÂÍÍšþÆÍÍšþÊÍÍšþÍÍšþ¦ÍÍšþ­ÍÍšþ´ÍÍšþºÍÍšþÀÍÍšþÅÍÍšþÊÍÍšþœÍÍšþ¤ÍÍšþ¬ÍÍšþ³ÍÍšþ¹ÍÍšþ¿ÍÍþËššþÅÍÍþÇššþËÍÍþššþ¤ÍÍþ½ššþ¯ÍÍþ·ššþ¸ÍÍþ°ššþÀÍÍþ¦ššþÇÍÍýÌÿššþœÍÍýÆÿššþ§ÍÍý¿ÿššþ²ÍÍý·ÿššþ»ÍÍý­ÿššþÃÍÍý¢ÿššþÉÍÍüËÿÿššþŸÍÍþÄÿÿ §þÐÿÿ §þÎÿÿ §þÏÿÿ §þÐÿÿ §þÑÿÿ §þÒÿÿ §þÓÿÿ §þÔÿÿ §þÕÿÿ §þÖÿÿ §þ×ÿÿ §þØÿÿ §þÙÿÿ §þÚÿÿ §þÛÿÿ §þÜÿÿ §þÝÿÿ §þßÿÿ §þäÿÿ §þêÿÿ §þðÿÿ §þöÿÿ §þüÿÿ§þªÿÿ§þ°ÿÿ§þµÿÿ§þ¼ÿÿ§þÂÿÿ§þÇÿÿ§þÍÿÿ§þÔÿÿ§þÙÿÿ§þßÿÿ§þåÿÿ§þíÿÿ§þøÿÿ§þªÿÿ§þµÿÿ§þÀÿÿ§þËÿÿ§þÖÿÿ§þáÿÿ§þëÿÿ§þöÿÿ§þ©ÿÿ§þ´ÿÿ§þ¾ÿÿ§þÊÿÿ§þÔÿÿ§þßÿÿþú§§þìÿÿþï§§þûÿÿþä§§þ³ÿÿþÚ§§þÂÿÿþϧ§þÒÿÿþħ§þáÿÿþµ§§þñÿÿýýÿ§§ý©þÿÿýïÿ§§þ¸ÿÿýßÿ§§þÇÿÿýÏÿ§§þ×ÿÿýÀÿ§§þæÿÿý°ÿ§§þöÿÿüùÿÿ§§þ­ÿÿþéÿÿ2þDÿ$ÿþ:22þ?ÿ$ÿþ822þAÿ$ÿþ622þBÿ$ÿþ522þDÿ$ÿþ322þFÿ$ÿ2þHÿ$ÿ2þJÿ$ÿ2þLÿ$ÿ2þNÿ$ÿ2þPÿ#ÿþä22þRÿ#ÿþÒ22þTÿ#ÿþÁ22þVÿ#ÿþ±22þXÿ#ÿþ£22þZÿ#ÿþ”22þ\ÿ#ÿþ‡22þ_ÿ#ÿþ{22þaÿ#ÿþo22þiÿ#ÿþc22þtÿ#ÿþY22þÿ#ÿþN22þŽÿ#ÿþE22þœÿ#ÿþ<22þ«ÿ#ÿþ422þºÿ"ÿþý22þËÿ"ÿþÙ22þÝÿ"ÿþÇ22$ÿþ¸22þ5ÿ#ÿþ§22þ?ÿ#ÿþ22þIÿ#ÿþx22þSÿ#ÿþc22þ]ÿ#ÿþO22þiÿ#ÿþ>22þtÿ#ÿ2þ„ÿ"ÿþÑ22þ›ÿ"ÿþ³22þ·ÿ"ÿþ™22þÕÿ"ÿþ€22þ3ÿ#ÿþk22þ@ÿ#ÿþV22þQÿ#ÿþD22þeÿ#ÿþ522þ{ÿ"ÿþÞ22þ’ÿ"ÿþ¾22þ­ÿ"ÿþ£22þÊÿ"ÿþ‰22þýÿ"ÿþs22$ÿþY22$ÿþ?22#ÿþå22#ÿþ¸22#ÿþ22#ÿþo22#ÿþR22#ÿþ922"ÿþÙ22"ÿþ­22"ÿþ‡22"ÿþg22"ÿþK22"ÿþ522!ÿþÌ22Lþ\ÿ$ÿþSLLþXÿ$ÿþRLLþYÿ$ÿþPLLþZÿ$ÿþNLLþ\ÿ$ÿþMLLþ^ÿ$ÿLþ_ÿ$ÿLþaÿ$ÿLþcÿ$ÿLþeÿ$ÿLþfÿ#ÿþéLLþhÿ#ÿþÚLLþjÿ#ÿþËLLþlÿ#ÿþ½LLþnÿ#ÿþ°LLþpÿ#ÿþ£LLþqÿ#ÿþ—LLþtÿ#ÿþLLþvÿ#ÿþ‚LLþ|ÿ#ÿþxLLþ‡ÿ#ÿþnLLþ’ÿ#ÿþeLLþžÿ#ÿþ]LLþªÿ#ÿþTLLþ·ÿ#ÿþMLLþÅÿ"ÿþýLLþÔÿ"ÿþàLLþäÿ"ÿþÐLL$ÿþÂLLþOÿ#ÿþ´LLþWÿ#ÿþžLLþ`ÿ#ÿþŠLLþiÿ#ÿþwLLþrÿ#ÿþfLLþ|ÿ#ÿþVLLþ‡ÿ#ÿLþ•ÿ"ÿþÙLLþ©ÿ"ÿþ¾LLþÂÿ"ÿþ§LLþÜÿ"ÿþ‘LL$ÿþ~LLþXÿ#ÿþlLLþhÿ#ÿþ\LLþyÿ#ÿþNLLþÿ"ÿþåLLþ¡ÿ"ÿþÈLLþ¹ÿ"ÿþ°LLþÓÿ"ÿþ™LLþýÿ"ÿþ†LL$ÿþoLL$ÿþWLL#ÿþêLL#ÿþÂLL#ÿþ LL#ÿþ‚LL#ÿþhLL#ÿþRLL"ÿþàLL"ÿþ¹LL"ÿþ—LL"ÿþ{LL"ÿþbLL"ÿþNLL!ÿþÕLLÍþÈÿ$ÿþËÍÍþÊÿ$ÿþËÍÍþÉÿ$ÿþÌÍÍþÉÿ$ÿþÌÍÍþÈÿ$ÿÍþÈÿ$ÿÍþÇÿ$ÿÍþÇÿ$ÿÍþÆÿ$ÿÍþÆÿ$ÿÍþÆÿ#ÿþ ÍÍþÅÿ#ÿþ¤ÍÍþÄÿ#ÿþ©ÍÍþÄÿ#ÿþ­ÍÍþÃÿ#ÿþ±ÍÍþÃÿ#ÿþ´ÍÍþÂÿ#ÿþ¸ÍÍþÂÿ#ÿþ»ÍÍþÁÿ#ÿþ¾ÍÍþ¿ÿ#ÿþÁÍÍþ¼ÿ#ÿþÃÍÍþ¹ÿ#ÿþÆÍÍþ¶ÿ#ÿþÈÍÍþ²ÿ#ÿþËÍÍþ¯ÿ#ÿÍþ«ÿ"ÿþõÍÍþ¦ÿ"ÿþ£ÍÍþ¢ÿ"ÿþ§ÍÍ$ÿþ«ÍÍþÌÿ#ÿþ¯ÍÍþÊÿ#ÿþ¶ÍÍþÇÿ#ÿþ»ÍÍþÅÿ#ÿþÁÍÍþÂÿ#ÿþÆÍÍþ¿ÿ#ÿþÊÍÍþ¼ÿ#ÿÍþ¸ÿ"ÿþ¥ÍÍþ²ÿ"ÿþ¬ÍÍþ«ÿ"ÿþ³ÍÍþ¤ÿ"ÿþ¹ÍÍ$ÿþ¿ÍÍþÉÿ#ÿþÄÍÍþÅÿ#ÿþÈÍÍþÀÿ#ÿþÌÍÍþ»ÿ"ÿþ¢ÍÍþµÿ"ÿþªÍÍþ®ÿ"ÿþ±ÍÍþ§ÿ"ÿþ·ÍÍþõÿ"ÿþ½ÍÍ$ÿþÃÍÍ$ÿþÊÍÍ#ÿþ ÍÍ#ÿþ«ÍÍ#ÿþµÍÍ#ÿþ¾ÍÍ#ÿþÅÍÍ#ÿþËÍÍ"ÿþ£ÍÍ"ÿþ®ÍÍ"ÿþ¸ÍÍ"ÿþÀÍÍ"ÿþÇÍÍ"ÿþÌÍÍ!ÿþ¦ÍÍÿþóÿ$ÿþúÿÿþöÿ$ÿþûÿÿþöÿ$ÿþüÿÿþõÿ$ÿþýÿÿþôÿ$ÿþþÿÿþòÿ=ÿþñÿ=ÿþðÿ=ÿþïÿ=ÿþîÿ=ÿþíÿ#ÿþ®ÿÿþëÿ#ÿþ´ÿÿþêÿ#ÿþºÿÿþéÿ#ÿþÀÿÿþèÿ#ÿþÅÿÿþçÿ#ÿþËÿÿþæÿ#ÿþÑÿÿþäÿ#ÿþÖÿÿþãÿ#ÿþÜÿÿþßÿ#ÿþâÿÿþÙÿ#ÿþèÿÿþÔÿ#ÿþíÿÿþÎÿ#ÿþóÿÿþÈÿ#ÿþùÿÿþÂÿ#ÿþþÿÿþ¼ÿ"ÿþôÿÿþ¶ÿ"ÿþ²ÿÿþ°ÿ"ÿþ¸ÿ=ÿþ½ÿÿþýÿ#ÿþÃÿÿþ÷ÿ#ÿþÍÿÿþñÿ#ÿþØÿÿþëÿ#ÿþâÿÿþåÿ#ÿþíÿÿþßÿ#ÿþ÷ÿÿþÙÿ=ÿþÒÿ"ÿþ´ÿÿþÈÿ"ÿþ¿ÿÿþ½ÿ"ÿþÉÿÿþ³ÿ"ÿþÔÿ=ÿþÞÿÿþöÿ#ÿþéÿÿþìÿ#ÿþóÿÿþáÿ#ÿþýÿÿþÖÿ"ÿþ°ÿÿþÌÿ"ÿþ»ÿÿþÁÿ"ÿþÅÿÿþ·ÿ"ÿþÐÿÿþôÿ"ÿþÚÿ=ÿþçÿ=ÿþ÷ÿ<ÿþ®ÿ=ÿþ½ÿ=ÿþÍÿ=ÿþÜÿ=ÿþëÿ=ÿþûÿ<ÿþ²ÿ=ÿþÁÿ=ÿþÑÿ=ÿþàÿ=ÿþïÿ=ÿþýÿ<ÿþ¶ÿÿ 2þšÿÿ 2þÿÿ 2þŸÿÿ 2þ£ÿÿ 2þ¥ÿÿ 2þ¨ÿÿ 2þ«ÿÿ 2þ­ÿÿ 2þ°ÿÿ 2þ³ÿÿ 2þ·ÿÿ 2þ»ÿÿ 2þÈÿÿ 2þÚÿÿ 2þýÿÿ2þ4ÿÿ2þ<ÿÿ2þFÿÿ2þPÿÿ2þYÿÿ2þdÿÿ2þpÿÿ2þ|ÿÿ2þˆÿÿ2þ–ÿÿ2þ¥ÿÿ2þ´ÿÿ2þÄÿÿ2þÕÿÿ2þíÿÿ2þ3ÿÿ2þ:ÿÿ2þDÿÿ2þSÿÿ2þfÿÿ2þ|ÿÿ2þ”ÿÿ2þ®ÿÿ2þÌÿÿ2!ÿ2þ;ÿ ÿ2þMÿ ÿ2þ`ÿ ÿ2þtÿ ÿ2þŒÿ ÿ2þ¥ÿ ÿ2þÁÿ ÿ2þáÿ ÿ2þ6ÿ!ÿ2þFÿ!ÿ2þYÿ!ÿ2þmÿ!ÿ2þƒÿ!ÿ2þœÿ!ÿ2þ¾ÿ!ÿ2þýÿ!ÿ2þCÿ"ÿ2þ^ÿ"ÿ2þ}ÿ"ÿ2þ¡ÿ"ÿ2þÊÿ"ÿ2þ5ÿ#ÿ2þJÿ#ÿ2þfÿ#ÿ Lþ¨ÿÿ Lþ«ÿÿ Lþ­ÿÿ Lþ°ÿÿ Lþ²ÿÿ Lþµÿÿ Lþ·ÿÿ Lþ¹ÿÿ Lþ¼ÿÿ Lþ¾ÿÿ LþÂÿÿ LþÆÿÿ LþÑÿÿ Lþáÿÿ LþýÿÿLþMÿÿLþUÿÿLþ]ÿÿLþfÿÿLþoÿÿLþyÿÿLþƒÿÿLþŽÿÿLþ™ÿÿLþ¥ÿÿLþ²ÿÿLþ¿ÿÿLþÎÿÿLþÜÿÿLþñÿÿL ÿLþSÿÿLþ\ÿÿLþiÿÿLþ{ÿÿLþŽÿÿLþ£ÿÿLþºÿÿLþÕÿÿL!ÿLþTÿ ÿLþdÿ ÿLþuÿ ÿLþ‡ÿ ÿLþ›ÿ ÿLþ²ÿ ÿLþËÿ ÿLþçÿ ÿLþPÿ!ÿLþ^ÿ!ÿLþnÿ!ÿLþÿ!ÿLþ”ÿ!ÿLþªÿ!ÿLþÈÿ!ÿLþýÿ!ÿLþ[ÿ"ÿLþsÿ"ÿLþÿ"ÿLþ®ÿ"ÿLþÓÿ"ÿLþNÿ#ÿLþbÿ#ÿLþ{ÿ#ÿ Íþ³ÿÿ Íþ²ÿÿ Íþ±ÿÿ Íþ±ÿÿ Íþ°ÿÿ Íþ¯ÿÿ Íþ¯ÿÿ Íþ®ÿÿ Íþ­ÿÿ Íþ¬ÿÿ Íþ«ÿÿ Íþªÿÿ Íþ§ÿÿ Íþ£ÿÿ Íþõÿÿ ÍÿÍþÊÿÿÍþÈÿÿÍþÆÿÿÍþÃÿÿÍþÀÿÿÍþ½ÿÿÍþºÿÿÍþ·ÿÿÍþ´ÿÿÍþ°ÿÿÍþ¬ÿÿÍþ¨ÿÿÍþ¤ÿÿÍþ¸ÿÿÍ ÿÍþËÿÿÍþÈÿÿÍþÅÿÿÍþÀÿÿÍþºÿÿÍþ´ÿÿÍþ®ÿÿÍþ¦ÿÿÍ!ÿÍþËÿ ÿÍþÆÿ ÿÍþÁÿ ÿÍþ¼ÿ ÿÍþ¶ÿ ÿÍþ°ÿ ÿÍþ©ÿ ÿÍþ¡ÿ ÿÍþÌÿ!ÿÍþÈÿ!ÿÍþÃÿ!ÿÍþ¾ÿ!ÿÍþ¹ÿ!ÿÍþ²ÿ!ÿÍþªÿ!ÿÍþõÿ!ÿÍþÉÿ"ÿÍþÂÿ"ÿÍþºÿ"ÿÍþ±ÿ"ÿÍþ§ÿ"ÿÍþÌÿ#ÿÍþÇÿ#ÿÍþÀÿ#ÿ ÿþÈÿ'ÿþÇÿ'ÿþÆÿ'ÿþÅÿ'ÿþÄÿ'ÿþÃÿ'ÿþÂÿ'ÿþÁÿ'ÿþÀÿ'ÿþ¿ÿ'ÿþ½ÿ'ÿþ¼ÿ'ÿþ·ÿ'ÿþ±ÿ'ÿþôÿ&ÿþþÿ'ÿþøÿ'ÿþóÿ'ÿþíÿ'ÿþçÿ'ÿþáÿ'ÿþÛÿ'ÿþÖÿ'ÿþÐÿ'ÿþÊÿ'ÿþÄÿ'ÿþ¾ÿ'ÿþ¹ÿ'ÿþ³ÿ'ÿþ½ÿPÿþúÿ'ÿþôÿ'ÿþëÿ'ÿþàÿ'ÿþÖÿ'ÿþËÿ'ÿþÁÿ'ÿþ¶ÿPÿþùÿ'ÿþîÿ'ÿþäÿ'ÿþÙÿ'ÿþÏÿ'ÿþÄÿ'ÿþºÿ'ÿþ¯ÿ&ÿþüÿ'ÿþòÿ'ÿþèÿ'ÿþÝÿ'ÿþÒÿ'ÿþÈÿ'ÿþ»ÿ'ÿþôÿ&ÿþôÿ'ÿþåÿ'ÿþÕÿ'ÿþÆÿ'ÿþ·ÿ&ÿþýÿ'ÿþðÿ'ÿþàÿ#ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ&ÿ/ÿþ§‡ ‡þ§ÿ.ÿý퉇 ‡þ‹ÿ/ÿþ­‡ ‡1ÿþ‹‡ ‡1ÿþ´‡ ‡2ÿþ‡ ‡2ÿþ»‡ ‡3ÿþ‡ ‡3ÿþ‡ ‡4ÿþ“‡‡4ÿþʇ‡5ÿþ˜‡‡5ÿþÒ‡‡6ÿþ‡‡6ÿþÚ‡‡7ÿþ£‡‡7ÿý∇‡8ÿþ©‡‡8ÿýõ‰‡‡9ÿþ¯‡‡:ÿþ‹‡‡:ÿþ¶‡‡;ÿþ‡‡;ÿþ½‡‡<ÿü‘‡‡ÿ;ÿüć‡ÿ<ÿý”‡ÿ<ÿý̇ÿ=ÿþ™ÿ=ÿþÔÿýÿýÈdÿ:ÿûÃ_32ÿ8ÿýÐc227ÿüÝn4225ÿüñz7224ÿý‡:222ÿý”?2 20ÿý¤F2 2.ÿý³N2 2,ÿýÂX22*ÿýÐc22(ÿüÝn422&ÿüø{722%ÿý–=22#ÿýºM22!ÿýÛe22 ÿý‚722ÿý¥B22ÿýÈV22ÿüåq32 2ÿý:2"2ÿý³I2$2ÿýÕ`2&2ÿý|62'2ÿý?2)2ÿýÎV2+2ÿý52,2/ÿþßÓ ÓþÖÿ.ÿýùÔÓ Ó0ÿþáÓ Ó1ÿþÔÓ Ó1ÿþäÓ Ó2ÿþÕÓ Ó2ÿþçÓ Ó3ÿþÖÓ Ó3ÿþéÓ Ó4ÿþØÓÓ4ÿþìÓÓ5ÿþÙÓÓ5ÿþïÓÓ6ÿþÛÓÓ6ÿþòÓÓ7ÿþÝÓÓ7ÿþõÓÓ8ÿþàÓÓ8ÿýûÔÓÓ9ÿþâÓÓ:ÿþÔÓÓ:ÿþäÓÓ;ÿþÕÓÓ;ÿþçÓÓ<ÿü×ÓÓÿ;ÿüêÓÓÿ<ÿýØÓÿ<ÿýíÓÿ=ÿþÚÿ=ÿþðÿýÿýÑxÿ:ÿûÍtLLÿ8ÿýØwLL7ÿüäMLL5ÿüôŒPLL4ÿý—TLL2ÿý£XL L0ÿý±^L L.ÿý¾eL L,ÿýÌmLL*ÿýØwLL(ÿüäMLL&ÿüúPLL%ÿý¥VLL#ÿýÅdLL!ÿýâyLL ÿý“QLLÿý²ZLLÿýÑlLLÿüê„ML LÿýŸTL"Lÿý¾`L$LÿýÜuL&LÿýŽOL'Lÿý«XL)LÿýÖlL+LÿýOL,L/ÿþ\D Dþ'ÿ.ÿý©ED Dþ@ÿ/ÿþ`D D1ÿþGD D1ÿþeD D2ÿþHD D2ÿþjD D3ÿþJD D3ÿþpD D4ÿþMDD4ÿþuDD5ÿþPDD5ÿþ{DD6ÿþTDD6ÿþDD7ÿþXDD7ÿý‡EDD8ÿþ]DD8ÿýÌFDD9ÿþaDD:ÿþGDD:ÿþfDD;ÿþIDD;ÿþlDD<ÿüKDDÿ;ÿüqDDÿ<ÿýNDÿ<ÿýwDÿ=ÿþQÿ=ÿþ|ÿýÿý§Àÿ:ÿû¨ÂÍÍÿ8ÿý¥ÁÍÍ7ÿý¢¾ÍÍ5ÿüÇ»ÌÍÍ4ÿý¸ËÍÍ2ÿý´ÊÍ Í0ÿý°ÈÍ Í.ÿý¬ÆÍ Í,ÿý©ÄÍÍ*ÿý¥ÁÍÍ(ÿý¢¾ÍÍ&ÿüà»ÌÍÍ%ÿý´ÊÍÍ#ÿý«ÆÍÍ!ÿý¢ÀÍÍ ÿý¹ÌÍÍÿý°ÉÍÍÿý§ÄÍÍÿý ½Í!ÍÿýµËÍ"Íÿý¬ÇÍ$Íÿý¤ÁÍ&ÍÿýºÌÍ'Íÿý²ÊÍ)Íÿý¦ÄÍ+Íÿý¹ÌÍ,Í/ÿþßÿ=ÿýÁýÿ=ÿþÙÿ>ÿþûÿ=ÿþÔÿ>ÿþøÿ=ÿþÏÿ>ÿþõÿ=ÿþÉÿ>ÿþòÿ=ÿþÄÿ>ÿþíÿ=ÿþ¾ÿ>ÿþèÿ=ÿþºÿ>ÿþãÿ=ÿýµþÿ=ÿþÞÿ=ÿýÕýÿ=ÿþØÿ>ÿþûÿ=ÿþÓÿ>ÿþøÿ=ÿþÍÿ>ÿþôÿ=ÿþÈÿ>ÿþñÿ=ÿþÃÿ>ÿþìÿ=ÿþ½ÿýÿý·âÿ:ÿý¹äÿ:ÿý´âÿ:ÿü°Üþÿ9ÿüÈ×üÿ:ÿýÑùÿ:ÿýËöÿ:ÿýÅòÿ:ÿý¿îÿ:ÿý¹èÿ:ÿý´âÿ:ÿü°Üþÿ9ÿüÞÖüÿ:ÿýÊøÿ:ÿý¼îÿ:ÿý±áÿ;ÿýÓüÿ:ÿýÄõÿ:ÿý·éÿ:ÿü®Ûþÿ:ÿýÍùÿ:ÿý¿ñÿ:ÿý³äÿ;ÿýÖýÿ:ÿýÇöÿ:ÿýµéÿ;ÿýÔýÿ,ÿ$Ãþ’‡‡þÀÃ"Ãþ²‡‡þ¤Ã#Ãþ–‡‡ý‰¾Ã"Ãþ¶‡‡þ Ã#Ãþ™‡‡ýˆ»Ã"Ãþ¹‡‡þÃ#Ãþ‡‡þ¸Ã"Ãý¼ˆ‡‡þ™Ã#Ãþ¡‡‡þµÃ"Ãý¾Š‡‡þ•Ã#Ãþ¤‡‡þ²Ã"ÃýÀ‹‡‡þ’Ã#Ãþ¨‡‡þ®Ã"ÃýÁއ‡ýÂÃ"Ãþ¬‡‡þªÃ#Ãþ‡‡ýÁÃ"Ãþ¯‡‡þ§Ã#Ãþ“‡‡ý‹¿Ã"Ãþ³‡‡þ£Ã#Ãþ—‡‡ý‰½Ã"Ãþ·‡‡þŸÃ#Ãþš‡‡ýˆ»Ã"Ãýºˆ‡‡þœÃ#Ãþž‡‡þ¸Ã"Ãý¼‰‡‡þ˜Ã#Ãþ¢‡‡þ´Ã"Ãý¾Š‡‡þ”Ã#Ãþ¥‡‡þ±Ã"ÃýÀŒ‡‡þ‘Ã#Ãþ©‡ ‡þž‡ ‡þ­Ã"ÃýÂŽ‡‡þ܇ ‡ýÂÃ"Ãþ­‡‡ýÿ¤‡ ‡þ©Ã#Ãþ‘‡‡üÿ㈇ ‡ýŒÁÃ"Ãþ°‡‡ÿþª‡ ‡þ¦Ã#Ãþ”‡‡ÿýʆ‡ ‡ýŠ¿Ã"Ãþ´‡‡ûÏi4`‡ ‡þ¢Ã#Ãþ—‡‡ú3228‚‡ ‡ý‰½Ã"Ãþ·‡‡2þ[‡ ‡þžÃ#Ãþ›‡‡2ý6‡ ‡ýˆºÃ"Ãýºˆ‡‡2þV‡ ‡þ›Ã#ÃþŸ‡‡2ý4|‡ ‡þ·Ã"Ãý½‰‡‡2þQ‡ ‡þ—Ã#Ãþ¢‡‡2ý3x‡ ‡þ´Ã"Ãý¿‹‡‡2þK‡ ‡þ”Ã#Ãþ¦‡‡2þs‡ ‡þ°Ã"ÃûÁŒ‡‡22þF‡ ‡þÃ#Ãüª‡‡22þn‡ ‡þ¬Ã"Ãü‡22þB‡ ‡ýŽÂÃ"Ãý­‡22þi‡ ‡þ©Ã#Ãþ’22ý>…‡ ‡ýŒÀÃ"Ãþ±2 2þd‡ ‡þ¥Ã#à 2ý:„‡ ‡ýоÃ"à 2þ_‡ ‡þ¡Ã"à 2ý7‡ ‡ýˆ¼Ã!à 2þZ‡ ‡þÃ!à 2ý5‡ ‡þ¹Ã à 2þU‡ ‡þšÃ à 2ý3{‡ ‡þ¶ÃÃ2þO‡ ‡þ–ÃÃ2þw‡ ‡þ³ÃÃ2þJ‡ ‡þ“ÃÃ2þr‡ ‡þ¯ÃÃ2þE‡ ‡ýÂÃÃ$ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÕØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÖÓ ÓþÜÓ ÓþÖØ#ØþÔÓÓþóÓ ÓþÔØ#ØþÖÓÓýÿÞÓ ÓþÖØ#ØþÔÓÓýÿöÓ Óþר"ØþÖÓÓÿþàÓ ÓþÕØ#ØþÔÓÓÿýÛÑÓ Óþר"Øþ×ÓÓû×|M•Ó ÓþÕØ#ØþÔÓÓúMLLVËÓ Óþר"Øþ×ÓÓLþÓ ÓþÕØ#ØþÕÓÓLýRÇÓ Óþר"Øþ×ÓÓLþ…Ó ÓþÕØ#ØþÕÓÓLýOÂÓ Óþר"Øþ×ÓÓLþ}Ó ÓþÔØ#ØþÕÓÓLýM»Ó ÓþÖØ"Øþ×ÓÓLþtÓ ÓþÔØ#ØþÕÓÓLþ´Ó ÓþÖØ#ØÓLþlÓ ÓþÔØ#ØüÖÓÓLLþ¬Ó ÓþÖØ#ØýÔÓLLýeÒÓ ÓþÔØ#ØýÖÓLLþ¤Ó ÓþÖØ#ØþÔLLý_ÐÓ Óþר"ØþÖL Lþ›Ó ÓþÕØ#Ø LýYÎÓ Óþר"Ø Lþ“Ó ÓþÕØ"Ø LýTÊÓ Óþר!Ø Lþ‹Ó ÓþÕØ!Ø LýQÆÓ Óþר Ø LþƒÓ ÓþÔØ Ø LýNÀÓ ÓþרØLþ{Ó ÓþÔØØLýMºÓ ÓþÖØØLþsÓ ÓþÔØØLþ²Ó ÓþÖØØLþkÓ ÓþÔØØ$þ:DDþ"þDDþ*#þ7DDýB"þDDþ.#þ4DDýC"þDDþ1#þ1DDþ"ýCDDþ4#þ-DDþ"ýBDDþ7#þ*DDþ"ý@DDþ:#þ'DDþ!"ý>DDý="þ$DDþ%#þDDþƒD Dý="þ#DDýÿYD Dþ&#þ;DDüÿˆED Dý?"þ DDÿþ^D Dþ)#þ8DDÿý–GD DýA"þDDû¥¿ÍƒD Dþ,#þ6DDÍýÃLD DýB"þDDÍþ‹D Dþ/#þ2DDÍýÇPD DýC"ýCDDÍþ”D Dþ3#þ/DDÍýÊVD Dþ"ýBDDÍþœD Dþ6#þ,DDÍýÌ\D Dþ"ýADDÍþ¤D Dþ9#þ)DDÍþdD Dþ "û?DDÍÍþ¬D Dþ<#ü%DDÍÍþlD Dþ#"ü=DÍÍý´ED Dý>"ý"DÍÍþtD Dþ&#þ;ÍÍýºGD Dý@"þÍ Íþ|D Dþ*# ÍýÀID DýA" Íþ„D Dþ-" ÍýÄMD DýC! ÍþD Dþ0! ÍýÈQD Dþ  Íþ•D Dþ3  ÍýËWD DþÍþžD Dþ7ÍýÌ^D DþÍþ¦D Dþ:ÍþeD Dþ!Íþ®D Dý<€ÿþçÿ=ÿþ¸ÿ>ÿþáÿ=ÿý´þÿ=ÿþÜÿ=ÿý»þÿ:ÿüµßþÿ;ÿþþÿ¾ÿ‡þ²Ã!Çþ’Ã!Çþ®Ã ÇýÂÃÇþ«ÃÇýÁÃÇþ§ÃÇý‹¿ÃÇþ£ÃÇý‰½Ãà ‡þ Ãà ‡ýˆ»ÃÃ!‡þœÃÃ"‡þ¸ÃÃ"‡þ˜ÃÃ#‡þµÃÃ#‡þ”ÃÃ$‡þ±ÃÃ$‡þ‘ÃÃ%‡þ­ÃÃ%‡ýÂÃÃ&‡þªÃÃ&‡ýŒÁÃÃ'‡þ¦ÃÃ'‡ýŠ¿ÃÃ(‡þ¢ÃÃ(‡ý‰½ÃÃ)‡þŸÃÃ)‡ýˆºÃÃ*‡þ›ÃÃ+‡þ·ÃÃ+‡þ—ÃÃ,‡þ´ÃÃ,‡þ”ÃÃ-‡þ°ÃÃ-‡þ‘ÃÃ.‡þ¬ÃÃ.‡ýŽÂà Ã/‡þ©Ã Ã/‡ýŒÀà Ã0‡þ¥Ã Ã0‡ýŠ¾Ã Ã1‡þ¢Ã Ã1‡ý‰¼Ã Ã2‡þžÃ Ã2‡ýˆºÃ Ã3‡þšÃ Ã4‡þ·ÃÃ4‡þ–ÃÃ5‡þ³ÃÃ5‡þ“ÃÃþ•‡4‡þ¯ÃÃþµ‡4‡þÃÃþ˜‡4‡þ¬ÃÃþ¸‡4‡ýŽÁÃÃþœ‡4‡þ¨ÃÃý»ˆ‡3‡ý‹ÀÃÃþ ‡4‡þ¤ÃÃý½‰‡3‡ýоÃÃþ£‡4‡þ¡ÃÃýÀ‹‡3‡ýˆ¼ÃÃþ§‡4‡þÃÃýÁ‡4‡þ¹ÃÃþ«‡4‡þ™ÃÃÓþÖØ!ØÓþÔØ!ØÓþÖØ ØÓþÔØ ØÓþÖØØÓ ØÓþÕØØÓþרØÓþÕØØ ÓþרØ ÓþÕØØ!ÓþרØ!ÓþÕØØ"ÓþרØ"ÓþÔØØ#ÓþרØ#ÓþÔØØ$ÓþÖØØ$ÓþÔØØ%ÓþÖØØ%ÓþÔØØ&ÓþÖØØ'ÓØ'ÓþÕØØ(ÓþרØ(ÓþÕØØ)ÓþרØ)ÓþÕØØ*ÓþרØ*ÓþÕØØ+ÓþרØ+ÓþÔØØ,ÓþÖØØ,ÓþÔØØ-ÓþÖØØ-ÓþÔØØ.ÓþÖØØ.ÓþÔØØ/ÓþÖØ Ø0Óþר Ø0ÓþÕØ Ø1Óþר Ø1ÓþÕØ Ø2Óþר Ø2ÓþÕØ Ø3Óþר Ø3ÓþÔØ Ø4ÓþרØ4ÓþÔØØ5ÓþÖØØ5ÓþÔØØþÔÓ4ÓþÖØØþ×Ó4ÓþÔØØþÔÓ4ÓþÖØØþ×Ó4ÓþÔØØþÕÓ4ÓþÖØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØ6ÓþרØþÖÓ4ÓþÔØØDþ!Dþ:!Dþ! Dý=Dþ%Dý?Dþ(DýADþ+DýB Dþ. DýC!Dþ2"Dþ"Dþ5#Dþ#Dþ8$Dþ$Dþ;%Dþ"%Dý=&Dþ%&Dý?'Dþ)'DýA(Dþ,(DýB)Dþ/)DýC*Dþ2+Dþ+Dþ6,Dþ,Dþ9-Dþ -Dþ;.Dþ#.Dý> /Dþ& /Dý@ 0Dþ) 0DýA 1Dþ- 1DýC 2Dþ0 2DýC 3Dþ3 4Dþ4Dþ65Dþ5Dþ9þ8D4Dþ þD4Dþ<þ5D4Dþ$þD4Dý>þ1D4Dþ'ýCD3Dý@þ.D4Dþ*ýBD3DýBþ+D4Dþ-ýAD3DýCþ(D4Dþ1ý?D4Dþþ$D4Dþ4ÿüÃÀ‹‡ ‡ý…<22þa‡ ‡þ•à Ãþ¨‡ ‡þg22þa‡ ‡þ•à ÃýÁއ ‡ý†@22þa‡ ‡þ•à Ãþ¬‡ ‡þl22þa‡ ‡þ•à Ãþ‡ ‡þD22þa‡ ‡þ•à Ãþ¯‡ ‡þq22þa‡ ‡þ•à Ãþ“‡ ‡þI22þa‡ ‡þ•à Ãþ³‡ ‡þv22þa‡ ‡þ•à Ãþ—‡ ‡þO22þa‡ ‡þ•à Ãþ·‡ ‡ýz322þa‡ ‡þ•ÃÃþš‡ ‡þT22þa‡ ‡þ•ÃÃýºˆ‡ ‡ý~522þa‡ ‡þ•ÃÃþž‡ ‡þY22þa‡ ‡þ•ÃÃý½‰‡ ‡ý722þa‡ ‡þ•ÃÃþ¢‡ ‡þ^22þa‡ ‡þ•ÃÃý¿Š‡ ‡ýƒ:2 2þa‡ ‡þ•ÃÃþ¦‡ ‡þc2 2þa‡ ‡þ•ÃÃýÁŒ‡ ‡ý…=2 2þa‡ ‡þ•ÃÃþ©‡ ‡þh2 2þa‡ ‡þ•ÃÃýÂŽ‡ ‡ý†A2 2þa‡ ‡þ•ÃÃþ­‡ ‡þm2 2þa‡ ‡þ•ÃÃþ‘‡ ‡þE2 2þa‡ ‡þ•ÃÃþ°‡ ‡þs2 2þa‡ ‡þ•ÃÃþ”‡ ‡þK2 2þa‡ ‡þ•ÃÃþ´‡ ‡þw2 2þa‡ ‡þ•ÃÃþ˜‡ ‡þP22þa‡ ‡þ•ÃÃþ¸‡ ‡ó{79=BFJOSX]w‡ ‡þ•ÃÃþ›‡ ‡þÀÿÿþ°‡ ‡þ•ÃÃýºˆ‡ ‡þÿÿþ°‡ ‡þ•ÃÃþŸ‡ ‡þ¹ÿÿþ°‡ ‡þ•ÃÃý½‰‡ ‡þŒÿÿþ°‡ ‡þ•ÃÃþ£‡ ‡þ²ÿÿþ°‡ ‡þ•ÃÃý¿‹‡ ‡ýŠúÿÿþ°‡ ‡þ•ÃÃþ¦‡ ‡þ«ÿÿþ°‡ ‡þ•ÃÃýÁŒ‡ ‡ý‰åÿÿþ°‡ ‡þ•ÃÃþª‡ ‡þ¥ÿÿþ°‡ ‡þ•ÃÃý‡ ‡þÝÿÿþ°‡ ‡þ•ÃÃþ®‡ ‡þŸÿÿþ°‡ ‡þ•ÃÃþ’‡ ‡þÕÿÿþ°‡ ‡þ•ÃÃþ±‡ ‡þšÿÿþ°‡ ‡þ•ÃÃþ•‡ ‡ûÍÿÿ°‡ ‡þ•ÃÃþµ‡ ‡û•ÿÿ°‡ ‡þ•ÃÃþ™‡ ‡üÆÿ°‡ ‡þ•ÃÃþ¸‡ ‡ü‘ÿ°‡ ‡þ•à Ãþœ‡ ‡ý¾°‡ ‡þ•à Ãý»ˆ‡ ‡ýŽ«‡ ‡þ•Ã!Ãþ ‡ ‡þ‹‡ ‡þ•Ã!Ãý½‰‡‡þ•Ã"Ãþ£‡‡þ•Ã"ÃýÀ‹‡‡þ•Ã#Ãþ§‡‡þ•Ã#ÃýÁ‡‡þ•Ã$Ãþ«‡‡þ•Ã$Ãý‡‡þ•Ã%Ãþ¯‡‡þ•Ã&Ãþ’‡‡þ•Ã&Ãþ²‡‡þ•Ã'Ãþ–‡‡þ•Ã'Ãþ¶‡‡þ•Ã(Ãþ™‡‡þ•Ã(Ãþ¹‡‡þ•Ã)Ãþ‡‡þ•Ã)Ãý¼ˆ‡‡þ•Ã*Ãþ¡‡‡þ•ÃÃýØ×Ó ÓýÏ\LLþ–Ó ÓþÔØ ØþÖÓ Óþ LLþ–Ó ÓþÔØ ØþÔÓ ÓýÒbLLþ–Ó ÓþÔØ ØþÖÓ Óþ©LLþ–Ó ÓþÔØ ØþÔÓ ÓþiLLþ–Ó ÓþÔØ ØþÖÓ Óþ±LLþ–Ó ÓþÔØ ØþÔÓ ÓþqLLþ–Ó ÓþÔØ ØþÖÓ Óý¹MLLþ–Ó ÓþÔØ ØþÔÓ ÓþzLLþ–Ó ÓþÔØ Øþ×Ó Óý¿NLLþ–Ó ÓþÔØØþÕÓ ÓþLLþ–Ó ÓþÔØØþ×Ó ÓýÅPLLþ–Ó ÓþÔØØþÕÓ Óþ‰LLþ–Ó ÓþÔØØþ×Ó ÓýÉTLLþ–Ó ÓþÔØØþÕÓ Óþ’LLþ–Ó ÓþÔØØþ×Ó ÓýÍXL Lþ–Ó ÓþÔØØþÕÓ ÓþšL Lþ–Ó ÓþÔØØþ×Ó ÓýÐ]L Lþ–Ó ÓþÔØØþÖÓ Óþ¢L Lþ–Ó ÓþÔØØþÔÓ ÓýÒdL Lþ–Ó ÓþÔØØþÖÓ ÓþªL Lþ–Ó ÓþÔØØþÔÓ ÓþkL Lþ–Ó ÓþÔØØþÖÓ Óþ³L Lþ–Ó ÓþÔØØþÔÓ ÓþsL Lþ–Ó ÓþÔØØþ×Ó ÓýºMLLþ–Ó ÓþÔØØþÔÓ Óþ{LLþ–Ó ÓþÔØØþ×Ó ÓóÀRRVZ]bfinr¬Ó ÓþÔØØþÕÓ ÓþèÿÿþâÓ ÓþÔØØþ×Ó ÓþÖÿÿþâÓ ÓþÔØØþÕÓ ÓþæÿÿþâÓ ÓþÔØØþ×Ó ÓþÕÿÿþâÓ ÓþÔØØþÕÓ ÓþãÿÿþâÓ ÓþÔØØþ×Ó ÓýÔýÿÿþâÓ ÓþÔØØþÕÓ ÓþáÿÿþâÓ ÓþÔØØ ÓýÔöÿÿþâÓ ÓþÔØØþÖÓ ÓþÞÿÿþâÓ ÓþÔØØþÔÓ ÓþóÿÿþâÓ ÓþÔØØþÖÓ ÓþÜÿÿþâÓ ÓþÔØØþÔÓ ÓþñÿÿþâÓ ÓþÔØØþÖÓ ÓþÚÿÿþâÓ ÓþÔØØþÔÓ ÓûíÿÿâÓ ÓþÔØØþ×Ó ÓûØÿÿâÓ ÓþÔØØþÔÓ ÓüëÿâÓ ÓþÔØØþ×Ó Óü×ÿâÓ ÓþÔØ ØþÕÓ ÓýèâÓ ÓþÔØ Øþ×Ó ÓýÖáÓ ÓþÔØ!ØþÕÓ ÓþÔÓ ÓþÔØ!Øþ×ÓÓþÔØ"ØþÕÓÓþÔØ"Øþ×ÓÓþÔØ#ØþÖÓÓþÔØ$ØÓþÔØ$ØþÖÓÓþÔØ%ØþÔÓÓþÔØ%ØþÖÓÓþÔØ&ØþÔÓÓþÔØ&ØþÖÓÓþÔØ'ØþÔÓÓþÔØ'Øþ×ÓÓþÔØ(ØþÔÓÓþÔØ(Øþ×ÓÓþÔØ)ØþÕÓÓþÔØ)Øþ×ÓÓþÔØ*ØþÕÓÓþÔØØü@D DýH¼ÍÍþ‚D Dþ7 þ'D DþxÍÍþ‚D Dþ7 ý>D DýE¶ÍÍþ‚D Dþ7 þ#D DþoÍÍþ‚D Dþ7 þD DýEµÍ Íþ‚D Dþ7þ#D DþmÍ Íþ‚D Dþ7þ;D Dþ®Í Íþ‚D Dþ7þD DþeÍ Íþ‚D Dþ7þ8D Dþ¥Í Íþ‚D Dþ7þD Dý]ÌÍÍþ‚D Dþ7þ5D DþÍÍþ‚D Dþ7þD DóWÉËÊÉÈÇÆÅÃÂyD Dþ7þ2D DþnÿÿþbD Dþ7ýCD DþJÿÿþbD Dþ7þ/D DþhÿÿþbD Dþ7ýBD DþHÿÿþbD Dþ7þ,D DþdÿÿþbD Dþ7ýAD DýFèÿÿþbD Dþ7þ(D Dþ_ÿÿþbD Dþ7ý?D DýE‰ÿÿþbD Dþ7þ%D DþZÿÿþbD Dþ7ý=D Dþ„ÿÿþbD Dþ7þ"D DþVÿÿþbD Dþ7þ;D Dþ~ÿÿþbD Dþ7þD DþRÿÿþbD Dþ7þ8D DûxÿÿbD Dþ7þD DûOÿÿbD Dþ7þ5D DürÿbD Dþ7þD DüLÿbD Dþ7 þ1D DýmbD Dþ7 ýCD DýI^D Dþ7!þ.D DþGD Dþ7!ýBDDþ7"þ+DDþ7"ý@DDþ7#þ(DDþ7#ý?DDþ7$þ$DDþ7$ýuÃÿ ÿ22üH…Ùÿÿ42û3U—õÿÿ72ü6cªÿÿ:2ú2;2ÿûÅ…R3272ÿûÜS3242ÿûÝS3212 ÿûÝS32.2ÿûÝS32+2ÿûÝT32(2ÿûÞT32%2ÿûÞT32"2ÿûÞT322ÿûÞT322 ÿü݉K22#ÿüÈy@22&ÿü´j822)ÿü [422€ÿþºÿ=ÿúLPpžÙÿ9ÿLü\†¹ÿ6ÿLûOpžØÿ2ÿ Lü\…¹ÿ/ÿLüR{µÿ,ÿLüR{µÿ)ÿLüRz³ÿ&ÿLüQy²ÿ#ÿLüQx²ÿ ÿLüQx±ÿÿ LüPw°ÿÿ#LüPv¯ÿÿ&LüPv®ÿÿ)LüPu­ÿÿ,LüPzºÿÿ/LüV‡Íÿ ÿ2Lü_–àÿÿ5Lük¥÷ÿÿ7LüOx¶ÿÿ:LúU…ÈÿÿLÿûüæÍ´ÿ>ÿüóÚÁÿ>ÿûýçδÿ>ÿüôÚÁÿ>ÿüûàÃÿ>ÿüûàÃÿ>ÿüûáÄÿ>ÿüûáÄÿ>ÿüûâÄÿ>ÿüüâÅÿ>ÿüüâÅÿ>ÿüüãÅÿ>ÿüüãÆÿ>ÿüüãÆÿ>ÿüüáÁÿ>ÿü÷Ù¹ÿ>ÿüñѲÿ>ÿüêÊÓÿ=ÿüýâÂÿ>ÿüøÚ»ÿ>ÿýóÓÿ?ÿüÅÞ÷ÿ>ÿü¸Ñëÿ>ÿü±Íëÿ>ÿü°Íëÿ>ÿü°Íëÿ>ÿü°Íëÿ>ÿü°Íêÿ>ÿü°Íêÿ>ÿü°Íêÿ>ÿü°Íêÿ>ÿû°Íêþÿ=ÿü°Ðïÿ>ÿü·×öÿ>ÿü¾ßûÿ>ÿüÆæþÿÿÿþЇ ‡þ¨ÃÃÿþ’‡ ‡þ¡ÃÃÿþ›‡ ‡þšÃÃÿþ§‡ ‡þ“ÃÃÿþ³‡ ‡þ‹ÃÃÿþÁ‡ ‡þÁÃÃÿþч ‡þ¹ÃÃÿþ㇠‡þ²ÃÃÿ ‡þ«ÃÃÿþއ ‡þ£ÃÃÿþ˜‡ ‡þœÃÃÿþ¤‡ ‡þ”ÃÃÿþ²‡ ‡þ‹ÃÃÿþÇ ‡þÀÃÃÿþÕ‡ ‡þ·ÃÃÿþú‡ ‡þ¯ÃÃÿþЇ ‡þ¦ÃÃÿþ•‡ ‡þžÃÃÿþ¢‡ ‡þ•ÃÃÿþ°‡ ‡þŒÃÃÿþÁ‡ ‡þ¿ÃÃÿþÓ‡ ‡þµÃÃÿþõ‡ ‡þ«ÃÃÿþ‹‡ ‡þ¢ÃÃÿþ™‡ ‡þ˜ÃÃÿþ¨‡ ‡þŽÃÃÿþº‡ ‡þÁÃÃÿþχ ‡þ·ÃÃÿþè‡ ‡þ­ÃÃÿþЇ ‡þ£ÃÃÿþ—‡ ‡þ˜ÃÃÿþ¦‡ ‡þŒÃÃÿþ¸‡ ‡þ¾ÃÃÿþЇ ‡þ³ÃÃÿþú‡ ‡þ¨ÃÃþÕÿÿþއ ‡þÃÃû2R”èÿÿþž‡ ‡þ’ÃÃ2ü5`¦ÿÿþ±‡ ‡ýˆÂÃÃ2ü:oºÿÿþLJ ‡þ¸ÃÃ2üCÐÿ ÿþᇠ‡þ¬Ãà 2üPãÿ ÿþ‰‡ ‡þŸÃà 2ü4]¢ÿÿþ™‡ ‡þ“ÃÃ2ü9l¶ÿÿþ­‡ ‡ýˆÁÃÃ2üA|ËÿÿþŇ ‡þ¶ÃÃ2ûMŒß⇠‡þªÃÃ2ü4Zˆ‡ ‡þÃÃ2þq‡ ‡þÃÃ2þ`‡ ‡þ¿ÃÃ2þN‡ ‡þ²ÃÃ2þ<‡ ‡þ¤ÃÃ2þ‡ ‡þ–ÃÃ2þn‡ ‡ý‰ÂÃÃ2þZ‡ ‡þ·ÃÃ2þG‡ ‡þ©ÃÃ2ý5…‡ ‡þ›ÃÃ2þu‡ ‡þÃÃ2þb‡ ‡þ¼ÃÃ2þN‡ ‡þ¬ÃÃ2þ:‡ ‡þÃÃ2þ{‡ ‡þÃÃ2þe‡ ‡þ»ÃÃ2þO‡ ‡þ«ÃÃ2þ:‡ ‡þœÃÃ2þz‡ ‡þÃÃÿþÔÓ ÓþÖØØÿþ×Ó ÓþÕØØÿþÛÓ ÓþÔØØÿþßÓ ÓþÔØØÿþäÓ ÓØÿþéÓ ÓþרØÿþïÓ ÓþרØÿþõÓ ÓþÖØØÿ ÓþÖØØÿþÖÓ ÓþÕØØÿþÙÓ ÓþÕØØÿþÞÓ ÓþÔØØÿþãÓ ÓØÿþêÓ ÓþרØÿþñÓ ÓþרØÿþýÓ ÓþÖØØÿþÔÓ ÓþÕØØÿþØÓ ÓþÕØØÿþÝÓ ÓþÔØØÿþãÓ ÓØÿþéÓ ÓþרØÿþïÓ ÓþרØÿþûÓ ÓþÖØØÿþÔÓ ÓþÕØØÿþÚÓ ÓþÔØØÿþßÓ ÓþÔØØÿþæÓ ÓþרØÿþîÓ ÓþרØÿþ÷Ó ÓþÖØØÿþÔÓ ÓþÕØØÿþÙÓ ÓþÔØØÿþßÓ ÓØÿþåÓ ÓþרØÿþîÓ ÓþÖØØÿþýÓ ÓþÖØØþÜÿÿþÖÓ ÓþÕØØûLh£ìÿÿþÜÓ ÓþÔØØLüNu³ÿÿþãÓ ÓØLüT‚ÅÿÿþëÓ ÓþרØLü[Øÿ ÿþõÓ ÓþÖØØ LüfŸèÿ ÿþÔÓ ÓþÕØØ LüNr¯ÿÿþÚÓ ÓþÔØØLüRÁÿÿþáÓ ÓØLüYÔÿÿþêÓ ÓþרØLûdœæõÓ ÓþÖØØLüMpÑÓ ÓþÕØØLþ±Ó ÓþÔØØLþ•Ó ÓþרØLþxÓ ÓþÖØØLþ\Ó ÓþÕØØLþÉÓ ÓþÔØØLþ«Ó ÓØLþŒÓ ÓþרØLþmÓ ÓþÖØØLýQÐÓ ÓþÕØØLþ¶Ó ÓØLþ˜Ó ÓþרØLþxÓ ÓþÖØØLþYÓ ÓþÕØØLþÀÓ ÓØLþœÓ ÓþרØLþ{Ó ÓþÖØØLþYÓ ÓþÕØØLþ¾Ó ÓØÿþFD Dþ'ÿþLD Dþ-ÿþSD Dþ3ÿþ[D Dþ:ÿþeD Dþ@ÿþoD Dþÿþ{D Dþÿþ‡D Dþÿ Dþ%ÿþID Dþ+ÿþQD Dþ1ÿþYD Dþ8ÿþdD Dþ@ÿþpD Dþÿþ~D DþÿþèD Dþ!ÿþFD Dþ(ÿþND Dþ0ÿþXD Dþ7ÿþbD Dþ?ÿþnD Dþÿþ|D DþÿþÌD Dþ$ÿþGD Dþ,ÿþQD Dþ5ÿþ\D Dþ>ÿþiD DþÿþyD Dþÿþ”D Dþ"ÿþFD Dþ,ÿþPD Dþ5ÿþ[D Dþ?ÿþhD DþÿþyD DþÿþèD Dþ'þ¤ÿÿþID Dþ1ûÍÅ´©ÿÿþUD Dþ;ÍüÌÁ°ÿÿþcD DýCÍü˾«ÿÿþsD DþÍüɺ¥ÿ ÿþ†D Dþ$ ÍüƵ ÿ ÿþFD Dþ/ Íü̱ÿÿþQD Dþ:Íü˾¬ÿÿþ`D DýCÍüɺ¦ÿÿþqD DþÍûƶ¡‡D Dþ%ÍýÂID Dþ1ÍþgD Dþ<ÍþƒD DþÍþ D DþÍþ¼D Dþ*ÍþND Dþ7ÍþlD DýBÍþŒD DþÍþ«D Dþ&ÍýÈGD Dþ2ÍþaD Dþ>Íþ€D DþÍþ D Dþ#ÍþÀD Dþ1ÍþWD Dþ>Íþ{D DþÍþžD Dþ$ÍþÀD Dþ2ÍþYD Dþ?ÿþüÿ=ÿþóÿ=ÿþêÿ=ÿþßÿ=ÿþÕÿ=ÿþÊÿ=ÿþ¿ÿ=ÿþ´ÿ~ÿþ÷ÿ=ÿþíÿ=ÿþâÿ=ÿþÕÿ=ÿþÉÿ=ÿþ¼ÿ=ÿþêÿ>ÿþüÿ=ÿþðÿ=ÿþãÿ=ÿþ×ÿ=ÿþËÿ=ÿþ¾ÿ=ÿþÕÿ>ÿþûÿ=ÿþìÿ=ÿþÞÿ=ÿþÏÿ=ÿþÁÿ=ÿþ·ÿ>ÿþüÿ=ÿþîÿ=ÿþàÿ=ÿþÑÿ=ÿþÀÿ=ÿþêÿ%ÿþ³ÿÿþ÷ÿ%ÿüë˳ÿÿþçÿ'ÿüýäÄÿÿþ×ÿ*ÿüùܼÿÿþÆÿ-ÿüôÕ´ÿ ÿþµÿ0ÿüíͯÿ ÿþüÿ1ÿüþåÅÿÿþìÿ4ÿüûÞ¾ÿÿþÚÿ7ÿüõÖ¶ÿÿþÇÿ:ÿûîΰµÿ<ÿüþçüÿ£ÿÃþ‡;‡Ãþ‡:‡Ãþ•‡:‡Ãþœ‡:‡Ãþ¤‡:‡Ãþ«‡:‡Ãþ³‡:‡Ãþ»‡:‡Ãýˆ‡9‡Ãþ‡9‡Ãþ˜‡9‡Ãþ¡‡9‡Ãþ©‡9‡Ãþ±‡9‡Ãþ»‡9‡Ãþ‰‡8‡Ãþ’‡8‡Ãþœ‡8‡Ãþ¦‡8‡Ãþ¯‡8‡Ãþ¹‡8‡Ãýˆ‡7‡Ãþ‡7‡Ãþ™‡7‡Ãþ¥‡7‡Ãþ°‡7‡Ãþ»‡7‡ÃþЇ6‡Ãþ•‡6‡Ãþ¡‡6‡Ãþ¬‡6‡Ãþ·‡6‡ÃýÁˆ‡5‡Ãþ“‡5‡ÃþŸ‡5‡Ãþ¬‡5‡Ãþ¸‡5‡Ãý‰‡4‡Ãþ”‡4‡Ãþ¡‡4‡Ãþ®‡4‡Ãþ¼‡4‡ Ãþ‡3‡ Ãþš‡3‡ Ãþ¨‡3‡ Ãþ¶‡3‡ Ãý‰‡2‡ Ãþ•‡2‡ Ãþ£‡2‡ Ãþ²‡2‡ ÃýÁˆ‡1‡ Ãþ”‡1‡ Ãþ¤‡1‡ Ãþ³‡1‡ ÃýÁˆ‡0‡ Ãþ–‡0‡ Ãþ¥‡0‡ Ãþµ‡0‡ Ãý‹‡/‡ Ãþš‡/‡ Ãþ«‡/‡ Ãþ¼‡/‡Ãþ‘‡.‡Ãþ¢‡.‡Ø<ÓØ<ÓØþÔÓ:ÓØþÕÓ:ÓØþÕÓ:ÓØþÖÓ:ÓØþÖÓ:ÓØþ×Ó:ÓØ;ÓØþÔÓ9ÓØþÔÓ9ÓØþÕÓ9ÓØþÖÓ9ÓØþÖÓ9ÓØþ×Ó9ÓØ:ÓØþÔÓ8ÓØþÕÓ8ÓØþÕÓ8ÓØþÖÓ8ÓØþ×Ó8ÓØ9ÓØþÔÓ7ÓØþÔÓ7ÓØþÕÓ7ÓØþÖÓ7ÓØþ×Ó7ÓØ8ÓØþÔÓ6ÓØþÕÓ6ÓØþÖÓ6ÓØþ×Ó6ÓØ7ÓØþÔÓ5ÓØþÕÓ5ÓØþÖÓ5ÓØþ×Ó5ÓØ6ÓØþÔÓ4ÓØþÕÓ4ÓØþÖÓ4ÓØþ×Ó4Ó Ø5Ó ØþÕÓ3Ó ØþÖÓ3Ó Øþ×Ó3Ó Ø4Ó ØþÔÓ2Ó ØþÕÓ2Ó ØþÖÓ2Ó Øþ×Ó2Ó ØþÔÓ1Ó ØþÕÓ1Ó ØþÖÓ1Ó Ø2Ó ØþÔÓ0Ó ØþÕÓ0Ó Øþ×Ó0Ó Ø1Ó ØþÕÓ/Ó ØþÖÓ/Ó Øþ×Ó/ÓØþÔÓ.ÓØþÕÓ.ÓþD;Dþ>D:Dþ8D:Dþ1D:Dþ*D:Dþ$D:DþD:DþD:DýCD9DþD Dþ]ÿ ÿDþ-þ5D DþQÿ ÿDþ4þ-D DþGÿ ÿDþ<þ$D Dþ”ÿ ÿDýCþD Dþwÿ ÿDþþD Dþgÿ ÿDþ þ=D DþYÿ ÿDþ(þ4D DþMÿ ÿDþ1þ*D DþEÿ ÿDþ:þ!D Dþÿ ÿDýCþD Dþmÿ ÿDþþBD Dþ]ÿ ÿDþ!þ8D DþOÿ ÿDþ+þ.D DþEÿ ÿDþ5þ#D DþÿÿDþ?þD DþkÿÿDþýBD DþZÿÿDþþ8D DþKÿÿDþ'þ-D DþôÿÿDþ2þ!D DþwÿÿDþ=þD DþcÿÿDþþ>D DþRÿÿDþþ2D DþEÿÿDþ'þ&D Dþ|ÿÿDþ2þD DþfÿÿDþ> þAD DþTÿÿDþþ5D DþFÿÿDþ þ(D Dþ~ÿÿDþ+þD DþfÿÿDþ7ýBD DþRÿÿDýBþ6D DþEÿÿDþþ(D DþyÿÿDþ%þD DþaÿÿDþ3 þ@D DþMÿÿDþ? þ3D Dþ‰ÿÿ Dþþ$D Dþlÿÿ Dþ$þD DþUÿÿ Dþ1 þ>D DþFÿÿ Dþ> þ.D Dþwÿÿ DþþD Dþ]ÿÿ Dþ&ýBD DþIÿÿ Dþ4 þ4D Dþÿÿ DýAþ$D Dþcÿÿ DþþD DþMÿÿ Dþ) þ8D Dü…ÿÿD Dþ8 þ(D DüeÿÿD DýCþD DüMÿÿD Dþ! þÿþêÿ=ÿþ¼ÿ=ÿþÉÿ=ÿþÖÿ=ÿþãÿ=ÿþïÿ=ÿþýÿ>ÿþ³ÿ=ÿþÁÿ=ÿþÏÿ=ÿþÞÿ=ÿþìÿ=ÿþûÿ>ÿþ·ÿ=ÿþÂÿ=ÿþÒÿ=ÿþáÿ=ÿþñÿ=ÿþþÿ>ÿþºÿ=ÿþÌÿ=ÿþÞÿ=ÿþïÿ=ÿþþÿ>ÿþ»ÿ=ÿþÎÿ=ÿþáÿ=ÿþôÿ>ÿþôÿ=ÿþÂÿ=ÿþÖÿ=ÿþëÿ=ÿþýÿ>ÿþ¾ÿ=ÿþÓÿ=ÿþèÿ=ÿþüÿ>ÿþ¼ÿ=ÿþÓÿ=ÿþëÿ=ÿþþÿ>ÿþÁÿ=ÿþÙÿ=ÿþòÿ>ÿþ³ÿ=ÿþÍÿ=ÿþæÿ=ÿþýÿ>ÿþÂÿ=ÿþÝÿ=ÿþ÷ÿ>ÿþ»ÿ=ÿþ×ÿ=ÿþòÿ>ÿþ·ÿ=ÿþÔÿ=ÿþòÿ>ÿþ¸ÿ=ÿþÖÿ=ÿþôÿ>ÿþºÿ=ÿþÛÿ=ÿù ~ÿý¶Mÿ:ÿûÆZ22ÿ8ÿüÖf3227ÿüãt5226ÿý‚8224ÿý=222ÿýŸD2 20ÿý°L2 2.ÿý¾V2 2,ÿýµX22*ÿýªP22(ÿý J22&ÿý–E22$ÿýA22!ÿüõ„<22ÿüÞ|922ÿü´c422ÿüíŒF2 2ÿü¾i62"2ÿý”L2%2ÿüÉq92'2ÿýžS2*2ÿü¦d72,2 ÿü§f82/2ÿü©f8222ÿü«h9252ÿûÚšf9282 ~ÿýÁdÿ:ÿûÏpLLÿ8ÿýÝ{LL7ÿüè†NLL6ÿý“RLL4ÿýŸVLL2ÿý­\L L0ÿý¼cL L.ÿýÈlL L,ÿýÀmLL*ÿý¶gLL(ÿý®bLL&ÿý¥]LL$ÿýYLL!ÿü÷•ULLÿüåRLLÿü¿wNLLÿüñ›^L LÿüÈ}PL"Lÿý£cL%LÿüÒ„RL'Lÿý«iL*Lÿü³yQL,L ÿü´zQL/Lÿüµ{RL2Lÿü·|RL5Lÿûá¨{SL8L ~ÿý¬Æÿ:ÿû¨ÃÍÍÿ8ÿý¤ÀÍÍ7ÿü ¼ÌÍÍ6ÿý¹ËÍÍ4ÿýµÊÍÍ2ÿý±ÈÍ Í0ÿý­ÆÍ Í.ÿýªÄÍ Í,ÿý¬ÄÍÍ*ÿý¯ÅÍÍ(ÿý±ÇÍÍ&ÿý´ÈÍÍ$ÿý¶ÉÍÍ!ÿüÕ¸ÊÍÍÿü¢ºËÍÍÿü¬ÁÌÍÍÿü¸¶ÈÍ Íÿüª¿ÌÍ"Íÿý´ÆÍ%Íÿü§½ËÍ'Íÿý²ÅÍ*Íÿü°ÀÌÍ,Í ÿü¯ÀÌÍ/Íÿü¯ÀËÍ2Íÿü¯¿ËÍ5Íÿû£³ÀËÍ8Í ~ÿý¾îÿ:ÿý¸çÿ:ÿý³àÿ:ÿü¯Úýÿ:ÿýÓûÿ:ÿýÍøÿ:ÿýÆôÿ:ÿýÀïÿ:ÿý»éÿ:ÿý¾èÿ:ÿýÂìÿ:ÿýÆðÿ:ÿýÊóÿ:ÿýÎöÿ9ÿüÓÒøÿ9ÿü°Öûÿ9ÿü¾âþÿ8ÿü½Ïòÿ9ÿü»ßüÿ9ÿýËïÿ9ÿü·Ûûÿ9ÿýÇëÿ9ÿüÄáüÿ8ÿüÃáûÿ8ÿüÃàûÿ8ÿüÂàûÿ7ÿû±Èàúÿ8ÿ6ÿýŒ4224ÿýä]223ÿý´?222ÿýz32 20ÿýÓO2 2/ÿý82 2-ÿýýg22,ÿýÀD22+ÿý‡422)ÿýÞW22(ÿý©<22&ÿýøk22%ÿý²A22$ÿþp22"ÿý¹D22!ÿýv322ÿý¿G22ÿý|422ÿýÅJ22ÿý‚42 2ÿýÄM2"2ÿýv42#2ÿý­B2%2ÿýßc2'2ÿý”:2(2ÿýÌS2*2ÿý52+2ÿý¶F2-2 ÿýèk2/2 ÿý–=202 ÿý»M222ÿýÜf242ÿý…8252ÿý¨D272ÿýÍY292ûÿõu4292üG–=2:2ýlÿ2:2û9£ÿÿ292ýU×ÿÿ82ý7Žÿÿ72ýQÐÿÿ52ý5‡ÿÿ42ýMÊÿÿ22ý4€ÿ ÿ12ýIÃÿ ÿ/2ý3yÿ ÿ.2ýF¼ÿ ÿ,2ý3sÿÿ+2ýK¿ÿÿ)2ý6‡ÿÿ(2ýXÓÿÿ&2ý=ÿÿ%2ýjåÿÿ#2ýEµÿÿ!2ý5}ÿÿ 2ýQÊÿÿ2ý9’ÿÿ2ýdÝÿÿ2ýK·ÿ ÿ2ý<’ÿ"ÿ2ü4qèÿ#ÿ2ýVÉÿ%ÿ2ýB¤ÿ'ÿ2ý7ÿ)ÿ6ÿýœNLL4ÿýérLL3ÿý¿WLL2ÿþŒL L0ÿýÛfL L/ÿý«RL L-ÿýý{LL,ÿýÊ\LL+ÿý—NLL)ÿýåmLL(ÿýµULL&ÿýú~LL%ÿý½YLL$ÿþƒLL"ÿýÃ\LL!ÿþˆLLÿýÉ^LLÿýMLLÿýÎbLLÿý“NL LÿýÎdL"Lÿý‰ML#Lÿý¹ZL%LÿýæxL'Lÿý£SL(LÿýÕiL*LÿýNL+LÿýÁ^L-L ÿýì~L/L ÿý¥UL0L ÿýÆdL2Lÿýã{L4Lÿý–QL5Lÿýµ\L7LÿýÖnL9Lûÿ÷‡NL9Lü^¥UL:LýÿL:LûS°ÿÿL9LýkÞÿÿ8LýPžÿÿ7LýgØÿÿ5LýO—ÿÿ4LýdÓÿÿ2LýN‘ÿ ÿ1Lý`Íÿ ÿ/LýM‹ÿ ÿ.Lý]Çÿ ÿ-Lþ†ÿÿ+LýbÉÿÿ)LýP—ÿÿ(LýnÛÿÿ&LýU«ÿÿ%Lý~êÿÿ#Lý]Àÿÿ!LýNÿÿ LýhÓÿÿLýS¡ÿÿLýxäÿÿLýbÂÿ ÿLýT¡ÿ"ÿLüM„ìÿ#ÿLýlÒÿ%ÿLýZ±ÿ'ÿLýP’ÿ)ÿ6ÿý¶ÌÍÍ4ÿý ÂÍÍ3ÿý¬ÊÍÍ2ÿþ»Í Í0ÿý¤ÆÍ Í/ÿý²ËÍ Í-ÿýõÀÍÍ,ÿý©ÈÍÍ+ÿý¸ÌÍÍ)ÿý¢ÄÍÍ(ÿý¯ÊÍÍ&ÿýà¿ÍÍ%ÿý­ÉÍÍ$ÿþ½ÍÍ"ÿý«ÈÍÍ!ÿþ¼ÍÍÿý©ÈÍÍÿþºÍÍÿý¨ÇÍÍÿý¹ÌÍ Íÿý¨ÆÍ"Íÿþ¼Í$Íÿý®ÉÍ%Íÿý¡ÁÍ'Íÿý´ËÍ(Íÿý¦ÅÍ*ÍÿýºÌÍ+Íÿý¬ÈÍ-Í ÿý©¿Í/Í ÿý´ÊÍ0Í ÿýªÆÍ2Íÿý¢ÀÍ4Íÿý¸ÌÍ5Íÿý¯ÈÍ7Íÿý¦ÃÍ9ÍûÿÕ¼ÌÍ9ÍüÈ´ÊÍ:Íý¾ÿÍ:Íû˱ÿÿÍ9ÍýÄ£ÿÿ8Íý̶ÿÿ7ÍýÅ¥ÿÿ5Íý̸ÿÿ4ÍýƧÿÿ2Íý̹ÿ ÿ1ÍýǨÿ ÿ0Íþ»ÿ ÿ.ÍýȪÿ ÿ-Íþ½ÿÿ+ÍýÇ©ÿÿ)Íý̸ÿÿ(Íýäÿÿ&Íýʲÿÿ%Íý¿ ÿÿ#ÍýȬÿÿ!Íý̺ÿÿ ÍýŧÿÿÍý˵ÿÿÍýÀ¢ÿÿÍýÇ«ÿ ÿÍý˵ÿ"ÿÍý½©ÿ#ÿÍýħÿ%ÿÍýɰÿ'ÿÍý̹ÿ)ÿ6ÿýÎþÿ:ÿý®åÿ;ÿý¾÷ÿ;ÿþ×ÿ;ÿý³íÿ;ÿýÇûÿ:ÿýôàÿ;ÿýºóÿ;ÿýÑþÿ:ÿý°éÿ;ÿýÃøÿ:ÿÞ<ÿý¿õÿ;ÿþÛÿ;ÿý½ôÿ;ÿþÙÿ;ÿýºòÿ;ÿýÖþÿ:ÿý¸ðÿ;ÿýÓþÿ:ÿý¹îÿ;ÿýØþÿ:ÿýÁõÿ:ÿý°âÿ;ÿýËúÿ:ÿý¶ëÿ;ÿýÕýÿ:ÿý¾òÿ:ÿý³Þÿ;ÿýÊøÿ:ÿý¼îÿ:ÿý±àÿ;ÿýÑûÿ:ÿýÃôÿ:ÿýµèÿ:ÿüÓÙþÿ9ÿüòÊøÿ:ÿþÞÿ;ÿýúÅÿ;ÿýê²ÿ:ÿýüÎÿ;ÿýì´ÿ:ÿýýÑÿ;ÿýî·ÿ:ÿýþÔÿ;ÿýñ¹ÿ:ÿýþ×ÿ;ÿýó»ÿ;ÿþÚÿ;ÿýïºÿ:ÿýüÑÿ;ÿýè³ÿ:ÿýøÇÿ;ÿýß®ÿ:ÿýó¾ÿ:ÿýýÕÿ;ÿýì·ÿ:ÿýúÌÿ;ÿýâ°ÿ:ÿýï½ÿ:ÿýùÌÿ:ÿüþÛ³ÿ:ÿýé·ÿ:ÿýõÅÿ:ÿýüÔÿ)ÿ*2ý3‡ÿÿ)2ý7¨ÿÿ(2ýAÆÿÿ'2ýPßÿÿ&2þeÿÿ%2þ‚ÿÿ#2ý6£ÿÿ"2ý?Áÿÿ!2ýMÜÿÿ 2þaÿÿ2þ|ÿÿ2ý6žÿÿ2ý=¼ÿÿ2ýJØÿ ÿ2þ]ÿ"ÿ2þxÿ#ÿ2ý6›ÿ$ÿ2ýDÇÿ%ÿ2ý_õÿ&ÿ2ý4‡ÿ(ÿ2ý=µÿ)ÿ2ýRÝÿ*ÿ2þtÿ,ÿ2ý8¢ÿ-ÿ 2ýHÍÿ.ÿ 2þdÿ0ÿ 2ý4ÿ1ÿ 2ýC½ÿ2ÿ2ýeøÿ3ÿ2ý8šÿ5ÿ2ýNÑÿ6ÿ2ý3xÿ8ÿ2ý>±ÿ9ÿ2ý[áÿ:ÿý5Œÿ<ÿþÅÿ}ÿþžÿ<ÿýy2ÿ:ÿûíY22ÿ9ÿýÉD229ÿý¤8228ÿþ|226ÿýñ[225ÿýËE224ÿý¥8223ÿþ}2 21ÿýõ[2 20ÿýÌF2 2/ÿý§82 2.ÿý|32 2,ÿýÝT22+ÿý±=22+Lþ—ÿÿ)LýQµÿÿ(LýYÏÿÿ'Lýfæÿÿ&Lþyÿÿ%Lþ“ÿÿ#LýP°ÿÿ"LýWËÿÿ!Lýdãÿÿ LþvÿÿLþŽÿÿLýO«ÿÿLýVÇÿÿLýbßÿ ÿLþrÿ"ÿLþŠÿ#ÿLýP©ÿ$ÿLý\Ðÿ%ÿLýt÷ÿ&ÿLýM—ÿ(ÿLýVÀÿ)ÿLýhäÿ*ÿLþ‡ÿ,ÿLýQ¯ÿ-ÿ Lý_Öÿ.ÿ Lþxÿ0ÿ LýNÿ1ÿ Lý[Çÿ2ÿLýyúÿ3ÿLýQ¨ÿ5ÿLýeÙÿ6ÿLþŠÿ8ÿLýW½ÿ9ÿLýqçÿ:ÿýOœÿ<ÿþÎÿ}ÿþ«ÿ<ÿý‹Lÿ:ÿûñoLLÿ9ÿýÒ\LL9ÿý±QLL8ÿþLL6ÿýôpLL5ÿýÔ]LL4ÿý²QLL3ÿþL L1ÿý÷qL L0ÿýÕ]L L/ÿý´RL L.ÿþLL,ÿýäjLL+ÿý½VLL+Íþ¸ÿÿ)Íý̯ÿÿ(Íýɨÿÿ'ÍýÆ¡ÿÿ&ÍþÀÿÿ%Íþ¹ÿÿ#Íý̱ÿÿ"ÍýÊ©ÿÿ!ÍýÆ¢ÿÿ ÍþÁÿÿÍþºÿÿÍý̲ÿÿÍýʪÿÿÍýÇ£ÿ ÿÍþÂÿ"ÿÍþ»ÿ#ÿÍý̲ÿ$ÿÍýȧÿ%ÿÍýÂÕÿ&ÿÍþ¸ÿ(ÿÍýʬÿ)ÿÍýÅ¢ÿ*ÿÍþ¼ÿ,ÿÍý̱ÿ-ÿ ÍýǦÿ.ÿ ÍþÀÿ0ÿ Íý̶ÿ1ÿ Íýɪÿ2ÿÍýÀàÿ3ÿÍý̳ÿ5ÿÍýÆ¥ÿ6ÿÍþ»ÿ8ÿÍýÊ­ÿ9ÿÍýáÿ:ÿý̶ÿ<ÿþ¨ÿ}ÿþ²ÿ<ÿý»Íÿ:ÿû¸ÃÍÍÿ9ÿý§ÈÍÍ9ÿý°ÌÍÍ8ÿþºÍÍ6ÿýÇÃÍÍ5ÿý¦ÈÍÍ4ÿý°ÌÍÍ3ÿþºÍ Í1ÿýÕÃÍ Í0ÿý¦ÈÍ Í/ÿý¯ËÍ Í.ÿþºÍÍ,ÿý¢ÄÍÍ+ÿý­ÊÍÍ+ÿþÑÿ;ÿýüÃÿ;ÿýõ¸ÿ;ÿýí°ÿ;ÿþáÿ<ÿþÓÿ;ÿýüÅÿ;ÿý÷ºÿ;ÿýî±ÿ;ÿþãÿ<ÿþÖÿ;ÿýýÇÿ;ÿýø»ÿ;ÿýð²ÿ;ÿþåÿ<ÿþØÿ;ÿýüÈÿ;ÿýó¸ÿ;ÿýäÓÿ:ÿýþÑÿ;ÿýø¾ÿ;ÿýë°ÿ;ÿþÙÿ;ÿýûÅÿ;ÿýñµÿ;ÿþâÿ;ÿýþÎÿ;ÿýô»ÿ;ÿýáÞÿ:ÿýûÈÿ;ÿýî´ÿ;ÿþØÿ;ÿý÷Àÿ;ÿýæ¯ÿ:ÿýýÎÿ<ÿþ¸ÿ}ÿþÇÿ<ÿþ×ÿ;ÿý½çÿ;ÿý·ôÿ;ÿýÅûÿ;ÿþÖÿ;ÿýÈæÿ;ÿý¶óÿ;ÿýÄûÿ;ÿþÕÿ;ÿýÓæÿ;ÿý¶óÿ;ÿýÃûÿ;ÿþÖÿ;ÿý°êÿ;ÿýÀøÿÿ3ÿýÉ>222ÿýÀ;2 21ÿý·82 20ÿý­62 2/ÿý¢52 2.ÿý˜32 2-ÿþŒ22,ÿþ‚22+ÿþw22*ÿþm22)ÿþe22(ÿþ]22'ÿþV22%ÿýíP22$ÿýàK22#ÿýÚF22"ÿýÑB22!ÿýÈ>22 ÿý¿;22ÿý¶822ÿý¬622ÿý¡422ÿý•322ÿþ‚2!2ÿþm2"2ÿþ]2#2ÿýãP2$2ÿýÓE2%2ÿýÁ=2&2ÿý­72'2ÿý—42(2ÿþ2*2ÿþm2+2ÿþ\2,2ÿýãO2-2 ÿýÒD2-2þ3ÿ ÿý»=2-2ý4¡ÿ ÿýž52-2ü6¬üÿ ÿþ2.2û8¶üüÿÿþd2.2ý:¿üüÿýàP2.2ý>ÈüüÿýÉB2.2ýBÐüüÿý­82.2ýFÙüüÿýŽ32.2ýJàüüÿþq2/2ýPçüüÿýøY2/2ýVíüüüÿÖI2/2ý]ñüüý»=2/2ýhöü üþ52/2ý|ûü ü/2ý3‘ü ü.2ý6§ü ü-2ý;»üü,2ýBÎüü+2ýLÞüü*2ýXìüü)2ýhöüü(2ý{ûüü&2ý3üü%2ý6¦üü$2ý;»üü#2ýBÎüü"2ýQàüü!2ýdòüü 2ýûüü3ÿýÒWLL2ÿýÊTL L1ÿýÂRL L0ÿý¹PL L/ÿý¯NL L.ÿý¦ML L-ÿþœLL,ÿþ“LL+ÿþ‰LL*ÿþLL)ÿþyLL(ÿþrLL'ÿþlLL%ÿýñgLL$ÿýæbLL#ÿýá]LL"ÿýÙZLL!ÿýÑVLL ÿýÉTLLÿýÁRLLÿý¸OLLÿý®NLLÿý¤MLLÿþ“L!LÿþL"LÿþrL#LÿýèfL$LÿýÛ]L%LÿýËVL&Lÿý¹QL'Lÿý¥ML(Lÿþ’L*Lÿþ€L+LÿþqL,LÿýèfL-L ÿýÚ\L-LþMÿ ÿýÆUL-LýN®ÿ ÿý«OL-LýO¸ÿ ÿþL.LýRÁÿ ÿþxL.LýTÉÿ ÿýægL.LýVÑÿ ÿýÒZL.LýZØÿ ÿý¹RL.Lý]àÿ ÿýžML.Lýbæÿ ÿþ„L/LýfìÿÿýúoL/LýlñÿÿýÝ`L/LýröÿÿýÆUL/Lý|úÿ ÿþOL/Lýþÿ ÿ/LýM ÿ ÿ.LýP´ÿ ÿ-LýTÆÿÿ,LýZÖÿÿ+Lýcåÿÿ*Lýnðÿÿ)Lý|úÿÿ(Lýþÿÿ&LýM ÿÿ%LýP³ÿÿ$LýTÆÿÿ#LýZÖÿÿ"Lýgæÿÿ!Lýy÷ÿÿ Lýþÿÿ3ÿý§ÊÍÍ2ÿý©ËÍ Í1ÿý«ËÍ Í0ÿý®ÌÍ Í/ÿý±ÌÍ Í.ÿþ³ÍÍ-ÿþ¶ÍÍ,ÿþ¹ÍÍ+ÿþ¼ÍÍ*ÿþ¾ÍÍ)ÿþÀÍÍ(ÿþÂÍÍ'ÿþÄÍÍ%ÿý¸ÅÍÍ$ÿý¡ÇÍÍ#ÿý£ÈÍÍ"ÿý¥ÉÍÍ!ÿý§ÊÍÍ ÿý©ËÍÍÿý¬ËÍÍÿý®ÌÍÍÿý±ÌÍÍÿþ´Í Íÿþ¹Í!Íÿþ¾Í"ÍÿþÂÍ#Íÿý ÆÍ$Íÿý¤ÈÍ%Íÿý©ÊÍ&Íÿý®ÌÍ'Íÿþ´Í)Íÿþ¹Í*Íÿþ¾Í+ÍÿþÂÍ,Íÿý ÆÍ-Í ÿý¤ÈÍ.Í ÿýªÊÍ-Íý̱ÿ ÿý²ÌÍ-ÍüÌ®šÿ ÿþºÍ.ÍûˬššÿÿþÀÍ.ÍýË©ššÿý¡ÅÍ.Íýʧššÿý§ÉÍ.ÍýÉ¥ššÿý®ËÍ.ÍýÈ£ššÿþ¶Í/ÍýÇ¡ššÿþ½Í/ÍýÆŸššÿýàÃÍ/ÍýÄžššüÿ¤ÇÍ/ÍýššýªÊÍ/Íý¿œš šþÌÍ/Íþºš š0Íþµš š.Íý̯š š-Íý˪šš,Íýɦšš+ÍýÆ¢šš*ÍýÞšš)Íý¿œšš(Íþ»šš'Íþµšš%Íý̰šš$Íý˪šš#Íýɦšš"ÍýÅ¡šš!ÍýÀœšš Íþ¹šš3ÿý·÷ÿ;ÿýºùÿ;ÿý½ûÿ;ÿýÁüÿ;ÿýÅýÿ;ÿýÊþÿ;ÿþÎÿ<ÿþÓÿ<ÿþØÿ<ÿþÝÿ<ÿþáÿ<ÿþåÿ<ÿþéÿ;ÿý½ìÿ;ÿý¯ïÿ;ÿý±óÿ;ÿý´õÿ;ÿý·÷ÿ;ÿýºùÿ;ÿý¾ûÿ;ÿýÂýÿ;ÿýÆþÿ;ÿýËþÿ;ÿþÓÿ<ÿþÝÿ<ÿþåÿ;ÿý¯íÿ;ÿý³óÿ;ÿýºøÿ;ÿýÁüÿ;ÿýÊþÿ;ÿþÔÿ<ÿþÝÿ<ÿþæÿ;ÿý¯íÿ;ÿý´óÿ-ÿþþÿ ÿý¼øÿ-ÿýþÆÿ ÿýÇýÿ-ÿüý§ÿ ÿþÕÿ.ÿûû¾§§ÿÿþâÿ.ÿýùº§§ÿý¯ìÿ.ÿý÷·§§ÿý·õÿ.ÿýõ´§§ÿýÁûÿ.ÿýó²§§ÿýÎþÿ.ÿý鈸ÿþÛÿ/ÿýí­§§ÿýÞçÿ/ÿýé«§§üÿ³ñÿ/ÿý媧§ý¼øÿ/ÿýà©§ §þýÿ/ÿþÖ§ §/ÿýþ̧ §.ÿýüç §-ÿýù¼§§,ÿýõµ§§+ÿýï°§§*ÿý謧§)ÿýà©§§(ÿþÖ§§&ÿýþͧ§%ÿýüħ§$ÿýù¼§§#ÿýõµ§§"ÿý쯧§!ÿýᪧ§ ÿþÔ§§"2ý7¸üü!2ý7¶üü 2ý6´üü2ý6²üü2ý6°üü2ý5­üü2ý5¬üü2ý5ªü ü2ý4§ü!ü2ý4¥ü"ü2ý4¤ü#ü2ý4¡ü$ü2ý3Ÿü%ü2ý3ü&ü2ý3›ü'ü2ý3™ü(ü2ý3—ü)ü2ý3”ü*ü2ý3˜ü+ü2ý5¢ü,ü2ý6­ü-ü 2ý8·ü.ü 2ý;Àü/ü 2ý>Éü0ü 2ýBÑü1ü 2ýFÚü2ü2ýKáü3ü2ýPçü4ü2ýVíü5ü2ý]òü6ü2ýdöü7ü2ýmúü8ü2ývûü9ü2þü;üý2Œü<üþ–ü>ü"LýQÂÿÿ!LýPÁÿÿ LýP¿ÿÿLýP½ÿÿLýO¼ÿÿLýO¹ÿÿLýO¸ÿÿLýN¶ÿ ÿLýN´ÿ!ÿLýN²ÿ"ÿLýM±ÿ#ÿLýM®ÿ$ÿLýM­ÿ%ÿLýM«ÿ&ÿLýM©ÿ'ÿLþ§ÿ(ÿLþ¥ÿ)ÿLþ£ÿ*ÿLýM¦ÿ+ÿLýN¯ÿ,ÿLýP¹ÿ-ÿ LýRÂÿ.ÿ LýTÊÿ/ÿ LýWÒÿ0ÿ LýZÙÿ1ÿ Lý^áÿ2ÿLýbçÿ3ÿLýgìÿ4ÿLýlñÿ5ÿLýr÷ÿ6ÿLýyúÿ7ÿLýýÿ8ÿLý‰þÿ9ÿLþ’ÿ;ÿýL›ÿ<ÿþ¥ÿ>ÿ"ÍýÌ«šš!Íý̬šš Íý̬ššÍýÌ­ššÍýÌ­ššÍýÌ®ššÍýÌ®ššÍý̯š šÍý̯š!šÍý̰š"šÍþ°š#šÍþ±š$šÍþ±š%šÍþ²š&šÍþ²š'šÍþ³š(šÍþ´š)šÍþ´š*šÍþ³š+šÍý̱š,šÍýÌ®š-š ÍýË«š.š ÍýË©š/š Íýʧš0š ÍýÉ¥š1š ÍýÈ£š2šÍýÇ¡š3šÍýÅŸš4šÍýÄžš5šÍýœš6šÍýÀœš7šÍý¾›š8šÍþ¼š:šÍþ¹š;šýͶš<šþ´š>š"ÿýü½§§!ÿýü¾§§ ÿýü¾§§ÿýü¿§§ÿýýÀ§§ÿýýÁ§§ÿýý§§ÿýý§ §ÿýþç!§ÿýþħ"§ÿýþŧ#§ÿýþƧ$§ÿýþƧ%§ÿýþǧ&§ÿýþȧ'§ÿþɧ(§ÿþʧ)§ÿþ˧*§ÿýþʧ+§ÿýýŧ,§ÿýüÁ§-§ ÿýû½§.§ ÿýùº§/§ ÿý÷·§0§ ÿýõ´§1§ ÿýò±§2§ÿýﯧ3§ÿýì­§4§ÿýé«§5§ÿý媧6§ÿýá©§7§ÿýݨ§8§ÿþا:§ÿþÔ§;§ýÿϧ<§þʧ>§üÿš§üÿš§-üþ]22-üþe22-üþs22-üþ22-üþ22-üþ¡22-üþ²22-üþÅ22-üþÚ22-üþï22.üþ622.üþA22.üþM22.üþX22.üþe22.üþs22.üþ22.üþ”22.üþ¯22.üþÏ22.üýò32 2/üþA2 2/üþT2 2/üþj2 2/üþ‚2 2/üþ2 2/üþ»2 2/üþÞ2 2/üýû62 20üþH2 20üþ\2 20üþs2 20üþŒ2 20üþ©2 20üþÍ2 20üý÷62 21üþN2 21üþl2 21üþ2 21üþ¸2 21üþç2 22üþB2 22üþ^2 22üþ2 22üþ¥2 22üþÑ2 22üýú72 23üþP2 23üþo2 23üþ’2 23üþÁ2 23üýö7224üþX224üþ224üþ´224üýï4225üþP225üþw225üþ¨225üþä226üþH226üþn226üþ226üþ×22-ÿþrLL-ÿþyLL-ÿþ†LL-ÿþ’LL-ÿþ LL-ÿþ®LL-ÿþ½LL-ÿþÎLL-ÿþáLL-ÿþóLL.ÿþPLL.ÿþYLL.ÿþdLL.ÿþnLL.ÿþyLL.ÿþ†LL.ÿþ’LL.ÿþ£LL.ÿþ»LL.ÿþ×LL.ÿþ÷LL/ÿþYL L/ÿþjL L/ÿþ~L L/ÿþ“L L/ÿþ«L L/ÿþÆL L/ÿþåL L/ÿýþPL L0ÿþ_L L0ÿþqL L0ÿþ†L L0ÿþœL L0ÿþµL L0ÿþÖL L0ÿýûOL L1ÿþeL L1ÿþL L1ÿþžL L1ÿþÂL L1ÿþìL L2ÿþZL L2ÿþsL L2ÿþL L2ÿþ²L L2ÿþÙL L2ÿýýQL L3ÿþgL L3ÿþ‚L L3ÿþ¡L L3ÿþËL L3ÿýúQLL4ÿþmLL4ÿþ’LL4ÿþ¿LL4ÿýóNLL5ÿþfLL5ÿþ‰LL5ÿþµLL5ÿþéLL6ÿþ_LL6ÿþLL6ÿþ«LL6ÿþÞLL-šþÂÍÍ-šþÀÍÍ-šþ½ÍÍ-šþ¹ÍÍ-šþµÍÍ-šþ±ÍÍ-šþ­ÍÍ-šþ¨ÍÍ-šþ£ÍÍ-šþÍÍ.šþÌÍÍ.šþÉÍÍ.šþÆÍÍ.šþÃÍÍ.šþÀÍÍ.šþ½ÍÍ.šþ¹ÍÍ.šþ´ÍÍ.šþ­ÍÍ.šþ¥ÍÍ.šþœÍÍ/šþÉÍ Í/šþÄÍ Í/šþ¿Í Í/šþ¹Í Í/šþ²Í Í/šþªÍ Í/šþ¢Í Í0šþÌÍ Í0šþÇÍ Í0šþÂÍ Í0šþ½Í Í0šþ¶Í Í0šþ¯Í Í0šþ¦Í Í0šý›ÌÍ Í1šþÆÍ Í1šþ¾Í Í1šþ¶Í Í1šþ«Í Í1šþŸÍ Í2šþÉÍ Í2šþÂÍ Í2šþºÍ Í2šþ°Í Í2šþ¥Í Í2šý›ÌÍ Í3šþÅÍ Í3šþ¾Í Í3šþµÍ Í3šþ©Í Í3šýœÌÍÍ4šþÄÍÍ4šþ¹ÍÍ4šþ¬ÍÍ4šýÌÍÍ5šþÆÍÍ5šþ¼ÍÍ5šþ¯ÍÍ5šþ ÍÍ6šþÇÍÍ6šþ¾ÍÍ6šþ²ÍÍ6šþ£ÍÍ-§þåÿÿ-§þáÿÿ-§þÚÿÿ-§þÔÿÿ-§þÍÿÿ-§þÆÿÿ-§þ¿ÿÿ-§þ¸ÿÿ-§þ±ÿÿ-§þ«ÿÿ.§þüÿÿ.§þõÿÿ.§þîÿÿ.§þèÿÿ.§þáÿÿ.§þÚÿÿ.§þÔÿÿ.§þËÿÿ.§þÀÿÿ.§þµÿÿ.§þªÿÿ/§þöÿ ÿ/§þêÿ ÿ/§þßÿ ÿ/§þÓÿ ÿ/§þÇÿ ÿ/§þ¼ÿ ÿ/§þ°ÿ ÿ0§þüÿ ÿ0§þñÿ ÿ0§þæÿ ÿ0§þÚÿ ÿ0§þÎÿ ÿ0§þÃÿ ÿ0§þµÿ ÿ0§ý¨ýÿ ÿ1§þîÿ ÿ1§þÞÿ ÿ1§þÍÿ ÿ1§þ½ÿ ÿ1§þ­ÿ ÿ2§þõÿ ÿ2§þåÿ ÿ2§þÕÿ ÿ2§þÄÿ ÿ2§þ´ÿ ÿ2§ý¨üÿ ÿ3§þìÿ ÿ3§þÜÿ ÿ3§þÌÿ ÿ3§þºÿ ÿ3§ý©üÿÿ4§þèÿÿ4§þÔÿÿ4§þ¾ÿÿ4§ý«þÿÿ5§þíÿÿ5§þØÿÿ5§þÃÿÿ5§þ®ÿÿ6§þñÿÿ6§þÜÿÿ6§þÇÿÿ6§þ²ÿÿ2þbÿÿþZ2)2þUÿÿþf2)2þIÿÿþt2)2þ=ÿÿþƒ2)2þ4ÿÿþ’2*2þíÿÿþ£2*2þÐÿÿþµ2*2þ¼ÿÿþÈ2*2þªÿÿþÜ2*2þ˜ÿÿ+2þˆÿÿþ82)2þyÿÿþB2)2þkÿÿþP2)2þ]ÿÿþd2)2þMÿÿþ|2)2þ:ÿÿþ•2*2þñÿÿþ³2*2þÅÿÿþÓ2*2þ¦ÿÿþ32)2þŒÿÿþB2)2þsÿÿþV2)2þ]ÿÿþl2)2þIÿÿþ…2)2þ7ÿÿþŸ2*2þàÿÿþ¾2*2þ¾ÿÿþà2*2þ ÿÿþ92)2þ…ÿÿþS2)2þkÿÿþq2)2þMÿÿþ•2)2þ5ÿÿþ¿2*2þÊÿÿþ32)2þžÿÿþF2)2þyÿÿþc2)2þYÿÿþ…2)2þ>ÿÿþ­2*2þàÿÿþÛ2*2þ±ÿÿþ;2)2þ‰ÿÿþV2)2þgÿÿþw2)2þIÿÿþ¥2)2þ4ÿÿþà2*2þÄÿÿþE2)2þšÿÿþk2)2þqÿÿþ™2)2þJÿÿþÑ2)2ý3ñÿÿþ>2)2þ¬ÿÿþb2)2þzÿÿþ2)2þQÿÿþÃ2)2þ5ÿÿþ82)2þ·ÿÿþY2)2þƒÿÿþƒ2)2þYÿÿþ¼2)2þ8ÿÿþ;2)2þÂÿÿþf2)2þŒÿÿþŸ2)2þ_ÿÿýè32(2þ8ÿÿþS2)2þ´ÿÿþ†2)2þwÿÿþÈ2)2þGÿÿþA2)2þÖÿÿþo2)2þ‘ÿÿþ«22LþvÿÿþpL)Lþkÿÿþ{L)Lþ`ÿÿþ‡L)LþVÿÿþ”L)LþMÿÿþ¡L*Lþñÿÿþ°L*LþØÿÿþÀL*LþÇÿÿþÑL*Lþ¶ÿÿþãL*Lþ¦ÿÿ+Lþ˜ÿÿþQL)Lþ‹ÿÿþZL)Lþ~ÿÿþgL)LþrÿÿþxL)LþdÿÿþL)LþSÿÿþ¤L*Lþôÿÿþ¾L*LþÎÿÿþÛL*Lþ³ÿÿþML)Lþ›ÿÿþZL)Lþ†ÿÿþlL)LþrÿÿþL)Lþ`ÿÿþ•L)LþPÿÿþ­L*LþæÿÿþÈL*LþÈÿÿþæL*Lþ®ÿÿþRL)Lþ–ÿÿþiL)Lþ~ÿÿþ„L)Lþdÿÿþ¤L)LþOÿÿþÉL*LþÓÿÿþML)Lþ¬ÿÿþ^L)Lþ‹ÿÿþxL)Lþoÿÿþ–L)LþVÿÿþ¹L*LþæÿÿþâL*Lþ½ÿÿþTL)Lþ™ÿÿþlL)Lþ{ÿÿþ‰L)Lþ`ÿÿþ²L)LþNÿÿþæL*LþÎÿÿþ]L)Lþ¨ÿÿþL)Lþ„ÿÿþ§L)LþbÿÿþÙL*LþôÿÿþVL)Lþ¸ÿÿþvL)LþŒÿÿþL)LþhÿÿþÍL)LþNÿÿþRL)LþÂÿÿþnL)Lþ”ÿÿþ”L)LþnÿÿþÇL)LþQÿÿþTL)LþÌÿÿþ{L)Lþœÿÿþ­L)LþtÿÿýìML(LþRÿÿþiL)Lþ¿ÿÿþ—L)Lþ‰ÿÿþÑL)Lþ_ÿÿþYL)LþÝÿÿþ‚L)Lþ ÿÿþ·LLÍþÁÿÿþÃÍ)ÍþÄÿÿþÀÍ)ÍþÇÿÿþ¼Í)ÍþÊÿÿþ¹Í*ÍÿþµÍ*Íþ¸ÿÿþ±Í*Íþ¥ÿÿþ¬Í*Íþªÿÿþ§Í*Íþ¯ÿÿþ¢Í*Íþ³ÿÿ+Íþ·ÿÿþÌÍ)Íþ»ÿÿþÉÍ)Íþ¿ÿÿþÅÍ)ÍþÂÿÿþÀÍ)ÍþÆÿÿþºÍ)ÍþËÿÿþ´Í*ÍþÇÿÿþ¬Í*Íþ¨ÿÿþ¤Í*Íþ°ÿÿ+Íþ¶ÿÿþÉÍ)Íþ½ÿÿþÄÍ)ÍþÂÿÿþ¾Í)ÍþÇÿÿþ¸Í)ÍþÌÿÿþ±Í*Íþ¡ÿÿþªÍ*Íþªÿÿþ¡Í*Íþ±ÿÿþËÍ)Íþ¸ÿÿþÅÍ)Íþ¿ÿÿþ½Í)ÍþÆÿÿþ´Í)ÍþÌÿÿþ©Í*Íþ§ÿÿ+Íþ²ÿÿþÈÍ)Íþ»ÿÿþÁÍ)ÍþÃÿÿþ¸Í)ÍþÊÿÿþ®Í*Íþ¡ÿÿþ¢Í*Íþ­ÿÿþËÍ)Íþ·ÿÿþÄÍ)ÍþÀÿÿþ¼Í)ÍþÇÿÿþ°Í)ÍþÌÿÿþ¡Í*Íþ¨ÿÿþÈÍ)Íþ³ÿÿþ¿Í)Íþ½ÿÿþ³Í)ÍþÇÿÿþ¥Í*ÍþÇÿÿþÊÍ)Íþ®ÿÿþÁÍ)Íþ»ÿÿþ¶Í)ÍþÅÿÿþ¨Í)ÍþÌÿÿþËÍ)Íþ«ÿÿþÃÍ)Íþ¹ÿÿþ¹Í)ÍþÃÿÿþªÍ)ÍþÌÿÿþËÍ)Íþ©ÿÿþÀÍ)Íþ¶ÿÿþ±Í)ÍþÂÿÿþ©Í)ÍþËÿÿþÅÍ)Íþ¬ÿÿþ¸Í)Íþ¼ÿÿþ§Í)ÍþÈÿÿþÉÍ)Íþ¤ÿÿþ¾Í)Íþµÿÿþ¯ÍÍÿþãÿÿþçÿ)ÿþêÿÿþàÿ)ÿþñÿÿþÙÿ)ÿþøÿÿþÒÿ)ÿþþÿÿþÌÿ*ÿþ½ÿÿþÅÿ*ÿþ´ÿÿþ¾ÿ*ÿþ»ÿÿþ·ÿ*ÿþÂÿÿþ±ÿ*ÿþÊÿ=ÿþÐÿÿþûÿ)ÿþ×ÿÿþõÿ)ÿþÞÿÿþìÿ)ÿþåÿÿþâÿ)ÿþîÿÿþÖÿ)ÿþúÿÿþËÿ*ÿþÈÿÿþ¿ÿ*ÿþ¸ÿÿþ³ÿ*ÿþÄÿÿþþÿ)ÿþÏÿÿþõÿ)ÿþÚÿÿþéÿ)ÿþåÿÿþÞÿ)ÿþñÿÿþÒÿ)ÿþüÿÿþÆÿ*ÿþ¯ÿÿþ»ÿ*ÿþ»ÿÿþ¯ÿ*ÿþÆÿÿþûÿ)ÿþÑÿÿþëÿ)ÿþÞÿÿþÛÿ)ÿþîÿÿþËÿ)ÿþýÿÿþºÿ*ÿþ·ÿÿþþÿ)ÿþÇÿÿþòÿ)ÿþ×ÿÿþâÿ)ÿþçÿÿþÑÿ)ÿþ÷ÿÿþÁÿ*ÿþ¯ÿÿþ±ÿ*ÿþÀÿÿþùÿ)ÿþÐÿÿþéÿ)ÿþàÿÿþØÿ)ÿþñÿÿþÄÿ)ÿþþÿÿþ¯ÿ*ÿþ¹ÿÿþóÿ)ÿþÈÿÿþÞÿ)ÿþÛÿÿþÉÿ)ÿþðÿÿþ´ÿ*ÿþÈÿÿþ÷ÿ)ÿþÂÿÿþãÿ)ÿþ×ÿÿþÎÿ)ÿþìÿÿþ¹ÿ)ÿþýÿÿþûÿ)ÿþ½ÿÿþèÿ)ÿþÒÿÿþÒÿ)ÿþèÿÿþ»ÿ)ÿþûÿÿþùÿ)ÿþ¹ÿÿþàÿ)ÿþÎÿÿþÆÿ)ÿþäÿÿý³þÿ(ÿþûÿÿþëÿ)ÿþ¾ÿÿþÑÿ)ÿþØÿÿþ·ÿ)ÿþòÿÿþöÿ)ÿþ³ÿÿþÜÿ)ÿþÌÿÿþÂÿÿ2þaü9ü2þTü9ü2þIü9ü2þ=ü9ü2ý4ûü8ü2þèü8ü2þÒü8ü2þ¿ü8ü2þ­ü8ü2þ™ü8ü2þü8ü2þfü8ü2þQü8ü2þ>ü8ü2þïü7ü2þËü7ü2þ«ü7ü2þŽü7ü2þuü7ü2þ^ü7ü2þIü7ü2ý4òü6ü2þÃü6ü2þ™ü6ü2þuü6ü2þVü6ü2þ;ü6ü2þÛü5ü2þ­ü5ü2þ…ü5ü2þdü5ü2þGü5ü2ý3ðü4ü2þ¼ü4ü2þˆü4ü2þ]ü4ü2ý:úü3ü 2þÈü3ü 2þ‘ü3ü 2þdü3ü 2þ?ü3ü 2þÕü2ü 2þ›ü2ü 2þmü2ü 2þFü2ü 2þØü1ü 2þ’ü1ü 2þ]ü1ü 2ý7ñü0ü 2þ®ü0ü 2þrü0ü 2þCü0ü 2þÍü/ü 2þŠü/ü 2þVü/ü 2ý4êü.ü2þ¡ü.ü2þ_ü.ü2ý5èü-ü2þ™ü-ü2þXü-ü2ý3àü,ü2þü,ü2þQü,üLþuÿ9ÿLþkÿ9ÿLþ`ÿ9ÿLþVÿ9ÿLýMþÿ8ÿLþíÿ8ÿLþÚÿ8ÿLþÉÿ8ÿLþ¹ÿ8ÿLþ§ÿ8ÿLþÿ8ÿLþ{ÿ8ÿLþhÿ8ÿLþVÿ8ÿLþóÿ7ÿLþÔÿ7ÿLþ·ÿ7ÿLþžÿ7ÿLþ‡ÿ7ÿLþsÿ7ÿLþ`ÿ7ÿLýM÷ÿ6ÿLþÍÿ6ÿLþ¨ÿ6ÿLþ‡ÿ6ÿLþlÿ6ÿLþTÿ6ÿLþâÿ5ÿLþ¹ÿ5ÿLþ–ÿ5ÿLþxÿ5ÿLþ^ÿ5ÿLýMôÿ4ÿLþÇÿ4ÿLþ˜ÿ4ÿLþrÿ4ÿLýSýÿ3ÿ LþÑÿ3ÿ Lþ ÿ3ÿ Lþyÿ3ÿ LþXÿ3ÿ LþÜÿ2ÿ Lþ©ÿ2ÿ Lþ€ÿ2ÿ Lþ]ÿ2ÿ Lþßÿ1ÿ Lþ¡ÿ1ÿ Lþrÿ1ÿ LýPöÿ0ÿ Lþºÿ0ÿ Lþ…ÿ0ÿ Lþ[ÿ0ÿ LþÖÿ/ÿ Lþšÿ/ÿ Lþlÿ/ÿ LýNïÿ.ÿLþ®ÿ.ÿLþtÿ.ÿLýOíÿ-ÿLþ§ÿ-ÿLþnÿ-ÿLýMæÿ,ÿLþŸÿ,ÿLþhÿ,ÿÍþÁš9šÍþÄš9šÍþÇš9šÍþÊš9šÍ:šÍþŸš8šÍþ¤š8šÍþ©š8šÍþ®š8šÍþ³š8šÍþºš8šÍþÀš8šÍþÅš8šÍþÊš8šÍþš7šÍþ¦š7šÍþ¯š7šÍþ¶š7šÍþ¼š7šÍþš7šÍþÇš7šÍþœš6šÍþ¨š6šÍþ³š6šÍþ¼š6šÍþÄš6šÍþËš6šÍþ¢š5šÍþ®š5šÍþ¸š5šÍþÀš5šÍþÈš5šÍþš4šÍþªš4šÍþ·š4šÍþš4šÍýË›š3š Íþ§š3š Íþµš3š ÍþÀš3š ÍþÊš3š Íþ¤š2š Íþ²š2š Íþ¾š2š ÍþÈš2š Íþ£š1š Íþµš1š Íþš1š ÍýÌš0š Íþ®š0š Íþ½š0š ÍþÉš0š Íþ¦š/š Íþ·š/š ÍþÄš/š ÍýÌžš.šÍþ±š.šÍþš.šÍýÌŸš-šÍþ³š-šÍþÚ-šÍþ¡š,šÍþµš,šÍþÅš,šÿþã§9§ÿþê§9§ÿþñ§9§ÿþø§9§ÿþþ§9§ÿþ­§8§ÿþ´§8§ÿþº§8§ÿþÁ§8§ÿþɧ8§ÿþÕ§8§ÿþà§8§ÿþì§8§ÿþ÷§8§ÿþ«§7§ÿþ¶§7§ÿþ§7§ÿþΧ7§ÿþÙ§7§ÿþå§7§ÿþñ§7§ÿýþª§6§ÿþ¹§6§ÿþɧ6§ÿþÙ§6§ÿþé§6§ÿþù§6§ÿþ±§5§ÿþÁ§5§ÿþѧ5§ÿþâ§5§ÿþò§5§ÿýþª§4§ÿþ»§4§ÿþЧ4§ÿþå§4§ÿýú¨§3§ ÿþ·§3§ ÿþ̧3§ ÿþá§3§ ÿþö§3§ ÿþ³§2§ ÿþȧ2§ ÿþݧ2§ ÿþó§2§ ÿþ²§1§ ÿþ̧1§ ÿþå§1§ ÿýüª§0§ ÿþÁ§0§ ÿþÚ§0§ ÿþô§0§ ÿþµ§/§ ÿþϧ/§ ÿþé§/§ ÿýþ¬§.§ÿþƧ.§ÿþä§.§ÿýý­§-§ÿþɧ-§ÿþè§-§ÿýþ¯§,§ÿþͧ,§ÿþì§,§üþ±2$2üþÂ2$2üþÖ2$2üýô32#2üþA2#2üþ[2#2üþ|2#2üþ 2#2üþÌ2#2üý÷62"2üþN2"2üþl2"2üþŽ2"2üþ·2"2üþç2"2üþA2!2üþ]2!2üþ}2!2üþ£2!2üþ×2!2üþA2 2üþm2 2üþ©2 2üýî622üþZ22üþ22üþ×22üþI22üþ{22üþº22üýø;22üþg22üþ¡22üýè422 üþU22 üþ22 üýá422!üþd22!üþ·22"üþI22"üþ22"üýê822#üþo22#üþÇ22$üþQ22$üþž22$üýô=22%üþz22%üýÖ322&üþ\22&üþ°22'üþL22'üþ­22(üþT22(üþ¼22)üþ_22)üýË322*üþj22*üýÙ522+üþv22+üýä922,üþ‚22,üýî>22-üþ22ÿþ½L$LÿþÌL$LÿþÝL$LÿþøL$LÿþYL#LÿþqL#LÿþL#Lÿþ®L#LÿþÕL#LÿýûOL"LÿþeL"LÿþL"LÿþžL"LÿþÂL"LÿþìL"LÿþYL!LÿþrL!LÿþL!Lÿþ°L!LÿþÞL!LÿþYL LÿþL LÿþµL LÿýòOLLÿþpLLÿþ LLÿþÞLLÿþ`LLÿþLLÿþÅLLÿýüTLLÿþ{LLÿþ®LLÿýíMLL ÿþkLL ÿþ LL ÿýçNLL!ÿþxLL!ÿþÂLL"ÿþ`LL"ÿþ LL"ÿýïQLL#ÿþ‚LL#ÿþÐLL$ÿþhLL$ÿþ«LL$ÿýøULL%ÿþŒLL%ÿþÝLL&ÿþqLL&ÿþ¼LL'ÿþcLL'ÿþ¹LL(ÿþjLL(ÿþÇLL)ÿþtLL)ÿýÔMLL*ÿþ~LL*ÿýàOLL+ÿþˆLL+ÿýéRLL,ÿþ“LL,ÿýòVLL-ÿþ LLšþ­Í$Íšþ©Í$Íšþ¤Í$ÍšþœÍ$ÍšþÉÍ#ÍšþÃÍ#ÍšþºÍ#Íšþ±Í#Íšþ¦Í#Íšý›ÌÍ"ÍšþÆÍ"Íšþ¾Í"Íšþ¶Í"Íšþ«Í"ÍšþŸÍ"ÍšþÉÍ!ÍšþÂÍ!ÍšþºÍ!Íšþ±Í!Íšþ£Í!ÍšþÉÍ Íšþ¾Í Íšþ¯Í ÍšýžÌÍÍšþÃÍÍšþµÍÍšþ£ÍÍšþÇÍÍšþ»ÍÍšþ«ÍÍšý›ËÍÍšþÀÍÍšþ±ÍÍšþŸÍÍ šþÄÍÍ šþµÍÍ šý¡ÌÍÍ!šþÀÍÍ!šþ«ÍÍ"šþÇÍÍ"šþµÍÍ"šýžÌÍÍ#šþ¾ÍÍ#šþ§ÍÍ$šþÅÍÍ$šþ²ÍÍ$šýœÊÍÍ%šþ»ÍÍ%šþ¤ÍÍ&šþÂÍÍ&šþ­ÍÍ'šþÆÍÍ'šþ®ÍÍ(šþÄÍÍ(šþªÍÍ)šþÂÍÍ)šþ¦ÍÍ*šþ¿ÍÍ*šý£ÌÍÍ+šþ¼ÍÍ+šý ËÍÍ,šþ¹ÍÍ,šýžÊÍÍ-šþµÍͧþÀÿ$ÿ§þ¹ÿ$ÿ§þ³ÿ$ÿ§þ©ÿ$ÿ§þöÿ#ÿ§þæÿ#ÿ§þÖÿ#ÿ§þÆÿ#ÿ§þ¶ÿ#ÿ§ý¨ýÿ"ÿ§þîÿ"ÿ§þÞÿ"ÿ§þÎÿ"ÿ§þ½ÿ"ÿ§þ­ÿ"ÿ§þõÿ!ÿ§þåÿ!ÿ§þÕÿ!ÿ§þÅÿ!ÿ§þ²ÿ!ÿ§þöÿ ÿ§þÝÿ ÿ§þÃÿ ÿ§ý«ýÿÿ§þçÿÿ§þÍÿÿ§þ²ÿÿ§þñÿÿ§þÖÿÿ§þ¼ÿÿ§ý¨ùÿÿ§þàÿÿ§þÆÿÿ§ý­þÿÿ §þêÿÿ §þÍÿÿ §ý¯þÿÿ!§þâÿÿ!§þ½ÿÿ"§þñÿÿ"§þÍÿÿ"§ý¬ûÿÿ#§þÜÿÿ#§þ¸ÿÿ$§þìÿÿ$§þÇÿÿ$§ý©øÿÿ%§þ×ÿÿ%§þ³ÿÿ&§þæÿÿ&§þÀÿÿ'§þïÿÿ'§þÁÿÿ(§þêÿÿ(§þ»ÿÿ)§þäÿÿ)§ý¶þÿÿ*§þßÿÿ*§ý²ýÿÿ+§þÙÿÿ+§ý®ûÿÿ,§þÓÿÿ,§ý«÷ÿÿ-§þÍÿÿ2ý6÷ü+ü2þËü+ü2þŸü+ü2þzü+ü2þZü+ü2þ>ü+ü2þáü*ü2þ¦ü*ü2þkü*ü2ý>ûü)ü2þÁü)ü2þü)ü2þNü)ü2ý3Þü(ü2þ˜ü(ü2þ`ü(ü2ý8ôü'ü2þ¨ü'ü2þYü'ü2ý3Òü&ü2þwü&ü2ý;ñü%ü2þšü%ü2þOü%ü2þÃü$ü2þlü$ü2ý7äü#ü2þvü#ü2ý6Úü"ü2þlü"ü2ý4Îü!ü2þaü!ü2þÁü ü2þXü ü2þ³üü2ýOûüü2þ•üü2ý9Úüü2þZüü 2þ™üü 2ý:Üüü!2þ\üü"2þ›üü"2ý:Þüü#2þ^üü$2þ‹üü$2ý4´üü%2ý<×üü&2ýLðüü'2þfüü(2þ‹üü(2ý4´üü)2ý<×üü*2ýIãüü+2ýKçüü,2ýNêüü-2ýQîüü.2ýUðü ü/2ýYòü ü02ý]õü ü12ýa÷ü ü22ý[ìü ü32ýKÛüü42ý?ÄüüLýOûÿ+ÿLþÔÿ+ÿLþ­ÿ+ÿLþŒÿ+ÿLþpÿ+ÿLþWÿ+ÿLþçÿ*ÿLþ³ÿ*ÿLþÿ*ÿLýWþÿ)ÿLþËÿ)ÿLþ’ÿ)ÿLþeÿ)ÿLþåÿ(ÿLþ¦ÿ(ÿLþuÿ(ÿLýQøÿ'ÿLþµÿ'ÿLþoÿ'ÿLþÚÿ&ÿLþ‰ÿ&ÿLýTöÿ%ÿLþ¨ÿ%ÿLþfÿ%ÿLþÍÿ$ÿLþÿ$ÿLýPéÿ#ÿLþ‰ÿ#ÿLýOáÿ"ÿLþÿ"ÿLýMÖÿ!ÿLþvÿ!ÿLþËÿ ÿLþmÿ ÿLþ¾ÿÿLýfþÿÿLþ¤ÿÿLýRáÿÿLþpÿÿ Lþ§ÿÿ LýSãÿÿ!Lþqÿÿ"Lþ©ÿÿ"LýTåÿÿ#Lþsÿÿ$Lþ›ÿÿ$LýM¿ÿÿ%LýTÞÿÿ&Lýcôÿÿ'Lþzÿÿ(Lþ›ÿÿ(LýM¿ÿÿ)LýTÞÿÿ*Lý`èÿÿ+Lýcìÿÿ,Lýeïÿÿ-Lýhòÿÿ.Lýkôÿ ÿ/Lýn÷ÿ ÿ0Lýrùÿ ÿ1Lýuûÿ ÿ2Lýpðÿ ÿ3Lýbâÿÿ4LýXÎÿÿÍýÌ›š+šÍþ¦š+šÍþ±š+šÍþ»š+šÍþÚ+šÍþÊš+šÍþ¡š*šÍþ°š*šÍþ¿š*šÍþÊš*šÍþ©š)šÍþ¹š)šÍþÆš)šÍþ¢š(šÍþ³š(šÍþÁš(šÍýÌœš'šÍþ¯š'šÍþÚ'šÍþ¤š&šÍþ¼š&šÍýËš%šÍþ³š%šÍþÆš%šÍþ¨š$šÍþ¾š$šÍýÌ š#šÍþ¼š#šÍýÌ£š"šÍþ¾š"šÍþ¦š!šÍþÁš!šÍþ©š šÍþÄš šÍþ¬ššÍþÆššÍþ´ššÍýË£ššÍþÚš Íþ³šš ÍýË¢šš!Íþšš"Íþ²šš"ÍýË¢šš#Íþšš$Íþ·šš%Íþ¬šš%ÍýË£šš&ÍýÆšš'ÍþÀšš(Íþ·šš)Íþ¬šš)ÍýË£šš*ÍýÇ šš+ÍýÇŸšš,ÍýÆžšš-ÍýÅžšš.ÍýÄš š/ÍýÜš š0Íýœš š1ÍýÁ›š š2ÍýÞš š3ÍýÇ¢šš4Íýʨššÿýý¨§+§ÿþ¶§+§ÿþƧ+§ÿþ×§+§ÿþç§+§ÿþ÷§+§ÿþ¯§*§ÿþħ*§ÿþÞ§*§ÿþ÷§*§ÿþº§)§ÿþÔ§)§ÿþî§)§ÿþ°§(§ÿþʧ(§ÿþä§(§ÿýû©§'§ÿþç'§ÿþç§'§ÿþ´§&§ÿþا&§ÿýùª§%§ÿþȧ%§ÿþí§%§ÿþ¹§$§ÿþÞ§$§ÿýü®§#§ÿþا#§ÿýý±§"§ÿþÞ§"§ÿýþµ§!§ÿþã§!§ÿþº§ §ÿþè§ §ÿþ¿§§ÿþí§§ÿþ˧§ÿýû±§§ÿþç§§ ÿþɧ§ ÿýú±§§!ÿþæ§§"ÿþȧ§"ÿýù°§§#ÿþå§§$ÿþϧ§$ÿýþ¾§§%ÿýù²§§&ÿý盛§'ÿþá§§(ÿþϧ§(ÿýþ¾§§)ÿýù²§§*ÿýñ¯§§+ÿýï­§§,ÿýí¬§§-ÿýì«§§.ÿýꪧ §/ÿý誧 §0ÿýå©§ §1ÿý㨧 §2ÿý欧 §3ÿýï±§§4ÿýö¹§§üÿš§üÿš§¿üþõü=üþŽü<üýê<ü<üý|2ü;üüÊ52ü:üû÷M22ü:üþ‚22:üýÆ5229üýõK229üþ228üýÂ4227üýôI227üþz226üý¾3225üýñG225üþs224üþ›223üý¿6222üýÞ?2 21üýòP2 21üþi2 20üþŒ2 2/üý²42 2.üýÓ;2 2-üýíI22,üýû_22,üþy22+üþ22*üþƒ22)üþ‡22(üþŠ22'üþŽ22&üþ‘22%üý•322$üý™322#üýœ322"üý322!üþƒ22üýôh22üýåS22üýÏD22üýµ:22üý—42 2üýúy2"2üýï`2#2üýÝN2$2¿ÿþùÿ=ÿþžÿ<ÿýïUÿ<ÿýŽLÿ;ÿüÓOLÿ:ÿûûdLLÿ:ÿþ“LL:ÿýÏNLL9ÿýùbLL9ÿþLL8ÿýÌMLL7ÿýø`LL7ÿþŒLL6ÿýÈMLL5ÿýö^LL5ÿþ†LL4ÿþ©LL3ÿýÉOLL2ÿýåXL L1ÿý÷gL L1ÿþ}L L0ÿþœL L/ÿý½ML L.ÿýÛTL L-ÿýñ`LL,ÿýþtLL,ÿþ‹LL+ÿþLL*ÿþ”LL)ÿþ—LL(ÿþšLL'ÿþžLL&ÿþ LL%ÿþ¤LL$ÿþ§LL#ÿýªMLL"ÿý«MLL!ÿþ”LLÿýø|LLÿýêiLLÿý×\LLÿýÀTLLÿý¥NL Lÿýý‹L"LÿýóuL#LÿýäeL$L¿šþœš=šþ¶š<šýžÊš<šýºÍš;šü§ÌÍš:šû›ÆÍÍš:šþ¹ÍÍ:šý¨ÌÍÍ9šýœÇÍÍ9šþºÍÍ8šþ©ÍÍ7šýœÇÍÍ7šþ»ÍÍ6šþªÍÍ5šýÈÍÍ5šþ½ÍÍ4šþ²ÍÍ3šý©ÌÍÍ2šý¢ÊÍ Í1šýœÅÍ Í1šþ¿Í Í0šþ¶Í Í/šþ­Í Í.šý¤ËÍ Í-šýžÇÍÍ-šþÂÍÍ,šþ»ÍÍ+šþ¹ÍÍ*šþ¹ÍÍ)šþ¸ÍÍ(šþ·ÍÍ'šþ¶ÍÍ&šþµÍÍ%šþ´ÍÍ$šþ³ÍÍ#šþ²ÍÍ"šþ²ÍÍ!šþ¹ÍÍšýœ¿ÍÍšý ÅÍÍšý¥ÈÍÍšý¬ËÍÍšý´ÌÍ Íšý›»Í"ÍšýÁÍ#Íšý¢ÆÍ$Í¿§þ©§=§þΧ<§ý¬ø§<§ýÖÿ§;§ü·ýÿ§:§û¨îÿÿ§:§þÓÿÿ:§ý¸ýÿÿ9§ý©ïÿÿ9§þÕÿÿ8§ý¹þÿÿ7§ý©ñÿÿ7§þ×ÿÿ6§ý»þÿÿ5§ýªòÿÿ5§þÚÿÿ4§þÈÿÿ3§ýºýÿÿ2§ý°öÿ ÿ1§ýªìÿ ÿ1§þßÿ ÿ0§þÎÿ ÿ/§ý¿þÿ ÿ.§ý³ùÿ ÿ-§ý«ñÿÿ-§þäÿÿ,§þ×ÿÿ+§þÔÿÿ*§þÒÿÿ)§þÑÿÿ(§þÏÿÿ'§þÎÿÿ&§þÌÿÿ%§þËÿÿ$§þÉÿÿ#§ýÈþÿÿ"§ýÇþÿÿ!§þÒÿÿ§ý©àÿÿ§ý®ëÿÿ§ýµóÿÿ§ý¾ùÿÿ§ýÊþÿ ÿ§ý¨×ÿ"ÿ§ý«äÿ#ÿ§ý°îÿ$ÿüýÕ32 2þ¦ÿÿýà52 2üþw2 2þ6ÿÿþ‚2 2üýï:2 2þ_ÿÿþ?2 2üþ”2!2þ›ÿÿþ 22üþJ2 2ý4èÿÿþQ22üþ¶2!2þVÿÿþÂ22üþa2!2þÿÿþi22üýÙ42 2ù4àÿÿã522üþ|2!2þ_ÿÿþ„22üýè;2!2þ´ÿÿþ@22üþy2!2þIÿÿþ£22üýÚ62!2þ”ÿÿþS22üþj2!2þ:ÿÿþÅ22üýÈ32!2þwÿÿþk22üþ[2!2ù3Õÿÿå622ýüµ2"2þ^ÿÿþ‚22ýûN2"2ú²ÿÿä922þ 2"2þHÿÿþt22þD2"2ú’ÿÿÓ5282þ9ÿÿþd292ûvÿÿÁ292ú3ÓÿÿU292û]ÿÿ­2:2û·ÿÿI292ûTÿÿ™2:2û¾ÿÿ@292ûbÿÿ†292ú4Ñÿå9292ûqÿÿu292ú8áÿÖ5292û‚ÿÿe292ú>ÿÿ¹3292û“ÿÿD292ûFÿÿq2:2ü¦ÿ´2:2ûQÿýB2:2üºÿm2:2ü_ü®2:2û5Îè@2:2ü|üi2:2üIòª2:2û4Áæ>2:2ü|üd2:2üJô¥2:2û4Äã=2:2üüa2$2þ522üKõ2%2þw22û5Ƶ42$2ý:ç22ü‚Õ<2%2ýü22üMçJ2%2üO÷ü22ü5È`2%2û6Íüü22ý…2&2þ‰üü2ýO¢2&2ýQøüü2ü:¬72%2ý7Ðüü2ü3ŸC2&2þüü2ýƒU2&2ýTúüü 2ýdq2&2ý7Õüü 2ýL2'2þ‘üü 2ü=¤52&2ýWûüü 2ü5Ÿ=2&2ý8Øüü 2ý‚?2'2þ•üü 2ýfA2'2þYüü2ýOA2'2ý9Ûüü2ý@A2(2þ™ü üÿþÜL!Lþ³ÿÿýæNL Lÿþ‰L LþPÿÿþ“L LÿýóSL LþtÿÿþWL Lÿþ£L!Lþ©ÿÿþ®LLÿþaL LýMìÿÿþgLLÿþÁL!LþlÿÿþÌLLÿþvL!LþŸÿÿþ}LLÿýàML LùNæÿÿèOLLÿþL!Lþtÿÿþ•LLÿýíTL!Lþ¿ÿÿþXLLÿþ‹L!Lþ`ÿÿþ°LLÿýáOL!Lþ£ÿÿþiLLÿþ~L!LþSÿÿþÎLLÿýÑML!Lþ‰ÿÿþLLÿþpL!LùMÜÿÿêOLLýÿÀL"Lþsÿÿþ“LLýþeL"Lú½ÿÿéRLLþ®L"Lþ_ÿÿþ†LLþ\L"Lú¡ÿÿÛNL8LþSÿÿþxL9LûˆÿÿËL:LûÛÿÿkL9Lûrÿÿ¹L:LûÂÿÿ`L9Lûkÿÿ§L:LûÈÿÿXL9Lûvÿÿ—L9LúNÙÿêSL9Lû„ÿÿ‡L9LúQçÿÝOL9Lû“ÿÿyL9LûWÿÿÃL:Lû¢ÿÿ\L9Lû^ÿÿ„L:Lü³ÿ¿L:LûgÿýZL:LüÅÿ€L:LütÿºL:LûNÖíXL:LüŽÿ|L:Lü`÷¶L:LûMËëWL:LüŽÿyL:Lüaø²L:LûNÎèUL:LüÿvL$LþOLLücùŸL%Lþ‰LLûNÏÀML$LýTìLLü“ÜTL%LýžÿLLüdíaL%LüfûÿLLüOÑuL%LûOÖÿÿLLý•L&Lþ™ÿÿLýf¯L&LýhüÿÿLüS¸QL%LýPØÿÿLý­[L&LþÿÿLý”kL&Lýjýÿÿ Lýx„L&LýQÜÿÿ LýcŸL'Lþ ÿÿ LüU±NL&Lýmþÿÿ LüN¬VL&LýRßÿÿ Lý“XL'Lþ¤ÿÿ LýzYL'LþoÿÿLýfZL'LýSâÿÿLýXZL(Lþ¨ÿ ÿšþ¤Í!Íþ°ÿÿý¡ÌÍ Íšþ¼Í ÍþÌÿÿþ¹Í ÍšýËÍ ÍþÂÿÿþÊÍ Íšþ´Í!Íþ²ÿÿþ±ÍÍšþÇÍ!Íþ©ÿÿþÅÍÍšþ¬Í!ÍþÄÿÿþ©ÍÍšþÁÍ!Íþµÿÿþ¿ÍÍšþ£Í!ÍùÌ¡ÿÿ ÌÍÍšþºÍ!ÍþÂÿÿþ¸ÍÍšýŸËÍ!Íþ¬ÿÿþÉÍÍšþ»Í!ÍþÇÿÿþ±ÍÍšý£ÌÍ!Íþ´ÿÿþÅÍÍšþ¿Í!ÍþËÿÿþ¨ÍÍšþ§Í"Íþ¼ÿÿþ¿ÍÍšþÃÍ"Íú¤ÿÿ ÌÍÍýš¬Í"ÍþÂÿÿþ¹ÍÍýšÆÍ"Íú­ÿÿ ËÍÍþ±Í"ÍþÇÿÿþ¼ÍÍþÈÍ"Íúµÿÿ¤ÌÍ8ÍþËÿÿþÀÍ9Íû¼ÿÿ©Í:Íû¤ÿÿÄÍ9ÍûÂÿÿ®Í:Íû«ÿÿÇÍ9ÍûÄÿÿ³Í:ÍûªÿÿÉÍ9ÍûÁÿÿ¸Í9ÍúÌ¥ÿ ËÍ9Íû½ÿÿ¼Í9ÍúÌ¡ÿ¤ÌÍ9Íû¹ÿÿÀÍ9ÍûÊÿÿ«Í:ÍûµÿÿÈÍ9ÍûÈÿÿ½Í:Íü°ÿ¬Í:ÍûÅÿõÉÍ:Íü«ÿ¾Í:Íüš®Í:Íû̦ŸÉÍ:Íüºš¿Í:ÍüÇœ¯Í;Íü© ÊÍ:ÍüºšÀÍ:ÍüÇœ°Í:Íų̂ ÊÍ:Íü¹šÁÍ$ÍþÌÍÍüÇœµÍ%Íþ¼ÍÍų̈¬Í%ÍýËŸÍÍü¹¤ËÍ%Íý¶šÍÍüÆ ÇÍ%ÍüÆ›šÍÍü̧ÁÍ%Íû̦ššÍÍý¸¹Í&Íþ·ššÍýƱÍ&ÍýÅ›ššÍüË®ÌÍ%ÍýÌ¥ššÍý±ÉÍ&Íþ¶ššÍý¹ÄÍ&ÍýÄ›šš ÍýÀ½Í&Íý̤šš ÍýƵÍ'Íþµšš ÍüʰÌÍ&ÍþÄšš Íü̲ÊÍ&ÍýË£šš Íý¹ÊÍ'Íþ´šš ÍýÀÉÍ'ÍþÚšÍýÅÉÍ'ÍýË¢ššÍýÊÉÍ(Íþ³š š§þ³ÿ!ÿþÄÿÿý¯ýÿ ÿ§þØÿ ÿþüÿÿþÓÿ ÿ§ý«úÿ ÿþäÿÿþ÷ÿ ÿ§þËÿ!ÿþÈÿÿþÆÿÿ§þðÿ ÿýþ³ÿÿþìÿÿ§þ¾ÿ!ÿþéÿÿþ¹ÿÿ§þãÿ!ÿþÍÿÿþßÿÿ§ý²þÿ ÿùþ¯ÿÿ¯ýÿÿ§þÖÿ!ÿþäÿÿþÒÿÿ§ý­ùÿ!ÿþ¾ÿÿþöÿÿ§þ×ÿ!ÿþñÿÿþÅÿÿ§ý±ýÿ!ÿþËÿÿþëÿÿ§þßÿ!ÿþúÿÿþ¸ÿÿ§ý·þÿ!ÿþØÿÿþÞÿÿ§þæÿ!ÿùþ³ÿÿ®ýÿÿý§¾ÿ"ÿþåÿÿþÓÿÿý§îÿ"ÿú¿ÿÿ®ûÿÿþÆÿ"ÿþñÿÿþÚÿÿþôÿ"ÿúÌÿÿ³ýÿ8ÿþúÿÿþâÿ9ÿûÙÿÿºÿ:ÿû³ÿÿêÿ9ÿûåÿÿÁÿ:ÿû½ÿÿñÿ9ÿûêÿÿÉÿ:ÿû»ÿÿöÿ9ÿûãÿÿÑÿ9ÿúþ´ÿ®úÿ9ÿûÛÿÿÙÿ9ÿúû¯ÿ³ýÿ9ÿûÓÿÿáÿ9ÿû÷ÿÿ½ÿ:ÿûÌÿÿôÿ9ÿûòÿÿÛÿ:ÿüÄÿ¾ÿ:ÿûìÿôõÿ:ÿü¼ÿÝÿ:ÿüä§Áÿ:ÿûýµ­öÿ:ÿüÖ§ßÿ:ÿüñªÂÿ:ÿûþº®÷ÿ:ÿüÖ§áÿ:ÿüð©Äÿ:ÿûþ¹¯øÿ:ÿüÔ§ãÿ$ÿþýÿÿüï©Íÿ%ÿþØÿÿûý¸¾þÿ$ÿýù­ÿÿüÓ³ùÿ%ÿýͧÿÿüî­ðÿ%ÿüí¨§ÿÿüý·äÿ%ÿûýµ§§ÿÿýÒÔÿ&ÿþЧ§ÿýíÅÿ&ÿý쨧§ÿüúÁüÿ%ÿýü´§§ÿýÇôÿ&ÿþΧ§ÿýÒêÿ&ÿýꨧ§ ÿýâÛÿ&ÿýü³§§ ÿýïÍÿ'ÿþ̧§ ÿüøÅýÿ&ÿþé§§ ÿüýÇøÿ&ÿýû²§§ ÿýÓöÿ'ÿþ˧§ ÿýáöÿ'ÿþç§§ÿýíõÿ'ÿýú±§§ÿýöõÿ(ÿþɧ §2ý6îü)ü2þ^ü*ü2þ™ü*ü2ý4åü*ü2þVü+ü2þü+ü2þÙü+ü2þNü,ü2þ…ü,ü2þÌü,ü2þJü-ü2þŒü-ü2ý7èü-ü2þoü.ü2þËü.ü 2þVü/ü 2þ¨ü/ü 2ýCøü/ü 2þ‰ü0ü 2ý7çü0ü 2þmü1ü 2þÉü1ü 2þUü2ü 2þ¦ü2ü 2ýBøü2ü 2þ‡ü3ü2ý6åü3ü2þlü4ü2þÆü4ü2þVü5ü2þ²ü5ü2þVü6ü2ý3Ãü6ü2þfü7ü2ý5Öü7ü2þvü8ü2ý:æü8ü2þˆü9ü2ýAñü9ü2þ›ü:ü2ýKúü:ü2þ¯ü;üý2Xü<üý3Åü<üþgü=üþØü¾üLýOòÿ)ÿLþsÿ*ÿLþ¨ÿ*ÿLýMêÿ*ÿLþlÿ+ÿLþžÿ+ÿLþàÿ+ÿLþeÿ,ÿLþ•ÿ,ÿLþÕÿ,ÿLþbÿ-ÿLþœÿ-ÿLýQíÿ-ÿLþ‚ÿ.ÿLþÔÿ.ÿ Lþlÿ/ÿ Lþµÿ/ÿ Lý[üÿ/ÿ Lþ™ÿ0ÿ LýPìÿ0ÿ Lþÿ1ÿ LþÒÿ1ÿ Lþkÿ2ÿ Lþ³ÿ2ÿ LýZüÿ2ÿ Lþ—ÿ3ÿLýPêÿ3ÿLþÿ4ÿLþÏÿ4ÿLþlÿ5ÿLþ½ÿ5ÿLþlÿ6ÿLþÍÿ6ÿLþzÿ7ÿLýOÝÿ7ÿLþ‰ÿ8ÿLýSëÿ8ÿLþ˜ÿ9ÿLýYöÿ9ÿLþ©ÿ:ÿLýbýÿ:ÿLþ»ÿ;ÿýLmÿ<ÿýLÎÿ<ÿþ{ÿ=ÿþßÿ¾ÿÍýÌžš)šÍþš*šÍþ³š*šÍþ š*šÍþÄš+šÍþ¶š+šÍþ£š+šÍþÆš,šÍþ¸š,šÍþ¦š,šÍþÇš-šÍþ¶š-šÍýÌŸš-šÍþ¾š.šÍþ¦š.š ÍþÄš/š Íþ¯š/š ÍýÉ›š/š Íþ·š0š ÍýÌŸš0š Íþ¾š1š Íþ§š1š ÍþÄš2š Íþ°š2š ÍýÉ›š2š Íþ¸š3šÍýÌ š3šÍþ¾š4šÍþ¨š4šÍþÄš5šÍþ­š5šÍþÄš6šÍþ¨š6šÍþÀš7šÍý̤š7šÍþ¼š8šÍýË š8šÍþ·š9šÍýÉš9šÍþ²š:šÍýÇ›š:šÍþ­š;šýÍÄš<šýͨš<šþÀš=šþ£š¾šÿýý«§)§ÿþå§*§ÿþɧ*§ÿýþ®§*§ÿþé§+§ÿþͧ+§ÿþ²§+§ÿþî§,§ÿþÒ§,§ÿþ¶§,§ÿþð§-§ÿþΧ-§ÿýü­§-§ÿþܧ.§ÿþ¶§.§ ÿþé§/§ ÿþç/§ ÿýô¨§/§ ÿþЧ0§ ÿýü­§0§ ÿþݧ1§ ÿþ·§1§ ÿþê§2§ ÿþħ2§ ÿýõ¨§2§ ÿþѧ3§ÿýü®§3§ÿþÞ§4§ÿþ¸§4§ÿþé§5§ÿþ¿§5§ÿþé§6§ÿþ¹§6§ÿþá§7§ÿýý³§7§ÿþا8§ÿýú®§8§ÿþЧ9§ÿýõª§9§ÿþȧ:§ÿý﨧:§ÿþÀ§;§ýÿè§<§ýÿ¸§<§þà§=§þ²§¾§üþ¹22ütÿÿüüþ22ü–ÿÿüüþc22ü¾ÿÿüüþ?22þ3ÿÿüþØ22þCÿÿüþŸ22þ_ÿÿüþr22þÿÿüþL22þ£ÿÿüýí422þÏÿÿüþ³22þ;ÿÿüþ‚22þ]ÿÿüþZ22þ‡ÿÿüýú922þºÿÿüþÉ22þ5ÿÿüþ”22þQÿÿüþh22þyÿÿüýû?22þ©ÿÿüþÇ2 2þãÿÿüþ‡22þFÿÿüþT22þkÿÿüýê422þ™ÿÿüþ¥2 2þÏÿÿüþm22þ<ÿÿüþ@22þ`ÿÿüþÈ2 2þ‘ÿÿüþˆ2 2þÓÿÿüþU22þFÿÿüýê422þtÿÿüþ¦2 2þ®ÿÿüþi22þ6ÿÿüýô922þZÿÿüþ©2 2þÿÿüþf2 2þÏÿÿüýñ822þCÿÿüþ¦2 2þqÿÿüþd2 2þªÿÿüýï722þ5ÿ ÿüþ£2 2þXÿ ÿüþb2 2þŠÿ ÿüýî62 2þÐÿ ÿüþ 2 2þKÿ ÿüþ_2 2þ…ÿ ÿüýì62 2þÒÿ ÿüþš2 2þMÿ ÿüþR2 2þˆÿ ÿ üþË2!2þÖÿ ÿ üþu2 2þOÿ ÿ üýò;2 2þ‹ÿ ÿ üþŸ2!2þÙÿ ÿ üþV2 2þQÿ ÿ üþÑ2!2þÿ ÿ üþy2 2ý3Üÿ ÿ üýõ=2 2þSÿÿ üþ¥2!2þÿÿ üþY2 2ý4áÿÿ üýÖ32 2þ`ÿÿ üþv2!2þ­ÿÿüýé82 2þAÿÿüþ‰2!2þÿÿüýöA2 2ý3Úÿÿüþž2!2þ\ÿÿüþM2!2þ¨ÿÿüþ¶2!2þ?ÿÿüþ]2!2þ}ÿÿÿþÃLLþ†ÿÿþLLþ¥ÿÿþxLLþÈÿÿþXLLÿþßLLþ[ÿÿþ­LLþtÿÿþ…LLþÿÿþcLLþ°ÿÿýñMLLþ×ÿÿþ¾LLþTÿÿþ“LLþrÿÿþpLLþ—ÿÿýýSLLþÅÿÿþÒLLþOÿÿþ£LLþhÿÿþ|LLþ‹ÿÿýþXLLþµÿÿþÐL Lþèÿÿþ—LLþ^ÿÿþkLLþÿÿýïNLLþ§ÿÿþ²L Lþ×ÿÿþ€LLþUÿÿþXLLþuÿÿþÑL Lþ ÿÿþ˜L LþÛÿÿþkLLþ]ÿÿýïNLLþ†ÿÿþ³L Lþºÿÿþ|LLþPÿÿýøSLLþpÿÿþµL Lþÿÿþ{L Lþ×ÿÿýöRLLþ[ÿÿþ³L Lþ„ÿÿþxL Lþ¶ÿÿýóQLLþOÿÿþ°L LþmÿÿþvL LþšÿÿýòPL LþØÿÿþ®L LþcÿÿþtL Lþ–ÿÿýðOL LþÚÿÿþ¨L LþdÿÿþhL Lþ™ÿÿþÔL!LþÝÿÿþ‡L Lþfÿÿý÷TL Lþ›ÿÿþ­L!LþàÿÿþlL LþhÿÿþÙL!Lþÿÿþ‹L!LþãÿÿýùVL Lþiÿÿþ²L!Lþ ÿÿþoL LýNçÿÿþÝL!LþuÿÿþˆL!Lþ¹ÿÿýîRL LþYÿÿþ™L!Lþ’ÿÿýúYL LýMáÿÿþ¬L!LþqÿÿþdL!LþµÿÿþÁL!LþWÿÿþrL!Lþÿÿšþ«ÍÍü¼ÿÿššþ¶ÍÍü´ÿÿššþÁÍÍüªÿÿššþÊÍÍÿšþ£ÍÍþÉÿÿšþ±ÍÍþÂÿÿšþ½ÍÍþºÿÿšþÆÍÍþ±ÿÿšþžÍ Íþ¥ÿÿšþ¬ÍÍþËÿÿšþ¹ÍÍþÂÿÿšþÃÍÍþ¸ÿÿšý›ËÍÍþ«ÿÿšþ§ÍÍþÌÿÿšþ´ÍÍþÅÿÿšþ¿ÍÍþ»ÿÿšþÊÍÍþ¯ÿÿšþ§Í Íþ ÿÿšþ¸ÍÍþÈÿÿšþÄÍÍþ¿ÿÿšýžÌÍÍþ³ÿÿšþ°Í Íþ¥ÿÿšþ¾ÍÍþÊÿÿšþÉÍÍþÁÿÿšþ§Í Íþµÿÿšþ·Í Íþ¤ÿÿšþÄÍÍþÈÿÿšýžÌÍÍþ¼ÿÿšþ°Í Íþ®ÿÿšþ¿ÍÍþÌÿÿšýœËÍÍþÃÿÿšþ¯Í Íþ¶ÿÿšþÀÍ Íþ¥ÿÿšýËÍÍþÉÿÿšþ°Í Íþ½ÿÿšþÀÍ Íþ¯ÿÿšýÌÍÍþÌÿ ÿšþ±Í ÍþÄÿ ÿšþÁÍ Íþ·ÿ ÿšýžÌÍ Íþ¥ÿ ÿšþ±Í ÍþÇÿ ÿšþÂÍ Íþ¸ÿ ÿšýžÌÍ Íþ¤ÿ ÿšþ³Í ÍþÆÿ ÿšþÅÍ Íþ·ÿ ÿ šþ¦Í!Íþ¤ÿ ÿ šþ¼Í ÍþÆÿ ÿ šýœËÍ Íþ·ÿ ÿ šþ±Í!Íþ£ÿ ÿ šþÄÍ ÍþÅÿ ÿ šþ¥Í!Íþ¶ÿ ÿ šþ»Í!Íþ¢ÿ ÿ šýœÊÍ ÍþÅÿÿ šþ°Í!Íþµÿÿ šþÃÍ ÍýÌ¡ÿÿ šþ¤Í!ÍþÁÿÿ šþ¼Í!Íþ®ÿÿšýŸËÍ ÍþÉÿÿšþ·Í!Íþ¹ÿÿšýœÉÍ!Íþ£ÿÿšþ²Í!ÍþÂÿÿšþÆÍ!Íþ¯ÿÿšþ¬Í!ÍþÊÿÿšþÂÍ!Íþºÿÿ§þ½ÿÿüÚÿÿ§§þÎÿÿüÊÿÿ§§þâÿÿü»ÿÿ§§þöÿ"ÿ§þ²ÿÿþôÿÿ§þÆÿÿþäÿÿ§þÚÿÿþÕÿÿ§þïÿÿþÅÿÿ§ý«þÿÿþµÿÿ§þ¿ÿÿþùÿÿ§þÓÿÿþåÿÿ§þçÿÿþÑÿÿ§ý¨úÿÿþ¼ÿÿ§þ·ÿÿþýÿÿ§þËÿÿþìÿÿ§þàÿÿþ×ÿÿ§þöÿÿþÃÿÿ§þ¸ÿ ÿþ¯ÿÿ§þÑÿÿþòÿÿ§þêÿÿþÞÿÿ§ý¬þÿÿþÉÿÿ§þÄÿ ÿþµÿÿ§þÝÿÿþøÿÿ§þöÿÿþäÿÿ§þ·ÿ ÿþÌÿÿ§þÐÿ ÿþ³ÿÿ§þêÿÿþóÿÿ§ý¬þÿÿþÚÿÿ§þÄÿ ÿþÁÿÿ§þßÿÿþüÿÿ§ý©úÿÿþçÿÿ§þÃÿ ÿþÎÿÿ§þàÿ ÿþµÿÿ§ýªûÿÿþôÿÿ§þÄÿ ÿþÛÿÿ§þâÿ ÿþÂÿÿ§ý«üÿÿþýÿ ÿ§þÅÿ ÿþèÿ ÿ§þãÿ ÿþÏÿ ÿ§ý«üÿ ÿþ´ÿ ÿ§þÆÿ ÿþïÿ ÿ§þäÿ ÿþÑÿ ÿ§ý¬ýÿ ÿþ´ÿ ÿ§þÈÿ ÿþîÿ ÿ§þëÿ ÿþÐÿ ÿ §þ¶ÿ!ÿþ³ÿ ÿ §þÙÿ ÿþíÿ ÿ §ýªùÿ ÿþÏÿ ÿ §þÆÿ!ÿþ²ÿ ÿ §þéÿ ÿþìÿ ÿ §þ´ÿ!ÿþÎÿ ÿ §þ×ÿ!ÿþ±ÿ ÿ §ý©øÿ ÿþëÿÿ §þÄÿ!ÿþÍÿÿ §þçÿ ÿýþ¯ÿÿ §þ³ÿ!ÿþäÿÿ §þÙÿ!ÿþÁÿÿ§ý­ûÿ ÿþõÿÿ§þÐÿ!ÿþÔÿÿ§ý©öÿ ÿýþ±ÿÿ§þÇÿ!ÿþæÿÿ§þîÿ!ÿþÃÿÿ§þ¾ÿ!ÿþ÷ÿÿ§þåÿ!ÿþÕÿÿ!ÿþ¢22!ÿþ~22!ÿþ_22!ÿþD22!ÿþ322 ÿþº22 ÿþˆ22 ÿþ^22 ÿþ<22ÿþÎ22ÿþ˜22ÿþl22ÿþG22ÿþä22ÿþª22ÿþz22ÿþS22ÿþ622ÿþ½22ÿþŠ22ÿþ`22ÿþ=22ÿþÒ22þ4ÿÿþ“22þNÿÿþ^22þuÿÿþ722þ¤ÿÿþ²2 2þÝÿÿþv22þCÿÿþG22þgÿÿþÖ2 2þ“ÿÿþ’2 2þÈÿÿþ]22þ;ÿÿþ722þdÿÿþ±2 2þ›ÿÿþv22ý3àÿÿþG22þMÿÿþÕ2 2þ}ÿÿþ‘2 2þºÿÿþ]22þ:ÿÿþ722þcÿÿþ­2 2þ™ÿÿþi2 2þÞÿÿþ922þKÿÿþª2 2þ|ÿÿþf2 2þ¹ÿÿþ822þ9ÿÿþ¦2 2þaÿÿþd2 2þ—ÿÿþ72 2þÜÿÿþ£2 2þLÿÿþa2 2þ…ÿÿþ62 2þÒÿÿþŸ2 2þMÿÿþ_2 2þˆÿÿýø52 2þÖÿÿþš2 2þPÿÿþS2 2þ‹ÿÿþÍ2 2ý3Úÿÿþw2 2þRÿÿþ<2 2þÿÿþ£2 2ý3ÝÿÿþX2 2þTÿÿýÖ32 2þ’ÿÿþ~2 2ý3áÿ ÿ!ÿþ¯LL!ÿþLL!ÿþtLL!ÿþ\LL!ÿL ÿþÄLL ÿþ˜LL ÿþsLL ÿþTLLÿþÖLLÿþ¦LLÿþLLÿþ^LLÿþéLLÿþ¶LLÿþŒLLÿþiLLÿþOLLÿþÇLLÿþšLLÿþuLLÿþVLLÿþÚLLþNÿÿþ¢LLþeÿÿþsLLþ‡ÿÿþQLLþ±ÿÿþ½L Lþäÿÿþ‰LLþ[ÿÿþ_LLþ{ÿÿþÝL Lþ¢ÿÿþ¡L LþÑÿÿþrLLþTÿÿþQLLþyÿÿþ½L Lþ©ÿÿþˆL Lþæÿÿþ^LLþdÿÿþÜL Lþÿÿþ L LþÅÿÿþrLLþSÿÿþPLLþxÿÿþ¹L Lþ¨ÿÿþ}L LþåÿÿþSLLþcÿÿþ¶L Lþÿÿþ{L LþÃÿÿþRLLþSÿÿþ³L LþvÿÿþxL Lþ¥ÿÿþQL Lþãÿÿþ°L LþcÿÿþvL Lþ•ÿÿþPL LþÚÿÿþ­L LþdÿÿþtL Lþ˜ÿÿýúOL LþÝÿÿþ¨L LþfÿÿþiL Lþ›ÿÿþÖL!Lþáÿÿþ‰L LþhÿÿþUL Lþžÿÿþ°L!LþäÿÿþnL LþkÿÿþÝL!Lþ¡ÿÿþL LýMçÿ ÿ!ÿþ±ÍÍ!ÿþºÍÍ!ÿþÂÍÍ!ÿþÈÍÍ!ÿÍ ÿþ«ÍÍ ÿþ·ÍÍ ÿþÂÍÍ ÿþËÍÍÿþ¦ÍÍÿþ³ÍÍÿþ¾ÍÍÿþÈÍÍÿþ ÍÍÿþ¯ÍÍÿþ»ÍÍÿþÅÍÍÿþÌÍÍÿþªÍÍÿþ·ÍÍÿþÁÍÍÿþÊÍÍÿþ¤ÍÍþÌÿÿþµÍÍþÆÿÿþÂÍÍþ¼ÿÿþÌÍÍþ°ÿÿþ­Í Íþ¢ÿÿþ¼ÍÍþÉÿÿþÈÍÍþÀÿÿþ¤Í ÍþµÿÿþµÍ Íþ§ÿÿþÂÍÍþËÿÿþÌÍÍþÀÿÿþ­Í Íþ²ÿÿþ¼Í Íþ¡ÿÿþÈÍÍþÆÿÿþ¤Í ÍþºÿÿþµÍ Íþ«ÿÿþÂÍÍþËÿÿþÌÍÍþÁÿÿþ®Í Íþ³ÿÿþ¿Í Íþ¢ÿÿþËÍÍþÇÿÿþ¯Í ÍþºÿÿþÀÍ Íþ«ÿÿþËÍÍþËÿÿþ°Í ÍþÁÿÿþÀÍ Íþ´ÿÿþÌÍ Íþ¢ÿÿþ±Í ÍþÆÿÿþÁÍ Íþ¸ÿÿþÌÍ Íþ¤ÿÿþ±Í ÍþÆÿÿþÂÍ Íþ·ÿÿýàÌÍ Íþ¤ÿÿþ³Í ÍþÆÿÿþÅÍ Íþ·ÿÿþ¦Í!Íþ£ÿÿþ¼Í ÍþÅÿÿþÊÍ Íþ¶ÿÿþ±Í!Íþ¢ÿÿþÃÍ ÍþÄÿÿþ¤Í!ÍþµÿÿþºÍ!Íþ¡ÿ ÿ!ÿþÅÿ=ÿþÕÿ=ÿþäÿ=ÿþôÿ|ÿþ¼ÿ=ÿþÐÿ=ÿþåÿ=ÿþùÿ<ÿþµÿ=ÿþÊÿ=ÿþÞÿ=ÿþòÿ<ÿþ®ÿ=ÿþÂÿ=ÿþ×ÿ=ÿþëÿ=ÿþýÿ<ÿþ»ÿ=ÿþÏÿ=ÿþäÿ=ÿþøÿ<ÿþ´ÿÿþþÿÿþÌÿÿþíÿÿþåÿÿþÙÿÿþüÿÿþÅÿÿþ¿ÿ ÿþ°ÿÿþØÿÿþôÿÿþòÿÿþàÿÿþ³ÿ ÿþÌÿÿþÌÿ ÿþ·ÿÿþåÿÿþùÿÿþüÿÿþáÿÿþÀÿ ÿþÈÿÿþÙÿ ÿþ¯ÿÿþòÿÿþîÿÿþ³ÿ ÿþÕÿÿþÌÿ ÿþ¼ÿÿþåÿÿþúÿÿþüÿÿþâÿÿþÁÿ ÿþÉÿÿþßÿ ÿþ°ÿÿþúÿÿþïÿÿþÂÿ ÿþÖÿÿþàÿ ÿþ½ÿÿþûÿÿþúÿÿþÄÿ ÿþãÿÿþâÿ ÿþÊÿÿþüÿ ÿþ±ÿÿþÅÿ ÿþïÿÿþãÿ ÿþÒÿÿþüÿ ÿþ´ÿÿþÆÿ ÿþîÿÿþäÿ ÿþÐÿÿýÞýÿ ÿþ³ÿÿþÈÿ ÿþíÿÿþëÿ ÿþÏÿÿþµÿ!ÿþ±ÿÿþØÿ ÿþëÿÿþøÿ ÿþÍÿÿþÅÿ!ÿþ°ÿÿþèÿ ÿþêÿÿþ³ÿ!ÿþÌÿÿþÕÿ ÿýþ¯ÿ ÿ2þ‡ÿ#ÿ2þ­ÿ#ÿ2þÙÿ#ÿ2þ9ÿ$ÿ2þRÿ$ÿ2þoÿ$ÿ2þ‘ÿ$ÿ2þ¹ÿ$ÿ2þíÿ$ÿ2þ@ÿ%ÿ2þZÿ%ÿ2þyÿ%ÿ2þ¥ÿ%ÿ2þßÿ%ÿý2Dÿ&ÿý2iÿ&ÿý2”ÿ&ÿý2Êÿ&ÿþ:ÿ'ÿþ[ÿ'ÿþ„ÿ'ÿþ¶ÿ ÿLþ—ÿ#ÿLþ¹ÿ#ÿLþàÿ#ÿLþRÿ$ÿLþhÿ$ÿLþ‚ÿ$ÿLþ ÿ$ÿLþÃÿ$ÿLþñÿ$ÿLþXÿ%ÿLþpÿ%ÿLþ‹ÿ%ÿLþ²ÿ%ÿLþæÿ%ÿýL\ÿ&ÿýL|ÿ&ÿýL£ÿ&ÿýLÓÿ&ÿþSÿ'ÿþqÿ'ÿþ•ÿ'ÿþÁÿ ÿÍþ¸ÿ#ÿÍþ®ÿ#ÿÍþ£ÿ#ÿÍþËÿ$ÿÍþÅÿ$ÿÍþ¾ÿ$ÿÍþµÿ$ÿÍþ«ÿ$ÿÍþ¸ÿ$ÿÍþÉÿ%ÿÍþÃÿ%ÿÍþ»ÿ%ÿÍþ°ÿ%ÿÍþ¡ÿ%ÿýÍÈÿ&ÿýÍ¿ÿ&ÿýÍ´ÿ&ÿýͧÿ&ÿþËÿ'ÿþÃÿ'ÿþ¸ÿ'ÿþ¬ÿ ÿÿþÑÿ'ÿþÁÿ'ÿþ²ÿ&ÿþûÿ'ÿþëÿ'ÿþÜÿ'ÿþÌÿ'ÿþ½ÿ'ÿþ½ÿ&ÿþöÿ'ÿþçÿ'ÿþ×ÿ'ÿþÄÿ'ÿþ°ÿ&ÿþôÿ'ÿþßÿ'ÿþËÿ'ÿþ·ÿ&ÿþúÿ'ÿþæÿ'ÿþÒÿ'ÿþ¾ÿ ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ$ÿý¨?ÃÃþž‡ ‡þžÿ"ÿûäd22ÃÃþž‡ ‡þžÿ!ÿý¡=22 Ãþž‡ ‡þžÿÿýß_22 Ãþž‡ ‡þžÿÿýš:22 Ãþž‡ ‡þžÿÿýÚ[22 Ãþž‡ ‡þžÿÿý”922 Ãþž‡ ‡þžÿÿýÕV2 2 Ãþž‡ ‡þžÿÿýŽ72 2 Ãþž‡ ‡þžÿÿýÏR2 2 Ãþž‡ ‡þžÿÿýˆ62 2 Ãþž‡ ‡þžÿÿýÊN22 Ãþž‡ ‡þžÿÿý‚522 Ãþž‡ ‡þžÿÿýÈK22 Ãþž‡ ‡þžÿÿý‡522 Ãþž‡ ‡þžÿ ÿýÓR22 Ãþž‡ ‡þžÿ ÿý”822 Ãþž‡ ‡þžÿ ÿýÝ[22 Ãþž‡ ‡þžÿ ÿý¡;22 Ãþž‡ ‡þžÿÿýíd22 Ãþž‡ ‡þžÿÿý®?22 Ãþž‡ ‡þžÿÿþo22 Ãþž‡ ‡þžÿÿý»D22 Ãþž‡ ‡þžÿÿý{32 2 Ãþž‡ ‡úžÿÿÈK2"2 Ãþž‡ ‡ûžÿ‡52#2 Ãþž‡ ‡ý–R2%2 Ãþž‡ ‡þr2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2%2þFÃÃþž‡ ‡þp2#2ü3yÿÃÃþž‡ ‡þp2"2ûE¼ÿÿÃÃþž‡ ‡þp2!2þpÿÿ Ãþž‡ ‡þp22ý@°ÿÿ Ãþž‡ ‡þp22ýfíÿÿ Ãþž‡ ‡þp22ý<£ÿÿ Ãþž‡ ‡þp22ý\ßÿÿ Ãþž‡ ‡þp22ý8–ÿ ÿ Ãþž‡ ‡þp22ýTÖÿ ÿ Ãþž‡ ‡þp22ý6‰ÿ ÿ Ãþž‡ ‡þp22ýMÊÿ ÿ Ãþž‡ ‡þp22ý4~ÿÿ Ãþž‡ ‡þp22ýF¿ÿÿ Ãþž‡ ‡þp22ý3rÿÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ$ÿýµXØØþÕÓ ÓþÛÿ"ÿûéyLLØØþÕÓ ÓþÛÿ!ÿý®ULL ØþÕÓ ÓþÛÿÿýætLL ØþÕÓ ÓþÛÿÿý¨TLL ØþÕÓ ÓþÛÿÿýápLL ØþÕÓ ÓþÛÿÿý£RLL ØþÕÓ ÓþÛÿÿýÜlL L ØþÕÓ ÓþÛÿÿýžQL L ØþÕÓ ÓþÛÿÿý×hL L ØþÕÓ ÓþÛÿÿý˜OL L ØþÕÓ ÓþÛÿÿýÓeLL ØþÕÓ ÓþÛÿÿý“NLL ØþÕÓ ÓþÛÿÿýÑcLL ØþÕÓ ÓþÛÿÿý—OLL ØþÕÓ ÓþÛÿ ÿýÛhLL ØþÕÓ ÓþÛÿ ÿý£QLL ØþÕÓ ÓþÛÿ ÿýäpLL ØþÕÓ ÓþÛÿ ÿý®TLL ØþÕÓ ÓþÛÿÿýñyLL ØþÕÓ ÓþÛÿÿýºXLL ØþÕÓ ÓþÛÿÿþ‚LL ØþÕÓ ÓþÛÿÿýÆ\LL ØþÕÓ ÓþÛÿÿýML L ØþÕÓ ÓúÛÿÿÑbL"L ØþÕÓ ÓûÛÿ—OL#L ØþÕÓ ÓýÕhL%L ØþÕÓ Óþ±L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L%Lþ^ØØþÕÓ Óþ¯L#LüM‹ÿØØþÕÓ Óþ¯L"Lû]ÇÿÿØØþÕÓ Óþ¯L!Lþƒÿÿ ØþÕÓ Óþ¯LLýX¼ÿÿ ØþÕÓ Óþ¯LLýzñÿÿ ØþÕÓ Óþ¯LLýT°ÿÿ ØþÕÓ Óþ¯LLýqæÿÿ ØþÕÓ Óþ¯LLýR¥ÿ ÿ ØþÕÓ Óþ¯LLýjÝÿ ÿ ØþÕÓ Óþ¯LLýO™ÿ ÿ ØþÕÓ Óþ¯LLýdÓÿ ÿ ØþÕÓ Óþ¯LLýMÿÿ ØþÕÓ Óþ¯LLý^Éÿÿ ØþÕÓ Óþ¯LLþ…ÿÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ$ÿý¯Êþ/D DþUÿ"ÿû ÀÍÍþ/D DþUÿ!ÿý±ÊÍÍ þ/D DþUÿÿý¡ÂÍÍ þ/D DþUÿÿý³ËÍÍ þ/D DþUÿÿý£ÃÍÍ þ/D DþUÿÿý´ËÍÍ þ/D DþUÿÿý¤ÄÍ Í þ/D DþUÿÿý¶ÌÍ Í þ/D DþUÿÿý¥ÅÍ Í þ/D DþUÿÿý·ÌÍ Í þ/D DþUÿÿý§ÆÍÍ þ/D DþUÿÿý¹ÌÍÍ þ/D DþUÿÿý§ÇÍÍ þ/D DþUÿÿý¸ÌÍÍ þ/D DþUÿ ÿý¤ÅÍÍ þ/D DþUÿ ÿý´ÌÍÍ þ/D DþUÿ ÿý¢ÃÍÍ þ/D DþUÿ ÿý±ËÍÍ þ/D DþUÿÿý¸ÀÍÍ þ/D DþUÿÿý®ÊÍÍ þ/D DþUÿÿþ¾ÍÍ þ/D DþUÿÿýªÈÍÍ þ/D DþUÿÿþ»Í!Í þ/D DúUÿÿ§ÇÍ"Í þ/D DûUÿ¸ÌÍ#Í þ/D DýXÅÍ%Í þ/D DþhÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ%ÍþÈþ/D DþiÍ$Íý»ÿþ/D DþiÍ"ÍûȪÿÿþ/D DþiÍ!Íþ½ÿÿ þ/D DþiÍÍýÉ­ÿÿ þ/D DþiÍÍýÀ¸ÿÿ þ/D DþiÍÍý˱ÿÿ þ/D DþiÍÍý¡ÿÿ þ/D DþiÍÍýË´ÿ ÿ þ/D DþiÍÍýĤÿ ÿ þ/D DþiÍÍýÌ·ÿ ÿ þ/D DþiÍÍýƧÿ ÿ þ/D DþiÍÍþºÿÿ þ/D DþiÍÍýÈ©ÿÿ þ/D DþiÍÍþ½ÿÿÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ$ÿýÃöÿÿþèÿ"ÿý®áÿÿþèÿ!ÿýÆøÿÿþèÿÿý°äÿÿþèÿÿýÈùÿÿþèÿÿý±æÿÿþèÿÿýËûÿÿþèÿÿý³éÿ ÿþèÿÿýÎüÿ!ÿþèÿÿýµëÿ#ÿþèÿÿýÐýÿ$ÿþèÿÿý·íÿ&ÿþèÿÿýÓýÿ'ÿþèÿÿý·ïÿ)ÿþèÿÿýÑýÿ*ÿþèÿ ÿý³ëÿ,ÿþèÿ ÿýËûÿ-ÿþèÿ ÿý°æÿ/ÿþèÿ ÿýÆùÿ0ÿþèÿÿý½áÿ2ÿþèÿÿýÁöÿ3ÿþèÿÿþÜÿ5ÿþèÿÿý¼óÿ6ÿþèÿÿýÖþÿ7ÿúèÿÿ·ïÿ9ÿûèÿÑýÿ:ÿë=ÿþþÿ&ÿþòÿ;ÿýþ×ÿ;ÿýó»ÿ;ÿþÛÿ;ÿýöÀÿ;ÿýá½ÿ:ÿýùÅÿ;ÿýæ°ÿ:ÿýûÊÿ;ÿýê³ÿ:ÿýýÐÿ;ÿýî·ÿ:ÿýþÕÿ;ÿýòºÿ;ÿþÚÿÿ ÿý³F2.2 ÿýáf202 ÿý”:212ÿýÉQ232ÿýz4242ÿý­C262ÿýÝb282ÿý9292üÿÃN2;2ýt32{2þ>2;2ü9ƒÿ292ú5väÿÿ272ü3iØÿÿ72ý]Êÿÿ52ýI³ÿÿ32ý:ÿÿ12ü3påÿ ÿ02ýUÇÿ ÿ.2ýB¤ÿ ÿ,2ý7‚ÿÿ+2ýdÚÿÿ)2ýL¹ÿÿ'2ý=”ÿÿ%2ü4uñÿÿ$2ýYÍÿÿ"2ýD¬ÿÿ 2ý5}ÿÿ2ýTÍÿÿ2ý<™ÿÿ2ýjäÿÿ2ýG·ÿ!ÿ2ý6ƒÿ#ÿ2ýXÒÿ$ÿ2ý>Ÿÿ&ÿ2ü3oñÿ'ÿ2ýJ½ÿ)ÿ2ý7ˆÿ+ÿ2ýYØÿ,ÿ 2ý:™ÿ.ÿ 2ý^Ýÿ/ÿ 2ý<Ÿÿ1ÿ 2ýcãÿ2ÿ2ý>¦ÿ2ÿýªD22ýiíÿ1ÿýÐ[22ýA­ÿ2ÿýz522ýnøÿ1ÿýž?22ýC´ÿ1ÿýÊS22ý3tÿ2ÿý522þºÿ1ÿý¸G221ÿüñm32 20ÿý¤>2 2.ÿýÛ]2 2-ÿý822+ÿýÉP22*ÿý}422(ÿý·F22&ÿýíl22%ÿý¥>22#ÿýèe22"ÿýª>22 ÿýõi22ÿý¯@22ÿýým22 ÿý¾]L.L ÿýç{L0L ÿý£TL1LÿýÒhL3LÿýŒNL4Lÿý¹[L6LÿýävL8LÿýžRL9LüÿÍeL;Lý‡ML{LþVL;LüR”ÿL9LúOˆéÿÿL7LüM}ßÿÿ7LýrÓÿÿ5Lý`¾ÿÿ3LýTžÿÿ1LüMƒêÿ ÿ0LýkÐÿ ÿ.LýZ±ÿ ÿ,LýP“ÿÿ+Lýyáÿÿ)LýcÃÿÿ'LýU£ÿÿ%LüN‡ôÿÿ$LýnÖÿÿ"Lý\¸ÿÿ LýNÿÿLýkÖÿÿLýT§ÿÿLý~éÿÿLý_Âÿ!ÿLýO”ÿ#ÿLýnÚÿ$ÿLýV­ÿ&ÿLý‚ôÿ'ÿLýbÇÿ)ÿLýQ™ÿ+ÿLýnßÿ,ÿ LýS§ÿ.ÿ Lýsäÿ/ÿ LýU­ÿ1ÿ Lýxèÿ2ÿLýW³ÿ2ÿý¶\LLý|ñÿ1ÿýØpLLýY¹ÿ2ÿýŒNLLýúÿ1ÿý«XLLý[¿ÿ1ÿýÓiLLþ†ÿ2ÿýNLLþÅÿ1ÿýÂ^LL1ÿýôL L0ÿý±WL L.ÿýârL L-ÿýŸRLL+ÿýÒgLL*ÿýNLL(ÿýÂ]LL&ÿýñLL%ÿý²VLL#ÿýìyLL"ÿý¶WLL ÿý÷}LLÿý»XLLÿýýLL ÿý¬ÈÍ.Í ÿý¡ÀÍ0Í ÿý´ËÍ1Íÿý§ÅÍ3Íÿý»ÌÍ4Íÿý®ÉÍ6Íÿý¢ÁÍ8Íÿý¶ËÍ9Íüÿ¨ÆÍ;Íþ¼Í|ÍþÊÍ;Íü˹ÿÍ9Íú̼ ÿÿÍ8Íý¿£ÿÿ7Íý§ÿÿ5ÍýǬÿÿ3Íý˶ÿÿ2Íý½ ÿ ÿ0Íýħÿ ÿ.Íýɰÿ ÿ,Íý̹ÿÿ+ÍýÀ£ÿÿ)ÍýÆ«ÿÿ'ÍýÊ´ÿÿ%Íü̼Çÿÿ$Íýæÿÿ"ÍýÈ®ÿÿ Íý̺ÿÿÍýĦÿÿÍý˳ÿÿÍý¿ ÿÿÍýÈ«ÿ!ÿÍý̹ÿ#ÿÍýäÿ$ÿÍýʱÿ&ÿÍý¾Çÿ'ÿÍýǪÿ)ÿÍýÌ·ÿ+ÿÍýãÿ,ÿ Íý˳ÿ.ÿ Íý¢ÿ/ÿ Íýʱÿ1ÿ ÍýÁ ÿ2ÿÍýʰÿ2ÿý¯ÈÍÍý¿¸ÿ1ÿý¥ÃÍÍýÉ®ÿ2ÿý»ÌÍÍý¾àÿ1ÿý²ÊÍÍýɬÿ1ÿý§ÅÍÍþ¼ÿ2ÿýºÌÍÍþ«ÿ1ÿý«ÈÍÍ1ÿýÇ¾Í Í0ÿý°ÊÍ Í.ÿý¢ÂÍ Í-ÿýµËÍÍ+ÿý§ÅÍÍ*ÿýºÌÍÍ(ÿý«ÈÍÍ&ÿý¸¾ÍÍ%ÿý°ÊÍÍ#ÿý©ÀÍÍ"ÿý¯ÊÍÍ ÿýÕ¿ÍÍÿý­ÉÍÍÿýõ¾ÍÍ ÿý¿óÿ:ÿý¯àÿ;ÿýËùÿ:ÿý·ìÿ;ÿý×þÿ:ÿýÁôÿ:ÿý°ãÿ;ÿýÍûÿ:ÿý¹îÿ;ÿýÙþÿ{ÿþ÷ÿ;ÿýûÒÿ:ÿüýÙ®ÿ9ÿüþß²ÿ:ÿýå·ÿ:ÿýñ¿ÿ:ÿýùÍÿ:ÿüþÛ®ÿ:ÿýê¸ÿ:ÿýõÅÿ:ÿýüÓÿ;ÿýá±ÿ:ÿýï½ÿ:ÿýøËÿ:ÿüþÙÈÿ:ÿýèµÿ:ÿýóÂÿ:ÿýýÕÿ;ÿýêµÿ:ÿýùÉÿ;ÿýß®ÿ:ÿýò½ÿ:ÿýýÒÿ;ÿýè´ÿ:ÿý÷Æÿ;ÿýÜÈÿ:ÿýð»ÿ:ÿýüÐÿ;ÿýè²ÿ:ÿýúÉÿ;ÿýå°ÿ:ÿýøÆÿ;ÿýâ¯ÿ:ÿý÷Äÿ2ÿýÂóÿÿýß½ÿ1ÿý´æÿÿýöÁÿ2ÿý×ýÿÿýÜÞÿ1ÿýÇöÿÿýô¾ÿ1ÿý·ëÿÿþÚÿ2ÿýÕýÿÿþ¼ÿ1ÿý½òÿ:ÿýÈÝÿ;ÿýÅ÷ÿ:ÿý±åÿ;ÿýÍûÿ:ÿý·ìÿ;ÿýÕþÿ:ÿý½óÿ:ÿý½Þÿ;ÿýÄ÷ÿ:ÿý³áÿ;ÿýÂ÷ÿ:ÿýÓßÿ;ÿýÀöÿ:ÿýôÝÿÿ2þn‡ ‡þ«ÃÃ2û4kÁˆ‡ ‡ýÁÃà 2ù5pØÿÿ§‡ ‡þ¨Ãà 2ü6tÜÿÿý퉇 ‡ý‹ÀÃà 2ü6xàÿÿþ­‡ ‡þ¤ÃÃ2ü4mÛÿÿþЇ ‡ýоÃÃ2ýaÎÿ ÿþ´‡ ‡þ ÃÃ2ýU¿ÿ ÿþ‡ ‡ýˆ»ÃÃ2ýL¯ÿÿþ»‡ ‡þÃÃü2DŸÿÿþ‡ ‡þ¹ÃÃþÿÿþ‡ ‡þ™ÃÃÿþ“‡ ‡þµÃÃÿþʇ ‡þ•ÃÃÿþ—‡ ‡þ²ÃÃÿþÒ‡ ‡þ’ÃÃÿþ‡ ‡þ®ÃÃÿþÚ‡ ‡ýÂÃÃÿþ¢‡ ‡þ«ÃÃÿý∇ ‡ýÁÃÃÿþ©‡ ‡þ§ÃÃÿýñ‰‡ ‡ý‹¿ÃÃÿþ¯‡ ‡þ£ÃÃÿþ‹‡ ‡ý‰½ÃÃÿþ¶‡ ‡þŸÃÃÿþ‡ ‡ýˆ»ÃÃÿþ›‡ ‡þœÃÃÿû¥N4}‡ ‡þ¸ÃÃÿýœH22þR‡ ‡þ˜ÃÃÿý D22ý3y‡ ‡þ´Ã Ãÿý±M22þM‡ ‡þ”à ÃÿýÂW2 2þu‡ ‡þ±Ã ÃÿýÑc2 2þH‡ ‡þ‘à Ãÿüßp42 2þp‡ ‡þ­Ã Ãÿüø~722þC‡ ‡ýÂà à ÿýŒ<22þk‡ ‡þªÃ à ÿýœB22ý?†‡ ‡ýŒÁà à ÿý­J22þe‡ ‡þ¦Ã ÃÿýÃT22ý;„‡ ‡ýŠ¿ÃÃÿüäm322þ`‡ ‡þ¢ÃÃÿý:22ý8‚‡ ‡ý‰½ÃÃÿý·J2 2þ[‡ ‡þžÃÃüÿÛd2"2ý6‡ ‡ýˆºÃÃý…72$2þV‡ ‡þ›ÃÃ'2ý4|‡ ‡þ·ÃÃ(2þQ‡ ‡þ—ÃÃ(2ý3x‡ ‡þ´ÃÃ)2þL‡ ‡þ”ÃÃ*2þt‡ ‡þ°ÃÃ*2þG‡ ‡þ‘ÃÃ+2þo‡ ‡þ¬ÃÃ+2þB‡ ‡ýŽÂÃÃ,2þi‡ ‡þ©ÃÃ,2ý>†‡ ‡ûŒÀÃÃ2,2þd‡ ‡ü¥ÃÃ2,2ý:„‡ ‡üоÃ2+2ü<„¬‡ ‡ý¡Ã2)2ù@ŒïüñŒ‡ ‡ý‰¼2'2üD–ôüüþ¹‡ ‡þž2%2ü@—÷üüýõ‡ ‡$2ü:ˆñüüþÀ‡ ‡"2ü6yçü üýù’‡ ‡ 2ü3lÛü üþLJ ‡2ý_Ìüüýû–‡ ‡2ýS¼üüþЇ ‡LþªÓ ÓþÖØØLüNØÓ ÓØ LùOƒßÿÿßÓ ÓþÖØØ LüP‡ãÿÿýùÔÓ ÓþרØ LüPŠæÿÿþáÓ ÓþÕØØLüM€âÿÿþÔÓ ÓþרØLýuÖÿ ÿþäÓ ÓþÕØØLýkÉÿ ÿþÕÓ ÓþרØLýc»ÿÿþçÓ ÓþÕØØüL\­ÿÿþÖÓ ÓþרØþ ÿÿþéÓ ÓþÔØØÿþØÓ ÓþרØÿþìÓ ÓþÔØØÿþÙÓ ÓþÖØØÿþïÓ ÓþÔØØÿþÛÓ ÓþÖØØÿþòÓ ÓþÔØØÿþÝÓ ÓþÖØØÿþõÓ ÓØÿþàÓ ÓþÕØØÿýúÔÓ ÓþרØÿþâÓ ÓþÕØØÿþÔÓ ÓþרØÿþäÓ ÓþÕØØÿþÕÓ ÓþרØÿþÈÓ ÓþÕØØÿû²ePÃÓ ÓþרØÿýª_LLþÓ ÓþÔØØÿý®\LLýN½Ó Óþר Øÿý½dLLþwÓ ÓþÔØ ØÿýÌmL Lþ¶Ó ÓþÖØ ØÿýÙxL LþnÓ ÓþÔØ ØÿüæƒNL Lþ®Ó ÓþÖØ ØÿüúQLLýgÒÓ ÓþÔØ Ø ÿýœULLþ¦Ó ÓþÖØ Ø ÿýªZLLý`ÑÓ Óþר Ø ÿý¹bLLþžÓ ÓþÕØ ØÿýÍjLLýZÏÓ ÓþרØÿýéLLþ–Ó ÓþÕØØÿýŸTLLýVËÓ ÓþרØÿýÂbL LþŽÓ ÓþÕØØüÿâxL"LýRÇÓ ÓþרØý•QL$Lþ…Ó ÓþÕØØ'LýOÂÓ ÓþרØ(Lþ}Ó ÓþÔØØ(LýM»Ó ÓþÖØØ)LþuÓ ÓþÔØØ*Lþ´Ó ÓþÖØØ*LþmÓ ÓþÔØØ+Lþ¬Ó ÓþÖØØ+LýeÒÓ ÓþÔØØ,Lþ¤Ó ÓþÖØØ,Lý_ÑÓ ÓüרØL,LþœÓ ÓüÕØØL,LýYÎÓ ÓýרL+LüU•ÝÓ ÓýÕØL)LùXœóÿûÕÓ Óþ×L'Lü\¥øÿÿþæÓ ÓþÕL%LüX¥ûÿÿýüÖÓ Ó$LüT˜öÿÿþèÓ Ó"LüP‹ìÿ ÿýþ×Ó Ó LüMâÿ ÿþëÓ ÓLýtÕÿÿþÙÓ ÓLýiÇÿÿþîÓ ÓÍþnD Dþ$ÍüÌ¿ŽD Dý> Íù̽£ÿÿ[D Dþ' Íü̼¢ÿÿý©ED Dý@ ÍüÌ»¡ÿÿþ`D Dþ*Íý¾¢ÿÿþFD DýBÍýÁ¦ÿ ÿþeD Dþ.ÍýÄ©ÿ ÿþHD DýCÍýÆ­ÿÿþjD Dþ1üÍȱÿÿþJD DþþµÿÿþoD Dþ4ÿþMD DþÿþuD Dþ7ÿþPD Dþÿþ{D Dþ:ÿþTD Dþ!ÿþD Dý=ÿþXD Dþ%ÿý‡ED Dý?ÿþ]D Dþ(ÿý»FD DýAÿþaD Dþ+ÿþGD DýBÿþfD Dþ.ÿþID DýCÿþwD Dþ2ÿû°ÆÉTD Dþÿý²ÇÍÍþ™D Dþ5ÿý±ÈÍÍýË[D Dþ ÿý­ÆÍÍþ¡D Dþ8 ÿý©ÄÍ ÍþbD Dþ ÿý¥ÁÍ ÍþªD Dþ; ÿü¡½ÌÍ ÍþjD Dþ" ÿüàºÌÍÍý²ED Dý=  ÿý¶ÊÍÍþrD Dþ%  ÿý²ÉÍÍý¹FD Dý?  ÿý®ÇÍÍþzD Dþ) ÿý¨ÄÍÍý¾HD DýAÿý ¾ÍÍþ‚D Dþ,ÿýµËÍÍýÃLD DýBÿý«ÇÍ ÍþŠD Dþ/üÿ¢ÀÍ"ÍýÇPD DýCý¸ÌÍ$Íþ“D Dþ2'ÍýÊVD Dþ(Íþ›D Dþ6(ÍýÌ\D Dþ)Íþ¤D Dþ9*ÍþcD Dþ *Íþ¬D Dþ;+ÍþkD Dþ#+Íý³ED Dý>,ÍþtD Dþ&,ÍýºFD Dû@Í,Íþ|D Dü)Í,ÍýÀID DüAÍ+ÍüʸfD Dý-Í)Íùɶš’HD DýCÍ'ÍüÈ´œššþhD Dþ0Í%ÍüÉ´›ššý•JD D$ÍüË·ššþnD D"ÍüÌ»Ÿš šý—LD D!Íý¾¢š šþsD DÍý¦ššý™OD DÍýŪššþyD DOÿûþÞÁþÿ8ÿùýÛ²ÿÿßÿ6ÿüüÙ±ÿÿýÁýÿ3ÿüüدÿÿþÙÿ1ÿüþݱÿÿþûÿ/ÿýãµÿ ÿþÔÿ-ÿýêºÿ ÿþøÿ*ÿýïÀÿÿþÏÿ(ÿýôÆÿÿþõÿ&ÿþÍÿÿþÊÿ>ÿþòÿ=ÿþÄÿ>ÿþíÿ=ÿþ¿ÿ>ÿþèÿ=ÿþºÿ>ÿþãÿ=ÿýµþÿ=ÿþÞÿ=ÿýËýÿ=ÿþØÿ>ÿþûÿ=ÿþÓÿ>ÿþøÿ=ÿþÜÿ;ÿýÄîÿ:ÿýÈñÿ:ÿýÆóÿ:ÿýÀîÿ:ÿý¹éÿ:ÿý´âÿ:ÿü°Ûþÿ9ÿüÞÕüÿ:ÿýÎøÿ:ÿýÈõÿ:ÿýÁðÿ:ÿý¹êÿ:ÿý®Ýÿ;ÿýÍùÿ:ÿý½ðÿ:ÿý±âÿ;ÿýÒüÿjÿüøÒØÿ9ÿùöΫ§­ùÿ6ÿüóÊ©§§þÐÿ4ÿüöʨ§§ýªöÿ1ÿüùЪ§§þËÿ/ÿüü×­§ §ý©óÿ,ÿüþÞ±§ §þÆÿ+ÿýä¶§§þîÿ(ÿýë»§§þÀÿ ÿÃý‡4‡þ¶ÃÃþ®‡4‡þ–ÃÃþ’‡4‡þ²ÃÃþ²‡4‡þ’ÃÃþ–‡4‡Ãþ¶‡4‡ Ãþ™‡3‡ Ãþ¹‡3‡ Ãþ‡2‡ Ãý¼ˆ‡1‡ Ãþ¡‡1‡ Ãý¾Š‡0‡ Ãþ¤‡0‡ ÃýÀ‹‡/‡ Ãþ¨‡/‡ ÃýÁ‡.‡Ãþ¬‡.‡Ãý‡-‡Ãþ¯‡-‡Ãþ“‡,‡Ãþ³‡,‡Ãþ–‡+‡Ãþ¶‡+‡Ãþš‡*‡Ãý¹ˆ‡)‡Ãþž‡)‡Ãý¼‰‡(‡Ãþ¢‡(‡Ãý¾Š‡'‡Ãþ¥‡'‡ÃýÀŒ‡&‡Ãþ©‡&‡ÃýÂŽ‡%‡Ãþ¬‡%‡Ãþ‘‡$‡Ãþ°‡$‡Ãþ”‡#‡Ãþ´‡#‡Ãþ—‡"‡Ãþ·‡"‡Ãþ›‡!‡Ãýºˆ‡ ‡ÃþŸ‡ ‡Ãý½‰‡‡Ãþ¢‡‡Ãý¿Š‡‡Ãþ¦‡‡ÃýÁŒ‡‡Ãþª‡‡Ãý‡‡ Ãþ­‡‡!Ãþ‘‡‡!Ãþ±‡‡"Ãþ•‡‡"Ãþµ‡‡#Ãþ˜‡‡#Ãþ¸‡‡$Ãþœ‡‡þ¹Ã"Ãý»ˆ‡‡þšÃ#Ãþ ‡‡þ¶Ã"Ãý½‰‡‡þ–Ã#Ãþ£‡‡þ³Ã"Ãý¿‹‡‡þ“Ã#Ãþ§‡‡ØþÔÓ4ÓþרØþÖÓ4ÓþÔØØþÔÓ4ÓþÖØØþÖÓ4ÓþÔØØþÔÓ4ÓØþ×Ó4Ó ØþÔÓ3Ó Øþ×Ó3Ó ØþÕÓ2Ó Øþ×Ó2Ó ØþÕÓ1Ó Øþ×Ó1Ó ØþÕÓ0Ó Øþ×Ó0Ó ØþÖÓ/ÓØ0ÓØþÖÓ.ÓØþÔÓ-ÓØþÖÓ-ÓØþÔÓ,ÓØþÖÓ,ÓØþÔÓ+ÓØþ×Ó+ÓØþÔÓ*ÓØþ×Ó*ÓØþÕÓ)ÓØþ×Ó)ÓØþÕÓ(ÓØþ×Ó(ÓØþÕÓ'ÓØþ×Ó'ÓØþÖÓ&ÓØþÔÓ%ÓØþÖÓ%ÓØþÔÓ$ÓØþÖÓ$ÓØþÔÓ#ÓØþÖÓ#ÓØþÔÓ"ÓØþ×Ó"ÓØþÕÓ!ÓØþ×Ó!ÓØþÕÓ ÓØþ×Ó ÓØþÕÓÓØþ×ÓÓØþÕÓÓØÓØþÖÓÓ ØþÔÓÓ ØþÖÓÓ!ØþÔÓÓ!ØþÖÓÓ"ØþÔÓÓ"Øþ×ÓÓ#ØþÔÓÓ#Øþ×ÓÓ$ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÕÓÓý=D4Dþþ!D4Dþ7þ:D4DþþD4Dþ:þ7D4DþD4D þ4D3D þD3D þ1D2D ýCD1D þ-D1D ýBD0D þ*D0D ý@D/D þ'D/D ý>D.Dþ$D.DýD%Dþ#D%Dþ;D$Dþ D$Dþ9D#DþD#Dþ6D"DþD"Dþ2D!DýCD Dþ/D DýBDDþ,DDýADDþ)DDý?DDþ%DDý=DD þ"DD!þ;DD!þDD"þ8DD"þDD#þ5DD#þDD$þ2DDþ"ýCDDþ3#þ.DDþ"ýBDDþ6#þ+DDþ"ýADDþ:#þ(DDÿ"Ãý¾Š‡‡þ•Ã+Ãþ¤‡‡þ•Ã+ÃýÀ‹‡‡þ•Ã,Ãþ¨‡‡þ•ÃÃþ¯Ã"ÃýÁއ ‡þ•ÃÃýÂÃ"Ãþ¬‡ ‡þ•ÃÃý‡«Ã#Ãþ‡ ‡þ•ÃÃü‡ÁÃ"Ãþ¯‡ ‡þ•ÃÇþ§Ã#Ãþ“‡ ‡þ•ÃÇý‹ÀÃ"Ãþ³‡ ‡þ•ÃÇþ£Ã#Ãþ—‡ ‡þ•ÃÇý‰½Ã"Ãþ·‡ ‡þ•ÃÇþ Ã#Ãþš‡ ‡þ•ÃÇýˆ»Ã"Ãýºˆ‡‡þ•ÃÇþœÃ#Ãþž‡‡þ•ÃÇþ¸Ã"Ãý¼‰‡‡þ•ÃÇþ™Ã#Ãþ¢‡‡þ•ÃÇþµÃ"Ãý¾Š‡‡þ•ÃÇþ•Ã#Ãþ¥‡‡þ•ÃÇþ±Ã"ÃýÀŒ‡‡þ•ÃÇþ’Ã#Ãþ©‡‡þ•ÃÇþ®Ã"ÃýÂŽ‡‡þ•ÃÇýÂÃ"Ãþ­‡‡þ•Ãà ‡þªÃ#Ãþ‘‡‡þ•Ãà ‡ýŒÁÃ"Ãþ°‡‡þ•Ãà ‡þ¦Ã#Ãþ”‡‡þ•Ãà ‡ý‹¿Ã"Ãþ´‡‡þ•Ãà ‡þ£Ã#Ãþ—‡‡þ•Ãà ‡ý‰½Ã"Ãþ·‡‡þ•Ãà ‡þŸÃ#Ãû›‡‡•Ãà ‡ýˆºÃ"Ãûºˆ‡•Ãà ‡þ›Ã#ÃüŸ‡•ÃÇþ¸Ã"Ãü½‰•ÃÇþ˜Ã#Ãý¢•ÃÇþ´Ã"Ãý¿™ÃÇþ”Ã#Ãþ´ÃÇþ°Ã,Çþ‘Ã,Çþ­Ã+ÇýŽÂÃ*Çþ©Ã*ÇýŒÁÃ)Çþ¦Ã)ÇýŠ¿Ã(Çþ¢Ã(Çý‰½Ã'ÇþžÃ'ÇýˆºÃ&ÇþšÃ&Çþ·Ã%Çþ—Ã%Çþ³Ã$Çþ“Ã$Çþ°Ã#ÇþÃ#Çþ¬Ã"ÇýŽÁÃ!Çþ¨Ã!Çý‹Àà Çþ¥Ã ÇýоÃÇþ¡ÃÇýˆ¼ÃÇþÃÃ"Øþ×ÓÓþÔØ+ØþÕÓÓþÔØ+Øþ×ÓÓþÔØ,ØþÖÓÓþÔØØþÖØ#ØþÔÓ ÓþÔØØþÔØ#ØþÖÓ ÓþÔØØýÓÖØ#ØþÔÓ ÓþÔØØÓ$ØþÖÓ ÓþÔØØÓþÖØ#ØþÔÓ ÓþÔØØÓþר"ØþÖÓ ÓþÔØØÓþÕØ#ØþÔÓ ÓþÔØØÓþר"Øþ×Ó ÓþÔØØÓþÕØ#ØþÔÓ ÓþÔØØÓþר"Øþ×Ó ÓþÔØØÓþÕØ#ØþÕÓÓþÔØØÓþר"Øþ×ÓÓþÔØØÓþÔØ#ØþÕÓÓþÔØØÓþר"Øþ×ÓÓþÔØØÓþÔØ#ØþÕÓÓþÔØØÓþÖØ"Øþ×ÓÓþÔØØÓþÔØ#ØþÖÓÓþÔØØÓþÖØ#ØþÔÓÓþÔØØÓþÔØ#ØþÖÓÓþÔØØ ÓþÖØ#ØþÔÓÓþÔØØ Ó$ØþÖÓÓþÔØØ ÓþÕØ#ØþÔÓÓþÔØØ Óþר"ØþÖÓÓþÔØØ ÓþÕØ#ØþÔÓÓþÔØØ Óþר"Øþ×ÓÓþÔØØ ÓþÕØ#ØûÕÓÓÔØØ Óþר"Øû×ÓÓÔØØ ÓþÕØ#ØüÕÓÔØØÓþר"Øü×ÓÔØØÓþÔØ#ØýÕÔØØÓþר"Øý×ÔØØÓþÔØ#ØþרØÓþÖØ,ØÓþÔØ,ØÓþÖØ+ØÓþÔØ+ØÓþÖØ*ØÓþר)ØÓþÕØ)ØÓþר(ØÓþÕØ(ØÓþר'ØÓþÕØ'ØÓþר&ØÓþÕØ&ØÓþר%ØÓþÔØ%ØÓþÖØ$ØÓþÔØ$ØÓþÖØ#ØÓþÔØ#ØÓþÖØ"ØÓþÔØ"ØÓþÖØ!ØÓþר ØÓþÕØ ØÓþרØÓþÕØØÓþרØÓþÕØØ"ýBDDþ7+þ*DDþ7+ý@DDþ7,þ'DDþ7þ!"ý>D Dþ7ý<"þ$D Dþ7ýD$#þDDþ7Dý="þ#DDþ7 Dþ%#þ;DDþ7 Dý?"þ DDþ7 Dþ(#þ9DDþ7 DýA"þDDþ7 Dþ,#þ6DDþ7 DýB"þDDþ7 Dþ/#û2DD7 DýC"ûCD7 Dþ2#ü/D7Dþ"üB7Dþ5#ý,7Dþ"ý4Dþ8#þDþ,Dþ;,Dþ#+Dý>*Dþ&*Dý@)Dþ))DýA(Dþ,(DýC'Dþ0'DýC&Dþ3&Dþ%Dþ6%Dþ$Dþ9$Dþ #Dþ<#Dþ#"Dý>!Dþ'!Dý@ Dþ* DýADþ-DýCDþ0ÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ÿ‡þ¬ÃÃþ±‡ ‡ýJy‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý62‡ ‡þ¬ÃÃþ±‡ ‡ý±l‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡þôüÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ ÓÿÓþÖØØþÖÓ Óýc‹Ó ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýRLÓ ÓþÖØØþÖÓ ÓýÀÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓþüÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD DÿDþ#þD Dý»D Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD DýÇÍD Dþ#þD Dý¦¾D Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dþ”š¾ÿýó×ÿ½ÿýÁÞÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿþ«§+ÿüáŽN22.ÿüÎ~C2 21ÿüºn:2 24ÿü¥_5226ÿüè“R229ÿüÕ‚F22<ÿü¿r<ÿ¿ÿþ¸ÿ=ÿû2:g©ÿ:ÿ2ü;n¸ÿ7ÿ2üAyÇÿ4ÿ 2üI…×ÿ1ÿ 2üR’äÿ.ÿ2ü4\Ÿÿ,ÿ2ü7f­ÿ)ÿ2ü2"2+ÿüçžeLL.ÿüÖ[L L1ÿüÄSL L4ÿü²tNLL6ÿüì¢hLL9ÿüÜ“]LL<ÿüÉ…Uÿ¿ÿþÂÿ=ÿûLT{µÿ:ÿLüTÂÿ7ÿLüY‹Ðÿ4ÿ Lü`–Þÿ1ÿ Lüh¡éÿ.ÿLüNq­ÿ,ÿLüQ{¹ÿ)ÿLüU„Æÿ&ÿLü[ŽÔÿ#ÿLüc™âÿ ÿLýo²ÿÿLüVŒÙÿÿ"Lýl­ÿÿ$LüTˆÔÿÿ'Lýh¨ÿÿ)LüS„Ïÿÿ,Lýe¤ÿÿ.LüQ€Éÿ ÿ1Lüb ôÿ ÿ3LüP|Æÿÿ6Lýd¦ÿÿ8LüTŠÜÿÿ;LûqºÿÿLÿüµÕôÿ>ÿü¼Üúÿ>ÿüÄäýÿ=ÿü³Ìëÿ>ÿü³Óóÿ>ÿüºÚøÿ¿ÿþ½ÿ>ÿüùàÃÿ>ÿüùܽÿ>ÿüõ׸ÿ>ÿüñѲÿ>ÿüëÌ®ÿ=ÿüþæÆÿ>ÿüüàÁÿ>ÿüøÛ¼ÿ>ÿüôÖ¶ÿ>ÿüïбÿ>ÿýçÄÿ>ÿüø×´ÿ>ÿýéÆÿ>ÿüùÙ¶ÿ>ÿýëÈÿ>ÿüúÛ¸ÿ>ÿýíËÿ>ÿüûݺÿ>ÿüïÍÈÿ=ÿüüß¼ÿ>ÿýîÊÿ>ÿüùسÿ>ÿýæÁÿ>ÿýóÏÿÿþúÿ=ÿû©Ããýÿ:ÿ§û¬Èèþÿ7ÿ§ü°Îíÿ5ÿ§ü´Óòÿ2ÿ §ü¹Øöÿ/ÿ §û¨¾Ýùÿ,ÿ§üªÉìÿ*ÿ§ü¶Ùùÿ'ÿ§üªÆéÿ%ÿ§ü´×÷ÿ"ÿ2þe‡ ‡þºÃÃ2þO‡ ‡þªÃÃ2þ:‡ ‡þšÃÃ2þz‡ ‡ýŠÂÃÃ2þd‡ ‡þµÃÃ2þL‡ ‡þ¤ÃÃ2ý6…‡ ‡þ“ÃÃü«d622þr‡ ‡þ¾ÃÃÿûø˜V322þZ‡ ‡þ®ÃÃÿüÚ‡I22þB‡ ‡þÃÃÿüÅv>22þ‡ ‡þ‹Ãà ÿü°h722þg‡ ‡þµÃ à ÿüžY322þO‡ ‡þ¢Ã ÃÿüߌL2 2ý8†‡ ‡þà ÃÿüË{A2 2þt‡ ‡þºÃ Ãÿü¶l922þZ‡ ‡þ§Ã Ãÿü¥c722þ@‡ ‡þ•à Ãÿü¢a622þ|‡ ‡þ¿Ã Ãÿøýž^522b‡ ‡þ­Ã à ÿûõš[I‡ ‡þ™Ã Ã#ÿý䈇 ‡ýˆÀà Ã$ÿþ¦‡ ‡þ®Ã Ã$ÿþɇ ‡þšÃ Ã%ÿþ‰‡ ‡ý‰Áà Ã%ÿþ¢‡ ‡þ¯Ã Ã%ÿþƇ ‡þ›Ã Ã&ÿþ‰‡ ‡ý‰ÁÃÃ&ÿþ ‡ ‡þ¯ÃÃ&ÿþć ‡þ™ÃÃ'ÿþ‰‡ ‡ýˆ¿ÃÃ'ÿþŸ‡ ‡þ«ÃÃ'ÿþć ‡þ•ÃÃ(ÿþЇ ‡þ¼ÃÃ(ÿþ¥‡ ‡þ¦ÃÃ(ÿþ· ‡þÃÃ)ÿþ‡ ‡þ¶ÃÃ)ÿþ¬‡ ‡þŸÃÃ)ÿþ؇ ‡ýŠÁÃÃ*ÿþ’‡ ‡þ­ÃÃ*ÿþ´‡ ‡þ–ÃÃ*ÿþä‡ ‡þ»ÃÃ+ÿþ›‡ ‡þ¤ÃÃþñÿ)ÿþć ‡þÃÃü7mÇÿ(ÿþ‹‡ ‡þ²ÃÃ2ýS¡ÿ&ÿþ©‡ ‡þ™ÃÃ2ü>€Ýÿ#ÿþ؇ ‡þ¼ÃÃ2ü4c¹ÿ"ÿþ”‡ ‡þ£Ãà 2ýJ”ÿ ÿþº‡ ‡ûŒÂÃÃ2 2ü9uÐÿÿþ‰‡ ‡ü®ÃÃ2 2ü3Y«ÿÿþ¥‡ ‡ü”ÃÃ22üCˆåÿÿþÖ‡ ‡ý¸Ã22ü6kÃÿÿþ•‡ ‡ýžÃ22ýPžÿÿþÀ‡ ‡ý‰¾22ü=}Úÿÿþ‹‡ ‡þ¥22ü4aµÿÿþ¬‡ ‡þŒ22ýH‘ÿÿþà‡ ‡2ü8rÍÿÿþœ‡ ‡!2ýW§ÿ ÿþ͇ ‡#2üBƒÝÿ ÿþ’‡ ‡%2ü4_­ÿÿþ¾‡ ‡(2üB‚ÜÿÿþŒ‡ ‡*2ü4_­ÿÿþ±‡ ‡-2üA‚Üÿÿýõˆ‡‡/2ù4^¬ÿÿ¥‡‡LþœÓ ÓþרØLþ{Ó ÓþÖØØLþYÓ ÓþÔØØLþ¾Ó ÓØLþœÓ ÓþרØLþvÓ ÓþÕØØLýSÐÓ ÓþÔØØü·xPLLþ±Ó ÓþרØÿüú¦lLLþ‹Ó ÓþÖØØÿüá—`LLþeÓ ÓþÕØØÿüΉWLLýMÆÓ ÓØ ÿü¼|QLLþ¡Ó Óþר Ø ÿü«oMLLþ{Ó ÓþÕØ Øÿüæ›cL LýVÒÓ ÓþÔØ ØÿüÔYL LþµÓ Óþר ØÿüÁRLLþŒÓ ÓþÖØ Øÿü²xPLLþcÓ ÓþÔØ Øÿü¯uOLLþÁÓ Óþר Øÿøý¬sOLL˜Ó ÓþÖØ Ø ÿû÷¨ppÓ ÓþÔØ Ø#ÿýêÑÓ Óþר Ø$ÿþßÓ ÓþÖØ Ø$ÿþìÓ ÓþÔØ Ø%ÿþÔÓ Óþר Ø%ÿþÝÓ ÓþÖØ Ø%ÿþëÓ ÓþÕØ Ø&ÿþÔÓ Ó Ø&ÿþÝÓ ÓþÖØØ&ÿþêÓ ÓþÔØØ'ÿþÔÓ ÓþרØ'ÿþÜÓ ÓþÖØØ'ÿþêÓ ÓþÔØØ(ÿþÔÓ ÓþרØ(ÿþÞÓ ÓþÕØØ(ÿþîÓ ÓþÔØØ)ÿþÕÓ ÓþרØ)ÿþáÓ ÓþÕØØ)ÿþòÓ ÓØ*ÿþ×Ó ÓþÖØØ*ÿþäÓ ÓþÔØØ*ÿþöÓ ÓþרØ+ÿþÚÓ ÓþÕØØþôÿ)ÿþêÓ ÓØüPÐÿ(ÿþÔÓ ÓþÖØØLýi®ÿ&ÿþàÓ ÓþÔØØLüW‘äÿ#ÿþòÓ ÓþרØLüNxÃÿ"ÿþØÓ ÓþÕØØ Lýb£ÿ ÿþæÓ ÓØ LüS‡ØÿÿþÔÓ ÓüÖØØL Lýo·ÿÿþÞÓ ÓüÔØØLLü[™êÿÿþñÓ ÓýרLLüP~ÍÿÿþØÓ ÓýÕØLLýg«ÿÿþèÓ Óþ×LLüVáÿÿþÔÓ ÓþÕLLüMuÀÿÿþáÓ ÓLý_ ÿÿþõÓ ÓLüR…ÖÿÿþÛÓ Ó!Lým´ÿ ÿþíÓ Ó#LüZ”äÿ ÿþ×Ó Ó%LüMt¹ÿÿþèÓ Ó(LüZ“ãÿÿþÕÓ Ó*LüMt¹ÿÿþãÓ Ó-LüY“ãÿÿþûÓ Ó/LùMs¸ÿÿÞÓÓÍþ{D DþÍþžD Dþ%ÍþÀD Dþ3ÍþYD DýAÍþ|D DþÍþ£D Dþ*ÍýÆGD Dþ:ü¯ÀÌÍÍþfD Dþÿüà³ÄÍÍþD Dþ"ÿü£¸ÇÍÍþ³D Dþ1ÿü¨¼ÊÍÍýÌQD Dþ@ ÿü­¿ÌÍÍþwD Dþ  ÿý²ÃÍÍþžD Dþ, ÿü¡¶ÆÍ ÍýÃED Dþ< ÿü¦»ÉÍ ÍþbD Dþ ÿü¬¾ËÍÍþŒD Dþ' ÿü°ÁÌÍÍþ¶D Dþ7 ÿü±ÁÌÍÍþVD Dþ ÿøõ²ÂÌÍÍ€D Dþ#  ÿûճéD Dþ4 #ÿýžJD DýC $ÿþ[D Dþ" $ÿþuD Dþ3 %ÿþFD DýB %ÿþXD Dþ! %ÿþsD Dþ3 &ÿþFD DýB&ÿþWD Dþ!&ÿþqD Dþ4'ÿþED DýC'ÿþVD Dþ%'ÿþqD Dþ8(ÿþFD Dþ(ÿþZD Dþ)(ÿþxD Dþ<)ÿþID Dþ)ÿþ_D Dþ/)ÿþ€D DýA*ÿþLD Dþ#*ÿþeD Dþ7*ÿþˆD Dþ+ÿþRD Dþ+þÇÿ)ÿþqD Dþ?ü̾§ÿ(ÿþGD DþÍýűÿ&ÿþ]D Dþ4Íüʹ¢ÿ#ÿþ€D DþÍüÌÁ«ÿ"ÿþMD Dþ+ ÍýÇ´ÿ ÿþiD Dû@Í Íü˼¥ÿÿþED Dü"Í ÍýïÿÿþZD Dü8ÍÍüÉ· ÿÿþ~D DýÍÍüÌ¿¨ÿÿþND Dý0ÍÍýŲÿÿþnD DýCÍÍüʺ£ÿÿþGD Dþ*ÍÍýÁ¬ÿÿþ_D Dþ@ÍÍýǵÿÿþ†D DÍü˽¦ÿÿþSD D!Íýįÿ ÿþwD D#Íüɹ¢ÿ ÿþLD D&Íý®ÿÿþmD D(Íüɹ¢ÿÿþHD D+Íý®ÿÿþcD D-Íüɹ¢ÿÿýÌEDD0Íú®ÿÿZDDÀÿüÂâüÿ=ÿüÞÊéÿ>ÿü±Ññÿ>ÿü¸Ø÷ÿ>ÿüÀàüÿ>ÿüÇçþÿ=ÿü°Ïïÿ>ÿü¶Öõÿ>ÿü¾Þûÿ>ÿüÄâüÿ>ÿüÅãýÿ=ÿûôÇåýÿ=ÿûÓÈæþÿ=ÿý¯ûÿ=ÿþàÿ=ÿþÄÿ>ÿþüÿ=ÿþãÿ=ÿþÆÿ>ÿþýÿ=ÿþåÿ=ÿþÈÿ>ÿþýÿ=ÿþæÿ=ÿþÈÿ>ÿþüÿ=ÿþáÿ=ÿþÁÿ>ÿþøÿ=ÿþÚÿ=ÿþ»ÿ>ÿþóÿ=ÿþÔÿ=ÿþ´ÿ>ÿþêÿÿþÈÿ)ÿþÈÿÿüüݸÿ(ÿþûÿÿýëÆÿ&ÿþÝÿÿü÷Ô°ÿ#ÿþ»ÿÿüþâ½ÿ"ÿþñÿÿýðËÿ ÿþÏÿÿüúÙ´ÿÿþýÿÿýçÂÿÿþáÿÿüôЮÿÿþ¼ÿ!ÿüüÞ¹ÿÿþðÿ#ÿýìÇÿÿþËÿ%ÿüøÕ±ÿÿþûÿ&ÿüþã¾ÿÿþÚÿ)ÿýñÌÿÿþ¶ÿ+ÿüûÚµÿÿþéÿ-ÿýéÃÿ ÿþÂÿ/ÿüõÒ°ÿ ÿþóÿ0ÿüþäÁÿÿþÌÿ3ÿüõÓ±ÿÿþùÿ4ÿüþäÁÿÿþÖÿ7ÿüõÓ±ÿÿýÕþÿ8ÿùþåÂÿÿáÿÿÃþ³‡.‡ÃýЇ-‡Ãþ›‡-‡Ãþ­‡-‡Ãý¿ˆ‡,‡Ãþ•‡,‡Ãþ¨‡,‡Ãþº‡,‡Ãþ‡+‡Ãþ¤‡+‡Ãþ¸‡+‡Ãþ‡*‡Ãþ£‡*‡Ãþ·‡*‡Ãþއ)‡Ãþ¢‡)‡Ãþ·‡)‡Ãþ‡(‡Ãþ¥‡(‡Ãþ»‡(‡Ãþ”‡'‡Ãþª‡'‡Ãý¿ˆ‡&‡Ãþ™‡&‡Ãþ¯‡&‡ÃýÂŒ‡%‡Ãþ¢‡%‡Ãþ¹‡%‡Ãþ”‡$‡Ãþ«‡$‡ÃýÀ‰‡#‡Ãþž‡#‡Ãþ¸‡#‡Ãþ”‡"‡Ãþ­‡"‡ÃýÂŒ‡!‡Ãþ£‡!‡Ãþ¼‡!‡Ãþ™‡ ‡Ãþ´‡ ‡Ãþ’‡‡Ãþ­‡‡Ãý‡‡Ãþ¦‡‡Ãý¾‰‡‡ÃþŸ‡‡Ãý»ˆ‡‡ Ãþœ‡‡ Ãþ¸‡‡!Ãþ™‡‡!Ãþ¶‡‡"Ãþ–‡‡"Ãþ³‡‡#Ãþ”‡‡þÁÃ!Ãþ´‡‡þ¬Ã"Ãþ–‡‡þ‘Ã"Ãþµ‡‡þ³Ã"Ãþ˜‡‡þ˜Ã"Ãþ·‡‡þ¹Ã"Ãþ™‡‡þÃ"Ãþ¹‡‡ýˆ¼Ã"Ãþž‡‡þŸÃ"Ãý½‰‡‡ý‰½Ã"Ãþ¢‡‡ØþÖÓ.ÓØ/ÓØþÕÓ-ÓØþÖÓ-ÓØþ×Ó-ÓØþÔÓ,ÓØþÖÓ,ÓØþ×Ó,ÓØþÔÓ+ÓØþÕÓ+ÓØþ×Ó+ÓØþÔÓ*ÓØþÕÓ*ÓØþ×Ó*ÓØþÔÓ)ÓØþÕÓ)ÓØþ×Ó)ÓØþÔÓ(ÓØþÕÓ(ÓØþ×Ó(ÓØþÔÓ'ÓØþÖÓ'ÓØþ×Ó'ÓØþÔÓ&ÓØþÖÓ&ÓØ'ÓØþÕÓ%ÓØþ×Ó%ÓØþÔÓ$ÓØþÖÓ$ÓØþ×Ó$ÓØþÕÓ#ÓØþ×Ó#ÓØþÔÓ"ÓØþÖÓ"ÓØ#ÓØþÕÓ!ÓØþ×Ó!ÓØþÔÓ ÓØþ×Ó ÓØþÔÓÓØþÖÓÓØ ÓØþÕÓÓØþ×ÓÓØþÕÓÓØþ×ÓÓ ØþÕÓÓ Øþ×ÓÓ!ØþÔÓÓ!Øþ×ÓÓ"ØþÔÓÓ"ØþÖÓÓ#ØþÔÓÓ#ØþÖÓÓþÖØ"ØþÔÓÓþÔØ"Øþ×ÓÓþÖØ"ØþÔÓÓþÔØ"Øþ×ÓÓþר"ØþÔÓÓþÕØ"Øþ×ÓÓþר"ØþÕÓÓþÕØ"Øþ×ÓÓþר"ØþÕÓÓþD.DýAD-Dþ2D-Dþ"D-DýCD,Dþ7D,Dþ'D,DþD,DþD)Dþ,D)DþD)DþDDýC þ)DDþ" þDDþ5!þ5DDýC þDDþ% ý>DDþ8!þ)DDþ ýCDDþ*!þ1DDþ=!þDDþ!þ9DDþ0!þ!DDýB!þ=DDþ$!þ%DDþ9!ý@DDþ!þ*DDþ-!ýBDDýA!þ,DDþ$!ýCDDþ;"þ.DDþ!ýCDDþ3"þ.DDýC!ýBDDþ*"þ,DDý@!þDDþ%"Dþ="Dþ !Dþ8!Dþ Dþ6 DþDþ4DþDþ2DýCDþ2 Dþ Dþ4!Dþ!Dþ5"Dþ"Dþ:#Dþ"#Dý>$Dþ'$DýA%Dþ-%DýC&Dþ6'Dþ 'Dý>(Dþ)(DýB)Dþ5*Dþ!ÿýyF2<2þm2=2ý…92<2ý‡X2<2ý‡z2<2‡þF2;2‡þh2;2‡ý„82:2‡þX2:2‡ý|3292‡þK282þ9‡‡þo262ü9|臇þ?232ú=…õÿÿ‡‡þd212ýAÿÿ‡ý„82.2ýD–ÿÿ‡þ[2,2ýJŸÿÿ‡ý42)2ýPªÿ ÿ‡þS2'2ýV´ÿ ÿ‡ýz32$2ý]¾ÿ ÿ‡þO2!2ü7lÉÿÿ‡þx22üIõÿÿ‡þL22ü5fºÿÿ‡þv22üD‰äÿÿ ‡þM22ü4a²ÿÿ ‡ýx322üAƒÞÿÿ ‡þP22ü3]«ÿÿ ‡ýz32 2û3Sßÿ ÿ ‡þS22û3QÜÿ#ÿ ‡ý622üPŒÚÿ&ÿ ‡þ\22üN‰Øÿ)ÿ ‡úƒ9M‡Õÿ,ÿ ‡þ¡ÿ/ÿþЇ ‡ýˆàÿ.ÿþ¤‡ ‡þžÿ.ÿýÀŒ‡ ‡þÌÿ-ÿýê‡ ‡þ‘ÿ-ÿüÇ ‡þ¶ÿ,ÿÃþ°‡ ‡ý‰åÿ+ÿÃþ•‡ ‡þÿ+ÿÃþ¸‡ ‡þÅÿ*ÿÃþŸ‡ ‡þÿ*ÿÃý¿‹‡ ‡þ§ÿ)ÿÃþª‡ ‡þÏÿ(ÿÃþ’‡ ‡þÿ(ÿÃþ¶‡ ‡þ©ÿ'ÿÃþŸ‡ ‡þÏÿ&ÿÃý¿Œ‡ ‡þŽÿ&ÿÃþ­‡ ‡þ ÿ%ÿÃþ˜‡ ‡þ¾ÿ$ÿÃý½‹‡ ‡ý‰ßÿ#ÿ Ãþ¬‡ ‡þ”ÿ#ÿ Ãþ˜‡ ‡þ¨ÿ"ÿ Ãý½‹‡ ‡þÅÿ!ÿ Ãþ­‡ ‡ýŠáÿ ÿ Ãþ›‡ ‡þ“ÿ ÿ Ãý¿‡ ‡þ¢ÿÿ Ãþ´‡‡þ·ÿÿÃþ£‡ ‡ýˆÎÿÿÃý•‡ ‡ý‹ßÿÿÃý½‹‡ ‡þÿÿÃþ²‡‡þ™ÿÿÃþ£‡‡þ£ÿÿÃþ—‡‡þ­ÿÿÃý¿Ž‡‡þ¸ÿÿý ^LD DþXÿÿ þDDþgÿÿþ+DDþxÿÿý8D DýG…ÿÿý@D DþKÿÿþDDþQÿÿþ+DDþYÿÿþ6DDþ`ÿÿý>DDþhÿÿýçòÿ¼ÿþúÿ;ÿüúÖ³ÿ9ÿüøÒÓÿ9ÿýöÎÿ:ÿýóÊÿ:ÿýðÆÿ:ÿýíÂÿ:ÿýé¾ÿ:ÿýå»ÿ9ÿüüÞ·ÿ9ÿüñÍÓÿ8ÿüýà¼ÿ9ÿüóЮÿ8ÿüþã¿ÿ9ÿüõÒ°ÿ8ÿüþåÂÿ9ÿüëͰÿ8ÿüìαÿ8ÿüìϱÿ8ÿüíвÿ8ÿüîѳÿ:ÿþàÿ=ÿýþ¶ÿ=ÿþèÿ>ÿþÃÿ=ÿþôÿ>ÿþÒÿ=ÿýü³ÿ=ÿþèÿ>ÿþÇÿ=ÿþøÿ>ÿþßÿ>ÿþÁÿ=ÿþöÿ>ÿþÝÿ>ÿþÁÿ=ÿþ÷ÿ>ÿþåÿ>ÿþÌÿ=ÿýü·ÿ=ÿþñÿ>ÿþÞÿ>ÿþÇÿ=ÿýûµÿ=ÿþòÿ>ÿþäÿ>ÿþÒÿ=ÿýþÁÿ=ÿýû·ÿ=ÿþõÿ>ÿþìÿ>ÿþâÿ>ÿþÚÿ>ÿþÑÿÿ2ýcÙÿ*ÿ2ýK·ÿ,ÿ 2ý<’ÿ.ÿ 2ü8ýÿ/ÿ 2ü4qàÿ1ÿ2ü3dÓÿ3ÿ2ýYÄÿ5ÿ2ýN´ÿ7ÿ2ýF£ÿ9ÿü2?”ÿ;ÿþ…ÿ|ÿýºJÿ:ÿûàh22ÿ9ÿýŽ9228ÿýºK226ÿýài225ÿý9223ÿý»K221ÿýái2 20ÿý:2 2.ÿýµK2 2,ÿýÈ[22*ÿüÚj322(ÿüñy622'ÿý‹;22%ÿýB22#ÿý±L22!ÿýÅX22ÿü×f322ÿü×o522ÿüÒk422ÿüÍg42!2ÿüÈc32#2ÿüÃ_32%2ÿý½[2(2ÿý¸X2*2ÿý²T2,2 ÿýN2.2 ÿüÞ>202ÿü½e4222ÿýœN252ÿüÝ=272ÿü¼e4292ýœN2<2Lýxàÿ*ÿLýbÂÿ,ÿ LýU¡ÿ.ÿ LüQýÿ/ÿ LüN„æÿ1ÿLýyÛÿ3ÿLýnÎÿ5ÿLýe¿ÿ7ÿLý]°ÿ9ÿüLW£ÿ;ÿþ•ÿ|ÿýÄbÿ:ÿûæ|LLÿ9ÿýžSLL8ÿýÅbLL6ÿýæ|LL5ÿýžSLL3ÿýÆcLL1ÿýç}L L0ÿýŸSL L.ÿýÀcL L,ÿýÑpLL*ÿüá~MLL(ÿüô‹OLL'ÿý›TLL%ÿý«ZLL#ÿý½cLL!ÿýÎnLLÿýÞ{LLÿüÞ‚OLLÿüÚNLLÿüÖ{ML!LÿýÑxL$LÿýÍtL&LÿýÇqL(LÿýÂmL*Lÿý½jL,L ÿý«eL.L ÿüåVL0LÿüÇyNL2LÿýªeL5LÿüäVL7LÿüÇyNL9LýªeL22&ÿý‚322$ÿýáX22#ÿý·?22"ÿý„422 ÿýäY22ÿýº@22ÿý422ÿýÕQ22ÿý™82 2ÿýèb2"2ÿý³@2#2ÿýv32$2ÿýÊK2&2ÿý62'2ÿýÞY2)2ÿý§<2*2ÿþm2,2ÿý¸D2-2 ÿýq32.2 ÿý¯B202 ÿýíi222ÿý¦>232ÿýác252ÿý<252þ7ÿÿýÛ\262ýIÌÿÿý”9262ùiïüÿÕV262ý7˜üüýŒ7262ýGÉüü82ýfíüü62ý6”üü52ýEÆüü42ýcìüü22ý5ü ü12ýIÆü ü02ýsñü ü.2ý>®ü ü-2ý_äüü+2ý7–üü*2ýOÑüü(2ü4÷üü'2ýC»üü&2ýiìüü$2ý;¤üü#2ýXÜüü!2ü6‹ûüü 2ýQÌüü2ü7Œúüü2ýVÕüü2ü9•ûüü2ý]Üü!ü2ý<žü#ü2ýdãü$ü2ý?¨ü&ü2ýkèü'ü2ýC²ü)ü2ü3tîü*ü2ýM¾ü,ü 2ü;“úü-ü 2ü3måü/ü 2ýNÀü1ü2ü<”úü2ü*ÿþLL(ÿýælLL'ÿý¿VLL&ÿý“MLL$ÿýçmLL#ÿýÂWLL"ÿý•MLL ÿýéoLLÿýÄXLLÿý’MLLÿýÜgLLÿý¨RL LÿýìvL"Lÿý¾XL#Lÿþ‰L%LÿýÓbL&LÿýOL'LÿýåoL)Lÿý´UL*Lÿþ€L,LÿýÂ\L-L ÿþ„L/L ÿý»ZL0L ÿýñ}L2Lÿý³WL3LÿýçwL5Lÿý«TL5LþQÿÿýâqL6Lý`Õÿÿý£RL6Lù|óÿÿÜlL6LýP¦ÿÿý›PL6Lý^Òÿÿ8Lýzñÿÿ6LýO£ÿÿ5Lý]Ïÿÿ4Lýxðÿÿ2LýO ÿ ÿ1Lý`Ïÿ ÿ0Lý†öÿ ÿ.LýWºÿ ÿ-Lýtéÿÿ+LýQ¥ÿÿ*LýfÙÿÿ(LüMûÿÿ'Lý[Æÿÿ&Lý}ðÿÿ$LýT±ÿÿ#Lýmãÿÿ!LüO›þÿÿ LýgÕÿÿLüQœýÿÿLýlÜÿÿLüS¤þÿÿLýrãÿ!ÿLýU¬ÿ#ÿLýxèÿ$ÿLýXµÿ&ÿLýíÿ'ÿLý[½ÿ)ÿLý†òÿ*ÿLýdÈÿ,ÿ LüT¢ýÿ-ÿ Lýêÿ/ÿ LýeÊÿ1ÿLüT£ýÿ2ÿ*ÿþºÍÍ(ÿý¡ÄÍÍ'ÿý¬ÊÍÍ&ÿþ¹ÍÍ$ÿý¡ÄÍÍ#ÿý«ÊÍÍ"ÿþ¸ÍÍ ÿý ÃÍÍÿý«ÉÍÍÿþ¹ÍÍÿý¤ÅÍÍÿý³ËÍ Íÿý©ÁÍ"Íÿý¬ÉÍ#Íÿþ¼Í%Íÿý§ÇÍ&Íÿý¶ÌÍ'Íÿý¢ÃÍ)Íÿý¯ÊÍ*Íÿþ¾Í,Íÿý«ÈÍ-Í ÿþ½Í/Í ÿý­ÉÍ0Í ÿý¸¿Í2Íÿý°ÊÍ3Íÿý¡ÁÍ5Íÿý²ËÍ5ÍþÌÿÿý¢ÂÍ6ÍýǦÿÿý´ËÍ6Íù¿šÿ¤ÄÍ6Íý̳ššý¶ÌÍ6Íýȧšš8ÍýÀžšš6ÍýÌ´šš5ÍýȨšš4ÍýÁžšš2Íý̵š š1ÍýǨš š0Íý½š š.ÍýÊ®š š-Íý šš+ÍýÌ´šš*ÍýÆ¥šš)Íýº›šš'Íýɪšš&Íý¿žšš$Íý˰šš#ÍýÄ¢šš!ÍýÌ·šš ÍýŦššÍü̶›ššÍýĤššÍýË´š šÍý¢š!šÍýʲš#šÍýÀ š$šÍýʯš&šÍý¿Ÿš'šÍýÉ­š)šÍý¼žš*šÍýƪš,š Íü˵›š-š Íý¾ š/š ÍýÆ©š1šÍüË´›š2š*ÿþÕÿ;ÿý°éÿ;ÿý¾÷ÿ;ÿýÓþÿ:ÿý¯èÿ;ÿý½÷ÿ;ÿýÒþÿ:ÿý®çÿ;ÿý¼öÿ;ÿýÔþÿ:ÿý³ìÿ;ÿýÉûÿ:ÿý³ãÿ;ÿý¿öÿ;ÿþØÿ;ÿý·ïÿ;ÿýÎýÿ:ÿý°çÿ;ÿýÃøÿ;ÿþÝÿ;ÿý½óÿ;ÿþÛÿ;ÿýÀõÿ:ÿý½ßÿ;ÿýÄ÷ÿ:ÿý¯âÿ;ÿýÇùÿ5ÿþüÿÿý±æÿ6ÿýñ¶ÿÿýËûÿ6ÿùß«§ÿ³éÿ6ÿýüʧ§ýÏüÿ6ÿýò·§§8ÿýá«§§6ÿýý˧§5ÿý󸧧4ÿý⬧§2ÿýýͧ §1ÿýñ¸§ §0ÿýÚª§ §.ÿý÷Á§ §-ÿýä®§§+ÿýüʧ§*ÿýí´§§(ÿüþÕ¨§§'ÿýô¼§§&ÿý߬§§$ÿýùŧ§#ÿýè±§§!ÿýýϧ§ ÿýì¶§§ÿüüΨ§§ÿýé³§§ÿýú˧ §ÿýå±§!§ÿýøÇ§#§ÿý⯧$§ÿýöç&§ÿýÞ­§'§ÿýô¿§)§ÿýÚ«§*§ÿýî»§,§ ÿüų̀§-§ ÿýÝ®§/§ ÿýíº§1§ÿüù˨§2§2ý6žüü2ý=¼üü2ýIÖüü2ýYêü ü2ýq÷ü!ü2ý3ü#ü2ý9­ü$ü2ýBÉü%ü2ýPàü&ü2ýdñü'ü2ýûü(ü2ý8¥ü*ü2ýEËü+ü2ý[èü,ü2ý|úü-ü 2ý8¥ü/ü 2ýEÊü0ü 2ý[èü1ü 2ý|úü2ü2ý8¤ü4ü2ýDÊü5ü2ýZèü6ü2ý{úü7ü2ý8¤ü9ü2ýJÏü:üü2lñü;üþœü ~üLýO¬ÿÿLýUÇÿÿLý`ÝÿÿLýoïÿ ÿLý„ûÿ!ÿLýMžÿ#ÿLýR¹ÿ$ÿLýZÒÿ%ÿLýgæÿ&ÿLýyöÿ'ÿLýþÿ(ÿLýR²ÿ*ÿLý]Ôÿ+ÿLýqíÿ,ÿLýŽýÿ-ÿ LýQ²ÿ/ÿ Lý]Óÿ0ÿ Lýpíÿ1ÿ Lýýÿ2ÿLýQ±ÿ4ÿLý\Óÿ5ÿLýpíÿ6ÿLýýÿ7ÿLýR±ÿ9ÿLýb×ÿ:ÿüLöÿ;ÿþªÿ ~ÿÍý̲ššÍýʪššÍýǤššÍýÞš šÍý½›š!šÍþ¶š#šÍýË®š$šÍýɧš%šÍýÅ¡š&šÍýÀš'šÍþ¹š)šÍý˰š*šÍýȦš+šÍýßš,šÍýº›š-š Íý̰š/š Íýȧš0š Íýßš1š Íýº›š2šÍý̰š4šÍýȧš5šÍýßš6šÍý»›š7šÍý˰š9šÍýÇ¥š:šü;š;šþ²š ~šÿýýǧ§ÿýø»§§ÿýñ³§§ÿý笧 §ÿýÛ¨§!§ÿýþͧ#§ÿýûÁ§$§ÿýõ·§%§ÿý쯧&§ÿýᪧ'§ÿþÔ§)§ÿýûħ*§ÿýó¶§+§ÿýæ­§,§ÿýÖ¨§-§ ÿýûħ/§ ÿýó·§0§ ÿýæ­§1§ ÿýÖ¨§2§ÿýûŧ4§ÿýó·§5§ÿýç­§6§ÿýÖ¨§7§ÿýûŧ9§ÿýðµ§:§üÿÞª§;§þȧ ~§üÿš§ >üý÷¿ü;üü㔇ü:üûÊ‹‡‡ü8üýû±‡‡8üý÷£‡‡7üýó‡‡6üýí—‡‡5üýæ’‡‡4üý߇‡3üýÔŒ‡‡2üýʼn‡ ‡1üþ·‡ ‡/üýù©‡ ‡.üýòž‡ ‡-üý畇‡,üý؇‡+üýƉ‡‡)üýû³‡‡þ•ü'üý󢇇ý™Áü&üý㔇‡ü ÃÃü%üýÏŒ‡‡þ§ÃÃ%üý¸ˆ‡‡ý‰¯ÃÃ#üýô£‡‡ý‹µÃÃ"üýà”‡‡ýºÃà >ÿýýèÿ;ÿüõØÓÿ:ÿûìÔÓÓÿ8ÿýþãÓÓ8ÿýýÞÓÓ7ÿýüÛÓÓ6ÿýùÙÓÓ5ÿý÷×ÓÓ4ÿýôÖÓÓ3ÿýðÕÓÓ2ÿýêÔÓ Ó1ÿþåÓ Ó/ÿýþàÓ Ó.ÿýûÜÓ Ó-ÿý÷ØÓÓ,ÿýñÕÓÓ+ÿýëÔÓÓ*ÿþäÓÓþÔÿ'ÿýüÝÓÓýÔØÿ&ÿýöØÓÓüÕØØÿ%ÿýîÕÓÓþÖØØ%ÿþåÓÓþÖØØ#ÿýüÞÓÓþרØ"ÿýôØÓÓýÔרØ >šý–mš;šü‡NDš:šûvGDDš8šý™cDD8šý–YDD7šý“TDD6šýPDD5šýŠLDD4šý„JDD3šý|GDD2šýrED D1šþgD D/šý˜]D D.šý“UD D-šý‹NDD,šýIDD+šýrFDD)šý™dDDþ7š'šý“XDDý4š&šýˆNDDü.š%šýyGDDþ'%šþhDDýC!#šý”YDDý@"šý…MDDý= >§ý©Ì§;§ü´ñÿ§:§ûÄûÿÿ§8§ý¨×ÿÿ8§ý©âÿÿ7§ý«èÿÿ6§ý¯îÿÿ5§ý²óÿÿ4§ý·öÿÿ3§ý½úÿÿ2§ýÇýÿ ÿ1§þÒÿ ÿ/§ý¨Ýÿ ÿ.§ý¬çÿ ÿ-§ý²ðÿÿ,§ý»øÿÿ+§ýÇýÿÿ*§þÕÿÿ(§ý«äÿÿ'§ý´ñÿÿ&§ýÁúÿÿ%§ýÑþÿÿ#§ý«âÿÿ"§ý¶ñÿÿÍüþûü8üðôØÀ«™Š‰—Ÿ§°ºÄèü+üûúÆ£’‡ ‡üÅôü&üüùÃ’‡‡ûЧÓûü!üüøÁ‘‡‡ü¹úüüþ‡‡ýšèüü‡ýŒÈüü ‡ý©ôüü!‡ý“Üüü"‡ý‰Óüü#‡ýçüü$‡ý–õüü%‡þ¥üü&‡þºüü ‡÷ˆ’Ÿ¬°¥šŽ‡‡ýˆÒüü‡û”©µÁÃÃû¿´¦Š‡‡ýíüü‡ýŠ«Ã Ãý¼˜‡‡þ·üü‡ý™½ÃÃý¬‹‡ ‡ýùüü‡ýНÃÃý½™‡ ‡þÉüü‡ýŒ¸ÃÃþœ‡ ‡þšüüü‡»ÃÃý¿‡ ‡þÝüüý’½ÃÃþ±‡ ‡þ©üüþÀÃÃþ‡ ‡ý‰ïüüÃýÀ‡ ‡þÎüüÃþ¯‡ ‡þ½üüÃþ¾‡ ‡þ­üüÃþއ ‡þ üüÃþš‡ ‡þ“üüÃþ¦‡ ‡ý‰ûüü ÿðüñèàÚÔÔÖÙÜßâæêøÿ+ÿûþëÞ×Ó ÓüÛêüÿ&ÿüþê×ÓÓüÔßðÿ"ÿüýé×ÓÓü׿þÿÿþÖÓÓýÚ÷ÿÿÓýÕìÿÿ Óýàüÿÿ!ÓýØóÿÿ"ÓýÔïÿÿ#ÓýÕ÷ÿÿ$ÓýÙüÿÿ%ÓþÞÿÿ&Óþæÿÿ ÓøÔÕÖÖÕÔÔÓÓþïÿÿÓüÔÖרØü×ÖÕÓÓýÕùÿÿÓþÖØ Øý×ÔÓÓþåÿÿÓýÔרØþÖÓÓýÖþÿÿÓþÖØØý×ÔÓ ÓþìÿÿÓþרØþÕÓ ÓþÚÿÿüÓÔרØþ×Ó ÓþóÿÿýÔרØþÖÓ ÓþàÿÿþרØþÕÓ ÓýÔúÿÿØþ×Ó ÓþîÿÿØþÖÓ ÓþçÿÿØþ×Ó ÓþáÿÿØþÔÓ ÓþÜÿÿØþÔÓ ÓþØÿÿØþÕÓ ÓýÔþÿÿÍšþ™š8šð”n^QFEJPV\biq‹š+šû˜rYLD DüTq”š&šü˜pLDDûF\|™š!šü—oLDDüKh˜ššþKDDýR‹ššDýGtšš Dý]”šš!DýMƒšš"DýE|šš#DýH‹šš$DýO•šš%DþZšš&Dþišš D÷C:/$ )3>DDýE{ššDû8&û)ADDýHššDýA% ý5DDþgššDý4ý#AD DýJ˜ššDýA ý4D DþtššDý?þ1D DþRššüD=ý?D Dþƒššý:þD Dþ]ššþþ0D DýF‘ššý>D Dþxššþ!D DþlššþD Dþ`ššþ>D DþVššþ3D DþMššþ(D DýE™šš §ð«»ËÜìüýõîæß×Ðȱ§+§û¨Çâóÿ ÿüèÇ«§&§ü¨Èóÿÿüûß¾§"§ü©ÊôÿÿüõШ§§þõÿÿýë²§§ÿýúŧ§ ÿýÞ«§§!ÿýò¸§§"ÿýý¾§§#ÿýø²§§$ÿý盛§%ÿþá§§&ÿþϧ§&ÿýþ¿§§'ÿýù¯§§(ÿþÒ§§(ÿýö¨§§)ÿþŧ§)ÿþë§§*ÿþ¸§§*ÿþÞ§§*ÿýü®§§+ÿþÁ§§+ÿþͧ§+ÿþÙ§§+ÿþå§§+ÿþò§§+ÿýý¨§§7üþA227üþe227üþ•227üþÙ228üþJ228üþ|228üþº228üýø;229üþf229üþž229üýå322:üþR22:üþ…22:üþÇ22;üþA22;üþo22;üþª22;üûï622ü;üü\22ü;üüœ22ü;üüì62ü<üýa2ü<üý¥2ü<üýñ8ü=üþhü=üþ­ü=üþöü ?ü7ÿþYLL7ÿþyLL7ÿþ¤LL7ÿþàLL8ÿþbLL8ÿþLL8ÿþÅLL8ÿýüTLL9ÿþzLL9ÿþ¬LL9ÿýêMLL:ÿþhLL:ÿþ–LL:ÿþÐLL;ÿþYLL;ÿþ‚LL;ÿþ¶LL;ÿûóOLLÿ;ÿüqLLÿ;ÿüªLLÿ;ÿüðOLÿ<ÿývLÿ<ÿý²Lÿ<ÿýöRÿ=ÿþ|ÿ=ÿþ¹ÿ=ÿþúÿ ?ÿ7šþÉÍÍ7šþÀÍÍ7šþ´ÍÍ7šþ£ÍÍ8šþÇÍÍ8šþºÍÍ8šþ«ÍÍ8šý›ËÍÍ9šþÀÍÍ9šþ²ÍÍ9šþ ÍÍ:šþÅÍÍ:šþ¸ÍÍ:šþ§ÍÍ;šþÉÍÍ;šþ¾ÍÍ;šþ¯ÍÍ;šûÌÍÍš;šüÂÍÍš;šü²ÍÍš;šüžÌÍš<šýÁÍš<šý°Íš<šýËš=šþ¿š=šþ®š=šþœš ?š7§þöÿÿ7§þáÿÿ7§þËÿÿ7§þ²ÿÿ8§þðÿÿ8§þÖÿÿ8§þ¼ÿÿ8§ý¨ùÿÿ9§þáÿÿ9§þÇÿÿ9§ý®þÿÿ:§þëÿÿ:§þÑÿÿ:§þ¸ÿÿ;§þöÿÿ;§þÜÿÿ;§þÂÿÿ;§û«ýÿÿ§;§üæÿÿ§;§üÈÿÿ§;§ü¬ýÿ§<§ýãÿ§<§ýÄÿ§<§ýªû§=§þà§=§þÁ§=§þ©§ ?§2þ\ÿÿþ62(2þ6ÿÿþ[2)2þ®ÿÿþ”2)2þrÿÿýã42(2þCÿÿþZ2)2þÎÿÿþ›2)2þŒÿÿýø62(2þWÿÿþa2(2ý4áÿÿþ¤2)2þ‘ÿÿþ82(2þSÿÿþh2(2ý3Úÿÿþ­2)2þŠÿÿþ<2(2þNÿÿþo2)2þÒÿÿþ·2)2þ„ÿÿþA2(2þIÿÿþ‚2)2þÉÿÿýÜ42(2þ}ÿÿþ_2(2þDÿÿþ­2)2þÁÿÿþB2(2þvÿÿþ…2(2þ>ÿÿýÞ42(2þ¤ÿÿþa2(2þXÿÿþ±2(2ý3ÒÿÿþD22þ<2 2þyÿÿþˆ22þo2 2þ=ÿÿýá522þ·2!2þ ÿÿþh22ýú@2 2þUÿÿþÇ22ýüv2!2þÎÿÿþZ22ýüÁ2!2þvÿÿþµ22üþD2 2þ;ÿÿþN22üþ2!2þÿÿþ£22üþÑ2!2þSÿÿþD22üþV2!2þÈÿÿþ’22üþ£2!2þiÿÿü=22üüýõ=2 2ý4Ûÿÿü‚22üüþ{2!2þxÿÿüè72üüýÕ32 2ý9õÿÿýt2üüþY2!2þˆÿÿýÜ6üüþ¥2!2þ?ÿÿþvüüýö?2!2þ™ÿÿþãüüþ~2!2þIÿÿüýØ32!2þ¬ÿÿüþ[2!2þTÿÿüþ©2"2þÀÿÿüýø@2!2þcÿÿüþ2!2ý3Óÿÿüýá62!2þkÿÿüþo2!2ý4ÎÿÿüýÑ32!2þcÿÿ üþa2!2ý3Æÿÿ üþ¿2"2þ]ÿÿ üþT2"2þ½ÿ ÿ üþ­2"2þWÿ ÿ üýûI2"2þµÿ ÿ üþš2"2þQÿ ÿ üýõ@2"2þ¬ÿ ÿ üþŠ2"2þKÿ ÿ üýì92"2þ£ÿ ÿ üþ{2"2þGÿ ÿ üýÞ52"2þ—ÿ ÿüþm2"2ý=øÿÿLþqÿÿþOL(LþPÿÿþpL)Lþºÿÿþ£L)Lþ…ÿÿýèML(Lþ[ÿÿþpL)LþÖÿÿþ©L)Lþ›ÿÿýúOL(LþmÿÿþuL(LýMçÿÿþ±L)Lþ ÿÿþRL(Lþiÿÿþ|L)Lþáÿÿþ¹L)LþšÿÿþTL(Lþeÿÿþ‚L)LþÚÿÿþÂL)Lþ•ÿÿþYL(Lþ`ÿÿþ“L)LþÒÿÿýãML(LþÿÿþtL(Lþ\ÿÿþ¹L)LþËÿÿþZL(Lþ‰ÿÿþ•L(LþVÿÿýåNL(Lþ±ÿÿþvL(Lþmÿÿþ½L)LþÚÿÿþ\LLþTL Lþ‹ÿÿþ˜LLþ‚L LþUÿÿýçNLLþÂL!Lþ®ÿÿþ|LLýýXL LþkÿÿþÐLLýÿ‰L!LþÖÿÿþpLLýÿËL!Lþ‰ÿÿþÀLLÿþ\L LþTÿÿþeLLÿþL!Lþ«ÿÿþ°LLÿþÙL!Lþiÿÿþ\LLÿþlL!LþÑÿÿþ¡LLÿþ°L!Lþ|ÿÿüULLÿÿýùVL LýNâÿÿü“LLÿÿþL!LþŠÿÿüìQLÿÿþÜL!LýR÷ÿÿý†LÿÿþnL!Lþ˜ÿÿýãOÿÿþ²L!LþXÿÿþ‰ÿÿýúWL!Lþ¨ÿÿþèÿÿþL!Lþ`ÿÿýßML!Lþ¸ÿÿþqL!LþkÿÿþµL"LþÊÿÿýüXL!Lþwÿÿþ’L!LýMÛÿÿýçOL!Lþ~ÿÿþ‚L!LýMÖÿÿýÙML!LþxÿÿþvL"LþÏÿÿþÉL"LþrÿÿþkL"LþÇÿÿþ¹L"Lþmÿÿýþ`L"LþÀÿÿþ¨L"LþgÿÿýùXL"Lþ¸ÿÿþšL"LþcÿÿýðSL"Lþ°ÿÿþL"Lþ_ÿÿýåOL"Lþ¥ÿÿþ€L"LýVúÿÿÍþÂÿÿþÌÍ(ÍþÌÿÿþÃÍ)Íþ®ÿÿþ´Í)Íþ½ÿÿþ Í)ÍþÉÿÿþÃÍ)Íþ¦ÿÿþ²Í)Íþ¶ÿÿýàÌÍ(ÍþÄÿÿþÁÍ)Íþ¡ÿÿþ°Í)ÍþµÿÿþËÍ(ÍþÅÿÿþ¿Í)Íþ£ÿÿþ®Í)Íþ·ÿÿþËÍ(ÍþÆÿÿþ¾Í)Íþ¤ÿÿþ«Í)Íþ¸ÿÿþÉÍ(ÍþÇÿÿþ¹Í)Íþ§ÿÿþ¢Í)ÍþºÿÿþÂÍ(ÍþÈÿÿþ®Í)Íþ©ÿÿþÉÍ(Íþ¼ÿÿþ¸Í(ÍþÊÿÿý¢ÌÍ(Íþ°ÿÿþÁÍ(ÍþÄÿÿþ­Í)Íþ¤ÿÿþÈÍÍþËÍ Íþ»ÿÿþ·ÍÍþ¾Í ÍþÊÿÿý¡ÌÍÍþ«Í!Íþ±ÿÿþ¿ÍÍý›ÉÍ ÍþÄÿÿþ§ÍÍýš¼Í!Íþ¦ÿÿþÃÍÍýš©Í!Íþ¼ÿÿþ¬ÍÍšþÈÍ ÍþËÿÿþÆÍÍšþºÍ!Íþ²ÿÿþ±ÍÍšþ¥Í!ÍþÅÿÿþÈÍÍšþÄÍ!Íþ§ÿÿþµÍÍšþ±Í!Íþ¿ÿÿüÊÍÍššýœÊÍ ÍýÌ¢ÿÿü¹ÍÍššþ»Í!Íþ»ÿÿü©ÌÍššþ¤Í!ÍýËÕÿÿý¼ÍššþÃÍ!Íþ·ÿÿý¢Ìššþ°Í!ÍþÊÿÿþ¼ššýœÊÍ!Íþ³ÿÿþ ššþºÍ!ÍþÇÿÿšþ£Í"Íþ®ÿÿšþÃÍ!ÍþÄÿÿšþ¯Í"Íþ©ÿÿšý›ÉÍ!ÍþÁÿÿšþ¹Í"Íþ¤ÿÿšý¡ÌÍ!Íþ¿ÿÿšþ¾Í"Íþ¦ÿÿšþ¥Í"ÍþÁÿÿ šþÁÍ"Íþ¨ÿÿ šþ©Í"ÍþÂÿÿ šþÄÍ"Íþªÿ ÿ šþ®Í"ÍþÄÿ ÿ šþÇÍ"Íþ¬ÿ ÿ šþ³Í"ÍþÅÿ ÿ šýœÉÍ"Íþ®ÿ ÿ šþ·Í"ÍþÇÿ ÿ šýžËÍ"Íþ±ÿ ÿ šþ»Í"ÍþÈÿ ÿ šý¢ÌÍ"Íþ´ÿ ÿšþ¾Í"ÍýÊàÿÿÿþæÿÿþýÿ(ÿþüÿÿþæÿ)ÿþÁÿÿþËÿ)ÿþÚÿÿý¯þÿ(ÿþôÿÿþçÿ)ÿþµÿÿþÈÿ)ÿþÏÿÿýÞýÿ(ÿþéÿÿþãÿ(ÿýþ¯ÿÿþÅÿ)ÿþÌÿÿþûÿ(ÿþëÿÿþàÿ)ÿþ±ÿÿþÁÿ)ÿþÏÿÿþùÿ(ÿþîÿÿþÜÿ)ÿþ´ÿÿþ½ÿ)ÿþÒÿÿþõÿ(ÿþñÿÿþÓÿ)ÿþ·ÿÿý±þÿ(ÿþÕÿÿþäÿ(ÿþôÿÿþÁÿ)ÿþºÿÿþõÿ(ÿþØÿÿþÒÿ(ÿþ÷ÿÿý°þÿ(ÿþÅÿÿþãÿ(ÿþèÿÿþÀÿ)ÿþ´ÿÿþôÿÿþùÿ ÿþ×ÿÿþÐÿÿþÜÿ ÿþøÿÿý¯ýÿÿþ½ÿ!ÿþÆÿÿþàÿÿý¨öÿ ÿþêÿÿþ¸ÿÿý§Øÿ!ÿþµÿÿþçÿÿý§ºÿ!ÿþØÿÿþ¾ÿÿ§þóÿ ÿþùÿÿþîÿÿ§þÕÿ!ÿþÇÿÿþÅÿÿ§þ´ÿ!ÿþëÿÿþóÿÿ§þéÿ!ÿþ·ÿÿþÌÿÿ§þÅÿ!ÿþßÿÿüøÿÿ§§ý©øÿ ÿýþ±ÿÿüÓÿÿ§§þÖÿ!ÿþØÿÿü³üÿ§§þ³ÿ!ÿýûÓÿÿýÚÿ§§þèÿ!ÿþÐÿÿý±ý§§þÄÿ!ÿþöÿÿþا§ý©÷ÿ!ÿþÉÿÿþ¯§§þÕÿ!ÿþñÿÿ§ý²þÿ!ÿþÂÿÿ§þæÿ!ÿþêÿÿ§þÃÿ"ÿþºÿÿ§ý¨öÿ!ÿþâÿÿ§þÔÿ!ÿýþ³ÿÿ§ý¯ýÿ!ÿþÞÿÿ§þÜÿ!ÿýþµÿÿ§ý´þÿ!ÿþâÿÿ §þãÿ"ÿþ¸ÿÿ §þºÿ"ÿþåÿÿ §þêÿ"ÿþ»ÿ ÿ §þÁÿ"ÿþéÿ ÿ §þñÿ"ÿþ¾ÿ ÿ §þÈÿ"ÿþìÿ ÿ §ý©öÿ"ÿþÂÿ ÿ §þÏÿ"ÿþïÿ ÿ §ý¬úÿ"ÿþÅÿ ÿ §þÖÿ"ÿþòÿ ÿ §ý°ýÿ"ÿþÊÿ ÿ§þÝÿ"ÿýøÞÿÿ2þ×ü+ü2þ‡ü+ü2þKü+ü2þÉü*ü2þsü*ü2ý:ðü)ü2þ™ü)ü2þPü)ü2þÆü(ü2þoü(ü2ý8íü'ü2þ•ü'ü2þMü'ü2þÁü&ü2þmü&ü2ý7äü%ü2þü%ü2ý;îü$ü2þü$ü2ýBöü#ü2þü#ü2ýJûü"ü2þ­ü"ü2þTü"ü2þ½ü!ü2þ`ü!ü2ý3Èü ü2þ^ü ü2þ¿üü2þXüü2þ·üü2þSüü2þ­üü2ýMûüü 2þ¥üü 2ýIúüü!2þ”üü!2ý<çüü"2þsüü"2ý4Éüü#2þVüü$2þ¤üüþ82"2ýBðüüþ~2#2þ€üüýõ:2"2ý6×üüýÿ†2#2þaüüÿþ>2#2þ³üüÿþŽ2#2ýHôüüÿþA2#2þüüÿþ—2#2ý5ÉüüÿþF2#2ýOøüüÿþŸ2$2þ‹üüÿþK2#2ý7Õüüÿþ·2$2ýWûüüÿþc2$2þ—üüÿýÙ72#2ý:Þüüÿþ‚2$2þ_üüÿþB2$2þ˜üüÿþ¥2$2ý8Ðü üÿþV2$2ýNõü üÿýÊ42$2þyü ü ÿþs2$2ý3³ü ü ÿýí<2$2ý?åü ü ÿþ”2%2þ^ü üLþÞÿ+ÿLþ—ÿ+ÿLþbÿ+ÿLþÒÿ*ÿLþ†ÿ*ÿLýSôÿ)ÿLþ¨ÿ)ÿLþfÿ)ÿLþÏÿ(ÿLþ‚ÿ(ÿLýRñÿ'ÿLþ¤ÿ'ÿLþdÿ'ÿLþËÿ&ÿLþ€ÿ&ÿLýPéÿ%ÿLþÿ%ÿLýTòÿ$ÿLþÿ$ÿLýZúÿ#ÿLþ«ÿ#ÿLýaþÿ"ÿLþ¹ÿ"ÿLþjÿ"ÿLþÇÿ!ÿLþuÿ!ÿLþÑÿ ÿLþsÿ ÿLþÉÿÿLþnÿÿLþÂÿÿLþiÿÿLþ¹ÿÿLýdþÿÿ Lþ²ÿÿ Lý`ýÿÿ!Lþ£ÿÿ!LýUìÿÿ"Lþ†ÿÿ"LýMÒÿÿ#Lþlÿÿ$Lþ±ÿÿþQL"LýZôÿÿþL#Lþ‘ÿÿý÷TL"LýPÞÿÿþ—L#LþvÿÿþVL#Lþ¾ÿÿþžL#Lý_øÿÿþYL#Lþÿÿþ¥L#LýNÒÿÿþ]L#Lýfüÿÿþ­L$Lþ›ÿÿþcL#LýPÜÿÿþÂL$LýmþÿÿþxL$Lþ¥ÿÿýàPL#LýSåÿÿþ“L$LþtÿÿþZL$Lþ¦ÿÿþ²L$LýQØÿÿþlL$LýeùÿÿýÓML$Lþ‹ÿÿþ†L%Lþ¾ÿÿýñUL$LýXêÿÿþ£L%Lþsÿ ÿÍþ£š+šÍþ¸š+šÍþÇš+šÍþ§š*šÍþ½š*šÍýËš)šÍþ³š)šÍþÆš)šÍþ¨š(šÍþ¾š(šÍýËžš'šÍþ´š'šÍþÆš'šÍþ©š&šÍþ¾š&šÍýÌ š%šÍþ¹š%šÍýËžš$šÍþ¶š$šÍýÉœš#šÍþ²š#šÍþÇš#šÍþ®š"šÍþÄš"šÍþªš!šÍþÁš!šÍþ§š šÍþš šÍþ©ššÍþÚšÍþ«ššÍþÅššÍþ®ššÍþÆšš Íþ°šš ÍýÇ›šš!Íþ´šš!ÍýÊŸšš"Íþ½šš#Íþ§šš#ÍþÄšš$Íþ°ššþÌÍ"ÍýÉššþºÍ#Íþ¹ššýÕËÍ"ÍýÌ£ššýÿ¸Í#ÍþÁššÿþÊÍ#Íþ¬ššÿþ¶Í#ÍýÇœššÿþÉÍ#Íþ¹ššÿþ´Í#Íý̧ššÿþÈÍ#ÍýÆ›ššÿþ±Í$Íþ·ššÿþÇÍ#Íý̤ššÿþ«Í$ÍþÄššÿþÁÍ$Íþ´ššÿý£ÌÍ#ÍýË¢ššÿþ¹Í$ÍþššÿþÉÍ$Íþ³ššÿþ°Í$ÍýÌ¥š šÿþÄÍ$ÍýÆœš šÿþ§Í%Íþ»š š ÿþ½Í%Íþ¬š š ÿý¸ÊÍ$ÍýÊ š š ÿþ´Í%Íþš šÿþ²§+§ÿþѧ+§ÿþï§+§ÿþ·§*§ÿþÚ§*§ÿýúª§)§ÿþɧ)§ÿþí§)§ÿþ¸§(§ÿþܧ(§ÿýû«§'§ÿþ˧'§ÿþî§'§ÿþº§&§ÿþݧ&§ÿýü®§%§ÿþÔ§%§ÿýù«§$§ÿþΧ$§ÿýõ©§#§ÿþǧ#§ÿþð§#§ÿþÁ§"§ÿþê§"§ÿþ»§!§ÿþä§!§ÿþ·§ §ÿþå§ §ÿþº§§ÿþè§§ÿþ½§§ÿþë§§ÿþÁ§§ÿþî§§ ÿþħ§ ÿýñ¨§§!ÿþ˧§!ÿýø­§§"ÿþÚ§§"ÿýþ·§§#ÿþé§§$ÿþŧ§þûÿ"ÿýõª§§þÕÿ#ÿþÔ§§ýÓùÿ"ÿýü²§§ýÿÑÿ#ÿþã§§ÿþ÷ÿ#ÿþ¿§§ÿþÎÿ#ÿýñ©§§ÿþõÿ#ÿþÔ§§ÿþÊÿ#ÿýý·§§ÿþóÿ#ÿýí¨§§ÿþÆÿ$ÿþϧ§ÿþïÿ#ÿýü³§§ÿþ½ÿ$ÿþé§§ÿþâÿ$ÿþʧ§ÿý²üÿ#ÿýú°§§ÿþÓÿ$ÿþä§§ÿþõÿ$ÿþʧ§ÿþÄÿ$ÿýû´§ §ÿþéÿ$ÿýî©§ §ÿý·þÿ$ÿþ×§ § ÿþÚÿ%ÿþ¿§ § ÿý½øÿ$ÿýö®§ § ÿþËÿ%ÿþå§ §-üýõD22.üþ©22/üþ`2 2/üýà;2 20üþž2 21üþ]2 21üýÝ:2 22üþš2 23üþ[2 23üýÛ9224üþ—225üþY225üýÙ8226üþ”226üýûY227üýß>228üýº5229üþ“22:üþn22:üýõR22;üûß@22ü;üüÀ62ü<üý™2ü=üþsü=üþ÷ü ¿ü-ÿýù\LL.ÿþµLL/ÿþuL L/ÿýæTL L0ÿþ«L L1ÿþrL L1ÿýäSL L2ÿþ¨L L3ÿþqL L3ÿýâSLL4ÿþ¥LL5ÿþnLL5ÿýàRLL6ÿþ£LL6ÿýþnLL7ÿýæVLL8ÿýÅNLL9ÿþ¢LL:ÿþLL:ÿýùhLL;ÿûæXLLÿ;ÿüÊOLÿ<ÿý¨Lÿ=ÿþ†ÿ=ÿþûÿ ¿ÿ-šýœÈÍÍ.šþ¯ÍÍ/šþÁÍ Í/šý¡ËÍ Í0šþ²Í Í1šþÂÍ Í1šý¢ËÍ Í2šþ³Í Í3šþÃÍ Í3šý¢ËÍÍ4šþ´ÍÍ5šþÃÍÍ5šý£ËÍÍ6šþ´ÍÍ7šþÃÍÍ7šý¡ÊÍÍ8šý«ÌÍÍ9šþµÍÍ:šþ¾ÍÍ:šýœÅÍÍ;šû¡ÉÍÍš;šü©ÌÍš<šý³Íš=šþ½š=šþ›š ¿š-§ý©ôÿÿ.§þÃÿÿ/§þäÿ ÿ/§ý¯ùÿ ÿ0§þÇÿ ÿ1§þåÿ ÿ1§ý°úÿ ÿ2§þÈÿ ÿ3§þæÿ ÿ3§ý±úÿÿ4§þÊÿÿ5§þèÿÿ5§ý²ûÿÿ6§þËÿÿ7§þèÿÿ7§ý°÷ÿÿ8§ý¼ýÿÿ9§þÌÿÿ:§þÜÿÿ:§ý©ëÿÿ;§û°öÿÿ§;§üºýÿ§<§ýÉÿ§=§þÚ§=§þ¨§ ¿§52ý7ªüü62ý3üü82ýrøüü92ý]îüü:2ýGÄüü;2û5ˆúü2<2ýWÜ2=2þ;2ÿ2þV2=2ýäB2<2üüÅ72;2üý¤32:2üþ2:2üþˆ292üþ‚282üþ{272üþv262üþp252üýûk242üýúf232 üý÷b222 üýö]212 üýôY202 üýñ[2/2 üýõf2.2üýû2-2üý›52+2üý·:2*2üýÏD2)2üýãQ2(2üýòc2'2üýû{2&2üý—42$2üý²92#2üýÏJ2"2üýðp2!2üýª<22üýÞY22üüû‹522 üýÆH22!üýðo22#üý©<22$üýÞX22%üüûŠ622'üýÐW22)üý¥C22*üüñƒ722,üýÚd225LýQ¶ÿÿ6LýMÿÿ8Lý…üÿÿ9Lýròÿÿ:Lý_Îÿÿ;LûN™ýÿL­üü42ü3mçüü32ýSÂüü12ýC¥ü ü/2ü9ˆôü ü-2ü4oãü ü,2ýYÊüü*2ýG¬üüÿý³UL%Lÿýð~L'LÿýÅ[L(LÿüúŽML)LÿýÖdL+LÿüþŸPL,L ÿýåoL.L ÿý²TL/L ÿýÔpL1LÿüèƒML1LþOÿÿüø™SL2LýMLÿÿý±[L6LÿýËiL8Lÿýâ{L:LüêPL;LþPL 2(2ý>àü ü2þ<2(2ý4·ü ü2þ:2)2þ‘ü ü2þ;2)2þoü ü2þ;2)2ýTõü ü2þ;2)2ýBãüüý2;2)2ý7Æüüþ92*2þ£üü+2þ~üü*2ý_ûüü)2ýIíüü(2ý;Õüü'2ý4´üü'2þüü&2þlüü%2ýRôüü$2ýDãüü#2ý@Õüü"2ý?Ñüü!2ý>Îüü 2ý=Ëüü2ý<Èüü2ý;Æüü2ý:Ãüü2ý9¿üü2ý8¼ü ü2ý7ºü!ü2ý7·ü"ü2ý6³ü#ü2ý6°ü$ü2ý5­ü%ü2ý8³ü&ü2ýAÈü'ü2ýOßü(ü2ýcñü)ü2ý|ûü*ü2ý5›ü,ü2ý<ºü-ü 2ýGÓü.ü 2ýXèü/ü 2ýnöü0ü 2ý3‹ü2ü2ý8ªü3ü2ýAÆü4ü2ýSßü5ü2ü4÷ü6ü2ýD½ü8ü2ýmîü9üü2=ªü;üý]áü}üLýPYL(Lþrÿ ÿLþWL(LýWæÿ ÿLþUL(LýNÂÿ ÿLþTL)Lþ ÿ ÿLþTL)Lþ‚ÿ ÿLþTL)Lýjùÿ ÿLþTL)LýZèÿÿýLTL)LýQÏÿÿþRL*Lþ°ÿÿ+Lþÿÿ*Lýtþÿÿ)Lý`ñÿÿ(LýTÜÿÿ'LýM¿ÿÿ'Lþžÿÿ&Lþÿÿ%Lýhøÿÿ$Lý\èÿÿ#LýXÜÿÿ"LýWÙÿÿ!LýVÖÿÿ LýUÔÿÿLýTÑÿÿLýTÏÿÿLýSÍÿÿLýRÉÿÿLýRÇÿ ÿLýQÄÿ!ÿLýPÂÿ"ÿLýP¾ÿ#ÿLýO¼ÿ$ÿLýO¹ÿ%ÿLýR¾ÿ&ÿLýYÑÿ'ÿLýfæÿ(ÿLýwöÿ)ÿLýŽþÿ*ÿLýO©ÿ,ÿLýUÄÿ-ÿ Lý^Ûÿ.ÿ Lýmíÿ/ÿ Lýúÿ0ÿ LýM›ÿ2ÿLýQ¶ÿ3ÿLýYÏÿ4ÿLýiæÿ5ÿLüMûÿ6ÿLý\Çÿ8ÿLýòÿ9ÿüLV¶ÿ;ÿýrçÿ}ÿÍýÌÉÍ(Íþš šÍþÊÍ(ÍýÊ¡š šÍþËÍ(ÍýÌ«š šÍþËÍ)Íþµš šÍþËÍ)Íþ¾š šÍþËÍ)ÍýÄœš šÍþËÍ)ÍýÉ ššýÍËÍ)Íý̨ššþËÍ*Íþ±šš+Íþºšš*Íþšš)ÍýÇžšš(Íýˤšš(Íþ¬šš'Íþ¶šš&Íþ¾šš%ÍýÅœšš$ÍýÈ šš#Íýɤšš"ÍýÊ¥šš!Íýʦšš ÍýʦššÍý˧ššÍý˨ššÍý˨ššÍýË©ššÍý˪š šÍýÌ«š!šÍýÌ«š"šÍý̬š#šÍýÌ­š$šÍýÌ®š%šÍýˬš&šÍýɧš'šÍýÆ¡š(šÍýÁš)šÍþºš+šÍý̲š,šÍýÊ«š-š ÍýȤš.š ÍýÄŸš/š Íý¾œš0š Íþ·š2šÍý̯š3šÍýɨš4šÍýÅ¡š5šÍýº›š6šÍýȪš8šÍý¾žš9šüÍʯš;šý¡š}šÿýüöÿ(ÿþå§ §ÿþ÷ÿ(ÿý÷¯§ §ÿþùÿ(ÿýþ½§ §ÿþùÿ)ÿþ̧ §ÿþùÿ)ÿþܧ §ÿþùÿ)ÿýê©§ §ÿþùÿ)ÿýõ¯§§ýÿùÿ)ÿýü¸§§þûÿ*ÿþŧ§+ÿþÕ§§*ÿþä§§)ÿýñ«§§(ÿýù³§§'ÿýþ¾§§'ÿþͧ§&ÿþÞ§§%ÿýë©§§$ÿý󯧧#ÿýö³§§"ÿý÷´§§!ÿý÷µ§§ ÿýø¶§§ÿýù·§§ÿýù¸§§ÿýú¹§§ÿýûº§§ÿýû»§ §ÿýü¼§!§ÿýü½§"§ÿýü¿§#§ÿýýÀ§$§ÿýýÁ§%§ÿýû¿§&§ÿýõ·§'§ÿýí°§(§ÿý⪧)§ÿþÖ§+§ÿýýȧ,§ÿýø¼§-§ ÿýò³§.§ ÿýè­§/§ ÿýÜ©§0§ ÿýþϧ2§ÿýû§3§ÿýö¸§4§ÿýë°§5§ÿüþÕ¨§6§ÿýó»§8§ÿýÝ«§9§üÿøÂ§;§ý寧}§¿üþÜü=üþpü<üý×5ü<üýk2ü;üüÇ32ü;üüV22ü:üþ§22:üýôD22:üþˆ229üýá9229üþm228üýÆ3228üþU227üþ¥226üýôD226üþ‚225üýÏ5224üýûT224üþ–223üýà:223üþc2 22üþ¬2 21üýíB2 21üþt2 20üýÀ32 2/üýöK2 2/üþ‡2 2.üýÍ62 2-üýõL22-üþy22,üýµ322+üýçA22+üþc22*üþš22)üýÕ822(üý÷Q22(üþ‚22'üý¾422&üýêD22&üþa22%üþ‰22$üý·422#üýÝ>22"üýõQ22"üþs22!üþž22 üýÉ722üýêF22üýû_22üþ22¿ÿþãÿ=ÿþƒÿ<ÿýÞNÿ<ÿýLÿ;ÿüÐMLÿ;ÿülLLÿ:ÿþ´LL:ÿýø\LL:ÿþ™LL9ÿýçRLL9ÿþLL8ÿýÏMLL8ÿþkLL7ÿþ²LL6ÿýø\LL6ÿþ“LL5ÿý×OLL4ÿýþkLL4ÿþ¥LL3ÿýæTLL3ÿþxL L2ÿþ¸L L1ÿýñZL L1ÿþ‡L L0ÿýÊML L/ÿýúbL L/ÿþ—L L.ÿýÖPL L-ÿýùcLL-ÿþ‹LL,ÿþÀLL+ÿýìYLL+ÿþxLL*ÿþ¨LL)ÿýÜRLL(ÿýûhLL(ÿþ“LL'ÿýÈMLL&ÿýï\LL&ÿþvLL%ÿþ™LL$ÿýÂMLL#ÿýäVLL"ÿýùhLL"ÿþ†LL!ÿþ¬LL ÿýÒQLLÿýï]LLÿýþtLLÿþ’LL¿šþ¢š=šþ½š<šý£Ìš<šý¿Íš;šü§ÍÍš;šüÄÍÍš:šþ¯ÍÍ:šýœÈÍÍ:šþ·ÍÍ9šý¡ËÍÍ9šþ¾ÍÍ8šþ¨ÍÍ8šþÄÍÍ7šþ°ÍÍ6šýœÈÍÍ6šþ¹ÍÍ5šý¥ÌÍÍ5šþÄÍÍ4šþ´ÍÍ3šý¡ËÍÍ3šþÁÍ Í2šþ®Í Í1šýžÉÍ Í1šþ¼Í Í0šþ©Í Í/šýœÇÍ Í/šþ¸Í Í.šý¦ÌÍ Í-šýœÆÍÍ-šþ»ÍÍ,šþ¬ÍÍ+šýŸÉÍÍ+šþÁÍÍ*šþ³ÍÍ)šý¤ËÍÍ(šý›ÅÍÍ(šþ¹ÍÍ'šþªÍÍ&šýžÈÍÍ&šþÁÍÍ%šþ·ÍÍ$šþ«ÍÍ#šý¢ÊÍÍ"šýœÅÍÍ"šþ½ÍÍ!šþ²ÍÍ šý§ÌÍÍšýžÈÍÍšþÂÍÍšþ¹ÍÍ¿§þ±§=§þÛ§<§ý²ý§<§ýÞÿ§;§ü¸þÿ§;§üéÿÿ§:§þÃÿÿ:§ý©óÿÿ:§þÐÿÿ9§ý¯ûÿÿ9§þÝÿÿ8§ý¸þÿÿ8§þêÿÿ7§þÄÿÿ6§ý©ôÿÿ6§þÓÿÿ5§ýµýÿÿ5§þêÿÿ4§þÊÿÿ3§ý¯ùÿÿ3§þâÿ ÿ2§þÂÿ ÿ1§ý«õÿ ÿ1§þÙÿ ÿ0§ýºþÿ ÿ/§ý©ïÿ ÿ/§þÑÿ ÿ.§ýµüÿ ÿ-§ý©ïÿÿ-§þ×ÿÿ,§þ¾ÿÿ+§ý­öÿÿ+§þâÿÿ*§þÈÿÿ)§ý³ûÿÿ(§ý¨ìÿÿ(§þÓÿÿ'§ý»þÿÿ&§ý¬óÿÿ&§þãÿÿ%§þÐÿÿ$§ý½þÿÿ#§ý°÷ÿÿ"§ý©ìÿÿ"§þÚÿÿ!§þÇÿÿ §ý·üÿÿ§ý¬óÿÿ§þäÿÿ§þÔÿÿüýÎ32 2ý3Õÿÿüþn2!2þXÿÿüýã62!2þ£ÿÿüþ2!2þ=ÿÿüýð=2!2þyÿÿüþ‰2!2ý3Õÿÿüýí<2!2þbÿÿüþ„2"2þ¾ÿÿüýé:2!2þSÿÿüþ2"2þ¨ÿÿüüå82!2þFÿÿýüz2"2þ”ÿÿýà72!2þ<ÿÿþu2"2þ€ÿÿþ62!2ý6ãÿÿ#2þoÿÿ"2ý3Ðÿÿ"2þ_ÿÿ"2þºÿÿ!2þRÿÿ!2þ²ÿÿ 2þTÿÿ 2þ·ÿÿ2þWÿÿ2þ»ÿÿ2þZÿÿ2þÀÿÿ2þ]ÿÿ2þÄÿÿ2þ`ÿ ÿ2ý3Èÿ ÿ2þcÿ!ÿ2ý3Ìÿ!ÿ2þkÿ"ÿ2ý8Þÿ"ÿ2þ…ÿ#ÿ2þCÿ#ÿþ…22þ¤ÿ"ÿýø:22þTÿ#ÿþ22ý3Åÿ"ÿýí922þmÿ#ÿþu22ý9áÿ"ÿýÎ422þˆÿ#ÿþ[22þDÿ#ÿþ®22þ¨ÿ#ÿþG22þWÿ#ÿþ22ý4Éÿ"ÿýå:22þvÿ#ÿþq22þCÿ#ÿýÊ422þ±ÿ#ÿþX22þiÿ#ÿþ©22ý=åÿ#ÿþE22þŸÿ#ÿþ‰22þ[ÿ#ÿýá922ý8Ùÿ#ÿþg22þÿ#ÿþ°22þQÿ$ÿþC22ý5Ëÿ#ÿþx22þÿ#ÿýÄ422þHÿ$ÿþM22ý4Áÿ#ÿþŠ22þ„ÿ#ÿýÖ722þSÿ$ÿþY22ý9×ÿ#ÿþž22ÿþÖL"LþÜÿÿþL!LþnÿÿýèPL!Lþ°ÿÿþ’L!LþUÿÿýôUL!Lþ‹ÿÿþ™L!LýMÜÿÿýñUL!Lþvÿÿþ•L"LþÈÿÿýîTL!LþiÿÿþL"LþµÿÿýêRL!Lþ]ÿÿþŒL"Lþ£ÿÿýæQL!LþUÿÿþ‡L"Lþ‘ÿÿþOL!LýPèÿÿ#Lþ‚ÿÿ#LþØÿÿ"Lþtÿÿ"LþÄÿÿ!Lþhÿÿ!Lþ½ÿÿ Lþjÿÿ LþÂÿÿLþmÿÿLþÆÿÿLþpÿÿLþÊÿÿLþrÿÿLþÎÿÿLþuÿ ÿLþÑÿ ÿLþxÿ!ÿLýMÕÿ!ÿLþ~ÿ"ÿLýQåÿ"ÿLþ•ÿ#ÿLþ[ÿ#ÿþ•LLþ±ÿ"ÿýúTLLþkÿ#ÿþ’LLýMÎÿ"ÿýñSLLþ€ÿ#ÿþ‡LLýRçÿ"ÿýÖNLLþ™ÿ#ÿþqLLþ\ÿ#ÿþºLLþµÿ#ÿþ_LLþmÿ#ÿþLLýMÒÿ"ÿýêTLLþ‰ÿ#ÿþ„LLþ[ÿ#ÿýÓMLLþ½ÿ#ÿþmLLþ|ÿ#ÿþµLLýUêÿ#ÿþ]LLþ­ÿ#ÿþ™LLþqÿ#ÿýçRLLýQàÿ#ÿþ{LLþžÿ#ÿþ¼LLþgÿ$ÿþ[LLýNÔÿ#ÿþŠLLþÿ#ÿýÎMLLþ_ÿ$ÿþdLLýNËÿ#ÿþšLLþ•ÿ#ÿýÝPLLþiÿ$ÿþoLLýRÞÿ#ÿþ«LLšþ¦Í"Íþ¤ÿÿšþ¾Í!ÍþÃÿÿšý ÌÍ!Íþ±ÿÿšþ¹Í!ÍþÊÿÿšýÊÍ!Íþ»ÿÿšþ·Í"Íþ¤ÿÿšýžÊÍ!ÍþÁÿÿšþ¸Í"ÍþªÿÿšýŸËÍ!ÍþÅÿÿšþ¹Í"Íþ¯ÿÿüš ËÍ!ÍþÈÿÿýš»Í"Íþ´ÿÿý¡ÌÍ!ÍþÊÿÿþ¼Í"Íþ¹ÿÿþÌÍ!ÍýÌ ÿÿ#Íþ¾ÿÿ#Íþ¥ÿÿ"ÍþÂÿÿ"Íþ«ÿÿ!ÍþÅÿÿ!Íþ­ÿÿ ÍþÄÿÿ Íþ«ÿÿÍþÄÿÿÍþªÿÿÍþÃÿÿÍþ©ÿÿÍþÂÿÿÍþ¨ÿÿÍþÁÿ ÿÍþ§ÿ ÿÍþÁÿ!ÿÍþ¦ÿ!ÿÍþ¿ÿ"ÿÍýÌ¢ÿ"ÿÍþ¸ÿ#ÿÍþÉÿ#ÿþ¸ÍÍþ°ÿ"ÿýàËÍÍþÄÿ#ÿþ¹ÍÍþ¨ÿ"ÿý¸ËÍÍþ¾ÿ#ÿþ¼ÍÍýË¡ÿ"ÿý¦ÌÍÍþ·ÿ#ÿþÃÍÍþÈÿ#ÿþ®ÍÍþ¯ÿ#ÿþÈÍÍþÄÿ#ÿþ¶ÍÍþ§ÿ"ÿý ËÍÍþ¼ÿ#ÿþ½ÍÍþÉÿ#ÿþ§ÍÍþ­ÿ#ÿþÄÍÍþ¿ÿ#ÿþ¯ÍÍýÊ ÿ#ÿþÈÍÍþ±ÿ#ÿþ·ÍÍþÃÿ#ÿý¡ËÍÍýÌ£ÿ#ÿþÀÍÍþ¶ÿ#ÿþ­ÍÍþÅÿ$ÿþÉÍÍý̦ÿ#ÿþ»ÍÍþ¹ÿ#ÿþ¨ÍÍþÇÿ$ÿþÆÍÍýÌ©ÿ#ÿþ·ÍÍþ¸ÿ#ÿý¤ÌÍÍþÅÿ$ÿþÃÍÍýË£ÿ#ÿþ²Íͧþµÿ"ÿþ³ÿÿ§þÜÿ!ÿþèÿÿ§ý¯üÿ!ÿþÅÿÿ§þÔÿ!ÿþøÿÿ§ýªøÿ!ÿþ×ÿÿ§þÐÿ!ÿýþ³ÿÿ§ý«øÿ!ÿþãÿÿ§þÒÿ"ÿþ»ÿÿ§ý­ùÿ!ÿþëÿÿ§þÔÿ"ÿþÃÿÿü§®ûÿ!ÿþóÿÿý§×ÿ"ÿþËÿÿý¯üÿ!ÿþøÿÿþÙÿ"ÿþÔÿÿþýÿ!ÿýü¯ÿ<ÿþÜÿ=ÿþ´ÿ<ÿþäÿ=ÿþ¼ÿ<ÿþëÿ=ÿþ¿ÿ<ÿþêÿ=ÿþ½ÿ<ÿþéÿ=ÿþ¼ÿ<ÿþçÿ=ÿþºÿ<ÿþåÿ=ÿþ¹ÿ<ÿþäÿ=ÿþ·ÿ<ÿþâÿ<ÿýþ¶ÿ<ÿþÞÿ<ÿýû°ÿ<ÿþÒÿ<ÿþôÿ#ÿþÒÿÿþÅÿ"ÿýÞùÿÿþêÿ#ÿþÔÿÿýþ¸ÿ"ÿý½úÿÿþÝÿ#ÿþÙÿÿýû¯ÿ"ÿýµþÿÿþÐÿ#ÿþæÿÿþóÿ#ÿþÁÿÿþÃÿ#ÿþòÿÿþéÿ#ÿþÎÿÿýþ·ÿ"ÿý®ùÿÿþØÿ#ÿþÛÿÿþôÿ#ÿý·þÿÿþÀÿ#ÿþèÿÿþßÿ#ÿþÃÿÿýø®ÿ#ÿþóÿÿþÆÿ#ÿþÐÿÿþæÿ#ÿý¯ûÿÿýû²ÿ#ÿþàÿÿþÍÿ#ÿþÀÿÿþìÿ$ÿþôÿÿýý¶ÿ#ÿþØÿÿþÔÿ#ÿý¹þÿÿþñÿ$ÿþîÿÿýþºÿ#ÿþÏÿÿþÒÿ#ÿý³üÿÿþëÿ$ÿþçÿÿýû²ÿ#ÿþÇÿÿÿþ?2 2þWÿÿþ«2!2þ•ÿÿþ^2 2ý4åÿÿýÝ42 2þ\ÿÿþ…2!2þ¥ÿÿþC2 2þ>ÿÿþ³2!2þzÿÿþd2!2þÑÿÿýÜ42 2þVÿÿþy2!2þŸÿÿþ:2 2þ;ÿÿþ2!2þuÿÿþB2!2þÊÿÿþ¢2!2þQÿÿþO2!2þ™ÿÿþ¹2!2þ9ÿÿþ_2!2þoÿÿýÐ32!2þÃÿÿþo2!2þMÿÿýä62!2þ“ÿÿþ‚2!2ý7øÿÿþ=2!2þmÿÿþ–2"2þÌÿÿþG2!2þ[ÿÿþž2"2þµÿÿþE2!2þMÿÿþ™2"2þžÿÿþC2!2þAÿÿþ”2"2þ‹ÿÿþA2!2ý9øÿÿþ2"2þxÿÿþ?2!2ý4ÚÿÿþŒ2"2þfÿÿþ>2"2þÅÿÿþˆ2"2þWÿÿþ<2"2þ­ÿÿ#2þIÿÿ#2þ™ÿÿ"2þ?ÿÿ"2þÿÿ!2þAÿÿ!2þ•ÿÿ 2þDÿÿ 2þšÿÿ2þFÿÿ2þ ÿÿ2þJÿÿ2þ¥ÿÿ2þMÿÿ2þ¬ÿÿ2þPÿ ÿ2þ±ÿ ÿ2þTÿ!ÿ2þ¸ÿ!ÿ2þXÿ"ÿ2ý3Áÿ"ÿ2þhÿ#ÿ2ý7Üÿ#ÿ2þƒÿ$ÿ2þBÿ%ÿ2þ¡ÿ%ÿ2þRÿ&ÿ2ý3Âÿ&ÿ2þjÿ'ÿÿþXL Lþmÿÿþ·L!Lþ¤ÿÿþsL LýNêÿÿýäML Lþqÿÿþ•L!Lþ²ÿÿþ[L LþVÿÿþ¾L!LþŒÿÿþxL!LþÙÿÿýãNL Lþlÿÿþ‹L!Lþ­ÿÿþSL LþTÿÿþL!Lþ‡ÿÿþZL!LþÓÿÿþ¯L!LþgÿÿþfL!Lþ§ÿÿþÃL!LþRÿÿþtL!Lþ‚ÿÿþØL"LþÍÿÿþ‚L!LþdÿÿýéPL!Lþ¢ÿÿþ“L!LýPúÿÿþVL!Lþÿÿþ¥L"LþÕÿÿþ_L!Lþqÿÿþ«L"LþÀÿÿþ]L!Lþdÿÿþ¨L"Lþ¬ÿÿþ[L!LþYÿÿþ£L"Lþ›ÿÿþYL!LýRúÿÿþ L"LþŠÿÿþXL!LýNáÿÿþœL"Lþ{ÿÿþVL"LþÎÿÿþ™L"LþmÿÿþUL"Lþ¹ÿÿ#Lþ`ÿÿ#Lþ§ÿÿ"LþXÿÿ"Lþ ÿÿ!LþYÿÿ!Lþ¤ÿÿ Lþ\ÿÿ Lþ¨ÿÿLþ^ÿÿLþ®ÿÿLþaÿÿLþ²ÿÿLþdÿÿLþ¸ÿÿLþgÿ ÿLþ½ÿ ÿLþjÿ!ÿLþÂÿ!ÿLþmÿ"ÿLþËÿ"ÿLþ|ÿ#ÿLýQãÿ#ÿLþ”ÿ$ÿLþZÿ%ÿLþ®ÿ%ÿLþhÿ&ÿLþÌÿ&ÿLþ~ÿ'ÿÿþÊÍ ÍþÄÿÿþ¯Í!Íþ´ÿÿþÂÍ ÍýÌ ÿÿþ¢Í!ÍþÂÿÿþ¸Í!Íþ°ÿÿþÉÍ ÍþÊÿÿþ¬Í!Íþ»ÿÿþÀÍ!Íþ¥ÿÿý¢ÌÍ ÍþÄÿÿþ»Í!Íþ±ÿÿþËÍ ÍþËÿÿþ¶Í!Íþ¼ÿÿþÉÍ!Íþ§ÿÿþ±Í!ÍþÅÿÿþÆÍ!Íþ³ÿÿþ«Í!ÍþËÿÿþÂÍ!Íþ¾ÿÿþ¥Í"Íþ¨ÿÿþ¾Í!ÍþÆÿÿý ÌÍ!Íþµÿÿþ¹Í!ÍýÌàÿÿþÊÍ!Íþ¾ÿÿþ´Í"Íþ¦ÿÿþÈÍ!ÍþÃÿÿþ²Í"Íþ¬ÿÿþÈÍ!ÍþÆÿÿþ³Í"Íþ²ÿÿþÉÍ!ÍþÉÿÿþ´Í"Íþ·ÿÿþÉÍ!ÍýËàÿÿþµÍ"Íþ»ÿÿþÊÍ!ÍýÌ£ÿÿþ¶Í"ÍþÀÿÿþÊÍ"Íþ¨ÿÿþ·Í"ÍþÄÿÿþÊÍ"Íþ®ÿÿ#ÍþÇÿÿ#Íþ³ÿÿ"ÍþÊÿÿ"Íþµÿÿ!ÍþÉÿÿ!Íþ´ÿÿ ÍþÈÿÿ Íþ³ÿÿÍþÈÿÿÍþ±ÿÿÍþÇÿÿÍþ°ÿÿÍþÆÿÿÍþ®ÿÿÍþÅÿ ÿÍþ­ÿ ÿÍþÄÿ!ÿÍþ«ÿ!ÿÍþÄÿ"ÿÍþ©ÿ"ÿÍþ¿ÿ#ÿÍýÌ¢ÿ#ÿÍþ¹ÿ$ÿÍþÉÿ%ÿÍþ±ÿ%ÿÍþÅÿ&ÿÍþ©ÿ&ÿÍþ¿ÿ'ÿÿþöÿ ÿþéÿÿþÂÿ!ÿþËÿÿþåÿ ÿýþ®ÿÿý°þÿ ÿþæÿÿþÒÿ!ÿþÄÿÿþôÿ ÿþ÷ÿÿþ¿ÿ!ÿþ×ÿÿþâÿ!ÿþ´ÿÿý±þÿ ÿþéÿÿþ×ÿ!ÿþÆÿÿþúÿ ÿþùÿÿþÎÿ!ÿþÙÿÿþõÿ!ÿþ·ÿÿþÅÿ!ÿþìÿÿþíÿ!ÿþÉÿÿþ½ÿ!ÿþûÿÿþäÿ!ÿþÜÿÿþ´ÿ"ÿþ¹ÿÿþÜÿ!ÿþîÿÿý®üÿ!ÿþÌÿÿþÓÿ!ÿýüÞÿÿþøÿ!ÿþÝÿÿþÊÿ"ÿþ¶ÿÿþòÿ!ÿþæÿÿþÇÿ"ÿþ¾ÿÿþóÿ!ÿþîÿÿþÉÿ"ÿþÇÿÿþôÿ!ÿþõÿÿþËÿ"ÿþÏÿÿþõÿ!ÿýûÞÿÿþÍÿ"ÿþØÿÿþöÿ!ÿýþ±ÿÿþÎÿ"ÿþàÿÿþ÷ÿ"ÿþ¸ÿÿþÐÿ"ÿþéÿÿþøÿ"ÿþÁÿ<ÿþñÿ=ÿþÉÿ<ÿþöÿ=ÿþÍÿ<ÿþõÿ=ÿþËÿ<ÿþôÿ=ÿþÈÿ<ÿþòÿ=ÿþÆÿ<ÿþðÿ=ÿþÄÿ<ÿþîÿ=ÿþÂÿ<ÿþìÿ=ÿþÀÿ<ÿþêÿ=ÿþ½ÿ<ÿþèÿ=ÿþºÿ<ÿþàÿ<ÿýü±ÿ<ÿþÒÿ<ÿþõÿ=ÿþÆÿ<ÿþëÿ=ÿþ¹ÿ<ÿþßÿ'ÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿÿÿÿÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þp22ý=®ÿÿ Ãþž‡ ‡þp22ýYàÿÿ Ãþž‡ ‡þp2 2ý5Šÿÿ Ãþž‡ ‡þp2 2ýFÃÿÿ Ãþž‡ ‡þp2 2þjÿÿ Ãþž‡ ‡þp22ý9 ÿÿ Ãþž‡ ‡þp22ýQ×ÿÿ Ãþž‡ ‡þp22ý3}ÿÿ Ãþž‡ ‡þp22ý@·ÿÿ Ãþž‡ ‡þp22ý_èÿÿ Ãþž‡ ‡þp22ý6’ÿ!ÿ Ãþž‡ ‡úp22JÊÿ"ÿ Ãþž‡ ‡üp2qÿ$ÿ Ãþž‡ ‡ýs©ÿ%ÿ Ãþž‡ ‡þ˜ÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ&ÿ Ãþž‡ ‡þžÿ%ÿþÌÃÃþž‡ ‡þžÿ$ÿý‘6ÃÃþž‡ ‡þžÿ"ÿûä]22ÃÃþž‡ ‡þžÿ!ÿý°>22 Ãþž‡ ‡þžÿ ÿýv322 Ãþž‡ ‡þžÿÿýÌK22 Ãþž‡ ‡þžÿÿý’622 Ãþž‡ ‡þžÿÿýä^22 Ãþž‡ ‡þžÿÿý²>22 Ãþž‡ ‡þžÿÿý|32 2 Ãþž‡ ‡þžÿÿýÙQ2 2 Ãþž‡ ‡þžÿÿý¦:2 2 Ãþž‡ ‡þžÿÿþq22 Ãþž‡ ‡þžÿÿýÏK22 Ãþž‡ ‡þžÿÿý›822 Ãþž‡ ‡þžÿÿþh22 Ãþž‡ ‡þžÿÿýÅF22 Ãþž‡ ‡þžÿÿý522 Ãþž‡ ‡þžÿ ÿýí_22 Ãþž‡ ‡þžÿ ÿýºA22 Ãþž‡ ‡þžÿ ÿý…422 Ãþž‡ ‡þžÿÿýßX22 Ãþž‡ ‡þžÿÿý°=22 Ãþž‡ ‡þžÿÿýz322 Ãþž‡ ‡þžÿÿý×P22 Ãþž‡ ‡þžÿÿý¥:22 Ãþž‡ ‡þžÿÿþo2!2 Ãþž‡ ‡úžÿÿÍJ2"2 Ãþž‡ ‡ûžÿ™72#2 Ãþž‡ ‡ý›f2%2 Ãþž‡ ‡þv2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2&2 Ãþž‡ ‡þp2%2þ=ÃÃþž‡ ‡þp2$2þXß ØþÕÓ Óþ¯LLýVºÿÿ ØþÕÓ Óþ¯LLýoæÿÿ ØþÕÓ Óþ¯L LýNšÿÿ ØþÕÓ Óþ¯L Lý]Íÿÿ ØþÕÓ Óþ¯L Lþ~ÿÿ ØþÕÓ Óþ¯LLýS®ÿÿ ØþÕÓ Óþ¯LLýgÞÿÿ ØþÕÓ Óþ¯LLýMÿÿ ØþÕÓ Óþ¯LLýXÂÿÿ ØþÕÓ Óþ¯LLýtìÿÿ ØþÕÓ Óþ¯LLýP¡ÿ!ÿ ØþÕÓ Óú¯LLaÓÿ"ÿ ØþÕÓ Óü¯L„ÿ$ÿ ØþÕÓ Óý²µÿ%ÿ ØþÕÓ ÓþÖÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ%ÿþÕØØþÕÓ ÓþÛÿ$ÿý PØØþÕÓ ÓþÛÿ"ÿûérLLØØþÕÓ ÓþÛÿ!ÿý¼WLL ØþÕÓ ÓþÛÿ ÿþˆLL ØþÕÓ ÓþÛÿÿýÕcLL ØþÕÓ ÓþÛÿÿý¡PLL ØþÕÓ ÓþÛÿÿýésLL ØþÕÓ ÓþÛÿÿý½WLL ØþÕÓ ÓþÛÿÿþL L ØþÕÓ ÓþÛÿÿýàhL L ØþÕÓ ÓþÛÿÿý³TL L ØþÕÓ ÓþÛÿÿþ„LL ØþÕÓ ÓþÛÿÿý×cLL ØþÕÓ ÓþÛÿÿý©QLL ØþÕÓ ÓþÛÿÿþ|LL ØþÕÓ ÓþÛÿÿýÎ^LL ØþÕÓ ÓþÛÿÿýŸOLL ØþÕÓ ÓþÛÿ ÿýñtLL ØþÕÓ ÓþÛÿ ÿýÅYLL ØþÕÓ ÓþÛÿ ÿý•MLL ØþÕÓ ÓþÛÿÿýæmLL ØþÕÓ ÓþÛÿÿý¼VLL ØþÕÓ ÓþÛÿÿþŒLL ØþÕÓ ÓþÛÿÿýÞgLL ØþÕÓ ÓþÛÿÿý²SLL ØþÕÓ ÓþÛÿÿþ‚L!L ØþÕÓ ÓúÛÿÿÖbL"L ØþÕÓ ÓûÛÿ§QL#L ØþÕÓ ÓýÙ{L%L ØþÕÓ ÓþµL&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L&L ØþÕÓ Óþ¯L%LþVØØþÕÓ Óþ¯L$Lþmæ þ/D DþiÍÍýÊ®ÿÿ þ/D DþiÍÍýáÿÿ þ/D DþiÍ ÍýÌ·ÿÿ þ/D DþiÍ ÍýȨÿÿ þ/D DþiÍ Íþ¿ÿÿ þ/D DþiÍÍý˱ÿÿ þ/D DþiÍÍýÅ£ÿÿ þ/D DþiÍÍþºÿÿ þ/D DþiÍÍýÉ«ÿÿ þ/D DþiÍÍý©ÿÿ þ/D DþiÍÍý̵ÿ!ÿ þ/D DúiÍÍǧÿ"ÿ þ/D Düiͽÿ$ÿ þ/D Dýg¯ÿ%ÿ þ/D DþWÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ&ÿ þ/D DþUÿ%ÿþ¦þ/D DþUÿ$ÿýµÌþ/D DþUÿ"ÿû ÂÍÍþ/D DþUÿ!ÿý­ÊÍÍ þ/D DþUÿ ÿþ¼ÍÍ þ/D DþUÿÿý¦ÇÍÍ þ/D DþUÿÿýµÌÍÍ þ/D DþUÿÿý ÂÍÍ þ/D DþUÿÿý­ÊÍÍ þ/D DþUÿÿþºÍ Í þ/D DþUÿÿý£ÅÍ Í þ/D DþUÿÿý°ËÍ Í þ/D DþUÿÿþ½ÍÍ þ/D DþUÿÿý¥ÇÍÍ þ/D DþUÿÿý²ÌÍÍ þ/D DþUÿÿþ¿ÍÍ þ/D DþUÿÿý¨ÈÍÍ þ/D DþUÿÿýµÌÍÍ þ/D DþUÿ ÿý¸ÂÍÍ þ/D DþUÿ ÿý«ÉÍÍ þ/D DþUÿ ÿþ¸ÍÍ þ/D DþUÿÿý¡ÄÍÍ þ/D DþUÿÿý­ÊÍÍ þ/D DþUÿÿþ»ÍÍ þ/D DþUÿÿý£ÅÍÍ þ/D DþUÿÿý°ËÍÍ þ/D DþUÿÿþ¾Í!Í þ/D DúUÿÿ¦ÇÍ"Í þ/D DûUÿ³ÌÍ#Í þ/D DýVÀÍ%Í þ/D DþfÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ&Í þ/D DþiÍ%ÍþÊþ/D DþiÍ$ÍþÄ¡(ÿýøÁÿ;ÿýç¯ÿ:ÿýýÏÿ;ÿýó¹ÿ;ÿþßÿ;ÿýúÆÿ;ÿýì²ÿ:ÿýþÕÿ;ÿýö½ÿ;ÿýä³ÿ:ÿýüÌÿ;ÿýð·ÿ;ÿþÛÿ;ÿýýÃÿ<ÿþêÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ=ÿþèÿ%ÿþ¶ÿÿþèÿ$ÿýÌüÿÿþèÿ"ÿý®åÿÿþèÿ!ÿýÀ÷ÿÿþèÿ ÿþÙÿÿþèÿÿý¶ïÿÿþèÿÿýÌüÿÿþèÿÿý®åÿÿþèÿÿý¿÷ÿÿþèÿÿþÖÿ!ÿþèÿÿý²ìÿ"ÿþèÿÿýÄùÿ#ÿþèÿÿþÛÿ%ÿþèÿÿýµïÿ&ÿþèÿÿýÈûÿ'ÿþèÿÿþàÿ)ÿþèÿÿý¸òÿ*ÿþèÿÿýÍýÿ+ÿþèÿ ÿý½äÿ-ÿþèÿ ÿý¼õÿ.ÿþèÿ ÿýÒþÿ/ÿþèÿÿý°èÿ1ÿþèÿÿýÀøÿ2ÿþèÿÿþ×ÿ4ÿþèÿÿý²ìÿ5ÿþèÿÿýÄúÿ6ÿþèÿÿþÜÿ8ÿúèÿÿµðÿ9ÿûèÿÉüÿ:ÿýéàÿ<ÿþüÿæÿþøÿ<ÿþè°ÿý´B22ÿýq32 2ÿý¹D2"2ÿýu32#2ÿý½F2%2ÿýy32&2ÿýËJ2(2ÿý62)2ÿýã]2+2ÿý¯>2,2ÿþu2.2 ÿýËK2/2 ÿý6202 ÿýã]222ÿý¯>232ÿýu3242ÿýËK262ÿý‘6262þ3ÿÿýã]272ùHºÿÿ°>262ø5ôüÿv3262ýSÍüüþK262ü9“ûüü72ý\Ýüü52ý9™üü42ýYÚüü22ü8”ûüü12ýVÖü ü/2ü7ûü ü.2ýSÒü ü,2ü6Šúüü+2ýPÍüü)2ü5…øüü(2ýMÉüü&2ü3öüü%2ýBºüü$2ýdéüü"2ý8›üü!2ýPÕüü2ü3÷üü2ýBºüü2ýdéüü2ý8›ü ü2ýPÕü!ü2ü3~÷ü"ü2ýBºü$ü2ýdéü%ü2ý8›ü'ü2ýPÓü(ü2ü3~÷ü)ü2ýBºü+ü2ýdéü,ü 2ý8›ü.ü 2ýPÓü/ü 2ü3~÷ü0ü 2ýB¹ü2ü2ýdéü3ü2ý7™ü5ü2ýKÎü6ü2ýpñü7ü2ý:¥ü9ü2ýQ×ü:üü3zöü;üþ°ü}üÿý¿ZLLÿþ„L!LÿýÃ\L"Lÿþ‡L$LÿýÇ^L%Lÿý‹ML&LÿýÔbL(Lÿý PL)LÿýèrL+Lÿý»WL,Lÿþ‡L.L ÿýÔbL/L ÿý PL0L ÿýèrL2Lÿý»WL3Lÿþ‡L5LÿýÔbL6Lÿý PL7LÿýèrL7Lù_Åÿÿ¼WL6LùO’øÿÿˆL7LýiÖÿÿþbL6LüS¢þÿÿ7Lýqäÿÿ5LýS§ÿÿ4Lýnáÿÿ2LüQ£þÿÿ1LýlÝÿ ÿ/LüPžþÿ ÿ.LýiÚÿ ÿ,LüOšýÿÿ+LýfÖÿÿ)LüO–üÿÿ(LýdÒÿÿ&LüMúÿÿ%LýZÄÿÿ$Lýyîÿÿ"LýR©ÿÿ!LýgÜÿÿLüMûÿÿLýZÄÿÿLýyîÿÿLýR©ÿ ÿLýgÜÿ!ÿLüMûÿ"ÿLýZÄÿ$ÿLýyîÿ%ÿLýR©ÿ'ÿLýgÛÿ(ÿLüMûÿ)ÿLýZÄÿ+ÿLýyîÿ,ÿ LýR©ÿ.ÿ LýgÛÿ/ÿ LüMûÿ0ÿ LýZÃÿ2ÿLýxîÿ3ÿLýQ§ÿ5ÿLýbÖÿ6ÿLýƒöÿ7ÿLýS²ÿ9ÿLýgÞÿ:ÿüLŒúÿ;ÿþ¼ÿ}ÿÿý¬ÉÍÍÿþ½Í!Íÿý«ÈÍ"Íÿþ¼Í$ÍÿýªÈÍ%Íÿþ»Í'Íÿý¦ÇÍ(ÍÿýµÌÍ)Íÿý ÂÍ+Íÿý­ÊÍ,Íÿþ¼Í.Í ÿý¦ÇÍ/Í ÿýµÌÍ0Í ÿý ÂÍ2Íÿý­ÊÍ3Íÿþ¼Í5Íÿý¦ÇÍ6ÍÿýµÌÍ7Íÿý ÂÍ7ÍùÇ«ÿÿ­ÊÍ6Íù̹œšÿ¼Í7ÍýŦššþÇÍ6Íý˵šš7Íý¢šš5Íý˳šš4Íýãšš2ÍýÌ´š š1ÍýĤš š/Íý̶š š.ÍýŤš š,ÍüÌ·›šš+ÍýƦšš)Íü̸›šš(ÍýƧšš'Íýºœšš%ÍýÉ«šš$ÍýÀŸšš"Íý˲šš!ÍýŤšš Íýº›ššÍýÉ«ššÍýÀŸššÍý˲š šÍýŤš!šÍýº›š"šÍýÉ«š$šÍýÀŸš%šÍý˲š'šÍýŤš(šÍýº›š)šÍýÉ«š+šÍýÀŸš,š Íý˲š.š ÍýŤš/š Íýº›š0š ÍýÉ«š2šÍýÀŸš3šÍý̳š5šÍýǦš6šÍý½š7šÍý˰š9šÍýÅ£š:šüÍ»œš;šþ­š}šÿý¾õÿ;ÿþÛÿ;ÿý½ôÿ;ÿþÙÿ;ÿý»òÿ;ÿý×þÿ:ÿý¶ðÿ;ÿýÍüÿ:ÿý¯åÿ;ÿýÀ÷ÿ;ÿþÙÿ;ÿý¶ïÿ;ÿýÍüÿ:ÿý¯åÿ;ÿýÀ÷ÿ;ÿþÙÿ;ÿý¶ïÿ;ÿýÌüÿ:ÿý¯åÿ7ÿùñ¼ÿÿÀ÷ÿ6ÿùýÔ©§ÿÙÿ7ÿýëµ§§þïÿ6ÿýú̧§7ÿýæ°§§5ÿýúɧ§4ÿýè±§§2ÿýû˧ §1ÿýé³§ §/ÿýüͧ §.ÿýë´§ §,ÿüýϨ§§+ÿýíµ§§)ÿüýѨ§§(ÿýî·§§&ÿüþÕ©§§%ÿýõ¼§§$ÿýá­§§"ÿýûȧ§!ÿýì³§§ÿüþÕ¨§§ÿýõ¼§§ÿýá­§§ÿýûȧ §ÿýì³§!§ÿüþÕ¨§"§ÿýõ¼§$§ÿýá­§%§ÿýûȧ'§ÿýì³§(§ÿüþÕ¨§)§ÿýõ¼§+§ÿýá­§,§ ÿýûȧ.§ ÿýì³§/§ ÿüþÕ¨§0§ ÿýõ½§2§ÿýâ­§3§ÿýüɧ5§ÿýïµ§6§ÿýÛª§7§ÿýúħ9§ÿýì²§:§üÿש§;§þÀ§}§2ýJ¬üüþ›‡ ‡2üB›úüüþ؇ ‡2ü9Šòüüþ¡‡‡2ü3jàüüý߈‡‡2ýN½üüþ§‡‡2ü<•úüüý扇‡2ü3qçü!üþ­‡‡2ýSÇü#üý튇‡ 2ý?žü&üþ³‡‡ 2ü5zíü'üýò‡‡ 2ýZÐü*üþº‡‡2ýC©ü,üýö‡‡2ü5òü.üþÁ‡‡2ýRÌü0üýù“‡‡2ü9’úü2üþɇ‡2ý`Üü4üýû—‡‡ü2?¦ü7üþч‡ýoêü9üüœ‡‡ü;üüÙ‡‡ü<üý¢‡ü<üýáˆü=üþ¨ü=üþèü ?üLýa¸ÿÿþÛÓ ÓLüZ©ýÿÿþñÓ ÓLüRš÷ÿÿþÝÓÓLý~æÿÿþôÓÓLýeÇÿÿþßÓÓLüU¤ýÿÿý÷ÔÓÓLüM„ìÿ!ÿþáÓÓLýiÐÿ#ÿýùÔÓÓ LýX¬ÿ&ÿþäÓÓ LüNŒñÿ'ÿýûÕÓÓ LýpØÿ*ÿþæÓÓLý[µÿ,ÿýýÖÓÓLüN÷ÿ.ÿþéÓÓLýhÕÿ0ÿýþØÓÓLüR¡ýÿ2ÿþìÓÓLýuãÿ5ÿþÙÓÓüLX³ÿ7ÿþïÓÓý‚ïÿ9ÿüÛÓÓÿ;ÿüòÓÓÿ<ÿýÝÓÿ<ÿýõÓÿ=ÿþßÿ=ÿþøÿ ?ÿÍýÇ®ššþSD DÍüɲ›ššþD DÍüË·œššþWDDÍý¿¡ššþ…DDÍýƪššþ[DDÍüÊ´›ššýŠEDDÍý½Ÿš!šþ`DDÍýŧš#šýFDD Íýʲš&šþeDD ÍüÌ»žš'šý“HDD ÍýÃ¥š*šþjDDÍýɯš,šý–JDDÍü̹œš.šþoDDÍýŦš0šý˜MDDÍü˵›š2šþuDDÍýÁ¢š4šý™PDDüÍʰš7šþ{DDý¾žš9šüTDDš;šüDDš<šýXDš<šý†Eš=šþ\š=šþ‹š ?šÿýð§§þêÿ#ÿüõȨ§§þ»ÿ!ÿüûϪ§§þäÿÿý߯§§ý·þÿÿýî»§§þßÿÿüøË¨§§ý²ýÿÿüþÛ­§!§þÚÿÿý븧#§ý¯ûÿÿýöǧ&§þÕÿÿüý׫§'§ý¬ùÿÿýç´§*§þÏÿ ÿýôç,§ýªöÿ ÿüýÔª§.§þÊÿ ÿýë¶§0§ý¨òÿÿüų̂§2§þÄÿÿýä±§5§þíÿÿýöħ7§þ¿ÿÿýܬ§9§üéÿÿ§;§üºÿÿ§<§ýãÿ§<§ýµþ§=§þÞ§=§þ±§ ?§‡þ¯Ã"ÃýÁ‡‡ýÂÃ"Ãþ«‡‡þ«Ã"Ãý‡‡ýÁÃ"Ãþ®‡‡þ¨Ã#Ãþ’‡‡ý‹ÀÃ"Ãþ²‡‡þ¤Ã#Ãþ•‡‡ýоÃ"Ãþ¶‡‡þ Ã#Ãþ™‡‡ýˆ¼Ã"Ãþ¹‡‡þÃ#Ãþ‡‡þ¹Ã"Ãý¼ˆ‡‡þ™Ã#Ãþ¡‡‡þµÃ"Ãý¾Š‡‡þ•Ã#Ãþ¤‡‡þ²Ã"ÃýÀ‹‡‡þ’Ã#Ãþ¨‡‡þ®Ã"ÃýÁ‡‡ýÂÃ"Ãþ«‡‡þ«Ã"Ãý‡‡ýÁÃ"Ãþ¯‡‡þ§Ã#Ãþ“‡ ‡þ‰‡ ‡ý‹¿Ã"Ãþ³‡ ‡þ¯‡ ‡þ£Ã#Ãþ–‡‡ý ‡ý‰½Ã"Ãþ¶‡‡ýüµ‡ ‡þ Ã#Ãþš‡‡üüó‡ ‡ýˆ»Ã"Ãý¹ˆ‡‡üþ¼‡ ‡þœÃ#Ãþž‡‡üý÷‡ ‡þ¸Ã"Ãý¼‰‡‡üþÇ ‡þ˜Ã#Ãþ¡‡‡üýú”‡ ‡þµÃ"Ãý¾Š‡‡üþˇ ‡þ•Ã#Ãþ¥‡‡üþ™‡ ‡þ±Ã"ÃýÀŒ‡‡üþÓ‡ ‡þ‘Ã#Ãþ©‡‡üþž‡ ‡þ­Ã"ÃýÂŽ‡‡üþ܇ ‡ýÂÃ"Ãþ¬‡‡üþ£‡ ‡þªÃ#Ãþ‘‡‡üý㈇ ‡ýŒÁÃ"Ãþ°‡‡üþª‡ ‡þ¦Ã#Ãü”‡‡üüý鉇 ‡ýŠ¿Ã"Ãü´‡‡üüþ°‡ ‡þ¢Ã#Ãý—‡üüý ‡ý‰½Ã"Ãý·‡üüþ·‡ ‡þŸÃ#Ãþ›üüýôއ ‡ýˆºÃ"Ãþºü üþ¾‡ ‡þ›Ã#à üýø‘‡ ‡þ·Ã"à üþŇ ‡þ—Ã"à üýû•‡ ‡þ´Ã!à üþ͇ ‡þ”Ã!à üþš‡ ‡þ°Ã à üþÕ‡ ‡þ‘à ÃüþŸ‡ ‡þ¬ÃÃüþ݇ ‡ýŽÂÃÃüþ¥‡ ‡þ©ÃÃüý切 ‡ýŒÀÃÃüþ«‡ ‡þ¥ÃÃüý늇 ‡ýоÃÃüþ²‡ ‡þ¢ÃÃüýðŒ‡ ‡ý‰¼ÃÃüþ¹‡ ‡þžÃÃüýõ‡ ‡ýˆ¹ÃÃüþÀ‡ ‡þšÃÃüýù’‡ ‡þ¶ÃÃüþLJ ‡þ–ÃÃÓþÖØ#ØÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÖØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÖÓÓþÖØ#ØÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓ$ØþÖÓÓþÕØ#ØþÔÓ ÓþÔÓ Óþר"ØþÖÓ ÓþâÓ ÓþÕØ#ØþÔÓÓýúÔÓ Óþר"Øþ×ÓÓýÿäÓ ÓþÕØ#ØþÔÓÓüÿüÕÓ Óþר"Øþ×ÓÓÿþçÓ ÓþÕØ#ØþÕÓÓÿýý×Ó Óþר"Øþ×ÓÓÿþêÓ ÓþÔØ#ØþÕÓÓÿýþØÓ Óþר"Øþ×ÓÓÿþíÓ ÓþÔØ#ØþÕÓÓÿþÚÓ ÓþÖØ"Øþ×ÓÓÿþðÓ ÓþÔØ#ØþÖÓÓÿþÜÓ ÓþÖØ#ØþÔÓÓÿþóÓ ÓþÔØ#ØþÖÓÓÿþÞÓ ÓþÖØ#ØþÔÓÓÿþõÓ Ó$ØþÖÓÓÿþàÓ ÓþÕØ#ØüÔÓÓÿÿýøÔÓ Óþר"ØüÖÓÓÿÿþâÓ ÓþÕØ#ØýÔÓÿÿýúÕÓ Óþר"Øý×ÓÿÿþåÓ ÓþÕØ#ØþÕÿÿýüÖÓ Óþר"Øþ×ÿ ÿþèÓ ÓþÕØ#Ø ÿýý×Ó Óþר"Ø ÿþêÓ ÓþÔØ"Ø ÿýþØÓ ÓþÖØ!Ø ÿþíÓ ÓþÔØ!Ø ÿþÚÓ ÓþÖØ Ø ÿþñÓ ÓþÔØ ØÿþÜÓ ÓþÖØØÿþóÓ ÓþÔØØÿþÞÓ ÓþÖØØÿþöÓ ÓþרØÿþáÓ ÓþÕØØÿýøÔÓ ÓþרØÿþãÓ ÓþÕØØÿýûÕÓ ÓþרØÿþæÓ ÓþÕØØÿýüÖÓ ÓþרØÿþèÓ ÓþÔØØÿýþ×Ó ÓþרØÿþëÓ ÓþÔØØDþ!"ý?DDý<"þ%DDþ$"ý=DDý>"þ!DDþ'#þ:DDý@"þDDþ*#þ7DDýB"þDDþ.#þ4DDýC"þDDþ1#þ1DDþ"ýCDDþ4#þ-DDþ"ýBDDþ7#þ*DDþ"ý@DDþ:#þ'DDþ!"ý>DDý="þ$DDþ%"ýDDšþ‚D Dý="þ#DDšþYD Dþ%#þ;DDšý‡ED Dý?"þ DDšþ^D Dþ)#ü9DDššýŒFD DýA"üDDššþbD Dþ,#ý6Dššý‘GD DýB"ýDššþgD Dþ/#þ2ššý”ID DýC"þš šþlD Dþ2# šý—KD Dþ" šþrD Dþ6" šý™ND Dþ! šþwD Dþ9! šþRD Dþ   šþ~D Dþ; šþVD Dþ#šþ„D Dý>šþZD Dþ&šý‰ED Dý@šþ_D Dþ)šýFD DýAšþcD Dþ-šý’HD DýCšþhD Dþ0šý•JD DýCšþnD Dþ3šý—LD DþšþsD Dþ6€ÿþýÿ=ÿþØÿ=ÿý®ûÿ<ÿý§Óÿ<ÿü§«øÿ;ÿ§þÎÿ;ÿ§ý©õÿ:ÿ§þÈÿ:ÿ§ý¨ñÿ9ÿ§þÃÿ9ÿ§þìÿ8ÿ§þ¾ÿ8ÿ§þçÿ7ÿ§þ¹ÿ7ÿ§þâÿ6ÿ§ý´þÿ5ÿ§þÜÿ5ÿ§ý±üÿ4ÿ§þ×ÿ4ÿ§ý®úÿ3ÿ §þÒÿ3ÿ §ý«÷ÿ2ÿ §þÍÿ2ÿ §ý©ôÿ1ÿ §þÇÿ1ÿ §ý¨ðÿ0ÿ §þÂÿ0ÿ §þëÿ/ÿ §þ¼ÿ/ÿ§þæÿ.ÿ§þ¸ÿ.ÿ§þáÿ-ÿ§ý³þÿ,ÿ§þÛÿ,ÿ§ý°üÿ+ÿ§þÖÿ+ÿ§ý­ùÿ*ÿ§þÐÿ*ÿ§ýªöÿ)ÿ§þËÿ)ÿ§ý©óÿ(ÿ§þÆÿ(ÿ‡þ¹ÃÇþšÃà ‡þ¶Ãà ‡þ–ÃÃ!‡þ²ÃÃ!‡þ“ÃÃ"‡þ¯ÃÃ"‡ýÂÃÃ#‡þ«ÃÃ#‡ýÁÃÃ$‡þ§ÃÃ$‡ý‹ÀÃÃ%‡þ¤ÃÃ%‡ý‰¾ÃÃ&‡þ ÃÃ&‡ýˆ»ÃÃ'‡þÃÃ(‡þ¸ÃÃ(‡þ™ÃÃ)‡þµÃÃ)‡þ•ÃÃ*‡þ²ÃÃ*‡þ’ÃÃ+‡þ®ÃÃ+‡ýÂÃÃ,‡þªÃÃ,‡ýÁÃÃ-‡þ¦ÃÃ-‡ý‹¿ÃÃ.‡þ£ÃÃ.‡ý‰½Ã Ã/‡þŸÃ Ã/‡ýˆ»Ã Ã0‡þœÃ Ã1‡þ¸Ã Ã1‡þ˜Ã Ã2‡þ´Ã Ã2‡þ”à Ã3‡þ±Ã Ã3‡þ‘à Ã4‡þ­ÃÃ4‡ýÂÃÃ5‡þ©ÃÃþˆ‡3‡ýŒÁÃÃþŸ‡4‡þ¦ÃÃý½‰‡3‡ýŠ¿ÃÃþ¢‡4‡þ¢ÃÃý¿Š‡4‡þ±ÃÃþ¦‡4‡ýйÃÃýÁŒ‡4‡ý¿ÃÃþª‡5‡ý—ÂÃÃý‡5‡þ ÃÃþ­‡6‡ý“³ÃÃþ‘‡7‡þ–ÃÃþ±‡8‡Ãþ”‡7‡Ãþµ‡7‡Ãþ˜‡6‡Ãþ¸‡6‡Ãþœ‡5‡Ãý»ˆ‡4‡Ãþ ‡4‡Ãý½‰‡3‡ Ãþ£‡3‡ÓþרØÓþÔØØ ÓþרØ ÓþÔØØ!ÓþÖØØ!ÓþÔØØ"ÓþÖØØ"ÓþÔØØ#ÓþÖØØ$ÓØ$ÓþÖØØ%ÓþרØ%ÓþÕØØ&ÓþרØ&ÓþÕØØ'ÓþרØ'ÓþÕØØ(ÓþרØ(ÓþÔØØ)ÓþרØ)ÓþÔØØ*ÓþÖØØ*ÓþÔØØ+ÓþÖØØ+ÓþÔØØ,ÓþÖØØ-ÓØ-ÓþÕØØ.ÓþרØ.ÓþÕØØ/Óþר Ø/ÓþÕØ Ø0Óþר Ø0ÓþÕØ Ø1Óþר Ø1ÓþÔØ Ø2Óþר Ø2ÓþÔØ Ø3ÓþÖØ Ø3ÓþÔØ Ø4ÓþÖØØ4ÓþÔØØ5ÓþÖØØ6ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþרØþÕÓ4ÓþÕØØþ×Ó5ÓþÖØØþÕÓ5ÓþרØ6ÓýÔרØþÖÓ5ÓþÔØØþÔÓ5ÓþÕØØþÖÓ6ÓýÔÖØØþÔÓ7ÓþÔØØþÖÓ8ÓØþÔÓ7ÓØþ×Ó7ÓØþÔÓ6ÓØþ×Ó6ÓØþÕÓ5ÓØþ×Ó5ÓØþÕÓ4ÓØþ×Ó4Ó ØþÕÓ3ÓDþDþ3 Dþ Dþ7!Dþ!Dþ:"Dþ!"Dý<#Dþ$#Dý?$Dþ'$Dý@%Dþ*%DýB&Dþ.&DýC'Dþ1(Dþ(Dþ4)Dþ)Dþ7*Dþ*Dþ:+Dþ"+Dý=,Dþ%,Dý?-Dþ(-DýA.Dþ+.DýB /Dþ/ /DýC 0Dþ2 1Dþ 1Dþ5 2Dþ 2Dþ8 3Dþ 3Dþ; 4Dþ"4Dý=5Dþ&þCD3Dý?þ/D4Dþ)ýBD3DýAþ,D4Dþ,ýAD4Dþþ)D4DýAý?D4Dý=þ%D5Dý6ý=D5Dþ.þ"D6Dý:þ;D7Dþ7þD8Dþ8D7DþD7Dþ5D6DþD6Dþ2D5DýCD4Dþ.D4DýBD3D þ+D3DÿÃþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãþ‹‡%‡Ãýˆ‡%‡Ãþ»‡&‡Ãþ²‡&‡Ãþª‡&‡Ãþ ‡&‡Ãý¾Š‡&‡Ãþ¢‡'‡Ãý½‰‡'‡ÃþŸ‡(‡Ãý»ˆ‡(‡ÃýÁ˜‡)‡Ãý¾”‡*‡Ãý¸Ž‡+‡Ãý°Š‡,‡þ¶Ã Ãý½¥‡/‡üš¸ÂÃÃü¸¦“‡4‡øŒ’˜£ Ž‡4‡Ø'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØ'ÓØþ×Ó&ÓØþÖÓ&ÓØþÖÓ&ÓØþÕÓ&ÓØþ×Ó'ÓØþÕÓ'ÓØþ×Ó(ÓØþÕÓ(ÓØþ×Ó)ÓØþÔÓ)ÓØý×ÔÓ*ÓØý×ÔÓ+ÓØþÖÓ-Óþר Øý×ÕÓ/ÓýÔרØü×ÕÔÓ5ÓÔÕþÔÓ4Óþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%Dþ@D%DýCD%DþD&DþD&Dþ%D&Dþ.D&DýAD&Dþ-D'DýCD'Dþ/D(DýCD(Dý5D)Dý9D*Dý>D+DýBD,Dþ ý*D/Dü3ü)9D4Dø?:50+.>D4Dÿ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡þôüÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓþüÿDþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dþ”š=ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿþ«§üûö¥Z322üüØA22üûø¬_422"üüÝ…C22$üûû²c522'üüãŠF22)üûû±^322,üü×z<22.üüñ™N2 21üü¾g52 23üüá…A225üü÷¦V228üüÌq822:üúìG22ü;üüû³`ü ?üÿûú²pMLLÿüßYLLÿûü¸tMLL"ÿüä•[LL$ÿûþ½xNLL'ÿüèš]LL)ÿûþ½sMLL,ÿüÞŒTLL.ÿüö¨eL L1ÿüÈ{OL L3ÿüç•YLL5ÿüû³lLL8ÿüÕ„RLL:ÿúð _LLÿ;ÿüþ¾uÿ ?ÿšüœ°ÃÍ Íšü£¹ÉÍÍšü›®ÂÍÍ"šü¢¸ÉÍÍ%šü­ÁÌÍÍ'šü ·ÈÍÍ*šý­ÂÍÍ,šü£»ËÍÍ.šü³ÆÍ Í1šüªÀÌÍ Í3šü¡¸ÉÍÍ5šü›°ÄÍÍ8šü¦½ËÍÍ:šúžµÈÍÍš<šý¬Áš ?š§û©Äçþÿÿ§ü²Ôöÿÿ§û¨Âäþÿÿ"§ü°Òôÿÿ%§ü¿âýÿÿ'§ü¯Ïóÿÿ*§üÀåþÿÿ,§ü²×ùÿÿ.§üªÉîÿ ÿ1§ü»àýÿ ÿ3§ü¯Òõÿÿ5§ü¨Äéÿÿ8§ü¶Ûûÿÿ:§ú¬Íòÿÿ§<§ý¿ä§ ?§22üA‚ć‡42ý3}‡‡52þH‡‡62þt‡‡62þL‡‡72þx‡‡72þP‡‡72ý3{‡‡82þT‡‡82ý4~‡‡92þU‡‡92ý4}‡‡:2þT‡‡:2ý4|‡‡þ3292þR‡‡üÙ|=272ö3{‡‡üüòœO262üQ‡‡üüüÁi6232ü3y‡üüüä‡B222ýL‡üüüø©X212þsü üüÎt92.2þEü üüí’I2-2üü¶a42*2üüÛ~=2(2üüôžQ2&2üüÅp92#2üüî˜P2!2üüÇq922üüð™Q22!üüÊt:22#üüñœS22&üüÌu;22(üüòžT22+üüÎw=22-üû÷¯i82 20üûñ£`52 23üûè˜W3226üüÞŒO229üüÑ‚G22<üüÄxAü=üþúü¿ü2LüY“ÞÓÓ4LýM»ÓÓ5LþnÓÓ6LþµÓÓ6LþuÓÓ6LýM»ÓÓ7Lþ{ÓÓ7LýNÀÓÓ8LþÓÓ8LýOÅÓÓ9Lþ„ÓÓ9LýOÃÓÓ:Lþ‚ÓÓ:LýOÂÓÓþML9LþÓÓüàUL7LöNÀÓÓÿÿ÷ªfL6Lü}ÓÓÿÿüË}OL3LüM½Óÿÿüé—ZL2LývÓÿÿüüµnL1Lþ³ÿ ÿüÖ†RL.Lþjÿ ÿüñ¡`L-LÿüÁvML*LÿüâVL(Lÿüø¬gL&Lÿü΃RL#Lÿüò¦fL!LÿüЄSLLÿüô¨hLL!ÿüÓ†TLL#ÿüöªiLL&ÿüÕ‡TLL(ÿü÷¬kLL+ÿüÖ‰VLL-ÿûû»|RL L0ÿûö°uOL L3ÿûí¦mMLL6ÿüåœfLL9ÿüÙ“^LL<ÿüΊYÿ=ÿþýÿ¿ÿ2ÍüɹˆDD5ÍþcDD5ÍþªDD6ÍþbDD6Íþ¤DD6ÍýÌ\DD7ÍþDD7ÍýËWDD8Íþ—DD8ÍýÊSDD9Íþ”DD9ÍýÊTDD:Íþ–DD:ÍýÊVDD;Íþ™DDü£ºÊÍ7ÍöËWDDššœ²ÆÍ6Íü›DDššü©¿ÌÍ3ÍüÌZDššü ¸ÉÍ2Íý£Dššü›¯ÃÍ1Íþdš šü¦¼ËÍ.Íþ®š šüžµÇÍ-Íšý¬ÁÍ+Íšü¢ºÊÍ(Íšüœ²ÅÍ&Íšü¨½ËÍ#Íšüž³ÆÍ!Íšü§½ËÍÍšü³ÅÍÍ!šü§¼ËÍÍ#šü²ÅÍÍ&šü¦¼ËÍÍ(šüœ²ÄÍÍ+šü¦¼ÊÍÍ-šû›­¿ËÍ Í0šû±ÁÌÍ Í3šüŸ³ÄÍÍ6šü¢¶ÆÍÍ9šü¥¹ÈÍÍ<šü¨»Éš=šþ›š¿š2ÿüõÓÂÿ=ÿýþøÿÿþþÿ=ÿü²Öøÿ;ÿ§üªÈíÿ9ÿ§üºßýÿ6ÿ§ü®Ñõÿ4ÿ§ü¨Ãèÿ2ÿ §üµÚûÿ/ÿ §ü«Ìñÿ-ÿ§ü¾ãþÿ*ÿ§ü±Õøÿ(ÿ§ü©Çìÿ&ÿ§ü¸Ûûÿ#ÿ§ü«Êíÿ!ÿ§ü¸Ûúÿÿ§üªÉìÿÿ!§ü·Úùÿÿ#§üªÈëÿÿ&§ü¶Ùùÿÿ(§üªÇêÿÿ+§üµØøÿÿ-§û¨Àßûÿ ÿ0§ûªÅäýÿ ÿ3§û­Êéþÿÿ6§ü°Îíÿÿ9§ü´Óòÿÿ<§ü¹Øö§=§þ¨§¿§‡þ¢Ã"Ãý¿‹‡‡ýŠ¿Ã"Ãþ§‡‡þ¥Ã"ÃýÁއ‡ý‹ÀÃ"Ãþ¯‡‡þ¦Ã#Ãþ–‡‡ý‹ÀÃ"Ãý¸ˆ‡‡þ¥Ã#Ãþ ‡‡ý‹¿Ã"Ãý¿‹‡‡þ¤Ã#Ãþ©‡‡ýŠ¿Ã"ÃýÂ’‡‡þ¤Ã#Ãþµ‡‡ý‰½Ã#Ãþž‡‡þžÃ#Ãý¿‹‡‡ýˆ¹Ã#Ãþ¬‡‡þ™Ã$Ãþ”‡‡þµÃ#Ãý¸ˆ‡‡þ”Ã$Ãþ£‡‡þ°Ã#ÃýÁ‡‡ýÂÃ#Ãþµ‡‡þ©Ã$Ãþ ‡‡ý‹¿Ã#ÃýÁއ‡þl‡ ‡þ Ã$Ãþ³‡‡ý?†‡ ‡ýˆ¹Ã$ÃþŸ‡‡ý2d‡ ‡þ—Ã$ÃýÁ‡‡ü2:ƒ‡ ‡þ±Ã$Ãý¶ˆ‡‡2þ]‡ ‡ýÂÃ$Ãþ¤‡‡2ý6~‡ ‡þ¦Ã$Ãý“‡‡2þP‡ ‡ý‰»Ã$Ãýº‰‡‡2þt‡ ‡þ˜Ã%Ãþ©‡‡2þC‡ ‡þ¯Ã%Ãþ™‡‡2þg‡ ‡ýÀÃ$Ãû¿‡‡22ý:‚‡ ‡þ¡Ã%Ãüµˆ‡22þY‡ ‡ýˆ¸Ã%Ãý¥‡22ý4y‡ ‡þ”Ã&Ãþ–22þG‡ ‡þ©Ã%Ãþ½22þh‡ ‡ýмÃ%Ã2ý9‡ ‡þ—Ã%Ã2þT‡ ‡þ¬Ã$Ã2ý3u‡ ‡ý‹½Ã#à 2ýB†‡ ‡þ™Ã#Ãü¸o;22þa‡ ‡þ®Ã"Ãüûõ«f:22ý5|‡ ‡ý‹½Ã!Ãü÷÷»O322H‡ ‡þ—Ã!Ãüúå i>f‡ ‡þªÃ à üýûÁ‡ ‡ý‰ºÃà üþ͇ ‡ý”ÂÃÃüþ¥‡ ‡þ¥ÃÃüýî‡ ‡ýˆ·ÃÃüþˇ ‡ýÀÃÃüþ¨‡ ‡þœÃÃüýò‘‡ ‡þ¬ÃÃüýÕˆ‡ ‡ý‰ºÃÃüþ°‡ ‡ý’ÁÃÃüý÷•‡ ‡þ ÃÃüý݉‡ ‡þ±ÃÃüþ¸‡ ‡ý‹»ÃÃüýû‡ ‡ý’ÁÃÃüý쎇 ‡þÃÃüþЇ‡þ«ÃÃüþ±‡ ‡ýˆ·ÃÃüýù™‡ ‡ý޾ÃÃüý指 ‡ý–ÂÃÃüþȇ‡þ ÃÃüþ­‡‡þ«ÃÃÓþÕØ"Øþ×ÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÕØ#ØþÖÓÓþר#ØþÔÓÓþÕØ#Øþ×ÓÓþר#ØþÕÓÓþÕØ#Øþ×ÓÓþר#ØþÖÓÓþÔØ$ØþÔÓÓþר#Øþ×ÓÓþÔØ$ØþÕÓÓþÖØ$ØþÔÓÓþÔØ$Øþ×ÓÓþÖØ$ØþÕÓÓþר#Øý×ÔÓÓþ¨Ó ÓþÕØ$ØþÖÓÓý`ÑÓ Óþר$ØþÕÓÓýLœÓ ÓþÔØ$Øý×ÔÓÓüLXÍÓ ÓþÖØ$Øþ×ÓÓLþ‘Ó ÓþÔØ%ØþÕÓÓLýRÅÓ ÓþÕØ%ØþÔÓÓLþ|Ó Óþר$Øþ×ÓÓLýMµÓ ÓþÔØ%ØþÖÓÓLýhÒÓ ÓþÖØ%ØþÔÓÓLþ Ó Óþר$Øþ×ÓÓLýXÌÓ ÓþÕØ%Øü×ÓÓLLþ‰Ó Óþר%ØýÕÓLLýO½Ó ÓþÔØ&ØþÔLLþmÓ ÓþÖØ%Øþ×LLþ¢Ó Óþר%ØLýXÊÓ ÓþÔØ%ØLþƒÓ ÓþÖØ$ØLýM¶Ó Óþר#Ø LýfÑÓ ÓþÔØ#Øü‚TLLþ—Ó ÓþÖØ"Øÿûù·{TLLýQÁÓ Óþר!Øÿ÷ûÆfMLLoÓ ÓþÔØ!Øÿúê®}WžÓ ÓþÖØ Ø ÿüþÏÎÓ ÓþרØ ÿþíÓ ÓþÔØØÿþÞÓ ÓþÕØØÿýúÕÓ ÓþרØÿþíÓ ÓýÔרØÿþßÓ ÓþÕØØÿýû×Ó ÓþÖØØÿþðÓÓþרØÿþâÓ ÓþÔØØÿýýØÓ ÓþÕØØÿýóÔÓ ÓþÖØØÿþåÓÓþרØÿýþÛÓ ÓþÔØØÿýùÖÓ ÓþÕØØÿþîÓÓþÖØØÿþãÓÓþרØÿýþÚÓ ÓýÔרØÿý÷ÕÓ ÓþÔØØÿþëÓÓþÕØØÿþáÓÓþÖØØDþ,"ýADDýA"þ(DDþ)"ý>DDý@"þ DDþ)#þ7DDýA"ýCDDþ)#þ.DDýA"ý@DDþ*#þ&DDýA"ý;DDþ+#þDDýB#þ0DDþ/#ý@DDýC#þ$DDþ4$þ8DDþ#ýCDDþ8$þ+DDþ #ýDDþpD Dþ.$þDDý¹FD DýC$þ/DDýÍ|D Dþ6$ý=DDüÍÁJD Dþ$ýCDDÍþ‡D Dý<$þ*DDÍýÇSD Dþ)$ý:DDÍþœD DýB$ýBDDÍýÌcD Dþ5%þ&DDÍý±ED Dþ!%þ4DDÍþxD Dý?$û>DDÍÍýÁLD Dþ-%üCDÍÍþD DýC%ý)DÍÍýÊZD Dþ8&þ7ÍÍþ«D Dþ&%þÍÍþvD DýB%ÍýÁMD Dþ6%Íþ–D Dþ$$ÍýÌbD DýA# Íý³FD Dþ4#ü«¾ËÍÍþD Dþ!"šûœ¯ÀËÍÍýÈVD Dý@!šû›ª¹ÆÍÍþªD Dþ6!šú ±¿ÊzD Dþ%  šý ND DýB šþxD Dý9šþZD Dþ)šýID DýCšþvD Dý=šþ\D Dþ1šý“KD Dþ#šþ}D DýBšþbD Dý:šý–ND Dþ.šý„ED DþšþhD DýAšý™TD Dý:šýŽID Dþ0šþzDDþ%šþcD DýCšý—QD Dý>šýŠGD Dý7šþtDDþ.šþ`DDþ$ ÿü½Üùÿ;ÿ§û©Âàùÿ8ÿ§ú¨¼Ôíþÿ4ÿ§û®Æß÷ÿ1ÿ §ý¼úÿ/ÿ §þÂÿ/ÿ§þáÿ.ÿ§ý®øÿ-ÿ§þÃÿ-ÿ§þÞÿ,ÿ§ý¬ôÿ+ÿ§ý½þÿ*ÿ§þ×ÿ*ÿ§ý©ðÿ)ÿ§ý¸ýÿ(ÿ§þÑÿ(ÿ§ý¨èÿ'ÿ§ý¯÷ÿ&ÿ§þÀÿ&ÿ§þ×ÿ%ÿ§ý©ìÿ$ÿ§ý²úÿ#ÿ§þÅÿ#ÿ§þÚÿ"ÿ*‡ýŒÀÃÃ+‡þŸÃÃ,‡þµÃÃ,‡ýÁÃÃ-‡þ¢ÃÃ.‡þµÃÃ.‡ýÁà Ã/‡þ Ã Ã0‡þ²Ã Ã0‡ý¿Ã Ã1‡þšÃ Ã2‡þ¬Ã Ã2‡ýŠ»Ã Ã3‡ý“ÂÃÃ4‡þ¡ÃÃ5‡þ±ÃÃ5‡ý‹¼ÃÃ6‡ý”ÂÃÃ7‡þŸÃÃ8‡þ¬ÃÃ8‡ý‰·ÃÃ9‡ý޾ÃÃ:‡ý–ÂÃÃ;‡þ ÃÃ<‡üªÃÇ;‡üˆ³Ã‡<‡ý‹¹‡=‡þ‡‡þŒ‡=‡ý´ˆ‡<‡ýç‡<‡Ãþ™‡;‡ÃýÀ‡:‡Ãý¸‰‡9‡Ãþ­‡9‡Ãþ¢‡8‡Ãþ˜‡7‡ÃýÀ‡6‡Ãýº‹‡5‡Ãþ²‡5‡Ãþ©‡4‡ Ãþ¡‡3‡ Ãþ™‡2‡ ÃýÁ“‡1‡ Ãý¾Ž‡0‡ Ãý¹‹‡/‡ Ãýµ‰‡.‡Ãý±ˆ‡-‡Ãþ¬‡-‡Ãþ§‡,‡Ãþ¡‡+‡Ãþ‡*‡Ãþ›‡)‡Ãý™‡(‡Ãý˜‡'‡ÃýÁ—‡&‡ÃýÁ•‡%‡ÃýÁ–‡$‡+ÓþרØ+ÓþÕØØ,ÓþרØ,ÓþÔØØ-ÓþÕØØ.ÓþרØ.ÓþÔØØ/ÓþÕØ Ø0ÓþÖØ Ø1Óþר Ø1ÓþÔØ Ø2ÓþÖØ Ø3Óþר Ø3ÓþÔØ Ø4ÓþÕØØ5ÓþÖØØ6ÓþרØ6ÓþÔØØ7ÓþÕØØ8ÓþÖØØ9ÓþרØ9ÓýÔרØ:ÓþÔØØ;ÓþÕØØ<ÓüÖØØÓ<ÓýÖØÓ=Óþ×Ó=ÓþÔÓ¿Óþ×Ó=ÓýØÕÓ<ÓØþÔÓ;ÓØý×ÔÓ:ÓØþ×Ó:ÓØþÖÓ9ÓØþÕÓ8ÓØþÔÓ7ÓØý×ÔÓ6ÓØþ×Ó6ÓØþÖÓ5ÓØþÖÓ4Ó ØþÕÓ3Ó ØþÔÓ2Ó ØþÔÓ1Ó Øý×ÔÓ0Ó Øþ×Ó0Ó Øþ×Ó/ÓØþÖÓ.ÓØþÖÓ-ÓØþÕÓ,ÓØþÕÓ+ÓØþÕÓ*ÓØþÕÓ)ÓØþÔÓ(ÓØþÔÓ'ÓØþÔÓ&ÓØþÔÓ%ÓØý×ÔÓ$Ó*Dý?+Dþ/,Dþ,Dý<-Dþ-.Dþ.Dý< /Dþ. 0Dþ 0Dý? 1Dþ3 2Dþ# 2DýA 3Dý94Dþ-5Dþ5Dý@6Dý87Dþ.8Dþ#8DýC9Dý>:Dý6;Dþ.D0D ýAD/D ýBD.DýCD-Dþ#D-Dþ(D,Dþ-D+Dþ1D*Dþ2D)Dý4D(Dý5D'Dý6D&Dý7D%Dý7D$DÿÃý·‰‡‡þÃÿÿüÐ}=ÃÃþ¬‡‡ýˆÌÿÿüí”Q22Ãþ¢‡‡ý‰Ñÿ ÿü«b522Ãþ™‡‡ýŠÕÿ ÿüÄt=22ÃýÁ“‡‡ý‹Öÿÿü݉I2 2Ãý½‡‡ýŠÕÿÿüŸY32 2Ãý¸Š‡‡úŠÎ¬k922Ãý³ˆ‡‡ý„I22Ãþ®‡‡ý…L22Ãþ¨‡‡ý†Q22Ãþ¤‡‡þW2 2Ãþ¡‡‡þ^2 2ÃþŸ‡‡ýh42 2Ãþ‡‡ýq72 2 Ãþ‡‡ýy=22!Ãþ‡‡ý€G22"Ãþž‡‡ý…T22#Ãþ ‡‡ýc422$Ãþ£‡‡ýt;22%Ãþ§‡‡ý€I22&Ãþ«‡‡ú†^322Ã&Ãý°‰‡‡üt=2Ã'Ãýµ‹‡‡ý‚OÃ(Ãýº‡‡*Ãý¾•‡‡+Ãý‡‡-Ãþ¨‡‡þ¿Ã,Ãý±‹‡ ‡ý”ÁÃ,Ãý»’‡ ‡ý˜ÂÃ,ÃýÁ‡ ‡þÃ.Ãý«‰‡ ‡þ£Ã.Ãý¸‡ ‡þ©Ã.ÃýÁž‡ ‡þ­Ã/Ãý¯‹‡ ‡ýˆ¯Ã/Ãý½—‡ ‡ýˆ±Ã0Ãý©‰‡ ‡ý‰´Ã0Ãýº“‡ ‡ý‰´Ã0Ãü§‰‡‡ý‰´Ã1Ãý»—‡‡ý‰³Ã2à ‡ý‰³Ã1à ‡ý‰±Ã0à ‡ýˆ®Ã/ÇþªÃ.Çþ¦Ã-Çþ¢Ã,ÇýœÂÃ*Çý•¿Ã)Çý»Ã(ÇýŒ·Ã'Çý‰¯Ã&Çþ¥Ã%ÇýšÁÃ#Çý’¼Ã"ÇýŒ³Ã!Çþ¦Ã Çý™¿ÃÇý·ÃÇýˆ©ÃÃ!‡ý™¾ÃÃ"‡ý´ÃÃ$‡ý¢ÁÃÃ%‡ý·ÃÃ&‡üˆ¤ÂÃÃØþ×ÓÓþêÿÿüØVØØþÖÓÓþíÿÿüñ£gLLØþÕÓÓýÔïÿ ÿü·vOLLØþÔÓÓýÔðÿ ÿü·ULLØþÔÓÓýÔñÿÿüä™`L LØþ×ÓÓýÔñÿÿü­oML LØþ×ÓÓúÔê¸RLLØþÖÓÓýÎpLLØþÖÓÓýÏvLLØþÖÓÓýÑ~LLØþÕÓÓýÒ‡L LØþÕÓÓþ’L LØþÕÓÓý¢OL LØþÕÓÓý±TL L ØþÕÓÓý½]LL!ØþÕÓÓýÈmLL"ØþÕÓÓýÐLL#ØþÕÓÓý™OLL$ØþÕÓÓý´ZLL%ØþÖÓÓýÈpLL&ØþÖÓÓúÒ‘NLLØ&ØþÖÓÓüµ]LØ'Øþ×ÓÓýËzØ(Øý×ÔÓÓ*Øý×ÔÓÓ,ØþÕÓÓ-ØþÖÓÓþר,ØþÖÓÓþÔØ-Øý×ÔÓ ÓþÔØ.ØþÕÓ ÓþÕØ.ØþÖÓ ÓþÕØ.Øý×ÔÓ ÓþÖØ/ØþÕÓ ÓþÖØ/ØþÖÓ ÓþÖØ/Øý×ÔÓ ÓþÖØ0ØþÖÓ ÓþÖØ0Øý×ÔÓ ÓþÖØ1ØþÕÓ ÓþÖØ1Øý×ÔÓ ÓþÖØ2Ø ÓþÖØ1Ø ÓþÖØ0Ø ÓþÖØ/ØÓþÖØ.ØÓþÕØ-ØÓþÕØ,ØÓþÕØ+ØÓýÔר)ØÓýÔר(ØÓþר'ØÓþÖØ&ØÓþÕØ%ØÓþÕØ$ØÓýÔר"ØÓþÖØ!ØÓþÕØ ØÓýÔרØÓýÔרØ ÓþÖØØ!ÓýÔרØ#ÓþÖØØ$ÓþÕØØ%ÓýÔרØ'ÓþÕØØýCDDþpÿÿü¥ºÊþ#DDýEwÿÿü¸´ÅÍÍþ,DDýEzÿ ÿü¯ÁÌÍÍþ4DDýF}ÿ ÿü¨¼ÊÍÍý:DDýG~ÿÿü¢·ÇÍ Íý?DDýF~ÿÿý±ÃÍ ÍýADDúF®¿ËÍÍýCDDýI¨ÍÍþ!DDýH£ÍÍþ'DDýFšÍÍþ*DDýE‘Í Íþ-DDþ†Í Íþ/DDýuÊÍ Íþ1DDýgÄÍ Í þ1DDý[¼ÍÍ!þ0DDýO¬ÍÍ"þ0DDýG—ÍÍ#þ.DDýÊÍÍ$þ+DDýc¾ÍÍ%þ(DDýO¨ÍÍ&þ$DDúE‡ËÍÍ&ý BDDüc¼Í'ý@DDýLž(ý=DD*ý8DD+ý0DD-þ'DDþ,ýAD Dý8,ý:D Dý5,ý0D Dþ0.ý$CD Dþ,.ýŠîüüýg722üCñüüü‡}H22üXªúü!ü‡ýc522ü7pÌü$ü‡ý{H2 2üDŒéü&ü‡ýg82 2üX«úü(ü‡ý€P22ü8qÍü+ü‡ýrA22üDŒéü-ü ‡ú†b\¬úü/ü ‡üŽÁúü/ü ‡ý•Ïü.ü‡ýÜü,ü‡ý£âü*ü‡üˆ§âü(ü‡üˆ¥àü&ü‡ý£Ýü$ü‡üÏûü!üý­‹‡‡ü“ÀôüüüÿŸ‡‡ü°åüüÃý·”‡‡üžËùüüÃý¬‡‡ü±âüüÃüÁ¤‰‡‡üšÀðüüÃý½‡‡û‰¡Çôüü Ãý·˜‡‡ûŠ¥Íöüü Ãýµ–‡‡û‹¤Èóü ü Ãý´•‡‡û‰»âü üÃýµ—‡!‡û’­ÏôüüÃý·™‡"‡úˆšµÕøüüÃüºŸ‰‡#‡ûŠ›³ÏÃÃü¾¥Œ‡%‡ÃüÁ­”‡#‡Ãü¸ž‰‡ ‡ÃüÀª“‡‡Ãü¸ ‹‡‡!ÃûÁ¯šˆ‡‡$ÃüÀ¬—‡‡'Ãû½ª—ˆ‡‡*Ãû¿­š‹‡‡-Ãû´£‘‡ ‡1Ãû¼ª™Š‡‡4Ãú¶¦—‰‡‡8Ãú·¨šŒ‡‡LþYL;LüS—öL9LúOˆêÿÿL8LýzÝÿÿ7LýmÎÿÿ5Lýb»ÿÿ3LüZ©ýÿÿ1LüT™÷ÿ ÿ/LüOŠìÿ ÿ-LüM}ßÿ ÿ+LüNÚÿÿ)LüO‚Þÿÿ'LüP†âÿÿ%LüQŠæÿÿ#LüRŽéÿÿ!LüT’íÿÿLüU–ðÿÿLüWšòÿÿý SLLü[ŸöÿÿüÓÃoLLüm¶ýÿ!ÿÓüÒ™QLLüQƒÕÿ$ÿÓýÀoL Lü\›îÿ&ÿÓý VL Lün·ýÿ(ÿÓýÇ|LLüQ„Öÿ+ÿÓý²dLLü\œîÿ-ÿ ÓúÑ™t¸ýÿ/ÿ ÓüÖéþÿ/ÿ ÓýØîÿ.ÿÓýÛóÿ,ÿÓýÞõÿ*ÿÓýßõÿ(ÿÓýÞôÿ&ÿÓýÝóÿ$ÿÓýÛîÿ"ÿþÖÓÓüØèüÿÿüØ×ÕÓÓüÕâöÿÿØý×ÔÓÓüÜíþÿÿØþÖÓÓüÖãõÿÿØý×ÕÓÓüÚèûÿÿØý×ÕÓÓûÔÝëüÿÿ Øý×ÔÓÓûÔÞíýÿÿ Øý×ÔÓÓûÔÞëüÿ ÿ ØýÖÔÓÓûÔÛçõÿ ÿØý×ÔÓ!Óû×áîüÿÿØý×ÔÓ#ÓûÚäñýÿÿØý×ÕÓ$ÓûÔÛäîØØý×ÕÓ&ÓØýÖÔÓ#ÓØý×ÕÓ!ÓØü×ÖÔÓÓØý×ÕÓÓ"ØýÖÔÓÓ$Øü×ÖÔÓÓ'Øü×ÖÔÓÓ*Øü×ÖÔÓÓ.Øü×ÕÔÓ Ó1Øü×ÖÔÓ Ó5Øü×ÕÔÓÓ9Øü×ÖÔÓÓÍþÉÍ;Íü˸Í9Íú̼ ššÍ8ÍýÀ¤šš7ÍýĨšš5ÍýÇ­šš3Íüɲ›šš1ÍüË·œš š/ÍüÌ»Ÿš š.Íý¿£š š+ÍüÌ¿¤šš)Íü̾£šš'Íü̼¢šš%ÍüÌ»¡šš#Íü˺ šš!Íü˹ŸššÍüʸžššÍüÊ·žššýxÅÍÍüɵššüDUªÍÍüį›š!šDüEÈÍÍü̽¦š$šDýWªÍ ÍüȶŸš&šDýxÃÍ Íü(šDýPœÍÍü̽¦š+šDýeµÍÍüȶŸš-š DúF»®›š/š DüIo˜š/š DýNyš.šDýTƒš,šDýY‡š*šDüE[‡š(šDýZ…š&šDýX„š$šDüTy™š!šý#@DDüMn”ššü/DDüHb‰ššý9DDüUv˜ššý#?DDüJc‡ššü*BDDüRn’ššý1DDûEWs”šš ý5DDûFZw–šš ý6DDûGYt“š š ý7DDûETj‡š šý6D!DûL`y”ššý4D"DúERf~—ššü/BD#DûFSdyü)@D%Dü#9D#Dü/BD Dü%:DDü.ADD!û 3CDD$ü#6DD'û%6CDD*û#3ADD-û,;D D1û%4ADD4ú(6BDD8ú'3@DDÿþöÿ;ÿüúѪÿ9ÿúýÙ®§§ÿ8ÿýá³§§7ÿýè¹§§5ÿýïÀ§§3ÿüõȨ§§1ÿüùЪ§ §/ÿüýØ­§ §-ÿüþß²§ §+ÿüþÞ´§§)ÿüýܲ§§'ÿüüÚ±§§%ÿüüذ§§#ÿüûÖ®§§!ÿüùÔ­§§ÿüøÑ¬§§ÿü÷Ï«§§ÿüôͪ§§ÿü訧!§ÿüüÛ¶§$§ÿüôÏ­§&§ÿü訧(§ÿüûÛµ§+§ ÿüóέ§-§ ÿü騧/§ ÿü÷ʨ§/§ ÿýðÁ§.§ÿý踧,§ÿýâµ§*§ÿüþßµ§(§ÿüþá¶§&§ÿý㸧$§ÿýèÁ§"§ÿüòË«§§ÿüù׳§§ ÿüçè§§"ÿüöÖµ§§%ÿüëË­§§'ÿûý䯫§§*ÿûûધ§-ÿûûâÅ«§ §0ÿûýèε§ §4ÿûóÚÁ«§§7ÿúþëÔ¼©§§;ÿûüêÕÁÿ?ÿ2ü3oæü4ü2ýOÁü6ü2ü<–úü7ü2ü3pæü9üü2PÃü;üýšûü =üþðü=üù‡•©ÁÝùü8ü‡ù‰š¬ÁÛöü3ü ‡øˆ•¦¹Ìãúü-ü‡÷‰•£°¿Ðãøü&ü‡õˆ›¦²ÀÏÝëúüü‡ðˆ•ž¥¬´¼ÄÍ×Þåíõüü.‡îˆ‹‘”–™›Ÿ  ¢££¥¥£‡‡Lý‚ëÿ4ÿLýfËÿ6ÿLüU¥ýÿ7ÿLüMƒëÿ9ÿüLgÍÿ;ÿý¨þÿ =ÿþûÿ=ÿùÓØàéóþÿ8ÿÓùÔÚáéóýÿ3ÿ ÓùØßæíöþÿ-ÿÓ÷ÔØÝâèîöýÿ&ÿÓöÖÚßãèîóùþÿÿ ÓñÕØÛÞáäçêíñôöùüÿÿ/ÓöÕרÙÚÛÛÜÜÝÝÞ€ÓÍý¾ š4šÍýÆ©š6šÍüÊ´›š7šÍý½ š9šüÍŨš;šþ³š >šþ’š=šùDN]nƒ˜š8šDùFR_o‚–š3š DøEN[hwˆ˜š-šD÷ENXbmzˆ—š&šDöKR[dny„Ž˜šš DñINUZ_ekqx„‰•šš.DîEGKMOQSTVVWXXYZZYDDÿýÜ®§4§ÿýíº§6§ÿüøÊ¨§7§ÿüþÛ®§9§üÿì¹§;§þȧ >§þ­§=§ùÿðÝ˸¨§8§ÿùüëÚʹª§3§ ÿøþðàд¨§-§ÿ÷ýðã×ÌÀ´©§&§ÿõþõêàÖËÁ¸°¨§§ÿðþøðèáÚÔÎȼ·³¯ª§§.ÿîþúôñïìêèæååäãâááâÿÿ }üüòϰü7üøçƬ–ˆ‡‡ü2üúïѸ¢‡‡.üúíÒº¤‘‡ ‡(üùôÜŰžŽ‡‡!üøôßͼ«œ‡‡üöûíÜÌ¿±¤˜‡‡ üñøîåÜÓËÁ¸¯§ ˜‘‰‡$‡ó¢ Ÿžœš—•’‰‡¯‡ü«¹ }ÿüûîâÿ7ÿû÷ëáÙÓÓ3ÿúúïåÝÖÓÓ.ÿúùïæÞ×Ó Ó(ÿùüóêãÜÖÓÓ!ÿøüôíçáÛÖÓÓÿ÷ùóíèãÞÙÕÓÓ ÿñýúöóðíéåâßÜÙ×ÔÓ$ÓÝÜ÷ÛÚÙØ×ÖÕÔÓ¯ÓüÔÕÖ× }šü“ybš7šø‹s_OEDDš2šú‘{hXJDD.šú{iYLD D(šù”ƒrbUIDD!šø”…wk_TJDDšö™‚wmcYQIDD šñ—‰‚|voha[VQKED$DóXWVUTRPNLJHED¯Dü<0$ }§ü¬Á×§7§ø²ÆÚîþÿÿ§2§ú®¿Ñãöÿÿ.§ú¯¿Ðâôÿ ÿ(§ù«¸Ç×ç÷ÿÿ!§ø«·ÂÎÛéöÿÿ§÷¯¹ÂÌÖâíøÿÿ §ñ©®³¹¾ÃÊÑØßåíôýÿ$ÿóãåæçéëíðóöùýÿ³ÿÿüþàü;üüí¬ˆü9üú󵋇‡ü7üüø½‡‡6üüûÆ‘‡‡4üüûÈ”‡‡2üüûÊ•‡‡0üüûÊ–‡ ‡.üüùÄ“‡ ‡,üüö¿‘‡‡*üü𹎇‡(üüå­Š‡‡&üü×£ˆ‡‡#üüö–‡‡!üü籇‡üûúÍ ˆ‡‡þ‹üüüç´‡‡üŠ£ÀüüûöÈžˆ‡‡ú‰¢¾ÃÃüüûûÖªŒ‡‡ü‰¡½ÃÃüüⵑ‡‡ü‰¡½ÃÃüü帖‡‡üŠ£¾ÃÃüüä¹—‡‡ü‹¥¿Ãà üüÛ³”‡ ‡üލÀà Ãüû÷Ò­‡!‡ü“®Âà Ãüûæ¿ Š‡"‡ý™´ÃÃúüðË­“‡#‡ü‹¢»ÃÃý—ˆ‡$‡ü’«ÁÃÃ$‡ü‰œµÃÃ"‡ü’ª¿ÃÇüŠŸ·ÃÇü–¬ÀÃÇü¦¼Ã Çü¢·Ã#ÇüŒ µÃ&Çü ³Ã)Çü’¤·Ã,à ‡û‰˜©¼Ã/Çû¡²ÁÃ2ÇûŒœ«¼Ã6Ãû‹™©¹ÃzÃÿÿþôÿ;ÿüùáÓÿ9ÿúüäÔÓÓÿ7ÿüýçÕÓÓ6ÿüþë×ÓÓ5ÿýìØÓÓ3ÿýìØÓÓ0ÿüþìÙÓ Ó.ÿüþêØÓ Ó,ÿüýè×ÓÓ*ÿüûæÖÓÓ(ÿüöáÔÓÓ&ÿýñÝÓÓ#ÿüýéÙÓÓ!ÿü÷ãÕÓÓÿüþíÝÓÓÿü÷äÖÓÓýÕ×ÿÿüýìÜÓÓûÕרØÿÿüñàÕÓÓýÕרØÿüõä×ÓÓýÕרØÿüöåÙÓÓýÕרØÿüöæÙÓ ÓýÕרØ ÿüóäØÓ ÓüÔÖר ØÿûýïáÖÓ!ÓýÔÖØ Øÿû÷èÝÔÓ"ÓýÔרØúÿúíáØÓ$ÓýÕרØþÙÓ%ÓýÔÖØØ%ÓýÕרØ"ÓüÔÖרØ ÓýÕרØÓüÔÖרØÓüÔÕר ØÓýÕר#ØÓýÕר&ØÓýÕÖØ)ØÓüÔÕר,Ø ÓüÔÖר/ØÓüÔÕÖØ3ØÓüÕÖר6ØûÓÔÖרzØÿšþ…š;šü_Eš9šú“fGDDš7šü—lIDD6šü™rLDD4šü™tMDD2šü™vNDD0šü™uOD D.šü˜qMD D,šü–mKDD*šü’hIDD(šü‰`FDD&šýXDD#šü•pODD!šü‹cHDDšü˜xWDDþ@ššü‹eJDDüB+ššü–tUDDúB,ššû™~^GDDüC-šü‡fLDDüB-šü‰hODDüA,šüˆhPDDüA* šü‚dND Dü>' šû–{`JD!Dü9! šûŠmWFD"Dý4úš‘v`MD#DüA-þPD%Dü:$$DüB1"Dü;%DüA/Dü7#Dü<( Dü>,#Dü?.&Dü>.)Dü;*, DûB5&/Dû<-2Dû?2$6ûA4&zÿ§þ¶§;§ü¯Ûþ§9§ú«Ôûÿÿ§7§ü©Íøÿÿ6§ü¨Çôÿÿ5§ýÅñÿÿ3§ýÄðÿÿ0§ü¨Äîÿ ÿ.§ü¨Èòÿ ÿ,§üªÌôÿÿ*§ü­Ð÷ÿÿ(§ü³Úûÿÿ&§ü¼ãþÿÿ#§üªÉîÿÿ!§ü²×ùÿÿ§û¨Âåþÿÿ§ü²Ôöÿÿ§ûªÅçþÿ ÿ§ü¼Üúÿ#ÿ§üµÔôÿ&ÿ§ü³Ñîÿ)ÿ§ü´Ðîÿ,ÿ §ü¹Õñÿ/ÿ§û©¿Úõÿ2ÿ§û²Ìåûÿ5ÿú§­ÃÚòÿ9ÿýîþÿ½ÿ!üýÅŠ‡‡ý•¾ÃÃüýöª‡‡ýÂÃÃüýå–‡‡þ§ÃÃüýÇ‹‡‡ýŠ°Ã Ãüýöª‡‡ýŽ¸Ã Ãüýᕇ‡ý–¾Ã ÃüýЇ‡ý Âà Ãüý‡ý‰¬ÃÃüýÐŽ‡‡ý·ÃÃüýõ¬‡‡ý—¾ÃÃüýÙ“‡‡þ¤ÃÃüüö±ˆ‡‡ý‹²ÃÃüýÙ”‡‡ý“¼ÃÃüü÷²ˆ‡‡ý¡ÂÃà üýÖ”‡‡ý‹±Ãà üýò«‡‡ý•½Ãà üýˇ‡þ¥ÃÃüý颇‡ý´ÃÃüüù»‹‡‡ýš¿ÃÃüýÔ”‡‡ýЬÃÃüýꥇ‡ý•»ÃÃüü÷¹‹‡‡ýˆ¦Ã!ÃüüÌ’‡‡ý“¸Ã"Ãþ‡‡üˆ¦ÂÃ#Çý”¹Ã%Çý‰§Ã'Çý–ºÃ(Çý‹«Ã*Çý›½Ã+Çý±Ã-à ‡ü‰¥ÁÃ.à ‡ý˜»Ã0à ‡ý°Ã2Çü‹¨ÂÃ3ÇüˆŸ¾Ã5Çý–¸Ã7Çý‘±Ã9Ãü‡Ž¬Ã9ÃûÂèÁÃ9Ãý±žÃ;Ãü¤‡šÃ9Ãú½–‡‡šÃ8Ãý²Œ‡‡þšÃ6Ãý¢‡‡þšÃ5Ãý»”‡‡þšÃ4Ãý®Š‡‡þšÃ2ÃýÀœ‡‡þšÃ1Ãý´Ž‡‡þšÃ/ÃýÁ¢‡ ‡þšÃ.Ãý¸‘‡ ‡þšÃ-Ãý¨‰‡ ‡þšÃ+Ãýº”‡‡þšÃ*Ãý§‰‡‡þšÃ(Ãý¹”‡‡þšÃ&Ãü§‰‡‡þšÃ%Ãý·’‡‡þšÃ#ÃýÁ¡‡‡þšÃ"Ãý±Ž‡‡þšÃ Ãý½›‡‡þšÃÃüÂ¨Š‡‡þšÃÃý´‘‡‡þšÃÃý¾‡‡þšÃÃüÂ¨Š‡‡þšÃÃý±‡!‡þšÃÃý¸—‡#‡þšÃ!ÿýêÔÓÓýÔרØÿýýàÓÓþÕØØÿýöÙÓÓþÕØØÿýëÔÓÓþÖØ ØÿýýàÓÓýÔר ØÿýõØÓÓýÔר ØÿýéÔÓÓþÕØ ØÿýúÝÓÓþÖØØÿýîÖÓÓþרØÿýüáÓÓýÔרØÿýòØÓÓþÕØØÿýýãÓÓþÖØØÿýòØÓÓýÔרØÿýýãÓÓþÕØØ ÿýñØÓÓþÖØØ ÿýûáÓÓýÔרØ ÿýíÖÓÓþÕØØÿýøÝÓÓþרØÿüþçÔÓÓýÕרØÿýðØÓÓþÖØØÿýøÞÓÓýÔרØÿüýæÔÓÓþÕØ!Øüÿí×ÓÓýÔר"ØþÛÓÓþÕØ$ØÓýÔר%ØÓþÕØ'ØÓýÔר(ØÓþÖØ*ØÓýÕר+ØÓýÔÖØ-Ø ÓþÕØ/Ø ÓýÔר0Ø ÓýÔÖØ2ØÓþÖØ4ØÓýÕר5ØÓýÔר7ØÓýÔÖØ9ØüÓÔÖØ;ØþÖØ:ØýÖÕØ;ØüÕÓÔØ9Øú×ÔÓÓÔØ8ØþÖÓÓþÔØ7ØþÕÓÓþÔØ5Øý×ÔÓÓþÔØ4ØþÖÓÓþÔØ2Øý×ÕÓÓþÔØ1ØýÖÔÓÓþÔØ0ØþÕÓ ÓþÔØ.Øý×ÔÓ ÓþÔØ-ØþÖÓ ÓþÔØ+Øý×ÔÓÓþÔØ*ØþÖÓÓþÔØ(Øý×ÔÓÓþÔØ'ØþÖÓÓþÔØ%Øý×ÔÓÓþÔØ#Øý×ÕÓÓþÔØ"ØýÖÔÓÓþÔØ Øý×ÕÓÓþÔØØþÖÓÓþÔØØý×ÔÓÓþÔØØý×ÕÓÓþÔØØþÖÓ ÓþÔØØýÖÔÓ!ÓþÔØØý×ÔÓ#ÓþÔØ!šýqFDDý8šý–^DDý1šý‰ODDþ(šýsGDDýB šý•^DDý> šý†NDDý7 šýpFDDý. šýXDDýC#šýyIDDý>šý•_DDý6šý€MDDþ*šü–cEDDý@šýNDDý9šü–cEDDý- šý~MDDý@ šý“^DDý7 šývJDDþ*šýŒXDDý?šü˜jGDDý3šý|NDDýA#šýZDDý8šü–hGDDýC)!üšwLDDý:"þTDDüC(#Dý9%DýC('Dý7(DýA$*Dý3+Dý=- DüC*. Dý50 Dý<2DüA'3DüC.5Dý67Dý;9üD>#9û'9ý0;ü*D39ú6DD38ý@DDþ36ý,DDþ35ý9DDþ34ý!ADDþ32ý1DDþ31ý>DDþ3/ý,D Dþ3.ý;D Dþ3-ý'CD Dþ3+ý8DDþ3*ý(CDDþ3(ý9DDþ3&ü(CDDþ3%ý:DDþ3#ý-DDþ3"ý>DDþ3 ý3DDþ3ü'ADDþ3ý;DDþ3ý1DDþ3ü'ADDþ3ýÿÃþ²‡ ‡þèüüÃþ¾‡ ‡þÔüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüà ‡þÌüüØþÖÓ ÓþøÿÿØþ×Ó ÓþðÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿØ ÓþíÿÿþD Dþ‹ššþD Dþ|šš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš Dþwšš,ÿþ±§§,ÿþ½§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§üÿš§üý×52"2þwÿÿüþq2"2ý5ÏÿÿüýÞ72"2þ[ÿÿüþy2#2þ¬ÿÿüýå92"2þFÿÿüþ2#2þˆÿÿüýì<2"2ý8ßÿÿüþˆ2#2þjÿÿüýð?2"2ý3¿ÿÿüþ‘2#2þPÿÿüýõC2#2þ›ÿÿüþ™2#2ý>ñÿÿüýøG2#2þkÿÿüþ¢2$2ü²ÿÿüüýûK2#2üCÿÿüüþ³2$2ýtÿüüþa2#2ý3¼üüý×62#2þGüüþ2$2üýðB2#2üþ£2#2üþV2"2üýÉ42!2üþr2!2üýç<2 2üþ”2 2üýøL22üþº22üþf22üýà;22üþ›22 üþY22 üýØ822!üþ22!üýúR22"üýÎ522#üþ…22#üýöK22$üýÃ422%üþz22%üýñF22&üý¸322'üþr22'üýðI22(üýÇ522)üþŒ22)üýûZ22*üýà=22+üþ¬22,üþr22,üýñI22-üýÉ622.üþ22.üýû[2 2/üýá>2 20üý®32 21üþ2 21üýú\2 22üýèE2 23üýÉ7224üþ¡225üþw225üý÷V226üýäB22ÿýÞNL"Lþ‰ÿÿþ„L"LýN×ÿÿýåPL"Lþpÿÿþ‹L#Lþ¸ÿÿýêRL"Lþ]ÿÿþ’L#Lþ™ÿÿýðTL"LýRæÿÿþ™L#Lþ~ÿÿýôWL#LþÉÿÿþ L#Lþfÿÿýù[L#Lþ©ÿÿþ¨L#LýVôÿÿýü^L#Lþÿÿþ¯L$Lþ½ÿÿýþcL#Lþ[ÿÿþ¾L$Lþ†ÿÿþuL$LþÇÿÿýÞPL#Lþ_ÿÿþL$LÿýôZL#Lÿþ°L#LÿþlL"LÿýÒML!Lÿþ…L!LÿýìTL Lÿþ£L LÿýücLLÿþÄLLÿþ{LLÿýæTLLÿþ©LL ÿþoLL ÿýßQLL!ÿþŸLL!ÿýýhLL"ÿýÖOLL#ÿþ•LL#ÿýúcLL$ÿýÍMLL%ÿþŒLL%ÿýö]LL&ÿþÂLL'ÿþ…LL'ÿýô`LL(ÿýÐOLL)ÿþœLL)ÿýþpLL*ÿýæULL+ÿþ¸LL,ÿþ…LL,ÿýö`LL-ÿýÒOLL.ÿþžLL.ÿýþqL L/ÿýçVL L0ÿþºL L1ÿþL L1ÿýýqL L2ÿýí]L L3ÿýÒQLL4ÿþ®LL5ÿþ‰LL5ÿýûlLL6ÿýéZLLšý£ÌÍ"Íþ¼ÿÿšþ½Í"ÍýÌ¥ÿÿšý¢ÌÍ"ÍþÃÿÿšþ»Í#Íþ®ÿÿšý ËÍ"ÍþÈÿÿšþ¹Í#Íþ·ÿÿšýžËÍ"ÍýË¡ÿÿšþ·Í#Íþ¿ÿÿšýÊÍ#Íþ©ÿÿšþµÍ#ÍþÆÿÿšýœÉÍ#Íþ²ÿÿšþ³Í#ÍýÊÇÿÿšý›ÈÍ#Íþ¿ÿÿšþ±Í$Íü­ÿÿššþÇÍ#ÍüÉÿÿššþ¬Í$Íý¼ÿššþÁÍ$Íþªššý£ÌÍ#ÍþÈššþ¹Í$ÍšýÉÍ#Íšþ±Í#ÍšþÄÍ"Íšþ§Í"Íšþ½Í!ÍšýŸËÍ Íšþ´Í Íšý›ÆÍÍšþ«ÍÍšþÀÍÍšý¡ËÍÍšþ²ÍÍ šþÃÍÍ šý£ÌÍÍ!šþµÍÍ!šý›ÅÍÍ"šý¦ÌÍÍ#šþ¸ÍÍ#šýœÇÍÍ$šþ¨ÍÍ%šþ»ÍÍ%šýÈÍÍ&šþ«ÍÍ'šþ½ÍÍ'šýÇÍÍ(šý§ÌÍÍ)šþ¶ÍÍ*šþÃÍÍ*šý¡ÊÍÍ+šþ®ÍÍ,šþ½ÍÍ,šýÇÍÍ-šý§ÌÍÍ.šþ¶ÍÍ/šþÃÍ Í/šý¡ÊÍ Í0šþ®Í Í1šþ¹Í Í1šý›ÂÍ Í2šýŸÈÍ Í3šý§ÌÍÍ4šþ±ÍÍ5šþ¼ÍÍ5šý›ÄÍÍ6šý ÉÍͧý²ýÿ"ÿþØÿÿ§þÛÿ"ÿýýµÿÿ§ý°üÿ"ÿþæÿÿ§þ×ÿ#ÿþÂÿÿ§ý®ûÿ"ÿþóÿÿ§þÔÿ#ÿþÐÿÿ§ý¬ùÿ"ÿýû°ÿÿ§þÐÿ#ÿþßÿÿ§ýª÷ÿ#ÿþºÿÿ§þÌÿ#ÿþíÿÿ§ý©ôÿ#ÿþÈÿÿ§þÉÿ#ÿý÷Èÿÿ§ý¨òÿ#ÿþÞÿÿ§þÅÿ$ÿü¿ÿÿ§§þïÿ#ÿüôÿÿ§§þ¿ÿ$ÿýÚÿ§§þãÿ$ÿþ»§§ý²üÿ#ÿþò§§þÔÿ$ÿ§ýªõÿ#ÿ§þÅÿ#ÿ§þéÿ"ÿ§ý·þÿ!ÿ§þÚÿ!ÿ§ý­ùÿ ÿ§þËÿ ÿ§ý¨ïÿÿ§þ¼ÿÿ§þàÿÿ§ý¯ùÿÿ§þÈÿÿ §þçÿÿ §ý²ûÿÿ!§þÍÿÿ!§ý¨ëÿÿ"§ýµýÿÿ#§þÒÿÿ#§ý©ïÿÿ$§ý¹þÿÿ%§þ×ÿÿ%§ýªóÿÿ&§þ½ÿÿ'§þÚÿÿ'§ýªñÿÿ(§ý¸ýÿÿ)§þÎÿÿ*§þçÿÿ*§ý¯øÿÿ+§þÂÿÿ,§þÚÿÿ,§ýªñÿÿ-§ý·ýÿÿ.§þÍÿÿ/§þæÿ ÿ/§ý¯÷ÿ ÿ0§þÁÿ ÿ1§þÔÿ ÿ1§ý¨æÿ ÿ2§ý­óÿ ÿ3§ý·üÿÿ4§þÆÿÿ5§þØÿÿ5§ý¨éÿÿ6§ý®õÿÿ ÿþO2%2þ’ü ü ÿýÉ52$2ý6Ëüü ÿþ2%2ýJñüü ÿþI2%2þküü ÿý¾32%2þ’üüÿþv2%2ý5¼üüÿþD2%2ý?ßüüÿþ´2&2ýSõüüÿþm2&2þqüüÿýõ?2&2þšüüÿþ¨2&2ý6Ãüüÿþd2&2ûBäüüÿÿýè@2&2üUõüÿÿýµ32&2ýgûÿÿþ{2'2þ~ÿÿþO2'2ÿýÒ82&2ÿþ›2&2þ}ÿÿþe2%2ý4ÆÿÿýøC2%2þMÿÿý¼42%2þ†ÿÿþ‚2%2ý6ÏÿÿþT2%2þQÿÿýÝ>2%2þÿÿýº42$2ý4¼ÿÿþ2%2ýCøÿÿþi2%2þgÿÿþM2%2þŸÿÿýØ<2$2ý9Øÿÿý³42$2þSÿÿþˆ2%2þ‚ÿÿþc2$2ý4¾ÿÿþI2$2þDÿÿýÒ<2$2þiÿÿýº62$2þ ÿÿý¡32#2ý9Ïÿÿþ†2$2ýGýÿÿþn2$2þ`ÿÿþZ2$2þ„ÿÿþK2#2ý3­ÿÿýÜA2#2ý:ÓÿÿýÈ92#2þJÿÿý°42#2þdÿÿþ—2$2þˆÿÿþ…2#2ý4³ÿÿþ|2#2ý<×ÿÿþt2#2þMÿÿþm2#2þ_ÿÿþf2#2þtÿÿþa2#2þŒÿÿþ[2"2ý3¦ÿÿþV2"2ý6¾ÿÿþQ2"2ý=ÓÿÿýõN2"2ýFåÿÿýñP2"2þSÿÿþU2"2þcÿÿþZ2"2þyÿÿþ`2"2þ’ÿÿþf2!2ý3£ÿÿþm2!2ý4«ÿÿþt2!2ý6³ÿÿþ|2!2ý7ºÿÿþ„2!2ý9Âÿÿ ÿþfL%Lþ¡ÿÿýÒNL$LýPÔÿÿþL%Lýböÿÿþ`L%Lþ~ÿÿýÈML%Lþ¡ÿÿþˆL%LýNÇÿÿþ\L%LýWæÿÿþ¿L&Lýiùÿÿþ€L&Lþ„ÿÿý÷XL&Lþ¨ÿÿþµL&LýPÍÿÿþxL&LýZéÿÿýìXL&LýkùÿÿþÀL'Lý{þÿÿþL'LþÿÿþfL'LÿýÚRL&Lÿþ©L&LþÿÿþyL%LýNÏÿÿýú[L%LþdÿÿýÇML%Lþ—ÿÿþ“L%LýO×ÿÿþjL%LþhÿÿýäWL%Lþ’ÿÿýÅNL$LýMÇÿÿþŸL%Lý[úÿÿþ|L%Lþ{ÿÿþdL%Lþ­ÿÿýßUL$LýSßÿÿý¾ML$Lþiÿÿþ™L%Lþ“ÿÿþxL$LýMÈÿÿþ`L$Lþ\ÿÿýÚTL$Lþ}ÿÿýÄOL$Lþ®ÿÿþ®L$LýR×ÿÿþ—L$Lý_ýÿÿþL$LþuÿÿþpL$Lþ•ÿÿþcL#LýM¹ÿÿýãYL#LýTÛÿÿýÑRL#Lþaÿÿý¼NL#Lþxÿÿþ¥L$Lþ™ÿÿþ•L#LýM¾ÿÿþŽL#LýTÞÿÿþ‡L#LþdÿÿþL#Lþtÿÿþ{L#Lþ†ÿÿþuL#LþœÿÿþpL#Lþ³ÿÿþlL"LýPÈÿÿþgL"LýUÛÿÿý÷eL"Lý]êÿÿýôgL"LþiÿÿþkL"LþxÿÿþpL"Lþ‹ÿÿþuL"Lþ¡ÿÿþzL!LýM°ÿÿþ€L!LýN·ÿÿþ†L!LýO¾ÿÿþL!LýQÅÿÿþ•L!LýRÌÿÿ ÿþÆÍ%Íþµš š ÿý§ÌÍ$Íý̦šš ÿþ¹Í%ÍýÇšš ÿþÇÍ%Íþ¿šš ÿþªÍ&Íþµššÿþ¼Í%Íý̪ššÿþÈÍ%ÍýÊ¡ššÿþ¬Í&ÍýÅœššÿþ¾Í&Íþ½ššÿýÕÊÍ&Íþ³ššÿþ¯Í&Íý̨ššÿþÀÍ&ÍûÉ ššÿÿý©ÉÍ&ÍüÄœšÿÿþ¬Í'ÍýÀšÿÿþ»Í'ÍþºÿÿþÆÍ'Íÿý¤ËÍ&Íÿþ²Í&ÍþºÿÿþÀÍ%Íý̨ÿÿýàÉÍ%ÍþÆÿÿþªÍ&Íþ¸ÿÿþ¹Í%ÍýÌ¥ÿÿþÄÍ%ÍþÅÿÿý¢ÊÍ%Íþ¹ÿÿý«ÌÍ%ÍþªÿÿþµÍ%ÍýÉàÿÿþ¿Í%ÍþÀÿÿþÆÍ%Íþ±ÿÿý£ÊÍ$ÍýË£ÿÿþ¬Í%ÍþÅÿÿþ·Í%Íþ¹ÿÿþÁÍ%ÍþªÿÿþÇÍ$ÍþÈÿÿý¤ËÍ$Íþ¿ÿÿý«ÌÍ$Íþ±ÿÿþ±Í$ÍýË¥ÿÿþ¸Í$ÍýÈõÿÿþ¾Í$ÍþÁÿÿþÃÍ$Íþ¸ÿÿþÇÍ$Íþ®ÿÿý¢ÉÍ#Íýˤÿÿý§ËÍ#ÍþÇÿÿý­ÌÍ#ÍþÀÿÿþ´Í$Íþ·ÿÿþ¸Í$Íþ¬ÿÿþºÍ#ÍýË£ÿÿþ¼Í#ÍþÆÿÿþ¾Í#ÍþÂÿÿþÀÍ#Íþ¼ÿÿþÁÍ#Íþ¶ÿÿþÃÍ#Íþ°ÿÿþÄÍ"Íý̪ÿÿþÅÍ"ÍýʤÿÿýÕÆÍ"ÍýÈ ÿÿýÇÅÍ"ÍþÅÿÿþÄÍ"ÍþÁÿÿþÃÍ"Íþ»ÿÿþÁÍ"ÍþµÿÿþÀÍ"Íþ±ÿÿþ¾Í!Íý̯ÿÿþ¼Í!Íý̬ÿÿþºÍ!ÍýÌ«ÿÿþ¸Í!ÍýË©ÿÿ ÿþíÿ%ÿþ̧ § ÿý·ýÿ$ÿýü¶§§ ÿþÔÿ%ÿý𪧧 ÿþñÿ%ÿþÞ§§ ÿý»þÿ%ÿþ̧§ÿþÙÿ%ÿýý»§§ÿþôÿ%ÿý÷°§§ÿþ¾ÿ&ÿýë©§§ÿþÝÿ&ÿþÛ§§ÿýÓöÿ&ÿþȧ§ÿþÃÿ&ÿýü¹§§ÿþâÿ&ÿûõ®§§ÿÿý³öÿ&ÿüê©§ÿÿþ¾ÿ'ÿýà§ÿÿþÖÿ'ÿþÕÿÿþíÿ=ÿý´ûÿ=ÿþÈÿ&ÿþÕÿÿþáÿ%ÿýþ¸ÿÿýÞôÿ%ÿþîÿÿý»þÿ%ÿþÑÿÿþÓÿ%ÿýýµÿÿþêÿ%ÿþìÿÿý°÷ÿ%ÿþÔÿÿý¼þÿ$ÿýþ»ÿÿþÍÿ%ÿýôÞÿÿþßÿ%ÿþàÿÿþîÿ%ÿþÆÿÿý²øÿ$ÿýú²ÿÿý¿þÿ$ÿþëÿÿþÐÿ%ÿþÓÿÿþâÿ$ÿýþ»ÿÿþñÿ$ÿþôÿÿý´ùÿ$ÿþßÿÿý¼ýÿ$ÿþÆÿÿþÆÿ$ÿýûµÿÿþÑÿ$ÿýòôÿÿþÜÿ$ÿþäÿÿþçÿ$ÿþÒÿÿþïÿ#ÿýþÁÿÿý±öÿ#ÿýù³ÿÿý·ûÿ#ÿþðÿÿýÀþÿ#ÿþâÿÿþÊÿ$ÿþÐÿÿþÒÿ#ÿýþ¿ÿÿþÖÿ#ÿýù²ÿÿþÙÿ#ÿþîÿÿþÝÿ#ÿþäÿÿþàÿ#ÿþÚÿÿþãÿ#ÿþÎÿÿþæÿ#ÿþÄÿÿþéÿ"ÿýü»ÿÿþìÿ"ÿýø³ÿÿýÓîÿ"ÿýó®ÿÿýÈìÿ"ÿþëÿÿþêÿ"ÿþâÿÿþçÿ"ÿþ×ÿÿþäÿ"ÿþÌÿÿþáÿ!ÿýþÅÿÿþÝÿ!ÿýþÂÿÿþÚÿ!ÿýý¿ÿÿþÖÿ!ÿýü¼ÿÿþÒÿ!ÿýû¹ÿÿÀüþ˜ü=üý4±ü<üü29Èü;ü2ýAÝü:ü2ýKíü9ü2ý[÷ü8ü2þmü8ü2þvü7ü2þü6ü2þ‡ü5ü2þü4ü2ý3—ü3ü 2ý3Ÿü2ü 2ý4§ü1ü 2ý5®ü0ü 2ý6«ü/ü 2ý4£ü.ü2ý3šü-ü2ý3’ü,ü2þ‰ü+ü2þü*ü2þxü)ü2ýqûü'ü2ýjøü&ü2ý]îü%ü2ýNßü$ü2ýBËü#ü2ý:µü"ü2ý5›ü!ü2þü ü2ýjöüü2ýVãüü2ýAÁüü 2ý6˜üü"2ýoõüü#2ýQÝüü$2ý>ºüü%2ý5üü'2ýjñüü(2ýHÇüü)2ü6Žûüü+2ý\ãüü,2ý>²üü-2ü3yõü ü/2ýNÑü ü02ý8™ü ü22ýdäü ü32ý=žüüý“4222ý\ÚüüÀÿþ¦ÿ=ÿýN½ÿ<ÿüLRÑÿ;ÿLýYäÿ:ÿLýcñÿ9ÿLýpûÿ8ÿLþ€ÿ8ÿLþ‰ÿ7ÿLþÿ6ÿLþ—ÿ5ÿLþžÿ4ÿ Lþ¥ÿ3ÿ LýM­ÿ2ÿ LýM´ÿ1ÿ LýOºÿ0ÿ LýO·ÿ/ÿ LýN°ÿ.ÿLýM¨ÿ-ÿLþ¡ÿ,ÿLþ™ÿ+ÿLþ’ÿ*ÿLþŠÿ)ÿLý„þÿ'ÿLý~üÿ&ÿLýròÿ%ÿLýeæÿ$ÿLýZÔÿ#ÿLýSÀÿ"ÿLýN©ÿ!ÿLþ’ÿ ÿLý~úÿÿLýlèÿÿLýYËÿÿ LýO¦ÿÿ"Lý‚ùÿÿ#Lýhäÿÿ$LýWÅÿÿ%LýN ÿÿ'Lý~öÿÿ(Lý_Ðÿÿ)LüOžþÿÿ+Lýqèÿÿ,LýW½ÿÿ.Lý‹ùÿ ÿ/LýeÙÿ ÿ0LýQ¨ÿ ÿ2Lýxéÿ ÿ3LýU¬ÿÿý¢ML2LýqáÿÿÀšþ³š=šýÌ­š<šüÍ˧š;šÍýÉ¢š:šÍýÇžš9šÍýÛš8šÍþ¾š8šÍþ¼š7šÍþºš6šÍþ¸š5šÍþ¶š4š Íþ´š3š Íþ±š2š Íþ¯š1š ÍýÌ®š0š Íý̯š/š Íý̱š.šÍþ³š-šÍþµš,šÍþ·š+šÍþ¹š*šÍþ»š)šÍþ½š(šÍý¿›š&šÍýžš%šÍýÆ¡š$šÍýɦš#šÍýˬš"šÍý̲š!šÍþ¹š šÍý¿œššÍýÄ ššÍýÉ©šš Íý̳šš"Íý¾œšš#ÍýÅ¢šš$ÍýÊ«šš%Íý̵šš'Íý¿šš(Íýǧšš)Íý̶šš+Íý šš,ÍýÊ­šš.Íý»œš š/ÍýÆ¥š š0Íý̳š š2ÍýÀ š š3ÍýʲššþµÍ3Íý£ššÀ§þʧ=§ýþÀ§<§üÿû·§;§ÿýö°§:§ÿýï«§9§ÿý樧8§ÿþݧ8§ÿþا7§ÿþÕ§6§ÿþѧ5§ÿþͧ4§ ÿþʧ3§ ÿýþƧ2§ ÿýþç1§ ÿýýÁ§0§ ÿýý§/§ ÿýþŧ.§ÿýþȧ-§ÿþ̧,§ÿþЧ+§ÿþÔ§*§ÿþا)§ÿþÛ§(§ÿýߨ§&§ÿýå«§%§ÿýî°§$§ÿýõ¶§#§ÿýú¾§"§ÿýýȧ!§ÿþÔ§ §ÿýß©§§ÿý鯧§ÿýõº§§ ÿýýʧ§"ÿýÜ©§§#ÿýì°§§$ÿý÷¼§§%ÿýýͧ§'ÿýߪ§§(ÿýñ¸§§)ÿýýΧ§+ÿý毧§,ÿý÷¿§§.ÿýש§ §/ÿýî´§ §0ÿýûɧ §2ÿýâ®§ §3ÿýøÇ§§ýÌþÿ2ÿýæ±§§.üý¹K2 2/üüø“<2 21üüçr42 23üýÊV225üý©K226üüû­T229üü¾`322;üûÏm52ü<üýÞzü ¿ü.ÿýÃcL L/ÿüü¢TL L1ÿüì…ML L3ÿýÓlLL5ÿýµcLL6ÿüþ¹kLL9ÿýÈuLL;ÿû×€OLÿ<ÿýåŒÿ ¿ÿ.šý«ÇÍ Í/šü›µËÍ Í1šýŸ½Í Í3šý§ÄÍÍ5šý¯ÇÍÍ7šý®ÄÍÍ9šýªÁÍÍ;šû¥¾ÌÍš<šý¢»š ¿š.§ý½ïÿ ÿ/§ü¨Ìùÿ ÿ1§ü­Úþÿ ÿ3§ý·éÿÿ5§ýÃïÿÿ7§ýÁêÿÿ9§ý»äÿÿ;§ûµÝýÿ§<§ý°×§ ¿§2þ92=2üêˆ?2;2üüô—F292üûú©\4262üüàP242 üüÓƒG212 üüÅyA2.2üûú¸n;2+2üûõªd72(2üûð­uI2%2üûÞi@2!2üûÍ_922üùøÉ™qN522$üùõ”lK422)üøðÁdM82 20ü÷ݸ–y_NA5227ü÷ûæÍ·¢}mü ¿üLþSL=Lüï˜WL;Lÿüø¥^L9LÿûýµqML6LÿüæžgL4L ÿüÛ”_L1L ÿü΋YL.LÿûýÂTL+Lÿûù¶yPL(Lÿûô¹‡`L%Lÿûå«}XL!LÿûÖŸtSLLÿùüÒ§„eOLL$ÿùùÌ£bMLL)ÿøôË«ydQL L0ÿ÷äÂ¥‹teYNLL7ÿ÷þëÖ¯ž€ÿ ¿ÿÍþËÍ=Íüž·ÊÍ;Íšüœ´ÈÍ9Íšü›¯ÂÍ7Íšü¡¶ÅÍ4Í šü¤¹ÈÍ1Í šü¨»ÉÍ.Íšû›«¾ËÍ+Íšûœ¯ÀÌÍ(Íšû®¼ÇÍ%Íšû¢²¿ÉÍ!Íšû¦µÂËÍÍšù›§³½ÆÌÍÍ$šúœ©´¾ÇÍÍ)šø©²ºÀÆÌÍ Í0š÷¢«´»ÂÆÉÌÍÍ8šø ¦«±¶º¾š ¿šÿþúÿ=ÿü¬Ð÷ÿ;ÿ§ü©Êòÿ9ÿ§û¨Ãæþÿ6ÿ§ü¯Íìÿ4ÿ §ü³Òòÿ1ÿ §ü¸×öÿ.ÿ§û¨½Üùÿ+ÿ§û©Âáüÿ(ÿ§ûªÁÙñÿ%ÿ§û°Çßöÿ!ÿ§ûµÍäúÿÿ§ù¨·ÉÛíýÿÿ$§ù©¹ËÞïþÿÿ)§øªºÇÕáîûÿ ÿ0§÷°½Ê×äîöýÿÿ8§ø®µ½ÅÍÕݧ ¿§2þ8292ú5T´ô252ú7W‚¸ñüü22ú?]†¼õüü,2ù3Hfˆ±áü ü&2ø4CXq•Àðüü2÷2)2þ~ÿÿýÙB2)2þdÿÿýàF2)2þQÿÿýíK2)2ýDãÿÿþP2)2ý:ÎÿÿþS2)2ý5¶ÿÿ+2þ™ÿÿ*2þ}ÿÿ)2þdÿÿ(2þQÿÿ'2ýDãÿÿLþªÿ#ÿýêULLþxÿ$ÿþ}LLýYôÿ#ÿþ½LLþÁÿ$ÿþ\LLþ‹ÿ$ÿþ‹LLþcÿ$ÿýÇMLLýPÖÿ#ÿýý[LLþ ÿ$ÿþ|LLþrÿ$ÿþ¯LLý[ñÿ#ÿýáTLLýPÎÿ$ÿþlLLþ¨ÿ$ÿþ˜LL%ÿýÎNLL%ÿþ_LL$ÿþƒLL#ÿþ·LL"ÿýæULL"ÿþqLL!ÿþŸLL ÿýÐPLLÿýô\LLÿþqLLÿþ’LLÿþ¹LLÿýÜTLLÿþcL Lÿþ|L!Lÿþ L"LÿýÇNL"LÿýæXL#LÿþjL$LÿþˆL%Lÿþ®L&LÿýÇPL&LÿýÝVL&LþTÿÿýô_L'Lþ±ÿÿþlL'Lþ~ÿÿþ~L'Lþ\ÿÿþ”L'LýNÈÿÿþ­L(LþœÿÿýÅOL'LþxÿÿýÚTL'Lþ`ÿÿýì]L'LýRÖÿÿþjL(Lþ²ÿÿþ{L(LþŠÿÿþL(Lþkÿÿþ›L(LýXæÿÿþ¥L(LýNÆÿÿý®ML(Lþžÿÿý¸NL(LþyÿÿýÁPL(Lþ`ÿÿýÉRL(LýRØÿÿýÑTL)Lþ³ÿÿýÙVL)LþÿÿýàZL)Lþyÿÿýæ]L)LþhÿÿýñbL)Lý\èÿÿþgL)LýTÖÿÿþiL)LýNÁÿÿ+Lþ¨ÿÿ*Lþÿÿ)Lþyÿÿ(Lþhÿÿ'Lý\èÿÿÍþ²ÿ#ÿý ÊÍÍþÀÿ$ÿþ¿ÍÍýÉÇÿ#ÿþ­ÍÍþ¬ÿ$ÿþÈÍÍþ»ÿ$ÿþ»ÍÍþÆÿ$ÿþªÍÍý̦ÿ#ÿýõÉÍÍþµÿ$ÿþ¿ÍÍþÂÿ$ÿþ±ÍÍýɸÿ#ÿý£ËÍÍý̨ÿ$ÿþÄÍÍþ³ÿ$ÿþ·ÍÍ%ÿý¨ÌÍÍ%ÿþÈÍÍ$ÿþ½ÍÍ#ÿþ¯ÍÍ"ÿý¡ÊÍÍ"ÿþÃÍÍ!ÿþµÍÍ ÿý§ÌÍÍÿýÇÈÍÍÿþÂÍÍÿþ¹ÍÍÿþ®ÍÍÿý¤ËÍÍÿþÇÍ Íÿþ¿Í!ÍÿþµÍ"ÍÿýªÌÍ"Íÿý¡ÊÍ#ÍÿþÄÍ$Íÿþ¼Í%Íÿþ±Í&ÍÿýªÌÍ&Íÿý¤ÊÍ&ÍþËÿÿýÇÈÍ'Íþ°ÿÿþÄÍ'Íþ¿ÿÿþ¿Í'ÍþÈÿÿþ¹Í'Íý̪ÿÿþ±Í(Íþ¶ÿÿý«ÌÍ'ÍþÀÿÿý¤ËÍ'ÍþÇÿÿý©ÈÍ'Íý˦ÿÿþÄÍ(Íþ°ÿÿþÀÍ(Íþ»ÿÿþºÍ(ÍþÄÿÿþ¶Í(ÍýÊ¡ÿÿþ´Í(Íý̪ÿÿþ±Í)Íþ¶ÿÿý®ÌÍ(ÍþÀÿÿý¬ÌÍ(ÍþÇÿÿý©ËÍ(ÍýË¥ÿÿý§ËÍ)Íþ°ÿÿý¥ÊÍ)Íþºÿÿý£ÉÍ)ÍþÀÿÿý¡ÈÍ)ÍþÅÿÿý¸ÇÍ)ÍýÈ ÿÿþÅÍ)Íý˦ÿÿþÅÍ)Íý̬ÿÿ+Íþ³ÿÿ*Íþºÿÿ)ÍþÀÿÿ(ÍþÅÿÿ'ÍýÈ ÿÿÿþÈÿ#ÿý®øÿÿþâÿ$ÿþßÿÿýõÈÿ#ÿþ¿ÿÿþ¾ÿ$ÿþôÿÿþ×ÿ$ÿþ×ÿÿþïÿ$ÿý»þÿÿýüµÿ#ÿôÿþÍÿ$ÿþßÿÿþåÿ$ÿþÅÿÿýô½ÿ#ÿý±ùÿÿýü¸ÿ$ÿþéÿÿþÉÿ$ÿþÐÿ<ÿý¹ýÿ<ÿþòÿ<ÿþÛÿ<ÿþÂÿ<ÿý¯øÿ<ÿþæÿ<ÿþÍÿ<ÿý¸üÿ;ÿýÈôÿ<ÿþæÿ<ÿþÔÿ<ÿþÁÿ<ÿý³ùÿ<ÿþïÿ<ÿþàÿ<ÿþÍÿ<ÿý»ýÿ;ÿý¯öÿ<ÿþêÿ<ÿþÙÿ<ÿþÆÿ<ÿý»üÿ;ÿý³øÿ&ÿþùÿÿýÈòÿ'ÿþÅÿÿþéÿ'ÿþßÿÿþßÿ'ÿþôÿÿþÒÿ'ÿýþ»ÿÿþÆÿ(ÿþÎÿÿý¼ýÿ'ÿþâÿÿý´ùÿ'ÿþñÿÿý³óÿ'ÿýûµÿÿþêÿ(ÿþÄÿÿþàÿ(ÿþØÿÿþÕÿ(ÿþêÿÿþÏÿ(ÿýö¯ÿÿþÊÿ(ÿýþ¼ÿÿýÆþÿ(ÿþÎÿÿýÂþÿ(ÿþáÿÿý¾üÿ(ÿþñÿÿýºûÿ(ÿýû´ÿÿý·ùÿ)ÿþÄÿÿý´÷ÿ)ÿþÕÿÿý²õÿ)ÿþáÿÿý¯óÿ)ÿþìÿÿý½ïÿ)ÿýô¯ÿÿþìÿ)ÿýùµÿÿþëÿ)ÿýý¾ÿ<ÿþÉÿ<ÿþÕÿ<ÿþáÿ<ÿþìÿ<ÿýô¯ÿÿ2ý8Þÿ'ÿ2þ…ÿ(ÿ2þCÿ)ÿ2þ£ÿ)ÿ2þTÿ*ÿ2ý3Äÿ*ÿ2þkÿ+ÿ2ý:àÿ+ÿ2þ”ÿ,ÿ2þSÿ-ÿ2ý5Îÿ-ÿ2þ‚ÿ.ÿ 2þIÿ/ÿ 2ý3¼ÿ/ÿ 2þqÿ0ÿ 2ýAýÿ0ÿ 2þ©ÿ1ÿ 2þbÿ2ÿ 2ý:ßÿ2ÿ 2þ•ÿ3ÿ2þTÿ4ÿ2ý6Ïÿ4ÿ2þ„ÿ5ÿ2þNÿ6ÿ2ý7Ïÿ6ÿ2þ”ÿ7ÿ2þ^ÿ8ÿ2ý>äÿ8ÿ2þ®ÿ9ÿ2þsÿ:ÿ2þIÿ;ÿü25Çÿ;ÿý2Šÿ<ÿþWÿ=ÿþÜÿ~ÿLýQåÿ'ÿLþ•ÿ(ÿLþ[ÿ)ÿLþ°ÿ)ÿLþjÿ*ÿLþÎÿ*ÿLþÿ+ÿLýSæÿ+ÿLþ£ÿ,ÿLþiÿ-ÿLýOÖÿ-ÿLþ“ÿ.ÿ Lþ`ÿ/ÿ LþÇÿ/ÿ Lþ„ÿ0ÿ LýYýÿ0ÿ Lþµÿ1ÿ Lþvÿ2ÿ LýSæÿ2ÿ Lþ¤ÿ3ÿLþkÿ4ÿLýO×ÿ4ÿLþ•ÿ5ÿLþeÿ6ÿLýQ×ÿ6ÿLþ£ÿ7ÿLþsÿ8ÿLýWéÿ8ÿLþºÿ9ÿLþ†ÿ:ÿLþ`ÿ;ÿüLOÐÿ;ÿýLšÿ<ÿþmÿ=ÿþãÿ~ÿÍýÌ¢ÿ'ÿÍþ¸ÿ(ÿÍþÉÿ)ÿÍþ±ÿ)ÿÍþÄÿ*ÿÍþ¨ÿ*ÿÍþ¿ÿ+ÿÍýË¡ÿ+ÿÍþ´ÿ,ÿÍþÅÿ-ÿÍý̦ÿ-ÿÍþ¹ÿ.ÿ ÍþÇÿ/ÿ Íþªÿ/ÿ Íþ½ÿ0ÿ ÍýÉõÿ0ÿ Íþ¯ÿ1ÿ ÍþÁÿ2ÿ ÍýË¡ÿ2ÿ Íþ´ÿ3ÿÍþÄÿ4ÿÍýÌ¥ÿ4ÿÍþ¸ÿ5ÿÍþÆÿ6ÿÍýÌ¥ÿ6ÿÍþ´ÿ7ÿÍþÂÿ8ÿÍýÊ ÿ8ÿÍþ®ÿ9ÿÍþ½ÿ:ÿÍþÇÿ;ÿüÍ̧ÿ;ÿýÍ·ÿ<ÿþÄÿ=ÿþ¢ÿ~ÿÿýû°ÿ<ÿþÒÿ<ÿþôÿ=ÿþÅÿ<ÿþêÿ=ÿþ¹ÿ<ÿþÞÿ<ÿýú¯ÿ<ÿþËÿ<ÿþëÿ<ÿýýµÿ<ÿþÓÿ<ÿþñÿ=ÿþ»ÿ<ÿþÛÿ<ÿýöôÿ<ÿþÃÿ<ÿþãÿ<ÿýú°ÿ<ÿþËÿ<ÿþêÿ<ÿýýµÿ<ÿþÒÿ<ÿþîÿ<ÿýüµÿ<ÿþËÿ<ÿþåÿ<ÿý÷®ÿ<ÿþÁÿ<ÿþÚÿ<ÿþñÿ<ÿýý¸ÿ<ÿþÏÿ<ÿþéÿ=ÿþ±ÿ~ÿ €ÿ €ÿ €ÿ €ÿÿÿÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿÿÿÿÿ¿ÿþàÿ<ÿý­=ÿ;ÿüu22ÿ9ÿýÍK229ÿý•7227ÿýía226ÿý¹A225ÿý3223ÿý×R222ÿý¡92 21ÿþk2 2/ÿýÃF2 2.ÿý‰52 2,ÿýßY22+ÿý­=22*ÿþt22(ÿýÍK22'ÿý”722%ÿýía22$ÿý¸A22#ÿý322!ÿý×Q22 ÿý 922ÿýñg22ÿý®@22ÿýým2 2ÿýµB2!2ÿýs32"2ÿý¼F2$2ÿýy32%2ÿýÃI2'2ÿý42(2ÿýÉL2*2ÿý†52+2ÿýËP2-2 ÿý52.2 ÿýºH202 ÿüøp3212ÿý©@232ÿýßc252ÿý—:262ÿýÑV2729¿ÿþæÿ<ÿý¹Vÿ;ÿü‡LLÿ9ÿýÖcLL9ÿý¤PLL7ÿýñvLL6ÿýÃYLL5ÿýMLL3ÿýÞhLL2ÿý®SL L1ÿþ~L L/ÿýÍ]L L.ÿý™NL L,ÿýænLL+ÿý¹ULL*ÿþ‡LL(ÿýÖcLL'ÿý£PLL%ÿýñvLL$ÿýÂYLL#ÿýMLL!ÿýÞhLL ÿý®SLLÿýô{LLÿýºXLLÿýýL LÿýÀZL!Lÿþ†L#LÿýÇ]L$Lÿý‹ML%LÿýÍ`L'LÿýNL(LÿýÒcL*Lÿý—OL+LÿýÔfL-L ÿýNL.L ÿýÅ_L0L ÿýúƒL2LÿýµXL3LÿýæwL5Lÿý¥TL6LÿýÙlL7LR¿ÿþ¡ÿ<ÿý®Êÿ;ÿü¼ÍÍÿ9ÿý¦ÇÍÍ9ÿý´ÌÍÍ7ÿý¸ÁÍÍ6ÿý«ÉÍÍ5ÿþºÍÍ3ÿý£ÅÍÍ2ÿý±ËÍ Í1ÿþ¿Í Í/ÿý¨ÈÍ Í.ÿý·ÌÍ Í,ÿý¡ÃÍÍ+ÿý®ÊÍÍ*ÿþ¼ÍÍ(ÿý¦ÇÍÍ'ÿý´ÌÍÍ%ÿý¸ÁÍÍ$ÿý«ÉÍÍ#ÿþºÍÍ!ÿý£ÅÍÍ ÿý±ËÍÍÿýÇÀÍÍÿý®ÉÍÍÿýõ¾Í Íÿý¬ÉÍ!Íÿþ½Í#ÍÿýªÈÍ$Íÿþ»Í&Íÿý¨ÇÍ'Íÿý¹ÌÍ(Íÿý§ÆÍ*Íÿý¸ÌÍ+Íÿý¦ÆÍ-Í ÿý¹ÌÍ.Í ÿý«ÇÍ0Í ÿýà½Í2Íÿý¯ÉÍ3Íÿý¡ÁÍ5Íÿý´ËÍ6Íÿý¥ÄÍ7ÍË¿ÿþ¯ÿ<ÿýÁøÿ;ÿþÙÿ;ÿýµïÿ;ÿýËüÿ:ÿý½ãÿ;ÿý½õÿ;ÿýÕþÿ:ÿý²ëÿ;ÿýÆúÿ;ÿþÞÿ;ÿý¹óÿ;ÿýÐýÿ:ÿý°èÿ;ÿýÁøÿ;ÿþÙÿ;ÿýµïÿ;ÿýËüÿ:ÿý½ãÿ;ÿý½õÿ;ÿýÕþÿ:ÿý²ìÿ;ÿýÆúÿ:ÿýÈàÿ;ÿýÁöÿ:ÿýôÝÿ;ÿý¾õÿ;ÿþÚÿ;ÿý»óÿ;ÿý×þÿ:ÿý¹ñÿ;ÿýÔþÿ:ÿý·ïÿ;ÿýÑýÿ:ÿý¶íÿ;ÿýÔýÿ:ÿý¼ñÿ:ÿýÞÛÿ;ÿýÃöÿ:ÿý°âÿ;ÿýÊùÿ:ÿý´éÿ7ÿûÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ‘‡ ‡þ¨ÃÃþµ‡ ‡ÿýÄ~‡ ‡þ¨ÃÃþµ‡ ‡ûÿŠ5{‡ ‡þ¨ÃÃþµ‡ ‡ûY22{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ{‡ ‡þ¨ÃÃþµ‡ ‡2þ|‡ ‡þ¨ÃÃþµ‡ ‡2ýE‡ ‡þ¨ÃÃþµ‡ ‡û2iÿ’‡ ‡þ¨ÃÃþµ‡ ‡ûŸÿÿ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó Óÿþ×Ó ÓþÖØØþ×Ó ÓÿþÖÓ ÓþÖØØþ×Ó ÓÿýÎÄÓ ÓþÖØØþ×Ó ÓûÿšNÀÓ ÓþÖØØþ×Ó ÓûoLLÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÀÓ ÓþÖØØþ×Ó ÓLþÁÓ ÓþÖØØþ×Ó ÓLý]ÒÓ ÓþÖØØþ×Ó ÓûL}ÿ×Ó ÓþÖØØþ×Ó Óû­ÿÿ×Ó ÓþÖØØþ×Ó ÓÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþLD Dþ'þD DÿþMD Dþ'þD Dÿý¨UD Dþ'þD Dûÿ·ÌWD Dþ'þD DûÃÍÍWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍþWD Dþ'þD DÍýÈOD Dþ'þD DûÍ¿ÿLD Dþ'þD Dû±ÿÿLD Dþ'þD Dÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþóÿ=ÿþôÿ<ÿý¹ýÿ;ÿýÏýÿ;ÿþçÿ Àÿýóöÿ;ÿüßÿóÿ:ÿûÆÿÿóÿ:ÿ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(‡þ¿ÃÃ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþ(Dþÿ Ãþž‡ ‡þp2"2û4…úüÃÃþž‡ ‡þp2!2ýAºüü Ãþž‡ ‡þp2 2ý_çüü Ãþž‡ ‡þp22ý5üü Ãþž‡ ‡þp22ýFÅüü Ãþž‡ ‡þp22ýhíüü Ãþž‡ ‡þp22ý8šüü Ãþž‡ ‡þp22ýKÏü ü Ãþž‡ ‡þp22ýqòü ü Ãþž‡ ‡þp22ý:¦ü ü Ãþž‡ ‡þp22ýQØü ü Ãþž‡ ‡þp22ü3|÷üü Ãþž‡ ‡þp22ý>±üü Ãþž‡ ‡þp22ýXàüü Ãþž‡ ‡þp22ü4…úüü Ãþž‡ ‡þp22ýB¼üü Ãþž‡ ‡þp2 2ýeêüü Ãþž‡ ‡þp2 2ý8›üü Ãþž‡ ‡þp2 2ýNÒüü Ãþž‡ ‡þp22ü3zöüü Ãþž‡ ‡þp22ý?´üü Ãþž‡ ‡þp22ý^åüü Ãþž‡ ‡þp22ý6‘üü Ãþž‡ ‡þp22ýJÊüü Ãþž‡ ‡þp22ýqñü ü Ãþž‡ ‡úp22<ªü"ü Ãþž‡ ‡ûp2XÞü#ü Ãþž‡ ‡üqˆúü$ü Ãþž‡ ‡þ“ü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü Ãþž‡ ‡þžü&ü ØþÕÓ Óþ¯L"LûM•ýÿØØþÕÓ Óþ¯L!LýYÅÿÿ ØþÕÓ Óþ¯L Lýtìÿÿ ØþÕÓ Óþ¯LLýOžÿÿ ØþÕÓ Óþ¯LLý^Îÿÿ ØþÕÓ Óþ¯LLý|ñÿÿ ØþÕÓ Óþ¯LLýQ¨ÿÿ ØþÕÓ Óþ¯LLýc×ÿ ÿ ØþÕÓ Óþ¯LLý„÷ÿ ÿ ØþÕÓ Óþ¯LLýT³ÿ ÿ ØþÕÓ Óþ¯LLýhßÿ ÿ ØþÕÓ Óþ¯LLýûÿÿ ØþÕÓ Óþ¯LLýV½ÿÿ ØþÕÓ Óþ¯LLýnæÿÿ ØþÕÓ Óþ¯LLüM–ýÿÿ ØþÕÓ Óþ¯LLýZÇÿÿ ØþÕÓ Óþ¯L Lýyïÿÿ ØþÕÓ Óþ¯L LýR©ÿÿ ØþÕÓ Óþ¯L LýeÚÿÿ ØþÕÓ Óþ¯L LýŒúÿÿ ØþÕÓ Óþ¯LLýX¿ÿÿ ØþÕÓ Óþ¯LLýsêÿÿ ØþÕÓ Óþ¯LLýP ÿÿ ØþÕÓ Óþ¯LLýaÓÿÿ ØþÕÓ Óþ¯LLý„öÿ ÿ ØþÕÓ Óú¯LLU¶ÿ"ÿ ØþÕÓ Óû¯Lmåÿ#ÿ ØþÕÓ Óü°˜ýÿ$ÿ ØþÕÓ ÓþÒÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ ØþÕÓ ÓþÛÿ&ÿ þ/D DþiÍ#Íü¸›šþ/D DþiÍ!ÍýÉ«šš þ/D DþiÍ ÍýŸšš þ/D DþiÍÍý̶šš þ/D DþiÍÍýȨšš þ/D DþiÍÍý¿žšš þ/D DþiÍÍý̳šš þ/D DþiÍÍýÇ¥š š þ/D DþiÍÍý½œš š þ/D DþiÍÍýË°š š þ/D DþiÍÍýÅ£š š þ/D DþiÍÍýº›šš þ/D DþiÍÍýÊ­šš þ/D DþiÍÍýášš þ/D DþiÍÍý¸›šš þ/D DþiÍÍýɪšš þ/D DþiÍ ÍýÀžšš þ/D DþiÍ Íý˲šš þ/D DþiÍ ÍýƤšš þ/D DþiÍ Íý»œšš þ/D DþiÍÍýʬšš þ/D DþiÍÍý šš þ/D DþiÍÍý̵šš þ/D DþiÍÍýǧšš þ/D DþiÍÍý½š š þ/D DúiÍÍʯš"š þ/D DûiÍÄ¢š#š þ/D Düh·›š$š þ/D DþYš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š þ/D DþUš&š;ÿûþÒ¨§ÿ9ÿýõ¼§§9ÿýä­§§7ÿýýͧ§6ÿýò¸§§5ÿýà«§§3ÿýûȧ§2ÿýïµ§ §1ÿýÛª§ §/ÿýùħ §.ÿýì²§ §-ÿýÖ¨§§+ÿý÷À§§*ÿý诧§(ÿüþѨ§§'ÿýõ»§§&ÿýᬧ§$ÿýûȧ§#ÿýí´§§"ÿýש§§ ÿýö¾§§ÿýå®§§ÿýü̧§ÿýð·§§ÿýÛª§ §ÿýøÂ§"§ÿýè°§#§ÿüþШ§$§ÿþì§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§ÿþè§&§üÿš§üÿš§üýû–‡ ‡þ³ÃÃüþχ ‡þ“ÃÃüþ›‡ ‡þ¯ÃÃüþׇ ‡ýÂÃÃüþ ‡ ‡þ¬ÃÃüý߈‡ ‡ýÁÃÃüþ§‡ ‡þ¨ÃÃüý扇 ‡ý‹ÀÃÃüþ­‡ ‡þ¤ÃÃüý튇 ‡ýоÃÃüþ³‡ ‡þ¡ÃÃüýò‡ ‡ýˆ¼ÃÃüþº‡ ‡þÃÃüýö‡ ‡þ¹ÃÃüþÁ‡ ‡þ™ÃÃüýù“‡ ‡þ¶ÃÃüþɇ ‡þ–ÃÃüýû—‡ ‡þ²ÃÃüþч ‡þ’ÃÃüþœ‡ ‡þ®ÃÃüþÙ‡ ‡ýÂà à üþ¢‡ ‡þ«Ã à üýሇ ‡ýÁà Ã!üþ¨‡ ‡þ§Ã Ã!üý艇 ‡ý‹Àà Ã"üþ®‡ ‡þ£Ã Ã"üý ‡ý‰½Ã Ã#üþµ‡ ‡þ Ã Ã#üýó‡ ‡ýˆ»Ã Ã$üþ¼‡ ‡þœÃ Ã$üý÷‡ ‡þ¸ÃÃ%üþÇ ‡þ˜ÃÃ%üýú”‡ ‡þµÃÃ&üþˇ ‡þ•ÃÃ'üþ˜‡ ‡þ±ÃÃ'üþÓ‡ ‡þ’ÃÃ(üþž‡ ‡þ®ÃÃ(üþÛ‡ ‡ýÂÃÃ)üþ£‡ ‡þªÃÃ)üý㈇ ‡ýŒÁÃÃ*üþ©‡ ‡þ¦ÃÃ*üý鉇 ‡ý‹¿ÃÃ+üþ°‡ ‡þ¢ÃÃ+üý ‡ý‰½ÃÃ,üþ¶‡ ‡þŸÃÃ,üýôއ ‡ûˆºÃÃü,üþ¾‡ ‡ü›ÃÃü,üýø‘‡ ‡ý·Ãü-üþŇ ‡ý˜Ãü-üýû•‡ ‡þ´ü.üþ͇ ‡þ”ü/üþš‡ ‡0üþÕ‡ ‡1üþŸ‡ ‡1üþ݇ ‡2üþ¥‡ ‡2üý䈇 ‡3üþ«‡ ‡3üý늇‡4üþ±‡‡4üýðŒ‡‡5üþ¸‡‡5üýõއ‡6üþ¿‡‡ÿþÙÓ ÓþÖØØÿþîÓ ÓþÔØØÿþÛÓ ÓþÖØØÿþñÓ ÓþÔØØÿþÝÓ ÓþÖØØÿþôÓ ÓØÿþßÓ ÓþÖØØÿý÷ÔÓ ÓþרØÿþáÓ ÓþÕØØÿýùÔÓ ÓþרØÿþäÓ ÓþÕØØÿýûÕÓ ÓþרØÿþæÓ ÓþÕØØÿýýÖÓ ÓþרØÿþéÓ ÓþÔØØÿýþØÓ ÓþרØÿþìÓ ÓþÔØØÿþÙÓ ÓþÖØØÿþïÓ ÓþÔØØÿþÛÓ ÓþÖØØÿþòÓ ÓþÔØØ ÿþÝÓ ÓþÖØ Ø ÿþõÓ ÓØ!ÿþßÓ ÓþÕØ Ø!ÿý÷ÔÓ Óþר Ø"ÿþâÓ ÓþÕØ Ø"ÿýúÔÓ Óþר Ø#ÿþäÓ ÓþÕØ Ø#ÿýüÕÓ Óþר Ø$ÿþçÓ ÓþÕØ Ø$ÿýýÖÓ ÓþרØ%ÿþêÓ ÓþÔØØ%ÿýþØÓ ÓþרØ&ÿþíÓ ÓþÔØØ'ÿþÙÓ ÓþÖØØ'ÿþïÓ ÓþÔØØ(ÿþÛÓ ÓþÖØØ(ÿþóÓ ÓþÔØØ)ÿþÞÓ ÓþÖØØ)ÿþõÓ ÓØ*ÿþàÓ ÓþÕØØ*ÿýøÔÓ ÓþרØ+ÿþâÓ ÓþÕØØ+ÿýúÕÓ ÓþרØ,ÿþåÓ ÓþÕØØ,ÿýüÖÓ ÓüרØÿ,ÿþèÓ ÓüÕØØÿ,ÿýý×Ó Óýרÿ-ÿþêÓ ÓýÔØÿ-ÿýþØÓ Óþ×ÿ.ÿþíÓ ÓþÔÿ/ÿþÚÓ Ó0ÿþðÓ Ó1ÿþÜÓ Ó1ÿþóÓ Ó2ÿþÞÓ Ó2ÿþöÓ Ó3ÿþáÓ Ó3ÿýøÔÓÓ4ÿþãÓÓ4ÿýûÕÓÓ5ÿþåÓÓ5ÿýüÖÓÓ6ÿþèÓÓšý™OD DþšþyD Dþ9šþSD Dþ šþD Dý<šþWD Dþ$šþ…D Dý>šþ[D Dþ'šýŠED Dý@šþ`D Dþ*šýFD DýBšþeD Dþ-šý“HD DýCšþiD Dþ1šý–JD DþšþoD Dþ4šý˜MD DþšþtD Dþ7šý™PD Dþšþ{D Dþ:šþSD Dþ!šþD Dý<  šþXD Dþ$  šþ†D Dý? !šþ\D Dþ( !šý‹ED DýA "šþaD Dþ+ "šýGD DýB #šþfD Dþ. #šý“ID DýC $šþkD Dþ1 $šý–KD Dþ%šþpD Dþ5%šý˜ND Dþ&šþvD Dþ8'šþQD Dþ'šþ|D Dþ;(šþUD Dþ"(šþ‚D Dý=)šþYD Dþ%)šý‡ED Dý?*šþ]D Dþ(*šýŒFD DýA+šþbD Dþ,+šý‘GD DýB,šþgD Dþ/,šý”ID DûCš,šþlD Dü2š,šý—KD Dýš-šþqD Dý5š-šý™ND Dþš.šþwD Dþ8š/šþRD D0šþ}D D1šþVD D1šþƒD D2šþZD D2šýˆED D3šþ^D D3šýFDD4šþcDD4šý’HDD5šþhDD5šý•IDD6šþmDD§þïÿ'ÿ§þÁÿ'ÿ§þêÿ&ÿ§þ»ÿ&ÿ§þåÿ%ÿ§ý·þÿ$ÿ§þßÿ$ÿ§ý²ýÿ#ÿ§þÚÿ#ÿ§ý¯ûÿ"ÿ§þÕÿ"ÿ§ý¬ùÿ!ÿ§þÏÿ!ÿ§ýªöÿ ÿ§þÊÿ ÿ§ý¨òÿÿ§þÅÿÿ§þîÿÿ§þ¿ÿÿ§þéÿÿ§þºÿÿ §þãÿÿ §ýµþÿÿ!§þÞÿÿ!§ý²ýÿÿ"§þÙÿÿ"§ý®ûÿÿ#§þÔÿÿ#§ý«øÿÿ$§þÎÿÿ$§ý©õÿÿ%§þÉÿÿ%§ý¨ñÿÿ&§þÃÿÿ'§þíÿÿ'§þ¾ÿÿ(§þèÿÿ(§þ¹ÿÿ)§þâÿÿ)§ý´þÿÿ*§þÝÿÿ*§ý±üÿÿ+§þ×ÿÿ+§ý®úÿÿ,§þÒÿÿ,§ý«÷ÿÿ-§þÍÿÿ-§ý©ôÿÿ.§þÇÿÿ.§ý¨ðÿ ÿ/§þÂÿ ÿ0§þëÿ ÿ0§þ½ÿ ÿ1§þæÿ ÿ1§þ¸ÿ ÿ2§þáÿ ÿ2§ý´þÿ ÿ3§þÛÿ ÿ3§ý°üÿÿ4§þÖÿÿ4§ý­ùÿÿ5§þÑÿÿ5§ýª÷ÿÿ6§þÌÿÿ Ãý¿‹‡2‡ Ãþ§‡2‡ ÃýÁ‡1‡ Ãþ«‡1‡ Ãý‡0‡ Ãþ®‡0‡ Ãþ’‡/‡ Ãþ²‡/‡Ãþ•‡.‡Ãþµ‡.‡Ãþ™‡-‡Ãþ¹‡-‡Ãþ‡,‡Ãý¼ˆ‡+‡Ãþ ‡+‡Ãý¾Š‡*‡Ãþ¤‡*‡ÃýÀ‹‡)‡Ãþ¨‡)‡ÃýÁ‡(‡Ãþ«‡(‡Ãý‡'‡Ãþ¯‡'‡Ãþ“‡&‡Ãþ³‡&‡Ãþ–‡%‡Ãþ¶‡%‡Ãþš‡$‡Ãþ¹‡$‡Ãþž‡#‡Ãý¼‰‡"‡Ãþ¡‡"‡Ãý¾Š‡!‡Ãþ¥‡!‡ÃýÀŒ‡ ‡Ãþ©‡ ‡ÃýÂŽ‡‡Ãþ¬‡‡Ãþ‘‡‡Ãþ°‡‡Ãþ”‡‡Ãþ´‡‡ Ãþ—‡‡ Ãþ·‡‡!Ãþ›‡‡!Ãýºˆ‡‡"Ãþž‡‡"Ãý½‰‡‡#Ãþ¢‡‡#Ãý¿Š‡‡$Ãþ¦‡‡þ°Ã"ÃýÁŒ‡‡þ‘Ã#Ãþª‡‡þ­Ã"Ãý‡‡ýŽÂÃ"Ãþ­‡‡þ©Ã#Ãþ‘‡‡ýŒÀÃ"Ãþ±‡‡þ¥Ã#Ãþ”‡‡ýŠ¿Ã"Ãþ´‡‡þ¢Ã#Ãþ˜‡‡ý‰¼Ã"Ãþ¸‡‡þžÃ#Ãþœ‡‡ýˆºÃ"Ãý»ˆ‡‡þšÃ#ÃþŸ‡‡ Øþ×Ó3Ó ØþÕÓ2Ó Ø3Ó ØþÖÓ1Ó ØþÔÓ0Ó ØþÖÓ0Ó ØþÔÓ/Ó ØþÖÓ/ÓØþÔÓ.ÓØþ×Ó.ÓØþÔÓ-ÓØþ×Ó-ÓØþÕÓ,ÓØþ×Ó,ÓØþÕÓ+ÓØþ×Ó+ÓØþÕÓ*ÓØþ×Ó*ÓØþÖÓ)ÓØ*ÓØþÖÓ(ÓØþÔÓ'ÓØþÖÓ'ÓØþÔÓ&ÓØþÖÓ&ÓØþÔÓ%ÓØþ×Ó%ÓØþÔÓ$ÓØþ×Ó$ÓØþÕÓ#ÓØþ×Ó#ÓØþÕÓ"ÓØþ×Ó"ÓØþÕÓ!ÓØþ×Ó!ÓØþÖÓ ÓØþÔÓÓØþÖÓÓØþÔÓÓØþÖÓÓØþÔÓÓØþÖÓÓ ØþÔÓÓ Øþ×ÓÓ!ØþÕÓÓ!Øþ×ÓÓ"ØþÕÓÓ"Øþ×ÓÓ#ØþÕÓÓ#Øþ×ÓÓ$ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓþÔØ#ØþÖÓÓþÖØ#ØþÔÓÓþר"ØþÖÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÔÓÓþר"Øþ×ÓÓþÕØ#ØþÕÓÓþר"Øþ×ÓÓþÔØ#ØþÕÓÓ ýAD2D þ(D2D ý?D1D þ%D1D ý=D0D þ!D0D þ:D/D þD/Dþ7D.DþD.Dþ4D-DþD-Dþ1D,DýCD+Dþ.D+DýBD*Dþ*D*Dý@D)Dþ'D)Dý>D(Dþ$D(DýDDþ#DDþ;DDþ DDþ9DDþDD þ6DD þDD!þ2DD!ýCDD"þ/DD"ýBDD#þ,DD#ýADD$þ)DDþ "ý?DDþ;#þ%DDþ#"ý=DDý>"þ"DDþ&#þ;DDý@"þDDþ)#þ8DDýA"þDDþ-#þ5DDýC"þDDþ0#þ2DDýC"ýCDDþ3#þ.DDÿ‡ÓDÿ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡þôüÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓþüÿDþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dþ”š=ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿþ«§üÿš§üÿš§üýø™‡ ‡ýˆµÃÃüýé‡ ‡ýŒ½ÃÃüýÒˆ‡ ‡ý“ÁÃÃüþ·‡‡þœÃÃüýû ‡‡þ¤Ã Ãüý𒇇þ¬Ã Ãüý⋇ ‡ýˆ³Ã à üýΈ‡ ‡ýŠ¸Ã Ã!üþ¹‡‡ý½Ã Ã"üþ¥‡‡ý’ÀÃÃ"üýö˜‡‡ý˜ÂÃÃ#üýꎇ‡þœÃÃ$üýÛŠ‡‡þ¡ÃÃ%üý̈‡‡þ¦ÃÃ&üþ¼‡‡þ«ÃÃ'üþ­‡‡þ¯ÃÃ'üýû¡‡‡ýˆ³ÃÃ(üýô—‡‡ý‰´ÃÃ)üý쑇‡ûжÃÃü)üý㇇üŠ·Ãü*üýÛ‹‡‡ý‹¸ü+üýÒ‰‡‡þŒü,üþȇ‡.üþ¾‡‡/üþ³‡ ‡0üþ¬‡ ‡0üýû©‡ ‡1üýû¦‡ ‡2üýú£‡ ‡3üýù¡‡‡4üý÷ž‡‡5üýöœ‡‡6üýõž‡‡7üýöŸ‡‡8üý÷¡‡‡9üýù¢‡‡:üýù¤‡‡;üûú¦‡‡ü;üüû¬‡ü=üþ³üÿüÿýýÚÓÓþרØÿýøÕÓÓþרØÿþïÓÓþÔØØÿþåÓÓþÕØØÿþÜÓÓþÕØ Øÿýû×ÓÓþÖØ ØÿýõÕÓÓþÖØ Ø ÿþîÓÓþר Ø!ÿþæÓÓþר Ø"ÿþÞÓÓýÔרØ"ÿýýÙÓÓþÔØØ#ÿýøÖÓÓþÕØØ$ÿýòÔÓÓþÕØØ%ÿþíÓÓþÕØØ&ÿþçÓÓþÖØØ'ÿþáÓÓþÖØØ'ÿýþÝÓÓþÖØØ(ÿýüÙÓÓþרØ)ÿýù×ÓÓüרØÿ)ÿýõÕÓÓýרÿ*ÿýòÔÓÓþ×ÿ+ÿýïÔÓÓ-ÿþëÓÓ.ÿþèÓÓ/ÿþäÓ Ó0ÿþáÓ Ó1ÿþàÓ Ó1ÿýþßÓ Ó2ÿýþÞÓ Ó3ÿýþÝÓÓ4ÿýýÜÓÓ5ÿýýÛÓÓ6ÿýüÛÓÓ7ÿýýÜÓÓ8ÿýýÝÓÓ9ÿýþÝÓÓ:ÿýþÞÓÓ;ÿûþßÓÓÿ;ÿüþáÓÿ=ÿþäÿÿÿšý—QD DýCšýŒID Dý?šþ{DDý:šþgDDþ2šý™VDDþ* šý’LDDþ$ šý‡GD DýC  šþxDDýA !šþhDDý> "šþZDDý:"šý•PDDý5#šýIDDþ2$šýFDDþ-%šþwDDþ)&šþkDDþ$'šþ`DDþ 'šý™WDDýC(šý”PDDýB)šýŽKDDûAš)šý‡IDDüAš*šýGDDý@š+šý{EDDþ@š,šþtDD.šþlDD/šþeD D0šþ_D D0šý™]D D1šý™[D D2šý˜YD D3šý—WDD4šý–UDD5šý•TDD6šý•UDD7šý–VDD8šý–WDD9šý—XDD:šý˜YDD;šû˜[DDš;šü™_Dš=šþešÿš§ý©ìÿ!ÿ§ý±øÿ ÿ§ý¿þÿÿ§þÒÿÿ§þåÿÿ§ý­óÿÿ§ýµúÿÿ §ýÁþÿÿ!§þÐÿÿ"§þàÿÿ"§ýªíÿÿ#§ý°÷ÿÿ$§ý¹üÿÿ%§ýÃþÿÿ&§þÎÿÿ'§þÙÿÿ'§ý¨äÿÿ(§ý«íÿÿ)§ý¯ôÿÿ*§ý´øÿÿ+§ý¹ûÿÿ,§ý¿ýÿÿ-§þÅÿÿ.§þÍÿÿ/§þÕÿ ÿ0§þÚÿ ÿ1§þÝÿ ÿ1§ý¨àÿ ÿ2§ý¨âÿ ÿ3§ý©äÿÿ4§ý©çÿÿ5§ýªéÿÿ6§ýªèÿÿ7§ýªæÿÿ8§ý©äÿÿ9§ý©ãÿÿ:§ý¨áÿÿ;§û¨àÿÿ§;§ü¨Ûÿ§=§þÕ§ÿ§ÃýÁ–‡#‡ÃýÁ—‡"‡ÃýÁ˜‡!‡Ãý™‡ ‡Ãýœ‡‡Ãþ¡‡‡Ãþ¦‡‡ Ãþª‡‡!Ãý¯ˆ‡‡"Ãý³Š‡‡#Ãý¸‡‡$Ãý½’‡‡%ÃýÀ—‡‡&Ãý‡‡(Ãþ§‡‡)Ãý±Š‡‡*Ãý¸Ž‡‡+Ãý¾•‡‡,Ãýž‡‡.Ãý«‰‡ ‡/Ãý·Ž‡ ‡þ¹Ã.Ãý¿—‡ ‡ýºÃ/Ãþ£‡ ‡ýŒ¹Ã/Ãý±‹‡ ‡ý‹¸Ã/Ãý½•‡ ‡ý‹·Ã0Ãþ¤‡ ‡ýжÃ0Ãý´‡ ‡ýŠ´Ã0Ãý¾˜‡ ‡ýŠ´Ã1Ãýª‰‡‡ý‰°Ã1Ãýº”‡‡ýˆ¬Ã2Ãý¦ˆ‡‡þ§Ã2Ãþ¸‡ ‡þ£Ã2à ‡þžÃ1à ‡ý™ÁÃ/à ‡ý“¾Ã.ÇýºÃ-Çý‹µÃ,Çý‰¯Ã+Çþ¦Ã*Ãþ¼‡‡ýœÁÃ(Ãüüň‡‡ý”½Ã'Ãüý͉‡‡ý·Ã&ÃüýÕŒ‡‡ý‰¯Ã%Ãüý߇‡þ¥Ã$Ãüýê–‡‡ý™ÀÃ"Ãüý󞇇ý¸Ã!Ãüýù©‡‡ý‰¬Ã Ãüþ¶‡‡ýžÁÃà üýʼn‡‡ý“¼Ãà üý׎‡‡ý‹±Ãà üýè–‡‡ý¡ÂÃà üýô£‡‡ý“ºÃà üýû´‡‡ýŠ­ÃÃüýÉŠ‡‡ýÀÃÃüýÝ‘‡‡ý޵ÃÃüý🇇ý£ÂÃÃüýûµ‡‡ý’¹ÃÃüýЇ‡ý‰¨ÃÃüýç—‡‡ý–¼ÃÃüýöª‡‡ýŠ©ÃÃüýÇ‹‡‡ý•ºÃ Ãüý嘇‡ü‰§Âà Ãüýù°‡‡ý“¸Ã ÃØþÔÓ#ÓØþÔÓ"ÓØþÔÓ!ÓØþÔÓ ÓØþÕÓÓØþÕÓÓØþÕÓÓ ØþÖÓÓ!ØþÖÓÓ"ØþÖÓÓ#Øþ×ÓÓ$Øý×ÔÓÓ%Øý×ÔÓÓ'ØþÕÓÓ(ØþÕÓÓ)ØþÖÓÓ*Øý×ÔÓÓ+Øý×ÔÓÓ-ØþÕÓÓ.ØþÖÓÓ/Øý×ÔÓ Óþר.Øý×ÔÓ Óþר/ØþÕÓ Óþר/ØþÖÓ Óþר/Øý×ÔÓ Óþר0ØþÕÓ Óþר0ØþÖÓ Óþר0Øý×ÔÓ Óþר1ØþÖÓ ÓþÖØ1Øý×ÔÓ ÓþÖØ2ØþÕÓ ÓþÖØ2Øþ×Ó ÓþÕØ2Ø ÓþÕØ1Ø ÓþÔØ0Ø ÓýÔר.ØÓýÔר-ØÓþר,ØÓþÖØ+ØÓþÕØ*ØþçÓÓþÕØ)ØýÿêÓÓýÔר'ØÿýíÔÓÓþר&ØÿýðÕÓÓþÖØ%ØÿýôÖÓÓþÕØ$ØÿýøÙÓÓýÔר"ØÿýüÜÓÓýÔר!ØÿýþàÓÓþÖØ ØÿþåÓÓþÕØØ ÿýêÔÓÓýÔרØ ÿýñÖÓÓþÖØØ ÿýøÙÓÓþÕØØ ÿýüÝÓÓýÔרØÿþäÓÓþÖØØÿýìÔÓÓýÕרØÿýó×ÓÓýÔרØÿýúÜÓÓþÕØØÿýþäÓÓýÔרØÿýîÕÓÓþÖØØÿý÷ÙÓÓýÔרØÿýýàÓÓþÖØØÿýëÕÓÓýÔר ØÿýöÙÓÓþÕØ ØÿýþâÓÓýÔר Øý6D#Dý6D"Dý5D!Dý4D Dý1DDþ-DDþ)DD þ%DD!ý!CDD"ýADD#ý>DD$ý;DD%ý6DD&ý0DD(þ(DD)ýADD*ý>DD+ý8DD,ý0DD.ý$CD D/ý>D Dþ.ý6D Dý?/þ+D Dý?/ý@D Dý@/ý8D DýA0þ*D DýA0ý?D DýA0ý5D DýB1ý%BDDýC1ý8DDýC#2ý)CDDþ'2þD Dþ,2 Dþ01 Dý4/ Dý9.Dý=-Dý@,DýB +Dþ(*þkDDý2(üšqEDDý9'šýwFDDý?&šý}GDDýB!%šý…JDDþ*$šýODDý4"šý“UDDý=!šý˜]DDýB# šþgDDý/ šýqEDDý: šýIDDý@ šý‹ODDý- šý”XDDý: šý™eDDýA"šýtFDDý0šýƒKDDý>šý‘VDDý,šý™fDDý:šýyHDDýC'šý‹PDDý7šý–^DDýB&šýsGDDý8 šý‰QDDüB( šý—bDDý:  ÿþÎÿ=ÿü§Çþÿ;ÿ§ýÂüÿ:ÿ§ý½úÿ9ÿ§ý·õÿ8ÿ§ý°ïÿ7ÿ§ý«çÿ6ÿ§ý¨Þÿ5ÿ§þÒÿ4ÿ §ýÇýÿ2ÿ §ý»÷ÿ1ÿ §ý±ïÿ0ÿ §ý«ãÿ/ÿ§þÔÿ.ÿ§ýÅüÿ,ÿ§ý¸ôÿ+ÿ§ý­æÿ*ÿ§ý¨Óÿ)ÿ§ýÀùÿ'ÿ§ý²îÿ&ÿ§ýªÜÿ%ÿ§ýÆúÿ#ÿ§ý³íÿ"ÿ§ý©×ÿ!ÿ(‡ý’¸ÃÃ)‡üˆ¤ÁÃÃ+‡ý´ÃÃ-‡ýŸÀÃÃ.‡ý®Ã Ã0‡ý–¹Ã Ã1‡üˆ¢Áà Ã3‡ý­ÃÃ5‡ý“´ÃÃ7‡ý™ºÃÃ8‡üˆŸ½ÃÃ:‡ú‰¢¾ÃÇ;‡üФÀ‡=‡þ‹‡?‡þ‘‡=‡ü¤ˆ‡;‡Ãý¸“‡:‡Ãü§‰‡8‡Ãýº•‡7‡Ãý«‹‡5‡Ãý¾‡4‡ Ãýµ‘‡2‡ ÃüÂ¨Š‡0‡ Ãý½‡/‡Ãý·•‡-‡Ãý¯Ž‡+‡ÃüÁ§‹‡)‡Ãü¿¢‰‡'‡Ãý¼‡&‡Ãý¹™‡$‡Ãýµ—‡"‡Ãýµ–‡ ‡Ãýµ–‡‡Ãý´˜‡‡!Ãü¸œˆ‡‡#Ãü» ‰‡‡%Ãü¾¤‹‡‡'ÃüÁ«‘‡‡*Ãý³˜‡‡,Ãüº¡‹‡‡.ÃüÁ¬”‡ ‡1Ãü¸ Š‡ ‡3ÃüÁ¬•‡‡6Ãü»¤Ž‡‡9Ãü´‰‡‡;ÃûÀ­™ˆÃ=ÿ(ÓýÔרØ*ÓþÕØØ+ÓýÔרØ-ÓýÕרØ/ÓþÖØ Ø0ÓýÔר Ø2ÓýÕר Ø4ÓþÖØØ5ÓýÔרØ7ÓýÔרØ9ÓýÕרØ;ÓûÕרØÓ<ÓýÕ×ÓÓþÔÓ=ÓýØÕÓ<ÓØý×ÔÓ:ÓØþÕÓ9ÓØý×ÔÓ7ÓØþÖÓ6ÓØý×ÕÓ4Ó Øý×ÔÓ2Ó ØþÖÓ1Ó Øý×ÕÓ/ÓØý×ÔÓ-ÓØýÖÔÓ+ÓØþÕÓ*ÓØý×ÕÓ(ÓØý×ÕÓ&ÓØý×ÔÓ$ÓØý×ÔÓ"ÓØý×ÔÓ ÓØý×ÔÓÓØý×ÔÓÓ!Øý×ÕÓÓ#Øý×ÕÓÓ%Øý×ÕÓÓ(ØýÖÔÓÓ*ØýÖÔÓÓ,Øý×ÕÓÓ/ØýÖÔÓ Ó1Øý×ÕÓ Ó4ØýÖÔÓÓ6Øü×ÕÔÓÓ9ØýÖÕÓÓ;Øû×ÖÔÓØ=Ø×(Dý:)DüC*+Dý<-Dý/.Dý?! 0Dý6 1DüC, 3Dý>"5Dý:7Dý48DüC.:DúB,D;DüA*D=Dþ@D?Dþ;D=Dü*CD;Dý:D:Dü(BD8Dý8D7Dý$@D5Dý0D4D ý;D2D ü'BD0D ý1D/Dý8D-Dý!>D+Dü(AD)Dü,CD'Dý0D&Dý4D$Dý6D"Dý6D Dý7DDý5DD!ü2CDD#ü.BDD%ü+@DD'ü$;DD*ý5DD,ü-ADD.ü#8D D1ü.AD D3ü#8DD6ü*>DD9ü1BDD;û"5C=ÿ=Ãýº«ÃÿÃý¦ÀÃ<Ãû‡‹¤¿Ã:ÇüŠ¢¾Ã8Çü‰ž¹Ã6Çý˜³Ã4à ‡ü’­ÂÃ1à ‡üŒ£¼Ã/Çý™²Ã-Çü§½Ã*Çûˆ™¯ÂÃ'Çü‹¡¶Ã%Çü¤ºÃ"Çü’§ºÃÇü‘¥¸ÃÃ!‡ü£µÃÃ$‡û‹œ®¿ÃÃ(‡ü”¦¶ÃÃ+‡û‹šªºÃÃ/‡û›ª¸Ã Ã3‡úŠ˜¦´ÁÃÃ8‡ø‘ž«·ÂÃÇ;‡ü‰“ž‡ÿ‡ü¬—ˆ‡;‡=Øý×ÖØÿØýÕר<ØÓýÕר:ØÓýÕר8ØÓýÕר6ØÓýÔÖØ4Ø ÓýÔÖØ2Ø ÓýÕר/ØÓýÔÖØ-ØÓüÔÕר*ØÓýÔÖØ(ØÓýÕר%ØÓüÔÕר"ØÓüÔÖרØÓüÔÕרØ!ÓüÔÕרØ%ÓüÕÖרØ(ÓüÔÕרØ,ÓüÔÖרØ0ÓüÕÖר Ø4ÓûÔÕ×רØ8ÓûÔÕÖרØ=ÓýÔÕÓÿÓýÖÔÓ<Ó=ý$ÿý)<ûDA*:DüB,8DüB/6Dý54 Dü:#1 Dü@+/Dý4-Dü<(*DûC5 'Dü@-%Dü=*"Dü:(Dü;*!Dü=+$Dû@1"(Dü8)+DûA3%/Dû?2% 3DúA5(8Dø;0$D;DüC:0DÿDü#6CD;DÿüŸ“ˆ‡;‡Ãù·ªŸ“‰‡6‡Ãù¹®¤šˆ‡0‡ ÃøÂ¹°¦•‡*‡Ã÷Á¹±©¢›”‡"‡Ãò½¸³­¨¢œ—“‹ˆ‡‡(ÃèÀ¼¹·´±®«©§¦¤¢ ŸŸžžœœÃ¿Ãü©µÀÃ;Çù𤭷ÁÃ5ÇøŽ˜¡ª²ºÂÃ.Ç÷Ž–ž¦­³ºÁÃ&Çô‹’—¢¨®³¹½ÂÃÃ"‡âŠŽ“—› £¦©¬¯³´¶¸¹»½¾¾¿ÀÁÂÂÃÇÿ‡ýÕÔÓ<ÓØû×ÖÕÔÓ7ÓØú×ÖÕÔÔÓ1Ó Øú×ÖÕÕÔÓ+ÓØù×ÖÖÕÕÔÓ#ÓØ×ÖÕÔÓ(Ø×Ö ÕÀØüÖ×ר;ØÓÔûÕÖ×ר5ØÓÔûÕÖÖר/ØÓÔÕÖþר'ØÓÔÕÖר#ÓÔÕÖ ×ØÓü/:CD;Dù%/9BD6Dù!+35-%.D÷>7/)#&Dô@;61,'""DâB>:620.+(&# DÿDÿ6‡ú‹˜¤±¾ÃÃ1‡úŒ—£°¼ÃÃ+‡ù‰‘œ§³¾Ã Ã%‡ùŽ— ©³¼ÃÇöˆ•›£«³»ÂÃÇô‰Ž“—œ¡¦«±·¾Ã!ÃížžŸŸ ¢¥§©«®°´¸»¿ÂÃéÃû¾²¦™Ã5Ãú»°¥šŽ‡‡0Ãù½´ªŸ”Ї‡)ÃøÁ¹°§”Ї ‡!Ã÷Áº´¬¤•‡‡Ãõ¾¹´¯ª¤—‘Ї‡èÂÁÀ¿¿¾½º¸¶´²°­ª¦£Ÿœ˜•‹‡(‡7ÓûÔÕÖרØ2ÓûÔÕÖרØ,ÓúÔÕÖÖר Ø%ÓÔûÕÖÖרØÓÔÕÖþרØÓÔÕÖ×"ØÕÖ×ëØû×ÖÕÔØ5Øú×ÖÕÔÔÓÓ0Ø×üÖÕÔÓÓ*Øú×ÖÕÕÔÓÓ!Ø×ÖÕþÔÓÓØ×ÖÕÔÓØ×ÖÕÔ*Ó6Dú@5*1Dú?6+ +DùC;1' %Dù>6.&DöC=82+$DôB>:61-)%!í100/..,*(&$"éû)45ú *3>DD0ù%/8BDD)ø (09AD D!÷#*18?DDõ!%*06;ADDè "%),/258<@D(Dÿ=ÃüÁªÃ9Ãú¾¤‹‡‡Ã7Ãü¹Ÿ‰‡‡5Ãü¯•‡‡3Ãü½¤Œ‡‡1Ãü´šˆ‡ ‡.Ãü½§‡ ‡,Ãü±šˆ‡‡)Ãüº¤‡‡&Ãü¿ª”‡‡#ÃûÁ¯™ˆ‡‡ Ãû±œŠ‡‡ÃûÂ±Š‡‡ÃûÁ¯‹‡‡Ãû½«˜‰‡"‡Ãü·¦”‡&‡Ãû¿®Œ‡)‡ Ãû´¥”‡-‡Ãúµ¦–‰‡0‡ÃúÁ´§˜‰‡4‡ùý¯¡”ˆ‡8‡þ‡ý‡þ‡:‡ûŠµÃ‡8‡ü–¬ÁÃÃ6‡ü¥»ÃÃ3‡ü‹ŸµÃÃ0‡û‰š°Âà Ã-‡û‰š®Àà Ã*‡û‰™®ÀÃÃ>ØýÖÔØ9Øý×ÕÓÓ8Øý×ÕÓÓ6ØýÖÔÓÓ3Øý×ÕÓÓ1ØýÖÕÓ Ó.Øü×ÕÔÓ Ó,ØýÖÔÓÓ)Øý×ÕÓÓ&Øü×ÖÔÓÓ$ØýÖÔÓÓ!ØýÖÕÓÓØýÖÕÓÓØü×ÖÕÓ ÓØü×ÖÔÓ#ÓØü×ÕÔÓ&ÓØü×ÖÕÓ*Ó Øü×ÕÔÓ-Ó Øü×ÕÔÓ1ÓØü×ÕÔÓ5ÓúØ×ÖÕÔÓ9ÓþÔÓ;ÓüÕרÓ8ÓüÔÖרØ6ÓüÔÕרØ4ÓýÕרØ1ÓýÕÖØ Ø.ÓüÔÖר Ø+ÓüÔÖרØ=ü%=9ú*@DD7ü/CDD5ü!7DD3ü*?DD1ü3CD D.ü(=D D,ü3CDD)ü*>DD&ü%9DD#û 4CDD û1ADDû1ADDû 1ADDû$5CD"Dü)9D&Dû!1?D)D û)9D-Dú)6BD0Dú(5BD4Dù -9CD8Dþ?DýDþD(Dþ3ý;D*Dþ3 ý7D,Dþ3 ý4D.Dþ3 ý3D0Dþ3ý2D2Dþ3ý2D4Dþ3ý5D6Dþ3ý7D8Dû3 9D:Dý3DDDýM€š"šþ6DDüEe–š#šDýQ…š%š,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþ§§,ÿþÁ§§,ÿþ¹§§,ÿþ²§§,ÿþª§§+ÿþû§§+ÿþð§§+ÿþÖ§§+ÿþº§§*ÿþö§§*ÿþÚ§§*ÿþ¾§§)ÿýù¨§§)ÿþß§§(ÿýþ¹§§(ÿþÖ§§'ÿýòª§§'ÿþ¼§§&ÿþÙ§§%ÿýô«§§%ÿþ¾§§#ÿýýƧ§"ÿýù½§§!ÿýõ¶§§ ÿýï°§§ÿý謧§ÿüþש§§ÿýñº§§ÿüþת§ §ÿýñº§"§ÿüýÕª§#§ÿýì¶§%§üÿš§7üýÂ6228üþ™229üþp229üýõQ22:üýÞ?22;üûÂ722ü;üüª32ü<üý2ü=üþvü=üþúü ü7ÿýÌOLL8ÿþ§LL9ÿþƒLL9ÿýùhLL:ÿýåWLL;ÿûÌQLLÿ;ÿü¶MLÿ<ÿýŸLÿ=ÿþ‰ÿ=ÿþýÿ ÿ7šý©ÌÍÍ8šþ³ÍÍ9šþ½ÍÍ9šýœÅÍÍ:šý¢ÊÍÍ;šû©ÌÍÍš;šü¯ÍÍš<šýµÍš=šþ¼š=šþ›š š7§ý¹ýÿÿ8§þÉÿÿ9§þÛÿÿ9§ý©ìÿÿ:§ý°÷ÿÿ;§û¹üÿÿ§;§üÂþÿ§<§ýÍÿ§=§þا=§þ¨§ §#2ý;Éÿÿ$2ý>Ïÿÿ%2ýA×ÿÿ&2ýCÜÿÿ'2ýGáÿÿ(2ýKíÿÿ)2ýLäÿÿ*2ýHÝÿÿ+2ýD×ÿÿþa2*2ýAÐÿÿýñP2*2ý>ÉÿÿüüãD2*2ý<Âÿ ÿüýÏ;2*2ý9ºÿ ÿüý¹52*2ý7²ÿ ÿüþŸ2+2ý6ªÿ ÿüþ…2+2ý4¡ÿ ÿüþm2+2ý3Œÿÿüý÷\2,2þsÿÿüýñV2,2þ_ÿÿüýîQ2,2ýNàÿÿüýéM2,2ýCÍÿÿ üýäI2,2ý:·ÿÿ üýÞE2,2ý5žÿÿ üýÙB2-2üƒÿÿü üýÒ?2-2ýkÿü üýË<2-2þXü üýÄ:2-2üý½82,2üý¶62+2üý±72*2üý¸82)2üý¿:2(2üýÇ=2'2üýÎ@2&2üýÖC2%2üýÜG2$2üýãK2#2üýçP2"2üýíT2!2üýðZ2 2üýõa22üýøq22üýŠ322 üý¥622!üý½=22"üýÓF22#üýæS22$üýòd22%üýûz22'üý”422(üý®822)üýÆA22*üýãV22+üý÷w22-üý¢822.üýËF2 2/üýé^2 20üüû‚32 22üý­:2 23üýÕK224üýðf226üý5227üýÂF228üýîk22#LýTÒÿÿ$LýV×ÿÿ%LýYÞÿÿ&Lý[ãÿÿ'Lý^çÿÿ(Lýbñÿÿ)Lýcéÿÿ*Lý_äÿÿ+Lý\ÞÿÿþuL*LýYØÿÿýögL*LýVÒÿÿýè\L*LýTÌÿÿý×TL*LýRÅÿÿýÃOL*LýQ½ÿÿþ­L+LýO¶ÿÿþ•L+LýN®ÿÿþ€L,Lþ›ÿÿýûqL,Lþ†ÿÿýölL,LþtÿÿýògL,Lýeæÿ ÿýîdL,Lý[Öÿ ÿýé`L,LýTÂÿ ÿýå]L,LýN«ÿ ÿýàZL-Lþ”ÿ ÿýÚWL-Lþÿ ÿýÔUL-Lþnÿ ÿýÎSL-LÿýÇQL,LÿýÁPL+Lÿý½PL*LÿýÂRL)LÿýÉTL(LÿýÐVL'LÿýÖXL&LÿýÝ[L%Lÿýã_L$LÿýècL#LÿýìfL"LÿýñkL!LÿýôpL LÿýùuLLÿýü„LLÿþšLL ÿý²PLL!ÿýÇULL"ÿýÛ^LL#ÿýëiLL$ÿý÷xLL%ÿýþŒLL'ÿý£MLL(ÿýºRLL)ÿýÏYLL*ÿýèlLL+ÿýû‰LL-ÿý¯QLL.ÿýÔ]L L/ÿýîsL L0ÿýþ“L L2ÿý¹TL L3ÿýÜbLL4ÿýô{LL6ÿýžNLL7ÿýÌ]LL8ÿýò~LL#Íý˧ÿÿ$ÍýÊ¥ÿÿ%ÍýÉ£ÿÿ&ÍýÉ¢ÿÿ'ÍýÈ¡ÿÿ(ÍýǸÿÿ)ÍýÆ ÿÿ*ÍýÇ¢ÿÿ+ÍýÈ£ÿÿþÁÍ*ÍýÉ¥ÿÿýÅÍ*Íýʧÿÿüš ÈÍ*ÍýË©ÿ ÿšý¥ËÍ*ÍýË«ÿ ÿšý«ÌÍ*ÍýÌ­ÿ ÿšþ±Í+Íý̯ÿ ÿšþ¸Í+Íý̱ÿ ÿšþ¾Í,Íþ¶ÿÿšý›ÂÍ,Íþ½ÿÿšýÄÍ,ÍþÂÿÿšýžÅÍ,ÍýÆ¡ÿÿšýŸÆÍ,Íýɦÿÿ šý ÇÍ,ÍýË«ÿÿ šý¢ÈÍ,Íý̲ÿÿ šý£ÉÍ-Íü¹ÿÿš šý¤ÊÍ-Íý¿ÿš šý¦ÊÍ-ÍþÚ šý¨ËÍ-ÍšýªÌÍ,Íšý¬ÌÍ+Íšý­ÌÍ*Íšý«ËÍ)Íšý©ËÍ(Íšý§ÊÍ'Íšý¦ÉÍ&Íšý¤ÉÍ%Íšý¢ÈÍ$Íšý ÇÍ#ÍšýŸÆÍ"ÍšýžÄÍ!ÍšýÃÍ ÍšýœÁÍÍšý›½ÍÍšþ·ÍÍ šý°ÌÍÍ!šýªÊÍÍ"šý¤ÈÍÍ#šý ÅÍÍ$šýœÀÍÍ&šþ»ÍÍ'šþ´ÍÍ(šý®ËÍÍ)šý¨ÉÍÍ*šý ÄÍÍ+šý›¼ÍÍ-šý±ÌÍÍ.šý¦ÈÍ Í/šýŸÂÍ Í1šþ¹Í Í2šý®ËÍ Í3šý¤ÇÍÍ4šýÀÍÍ6šý¶ÌÍÍ7šý©ÈÍÍ8šýž¿ÍÍ#ÿýù·ÿ=ÿý÷µÿ=ÿýö²ÿ=ÿýô±ÿ=ÿýò¯ÿ=ÿýï½ÿ=ÿýï®ÿ=ÿýñ°ÿ=ÿýó²ÿÿþãÿ*ÿýõ´ÿÿýªìÿ*ÿý÷·ÿÿü§¯ôÿ*ÿýù¹ÿ ÿ§ýµùÿ*ÿýû¼ÿ ÿ§ý½ýÿ*ÿýü¿ÿ ÿ§þÆÿ+ÿýýÂÿ ÿ§þÒÿ+ÿýþÆÿ ÿ§þÝÿ,ÿþÏÿÿ§ý¨æÿ,ÿþÚÿÿ§ýªéÿ,ÿþäÿÿ§ý«ìÿ,ÿýí¯ÿÿ§ý­îÿ,ÿýôµÿÿ §ý®ñÿ,ÿýù½ÿÿ §ý°óÿ,ÿýýÇÿÿ §ý²õÿ-ÿüÒÿÿ§ §ý´÷ÿ-ÿýÞÿ§ §ý¶øÿ-ÿþè§ §ý¹úÿ-ÿ§ý»ûÿ,ÿ§ý¾üÿ+ÿ§ýÀüÿ*ÿ§ý½ûÿ)ÿ§ýºùÿ(ÿ§ý¸øÿ'ÿ§ýµöÿ&ÿ§ý³ôÿ%ÿ§ý±òÿ$ÿ§ý¯ïÿ#ÿ§ý­íÿ"ÿ§ý«êÿ!ÿ§ýªçÿ ÿ§ý©ãÿÿ§ý¨Ûÿÿ§þÏÿÿ §ýÄüÿÿ!§ý»øÿÿ"§ý³òÿÿ#§ý®ëÿÿ$§ýªâÿÿ&§þ×ÿÿ'§ýËþÿÿ(§ýÁûÿÿ)§ý¸õÿÿ*§ý¯éÿÿ+§ý¨Øÿÿ-§ýÅûÿÿ.§ý¶óÿ ÿ/§ý­åÿ ÿ1§þÓÿ ÿ2§ýÁùÿ ÿ3§ý³ïÿÿ4§ýªàÿÿ6§ýÍýÿÿ7§ý¹óÿÿ8§ý«Þÿÿüÿ­8222ü8‘úüüÿýÄ?232ýSÎüüÿýÙI232ü6…öüüÿýøX242ûKÂüüÿÿþj242ü4tèÿÿþ‚252þ<ÿÿýœ5242ÿý¶:232 ÿýÍF222 ÿýõ]212 ÿý‚32/2 ÿý¬:2.2ÿýÒJ2-2ÿþd2,2ÿýŠ42*2ÿýµ=2)2ÿýÙO2(2ÿýy32&2ÿýµ@2%2ÿýèa2$2ÿý–72"2ÿýÐN2!2ÿýz322ÿýµ@22ÿýèb22þíÿÿýŸ=22ýCÇÿÿýäf22ý7Ÿÿÿý«A22þvÿÿüøo322ýVãÿÿý·E22ýBÂÿ ÿýx322ý6™ÿ ÿýÁJ22þqÿ!ÿý…722ýSßÿ ÿýÛf22ý?½ÿ!ÿýºM22ý5‹ÿ"ÿý•=22ýYÞÿ!ÿüñu422ý<©ÿ"ÿýÌX22þoÿ#ÿý¨D22ýGÅÿ#ÿý‰<22ý5Šÿ#ÿüý922ýXÝÿ#ÿüåy722ý<¨ÿ$ÿüÞq522þnÿ%ÿþ×22ýG¼ÿ$ÿ2ý3tÿ#ÿ2ýC³ÿ!ÿ2ýlõÿÿ2ý?©ÿÿ2ýdãÿÿ 2ý<žÿÿ"2ý\Ûÿÿ#2ý8Œÿÿ%2ýG¯ÿÿ'2ý]Ñÿÿ(2ü5yýÿÿ*2ý>™ÿÿ,2ýN½ÿÿ.2ýhÝÿ ÿ/2ý8…ÿ ÿ12ýA–ÿ ÿ32ýEžÿÿ52ýI¦ÿÿ72ýN¯ÿÿüÿ¹QL2LüR ýÿÿýÎWL3LýiÖÿÿýà`L3LüO•úÿÿýúmL4LýbÌÿÿþ~L4LüM†íÿÿþ“L5LþUÿÿýªNL4LÿýÁSL3L ÿýÖ]L2L ÿý÷rL1L ÿþ“L0L ÿý¸SL.LÿýÚaL-LÿþxL,LÿýšML*LÿýÀUL)LÿýàfL(Lÿþ‹L'LÿýÀXL%LÿýìuL$Lÿý¥QL"LÿýØeL!LÿþŒL LÿýÀXLLÿýìvLLþñÿÿý­ULLý[ÐÿÿýézLLýP­ÿÿý·YLLþ‰ÿÿýú‚LLýlèÿÿýÂ]LLýZÌÿ ÿýŠMLLýO¨ÿ ÿýËbLLþ„ÿ!ÿý–QLLýiæÿ ÿýâzLLýXÇÿ!ÿýÅdLLýN›ÿ"ÿý¤ULLýnåÿ!ÿüô‡NLLýUµÿ"ÿýÕnLLþ‚ÿ#ÿýµ\LLý_Îÿ#ÿý™TLLýOšÿ#ÿüý’RLLýmäÿ#ÿüê‹PLLýTµÿ$ÿüå„NLLþÿ%ÿþÞLLý^Çÿ$ÿLýM‡ÿ#ÿLý[¾ÿ!ÿLý÷ÿÿLýXµÿÿLýxèÿÿ LýU¬ÿÿ"Lýqâÿÿ#LýR›ÿÿ%Lý_»ÿÿ'LýrÙÿÿ(LüN‹ýÿÿ*LýW¨ÿÿ,LýeÇÿÿ.Lý|äÿ ÿ/LýQ–ÿ ÿ1LýY¥ÿ ÿ3Lý]¬ÿÿ5Lý`³ÿÿ7Lýe»ÿÿüÿ®ÌÍ2Íü˵›ššÿý¨ÊÍ3ÍýŦššÿý£ÇÍ3Íü̸œššÿýàÄÍ4ÍûÇ©ššÿÿþ¿Í5Íý¼Ÿÿÿþ¹Í5ÍþÊÿÿý²ÌÍ4Íÿý¬ËÍ3Í ÿý¦ÈÍ2Í ÿýÕÂÍ1Í ÿþ¹Í0Í ÿý®ËÍ.Íÿý¤ÇÍ-ÍÿþÀÍ,Íÿþ·Í+Íÿý¬ÊÍ)Íÿý£ÆÍ(Íÿþ»Í'Íÿý¬ÉÍ%Íÿý©ÁÍ$Íÿý´ÌÍ"Íÿý¥ÆÍ!Íÿþ»Í Íÿý¬ÉÍÍÿý©ÁÍÍþ¸ÿÿý±ÊÍÍýɧÿÿý ÀÍÍý̱ÿÿý¯ÉÍÍþ¼ÿÿýà¾ÍÍýÄ ÿÿý«ÈÍÍýÉ©ÿ ÿþ»ÍÍý̳ÿ ÿý©ÇÍÍþ½ÿ!ÿý¸ÌÍÍýÅ¡ÿ ÿý¢ÀÍÍýʪÿ!ÿý«ÆÍÍýÌ·ÿ"ÿý´ÊÍÍýâÿ!ÿüǼÌÍÍýʯÿ"ÿý¦ÃÍÍþ¾ÿ#ÿý¯ÈÍÍýȨÿ#ÿý·ËÍÍýÌ·ÿ#ÿüõ¹ËÍÍýÄ¢ÿ#ÿü »ÌÍÍý˯ÿ$ÿü¢½ÌÍÍþ¾ÿ%ÿþ£ÍÍýȪÿ$ÿÍþ¼ÿ#ÿÍýɬÿ!ÿÍý¾ÕÿÿÍýʯÿÿÍýÀ ÿÿ Íýʲÿÿ"Íý¢ÿÿ#Íý˶ÿÿ%ÍýÈ­ÿÿ'ÍýÂ¥ÿÿ(ÍüÌ»õÿÿ*Íýʳÿÿ,Íýƪÿÿ.Íý¿¢ÿ ÿ/Íý̸ÿ ÿ1ÍýÉ´ÿ ÿ3ÍýȲÿÿ5Íýǰÿÿ7ÍýÆ­ÿÿüÿÁûÿ2ÿüų̂§§ÿý¹÷ÿ3ÿýëµ§§ÿý²ñÿ3ÿüýÒ©§§ÿýÞèÿ4ÿûï¹§§ÿÿþßÿ4ÿüþÚ­ÿÿþÓÿ5ÿþøÿÿýÈýÿ=ÿý¾úÿ=ÿýµóÿ=ÿýÓåÿ>ÿþÓÿ>ÿýÂúÿ=ÿý´ðÿ>ÿþâÿ>ÿýÏþÿ=ÿý¾øÿ=ÿý²íÿ>ÿþ×ÿ>ÿý¾öÿ=ÿý³ãÿ>ÿýÊüÿ=ÿý´îÿ>ÿþ×ÿ>ÿý¾öÿ=ÿý³ãÿÿþ½ÿÿýÆøÿÿýô¸ÿÿý®áÿÿýüÆÿÿýÂöÿÿþØÿÿýÞÜÿÿýé¯ÿÿý½óÿÿýõ¹ÿ ÿýØþÿÿýýÉÿ ÿýºðÿÿþÛÿ!ÿýÑüÿÿýë°ÿ ÿý±áÿÿýö»ÿ!ÿý¼îÿÿýýÏÿ"ÿýËøÿÿýè°ÿ!ÿüÈÙþÿÿýøÃÿ"ÿý¶èÿÿþÜÿ#ÿýÃôÿÿýò¸ÿ#ÿýÐùÿÿýýÏÿ#ÿüôÔûÿÿýè°ÿ#ÿü®×üÿÿýùÃÿ$ÿü°ÛýÿÿþÜÿ%ÿþ²ÿÿýò»ÿ=ÿýþÙÿ>ÿýô¿ÿ>ÿýÞÓÿ=ÿýöÃÿ>ÿýâ¯ÿ=ÿýøÇÿ>ÿýæ±ÿ=ÿýûÏÿ>ÿýòÀÿ>ÿýå´ÿ=ÿüý×ôÿ=ÿý÷Éÿ>ÿýí»ÿ>ÿýà°ÿ=ÿýûÑÿ>ÿýõÊÿ>ÿýóÇÿ>ÿýñÄÿ>ÿýîÀÿÿ@üý”øü<üü2K¸ü;ü2ýdÙü9ü2ü7‚ñü7ü2ýB£ü6ü2ýQµü4ü 2ýW¿ü2ü 2ý_Èü0ü 2ü3fÑü.ü2ü4mÚü,ü2ü6uáü*ü2ü7s×ü(ü2ü4eÅü&ü2ýY³ü$ü2üM¡øü!ü2üCðüü2ü:tÌüü 2üTŸôüü"2ü~Õüü*2üPŽÞüü,2û3V–æü ü/2û5]žíü ü22û7c¦ïüü52û6ZÕüü92ùGx¶öüü2;2ü9cš22ýk42<2ûÿÏd32:2ÿüÆ_3282ÿüËj5262ÿüÛw8242ÿüñ†>222 ÿý•F202 ÿý¦P2.2ÿü¸_32+2ÿüÚ?2)2ÿü§Y32&2ÿüÕ{=2$2ÿý¢V2"2ÿüÏv<22ÿü¬g822!ÿü¤a622#ÿûø›[422&ÿûä”T322)ÿûÜV422,ÿûõ¤j=2 20ÿûÀ€N32 2@ÿý£üÿ<ÿüLcÂÿ;ÿLýxàÿ9ÿLüP“öÿ7ÿLýZ°ÿ6ÿLýgÀÿ4ÿ LýmÉÿ2ÿ LýtÑÿ0ÿ LýzÙÿ.ÿLüMáÿ,ÿLüO‡çÿ*ÿLüP†Þÿ(ÿLüMyÎÿ&ÿLýn¾ÿ$ÿLüd®üÿ!ÿLü[ ôÿÿLüS†Õÿÿ Lüj­øÿÿ"LüU‹Úÿÿ%Lün²úÿÿ'LüWÜÿÿ*Lügžåÿÿ,LûMl¥ëÿ ÿ/LûNr¬ñÿ ÿ2LûPx³óÿÿ5LûOpŸÜÿÿ9Lù_ŠÁúÿÿL;LüSw¨LLý~MLÿý¸äÿ>ÿü¶ßýÿ=ÿü±Øûÿ=ÿüÈÑ÷ÿ>ÿýËóÿ>ÿýÄíÿ>ÿü½äþÿ=ÿü±Ôöÿ>ÿýÃçÿ>ÿü³Öøÿ>ÿýÅéÿ>ÿüµØøÿ>ÿüÂàûÿ>ÿüÅãýÿ=ÿûÞÈæþÿ=ÿü®Ëêÿ>ÿû±Îéþÿ=ÿûÓÅßøÿ>ÿüºÔîÿ ÿüþáü=üú3Nyªæü9ü2ú3IpŸÚü5ü2úBh•Íûü0ü 2ú=_‚©×ü,ü2ù:Tt™Äòü&ü2ø4JgвÛúü ü2÷5FZpˆ¤Ãæüü$2õ9Kaw¬ÀÓèûüü-2í4=HS_lyˆ—¨·½ÂÈÎÓÚß22ÿþçÿ=ÿúLe‹¶ëÿ9ÿLû`ƒ­áÿ5ÿLúZ|¤Öþÿ0ÿ LúUt“µÞÿ,ÿLùSk‡§Î÷ÿ&ÿLøMa{š½âýÿ ÿL÷O]pƒ™±Íëÿÿ$LõRcu‰ ¸ÊÛíþÿÿ-LíMV_it‹˜¥µÂÇÌÑÖÛáæLLšþ¡š=šúÍÆ»¯ š9šÍûǽ±£š5šÍûÉ¿´¦š1š Íúʹ¯£š,šÍùËﳍœš&šÍùÇÀ·­¢›š šÍ÷ÌÈý·°¨ šš$ÍöËÇÁ¼µ®©¤Ÿšš.ÍîÊÇž»·´¯«ª©§¦¤£¡Íͧþ¯§=§úÿí×®§9§ÿûñÛÆ±§5§ÿûõà˵§1§ ÿúøäÓò§,§ÿùúêÙɹª§&§ÿøþðàÏ¿±¨§ §ÿ÷ýóçÛÐŹ®§§$ÿöûïãØÍº³­§§-ÿíþøñëäÞ×ÐÊý»¹·µ³±°ÿÿýüüô¿‰ü6ü÷î¼kL422ü1üùè¶‹fG322,üù㽞‚bC2 2$ü÷úÙµ–{cL822üõêѺ¦“‚q\G522ûæìòúüüìôéßÖÌú³«£›”Œ|l]OB62&2ú369732v2ýÿüøÉ™ÿ6ÿ÷òÇ cNLLÿ1ÿùíÁ›{_MLL,ÿùèÇ«“v[L L$ÿ÷ýàÀ¥wcRLLÿõïÙų¢“„q^OLLûëð÷ýÿÿìøîæÝÕÍž·°©£›rfZOL&LúMPRQMLvLýšüœ©·š6š÷žªµ¿ÆÌÍÍš1šúŸ¬·ÀÈÍÍ,šù ª²¹ÁÉÍ Í$š÷›£¬´»ÁÆËÍÍšõž¥«°µ¹½ÂÈÌÍÍû žœ›ššìœŸ¡¤¦¨«¬¯±²´¶º¾ÂÆÉÌÍ'ÍüÌËÌÍwÍý§ü©ºÐ§6§÷«»ÍÞïþÿÿ§1§ù­¾Ïàòþÿÿ,§ù¯»ÇÓãôÿ ÿ$§÷¨²¾ÊÖâïûÿÿ§õ¬´¼ÄÌÓÛæòýÿÿû®¬ª¨§§ì©­°³¶¹¼¿ÂÅÈËÏÖÞåíõýÿ&ÿúþüûüþÿvÿ>üýø™ü:üûö›H2ü8üüïŽB227üüæ‚<225üüÜv8223üüÏk5221üü»a32 2.üüî”K2 2,üüÍs922)üüö¤V22'üüÜ€?22$üûû´a422"üüÈzA22üüÙ‡J22üûæ”T322üûñ£_52 2üûô¯j82#2üûáša82&2üûÇ…P32)2 üûò®qA2-2 üûÒ–_7202üúûÌ”e?242ùüúÆa=282ý]:2»2ýFŒ292ú4`²ÿÿ272ü>Ûÿÿ62ýU£ÿÿ32ü9sÌÿÿ12ýK”ÿ ÿ.2ü?wÄÿ ÿ+2ü9k´ÿÿ(2ü5a¥ÿÿ%2û3V—ñÿÿ#2üLŠÜÿÿ2û3Q…Îÿÿ2û7`™áÿÿ2üAp­ÿ!ÿ2üN‚Äÿ$ÿ>ÿýü¨ÿ:ÿûú©_Lÿ8ÿüóžZLL7ÿüë“ULL5ÿüã‰QLL3ÿü×NLL1ÿýÆvL L.ÿüò£cL L,ÿüÖ†SLL)ÿüú±lLL'ÿüã‘WLL$ÿûþ¿vMLL"ÿüÑŒYLLÿüà—aLLÿüë£jLLÿûö°tNL Lÿûø»~RL#Lÿûç¨vRL&LÿüЕgL*L ÿû÷º„YL-L ÿûÚ¥tQL0LÿúþÕ£yXL4LùÿýÏžvUL8LýrSL»Lý]›L9LúMu½ÿÿL7LüWâÿÿ6Lýk°ÿÿ3LüS†Õÿÿ1Lýc£ÿ ÿ.LüX‰Îÿ ÿ+LüS¿ÿÿ(LüOu²ÿÿ&Lül¥ôÿÿ#Lücšãÿÿ Lüg–ÖÿÿLûQu§çÿÿLüYƒ¹ÿ!ÿLüe“Îÿ$ÿ>šý›³š:šûœ²ÇÍš8šü¶ÉÍÍ7šü ¹ÊÍÍ5šü¢¼ÌÍÍ3šü¥¿ÌÍÍ1šýªÁÍ Í.šüž´ÇÍ Í,šü¦½ËÍÍ)šüœ°ÄÍÍ'šü¢¹ÊÍÍ%šý¬ÁÍÍ"šü§»ÉÍÍšü£¸ÇÍÍšü ´ÄÍÍšû±ÂÌÍ Íšûœ­¿ËÍ#Íšû¡³ÁËÍ&Íšü§¸ÅÍ*Í šûœ®½ÉÍ-Í šû¤´ÂÌÍ0Íšû¦´ÀÊÍ4Íù𛍶ÁÊÍ8ÍýÂËÍ»ÍýȶÍ:ÍûÁ­ÿÿÍ7Íüʹ¢ÿÿ6Íýıÿÿ3Íü˽¦ÿÿ1ÍýÇ´ÿ ÿ.Íüʼ¨ÿ ÿ+ÍüË¿¬ÿÿ(ÍüÌÁ°ÿÿ&ÍüÄ´Çÿÿ#ÍüÆ·¢ÿÿ ÍüŸ¦ÿÿÍûÌÁ³¡ÿÿÍüɽ®ÿ!ÿÍüƹ¨ÿ$ÿ>§ý¨É§:§û©Èñÿ§8§ü«Îõÿÿ7§ü®Óøÿÿ5§ü±Øûÿÿ3§üµÞýÿÿ1§ý¼ãÿ ÿ.§ü«Ëïÿ ÿ,§üµÚúÿÿ)§ü©Åéÿÿ'§ü±Ô÷ÿÿ%§ü¾ãþÿÿ"§ü·×õÿÿ§ü²Ñðÿÿ§ü®Ëêÿÿ§ûªÅäýÿ ÿ§û©Àßûÿ#ÿ§û¯Èãûÿ&ÿ§ü¸Òìÿ*ÿ §ûªÁÛõÿ-ÿ §û´Êäüÿ0ÿ§û¶Ëáöÿ4ÿù§¨¸Íãøÿ8ÿýåúÿ»ÿýóÏÿ9ÿüþä¿ÿ9ÿü÷Ô±ÿ9ÿýêÅÿ9ÿüúÚ¶ÿ9ÿýïËÿ9ÿüöعÿ8ÿüúÞ¾ÿ8ÿüýãÄÿ9ÿüéÊÈÿ8ÿüïϱÿ8ÿüìѵÿ7ÿûüäɯÿ7ÿüöÛÁÿ8ÿüîÓ¹ÿ$ÿüýÜd2(2üüõ‡82)2üý¯F2+2üý×_2-2 üüñ62.2 üý¨C202 üýÂX222üýÎb242üüÚl4252üüäv6272üüí‚9292üô=2:2ý?B2;2ý]ä2:2û5Žÿÿ292ýFÅÿÿ92þkÿÿ72ý9Ÿÿÿ62ýOÕÿÿ42ý3yÿÿ32ýCµÿÿ12ý3sÿ ÿ02ýFºÿ ÿ.2ý3xÿ ÿ-2ýH¾ÿÿ+2ý4|ÿÿ*2ýKÄÿÿ(2ý5‚ÿÿ'2ýOÉÿÿ%2ý<”ÿÿ#2ü3pèÿÿ"2ýSÅÿÿ 2ý?žÿÿ2ý5yÿÿ2ýYÎÿÿ2ýC§ÿ ÿ2ý7ÿ"ÿ2ü5qßÿ#ÿ2ü3fÕÿ%ÿ2ý]Èÿ'ÿ2ýT»ÿ)ÿ2ýK­ÿ+ÿ2ýE ÿ-ÿ 2ýB”ÿ/ÿ 2ýH›ÿ1ÿ2ýP¨ÿ3ÿ2ýY¶ÿ5ÿ2ü3cÄÿ5ÿø×]225mÑÿ6ÿù‚628xÝÿ6ÿý©C22þñÿ6ÿýÑ[227ÿý|5225ÿý¢A223ÿýËV221ÿüøv42 20ÿý›>2 2.ÿýºQ2 2,ÿýÇ]22*ÿüÒf322(ÿüÝo422&ÿüèy622%ÿýƒ922#ÿýŽ=22!ÿý™B22ÿý£H22ÿýãyL(Lÿüù—QL)Lÿý»^L+LÿýÞtL-L ÿüö’PL.L ÿýµ[L0L ÿýÌnL2LÿýÖvL4LÿüáML5Lÿüé‰OL7Lÿüñ“RL9LüøUL:LýXZL;LýréL:LûOžÿÿL9Lý^Îÿÿ9Lþ~ÿÿ7LýR­ÿÿ6LýfÜÿÿ5Lþ‹ÿÿ3Lý[Àÿÿ2Lþ†ÿ ÿ0Lý]Äÿ ÿ.LýMŠÿ ÿ-Lý_Èÿÿ+LýMŽÿÿ*LýbÎÿÿ(LýN“ÿÿ'LýfÒÿÿ%LýT£ÿÿ#LüMƒìÿÿ"LýiÎÿÿ LýW«ÿÿLýN‹ÿÿLýnÖÿÿLý[´ÿ ÿLýP’ÿ"ÿLüN„æÿ#ÿLý{Üÿ%ÿLýrÑÿ'ÿLýjÆÿ)ÿLýc¹ÿ+ÿLý]®ÿ-ÿ LýZ£ÿ/ÿ Lý_©ÿ1ÿLýgµÿ3ÿLýoÁÿ5ÿLüMxÎÿ5ÿøÞrLLOÙÿ6ÿù“PLRŠäÿ6ÿýµ[LLþôÿ6ÿýÙpLL7ÿýOLL5ÿý¯YLL3ÿýÔlLL1ÿüúˆNL L0ÿý©VL L.ÿýÅhL L,ÿýÐrLL*ÿýÚzLL(ÿüä‚NLL&ÿüì‹PLL%ÿý”SLL#ÿýžVLL!ÿý¨ZLLÿý°_LLšý¢ÀÍ(Íšüœ¸ÌÍ)Íšý­ÈÍ+Íšý£ÂÍ-Í šü¹ÌÍ.Í šý¯ÉÍ0Í šý©ÃÍ2Íšý¦ÁÍ4Íšý£¾Í6Íšü ¼ÌÍ7Íšüž¹ËÍ9Íüœ¶ÊÍ:ÍýÊÉÍ;Íý Í:Íû̶ÿÿÍ9ÍýȨÿÿ9Íþ¿ÿÿ7Íý˱ÿÿ6ÍýƤÿÿ5Íþ»ÿÿ3Íýɬÿÿ2Íþ½ÿ ÿ0ÍýÈ«ÿ ÿ/Íþ»ÿ ÿ-ÍýǪÿÿ,Íþºÿÿ*ÍýǨÿÿ(Íý̹ÿÿ'ÍýƧÿÿ%ÍýË´ÿÿ$Íý½©ÿÿ"ÍýŨÿÿ ÍýʲÿÿÍýÌ»ÿÿÍýæÿÿÍýɯÿ ÿÍý̹ÿ"ÿÍü̽¡ÿ#ÿÍýÀ¤ÿ%ÿÍý§ÿ'ÿÍýĪÿ)ÿÍýÇ®ÿ+ÿÍýȱÿ-ÿ ÍýÉ´ÿ/ÿ ÍýDzÿ1ÿÍýůÿ3ÿÍýìÿ5ÿÍýÁ¨ÿ5ÿø£ÂÍÍ̾¥ÿ6ÿù¹ÌÍË»¢ÿ6ÿý¯ÉÍÍþÇÿ6ÿý¥ÃÍÍ7ÿýºÌÍÍ5ÿý±ÉÍÍ3ÿý¦ÄÍÍ1ÿüà¼ÌÍ Í0ÿý²ÊÍ Í.ÿý«ÅÍ Í,ÿý§ÂÍÍ*ÿý¤ÀÍÍ(ÿü¢¾ÌÍÍ&ÿü©»ÌÍÍ%ÿý¹ËÍÍ#ÿý¶ÊÍÍ!ÿý³ÉÍÍÿý±ÇÍͧý±áÿ(ÿ§ü©Ñûÿ)ÿ§ýÀòÿ+ÿ§ý²äÿ-ÿ §üªÔüÿ.ÿ §ýÃôÿ0ÿ §ý¹èÿ2ÿ§ýµãÿ4ÿ§ü±Þþÿ5ÿ§ü®Øýÿ7ÿ§ü«Óûÿ9ÿü©Îøÿ:ÿýöõÿ;ÿýå®ÿ:ÿýýÎÿ;ÿýò¸ÿ;ÿþÞÿ;ÿýûÆÿ;ÿýí³ÿ;ÿþ×ÿ;ÿýô¾ÿ;ÿþÚÿ;ÿýó¼ÿ:ÿýþØÿ;ÿýñ»ÿ:ÿýþÖÿ;ÿýï¹ÿ:ÿýýÓÿ;ÿýí·ÿ:ÿýùËÿ:ÿüþÛ³ÿ:ÿýë¸ÿ:ÿý÷Çÿ:ÿýý×ÿ;ÿýèµÿ:ÿýôÃÿ:ÿýüÔÿ:ÿüýÛ°ÿ:ÿýà³ÿ:ÿýå·ÿ:ÿýê¼ÿ:ÿýïÁÿ:ÿýóÆÿ:ÿýõËÿ:ÿýñÈÿ:ÿýìÃÿ:ÿýç¾ÿ9ÿüþâ¹ÿ5ÿø²åÿÿýÝ´ÿ6ÿùÓüÿûذÿ6ÿýÃôÿÿþÈÿ6ÿý´æÿ;ÿýÖýÿ:ÿýÅöÿ:ÿý¶éÿ:ÿüÞÙþÿ:ÿýÈ÷ÿ:ÿý¼ìÿ:ÿý¸åÿ:ÿý´áÿ:ÿü°Üþÿ9ÿü³×üÿ:ÿýÒúÿ:ÿýÎøÿ:ÿýÉõÿ:ÿýÅñÿÿ 2ýCÍÿ(ÿýÓB22ýXåÿ(ÿýÎ?22þwÿ)ÿýÉ>22ý7Ÿÿ)ÿýÄ<22ýCÆÿ)ÿý¿:22ýXåÿ)ÿý²822þwÿ*ÿý›42 2ý7Ÿÿ*ÿþ„22ýCÆÿ*ÿþn22ýXåÿ*ÿþ]2 2ý3~ÿ*ÿýáO22þ¶ÿ*ÿýÑD22+ÿý½<22*ÿý¨722)ÿý‘322(ÿþz22'ÿþf22%ÿýÝQ22$ÿý»>22#ÿý“522"ÿþm22 ÿýÝP22ÿýº>22ÿý’522ÿþl22ÿýÜP2 2ÿýº>2!2ÿý42"2ÿýía2$2ÿýºB2%2ÿý‚42&2ÿýÛT2(2ÿý¨;2)2ÿþq2+2ÿýÌJ2,2ÿý•72-2 ÿýñc2/2 ÿý¯B202 ÿýõk222ÿý«?232ÿýèg232ý3ˆÿÿý¦>232ý5 ÿÿýäd242ý=ºÿÿý¢=242ýNÚÿÿýàa252þiÿÿýž;242ý4ÿÿ62ý=¶ÿÿ52ýMÙÿÿ42þgÿÿ22ý4Œÿ ÿ12ý<µÿ ÿ02ýLØÿ ÿ/2þfÿ ÿ-2ý4‹ÿÿ,2ý@·ÿÿ+2ý^åÿÿ)2ý6ÿÿ(2ýHÈÿÿ'2þmÿÿ%2ý:£ÿÿ$2ýQØÿÿ"2ý3}ÿÿ!2ý@¶ÿÿ 2ý]åÿÿ Lý[Öÿ(ÿýÛZLLýmêÿ(ÿýÖXLLþ‰ÿ)ÿýÒVLLýP­ÿ)ÿýÎTLLý[Ïÿ)ÿýÉSLLýmêÿ)ÿý½RLLþ‰ÿ*ÿý©NL LýP­ÿ*ÿþ•LLý[Ïÿ*ÿþLLýmêÿ*ÿþrL LýMÿ*ÿýçfLLþÁÿ*ÿýÙ\LL+ÿýÇULL*ÿýµPLL)ÿý MLL(ÿþŒLL'ÿþzLL%ÿýägLL$ÿýÆWLL#ÿý¢NLL"ÿþ€LL ÿýägLLÿýÅWLLÿý¡NLLÿþLLÿýãfL LÿýÄVL!Lÿý NL"LÿýñvL$LÿýÅZL%Lÿý“ML&LÿýâkL(LÿýµTL)Lÿþ„L+LÿýÕbL,Lÿý¤PL-L ÿýôwL/L ÿý»ZL0L ÿý÷~L2Lÿý·XL3Lÿýì{L4Lþ™ÿÿý³WL3LýO®ÿÿýéxL4LýUÄÿÿý¯UL4LýeáÿÿýæuL5Lþ|ÿÿý«TL4LýMÿÿ6LýUÁÿÿ5Lýdàÿÿ4Lþ{ÿÿ2LýMœÿ ÿ1LýUÀÿ ÿ0Lýcßÿ ÿ/Lþzÿ ÿ-LýM›ÿÿ,LýXÂÿÿ+Lýsêÿÿ)LýOŸÿÿ(Lý_Ñÿÿ'Lþÿÿ%LýS°ÿÿ$Lýhßÿÿ"LýMÿÿ!LýXÁÿÿ Lýrêÿÿ Íýɦÿ(ÿý¤ÉÍÍýÄ ÿ(ÿý¦ÊÍÍþ¼ÿ)ÿý§ÊÍÍý̱ÿ)ÿý¨ËÍÍýɨÿ)ÿý©ËÍÍýÄ ÿ)ÿý­ËÍÍþ¼ÿ*ÿý²ÌÍ Íý̱ÿ*ÿþ¸ÍÍýɨÿ*ÿþ¾ÍÍýÄ ÿ*ÿþÂÍÍþºÿ*ÿý¡ÆÍÍþ¬ÿ*ÿý¥ÈÍÍ+ÿýªÊÍÍ*ÿý¯ÌÍÍ)ÿþµÍÍ(ÿþ»ÍÍ'ÿþÀÍÍ%ÿý¢ÅÍÍ$ÿýªÊÍÍ#ÿýµÌÍÍ"ÿþ¾ÍÍ ÿý¢ÅÍÍÿý«ÊÍÍÿýµÌÍÍÿþ¾ÍÍÿý¢ÆÍ Íÿý«ÊÍ!ÍÿýµÌÍ"Íÿý¸ÁÍ$Íÿý«ÉÍ%Íÿþ¹Í'Íÿý¢ÄÍ(Íÿý¯ËÍ)Íÿþ½Í+Íÿý¦ÇÍ,Íÿý´ÌÍ-Í ÿýÇÁÍ/Í ÿý­ÉÍ0Í ÿýÕ¿Í2Íÿý¯ÊÍ3Íÿý©ÀÍ4Íþ·ÿÿý°ÊÍ3Íý̱ÿÿý ÀÍ4ÍýÊ«ÿÿý±ÊÍ4ÍýÆ£ÿÿý¡ÁÍ5Íþ¿ÿÿý²ËÍ5Íþ¶ÿÿ6Íýʬÿÿ5ÍýÆ£ÿÿ4ÍþÀÿÿ3Íþ¶ÿ ÿ1Íýʬÿ ÿ0ÍýÆ£ÿ ÿ/ÍþÀÿ ÿ.Íþ·ÿÿ,ÍýÉ«ÿÿ+Íý ÿÿ)Íý̵ÿÿ(Íýǧÿÿ'Íþ¾ÿÿ%Íý˱ÿÿ$ÍýÅ£ÿÿ#Íþºÿÿ!Íýɬÿÿ Íý ÿÿ ÿýôµÿ(ÿý³õÿÿýè®ÿ(ÿýµöÿÿþØÿ)ÿý·÷ÿÿýüÆÿ)ÿý¹ùÿÿýô¸ÿ)ÿýºúÿÿýè®ÿ)ÿý¿ûÿÿþØÿ*ÿýÈþÿ ÿýüÆÿ*ÿþÒÿÿýô¸ÿ*ÿþÜÿÿýè®ÿ*ÿþåÿ ÿýþÕÿ*ÿý¯íÿÿþ¾ÿ*ÿý´ôÿ;ÿý»øÿ;ÿýÃüÿ;ÿýÌþÿ;ÿþ×ÿ<ÿþáÿ;ÿý°ìÿ;ÿý¼÷ÿ;ÿýÌýÿ;ÿþÝÿ;ÿý°ìÿ;ÿý¼÷ÿ;ÿýÌýÿ;ÿþÞÿ;ÿý±íÿ;ÿý¼÷ÿ;ÿýÍþÿ:ÿý½ãÿ;ÿý¼õÿ;ÿýÓþÿ:ÿý±êÿ;ÿýÃùÿ;ÿþÛÿ;ÿý¶ðÿ;ÿýËüÿ:ÿýÈâÿ;ÿýÀõÿ:ÿýÓÞÿ;ÿýÂöÿ:ÿý³àÿ4ÿþÐÿÿýÄ÷ÿ3ÿýýÆÿÿý®âÿ4ÿýø¼ÿÿýÅøÿ4ÿýî±ÿÿý¯ãÿ5ÿþßÿÿýÇùÿ4ÿýþÎÿ;ÿýø¾ÿ;ÿýî²ÿ;ÿþàÿ;ÿýþÎÿ;ÿýø¾ÿ;ÿýï²ÿ;ÿþáÿ;ÿýþÏÿ;ÿýö½ÿ;ÿýå®ÿ:ÿýýÍÿ;ÿýñ·ÿ;ÿþÝÿ;ÿýúÅÿ;ÿýì²ÿ:ÿýþÕÿ;ÿýö¾ÿ;ÿýå®ÿÿ&2ý:Îÿÿ%2ý5¶ÿÿ%2þ™ÿÿ$2þÿÿ#2þpÿÿ"2þhÿÿ!2þ`ÿÿ 2þYÿÿ2þRÿÿ2ýMõÿÿ2ýGäÿÿ2ýCÜÿÿ2ý?Õÿ ÿ2ý<Ìÿ!ÿ2ý9Ãÿ"ÿ2ý7ºÿ#ÿ2ý5¯ÿ$ÿ2ý5§ÿ%ÿ2ý6¬ÿ&ÿ2ý7²ÿ'ÿ2ý8¸ÿ(ÿ2ý:½ÿ)ÿ2ý<Ãÿ*ÿ2ý=Éÿ+ÿ2ý?Îÿ,ÿ2ýBÓÿ-ÿ 2ýDÙÿ.ÿ 2ýGÝÿ/ÿ 2ýJáÿ0ÿ 2ýMåÿ1ÿ 2ýVøÿ2ÿ2þfÿ4ÿ2þzÿ5ÿ2ý3‘ÿ6ÿ2ý7©ÿ7ÿ2ý=¿ÿ8ÿ2ýEÓÿ9ÿ2ýQäÿ:ÿý2_ÿ<ÿþrÿ>ÿ&LýTÖÿÿ%LýNÁÿÿ%Lþ¨ÿÿ$Lþÿÿ#Lþƒÿÿ"Lþ|ÿÿ!Lþuÿÿ LþnÿÿLþhÿÿLýd÷ÿÿLý_éÿÿLý[ãÿÿLýXÜÿ ÿLýUÕÿ!ÿLýRÍÿ"ÿLýPÄÿ#ÿLýN»ÿ$ÿLýN´ÿ%ÿLýO¸ÿ&ÿLýP½ÿ'ÿLýRÂÿ(ÿLýSÇÿ)ÿLýTÍÿ*ÿLýVÒÿ+ÿLýXÖÿ,ÿLýZÛÿ-ÿ Lý\àÿ.ÿ Lý_äÿ/ÿ Lýbçÿ0ÿ Lýdêÿ1ÿ Lýlúÿ2ÿLþzÿ4ÿLþŒÿ5ÿLýM ÿ6ÿLýPµÿ7ÿLýUÉÿ8ÿLý]Ûÿ9ÿLýgéÿ:ÿýLtÿ<ÿþ…ÿ>ÿ&Íý˦ÿÿ%Íý̬ÿÿ%Íþ³ÿÿ$Íþºÿÿ#Íþ½ÿÿ"Íþ¿ÿÿ!ÍþÁÿÿ ÍþÃÿÿÍþÅÿÿÍýÆÕÿÿÍýÈ ÿÿÍýÉ¢ÿÿÍýʤÿ ÿÍýʦÿ!ÿÍý˨ÿ"ÿÍýÌ«ÿ#ÿÍýÌ­ÿ$ÿÍý̯ÿ%ÿÍýÌ®ÿ&ÿÍýÌ­ÿ'ÿÍýË«ÿ(ÿÍý˪ÿ)ÿÍý˨ÿ*ÿÍýʧÿ+ÿÍýʦÿ,ÿÍýɤÿ-ÿ ÍýÈ£ÿ.ÿ ÍýÈ¢ÿ/ÿ ÍýÇ¡ÿ0ÿ ÍýÆ ÿ1ÿ ÍýÄàÿ2ÿÍþÀÿ4ÿÍþ»ÿ5ÿÍþµÿ6ÿÍý̯ÿ7ÿÍýÊ©ÿ8ÿÍýȤÿ9ÿÍýÅ ÿ:ÿýÍÂÿ<ÿþ½ÿ>ÿ&ÿýùµÿ;ÿýý¾ÿ<ÿþÉÿ<ÿþÕÿ<ÿþÛÿ<ÿþàÿ<ÿþäÿ<ÿþèÿ<ÿþëÿ<ÿýîÓÿ;ÿýò®ÿ;ÿýô±ÿ;ÿýö³ÿ;ÿýø¶ÿ;ÿýû¹ÿ;ÿýü¼ÿ;ÿýýÀÿ;ÿýýÃÿ;ÿýýÂÿ;ÿýü¿ÿ;ÿýû½ÿ;ÿýú»ÿ;ÿýù¹ÿ;ÿýø·ÿ;ÿýöµÿ;ÿýõ³ÿ;ÿýó²ÿ;ÿýò°ÿ;ÿýð¯ÿ;ÿýî®ÿ;ÿýéÞÿ;ÿþáÿ<ÿþ×ÿ;ÿýþÌÿ;ÿýüÃÿ;ÿýøºÿ;ÿýó³ÿ;ÿýì®ÿ;ÿþäÿ<ÿþÚÿ>ÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿ½ÿüä™^ÿ8ÿù׌T322ÿ5ÿüÇ‚K222ÿû¶†^=22-ÿúÏ›oK32 2(ÿúᲂ[;22ÿùþÇÐÚäÿÿöߨzfTD522 ÿõУ}]A676542(2ÿüËX7222ÿý‚5242ÿýÂJ262ÿýy4272ÿþ„292ÿýÅ5292ÿý2J2:2ÿ=2þÿ2=2þÿ2þ2þÿ2=2½ÿüé§sÿ8ÿùÞœkMLLÿ5ÿüГcLL2ÿûÁ—sULL-ÿúש‚cML L(ÿú罓qTLLÿùÍÈÐØáéÿÿöæÌµ Œ{k\OLL ÿúذrYPPýOML(LÿüÔnQL2Lÿý“OL4LÿýÌbL6Lÿý‹ML7Lÿþ•L9LÿýÎNL9LÿýLaL:Lÿ=LþÿL=LþÿLþLþÿL=L½ÿü ³Âÿ8ÿü£¶ÄÍÍ6ÿü§¹ÇÍÍ2ÿû¬¸ÂÊÍÍ-ÿû¥²¾ÇÍ Í(ÿú¡­¹ÃËÍÍÿù¨ª§¥£ ÿÿö¡©¯µ»ÀÄÈÌÍÍ ÿú¥±ºÂÉÌÌ*Íÿü¦ÃÌÍ2Íÿý¹ÌÍ4Íÿý©ÇÍ6Íÿþ»Í8Íÿþ¸Í9Íÿý¨ÌÍ9ÍÿýÍÇÍ:Íÿ=ÍþÿÍ=ÍþÿÍþÍþÿÍ=Í<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ<ÿ9ÿü®Éå6ÿù²Îêþÿÿ3ÿü¸Óïÿÿ/ÿû¾Ñåøÿÿ*ÿúµÈÜïþÿ ÿ%ÿú¯¿Óæùÿÿÿù¹»¸´±®ÿÿö°¹ÃÍ×àêôýÿÿÿú´ÅÕåöüüýýþÿ(ÿÿü¶èüÿ2ÿÿýÓýÿ4ÿÿý¹ðÿ6ÿÿý×þÿ7ÿýÿÒÿ9ÿý´ýÿ9ÿýïÿ:ÿþ‰ÿ;ÿü:ýÿ;ÿý¾ÿ<ÿýòÿ<ÿþ)ÿ=ÿþ]ÿ=ÿþ’ÿ=ÿþÆÿ=ÿþòÿ=ÿþÒÿ=ÿþ ÿ=ÿþnÿ=ÿþ<ÿ=ÿý þÿ<ÿýØÿ<ÿ¿ÿþýÿ<ÿý?ÿ:ÿûÇS22ÿ8ÿüñr3228ÿý—=226ÿýÀO224ÿüäm3223ÿý:221ÿýºK2 2/ÿýÞg2 2-ÿüý72 2,ÿý<22*ÿýžC22(ÿý¯K22&ÿýÁV22$ÿýÑc22"ÿüßp422 ÿüý722ÿüõ†<22ÿüà{922ÿüÖq62 2ÿüÉf42"2ÿý¼]2%2ÿý®T2'2ÿý¢L2)2ÿüà†C2+2 ÿü°a42-2 ÿüÞ…C202ÿü­_4222ÿüÜ‚B252ÿü«]4272ûÿ¥g:2:2þ62~2¿ÿþýÿ<ÿý«Wÿ:ÿûÐiLLÿ8ÿüô…MLL8ÿý¥ULL6ÿýÊfLL4ÿýé€LL3ÿý TLL1ÿýÄcL L/ÿýå{L L-ÿüýQL L,ÿýULL*ÿý«[LL(ÿý»cLL&ÿýËlLL$ÿýÙwLL"ÿüæƒNLL ÿüýQLLÿü÷—ULLÿüæSLLÿüÝ„PL LÿüÒ{ML"LÿýÇrL%LÿýºjL'Lÿý¯cL)Lÿüæ—[L+L ÿü¼vNL-L ÿüå•[L0Lÿü¹tML2Lÿüã“ZL5Lÿü·rML7Lûÿ²{SL:LþPL~L¿ÿþõÿ<ÿý²Êÿ:ÿû§ÅÍÍÿ8ÿýǽÍÍ8ÿý´ÊÍÍ6ÿý©ÆÍÍ4ÿý ¾ÍÍ3ÿýµËÍÍ1ÿý«ÇÍ Í/ÿý¢ÀÍ Í-ÿüõºÌÍ Í,ÿý¶ÊÍÍ*ÿý²ÉÍÍ(ÿý­ÇÍÍ&ÿý©ÄÍÍ$ÿý¥ÁÍÍ"ÿü¡½ÌÍÍ ÿüõºÌÍÍÿüÕ¸ÊÍÍÿü¡»ËÍÍÿü¤½ÌÍ Íÿý§ÀÍ#ÍÿýªÂÍ%Íÿý®ÄÍ'Íÿý±ÆÍ)Íÿü¡¸ÉÍ+Í ÿü­ÁÌÍ-Í ÿü¢¸ÉÍ0Íÿý®ÂÍ3Íÿü¢¹ÉÍ5Íÿý¯ÂÍ8Íûÿ°ÀËÍ:ÍþÌÍ~Í¿ÿþôÿ<ÿýÇ÷ÿ:ÿý¸ëÿ:ÿüÈÚþÿ:ÿýÊøÿ:ÿýºíÿ:ÿý®Ýÿ;ÿýÍùÿ:ÿý¼ïÿ:ÿý°àÿ:ÿüôÕüÿ:ÿýÎøÿ:ÿýÇôÿ:ÿýÀïÿ:ÿýºéÿ:ÿý´âÿ:ÿü°Ûþÿ9ÿüôÕüÿ9ÿüÓÑøÿ9ÿü¯Öúÿ9ÿü³Ûüÿ9ÿü·àþÿ9ÿý»åÿ:ÿýÁêÿ:ÿýÅïÿ9ÿü¯Ñôÿ9ÿüÀãþÿ8ÿü°Òôÿ9ÿüÁäþÿ8ÿü±Óõÿ9ÿüÂåþÿ8ÿüÄàúÿ:ÿþüÿ~ÿÿý†6272úQÖÿÂK272ù3}ÿÿv3272ýA·ÿÿ92ý`èÿÿ72ý6“ÿÿ62ýJËÿÿ52þrÿÿ32ý<«ÿÿ22ýZÞÿ ÿ02ý8”ÿ ÿ/2ýU×ÿ ÿ-2ý7Žÿÿ,2ýQÐÿÿ*2ý5ˆÿÿ)2ýMËÿÿýÛ2&2ý4‚ÿÿü­^42&2ýJÅÿÿüÞ„B2'2ý4|ÿÿü°a42(2ýG¾ÿ ÿüÇ|C2)2ý3vÿ ÿüÎG2+2ýGºÿ ÿüÖ†K2,2ý5~ÿÿüÜŒP2.2ýPÉÿÿûá’T32.2ý8Žÿÿûí˜X4202ý[Ùÿÿüž]5212ý=ŸÿÿûË‹X5232øiåÿñ¥mA252ùC°Á„S4262û3[c<292ý732ª2ÿý—PL7LúgÝÿÌcL7LùMÿÿˆML7LýYÂÿÿ9Lýuìÿÿ7LýP¢ÿÿ6LýbÔÿÿ5Lþ…ÿÿ3LýU·ÿÿ2Lýpåÿ ÿ0LýR£ÿ ÿ/LýkÞÿ ÿ-LýPžÿÿ,LýhØÿÿ*LýO˜ÿÿ)LýdÔÿÿýâ’L&LýN“ÿÿü¹sML&LýaÎÿÿüå•ZL'LýMÿÿü¼uNL(Lý^Èÿ ÿüÐ[L*Lþˆÿ ÿüÖ’_L+Lý^Äÿ ÿüÝ—cL,LýNÿÿüãœfL.LýgÒÿÿüç¡jL/LýQžÿÿûñ¦nML0Lýqàÿÿü«rNL1LýU­ÿÿûÔ›nOL3Lø|êÿô²€YL5Lù[¼Ë•iML6LûMpyUL9LþPL«Lÿý¸ÌÍ7ÍúŤÿ©ÇÍ8Íûºÿÿ¼Í8ÍýÉ«ÿÿ9ÍýÁ©ÿÿ7Íý̵ÿÿ6ÍýǦÿÿ5Íþ½ÿÿ3Íýʯÿÿ2Íýâÿ ÿ0ÍýË´ÿ ÿ/ÍýÄ£ÿ ÿ-Íý̶ÿÿ,ÍýÅ¥ÿÿ*ÍýÌ·ÿÿ)ÍýƦÿÿý¢¹Í&Íý̹ÿÿý®ÂÍ'ÍýǨÿÿü¢¸ÉÍ(Íþºÿÿü­ÁÌÍ(ÍýȪÿ ÿü§ºÉÍ*Íþ¼ÿ ÿü¦¹ÈÍ+ÍýÈ«ÿ ÿü¤¸ÇÍ,Íý̺ÿÿü¢¶ÆÍ.Íýŧÿÿü¡µÄÍ/Íý̶ÿÿü¸³ÃÍ1Íýãÿÿü²ÂÌÍ1Íýʱÿÿû¦·ÃÌÍ3Íø¿ ÿǰ¾ÉÍ5ÍúÉ­©¸ÅÍ8ÍüÃÁÊÍ9ÍþÌÍ«ÍÿýÑüÿ7ÿúì³ÿ¹ïÿ7ÿùþÕÿÿÙþÿ7ÿýö½ÿ;ÿýä³ÿ:ÿýüÌÿ;ÿýð¶ÿ;ÿþÚÿ;ÿýøÂÿ;ÿýç°ÿ:ÿýûËÿ;ÿýê²ÿ:ÿýüÎÿ;ÿýì´ÿ:ÿýýÐÿ;ÿýî¶ÿÿý±Ôÿ&ÿýþÓÿÿüÁåþÿ&ÿýð¸ÿÿü°Òõÿ'ÿýþÖÿÿüÀãþÿ(ÿýò»ÿ ÿü¸Öôÿ*ÿþÙÿ ÿüµÔòÿ+ÿýò¼ÿ ÿü³Ñïÿ,ÿýýÕÿÿü±Îíÿ.ÿýì·ÿÿü¯Ìêÿ/ÿýûÎÿÿû½Êèþÿ0ÿýæ²ÿÿüÇåýÿ1ÿýøÆÿÿû¶Ïèýÿ3ÿøß®ÿÈÄÝöÿ5ÿùôÀºÒëþÿ6ÿûþæáøÿ9ÿþüÿ«ÿÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþµ‡ ‡ÿþ’‡ ‡þ¨ÃÃþ»   ÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ’‡ ‡þ¨Ã-Ãÿþ‡ ‡þ¨Ã-Ãûÿª\|‡ ‡þ¨Ã-ÃûA22{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þ{‡ ‡þ¨Ã-Ã2þx‡ ‡þ¥Ã-Ã2þm‡ ‡þ™Ã-Ã2þb‡ ‡þÃ-Ã2þW‡ ‡þ½Ã,Ã2þK‡ ‡þ±Ã,Ã2þ@‡ ‡þ¥Ã,Ã2þ5‡ ‡þ—Ã,Ã2þ‡ ‡þ±Ã+Ã2þl‡ ‡ý¿Ã*Ã2þH‡ ‡þÃ*Ã2þy‡ ‡þ°Ã)Ã2þU‡ ‡ýŒ¿Ã(Ã2ý6‚‡ ‡ý’¸Ã'Ã2þa‡ ‡üˆ¤ÂÃ%Ã2ý=†‡‡ý‘¶Ã$Ã2þk‡‡ûˆ¢¸ÂÃ!Ã2ý9}‡‡ú‰“Ÿ«·¾¾2ýB„‡4‡2þO‡4‡ 2þ`‡3‡ 2ý3o‡2‡ 2ý8{‡1‡ 2ý:o‡0‡ 2üQ‰‡.‡ 2ø9qÇüüÜ“‡-‡2üN—îüüüûô©‡,‡2þ34432ýO|‡*‡2üGgƒ‡'‡2ü6Qq‡%‡2ù422(ÓþרØ(ÓþרØ(ÓþרØ(ÓþרØ(ÕØ<×üÖÕÔÓ<ÓúѰŠn7nüm`OLL(Dþ(Dþ(Dþ(Dþ(.þý7ú'1=<þ;::987654@2 €ÿgfedcbüa``__^]\[ZYXWVUTSRQPONþML?L €šÅÆÇÈÉÊË ÌAÍ €§ìíîïðñòóôõö÷øùúûüýþ@ÿ6üýù’‡‡7üþLJ‡7üýû–‡‡8üþχ‡9üþ›‡‡9üþׇ‡:üþ ‡‡:üý߈‡‡;üþ¦‡‡;üû扇‡ü;üü­‡‡ü;üü슇ü<üý³‡ü<üýòü=üþºü=üþöüDüÄûúøø÷öõôòòñðïîííìêéèèçæåäããáàßÞÝÝÜÛÚÙØØ×ÖÕÓÒÒÑÐÏÎÎÍÌËÊÉÉÈÇÆ33}26ÿýþ×ÓÓ7ÿþëÓÓ8ÿþÙÓÓ8ÿþîÓÓ9ÿþÚÓÓ9ÿþñÓÓ:ÿþÝÓÓ:ÿþôÓÓ;ÿþßÓÓ;ÿû÷ÔÓÓÿ;ÿüáÓÓÿ;ÿüùÔÓÿ<ÿýäÓÿ<ÿýûÕÿ=ÿþæÿ=ÿþýÿDÿÏþýüüûúùø÷÷öôóòññðïîííìëêéèèçææåääãâáàßßÞÝÜÛÚÚÙØ×ÖÖöÕÔÓÒÒÑÐÏML~L6šý—LDD7šþsDD7šý™ODD8šþyDD9šþRDD9šþDD:šþWDD:šþ„DD;šþ[DD;šûŠEDDš;šü`DDš;šüŽFDš<šýdDš<šý“Hš=šþiš=šþ•šEš›œžŸ ¡¢£¤¥¦§þ¨ÍÍ6§ý©óÿÿ7§þÆÿÿ8§þïÿÿ8§þÁÿÿ9§þêÿÿ9§þ»ÿÿ:§þåÿÿ:§ý·þÿÿ;§þàÿÿ;§û³ýÿÿ§;§üÚÿÿ§;§ü¯ûÿ§<§ýÕÿ§<§ý¬ù§=§þϧ=§þª§E§¨©ª«¬­®¯°±²³´µ¶·¸þþÿ~ÿ‡þ·Ã"Ãý½‰‡‡þ—Ã#Ãþ£‡‡þ³Ã"Ãý¿‹‡‡þ“Ã#Ãþ§‡‡þ¯Ã"ÃþÁ  ‡þÃ4à ‡þ¬Ã3à ‡ýŽÁÃ2à ‡þ¨Ã2à ‡ý‹ÀÃ1à ‡þ¤Ã1à ‡ýоÃ0à ‡þ¡Ã0à ‡ýˆ¼Ã/à ‡þÃ/Ãþ‡ ‡þ¹Ã.ÃþÁ‡ ‡þ™Ã.Ãýù“‡ ‡þ¶Ã-Ãýüɇ ‡þ–Ã-Ãüüû—‡ ‡þ²Ã,Ãüþч ‡þ’Ã,Ãüþœ‡ ‡þ¯Ã+ÃüþÙ‡ ‡ýÂÃ*Ãüþ¢‡ ‡þ«Ã*Ãüýàˆ‡ ‡ýÁÃ)Ãüþ¨‡ ‡þ§Ã)Ãüý艇 ‡ý‹ÀÃ(Ãüþ®‡ ‡þ£Ã(Ãüý틇 ‡ý‰½Ã'Ãüþµ‡ ‡þ™Ã'Ãüýò‡ ‡þ£Ã&Ãüþ»‡ ‡þ¯Ã%Ãüý÷‡ ‡ý‰¸Ã$ÃüþÇ ‡ý޾Ã#Ãüýú”‡ ‡ý¯Ã"à üþЇ‡ý“³Ã à üþ®‡‡ý–¶Ãà üý÷–‡‡ú”¦¯¹¾¾ üý⊇0‡ üþÁ‡0‡ üþ£‡/‡ üýð‡.‡üýꘇ-‡üýö§‡,‡üý¼ˆ‡*‡êÅÄÄÃÂÁÀ¿¿¾½¼»»ºº¹¸·§Š‡)‡2ý>x‡(‡2ü3Ns‡&‡2üCg…‡#‡2ü9[~‡!‡2ø4CO[gs‡‡"2ý6AGG2Óþר"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ"Øþ×ÓÓþÔØ#ØþÕÓÓþÖØ#ØÕÓþÔØ4Ø ÓþÖØ3Ø ÓþÔØ3Ø ÓþÖØ2Ø Óþר1Ø ÓþÕØ1Ø Óþר0Ø ÓþÕØ0Ø Óþר/Ø ÓþÕØ/ØþÖÓ Óþר.ØþéÓ ÓþÔØ.Øýþ×Ó Óþר-ØýÿìÓ ÓþÔØ-ØÿþÙÓ ÓþÖØ,ØÿþïÓ ÓþÔØ,ØÿþÛÓ ÓþÖØ+ØÿþòÓ ÓþÔØ+ØÿþÝÓ ÓþÖØ*ØÿþõÓ Ó+ØÿþßÓ ÓþÖØ)Øÿý÷ÔÓ Óþר(ØÿþâÓ ÓþÕØ(ØÿýùÔÓ Óþר'ØÿþäÓ ÓþÔØ'ØÿýûÕÓ ÓþÕØ&ØÿþçÓ ÓþÖØ%ØÿýýÖÓ Óþר$ØÿþêÓ ÓýÔר#ØÿýþØÓ ÓýÔÖØ"Ø ÿþîÓÓýÔÖØ Ø ÿþâÓÓýÔרØ ÿýýÙÓÓûÔÕÕÖ×× ÿýõÔÓ0Ó ÿþéÓ0Ó ÿþÝÓ/Ó ÿýû×Ó.ÓÿýøÙÓ-ÓÿýýßÓ,ÓÿþçÓ+ÓÎíÍÌËÊÉÉÈÇÇÆÆÅÄÃÂÂÈÒÓ)ÓLý_¼Ó(ÓLüNy´Ó&ÓLüf¡ÏÓ#ÓLüXŽÅÓ!ÓLøOfz ³ÆÓÓ"LýRdnnLDþ"ýBDDþ6#þ+DDþ"ýADDþ9#þ(DDþ "þ..Dþ<4 Dþ$3 Dý>2 Dþ'2 Dý@1 Dþ*1 DýB0 Dþ-0 DýC/ Dþ1/þJD Dþ.þoD Dþ4.ý˜MD Dþ-ýštD Dþ7-üš™PD Dþ,šþzD Dþ:,šþSD Dþ!+šþ€D Dý<*šþXD Dþ$*šþ†D Dý?)šþ\D Dþ()šý‹ED Dý@(šþaD Dþ+(šýGD DýB'šþfD Dþ4'šý“ID Dþ+&šþjD Dþ!%šý–KD DýB$šþpD Dý>#šý˜MD Dý< " šþzDDý:  šþaDDý7 šý–ODDù90(  šý‡FD0D šþoD0D šþXD/D šý’KD.DšýQD-Dšý–\D,DšýkED*D¨©ª«ý‰JD)DÍýº\D(DÍüËŸdD&DÍü²wHD#DÍüÁŠRD!DÍøÊ²Ÿ‹xeQDD"ÍýÇ´««ÍÀÿþöÿ=ÿþÊÿ=ÿý¨òÿ<ÿý§Åÿ<ÿ§þîÿ;ÿ§þÀÿ;ÿ§þéÿ:ÿ§þºÿ:ÿ§þäÿ9ÿ§ý¶þÿ8ÿ§þÞÿ8ÿ§ý²ýÿ7ÿ§þÙÿ7ÿ§ý¯ûÿ6ÿ§þÔÿ6ÿ§ý¬øÿ5ÿ§þÎÿ5ÿ§ý©õÿ4ÿ§þÉÿ4ÿ§ý¨ñÿ3ÿ §þÀÿ3ÿ §þÙÿ2ÿ §ý©ïÿ1ÿ §ýµüÿ0ÿ §þÊÿ0ÿ §þãÿ/ÿ §ý­õÿ.ÿ§ý°íÿ-ÿ§ýªßÿ,ÿ§ýÎþÿ*ÿþ¸¹¹º»¼½ýÏúÿªÿ‡? Ã?¾@‡?G2Ó?ÕØ?×@Ó?nLD?.?@D?«Íÿ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü‡ ‡þ¬ÃÃþ±‡ ‡ýôü   þ¶ÃÃþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ±‡ ‡ýôüÃ.Ãþ®‡ ‡ýùüÃ.Ãþ¢‡ ‡üŽüüÃ.Ãþ—‡ ‡ü—üüÃ.Ãþ‹‡ ‡ü¢üüÃ-Ãþ¼‡ ‡ü­üüÃ-Ãþ°‡ ‡ü¹üüÃ-Ãþ¡‡ ‡üÇüüÃ,Ãý¸ˆ‡ ‡ûˆíüüÃ+ÃýÂ’‡ ‡þ¡üü,Ãþ¦‡ ‡þÊüü+Ãý¹ˆ‡ ‡ýøüü+Ãþ”‡ ‡þ­üü)Ãý»•‡ ‡þÛüü(Ãýª‰‡ ‡þ”üü&Ãý¼–‡‡þÁüü#Ãû¸¨Š‡‡þ¡üü¾ú¸¬ ”‰‡‡ýïüü6‡ýˆÓüü6‡þ²üü5‡ý™ùüü4‡ý‹æüü3‡ý‘Ýüü2‡ýïü ü1‡ý°úü ü/‡û…fSRQQPþONNMþL‡-‡ý}B2 2,‡üxS522)‡ü†kG22'‡ü_<22!‡ø€ti]QF522GýB622ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÓ ÓþÖØØþÖÓ ÓýüÿÕ ÕþרØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýüÿØ.ØþÖÓ ÓýþÿØ.ØþÕÓ ÓüÖÿÿØ.ØþÔÓ ÓüÙÿÿØ.Ø ÓüÝÿÿØ-Øþ×Ó ÓüáÿÿØ-ØþÖÓ ÓüæÿÿØ-ØþÕÓ ÓüëÿÿØ,Øþ×Ó ÓüùÿÿØ,ØþÔÓ ÓþÝÿÿ,ØþÕÓ Óþìÿÿ+Øþ×Ó ÓýÕýÿÿ+ØþÔÓ Óþáÿÿ)Øý×ÔÓ Óþòÿÿ(ØþÖÓÓþØÿÿ&Øý×ÔÓÓþéÿÿ$Øý×ÖÓÓþÝÿÿ ×üÖÕÔÓÓýÖúÿÿ7Óþðÿÿ6Óþãÿÿ5ÓýÚþÿÿ4ÓýÕ÷ÿÿ3Óý×óÿÿ2ÓýÛúÿ ÿ1Óýâþÿ ÿ/ÓüÐihhgfedþcÓ-ÓýÃeL L,Óü»€QLL)ÓüѧmLL'ÓüÉ”\LL!ÓøÈµ£~kQLLnýeSLLDþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”šD Dþ#þD Dý”š. .þþD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þD Dý”š.þ!D Dý—š.þ,D DüIšš.þ6D DüPšš.þ@D DüXšš-þD Dü`šš-þ D Dühšš-þ-D Düsšš,ýCD DûEšš+ý:D DþWšš,þ)D Dþvšš+ýCD DýH—šš+þ9D Dþ`šš)ý7D Dþšš(ý%BD DþNšš&ý7DDþošš#û'ADDþWššú#.8BDDýJšš7Dþ|šš6Dþdšš5DýQ˜šš4DýGŠšš3DýK„šš2DýT‘š š1Dýb˜š š/DýH•ÅÅÆ.DýU³Í Í,Dü]˜ÈÍÍ)DüFq«ÍÍ'DüN„½ÍÍ!DøObuˆš­ÈÍÍ«ý³ÆÍÍ=ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý«§ÿ<ÿý©§ÿ;ÿü÷§§ÿ;ÿüí§§ÿ;ÿüä§§ÿ;ÿüÚ§§ÿ;ÿüЧ§ÿ;ÿüƧ§ÿ:ÿûþ¯§§ÿ:ÿþä§§;ÿþħ§:ÿýù©§§:ÿþÚ§§:ÿþ¹§§9ÿþñ§§9ÿþʧ§8ÿþä§§7ÿýö®§§6ÿýþ¾§§6ÿþÕ§§5ÿý쨧§4ÿýú³§§3ÿýô¸§§2ÿýè®§ §1ÿýب§ §/ÿûþòëëììíîþïÿÿ :üûûúø÷öKKJIüHGGFFüEDDCCBAü@??>>=<ü;::99876543ˆ2 :ÿþöýüûúccbba``_^]\[ZYXWVUTSRQPONM‰L <š›þœÇÇÈÉÊËÌŒÍ <§¨þ©ïïðñòóôõö÷øùúûüýþ‰ÿ ü¿öõôòñððïîíìêêéèçæååäãáàßßÞÝÜÛÛÚÙØ×ÖÖÕÓÒÑÐÐÏÎÍÌËËÊÉÈÇÇÆÅÄÃÂÂÁÀ¿¾½2¿2 ÿéúùø÷öôôóòñðïïîíìëêêéèçææØåäãââáàßÞÝÝÜÛÚÙØØ×ÖÖÕÔÔÓÒÑÐÐÏÎÎÍÌÌËÊÉÈÇL¿L šœžŸ ¡¢£¤¥¦§¨©ªÀÍ §©ª«¬­®¯°±²³´µ¶·¸¹º»Àÿ ü×½¼»ºº¹¹¸·¶µ´´³²±°°¯®­­¬¬«ª©¨§§¦¥¥¤££¢¡ Ÿžžêœ››š™™˜——–•””““’‘2¿2 ÿÇÎÆÅÄÃÃÂÂÁÀ¿¿¾½½¼¼»º¹¹¸¸·¶µµ´´³²²±°°¯®®­¬¬««ª©©¨¨§¦¥¥õ¤££¢¢¡  ŸžL¿L šª«¬­®¯°±²³´µþ¶Í¿Í §»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÀÿüýЇ‡üˆ£ÁÃÃüý뇇ýްÃÃüüû»‰‡‡ý˜»Ãà üýà—‡‡ü‰¦ÂÃÃ!üüù³ˆ‡‡ý²ÃÃ#üýØ’‡‡ü™ºÃü#üýô­‡‡ýˆ¡ü%üýÖ“‡‡'üüö°ˆ‡‡)üýÙ”‡‡*üü÷³ˆ‡‡,üýÝ™‡‡-üüûÁŒ‡ ‡/üý ‡1üýÕ”‡ ‡2üüù¹Š‡‡4üý꧇‡6üýÚš‡‡8üýLJ‡9üüö¶Š‡‡;üûꩈ‡ü<üýà¡üüüŽŒŒü‹Š‰ˆˆï‡†……„„ƒ‚‚€€~}||ý{zyyýxwvvöuttsrrqqpooûnmmlkkþjiiÀ2ÿýîÕÓÓþÕØØÿýùÛÓÓýÔÖØØÿýçÔÓÓýÔרØ ÿýõÙÓÓþÕØØ!ÿýþäÓÓýÔÖØØ#ÿýò×ÓÓüÔרÿ#ÿýüáÓÓþÕÿ%ÿýñ×ÓÓ'ÿýýâÓÓ)ÿýòØÓÓ*ÿýýäÓÓ,ÿýóÚÓÓ.ÿýéÕÓ Ó/ÿýúßÓ Ó1ÿýñØÓ Ó2ÿüþæÔÓÓ4ÿýøßÓÓ6ÿýòÚÓÓ8ÿýëÖÓÓ9ÿüýåÔÓÓ;ÿûøàÓÓÿ<ÿýõÝÿÿžýœ››÷š™™˜˜——–••𔓓’‘‘ŽŽŒ‹‹ñЉ‰ˆˆ‡‡††……„„ƒ‚‚þ€~ü}||L¿LšýyIDDüC,šýŽTDDý> šü™jFDDý5 šý†PDDüB)!šü—eEDDý<#šý€LDDü5š#šý”`DDýC-š%šý~MDD'šý•bDD)šýNDD*šü–dEDD,šý„QDD-šü™oHD D/šý\D D1šý~ND D2šü—hFDD4šý[DD6šýRDD8šýsKDD9šü•gFDD;šû]DDš<šý†Wšš¶·¸¹º»¼½¾¿ÀͧýÀøÿÿ§ý°èÿÿ§ýÎýÿÿ §ý¶îÿÿ!§ü©Õþÿÿ#§ý»óÿÿ$§ý«Úÿÿ&§ý¼òÿÿ'§üª×þÿÿ)§ýºñÿÿ*§ü©Õþÿÿ,§ý¸ìÿÿ.§ýÊùÿ ÿ/§ý®Þÿ ÿ1§ý¼ñÿ ÿ2§ü©Ðûÿÿ4§ý°ßÿÿ6§ýºëÿÿ8§ýÆõÿÿ9§üªÒûÿÿ;§û°Þþÿ§<§ý¶ä§§þÍÎÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßÀÿ€Ãþ¿Ã=Ãü‹ªÂÃ;Çý‘³Ã:Çý—¸Ã8Çýœ»Ã6Çüˆ¡¾Ã4ÇüŠ¥¿Ã2à ‡üФ¿Ã0à ‡üФ¿Ã.ÇüФ¿Ã,ÇüŠ¥¿Ã*Çü‰¡¼Ã(Çüˆ¹Ã&Çý™¶Ã$Çü”¯ÂÃ!Çü¦¾ÃÃýך‡‡ü‰ž¸ÃÃüýÌ”‡‡ü–¯ÂÃÃüüú‡‡üŒ¤¼ÃÃüüøÀ‡‡ü˜°ÂÃÃüüø¿‡‡ü¤¼ÃÃüü÷¿‡‡ü–¬ÀÃà üü÷Á’‡‡ü‰œ³Ãà üüûÉ—‡‡ü£¸Ã ÃüýÒ‡‡ü‘¦ºÃÃüüÛ£ˆ‡‡ü’§¼ÃÃüüä­‹‡ ‡ü”§ºÃÃüüò»‘‡!‡û£¶ÃüüüúË›‡"‡þüüüܨ‰‡ ‡üü𽔇‡üü×§‰‡‡!üü𼔇‡$üüÙ¬Œ‡‡&üû÷ÉŸˆ‡‡)üü뺔‡‡,üüß³’‡‡/üüÛ°‡ ‡ðhgffeeddccbbaa`__÷^]]\\[[ZYYXþWVVüUTTSSüRQQPPøONNM[o‚‡‡42û3Fa|‡‡82üB\w‡‡;2û=Xq…2=2þ62¿2€Øþר=ØýÓÖØ<ØÓýÔÖØ:ØÓýÔר8ØÓýÕר6ØÓýÕר4Ø ÓýÕר2Ø ÓýÕר0Ø ÓýÕר.ØÓýÕר,ØÓýÕר*ØÓýÕר(ØÓýÕר&ØÓýÔר$ØÓýÔÖØ"ØÓýÕרØýñÚÓÓýÕרØÿýíØÓÓýÔÖØØÿüþéÖÓÓýÕרØÿüýèÖÓÓýÔÖØØÿüýèÖÓÓýÕרØÿüýèÖÓÓüÔÖרØ ÿüýé×ÓÓýÕÖØØ ÿüþìÙÓÓýÕר ØÿýïÛÓÓüÔÕרØÿýóÞÓ ÓüÔÖרØÿüöáÔÓ ÓüÔÕרØÿüûç×Ó!ÓûÔÕרÿÿüþíÛÓ#ÓÿüóßÔÓ ÓÿüûçØÓÓÿüñßÔÓÓ!ÿüúçØÓÓ$ÿüòáÕÓÓ&ÿüýìÜÓÓ)ÿüùæØÓÓ,ÿüôä×ÓÓ/ÿüóâÖÓ Óû|{{zyyxþwvvutüsrrqqpþonnmlkþjiihgfeûd€¦ÉÓÓ4LûMl—ÂÓÓ8LüeºÓÓ;Lû]ˆ°ÐL=LþSL¿L€þ=ü@%;Dý;:Dý68Dý16DüC-4DüA*2 DüA*0 DüA*.DüA*,DüA**DüB-(DüC0&Dý4$Dü8!!Dü?(ýRDDüB0šýwNDDü7 šü˜pKDDü?+šü—nKDDü5 šü—mJDDü?*šü–mJDDü7# šü–nLDDüB1 šü™uPDDü?+ šý{TDDü;)šý‚YD Dü:(šüˆ`GD Dü8(šü“jKD!Dû<+ššü˜vSD"Dþ?ššüƒ\FD Dšü’lNDDšü[FDD!šü‘kNDD$šü_HDD&šû–tVEDD)šüŽiNDD,šü…dLDD/šü‚bKD Dþ¿ÀÀÁÂÃÄÅÆûŦyODD4Íû̬VDD8Íü´‰]DD;Íû»gGÍ=ÍþÆÍ¿Í€ÿý¼ëÿ<ÿ§ýÂñÿ:ÿ§ü¨Éõÿ8ÿ§ü©Ëõÿ6ÿ§ü©Ìõÿ4ÿ§ü©Ìöÿ2ÿ §ü©Ëóÿ0ÿ §ü¨Äîÿ.ÿ§ý¿èÿ,ÿ§ü¹âþÿ)ÿ§ü´Úûÿ'ÿ§ü¬Ïôÿ%ÿ§ü¨Ãêÿ#ÿ§ü¸Þüÿ ÿ§ü­Íñÿÿ§ü¼ßüÿÿ!§ü­Îñÿÿ$§üºÛùÿÿ&§û©Åæþÿÿ)§ü°Ðñÿÿ,§ü·Õóÿÿ/§ü¹×õÿ ÿàáâãäåæçèéêëìíîüòøþÿÉÿÃû¾«–ˆ‡8‡Ãû¿­™‰‡5‡ÃûÁ°‹‡2‡ Ãûµ¤’‡/‡Ãû¾­œ‹‡+‡Ãû¶¦–‰‡'‡ÃûÁ³£”‡$‡ÃúÀ´¥—Ї‡Ãû·©›‡‡"Ãú¼¯£–Ї‡'Ãúº®¡–‹‡‡,Ãú¼±¦š‡ ‡1ÃøÁ·­¤šˆ‡‡7Ã÷º°§Ÿ—ˆÃ=ÃþÂÿÃü ³ÂÃ;ÇûŠš«¼Ã8Çû‘¢´ÂÃ4ÇûŠšªºÃ1à ‡û¬¼Ã-Çûž­»Ã)ÇúŒš¨¶ÂÃ$Çú‰–¤±¾Ã ÇúŽš§´ÀÃÃ"‡úœ§²½ÃÃ'‡ùŒ—¢­¸ÂÃÃ,‡øˆ™£­·Àà Ã3‡ø—Ÿ§¯·ÀÃÃ:‡÷‹“œ¤¬Me}‡;‡2ûAYq…‡7‡2û6Jaw‡4‡ 2û9Ne{‡0‡ 2û3("Dú<2('Dù@6,",DøC<4+# 3Dø?6/(!:D÷@92*#¢{TD;DÍûµŽgGD7DÍúǦ‚^ED3D ÍûŸ{WD0D Íú¼™zZED+DÍúãƒcGD'DÍúÈ«‹nRD#DÍúÀ£‡kODDÍú¼ŸƒjQDD$Íù©x_HDD)ÍøË¸¡‹u_JD D/Í÷̽§‘}kXGDD6Íö̼ª—„r_MDÍ=ÍþÇÍ~Íÿ€‡÷»³«£œ•Žˆ‡6‡Ãö¼µ®§£—’Œ‡-‡Ãñ½¸²®ª¥¡™•‘Œˆ‡‡Ã𿼹¶³°®­«©§¥£¡ŸŸùžœœ›šš›þœ@Ãü´ºÁÃ;Çö‹’™ §­³¹¾Ã2à ‡òˆ“™ž¤§«°´¸½ÁÃ%Ç䉒•˜› £¦©¬¯±²´¶·¹º¼¾ÀÁÁÂÂÃÃÂ5‡ˆü‰ˆˆ‡D‡÷?IR\foy‚‡6‡2ó4CD6Dö!',16;@D-Dñ"%)-048;?CDDð!#$&(*+-//012321þ0?ü;Dö@:4.("2 DòC?:50+($ %DäB?;8530.+)&# 5DCED÷¸¨™‰zj[MD6DÍóʽ±¥˜Œsf[QGD*DÍíȾµ«¢˜Ž„~xqkd^WQJEDDÿû‡úˆ‘©´‡3‡øˆ‘›¥¯¹ÂÃÃ.‡ø•ž¨±ºÂÃÃ&‡÷‹’™¡©±¹ÁÃÇöŒ’˜£ª±¹ÀÃÇñˆ‹’–œ ¥ª®³¸½Âà Ã¢£¥§¨©¬¯²´¸º¾ÁÃ)ÃùÀ·­¢˜Ã1ÃøÂ»²¨Ÿ–‡‡+Ã÷½¶¯¦ž—ˆ‡ ‡"Ãö½¸²«¥–ˆ‡‡Ãô¿ºµ±¬§£ž˜’Œ‡‡éÀ¾½»¹¸¶µ³±®«©¦¤¡™•’Ž‹‡&‡üƒvh‡5‡ù~qdVI<22.‡÷…znbWK?422%‡ö†}tj`WMC:22‡ó†€yqkd\SKB:322 ‡î†‚{wtoje`[VQLF?82#2üÓûÔÕÖ×Ó4ÓúÔÕÕÖרØ/ÓúÔÕÖÖר Ø'ÓÔûÕÖÖרØÓÔÕÖרÓÔÕÖ×"ØÕÖ×+Ø×ûÖÕÔÓØ2Øú×ÖÖÕÔÓÓ+Ø×úÖÕÕÔÔÓ Ó"Ø×ÖÕÔÓØ×ÖÕÔÓ×ÖÕÔ(Óü͹¡Ó4ÓõÒŰ›†q[MLLÓ-Ó÷Ͼ«™†taPLL%ÓõÑÄ´¥–†whXMLLÓóÑǼ±¦œŽ€seXMLL ÓíÑÌÆÀº´­¥•…}ulaVML"LûDúC;1&D3DøC;3*!.Dø?80'&D÷A:4-&Dö?:50+%DñC@=:72.)%! ï/.,+)('&$!)ù",5>1ø'/7?DD+÷!(/6=CD D"ö$*07=CDDô#(,05:?DDé!$&(*-147:>AD&DüJ_wD4DõESh}’¨½ÌÍÍD-D÷HYl’¥¸ÉÍÍ%DõFTcs‚’¡±ÁÌÍÍDóFP[gr|Š˜¥³ÁÌÍÍ DíFLQW]cjr{ƒ‹”œ¤­¸ÃÌÍ"Íÿ'‡ûŠ›®ÀÃÃ$‡ûŸ²ÂÃÃ!‡ü“¤¶ÃÇûŠš¬½ÃÇû’¢³ÂÃÇûŒ­½Ã#Çûœ«ºÃ'Çû«ºÃ+à ‡úˆ“¡¯½Ã/ÇúŽ›¨µÁÃ3Ãù‡Ž™¥±¾Ã8Ãþ¿Ã|Ãý¶ Ã9Ãú¸¤‡‡Ã6Ãü¸¤‡‡4Ãü¸¤‡‡1Ãüµ¢Ž‡ ‡-Ãû±žŒ‡ ‡*Ãû½«™‰‡‡'Ãüµ£’‡‡#Ãû½¬›‹‡‡ÃûÁ²¡‘‡‡Ãúµ¥–‰‡‡ÃúÁµ¦—‰‡!‡Ãú¾±¢”ˆ‡%‡Ãû¸«ž‡*‡ Ãú¼¯¢•‰‡,‡ý‘±ÃÃú»¯¤˜Œ‡.‡ôƒxlcc¿µª –‹‡0‡üy_D224‡üuZ?220‡û„pV;2 2-‡û~eL52 2)‡û†t[B22&‡û|eN722"‡ûƒmV>22‡ú„pZE322‡úƒq\F422‡ú~jWC32"2‡ú…vdQ=2'2 ‡ú{iWE52+2‡ù†ziYI8202‡ùƒtfUD5252üYK<2|2(ÓüÕÖרØ%ÓýÕÖØØ!ÓüÔÕרØÓüÔÖרØÓüÔÕÖØ ØÓüÕÖר#ØÓüÕÖר'ØÓûÔÕÖר+Ø ÓûÔÕÖר/ØÓûÔÕÖר4ØùÓÔÔÕÖר8Øþר|Øý×ÕØ9Øú×ÕÔÓÓØ6Øü×ÕÔÓÓ4Øü×ÕÔÓÓ1Øü×ÕÔÓ Ó.ØýÖÕÓ Ó*Øü×ÖÔÓÓ'Øü×ÕÔÓÓ#Øü×ÖÕÓÓ ØüÖÕÔÓÓØü×ÕÔÓÓØü×ÕÔÓ"ÓØû×ÖÕÔÓ&ÓØû×ÖÕÔÓ*Ó Øû×ÖÕÔÓ-Óý×ãØØû×ÖÕÔÓ/Óõɬxw××ÖÕÔÓ1Óü¼“hLL3ÓûÒ¶‹`LL0ÓûÏ®…ZL L-ÓûÄuQL L)ÓûѵeLL&ÓûÂxTLL"Óû̪…`LLÓúήŒjNLLÓúͰŽlOLLÓúÅ¥†fNL"LÓúз›}]L'L ÓúÀ£‡jPL+LÓùÒ¾¤ŠqVL0LÓù̵žƒiQL5LüŠs\L|L'DûA2!$Dû?.!Dü:*DûA3#Dû;,Dû?1"#Dû?2$'Dû=0$+ DúC:- /Dú>2'3ùD>4)8þ|ý.9ú+=DD6ü*D D-û/@D D*û$4BDD'ü+;DD#û#2@DDû-;DDú)7CDDú)6BD!Dú,8CD%Dû$0DD*ý!DD!ü'?DDü+ADDýW…ü.BDDûRššü2CDDýMvššý!8DDüIn˜ššü'>DDüHh”ššü/BDDüGg“ššý 7DDüGe’š šü(>DDüGd‘š š ü2CDDüGe‘š š ü'DDüJj”ššü$8DDüMo—ššû1BDDüPu™ššþ@DDýXššDüF`‰ššDüJh’ššDüRt—š šDüF]„š#šDüKi‘š%šDûEWx™š'šDüKgš*š DûEXz™š,š DüNiŽš/šDüH_š2šDûEWt–š4šDüRmš7šûDMg‰š:šþ‚š=šÁÂÃÄÅÆÇÈÉÍÿþþÿ<ÿýä¶ÿ:ÿûë¼§§ÿ8ÿýòç§7ÿü÷˨§§5ÿüùÑ«§§3ÿüúÒ¬§§1ÿüûÔ­§ §/ÿüûÖ®§ §-ÿüúÕ­§ §+ÿüùÓ­§§)ÿüùÒ¬§§'ÿüöÏ«§§%ÿüòÊ©§§#ÿüíĨ§§ ÿüþã¼§§ÿüûÚ³§§ÿüöЭ§§ÿüêÅ©§ §ÿüüݸ§#§ÿüôЭ§%§ÿûþäÁ¨§'§ÿüôÒ°§*§ ÿûþãÀ¨§,§ ÿüñϯ§/§ÿüùÛ¹§2§ÿûýåÅ©§4§ÿüëÌ®§7§ûÿòÒ³§:§þ¹§=§ãäåæçèéêëìíîïðñòóôþõÿÿÿ‡ü‹¾ûü&ü‡ý éü(ü‡ýÈü*ü‡ýªðü+ü‡ý–Øü-ü ‡ü‹»ùü.ü ‡ý£éü0ü ‡ý”Óü2ü‡üŒ¼ùü3ü‡ý©íü5ü‡ýšÚü7ü‡ý‘Èü9üû‡‹¸öü:üýªíübüûåúø÷ööõôòñððïîíìêêéèçæååäãBAAü@??>>=<ü;::998765432ÓüÔèþÿ&ÿÓýÜøÿ(ÿÓýÕëÿ*ÿÓýàúÿ+ÿÓýÙòÿ-ÿ ÓüÔçþÿ.ÿ ÓýÞøÿ0ÿ ÓýØïÿ2ÿÓüÕçþÿ3ÿÓýàùÿ5ÿÓýÚòÿ7ÿÓý×ëÿ9ÿûÓÔåýÿ:ÿýàùÿbÿþåýüûúúùø÷öôôóòñðïïîíìëêêéèZYYXWVUTSRQPONMLDüGl™š&šDýVŒš(šDýItš*šDý^‘š+šDýO€š-š DüGj˜š.š DýYŒš0š DýN|š2šDüGk˜š3šDý]š5šDýRš7šDýKtš9šûDGh–š:šý^šdš›œžŸ ÉÊËÌ!Íÿüûͨ§&§ÿýå±§(§ÿýøÅ§*§ÿýÜ­§+§ÿýï»§-§ ÿüûΨ§.§ ÿýâ±§0§ ÿýñ¾§2§ÿüúΨ§3§ÿýÞ¯§5§ÿý뺧7§ÿýôŧ9§ûÿûѪ§:§ýܯ§d§¨©ª«¬­®ü¯õõöö÷øùúûüýþÿ €ü¿áààßÞÝÜÛÛÚÙØ×ÖÖÕÓÒÑÐÐÏÎÍÌËËÊÉÈÇÇÆÅÄÃÂÂÁÀ¿¾½½¼»ºº¹¹¸·¶µ´´³²±°°¯®­2?2 €ÿþçææÙåäãââáàßÞÝÝÜÛÚÙØØ×ÖÖÕÔÔÓÒÑÐÐÏÎÎÍÌÌËÊÉÈÇÇìÆÅÄÃÃÂÂÁÀ¿¿¾½½¼¼»º¹L?L €š¡¢£¤¥¦§¨©ª«¬­®@Í €§¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁ@ÿ €üÑ­¬¬«ª©¨§§¦¥¥¤££¢¡ ŸŸžžœ››š™™˜——–•””““’‘ŽŒŒü‹Š‰ˆˆö‡†……„„ƒ‚‚2?2 €ÿṸ¸·¶µµ´´³²²±°°¯®®­­¬««ª©©¨¨§¦¥¥ö¤££¢¢¡  Ÿžžýœ››÷š™™˜˜——–••ü”““L?L €š®¯°±²³´µ¶·¸¹@Í €§þÁÂÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓ@ÿ:üý¢:22;üûÙS22ü;üüø‚4ü=üþ¼ü üó€€~}}||{zyyýxwvvöuttsrrqqpoo÷nmmllkkjiiðhgffeeddccbbaa`__ü^]]2?2:ÿý¯SLL;ÿûàiLLÿ;ÿüü“Mÿ=ÿþÇÿ ÿú’‘‘ûŽŒ‹‹ñЉ‰ˆˆ‡‡††……„„ƒ‚‚þ€~þ}||{þzyyxþwvvutüsrrL?L:šý±ËÍÍ;šû£ÅÍÍš;šü›¹Íš=šþªš š¹º»¼½¾¿ÀÁÂ@Í:§ýÅúÿÿ;§û²ëÿÿ§;§ü¨Óþ§=§þ»§ §ÔÕÖרÙÚÛÜÝÞßàáâãäå@ÿ92ýS¹ÿÿ;2ûYÁÿÿ2<2ü_ÊC2<2ü3êf2<2üýœ82:2üýÓP292üüö€5272üýÈN262üüøŠ7242üýÓV232 üüû•9212 üýÝ_202 üý¢=2.2üýåh2-2üý®B2+2üüís32)2üýÆT2(2üý¢B2&2üüð€62$2üýÙc2#2üý·K2!2üüø“<22üüçs422üýÊW22!üý©J22"üüúžE22$üü÷–A22&üüò=22(üüî…:22*üüè|822,üüáu622.üüÚo52 20üüÞz92 22üüê‰?224üüõ™H226üüûªS229üü¼_322;üûÎm52ü<üýÞ{ü~ü\[þZYYXþWVVüUTTSSüRQQPPüONNMMüLKKJJIþHGGFþEDDCBAþ@??>þ=2?29LýiÃÿÿ;LûoËÿÿLÿýçºÿ>ÿüä·ôÿ<ÿüþ¬áÿ<ÿ§ýÈûÿ:ÿ§ý³íÿ9ÿ§ü©Ôýÿ7ÿ§ý·íÿ6ÿ§ü¨Ïüÿ4ÿ§ý³éÿ3ÿ §ýËúÿ1ÿ §ý°äÿ0ÿ §ýÅøÿ.ÿ§ý®àÿ-ÿ§ýÁõÿ+ÿ§ü«Úþÿ)ÿ§ý¸êÿ(ÿ§ýÅõÿ&ÿ§üªÔüÿ$ÿ§ý²âÿ#ÿ§ý½ïÿ!ÿ§ü¨Ìùÿÿ§ü­Úþÿÿ§ý·éÿÿ!§ýÃðÿÿ"§ü¨Çóÿÿ$§ü¨Êõÿÿ&§üªÎøÿÿ(§ü«Òúÿÿ*§ü­Öûÿÿ,§ü¯Ùýÿÿ.§ü±Üýÿ ÿ0§ü°×úÿ ÿ2§ü¬Ðöÿÿ4§ü©Éñÿÿ7§ýÂëÿÿ9§ý»äÿÿ;§ûµÝýÿ§<§ý°Ö§~§æçèéêëìíîïðñòóôõö÷þøÿ?ÿ3ÿûß™a9227ÿûµzP422;ÿù´W7a¾ÿ<ÿ2ýS«ÿ:ÿ2ýH™ÿ8ÿ2ü?ˆõÿ5ÿ2ü9xÛÿ3ÿ 2ü5iÉÿ1ÿ 2ýZ©ÿ/ÿ2ü@€Ûÿ,ÿ2ü3^­ÿ*ÿ2üB„Þÿ'ÿ2ü4a±ÿ%ÿ2üDˆáÿ"ÿ2û4Z›ýÿÿ2ü6b¥ÿÿ 2ü9i¯ÿÿ#2ü=qºÿÿ&2üAyÄÿÿ)2üBq­ÿÿ,2û7]“Ùÿ ÿ02üJ|ºÿ ÿ32û;fžèÿÿ62ú3R}¯øÿÿ:2ú3Mt¤ß2?2þ<2=2üòS2;2üüÊs9282=<û;:742w23ÿûæ§vRLL7ÿûÀŒgNLL;ÿù¿’mPuÈÿ<ÿLýi·ÿ:ÿLý_§ÿ8ÿLüW˜÷ÿ5ÿLüRŠâÿ3ÿ LüN}Òÿ1ÿ Lýpµÿ/ÿLüX‘âÿ,ÿLüMs¹ÿ*ÿLüZ•åÿ'ÿLüNv½ÿ%ÿLü\˜çÿ"ÿLûMp©ýÿÿLüOv²ÿÿ LüR}»ÿÿ#LüU„Äÿÿ&LüY‹Îÿÿ)LüZ„¹ÿÿ,LûPr¢àÿ ÿ0LübÅÿ ÿ3LûTz¬ìÿÿ6LúMh»úÿÿ:LúMd‡±æL?LþTL=Lü÷«iL;LÿüÓ†SL8LUTýPMLwL3ÿû¡³ÁËÍÍ7ÿû¬»ÅÌÍÍ;ÿù¬¹ÄÌÁªÿ<ÿÍýůÿ:ÿÍýdzÿ8ÿÍüÊ·Õÿ5ÿÍüË»¢ÿ3ÿ ÍüÌ¿§ÿ1ÿ Íýïÿ/ÿÍüɹ¢ÿ,ÿÍý®ÿ*ÿÍüɸ¢ÿ'ÿÍüÌÁ­ÿ%ÿÍüÈ·¡ÿ"ÿÍüòõÿÿÍüÌÁ°ÿÿ ÍüË¿­ÿÿ#Íüʽ«ÿÿ&ÍüÉ»¨ÿÿ)Íüɽ®ÿÿ,Íû̵£ÿ ÿ0ÍüǺ«ÿ ÿ3ÍûËÀ²©ÿÿ7Íûź­àÿÿ;ÍûƼ°¡Í?ÍþËÍ=Íüœ²ÅÍ;Íšü§½ËÍ8ÍÊËþÌÍxÍ3ÿû°Éãûÿ>ÿû¾×ìþÿ>ÿù¾Ôéüã»ÿ>ÿýëÂÿ>ÿýñÉÿ>ÿü÷ÐÓÿ=ÿüûرÿ=ÿüýß·ÿ>ÿýçÃÿ>ÿüöÔ±ÿ=ÿüþåÁÿ>ÿüõÒ°ÿ=ÿüþãÀÿ>ÿüôЯÿ=ÿûþçÈôÿ=ÿüýãÄÿ>ÿüûßÀÿ>ÿüøÛ¼ÿ>ÿüõ×¹ÿ>ÿüõÛÁÿ>ÿûüå̲ÿ>ÿüðÖ¼ÿ>ÿûùádzÿ=ÿúþëÕÀÞÿ=ÿúþîÙŰÿ?ÿþùÿ=ÿüªÇëÿ;ÿ§ü·Úúÿ8ÿøùýüþÿwÿÀ2û¾‰^;2:2ÿûÉ’eB262ÿùè¶kL5202 ÿúÉxX=2+2ÿùÝ®‡dI62%2ÿ÷Þ¼Ÿ…mXD422 ÿ÷ظš€iTC722)ÿòÝɶ¥”…wj]QF<3227ÿ÷èßÚÕÎÉľÿÿûEk™Òÿ:ÿ2û>cÆÿ6ÿ2ù6Om‘ºøÿ0ÿ 2úCa‚¨Öÿ+ÿ2ú9Ts—Âÿ&ÿ2÷4G^t¨Çøÿÿ2ø;Ncy’®Îÿÿ'2õ>Qfx…”¤µÆÚÿ ÿ22ò5?JUamzˆ—§´¹½2?2ÀLûÈ™sTL:LÿûÒ¡yZL6LÿùìÁ~cOL0L ÿúÒ«ŠnUL+Lÿù亗y`OL%Lÿ÷åÇ­•€m\NLL ÿ÷ߨ‘|j[QLL)ÿóäÒÁ²£–‰~rh^TLL7ÿ÷ìæáÜÖÒÎÈÿÿû]¨Úÿ:ÿLûWxŸÏÿ6ÿLùPf Åúÿ0ÿ Lú[u“µÝÿ+ÿLúSj†¥Ìÿ&ÿL÷M_s‡µÐúÿÿLøTew‹¡ºÖÿÿ'LõWh{Š–£±ÀÏáÿ ÿ2LòOXakuŒ™¥´¿ÃÇL?LÀÍûª·ÂËÍ:Íÿû§µÀÉÍ6Íÿù©¬¶¿ÆÌÍ0Í ÿú§²»ÃÊÍ+Íÿù¢®¸ÀÇÌÍ%Íÿ÷¢ª±¸¾ÄÈÌÍÍ ÿ÷£«³¹¿ÄÉÌÍÍ)ÿ󢧬°´¸¼¿ÂÅÈËÍÍ7ÿ÷©¡£¤¦§¨ªÿÿûÈ¿³¤ÿ:ÿÍûÊÁµ¨ÿ6ÿÍùÌÆ¾µ«àÿ0ÿ ÍúÉÁ¹¯¤ÿ+ÿÍúËĽ´©ÿ&ÿÍøÈ¼¶¯§àÿÿÍøËÆÁ»µ®¦ÿÿ'ÍõÊÅÀ»¸´°¬¨£ÿ ÿ2ÍòÌÊÇÄÁ¾»·´¯¬«ªÍ?ÍÀÿû»Ðåùÿ>ÿû·Ìáõÿ>ÿù³¾ÎÞïýÿ>ÿú·ÇØèøÿ>ÿù°ÁÑáñýÿ>ÿ÷°»ÆÒÝèôþÿ>ÿ÷²½ÈÔßêôüÿ?ÿó°·¾ÄËÑØßåìòùÿ@ÿ÷³°±³µ·¹»ÿÿûóÞÉ´ÿ>ÿû÷â͸ÿ>ÿùüíÝ̼Þÿ>ÿúôãÓóÿ>ÿúúêÚʹÿ>ÿ÷þòåÙÎøÞÿ>ÿøùîâ×ÌÁµÿ?ÿõ÷ìàØÑËž¸±ÿ?ÿòýöðêãÝ×ÐÊþ½»ÿ?ÿ}2üCM[ixˆ™­Á×ÿÿ¯«¦¡œ¢©±ºÁÊÒÜåÿíÿþ×ÿ6ÿ÷ͬs[F52ÿ.ÿ÷õÄ£†mVA322$ÿôã˵¡~n_QD822÷ÂÈÍÒØÝäõÿÿëõà×ÎŽµ­¥ž—‰‚ueWJ=32$2ú479732/2}LüTn‹L6LúXs‘µàÿÿ0LøM[n‚›½èÿÿ)LøN^q‡Ÿ¹Øÿ ÿ LöQ[frŽ£¿ÞÿÿLòNSV[dp|Š™¨¹ËÞÿÿîÄÀ»·³®«ª¯µ½ÄËÓÚãêÿíÿþÞÿ6ÿ÷Ö¸†q^NLÿ.ÿø÷ΰ—€lYLL$ÿôèÔÀ®žth\QLL÷ÌÑÖÚßäé÷ÿÿë÷æÞÖÎÇÀ¹²¬¥ ™“‡ymaVML$LûNPSPL0L}ÍüËûÍ6Íúɹ¯£ÿÿ1ÍùÉþ·­ ÿÿ)ÍøÌȼµ®¥ÿ ÿ ÍöÌÉÆÂ¾º´¬£ÿÿÍòÌËÊÉÆÃ¿»·³®©£ÿÿ­¯°±²²±¯­«©§¤¢ ÿíÿþ£ÿ6ÿ÷¦®¶½ÃÈÌÍÿ.ÿøÕ¨±¸¾ÄÉÍÍ$ÿô ¦¬±¶º¾ÂÅÈÌÍÍ÷©§¦¤£¢ ÕÿÿìÕ¡£¦¨ª¬®°²´µ·¹¼ÀÄÇÊÍ%ÍÌýËÌÍ0Í}ÿüùè×ÿ6ÿúöåÔòÿ2ÿøþôèÜÏÀ¯ÿ0ÿøýòæÙÍÁ´ÿ.ÿöüôíåÞÖ˾²ÿ'ÿòýú÷ôîæßØÐÉÁº²ÿÿî¼¾ÀÂÄÆÇÈÅÃÀ¼º·´±®ÿíÿþ²ÿ6ÿøµÂÎÚæòýÿ/ÿøÓ¹ÅÑÝéöÿ,ÿô¯¶¾ÆÍÕÜäìôûÿÿ÷¹·µ´²°®ÓÿÿëÓ¯²µ¸»¾ÁÄÇÊÍÐÓÙáéðøþÿ$ÿûþüúüÿ0ÿ2û9^”Ýÿ'ÿ2û:_ŒÃÿ+ÿ 2ûd’Ëÿ3ÿ2ú8Ss™Ïÿ7ÿý¡Ïÿ<ÿþßÿ:ÿûøšX3ÿ8ÿü¦b6226ÿü´l:223ÿüÂv?220ÿüÈF2 2-ÿü°rB2 2)ÿûá™a822&ÿûÉ…Q322#ÿü°sB22ÿûÅ_822ÿûÀŠ]:22ÿû¼†Z82"2ÿû¸‚W72&2ÿúÙ©T62*2 ÿúÍŸyX<2/2ÿú–qQ7242ú´iJ42÷2üm«ÿÿ62üMÁÿÿ22û6]”Üÿÿ/2ü?n«ÿ ÿ+2û3N‚Ãÿÿ(2û=c—Þÿÿ$2û?f”Îÿÿ 2ûBi˜Òÿÿ2ûDk›×ÿÿ2ûGnžÛÿ!ÿ2ù3Feˆ²åÿ%ÿ 2ú5Lk»ÿ+ÿ2ú7Rr˜Äÿ0ÿ2ù9Mc| Îÿ5ÿLûRs£äÿ'ÿLûTt›Íÿ+ÿ LûUvžÐÿ/ÿLûVx¡Ôÿ3ÿLúQi†§×ÿ7ÿý®×ÿ<ÿþæÿ:ÿûú¨nMÿ8ÿü³vOLL6ÿü¿SLL3ÿü̉WLL0ÿüÑ’^L L-ÿü¼…ZL L)ÿûç¨vQLL&ÿüÒ–gLL#ÿü¼†ZLLÿûÎtRLLÿûÊšrSLLÿûÇ—pRL"Lÿû“mPL&LÿúàµkOL*L ÿúÖ­‹mTL/LÿúÌ¥„gPL4Lú¿}bNL÷LüTƒÅL8LüW€·ÿÿ6LüdËÿÿ2LûPr£ãÿÿ/LüX·ÿ ÿ,Lüe“Íÿÿ(LûVx¥åÿÿ$LûXz£Öÿÿ LûZ|¦ÚÿÿLû\©ÞÿÿLû^¬âÿ!ÿLú^y™½êÿ%ÿ LúNc Æÿ+ÿLúQh…¦Îÿ0ÿLùRdxŽ®Öÿ5ÿÍûË´¢ÿ'ÿÍû˶¨ÿ+ÿ ÍûÊÁ¶§ÿ/ÿÍûÊÀµ¦ÿ3ÿÍúÌŽ³¥ÿ7ÿý±¥ÿ<ÿþ¡ÿ:ÿûà³ÃÍÿ8ÿü°ÁÌÍÍ6ÿü¬¾ËÍÍ3ÿü©¼ÊÍÍ0ÿü§¹ÈÍ Í-ÿü­½ÉÍ Í)ÿû¡³ÁÌÍÍ&ÿü§¸ÅÍÍ#ÿü­½ÉÍÍÿû¨¶ÂËÍÍÿû©·ÂËÍÍÿûª¸ÃËÍ"Íÿû«¹ÄÌÍ&Íÿú£¯ºÄÌÍ*Í ÿú¦±»ÄËÍ/Íÿú©´½ÅÌÍ4Íú¬¶¿ÇÌÍ÷Íü˽«Í8Íüʾ¯ÿÿ6Íüƹ©ÿÿ2ÍûÌ´¢ÿÿ/Íüʾ¯ÿ ÿ,Íüƹ¨ÿÿ(ÍûÊÁ´¢ÿÿ$ÍûÊÀ´¦ÿÿ ÍûÉ¿³¤ÿÿÍûÈ¿²£ÿÿÍûȾ²¢ÿ!ÿÍúÈÀ·­ ÿ%ÿ ÍúÌÆ¿µªÿ+ÿÍúÌŽ³¨ÿ0ÿÍùËÆÁº±¦ÿ5ÿÿûûå˰ÿ6ÿûùäϹÿ6ÿûøã͸ÿ6ÿû÷â̶ÿ5ÿúûëÚɵÿ7ÿýƵÿ<ÿþ°ÿ:ÿûÞÈèþÿ8ÿüÄãýÿ8ÿü¾Þúÿ8ÿü¹Ø÷ÿ8ÿü·Ôòÿ8ÿüÀÚõÿ7ÿû¯Éãûÿ7ÿü·Ñìÿ8ÿüÀÚõÿ7ÿû¸Îäûÿ6ÿûºÏåúÿ6ÿû»Ñçûÿ6ÿû½Óéüÿ5ÿú²ÃÕêýÿ4ÿúµÆ×èùÿ4ÿú¹ÊÛìüÿ4ÿú¾Îßðþÿ÷ÿüùÛ¼ÿ8ÿü÷ÝÂÿ8ÿüîÔºÿ7ÿûüå˱ÿ7ÿüöÜÂÿ8ÿüîÓ¹ÿ7ÿûøâʰÿ6ÿûöá˵ÿ6ÿûõßÊ´ÿ6ÿûôÞȲÿ6ÿûòÜDZÿ5ÿúòáп®ÿ3ÿúýïÞͼÿ4ÿúüëÚʹÿ3ÿùûîâÖÆµÿ5ÿÿý•E22ÿüýˆ?2 2ÿüá|:2"2ÿüÖq62$2ÿüÈf42&2ÿý¹[2)2ÿýŸQ2+2 ÿü×{=2-2 ÿü­\32/2ÿüã†C222ÿüºf5242ÿüý’J272ÿüÈp8292ýŽP2ü2þ=2;2ü8ÿ292ú5uãÿÿ272ü3jØÿÿ72ý_Ìÿÿ52ýV¾ÿÿ32ýM°ÿÿ12ýF¢ÿ ÿ/2ý?”ÿ ÿ-2ýD”ÿÿ+2ýK¡ÿÿ)2ýT®ÿÿ&2ü3^½ÿÿ$2ü4iËÿÿ"2ü7sØÿÿ 2ü:äÿÿ2ýAŠÿÿ2ü3X¦ÿÿ2ü;vÑÿ!ÿ2ýOšÿ$ÿ2ü7mÃÿ&ÿ2üGŽõÿ(ÿ2ü4cµÿ+ÿ 2üA‚Þÿ-ÿ 2ü9k´ÿ0ÿ2ü5`¥ÿ3ÿ2û3U–ñÿ5ÿ2üKˆÛÿ8ÿüB|Êÿüÿÿý¤]LLÿüý™WL LÿüçŽSL"LÿüÝ„PL$LÿüÑzML&LÿýÃqL)Lÿý­hL+L ÿüÞUL-L ÿü¹qML/Lÿüè—[L2LÿüÅzOL4Lÿüý¡aL7LÿüуRL9LýžfLüLþUL;LüR’ÿL9LúO‡èÿÿL7LüM~ßÿÿ7LýtÕÿÿ5LýlÈÿÿ3Lýd¼ÿÿ1Lý]¯ÿ ÿ/LýX£ÿ ÿ-Lý\£ÿÿ+Lýc®ÿÿ)Lýkºÿÿ'LýsÇÿÿ$LüN|Ôÿÿ"LüP†ßÿÿ LüTéÿÿLýYšÿÿLýn³ÿÿLüT‰Ùÿ!ÿLýf¨ÿ$ÿLüP€Íÿ&ÿLü_ž÷ÿ(ÿLüNwÀÿ+ÿ LüY“åÿ-ÿ LüS¿ÿ0ÿLüOu²ÿ3ÿLük¥ôÿ5ÿLüb™âÿ8ÿüZŽÓÿüÿÿý´ÈÍÍÿüõ·ÊÍ Íÿü¡ºËÍ"Íÿü¤½ÌÍ$Íÿý§ÀÍ'Íÿý«ÃÍ)Íÿý±ÅÍ+Í ÿü£»ÊÍ-Í ÿý®ÂÍ0Íÿü ¸ÉÍ2Íÿü«ÀÌÍ4ÍÿüõµÇÍ7Íÿü§½ËÍ9Íý¶ÆÍüÍþÊÍ;Íü˹ÿÍ9Íú̼ ÿÿÍ8Íý¿£ÿÿ7Íý¦ÿÿ5ÍýĪÿÿ3ÍýÆ­ÿÿ1Íýȱÿ ÿ/ÍýÊ´ÿ ÿ-ÍýÈ´ÿÿ+ÍýDZÿÿ)ÍýÄ®ÿÿ'Íýªÿÿ$ÍüÌ¿¦ÿÿ"Íü̽£ÿÿ Íü˺ ÿÿÍýÉ·ÿÿÍýðÿÿÍü˼¥ÿ!ÿÍýƳÿ$ÿÍü̾¨ÿ&ÿÍüȶÕÿ(ÿÍüÌÁ¬ÿ+ÿ Íüɹ¢ÿ-ÿ ÍüË¿¬ÿ0ÿÍüÌÁ°ÿ3ÿÍüÄ´Çÿ5ÿÍüÇ·¢ÿ8ÿüɺ§ÿüÿÿýËóÿ9ÿüôÐ÷ÿ9ÿü¯Öúÿ9ÿü³Ûüÿ9ÿü·áþÿ9ÿý½æÿ:ÿýÆìÿ9ÿü²Öøÿ9ÿüÁæþÿ8ÿü¯Ñôÿ9ÿü¼áýÿ8ÿüôÌðÿ9ÿü·Ûûÿ9ÿýÎíÿüÿþøÿ;ÿýûÔÿ:ÿüýÙ¯ÿ9ÿüþß²ÿ:ÿýä¶ÿ:ÿýé»ÿ:ÿýîÀÿ:ÿýóÅÿ:ÿýöËÿ:ÿýóËÿ:ÿýïÆÿ:ÿýêÁÿ:ÿýå»ÿ9ÿüþß¶ÿ9ÿüüÚ²ÿ9ÿüùÕ®ÿ9ÿýöÏÿ:ÿýèÄÿ9ÿüùØ´ÿ9ÿýíÈÿ9ÿüüݹÿ9ÿüòÎÓÿ8ÿüþâ¾ÿ9ÿüõÓ°ÿ8ÿüúÞ¾ÿ8ÿüýäÄÿ9ÿüêÊÈÿ8ÿüïбÿ8ÿüõÖ·ÿüÿ2ý7ÿÿ2ýTÑÿÿ2ý8ÿ ÿ2ýX×ÿ!ÿ2ý9•ÿ#ÿ2ý[Ûÿ$ÿ2ý:šÿ&ÿ2ý_Þÿ'ÿ2ý< ÿ)ÿ2ýcãÿ*ÿ2ý>¥ÿ,ÿ 2ü4tõÿ-ÿ 2ýTÉÿ/ÿ 2ý@ ÿ1ÿ2ý5{ÿ3ÿ2ý[Ðÿ4ÿ2ýC©ÿ6ÿ2ý7‚ÿ8ÿ2ýaØÿ9ÿü2G²ÿ;ÿþŽÿ þÿLýPŸÿÿLýjÙÿÿLýQŸÿ ÿLýmÞÿ!ÿLýR¤ÿ#ÿLýpâÿ$ÿLýT¨ÿ&ÿLýtåÿ'ÿLýU®ÿ)ÿLýxèÿ*ÿLýW²ÿ,ÿ LüM†÷ÿ-ÿ LýkÒÿ/ÿ LýX®ÿ1ÿLýOÿ3ÿLýpØÿ4ÿLý[µÿ6ÿLýP“ÿ8ÿLývßÿ9ÿüL_½ÿ;ÿþžÿ þÿÍý̵ÿÿÍýÄ¥ÿÿÍý̵ÿ ÿÍýÄ£ÿ!ÿÍýË´ÿ#ÿÍýâÿ$ÿÍý˳ÿ&ÿÍý¢ÿ'ÿÍýʱÿ)ÿÍýÁ ÿ*ÿÍýʰÿ,ÿÍý¼Õÿ-ÿ Íýħÿ/ÿ Íýɱÿ1ÿÍýÌ»ÿ3ÿÍýÃ¥ÿ4ÿÍýɯÿ6ÿÍý̹ÿ8ÿÍýÁ£ÿ9ÿüÍÈ­ÿ;ÿþ¶ÿ þÿÿýüÍÿ;ÿýê´ÿ:ÿýûÍÿ;ÿýè²ÿ:ÿýûËÿ;ÿýæ±ÿ:ÿýùÈÿ;ÿýä°ÿ:ÿýøÆÿ;ÿýâ¯ÿ:ÿý÷Äÿ:ÿüþÚÓÿ:ÿýê·ÿ:ÿýöÆÿ:ÿýýÖÿ;ÿýæ´ÿ:ÿýôÃÿ:ÿýüÓÿ;ÿýã²ÿ:ÿýò¿ÿ;ÿþÎÿ þÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿþÿ2=2þÿ2=2ÿ=2ÿ<2ÿ<2ÿ;2ÿ:2ÿ82ÿ72 ÿ52 ÿ12þÿL=LþÿL=Lÿ=Lÿ€2?ÿ€L?ÿ€Í?ÿ@ÿ¿³²±°°¯®­¬««ª©¨§§¦¥¤£¢¢¡ Ÿžœ›š™˜˜—–•”““’‘ŽŒ‹ŠŠ‰ˆ‡†……„ƒ‚€€>€2?ÿ€L?ÿ€Í?ÿ@ÿ¿~}||{zyxwwvutsrrqponmmlkjihhgfeddcba`__^]\[ZZYXWVUUTSRQPPONMLLKJ>€2?ÿ€L?ÿ€Í?ÿ@ÿ¿IHGGFEDCBBA@?>==<;:998765443210//.-,+**)('&%%$#"!! >X2gÿXLgÿXÍgÿÿÂþýüûúúùø÷ööõôóòññðïîíììëêéèççæåäãââáà f@2€ÿ@L€ÿ@Í€ÿÿ¿ßÞÞÝÜÛÚÙÙØ×ÖÕÔÔÓÒÑÐÏÏÎÍÌËËÊÉÈÇÆÆÅÄÃÂÁÁÀ¿¾½¼¼»º¹¸··¶µ´³³²±°¯®®­¬«~@2€ÿ@L€ÿ@Í€ÿÿ¿ª©©¨§¦¥¤¤£¢¡ ŸŸžœ››š™˜—––•”“’‘‘ŽŒŒ‹Š‰ˆˆ‡†…„ƒƒ‚€~~}|{zyyxwv~@2€ÿ@L€ÿ@Í€ÿÿ¿uttsrqpponmlkkjihgffedcbaa`_^]]\[ZYXXWVUTSSRQPONNMLKJIIHGFEEDCBA~@2€ÿ@L€ÿ@Í€ÿÿ@Á?>=<;;:987665432110/.--,+*)(('&%$##"!  ~2²ÿL²ÿͲÿÐÿÁþýýüûúùøø÷öõôóóòñðïîîíìëêêéèçæååäãâáààßÞÝÜÛÛÚÙØ× ±2ÀÿLÀÿÍÀÿÀÿ¿×ÖÕÔÓÒÒÑÐÏÎÍÍÌËÊÉÈÈÇÆÅÄÃÃÂÁÀ¿¿¾½¼»ºº¹¸·¶µµ´³²±°°¯®­¬¬«ª©¨§§¦¥¤£¢¿2ÀÿLÀÿÍÀÿÀÿ¿¢¡ Ÿžœ›š™˜˜—–•””“’‘ŽŒ‹ŠŠ‰ˆ‡†……„ƒ‚€€~}||{zyxwwvutsrrqponm¿2ÀÿLÀÿÍÀÿÀÿ¿mlkjiihgfeddcba`__^]\[ZZYXWVUUTSRQQPONMLLKJIHGGFEDCBBA@?>==<;:99¿2ÀÿLÀÿÍÀÿÀÿ¿8765443210//.-,+**)('&&%$#"!!  ¿Ã2ýÿÃLýÿÃÍýÿ†ÿÂþýüûûúùø÷ööõôóòññðïîíììëêéèççæåäããâáàßÞÞÝÜÛÚÙÙØ×ÖÕÔÔÓÒÑÐÏÏüÀ2ÿÀLÿÀÍÿ€ÿ¿ÎÍÌËËÊÉÈÇÆÆÅÄÃÂÁÁÀ¿¾½¼¼»º¹¸¸·¶µ´³³²±°¯®®­¬«ª©©¨§¦¥¤¤£¢¡  Ÿžœ››šÿ%2î469;>@CEGHIIJKLMNOOùNMMLKJ22ÿ%LîORW[_cgkmnpqstuwxzzùxwvutsLLÿ%ÍåÊǾº¶²®«ª¨§¦¥£¡ ŸžŸ ¡¢¤¥¦ÍÍÿ€ÿ¿™˜—––•”“’‘‘ŽŒŒ‹Š‰ˆˆ‡†…„ƒƒ‚€~~}|{zyyxwvuutsrqpponmlkkjihgffeÿõJHFDB@=;842µ2ÿõrolieb^[VPLµLÿõ§©­°´·»¾ÃÉ͵Íÿ€ÿ¿dcbaa`_^]]\[ZYXXWVUTSSRQPONNMLKJJIHGFEEDCBA@@?>=<;;:987665432210ÿ¹2ÿ¹Lÿ¹Íÿ{ÿÁþýýüû/.--,+*)(('&%$##"!  €2@ÿ€L@ÿ€Í@ÿ@ÿ¿úùøø÷öõôóóòñðïïîíìëêêéèçæååäãâáààßÞÝÜÛÛÚÙØ××ÖÕÔÓÒÒÑÐÏÎÍÍÌËÊÉÈÈÇÆ?€2@ÿ€L@ÿ€Í@ÿ@ÿ¿ÅÄÄÃÂÁÀ¿¿¾½¼»ºº¹¸·¶µµ´³²±°°¯®­¬¬«ª©¨§§¦¥¤£¢¢¡ Ÿžœ›š™™˜—–•””“’‘?€2@ÿ€L@ÿ€Í@ÿ@ÿ¿ŽŒ‹ŠŠ‰ˆ‡†……„ƒ‚€~}||{zyxwwvutsrrqponmmlkjiihgfeddcba`__^]\?€2@ÿ€L@ÿ€Í@ÿ@ÿ¿[ZZYXWVVUTSRQQPONMLLKJIHGGFEDCBBA@?>>=<;:998765443210//.-,++*)('?n2RÿnLRÿnÍRÿ1ÿÂþýüûûúùø÷ööõôóò&&%$#"!!  Q@2€ÿ@L€ÿ@Í€ÿÿñÁðïîíììëêéèèçæåäããâáàßÞÞÝÜÛÚÙÙØ×ÖÕÔÔÓÒÑÐÐÏÎÍÌËËÊÉÈÇÆÆÅÄÃÂÁÁÀ¿¾½@2€ÿ@L€ÿ@Í€ÿÿ¼Á»º¹¸¸·¶µ´³³²±°¯®®­¬«ª©©¨§¦¥¥¤£¢¡  Ÿžœ››š™˜—––•”“’‘‘ŽŒ‹Š‰ˆ@2€ÿ@L€ÿ@Í€ÿÿƈ‡†…„ƒƒ‚€~~}|{zzyxwvuutsrqpponmlkkjihgffedcbba`_^]]\[ZYXXûZ\_a;2û=Qh222÷3AUm†¤Åøÿÿ42 ÿ)2ÿ2§ÿ;LûUg|’L3LøYk€—±Îúÿÿ4L ÿ)LÿL§ÿ;ÍûÊÅ¿¹Í3ÍøÉľ¸°¨àÿÿ4Í ÿ)Íÿͧÿ;ÿûøìàÔÿ3ÿøöêÝÑŸÞÿ,ÿôîØÂ¬•iS<% ÿîþõìäÛÒÉÀµ¡Št^H1æehjmd>:?EJOTZ_^VNE<3*!¦üž½ãÿ¼ÿü«Çèÿ¼ÿü²ª ÿ¼ÿüÇ»¯ÿ{ÿ@ÀÿÀÿÀÿ€ÿ@ÀÿÀÿÀÿ€ÿ@ÀÿÀÿÀÿ€ÿ@ÀÿÀÿÀÿ€ÿ@ÎÿÎÿÎÿSÿzu¥:ÒiŽ4G# Š"801503156064098321651651643136...ÿ     'ÿgimp-text-layerã(text "80150315606409832165165164313640716596687643587675691874365982465982765879265987243659872365987264501263598716401237409832174983217509871094873219847213984714098\n13469321764874598427350743258743259872430752098437509432750243975\n723659726439875632465294387659287436598726435101562365120340\n012736402134013246013264032174032146032146013284478701234674\n7183246912349213469132649163248732149631463214987632498712941263946\n78312497143932149763214987321464916498732164932648793359165120101327150536234516513265013265108743254351250732430\n6131347981439163491632946193746136471349139419346913641694691346\n779432174623468140120304760759874274510538704183217049065589032150981734173\n1340817329848103274019374098715064515776428359925100973219419151\n197329149183264919874193264013501470140198740032198470932140983214\n098143706505872308740183740983127408973501475098321740983740981327409832174\n4981324798321493550859389058974387410987324098732430842197019834710983274") (font "Sans") (font-size 56.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-gb") (base-direction ltr) (color (color-rgb 0.196078 0.298039 0.803922)) (justify left) (box-mode fixed) (box-width 2186.000000) (box-height 783.000000) (box-unit pixels) 7}Š 7©œ¤œ°œ¼œÈœÔœàŠ >Ñ Dä GE Kþ N¯ SL X” ] bœ g› ji n0 q] tÞ x§ {c ~ ƒ ‡Ý ŠP Ž “z ˜L > ¡ç ¥0 ©¾ ®^ ±€ ¶? º. ¾ ÁÁ ÅÒ Ë= Ì ΰ Òï ×° Û“ Þ ⯠æé ê[ îí óè öé ún þü O ë ÿ à j ç  ñ !D &¢ )] -Î 3h 7ô ;ª ?- Du GÚ K O! Sc T; Wª \ ` cÎ hÀ k| qu uB yË }¶ š … ‰Ê ‹ ’@ –G šÌ Ÿò £E §Y «p °Î ´s ¹ ¼e ¿8 ÂÎ Ç ÊW Ï| Ñ— ÖÒ Ú¡ Þ ÞŸ â® å» éê ío ò¢ ô~ ù& ûâ ÿã 9 ™ Ø  K Õ í ž #‡ &U )ì .ê 2Í 5I :P = A© F5 Ix MÞ R< Tõ XÄ ]; _j _z aí eï j! n` r2 u@ yŽ }‹ €v „Ì ˆï Œ. Õ •e ˜: œ3 Ÿÿ ¤‚ ¨m ª¯ ¯½ ³µ ¶1 ºN ½â À ÆŒ ÊÙ Î Òl ×Ê Ú= Þ áb â æ‹ éä í ñK ó¾ öx ûI ÿ/ § > ÿ Ø ? p ! µ u #´ '„ +­ 0Ö 4ƒ 8 ;p ?Š C× H© M3 Q U\ Xç \· `Æ c d gÒ j© mÕ p¼ vË yC } €Š … ‰R Œ¶ •- ™§ œ2 Ÿû £¥ ¦õ «™ ®  °§ ´' ·ç »± ¿ ¿ ÆY ËÐ Íö Ó Õ Ú¥ ÞG ☠ã> æ[ ê í¬ ð ó] ÷Ÿ û< ÿ¯ H — ) ¾ Ê  ½ F $ (] +ä .Ø 1+ 5 8} = AZ CÎ H„ KW Nž Rù X \e _Ø e¯ fE h¦ l¤ q„ sº w |D €ß „2 ˆ´ Œ1 ƒ “ — š4 Ÿ £Û ¦w ªø ¯U ±‘ ³ë · »¤ ¿¥ Ã` ÇÉ Ìm Π ÓU ×Ì ÛY ÞK âð å¥ æ² éô ìÁ ñk ô3 ø¡ û† ÿa©D pÈ´q&Â"¾%;)½,a/¤2Â6ü:¤>òBëG»K‡NÆSÜW”\._Óbpg hm_qtow |åò„[‡Û‹‘ö”©˜›ÚŸ^¢ö¨“¬S¯‡²”·?»†¾ûÃ3Æ)È¢ÍyÒáֆ؞ܥáoæ+é6îï,óÞø"úäþŒs§ •¸@Çà"À(P,1)58HþƒÿÿþwýxÿþÆÿÿþ þ‡ÿÿþÃþ¥ÿÿþTýTÿý*óÿÿýý •ÿÿýñ'þÃÿÿþ9ý:ÿýBòÿÿõç…CFŠëÿÿýñ> þØÿÿþ#ý#ÿý&ÃÿÿýÂ$ þéÿÿþýÿüD¦þÿÿüþ¥C þõÿÿþ ý ÿü'›íÿ ÿüí›' þûÿÿþýÿüüÿÿüü‘ ÿþýÿý ÆÿÿõãƒD E„äÿÿýÆ þûÿÿþýÿý¼ÿÿüùqütúÿÿý¼þõÿÿþý ÿþpÿÿýø= ý@ùÿÿþoþêÿÿþýÿý ïÿÿþc þfÿÿýî þØÿÿþ"ý#ÿþaÿÿýÓ ýÔÿÿþaþÃÿÿþ9ý:ÿþ§ÿÿþsþuÿÿþ¦þ¥ÿÿþSýTÿþÚÿÿþ1þ3ÿÿþÙþƒÿÿþwýxÿþñÿÿþþÿÿþðþWÿÿþ¡ý¢ÿþûÿÿþþÿÿþúþ%ÿÿþÕýÕÿþêÿÿþþÿÿþéþæÿÿýþ üþÿþÖÿÿþ1þ3ÿÿþÕþ£ÿÿþb übÿÿþ³ÿÿþsþwÿÿþ³þOÿÿþ¿ üÀÿÿþpÿÿýÒ ý×ÿÿþoýêÿÿþ3 þ4ÿÿþ)ÿÿþc þlÿÿþ)þ€ÿÿýÂýÃÿÿþ·ÿÿý÷= ýFúÿÿþ¶ ýëÿÿþþƒÿÿý2þÿÿüùpüxûÿÿýþ1 þcÿÿý†ý‡ÿÿþyÿÿõâ‚C E…æÿÿþx þ«ÿÿ÷Öh%&j×ÿÿþ©þ”ÿÿþ“ ý ÁÿÿýÀ ý_òÿÿýò_ý ¦ÿ ÿý¥üŠíÿ ÿüíŠýRØÿÿýØR ñ Jƒ¹×èøøè×¹ƒJ óD‘ÆêùùêÆ‘CÃ2LÍÒù%[Æ÷ÿÿ ÿ úO…ºïÿÿ ÿ ÿ ÿ ÿ ÿþ_ ÿúæ³€Mÿÿÿýé úæ³€Mÿÿýÿ|ÿÿüÿèÿÿÿþLÿÿÿþ¡ÿÿÿþåÿÿÿþ$ÿÿÿþUÿÿÿþÿÿÿþ£ÿÿön«×òüïÛÇ”ÿÿþÁÿÿþÖÿÿþèÿÿþôÿÿóúÁ}P' !IŠàÿÿþùÿüÍhþÿÿþþÿ"ÿþúÿ"ÿþôÿ"ÿþèÿ"ÿþÖÿ"ÿþÂÿ"ÿþ£ÿ"ÿþ‚ÿ"ÿþUÿ"ÿþ$ÿ"ÿþæÿ"ÿþ¢ÿ"ÿþMÿ"üÿéÿ"ýÿ~ÿýž ýëÿüÿÚB þbÿÿýµ>þ ÿ ÿôàšV0"NŽæ ÿ ÿÿ ÿÿ û)zÊýÿ ÿ2òI¨ÍæóüñàÏ«r¿2LÍœóBÄéùùéÄBû.e’ÿÿýP×ÿÿý×Pû$lµóÿÿý£ÿ ÿý¢ ÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿýÞþ`ÿÿý‡ýˆÿÿþ_ ÿüå‡4ýêÿÿþþ„ÿÿýé üÉZþ~ÿÿýÂýÄÿÿþ|%ýéÿÿþ3 þ4ÿÿýè$þNÿÿþÀ þÀÿÿþL$þ¢ÿÿþb þcÿÿþ¡$þæÿÿýþ þÿÿþå#þ$ÿÿþÕþÖÿÿþ$"þVÿÿþ¡þ¢ÿÿþU"þƒÿÿþwþxÿÿþýSþ¥ÿÿþTþTÿÿþ£ûÿù›#þÃÿÿþ9þ:ÿÿþÁÿüü~ þØÿÿþ#þ#ÿÿþÖÿý³ þéÿÿþþÿÿþè ÿý´ þõÿÿþ þ ÿÿþô üÿfñÿÿþŠ þûÿÿþþÿÿþù ûÿ'Ûÿÿýý* ÿþþÿÿþþ úÿ&ïÿÿþª þûÿÿþþÿÿþúþ`ÿÿýþþõÿÿþþ ÿÿþôýÛÿÿþ_þêÿÿþþÿÿþèþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþMþeÿÿþ ýêÿÿþ3 þ4ÿÿýéý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿþ~ý+ßÿÿýý6 ýëÿÿþþƒÿÿýëý¼5ýlôÿÿþ þcÿÿý†ý‡ÿÿþb ÿü´U ÿýºþ«ÿÿ÷Öh%&j×ÿÿþ© ÿûò¯}Kÿÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥ ÿüãyýRØÿÿýØR û'vÃúÿÿý8óD‘ÆêùùêÆ‘Cú ?vŸÃ¿2LÍ€ô¶ØêöúëÜÁ[3 ÿüø¨6ù%[Æ÷ÿÿ ÿüý• úO…ºïÿÿ ÿýÏ ÿõg5 5g·üÿÿýÔ ÿý'Àÿÿþ ÿúæ³€Mÿÿý«ÿÿýü! úæ³€Mÿý ãÿÿþwÿþtÿÿþÁÿþ,ÿÿþàÿþÿÿþøÿþ ÿÿþòÿþ#ÿÿþØÿþeÿÿþ¡ÿýÑÿÿþJÿþ‹ÿÿýÏÿý¢ÿÿýö1ÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿ ÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿþzÿÿýøÿýØÿÿþsÿþwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿý†ÿÿþzÿý5ÅÿÿýÑÿö($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø}ÿ ÿüàÿ ôáïúøêÛÉj5ô2Lͯó7€·Þñüñß¶†AÿübÖÿ ÿüð—2ÿý)ÎÿÿÿýPõÿÿÿýVüÿÿôø´g1.k²úÿÿÿ ý;øÿÿý°!û‰õÿÿýãÿÿþo ý±ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿôn«×òüïÛÇ”Sþ€ÿÿúRzïÿÿýÎHÿüù›#þ©ÿÿü7"Ðÿ ÿý° ÿüü~ þÈÿÿýBæÿÿýÍÿý³ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊÿóúÁ}P' !IŠàÿÿý´ þðÿÿý~ýÿÿþüÍhüfñÿÿþŠ þùÿÿþuþvÿÿþ.ý'Ûÿÿýý* þþÿÿþº þ¼ÿÿþ¢ý&ïÿÿþª þûÿÿþ* þ,ÿÿýúþ`ÿÿýþþõÿÿþÆ þÇÿÿþUýÛÿÿþ_þêÿÿþw þxÿÿþ“þ…ÿÿþ£þ×ÿÿþD þFÿÿþÆþBÿÿþÍþÁÿÿþ þÿÿþÛþÿÿþáþ¢ÿÿþ þÿÿþíþ ÿÿþõþ€ÿÿþ þÿÿþûþ ÿÿþúþQÿÿþ þÿÿþìþÿÿþîþÿÿþ þÿÿþÙþCÿÿþÒ þÞÿÿþD þFÿÿþÂþ‡ÿÿþª þ—ÿÿþx þyÿÿþ‹ýÝÿÿþo þ@ÿÿþÇ þÉÿÿþLþeÿÿþ ýÝÿÿþ+ þ,ÿÿûôž ý*ñÿÿþ¶ þjÿÿþ» þ¼ÿÿúÿÚB ý+ßÿÿýý6 ýÛÿÿþuþvÿÿüúÿÿýµ>ülôÿÿþ ýEþÿÿý~ýÿÿüsÿÿôàšV0"NŽæÿÿýºþ„ÿÿ÷Óm( (mÓÿÿþ±ÿý§ ýšÿÿýµ ÿýóaýyüÿ ÿüþ”û)zÊýÿ ÿüãyý.¸ÿ ÿý¼4ðI¨ÍæóüñàÏ«r8ô'xµÞôûêÔ´o&Ç2LÍóBÄéùùéÄBö7€·Þñüñß¶ ýP×ÿÿý×PübÖÿÿ ý£ÿ ÿý¢ý)Îÿ ÿ ý¾ÿÿý½ýPõÿ ÿ þ§ÿÿ÷Öi& (kØÿÿþ¦ýVüÿÿöø´g1.k þ`ÿÿý‡ýˆÿÿþ_ ý;øÿÿý°!ýêÿÿþþ„ÿÿýé ýãÿÿþoþ~ÿÿýÂýÄÿÿþ| þžÿÿþrýéÿÿþ3 þ4ÿÿýè ý0ýÿÿþ½þNÿÿþÀ þÀÿÿþL þ®ÿÿýú%þ¢ÿÿþb þcÿÿþ¡ý üÿÿþ­þæÿÿýþ þÿÿþåþ{ÿÿþJþ$ÿÿþÕþÖÿÿþ$þÏÿÿýñþVÿÿþ¡þ¢ÿÿþUýþÿÿþºþƒÿÿþwþxÿÿþþPÿÿþô \¤ÔòûëÕ¹x1þ¥ÿÿþTþTÿÿþ£þ€ÿÿúRzïÿÿþÃÿÿþ9þ:ÿÿþÁþ©ÿÿü7"Ðÿ ÿþØÿÿþ#þ#ÿÿþÖþÈÿÿýBæÿ ÿþéÿÿþþÿÿþèþàÿÿþÝÿÿöÓn( (nÓÿþõÿÿþ þ ÿÿþôþðÿÿý~ýþûÿÿþþÿÿþùþùÿÿþuÿþþÿÿþþþþÿÿþºþûÿÿþþÿÿþúþûÿÿþ*þõÿÿþþ ÿÿþôþõÿÿþÆþêÿÿþþÿÿþèþêÿÿþwþØÿÿþ"þ#ÿÿþÖþ×ÿÿþDþÃÿÿþ9þ:ÿÿþÂþÁÿÿþþ¥ÿÿþSþTÿÿþ£þ¢ÿÿþþƒÿÿþwþxÿÿþ‚þ€ÿÿþþWÿÿþ¡þ¢ÿÿþUþQÿÿþþ%ÿÿþÕþÕÿÿþ$þÿÿþþæÿÿýþ ýþÿÿþæþÞÿÿþDþ£ÿÿþb þbÿÿþ¢þ—ÿÿþxþOÿÿþ¿ þÀÿÿþMþ@ÿÿþÇýêÿÿþ3 þ4ÿÿýéýÝÿÿþ+þ€ÿÿýÂýÃÿÿþ~ þjÿÿþ»ýëÿÿþþƒÿÿýë ýÛÿÿþuþcÿÿý†ý‡ÿÿþb ýEþÿÿý~ý þ«ÿÿ÷Öh%&j×ÿÿþ©þ„ÿÿöÓm( (mÓÿ ý ÁÿÿýÀ ýšÿ ÿ ý ¦ÿ ÿý¥ýyüÿ ÿýRØÿÿýØRý.¸ÿ ÿóD‘ÆêùùêÆ‘Cô'xµÞôûêÔ´o&¿2LÍ€ü†A7öBÄÿÿð—2þLÿÿýP×ÿÿýåÿÿý£ÿÿþ ÿÿý¾ÿÿý²úÿÿþJÿÿþ§ÿÿøÖi‰õÿýäÿÿþ¯ÿÿþ`ÿÿý‡ý±þÿÿýïÿÿýêÿÿþþGÿÿýdÿÿþ~ÿÿýÂýâÿÿü½ÿÿ ýéÿÿþ3þšÿÿûõ"ÿÿ þNÿÿþÀþDÿÿþsÿ þ¢ÿÿþbý àÿÿýÊÿ þæÿÿýþþ—ÿÿýú-ÿ þ$ÿÿþÕýAþÿÿþ‚ÿ þVÿÿþ¡þý ÞÿÿýÕÿ þƒÿÿþwýÎHþ”ÿÿýý8ÿ þ¥ÿÿþTÿý° ý?þÿÿþ‘ÿ þÃÿÿþ9ÿýÍ ý Üÿÿýß ÿ þØÿÿþ#ÿýÊ þ‘ÿÿþFÿ þéÿÿþÿþ ý<ýÿÿþ ÿ þõÿÿþ þvÿÿþ. ý Úÿÿýèÿ þûÿÿþþ¼ÿÿþ¢ þŽÿÿþTÿ ÿþþ,ÿÿýúý9ýÿÿþ¯ ÿ þûÿÿþþÇÿÿþUýØÿÿýï ÿ þõÿÿþþxÿÿþ“þ‹ÿÿþc ÿ þêÿÿþþFÿÿþÆý7üÿÿþ½ ÿ þØÿÿþ"þÿÿþÛþÖÿÿýõ" ÿ þÃÿÿþ9þÿÿþíÿþr ÿ þ¥ÿÿþSþÿÿþûÿþƒÿÿþwþÿÿþìÿþWÿÿþ¡þÿÿþÙÿþ%ÿÿþÕþFÿÿþÂÿþæÿÿýþþyÿÿþ‹ÿ þ£ÿÿþbþÉÿÿþLÿ þOÿÿþ¿þ,ÿÿýôÿ ýêÿÿþ3þ¼ÿÿþÿþ€ÿÿýÂþvÿÿýúÿýëÿÿþÿþsÿþcÿÿü†ÿÿþ±ÿþ«ÿÿýÖhÿÿýµ ÿý Áÿÿüþ”ÿý ¦ÿÿý¼4ÿýRØÿÿ;ûD‘Æ¿2LÍ€÷éùùéÄBô%n³ÓéûòÝ´v&ÿý×Pý3¼ÿÿüþ·-ÿý¢ü“þÿ ÿýûw ÿý½ ý µÿÿþ—ø:& (kØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ ý$ñýˆÿÿþ_ þtÿÿý¨ý«ÿÿýýB ý¶ÿþ„ÿÿýé ýúÿÿýœý ÿÿýØ ü8ÿÿýÄÿÿþ| þÿÿýÑ ýÕÿÿþf ü‹ÿÿþ4ÿÿýèýôÿÿþ> þAÿÿýÚüÌÿÿþÀÿÿþLþMÿÿþÓ þÖÿÿþ=üæÿÿþcÿÿþ¡þŒÿÿþ þÿÿþ•üúÿÿþÿÿþåþÃÿÿþI þKÿÿþÜüðÿÿþÖÿÿþ$þÚÿÿþ þ!ÿÿþüÓÿÿþ¢ÿÿþUþíÿÿþ þÿÿþOüšÿÿþxÿÿþþûÿÿþ þÿÿþ}üAÿÿþTÿÿþ£þïÿÿþ þÿÿþŸýÆÿþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿ý*óþ#ÿÿþÖþÉÿÿþH þJÿÿþÔ þBþÿÿþèþ—ÿÿþ~ þÿÿþçþ ÿÿþôþYÿÿþÑ þÓÿÿþôþÿÿþùýüÿÿþ: þ=ÿÿþùþÿÿþþþ©ÿÿýÎ ýÑÿÿþþ þþÿÿþúþ5ÿÿþ•ý™ÿÿþøý Æþ ÿÿþôþ›ÿÿý£ý¥ÿÿþðü¼ÿþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßüpÿÿþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇû ïÿÿþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿ þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþ§ÿÿ þxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿ þ¢ÿÿþUþ»ÿÿþþñÿÿ þÕÿÿþ$ýñÿÿþÐþûÿÿýþÿÿþæþJÿÿþ|þêÿÿþbÿÿþ¢þ®ÿÿýý!þÖÿÿþÀÿÿþMý$úÿÿþ°þ³ÿÿþ4ÿÿýéþ¼ÿÿýþ2þpÿÿýÃÿÿþ~þpÿÿþ¡ þ)ÿÿþƒÿÿýë ý± þlÿÿýå ü·ÿÿý‡ÿÿþb ûÿô‡ý¬ÿÿýù> ö2þÿ%&j×ÿÿþ© ÿôú°i./d±÷ÿÿýüZ þyÿ ÿýÀ ÿýöTþ”ÿÿý¥ÿýÑ-ÿýØRü3˜ðÿ ÿüØe÷êùùêÆ‘CóB†·ßñüóß¹ƒ:Ö2LÍ„óýÑÿÿþJÿþ þ‡ÿÿþÃþ‹ÿÿýÏÿýý •ÿÿýñ'ý¢ÿÿýö1þòÿÿõç…CFŠëÿÿýñ>ù*Z¢ôÿÿýôIý&ÃÿÿýÂ$ ÿýÅ* üD¦þÿÿüþ¥C ÿý¬E ü'›íÿ ÿüí›' ÿüö¯>ýüÿÿüü‘ÿý±ÿõãƒD E„äÿÿýÆ ù 4i®ûÿÿýàÿüùqütúÿÿý¼ý¦ÿÿý× ÿýø= ý@ùÿÿþoýcþÿÿþÿþc þfÿÿýî þzÿÿýøüÿÓ ýÔÿÿþaýØÿÿþsýÿsþuÿÿþ¦þwÿÿþ³ýÿ1þ3ÿÿþÙþ0ÿÿþàýÿþÿÿþðþÿÿþôýÿþÿÿþúþÿÿþûýÿþÿÿþéþÿÿþîýÿ1þ3ÿÿþÕþ=ÿÿþÏýÿsþwÿÿþ³þˆÿÿþŸüÿÒ ý×ÿÿþoý çÿÿþYÿþc þlÿÿþ)þ–ÿÿýï ÿý÷= ýFúÿÿþ¶ý¼5ý†ÿÿþzÿüùpüxûÿÿýþ1ÿü´U ý5ÅÿÿýÑÿõâ‚C E…æÿÿþxÿòò¯}K($OÒÿÿýåÿþ“ ÿýÒ!ý_òÿÿýò_ ÿüø}üŠíÿ ÿüíŠ û'vÃúÿ ÿüà ñ Jƒ¹×èøøè×¹ƒJ ï ?vŸÃáïúøêÛÉj5Ì2L͉ò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdù%[Æ÷ÿÿ ü2—ñÿÿýÒ0úO…ºïÿÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿ ÿý¼3 ý0ðÿÿþ± úæ³€Mÿ üÿæVþIÿÿþ*ÿ ý¨þµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿýÚÿÿþ‰ÿþ\ÿÿþFÿýåÿÿýæÿþ¨ÿÿþrÿþkÿÿýÛÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8 ÿý©ÿÿýõ>!ÿ ý£ÿÿýøE"ÿ ýÿÿýúM#ÿ þ•ÿÿýüU$ÿ þÿÿýþ^%ÿ þ…ÿÿþg&ÿ ÿþ8 ÿÿþ8 ÿÿþ8 ÿÿþ8 ÿ2LÍ—ó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿý)Îÿÿ ÿýPõÿÿ ÿýVüÿÿôø´g1.k²úÿÿ ÿý;øÿÿý°!û‰õÿ ÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿön«×òüïÛÇ” þ©ÿÿü7"Ðÿ ÿý° ÿ þÈÿÿýBæÿÿýÍ ÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿ þðÿÿý~ýÿÿþ ÿóúÁ}P' !IŠà þùÿÿþuþvÿÿþ. üÍhþ þþÿÿþº þ¼ÿÿþ¢#þûÿÿþ* þ,ÿÿýú"þõÿÿþÆ þÇÿÿþU"þêÿÿþw þxÿÿþ“"þ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþýž ýÛÿÿþuþvÿÿýúüÿÚBýEþÿÿý~ýÿÿþsÿýµ>üÿÿ þ„ÿÿ÷Óm( (mÓÿÿþ± ÿòàšV0"NŽæÿÿ ýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 û)zÊýÿ ÿô'xµÞôûêÔ´o&òI¨ÍæóüñàÏ«r¿2LÍÀÿù%[Æ÷ÿÿÿúO…ºïÿÿþ)ÿÿÿýPõÿÿÿüVüÿÿúæ³€Mÿÿû;øÿÿúæ³€Mÿýãÿÿÿþžÿÿÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþº ÿþPÿÿúSÿþ€ÿÿøRÿù›#ÿþ©ÿÿü7"Ðÿÿüü~ÿþÈÿÿýBæÿÿý³ ÿþàÿÿþÝÿÿý´ÿþðÿÿýfñÿÿþŠÿþùÿÿü'Ûÿÿýý*ÿþþÿÿý&ïÿÿþªÿþûÿÿþ`ÿÿýþÿþõÿÿþÆýÛÿÿþ_ÿþêÿÿþwþ…ÿÿþ£ÿþ×ÿÿþDþBÿÿþÍÿþÁÿÿþþÿÿþáÿþ¢ÿÿþþ ÿÿþõÿþ€ÿÿþþ ÿÿþúÿþQÿÿþþÿÿþîÿþÿÿþþCÿÿþÒÿþÞÿÿþDþ‡ÿÿþªÿþ—ÿÿþxýÝÿÿþoÿþ@ÿÿþÇþeÿÿþÿýÝÿÿý*ñÿÿþ¶ÿþjÿÿü+ßÿÿýý6ÿýÛÿÿýlôÿÿþÿýEþÿÿýº ÿ þ„ÿÿý§ ÿ ýšÿÿýóaÿùyüÿãyÿü.8ý2L̓ó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿ þÎÿÿ ÿ ÿ ÿ ÿôø´g1.k²úÿÿ ÿ ÿý°!û‰õÿ ÿýÿo ý± ÿþrÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿó \¤ÔòûëÕ¹x1ÿýzïÿÿýÎHÿôn«×òüïÛÇ”S ÿý° ÿüù›#ÿýÍ ÿüü~ ÿ÷Ón( (nÓÿÿýÊ ÿý³ ÿý~ýÿÿþ ÿóúÁ}P' !IŠàÿÿý´ ýÿuþvÿÿþ. üÍhüfñÿÿþŠ þº þ¼ÿÿþ¢ý'Ûÿÿýý* þ* þ,ÿÿýúý&ïÿÿþªþÇÿÿþUþ`ÿÿýþþxÿÿþ“ýÛÿÿþ_þFÿÿþÆþ…ÿÿþ£þÿÿþÛþBÿÿþÍþÿÿþíþÿÿþáþÿÿþûþ ÿÿþõþÿÿþìþ ÿÿþúþÿÿþÙþÿÿþîþFÿÿþÂþCÿÿþÒþyÿÿþ‹þ‡ÿÿþªþÉÿÿþLýÝÿÿþoþ+ þ,ÿÿýôþeÿÿþþ» þ¼ÿÿþýž ý*ñÿÿþ¶ ýÿuþvÿÿýúüÿÚB ý+ßÿÿýý6 ÿý~ýÿÿþsÿýµ>ülôÿÿþ ÿ÷Óm( (mÓÿÿþ± ÿôàšV0"NŽæÿÿýº ÿýµ ÿý§ ÿüþ” ÿýóa þ¸ÿ ÿý¼4 û)zÊýÿ ÿüãyô'xµÞôûêÔ´o&ðI¨ÍæóüñàÏ«r8Ñ2Lͯó7€·Þñüñß¶†A ù%[Æ÷ÿÿübÖÿ ÿüð—2úO…ºïÿÿý)ÎÿÿÿýPõÿÿÿýVüÿÿôø´g1.k²úÿÿÿúæ³€Mÿÿý;øÿÿý°!û‰õÿúæ³€Mÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþº ÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿþ©ÿÿü7"Ðÿ ÿý° ÿþÈÿÿýBæÿÿýÍ ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿþðÿÿý~ýÿÿþ ÿþùÿÿþuþvÿÿþ. ÿþþÿÿþº þ¼ÿÿþ¢ ÿþûÿÿþ* þ,ÿÿýú ÿþõÿÿþÆ þÇÿÿþU ÿþêÿÿþw þxÿÿþ“ ÿþ×ÿÿþD þFÿÿþÆ ÿþÁÿÿþ þÿÿþÛ ÿþ¢ÿÿþ þÿÿþí ÿþ€ÿÿþ þÿÿþû ÿþQÿÿþ þÿÿþì ÿþÿÿþ þÿÿþÙ ÿþÞÿÿþD þFÿÿþ ÿþ—ÿÿþx þyÿÿþ‹ ÿþ@ÿÿþÇ þÉÿÿþL ÿýÝÿÿþ+ þ,ÿÿýô ÿþjÿÿþ» þ¼ÿÿþ ÿýÛÿÿþuþvÿÿýú ÿýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ç2LͰð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿýø¨ýåÿÿ ÿþ ÿÿ ÿþJÿÿ ÿñÞg5 5g·üÿÿýäÿÿþ¯ÿÿ ÿüå‡4 ü'Àÿþÿÿýïÿÿ üÉZ ý«þGÿÿýdÿÿþ ýâÿÿü½ÿÿ2þšÿÿûõ"ÿÿ1þDÿÿþsÿ0ý àÿÿýÊÿ0þ—ÿÿýú-ÿ/ýAþÿÿþ‚ÿ.ý ÞÿÿýÕÿþ þ”ÿÿýý8ÿþ‹ ý?þÿÿþ‘ÿü¢ÿ ý Üÿÿýß ÿ÷*Z¢ôÿÿ þ‘ÿÿþFÿ ÿ ý<ýÿÿþ ÿ ÿþ¬ý Úÿÿýèÿ ÿþöþŽÿÿþTÿ ÿý9ýÿÿþ¯ ÿ÷ 4i®ûÿÿýØÿÿýï ÿü¦ÿþ‹ÿÿþc ÿþcý7üÿÿþ½ ÿ'þÖÿÿýõ" ÿ'ÿþr ÿ'ÿ!ÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ:ÿ ý¼5ý†ÿ ÿü´U ü5Åÿÿ ÿòò¯}K($OÒÿÿÿ ÿÿ ÿÿ û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5À2L͸ö.e’¶Øêö6ù%[Æ÷ÿÿû$lµóÿÿüý• úO…ºïÿÿ ÿýÏ ÿ ÿýÔ ÿÿùÞg5 ÿÿþ ÿúæ³€Mÿÿÿüå‡4ÿýü! úæ³€MÿüÉZþãÿÿþwÿþtÿÿþÁÿþ,ÿÿþàÿþÿÿþøÿþ ÿÿþòÿþ#ÿÿþØÿþeÿÿþ¡ÿþÑÿÿþJÿÿýÏÿÿýö1ÿÿýôIÿüÿÅ*ÿÿþEÿÿý¯>ÿÿý±ÿÿýàÿÿý× ÿþþÿÿþÿþzÿÿýøÿýØÿÿþsÿþwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿÿþzÿý¼5ÿýÑÿÿü´U ÿýå ÿ ÿóò¯}K(ÿÿÒ! ÿ ÿüø}ÿ ÿþÿ û'vÃúÿÿ6ö ?vŸÃáïúø¿2LÍ€øúëÜÁ[ó7€·Þñüñß¶†Aÿüø¨6übÖÿ ÿüð—2 ÿüý•ý)Îÿÿ ÿýÏýPõÿÿù5g·üÿÿýÔ ýVüÿÿôø´g1.k²úÿÿý'Àÿÿþ ý;øÿÿý°!û‰õÿý«ÿÿýü! ýãÿÿþo ý±ý ãÿÿþw þžÿÿþr%þtÿÿþÁ ý0ýÿÿþ½&þ,ÿÿþà þ®ÿÿýú%&þÿÿþø ý üÿÿþ­'þ ÿÿþò þ{ÿÿþJ'þ#ÿÿþØ þÏÿÿýñ'þeÿÿþ¡ýþÿÿþº'ýÑÿÿþJþPÿÿþó \¤ÔòûëÕ¹x1þ‹ÿÿýÏþ€ÿÿúRzïÿÿýÎHý¢ÿÿýö1 þ©ÿÿü7"Ðÿ ÿý° ù*Z¢ôÿÿýôI þÈÿÿýBæÿÿýÍ ÿýÅ* þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿý¬E þðÿÿý~ýÿÿþ þ<ÿÿüö¯> þùÿÿþuþvÿÿþ. ý Úÿÿý± þþÿÿþº þ¼ÿÿþ¢ ÷Žÿ 4i®ûÿÿýà þûÿÿþ* þ,ÿÿýúü9ýÿý¦ÿÿý× þõÿÿþÆ þÇÿÿþUûØÿÿýcþÿÿþþêÿÿþw þxÿÿþ“þ‹ÿÿþzÿÿýøþ×ÿÿþD þFÿÿþÆý7üÿÿýØÿÿþsþÁÿÿþ þÿÿþÛþÖÿÿþõþwÿÿþ³þ¢ÿÿþ þÿÿþíÿþrþ0ÿÿþàþ€ÿÿþ þÿÿþûÿþÿÿþôþQÿÿþ þÿÿþìÿþÿÿþûþÿÿþ þÿÿþÙÿþÿÿþîþÞÿÿþD þFÿÿþÂÿþ=ÿÿþÏþ—ÿÿþx þyÿÿþ‹þˆÿÿþŸþ@ÿÿþÇ þÉÿÿþLý çÿÿþYýÝÿÿþ+ þ,ÿÿýôþ–ÿÿýï þjÿÿþ» þ¼ÿÿþý†ÿÿþz ýÛÿÿþuþvÿÿýúý5ÅÿÿýÑ ýEþÿÿý~ýÿÿþs ú$OÒÿÿýå þ„ÿÿ÷Óm( (mÓÿÿþ± ÿýÒ!ýšÿÿýµ ÿüø}ýyüÿ ÿüþ”ÿüàý.¸ÿ ÿý¼4øêÛÉj5ô'xµÞôûêÔ´o&Ó2LͨóBÄéùùéÄBþLÿÿýP×ÿÿý×Pýåÿÿý£ÿ ÿý¢þ ÿÿý¾ÿÿý½þJÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ýäÿÿþ¯ÿÿþ`ÿÿý‡ýˆÿÿþ_ þÿÿýïÿÿýêÿÿþþ„ÿÿýé þGÿÿýdÿÿþ~ÿÿýÂýÄÿÿþ| ýâÿÿü½ÿÿ ýéÿÿþ3 þ4ÿÿýè þšÿÿûõ"ÿÿ þNÿÿþÀ þÀÿÿþLþDÿÿþsÿ þ¢ÿÿþb þcÿÿþ¡ý àÿÿýÊÿ þæÿÿýþ þÿÿþåþ—ÿÿýú-ÿ þ$ÿÿþÕþÖÿÿþ$ýAþÿÿþ‚ÿ þVÿÿþ¡þ¢ÿÿþUý ÞÿÿýÕÿ þƒÿÿþwþxÿÿþþ”ÿÿýý8ÿ þ¥ÿÿþTþTÿÿþ£ý?þÿÿþ‘ÿ þÃÿÿþ9þ:ÿÿþÁý Üÿÿýß ÿ þØÿÿþ#þ#ÿÿþÖþ‘ÿÿþFÿ þéÿÿþþÿÿþèþýÿÿþ ÿ þõÿÿþ þ ÿÿþôÿýèÿ þûÿÿþþÿÿþùÿþTÿ ÿþþÿÿþþÿþ¯ ÿ þûÿÿþþÿÿþúüÿï ÿ þõÿÿþþ ÿÿþôýÿc ÿ þêÿÿþþÿÿþèþ½ ÿ þØÿÿþ"þ#ÿÿþÖþ" ÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ÿþƒÿÿþwþxÿÿþ‚ÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~ÿýëÿÿþþƒÿÿýëÿþcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘CË2LÍÄÿù%[Æ÷ÿÿ ÿ úO…ºïÿÿ ÿþë ÿ ÿþ ÿþ)ÿÿþ/ ÿúæ³€MÿÿþŠÿÿþÎ úæ³€MÿýçÿÿþmÿþLÿÿýøÿþ­ÿÿþªÿýúÿÿþIÿþoÿÿýåÿþÐÿÿþ‡ÿþ1ÿÿþ&ÿþ’ÿÿþÄÿýìÿÿþcÿþTÿÿýõ ÿþ¶ÿÿþ¡ÿýüÿÿþ?ÿþxÿÿýÝÿþØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþË ÿýæÿÿþj ÿþKÿÿý÷ ÿþ¬ÿÿþ§ÿ ýùÿÿþFÿ þnÿÿýãÿ þÏÿÿþ„ÿ2LÍ—ó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿý)Îÿÿ ÿýPõÿÿ ÿýVüÿÿôø´g1.k²úÿÿ ÿý;øÿÿý°!û‰õÿ ÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿön«×òüïÛÇ” þ©ÿÿü7"Ðÿ ÿý° ÿ þÈÿÿýBæÿÿýÍ ÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿ þðÿÿý~ýÿÿþ ÿóúÁ}P' !IŠà þùÿÿþuþvÿÿþ. üÍhþ þþÿÿþº þ¼ÿÿþ¢#þûÿÿþ* þ,ÿÿýú"þõÿÿþÆ þÇÿÿþU"þêÿÿþw þxÿÿþ“"þ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþýž ýÛÿÿþuþvÿÿýúüÿÚBýEþÿÿý~ýÿÿþsÿýµ>üÿÿ þ„ÿÿ÷Óm( (mÓÿÿþ± ÿòàšV0"NŽæÿÿ ýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 û)zÊýÿ ÿô'xµÞôûêÔ´o&òI¨ÍæóüñàÏ«r¿2LÍœô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-ÿü“þÿ ÿýûwþ)ÿÿý µÿÿþ—ýPõÿÿý²ÿÿöì‹==Œíÿÿþ€üVüÿþtÿÿý¨ý«ÿÿýýB û;øÿÿýúÿÿýœý ÿÿýØ ýãÿÿþÿÿýÑ ýÕÿÿþf þžÿÿýôÿÿþ> þAÿÿýÚ ý0ýÿÿþ½þMÿÿþÓ þÖÿÿþ= þ®ÿÿýú%þŒÿÿþ þÿÿþ•ý üÿÿþ­þÃÿÿþI þKÿÿþÜþ{ÿÿþJþÚÿÿþ þ!ÿÿþþÏÿÿýñþíÿÿþ þÿÿþOýþÿÿþºþûÿÿþ þÿÿþ}þPÿÿúSþïÿÿþ þÿÿþŸþ€ÿÿøRÿù›#þÝÿÿþ þ ÿÿþ¿þ©ÿÿü7"Ðÿÿüü~ þÉÿÿþH þJÿÿþÔþÈÿÿýBæÿÿý³ þ—ÿÿþ~ þÿÿþçþàÿÿþÝÿÿý´ þYÿÿþÑ þÓÿÿþôþðÿÿýfñÿÿþŠ ýüÿÿþ: þ=ÿÿþùþùÿÿü'Ûÿÿýý* þ©ÿÿýÎ ýÑÿÿþþþþÿÿý&ïÿÿþª þ5ÿÿþ•ý™ÿÿþøþûÿÿþ`ÿÿýþ þ›ÿÿý£ý¥ÿÿþðþõÿÿþÆýÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþêÿÿþwþ…ÿÿþ£ ýÕÿÿýèDÿÿþÇþ×ÿÿþDþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þÁÿÿþþÿÿþáýNÒÿÿúð~ Sÿÿþþ¢ÿÿþþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþ€ÿÿþþ ÿÿþúþ»ÿÿþþQÿÿþþÿÿþîýñÿÿþÐþÿÿþþCÿÿþÒþJÿÿþ|þÞÿÿþDþ‡ÿÿþªþ®ÿÿýý!þ—ÿÿþxýÝÿÿþoý$úÿÿþ° þ@ÿÿþÇþeÿÿþþ¼ÿÿýþ2 ýÝÿÿý*ñÿÿþ¶þpÿÿþ¡ þjÿÿü+ßÿÿýý6 ý± þlÿÿýå ýÛÿÿýlôÿÿþ ûÿô‡ý¬ÿÿýù> ýEþÿÿýº ÿôú°i./d±÷ÿÿýüZþ„ÿÿý§ ÿýöTýšÿÿýóaÿýÑ-ùyüÿãyü3˜ðÿ ÿüØeü.8óB†·ßñüóß¹ƒ:Ú2L̓ó7€·Þñüñß¶†Aó7€·Þñüñß¶†A übÖÿ ÿüð—2übÖÿ ÿüð—2 þÎÿÿý)Îÿÿ ÿýPõÿÿ ÿôø´g1.k²úÿÿýVüÿÿôø´g1.k²úÿÿ ÿý°!û‰õÿ ý;øÿÿý°!û‰õÿ ýÿo ý± ýãÿÿþo ý± þrþžÿÿþr7ý0ýÿÿþ½8þ®ÿÿýú%7ý üÿÿþ­8þ{ÿÿþJ8þÏÿÿýñ7ýþÿÿþºó \¤ÔòûëÕ¹x1 þPÿÿþó \¤ÔòûëÕ¹x1 ýzïÿÿýÎH þ€ÿÿúRzïÿÿýÎH ÿý° þ©ÿÿü7"Ðÿ ÿý° ÿýÍ þÈÿÿýBæÿÿýÍ ÿ÷Ón( (nÓÿÿýÊþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊÿý~ýÿÿþþðÿÿý~ýÿÿþýÿuþvÿÿþ.þùÿÿþuþvÿÿþ.þº þ¼ÿÿþ¢þþÿÿþº þ¼ÿÿþ¢þ* þ,ÿÿýúþûÿÿþ* þ,ÿÿýúþÇÿÿþUþõÿÿþÆ þÇÿÿþUþxÿÿþ“þêÿÿþw þxÿÿþ“þFÿÿþÆþ×ÿÿþD þFÿÿþÆþÿÿþÛþÁÿÿþ þÿÿþÛþÿÿþíþ¢ÿÿþ þÿÿþíþÿÿþûþ€ÿÿþ þÿÿþûþÿÿþìþQÿÿþ þÿÿþìþÿÿþÙþÿÿþ þÿÿþÙþFÿÿþÂþÞÿÿþD þFÿÿþÂþyÿÿþ‹þ—ÿÿþx þyÿÿþ‹þÉÿÿþLþ@ÿÿþÇ þÉÿÿþLþ+ þ,ÿÿýôýÝÿÿþ+ þ,ÿÿýôþ» þ¼ÿÿþ þjÿÿþ» þ¼ÿÿþýÿuþvÿÿýú ýÛÿÿþuþvÿÿýúÿý~ýÿÿþs ýEþÿÿý~ýÿÿþsÿ÷Óm( (mÓÿÿþ± þ„ÿÿ÷Óm( (mÓÿÿþ± ÿýµ ýšÿÿýµ ÿüþ”ýyüÿ ÿüþ” þ¸ÿ ÿý¼4ý.¸ÿ ÿý¼4 ô'xµÞôûêÔ´o&ô'xµÞôûêÔ´o&Ï2L͈óþ’ÿÿþÄþÆÿÿþ þ‡ÿÿþÃýìÿÿþcý*óÿÿýý •ÿÿýñ'þTÿÿýõ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ý&ÃÿÿýÂ$ýüÿÿþ? üD¦þÿÿüþ¥CþxÿÿýÝ ü'›íÿ ÿüí›'þØÿÿþ} üüÿÿüü‘þ:ÿÿýýý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþ»ý¼ÿÿüùqütúÿÿý¼ý ñÿÿþYþpÿÿýø= ý@ùÿÿþoþ]ÿÿýïý ïÿÿþc þfÿÿýî þ¾ÿÿþ—þaÿÿýÓ ýÔÿÿþaý þÿÿþ6þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÔ þÚÿÿþ1þ3ÿÿþÙýßÿÿþs þñÿÿþþÿÿþðþCÿÿýû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP þÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ ê2LÍ“ó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿ ý;øÿÿý°!û‰õÿýäÿÿü¯ÿÿ ýãÿÿþo ý±þÿÿûïÿÿ þžÿÿþr$þGÿÿûdÿÿý0ýÿÿþ½$ýâÿÿú½ÿÿþ®ÿÿýú%$þšÿÿùõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿþ—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿ þjÿÿþ» þ¼ÿÿþÿ ýÛÿÿþuþvÿÿýúÿ ýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼4ÿô'xµÞôûêÔ´o&ã2LÍ”ð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý• ÿ ÿýÏ ÿ ÿóÞg5 5g·üÿÿýÔ ÿ ÿüå‡4 ý'Àÿÿþ ÿÿ üÉZ ý«ÿÿýü! ÿÿý ãÿÿþw ÿÿ þtÿÿþÁ ÿÿ þ,ÿÿþà ÿÿ þÿÿþø ÿÿ þ ÿÿþò ÿÿ þ#ÿÿþØ ÿÿ þeÿÿþ¡ ÿÿýÑÿÿþJ ÿÿþ‹ÿÿýÏ ÿún«×òüÿÿý¢ÿÿýö1 ÿù*Z¢ôÿÿýôI ÿ ÿýÅ* ÿ ÿý¬Eÿ÷úÁ}P' ÿÿ ÿüö¯>üÍhÿÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿ þzÿÿýøÿ ýØÿÿþsÿ!þwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ýž ÿ ý¼5ý†ÿÿþzüÿÚBÿ ÿü´U ý5ÅÿÿýÑÿýµ>ÿ ÿòò¯}K($OÒÿÿýå ÿøàšV0ÿÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà û)zÊýÿÿï ?vŸÃáïúøêÛÉj5öI¨Íæóüñ¿2LÍ ó ùïÛÇ”SþÆÿÿþ þ‡ÿÿþà ÿüù›#ý*óÿÿýý •ÿÿýñ' ÿüü~ýBòÿÿõç…CFŠëÿÿýñ> ÿý³ ý&ÃÿÿýÂ$û!IŠàÿÿý´üD¦þÿÿüþ¥CüfñÿÿþŠü'›íÿ ÿüí›'ý'Ûÿÿýý* üüÿÿüü‘ý&ïÿÿþª ý ÆÿÿõãƒD E„äÿÿýÆ þ`ÿÿýþ ý¼ÿÿüùqütúÿÿý¼ýÛÿÿþ_ þpÿÿýø= ý@ùÿÿþoþ…ÿÿþ£ý ïÿÿþc þfÿÿýî þBÿÿþÍþaÿÿýÓ ýÔÿÿþaþÿÿþáþ§ÿÿþsþuÿÿþ¦þ ÿÿþõþÚÿÿþ1þ3ÿÿþÙþ ÿÿþúþñÿÿþþÿÿþðþÿÿþîþûÿÿþþÿÿþúþCÿÿþÒþêÿÿþþÿÿþéþ‡ÿÿþªþÖÿÿþ1þ3ÿÿþÕýÝÿÿþoþ³ÿÿþsþwÿÿþ³þeÿÿþþpÿÿýÒ ý×ÿÿþoý*ñÿÿþ¶ þ)ÿÿþc þlÿÿþ)ý+ßÿÿýý6 þ·ÿÿý÷= ýFúÿÿþ¶ülôÿÿþ ý2þÿÿüùpüxûÿÿýþ1 û"NŽæÿÿýº þyÿÿõâ‚C E…æÿÿþx ÿý§ þ”ÿÿþ“ ÿýóaý_òÿÿýò_ÿüãyüŠíÿ ÿüíŠùàÏ«r8ñ Jƒ¹×èøøè×¹ƒJ Ò2LÍ«ó7€·Þñüñß¶†AÿübÖÿ ÿüð—2ÿý)ÎÿÿÿþëýPõÿÿÿþ ýVüÿÿôø´g1.k²úÿÿþ)ÿÿþ/ ý;øÿÿý°!û‰õÿþŠÿÿþÎ ýãÿÿþo ý±ýçÿÿþm þžÿÿþr#þLÿÿýø ý0ýÿÿþ½$þ­ÿÿþª þ®ÿÿýú%#ýúÿÿþI ý üÿÿþ­$þoÿÿýå þ{ÿÿþJ$þÐÿÿþ‡ þÏÿÿýñ#þ1ÿÿþ& ýþÿÿþº$þ’ÿÿþÄ þPÿÿþó \¤ÔòûëÕ¹x1ýìÿÿþc þ€ÿÿúRzïÿÿýÎHþTÿÿýõ þ©ÿÿü7"Ðÿ ÿý° þ¶ÿÿþ¡ þÈÿÿýBæÿÿýÍýüÿÿþ? þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþxÿÿýÝ þðÿÿý~ýÿÿþþØÿÿþ}þùÿÿþuþvÿÿþ. þ:ÿÿýýþþÿÿþº þ¼ÿÿþ¢ þ›ÿÿþ»þûÿÿþ* þ,ÿÿýú ý ñÿÿþYþõÿÿþÆ þÇÿÿþU þ]ÿÿýïþêÿÿþw þxÿÿþ“ þ¾ÿÿþ—þ×ÿÿþD þFÿÿþÆ ý þÿÿþ6þÁÿÿþ þÿÿþÛ þ€ÿÿþÔþ¢ÿÿþ þÿÿþíýßÿÿþsþ€ÿÿþ þÿÿþûþCÿÿýûþQÿÿþ þÿÿþìþ¤ÿÿþ±þÿÿþ þÿÿþÙýöÿÿþPþÞÿÿþD þFÿÿþÂþfÿÿýéþ—ÿÿþx þyÿÿþ‹þÇÿÿþþ@ÿÿþÇ þÉÿÿþLþ(ÿÿþ,ýÝÿÿþ+ þ,ÿÿýôþ‰ÿÿþËþjÿÿþ» þ¼ÿÿþýæÿÿþjýÛÿÿþuþvÿÿýúþKÿÿý÷ýEþÿÿý~ýÿÿþsþ¬ÿÿþ§þ„ÿÿ÷Óm( (mÓÿÿþ±ýùÿÿþFýšÿÿýµ þnÿÿýãýyüÿ ÿüþ”þÏÿÿþ„ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ë2LÍÄÿ ÿÿ ÿÿþë ÿÿþ ÿþ)ÿÿþ/ ÿ'þŠÿÿþÎ ÿ&ýçÿÿþm ÿ&þLÿÿýø ÿ&þ­ÿÿþª ÿ%ýúÿÿþI ÿ%þoÿÿýå ÿ%þÐÿÿþ‡ ÿ$þ1ÿÿþ& ÿ$þ’ÿÿþÄÿ#ýìÿÿþcÿôn«×òüïÛÇ”SþTÿÿýõ ÿüù›#þ¶ÿÿþ¡ÿüü~ýüÿÿþ?ÿý³ þxÿÿýÝÿóúÁ}P' !IŠàÿÿý´þØÿÿþ}üÍhüfñÿÿþŠþ:ÿÿýýý'Ûÿÿþýþ›ÿÿþ»!ý&ïÿÿý ñÿÿþY"þ`ÿÿþ]ÿÿýï"ýÛÿÿþ¾ÿÿþ—$þ…ÿÿý þÿÿþ6$þBÿÿþ€ÿÿþÔ%þÿÿ ýßÿÿþs%þ ÿÿ þCÿÿýû%þ ÿÿ þ¤ÿÿþ±&þÿÿ ýöÿÿþP&þCÿÿ þfÿÿýé&þ‡ÿÿ þÇÿÿþ&ýÝÿÿ þ(ÿÿþ,&þeÿÿ þ‰ÿÿþËýž ý*ñÿÿ ýæÿÿþjüÿÚB ý+ßÿÿþý þKÿÿý÷ÿýµ>ülôÿÿþ þ¬ÿÿþ§ÿôàšV0"NŽæÿÿýºýùÿÿþFÿý§ þnÿÿýãÿýóa þÏÿÿþ„û)zÊýÿ ÿüãy-ðI¨ÍæóüñàÏ«r8Å2LÍ—ó7€·Þñüñß¶†A÷%n³ÓéûòÝübÖÿ ÿüð—2ý3¼ÿÿý)Îÿÿü“þÿÿýPõÿÿ ý µÿ ÿýVüÿÿôø´g1.k²úÿÿ ý²ÿÿøì‹==ý;øÿÿý°!û‰õÿ þtÿÿý¨ýãÿÿþo ý± ýúÿÿýœþžÿÿþrþÿÿýÑý0ýÿÿþ½ýôÿÿþ>þ®ÿÿýú%þMÿÿþÓý üÿÿþ­þŒÿÿþþ{ÿÿþJþÃÿÿþIþÏÿÿýñþÚÿÿþýþÿÿþºþíÿÿþþPÿÿþó \¤ÔòûëÕ¹x1 þûÿÿþþ€ÿÿúRzïÿÿýÎH þïÿÿþþ©ÿÿü7"Ðÿ ÿý° þÝÿÿþþÈÿÿýBæÿÿýÍ þÉÿÿþHþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþ—ÿÿþ~þðÿÿý~ýÿÿþþYÿÿþÑþùÿÿþuþvÿÿþ.ýüÿÿþ:þ* þþÿÿþº þ¼ÿÿþ¢þ©ÿÿýÎþª þûÿÿþ* þ,ÿÿýúþ5ÿÿþ•ýþþõÿÿþÆ þÇÿÿþUþ›ÿÿý£ýÿ_þêÿÿþw þxÿÿþ“ý Òÿÿöëˆ;;ÿ£þ×ÿÿþD þFÿÿþÆ ýÕÿ ÿþÍþÁÿÿþ þÿÿþÛ ý¸ÿ ÿþáþ¢ÿÿþ þÿÿþí ýNÒÿÿþõþ€ÿÿþ þÿÿþû ô4{»×ìüòÖÿúþQÿÿþ þÿÿþìýÿîþÿÿþ þÿÿþÙýÿÒ þÞÿÿþD þFÿÿþÂýÿª þ—ÿÿþx þyÿÿþ‹ýÿo þ@ÿÿþÇ þÉÿÿþLýÿ ýÝÿÿþ+ þ,ÿÿýôþ¶ þjÿÿþ» þ¼ÿÿþþ6 ýÛÿÿþuþvÿÿýú ý±ýEþÿÿý~ýÿÿþs ûÿô‡þ„ÿÿ÷Óm( (mÓÿÿþ± ÿõú°i./d±ýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4ü3˜ðÿÿô'xµÞôûêÔ´o&ôB†·ßñüóß¹ƒ¿2LÍ€ü´v&;ÿüþ·-ù%[Æ÷ÿÿünØÿÿýûwúO…ºïÿÿý0Ïÿÿþ— ÿý:óÿÿýŒíÿÿþ€ ÿý$ñÿÿü«ÿÿýýB ÿúæ³€Mÿÿþ¶ÿÿý ÿÿýØ úæ³€Mÿþ8ÿÿþ„ýÕÿÿþfÿþ‹ÿÿýÒþAÿÿýÚÿþÌÿÿþfþÖÿÿþ=ÿþæÿÿþ$þÿÿþ•ÿþúÿÿþ þKÿÿþÜÿþðÿÿþ þ!ÿÿþÿþÓÿÿþ$þÿÿþOÿþšÿÿþeþÿÿþ}ÿþAÿÿýÑþÿÿþŸÿþÆÿÿþþ ÿÿþ¿ÿý*óÿÿþJÿÿþÔÿýBòÿÿþÿÿþçÿû&ÃÿÿþÓÿÿþôÿýD¦þ=ÿÿþùÿü'›íýÑÿÿþþÿöüÿÿ™ÿÿþøÿý Æÿÿü¥ÿÿþðÿý¼ÿÿüù‰ëÿÿþÞÿÿþßÿþpÿÿýø=ÿÿýèDÿÿþÇÿý ïÿÿýcÿÿüÓ$8ÿÿþ©ÿþaÿÿõÓÿÿð~ Sÿÿþÿþ§ÿÿùs¥^ þ‚ÿÿþPÿþÚÿÿþ1þ»ÿÿþÿþñÿÿþýñÿÿþÐÿþûÿÿþþJÿÿþ|ÿþêÿÿþþ®ÿÿýý!ÿþÖÿÿþ1ý$úÿÿþ°ÿþ³ÿÿþsþ¼ÿÿýþ2ÿþpÿÿýÒþpÿÿþ¡ÿþ)ÿÿþcþlÿÿýåÿþ·ÿÿû÷=¬ÿÿýù>ÿý2þÿÿýù÷ÿÿýüZÿ þyÿÿýöTÿ þ”ÿÿýÑ-ÿ ý_òÿÿüØeÿûŠí:<þ ¿2LÍ€óþ’ÿÿþÄþ‡ÿÿþÃýìÿÿþc ýý •ÿÿýñ'þTÿÿýõ ôÿç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ÿýÂ$ýüÿÿþ? þþÿÿüþ¥CþxÿÿýÝ ÿüí›'þØÿÿþ} ÿüü‘þ:ÿÿýýôÿãƒD E„äÿÿýÆ þ›ÿÿþ»ýqütúÿÿý¼ý ñÿÿþYý@ùÿÿþoþ]ÿÿýïþfÿÿýî þ¾ÿÿþ—þ7 ýÔÿÿþaý þÿÿþ6þÖ þuÿÿþ¦þ€ÿÿþÔþÿ þ3ÿÿþÙýßÿÿþsþÿ þÿÿþðþCÿÿýûþÿ þÿÿþúþ¤ÿÿþ±þÿ þÿÿþéýöÿÿþPþÿ þ3ÿÿþÕþfÿÿýé þwÿÿþ³þÇÿÿþ ý×ÿÿþoþ(ÿÿþ, þlÿÿþ)þ‰ÿÿþË ýFúÿÿþ¶ýæÿÿþjýpüxûÿÿýþ1þKÿÿý÷ôÿâ‚C E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF ÿýò_þnÿÿýã ÿüíŠþÏÿÿþ„òJƒ¹×èøøè×¹ƒJ ò2Lͨð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿüø¨6ýåÿÿ ÿüý•þ ÿÿ ÿýÏþJÿÿ ÿóÞg5 5g·üÿÿýÔ ýäÿÿþ¯ÿÿ ÿüå‡4 ý'Àÿÿþ þÿÿýïÿÿ üÉZ ý«ÿÿýü! þGÿÿýdÿÿý ãÿÿþw ýâÿÿü½ÿÿ þtÿÿþÁ þšÿÿûõ"ÿÿ þ,ÿÿþà þDÿÿþsÿ þÿÿþøý àÿÿýÊÿ þ ÿÿþòþ—ÿÿýú-ÿ þ#ÿÿþØýAþÿÿþ‚ÿ þeÿÿþ¡ý ÞÿÿýÕÿýÑÿÿþJþ”ÿÿýý8ÿþ‹ÿÿýÏý?þÿÿþ‘ÿý¢ÿÿýö1ý Üÿÿýß ÿù*Z¢ôÿÿýôIþ‘ÿÿþFÿ ÿýÅ*ý<ýÿÿþ ÿ ÿý¬Eý Úÿÿýèÿ ÿüö¯>þŽÿÿþTÿÿý±ý9ýÿÿþ¯ ÿù 4i®ûÿÿýàýØÿÿýï ÿý¦ÿÿú× ‹ÿÿþc ÿýcþÿÿûüÿÿþ½ ÿ þzÿÿüøÿÿýõ" ÿ ýØÿÿýsÿÿþr ÿ!þwÿÿý³ÿÿþ0ÿÿýàÿÿþÿÿýôÿÿþÿÿýûÿÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5È2LÍ“ó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿý)Îÿÿ ÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿ ý;øÿÿý°!û‰õÿ ÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿôn«×òüïÛÇ”Sþ©ÿÿü7"Ðÿ ÿý° ÿüù›#þÈÿÿýBæÿÿýÍ ÿþüþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿþðÿÿý~ýÿÿþ ÿóúÁ}P' !IŠàÿÿþùÿÿþuþvÿÿþ. üÍhúfñÿÿþþÿÿþº þ¼ÿÿþ¢ü'Ûÿþûÿÿþ* þ,ÿÿýúý&ïþõÿÿþÆ þÇÿÿþUþ`þêÿÿþw þxÿÿþ“þþ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþLþýÝÿÿþ+ þ,ÿÿýôþeþjÿÿþ» þ¼ÿÿþýž ý*ñýÛÿÿþuþvÿÿýúüÿÚB ü+ßÿ ýEþÿÿý~ýÿÿþsÿýµ>úlôÿÿ þ„ÿÿ÷Óm( (mÓÿÿþ± ÿôàšV0"NŽæÿÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ” ÿþó ý.¸ÿ ÿý¼4 û)zÊýÿ ÿüãyô'xµÞôûêÔ´o&ðI¨ÍæóüñàÏ«r8Á2L͘ô%n³ÓéûòÝ´v&û þAÿÿýÚþÌÿÿþfþMÿÿþÓ þÖÿÿþ=þæÿÿþ$þŒÿÿþ þÿÿþ•þúÿÿþ þÃÿÿþI þKÿÿþÜþðÿÿþ þÚÿÿþ þ!ÿÿþþÓÿÿþ$þíÿÿþ þÿÿþOþšÿÿþeþûÿÿþ þÿÿþ}þAÿÿýÑþïÿÿþ þÿÿþŸþÆÿÿþþÝÿÿþ þ ÿÿþ¿ý*óÿÿù~ þÉÿÿþH þJÿÿþÔ ýBòÿÿùç…Cÿ³ þ—ÿÿþ~ þÿÿþç ý&Ãÿÿý´ þYÿÿþÑ þÓÿÿþô üD¦þÿÿþŠ ýüÿÿþ: þ=ÿÿþù ü'›íÿÿýý* þ©ÿÿýÎ ýÑÿÿþþ üüÿÿþª þ5ÿÿþ•ý™ÿÿþøý ÆÿÿüãƒDÿÿýþ þ›ÿÿý£ý¥ÿÿþðý¼ÿÿùùqÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø=þ…ÿÿþ£ ýÕÿÿýèDÿÿþÇý ïÿÿþcþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓþÿÿþáýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ ÿÿþúþ»ÿÿþþñÿÿþþÿÿþîýñÿÿþÐþûÿÿþþCÿÿþÒþJÿÿþ|þêÿÿþþ‡ÿÿþªþ®ÿÿýý!þÖÿÿþ1þÝÿÿþoý$úÿÿþ°þ³ÿÿþsÿþþ¼ÿÿýþ2þpÿÿýÒÿþ¶þpÿÿþ¡ þ)ÿÿþcÿýý6 ý± þlÿÿýå þ·ÿÿý÷=ÿþ ûÿô‡ý¬ÿÿýù> ý2þÿÿöùpÿÿº ÿôú°i./d±÷ÿÿýüZ þyÿÿùâ‚Cÿ§ ÿýöTþ”ÿÿþaÿýÑ-ý_òÿÿü3˜ðÿ ÿüØeüŠíÿÿóB†·ßñüóß¹ƒ:ú Jƒ¹×¿€2€L€Ícõç÷øè×°z=ÿÿýÙoÿÿø H‹íÿÿû šÿÿý‹ÿýÕþhþ&þ þ þ%þgýÔý‡ÿô •ÿÿFŠëÿÿüþ¥Cÿÿýí›ÿÿø E„äÿÿûtúÿý@ùþfþMþþlýFúôxûÿ E…æÿÿôíŠèøøè×¹ƒJ m2LÍ,ð.e’¶ØêöúëÜÁ[ ù%[Æ÷ÿÿû$lµóÿ ÿüø¨6úO…ºïÿÿÿüý•ÿÿýÏÿÿóÞg5 5g·üÿÿþÔÿúæ³€Mÿÿÿüå‡4 ý'Àÿÿúæ³€MÿüÉZ ý«ÿÿÿ%ý ãÿÿÿ&þtÿÿÿ&þ,ÿÿÿ&þÿÿÿ&þ ÿÿÿ&þ#ÿÿÿ&þeÿÿÿ%ýÑÿÿÿ%þ‹ÿÿÿ#ý¢ÿÿþöÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿþàÿ#ý¦ÿÿÿ%ýcþÿÿÿ&þzÿÿÿ&ûØÿÿÿ'üwÿÿÿ'ü0ÿÿÿ'üÿÿÿ'üÿÿÿ'üÿÿÿ'ü=ÿÿÿ'üˆÿÿÿ&û çÿÿÿ&þ–ÿÿÿý¼5ý†ÿÿÿÿü´U ý5Åÿÿÿ ÿòò¯}K($OÒÿÿþåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5D2LÍ;ú7€·ÞñþLÿÿübÖÿÿýåÿÿý)Îÿÿþ ÿÿýPõÿÿþ þJÿÿýVüÿÿùø´g1ýäÿÿþ¯ÿÿý;øÿÿý°!ýü!þÿÿýïÿÿýãÿÿþoýÿwþGÿÿýdÿÿþžÿÿþrýÿÁýâÿÿü½ÿÿý0ýÿÿþ½ýÿàþšÿÿûõ"ÿÿþ®ÿÿýú%ýÿøþDÿÿþsÿ ý üÿÿþ­ýÿòý àÿÿýÊÿ þ{ÿÿþJýÿØþ—ÿÿýú-ÿ þÏÿÿýñýÿ¡ýAþÿÿþ‚ÿ ýþÿÿþºýÿJý ÞÿÿýÕÿ þPÿÿþö \¤ÔòûëÏþ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿþ1ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿÿý Üÿÿýß ÿ þÈÿÿýBæÿÿþ‘ÿÿþFÿ þàÿÿþÝÿÿúÓn( ý<ýÿÿþ ÿ þðÿÿý~ý Úÿÿýèÿ þùÿÿþuþŽÿÿþTÿ þþÿÿþºþ ý9ýÿÿþ¯ ÿ þûÿÿþ*ý× ýØÿÿýï ÿ þõÿÿþÆýÿþ‹ÿÿþc ÿ þêÿÿþwüÿøý7üÿÿþ½ ÿ þ×ÿÿþDÿþsþÖÿÿýõ" ÿ þÁÿÿþÿþ³ÿþr ÿ þ¢ÿÿþÿþàÿþ€ÿÿþÿþôÿþQÿÿþÿþûÿþÿÿþÿþîÿþÞÿÿþDÿþÏÿ þ—ÿÿþxÿþŸÿ þ@ÿÿþÇÿþYÿ ýÝÿÿþ+üÿï ÿþjÿÿþ»ýÿzÿýÛÿÿþuýÑÿýEþÿÿý~þÿþ„ÿÿúÓm( ÿýšÿÿÿýyüÿÿÿý.¸ÿÿ8ø'xµÞôûê?2LÍøüñß¶†Aô%n³ÓéûòÝ´v&û.e’ÿÿüð—2ý3¼ÿÿüþ·-û$lµóÿ ÿü“þÿ ÿýûw ÿ ý µÿÿþ— ÿù.k²úÿÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿýÞû‰õÿ þtÿÿý¨ý«ÿÿýýB ÿüå‡4ý± ýúÿÿýœý ÿÿýØ üÉZþÿÿýÑ ýÕÿÿþf$ýôÿÿþ> þAÿÿýÚ#þMÿÿþÓ þÖÿÿþ=#þŒÿÿþ þÿÿþ•#þÃÿÿþI þKÿÿþÜ#þÚÿÿþ þ!ÿÿþ"þíÿÿþ þÿÿþOúÕ¹x1 þûÿÿþ þÿÿþ}ÿýÎH þïÿÿþ þÿÿþŸÿý° þÝÿÿþ þ ÿÿþ¿ÿýÍ þÉÿÿþH þJÿÿþÔü(nÓÿÿýÊþ—ÿÿþ~ þÿÿþç úÿÿÿþþYÿÿþÑ þÓÿÿþô þÿþvÿÿþ.ýüÿÿþ: þ=ÿÿþù þÿþ¼ÿÿþ¢þ©ÿÿýÎ ýÑÿÿþþ þÿþ,ÿÿýúþ5ÿÿþ•ý™ÿÿþøþÇÿÿþUþ›ÿÿý£ý¥ÿÿþðþxÿÿþ“ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþFÿÿþÆ ýÕÿÿýèDÿÿþÇþÿÿþÛ ý¸ÿ ÿüÓ$8ÿÿþ©þÿÿþí ýNÒÿÿúð~ Sÿÿþþÿÿþû ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÿÿþìþ»ÿÿþþÿÿþÙýñÿÿþÐþFÿÿþÂþJÿÿþ|þyÿÿþ‹þ®ÿÿýý!þÉÿÿþLý$úÿÿþ°þ,ÿÿýôþ¼ÿÿýþ2þ¼ÿÿþþpÿÿþ¡þvÿÿýú ý± þlÿÿýå ý¼5ýÿÿþs ûÿô‡ý¬ÿÿýù> ÿü´U ü(mÓÿÿþ± ÿôú°i./d±÷ÿÿýüZ ÿûò¯}Kÿÿýµ ÿýöT ÿüþ” ÿýÑ- ÿý¼4ü3˜ðÿ ÿüØeû'vÃúÿÿûÔ´o&óB†·ßñüóß¹ƒ:ú ?vŸÃ?2LÍô¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 ÿüø¨6û [ªñÿ ÿüÏd ÿüý• ü2—ñÿÿýÒ0 ÿýÏ ÿýú] õg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTý'Àÿÿþ ÿûþµDüeõÿÿý÷!ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^"ý5ÅÿÿýÑþ…ÿÿþgö($OÒÿÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿüà ÿþ8ôáïúøêÛÉj5t2LÍFù%[Æ÷ÿÿÿúO…ºïÿÿÿÿÿþëÿÿþÿúæ³€Mÿÿ%þ)ÿÿþ/úæ³€Mÿ%þŠÿÿþÎ ÿ$ýçÿÿþm ÿ$þLÿÿýø ÿ$þ­ÿÿþªÿ#ýúÿÿþIÿ#þoÿÿýåÿ#þÐÿÿþ‡ÿ"þ1ÿÿþ&ÿ"þ’ÿÿþÄÿ!ýìÿÿþcÿ!þTÿÿýõ ÿ!þ¶ÿÿþ¡ÿ ýüÿÿþ?ÿ þxÿÿýÝÿ þØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿý÷ÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿ ý;øÿÿý°!û‰õÿýäÿÿü¯ÿÿ ýãÿÿþo ý±þÿÿûïÿÿ þžÿÿþr$þGÿÿûdÿÿý0ýÿÿþ½$ýâÿÿú½ÿÿþ®ÿÿýú%$þšÿÿùõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿþ—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿ þjÿÿþ» þ¼ÿÿþÿ ýÛÿÿþuþvÿÿýúÿ ýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼4ÿô'xµÞôûêÔ´o&c2LÍóÿþÆÿÿþ þ‡ÿÿþÃÿý*óÿÿýý •ÿÿýñ'ÿýBòÿÿõç…CFŠëÿÿýñ>ÿý&ÃÿÿýÂ$ÿüD¦þÿÿüþ¥Cÿü'›íÿ ÿüí›'ÿüüÿÿüü‘ÿý ÆÿÿõãƒD E„äÿÿýÆ ÿ ý¼ÿÿüùqütúÿÿý¼ÿ þpÿÿýø= ý@ùÿÿþoÿ ý ïÿÿþc þfÿÿýî ÿ þaÿÿýÓ ýÔÿÿþaþ ÿÿ þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÚÿÿþ1þ3ÿÿþÙýßÿÿþñÿÿþþÿÿþðþCÿÿþûÿÿþþÿÿþúþ¤ÿÿþêÿÿþþÿÿþéýöÿÿ þÖÿÿþ1þ3ÿÿþÕþfÿÿ þ³ÿÿþsþwÿÿþ³þÇÿÿ þpÿÿýÒ ý×ÿÿþoþ(ÿÿ þ)ÿÿþc þlÿÿþ)þ‰ÿÿ þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿ ý2þÿÿüùpüxûÿÿýþ1þKÿÿþyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ”ÿÿþ“ýùÿÿý_òÿÿýò_þnÿÿþãÿÿüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ Z2LÍ@ ÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿÿþŠÿÿþÎþÿÿýïÿÿÿýçÿÿþmþGÿÿýdÿÿÿþLÿÿýøýâÿÿü½ÿÿÿþ­ÿÿþªþšÿÿûõ"ÿÿÿýúÿÿþIþDÿÿþsÿÿþoÿÿýåý àÿÿýÊÿÿþÐÿÿþ‡þ—ÿÿýú-ÿÿþ1ÿÿþ&ýAþÿÿþ‚ÿÿþ’ÿÿþÄý ÞÿÿýÕÿÿýìÿÿþcþ”ÿÿýý8ÿÿþTÿÿýõ ý?þÿÿþ‘ÿÿþ¶ÿÿþ¡ý Üÿÿýß ÿÿýüÿÿþ?þ‘ÿÿþFÿÿþxÿÿýÝý<ýÿÿþ ÿÿþØÿÿþ}ý ÚÿÿýèÿûÍh:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿþþÿÿþ6þÖÿÿýõ" ÿÿþÔÿþr ÿÿþsÿ ÿýûÿ ÿþ±ÿ ÿþPÿ ÿýé$ÿÿþ%ÿÿþ,%ÿýÿË&ÿ ùž ÿj&ÿ ùÿÚB÷&ÿ ÿýµ§'ÿ ÿþF'ÿ ÿþ'ÿ ÿ)ÿ û)zÊý=þ?2LÍ(ô%n³ÓéûòÝ´v& ÿý3¼ÿÿüþ·- ÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿþtÿÿý¨ý«ÿÿýýBÿýúÿÿýœý ÿÿýØÿþÿÿýÑ ýÕÿÿþfÿýôÿÿþ> þAÿÿýÚÿþMÿÿþÓ þÖÿÿþ=ÿþŒÿÿþ þÿÿþ•ÿþÃÿÿþI þKÿÿþÜÿþÚÿÿþ þ!ÿÿþÿþíÿÿþ þÿÿþOÿþûÿÿþ þÿÿþ}ÿôn«×òüïÛÇ”Sþïÿÿþ þÿÿþŸ ÿüù›#þÝÿÿþ þ ÿÿþ¿ÿüü~ þÉÿÿþH þJÿÿþÔÿý³ þ—ÿÿþ~ þÿÿþçóúÁ}P' !IŠàÿÿý´ þYÿÿþÑ þÓÿÿþôþüfñÿÿþŠ ýüÿÿþ: þ=ÿÿþùý'Ûÿÿýý* þ©ÿÿýÎ ýÑÿÿþþý&ïÿÿþª þ5ÿÿþ•ý™ÿÿþøþ`ÿÿýþ þ›ÿÿý£ý¥ÿÿþðýÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ…ÿÿþ£ ýÕÿÿýèDÿÿþÇþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þÿÿþáýNÒÿÿúð~ Sÿÿþþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþ ÿÿþúþ»ÿÿþþÿÿþîýñÿÿþÐþCÿÿþÒþJÿÿþ|þ‡ÿÿþªþ®ÿÿýý!ýÝÿÿþoý$úÿÿþ°þeÿÿþþ¼ÿÿýþ2ý*ñÿÿþ¶þpÿÿþ¡ý+ßÿÿýý6 ý± þlÿÿýåþ>ülôÿÿþ ûÿô‡ý¬ÿÿýù>óÿàšV0"NŽæÿÿýº ÿôú°i./d±÷ÿÿýüZÿý§ ÿýöTÿýóaÿýÑ- ÿüãyü3˜ðÿ ÿüØe ñI¨ÍæóüñàÏ«r8óB†·ßñüóß¹ƒ:N2LÍ ó ý ÞÿÿýÕÿþÆÿÿþ þ‡ÿÿþÃþ”ÿÿýý8ÿý*óÿÿýý •ÿÿýñ' ý?þÿÿþ‘ÿýBòÿÿõç…CFŠëÿÿýñ> ý Üÿÿýß ÿý&ÃÿÿýÂ$þ‘ÿÿþFÿ üD¦þÿÿüþ¥Cý<ýÿÿþ ÿ ü'›íÿ ÿüí›' ý Úÿÿýèÿüüÿÿüü‘ þŽÿÿþTÿý ÆÿÿõãƒD E„äÿÿýÆ ý9ýÿÿþ¯ ÿý¼ÿÿüùqütúÿÿý¼ýØÿÿýï ÿþpÿÿýø= ý@ùÿÿþoþ‹ÿÿþc ÿý ïÿÿþc þfÿÿýî ý7üÿÿþ½ ÿþaÿÿýÓ ýÔÿÿþaþÖÿÿýõ" ÿþ§ÿÿþsþuÿÿþ¦ÿþr ÿþÚÿÿþ1þ3ÿÿþÙÿþñÿÿþþÿÿþðÿþûÿÿþþÿÿþúÿþêÿÿþþÿÿþéÿþÖÿÿþ1þ3ÿÿþÕÿþ³ÿÿþsþwÿÿþ³ÿþpÿÿýÒ ý×ÿÿþoÿþ)ÿÿþc þlÿÿþ)ÿþ·ÿÿý÷= ýFúÿÿþ¶ÿý2þÿÿüùpüxûÿÿýþ1ÿþyÿÿõâ‚C E…æÿÿþxÿþ”ÿÿþ“ÿý_òÿÿýò_ÿ üŠíÿ ÿüíŠÿ ñ Jƒ¹×èøøè×¹ƒJ f2LÍò@v©Óæùóâѧn2.û [ªñÿ ÿüÏd ÿ ü2—ñÿÿýÒ0 ÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷!%ÿý¼3 ý0ðÿÿþ±%üÿæVþIÿÿþ*$ý¨þµÿÿþz8þXÿÿþ¿8þÿÿþÜ8þÿÿþô8þ ÿÿþô8þ4ÿÿþß8þyÿÿþÅ7ýÚÿÿþ‰þþ\ÿÿþFþTýåÿÿýæþ¶þ¨ÿÿþrýüþkÿÿýÛýxÿýBúÿÿýþ?ýØÿý)îÿÿþ†ü:ÿÿýâÿÿý¼ü›ÿÿýÙÿÿýË û ñÿÿýÒÿÿýÓþ]ÿÿýËÿÿýÚþ¾ÿÿý Æÿÿýàý þÿÿý Áÿÿýä"þ€ÿÿý¼ÿÿýè'ýßÿÿ ý¸ÿÿýì,þCÿÿþûÿÿ ý³ÿÿýï1þ¤ÿÿþ±ÿÿ ý®ÿÿýó8ýöÿÿþPý©ÿÿýõ>þfÿÿýé ý£ÿÿýøEþÇÿÿþ ýÿÿýúMþ(ÿÿþ, þ•ÿÿýüU þ‰ÿÿþË þÿÿýþ^ ýæÿÿþj þ…ÿÿþg!þKÿÿý÷ ÿþ8þ¬ÿÿþ§ ÿþ8 ýùÿÿþF ÿþ8 þnÿÿýã ÿþ8 þÏÿÿþ„ƒ2LÍð.e’¶ØêöúëÜÁ[ ÿ û$lµóÿ ÿüø¨6ÿ ÿüý• ÿþë ÿýÏ ÿþ ÿóÞg5 5g·üÿÿýÔ ÿþ)ÿÿþ/ ÿüå‡4 ý'Àÿÿþ ÿþŠÿÿþÎ üÉZ ý«ÿÿýü! ÿýçÿÿþmý ãÿÿþw ÿþLÿÿýøþtÿÿþÁ ÿþ­ÿÿþªþ,ÿÿþà ÿýúÿÿþIþÿÿþø ÿþoÿÿýåþ ÿÿþò ÿþÐÿÿþ‡þ#ÿÿþØ ÿý1ÿÿþ&þeÿÿþ¡ ÿý’ÿÿþÄýÑÿÿþJ ÿýìÿÿþcþ‹ÿÿýÏ ÿþnÿÿýõ ý¢ÿÿýö1 ÿþ¡ù*Z¢ôÿÿýôI ÿþ? ÿýÅ* ÿýÝ ÿý¬EÿûúÁ}Pÿÿþ} ÿüö¯>üÍhÿýýÿý±ÿþ»ù 4i®ûÿÿýàÿþY ý¦ÿÿý× üÿï"ýcþÿÿþýÿ—$þzÿÿýøýÿ6$ýØÿÿþsþÔ&þwÿÿþ³þs&þ0ÿÿþàþ&þÿÿþô8þÿÿþû8þÿÿþî8þ=ÿÿþÏ8þˆÿÿþŸ7ý çÿÿþY7þ–ÿÿýï ýž ý¼5ý†ÿÿþzüÿÚBÿü´U ý5ÅÿÿýÑÿýµ>ÿòò¯}K($OÒÿÿýå ÿüàšVÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà û)zÊýÿÿï ?vŸÃáïúøêÛÉj5úI¨Í?2LÍ$óBÄéùùéÄBÿýP×ÿÿý×P ÿý£ÿ ÿý¢ ÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦)þ`ÿÿý‡ýˆÿÿþ_'ýêÿÿþþ„ÿÿýé&þ~ÿÿýÂýÄÿÿþ|%ýéÿÿþ3 þ4ÿÿýè$þNÿÿþÀ þÀÿÿþL$þ¢ÿÿþb þcÿÿþ¡$þæÿÿýþ þÿÿþå#þ$ÿÿþÕþÖÿÿþ$"þVÿÿþ¡þ¢ÿÿþU"þƒÿÿþwþxÿÿþõ«×òüïÛÇ”Sþ¥ÿÿþTþTÿÿþ£ÿüù›#þÃÿÿþ9þ:ÿÿþÁ ÿüü~ þØÿÿþ#þ#ÿÿþÖ ÿý³ þéÿÿþþÿÿþè÷' !IŠàÿÿý´ þõÿÿþ þ ÿÿþô üfñÿÿþŠ þûÿÿþþÿÿþùý'Ûÿÿýý* ÿþþÿÿþþý&ïÿÿþª þûÿÿþþÿÿþúþ`ÿÿýþþõÿÿþþ ÿÿþôýÛÿÿþ_þêÿÿþþÿÿþèþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþMþeÿÿþ ýêÿÿþ3 þ4ÿÿýéý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿþ~ý+ßÿÿýý6 ýëÿÿþþƒÿÿýëülôÿÿþ þcÿÿý†ý‡ÿÿþb ÷0"NŽæÿÿýºþ«ÿÿ÷Öh%&j×ÿÿþ© ÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥ ÿüãyýRØÿÿýØR õæóüñàÏ«r8óD‘ÆêùùêÆ‘CO2LÍ@ÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿ þCÿÿýûÿ þ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýé$ÿ þÇÿÿþ%ÿ þ(ÿÿþ,%ÿ þ‰ÿÿþË&ÿ ýæÿÿþj&ÿ þKÿÿý÷&ÿ þ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ þnÿÿýã'ÿ þÏÿÿþ„(ÿ…2LÍ ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿýÏdÿüý• ü2—ñÿÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿÿüå‡4 ý'Àÿÿþ ÿûþµDûeõÿüÉZ ý«ÿÿýü!ÿý¼3 ý0ðý ãÿÿþwüÿæVþIþtÿÿþÁý¨,þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡7ýÑÿÿþJ7þ‹ÿÿýÏþý¢ÿÿýö1þ\ù*Z¢ôÿÿýôIýå ÿýÅ*ý¨ÿ ÿý¬Eükÿÿ ÿüö¯>ûBúÿÿ ÿý±ý)îÿÿù 4i®ûÿÿýàýâÿÿý¦ÿÿý× ýÙÿÿýcþÿÿþýÒÿÿþÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿúä"ÿþ0ÿÿþàý¼ÿÿýè'þÿþÿÿþôý¸ÿÿýì,þÿþÿÿþû ý³ÿÿýï1þÿþÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà ÿ ï ?vŸÃáïúøêÛÉj5d2LÍ<úülôÿÿþ ý2þÿÿúùpÿÿþ8ÿôàšV0"NŽæÿÿýº þyÿÿüâ‚Cÿÿþ8ÿý§ þ”ÿ ÿþ8ÿýóaý_òÿ ÿþ8û)zÊýÿ ÿüãyüŠíÿÿðI¨ÍæóüñàÏ«r8ú Jƒ¹×?2LÍ÷ç÷øè×°z=6ÿüÙo ÿ ÿýÐ/ ÿ ÿýò9 ÿþë ø H‹íÿÿýð#ÿþý šÿÿþµþ)ÿÿþ/þ‹ÿÿþ8þŠÿÿþÎýÕÿÿþŠýçÿÿþmþhÿÿþËþLÿÿýøþ&ÿÿþåþ­ÿÿþªþ ÿÿþùýúÿÿþIþ ÿÿþïþoÿÿýåþ%ÿÿþÒþÐÿÿþ‡þgÿÿþ™þ1ÿÿþ&ýÔÿÿþ>þ’ÿÿþÄþ‡ÿÿþÃýìÿÿþcý •ÿÿýñ'þTÿÿýõ øFŠëÿÿýñ>þ¶ÿÿþ¡ ÿýÂ$ýüÿÿþ?ÿüþ¥CþxÿÿýÝþ<ÿÿüí›'þØÿÿþ}ý Úÿÿüü‘þ:ÿÿýýöŽÿ E„äÿÿýÆ þ›ÿÿþ»ü9ýÿütúÿÿý¼ý ñÿÿþYûØÿÿý@ùÿÿþoþ]ÿÿýïþ‹ÿÿþfÿÿýî þ¾ÿÿþ—ý7üÿÿýÔÿÿþaý þÿÿþ6þÖÿÿþõþuÿÿþ¦þ€ÿÿþÔÿþrþ3ÿÿþÙýßÿÿþsÿ þÿÿþðþCÿÿýûÿ þÿÿþúþ¤ÿÿþ±ÿ þÿÿþéýöÿÿþPÿ þ3ÿÿþÕþfÿÿýé þwÿÿþ³þÇÿÿþ ý×ÿÿþoþ(ÿÿþ, þlÿÿþ)þ‰ÿÿþË ýFúÿÿþ¶ýæÿÿþjüxûÿÿýþ1þKÿÿý÷ø E…æÿÿþxþ¬ÿÿþ§ ÿþ“ýùÿÿþF ÿýò_þnÿÿýãÿüíŠþÏÿÿþ„öèøøè×¹ƒJ v2LÍ$ð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿüø¨6ýåÿÿ ÿüý•þ ÿÿ ÿýÏþJÿÿ ÿóÞg5 5g·üÿÿýÔ ýäÿÿþ¯ÿÿ ÿüå‡4 ý'Àÿÿþ þÿÿýïÿÿ üÉZ ý«ÿÿýü! þGÿÿýdÿÿý ãÿÿþw ýâÿÿü½ÿÿ þtÿÿþÁ þšÿÿûõ"ÿÿ þ,ÿÿþà þDÿÿþsÿ þÿÿþøý àÿÿýÊÿ þ ÿÿþòþ—ÿÿýú-ÿ þ#ÿÿþØýAþÿÿþ‚ÿ þeÿÿþ¡ý ÞÿÿýÕÿýÑÿÿþJþ”ÿÿýý8ÿþ‹ÿÿýÏý?þÿÿþ‘ÿý¢ÿÿýö1ý Üÿÿýß ÿù*Z¢ôÿÿýôIþ‘ÿÿþFÿ ÿýÅ*þýÿÿþ ÿ ÿý¬E ÿýèÿ ÿüö¯>ÿþTÿÿý±ÿþ¯ ÿù 4i®ûÿÿýàüÿï ÿý¦ÿÿý× ýÿc ÿýcþÿÿþþ½ ÿ þzÿÿýøþ" ÿ ýØÿÿþsÿ!þwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5L2LÍ ò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdÿü2—ñÿÿýÒ0ÿÿýú] ÿÿõâ“R% 9xÚÿÿýüT ÿÿûþµDüeõÿÿý÷! ÿÿý¼3 ý0ðÿÿþ± ÿüÿæVþIÿÿþ* ÿý¨þµÿÿþz ÿ(þXÿÿþ¿ ÿ(þÿÿþÜ ÿ(þÿÿþô ÿ(þ ÿÿþô ÿ(þ4ÿÿþß ÿ(þyÿÿþÅ ÿ'ýÚÿÿþ‰ ÿôn«×òüïÛÇ”Sþ\ÿÿþF ÿüù›#ýåÿÿýæ ÿüü~þ¨ÿÿþr ÿý³ þkÿÿýÛ ÿóúÁ}P' !IŠàÿÿý´ýBúÿÿýþ? üÍhüfñÿÿþŠý)îÿÿþ†ý'Ûÿÿþýýâÿÿý¼ý&ïÿÿýÙÿÿýË þ`ÿÿýÒÿÿýÓ ýÛÿÿýËÿÿýÚ"þ…ÿÿ ý Æÿÿýà#þBÿÿ ý Áÿÿýä"$þÿÿ ý¼ÿÿýè'%þ ÿÿ ý¸ÿÿýì,&þ ÿÿ ý³ÿÿýï1'þÿÿý®ÿÿýó8(þCÿÿý©ÿÿýõ>)þ‡ÿÿý£ÿÿýøE)ýÝÿÿýÿÿýúM*þeÿÿþ•ÿÿýüUýž ý*ñÿÿþÿÿýþ^üÿÚB ý+ßÿÿþýþ…ÿÿþgÿýµ>ülôÿÿþÿþ8ÿôàšV0"NŽæÿÿýºÿþ8ÿý§ ÿþ8ÿýóaÿþ8û)zÊýÿ ÿüãy-ðI¨ÍæóüñàÏ«r8E2LÍô%n³ÓéûòÝ´v&÷ þAÿÿýÚþÌÿÿþfþMÿÿþÓ þÖÿÿþ=þæÿÿþ$þŒÿÿþ þÿÿþ•þúÿÿþ þÃÿÿþI þKÿÿþÜþðÿÿþ þÚÿÿþ þ!ÿÿþþÓÿÿþ$þíÿÿþ þÿÿþOþšÿÿþeþûÿÿþ þÿÿþ}þAÿÿýÑþïÿÿþ þÿÿþŸþÆÿÿþþÝÿÿþ þ ÿÿþ¿ý*óÿÿýþÉÿÿþH þJÿÿþÔ ýBòÿÿøç…C þ—ÿÿþ~ þÿÿþç ý&Ãÿÿ þYÿÿþÑ þÓÿÿþô üD¦þÿÿ ýüÿÿþ: þ=ÿÿþù ü'›íÿÿþ* þ©ÿÿýÎ ýÑÿÿþþ üüÿÿþª þ5ÿÿþ•ý™ÿÿþøý ÆÿÿöãƒD þ þ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùqýÿ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø=ýÿ£ ýÕÿÿýèDÿÿþÇý ïÿÿþcýÿÍ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓýÿáýNÒÿÿúð~ Sÿÿþþ§ÿÿþsýÿõó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1ýÿúþ»ÿÿþþñÿÿþýÿîýñÿÿþÐþûÿÿþýÿÒþJÿÿþ|þêÿÿþýÿªþ®ÿÿýý!þÖÿÿþ1ýÿoý$úÿÿþ°þ³ÿÿþsýÿþ¼ÿÿýþ2þpÿÿýÒþ¶þpÿÿþ¡ þ)ÿÿþcþ6 ý± þlÿÿýå þ·ÿÿý÷=ûÿô‡ý¬ÿÿýù> ý2þÿÿüùpÿôú°i./d±÷ÿÿýüZ þyÿÿøâ‚C  ÿýöTþ”ÿ ÿÿýÑ-ý_òÿÿü3˜ðÿ ÿüØeüŠíÿÿóB†·ßñüóß¹ƒ:ö Jƒ¹×èøøè?2LÍû×°z=7ü@vÿÿüÙo ÿ û [ªñÿÿýÐ/ ÿ ü2—ñÿ ÿýò9 ÿþëÿüH‹íÿÿýð#ÿþÿúâ šÿÿþµþ)ÿÿþ/ÿûþµDþ‹ÿÿþ8þŠÿÿþÎ ÿý¼3ýÕÿÿþŠýçÿÿþm üÿæVþhÿÿþËþLÿÿýø ý¨ þ&ÿÿþåþ­ÿÿþªþ ÿÿþùýúÿÿþIþ ÿÿþïþoÿÿýåþ%ÿÿþÒþÐÿÿþ‡þgÿÿþ™þ1ÿÿþ&ýÔÿÿþ>þ’ÿÿþÄþ‡ÿÿþÃýìÿÿþcý •ÿÿýñ'þTÿÿýõ üFŠëÿÿýñ>þ¶ÿÿþ¡ÿýÂ$ýüÿÿþ?ÿüþ¥CþxÿÿýÝÿüí›'þØÿÿþ}ÿüü‘þ:ÿÿýýüE„äÿÿýÆ þ›ÿÿþ»ütúÿÿý¼ý ñÿÿþYý@ùÿÿþoþ]ÿÿýïþfÿÿýî þ¾ÿÿþ—ýÔÿÿþaý þÿÿþ6þuÿÿþ¦þ€ÿÿþÔþ3ÿÿþÙýßÿÿþsþÿÿþðþCÿÿýûþþÿÿþúþ¤ÿÿþ±ý³þÿÿþéýöÿÿþPü®ÿþ3ÿÿþÕþfÿÿýéû©ÿÿþwÿÿþ³þÇÿÿþý£ÿÿý×ÿÿþoþ(ÿÿþ,ýÿÿþlÿÿþ)þ‰ÿÿþËþ•ÿÿýFúÿÿþ¶ýæÿÿþjþÿÿùþxûÿÿýþ1þKÿÿý÷þ…ÿÿûgE…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF ÿýò_þnÿÿýã ÿüíŠþÏÿÿþ„ÿú×¹ƒJ z2LÍõ©Óæùóâѧn24 ÿüÏdþLÿÿ ÿýÒ0ýåÿÿ ÿýú]þ ÿÿ ö“R% 9xÚÿÿýüTþJÿÿüeõÿÿý÷!ýäÿÿþ¯ÿÿý0ðÿÿþ±þÿÿýïÿÿþIÿÿþ*þGÿÿýdÿÿþµÿÿþzýâÿÿü½ÿÿþXÿÿþ¿þšÿÿûõ"ÿÿþÿÿþÜþDÿÿþsÿþÿÿþôý àÿÿýÊÿþ ÿÿþôþ—ÿÿýú-ÿþ4ÿÿþßýAþÿÿþ‚ÿþyÿÿþÅý ÞÿÿýÕÿýÚÿÿþ‰þ”ÿÿýý8ÿþ\ÿÿþF ý?þÿÿþ‘ÿýåÿÿýæ ý Üÿÿýß ÿþ¨ÿÿþr þ‘ÿÿþFÿþkÿÿýÛ ý<ýÿÿþ ÿýBúÿÿýþ? ý Úÿÿýèÿý)îÿÿþ† þŽÿÿþTÿýâÿÿý¼ ý9ýÿÿþ¯ ÿýÙÿÿýË ýØÿÿýï ÿýÒÿÿýÓ þ‹ÿÿþc ÿýËÿÿýÚ ý7üÿÿþ½ ÿý ÆÿÿýàþÖÿÿýõ" ÿ ý Áÿÿýä"ÿþr ÿ ý¼ÿÿýè'ÿþ¸ÿÿýì,ÿÿýï1ÿÿýó8ÿÿýõ>'ÿ ÿýøE(ÿ üÿúM)ÿ ýüU*ÿ þ^+ÿ:ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ2LÍð.e’¶ØêöúëÜÁ[óBÄéùùéÄBû$lµóÿ ÿüø¨6ýP×ÿÿý×Pÿüý•ý£ÿ ÿý¢ÿýÏý¾ÿÿý½ÿóÞg5 5g·üÿÿýÔ þ§ÿÿ÷Öi& (kØÿÿþ¦ÿüå‡4 ý'Àÿÿþ þ`ÿÿý‡ýˆÿÿþ_üÉZ ý«ÿÿýü! ýêÿÿþþ„ÿÿýéý ãÿÿþw þ~ÿÿýÂýÄÿÿþ|þtÿÿþÁ ýéÿÿþ3 þ4ÿÿýèþ,ÿÿþà þNÿÿþÀ þÀÿÿþLþÿÿþø þ¢ÿÿþb þcÿÿþ¡þ ÿÿþò þæÿÿýþ þÿÿþåþ#ÿÿþØþ$ÿÿþÕþÖÿÿþ$þeÿÿþ¡þVÿÿþ¡þ¢ÿÿþUýÑÿÿþJþƒÿÿþwþxÿÿþþ‹ÿÿýÏþ¥ÿÿþTþTÿÿþ£ý¢ÿÿýö1 þÃÿÿþ9þ:ÿÿþÁ ù*Z¢ôÿÿýôI þØÿÿþ#þ#ÿÿþÖ ÿýÅ* þéÿÿþþÿÿþè ÿý¬E þõÿÿþ þ ÿÿþô ÿüö¯> þûÿÿþþÿÿþùÿý± ÿþþÿÿþþ ù 4i®ûÿÿýà þûÿÿþþÿÿþúý¦ÿÿý× þõÿÿþþ ÿÿþôýcþÿÿþþêÿÿþþÿÿþèþzÿÿýøþØÿÿþ"þ#ÿÿþÖýØÿÿþsþÃÿÿþ9þ:ÿÿþÂþwÿÿþ³þ¥ÿÿþSþTÿÿþ£þ0ÿÿþàþƒÿÿþwþxÿÿþ‚þÿÿþôþWÿÿþ¡þ¢ÿÿþUþÿÿþûþ%ÿÿþÕþÕÿÿþ$þÿÿþîþæÿÿýþ ýþÿÿþæþ=ÿÿþÏþ£ÿÿþb þbÿÿþ¢þˆÿÿþŸþOÿÿþ¿ þÀÿÿþMý çÿÿþYýêÿÿþ3 þ4ÿÿýéþ–ÿÿýï þ€ÿÿýÂýÃÿÿú~¼5ý†ÿÿþz ýëÿÿþþƒÿÿöëÿÿ´U ý5ÅÿÿýÑ þcÿÿý†ý‡ÿÿþbÿòò¯}K($OÒÿÿýå þ«ÿÿ÷Öh%&j×ÿÿþ©ÿýÒ!ý ÁÿÿýÀ ÿüø}ý ¦ÿ ÿý¥û'vÃúÿ ÿüàýRØÿÿýØRï ?vŸÃáïúøêÛÉj5óD‘ÆêùùêÆ‘CG2LÍHÿ ÿÿ ÿÿþë ÿÿþ ÿþ)ÿÿþ/ ÿ'þŠÿÿþÎ ÿ&ýçÿÿþm ÿ&þLÿÿýø ÿ&þ­ÿÿþª ÿ%ýúÿÿþI ÿ%þoÿÿýå ÿ%þÐÿÿþ‡ ÿ$þ1ÿÿþ& ÿ$þ’ÿÿþÄÿ#ýìÿÿþcÿôn«×òüïÛÇ”SþTÿÿýõ ÿüù›#þ¶ÿÿþ¡ÿþüýüÿÿþ?ÿþxÿÿýÝÿóúÁ}P' !IŠàÿÿþØÿÿþ}üÍhúfñÿÿþ:ÿÿýýü'Ûÿþ›ÿÿþ»!ý&ïý ñÿÿþY"þ`þ]ÿÿýï"þþ¾ÿÿþ—7ý þÿÿþ67þ€ÿÿþÔ7ýßÿÿþs7þCÿÿýû7þ¤ÿÿþ±7ýöÿÿþP7þfÿÿýé7þÇÿÿþ&þþ(ÿÿþ,&þeþ‰ÿÿþËýž ý*ñ ýæÿÿþjüÿÚB ü+ßÿ þKÿÿý÷ÿýµ>úlôÿÿ þ¬ÿÿþ§ÿôàšV0"NŽæÿÿ ýùÿÿþFÿ þnÿÿýãÿþó þÏÿÿþ„û)zÊýÿ ÿüãy-ðI¨ÍæóüñàÏ«r8A2LÍò@v©Óæùóâѧn2ûBÄÿÿû [ªñÿ ÿüÏdýP×ÿÿ ü2—ñÿÿýÒ0ý£ÿÿ ÿýú]ý¾ÿÿ ÿõâ“R% 9xÚÿÿýüTþ§ÿÿýÖiÿûþµDüeõÿÿý÷! þ`ÿÿý‡ÿý¼3 ý0ðÿÿþ± ýêÿÿþüÿæVþIÿÿþ* þ~ÿÿýÂý¨þµÿÿþz ýéÿÿþ3&þXÿÿþ¿ þNÿÿþÀ'þÿÿþÜ þ¢ÿÿþb'þÿÿþô þæÿÿýþ'þ ÿÿþôþ$ÿÿþÕ(þ4ÿÿþßþVÿÿþ¡(þyÿÿþÅþƒÿÿþw'ýÚÿÿþ‰þ¥ÿÿþT'þ\ÿÿþFþÃÿÿþ9ý~ýåÿÿýæþØÿÿþ#üÿ³ þ¨ÿÿþr þéÿÿþÿý´þkÿÿýÛ þõÿÿþ ÿþŠýBúÿÿýþ? þûÿÿþÿýý*ý)îÿÿþ† ÿþÿþªýâÿÿý¼ þûÿÿþÿýþýÙÿÿýË þõÿÿþþÛÿÿþ_ýÒÿÿýÓ þêÿÿþþ…ÿÿþ£ýËÿÿýÚþØÿÿþ"þBÿÿþÍý ÆÿÿýàþÃÿÿþ9þÿÿþáý Áÿÿýä"þ¥ÿÿþSþ ÿÿþõý¼ÿÿýè'þƒÿÿþwþ ÿÿþúý¸ÿÿýì,þWÿÿþ¡þÿÿþîý³ÿÿýï1þ%ÿÿþÕþCÿÿþÒ ý®ÿÿýó8þæÿÿýþþ‡ÿÿþª ý©ÿÿýõ>þ£ÿÿþbþÝÿÿþo ý£ÿÿýøEþOÿÿþ¿ÿþ ýÿÿýúMýêÿÿþ3ÿþ¶ þ•ÿÿýüUþ€ÿÿýÂÿýý6 þÿÿýþ^ýëÿÿþÿþ þ…ÿÿþgþcÿÿø†ÿÿº ÿþ8 þ«ÿÿúÖhÿ§ ÿþ8 ý Áÿÿþa ÿþ8 ý ¦ÿÿÿþ8ýRØÿÿ;ûD‘Æ?2LÍ÷éùùéÄBô%n³ÓéûòÝ´v&ÿý×Pý3¼ÿÿüþ·-ÿý¢ü“þÿ ÿýûw ÿý½ ý µÿÿþ—ø:& (kØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ ý$ñýˆÿÿþ_ þtÿÿý¨ý«ÿÿýýB ý¶ÿþ„ÿÿýé ýúÿÿýœý ÿÿýØ ü8ÿÿýÄÿÿþ| þÿÿýÑ ýÕÿÿþf ü‹ÿÿþ4ÿÿýèýôÿÿþ> þAÿÿýÚüÌÿÿþÀÿÿþLþMÿÿþÓ þÖÿÿþ=üæÿÿþcÿÿþ¡þŒÿÿþ þÿÿþ•üúÿÿþÿÿþåþÃÿÿþI þKÿÿþÜüðÿÿþÖÿÿþ$þÚÿÿþ þ!ÿÿþüÓÿÿþ¢ÿÿþUþíÿÿþ þÿÿþOüšÿÿþxÿÿþþûÿÿþ þÿÿþ}üAÿÿþTÿÿþ£þïÿÿþ þÿÿþŸýÆÿþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿ý*óþ#ÿÿþÖþÉÿÿþH þJÿÿþÔ þBþÿÿþèþ—ÿÿþ~ þÿÿþçþ ÿÿþôþYÿÿþÑ þÓÿÿþôþÿÿþùýüÿÿþ: þ=ÿÿþùþÿÿþþþ©ÿÿýÎ ýÑÿÿþþ þþÿÿþúþ5ÿÿþ•ý™ÿÿþøý Æþ ÿÿþôþ›ÿÿý£ý¥ÿÿþðü¼ÿþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßüpÿÿþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇû ïÿÿþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿ þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþ§ÿÿ þxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿ þ¢ÿÿþUþ»ÿÿþþñÿÿ þÕÿÿþ$ýñÿÿþÐþûÿÿýþÿÿþæþJÿÿþ|þêÿÿþbÿÿþ¢þ®ÿÿýý!þÖÿÿþÀÿÿþMý$úÿÿþ°þ³ÿÿþ4ÿÿýéþ¼ÿÿýþ2þpÿÿýÃÿÿþ~þpÿÿþ¡ þ)ÿÿþƒÿÿýë ý± þlÿÿýå ü·ÿÿý‡ÿÿþb ûÿô‡ý¬ÿÿýù> ö2þÿ%&j×ÿÿþ© ÿôú°i./d±÷ÿÿýüZ þyÿ ÿýÀ ÿýöTþ”ÿÿý¥ÿýÑ-ÿýØRü3˜ðÿ ÿüØe÷êùùêÆ‘CóB†·ßñüóß¹ƒ:V2LÍó ý ÞÿÿýÕÿÿþ þ‡ÿÿþÃþ”ÿÿýý8ÿÿýý •ÿÿýñ' ý?þÿÿþ‘ÿþòÿÿõç…CFŠëÿÿýñ> ý Üÿÿýß ÿý&ÃÿÿýÂ$þ‘ÿÿþFÿ üD¦þÿÿüþ¥Cý<ýÿÿþ ÿ ü'›íÿ ÿüí›' ý Úÿÿýèÿýüÿÿüü‘ þŽÿÿþTÿÿõãƒD E„äÿÿýÆ ý9ýÿÿþ¯ ÿÿüùqütúÿÿý¼ýØÿÿýï ÿÿýø= ý@ùÿÿþoþ‹ÿÿþc ÿÿþc þfÿÿýî ý7üÿÿþ½ ÿüÿÓ ýÔÿÿþaþÖÿÿýõ" ÿýÿsþuÿÿþ¦ÿþr ÿýÿ1þ3ÿÿþÙÿýÿþÿÿþðÿýÿþÿÿþúÿýÿþÿÿþéÿýÿ1þ3ÿÿþÕÿýÿsþwÿÿþ³ÿüÿÒ ý×ÿÿþoÿÿþc þlÿÿþ)ÿÿý÷= ýFúÿÿþ¶ÿÿüùpüxûÿÿýþ1ÿÿõâ‚C E…æÿÿþxÿÿþ“ÿý_òÿÿýò_ÿ üŠíÿ ÿüíŠÿ ñ Jƒ¹×èøøè×¹ƒJ n2LÍð.e’¶ØêöúëÜÁ[,û$lµóÿ ÿüø¨6 ÿÿüý• ÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿÿüå‡4 ý'Àÿÿþþ)ÿÿüÉZ ý«ÿÿýü!þŠÿÿý ãÿÿþwýçÿÿþtÿÿþÁþLÿÿþøþ,ÿÿþàþ­ÿÿþªþÿÿþøýúÿÿþIþ ÿÿþòþoÿÿýåþ#ÿÿþØþÐÿÿþ‡þeÿÿþ¡þ1ÿÿþ&ýÑÿÿþJþ’ÿÿþÄþ‹ÿÿýÏýìÿÿþcý¢ÿÿýö1þTÿÿýõ ù*Z¢ôÿÿýôIþ¶ÿÿþ¡ ÿýÅ*ýüÿÿþ? ÿý¬EþxÿÿýÝ ÿüö¯>þØÿÿþ} ÿý±þ:ÿÿýýù 4i®ûÿÿýàþ›ÿÿþ»ý¦ÿÿý× ý ñÿÿþYýcþÿÿþþ]ÿÿýïþzÿÿýøþ¾ÿÿþ—ýØÿÿþsý þÿÿþ6þwÿÿþ³þ€ÿÿþÔþ0ÿÿþàýßÿÿþsþÿÿþôþCÿÿýûþÿÿþûþ¤ÿÿþ±þÿÿþîýöÿÿþPþ=ÿÿþÏþfÿÿýéþˆÿÿþŸþÇÿÿþý çÿÿþYþ(ÿÿþ,þ–ÿÿýï þ‰ÿÿþË ý¼5ý†ÿÿþzýæÿÿþj ÿü´U ý5ÅÿÿýÑþKÿÿý÷ ÿòò¯}K($OÒÿÿýåþ¬ÿÿþ§ ÿýÒ!ýùÿÿþF ÿüø}þnÿÿýã û'vÃúÿ ÿüàþÏÿÿþ„ï ?vŸÃáïúøêÛÉj5h2LÍ8õBÄéùùéÿÿ ÿýP×ÿÿ ÿý£ÿÿþë ÿý¾ÿ ÿþ ÿþ§ÿÿ÷Öi& (ÿ/ ÿþ`ÿÿý‡þÎ ÿýêÿÿþþm ÿþ~ÿÿýÂþ ÿýéÿÿþ3ÿþNÿÿþÀÿþ¢ÿÿþbÿþæÿÿýþÿþ$ÿÿþÕÿþVÿÿþ¡ÿþƒÿÿþwÿôn«×òüïÛÇ”Sþ¥ÿÿþTÿüù›#þÃÿÿþ9ÿüü~ þØÿÿþ#ÿý³ þéÿÿþÿóúÁ}P' !IŠàÿÿý´ þõÿÿþ üÍhüfñÿÿþŠ þûÿÿþ%ý'Ûÿÿýý* ÿþ&ý&ïÿÿþª þûÿÿþ'þ`ÿÿýþþõÿÿþ'ýÛÿÿþ_þêÿÿþ(þ…ÿÿþ£þØÿÿþ"(þBÿÿþÍþÃÿÿþ9(þÿÿþáþ¥ÿÿþS(þ ÿÿþõþƒÿÿþw(þ ÿÿþúþWÿÿþ¡(þÿÿþîþ%ÿÿþÕ(þCÿÿþÒ þæÿÿýþ'þ‡ÿÿþª þ£ÿÿþb&ýÝÿÿþo þOÿÿþ¿&þeÿÿþ ýêÿÿþ3ýž ý*ñÿÿþ¶ þ€ÿÿýÂüÿÚB ý+ßÿÿýý6 ýëÿÿþÿýµ>ülôÿÿþ þcÿÿý†ÿôàšV0"NŽæÿÿýºþ«ÿÿùÖh%& ÿý§ ý Áÿÿ ÿýóaý ¦ÿÿ û)zÊýÿ ÿüãyýRØÿÿðI¨ÍæóüñàÏ«r8÷D‘Æêùùê?2LÍûÄBô%n³ÓéûòÝ´v&ÿý×Pý3¼ÿÿüþ·-ÿý¢ü“þÿ ÿýûwÿý½ ý µÿÿþ—ýkØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ýˆÿÿþ_ þtÿÿý¨ý«ÿÿýýBþ„ÿÿýé ýúÿÿýœý ÿÿýØýÄÿÿþ| þÿÿýÑ ýÕÿÿþfþ4ÿÿýèýôÿÿþ> þAÿÿýÚþÀÿÿþLþMÿÿþÓ þÖÿÿþ=þcÿÿþ¡þŒÿÿþ þÿÿþ•þÿÿþåþÃÿÿþI þKÿÿþÜþÖÿÿþ$þÚÿÿþ þ!ÿÿþþ¢ÿÿþUþíÿÿþ þÿÿþO þAþxÿÿþþûÿÿþ þÿÿþ} ý ÞþTÿÿþ£þïÿÿþ þÿÿþŸ ý”ÿþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿ ü?þÿþ#ÿÿþÖþÉÿÿþH þJÿÿþÔ û Üÿÿþÿÿþèþ—ÿÿþ~ þÿÿþç þ‘ÿÿþ ÿÿþôþYÿÿþÑ þÓÿÿþô ý<ýÿÿþÿÿþùýüÿÿþ: þ=ÿÿþùý Úÿÿþèþÿÿþþþ©ÿÿýÎ ýÑÿÿþþþŽÿÿþTþÿÿþúþ5ÿÿþ•ý™ÿÿþøý9ýÿÿþ¯þ ÿÿþôþ›ÿÿý£ý¥ÿÿþðýØÿÿýïþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ‹ÿÿþcþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇý7üÿÿþ½þ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þÖÿÿýõ"þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþÿþrþxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿþ¢ÿÿþUþ»ÿÿþÿþÕÿÿþ$ýñÿÿþÐÿýþÿÿþæþJÿÿþ|ÿþbÿÿþ¢þ®ÿÿýý!þÀÿÿþMý$úÿÿþ°þ4ÿÿýéþ¼ÿÿýþ2ýÃÿÿþ~þpÿÿþ¡þƒÿÿýë ý± þlÿÿýåý‡ÿÿþb ûÿô‡ý¬ÿÿýù>ýj×ÿÿþ© ÿôú°i./d±÷ÿÿýüZÿýÀ ÿýöTÿý¥ÿýÑ-ÿýØRü3˜ðÿ ÿüØeûÆ‘CóB†·ßñüóß¹ƒ:Z2LÍ ð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿüø¨6ýåÿÿ ÿüý•þ ÿÿ ÿýÏþJÿÿ ÿóÞg5 5g·üÿÿýÔ ýäÿÿþ¯ÿÿ ÿüå‡4 ý'Àÿÿþ þÿÿýïÿÿ üÉZ ý«ÿÿýü! þGÿÿýdÿÿý ãÿÿþw ýâÿÿü½ÿÿ þtÿÿþÁ þšÿÿûõ"ÿÿ þ,ÿÿþà þDÿÿþsÿ þÿÿþøý àÿÿýÊÿ þ ÿÿþòþ—ÿÿýú-ÿ þ#ÿÿþØþþÿÿþ‚ÿ þeÿÿþ¡ÿýÕÿýÑÿÿþJÿýý8ÿþ‹ÿÿýÏÿþ‘ÿý¢ÿÿýö1 üÿß ÿù*Z¢ôÿÿýôI ýÿFÿ ÿýÅ* þ ÿ ÿý¬E þÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿ þzÿÿýøÿ ýØÿÿþsÿ!þwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5P2LÍò@v©Óæùóâѧn2.û [ªñÿ ÿüÏd ÿü2—ñÿÿýÒ0 ÿÿýú] ÿüëÿÿõâ“R% 9xÚÿÿýüT ÿüÿÿûþµDüeõÿÿý÷!þ)ÿÿü/ÿÿý¼3 ý0ðÿÿþ±þŠÿÿþÎüÿæVþIÿÿþ*ýçÿÿþmý¨þµÿÿþzþLÿÿýøþXÿÿþ¿þ­ÿÿþªþÿÿþÜýúÿÿþIþÿÿþôþoÿÿýåþ ÿÿþôþÐÿÿþ‡þ4ÿÿþßþ1ÿÿþ&þyÿÿþÅþ’ÿÿþÄýÚÿÿþ‰ýìÿÿþcþ\ÿÿþFþTÿÿýõ ýåÿÿýæþ¶ÿÿþ¡þ¨ÿÿþrýüÿÿþ?þkÿÿýÛþxÿÿýÝýBúÿÿýþ?þØÿÿþ}ý)îÿÿþ†þ:ÿÿýýýâÿÿý¼þ›ÿÿþ»ýÙÿÿýË ý ñÿÿþYýÒÿÿýÓþ]ÿÿýïýËÿÿýÚþ¾ÿÿþ—ý Æÿÿýàý þÿÿþ6ý Áÿÿýä"þ€ÿÿþÔý¼ÿÿýè'ýßÿÿþsý¸ÿÿýì,þCÿÿýûý³ÿÿýï1þ¤ÿÿþ±ý®ÿÿýó8ýöÿÿþPý©ÿÿýõ>þfÿÿýé ý£ÿÿýøEþÇÿÿþ ýÿÿýúMþ(ÿÿþ, þ•ÿÿýüU þ‰ÿÿþË þÿÿýþ^ ýæÿÿþj þ…ÿÿþg!þKÿÿý÷ ÿþ8þ¬ÿÿþ§ ÿþ8 ýùÿÿþF ÿþ8 þnÿÿýã ÿþ8 þÏÿÿþ„2LÍ4óBÄéùùéÄBÿýP×ÿÿþ×ÿý£ÿ ÿ ÿý¾ÿ ÿ ÿþ§ÿÿõÖi& (kØÿÿÿþ`ÿÿý‡üˆÿÿýêÿÿþþ„ÿþ~ÿÿýÂþÿýéÿÿþ3ÿþNÿÿþÀÿþ¢ÿÿþbÿþæÿÿýþÿþ$ÿÿþÕÿþVÿÿþ¡ÿþƒÿÿþwÿôn«×òüïÛÇ”Sþ¥ÿÿþTÿüù›#þÃÿÿþ9ÿüü~ þØÿÿþ#ÿý³ þéÿÿþÿóúÁ}P' !IŠàÿÿý´ þõÿÿþ üÍhüfñÿÿþŠ þûÿÿþ%ý'Ûÿÿýý* ÿþ&ý&ïÿÿþª þûÿÿþ'þ`ÿÿýþþõÿÿþ'ýÛÿÿþ_þêÿÿþ(þ…ÿÿþ£þØÿÿþ"(þBÿÿþÍþÃÿÿþ9(þÿÿþáþ¥ÿÿþS(þ ÿÿþõþƒÿÿþw(þ ÿÿþúþWÿÿþ¡(þÿÿþîþ%ÿÿþÕ(þCÿÿþÒ þæÿÿýþ'þ‡ÿÿþª þ£ÿÿþb&ýÝÿÿþo þOÿÿþ¿&þeÿÿþ ýêÿÿþ3ýž ý*ñÿÿþ¶ þ€ÿÿýÂþüÿÚB ý+ßÿÿýý6 ýëÿÿþþƒÿýµ>ülôÿÿþ þcÿÿý†ü‡ÿÿôàšV0"NŽæÿÿýºþ«ÿÿõÖh%&j×ÿÿÿý§ ý Áÿ ÿÿýóaý ¦ÿ ÿû)zÊýÿ ÿüãyýRØÿÿþØ ðI¨ÍæóüñàÏ«r8óD‘ÆêùùêÆ‘C?2LÍò@v©Óæùóâѧn2þPû [ªñÿ ÿüÏdüÿ¢ ü2—ñÿÿýÒ0ÿý½ ÿýú]ÿþ¦ ÿõâ“R% 9xÚÿÿýüTÿþ_ ÿûþµDüeõÿÿý÷!ÿýéÿý¼3 ý0ðÿÿþ±þÄÿÿþ|üÿæVþIÿÿþ*ýG4ÿÿýèý¨þµÿÿþzûâÀÿÿþLþXÿÿþ¿ûšÿcÿÿþ¡þÿÿþÜúDÿÿÿÿþåþÿÿþôø àÿÿÖÿÿþ$þ ÿÿþôþ—ÿÿþ¢ÿÿþUþ4ÿÿþßýAþÿÿþxÿÿþþyÿÿþÅý ÞÿÿûÕTÿÿþ£ýÚÿÿþ‰þ”ÿÿúý8:ÿÿþÁþ\ÿÿþF ý?þÿÿþ‘þ#ÿÿþÖýåÿÿýæ ý Üÿÿýß þÿÿþèþ¨ÿÿþr þ‘ÿÿþFþ ÿÿþôþkÿÿýÛ ý<ýÿÿþ þÿÿþùýBúÿÿýþ? ý Úÿÿýèþÿÿþþý)îÿÿþ† þŽÿÿþTþÿÿþúýâÿÿý¼ ý9ýÿÿþ¯þ ÿÿþôýÙÿÿýË ýØÿÿýïþÿÿþèýÒÿÿýÓ þ‹ÿÿþcþ#ÿÿþÖýËÿÿýÚ ý7üÿÿþ½þ:ÿÿþÂý ÆÿÿýàþÖÿÿýõ"þTÿÿþ£ý Áÿÿýä"ÿþrþxÿÿþ‚ý¼ÿÿýè' ÿþ¢ÿÿþU ý¸ÿÿýì, ÿþÕÿÿþ$ ý³ÿÿýï1 ÿüþÿÿþæ ý®ÿÿýó8 ÿýbÿÿþ¢ ý©ÿÿýõ>"þÀÿÿþM ý£ÿÿýøE"þ4ÿÿýé ýÿÿýúM#þÃÿÿþ~ þ•ÿÿýüU$ÿýë þÿÿýþ^%ÿþb þ…ÿÿþg&ÿþ© ÿþ8ÿýÀ ÿþ8üÿ¥ ÿþ8þR ÿþ8”€2€L€Í…þLÿÿýåÿÿþ ÿÿýJÿÿýäÿÿþ¯ÿÿþÿÿýïÿÿýdÿÿü½ÿÿûõ"ÿÿþsÿýÊÿýú-ÿþ‚ÿþÿÿÿÿÿÿÿÿÿÿÿÿÿ+ÿÿÿÿÿÿÿÿÿÿÿc2LÍ­ò@v©Óæùóâѧn2ÿ û [ªñÿ ÿüÏdÿ ü2—ñÿÿýÒ0ÿþëÿýú]ÿþÿõâ“R% 9xÚÿÿýüTþ)ÿÿþ/ÿûþµDüeõÿÿþ÷þŠÿÿþÎ ÿý¼3 ý0ðÿÿýçÿÿþm üÿæVþIÿÿþLÿÿýø ý¨þµÿÿþ­ÿÿþªþXÿÿýúÿÿþIþÿÿþoÿÿýåþÿÿþÐÿÿþ‡þ ÿÿþ1ÿÿþ&þ4ÿÿþ’ÿÿþÄ þyÿÿýìÿÿþcýÚÿÿþTÿÿýõ þ\ÿÿþ¶ÿÿþ¡ýåÿÿýüÿÿþ?þ¨ÿÿþxÿÿýÝþkÿÿþÛþØÿÿþ}ýBúÿÿýþ?þ:ÿÿýýý)îÿÿþ†þ›ÿÿþ»ýâÿÿý¼ý ñÿÿþYýÙÿÿýË þ]ÿÿýïýÒÿÿýÓþ¾ÿÿþ—ýËÿÿýÚý þÿÿþ6ý Æÿÿýàþ€ÿÿþÔý Áÿÿýä"ýßÿÿþsý¼ÿÿýè'þCÿÿýûý¸ÿÿýì,þ¤ÿÿþ±ý³ÿÿýï1ýöÿÿþPý®ÿÿýó8þfÿÿýéý©ÿÿýõ>þÇÿÿþý£ÿÿýøEþ(ÿÿþ,ýÿÿýúMþ‰ÿÿþËþ•ÿÿýüUýæÿÿþjþÿÿýþ^þKÿÿý÷þ…ÿÿþgþ¬ÿÿþ§ÿ ýùÿÿþFÿ þnÿÿýãÿ þÏÿÿþ„ÿ2LÍð.e’¶ØêöúëÜÁ[ú7€·Þñ û$lµóÿ ÿüø¨6übÖÿÿ ÿüý•ý)Îÿÿ ÿýÏýPõÿÿ ÿóÞg5 5g·üÿÿýÔ ýVüÿÿùø´g1! ÿüå‡4 ý'Àÿÿþ ý;øÿÿý°!þ± üÉZ ý«ÿÿýü! ýãÿÿþoýÿ*ý ãÿÿþw þžÿÿþrýÿzþtÿÿþÁ ý0ýÿÿþ½ýÿ¿þ,ÿÿþà þ®ÿÿýú%ýÿÜþÿÿþø ý üÿÿþ­ýÿôþ ÿÿþò þ{ÿÿþJýÿôþ#ÿÿþØ þÏÿÿýñýÿßþeÿÿþ¡ýþÿÿþºýÿÅýÑÿÿþJþPÿÿþö \¤Ôòûëÿ‰þ‹ÿÿýÏþ€ÿÿúRzïÿÿþFý¢ÿÿýö1 þ©ÿÿü7"Ðÿÿýæù*Z¢ôÿÿýôI þÈÿÿýBæÿÿþr ÿýÅ* þàÿÿþÝÿÿùÓn(  ÿý¬E þðÿÿý~ ÿüö¯> þùÿÿþuÿý± þþÿÿþºù 4i®ûÿÿýà þûÿÿþ*"ý¦ÿÿý× þõÿÿþÆ%ýcþÿÿþþêÿÿþw&þzÿÿýøþ×ÿÿþD&ýØÿÿþsþÁÿÿþ'þwÿÿþ³þ¢ÿÿþ'þ0ÿÿþàþ€ÿÿþ'þÿÿþôþQÿÿþ'þÿÿþûþÿÿþ'þÿÿþîþÞÿÿþD'þ=ÿÿþÏþ—ÿÿþx'þˆÿÿþŸþ@ÿÿþÇ&ý çÿÿþYýÝÿÿþ+%þ–ÿÿýï þjÿÿþ»ý¼5ý†ÿÿþz ýÛÿÿþuÿü´U ý5ÅÿÿýÑ ýEþÿÿý~ÿþ8ÿòò¯}K($OÒÿÿýå þ„ÿÿ÷Óm( ÿÿ8ÿýÒ!ýšÿ ÿþ8ÿüø}ýyüÿÿþ8û'vÃúÿ ÿüàý.¸ÿÿï ?vŸÃáïúøêÛÉj5ø'xµÞôûê¿2LÍ€øüñß¶†A7ÿüð—2 ÿý3¼ÿÿ ÿü“þÿÿ ÿý µÿÿù.k²úÿÿ ÿý²ÿÿû‰õÿ ÿþtÿÿý± ÿýúÿÿþœÿþÿÿýÑÿýôÿÿþ>ÿþMÿÿþÓÿþŒÿÿþÿþÃÿÿþIÿþÚÿÿþÿþíÿÿ÷Õ¹x1ÿþûÿÿüÿÿýÎHÿôn«×òüïÛÇ”Sþïÿÿüÿÿý° ÿüù›#þÝÿÿüÿÿýÍ ÿüü~ þÉÿÿùH(nÓÿÿýÊ ÿý³ þ—ÿÿþ~ýÿÿþ ÿóúÁ}P' !IŠàÿÿý´ þYÿÿþÑþvÿÿþ. üÍhüfñÿÿþŠ ýüÿÿþ:þ¼ÿÿþ¢ý'Ûÿÿýý* þ©ÿÿýÎþ,ÿÿýúý&ïÿÿþª þ5ÿÿþ•þÇÿÿþUþ`ÿÿýþ þ›ÿÿþxÿÿþ“ýÛÿÿþ_ ý ÒÿÿþFÿÿþÆþ…ÿÿþ£ ýÕÿÿþÿÿþÛþBÿÿþÍ û¸ÿÿþÿÿþíþÿÿþáýNÒþÿÿþûþ ÿÿþõþþÿÿþìþ ÿÿþúþÿÿþÙþÿÿþîþFÿÿþÂþCÿÿþÒþyÿÿþ‹þ‡ÿÿþªþÉÿÿþLýÝÿÿþoþ,ÿÿýôþeÿÿþþ¼ÿÿþýž ý*ñÿÿþ¶þvÿÿýúüÿÚB ý+ßÿÿýý6 ý±ýÿÿþsÿýµ>ülôÿÿþ ÷ÿô‡(mÓÿÿþ± ÿôàšV0"NŽæÿÿýº ÿýú°ÿÿýµ ÿý§  ÿüþ” ÿýóaÿý¼4 û)zÊýÿ ÿüãyö3˜ðÿÿÔ´o&ðI¨ÍæóüñàÏ«r8üB†¿2LÍ€ô%n³ÓéûòÝ´v&3 ÿüþ·- ÿ ÿýûw ÿ ÿþ— ÿþëõÿì‹==Œíÿÿþ€ ÿþý¨ý«ÿÿýýBþ)ÿÿþ/þý ÿÿýØþŠÿÿþÎýÕÿÿþfýçÿÿþmþAÿÿýÚþLÿÿýøþÖÿÿþ=þ­ÿÿþªþÿÿþ•ýúÿÿþIþKÿÿþÜþoÿÿýåþ!ÿÿþþÐÿÿþ‡þÿÿþOþ1ÿÿþ&þÿÿþ}þ’ÿÿþÄþÿÿþŸýìÿÿþcþ ÿÿþ¿þTÿÿýõ þJÿÿþÔþ¶ÿÿþ¡þÿÿþçýüÿÿþ?þÓÿÿþôþxÿÿýÝþ=ÿÿþùþØÿÿþ}ýÑÿÿþþþ:ÿÿýýý™ÿÿþøþ›ÿÿþ»ý£ý¥ÿÿþðý ñÿÿþYõÿëˆ;;‰ëÿÿþÞÿÿþßþ]ÿÿýï ÿýèDÿÿþÇþ¾ÿÿþ— ÿüÓ$8ÿÿþ©ý þÿÿþ6 ÿúð~ Sÿÿþþ€ÿÿþÔô4{»×ìüòÖ¥^ þ‚ÿÿþPýßÿÿþsþ»ÿÿþþCÿÿýûýñÿÿþÐþ¤ÿÿþ±þJÿÿþ|ýöÿÿþPþ®ÿÿýý!þfÿÿýéý$úÿÿþ°þÇÿÿþþ¼ÿÿýþ2þ(ÿÿþ,þpÿÿþ¡þ‰ÿÿþËþlÿÿýåýæÿÿþjý¬ÿÿýù>þKÿÿý÷öi./d±÷ÿÿýüZþ¬ÿÿþ§ ÿýöTýùÿÿþF ÿýÑ-þnÿÿýãÿüØeþÏÿÿþ„ö·ßñüóß¹ƒ:ö2LÍ…ò@v©Óæùóâѧn2ó7€·Þñüñß¶†Aû [ªñÿ ÿüÏdübÖÿ ÿüð—2ü2—ñÿÿýÒ0ý)Îÿÿÿýú]ýPõÿÿÿõâ“R% 9xÚÿÿýüTýVüÿÿôø´g1.k²úÿÿÿûþµDüeõÿÿý÷! ý;øÿÿý°!û‰õÿÿý¼3 ý0ðÿÿþ± ýãÿÿþo ý±üÿæVþIÿÿþ* þžÿÿþrý¨þµÿÿþz ý0ýÿÿþ½&þXÿÿþ¿ þ®ÿÿýú%&þÿÿþÜ ý üÿÿþ­'þÿÿþô þ{ÿÿþJ'þ ÿÿþô þÏÿÿýñ'þ4ÿÿþßýþÿÿþº(þyÿÿþÅþPÿÿþó \¤ÔòûëÕ¹x1ýÚÿÿþ‰þ€ÿÿúRzïÿÿýÎHþ\ÿÿþFþ©ÿÿü7"Ðÿ ÿý° ýåÿÿýæþÈÿÿýBæÿÿýÍþ¨ÿÿþr þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþkÿÿýÛ þðÿÿý~ýÿÿþýBúÿÿýþ? þùÿÿþuþvÿÿþ.ý)îÿÿþ† þþÿÿþº þ¼ÿÿþ¢ ýâÿÿý¼ þûÿÿþ* þ,ÿÿýú ýÙÿÿýË þõÿÿþÆ þÇÿÿþU ýÒÿÿýÓ þêÿÿþw þxÿÿþ“ ýËÿÿýÚþ×ÿÿþD þFÿÿþÆý ÆÿÿýàþÁÿÿþ þÿÿþÛý Áÿÿýä"þ¢ÿÿþ þÿÿþíý¼ÿÿýè'þ€ÿÿþ þÿÿþûý¸ÿÿýì,þQÿÿþ þÿÿþìý³ÿÿýï1þÿÿþ þÿÿþÙý®ÿÿýó8þÞÿÿþD þFÿÿþÂý©ÿÿýõ>þ—ÿÿþx þyÿÿþ‹ý£ÿÿýøEþ@ÿÿþÇ þÉÿÿúLÿÿýúMýÝÿÿþ+ þ,ÿÿúô•ÿÿýüUþjÿÿþ» þ¼ÿÿûÿÿýþ^ýÛÿÿþuþvÿÿûú…ÿÿþgýEþÿÿý~ýÿÿüsÿÿþ8 þ„ÿÿ÷Óm( (mÓÿÿþ±ÿþ8 ýšÿÿýµ ÿþ8 ýyüÿ ÿüþ”ÿþ8ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ç2LͰð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿýø¨ýåÿÿ ÿþ ÿÿ ÿþJÿÿ ÿñÞg5 5g·üÿÿýäÿÿþ¯ÿÿ ÿüå‡4 ü'Àÿþÿÿýïÿÿ üÉZ ý«þGÿÿýdÿÿþ ýâÿÿü½ÿÿ2þšÿÿûõ"ÿÿ1þDÿÿþsÿ0ý àÿÿýÊÿ0þ—ÿÿýú-ÿ/ýAþÿÿþ‚ÿ.ý ÞÿÿýÕÿþ þ”ÿÿýý8ÿþ‹ ý?þÿÿþ‘ÿü¢ÿ ý Üÿÿýß ÿ÷*Z¢ôÿÿ þ‘ÿÿþFÿ ÿ ý<ýÿÿþ ÿ ÿþ¬ý Úÿÿýèÿ ÿþöþŽÿÿþTÿ ÿý9ýÿÿþ¯ ÿ÷ 4i®ûÿÿýØÿÿýï ÿü¦ÿþ‹ÿÿþc ÿþcý7üÿÿþ½ ÿ'þÖÿÿýõ" ÿ'ÿþr ÿ'ÿ!ÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ:ÿ ý¼5ý†ÿ ÿü´U ü5Åÿÿ ÿòò¯}K($OÒÿÿÿ ÿÿ ÿÿ û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5À2L͘ô%n³ÓéûòÝ´v&ú þAÿÿýÚþÌÿÿþfþ,ÿÿþàþMÿÿþÓ þÖÿÿþ=þæÿÿþ$þÿÿþøþŒÿÿþ þÿÿþ•þúÿÿþ þ ÿÿþòþÃÿÿþI þKÿÿþÜþðÿÿþ þ#ÿÿþØþÚÿÿþ þ!ÿÿþþÓÿÿþ$þeÿÿþ¡þíÿÿþ þÿÿþOþšÿÿþeþÑÿÿþJþûÿÿþ þÿÿþ}þAÿÿýÑÿýÏþïÿÿþ þÿÿþŸþÆÿÿþÿýö1 þÝÿÿþ þ ÿÿþ¿ý*óÿÿ÷ÿÿôI þÉÿÿþH þJÿÿþÔ ýBòÿÿùç…CÿÅ* þ—ÿÿþ~ þÿÿþç ý&ÃÿÿþE þYÿÿþÑ þÓÿÿþô üD¦þÿÿý¯> ýüÿÿþ: þ=ÿÿþù ü'›íÿÿý± þ©ÿÿýÎ ýÑÿÿþþ üüÿÿýà þ5ÿÿþ•ý™ÿÿþøý ÆÿÿüãƒDÿÿý× þ›ÿÿý£ý¥ÿÿþðý¼ÿÿùùqþÿÿþ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø=þzÿÿýø ýÕÿÿýèDÿÿþÇý ïÿÿþcýØÿÿþs ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓþwÿÿþ³ ýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþ0ÿÿþàó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þÿÿþôþ»ÿÿþþñÿÿþþÿÿþûýñÿÿþÐþûÿÿþþÿÿþîþJÿÿþ|þêÿÿþþ=ÿÿþÏþ®ÿÿýý!þÖÿÿþ1þˆÿÿþŸý$úÿÿþ°þ³ÿÿþsý çÿÿþYþ¼ÿÿýþ2þpÿÿýÒþ–ÿÿýï þpÿÿþ¡ þ)ÿÿþcÿþz ý± þlÿÿýå þ·ÿÿý÷=ÿýÑ ûÿô‡ý¬ÿÿýù> ý2þÿÿúùpÿÿýå ÿôú°i./d±÷ÿÿýüZ þyÿÿøâ‚CÿÿÒ! ÿýöTþ”ÿÿüø}ÿýÑ-ý_òÿÿþü3˜ðÿ ÿüØeüŠíÿÿóB†·ßñüóß¹ƒ:ú Jƒ¹×¿2LÍ€÷ç÷øè×°z=6ÿüÙo ÿ ÿýÐ/ ÿ ÿýò9 ÿþë ÿø H‹íÿÿýð#ÿþ ÿý šÿÿþµþ)ÿÿþ/ ÿþ‹ÿÿþ8þŠÿÿþÎ ÿýÕÿÿþŠýçÿÿþm ÿþhÿÿþËþLÿÿýø ÿþ&ÿÿþåþ­ÿÿþª ÿþ ÿÿþùýúÿÿþI ÿþ ÿÿþïþoÿÿýå ÿþ%ÿÿþÒþÐÿÿþ‡ ÿþgÿÿþ™þ1ÿÿþ& ÿýÔÿÿþ>þ’ÿÿþÄÿþ‡ÿÿþÃýìÿÿþcÿý •ÿÿýñ'þTÿÿýõ ÿøFŠëÿÿýñ>þ¶ÿÿþ¡ ÿýÂ$ýüÿÿþ?ÿüþ¥CþxÿÿýÝ ÿüí›'þØÿÿþ}ýÍhÿÿüü‘þ:ÿÿýýø E„äÿÿýÆ þ›ÿÿþ»ütúÿÿý¼ý ñÿÿþYý@ùÿÿþoþ]ÿÿýïþfÿÿýî þ¾ÿÿþ—ýÔÿÿþaý þÿÿþ6þuÿÿþ¦þ€ÿÿþÔþ3ÿÿþÙýßÿÿþsþÿÿþðþCÿÿýûþÿÿþúþ¤ÿÿþ± þÿÿþéýöÿÿþP þ3ÿÿþÕþfÿÿýé þwÿÿþ³þÇÿÿþ ý×ÿÿþoþ(ÿÿþ, þlÿÿþ)þ‰ÿÿþËýž ýFúÿÿþ¶ýæÿÿþjüÿÚBüxûÿÿýþ1þKÿÿý÷ÿ÷µ E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF ÿýò_þnÿÿýã ÿüíŠþÏÿÿþ„ò)zÊýèøøè×¹ƒJ 4þ¿2LÍ«ó7€·Þñüñß¶†AÿübÖÿ ÿüð—2ÿý)ÎÿÿÿýPõÿÿÿýVüÿÿôø´g1.k²úÿÿÿ ý;øÿÿý°!û‰õÿÿýãÿÿþo ý±ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1 ÿôn«×òüïÛÇ”Sþ€ÿÿúRzïÿÿýÎH ÿüù›#þ©ÿÿü7"Ðÿ ÿý° ÿüü~ þÈÿÿýBæÿÿýÍÿý³ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊóúÁ}P' !IŠàÿÿý´ þðÿÿý~ýÿÿþþüfñÿÿþŠ þùÿÿþuþvÿÿþ.ý'Ûÿÿýý* þþÿÿþº þ¼ÿÿþ¢ý&ïÿÿþª þûÿÿþ* þ,ÿÿýúþ`ÿÿýþþõÿÿþÆ þÇÿÿþUýÛÿÿþ_þêÿÿþw þxÿÿþ“þ…ÿÿþ£þ×ÿÿþD þFÿÿþÆþBÿÿþÍþÁÿÿþ þÿÿþÛþÿÿþáþ¢ÿÿþ þÿÿþíþ ÿÿþõþ€ÿÿþ þÿÿþûþ ÿÿþúþQÿÿþ þÿÿþìþÿÿþîþÿÿþ þÿÿþÙþCÿÿþÒ þÞÿÿþD þFÿÿþÂþ‡ÿÿþª þ—ÿÿþx þyÿÿþ‹ýÝÿÿþo þ@ÿÿþÇ þÉÿÿþLþeÿÿþ ýÝÿÿþ+ þ,ÿÿýôý*ñÿÿþ¶ þjÿÿþ» þ¼ÿÿþý+ßÿÿýý6 ýÛÿÿþuþvÿÿýúþ>ülôÿÿþ ýEþÿÿý~ýÿÿþsóÿàšV0"NŽæÿÿýºþ„ÿÿ÷Óm( (mÓÿÿþ±ÿý§ ýšÿÿýµ ÿýóaýyüÿ ÿüþ” ÿüãyý.¸ÿ ÿý¼4ñI¨ÍæóüñàÏ«r8ô'xµÞôûêÔ´o&Ë2L͈ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿþ÷üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿý ãÿÿþwüÿæVþIÿÿþtÿÿþÁý¨þµÿÿþ,ÿÿþàþXÿÿþÿÿþøþÿÿþ ÿÿþòþÿÿþ#ÿÿþØþ ÿÿþeÿÿþ¡þ4ÿÿýÑÿÿþJþyÿÿþ‹ÿÿýÏýÚÿÿý¢ÿÿýö1þ\ÿÿù*Z¢ôÿÿýôIýåÿÿ ÿýÅ*þ¨ÿÿ ÿý¬EþkÿÿþÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5è2LÍ»ú7€·ÞñþLÿÿübÖÿÿýåÿÿý)Îÿÿþ ÿÿýPõÿÿþJÿÿýVüÿÿùø´g1!ýäÿÿþ¯ÿÿý;øÿÿý°!þ±þÿÿýïÿÿýãÿÿþoýÿ*þGÿÿýdÿÿþžÿÿþrýÿzýâÿÿü½ÿÿý0ýÿÿþ½ýÿ¿þšÿÿûõ"ÿÿþ®ÿÿýú%ýÿÜþDÿÿþsÿ ý üÿÿþ­ýÿôý àÿÿýÊÿ þ{ÿÿþJýÿôþ—ÿÿýú-ÿ þÏÿÿýñýÿßýAþÿÿþ‚ÿ ýþÿÿþºýÿÅý ÞÿÿýÕÿ þPÿÿþö \¤Ôòûëÿ‰þ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿþF ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿÿýæ ý Üÿÿýß ÿ þÈÿÿýBæÿÿþr þ‘ÿÿþFÿ þàÿÿþÝÿÿùÓn(  ý<ýÿÿþ ÿ þðÿÿý~ý Úÿÿýèÿ þùÿÿþuþŽÿÿþTÿ þþÿÿþºý9ýÿÿþ¯ ÿ þûÿÿþ*ýØÿÿýï ÿ þõÿÿþÆþ‹ÿÿþc ÿ þêÿÿþwý7üÿÿþ½ ÿ þ×ÿÿþDþÖÿÿýõ" ÿ þÁÿÿþÿþr ÿ þ¢ÿÿþÿþ€ÿÿþÿþQÿÿþÿþÿÿþÿþÞÿÿþD$ÿ þ—ÿÿþx$ÿ þ@ÿÿþÇ$ÿ ýÝÿÿþ+#ÿþjÿÿþ»#ÿýÛÿÿþu"ÿýEþÿÿý~ÿþ8ÿþ„ÿÿ÷Óm( ÿÿ8ÿýšÿ ÿþ8ÿýyüÿÿþ8ÿý.¸ÿÿ8ø'xµÞôûê¿2LÍ€øüñß¶†A4ü@vÿÿüð—2 ÿû [ªñÿ ÿ ÿ ü2—ñÿ ÿ ÿ ÿù.k²úÿÿ ÿ ÿþâû‰õÿ ÿÿûþµDý± ÿÿý¼3ÿüÿæVÿý¨ÿ:ÿ:ÿ:ÿ:ÿ$úÕ¹x1ÿ$ÿýÎHÿôn«×òüïÛÇ”Sÿý° ÿüù›#ÿýÍ ÿüü~ü(nÓÿÿýÊ ÿý³ ýÿÿþ ÿóúÁ}P' !IŠàÿÿý´þvÿÿþ. üÍhüfñÿÿþŠþ¼ÿÿþ¢ý'Ûÿÿýý*þ,ÿÿýúý&ïÿÿþªþÇÿÿþUþ`ÿÿýþþxÿÿþ“ýÛÿÿþ_þFÿÿþÆþ…ÿÿþ£þÿÿþÛþBÿÿþÍþÿÿþíþÿÿþáþÿÿþûþ ÿÿþõþÿÿþìþ ÿÿþúþþÿÿþÙþÿÿþîý³þFÿÿþÂþCÿÿþÒ ü®ÿþyÿÿþ‹þ‡ÿÿþª û©ÿÿþÉÿÿþLýÝÿÿþo ý£ÿÿþ,ÿÿýôþeÿÿþ ýÿÿþ¼ÿÿþýž ý*ñÿÿþ¶ þ•ÿÿþvÿÿýúüÿÚB ý+ßÿÿýý6 þÿÿúþÿÿþsÿýµ>ülôÿÿþ þ…ÿÿûg(mÓÿÿþ± ÿôàšV0"NŽæÿÿýº ÿýµ ÿý§ ÿüþ” ÿýóa ÿý¼4 û)zÊýÿ ÿüãyÿûÔ´o&ðI¨ÍæóüñàÏ«r8Ù2LÍ€õ©Óæùóâѧn2ô%n³ÓéûòÝ´v& ÿüÏdý3¼ÿÿüþ·- ÿýÒ0ü“þÿ ÿýûw ÿýú]ý µÿÿþ— ö“R% 9xÚÿÿýüT ý²ÿÿöì‹==Œíÿÿþ€üeõÿÿý÷! þtÿÿý¨ý«ÿÿýýBý0ðÿÿþ± ýúÿÿýœý ÿÿýØþIÿÿþ* þÿÿýÑ ýÕÿÿþfþµÿÿþzýôÿÿþ> þAÿÿýÚþXÿÿþ¿þMÿÿþÓ þÖÿÿþ=þÿÿþÜþŒÿÿþ þÿÿþ•þÿÿþôþÃÿÿþI þKÿÿþÜþ ÿÿþôþÚÿÿþ þ!ÿÿþþ4ÿÿþßþíÿÿþ þÿÿþOþyÿÿþÅþûÿÿþ þÿÿþ}ýÚÿÿþ‰þïÿÿþ þÿÿþŸþ\ÿÿþFþÝÿÿþ þ ÿÿþ¿ýåÿÿýæþÉÿÿþH þJÿÿþÔþ¨ÿÿþr þ—ÿÿþ~ þÿÿþçþkÿÿýÛ þYÿÿþÑ þÓÿÿþôýBúÿÿýþ? ýüÿÿþ: þ=ÿÿþù ý)îÿÿþ† þ©ÿÿýÎ ýÑÿÿþþ ýâÿÿý¼ þ5ÿÿþ•ý™ÿÿþø ýÙÿÿýË þ›ÿÿý£ý¥ÿÿþð ýÒÿÿýÓý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ýËÿÿýÚýÕÿÿýèDÿÿþÇú7 Æÿÿýàý¸ÿ ÿüÓ$8ÿÿþ©ûÖ Áÿÿýä"ýNÒÿÿúð~ Sÿÿþüÿ¼ÿÿýè'ó4{»×ìüòÖ¥^ þ‚ÿÿþPýÿ¸ÿÿýì,(þ»ÿÿþÿýï1(ýñÿÿþÐÿýó8)þJÿÿþ|ÿýõ>*þ®ÿÿýý!ÿýøE*ý$úÿÿþ°üÿúM+þ¼ÿÿýþ2ýüU+þpÿÿþ¡ þ^ý± þlÿÿýå(ûÿô‡ý¬ÿÿýù> ÿþ8 ÿôú°i./d±÷ÿÿýüZ ÿþ8 ÿýöT ÿþ8 ÿýÑ- ÿþ8 ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Ò2Lͨð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿüø¨6ýåÿÿ ÿüý•þ ÿÿ ÿýÏþJÿÿ ÿóÞg5 5g·üÿÿýÔ ýäÿÿþ¯ÿÿ ÿüå‡4 ý'Àÿÿþ þÿÿýïÿÿ üÉZ ý«ÿÿýü! þGÿÿýdÿÿý ãÿÿþw ýâÿÿü½ÿÿ þtÿÿþÁ þšÿÿûõ"ÿÿ þ,ÿÿþà þDÿÿþsÿ þÿÿþøý àÿÿýÊÿ þ ÿÿþòþ—ÿÿýú-ÿ þ#ÿÿþØýAþÿÿþ‚ÿ þeÿÿþ¡ý ÞÿÿýÕÿýÑÿÿþJþ”ÿÿýý8ÿþ‹ÿÿýÏý?þÿÿþ‘ÿý¢ÿÿýö1ý Üÿÿýß ÿù*Z¢ôÿÿýôIþ‘ÿÿþFÿ ÿýÅ*ý<ýÿÿþ ÿ ÿý¬Eý Úÿÿýèÿ ÿüö¯>þŽÿÿþTÿÿý±ý9ýÿÿþ¯ ÿù 4i®ûÿÿýàýØÿÿýï ÿý¦ÿÿú× ‹ÿÿþc ÿýcþÿÿûüÿÿþ½ ÿ þzÿÿüøÿÿýõ" ÿ ýØÿÿýsÿÿþr ÿ!þwÿÿý³ÿÿþ0ÿÿýàÿÿþÿÿýôÿÿþÿÿýûÿÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5È2LÍóþ’ÿÿ þÆÿÿþ þ‡ÿÿþÃýìÿÿ ý*óÿÿýý •ÿÿýñ'þTÿÿ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿ ý&ÃÿÿýÂ$ýüÿÿ üD¦þÿÿüþ¥CþxÿÿþÝ ü'›íÿ ÿüí›'þØÿÿþ} üüÿÿüü‘þ:ÿÿýýý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþ»ý¼ÿÿüùqütúÿÿý¼ý ñÿÿþYþpÿÿýø= ý@ùÿÿþoþ]ÿÿýïý ïÿÿþc þfÿÿýî þ¾ÿÿþ—þaÿÿýÓ ýÔÿÿþaý þÿÿþ6þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÔ þÚÿÿþ1þ3ÿÿþÙýßÿÿþs þñÿÿþþÿÿþðþCÿÿýû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP þÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ â2LÍ›ó7€·Þñüñß¶†AÿübÖÿ ÿüð—2 ÿý)Îÿÿ ÿþëýPõÿÿ ÿþ ýVüÿÿôø´g1.k²úÿÿ ÿþ/ ý;øÿÿý°!û‰õÿ ÿÿþÎ ýãÿÿþo ý± ÿÿþm þžÿÿþrÿÿýø ý0ýÿÿþ½ÿÿþª þ®ÿÿýú%ÿÿþI ý üÿÿþ­ÿÿýå þ{ÿÿþJÿÿþ‡ þÏÿÿýñÿÿþ& ýþÿÿþºÿýÿÄ þPÿÿþó \¤ÔòûëÕ¹x1ÿýÿc þ€ÿÿúRzïÿÿýÎHÿøn«×òüõ þ©ÿÿü7"Ðÿ ÿý° ÿþ¡ þÈÿÿýBæÿÿýÍ ÿþ? þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿþ þðÿÿý~ýÿÿþ ÿ÷úÁ}P' þùÿÿþuþvÿÿþ. üÍhþþÿÿþº þ¼ÿÿþ¢#þûÿÿþ* þ,ÿÿýú"þõÿÿþÆ þÇÿÿþU"þêÿÿþw þxÿÿþ“"þ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþýž ýÛÿÿþuþvÿÿýúüÿÚBýEþÿÿý~ýÿÿþsÿýµ>þ„ÿÿ÷Óm( (mÓÿÿþ± ÿøàšV0ýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 û)zÊýÿÿô'xµÞôûêÔ´o&öI¨Íæóüñ¿2LÍ ô%n³ÓéûòÝ´v& ÿý3¼ÿÿüþ·-ý [ÿ ÿü“þÿ ÿýûw ü2—ñÿ ÿý µÿÿþ— ÿý²ÿÿöì‹==Œíÿÿþ€ ÿþtÿÿý¨ý«ÿÿýýB ÿýúÿÿýœý ÿÿýØÿþ¼þÿÿýÑ ýÕÿÿþfüÿæVýôÿÿþ> þAÿÿýÚý¨þMÿÿþÓ þÖÿÿþ=#þŒÿÿþ þÿÿþ•#þÃÿÿþI þKÿÿþÜ#þÚÿÿþ þ!ÿÿþ"þíÿÿþ þÿÿþO"þûÿÿþ þÿÿþ} ùïÛÇ”Sþïÿÿþ þÿÿþŸ ÿüù›#þÝÿÿþ þ ÿÿþ¿ ÿüü~ þÉÿÿþH þJÿÿþÔ ÿý³ þ—ÿÿþ~ þÿÿþç û!IŠàÿÿý´ þYÿÿþÑ þÓÿÿþô üfñÿÿþŠ ýüÿÿþ: þ=ÿÿþùý'Ûÿÿýý* þ©ÿÿýÎ ýÑÿÿþþý&ïÿÿþª þ5ÿÿþ•ý™ÿÿþøþ`ÿÿýþ þ›ÿÿý£ý¥ÿÿþðýÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ…ÿÿþ£ ýÕÿÿýèDÿÿþÇþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þÿÿþáýNÒÿÿúð~ Sÿÿþþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþ ÿÿþúþ»ÿÿþþÿÿþîýñÿÿþÐþCÿÿþÒþJÿÿþ|þ‡ÿÿþªþ®ÿÿýý!ýÝÿÿþoý$úÿÿþ° þþeÿÿþþ¼ÿÿýþ2 ýý*ñÿÿþ¶þpÿÿþ¡ ý•ÿý+ßÿÿýý6 ý± þlÿÿýå üÿÿülôÿÿþ ûÿô‡ý¬ÿÿýù> þ…ÿÿû"NŽæÿÿýº ÿôú°i./d±÷ÿÿýüZ ÿý§ ÿýöT ÿýóaÿýÑ- ÿüãyü3˜ðÿ ÿüØeÿùàÏ«r8óB†·ßñüóß¹ƒ:Ö2LÍò@v©Óæùóâѧn2óýÚÿÿþ‰ þÆÿÿþ þ‡ÿÿþÃþ\ÿÿþF ý*óÿÿýý •ÿÿýñ'ýåÿÿýæ ýBòÿÿõç…CFŠëÿÿýñ>þ¨ÿÿþr ý&ÃÿÿýÂ$þkÿÿýÛüD¦þÿÿüþ¥CýBúÿÿýþ?ü'›íÿ ÿüí›'ý)îÿÿþ†üüÿÿüü‘ýâÿÿý¼ ý ÆÿÿõãƒD E„äÿÿýÆ ýÙÿÿýË ý¼ÿÿüùqütúÿÿý¼ ýÒÿÿýÓþpÿÿýø= ý@ùÿÿþo ýËÿÿýÚý ïÿÿþc þfÿÿýî ý ÆÿÿýàþaÿÿýÓ ýÔÿÿþaý Áÿÿýä"þ§ÿÿþsþuÿÿþ¦ý¼ÿÿýè'þÚÿÿþ1þ3ÿÿþÙý¸ÿÿýì,þñÿÿþþÿÿþðý³ÿÿýï1þûÿÿþþÿÿþúý®ÿÿýó8þêÿÿþþÿÿþéý©ÿÿýõ>þÖÿÿþ1þ3ÿÿþÕþ£ÿÿýøEþ³ÿÿþsþwÿÿþ³ÿýúMþpÿÿýÒ ý×ÿÿþoÿýüUþ)ÿÿþc þlÿÿþ)ÿýþ^þ·ÿÿý÷= ýFúÿÿþ¶ÿþgý2þÿÿüùpüxûÿÿýþ1ÿþ8 þyÿÿõâ‚C E…æÿÿþxÿþ8 þ”ÿÿþ“ÿþ8 ý_òÿÿýò_ÿþ8 üŠíÿ ÿüíŠ.ñ Jƒ¹×èøøè×¹ƒJ Ê2LÍÄÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿ þCÿÿýûÿ þ¤ÿÿþ±ÿ ýöÿÿþPÿ þfÿÿýé$ÿ þÇÿÿþ%ÿ þ(ÿÿþ,%ÿ þ‰ÿÿþË&ÿ ýæÿÿþj&ÿ þKÿÿý÷&ÿ þ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ þnÿÿýã'ÿ þÏÿÿþ„(ÿ2LÍð.e’¶ØêöúëÜÁ[ú7€·Þñ û$lµóÿ ÿüø¨6übÖÿÿ ÿüý•ý)Îÿÿ ÿýÏýPõÿÿ ÿóÞg5 5g·üÿÿýÔ ýVüÿÿúø´g1 ÿüå‡4 ý'Àÿÿþ ý;øÿÿý°!üÉZ ý«ÿÿýü! ýãÿÿþo#ý ãÿÿþw þžÿÿþr%þtÿÿþÁ ý0ýÿÿþ½&þ,ÿÿþà þ®ÿÿýú%&þÿÿþø ý üÿÿþ­'þ ÿÿþò þ{ÿÿþJ'þ#ÿÿþØ þÏÿÿýñ'þeÿÿþ¡ýþÿÿþº'ýÑÿÿþJþPÿÿþø \¤Ôòûëþ‹ÿÿýÏþ€ÿÿúRzïÿÿý¢ÿÿýö1 þ©ÿÿü7"Ðÿÿù*Z¢ôÿÿýôI þÈÿÿýBæÿÿ ÿýÅ* þàÿÿþÝÿÿúÓn(  ÿý¬E þðÿÿý~ ÿüö¯> þùÿÿþuÿý± þþÿÿþºù 4i®ûÿÿýà þûÿÿþ*"ý¦ÿÿý× þõÿÿþÆ%ýcþÿÿþþêÿÿþw&þzÿÿýøþ×ÿÿþD&ýØÿÿþsþÁÿÿþ'þwÿÿþ³þ¢ÿÿþÿþ0ÿÿþàþ€ÿÿþÿþÿÿþôþQÿÿþÿþÿÿþûþÿÿþÿþÿÿþîþÞÿÿþD'þ=ÿÿþÏþ—ÿÿþx'þˆÿÿþŸþ@ÿÿþÇ&ý çÿÿþYýÝÿÿþ+%þ–ÿÿýï þjÿÿþ»ý¼5ý†ÿÿþz ýÛÿÿþuÿü´U ý5ÅÿÿýÑ ýEþÿÿý~ÿòò¯}K($OÒÿÿýå þ„ÿÿúÓm( ÿýÒ!ýšÿÿ ÿüø}ýyüÿÿ û'vÃúÿ ÿüàý.¸ÿÿï ?vŸÃáïúøêÛÉj5ø'xµÞôûê¿2LÍ€øüñß¶†A7ÿüð—2 ÿý3¼ÿÿ ÿü“þÿÿ ÿý µÿÿù.k²úÿÿ ÿý²ÿÿû‰õÿ ÿþtÿÿý± ÿýúÿÿþœÿþÿÿýÑÿýôÿÿþ>ÿþMÿÿþÓÿþŒÿÿþÿþÃÿÿþIÿþÚÿÿþÿþíÿÿ÷Õ¹x1ÿþûÿÿüÿÿýÎHÿôn«×òüïÛÇ”Sþïÿÿüÿÿý° ÿüù›#þÝÿÿüÿÿýÍ ÿüü~ þÉÿÿùH(nÓÿÿýÊ ÿý³ þ—ÿÿþ~ýÿÿþ ÿóúÁ}P' !IŠàÿÿý´ þYÿÿþÑþvÿÿþ. üÍhüfñÿÿþŠ ýüÿÿþ:þ¼ÿÿþ¢ý'Ûÿÿýý* þ©ÿÿýÎþ,ÿÿýúý&ïÿÿþª þ5ÿÿþ•þÇÿÿþUþ`ÿÿýþ þ›ÿÿþxÿÿþ“ýÛÿÿþ_ ý ÒÿÿþFÿÿþÆþ…ÿÿþ£ ýÕÿÿþÿÿþÛþBÿÿþÍ û¸ÿÿþÿÿþíþÿÿþáýNÒþÿÿþûþ ÿÿþõþþÿÿþìþ ÿÿþúþÿÿþÙþÿÿþîþFÿÿþÂþCÿÿþÒþyÿÿþ‹þ‡ÿÿþªþÉÿÿþLýÝÿÿþoþ,ÿÿýôþeÿÿþþ¼ÿÿþýž ý*ñÿÿþ¶þvÿÿýúüÿÚB ý+ßÿÿýý6 ý±ýÿÿþsÿýµ>ülôÿÿþ ÷ÿô‡(mÓÿÿþ± ÿôàšV0"NŽæÿÿýº ÿýú°ÿÿýµ ÿý§  ÿüþ” ÿýóaÿý¼4 û)zÊýÿ ÿüãyö3˜ðÿÿÔ´o&ðI¨ÍæóüñàÏ«r8üB†¿2LÍ€ô%n³ÓéûòÝ´v&óþÿÿþŸþÆÿÿþ þ‡ÿÿþÃþ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþç ý&ÃÿÿýÂ$þÓÿÿþô üD¦þÿÿüþ¥Cþ=ÿÿþù ü'›íÿ ÿüí›'ýÑÿÿþþ üüÿÿüü‘ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼õÿëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþo ÿýèDÿÿþÇý ïÿÿþc þfÿÿýî  ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþa ÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ô4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1öi./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþx ÿýöTþ”ÿÿþ“ ÿýÑ-ý_òÿÿýò_ ÿüØeüŠíÿ ÿüíŠ ö·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ Î2LÍ©ò@v©Óæùóâѧn2ÿ û [ªñÿ ÿüÏdÿ ü2—ñÿÿýÒ0ÿþëÿýú]ÿþÿõâ“R% 9xÚÿÿýüTþ)ÿÿþ/ÿûþµDüeõÿÿý÷!þŠÿÿþÎ ÿý¼3 ý0ðÿÿþ±ýçÿÿþm üÿæVþIÿÿþ*þLÿÿýø ý¨þµÿÿþzþ­ÿÿþªþXÿÿþ¿ýúÿÿþIþÿÿþÜþoÿÿýåþÿÿþôþÐÿÿþ‡þ ÿÿþôþ1ÿÿþ&þ4ÿÿþßþ’ÿÿþÄ þyÿÿþÅýìÿÿþcýÚÿÿþ‰þTÿÿýõ þ\ÿÿþFþ¶ÿÿþ¡ýåÿÿýæýüÿÿþ?þ¨ÿÿþrþxÿÿýÝþkÿÿýÛþØÿÿþ}ýBúÿÿýþ?þ:ÿÿýýý)îÿÿþ†þ›ÿÿþ»ýâÿÿý¼ý ñÿÿþYýÙÿÿýË þ]ÿÿýïýÒÿÿýÓþ¾ÿÿþ—ýËÿÿýÚý þÿÿþ6ý Æÿÿýàþ€ÿÿþÔý Áÿÿýä"ýßÿÿþsý¼ÿÿýè'þCÿÿýûý¸ÿÿýì,þ¤ÿÿþ±ý³ÿÿýï1ýöÿÿþPý®ÿÿýó8þfÿÿýéý©ÿÿýõ>þÇÿÿþý£ÿÿýøEþ(ÿÿþ,ýÿÿýúMþ‰ÿÿþËþ•ÿÿýüUýæÿÿþjþÿÿýþ^þKÿÿý÷þ…ÿÿþgþ¬ÿÿþ§ÿþ8ýùÿÿþFÿþ8þnÿÿýãÿþ8þÏÿÿþ„ÿþ82LÍ“ó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿ ý;øÿÿý°!û‰õÿýäÿÿü¯ÿÿ ýãÿÿþo ý±þÿÿûïÿÿ þžÿÿþr$þGÿÿûdÿÿý0ýÿÿþ½$ýâÿÿú½ÿÿþ®ÿÿýú%$þšÿÿùõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿþ—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿ þjÿÿþ» þ¼ÿÿþÿ ýÛÿÿþuþvÿÿýúÿ ýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼4ÿô'xµÞôûêÔ´o&ã2LÍ”ð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý• ÿ ÿýÏ ÿ ÿóÞg5 5g·üÿÿýÔ ÿ ÿüå‡4 ý'Àÿÿþ ÿÿ üÉZ ý«ÿÿýü! ÿÿý ãÿÿþw ÿÿ þtÿÿþÁ ÿÿ þ,ÿÿþà ÿÿ þÿÿþø ÿÿ þ ÿÿþò ÿÿ þ#ÿÿþØ ÿÿ þeÿÿþ¡ ÿÿýÑÿÿþJ ÿÿþ‹ÿÿýÏ ÿún«×òüÿÿý¢ÿÿýö1 ÿù*Z¢ôÿÿýôI ÿ ÿýÅ* ÿ ÿý¬Eÿ÷úÁ}P' ÿÿ ÿüö¯>üÍhÿÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿ þzÿÿýøÿ ýØÿÿþsÿ!þwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ýž ÿ ý¼5ý†ÿÿþzüÿÚBÿ ÿü´U ý5ÅÿÿýÑÿýµ>ÿ ÿòò¯}K($OÒÿÿýå ÿøàšV0ÿÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà û)zÊýÿÿï ?vŸÃáïúøêÛÉj5öI¨Íæóüñ¿2LÍÀ ÿù%[Æ÷ÿÿ ÿúO…ºïÿÿ ÿÿ ÿÿ0ÿúæ³€Mÿÿþ`úæ³€Mÿýê"ÿý~ÿ"ÿüéÿ"ÿüNÿÿ"ÿü¢ÿÿ"ÿüæÿÿ"ÿþ$ÿÿ#ÿþVÿÿ#ÿþƒÿÿùïÛÇ”Sÿþ¥ÿÿüù›#ÿþÃÿÿüü~ÿþØÿ ÿý³ ÿþéÿÿû!IŠàÿÿý´ÿþõÿÿüfñÿÿþŠÿþûÿÿý'Ûÿÿýý*ÿÿý&ïÿÿþªÿþûÿÿþ`ÿÿýþÿþõÿÿýÛÿÿþ_ÿþêÿÿþ…ÿÿþ£ÿþØÿÿþBÿÿþÍÿþÃÿÿþÿÿþáÿþ¥ÿÿþ ÿÿþõÿþƒÿÿþ ÿÿþúÿþWÿÿþÿÿþîÿþ%ÿÿþCÿÿþÒÿüæÿÿþ‡ÿÿþªÿü£ÿÿýÝÿÿþoÿüOÿÿþeÿÿþÿüêÿý*ñÿÿþ¶ÿý€ÿý+ßÿÿýý6ÿýëülôÿÿþÿúc"NŽæÿÿýº ÿ ÿý§ ÿ ÿýóaÿ ÿüãyÿ ùàÏ«r8ù2LÍ„óBÄéùùéÄB1ýP×ÿÿý×Pù%[Æ÷ÿÿý£ÿ ÿý¢ úO…ºïÿÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿÿý‡ýˆÿÿþ_ ÿúæ³€Mÿÿÿþþ„ÿÿýé úæ³€MÿÿýÂýÄÿÿþ|ÿÿþ3 þ4ÿÿýèÿÿþÀ þÀÿÿþLÿÿþb þcÿÿþ¡ÿüÿþ þÿÿþåÿýÿÕþÖÿÿþ$ÿýÿ¡þ¢ÿÿþUÿýÿwþxÿÿþÿýÿTþTÿÿþ£ÿýÿ9þ:ÿÿþÁÿýÿ#þ#ÿÿþÖÿýÿþÿÿþèÿýÿ þ ÿÿþôÿýÿþÿÿþùÿýÿþÿÿþþÿýÿþÿÿþúÿýÿþ ÿÿþôÿýÿþÿÿþèÿýÿ"þ#ÿÿþÖÿýÿ9þ:ÿÿþÂÿýÿSþTÿÿþ£ÿýÿwþxÿÿþ‚ÿýÿ¡þ¢ÿÿþUÿýÿÕþÕÿÿþ$ÿüÿþ ýþÿÿþæÿÿþb þbÿÿþ¢ÿÿþ¿ þÀÿÿþMÿÿþ3 þ4ÿÿýéÿÿýÂýÃÿÿþ~ÿÿþþƒÿÿýëÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØRÿ óD‘ÆêùùêÆ‘Cï2Lͳó7€·Þñüñß¶†AÿübÖÿ ÿýð—ÿý)Îÿ ÿÿýPõÿÿÿýVüÿÿòø´g1.k²úÿÿÿ ý;øÿÿý°!ü‰õÿýãÿÿþo þÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿôn«×òüïÛÇ”Sþ€ÿÿúRzïÿÿýÎHÿüù›#þ©ÿÿü7"Ðÿ ÿý° ÿüü~ þÈÿÿýBæÿÿþÍÿý³ þàÿÿþÝÿÿ÷Ón( (nÓÿÿÿóúÁ}P' !IŠàÿÿý´ þðÿÿý~ýÿÿüÍhüfñÿÿþŠ þùÿÿþuþvÿÿý'Ûÿÿýý* þþÿÿþº ü¼ÿÿý&ïÿÿþª þûÿÿþ* ü,ÿÿþ`ÿÿýþþõÿÿþÆ ýÇÿýÛÿÿþ_þêÿÿþw ýxÿþ…ÿÿþ£þ×ÿÿþD ýFÿþBÿÿþÍþÁÿÿþ ýÿþÿÿþáþ¢ÿÿþ ýÿþ ÿÿþõþ€ÿÿþ ýÿþ ÿÿþúþQÿÿþ ýÿþÿÿþîþÿÿþ ýÿþCÿÿþÒ þÞÿÿþD ýFÿþ‡ÿÿþª þ—ÿÿþx ýyÿýÝÿÿþo þ@ÿÿþÇ ýÉÿþeÿÿþ ýÝÿÿþ+ ü,ÿÿýž ý*ñÿÿþ¶ þjÿÿþ» ü¼ÿÿüÿÚB ý+ßÿÿýý6 ýÛÿÿþuþvÿÿÿýµ>ülôÿÿþ ýEþÿÿý~ýÿÿÿôàšV0"NŽæÿÿýºþ„ÿÿ÷Óm( (mÓÿÿÿý§ ýšÿÿþµÿýóaýyüÿ ÿüþ”û)zÊýÿ ÿüãyý.¸ÿ ÿý¼4ðI¨ÍæóüñàÏ«r8ô'xµÞôûêÔ´o&Ã2LÍ‘ò@v©Óæùóâѧn2ò.e’¶ØêöúëÜÁ2 û [ªñÿ ÿüÏdû$lµóÿ ÿ ü2—ñÿÿýÒ0 ÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿôÞg5 5gÿ ÿûþµDüeõÿÿý÷! ÿüå‡4þ± ÿý¼3 ý0ðÿÿþ± üÉZüÿæVþIÿÿþ*$ý¨þµÿÿþz8þXÿÿþ¿8þÿÿþÜ8þÿÿþô8þ ÿÿþô8þ4ÿÿþß8þyÿÿþÅ7ýÚÿÿþ‰7þ\ÿÿþFþýåÿÿýæù*ZÊþ¨ÿÿþr ÿþþkÿÿýÛ ÿþ.ýBúÿÿýþ? ÿþ¢ý)îÿÿþ† ÿýúýâÿÿý¼û 4iÿÿþUýÙÿÿýË ÿþ“ýÒÿÿýÓÿþÆýËÿÿýÚÿþÛý Æÿÿýàÿþíý Áÿÿýä" ÿþûý¼ÿÿýè'!ÿþì ý¸ÿÿýì,"ÿþÙ ý³ÿÿýï1#ÿþ ý®ÿÿýó8$ÿþ‹ ý©ÿÿýõ>%ÿþL ý£ÿÿýøE&ÿýôýÿÿýúM'ÿþ þ•ÿÿýüU(üÿúþÿÿýþ^ý¼5 ýÿsþ…ÿÿþgÿü´U þ± ÿþ8ÿòò¯}K($O ÿþ8ÿ ÿþ8ÿ ÿþ8û'vÃúÿ ÿ2ò ?vŸÃáïúøêÛÉ¿2LÍ€ü[ó7€·Þñüñß¶†Aÿüø¨6übÖÿ ÿüð—2 ÿüý•ý)Îÿÿ ÿýÏýPõÿÿ ÿý·üÿÿýÔ ýVüÿÿôø´g1.k²úÿÿ ÿü'Àÿÿþ ý;øÿÿý°!û‰õÿ ÿý«ÿÿýü! ýãÿÿþo ý± ÿý ãÿÿþw þžÿÿþrÿþtÿÿþÁ ý0ýÿÿþ½ÿþ,ÿÿþà þ®ÿÿýú%ÿþÿÿþø ý üÿÿþ­ÿþ ÿÿþò þ{ÿÿþJÿþ#ÿÿþØ þÏÿÿýñÿþeÿÿþ¡ýþÿÿþºÿýÑÿÿþJþPÿÿþó \¤ÔòûëÕ¹x1ÿþ‹ÿÿýÏþ€ÿÿúRzïÿÿýÎHÿûn¢ÿÿýö1 þ©ÿÿü7"Ðÿ ÿý° ÿý¢ôÿÿýôI þÈÿÿýBæÿÿýÍ ÿýÅ* þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿý¬E þðÿÿý~ýÿÿþ ÿûúÁ}Pÿÿüö¯> þùÿÿþuþvÿÿþ. üÍhÿý± þþÿÿþº þ¼ÿÿþ¢ý®ûÿÿýà þûÿÿþ* þ,ÿÿýúý¦ÿÿý× þõÿÿþÆ þÇÿÿþUýcþÿÿþþêÿÿþw þxÿÿþ“þzÿÿýøþ×ÿÿþD þFÿÿþÆýØÿÿþsþÁÿÿþ þÿÿþÛþwÿÿþ³þ¢ÿÿþ þÿÿþíþ0ÿÿþàþ€ÿÿþ þÿÿþûþÿÿþôþQÿÿþ þÿÿþìþÿÿþûþÿÿþ þÿÿþÙþÿÿþîþÞÿÿþD þFÿÿþÂþ=ÿÿþÏþ—ÿÿþx þyÿÿþ‹þˆÿÿþŸþ@ÿÿþÇ þÉÿÿþLý çÿÿþYýÝÿÿþ+ þ,ÿÿýôþ–ÿÿýï þjÿÿþ» þ¼ÿÿþýž ý†ÿÿþz ýÛÿÿþuþvÿÿýúüÿÚBý5ÅÿÿýÑ ýEþÿÿý~ýÿÿþsÿýµ>þÒÿÿýå þ„ÿÿ÷Óm( (mÓÿÿþ± ÿüàšVÿÿýÒ!ýšÿÿýµ ÿüø}ýyüÿ ÿüþ” ÿüàý.¸ÿ ÿý¼4 û)zÊýÿÿüj5ô'xµÞôûêÔ´o&úI¨Í¿2LÍÀÿù%[Æ÷ÿÿÿúO…ºïÿÿÿÿÿÿ0ÿúæ³€Mÿÿ0úæ³€Mÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿõ«×òüïÛÇ”Sÿÿüù›#ÿ ÿüü~ÿ ÿý³ ÿ÷' !IŠàÿÿý´ÿüfñÿÿþŠÿý'Ûÿÿýý*ÿý&ïÿÿþªÿþ`ÿÿýþÿýÛÿÿþ_ÿþ…ÿÿþ£ÿþBÿÿþÍÿþÿÿþáÿþ ÿÿþõÿþ ÿÿþúÿþÿÿþîÿþCÿÿþÒÿþ‡ÿÿþªÿýÝÿÿþoÿþeÿÿþÿý*ñÿÿþ¶ÿý+ßÿÿýý6ÿülôÿÿþÿ÷0"NŽæÿÿýº ÿ ÿý§ ÿ ÿýóaÿ ÿüãyÿ õæóüñàÏ«r8õ2LÍ…ò@v©Óæùóâѧn2óBÄéùùéÄBû [ªñÿ ÿüÏdýP×ÿÿý×Pü2—ñÿÿýÒ0ý£ÿ ÿý¢ÿýú]ý¾ÿÿý½ÿõâ“R% 9xÚÿÿýüTþ§ÿÿ÷Öi& (kØÿÿþ¦ÿûþµDüeõÿÿý÷! þ`ÿÿý‡ýˆÿÿþ_ÿý¼3 ý0ðÿÿþ± ýêÿÿþþ„ÿÿøéÿæVþIÿÿþ* þ~ÿÿýÂýÄÿÿú|¨þµÿÿþz ýéÿÿþ3 þ4ÿÿýèþXÿÿþ¿ þNÿÿþÀ þÀÿÿþLþÿÿþÜ þ¢ÿÿþb þcÿÿþ¡þÿÿþô þæÿÿýþ þÿÿþåþ ÿÿþôþ$ÿÿþÕþÖÿÿþ$þ4ÿÿþßþVÿÿþ¡þ¢ÿÿþUþyÿÿþÅþƒÿÿþwþxÿÿþýÚÿÿþ‰þ¥ÿÿþTþTÿÿþ£þ\ÿÿþFþÃÿÿþ9þ:ÿÿþÁýåÿÿýæþØÿÿþ#þ#ÿÿþÖþ¨ÿÿþr þéÿÿþþÿÿþèþkÿÿýÛ þõÿÿþ þ ÿÿþôýBúÿÿýþ? þûÿÿþþÿÿþù ý)îÿÿþ† ÿþþÿÿþþ ýâÿÿý¼ þûÿÿþþÿÿþú ýÙÿÿýË þõÿÿþþ ÿÿþô ýÒÿÿýÓ þêÿÿþþÿÿþè ýËÿÿýÚþØÿÿþ"þ#ÿÿþÖý ÆÿÿýàþÃÿÿþ9þ:ÿÿþÂý Áÿÿýä"þ¥ÿÿþSþTÿÿþ£ý¼ÿÿýè'þƒÿÿþwþxÿÿþ‚ý¸ÿÿýì,þWÿÿþ¡þ¢ÿÿþUý³ÿÿýï1þ%ÿÿþÕþÕÿÿþ$ý®ÿÿýó8þæÿÿýþ ýþÿÿþæý©ÿÿýõ>þ£ÿÿþb þbÿÿþ¢ý£ÿÿýøEþOÿÿþ¿ þÀÿÿþMýÿÿýúMýêÿÿþ3 þ4ÿÿýéþ•ÿÿýüUþ€ÿÿýÂýÃÿÿþ~þÿÿýþ^ýëÿÿþþƒÿÿúë…ÿÿþgþcÿÿý†ý‡ÿÿþbÿþ8 þ«ÿÿ÷Öh%&j×ÿÿþ©ÿþ8 ý ÁÿÿýÀ ÿþ8 ý ¦ÿ ÿý¥ÿþ8ýRØÿÿýØR1óD‘ÆêùùêÆ‘CÇ2LÍŒð.e’¶ØêöúëÜÁ[,û$lµóÿ ÿüø¨6þLÿÿÿüý•ýåÿÿÿýÏþ ÿÿÿóÞg5 5g·üÿÿýÔ þJÿÿÿüå‡4 ý'Àÿÿþýäÿÿü¯ÿÿüÉZ ý«ÿÿýü!þÿÿûïÿÿý ãÿÿþwþGÿÿûdÿÿþtÿÿþÁýâÿÿú½ÿÿþ,ÿÿþàþšÿÿùõ"ÿÿþÿÿþøþDÿÿþsÿþ ÿÿþòý àÿÿýÊÿþ#ÿÿþØþ—ÿÿýú-ÿþeÿÿþ¡ýAþÿÿþ‚ÿýÑÿÿþJý ÞÿÿýÕÿþ‹ÿÿýÏþ”ÿÿýý8ÿý¢ÿÿýö1ý?þÿÿþ‘ÿù*Z¢ôÿÿýôIý Üÿÿýß ÿ ÿýÅ*þ‘ÿÿþFÿ ÿý¬Eý<ýÿÿþ ÿ ÿüö¯>ý Úÿÿýèÿÿý± þŽÿÿþTÿù 4i®ûÿÿýà ý9ýÿÿþ¯ ÿý¦ÿÿý× ýØÿÿýï ÿýcþÿÿþþ‹ÿÿþc ÿþzÿÿýøý7üÿÿþ½ ÿýØÿÿþsþÖÿÿýõ" ÿþwÿÿþ³ÿþr ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿý¼5ý†ÿÿþzÿÿü´U ý5ÅÿÿýÑÿÿòò¯}K($OÒÿÿýåÿÿýÒ!ÿÿüø}ÿû'vÃúÿ ÿüàÿ ï ?vŸÃáïúøêÛÉj5ä2L͘óBÄéùùéÄBÿýP×ÿÿý×Pÿý£ÿ ÿý¢ÿý¾ÿÿý½ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ÿþ`ÿÿý‡ýˆÿÿþ_ÿýêÿÿþþ„ÿÿýéÿþ~ÿÿýÂýÄÿÿþ|ÿ ýéÿÿþ3 þ4ÿÿýèÿ þNÿÿþÀ þÀÿÿþLÿ þ¢ÿÿþb þcÿÿþ¡ÿ þæÿÿýþ þÿÿþåÿ þ$ÿÿþÕþÖÿÿþ$ÿ þVÿÿþ¡þ¢ÿÿþUÿ þƒÿÿþwþxÿÿþÿ þ¥ÿÿþTþTÿÿþ£ÿ þÃÿÿþ9þ:ÿÿþÁÿ þØÿÿþ#þ#ÿÿþÖÿ þéÿÿþþÿÿþèÿ þõÿÿþ þ ÿÿþôÿ þûÿÿþþÿÿþùÿ ÿþþÿÿþþÿ þûÿÿþþÿÿþúÿ þõÿÿþþ ÿÿþôÿ þêÿÿþþÿÿþèÿ þØÿÿþ"þ#ÿÿþÖÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ÿþƒÿÿþwþxÿÿþ‚ÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~ÿýëÿÿþþƒÿÿýëÿþcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘CÛ€2€L€Í€2LÍ óBÄéùùéÄB1ýP×ÿÿý×Pù%[Æ÷ÿÿý£ÿ ÿý¢ úO…ºïÿÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿ þ`ÿÿý‡ýˆÿÿþ_ ÿúæ³€Mÿÿ ýêÿÿþþ„ÿÿýé úæ³€Mÿ þ~ÿÿýÂýÄÿÿþ|ÿ ýéÿÿþ3 þ4ÿÿýèÿ þNÿÿþÀ þÀÿÿþLÿ þ¢ÿÿþb þcÿÿþ¡ÿ þæÿÿýþ þÿÿþåÿ þ$ÿÿþÕþÖÿÿþ$ÿ þVÿÿþ¡þ¢ÿÿþUÿ þƒÿÿþwþxÿÿþÿ þ¥ÿÿþTþTÿÿþ£ÿ þÃÿÿþ9þ:ÿÿþÁÿ þØÿÿþ#þ#ÿÿþÖÿ þéÿÿþþÿÿþèÿ þõÿÿþ þ ÿÿþôÿ þûÿÿþþÿÿþùÿ ÿþþÿÿþþÿ þûÿÿþþÿÿþúÿ þõÿÿþþ ÿÿþôÿ þêÿÿþþÿÿþèÿ þØÿÿþ"þ#ÿÿþÖÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ÿ þƒÿÿþwþxÿÿþ‚ÿ þWÿÿþ¡þ¢ÿÿþUÿ þ%ÿÿþÕþÕÿÿþ$ÿ þæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿ þ€ÿÿýÂýÃÿÿþ~ÿ ýëÿÿþþƒÿÿýëÿ þcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿ ýRØÿÿýØRÿ óD‘ÆêùùêÆ‘Cg2LÍò@v©Óæùóâѧn2.û [ªñÿ ÿüÏd ÿ ü2—ñÿÿýÒ0 ÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷!%ÿý¼3 ý0ðÿÿþ±%üÿæVþIÿÿþ*$ý¨þµÿÿþz8þXÿÿþ¿8þÿÿþÜ8þÿÿþô8þ ÿÿþô8þ4ÿÿþß8þyÿÿþÅ7ýÚÿÿþ‰þþ\ÿÿþFþTýåÿÿýæþ¶þ¨ÿÿþrýüþkÿÿýÛýxÿýBúÿÿýþ?ýØÿý)îÿÿþ†ü:ÿÿýâÿÿý¼ü›ÿÿýÙÿÿýË û ñÿÿýÒÿÿýÓþ]ÿÿýËÿÿýÚþ¾ÿÿý Æÿÿýàý þÿÿý Áÿÿýä"þ€ÿÿý¼ÿÿýè'ýßÿÿý¸ÿÿýì,þCÿÿþûý³ÿÿýï1þ¤ÿÿþ±ý®ÿÿýó8ýöÿÿþPý©ÿÿýõ>þfÿÿýé ý£ÿÿýøEþÇÿÿþ ýÿÿýúMþ(ÿÿþ, þ•ÿÿýüU þ‰ÿÿþË þÿÿýþ^ ýæÿÿþj þ…ÿÿþg!þKÿÿù÷ÿÿÿþ8þ¬ÿÿþ§ÿ ÿþ8 ýùÿÿþFÿ ÿþ8 þnÿÿýãÿ ÿþ8 þÏÿÿþ„ƒ2LÍð.e’¶ØêöúëÜÁ[ ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý•þ)ÿÿþë ÿýÏýPõÿÿþ ÿóÞg5 5g·üÿÿýÔ üVüÿþ)ÿÿþ/ ÿüå‡4 ý'Àÿÿþ û;øÿÿþŠÿÿþÎ üÉZ ý«ÿÿýü! ýãÿÿýçÿÿþmý ãÿÿþw þžÿÿþLÿÿýøþtÿÿþÁ ý0ýÿÿû½­ÿÿþªþ,ÿÿþà þ®ÿÿúú%úÿÿþIþÿÿþø ý üÿÿû­oÿÿýåþ ÿÿþò þ{ÿÿûJÐÿÿþ‡þ#ÿÿþØ þÏÿÿûñ1ÿÿþ&þeÿÿþ¡ýþÿÿûº’ÿÿþÄýÑÿÿþJþPÿÿûìÿÿþcþ‹ÿÿýÏþ€ÿÿüRÿÿýõ ý¢ÿÿýö1 þ©ÿÿü7"Ðÿÿþ¡ù*Z¢ôÿÿýôI þÈÿÿýBæÿÿþ? ÿýÅ* þàÿÿþÝÿÿýÝ ÿý¬E þðÿÿþ} ÿüö¯> þùÿÿýýÿý± þþÿÿþ»ù 4i®ûÿÿýà þûÿÿþY ý¦ÿÿý× þõÿÿûÆÿï"ýcþÿÿþþêÿÿüwÿ—$þzÿÿýøþ×ÿÿüDÿ6$ýØÿÿþsþÁÿÿýÔ&þwÿÿþ³þ¢ÿÿýs&þ0ÿÿþàþ€ÿÿý&þÿÿþôþQÿÿþ'þÿÿþûþÿÿþ'þÿÿþîþÞÿÿþD'þ=ÿÿþÏþ—ÿÿþx'þˆÿÿþŸþ@ÿÿþÇ&ý çÿÿþYýÝÿÿ'þ–ÿÿýï þjÿÿý¼5ý†ÿÿþz ýÛÿÿÿü´U ý5ÅÿÿýÑ ýEþÿÿÿòò¯}K($OÒÿÿýå þ„ÿÿÿýÒ!ûšÿÿÿüø}ýyüû'vÃúÿ ÿüàþ.ï ?vŸÃáïúøêÛÉj5X2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿ þÎÿÿýåÿÿ ÿþ ÿÿ ÿôø´g1.k²úÿÿþJÿÿ ÿý°!û‰õÿýäÿÿþ¯ÿÿ ýÿo ý±þÿÿýïÿÿ þr$þGÿÿýdÿÿ2ýâÿÿü½ÿÿ2þšÿÿûõ"ÿÿ1þDÿÿþsÿ0ý àÿÿýÊÿ0þ—ÿÿýú-ÿ/ýAþÿÿþ‚ÿ ó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿ ýzïÿÿýÎHþ”ÿÿýý8ÿ ÿý° ý?þÿÿþ‘ÿ ÿýÍ ý Üÿÿýß ÿ ÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿ ÿý~ýÿÿþ ý<ýÿÿþ ÿ ýÿuþvÿÿþ. ý Úÿÿýèÿ þº þ¼ÿÿþ¢ þŽÿÿþTÿ þ* þ,ÿÿýúý9ýÿÿþ¯ ÿþÇÿÿþUýØÿÿýï ÿþxÿÿþ“þ‹ÿÿþc ÿþFÿÿþÆý7üÿÿþ½ ÿþÿÿþÛþÖÿÿýõ" ÿþÿÿþíÿþr ÿþÿÿþûÿþÿÿþìÿþÿÿþÙÿþFÿÿþÂÿþyÿÿþ‹ÿþÉÿÿþLÿ þ+ þ,ÿÿýôÿ þ» þ¼ÿÿþÿ ýÿuþvÿÿýúÿ ÿý~ýÿÿþsÿ ÿ÷Óm( (mÓÿÿþ±ÿ ÿýµ ÿ ÿüþ”ÿ þ¸ÿ ÿý¼4ÿ ô'xµÞôûêÔ´o&s2LÍóBÄéùùéÄBò@v©Óæùóâѧn2ýP×ÿÿý×Pû [ªñÿ ÿüÏd ý£ÿ ÿý¢ ü2—ñÿÿýÒ0ý¾ÿÿý½ ÿýú]þ§ÿÿ÷Öi& (kØÿÿþ¦ ÿõâ“R% 9xÚÿÿýüTþ`ÿÿý‡ýˆÿÿþ_ ÿûþµDüeõÿÿý÷!ýêÿÿþþ„ÿÿýéÿý¼3 ý0ðÿÿþ±þ~ÿÿýÂýÄÿÿþ|üÿæVþIÿÿþ*ýéÿÿþ3 þ4ÿÿýèý¨þµÿÿþzþNÿÿþÀ þÀÿÿþLþXÿÿþ¿þ¢ÿÿþb þcÿÿþ¡þÿÿþÜþæÿÿýþ þÿÿþåþÿÿûô$ÿÿþÕþÖÿÿþ$þ ÿÿûôVÿÿþ¡þ¢ÿÿþUþ4ÿÿû߃ÿÿþwþxÿÿþþyÿÿûÅ¥ÿÿþTþTÿÿþ£ýÚÿÿû‰Ãÿÿþ9þ:ÿÿþÁþ\ÿÿûFØÿÿþ#þ#ÿÿþÖýåÿÿúæéÿÿþþÿÿþèþ¨ÿÿþrþõÿÿþ þ ÿÿþôþkÿÿýÛþûÿÿþþÿÿþùýBúÿÿýþ?ÿþþÿÿþþý)îÿÿþ†þûÿÿþþÿÿþúýâÿÿý¼þõÿÿþþ ÿÿþôýÙÿÿýË þêÿÿþþÿÿþèýÒÿÿýÓþØÿÿþ"þ#ÿÿþÖýËÿÿýÚþÃÿÿþ9þ:ÿÿþÂý Æÿÿýàþ¥ÿÿþSþTÿÿþ£ý Áÿÿýä"þƒÿÿþwþxÿÿþ‚ý¼ÿÿýè' þWÿÿþ¡þ¢ÿÿþU ý¸ÿÿýì, þ%ÿÿþÕþÕÿÿþ$ ý³ÿÿýï1 þæÿÿýþ ýþÿÿþæ ý®ÿÿýó8 þ£ÿÿþb þbÿÿþ¢ ý©ÿÿýõ>þOÿÿþ¿ þÀÿÿþM ý£ÿÿýøEýêÿÿþ3 þ4ÿÿýé ýÿÿýúMþ€ÿÿýÂýÃÿÿþ~ þ•ÿÿýüUýëÿÿþþƒÿÿýë þÿÿýþ^þcÿÿý†ý‡ÿÿþb þ…ÿÿþgþ«ÿÿ÷Öh%&j×ÿÿþ© ÿþ8ý ÁÿÿýÀ ÿþ8ý ¦ÿ ÿý¥ ÿþ8ýRØÿÿýØR ÿþ8óD‘ÆêùùêÆ‘Ck2LÍ0ð.e’¶ØêöúëÜÁ[ ù%[Æ÷ÿÿû$lµóÿ ÿýø¨úO…ºïÿÿÿ ÿÿ ÿÿñÞg5 5g·üÿÿÿúæ³€Mÿÿÿüå‡4 ü'Àÿúæ³€MÿüÉZ ý«ÿ%þ ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ%þÿ%þ‹ÿ#ü¢ÿÿ÷*Z¢ôÿÿÿ ÿÿ ÿþ¬ÿ ÿþöÿ ÿÿ÷ 4i®ûÿÿÿ#ü¦ÿÿ%þcÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿý¼5ý†ÿÿü´U ü5Åÿ ÿ ÿòò¯}K($OÒÿÿ ÿ ÿ ÿ ÿ ÿ û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5@2LÍ<úBÄ6þLÿÿýP×ÿÿüý•ýåÿÿý£ÿÿýÏþ ÿÿý¾ÿÿýÔ þJÿÿþ§ÿÿýÖiÿÿþýäÿÿþ¯ÿÿþ`ÿÿü‡ÿÿýü!þÿÿýïÿÿýêÿÿþþãÿÿþwþGÿÿýdÿÿþ~ÿÿýÂþtÿÿþÁýâÿÿü½ÿÿ ýéÿÿþ3þ,ÿÿþàþšÿÿûõ"ÿÿ þNÿÿþÀþÿÿþøþDÿÿþsÿ þ¢ÿÿþbþ ÿÿþòý àÿÿýÊÿ þæÿÿýþþ#ÿÿþØþ—ÿÿýú-ÿ þ$ÿÿþÕþeÿÿþ¡ýAþÿÿþ‚ÿ þVÿÿþ¡þÑÿÿþJý ÞÿÿýÕÿ þƒÿÿþwÿýÏþ”ÿÿýý8ÿ þ¥ÿÿþTÿýö1ý?þÿÿþ‘ÿ þÃÿÿþ9ÿýôIý Üÿÿýß ÿ þØÿÿþ#üÿÅ*þ‘ÿÿþFÿ þéÿÿþþEý<ýÿÿþ ÿ þõÿÿþ ý¯>ý Úÿÿýèÿ þûÿÿþÿý± þŽÿÿþTÿ ÿþÿýà ý9ýÿÿþ¯ ÿ þûÿÿþÿý× ýØÿÿýï ÿ þõÿÿþþþÿÿþþ‹ÿÿþc ÿ þêÿÿþþzÿÿýøý7üÿÿþ½ ÿ þØÿÿþ"ýØÿÿþsþÖÿÿýõ" ÿ þÃÿÿþ9þwÿÿþ³ÿþr ÿ þ¥ÿÿþSþ0ÿÿþàÿþƒÿÿþwþÿÿþôÿþWÿÿþ¡þÿÿþûÿþ%ÿÿþÕþÿÿþîÿþæÿÿýþþ=ÿÿþÏÿ þ£ÿÿþbþˆÿÿþŸÿ þOÿÿþ¿ý çÿÿþYÿ ýêÿÿþ3þ–ÿÿýï ÿþ€ÿÿýÂÿþzÿýëÿÿþÿýÑÿþcÿÿü†ÿÿýåÿþ«ÿÿùÖhÿÿÒ!ÿý Áÿÿüø}ÿý ¦ÿÿþÿýRØÿÿ;ûD‘Æ?2LÍ÷éùùéÄB6ÿý×Pù%[Æ÷ÿÿü$lµÿÿý¢ úO…ºïÿÿ ÿý½ ÿÿù& (kØÿÿþ¦ ÿÿýˆÿÿþ_ ÿúæ³€Mÿÿÿþåþ„ÿÿýé úæ³€MÿüÉZýÄÿÿþ|ÿþ4ÿÿýèÿþÀÿÿþLÿþcÿÿþ¡ÿþÿÿþåÿ þÖÿÿþ$ÿ þ¢ÿÿþUÿ þxÿÿþÿ þTÿÿþ£ÿ þ:ÿÿþÁÿ þ#ÿÿþÖÿ þÿÿþèÿ þ ÿÿþôÿ þÿÿþùÿ þÿÿþþÿ þÿÿþúÿ þ ÿÿþôÿ þÿÿþèÿ þ#ÿÿþÖÿ þ:ÿÿþÂÿ þTÿÿþ£ÿ þxÿÿþ‚ÿ þ¢ÿÿþUÿ þÕÿÿþ$ÿýþÿÿþæÿþbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿýÃÿÿþ~ÿþƒÿÿýëÿý¼5ý‡ÿÿþbÿÿ÷´U%&j×ÿÿþ© ÿ ÿýÀ ÿ ÿý¥ÿ ÿýØRÿ ó'vÃúêùùêÆ‘C5þ ?2LÍð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 þóÿ ÿüø¨6û [ªñÿ ÿüÏd ÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTý‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^þ ý5ÅÿÿýÑþ…ÿÿþgòò¯}K($OÒÿÿýå ÿþ8ÿýÒ! ÿþ8ÿüø} ÿþ8 ÿüà ÿþ8ð?vŸÃáïúøêÛÉj5p2LÍ3ó7€·Þñüñß¶†AþLÿÿübÖÿ ÿýð—ýåÿÿý)Îÿ ÿþ ÿÿýPõÿÿþJÿÿýVüÿÿòø´g1.k²úÿÿýäÿÿþ¯ÿÿý;øÿÿý°!ü‰õþÿÿýïÿÿýãÿÿþo þ þGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñýAþÿÿþ‚ÿ ýþÿÿþºý ÞÿÿýÕÿ þPÿÿþó \¤ÔòûëÕ¹x1 þ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿýÎH ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿ ÿý° ý Üÿÿýß ÿ þÈÿÿýBæÿÿþÍþ‘ÿÿþFÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿý<ýÿÿþ ÿ þðÿÿý~ýÿÿý Úÿÿýèÿ þùÿÿþuþvÿÿþŽÿÿþTÿ þþÿÿþº ü¼ÿÿý9ýÿÿþ¯ ÿ þûÿÿþ* ü,ÿÿýØÿÿýï ÿ þõÿÿþÆ ýÇÿþ‹ÿÿþc ÿ þêÿÿþw ýxÿý7üÿÿþ½ ÿ þ×ÿÿþD ýFÿþÖÿÿýõ" ÿ þÁÿÿþ ýÿÿþr ÿ þ¢ÿÿþ ýÿÿþ€ÿÿþ ýÿÿþQÿÿþ ýÿÿþÿÿþ ýÿÿþÞÿÿþD ýFÿÿ þ—ÿÿþx ýyÿÿ þ@ÿÿþÇ ýÉÿÿ ýÝÿÿþ+ ü,ÿÿÿþjÿÿþ» ü¼ÿÿÿýÛÿÿþuþvÿÿÿýEþÿÿý~ýÿÿÿþ„ÿÿ÷Óm( (mÓÿÿÿýšÿÿþµÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&C2LÍóBÄéùùéÄBþ2ýP×ÿÿý×Pù%[Æ÷ÿÿý£ÿ ÿý¢ úO…ºïÿÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿ þ`ÿÿý‡ýˆÿÿþ_ ÿúæ³€Mÿÿþ± ýêÿÿþþ„ÿÿýé úæ³€Mÿ þ~ÿÿýÂýÄÿÿþ|ÿ ýéÿÿþ3 þ4ÿÿýèÿ þNÿÿþÀ þÀÿÿþLÿ þ¢ÿÿþb þcÿÿþ¡ÿ þæÿÿýþ þÿÿþåÿ þ$ÿÿþÕþÖÿÿþ$ÿ þVÿÿþ¡þ¢ÿÿþUÿ þƒÿÿþwþxÿÿþÿ þ¥ÿÿþTþTÿÿþ£ÿ þÃÿÿþ9þ:ÿÿþÁÿþ þØÿÿþ#þ#ÿÿþÖÿýÊþéÿÿþþÿÿþèÿþþõÿÿþ þ ÿÿþôÿþ.þûÿÿþþÿÿþùÿþ¢ÿþþÿÿþþÿýúþûÿÿþþÿÿþúÿþUþõÿÿþþ ÿÿþôÿþ“þêÿÿþþÿÿþèÿþÆþØÿÿþ"þ#ÿÿþÖÿþÛþÃÿÿþ9þ:ÿÿþÂÿþíþ¥ÿÿþSþTÿÿþ£ÿþûþƒÿÿþwþxÿÿþ‚ÿþìþWÿÿþ¡þ¢ÿÿþUÿþÙþ%ÿÿþÕþÕÿÿþ$ÿþÂþæÿÿýþ ýþÿÿþæÿþ‹þ£ÿÿþb þbÿÿþ¢ÿþLþOÿÿþ¿ þÀÿÿþMÿýôýêÿÿþ3 þ4ÿÿýéÿþ þ€ÿÿýÂýÃÿÿþ~ÿýú ýëÿÿþþƒÿÿýëÿþs þcÿÿý†ý‡ÿÿþbÿþ± þ«ÿÿ÷Öh%&j×ÿÿþ© ÿþ ý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ ÿýRØÿÿýØR ÿóD‘ÆêùùêÆ‘C_2LÍð.e’¶ØêöúëÜÁ[û@vÿû$lµóÿ ÿüø¨6û [ªñÿÿÿüý• ü2—ñÿÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿýâÿÿüå‡4 ý'Àÿÿþ ÿúþµDÿüÉZ ý«ÿÿýü!ÿý¼3þÿ$ý ãÿÿþwüÿæVþÿ%þtÿÿþÁý¨þÿ%þ,ÿÿþàþÿ%þÿÿþøþÿ%þ ÿÿþòþÿ%þ#ÿÿþØþÿ%þeÿÿþ¡þÿ$ýÑÿÿþJþÿ$þ‹ÿÿýÏþÿ"ý¢ÿÿýö1þÿù*Z¢ôÿÿýôIþÿ ÿýÅ*þÿ ÿý¬Eþÿ ÿüö¯>þÿÿý±þÿù 4i®ûÿÿýàþÿ"ý¦ÿÿý× þÿ$ýcþÿÿþþÿ%þzÿÿýøþÿ%ýØÿÿþsþÿ&þwÿÿþ³þÿ&þ0ÿÿþàþÿ&þÿÿþôýÿ&þÿÿþû ü³ÿ&þÿÿþî û®ÿÿ&þ=ÿÿþÏ ý©ÿÿ'þˆÿÿþŸ ý£ÿÿ&ý çÿÿþY ýÿÿ&þ–ÿÿýï þ•ÿÿý¼5ý†ÿÿþz þÿÿýþÿÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5X2LÍõ©Óæùóâѧn2ó7€·Þñüñß¶†A ÿüÏdübÖÿ ÿüð—2 ÿýÒ0ý)Îÿÿ ÿýú]ýPõÿÿ ö“R% 9xÚÿÿýüTýVüÿÿôø´g1.k²úÿÿüeõÿÿý÷! ý;øÿÿý°!û‰õÿý0ðÿÿþ± ýãÿÿþo ý±þIÿÿþ* þžÿÿþr%þµÿÿþz ý0ýÿÿþ½&þXÿÿþ¿ þ®ÿÿýú%&þÿÿþÜ ý üÿÿþ­'þÿÿþô þ{ÿÿþJ'þ ÿÿþô þÏÿÿýñ'þ4ÿÿþßýþÿÿþº(þyÿÿþÅþPÿÿþó \¤ÔòûëÕ¹x1ýÚÿÿþ‰þ€ÿÿúRzïÿÿýÎHþ\ÿÿþFþ©ÿÿü7"Ðÿ ÿý° ýåÿÿýæþÈÿÿýBæÿÿýÍþ¨ÿÿþr þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþkÿÿýÛ þðÿÿý~ýÿÿþýBúÿÿýþ? þùÿÿþuþvÿÿþ.ý)îÿÿþ† þþÿÿþº þ¼ÿÿþ¢ ýâÿÿý¼ þûÿÿþ* þ,ÿÿýú ýÙÿÿýË þõÿÿþÆ þÇÿÿþU ýÒÿÿýÓ þêÿÿþw þxÿÿþ“ ýËÿÿýÚþ×ÿÿþD þFÿÿþÆú7 ÆÿÿýàþÁÿÿþ þÿÿþÛûÖ Áÿÿýä"þ¢ÿÿþ þÿÿþíüÿ¼ÿÿýè'þ€ÿÿþ þÿÿþûýÿ¸ÿÿýì,þQÿÿþ þÿÿþìÿýï1þÿÿþ þÿÿþÙÿýó8þÞÿÿþD þFÿÿþÂÿýõ>þ—ÿÿþx þyÿÿþ‹ÿýøEþ@ÿÿþÇ þÉÿÿþLüÿúMýÝÿÿþ+ þ,ÿÿýôýüUþjÿÿþ» þ¼ÿÿþþ^ýÛÿÿþuþvÿÿýú&ýEþÿÿý~ýÿÿþsÿþ8 þ„ÿÿ÷Óm( (mÓÿÿþ± ÿþ8 ýšÿÿýµ ÿþ8 ýyüÿ ÿüþ” ÿþ8ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&O2LÍ,óBÄéùùéÄBþLÿÿýP×ÿÿý×Pýåÿÿý£ÿ ÿý¢þ ÿÿý¾ÿÿý½þJÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ýäÿÿþ¯ÿÿþ`ÿÿý‡ýˆÿÿþ_ þÿÿýïÿÿýêÿÿþþ„ÿÿýé þGÿÿýdÿÿþ~ÿÿýÂýÄÿÿþ| ýâÿÿü½ÿÿ ýéÿÿþ3 þ4ÿÿýè þšÿÿûõ"ÿÿ þNÿÿþÀ þÀÿÿþLþDÿÿþsÿ þ¢ÿÿþb þcÿÿþ¡ý àÿÿýÊÿ þæÿÿýþ þÿÿþåþ—ÿÿýú-ÿ þ$ÿÿþÕþÖÿÿþ$ýAþÿÿþ‚ÿ þVÿÿþ¡þ¢ÿÿþUý ÞÿÿýÕÿ þƒÿÿþwþxÿÿþþ”ÿÿýý8ÿ þ¥ÿÿþTþTÿÿþ£ý?þÿÿþ‘ÿ þÃÿÿþ9þ:ÿÿþÁý Üÿÿýß ÿ þØÿÿþ#þ#ÿÿþÖþ‘ÿÿþFÿ þéÿÿþþÿÿþèý<ýÿÿþ ÿ þõÿÿþ þ ÿÿúô Úÿÿýèÿ þûÿÿþþÿÿûùŽÿÿþTÿ ÿþþÿÿûþ9ýÿÿþ¯ ÿ þûÿÿþþÿÿüúØÿÿýï ÿ þõÿÿþþ ÿÿýô‹ÿÿþc ÿ þêÿÿþþÿÿýèüÿÿþ½ ÿ þØÿÿþ"þ#ÿÿþÖÿÿýõ" ÿ þÃÿÿþ9þ:ÿÿþÂÿÿþr ÿ þ¥ÿÿþSþTÿÿþ£ÿÿþƒÿÿþwþxÿÿþ‚ÿÿþWÿÿþ¡þ¢ÿÿþUÿÿþ%ÿÿþÕþÕÿÿþ$ÿÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~ÿýëÿÿþþƒÿÿýëÿþcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘CG2LÍ ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿýÏdÿüý• ü2—ñÿÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿÿüå‡4 ý'Àÿÿþ ÿûþµDûeõÿüÉZ ý«ÿÿýü!ÿý¼3 ý0ðý ãÿÿþwüÿæVþIþtÿÿþÁý¨,þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡7ýÑÿÿþJ7þ‹ÿÿýÏþý¢ÿÿýö1þ\ù*Z¢ôÿÿýôIýå ÿýÅ*ý¨ÿ ÿý¬Eükÿÿ ÿüö¯>ûBúÿÿ ÿý±ý)îÿÿù 4i®ûÿÿýàýâÿÿý¦ÿÿý× ýÙÿÿýcþÿÿþýÒÿÿþÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà ÿ ï ?vŸÃáïúøêÛÉj5d2LÍ@þù%[Æ÷ÿÿ ÿýÒ0úO…ºïÿÿ ÿýú] ÿ ÿýüT ÿÿý÷! ÿúæ³€Mÿÿÿþ± úæ³€Mÿÿþ*ÿþµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿþÚÿÿþ‰ÿÿþFÿÿýæÿÿþrÿÿýÛÿÿýþ?ÿÿþ†ÿüÿ¼ÿýË ÿþÿ:ÿ:ÿþ ÿþ€ÿýßÿýCÿÿý¤ÿÿüöÿÿüfÿÿÿüÇÿÿÿþ(ÿÿÿþ‰ÿÿÿýæÿÿÿþKÿÿþ8 ÿþ¬ÿÿþ8 ÿýùÿÿþ8 ÿþnÿÿþãÿÿþ8 ÿþÏÿÿþ„2LÍ@ ÿþLÿÿ ÿýåÿÿ ÿþëþ ÿÿ ÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþ`þŠÿÿþÎþÿÿýïÿÿýêýçÿÿþmþGÿÿýdÿÿý~ÿþLÿÿýøýâÿÿü½ÿÿ üéÿþ­ÿÿþªþšÿÿûõ"ÿÿ üNÿÿýúÿÿþIþDÿÿþsÿ ü¢ÿÿþoÿÿýåý àÿÿýÊÿ üæÿÿþÐÿÿþ‡þ—ÿÿýú-ÿ þ$ÿÿþ1ÿÿþ&ýAþÿÿþ‚ÿ þVÿÿþ’ÿÿþÄý ÞÿÿýÕÿ þƒÿÿýìÿÿþcþ”ÿÿýý8ÿ þ¥ÿÿþTÿÿýõ ý?þÿÿþ‘ÿ þÃÿÿþ¶ÿÿþ¡ý Üÿÿýß ÿ þØÿÿýüÿÿþ?þ‘ÿÿþFÿ þéÿÿþxÿÿýÝý<ýÿÿþ ÿ þõÿÿþØÿÿþ}ý Úÿÿýèÿ þûÿÿý:ÿÿýýþŽÿÿþTÿ ÿý›ÿÿþ»ý9ýÿÿþ¯ ÿ þûÿÿý ñÿÿþYýØÿÿýï ÿ þõÿÿþ]ÿÿýïþ‹ÿÿþc ÿ þêÿÿþ¾ÿÿþ—ý7üÿÿþ½ ÿ þØÿÿþþÿÿþ6þÖÿÿýõ" ÿ þÃÿÿþÔÿþr ÿ þ¥ÿÿþsÿþƒÿÿýûÿþWÿÿþ±ÿþ%ÿÿþPÿþæÿÿýé$ÿ þ£ÿÿþ%ÿ þOÿÿþ,%ÿ úêÿÿË&ÿû€ÿÿj&ÿûë÷&ÿýc§'ÿþF'ÿþ'ÿ:ÿ‘2LÍóBÄéùùéÄBð.e’¶ØêöúëÜÁ[ýP×ÿÿý×Pû$lµóÿ ÿüø¨6 ý£ÿ ÿý¢ ÿüý•ý¾ÿÿý½ ÿýÏþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿóÞg5 5g·üÿÿýÔ ÿý‡ýˆÿÿþ_ ÿüå‡4 ý'Àÿÿþÿþþ„ÿÿýé üÉZ ý«ÿÿýü!ÿýÂýÄÿÿþ|ý ãÿÿþwÿþ3 þ4ÿÿýèþtÿÿþÁÿþÀ þÀÿÿþLþ,ÿÿþàÿþb þcÿÿþ¡þÿÿþøüÿþ þÿÿþåþ ÿÿþòýÿÕþÖÿÿþ$þ#ÿÿþØýÿ¡þ¢ÿÿþUþeÿÿþ¡ýÿwþxÿÿþýÑÿÿþJýÿTþTÿÿþ£þ‹ÿÿýÏýÿ9þ:ÿÿþÁý¢ÿÿýö1ýÿ#þ#ÿÿþÖù*Z¢ôÿÿýôIýÿþÿÿþè ÿýÅ*ýÿ þ ÿÿþô ÿý¬E ýÿþÿÿþù ÿüö¯>ýÿþÿÿþþ ÿý±ýÿþÿÿþúù 4i®ûÿÿýàýÿþ ÿÿþôý¦ÿÿý× ýÿþÿÿþèýcþÿÿþýÿ"þ#ÿÿþÖþzÿÿýøýÿ9þ:ÿÿþÂýØÿÿþsýÿSþTÿÿþ£þwÿÿþ³ýÿwþxÿÿþ‚þ0ÿÿþàýÿ¡þ¢ÿÿþUþÿÿþôýÿÕþÕÿÿþ$þÿÿþûüÿþ ýþÿÿþæþÿÿþîÿþb þbÿÿþ¢þ=ÿÿþÏÿþ¿ þÀÿÿþMþˆÿÿþŸÿþ3 þ4ÿÿýéý çÿÿþYÿýÂýÃÿÿþ~þ–ÿÿýï ÿþþƒÿÿýëý¼5ý†ÿÿþzÿý†ý‡ÿÿþb ÿü´U ý5ÅÿÿýÑþ«ÿÿ÷Öh%&j×ÿÿþ© ÿòò¯}K($OÒÿÿýåý ÁÿÿýÀ ÿýÒ!ý ¦ÿ ÿý¥ ÿüø} ýRØÿÿýØR û'vÃúÿ ÿüà óD‘ÆêùùêÆ‘Cï ?vŸÃáïúøêÛÉj5L2LÍ ò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdù%[Æ÷ÿÿ ü2—ñÿÿýÒ0úO…ºïÿÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿ ÿý¼3 ý0ðÿÿþ± úæ³€Mÿ üÿæVþIÿÿþ*ÿ ý¨þµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿýÚÿÿþ‰ÿþ\ÿÿþFÿýåÿÿýæÿþ¨ÿÿþrÿþkÿÿýÛÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8 ÿý©ÿÿýõ>!ÿ ý£ÿÿýøE"ÿ ýÿÿýúM#ÿ þ•ÿÿýüU$ÿ þÿÿýþ^%ÿ þ…ÿÿþg&ÿ ÿþ8 ÿÿþ8 ÿÿþ8 ÿÿþ8 ÿ€2LÍ;ú7€·ÞñþLÿÿübÖÿÿýåÿÿý)Îÿÿþ ÿÿýPõÿÿþJÿÿýVüÿÿúø´g1ýäÿÿþ¯ÿÿý;øÿÿý°!þÿÿýïÿÿýãÿÿþoþGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñýAþÿÿþ‚ÿ ýþÿÿþºý ÞÿÿýÕÿ þPÿÿþø \¤Ôòûëþ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿÿý Üÿÿýß ÿ þÈÿÿýBæÿÿþ‘ÿÿþFÿ þàÿÿþÝÿÿúÓn( ý<ýÿÿþ ÿ þðÿÿý~ý Úÿÿýèÿ þùÿÿþuþŽÿÿþTÿ þþÿÿþºý9ýÿÿþ¯ ÿ þûÿÿþ*ýØÿÿýï ÿ þõÿÿþÆþ‹ÿÿþc ÿ þêÿÿþwý7üÿÿþ½ ÿ þ×ÿÿþDþÖÿÿýõ" ÿ þÁÿÿþÿþr ÿ þ¢ÿÿþÿþ€ÿÿþÿþQÿÿþÿþÿÿþÿþÞÿÿþD$ÿ þ—ÿÿþx$ÿ þ@ÿÿþÇ$ÿ ýÝÿÿþ+#ÿþjÿÿþ»#ÿýÛÿÿþu"ÿýEþÿÿý~ÿÿþ„ÿÿøÓm( ÿÿÿýšÿ ÿÿýyüÿÿÿý.¸ÿÿ8ø'xµÞôûê?2LÍøüñß¶†AóBÄéùùéÄBû.e’ÿÿüð—2ýP×ÿÿý×Pû$lµóÿ ÿý£ÿ ÿý¢ ÿý¾ÿÿý½ ÿù.k²úÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿýÞû‰õÿ þ`ÿÿý‡ýˆÿÿþ_ ÿüå‡4ý± ýêÿÿþþ„ÿÿýé üÉZþ~ÿÿýÂýÄÿÿþ|%ýéÿÿþ3 þ4ÿÿýè$þNÿÿþÀ þÀÿÿþL$þ¢ÿÿþb þcÿÿþ¡$þæÿÿýþ þÿÿþå#þ$ÿÿþÕþÖÿÿþ$"þVÿÿþ¡þ¢ÿÿþUúÕ¹x1 þƒÿÿþwþxÿÿþÿýÎH þ¥ÿÿþTþTÿÿþ£ÿý° þÃÿÿþ9þ:ÿÿþÁÿýÍ þØÿÿþ#þ#ÿÿþÖü(nÓÿÿýÊþéÿÿþþÿÿþè úÿÿÿþþõÿÿþ þ ÿÿþô þÿþvÿÿþ.þûÿÿþþÿÿþù þÿþ¼ÿÿþ¢ÿþþÿÿþþ þÿþ,ÿÿýúþûÿÿþþÿÿþúþÇÿÿþUþõÿÿþþ ÿÿþôþxÿÿþ“þêÿÿþþÿÿþèþFÿÿþÆþØÿÿþ"þ#ÿÿþÖþÿÿþÛþÃÿÿþ9þ:ÿÿþÂþÿÿþíþ¥ÿÿþSþTÿÿþ£þÿÿþûþƒÿÿþwþxÿÿþ‚þÿÿþìþWÿÿþ¡þ¢ÿÿþUþÿÿþÙþ%ÿÿþÕþÕÿÿþ$þFÿÿþÂþæÿÿýþ ýþÿÿþæþyÿÿþ‹þ£ÿÿþb þbÿÿþ¢þÉÿÿþLþOÿÿþ¿ þÀÿÿþMþ,ÿÿýôýêÿÿþ3 þ4ÿÿýéþ¼ÿÿþ þ€ÿÿýÂýÃÿÿþ~þvÿÿýú ýëÿÿþþƒÿÿýëý¼5ýÿÿþs þcÿÿý†ý‡ÿÿþb ÿü´U ü(mÓÿÿþ± þ«ÿÿ÷Öh%&j×ÿÿþ© ÿûò¯}Kÿÿýµ ý ÁÿÿýÀ ÿüþ”ý ¦ÿ ÿý¥ ÿý¼4ýRØÿÿýØR û'vÃúÿÿûÔ´o&óD‘ÆêùùêÆ‘Cú ?vŸÃ?2LÍô¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 ÿüø¨6û [ªñÿ ÿüÏd ÿüý• ü2—ñÿÿýÒ0 ÿýÏ ÿýú] õg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTý'Àÿÿþ ÿûþµDüeõÿÿý÷!ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^"ý5ÅÿÿýÑþ…ÿÿþgö($OÒÿÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿüà ÿþ8ôáïúøêÛÉj5t2LÍFù%[Æ÷ÿÿ!þLÿÿúO…ºïÿÿ ýåÿÿÿ þ ÿÿÿþJÿÿÿúæ³€Mÿÿýäÿÿþ¯ÿÿúæ³€MÿþÿÿýïÿÿÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿÿÿÿÿÿÿÿ…2LÍó7€·Þñüñß¶†AóBÄéùùéÄBübÖÿ ÿüð—2ýP×ÿÿþ× ý)Îÿÿý£ÿ ÿ ýPõÿÿý¾ÿ ÿ ýVüÿÿôø´g1.k²úÿÿþ§ÿÿõÖi& (kØÿÿ ý;øÿÿý°!û‰õÿ þ`ÿÿý‡üˆÿ ýãÿÿþo ý± ýêÿÿþþ„ þžÿÿþrþ~ÿÿýÂþý0ýÿÿþ½ýéÿÿþ3þ®ÿÿýú%þNÿÿþÀý üÿÿþ­þ¢ÿÿþbþ{ÿÿþJþæÿÿýþþÏÿÿýñþ$ÿÿþÕýþÿÿþºþVÿÿþ¡þPÿÿþó \¤ÔòûëÕ¹x1 þƒÿÿþwþ€ÿÿúRzïÿÿýÎH þ¥ÿÿþTþ©ÿÿü7"Ðÿ ÿý° þÃÿÿþ9þÈÿÿýBæÿÿýÍ þØÿÿþ#þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþéÿÿþþðÿÿý~ýÿÿþþõÿÿþ þùÿÿþuþvÿÿþ.þûÿÿþþþÿÿþº þ¼ÿÿþ¢ÿþþûÿÿþ* þ,ÿÿýúþûÿÿþþõÿÿþÆ þÇÿÿþUþõÿÿþþêÿÿþw þxÿÿþ“þêÿÿþþ×ÿÿþD þFÿÿþÆþØÿÿþ"þÁÿÿþ þÿÿþÛþÃÿÿþ9þ¢ÿÿþ þÿÿþíþ¥ÿÿþS þÿþ€ÿÿþ þÿÿþûþƒÿÿþw þÿþQÿÿþ þÿÿþìþWÿÿþ¡ þÿþÿÿþ þÿÿþÙþ%ÿÿþÕ þÿþÞÿÿþD þFÿÿþÂþæÿÿýþþ—ÿÿþx þyÿÿþ‹þ£ÿÿþbþ@ÿÿþÇ þÉÿÿþLþOÿÿþ¿ýÝÿÿþ+ þ,ÿÿýôýêÿÿþ3þjÿÿþ» þ¼ÿÿþ þ€ÿÿýÂþýÛÿÿþuþvÿÿýú ýëÿÿþþƒ ýEþÿÿý~ýÿÿþs þcÿÿý†ü‡ÿ þ„ÿÿ÷Óm( (mÓÿÿþ± þ«ÿÿõÖh%&j×ÿÿ ýšÿÿýµ ý Áÿ ÿ ýyüÿ ÿüþ”ý ¦ÿ ÿý.¸ÿ ÿý¼4ýRØÿÿþØô'xµÞôûêÔ´o&óD‘ÆêùùêÆ‘C?2LÍ8ö.e’¶ØêöPù%[Æ÷ÿÿû$lµóÿÿý¢ úO…ºïÿÿ ÿý½ ÿ ÿþ¦ ÿÿùÞg5 ÿÿþ_ ÿúæ³€Mÿÿÿüå‡4ÿýé úæ³€MÿüÉZþÄÿÿþ|ÿþ4ÿÿýèÿþÀÿÿþLÿþcÿÿþ¡ÿþÿÿþåÿ þÖÿÿþ$ÿ þ¢ÿÿþUÿ þxÿÿþÿ þTÿÿþ£ÿ þ:ÿÿþÁÿ þ#ÿÿþÖÿ þÿÿþèÿÿþ ÿÿþôÿÿþÿÿþùÿÿþÿÿþþÿÿþÿÿþúÿ þ ÿÿþôÿ þÿÿþèÿ þ#ÿÿþÖÿ þ:ÿÿþÂÿ þTÿÿþ£ÿ þxÿÿþ‚ÿ þ¢ÿÿþUÿ þÕÿÿþ$ÿýþÿÿþæÿþbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿþÃÿÿþ~ÿÿýëÿý¼5ÿþbÿÿü´U ÿþ© ÿ ÿóò¯}K(ÿÿÀ ÿ ÿý¥ÿ ÿþRÿ û'vÃúÿÿ6ö ?vŸÃáïúø?2LÍøúëÜÁ[ò@v©Óæùóâѧn2ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0 ÿýÏ ÿýú]ø:5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüT ý$ñý'Àÿÿþ ÿûþµDüeõÿÿý÷! ý¶ÿý«ÿÿýü!ÿý¼3 ý0ðÿÿþ± ü8ÿÿý ãÿÿþwüÿæVþIÿÿþ* ü‹ÿÿþtÿÿþÁý¨þµÿÿþz üÌÿÿþ,ÿÿþàþXÿÿþ¿ üæÿÿþÿÿþøþÿÿþÜ üúÿÿþ ÿÿþòþÿÿþô üðÿÿþ#ÿÿþØþ ÿÿþô üÓÿÿþeÿÿþ¡þ4ÿÿþß üšÿÿýÑÿÿþJþyÿÿþÅ üAÿÿþ‹ÿÿýÏýÚÿÿþ‰ ýÆÿý¢ÿÿýö1þ\ÿÿþF ÷*ó*Z¢ôÿÿýôIýåÿÿýæ þBÿÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ø 4i®ûÿÿýàýâÿÿý¼ ý Æý¦ÿÿý× ýÙÿÿýË ü¼ÿýcþÿÿþýÒÿÿýÓüpÿÿþzÿÿýøýËÿÿýÚû ïÿÿýØÿÿþsý Æÿÿýàþaÿÿþwÿÿþ³ý Áÿÿýä"þ§ÿÿþ0ÿÿþàý¼ÿÿýè'þÚÿÿþÿÿþôý¸ÿÿýì,þñÿÿþÿÿþû ý³ÿÿýï1þûÿÿþÿÿþî ý®ÿÿýó8þêÿÿþ=ÿÿþÏ ý©ÿÿýõ>þÖÿÿþˆÿÿþŸ ý£ÿÿýøEþ³ÿÿý çÿÿþY ýÿÿýúMþpÿÿþ–ÿÿýï þ•ÿÿýüUþ)ÿÿý†ÿÿþz þÿÿýþ^ü·ÿÿý5ÅÿÿýÑþ…ÿÿþg÷2þÿ$OÒÿÿýå ÿþ8 þyÿ ÿýÒ! ÿþ8 þ”ÿÿüø} ÿþ8 ÿüà ÿþ8 øêÛÉj5x2LÍó ý ÞÿÿýÕÿÿþ þ‡ÿÿþÃþ”ÿÿýý8ÿÿýý •ÿÿýñ' ý?þÿÿþ‘ÿþòÿÿõç…CFŠëÿÿýñ> ý Üÿÿýß ÿý&ÃÿÿýÂ$þ‘ÿÿþFÿ üD¦þÿÿüþ¥Cý<ýÿÿþ ÿ ü'›íÿ ÿüí›' ý Úÿÿýèÿýüÿÿüü‘ þŽÿÿþTÿÿõãƒD E„äÿÿýÆ ý9ýÿÿþ¯ ÿÿüùqütúÿÿý¼ýØÿÿýï ÿÿýø= ý@ùÿÿþoþ‹ÿÿþc ÿÿþc þfÿÿýî ý7üÿÿþ½ ÿüÿÓ ýÔÿÿþaþÖÿÿýõ" ÿýÿsþuÿÿþ¦ÿþr ÿýÿ1þ3ÿÿþÙÿýÿþÿÿþðÿýÿþÿÿþúÿýÿþÿÿþéÿýÿ1þ3ÿÿþÕÿýÿsþwÿÿþ³ÿüÿÒ ý×ÿÿþoÿÿþc þlÿÿþ)ÿÿý÷= ýFúÿÿþ¶ÿÿüùpüxûÿÿýþ1ÿÿõâ‚C E…æÿÿþxÿÿþ“ÿý_òÿÿýò_ÿ üŠíÿ ÿüíŠÿ ñ Jƒ¹×èøøè×¹ƒJ n2LÍSþLÿÿ ÿýåÿÿ ÿþ ÿÿ ÿþJÿÿ ÿýäÿÿþ¯ÿÿþ)ÿÿþÿÿýïÿÿþŠÿÿþGÿÿýdÿÿýçÿÿ ýâÿÿü½ÿÿþLÿÿþø þšÿÿûõ"ÿÿþ­ÿÿþª þDÿÿþsÿýúÿÿþI ý àÿÿýÊÿþoÿÿýå þ—ÿÿýú-ÿþÐÿÿþ‡ ýAþÿÿþ‚ÿþ1ÿÿþ& ý ÞÿÿýÕÿþ’ÿÿþÄ þ”ÿÿýý8ÿýìÿÿþc ý?þÿÿþ‘ÿþTÿÿýõ ý Üÿÿýß ÿþ¶ÿÿþ¡ þ‘ÿÿþFÿýüÿÿþ?ý<ýÿÿþ ÿþxÿÿýÝý ÚÿÿýèÿþØÿÿþ}þŽÿÿþTÿþ:ÿÿýýý9ýÿÿþ¯ ÿþ›ÿÿþ»ýØÿÿýï ÿý ñÿÿþYþ‹ÿÿþc ÿþ]ÿÿýïý7üÿÿþ½ ÿþ¾ÿÿþ—þÖÿÿýõ" ÿý þÿÿþ6ÿþr ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ± ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿý÷ÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„‹2LÍó%þÆÿÿþ þ‡ÿÿþÃþ ý*óÿÿýý •ÿÿýñ'þT ýBòÿÿõç…CFŠëÿÿýñ>þ¶ý&ÃÿÿýÂ$ýüüD¦þÿÿüþ¥Cýxÿü'›íÿ ÿüí›'ýØÿ üüÿÿüü‘ü:ÿÿ ý ÆÿÿõãƒD E„äÿÿýÆ ü›ÿÿ ý¼ÿÿüùqütúÿÿý¼û ñÿÿ þpÿÿýø= ý@ùÿÿþoþ]ÿÿ ý ïÿÿþc þfÿÿýî þ¾ÿÿ þaÿÿýÓ ýÔÿÿþaý þÿÿ þ§ÿÿþsþuÿÿþ¦þ€ÿÿ þÚÿÿþ1þ3ÿÿþÙýßÿÿ þñÿÿþþÿÿþðþCÿÿþû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP þÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ ^2LÍóBÄéùùéÄB ÿýP×ÿÿý×Pý%ÿÿý£ÿ ÿý¢ úO…ºïÿÿþë ý¾ÿÿý½ ÿþ þ§ÿÿ÷Öi& (kØÿÿþ¦ ÿþ)ÿÿþ/ þ`ÿÿý‡ýˆÿÿþ_ ÿþæþŠÿÿþÎ ýêÿÿþþ„ÿÿýé úæ³€Mýçÿÿþm þ~ÿÿýÂýÄÿÿþ|þLÿÿýø ýéÿÿþ3 þ4ÿÿýèþ­ÿÿþª þNÿÿþÀ þÀÿÿþLýúÿÿþI þ¢ÿÿþb þcÿÿþ¡þoÿÿýå þæÿÿýþ þÿÿþåþÐÿÿþ‡ þ$ÿÿþÕþÖÿÿþ$þ1ÿÿþ& þVÿÿþ¡þ¢ÿÿþUþ’ÿÿþÄ þƒÿÿþwþxÿÿþþìÿÿþc þ¥ÿÿþTþTÿÿþ£ÿýõ þÃÿÿþ9þ:ÿÿþÁÿþ¡ þØÿÿþ#þ#ÿÿþÖÿþ? þéÿÿþþÿÿþèÿýÝ þõÿÿþ þ ÿÿþôÿþ}þûÿÿþþÿÿþùÿýýÿþþÿÿþþÿþ»þûÿÿþþÿÿþúÿþYþõÿÿþþ ÿÿþôüÿïþêÿÿþþÿÿþèýÿ—þØÿÿþ"þ#ÿÿþÖýÿ6þÃÿÿþ9þ:ÿÿþÂþÔþ¥ÿÿþSþTÿÿþ£þsþƒÿÿþwþxÿÿþ‚þþWÿÿþ¡þ¢ÿÿþU"þ%ÿÿþÕþÕÿÿþ$#þæÿÿýþ ýþÿÿþæ$þ£ÿÿþb þbÿÿþ¢$þOÿÿþ¿ þÀÿÿþM$ýêÿÿþ3 þ4ÿÿýé%þ€ÿÿýÂýÃÿÿþ~&ýëÿÿþþƒÿÿýë'þcÿÿý†ý‡ÿÿþb)þ«ÿÿ÷Öh%&j×ÿÿþ© ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØRÿóD‘ÆêùùêÆ‘CW2LÍ!ò@v©Óæùóâѧn2û[Æ÷ÿÿû [ªñÿ ÿüÏd ÿü2—ñÿÿýÒ0 ÿÿýú] ÿÿõâ“R% 9xÚÿÿýüT û³€MÿÿÿûþµDüeõÿÿý÷! ÿÿý¼3 ý0ðÿÿþ± ÿüÿæVþIÿÿþ* ÿý¨þµÿÿþz ÿ&þXÿÿþ¿ ÿ&þÿÿþÜ ÿ&þÿÿþô ÿ&þ ÿÿþô ÿ&þ4ÿÿþß ÿ&þyÿÿþÅ ÿ%ýÚÿÿþ‰ ÿ%þ\ÿÿþF ÿ$ýåÿÿýæ ÿ$þ¨ÿÿþr ÿ#þkÿÿýÛ ÿ"ýBúÿÿýþ?ÿ!ý)îÿÿþ†ÿ ýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8ÿý©ÿÿýõ>ÿý£ÿÿýøEÿýÿÿýúMÿþ•ÿÿýüUÿþÿÿýþ^ÿþ…ÿÿþgÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ˆ2LÍð.e’¶ØêöúëÜÁ[,û$lµóÿ ÿüø¨6þLÿÿÿüý•ýåÿÿÿýÏþ ÿÿÿóÞg5 5g·üÿÿýÔ þJÿÿÿüå‡4 ý'Àÿÿþýäÿÿþ¯ÿÿüÉZ ý«ÿÿýü!þÿÿýïÿÿý ãÿÿþwþGÿÿýdÿÿþtÿÿþÁýâÿÿü½ÿÿþ,ÿÿþàþšÿÿûõ"ÿÿþÿÿþøþDÿÿþsÿþ ÿÿþòý àÿÿýÊÿþ#ÿÿþØþ—ÿÿýú-ÿþeÿÿþ¡ýAþÿÿþ‚ÿýÑÿÿþJý ÞÿÿýÕÿþ‹ÿÿýÏþ”ÿÿýý8ÿý¢ÿÿýö1ý?þÿÿþ‘ÿù*Z¢ôÿÿýôIý Üÿÿýß ÿ ÿýÅ*þ‘ÿÿþFÿ ÿý¬Eý<ýÿÿþ ÿ ÿüö¯>ý Úÿÿýèÿ ÿý± þŽÿÿþTÿù 4i®ûÿÿýà ý9ýÿÿþ¯ ÿý¦ÿÿý× ýØÿÿýï ÿýcþÿÿþþ‹ÿÿþc ÿþzÿÿýøý7üÿÿþ½ ÿýØÿÿþsþÖÿÿýõ" ÿþwÿÿþ³ÿþr ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿý¼5ý†ÿÿþzÿÿü´U ý5ÅÿÿýÑÿÿòò¯}K($OÒÿÿýåÿÿýÒ!ÿÿüø}ÿû'vÃúÿ ÿüàÿï ?vŸÃáïúøêÛÉj5l2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿý)Îÿÿ ÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿ ý;øÿÿý°!û‰õÿþ) ýãÿÿþo ý±þŠ þžÿÿþr+ýçý0ýÿÿþ½,ýLÿþ®ÿÿýú%,ý­ÿý üÿÿþ­,üúÿþ{ÿÿþJ,üoÿÿþÏÿÿýñ,üÐÿÿýþÿÿþº,þ1ÿÿþPÿÿþó \¤ÔòûëÕ¹x1þ’ÿÿþ€ÿÿúRzïÿÿýÎHýìÿÿþ©ÿÿü7"Ðÿ ÿý° þTÿÿþÈÿÿýBæÿÿýÍþ¶ÿÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊýüÿÿþðÿÿý~ýÿÿþþxÿÿþÝþùÿÿþuþvÿÿþ.þØÿÿþ}þþÿÿþº þ¼ÿÿþ¢þ:ÿÿýýþûÿÿþ* þ,ÿÿýúþ›ÿÿþ»þõÿÿþÆ þÇÿÿþUý ñÿÿþYþêÿÿþw þxÿÿþ“þ]ÿÿýïþ×ÿÿþD þFÿÿþÆþ¾ÿÿþ—þÁÿÿþ þÿÿþÛý þÿÿþ6þ¢ÿÿþ þÿÿþíþ€ÿÿþÔþÿþ€ÿÿþ þÿÿþûýßÿÿþsþÿþQÿÿþ þÿÿþìþCÿÿýûþÿþÿÿþ þÿÿþÙþ¤ÿÿþ±þÿþÞÿÿþD þFÿÿþÂýöÿÿþP þ—ÿÿþx þyÿÿþ‹þfÿÿýé þ@ÿÿþÇ þÉÿÿþLþÇÿÿþ ýÝÿÿþ+ þ,ÿÿýôþ(ÿÿþ, þjÿÿþ» þ¼ÿÿþþ‰ÿÿþËýÛÿÿþuþvÿÿýúýæÿÿþjýEþÿÿý~ýÿÿþsþKÿÿý÷þ„ÿÿ÷Óm( (mÓÿÿþ±þ¬ÿÿþ§ýšÿÿýµ ýùÿÿþFýyüÿ ÿüþ”þnÿÿýãý.¸ÿ ÿý¼4þÏÿÿþ„ô'xµÞôûêÔ´o&c2LÍ@ÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿÿþ/ýäÿÿþ¯ÿÿÿþÎþÿÿýïÿÿÿþmþGÿÿýdÿÿÿýøýâÿÿü½ÿÿÿþªþšÿÿûõ"ÿÿÿþIþDÿÿþsÿÿýåý àÿÿýÊÿÿþ‡þ—ÿÿýú-ÿÿþ&ýAþÿÿþ‚ÿýÿÄý ÞÿÿýÕÿýÿcþ”ÿÿýý8ÿýõ ý?þÿÿþ‘ÿþ¡ý Üÿÿýß ÿþ?þ‘ÿÿþFÿþý<ýÿÿþ ÿ*ý Úÿÿýèÿ*þŽÿÿþTÿ)ý9ýÿÿþ¯ ÿ(ýØÿÿýï ÿ(þ‹ÿÿþc ÿ'ý7üÿÿþ½ ÿ'þÖÿÿýõ" ÿ'ÿþr ÿ'ÿ!ÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ™€2€L€Í€2LÍÄÿù%[Æ÷ÿÿ ÿ úO…ºïÿÿ ÿþë ÿ ÿþ ÿþ)ÿÿþ/ ÿúæ³€MÿÿþŠÿÿþÎ úæ³€MÿýçÿÿþmÿþLÿÿýøÿþ­ÿÿþªÿýúÿÿþIÿþoÿÿýåÿþÐÿÿþ‡ÿþ1ÿÿþ&ÿþ’ÿÿþÄÿýìÿÿþcÿþTÿÿýõ ÿþ¶ÿÿþ¡ÿýüÿÿþ?ÿþxÿÿýÝÿþØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþË ÿýæÿÿþj ÿþKÿÿý÷ ÿþ¬ÿÿþ§ÿ ýùÿÿþFÿ þnÿÿýãÿ þÏÿÿþ„ÿ2LÍ”ó%þÆÿÿþ þ‡ÿÿþÃ&ý*óÿÿýý •ÿÿýñ''ýBòÿÿõç…CFŠëÿÿýñ>û*Zý&ÃÿÿýÂ$ÿüD¦þÿÿüþ¥Cÿü'›íÿ ÿüí›'ÿüüÿÿüü‘ÿ ý ÆÿÿõãƒD E„äÿÿýÆ û 4i ý¼ÿÿüùqütúÿÿý¼$þpÿÿýø= ý@ùÿÿþo#ý ïÿÿþc þfÿÿýî "þaÿÿýÓ ýÔÿÿþa"þ§ÿÿþsþuÿÿþ¦"þÚÿÿþ1þ3ÿÿþÙ"þñÿÿþþÿÿþð"þûÿÿþþÿÿþú"þêÿÿþþÿÿþé"þÖÿÿþ1þ3ÿÿþÕ"þ³ÿÿþsþwÿÿþ³"þpÿÿýÒ ý×ÿÿþo"þ)ÿÿþc þlÿÿþ)#þ·ÿÿý÷= ýFúÿÿþ¶ý¼5ý2þÿÿüùpüxûÿÿýþ1ÿü´U ÿ þyÿÿõâ‚C E…æÿÿþxÿñò¯}K($Oÿÿ þ”ÿÿþ“ ÿ ý_òÿÿýò_ ÿüŠíÿ ÿüíŠ û'vÃúÿ ÿñ Jƒ¹×èøøè×¹ƒJ ò ?vŸÃáïúøêÛÉ¿2LÍ€ü[ò@v©Óæùóâѧn2ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ý·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTý'Àÿÿþ ÿûþµDüeõÿÿý÷!ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßþAýÑÿÿþJþyÿÿþÅý Þþ‹ÿÿýÏýÚÿÿþ‰ú”ÿ¢ÿÿýö1þ\ÿÿþF ú?þÿ¢ôÿÿýôIýåÿÿýæ ý ÜÿÿýÅ*þ¨ÿÿþr þ‘ÿÿý¬EþkÿÿýÛ ý<ýÿÿüö¯>ýBúÿÿýþ? ý Úÿÿþèÿÿý±ý)îÿÿþ† þŽÿÿüT®ûÿÿýàýâÿÿý¼ ý9ýÿÿú¯¦ÿÿý× ýÙÿÿýË ýØÿÿýïýcþÿÿþýÒÿÿýÓ þ‹ÿÿþcþzÿÿýøýËÿÿýÚ ý7üÿÿþ½ýØÿÿþsý ÆÿÿýàþÖÿÿýõ"þwÿÿþ³ý Áÿÿýä"ÿþrþ0ÿÿþàý¼ÿÿýè'ÿþÿÿþôý¸ÿÿýì,ÿþÿÿþû ý³ÿÿýï1ÿþÿÿþî ý®ÿÿýó8ÿþ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^"ý5ÅÿÿýÑþ…ÿÿþg"þÒÿÿýå ÿþ8ÿýÒ! ÿþ8ÿüø} ÿþ8ÿüà ÿþ8üj5ü2Lͧó7€·Þñüñß¶†AþLÿÿübÖÿ ÿüð—2ýåÿÿý)Îÿÿþ ÿÿýPõÿÿþJÿÿýVüÿÿôø´g1.k²úÿÿýäÿÿþ¯ÿÿý;øÿÿý°!û‰õÿ þÿÿýïÿÿýãÿÿþo ý± þGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñþþÿÿþ‚ÿ ýþÿÿþºÿýÕÿ þPÿÿþó \¤ÔòûëÕ¹x1 ÿýý8ÿ þ€ÿÿúRzïÿÿýÎH ÿþ‘ÿ þ©ÿÿü7"Ðÿ ÿý° üÿß ÿ þÈÿÿýBæÿÿýÍ ýÿFÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþ ÿ þðÿÿý~ýÿÿþþÿ þùÿÿþuþvÿÿþ.ÿ þþÿÿþº þ¼ÿÿþ¢ÿ þûÿÿþ* þ,ÿÿýúÿ þõÿÿþÆ þÇÿÿþUÿ þêÿÿþw þxÿÿþ“ÿ þ×ÿÿþD þFÿÿþÆÿ þÁÿÿþ þÿÿþÛÿ þ¢ÿÿþ þÿÿþíÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿ þ—ÿÿþx þyÿÿþ‹ÿ þ@ÿÿþÇ þÉÿÿþLÿ ýÝÿÿþ+ þ,ÿÿýôÿþjÿÿþ» þ¼ÿÿþÿýÛÿÿþuþvÿÿýúÿýEþÿÿý~ýÿÿþsÿþ„ÿÿ÷Óm( (mÓÿÿþ±ÿýšÿÿýµ ÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ï2L͈ô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿ ýúÿÿýœý ÿÿýØ úæ³€Mÿ þÿÿýÑ ýÕÿÿþfÿ ýôÿÿþ> þAÿÿýÚÿ þMÿÿþÓ þÖÿÿþ=ÿ þŒÿÿþ þÿÿþ•ÿ þÃÿÿþI þKÿÿþÜÿ þÚÿÿþ þ!ÿÿþÿ þíÿÿþ þÿÿþOÿ þûÿÿþ þÿÿþ}ÿ þïÿÿþ þÿÿþŸÿ þÝÿÿþ þ ÿÿþ¿ÿ þÉÿÿþH þJÿÿþÔÿ þ—ÿÿþ~ þÿÿþçÿ þYÿÿþÑ þÓÿÿþôÿ ýüÿÿþ: þ=ÿÿþùÿ þ©ÿÿýÎ ýÑÿÿþþÿ þ5ÿÿþ•ý™ÿÿþøÿ þ›ÿÿý£ý¥ÿÿþðÿ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿ ýÕÿÿýèDÿÿþÇÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿó4{»×ìüòÖ¥^ þ‚ÿÿþPÿ þ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ ý± þlÿÿýåÿ ûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØeÿóB†·ßñüóß¹ƒ:î2LÍò@v©Óæùóâѧn2ð.e’¶ØêöúëÜÁ[ û [ªñÿ ÿüÏdû$lµóÿ ÿýø¨ü2—ñÿÿýÒ0 ÿÿýú] ÿÿõâ“R% 9xÚÿÿýüT ÿñÞg5 5g·üÿÿÿûþµDüeõÿÿý÷! ÿüå‡4 ü'Àÿÿý¼3 ý0ðÿÿþ± üÉZ ý«üÿæVþIÿÿþ*þ ý¨þµÿÿþz8þXÿÿþ¿8þÿÿþÜ8þÿÿþô8þ ÿÿþô8þ4ÿÿþß8þyÿÿþÅþýÚÿÿþ‰þ‹þ\ÿÿþFü¢ÿýåÿÿýæ÷*Z¢ôÿÿþ¨ÿÿþr ÿþkÿÿýÛ ÿþ¬ýBúÿÿýþ? ÿþöý)îÿÿþ† ÿýâÿÿý¼÷ 4i®ûÿÿýÙÿÿýË ü¦ÿýÒÿÿýÓ þcýËÿÿýÚ4ý Æÿÿýà4ý Áÿÿýä"4ý¼ÿÿýè'4ý¸ÿÿýì,4ý³ÿÿýï14ý®ÿÿýó84ý©ÿÿýõ>4ý£ÿÿýøE4ýÿÿýúM5þ•ÿÿýüU5þÿÿýþ^ý¼5ý†þ…ÿÿþgÿü´U ü5Åÿÿþ8ÿòò¯}K($OÒÿÿÿþ8ÿÿþ8ÿÿþ8û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5À2Lͼú%n³Ó6þLÿÿý3¼ÿÿüý•ýåÿÿü“þÿÿýÏþ ÿÿý µÿÿýÔ þJÿÿý²ÿÿüì‹=ÿÿþýäÿÿþ¯ÿÿþtÿÿû¨ÿÿýü!þÿÿýïÿÿ ýúÿÿýœþãÿÿþwþGÿÿýdÿÿ þÿÿýÑþtÿÿþÁýâÿÿü½ÿÿ ýôÿÿþ>þ,ÿÿþàþšÿÿûõ"ÿÿ þMÿÿþÓþÿÿþøþDÿÿþsÿ þŒÿÿþþ ÿÿþòý àÿÿýÊÿ þÃÿÿþIþ#ÿÿþØþ—ÿÿýú-ÿ þÚÿÿþþeÿÿþ¡ýAþÿÿþ‚ÿ þíÿÿþþÑÿÿþJý ÞÿÿýÕÿ þûÿÿþÿýÏþ”ÿÿýý8ÿ þïÿÿþÿýö1ý?þÿÿþ‘ÿ þÝÿÿþÿýôIý Üÿÿýß ÿ þÉÿÿþHüÿÅ*þ‘ÿÿþFÿ þ—ÿÿþ~þEý<ýÿÿþ ÿ þYÿÿþÑý¯>ý Úÿÿýèÿ ýüÿÿþ:ÿý± þŽÿÿþTÿ þ©ÿÿýÎÿýà ý9ýÿÿþ¯ ÿ þ5ÿÿþ•ÿý× ýØÿÿýï ÿþ›ÿÿú£þÿÿþþ‹ÿÿþc ÿý Òÿÿûëˆ;zÿÿýøý7üÿÿþ½ ÿýÕÿÿýØÿÿþsþÖÿÿýõ" ÿý¸ÿÿýwÿÿþ³ÿþr ÿýNÒÿÿý0ÿÿþàÿ ø4{»×ÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿÿþzÿý±ÿýÑÿûÿô‡ÿýåÿÿõú°i.ÿÿÒ!ÿÿüø}ÿÿþÿü3˜ðÿÿ8øB†·ßñü¿2LÍ€øéûòÝ´v&ò@v©Óæùóâѧn2ÿüþ·-û [ªñÿ ÿüÏdÿýûw ü2—ñÿÿýÒ0ýOÿÿþ— ÿýú] ÿù=Œíÿÿþ€ ÿõâ“R% 9xÚÿÿýüT ÿý«ÿÿýýB ÿûþµDüeõÿÿý÷! ÿý ÿÿýØÿý¼3 ý0ðÿÿþ± ýæ³ýÕÿÿþfüÿæVþIÿÿþ*þAÿÿýÚý¨þµÿÿþzþÖÿÿþ=þXÿÿþ¿þÿÿþ•þÿÿþÜþKÿÿþÜþÿÿþôþ!ÿÿþþ ÿÿþôþÿÿþOþ4ÿÿþßþÿÿþ}þyÿÿþÅþÿÿþŸýÚÿÿþ‰þ ÿÿþ¿þ\ÿÿþFþJÿÿþÔýåÿÿýæþÿÿþçþ¨ÿÿþrþÓÿÿþôþkÿÿýÛþ=ÿÿþùýBúÿÿýþ?ýÑÿÿþþý)îÿÿþ†ý™ÿÿþøýâÿÿý¼ý¥ÿÿþðýÙÿÿýË ù;‰ëÿÿþÞÿÿþßýÒÿÿýÓÿýèDÿÿþÇýËÿÿýÚÿüÓ$8ÿÿþ©ý Æÿÿýàÿúð~ Sÿÿþý Áÿÿýä"øìüòÖ¥^ þ‚ÿÿþPý¼ÿÿýè'þ»ÿÿþ ý¸ÿÿýì,ýñÿÿþÐ ý³ÿÿýï1 þJÿÿþ| ý®ÿÿýó8!þ®ÿÿýý! ý©ÿÿýõ>!ý$úÿÿþ° ý£ÿÿýøE"þ¼ÿÿýþ2 ýÿÿýúM"þpÿÿþ¡ þ•ÿÿýüU"þlÿÿýå þÿÿýþ^!ý¬ÿÿýù> þ…ÿÿþgú/d±÷ÿÿýüZ ÿþ8 ÿýöT ÿþ8 ÿýÑ- ÿþ8 ÿüØeÿþ8 ùÿóß¹ƒ:ú2Lͤð.e’¶ØêöúëÜÁ[ ù%[Æ÷ÿÿû$lµóÿ ÿüø¨6 ü…ºïÿÿÿüý• ÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿúæ³€Mÿÿÿüå‡4 ý'Àÿÿþü€MÿüÉZ ý«ÿÿýü! ÿ%ý ãÿÿþw ÿ&þtÿÿþÁ ÿ&þ,ÿÿþà ÿ&þÿÿþø ÿ&þ ÿÿþò ÿ&þ#ÿÿþØ ÿ&þeÿÿþ¡ ÿ%ýÑÿÿþJ ÿ%þ‹ÿÿýÏ ÿ#ý¢ÿÿýö1 ÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿýà ÿ#ý¦ÿÿý× ÿ%ýcþÿÿþ ÿ&þzÿÿýø ÿ&ýØÿÿþs ÿ'þwÿÿþ³ ÿ'þ0ÿÿþà ÿ'þÿÿþô ÿ'þÿÿþû ÿ'þÿÿþî ÿ'þ=ÿÿþÏ ÿ'þˆÿÿþŸ ÿ&ý çÿÿþY ÿ&þ–ÿÿýï ÿý¼5ý†ÿÿþz ÿÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5Ì2Lͳó7€·Þñüñß¶†AþLÿÿübÖÿ ÿýð—ýåÿÿý)Îÿ ÿþ ÿÿýPõÿÿþJÿÿýVüÿÿòø´g1.k²úÿÿýäÿÿþ¯ÿÿý;øÿÿý°!ü‰õþÿÿýïÿÿýãÿÿþo þ þGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñýAþÿÿþ‚ÿ ýþÿÿþºý ÞÿÿýÕÿ þPÿÿþó \¤ÔòûëÕ¹x1 þ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿýÎH ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿ ÿý° ý Üÿÿýß ÿ þÈÿÿýBæÿÿþÍþ‘ÿÿþFÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿý<ýÿÿþ ÿ þðÿÿý~ýÿÿý Úÿÿýèÿ þùÿÿþuþvÿÿþŽÿÿþTÿ þþÿÿþº ü¼ÿÿý9ýÿÿþ¯ ÿ þûÿÿþ* ü,ÿÿýØÿÿýï ÿ þõÿÿþÆ ýÇÿþ‹ÿÿþc ÿ þêÿÿþw ýxÿý7üÿÿþ½ ÿ þ×ÿÿþD ýFÿþÖÿÿýõ" ÿ þÁÿÿþ ýÿÿþr ÿ þ¢ÿÿþ ýÿÿþ€ÿÿþ ýÿÿþQÿÿþ ýÿÿþÿÿþ ýÿÿþÞÿÿþD ýFÿÿ þ—ÿÿþx ýyÿÿ þ@ÿÿþÇ ýÉÿÿ ýÝÿÿþ+ ü,ÿÿÿþjÿÿþ» ü¼ÿÿÿýÛÿÿþuþvÿÿÿýEþÿÿý~ýÿÿÿþ„ÿÿ÷Óm( (mÓÿÿÿýšÿÿþµÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ã2LÍ”ô%n³ÓéûòÝ´v&þ2ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿþ± ýúÿÿýœý ÿÿýØ úæ³€Mÿ þÿÿýÑ ýÕÿÿþfÿ ýôÿÿþ> þAÿÿýÚÿ þMÿÿþÓ þÖÿÿþ=ÿ þŒÿÿþ þÿÿþ•ÿ þÃÿÿþI þKÿÿþÜÿ þÚÿÿþ þ!ÿÿþÿ þíÿÿþ þÿÿþOÿ þûÿÿþ þÿÿþ}ÿ þïÿÿþ þÿÿþŸÿ þÝÿÿþ þ ÿÿþ¿ÿþ þÉÿÿþH þJÿÿþÔÿýÊþ—ÿÿþ~ þÿÿþçÿþþYÿÿþÑ þÓÿÿþôÿþ.ýüÿÿþ: þ=ÿÿþùÿþ¢þ©ÿÿýÎ ýÑÿÿþþÿýúþ5ÿÿþ•ý™ÿÿþøÿþUþ›ÿÿý£ý¥ÿÿþðÿþ“ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿþÆ ýÕÿÿýèDÿÿþÇÿþÛ ý¸ÿ ÿüÓ$8ÿÿþ©ÿþí ýNÒÿÿúð~ Sÿÿþÿþû ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿþìþ»ÿÿþÿþÙýñÿÿþÐÿþÂþJÿÿþ|ÿþ‹þ®ÿÿýý!ÿþLý$úÿÿþ°ÿýôþ¼ÿÿýþ2ÿþþpÿÿþ¡ÿýú ý± þlÿÿýåÿþs ûÿô‡ý¬ÿÿýù>ÿþ± ÿôú°i./d±÷ÿÿýüZ ÿþ ÿýöT ÿÿýÑ- ÿü3˜ðÿ ÿüØe ÿóB†·ßñüóß¹ƒ:â2L͘ð.e’¶ØêöúëÜÁ[û@vÿû$lµóÿ ÿüø¨6û [ªñÿÿÿüý• ü2—ñÿÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿýâÿÿüå‡4 ý'Àÿÿþ ÿúþµDÿüÉZ ý«ÿÿýü!ÿý¼3þÿ$ý ãÿÿþwüÿæVþÿ%þtÿÿþÁý¨þÿ%þ,ÿÿþàþÿ%þÿÿþøþÿ%þ ÿÿþòþÿ%þ#ÿÿþØþÿ%þeÿÿþ¡þÿ$ýÑÿÿþJþÿ$þ‹ÿÿýÏþÿ"ý¢ÿÿýö1þÿù*Z¢ôÿÿýôIþÿ ÿýÅ*þÿ ÿý¬Eþÿ ÿüö¯>þÿÿý±þÿù 4i®ûÿÿýàþÿ"ý¦ÿÿý× þÿ$ýcþÿÿþþÿ%þzÿÿýøþÿ%ýØÿÿþsþÿ&þwÿÿþ³þÿ&þ0ÿÿþàþÿ&þÿÿþôýÿ&þÿÿþû ü³ÿ&þÿÿþî û®ÿÿ&þ=ÿÿþÏ ý©ÿÿ'þˆÿÿþŸ ý£ÿÿ&ý çÿÿþY ýÿÿ&þ–ÿÿýï þ•ÿÿý¼5ý†ÿÿþz þÿÿýþÿÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5Ø2LÍ€õ©Óæùóâѧn2ó7€·Þñüñß¶†A ÿüÏdübÖÿ ÿüð—2 ÿýÒ0ý)Îÿÿ ÿýú]ýPõÿÿ ö“R% 9xÚÿÿýüTýVüÿÿôø´g1.k²úÿÿüeõÿÿý÷! ý;øÿÿý°!û‰õÿý0ðÿÿþ± ýãÿÿþo ý±þIÿÿþ* þžÿÿþr%þµÿÿþz ý0ýÿÿþ½&þXÿÿþ¿ þ®ÿÿýú%&þÿÿþÜ ý üÿÿþ­'þÿÿþô þ{ÿÿþJ'þ ÿÿþô þÏÿÿýñ'þ4ÿÿþßýþÿÿþº(þyÿÿþÅþPÿÿþó \¤ÔòûëÕ¹x1ýÚÿÿþ‰þ€ÿÿúRzïÿÿýÎHþ\ÿÿþFþ©ÿÿü7"Ðÿ ÿý° ýåÿÿýæþÈÿÿýBæÿÿýÍþ¨ÿÿþr þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþkÿÿýÛ þðÿÿý~ýÿÿþýBúÿÿýþ? þùÿÿþuþvÿÿþ.ý)îÿÿþ† þþÿÿþº þ¼ÿÿþ¢ ýâÿÿý¼ þûÿÿþ* þ,ÿÿýú ýÙÿÿýË þõÿÿþÆ þÇÿÿþU ýÒÿÿýÓ þêÿÿþw þxÿÿþ“ ýËÿÿýÚþ×ÿÿþD þFÿÿþÆú7 ÆÿÿýàþÁÿÿþ þÿÿþÛûÖ Áÿÿýä"þ¢ÿÿþ þÿÿþíüÿ¼ÿÿýè'þ€ÿÿþ þÿÿþûýÿ¸ÿÿýì,þQÿÿþ þÿÿþìÿýï1þÿÿþ þÿÿþÙÿýó8þÞÿÿþD þFÿÿþÂÿýõ>þ—ÿÿþx þyÿÿþ‹ÿýøEþ@ÿÿþÇ þÉÿÿþLüÿúMýÝÿÿþ+ þ,ÿÿýôýüUþjÿÿþ» þ¼ÿÿþþ^ýÛÿÿþuþvÿÿýú&ýEþÿÿý~ýÿÿþsÿþ8 þ„ÿÿ÷Óm( (mÓÿÿþ± ÿþ8 ýšÿÿýµ ÿþ8 ýyüÿ ÿüþ” ÿþ8ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ï2Lͬô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿýýB þÿÿýïÿÿ ýúÿÿýœý ÿÿýØ þGÿÿýdÿÿ þÿÿýÑ ýÕÿÿþf ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿýÚ þšÿÿûõ"ÿÿ þMÿÿþÓ þÖÿÿþ=þDÿÿþsÿ þŒÿÿþ þÿÿþ•ý àÿÿýÊÿ þÃÿÿþI þKÿÿþÜþ—ÿÿýú-ÿ þÚÿÿþ þ!ÿÿþýAþÿÿþ‚ÿ þíÿÿþ þÿÿþOý ÞÿÿýÕÿ þûÿÿþ þÿÿþ}þ”ÿÿýý8ÿ þïÿÿþ þÿÿþŸý?þÿÿþ‘ÿ þÝÿÿþ þ ÿÿþ¿ý Üÿÿýß ÿ þÉÿÿþH þJÿÿþÔþ‘ÿÿþFÿ þ—ÿÿþ~ þÿÿþçý<ýÿÿþ ÿ þYÿÿþÑ þÓÿÿúô Úÿÿýèÿ ýüÿÿþ: þ=ÿÿûùŽÿÿþTÿ þ©ÿÿýÎ ýÑÿÿûþ9ýÿÿþ¯ ÿ þ5ÿÿþ•ý™ÿÿüøØÿÿýï ÿþ›ÿÿý£ý¥ÿÿýð‹ÿÿþc ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿýßüÿÿþ½ ÿýÕÿÿýèDÿÿþÇÿÿýõ" ÿý¸ÿ ÿüÓ$8ÿÿþ©ÿÿþr ÿýNÒÿÿúð~ Sÿÿþÿÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿÿþ»ÿÿþÿÿýñÿÿýÐÿÿþJÿÿþ|ÿ!þ®ÿÿýý!ÿ ý$úÿÿþ°ÿ þ¼ÿÿýþ2ÿþpÿÿþ¡ÿý± þlÿÿýåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Ê2LÍ·ö7€·Þñüñß¶ ù%[Æ÷ÿÿübÖÿÿ úO…ºïÿÿý)Îÿ ÿ ÿýPõÿ ÿ ÿýVüÿÿöø´g1.kÿúæ³€Mÿÿý;øÿÿý°!úæ³€Mÿýãÿÿþoÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþº ÿþPÿÿþô \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿÿþ©ÿÿü7"Ðÿ ÿÿþÈÿÿýBæÿ ÿÿþàÿÿþÝÿÿöÓn( (nÓÿÿþðÿÿý~ýÿþùÿÿþuÿþþÿÿþºÿþûÿÿþ*ÿþõÿÿþÆÿþêÿÿþwÿþ×ÿÿþDÿþÁÿÿþÿþ¢ÿÿþÿþ€ÿÿþÿþQÿÿþÿþÿÿþÿþÞÿÿþDÿþ—ÿÿþxÿþ@ÿÿþÇÿýÝÿÿþ+ÿþjÿÿþ»ÿýÛÿÿþuÿýEþÿÿý~ý ÿ þ„ÿÿöÓm( (mÓÿ ÿ ýšÿ ÿ ÿýyüÿ ÿ ÿý.¸ÿ ÿ4ô'xµÞôûêÔ´o&¿2LÍ€ü†Að.e’¶ØêöúëÜÁ[ó@v©Óæùÿÿð—2 û$lµóÿ ÿüø¨6û [ªñÿ ÿ ÿüý• ü2—ñÿ ÿ ÿýÏ ÿý²úÿÿ ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% ‰õÿ ÿüå‡4 ý'Àÿÿþ ÿûþµDý± üÉZ ý«ÿÿýü!ÿý¼3(ý ãÿÿþwüÿæV+þtÿÿþÁý¨,þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡þ ýÑÿÿþJýÎHþ‹ÿÿýÏÿý° ý¢ÿÿýö1ÿýÍù*Z¢ôÿÿýôIÿýÊ ÿýÅ*ÿþ ÿý¬Eþvÿÿþ. ÿüö¯>þ¼ÿÿþ¢ÿý±þ,ÿÿýúù 4i®ûÿÿýàþÇÿÿþUý¦ÿÿý× þxÿÿþ“ýcþÿÿþþFÿÿþÆþzÿÿýøûÿÿþÛýØÿÿþsú Æÿÿþíþwÿÿþ³ù Áÿÿÿþûþ0ÿÿþàø¼ÿÿÿÿþìþÿÿþôý¸ÿÿþÿÿþÙþÿÿþû ý³ÿÿþFÿÿþÂþÿÿþî ý®ÿÿþyÿÿþ‹þ=ÿÿþÏ ý©ÿÿûõÉÿÿþLþˆÿÿþŸ ý£ÿÿûøE,ÿÿýôý çÿÿþY ýÿÿúúM¼ÿÿþþ–ÿÿýï þ•ÿÿúüUvÿÿýúý¼5ý†ÿÿþz þÿÿýþ^ÿþsÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿþ± ÿòò¯}K($OÒÿÿýå ÿýµ ÿýÒ! ÿüþ” ÿüø} ÿý¼4 û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5Ü2LÍ€ùóâѧn28ÿüÏdþLÿÿÿýÒ0ýåÿÿÿýú]þ ÿÿù:9xÚÿÿýüTþJÿÿý$ñüeõÿÿý÷!ýäÿÿþ¯ÿÿý¶ÿý0ðÿÿþ±þÿÿýïÿÿ ü8ÿÿþIÿÿþ*þGÿÿýdÿÿ ü‹ÿÿþµÿÿþzýâÿÿü½ÿÿ üÌÿÿþXÿÿþ¿þšÿÿûõ"ÿÿ üæÿÿþÿÿþÜþDÿÿþsÿ üúÿÿþÿÿþôý àÿÿýÊÿ üðÿÿþ ÿÿþôþ—ÿÿýú-ÿ üÓÿÿþ4ÿÿþßýAþÿÿþ‚ÿ üšÿÿþyÿÿþÅý ÞÿÿýÕÿ üAÿÿýÚÿÿþ‰þ”ÿÿýý8ÿýÆÿþ\ÿÿþF ý?þÿÿþ‘ÿý*óýåÿÿýæ ý Üÿÿýß ÿþBþ¨ÿÿþr þ‘ÿÿþFÿþkÿÿýÛ ý<ýÿÿþ ÿýBúÿÿýþ? ý Úÿÿýèÿý)îÿÿþ† þŽÿÿþTÿúâÿÿý¼ ý9ýÿÿþ¯ ÿú ÆÙÿÿýË ýØÿÿýï ÿ ú¼ÿÒÿÿýÓ þ‹ÿÿþc ÿ ûpÿÿËÿÿýÚ ý7üÿÿþ½ ÿ ý ïÿÿýàþÖÿÿýõ" ÿ þaÿÿýä"ÿþr ÿ þ§ÿÿýè'ÿþÚÿÿýì,ÿþñÿÿýï1ÿþûÿÿýó8ÿþêÿÿþ>'ÿ þÖÿÿ)ÿ þ³ÿÿ)ÿ þpÿÿ)ÿ þ)ÿÿ)ÿ ü·ÿÿ(ÿ ý2þÿ ÿþ8ÿþyÿ ÿþ8ÿþ”ÿ ÿþ8ÿ ÿþ8ÿ2LÍ„óþ’ÿÿþÄÿþ þ‡ÿÿþÃýìÿÿþcÿýý •ÿÿýñ'þTÿÿýõ þòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ý&ÃÿÿýÂ$ýüÿÿþ? üD¦þÿÿüþ¥CþxÿÿýÝ ü'›íÿ ÿüí›'þØÿÿþ} ýüÿÿüü‘þ:ÿÿýý ÿõãƒD E„äÿÿýÆ þ›ÿÿþ» ÿüùqütúÿÿý¼ý ñÿÿþY ÿýø= ý@ùÿÿþoþ]ÿÿýï ÿþc þfÿÿýî þ¾ÿÿþ— üÿÓ ýÔÿÿþaý þÿÿþ6 ýÿsþuÿÿþ¦þ€ÿÿþÔ ýÿ1þ3ÿÿþÙýßÿÿþs ýÿþÿÿþðþCÿÿýû ýÿþÿÿþúþ¤ÿÿþ±ýÿþÿÿþéýöÿÿþPýÿ1þ3ÿÿþÕþfÿÿýéýÿsþwÿÿþ³þÇÿÿþüÿÒ ý×ÿÿþoþ(ÿÿþ,ÿþc þlÿÿþ)þ‰ÿÿþËÿý÷= ýFúÿÿþ¶ýæÿÿþjÿüùpüxûÿÿýþ1þKÿÿý÷ÿõâ‚C E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ î2L͈ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿþ÷üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿý ãÿÿþwüÿæVþIÿÿþtÿÿþÁý¨þµÿÿþ,ÿÿþàþXÿÿþÿÿþøþÿÿþ ÿÿþòþÿÿþ#ÿÿþØþ ÿÿþeÿÿþ¡þ4ÿÿýÑÿÿþJþyÿÿþ‹ÿÿýÏýÚÿÿý¢ÿÿýö1þ\ÿÿù*Z¢ôÿÿýôIýåÿÿ ÿýÅ*þ¨ÿÿ ÿý¬EþkÿÿþÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5è2LÍÒù%[Æ÷ÿÿ!þL úO…ºïÿÿ ýå ÿ ý ÿ ÿûJÿÿ! ÿúæ³€Mÿÿúäÿÿ± úæ³€Mÿþÿÿþ*ÿþGÿÿþzÿýâÿÿü½ÿ¿ÿþšÿÿûõ"ÿÜÿþDÿÿûsÿôÿý àÿÿúÊÿôÿþ—ÿÿùú-ÿßÿýAþÿÿþ‚ýÿÅÿý ÞÿÿýÕýÿ‰ÿþ”ÿÿýý8ýÿFÿý?þÿÿþ‘ýæÿý Üÿÿýß þrÿþ‘ÿÿþFþÿý<ýÿÿþ ÿý ÚÿÿýèÿþŽÿÿþTÿý9ýÿÿþ¯ÿýØÿÿýïÿþ‹ÿÿþc ÿý7üÿÿþ½!ÿþÖÿÿýõ"!ÿÿþr"ÿÿÿÿÿÿÿÿÿ:ÿ:ÿ:ÿ:ÿ:ÿ"ÿþ8 ÿÿþ8 ÿÿþ8 ÿÿþ8 ÿ2LÍœô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-ÿü“þÿ ÿýûwþ)ÿÿý µÿÿþ—ýPõÿÿý²ÿÿöì‹==Œíÿÿþ€úVüÿÿ¯ÿÿþtÿÿý¨ý«ÿÿýýB ù;øÿÿïÿÿ ýúÿÿýœý ÿÿýØ ýãÿÿýdÿÿ þÿÿýÑ ýÕÿÿþf þžÿÿÿ ýôÿÿþ> þAÿÿýÚ ý0ýÿÿü½ÿÿ þMÿÿþÓ þÖÿÿþ= þ®ÿÿûú%ÿÿ þŒÿÿþ þÿÿþ•ý üÿÿþ­ÿ þÃÿÿþI þKÿÿþÜþ{ÿÿþJÿ þÚÿÿþ þ!ÿÿþþÏÿÿýñÿ þíÿÿþ þÿÿþOýþÿÿþºÿ þûÿÿþ þÿÿþ}þPÿÿþÿ þïÿÿþ þÿÿþŸþ€ÿÿúRÿÿ þÝÿÿþ þ ÿÿþ¿þ©ÿÿú7"Ðÿÿ þÉÿÿþH þJÿÿþÔþÈÿÿúBæÿÿÿ þ—ÿÿþ~ þÿÿþçþàÿÿúÝÿÿÿÿ þYÿÿþÑ þÓÿÿþôþðÿÿÿ ýüÿÿþ: þ=ÿÿþùþùÿÿÿ þ©ÿÿýÎ ýÑÿÿþþþþÿÿÿ þ5ÿÿþ•ý™ÿÿþøþûÿÿÿþ›ÿÿý£ý¥ÿÿþðþõÿÿüÆÿÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþêÿÿüwÿÿýÕÿÿýèDÿÿþÇþ×ÿÿüDÿÿý¸ÿ ÿüÓ$8ÿÿþ©þÁÿÿüÿÿýNÒÿÿúð~ Sÿÿþþ¢ÿÿþÿ ÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþ€ÿÿþÿ ÿþ»ÿÿþþQÿÿþÿ ÿýñÿÿþÐþÿÿþÿ ÿþJÿÿþ|þÞÿÿüDÿÿ!þ®ÿÿýý!þ—ÿÿüxÿÿ ý$úÿÿþ° þ@ÿÿüÇÿÿ þ¼ÿÿýþ2 ýÝÿÿÿþpÿÿþ¡ þjÿÿÿý± þlÿÿýå ýÛÿÿÿûÿô‡ý¬ÿÿýù> ýEþÿÿÿÿôú°i./d±÷ÿÿýüZþ„ÿÿÿÿýöTùšÿÿÿÿÿýÑ-ûyüÿÿü3˜ðÿ ÿüØeþ.óB†·ßñüóß¹ƒ:Ú2L̓ó7€·Þñüñß¶†Að.e’¶ØêöúëÜÁ[übÖÿ ÿüð—2 û$lµóÿ ÿüø¨6 þÎÿÿ ÿüý• ÿ ÿýÏ ÿôø´g1.k²úÿÿ ÿóÞg5 5g·üÿÿýÔ ÿý°!û‰õÿ ÿüå‡4 ý'Àÿÿþ ýÿo ý± üÉZ ý«ÿÿýü!þr,ý ãÿÿþw8þtÿÿþÁ8þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡ ó \¤ÔòûëÕ¹x1 ýÑÿÿþJýzïÿÿýÎHþ‹ÿÿýÏ ÿý° ý¢ÿÿýö1 ÿýÍù*Z¢ôÿÿýôI ÿ÷Ón( (nÓÿÿýÊ ÿýÅ* ÿý~ýÿÿþ ÿý¬E ýÿuþvÿÿþ. ÿüö¯> þº þ¼ÿÿþ¢ÿý± þ* þ,ÿÿýúù 4i®ûÿÿýàþÇÿÿþUý¦ÿÿý× þxÿÿþ“ýcþÿÿþþFÿÿþÆþzÿÿýøþÿÿþÛýØÿÿþsþÿÿþíþwÿÿþ³þÿÿþûþ0ÿÿþàþÿÿþìþÿÿþôþÿÿþÙþÿÿþûþFÿÿþÂþÿÿþîþyÿÿþ‹þ=ÿÿþÏþÉÿÿþLþˆÿÿþŸþ+ þ,ÿÿýôý çÿÿþYþ» þ¼ÿÿþþ–ÿÿýï ýÿuþvÿÿýúý¼5ý†ÿÿþzÿý~ýÿÿþsÿü´U ý5ÅÿÿýÑÿ÷Óm( (mÓÿÿþ± ÿòò¯}K($OÒÿÿýå ÿýµ ÿýÒ! ÿüþ” ÿüø} þ¸ÿ ÿý¼4 û'vÃúÿ ÿüàô'xµÞôûêÔ´o&ï ?vŸÃáïúøêÛÉj5Ð2LÍÆù%[Æ÷ÿÿ!þLÿÿúO…ºïÿÿ ýåÿÿÿ þ ÿÿÿþJÿÿÿúæ³€Mÿÿýäÿÿþ¯ÿÿúæ³€MÿþÿÿýïÿÿÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿÿÿÿÿÿÿÿ2LÍ“ó7€·Þñüñß¶†Að.e’¶ØêöúëÜÁ[übÖÿ ÿüð—2 û$lµóÿ ÿýø¨ ý)Îÿÿ ÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿñÞg5 5g·üÿÿ ý;øÿÿý°!û‰õÿ ÿüå‡4 ü'Àÿ ýãÿÿþo ý± üÉZ ý« þžÿÿþr,þ ý0ýÿÿþ½8þ®ÿÿýú%7ý üÿÿþ­8þ{ÿÿþJ8þÏÿÿýñ7ýþÿÿþº8þPÿÿþó \¤ÔòûëÕ¹x1 þþ€ÿÿúRzïÿÿýÎHþ‹þ©ÿÿü7"Ðÿ ÿý° ü¢ÿþÈÿÿýBæÿÿýÍ÷*Z¢ôÿÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿþðÿÿý~ýÿÿþ ÿþ¬þùÿÿþuþvÿÿþ. ÿþöþþÿÿþº þ¼ÿÿþ¢ ÿþûÿÿþ* þ,ÿÿýú÷ 4i®ûÿÿþõÿÿþÆ þÇÿÿþUü¦ÿþêÿÿþw þxÿÿþ“þcþ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþíþÿþ€ÿÿþ þÿÿþûþÿþQÿÿþ þÿÿþìþÿþÿÿþ þÿÿþÙþÿþÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþ%ýÛÿÿþuþvÿÿýúý¼5ý† ýEþÿÿý~ýÿÿþsÿü´U ü5Åÿ þ„ÿÿ÷Óm( (mÓÿÿþ± ÿòò¯}K($OÒÿÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 û'vÃúÿ ÿýàô'xµÞôûêÔ´o&ï ?vŸÃáïúøêÛÉj5À2LÍ•ò@v©Óæùóâѧn2þ6û [ªñÿ ÿüÏdö%[Æ÷ý• ü2—ñÿÿýÒ0úO…ºïÿÿýÏ ÿýú] ÿýÔ ÿõâ“R% 9xÚÿÿýüT ÿþ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿýü!ÿý¼3 ý0ðÿÿþ± úæ³€MþãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßþÑÿÿþJþyÿÿþÅÿýÏýÚÿÿþ‰ÿýö1þ\ÿÿþFÿýôIýåÿÿýæüÿÅ*þ¨ÿÿþrþEþkÿÿýÛý¯>ýBúÿÿýþ?ÿý±ý)îÿÿþ†ÿýàýâÿÿý¼ÿý× ýÙÿÿýË þþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU$ÿþz þÿÿýþ^%ÿýÑþ…ÿÿþg&ÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿþ ÿþ8 ÿ2LÍÀÿ!þLÿÿÿ ýåÿÿÿ þ ÿÿþ ÿÿþJÿÿý²ÿÿýäÿÿþ¯ÿÿþtÿÿþÿÿýïÿÿ ýúÿÿþGÿÿýdÿÿ þÿÿýâÿÿü½ÿÿ ýôÿÿþšÿÿûõ"ÿÿ þMÿÿþDÿÿþsÿ þŒÿÿý àÿÿýÊÿ þÃÿÿþ—ÿÿýú-ÿ þÚÿÿýAþÿÿþ‚ÿ þíÿÿý ÞÿÿýÕÿ þûÿÿþ”ÿÿýý8ÿ þïÿÿý?þÿÿþ‘ÿ þÝÿÿý Üÿÿýß ÿ þÉÿÿþ‘ÿÿþFÿ þ—ÿÿý<ýÿÿþ ÿ þYÿÿý Úÿÿýèÿ ýüÿÿþŽÿÿþTÿ þ©ÿÿý9ýÿÿþ¯ ÿ þ5ÿÿýØÿÿýï ÿþ›ÿÿþ‹ÿÿþc ÿý Òÿÿý7üÿÿþ½ ÿþÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿþ±ÿÿ$ÿÿÿÿÿÿÿÿÿþ3ÿ2LÍ„ô%n³ÓéûòÝ´v&ó þAÿÿýÚþÌÿÿþf þhÿÿþËýÿÓ þÖÿÿþ=þæÿÿþ$ þ&ÿÿþåýÿ þÿÿþ•þúÿÿþ þ ÿÿþùýÿI þKÿÿþÜþðÿÿþ þ ÿÿþïýÿ þ!ÿÿþþÓÿÿþ$ þ%ÿÿþÒýÿ þÿÿþOþšÿÿþe þgÿÿþ™ýÿ þÿÿþ}þAÿÿýÑ ýÔÿÿþ>ýÿ þÿÿþŸþÆÿÿþ þ‡ÿÿþÃýÿ þ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'ýÿH þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>ýÿ~ þÿÿþç ý&ÃÿÿýÂ$ýÿÑ þÓÿÿþô üD¦þÿÿüþ¥Cÿþ: þ=ÿÿþù ü'›íÿ ÿüí›'ÿýÎ ýÑÿÿþþ üüÿÿüü‘ÿþ•ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ÿý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼ÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþoþÕÿÿýèDÿÿþÇý ïÿÿþc þfÿÿýî ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþaýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þ þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶üô‡ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1ÿôú°i./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþxÿýöTþ”ÿÿþ“ÿýÑ-ý_òÿÿýò_ý˜ðÿ ÿüØeüŠíÿ ÿüíŠóB†·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ Ê2Lͳó7€·Þñüñß¶†AÿübÖÿ ÿýð—ÿý)Îÿ ÿÿþëýPõÿÿÿþ ýVüÿÿòø´g1.k²úÿÿþ)ÿÿþ/ ý;øÿÿý°!ü‰õþŠÿÿþÎ ýãÿÿþo þýçÿÿþm þžÿÿþr#þLÿÿýø ý0ýÿÿþ½$þ­ÿÿþª þ®ÿÿýú%#ýúÿÿþI ý üÿÿþ­$þoÿÿýå þ{ÿÿþJ$þÐÿÿþ‡ þÏÿÿýñ#þ1ÿÿþ& ýþÿÿþº$þ’ÿÿþÄ þPÿÿþó \¤ÔòûëÕ¹x1ýìÿÿþc þ€ÿÿúRzïÿÿýÎHþTÿÿýõ þ©ÿÿü7"Ðÿ ÿý° þ¶ÿÿþ¡ þÈÿÿýBæÿÿþÍýüÿÿþ? þàÿÿþÝÿÿ÷Ón( (nÓÿÿþxÿÿýÝ þðÿÿý~ýÿÿþØÿÿþ}þùÿÿþuþvÿÿþ:ÿÿýýþþÿÿþº ü¼ÿÿþ›ÿÿþ»þûÿÿþ* ü,ÿÿý ñÿÿþYþõÿÿþÆ ýÇÿþ]ÿÿýïþêÿÿþw ýxÿþ¾ÿÿþ—þ×ÿÿþD ýFÿ ý þÿÿþ6þÁÿÿþ ýÿ þ€ÿÿþÔþ¢ÿÿþ ýÿ ýßÿÿþsþ€ÿÿþ ýÿ þCÿÿýûþQÿÿþ ýÿ þ¤ÿÿþ±þÿÿþ ýÿ ýöÿÿþPþÞÿÿþD ýFÿ þfÿÿýéþ—ÿÿþx ýyÿ þÇÿÿþþ@ÿÿþÇ ýÉÿ þ(ÿÿþ,ýÝÿÿþ+ ü,ÿÿ þ‰ÿÿþËþjÿÿþ» ü¼ÿÿ ýæÿÿþjýÛÿÿþuþvÿÿ þKÿÿý÷ýEþÿÿý~ýÿÿ þ¬ÿÿþ§þ„ÿÿ÷Óm( (mÓÿÿ ýùÿÿþFýšÿÿþµþnÿÿýãýyüÿ ÿüþ”þÏÿÿþ„ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ã2LÍð.e’¶ØêöúëÜÁ[ó@v©Óæùóâѧ2 û$lµóÿ ÿüø¨6û [ªñÿ ÿ ÿüý• ü2—ñÿ ÿ ÿýÏ ÿ ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÿ ÿüå‡4 ý'Àÿÿþ ÿûþµDþ± üÉZ ý«ÿÿýü!ÿý¼3(ý ãÿÿþwüÿæV+þtÿÿþÁý¨,þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡7ýÑÿÿþJ7þ‹ÿÿýÏ5ý¢ÿÿýö1þù*Z¢ôÿÿýôIýÊ ÿýÅ*ýÿ ÿý¬Eÿþ. ÿüö¯>ÿþ¢ÿý±ú)ÿÿúù 4i®ûÿÿýàýâÿÿþUý¦ÿÿý× ýÙÿÿþ“ýcþÿÿþýÒÿÿþÆþzÿÿýøýËÿÿþÛýØÿÿþsý Æÿÿþíþwÿÿþ³ý Áÿÿþûþ0ÿÿþàý¼ÿÿþèÿÿþìþÿÿþôý¸ÿÿýì,ÿÿþÙþÿÿþû ý³ÿÿüï1ÿÿþÂþÿÿþî ý®ÿÿûó8ÿÿþ‹þ=ÿÿþÏ ý©ÿÿýõ>ÿþLþˆÿÿþŸ ý£ÿÿýøEÿýôý çÿÿþY ýÿÿýúMÿþþ–ÿÿýï þ•ÿÿýüUüÿúý¼5ý†ÿÿþz þÿÿýþ^ýÿsÿü´U ý5ÅÿÿýÑþ…ÿÿþgþ± ÿòò¯}K($OÒÿÿýå ÿþ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5à2LÍ€ýn2<ÿüÏdþLÿÿý3¼ÿÿýÒ0ýåÿÿü“þÿÿýú]þ ÿÿý µÿÿþÚÿÿýüTþJÿÿý²ÿÿüeõÿÿý÷!ýäÿÿþ¯ÿÿþtÿÿý0ðÿÿþ±þÿÿýïÿÿ ýúÿÿþœþIÿÿþ*þGÿÿýdÿÿ þÿÿýÑþµÿÿþzýâÿÿü½ÿÿ ýôÿÿþ>þXÿÿþ¿þšÿÿûõ"ÿÿ þMÿÿþÓþÿÿþÜþDÿÿþsÿ þŒÿÿþþÿÿþôý àÿÿýÊÿ þÃÿÿþIþ ÿÿþôþ—ÿÿýú-ÿ þÚÿÿþþ4ÿÿþßýAþÿÿþ‚ÿ þíÿÿþþyÿÿþÅý ÞÿÿýÕÿ þûÿÿþýÚÿÿþ‰þ”ÿÿýý8ÿ þïÿÿþþ\ÿÿþF ý?þÿÿþ‘ÿ þÝÿÿþýåÿÿýæ ý Üÿÿýß ÿ þÉÿÿþHþ¨ÿÿþr þ‘ÿÿþFÿ þ—ÿÿþ~þkÿÿýÛ ý<ýÿÿþ ÿ þYÿÿúÑBúÿÿýþ? ý Úÿÿýèÿ ýüÿÿü:îÿÿþ† þŽÿÿþTÿ þ©ÿÿýÎÿÿý¼ ý9ýÿÿþ¯ ÿ þ5ÿÿþ•ÿÿýË ýØÿÿýï ÿþ›ÿÿýÓ þ‹ÿÿþc ÿý ÒÿÿýÚ ý7üÿÿþ½ ÿýÕÿÿýàþÖÿÿýõ" ÿù¸ÿÿä"ÿþr ÿüNÒ'ÿ þÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ:ÿý±'ÿúÿô‡ÿÿþ8ÿÿýú°ÿÿþ8ÿÿþ8ÿÿþ8ÿú3˜ðÿÿ;üB†¿2LÍ€ô%n³ÓéûòÝ´v&óþÿÿþŸþÆÿÿþ þ‡ÿÿþÃþ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþç ý&ÃÿÿýÂ$þÓÿÿþô üD¦þÿÿüþ¥Cþ=ÿÿþù ü'›íÿ ÿüí›'ýÑÿÿþþ üüÿÿüü‘ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼õÿëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþo ÿýèDÿÿþÇý ïÿÿþc þfÿÿýî  ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþa ÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ô4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1öi./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþx ÿýöTþ”ÿÿþ“ ÿýÑ-ý_òÿÿýò_ ÿüØeüŠíÿ ÿüíŠ ö·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ Î2LÍÀÿù%[Æ÷ÿÿ ÿ úO…ºïÿÿ ÿþë ÿ ÿþ ÿþ)ÿÿþ/ ÿúæ³€MÿÿþŠÿÿþÎ úæ³€MÿýçÿÿþmÿþLÿÿýøÿþ­ÿÿþªÿýúÿÿþIÿþoÿÿýåÿþÐÿÿþ‡ÿþ1ÿÿþ&ÿþ’ÿÿþÄÿýìÿÿþcÿþTÿÿýõ ÿþ¶ÿÿþ¡ÿýüÿÿþ?ÿþxÿÿýÝÿþØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþË ÿýæÿÿþj ÿþKÿÿý÷ ÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„ÿ2LÍò@v©Óæùóâѧn2ô%n³ÓéûòÝ´v& û [ªñÿ ÿüÏdý3¼ÿÿýþ·ü2—ñÿÿýÒ0ü“þÿ ÿÿýú]ý µÿ ÿÿõâ“R% 9xÚÿÿýüT ý²ÿÿôì‹==ŒíÿÿÿûþµDüeõÿÿý÷! þtÿÿý¨ü«ÿÿý¼3 ý0ðÿÿþ± ýúÿÿýœý üÿæVþIÿÿþ* þÿÿýÑ þý¨þµÿÿþzýôÿÿþ>'þXÿÿþ¿þMÿÿþÓ(þÿÿþÜþŒÿÿþ(þÿÿþôþÃÿÿþI(þ ÿÿþôþÚÿÿþ(þ4ÿÿþßþíÿÿþ(þyÿÿþÅþûÿÿþ'ýÚÿÿþ‰þïÿÿþ'þ\ÿÿþFþÝÿÿþ&ýåÿÿýæþÉÿÿþH&þ¨ÿÿþr þ—ÿÿþ~%þkÿÿýÛ þYÿÿþÑ$ýBúÿÿýþ? ýüÿÿþ:"ý)îÿÿþ† þ©ÿÿýÎ þýâÿÿý¼ þ5ÿÿþ•ý™ýÙÿÿýË þ›ÿÿý£ü¥ÿýÒÿÿýÓý Òÿÿôëˆ;;‰ëÿÿýËÿÿýÚýÕÿ ÿý Æÿÿýàý¸ÿ ÿý Áÿÿýä"ýNÒÿÿýð~ý¼ÿÿýè'ó4{»×ìüòÖ¥^ ý¸ÿÿýì,4ý³ÿÿýï14ý®ÿÿýó84ý©ÿÿýõ>4ý£ÿÿýøE4ýÿÿýúM5þ•ÿÿýüU+þpþÿÿýþ^ý± ýlÿþ…ÿÿþgûÿô‡û¬ÿÿÿþ8 ÿôú°i./d±÷ÿÿÿþ8 ÿÿþ8 ÿþÑÿþ8 ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Â2LÍÀþ-þLÿÿ÷%[Æ÷ûwýåÿÿúO…ºïÿÿþ—þ ÿÿ ÿþ€þJÿÿ ÿýýBýäÿÿþ¯ÿÿÿúæ³€MÿÿýØþÿÿýïÿÿúæ³€MþÕÿÿþfþGÿÿýdÿÿþAÿÿýÚýâÿÿü½ÿÿþÖÿÿþ=þšÿÿûõ"ÿÿþÿÿþ•þDÿÿþsÿþKÿÿþÜý àÿÿýÊÿþ!ÿÿþþ—ÿÿýú-ÿþÿÿþO ýAþÿÿþ‚ÿþÿÿþ} ý ÞÿÿýÕÿþÿÿþŸ þ”ÿÿýý8ÿþ ÿÿþ¿ ý?þÿÿþ‘ÿþJÿÿþÔ ý Üÿÿýß ÿþÿÿþç þ‘ÿÿþFÿþÓÿÿþô ý<ýÿÿþ ÿþ=ÿÿþùý ÚÿÿýèÿþÑÿÿþþþŽÿÿþTÿÿþøý9ýÿÿþ¯ ÿÿþðýØÿÿýï ÿÿþÞÿÿþßþ‹ÿÿþc ÿüÿèDÿÿþÇý7üÿÿþ½ ÿüÓ$8ÿÿþ©þÖÿÿýõ" ÿü Sÿÿþÿþr ÿþ‚ÿÿþPÿþ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿÿþ¡ÿÿýåÿÿýù>ÿüÿüZÿÿýöTÿÿþ-ÿÿ!ÿÿ€2€L€Í¾ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿ'2LÍ0óýÑÿÿþJÿþÃþ‹ÿÿýÏÿýñ'ý¢ÿÿýö1ÿþ>ù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿþÿý±ÿýÆ ù 4i®ûÿÿýàÿý¼ý¦ÿÿý× ÿþoýcþÿÿþÿýî þzÿÿýøÿþaýØÿÿþsÿþ¦þwÿÿþ³ÿþÙþ0ÿÿþàÿþðþÿÿþôÿþúþÿÿþûÿþéþÿÿþîÿþÕþ=ÿÿþÏÿþ³þˆÿÿþŸÿþoý çÿÿþYÿþ)þ–ÿÿýï ÿþ¶ý¼5ý†ÿÿþzÿýþ1ÿü´U ý5ÅÿÿýÑÿþxÿòò¯}K($OÒÿÿýå ÿþ“ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5_2LÍò@v©Óæùóâѧn2þÿû [ªñÿ ÿüÏdþÿü2—ñÿÿýÒ0þÿÿýú]þÿÿõâ“R% 9xÚÿÿýüTþÿÿûþµDüeõÿÿý÷!þÿÿý¼3 ý0ðÿÿþ±þÿüÿæVþIÿÿþ*þÿý¨þµÿÿþzþÿ%þXÿÿþ¿þÿ%þÿÿþÜþÿ%þÿÿþôþÿ%þ ÿÿþôþÿ%þ4ÿÿþßýAÿ%þyÿÿþÅü Þÿ$ýÚÿÿþ‰ü”ÿÿ$þ\ÿÿþF û?þÿÿ#ýåÿÿýæ ý Üÿÿ$þ¨ÿÿþr þ‘ÿÿ#þkÿÿýÛ ý<ýÿÿ"ýBúÿÿýþ? ý Úÿÿýèÿ ý)îÿÿþ† þŽÿÿýTÿýâÿÿý¼ ý9ýÿÿü¯ÿýÙÿÿýË ýØÿÿûïÿýÒÿÿýÓ þ‹ÿÿûcÿýËÿÿýÚ ý7üÿÿþ½þÿý ÆÿÿýàþÖÿÿýõ"þÿý Áÿÿýä"ÿþrþÿý¼ÿÿýè' ÿý¸ÿÿýì, ÿý³ÿÿýï1 ÿý®ÿÿýó8 ÿý©ÿÿýõ>þÿý£ÿÿýøEþÿýÿÿýúMþÿþ•ÿÿýüU þÿþÿÿýþ^!þÿþ…ÿÿþg" ÿ ÿþ8 ÿ ÿþ8 ÿ ÿþ8 ÿ ÿþ82LÍ$ô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿýýB þÿÿýïÿÿ ýúÿÿýœý ÿÿýØ þGÿÿýdÿÿ þÿÿýÑ ýÕÿÿþf ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿýÚ þšÿÿûõ"ÿÿ þMÿÿþÓ þÖÿÿþ=þDÿÿþsÿ þŒÿÿþ þÿÿþ•ý àÿÿýÊÿ þÃÿÿþI þKÿÿþÜþ—ÿÿýú-ÿ þÚÿÿþ þ!ÿÿþþþÿÿþ‚ÿ þíÿÿþ þÿÿþOÿýÕÿ þûÿÿþ þÿÿþ}ÿýý8ÿ þïÿÿþ þÿÿþŸÿþ‘ÿ þÝÿÿþ þ ÿÿþ¿üÿß ÿ þÉÿÿþH þJÿÿþÔýÿFÿ þ—ÿÿþ~ þÿÿþçþ ÿ þYÿÿþÑ þÓÿÿþôþÿ ýüÿÿþ: þ=ÿÿþùÿ þ©ÿÿýÎ ýÑÿÿþþÿ þ5ÿÿþ•ý™ÿÿþøÿþ›ÿÿý£ý¥ÿÿþðÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿýÕÿÿýèDÿÿþÇÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿþ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿ!þ®ÿÿýý!ÿ ý$úÿÿþ°ÿ þ¼ÿÿýþ2ÿþpÿÿþ¡ÿý± þlÿÿýåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Q2LÍ@ÿù%[Æ÷ÿÿ ÿ úO…ºïÿÿ ÿþë ÿ ÿþ ÿþ)ÿÿþ/ ÿúæ³€MÿÿþŠÿÿþÎ úæ³€MÿýçÿÿþmÿþLÿÿýøÿþ­ÿÿþªÿýúÿÿþIÿþoÿÿýåÿþÐÿÿþ‡ÿþ1ÿÿþ&ÿþ’ÿÿþÄÿýìÿÿþcÿþTÿÿýõ ÿþ¶ÿÿþ¡ÿýüÿÿþ?ÿþxÿÿýÝÿþØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþË ÿýæÿÿþj ÿþKÿÿý÷ ÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„ÿ‚2LÍ0ð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿýø¨ýåÿÿ ÿþ ÿÿ ÿþJÿÿ ÿñÞg5 5g·üÿÿýäÿÿþ¯ÿÿ ÿüå‡4 ü'Àÿþÿÿýïÿÿ üÉZ ý«þGÿÿýdÿÿþ ýâÿÿü½ÿÿ2þšÿÿûõ"ÿÿ1þDÿÿþsÿ0ý àÿÿýÊÿ0þ—ÿÿýú-ÿ/ýAþÿÿþ‚ÿ.ý ÞÿÿýÕÿþ þ”ÿÿýý8ÿþ‹ ý?þÿÿþ‘ÿü¢ÿ ý Üÿÿýß ÿ÷*Z¢ôÿÿ þ‘ÿÿþFÿ ÿ ý<ýÿÿþ ÿ ÿþ¬ý Úÿÿýèÿ ÿþöþŽÿÿþTÿ ÿý9ýÿÿþ¯ ÿ÷ 4i®ûÿÿýØÿÿýï ÿü¦ÿþ‹ÿÿþc ÿþcý7üÿÿþ½ ÿ'þÖÿÿýõ" ÿ'ÿþr ÿ'ÿ!ÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ:ÿ ý¼5ý†ÿ ÿü´U ü5Åÿÿ ÿòò¯}K($OÒÿÿÿ ÿÿ ÿÿ û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5?2LÍô%n³ÓéûòÝ´v&ö.e’¶Øêö6ý3¼ÿÿüþ·-û$lµóÿÿüý•ü“þÿ ÿýûw ÿýÏ ý µÿÿþ— ÿýÔ ý²ÿÿöì‹==Œíÿÿþ€ ÿùÞg5 ÿÿþ þtÿÿý¨ý«ÿÿýýB ÿüå‡4ÿýü! ýúÿÿýœý ÿÿýØ üÉZþãÿÿþw þÿÿýÑ ýÕÿÿþfþtÿÿþÁýôÿÿþ> þAÿÿýÚþ,ÿÿþàþMÿÿþÓ þÖÿÿþ=þÿÿþøþŒÿÿþ þÿÿþ•þ ÿÿþòþÃÿÿþI þKÿÿþÜþ#ÿÿþØþÚÿÿþ þ!ÿÿþþeÿÿþ¡þíÿÿþ þÿÿþOþÑÿÿþJþûÿÿþ þÿÿþ}ÿýÏþïÿÿþ þÿÿþŸÿýö1 þÝÿÿþ þ ÿÿþ¿ÿýôI þÉÿÿþH þJÿÿþÔüÿÅ* þ—ÿÿþ~ þÿÿþç ÿþE þYÿÿþÑ þÓÿÿþô ÿý¯> ýüÿÿþ: þ=ÿÿþù ÿý± þ©ÿÿýÎ ýÑÿÿþþ ÿýà þ5ÿÿþ•ý™ÿÿþøÿý× þ›ÿÿý£ý¥ÿÿþðþþÿÿþ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþzÿÿýø ýÕÿÿýèDÿÿþÇýØÿÿþs ý¸ÿ ÿüÓ$8ÿÿþ©þwÿÿþ³ ýNÒÿÿúð~ Sÿÿþþ0ÿÿþàó4{»×ìüòÖ¥^ þ‚ÿÿþPþÿÿþôþ»ÿÿþþÿÿþûýñÿÿþÐþÿÿþîþJÿÿþ|þ=ÿÿþÏþ®ÿÿýý!þˆÿÿþŸý$úÿÿþ°ý çÿÿþYþ¼ÿÿýþ2þ–ÿÿýï þpÿÿþ¡ÿþz ý± þlÿÿýå ý¼5ÿýÑ ûÿô‡ý¬ÿÿýù> ÿü´U ÿýå ÿôú°i./d±÷ÿÿýüZ ÿóò¯}K(ÿÿÒ! ÿýöT ÿüø}ÿýÑ- ÿþü3˜ðÿ ÿüØeû'vÃúÿÿóB†·ßñüóß¹ƒ:ö ?vŸÃáïúø>2LÍøúëÜÁ[ò@v©Óæùóâѧn2ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ýOÿÿýÏ ÿýú] ÿù5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüT ÿý'Àÿÿþ ÿûþµDüeõÿÿý÷! ÿý«ÿÿýü!ÿý¼3 ý0ðÿÿþ± ýæ³ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^"ý5ÅÿÿýÑþ…ÿÿþgú$OÒÿÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿüà ÿþ8 ÷ÿêÛÉj5w2LÍBù%[Æ÷ÿÿ!þLÿÿü…ºïÿÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿÿúæ³€Mÿÿýäÿÿþ¯ÿÿü€MÿþÿÿýïÿÿÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿÿÿÿÿÿÿÿ‰2LÍ ô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·- ÿü“þÿ ÿýûw ÿý µÿÿþ— ÿý²ÿÿöì‹==Œíÿÿþ€ ÿþtÿÿý¨ý«ÿÿýýBþ)ÿÿýúÿÿýœý ÿÿýØþŠÿÿþÿÿýÑ ýÕÿÿþfýçÿÿýôÿÿþ> þAÿÿýÚþLÿÿþøþMÿÿþÓ þÖÿÿþ=þ­ÿÿþªþŒÿÿþ þÿÿþ•ýúÿÿþIþÃÿÿþI þKÿÿþÜþoÿÿýåþÚÿÿþ þ!ÿÿþþÐÿÿþ‡þíÿÿþ þÿÿþOþ1ÿÿþ&þûÿÿþ þÿÿþ}þ’ÿÿþÄþïÿÿþ þÿÿþŸýìÿÿþcþÝÿÿþ þ ÿÿþ¿þTÿÿýõ þÉÿÿþH þJÿÿþÔþ¶ÿÿþ¡þ—ÿÿþ~ þÿÿþçýüÿÿþ?þYÿÿþÑ þÓÿÿþôþxÿÿýÝýüÿÿþ: þ=ÿÿþùþØÿÿþ}þ©ÿÿýÎ ýÑÿÿþþþ:ÿÿýýþ5ÿÿþ•ý™ÿÿþøþ›ÿÿþ» þ›ÿÿý£ý¥ÿÿþðý ñÿÿþY ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ]ÿÿýï ýÕÿÿýèDÿÿþÇþ¾ÿÿþ— ý¸ÿ ÿüÓ$8ÿÿþ©ý þÿÿþ6ýNÒÿÿúð~ Sÿÿþþ€ÿÿþÔó4{»×ìüòÖ¥^ þ‚ÿÿþPýßÿÿþsþ»ÿÿþþCÿÿýûýñÿÿþÐþ¤ÿÿþ±þJÿÿþ|ýöÿÿþPþ®ÿÿýý!þfÿÿýéý$úÿÿþ°þÇÿÿþþ¼ÿÿýþ2þ(ÿÿþ,þpÿÿþ¡þ‰ÿÿþËý± þlÿÿýåýæÿÿþjûÿô‡ý¬ÿÿýù>þKÿÿý÷ÿôú°i./d±÷ÿÿýüZþ¬ÿÿþ§ÿýöTýùÿÿþFÿýÑ-þnÿÿýãü3˜ðÿ ÿüØeþÏÿÿþ„óB†·ßñüóß¹ƒ:i2LÍó7€·Þñüñß¶†Añ.e’¶ØêöúëÜÁÿÿübÖÿ ÿüð—2 û$lµóÿ ÿý)Îÿÿ ÿþëýPõÿÿ ÿþ ýVüÿÿôø´g1.k²úÿÿ ÿóÞg5 5gÿ/ ý;øÿÿý°!û‰õÿ ÿüå‡4þÎ ýãÿÿþo ý± üÉZ þm þžÿÿþr)þ ý0ýÿÿþ½8þ®ÿÿýú%7ý üÿÿþ­8þ{ÿÿþJ8þÏÿÿýñ7ýþÿÿþº8þPÿÿþó \¤ÔòûëÕ¹x1)þ€ÿÿúRzïÿÿýÎH(þ©ÿÿü7"Ðÿ ÿý° &þÈÿÿýBæÿÿýÍû*Z þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊÿ þðÿÿý~ýÿÿþÿ þùÿÿþuþvÿÿþ.ÿ þþÿÿþº þ¼ÿÿþ¢ÿ þûÿÿþ* þ,ÿÿýúû 4i þõÿÿþÆ þÇÿÿþU"þêÿÿþw þxÿÿþ“"þ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþ%ýÛÿÿþuþvÿÿýúý¼5ýEþÿÿý~ýÿÿþsÿü´U þ„ÿÿ÷Óm( (mÓÿÿþ± ÿóò¯}K($Oýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 û'vÃúÿ ÿô'xµÞôûêÔ´o&ò ?vŸÃáïúøêÛÉ>2LÍü[ò@v©Óæùóâѧn2ÿüø¨6û [ªñÿ ÿüÏdý%ÿÿüý• ü2—ñÿÿýÒ0úO…ºïÿÿýÏ ÿýú] ÿý·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüT ÿü'Àÿÿþ ÿûþµDüeõÿÿý÷! ÿúæ«ÿÿýü!ÿý¼3 ý0ðÿÿþ± úæ³€Mý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþFý¢ôÿÿýôIýåÿÿýæÿýÅ*þ¨ÿÿþrÿý¬EþkÿÿýÛÿüö¯>ýBúÿÿýþ?ÿý±ý)îÿÿþ†ý®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU"ý†ÿÿþz þÿÿýþ^"ý5ÅÿÿýÑþ…ÿÿþg"þÒÿÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿüà ÿþ8 ÿüj5{2LÍ@û[Æ÷ÿÿ!þLÿÿ ÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿ û³€Mÿÿýäÿÿþ¯ÿÿÿþÿÿýïÿÿÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ ÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿ ÿÿ ÿÿ ÿÿ ÿÿ2LÍô%n³ÓéûòÝ´v&ó þAÿÿýÚþÌÿÿþf þhÿÿüËMÿÿþÓ þÖÿÿþ=þæÿÿþ$ þ&ÿÿüåŒÿÿþ þÿÿþ•þúÿÿþ þ ÿÿüùÃÿÿþI þKÿÿþÜþðÿÿþ þ ÿÿüïÚÿÿþ þ!ÿÿþþÓÿÿþ$ þ%ÿÿüÒíÿÿþ þÿÿþOþšÿÿþe þgÿÿü™ûÿÿþ þÿÿþ}þAÿÿýÑ ýÔÿÿü>ïÿÿþ þÿÿþŸþÆÿÿþ þ‡ÿÿûÃÝÿÿþ þ ÿÿþ¿ý*óÿÿýý •ÿÿúñ'ÉÿÿþH þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þ—ÿÿþ~ þÿÿþç ý&ÃÿÿýÂ$þYÿÿþÑ þÓÿÿþô üD¦þÿÿüþ¥Cýüÿÿþ: þ=ÿÿþù ü'›íÿ ÿüí›'þ©ÿÿýÎ ýÑÿÿþþ üüÿÿüü‘þ5ÿÿþ•ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþoýÕÿÿýèDÿÿþÇý ïÿÿþc þfÿÿýî ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþaýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)ý± þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ûÿô‡ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1ÿôú°i./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþxÿýöTþ”ÿÿþ“ÿýÑ-ý_òÿÿýò_ü3˜ðÿ ÿüØeüŠíÿ ÿüíŠóB†·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ E2LÍ0ð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿýø¨ÿ ÿÿþë ÿÿþ ÿñÞg5 5g·üÿÿþ)ÿÿþ/ ÿüå‡4 ü'ÀÿþŠÿÿþÎ üÉZ ý«ýçÿÿþmþ þLÿÿýø7þ­ÿÿþª7ýúÿÿþI7þoÿÿýå7þÐÿÿþ‡7þ1ÿÿþ&7þ’ÿÿþÄþýìÿÿþcþ‹þTÿÿýõ ü¢ÿþ¶ÿÿþ¡÷*Z¢ôÿÿýüÿÿþ? ÿþxÿÿýÝ ÿþ¬þØÿÿþ} ÿþöþ:ÿÿýý ÿþ›ÿÿþ»÷ 4i®ûÿÿý ñÿÿþY ü¦ÿþ]ÿÿýï"þcþ¾ÿÿþ—7ý þÿÿþ67þ€ÿÿþÔ7ýßÿÿþs7þCÿÿýû7þ¤ÿÿþ±7ýöÿÿþP7þfÿÿýé7þÇÿÿþ7þ(ÿÿþ,7þ‰ÿÿþË7ýæÿÿþjý¼5ý† þKÿÿý÷ÿü´U ü5Åÿ þ¬ÿÿþ§ÿòò¯}K($OÒÿÿ ýùÿÿþFÿ þnÿÿýãÿ þÏÿÿþ„û'vÃúÿ ÿýà-ï ?vŸÃáïúøêÛÉj5?2LÍò@v©Óæùóâѧn2þ6û [ªñÿ ÿüÏdö%[Æ÷ý• ü2—ñÿÿýÒ0úO…ºïÿÿýÏ ÿýú] ÿýÔ ÿõâ“R% 9xÚÿÿýüT ÿþ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿýü!ÿý¼3 ý0ðÿÿþ± úæ³€MþãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßþÑÿÿþJþyÿÿþÅÿýÏýÚÿÿþ‰ÿýö1þ\ÿÿþFÿýôIýåÿÿýæüÿÅ*þ¨ÿÿþrþEþkÿÿýÛý¯>ýBúÿÿýþ?ÿý±ý)îÿÿþ†ÿýàýâÿÿý¼ÿý× ýÙÿÿýË þþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU$ÿþz þÿÿýþ^%ÿýÑþ…ÿÿþg&ÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿþ ÿþ8 ÿ€2LÍ@ÿ!þLÿÿÿ ýåÿÿÿ þ ÿÿÿþJÿÿÿýäÿÿþ¯ÿÿÿþÿÿýïÿÿþÿÿþGÿÿýdÿÿþžÿÿýâÿÿü½ÿÿý0ýÿÿþšÿÿûõ"ÿÿþ®ÿÿþDÿÿþsÿ ý üÿÿý àÿÿýÊÿ þ{ÿÿþ—ÿÿýú-ÿ þÏÿÿýAþÿÿþ‚ÿ ýþÿÿý ÞÿÿýÕÿ þPÿÿþ”ÿÿýý8ÿ þ€ÿÿý?þÿÿþ‘ÿ þ©ÿÿý Üÿÿýß ÿ þÈÿÿþ‘ÿÿþFÿ þàÿÿý<ýÿÿþ ÿ þðÿÿý Úÿÿýèÿ þùÿÿþŽÿÿþTÿ þþÿÿý9ýÿÿþ¯ ÿ þûÿÿýØÿÿýï ÿ þõÿÿþ‹ÿÿþc ÿ þêÿÿý7üÿÿþ½ ÿ þ×ÿÿþÖÿÿýõ" ÿ þÁÿÿÿþr ÿ þ¢ÿÿÿþ€ÿÿÿþQÿÿÿþÿÿÿþÞÿÿ$ÿ þ—ÿÿ$ÿ þ@ÿÿ$ÿ ýÝÿÿ$ÿþjÿÿ$ÿýÛÿÿ$ÿþEÿ ÿÿ ÿÿ ÿÿ ÿÿ‘2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿ ý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿý;øÿÿý°!û‰õÿýäÿÿþ¯ÿÿþãÿÿþo ý±þÿÿýïÿÿÿþr$þGÿÿýdÿÿÿþ½$ýâÿÿü½ÿÿÿýú%$þšÿÿûõ"ÿÿÿþ­$þDÿÿþsÿÿþJ#ý àÿÿýÊÿüÿñ#þ—ÿÿýú-ÿýÿº#ýAþÿÿþ‚ÿýÿó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿùÿRzïÿÿýÎHþ”ÿÿýý8ÿûÿ7"Ðÿ ÿý° ý?þÿÿþ‘ÿüÿBæÿÿýÍ ý Üÿÿýß ÿýÿÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿÿý~ýÿÿþ ý<ýÿÿþ ÿÿþuþvÿÿþ. ý Úÿÿýèÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿÿþÆ þÇÿÿþUýØÿÿýï ÿÿþw þxÿÿþ“þ‹ÿÿþc ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿÿþ þÿÿþÛþÖÿÿýõ" ÿÿþ þÿÿþíÿþr ÿÿþ þÿÿþûÿÿþ þÿÿþìÿÿþ þÿÿþÙÿÿþD þFÿÿþÂÿÿþx þyÿÿþ‹ÿÿþÇ þÉÿÿþLÿÿþ+ þ,ÿÿýôÿÿþ» þ¼ÿÿþÿÿþuþvÿÿýúÿþþÿÿý~ýÿÿþsÿþ„ÿÿ÷Óm( (mÓÿÿþ±ÿýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿ ý.¸ÿ ÿý¼4ÿ ô'xµÞôûêÔ´o&n2LÍ ô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿ ýúÿÿýœý ÿÿýØ úæ³€Mÿ þÿÿýÑ ýÕÿÿþfÿ ýôÿÿþ> þAÿÿýÚÿ þMÿÿþÓ þÖÿÿþ=ÿ þŒÿÿþ þÿÿþ•ÿ þÃÿÿþI þKÿÿþÜÿ þÚÿÿþ þ!ÿÿþÿ þíÿÿþ þÿÿþOÿ þûÿÿþ þÿÿþ}ÿ þïÿÿþ þÿÿþŸÿ þÝÿÿþ þ ÿÿþ¿ÿ þÉÿÿþH þJÿÿþÔÿ þ—ÿÿþ~ þÿÿþçÿ þYÿÿþÑ þÓÿÿþôÿ ýüÿÿþ: þ=ÿÿþùÿ þ©ÿÿýÎ ýÑÿÿþþÿ þ5ÿÿþ•ý™ÿÿþøÿ þ›ÿÿý£ý¥ÿÿþðÿ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿ ýÕÿÿýèDÿÿþÇÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿó4{»×ìüòÖ¥^ þ‚ÿÿþPÿ þ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ ý± þlÿÿýåÿ ûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØeÿóB†·ßñüóß¹ƒ:i2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLý)ÎÿÿýåýPõÿÿý ÿýVüÿÿôø´g1.k²úÿÿüJÿÿý;øÿÿý°!û‰õÿûäÿÿ ýãÿÿþo ý±þÿÿþžÿÿþr$þGÿÿ ý0ýÿÿþ½$ýâÿÿþ½ þ®ÿÿýú%$þšÿÿýõ" ý üÿÿþ­$þDÿÿþs þ{ÿÿþJ#ý àÿÿýÊ þÏÿÿýñ#þ—ÿÿýú- ýþÿÿþº#ýAþÿÿþ‚ þPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕ þ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8þ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘þÈÿÿýBæÿÿýÍ ý Üÿÿýß þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFþðÿÿý~ýÿÿþ ý<ýÿÿþ þùÿÿþuþvÿÿþ. ý Úÿÿýèþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯þõÿÿþÆ þÇÿÿþUýØÿÿýïþêÿÿþw þxÿÿþ“þ‹ÿÿþcþ×ÿÿþD þFÿÿþÆý7üÿÿþ½þÁÿÿþ þÿÿþÛþÖÿÿýõ"þ¢ÿÿþ þÿÿþíÿþrþ€ÿÿþ þÿÿþûÿ þQÿÿþ þÿÿþìÿ þÿÿþ þÿÿþÙÿ þÞÿÿþD þFÿÿþÂÿ þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþ%ýÛÿÿþuþvÿÿýú&ýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&^2LÍô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-ünØÿÿü“þÿ ÿýûwý0Ïÿÿý µÿÿþ—ý:óÿÿý²ÿÿöì‹==Œíÿÿþ€ ý$ñÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿýýB þ¶ÿÿýïÿÿ ýúÿÿýœý ÿÿýØ þ8ÿÿü„dÿÿ þÿÿýÑ ýÕÿÿþf þ‹ÿÿûÒÿÿ ýôÿÿþ> þAÿÿýÚþÌÿÿþfÿ þMÿÿþÓ þÖÿÿþ=þæÿÿþ$ÿ þŒÿÿþ þÿÿþ•þúÿÿþ ÿ þÃÿÿþI þKÿÿþÜþðÿÿþ ÿ þÚÿÿþ þ!ÿÿþþÓÿÿþ$ÿ þíÿÿþ þÿÿþOþšÿÿþeÿ þûÿÿþ þÿÿþ}þAÿÿûÑÿÿ þïÿÿþ þÿÿþŸþÆÿÿüÿÿ þÝÿÿþ þ ÿÿþ¿ý*óÿÿÿ þÉÿÿþH þJÿÿþÔ ýBòÿÿÿ þ—ÿÿþ~ þÿÿþç ù&Ãÿÿÿÿ þYÿÿþÑ þÓÿÿþô ûD¦ÿÿ ýüÿÿþ: þ=ÿÿþù ú'›íÿÿ þ©ÿÿýÎ ýÑÿÿþþ øüÿÿÿÿ þ5ÿÿþ•ý™ÿÿþøý Æÿÿÿþ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùÿÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿûø=ÿÿýÕÿÿýèDÿÿþÇý ïÿÿþcÿý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓÿýNÒÿÿúð~ Sÿÿþþ§ÿÿüsÿ ÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿü1ÿ ÿþ»ÿÿþþñÿÿüÿ ÿýñÿÿþÐþûÿÿüÿ ÿþJÿÿþ|þêÿÿþÿ!þ®ÿÿýý!þÖÿÿþ1ÿ ý$úÿÿþ°þ³ÿÿþsÿ þ¼ÿÿýþ2þpÿÿýÒÿþpÿÿþ¡ þ)ÿÿþcÿý± þlÿÿýå þ·ÿÿû÷=ÿÿûÿô‡ý¬ÿÿýù> ý2þÿÿüùÿÿÿôú°i./d±÷ÿÿýüZ þyÿÿÿÿýöTþ”ÿÿÿÿýÑ-ù_òÿÿÿÿü3˜ðÿ ÿüØeüŠíóB†·ßñüóß¹ƒ:þ >2LÍóþ’ÿÿþÄþ‡ÿÿþÃýìÿÿþc ýý •ÿÿýñ'þTÿÿýõ ôÿç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ÿýÂ$ýüÿÿþ? þþÿÿüþ¥CþxÿÿýÝ ÿüí›'þØÿÿþ} ÿüü‘þ:ÿÿýýôÿãƒD E„äÿÿýÆ þ›ÿÿþ»ýqütúÿÿý¼ý ñÿÿþYý@ùÿÿþoþ]ÿÿýïþfÿÿýî þ¾ÿÿþ—ýÔÿÿþaý þÿÿþ6þuÿÿþ¦þ€ÿÿþÔþ3ÿÿþÙýßÿÿþsþÿÿþðþCÿÿýûþÿÿþúþ¤ÿÿþ± þÿÿþéýöÿÿþP þ3ÿÿþÕþfÿÿýé þwÿÿþ³þÇÿÿþ ý×ÿÿþoþ(ÿÿþ, þlÿÿþ)þ‰ÿÿþË ýFúÿÿþ¶ýæÿÿþjýpüxûÿÿýþ1þKÿÿý÷ôÿâ‚C E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF ÿýò_þnÿÿýã ÿüíŠþÏÿÿþ„òJƒ¹×èøøè×¹ƒJ q2LÍð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿý8ÿÿýÒ! ÿý8ÿÿüø} ÿù8'vÃúÿ ÿüà ÿþ8ï ?vŸÃáïúøêÛÉj5k2LÍ7ö7€·Þñüñß¶ ù%[Æ÷ÿÿübÖÿÿ úO…ºïÿÿý)Îÿ ÿ ÿýPõÿ ÿ ÿýVüÿÿöø´g1.kÿúæ³€Mÿÿý;øÿÿý°!úæ³€Mÿýãÿÿþoÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþº ÿþPÿÿþô \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿÿþ©ÿÿü7"Ðÿ ÿÿþÈÿÿýBæÿ ÿÿþàÿÿþÝÿÿöÓn( (nÓÿÿþðÿÿý~ýÿþùÿÿþuÿþþÿÿþºÿþûÿÿþ*ÿþõÿÿþÆÿþêÿÿþwÿþ×ÿÿþDÿþÁÿÿþÿþ¢ÿÿþÿþ€ÿÿþÿþQÿÿþÿþÿÿþÿþÞÿÿþDÿþ—ÿÿþxÿþ@ÿÿþÇÿýÝÿÿþ+ÿþjÿÿþ»ÿýÛÿÿþuÿýEþÿÿý~ý ÿ þ„ÿÿöÓm( (mÓÿ ÿ ýšÿ ÿ ÿýyüÿ ÿ ÿý.¸ÿ ÿ4ô'xµÞôûêÔ´o&>2LÍü†A7ö%n³Óÿÿð—2þLÿÿý3¼ÿÿýåÿÿü“þÿÿþ ÿÿý µÿÿý²úÿÿþJÿÿý²ÿÿ÷ì‹=‰õÿýäÿÿþ¯ÿÿþtÿÿý¨ý±þÿÿýïÿÿ ýúÿÿýœþGÿÿýdÿÿ þÿÿýÑýâÿÿü½ÿÿ ýôÿÿþ>þšÿÿûõ"ÿÿ þMÿÿþÓþDÿÿþsÿ þŒÿÿþý àÿÿýÊÿ þÃÿÿþIþ—ÿÿýú-ÿ þÚÿÿþýAþÿÿþ‚ÿ þíÿÿþþý ÞÿÿýÕÿ þûÿÿþýÎHþ”ÿÿýý8ÿ þïÿÿþÿý° ý?þÿÿþ‘ÿ þÝÿÿþÿýÍ ý Üÿÿýß ÿ þÉÿÿþHÿýÊ þ‘ÿÿþFÿ þ—ÿÿþ~ÿþ ý<ýÿÿþ ÿ þYÿÿþÑþvÿÿþ. ý Úÿÿýèÿ ýüÿÿþ:þ¼ÿÿþ¢ þŽÿÿþTÿ þ©ÿÿýÎþ,ÿÿýúý9ýÿÿþ¯ ÿ þ5ÿÿþ•þÇÿÿþUýØÿÿýï ÿþ›ÿÿý£þxÿÿþ“þ‹ÿÿþc ÿý Òÿÿùëˆ;FÿÿþÆý7üÿÿþ½ ÿýÕÿÿþÿÿþÛþÖÿÿýõ" ÿý¸ÿÿþÿÿþíÿþr ÿýNÒÿÿþÿÿþûÿ ÷4{»×ÿÿþìÿþÿÿþÙÿþFÿÿþÂÿþyÿÿþ‹ÿþÉÿÿþLÿþ,ÿÿýôÿþ¼ÿÿþÿþvÿÿýúÿý±ÿþsÿûÿô‡ÿþ±ÿÿùú°i.ÿÿýµ ÿ ÿüþ”ÿÿý¼4ÿü3˜ðÿÿ8øB†·ßñü>2LÍøéûòÝ´v&ð.e’¶ØêöúëÜÁ[ÿüþ·-û$lµóÿ ÿüø¨6ý [ÿÿýûw ÿüý• ü2—ñÿ ÿþ— ÿýÏ ÿù=Œíÿÿþ€ ÿóÞg5 5g·üÿÿýÔ ÿý«ÿÿýýB ÿüå‡4 ý'Àÿÿþ ÿý ÿÿýØ üÉZ ý«ÿÿýü!ÿþ¼ýÕÿÿþfý ãÿÿþwüÿæVþAÿÿýÚþtÿÿþÁý¨ þÖÿÿþ=þ,ÿÿþàþÿÿþ•þÿÿþøþKÿÿþÜþ ÿÿþòþ!ÿÿþþ#ÿÿþØþÿÿþOþeÿÿþ¡þÿÿþ}ýÑÿÿþJþÿÿþŸþ‹ÿÿýÏþ ÿÿþ¿ý¢ÿÿýö1þJÿÿþÔù*Z¢ôÿÿýôIþÿÿþç ÿýÅ*þÓÿÿþô ÿý¬Eþ=ÿÿþù ÿüö¯>ýÑÿÿþþ ÿý±ý™ÿÿþøù 4i®ûÿÿýàý¥ÿÿþðý¦ÿÿý× ù;‰ëÿÿþÞÿÿþßýcþÿÿþ ÿýèDÿÿþÇþzÿÿýø ÿüÓ$8ÿÿþ©ýØÿÿþs ÿúð~ Sÿÿþþwÿÿþ³ øìüòÖ¥^ þ‚ÿÿþPþ0ÿÿþàþ»ÿÿþþÿÿþôýñÿÿþÐþÿÿþûþJÿÿþ|þÿÿþîþ®ÿÿýý!þ=ÿÿþÏý$úÿÿþ°þˆÿÿþŸ þþ¼ÿÿýþ2ý çÿÿþY ýþpÿÿþ¡þ–ÿÿýï ý•ÿþlÿÿýå ý¼5ý†ÿÿþz üÿÿý¬ÿÿýù> ÿü´U ý5ÅÿÿýÑþ…ÿÿú/d±÷ÿÿýüZ ÿòò¯}K($OÒÿÿýå ÿýöT ÿýÒ! ÿýÑ- ÿüø} ÿüØeû'vÃúÿ ÿüà ÿúóß¹ƒ:ï ?vŸÃáïúøêÛÉj5S2LÍò@v©Óæùóâѧn2ó7€·Þñüñß¶†Aýªñÿ ÿüÏdübÖÿ ÿüð—2ÿýÒ0ý)Îÿÿÿýú]ýPõÿÿÿõâ“R% 9xÚÿÿýüTýVüÿÿôø´g1.k²úÿÿûþµDüeõÿÿý÷! ý;øÿÿý°!û‰õÿþ3 ý0ðÿÿþ± ýãÿÿþo ý±þIÿÿþ* þžÿÿþr%þµÿÿþz ý0ýÿÿþ½&þXÿÿþ¿ þ®ÿÿýú%&þÿÿþÜ ý üÿÿþ­'þÿÿþô þ{ÿÿþJ'þ ÿÿþô þÏÿÿýñ'þ4ÿÿþßýþÿÿþº(þyÿÿþÅþPÿÿþó \¤ÔòûëÕ¹x1ýÚÿÿþ‰þ€ÿÿúRzïÿÿýÎHþ\ÿÿþFþ©ÿÿü7"Ðÿ ÿý° ýåÿÿýæþÈÿÿýBæÿÿýÍþ¨ÿÿþr þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþkÿÿýÛ þðÿÿý~ýÿÿþýBúÿÿýþ? þùÿÿþuþvÿÿþ.ý)îÿÿþ† þþÿÿþº þ¼ÿÿþ¢ ýâÿÿý¼ þûÿÿþ* þ,ÿÿýú ýÙÿÿýË þõÿÿþÆ þÇÿÿþU ýÒÿÿýÓ þêÿÿþw þxÿÿþ“ ýËÿÿýÚþ×ÿÿþD þFÿÿþÆý ÆÿÿýàþÁÿÿþ þÿÿþÛý Áÿÿýä"þ¢ÿÿþ þÿÿþíý¼ÿÿýè'þ€ÿÿþ þÿÿþûý¸ÿÿýì,þQÿÿþ þÿÿþìý³ÿÿýï1þÿÿþ þÿÿþÙý®ÿÿýó8þÞÿÿþD þFÿÿþÂý©ÿÿýõ>þ—ÿÿþx þyÿÿþ‹þ£ÿÿýøEþ@ÿÿþÇ þÉÿÿþLÿýúMýÝÿÿþ+ þ,ÿÿýôÿýüUþjÿÿþ» þ¼ÿÿþÿýþ^ýÛÿÿþuþvÿÿýúÿþgýEþÿÿý~ýÿÿþsÿþ8 þ„ÿÿ÷Óm( (mÓÿÿþ±ÿþ8 ýšÿÿýµ ÿþ8 ýyüÿ ÿüþ”ÿþ8ý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&J2LÍ0óÿþåþ­ÿÿþª þMÿÿþÓÿþùýúÿÿþI þŒÿÿþÿþïþoÿÿýå þÃÿÿþIÿþÒþÐÿÿþ‡ þÚÿÿþÿþ™þ1ÿÿþ& þíÿÿþÿþ>þ’ÿÿþÄ þûÿÿþýÿÃýìÿÿþc þïÿÿþýñ'þTÿÿýõ þÝÿÿþþ>þ¶ÿÿþ¡ þÉÿÿþH"ýüÿÿþ? þ—ÿÿþ~"þxÿÿýÝ þYÿÿþÑ"þØÿÿþ}ýüÿÿþ:þþ:ÿÿýýþ©ÿÿýÎýÆ þ›ÿÿþ»þ5ÿÿþ•üÿ¼ý ñÿÿþYþ›ÿÿý£ÿþoþ]ÿÿýïý Òÿÿôëˆ;;ÿÿî þ¾ÿÿþ—ýÕÿ ÿþaý þÿÿþ6ý¸ÿ ÿþ¦þ€ÿÿþÔýNÒÿ ÿþÙýßÿÿþsö4{»×ìüòÖÿÿþðþCÿÿýû!ÿþúþ¤ÿÿþ±"ÿþéýöÿÿþP"ÿþÕþfÿÿýé"ÿþ³þÇÿÿþ#ÿþoþ(ÿÿþ,#ÿþ)þ‰ÿÿþË$ÿþ¶ýæÿÿþjý± üÿþ1þKÿÿý÷ûÿô‡ýÿxþ¬ÿÿþ§ÿôú°i./d±“ýùÿÿþF ÿþnÿÿýã ÿþÏÿÿþ„ü3˜ðÿÿ4ôB†·ßñüóß¹ƒ>2LÍü´v&ð.e’¶ØêöúëÜÁ[ö.e’ÿÿþ·-û$lµóÿ ÿüø¨6û$lµóÿÿýûw ÿüý• ÿþ— ÿýÏ ÿýŒíÿÿþ€ ÿóÞg5 5g·üÿÿýÔ ÿúÞ«ÿÿýýB ÿüå‡4 ý'Àÿÿþ ÿüå‡4ý ÿÿýØ üÉZ ý«ÿÿýü! üÉZýÕÿÿþfý ãÿÿþwþAÿÿýÚþtÿÿþÁþÖÿÿþ=þ,ÿÿþàþÿÿþ•þÿÿþøþKÿÿþÜþ ÿÿþòþ!ÿÿþþ#ÿÿþØþÿÿþOþeÿÿþ¡þÿÿþ}ýÑÿÿþJþÿÿþŸþ‹ÿÿýÏþ ÿÿþ¿ý¢ÿÿýö1þJÿÿþÔù*Z¢ôÿÿýôIþÿÿþç ÿýÅ*þÿþÓÿÿþô ÿý¬Eþÿþ=ÿÿþù ÿüö¯>þÿýÑÿÿþþ ÿý±úÿ™ÿÿþøù 4i®ûÿÿýàý¥ÿÿþðý¦ÿÿý× ý‰ëÿÿþÞÿÿþßýcþÿÿþÿýèDÿÿþÇþzÿÿýøÿüÓ$8ÿÿþ©ýØÿÿþsÿúð~ Sÿÿþþwÿÿþ³ü¥^ þ‚ÿÿþPþ0ÿÿþàþ»ÿÿþþÿÿþôýñÿÿþÐþÿÿþûþJÿÿþ|þÿÿþîþ®ÿÿýý!þ=ÿÿþÏý$úÿÿþ°þˆÿÿþŸþ¼ÿÿýþ2ý çÿÿþYþpÿÿþ¡þ–ÿÿýï þlÿÿýå ý¼5ý†ÿÿþzý¼5ý¬ÿÿýù> ÿü´U ý5ÅÿÿýÑÿü´U þ÷ÿÿýüZ ÿòò¯}K($OÒÿÿýå ÿûò¯}KÿÿýöT ÿýÒ! ÿýÑ- ÿüø} ÿüØeû'vÃúÿ ÿüà û'vÃúÿÿþ:ï ?vŸÃáïúøêÛÉj5ú ?vŸÃ>2LÍô¶ØêöúëÜÁ[3 ÿüø¨6ÿ ÿüý• ÿ ÿýÏ ÿ õg5 5g·üÿÿýÔ ÿý'Àÿÿþ ÿ&ý«ÿÿýü! ÿ'ý ãÿÿþw ÿ(þtÿÿþÁ ÿ(þ,ÿÿþà ÿ(þÿÿþø ÿ(þ ÿÿþò ÿ(þ#ÿÿþØ ÿ(þeÿÿþ¡ ÿ'ýÑÿÿþJ ÿ'þ‹ÿÿýÏ ÿôn«×òüïÛÇ”Sý¢ÿÿýö1 ÿüù›#ù*Z¢ôÿÿýôI ÿüü~ ÿýÅ* ÿý³ ÿý¬EÿóúÁ}P' !IŠàÿÿý´ ÿüö¯>üÍhüfñÿÿþŠ ÿý±ý'Ûÿÿýý* ù 4i®ûÿÿýàý&ïÿÿþªý¦ÿÿý× þ`ÿÿýþýcþÿÿþýÛÿÿþ_þzÿÿýøþ…ÿÿþ£ýØÿÿþsþBÿÿþÍþwÿÿþ³þÿÿþáþ0ÿÿþàþ ÿÿþõþÿÿþôþ ÿÿþúþÿÿþûþÿÿþîþÿÿþîþCÿÿþÒþ=ÿÿþÏþ‡ÿÿþªþˆÿÿþŸýÝÿÿþoý çÿÿþYþeÿÿþþ–ÿÿýï ýž ý*ñÿÿþ¶ý†ÿÿþzüÿÚB ý+ßÿÿýý6ý5ÅÿÿýÑÿýµ>ülôÿÿþ ö($OÒÿÿýå ÿôàšV0"NŽæÿÿýº ÿýÒ! ÿý§ ÿüø} ÿýóa ÿüà û)zÊýÿ ÿüãyôáïúøêÛÉj5ðI¨ÍæóüñàÏ«r8P2LÍô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿ ýúÿÿýœý ÿÿýØ úæ³€Mÿ þÿÿýÑ ýÕÿÿþfÿ ýôÿÿþ> þAÿÿýÚÿ þMÿÿþÓ þÖÿÿþ=ÿ þŒÿÿþ þÿÿþ•ÿ þÃÿÿþI þKÿÿþÜÿ þÚÿÿþ þ!ÿÿþÿ þíÿÿþ þÿÿþOÿ þûÿÿþ þÿÿþ}ÿ þïÿÿþ þÿÿþŸÿ þÝÿÿþ þ ÿÿþ¿ÿ þÉÿÿþH þJÿÿþÔÿ þ—ÿÿþ~ þÿÿþçÿ þYÿÿþÑ þÓÿÿþôÿ ýüÿÿþ: þ=ÿÿþùÿ þ©ÿÿýÎ ýÑÿÿþþÿ þ5ÿÿþ•ý™ÿÿþøÿ þ›ÿÿý£ý¥ÿÿþðÿ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿ ýÕÿÿýèDÿÿþÇÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿó4{»×ìüòÖ¥^ þ‚ÿÿþPÿ þ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ ý± þlÿÿýåÿ ûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØeÿóB†·ßñüóß¹ƒ:m2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿý)Îÿÿ ÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿ ý;øÿÿý°!û‰õÿ ÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿôn«×òüïÛÇ”Sþ©ÿÿü7"Ðÿ ÿý° ÿüù›#þÈÿÿýBæÿÿýÍ ÿþüþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿþðÿÿý~ýÿÿþ ÿóúÁ}P' !IŠàÿÿþùÿÿþuþvÿÿþ. üÍhúfñÿÿþþÿÿþº þ¼ÿÿþ¢ü'Ûÿþûÿÿþ* þ,ÿÿýúý&ïþõÿÿþÆ þÇÿÿþUþ`þêÿÿþw þxÿÿþ“þþ×ÿÿþD þFÿÿþÆ"þÁÿÿþ þÿÿþÛ"þ¢ÿÿþ þÿÿþí"þ€ÿÿþ þÿÿþû"þQÿÿþ þÿÿþì"þÿÿþ þÿÿþÙ#þÞÿÿþD þFÿÿþÂ#þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþLþýÝÿÿþ+ þ,ÿÿýôþeþjÿÿþ» þ¼ÿÿþýž ý*ñýÛÿÿþuþvÿÿýúüÿÚB ü+ßÿ ýEþÿÿý~ýÿÿþsÿýµ>úlôÿÿ þ„ÿÿ÷Óm( (mÓÿÿþ± ÿôàšV0"NŽæÿÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ” ÿþó ý.¸ÿ ÿý¼4 û)zÊýÿ ÿüãyô'xµÞôûêÔ´o&ðI¨ÍæóüñàÏ«r8@2LÍ9ø@v©Óæùÿÿù%[Æ÷ÿÿû [ªñÿÿúO…ºïÿÿü2—ñÿ ÿÿÿÿÿúâ“R% ÿúæ³€MÿÿÿûþµDúæ³€Mÿÿý¼3!ÿüÿæV#ÿý¨$ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿý~ÿüÿ³ ÿÿý´ÿÿþŠÿÿýý*ÿÿþªÿÿýþÿþÛÿÿþ_ÿþ…ÿÿþ£ÿýBÿÿþÍÿü Æÿÿþáÿû Áÿ ÿÿþõÿú¼ÿÿ ÿÿþúÿý¸ÿÿþÿÿþîÿý³ÿÿþCÿÿþÒÿý®ÿÿþ‡ÿÿþªÿý©ÿÿýõÝÿÿþoÿý£ÿÿýøEÿÿþÿýÿÿüúMÿÿþ¶ÿþ•ÿÿûüUÿÿýý6ÿþÿÿýþ^ÿþÿþ…ÿÿþgÿýº ÿ ÿý§ ÿ ÿþaÿ ÿÿ ÿ€€2€L€ÍÈùóâѧn2ÿûÏdÿÿýÒ0ÿÿùú9xÚÿÿüeõÿÿû0ðÿÿüIÿÿýµÿýXÿýÿýÿý ÿý4ÿýyÿüÚÿü\ÿÿûåÿÿþ¨ÿÿþkÿÿýBúÿÿý)îÿÿýâÿÿû¼ÙÿÿûË ÒÿÿûÓËÿÿûÚÿÿýàÿýä"ÿýè'ÿýì,üÿï1ýó8þ>9'ÿ2LÍó7€·Þñüñß¶†A/übÖÿ ÿüð—2ù%[Æ÷ÿÿý)Îÿÿ úO…ºïÿÿýPõÿÿ ÿýVüÿÿôø´g1.k²úÿÿ ÿý;øÿÿý°!û‰õÿ ÿúæ³€Mÿÿ ýãÿÿþo ý± úæ³€Mÿ þžÿÿþr%ÿ ý0ýÿÿþ½&ÿ þ®ÿÿýú%&ÿ ý üÿÿþ­'ÿ þ{ÿÿþJ'ÿ þÏÿÿýñ'ÿ ýþÿÿþº(ÿ þPÿÿþó \¤ÔòûëÕ¹x1ÿ þ€ÿÿúRzïÿÿýÎHÿ þ©ÿÿü7"Ðÿ ÿý° ÿ þÈÿÿýBæÿÿýÍÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊÿ þðÿÿý~ýÿÿþÿ þùÿÿþuþvÿÿþ.ÿ þþÿÿþº þ¼ÿÿþ¢ÿ þûÿÿþ* þ,ÿÿýúÿ þõÿÿþÆ þÇÿÿþUÿ þêÿÿþw þxÿÿþ“ÿ þ×ÿÿþD þFÿÿþÆÿ þÁÿÿþ þÿÿþÛÿ þ¢ÿÿþ þÿÿþíÿ þ€ÿÿþ þÿÿþûÿ þQÿÿþ þÿÿþìÿ þÿÿþ þÿÿþÙÿ þÞÿÿþD þFÿÿþÂÿ þ—ÿÿþx þyÿÿþ‹ÿ þ@ÿÿþÇ þÉÿÿþLÿ ýÝÿÿþ+ þ,ÿÿýôÿ þjÿÿþ» þ¼ÿÿþÿ ýÛÿÿþuþvÿÿýúÿ ýEþÿÿý~ýÿÿþsÿþ„ÿÿ÷Óm( (mÓÿÿþ± ÿýšÿÿýµ ÿ ýyüÿ ÿüþ” ÿ ý.¸ÿ ÿý¼4ÿ2LÍð.e’¶ØêöúëÜÁ[,û$lµóÿ ÿüø¨6ù%[Æ÷ÿÿ ÿüý• úO…ºïÿÿ ÿýÏ ÿ ÿóÞg5 5g·üÿÿýÔ ÿ ÿüå‡4 ý'Àÿÿþ ÿúæ³€Mÿÿ üÉZ ý«ÿÿýü! úæ³€Mÿý ãÿÿþwÿþtÿÿþÁÿþ,ÿÿþàÿþÿÿþøÿþ ÿÿþòÿþ#ÿÿþØÿþeÿÿþ¡ÿýÑÿÿþJÿþ‹ÿÿýÏÿý¢ÿÿýö1ÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿþzÿÿýøÿýØÿÿþsÿ þwÿÿþ³ÿ þ0ÿÿþàÿ þÿÿþôÿ þÿÿþûÿ þÿÿþîÿ þ=ÿÿþÏÿ þˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø}ÿ û'vÃúÿ ÿüà ÿ2L͘ð.e’¶ØêöúëÜÁ[þÿû$lµóÿ ÿüø¨6þÿÿüý•þÿÿýÏþÿÿóÞg5 5g·üÿÿýÔ þÿÿüå‡4 ý'ÀÿÿþþÿüÉZ ý«ÿÿýü!þÿ$ý ãÿÿþwþÿ%þtÿÿþÁþÿ%þ,ÿÿþàþÿ%þÿÿþøþÿ%þ ÿÿþòþÿ%þ#ÿÿþØþÿ%þeÿÿþ¡ýAÿ$ýÑÿÿþJü Þÿ$þ‹ÿÿýÏü”ÿÿ"ý¢ÿÿýö1û?þÿÿù*Z¢ôÿÿýôIý Üÿÿ ÿýÅ*þ‘ÿÿ ÿý¬Eý<ýÿÿ ÿüö¯>ý Úÿÿýèÿÿý± þŽÿÿýTÿù 4i®ûÿÿýà ý9ýÿÿü¯ÿ"ý¦ÿÿý× ýØÿÿûïÿ$ýcþÿÿþþ‹ÿÿûcÿ%þzÿÿýøý7üÿÿþ½þÿ%ýØÿÿþsþÖÿÿýõ"þÿ&þwÿÿþ³ÿþrþÿ&þ0ÿÿþà ÿ'þÿÿþô ÿ'þÿÿþû ÿ'þÿÿþî ÿ'þ=ÿÿþÏþÿ&þˆÿÿþŸþÿ%ý çÿÿþYþÿ%þ–ÿÿýï þÿý¼5ý†ÿÿþzþÿÿü´U ý5ÅÿÿýÑ ÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà2LÍÇþLÿÿ ÿýåÿÿ ÿþ ÿÿ ÿþë þJÿÿ ÿþ ýäÿÿþ¯ÿÿþ)ÿÿþ/ þÿÿýïÿÿþŠÿÿþÎ þGÿÿýdÿÿýçÿÿþm ýâÿÿü½ÿÿþLÿÿýø þšÿÿûõ"ÿÿþ­ÿÿþª þDÿÿþsÿýúÿÿþI ý àÿÿýÊÿþoÿÿýå þ—ÿÿýú-ÿþÐÿÿþ‡ þþÿÿþ‚ÿþ1ÿÿþ& ÿýÕÿþ’ÿÿþÄ ÿýý8ÿýìÿÿþc ÿþ‘ÿþTÿÿýõ üÿß ÿþ¶ÿÿþ¡ ýÿFÿýüÿÿþ? þ ÿþxÿÿýÝ þÿþØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿý÷ÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„2L͈ô%n³ÓéûòÝ´v&ó þAÿÿýÚþÌÿÿþf þhÿÿüËMÿÿþÓ þÖÿÿþ=þæÿÿþ$ þ&ÿÿüåŒÿÿþ þÿÿþ•þúÿÿþ þ ÿÿüùÃÿÿþI þKÿÿþÜþðÿÿþ þ ÿÿüïÚÿÿþ þ!ÿÿþþÓÿÿþ$ þ%ÿÿüÒíÿÿþ þÿÿþOþšÿÿþe þgÿÿü™ûÿÿþ þÿÿþ}þAÿÿýÑ ýÔÿÿü>ïÿÿþ þÿÿþŸþÆÿÿþ þ‡ÿÿûÃÝÿÿþ þ ÿÿþ¿ý*óÿÿýý •ÿÿúñ'ÉÿÿþH þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þ—ÿÿþ~ þÿÿþç ý&ÃÿÿýÂ$þYÿÿþÑ þÓÿÿþô üD¦þÿÿüþ¥Cýüÿÿþ: þ=ÿÿþù ü'›íÿ ÿüí›'þ©ÿÿýÎ ýÑÿÿþþ üüÿÿüü‘þ5ÿÿþ•ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþoýÕÿÿýèDÿÿþÇý ïÿÿþc þfÿÿýî ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþaýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)ý± þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ûÿô‡ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1ÿôú°i./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþxÿýöTþ”ÿÿþ“ÿýÑ-ý_òÿÿýò_ü3˜ðÿ ÿüØeüŠíÿ ÿüíŠ2LÍÎù%[Æ÷ÿÿ!þLÿÿ úO…ºïÿÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿ ÿúæ³€Mÿÿýäÿÿü¯ÿÿúæ³€MÿþÿÿûïÿÿÿþGÿÿûdÿÿÿýâÿÿú½ÿÿÿþšÿÿùõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿÿÿÿÿÿÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿ ÿÿ ÿÿ ÿÿ ÿÿ2LÍ”ð.e’¶ØêöúëÜÁ[û%n³Óÿÿ û$lµóÿ ÿüø¨6ý3¼ÿÿ ÿüý•ü“þÿÿ ÿýÏ ý µÿÿ ÿóÞg5 5g·üÿÿýÔ ý²ÿÿüì‹=ÿÿ ÿüå‡4 ý'Àÿÿþ þtÿÿû¨ÿÿ üÉZ ý«ÿÿýü! ýúÿÿýœÿý ãÿÿþw þÿÿýÑÿ þtÿÿþÁýôÿÿþ>ÿ þ,ÿÿþàþMÿÿþÓÿ þÿÿþøþŒÿÿþÿ þ ÿÿþòþÃÿÿþIÿ þ#ÿÿþØþÚÿÿþÿ þeÿÿþ¡þíÿÿþÿýÑÿÿþJþûÿÿþÿþ‹ÿÿýÏþïÿÿþÿý¢ÿÿýö1 þÝÿÿþÿù*Z¢ôÿÿýôI þÉÿÿþHÿ ÿýÅ* þ—ÿÿþ~ÿ ÿý¬E þYÿÿþÑÿ ÿüö¯> ýüÿÿþ:ÿÿý± þ©ÿÿýÎÿù 4i®ûÿÿýà þ5ÿÿþ•ÿý¦ÿÿý× þ›ÿÿû£ÿÿýcþÿÿþ ý Òÿÿüëˆ;ÿÿ þzÿÿýø ýÕÿÿ ýØÿÿþs ý¸ÿÿ!þwÿÿþ³ ýNÒÿ ÿþ0ÿÿþàú4{»×ÿÿþÿÿþôÿþÿÿþûÿþÿÿþîÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþz ý±ÿ ÿü´U ý5ÅÿÿýÑ ûÿô‡ÿ ÿòò¯}K($OÒÿÿýå ÿùú°i.ÿÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüàü3˜ðÿÿ2LÍ€øéûòÝ´v&7ÿüþ·-ù%[Æ÷ÿÿÿýûwúO…ºïÿÿ ÿþ— ÿù=Œíÿÿþ€ ÿý«ÿÿýýB ÿúæ³€Mÿÿý ÿÿýØ úæ³€MÿþýÕÿÿþfÿþžþAÿÿýÚÿý0ýþÖÿÿþ=ÿý®ÿþÿÿþ•ÿü üÿþKÿÿþÜÿü{ÿÿþ!ÿÿþÿüÏÿÿþÿÿþOÿûþÿÿþÿÿþ}ÿþPÿÿþÿÿþŸÿþ€ÿÿþ ÿÿþ¿ÿþ©ÿÿþJÿÿþÔÿþÈÿÿþÿÿþçÿþàÿÿþÓÿÿþôÿþðÿÿþ=ÿÿþùÿþùÿÿýÑÿÿþþÿþþÿÿý™ÿÿþøÿþûÿÿý¥ÿÿþðÿþõÿÿù;‰ëÿÿþÞÿÿþßÿþêÿ ÿýèDÿÿþÇÿþ×ÿ ÿüÓ$8ÿÿþ©ÿþÁÿÿúð~ Sÿÿþÿþ¢ÿÿøìüòÖ¥^ þ‚ÿÿþPÿþ€ÿÿ þ»ÿÿþÿþQÿÿýñÿÿþÐÿþÿÿþJÿÿþ|ÿüÞÿÿþ®ÿÿýý!ÿü—ÿÿý$úÿÿþ°ÿü@ÿÿþ¼ÿÿýþ2ÿüÝÿþpÿÿþ¡ÿýjÿþlÿÿýåÿýÛý¬ÿÿýù>ÿùE/d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ÿüØeÿ 2L͇ó7€·Þñüñß¶†Að.e’¶ØêöúëÜÁ[übÖÿ ÿüð—2 û$lµóÿ ÿüø¨6 ý)Îÿÿ ÿüý• ýPõÿÿ ÿýÏýVüÿÿôø´g1.k²úÿÿ ÿóÞg5 5g·üÿÿýÔ ý;øÿÿý°!û‰õÿ ÿüå‡4 ý'Àÿÿþþãÿÿþo ý± üÉZ ý«ÿÿýü!ÿþr,ý ãÿÿþwÿþ½.þtÿÿþÁÿýú%.þ,ÿÿþàÿþ­/þÿÿþøÿþJ/þ ÿÿþòüÿñ/þ#ÿÿþØýÿº0þeÿÿþ¡ýÿó \¤ÔòûëÕ¹x1 ýÑÿÿþJùÿRzïÿÿýÎHþ‹ÿÿýÏûÿ7"Ðÿ ÿý° ý¢ÿÿýö1üÿBæÿÿýÍù*Z¢ôÿÿýôIýÿÝÿÿ÷Ón( (nÓÿÿýÊ ÿýÅ*ÿý~ýÿÿþ ÿý¬E ÿþuþvÿÿþ. ÿüö¯>ÿþº þ¼ÿÿþ¢ÿý±ÿþ* þ,ÿÿýúù 4i®ûÿÿýàÿþÆ þÇÿÿþUý¦ÿÿý× ÿþw þxÿÿþ“ýcþÿÿþÿþD þFÿÿþÆþzÿÿýøÿþ þÿÿþÛýØÿÿþsÿþ þÿÿþíþwÿÿþ³ÿþ þÿÿþûþ0ÿÿþàÿþ þÿÿþìþÿÿþôÿþ þÿÿþÙþÿÿþûÿþD þFÿÿþÂþÿÿþîÿþx þyÿÿþ‹þ=ÿÿþÏÿþÇ þÉÿÿþLþˆÿÿþŸÿþ+ þ,ÿÿýôý çÿÿþYÿþ» þ¼ÿÿþþ–ÿÿýï ÿþuþvÿÿýúý¼5ý†ÿÿþzþþÿÿý~ýÿÿþsÿü´U ý5ÅÿÿýÑþ„ÿÿ÷Óm( (mÓÿÿþ± ÿòò¯}K($OÒÿÿýåýšÿÿýµ ÿýÒ!ýyüÿ ÿüþ” ÿüø} ý.¸ÿ ÿý¼4 û'vÃúÿ ÿüà 2LͰô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿþýþÿÿýïÿÿ ýúÿÿýœý ÿÿþGÿÿýdÿÿ þÿÿýÑ ýÕÿÿ ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿ þšÿÿûõ"ÿÿ þMÿÿþÓ üÖÿÿ þDÿÿþsÿ þŒÿÿþ üÿÿ ý àÿÿýÊÿ þÃÿÿþI üKÿÿ þ—ÿÿýú-ÿ þÚÿÿþ ü!ÿÿ ýAþÿÿþ‚ÿ þíÿÿþ üÿÿý ÞÿÿýÕÿ þûÿÿþ üÿÿþ”ÿÿýý8ÿ þïÿÿþ üÿÿý?þÿÿþ‘ÿ þÝÿÿþ ü ÿÿý Üÿÿýß ÿ þÉÿÿþH üJÿÿþ‘ÿÿþFÿ þ—ÿÿþ~ üÿÿý<ýÿÿþ ÿ þYÿÿþÑ üÓÿÿý Úÿÿýèÿ ýüÿÿþ: þ=ÿÿþŽÿÿþTÿ þ©ÿÿýÎ ýÑÿÿý9ýÿÿþ¯ ÿ þ5ÿÿþ•ý™ÿÿýØÿÿýï ÿþ›ÿÿý£ý¥ÿÿþ‹ÿÿþc ÿý Òÿÿöëˆ;;‰ëÿÿýÞÿý7üÿÿþ½ ÿýÕÿÿüèDÿþÖÿÿýõ" ÿý¸ÿ ÿûÓ$8ÿÿþr ÿýNÒÿÿùð~ Sÿÿ ó4{»×ìüòÖ¥^ ý‚ÿÿý»ÿÿüñÿÿüJÿÿÿ!ü®ÿÿÿ û$úÿÿÿ þ¼ÿÿÿþpÿÿÿý± þlÿÿþåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe2LÍ»ú7€·Þñù%[Æ÷ÿÿübÖÿÿ úO…ºïÿÿý)Îÿÿ ÿýPõÿÿ ÿýVüÿÿùø´g1B ÿúæ³€Mÿÿý;øÿÿý°!ýØ úæ³€MÿýãÿÿþoýÿfÿþžÿÿþrüÿÚÿý0ýÿÿþ½ÿþ=ÿþ®ÿÿýú%ÿþ•ÿý üÿÿþ­ÿþÜÿþ{ÿÿþJÿþÿþÏÿÿýñÿþOÿýþÿÿþºÿþ}ÿþPÿÿþø \¤ÔòûëÿÿþŸÿþ€ÿÿúRzïÿÿþ¿ÿþ©ÿÿü7"Ðÿ ÿþÔÿþÈÿÿýBæÿ ÿþçÿþàÿÿþÝÿÿúÓn( ÿÿþôÿþðÿÿý~ÿþùÿþùÿÿþuÿþþÿþþÿÿþºÿþøÿþûÿÿþ*ÿþðÿþõÿÿþÆÿþßÿþêÿÿþwÿþÇÿþ×ÿÿþDÿþ©ÿþÁÿÿþÿþÿþ¢ÿÿþÿþPÿþ€ÿÿþÿþÿþQÿÿþÿþÐÿþÿÿþÿþ|ÿþÞÿÿþDüÿý!ÿþ—ÿÿþxýÿ°ÿþ@ÿÿþÇýþ2ÿýÝÿÿþ+þ¡ÿþjÿÿþ»þÿýÛÿÿþuÿýEþÿÿý~ÿ þ„ÿÿúÓm( ÿ ýšÿÿÿýyüÿÿÿý.¸ÿÿ2LÍ€øüñß¶†Að.e’¶ØêöúëÜÁ[ü@vÿÿüð—2 û$lµóÿ ÿüø¨6û [ªñÿ ÿ ÿüý• ü2—ñÿ ÿ ÿýÏ ÿù.k²úÿÿ ÿóÞg5 5g·üÿÿýÔ ÿþâû‰õÿ ÿüå‡4 ý'Àÿÿþ ÿûþµDý± üÉZ ý«ÿÿýü!ÿý¼3(ý ãÿÿþwüÿæV+þtÿÿþÁý¨,þ,ÿÿþà8þÿÿþø8þ ÿÿþò8þ#ÿÿþØ8þeÿÿþ¡úÕ¹x1 ýÑÿÿþJÿýÎHþ‹ÿÿýÏÿý° ý¢ÿÿýö1ÿýÍù*Z¢ôÿÿýôIü(nÓÿÿýÊ ÿýÅ*ýÿÿþ ÿý¬Eþvÿÿþ. ÿüö¯>þ¼ÿÿþ¢ÿý±þ,ÿÿýúù 4i®ûÿÿýàþÇÿÿþUý¦ÿÿý× þxÿÿþ“ýcþÿÿþþFÿÿþÆþzÿÿýøþÿÿþÛýØÿÿþsþÿÿþíþwÿÿþ³þÿÿþûþ0ÿÿþàþÿÿþìþÿÿþôþþÿÿþÙþÿÿþû ý³þFÿÿþÂþÿÿþî ü®ÿþyÿÿþ‹þ=ÿÿþÏ û©ÿÿþÉÿÿþLþˆÿÿþŸ ý£ÿÿþ,ÿÿýôý çÿÿþY ýÿÿþ¼ÿÿþþ–ÿÿýï þ•ÿÿþvÿÿýúý¼5ý†ÿÿþz þÿÿúþÿÿþsÿü´U ý5ÅÿÿýÑþ…ÿÿûg(mÓÿÿþ± ÿòò¯}K($OÒÿÿýå ÿýµ ÿýÒ! ÿüþ” ÿüø} ÿý¼4 û'vÃúÿ ÿüà ÿ2LÍ€õ©Óæùóâѧn2ô%n³ÓéûòÝ´v& ÿüÏdý3¼ÿÿüþ·- ÿýÒ0ü“þÿ ÿýûw ÿýú]ý µÿÿþ— ö“R% 9xÚÿÿýüT ý²ÿÿöì‹==Œíÿÿþ€üeõÿÿý÷! þtÿÿý¨ý«ÿÿýýBý0ðÿÿþ± ýúÿÿýœý ÿÿýØþIÿÿþ* þÿÿýÑ ýÕÿÿþfþµÿÿþzýôÿÿþ> þAÿÿýÚþXÿÿþ¿þMÿÿþÓ þÖÿÿþ=þÿÿþÜþŒÿÿþ þÿÿþ•þÿÿþôþÃÿÿþI þKÿÿþÜþ ÿÿþôþÚÿÿþ þ!ÿÿþþ4ÿÿþßþíÿÿþ þÿÿþOþyÿÿþÅþûÿÿþ þÿÿþ}ýÚÿÿþ‰þïÿÿþ þÿÿþŸþ\ÿÿþFþÝÿÿþ þ ÿÿþ¿ýåÿÿýæþÉÿÿþH þJÿÿþÔþ¨ÿÿþr þ—ÿÿþ~ þÿÿþçþkÿÿýÛ þYÿÿþÑ þÓÿÿþôýBúÿÿýþ? ýüÿÿþ: þ=ÿÿþù ý)îÿÿþ† þ©ÿÿýÎ ýÑÿÿþþ ýâÿÿý¼ þ5ÿÿþ•ý™ÿÿþø ýÙÿÿýË þ›ÿÿý£ý¥ÿÿþð ýÒÿÿýÓý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ýËÿÿýÚýÕÿÿýèDÿÿþÇú7 Æÿÿýàý¸ÿ ÿüÓ$8ÿÿþ©ûÖ Áÿÿýä"ýNÒÿÿúð~ Sÿÿþüÿ¼ÿÿýè'ó4{»×ìüòÖ¥^ þ‚ÿÿþPýÿ¸ÿÿýì,(þ»ÿÿþÿýï1(ýñÿÿþÐÿýó8)þJÿÿþ|ÿýõ>*þ®ÿÿýý!ÿýøE*ý$úÿÿþ°üÿúM+þ¼ÿÿýþ2ýüU+þpÿÿþ¡ þ^ý± þlÿÿýå(ûÿô‡ý¬ÿÿýù> ÿþ8 ÿôú°i./d±÷ÿÿýüZ ÿþ8 ÿýöT ÿþ8 ÿýÑ- ÿþ8 ü3˜ðÿ ÿüØe2Lͯó7€·Þñüñß¶†AþLÿÿübÖÿ ÿüð—2ýåÿÿý)Îÿÿþ ÿÿýPõÿÿþJÿÿýVüÿÿôø´g1.k²úÿÿýäÿÿþ¯ÿÿý;øÿÿý°!û‰õÿ þÿÿýïÿÿýãÿÿþo ý± þGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñýAþÿÿþ‚ÿ ýþÿÿþºý ÞÿÿýÕÿ þPÿÿþó \¤ÔòûëÕ¹x1 þ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿýÎH ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿ ÿý° ý Üÿÿýß ÿ þÈÿÿýBæÿÿýÍþ‘ÿÿþFÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊý<ýÿÿþ ÿ þðÿÿý~ýÿÿþý Úÿÿýèÿ þùÿÿþuþvÿÿþ.þŽÿÿþTÿ þþÿÿþº þ¼ÿÿú¢9ýÿÿþ¯ ÿ þûÿÿþ* þ,ÿÿûúØÿÿýï ÿ þõÿÿþÆ þÇÿÿýU‹ÿÿþc ÿ þêÿÿþw þxÿÿý“üÿÿþ½ ÿ þ×ÿÿþD þFÿÿþÆÿÿýõ" ÿ þÁÿÿþ þÿÿþÛÿÿþr ÿ þ¢ÿÿþ þÿÿþíÿÿþ€ÿÿþ þÿÿþûÿÿþQÿÿþ þÿÿþìÿÿþÿÿþ þÿÿþÙÿÿþÞÿÿþD þFÿÿþÂÿ þ—ÿÿþx þyÿÿþ‹ÿ þ@ÿÿþÇ þÉÿÿþLÿ ýÝÿÿþ+ þ,ÿÿýôÿþjÿÿþ» þ¼ÿÿþÿýÛÿÿþuþvÿÿýúÿýEþÿÿý~ýÿÿþsÿþ„ÿÿ÷Óm( (mÓÿÿþ±ÿýšÿÿýµ ÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼42LÍ´ô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿýþ·úO…ºïÿÿü“þÿ ÿ ÿý µÿ ÿ ÿý²ÿÿôì‹==Œíÿÿÿúæ³€Mÿÿþtÿÿý¨ü«ÿúæ³€Mÿýúÿÿýœý ÿþÿÿýÑ þÿýôÿÿþ>ÿþMÿÿþÓ ÿþŒÿÿþ ÿþÃÿÿþI ÿþÚÿÿþ ÿþíÿÿþ ÿþûÿÿþ ÿþïÿÿþ ÿþÝÿÿþ ÿþÉÿÿþH ÿþ—ÿÿþ~ ÿþYÿÿþÑ ÿýüÿÿþ:ÿþ©ÿÿýÎ þÿþ5ÿÿþ•ý™ÿþ›ÿÿý£ü¥ÿÿý Òÿÿôëˆ;;‰ëÿÿÿýÕÿ ÿÿý¸ÿ ÿÿýNÒÿÿýð~ÿó4{»×ìüòÖ¥^ ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ%þpÿý± ýlÿÿûÿô‡û¬ÿÿ ÿ ÿôú°i./d±÷ÿÿ ÿ ÿ ÿ ÿþÑ ÿ ü3˜ðÿ ÿýØe2LÍ”ð.e’¶ØêöúëÜÁ[þ-û$lµóÿ ÿüø¨6 ÿýûw ÿüý• ÿþ— ÿýÏ ÿþ€ ÿóÞg5 5g·üÿÿýÔ ÿýýB ÿüå‡4 ý'ÀÿÿþÿýØ üÉZ ý«ÿÿýü!þÕÿÿþfý ãÿÿþwþAÿÿýÚþtÿÿþÁþÖÿÿþ=þ,ÿÿþàþÿÿþ•þÿÿþøþKÿÿþÜþ ÿÿþòþ!ÿÿþþ#ÿÿþØþÿÿþOþeÿÿþ¡þÿÿþ}ýÑÿÿþJþÿÿþŸþ‹ÿÿýÏþ ÿÿþ¿ý¢ÿÿýö1þJÿÿþÔù*Z¢ôÿÿýôIþÿÿþç ÿýÅ*þÓÿÿþô ÿý¬Eþ=ÿÿþù ÿüö¯>þÑÿÿþþ ÿý±ÿþøù 4i®ûÿÿýàÿþðý¦ÿÿý× ÿþÞÿÿþßýcþÿÿþüÿèDÿÿþÇþzÿÿýøüÓ$8ÿÿþ©ýØÿÿþsû Sÿÿþþwÿÿþ³û€‚ÿÿþPþ0ÿÿþàúß»ÿÿþþÿÿþôúCÿñÿÿþÐþÿÿþûû¤ÿJÿÿþ|þÿÿþîúöÿ®ÿÿýý!þ=ÿÿþÏúfÿÿ$úÿÿþ°þˆÿÿþŸûÇÿÿ¼ÿÿýþ2ý çÿÿþYþ(ÿÿþ¡þ–ÿÿýï þ‰ÿÿýå ý¼5ý†ÿÿþzýæÿÿýù> ÿü´U ý5ÅÿÿýÑþKÿÿýüZ ÿòò¯}K($OÒÿÿýåþ¬ÿÿýöT ÿýÒ!ýùÿÿþ- ÿüø}þnÿÿþãû'vÃúÿ ÿüàþÏÿÿ„2LÍÀ ÿþLÿÿ ÿýåÿÿ ÿþëþ ÿÿ ÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿþýçÿÿþmþGÿÿýdÿÿþžþLÿÿýøýâÿÿü½ÿÿý0ýþ­ÿÿþªþšÿÿûõ"ÿÿý®ÿýúÿÿþIþDÿÿþsÿ ü üÿþoÿÿýåý àÿÿýÊÿ ü{ÿÿþÐÿÿþ‡þ—ÿÿýú-ÿ üÏÿÿþ1ÿÿþ&ýAþÿÿþ‚ÿ ûþÿÿþ’ÿÿþÄý ÞÿÿýÕÿ þPÿÿýìÿÿþcþ”ÿÿýý8ÿ þ€ÿÿþTÿÿýõ ý?þÿÿþ‘ÿ þ©ÿÿþ¶ÿÿþ¡ý Üÿÿýß ÿ þÈÿÿýüÿÿþ?þ‘ÿÿþFÿ þàÿÿþxÿÿýÝý<ýÿÿþ ÿ þðÿÿþØÿÿþ}ý Úÿÿýèÿ þùÿÿý:ÿÿýýþŽÿÿþTÿ þþÿÿý›ÿÿþ»ý9ýÿÿþ¯ ÿ þûÿÿý ñÿÿþYýØÿÿýï ÿ þõÿÿþ]ÿÿýïþ‹ÿÿþc ÿ þêÿÿþ¾ÿÿþ—ý7üÿÿþ½ ÿ þ×ÿÿþþÿÿþ6þÖÿÿýõ" ÿ þÁÿÿþÔÿþr ÿ þ¢ÿÿþsÿþ€ÿÿýûÿþQÿÿþ±ÿþÿÿþPÿþÞÿÿýé$ÿ þ—ÿÿþ%ÿ þ@ÿÿþ,%ÿ úÝÿÿË&ÿûjÿÿj&ÿûÛ÷&ÿýE§'ÿþF'ÿþ'ÿ:ÿ2L͇ó7€·Þñüñß¶†A/übÖÿ ÿüð—2ù%[Æ÷ÿÿý)Îÿÿ úO…ºïÿÿýPõÿÿ ÿýVüÿÿôø´g1.k²úÿÿ ÿý;øÿÿý°!û‰õÿ ÿúæ³€Mÿÿþãÿÿþo ý± úæ³€Mÿÿþr%ÿÿþ½&ÿÿýú%&ÿÿþ­'ÿÿþJ'ÿüÿñ'ÿýÿº(ÿýÿó \¤ÔòûëÕ¹x1ÿùÿRzïÿÿýÎHÿûÿ7"Ðÿ ÿý° ÿüÿBæÿÿýÍÿýÿÝÿÿ÷Ón( (nÓÿÿýÊÿÿý~ýÿÿþÿÿþuþvÿÿþ.ÿÿþº þ¼ÿÿþ¢ÿÿþ* þ,ÿÿýúÿÿþÆ þÇÿÿþUÿÿþw þxÿÿþ“ÿÿþD þFÿÿþÆÿÿþ þÿÿþÛÿÿþ þÿÿþíÿÿþ þÿÿþûÿÿþ þÿÿþìÿÿþ þÿÿþÙÿÿþD þFÿÿþÂÿÿþx þyÿÿþ‹ÿÿþÇ þÉÿÿþLÿÿþ+ þ,ÿÿýôÿÿþ» þ¼ÿÿþÿÿþuþvÿÿýúÿþþÿÿý~ýÿÿþsÿþ„ÿÿ÷Óm( (mÓÿÿþ± ÿýšÿÿýµ ÿýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4ÿ2L͈ð.e’¶ØêöúëÜÁ[ó7€·Þñüñß¶†Aû$lµóÿ ÿüø¨6übÖÿ ÿýð—ÿüý•ý)Îÿ ÿÿýÏýPõÿÿÿóÞg5 5g·üÿÿýÔ ýVüÿÿòø´g1.k²úÿÿÿüå‡4 ý'Àÿÿþ ý;øÿÿý°!ü‰õüÉZ ý«ÿÿýü! ýãÿÿþo þý ãÿÿþw þžÿÿþr%þtÿÿþÁ ý0ýÿÿþ½&þ,ÿÿþà þ®ÿÿýú%&þÿÿþø ý üÿÿþ­'þ ÿÿþò þ{ÿÿþJ'þ#ÿÿþØ þÏÿÿýñ'þeÿÿþ¡ýþÿÿþº'ýÑÿÿþJþPÿÿþó \¤ÔòûëÕ¹x1þ‹ÿÿýÏþ€ÿÿúRzïÿÿýÎHý¢ÿÿýö1 þ©ÿÿü7"Ðÿ ÿý° ù*Z¢ôÿÿýôI þÈÿÿýBæÿÿþÍ ÿýÅ* þàÿÿþÝÿÿ÷Ón( (nÓÿÿ ÿý¬E þðÿÿý~ýÿÿ ÿüö¯> þùÿÿþuþvÿÿ ÿý± þþÿÿþº ü¼ÿÿù 4i®ûÿÿýà þûÿÿþ* ü,ÿÿý¦ÿÿý× þõÿÿþÆ ýÇÿýcþÿÿþþêÿÿþw ýxÿþzÿÿýøþ×ÿÿþD ýFÿýØÿÿþsþÁÿÿþ ýÿþwÿÿþ³þ¢ÿÿþ ýÿþ0ÿÿþàþ€ÿÿþ ýÿþÿÿþôþQÿÿþ ýÿþÿÿþûþÿÿþ ýÿþÿÿþîþÞÿÿþD ýFÿþ=ÿÿþÏþ—ÿÿþx ýyÿþˆÿÿþŸþ@ÿÿþÇ ýÉÿý çÿÿþYýÝÿÿþ+ ü,ÿÿþ–ÿÿýï þjÿÿþ» ü¼ÿÿý¼5ý†ÿÿþz ýÛÿÿþuþvÿÿÿü´U ý5ÅÿÿýÑ ýEþÿÿý~ýÿÿÿòò¯}K($OÒÿÿýå þ„ÿÿ÷Óm( (mÓÿÿÿýÒ!ýšÿÿþµÿüø}ýyüÿ ÿüþ”û'vÃúÿ ÿüàý.¸ÿ ÿý¼42LÍÀþ2þLÿÿ ÿýåÿÿ ÿþ ÿÿ ÿþJÿÿ ÿýäÿÿþ¯ÿÿþ±þÿÿýïÿÿ3þGÿÿýdÿÿ2ýâÿÿü½ÿÿ2þšÿÿûõ"ÿÿ1þDÿÿþsÿ0ý àÿÿýÊÿ0þ—ÿÿýú-ÿ/ýAþÿÿþ‚ÿ.ý ÞÿÿýÕÿ.þ”ÿÿýý8ÿþý?þÿÿþ‘ÿýT ý Üÿÿýß ÿü¶Ê þ‘ÿÿþFÿûüÿ ý<ýÿÿþ ÿþxÿÿþ. ý ÚÿÿýèÿþØÿÿþ¢ þŽÿÿþTÿþ:ÿÿýúý9ýÿÿþ¯ ÿþ›ÿÿþUýØÿÿýï ÿý ñÿÿþ“þ‹ÿÿþc ÿþ]ÿÿþÆý7üÿÿþ½ ÿþ¾ÿÿþÛþÖÿÿýõ" ÿý þÿÿþíÿþr ÿþ€ÿÿþûÿýßÿÿþìÿþCÿÿþûÿÿþÙÿþ¤ÿÿþ±ÿÿþÂÿýöÿÿþPÿÿþ‹ÿþfÿÿýéÿÿþLÿþÇÿÿùÿÿôÿþ(ÿÿú,ÿÿÿþ‰ÿÿùËÿúÿýæÿÿújÿsÿþKÿÿú÷±ÿþ¬ÿÿþ§þ ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„2Lͼû.e’ÿÿù%[Æ÷ÿÿû$lµóÿ ÿ úO…ºïÿÿÿþë ÿÿþ ÿÿýÞþ)ÿÿþ/ ÿúæ³€Mÿÿÿüå‡4þŠÿÿþÎ úæ³€MÿüÉZýçÿÿþmÿþLÿÿýøÿþ­ÿÿþªÿýúÿÿþIÿþoÿÿýåÿþÐÿÿþ‡ÿþ1ÿÿþ&ÿþ’ÿÿþÄÿþìÿÿþcÿÿýõ ÿÿþ¡ÿÿþ?ÿÿýÝÿÿþ}ÿÿýýÿÿþ»ÿÿþYÿüÿïÿýÿ—ÿýÿ6ÿþÔÿþsÿþÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿ:ÿý¼5$ÿÿü´U ÿ ÿûò¯}Kÿ ÿÿ ÿÿ û'vÃúÿÿ2LÍ€ô¶ØêöúëÜÁ[3 ÿüø¨6þLÿÿ ÿüý•ýåÿÿ ÿýÏþ ÿÿ õg5 5g·üÿÿýÔ þJÿÿý'Àÿÿþýäÿÿþ¯ÿÿý«ÿÿýü!þÿÿýïÿÿý ãÿÿþwþGÿÿýdÿÿþtÿÿþÁýâÿÿü½ÿÿþ,ÿÿþàþšÿÿûõ"ÿÿþÿÿþøþDÿÿþsÿþ ÿÿþòý àÿÿýÊÿþ#ÿÿþØþ—ÿÿýú-ÿþeÿÿþ¡ýAþÿÿþ‚ÿýÑÿÿþJý ÞÿÿýÕÿþ‹ÿÿýÏþ”ÿÿýý8ÿý¢ÿÿýö1ý?þÿÿþ‘ÿù*Z¢ôÿÿýôIý Üÿÿýß ÿ ÿýÅ*þ‘ÿÿþFÿ ÿý¬Eý<ýÿÿþ ÿ ÿüö¯>ý Úÿÿýèÿ ÿý± þŽÿÿþTÿù 4i®ûÿÿýà ý9ýÿÿþ¯ ÿý¦ÿÿý× ýØÿÿýï ÿýcþÿÿþþ‹ÿÿþc ÿþzÿÿýøý7üÿÿþ½ ÿýØÿÿþsþÖÿÿýõ" ÿþwÿÿþ³ÿþr ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿý†ÿÿþzÿý5ÅÿÿýÑÿ ö($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ ÿüàÿ 2L͈ô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿ ýúÿÿýœý ÿÿýØ úæ³€Mÿ þÿÿýÑ ýÕÿÿþfÿ ýôÿÿþ> þAÿÿýÚÿ þMÿÿþÓ þÖÿÿþ=ÿ þŒÿÿþ þÿÿþ•ÿ þÃÿÿþI þKÿÿþÜÿ þÚÿÿþ þ!ÿÿþÿ þíÿÿþ þÿÿþOÿ þûÿÿþ þÿÿþ}ÿ þïÿÿþ þÿÿþŸÿ þÝÿÿþ þ ÿÿþ¿ÿ þÉÿÿþH þJÿÿþÔÿ þ—ÿÿþ~ þÿÿþçÿ þYÿÿþÑ þÓÿÿþôÿ ýüÿÿþ: þ=ÿÿþùÿ þ©ÿÿýÎ ýÑÿÿþþÿ þ5ÿÿþ•ý™ÿÿþøÿ þ›ÿÿý£ý¥ÿÿþðÿ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßÿ ýÕÿÿýèDÿÿþÇÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿó4{»×ìüòÖ¥^ þ‚ÿÿþPÿ þ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ ý± þlÿÿýåÿ ûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØeÿ2LÍŒð.e’¶ØêöúëÜÁ[ô%n³ÓéûòÝ´v&û$lµóÿ ÿüø¨6ý3¼ÿÿýþ·ÿüý•ü“þÿ ÿÿýÏ ý µÿ ÿÿóÞg5 5g·üÿÿýÔ ý²ÿÿôì‹==Œíÿÿÿüå‡4 ý'Àÿÿþ þtÿÿý¨ü«ÿüÉZ ý«ÿÿýü! ýúÿÿýœý ý ãÿÿþw þÿÿýÑ þþtÿÿþÁýôÿÿþ>'þ,ÿÿþàþMÿÿþÓ(þÿÿþøþŒÿÿþ(þ ÿÿþòþÃÿÿþI(þ#ÿÿþØþÚÿÿþ(þeÿÿþ¡þíÿÿþ'ýÑÿÿþJþûÿÿþ'þ‹ÿÿýÏþïÿÿþ%ý¢ÿÿýö1 þÝÿÿþ ù*Z¢ôÿÿýôI þÉÿÿþH ÿýÅ* þ—ÿÿþ~ ÿý¬E þYÿÿþÑ ÿüö¯> ýüÿÿþ:ÿý± þ©ÿÿýÎ þù 4i®ûÿÿýà þ5ÿÿþ•ý™ý¦ÿÿý× þ›ÿÿý£ü¥ÿýcþÿÿþ ý Òÿÿôëˆ;;‰ëÿÿþzÿÿýø ýÕÿ ÿýØÿÿþs ý¸ÿ ÿþwÿÿþ³ ýNÒÿÿýð~þ0ÿÿþàó4{»×ìüòÖ¥^ þÿÿþô8þÿÿþû8þÿÿþî8þ=ÿÿþÏ8þˆÿÿþŸ7ý çÿÿþY7þ–ÿÿýï þpý¼5ý†ÿÿþz ý± ýlÿÿü´U ý5ÅÿÿýÑ ûÿô‡û¬ÿÿÿòò¯}K($OÒÿÿýå ÿôú°i./d±÷ÿÿÿýÒ! ÿÿüø}ÿþÑû'vÃúÿ ÿüàü3˜ðÿ ÿýØe2LÍÀþ-þLÿÿ÷%[Æ÷ûwýåÿÿúO…ºïÿÿþ—þ ÿÿ ÿþ€þJÿÿ ÿýýBýäÿÿþ¯ÿÿÿúæ³€MÿÿýØþÿÿýïÿÿúæ³€MþÕÿÿþfþGÿÿýdÿÿþAÿÿýÚýâÿÿü½ÿÿþÖÿÿþ=þšÿÿûõ"ÿÿþÿÿþ•þDÿÿþsÿþKÿÿþÜý àÿÿýÊÿþ!ÿÿþþ—ÿÿýú-ÿþÿÿþO ýAþÿÿþ‚ÿþÿÿþ} ý ÞÿÿýÕÿþÿÿþŸ þ”ÿÿýý8ÿþ ÿÿþ¿ ý?þÿÿþ‘ÿþJÿÿþÔ ý Üÿÿýß ÿþÿÿþç þ‘ÿÿþFÿþÓÿÿþô ý<ýÿÿþ ÿþ=ÿÿþùý ÚÿÿýèÿþÑÿÿþþþŽÿÿþTÿÿþøý9ýÿÿþ¯ ÿÿþðýØÿÿýï ÿÿþÞÿÿþßþ‹ÿÿþc ÿüÿèDÿÿþÇý7üÿÿþ½ ÿüÓ$8ÿÿþ©þÖÿÿýõ" ÿü Sÿÿþÿþr ÿþ‚ÿÿþPÿþ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿÿþ¡ÿÿýåÿÿýù>ÿüÿüZÿÿýöTÿÿþ-ÿÿ!ÿÿ2LÍ ô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-ü$lµÿÿü“þÿ ÿýûw ÿý µÿÿþ— ÿý²ÿÿöì‹==Œíÿÿþ€ ÿþtÿÿý¨ý«ÿÿýýB ÿþåÿÿýúÿÿýœý ÿÿýØ üÉZÿÿþÿÿýÑ ýÕÿÿþf ÿýôÿÿþ> þAÿÿýÚ ÿþMÿÿþÓ þÖÿÿþ= ÿþŒÿÿþ þÿÿþ• ÿþÃÿÿþI þKÿÿþÜ ÿþÚÿÿþ þ!ÿÿþ ÿþíÿÿþ þÿÿþO ÿþûÿÿþ þÿÿþ} ÿþïÿÿþ þÿÿþŸ ÿþÝÿÿþ þ ÿÿþ¿ ÿþÉÿÿþH þJÿÿþÔ ÿþ—ÿÿþ~ þÿÿþç ÿþYÿÿþÑ þÓÿÿþô ÿýüÿÿþ: þ=ÿÿþù ÿþ©ÿÿýÎ ýÑÿÿþþ ÿþ5ÿÿþ•ý™ÿÿþø ÿþ›ÿÿý£ý¥ÿÿþð ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ÿýÕÿÿýèDÿÿþÇ ÿý¸ÿ ÿüÓ$8ÿÿþ© ÿýNÒÿÿúð~ Sÿÿþ ÿó4{»×ìüòÖ¥^ þ‚ÿÿþP ÿ(þ»ÿÿþ ÿ'ýñÿÿþÐ ÿ'þJÿÿþ| ÿ'þ®ÿÿýý! ÿ&ý$úÿÿþ° ÿ&þ¼ÿÿýþ2 ÿ%þpÿÿþ¡ ÿý± þlÿÿýå û¼5ÿÿûÿô‡ý¬ÿÿýù> ÿý´Uÿ ÿ ÿôú°i./d±÷ÿÿýüZ ÿ ÿýöT ÿ ÿýÑ- ÿ ü3˜ðÿ ÿüØeü'vÃú2LÍ€ð.e’¶ØêöúëÜÁ[/þóÿ ÿüø¨6þLÿÿÿüý•ýåÿÿÿýÏþ ÿÿÿóÞg5 5g·üÿÿýÔ þJÿÿý‡4 ý'Àÿÿþýäÿÿþ¯ÿÿý«ÿÿýü!þÿÿýïÿÿý ãÿÿþwþGÿÿýdÿÿþtÿÿþÁýâÿÿü½ÿÿþ,ÿÿþàþšÿÿûõ"ÿÿþÿÿþøþDÿÿþsÿþ ÿÿþòý àÿÿýÊÿþ#ÿÿþØþ—ÿÿýú-ÿþeÿÿþ¡ýAþÿÿþ‚ÿýÑÿÿþJý ÞÿÿýÕÿþ‹ÿÿýÏþ”ÿÿýý8ÿý¢ÿÿýö1ý?þÿÿþ‘ÿù*Z¢ôÿÿýôIý Üÿÿýß ÿ ÿýÅ*þ‘ÿÿþFÿ ÿý¬Eý<ýÿÿþ ÿ ÿüö¯>ý Úÿÿýèÿ ÿý± þŽÿÿþTÿù 4i®ûÿÿýà ý9ýÿÿþ¯ ÿý¦ÿÿý× ýØÿÿýï ÿýcþÿÿþþ‹ÿÿþc ÿþzÿÿýøý7üÿÿþ½ ÿýØÿÿþsþÖÿÿýõ" ÿþwÿÿþ³ÿþr ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþîÿþ=ÿÿþÏÿþˆÿÿþŸÿý çÿÿþYÿþ–ÿÿýï ÿý†ÿÿþzÿþ ý5ÅÿÿýÑÿòò¯}K($OÒÿÿýåÿÿýÒ!ÿÿüø}ÿ ÿüàÿ2LÍó7€·Þñüñß¶†Aô%n³ÓéûòÝ´v&übÖÿ ÿüð—2ý3¼ÿÿüþ·- ý)Îÿÿü“þÿ ÿýûw ýPõÿÿ ý µÿÿþ—ýVüÿÿôø´g1.k²úÿÿ ý²ÿÿöì‹==Œíÿÿþ€ý;øÿÿý°!û‰õÿ þtÿÿý¨ý«ÿÿþýýãÿÿþo ý± ýúÿÿýœý ÿÿþžÿÿþrþÿÿýÑ ýÕÿÿý0ýÿÿþ½ýôÿÿþ> þAÿÿþ®ÿÿýú%þMÿÿþÓ üÖÿÿý üÿÿþ­þŒÿÿþ üÿÿþ{ÿÿþJþÃÿÿþI üKÿÿþÏÿÿýñþÚÿÿþ ü!ÿÿýþÿÿþºþíÿÿþ üÿÿþPÿÿþó \¤ÔòûëÕ¹x1 þûÿÿþ üÿÿþ€ÿÿúRzïÿÿýÎH þïÿÿþ üÿÿþ©ÿÿü7"Ðÿ ÿý° þÝÿÿþ ü ÿÿþÈÿÿýBæÿÿýÍ þÉÿÿþH üJÿÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþ—ÿÿþ~ üÿÿþðÿÿý~ýÿÿþþYÿÿþÑ üÓÿÿþùÿÿþuþvÿÿþ.ýüÿÿþ: þ=ÿÿþþÿÿþº þ¼ÿÿþ¢þ©ÿÿýÎ ýÑÿÿþûÿÿþ* þ,ÿÿýúþ5ÿÿþ•ý™ÿÿþõÿÿþÆ þÇÿÿþUþ›ÿÿý£ý¥ÿÿþêÿÿþw þxÿÿþ“ý Òÿÿöëˆ;;‰ëÿÿýÞÿþ×ÿÿþD þFÿÿþÆ ýÕÿÿüèDÿþÁÿÿþ þÿÿþÛ ý¸ÿ ÿûÓ$8ÿþ¢ÿÿþ þÿÿþí ýNÒÿÿùð~ Sÿþ€ÿÿþ þÿÿþû ó4{»×ìüòÖ¥^ ý‚ÿþQÿÿþ þÿÿþìý»ÿþÿÿþ þÿÿþÙüñÿþÞÿÿþD þFÿÿþÂüJÿÿþ—ÿÿþx þyÿÿþ‹ü®ÿÿþ@ÿÿþÇ þÉÿÿþLû$úÿÿýÝÿÿþ+ þ,ÿÿýôþ¼ÿÿþjÿÿþ» þ¼ÿÿþþpÿÿýÛÿÿþuþvÿÿýú ý± þlÿÿþåýEþÿÿý~ýÿÿþs ûÿô‡ý¬ÿÿýù>þ„ÿÿ÷Óm( (mÓÿÿþ± ÿôú°i./d±÷ÿÿýüZýšÿÿýµ ÿýöT ýyüÿ ÿüþ” ÿýÑ- ý.¸ÿ ÿý¼4ü3˜ðÿ ÿüØe2LÍ´ó.e’¶ØêöúëÜÁù%[Æ÷ÿÿû$lµóÿ ÿ úO…ºïÿÿÿ ÿÿ ÿÿôÞg5 5gB ÿúæ³€Mÿÿÿüå‡4ýØ úæ³€MÿüÉZ ýÿfÿ"üÿÚÿ"ÿþ=ÿ"ÿþ•ÿ"ÿþÜÿ"ÿþÿ"ÿþOÿ"ÿþ}ÿ"ÿþŸÿ"ÿþ¿ÿ"ÿþÔÿû*Zÿÿþçÿ ÿþôÿ ÿþùÿ ÿþþÿ ÿþøÿû 4iÿÿþðÿ"ÿþßÿ"ÿþÇÿ"ÿþ©ÿ"ÿþÿ"ÿþPÿ"ÿþÿ"ÿþÐÿ"ÿþ|ÿ"üÿý!ÿ"ýÿ°ÿ"ýþ2ÿ"þ¡ÿ"þÿý¼5$ÿÿü´U ÿ ÿóò¯}K($O ÿ ÿÿ ÿÿ û'vÃúÿ ÿ2LÍ€ü[ó7€·Þñüñß¶†Aÿüø¨6übÖÿ ÿüð—2ÿüý•ý)ÎÿÿÿýÏýPõÿÿý·üÿÿýÔ ýVüÿÿôø´g1.k²úÿÿý'Àÿÿþ ý;øÿÿý°!û‰õÿý«ÿÿýü! ýãÿÿþo ý±ý ãÿÿþw þžÿÿþr%þtÿÿþÁ ý0ýÿÿþ½&þ,ÿÿþà þ®ÿÿýú%&þÿÿþø ý üÿÿþ­'þ ÿÿþò þ{ÿÿþJ'þ#ÿÿþØ þÏÿÿýñ'þeÿÿþ¡ýþÿÿþº#þAýÑÿÿþJþPÿÿþó \¤ÔòûëÕ¹x1ý Þþ‹ÿÿýÏþ€ÿÿúRzïÿÿýÎHú”ÿ¢ÿÿýö1 þ©ÿÿü7"Ðÿ ÿý° ú?þÿ¢ôÿÿýôI þÈÿÿýBæÿÿýÍ ý ÜÿÿýÅ* þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿý¬E þðÿÿý~ýÿÿþ ý<ýÿÿüö¯> þùÿÿþuþvÿÿþ. ý Úÿÿþèÿÿý± þþÿÿþº þ¼ÿÿþ¢ þŽÿÿüT®ûÿÿýà þûÿÿþ* þ,ÿÿýúý9ýÿÿú¯¦ÿÿý× þõÿÿþÆ þÇÿÿþUýØÿÿýïýcþÿÿþþêÿÿþw þxÿÿþ“þ‹ÿÿþcþzÿÿýøþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ýØÿÿþsþÁÿÿþ þÿÿþÛþÖÿÿýõ"þwÿÿþ³þ¢ÿÿþ þÿÿþíÿþrþ0ÿÿþàþ€ÿÿþ þÿÿþûÿþÿÿþôþQÿÿþ þÿÿþìÿþÿÿþûþÿÿþ þÿÿþÙÿþÿÿþîþÞÿÿþD þFÿÿþÂÿþ=ÿÿþÏþ—ÿÿþx þyÿÿþ‹þˆÿÿþŸþ@ÿÿþÇ þÉÿÿþLý çÿÿþYýÝÿÿþ+ þ,ÿÿýôþ–ÿÿýï þjÿÿþ» þ¼ÿÿþý†ÿÿþz ýÛÿÿþuþvÿÿýúý5ÅÿÿýÑ ýEþÿÿý~ýÿÿþsþÒÿÿýå þ„ÿÿ÷Óm( (mÓÿÿþ±ÿýÒ!ýšÿÿýµ ÿüø}ýyüÿ ÿüþ”ÿüàý.¸ÿ ÿý¼42LÍÇþLÿÿù%[Æ÷ÿÿýåÿÿúO…ºïÿÿþ ÿÿÿþJÿÿÿýäÿÿþ¯ÿÿÿúæ³€Mÿÿþÿÿýïÿÿúæ³€MÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿþþÿÿþ‚ÿÿÿýÕÿÿÿýý8ÿÿÿþ‘ÿÿüÿß ÿÿýÿFÿÿþ ÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ 2LÍ‹ó7€·Þñüñß¶†Aô%n³ÓéûòÝ´v&übÖÿ ÿüð—2ý3¼ÿÿüþ·- ý)Îÿÿü“þÿ ÿýûw ýPõÿÿ ý µÿÿþ—ýVüÿÿôø´g1.k²úÿÿ ý²ÿÿöì‹==Œíÿÿþ€ý;øÿÿý°!û‰õÿ þtÿÿý¨ý«ÿÿýýBýãÿÿþo ý± ýúÿÿýœý ÿÿýØþžÿÿþrþÿÿýÑ ýÕÿÿþfý0ýÿÿþ½ýôÿÿþ> þAÿÿýÚþ®ÿÿýú%þMÿÿþÓ þÖÿÿú= üÿÿþ­þŒÿÿþ þÿÿû•{ÿÿþJþÃÿÿþI þKÿÿûÜÏÿÿýñþÚÿÿþ þ!ÿÿüþÿÿþºþíÿÿþ þÿÿýOPÿÿþó \¤ÔòûëÕ¹x1 þûÿÿþ þÿÿý}€ÿÿúRzïÿÿýÎH þïÿÿþ þÿÿýŸ©ÿÿü7"Ðÿ ÿý° þÝÿÿþ þ ÿÿý¿ÈÿÿýBæÿÿýÍ þÉÿÿþH þJÿÿýÔàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþ—ÿÿþ~ þÿÿýçðÿÿý~ýÿÿþþYÿÿþÑ þÓÿÿýôùÿÿþuþvÿÿþ.ýüÿÿþ: þ=ÿÿýùþÿÿþº þ¼ÿÿþ¢þ©ÿÿýÎ ýÑÿÿýþûÿÿþ* þ,ÿÿýúþ5ÿÿþ•ý™ÿÿýøõÿÿþÆ þÇÿÿþUþ›ÿÿý£ý¥ÿÿýðêÿÿþw þxÿÿþ“ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿýß×ÿÿþD þFÿÿþÆ ýÕÿÿýèDÿÿýÇÁÿÿþ þÿÿþÛ ý¸ÿ ÿüÓ$8ÿÿý©¢ÿÿþ þÿÿþí ýNÒÿÿúð~ Sÿÿý€ÿÿþ þÿÿþû ó4{»×ìüòÖ¥^ þ‚ÿÿýPQÿÿþ þÿÿþìþ»ÿÿýÿÿþ þÿÿþÙýñÿÿûÐÞÿÿþD þFÿÿþÂþJÿÿû|—ÿÿþx þyÿÿþ‹þ®ÿÿúý!@ÿÿþÇ þÉÿÿþLý$úÿÿþ°ýÝÿÿþ+ þ,ÿÿýôþ¼ÿÿýþ2þjÿÿþ» þ¼ÿÿþþpÿÿþ¡ýÛÿÿþuþvÿÿýú ý± þlÿÿýåýEþÿÿý~ýÿÿþs ûÿô‡ý¬ÿÿýù>þ„ÿÿ÷Óm( (mÓÿÿþ± ÿôú°i./d±÷ÿÿýüZýšÿÿýµ ÿýöT ýyüÿ ÿüþ” ÿýÑ- ý.¸ÿ ÿý¼4ü3˜ðÿ ÿüØe2LÍ·ö7€·Þñüñß¶þLÿÿübÖÿÿýåÿÿý)Îÿ ÿþ ÿÿýPõÿ ÿþJÿÿýVüÿÿöø´g1.kýäÿÿþ¯ÿÿý;øÿÿý°!þÿÿýïÿÿýãÿÿþoþGÿÿýdÿÿþžÿÿþrýâÿÿü½ÿÿý0ýÿÿþ½þšÿÿûõ"ÿÿþ®ÿÿýú%þDÿÿþsÿ ý üÿÿþ­ý àÿÿýÊÿ þ{ÿÿþJþ—ÿÿýú-ÿ þÏÿÿýñýAþÿÿþ‚ÿ ýþÿÿþºý ÞÿÿýÕÿ þPÿÿþô \¤ÔòûëÕ¹x1 þ”ÿÿýý8ÿ þ€ÿÿúRzïÿÿ ý?þÿÿþ‘ÿ þ©ÿÿü7"Ðÿ ÿ ý Üÿÿýß ÿ þÈÿÿýBæÿ ÿ þ‘ÿÿþFÿ þàÿÿþÝÿÿöÓn( (nÓÿ ý<ýÿÿþ ÿ þðÿÿý~ýý Úÿÿýèÿ þùÿÿþuþŽÿÿþTÿ þþÿÿþºý9ýÿÿþ¯ ÿ þûÿÿþ*ýØÿÿýï ÿ þõÿÿþÆþ‹ÿÿþc ÿ þêÿÿþwý7üÿÿþ½ ÿ þ×ÿÿþDþÖÿÿýõ" ÿ þÁÿÿþÿþr ÿ þ¢ÿÿþÿþ€ÿÿþÿþQÿÿþÿþÿÿþÿþÞÿÿþD$ÿ þ—ÿÿþx$ÿ þ@ÿÿþÇ$ÿ ýÝÿÿþ+#ÿþjÿÿþ»#ÿýÛÿÿþu"ÿýEþÿÿý~ýÿþ„ÿÿöÓm( (mÓÿÿýšÿ ÿÿýyüÿ ÿÿý.¸ÿ ÿ2LÍ€ü†Aô%n³ÓéûòÝ´v&ÿüð—2ý3¼ÿÿüþ·-ù%[Æ÷ÿÿü“þÿ ÿýûwúO…ºïÿÿ ý µÿÿþ— ÿý²úÿÿ ý²ÿÿöì‹==Œíÿÿþ€ ÿú‰õÿ þtÿÿý¨ý«ÿÿýýB ÿúæ³€Mý± ýúÿÿýœý ÿÿýØ úæ³€MþÿÿýÑ ýÕÿÿþf$ýôÿÿþ> þAÿÿýÚ#þMÿÿþÓ þÖÿÿþ=#þŒÿÿþ þÿÿþ•#þÃÿÿþI þKÿÿþÜ#þÚÿÿþ þ!ÿÿþ"þíÿÿþ þÿÿþOþ þûÿÿþ þÿÿþ}ýÎH þïÿÿþ þÿÿþŸÿý° þÝÿÿþ þ ÿÿþ¿ÿýÍ þÉÿÿþH þJÿÿþÔÿýÊþ—ÿÿþ~ þÿÿþçÿþþYÿÿþÑ þÓÿÿþôþvÿÿþ.ýüÿÿþ: þ=ÿÿþùþ¼ÿÿþ¢þ©ÿÿýÎ ýÑÿÿþþþ,ÿÿýúþ5ÿÿþ•ý™ÿÿþøþÇÿÿþUþ›ÿÿý£ý¥ÿÿþðþxÿÿþ“ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþFÿÿþÆ ýÕÿÿýèDÿÿþÇþÿÿþÛ ý¸ÿ ÿüÓ$8ÿÿþ©þÿÿþí ýNÒÿÿúð~ Sÿÿþþÿÿþû ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÿÿþìþ»ÿÿþþÿÿþÙýñÿÿþÐþFÿÿþÂþJÿÿþ|þyÿÿþ‹þ®ÿÿýý!þÉÿÿþLý$úÿÿþ°þ,ÿÿýôþ¼ÿÿýþ2þ¼ÿÿþþpÿÿþ¡þvÿÿýú ý± þlÿÿýåÿþs ûÿô‡ý¬ÿÿýù>ÿþ± ÿôú°i./d±÷ÿÿýüZ ÿýµ ÿýöT ÿüþ” ÿýÑ-ÿý¼4ü3˜ðÿ ÿüØeÿ€2€L€Íæÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ'ÿ2LÍ ô'xµÞôûêÔ´o&+ÿ ÿÿ ÿÿþëÿÿþÿþ)ÿÿþ/þ)ÿÿþŠÿÿþÎþŠÿÿýçÿÿþmýçÿÿþLÿÿýøþLÿÿþøþ­ÿÿþªþ­ÿÿþªýúÿÿþIýúÿÿþIþoÿÿýåþoÿÿýåþÐÿÿþ‡þÐÿÿþ‡þ1ÿÿþ&þ1ÿÿþ&þ’ÿÿþÄþ’ÿÿþÄýìÿÿþcýìÿÿþcþTÿÿýõ þTÿÿýõ þ¶ÿÿþ¡þ¶ÿÿþ¡ýüÿÿþ?ýüÿÿþ?þxÿÿýÝþxÿÿýÝþØÿÿþ}þØÿÿþ}þ:ÿÿýýþ:ÿÿýýþ›ÿÿþ»þ›ÿÿþ»ý ñÿÿþYý ñÿÿþYþ]ÿÿýïþ]ÿÿýïþ¾ÿÿþ—þ¾ÿÿþ—ý þÿÿþ6ý þÿÿþ6þ€ÿÿþÔþ€ÿÿþÔýßÿÿþsýßÿÿþsþCÿÿýûþCÿÿýûþ¤ÿÿþ±þ¤ÿÿþ±ýöÿÿþPýöÿÿþPþfÿÿýéþfÿÿýéþÇÿÿþþÇÿÿþþ(ÿÿþ,þ(ÿÿþ,þ‰ÿÿþËþ‰ÿÿþËýæÿÿþjýæÿÿþjþKÿÿý÷þKÿÿý÷þ¬ÿÿþ§þ¬ÿÿþ§ýùÿÿþFýùÿÿþF 2LÍï ?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-üLÿÿ ü“þÿ ÿýûwûåÿë ý µÿÿþ—û ÿÿ ý²ÿÿöì‹==Œíÿÿþ€þJÿÿþ/ þtÿÿý¨ý«ÿÿýýBúäÿÿÎ ýúÿÿýœý ÿÿýØþÿÿþm þÿÿýÑ ýÕÿÿþfþGÿÿþ ýôÿÿþ> þAÿÿýÚýâÿÿþ½ þMÿÿþÓ þÖÿÿþ=þšÿÿýõ" þŒÿÿþ þÿÿþ•þDÿÿþs þÃÿÿþI þKÿÿþÜý àÿÿýÊ þÚÿÿþ þ!ÿÿþþ—ÿÿýú- þíÿÿþ þÿÿþO ýAþÿÿþ‚ þûÿÿþ þÿÿþ} ý ÞÿÿýÕ þïÿÿþ þÿÿþŸ þ”ÿÿýý8þÝÿÿþ þ ÿÿþ¿ ý?þÿÿþ‘þÉÿÿþH þJÿÿþÔ ý Üÿÿýß þ—ÿÿþ~ þÿÿþç þ‘ÿÿþFþYÿÿþÑ þÓÿÿþô ý<ýÿÿþ ýüÿÿþ: þ=ÿÿþùý Úÿÿýèþ©ÿÿýÎ ýÑÿÿþþþŽÿÿþTþ5ÿÿþ•ý™ÿÿþøý9ýÿÿþ¯þ›ÿÿý£ý¥ÿÿþðýØÿÿýïý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ‹ÿÿþcýÕÿÿýèDÿÿþÇý7üÿÿþ½ý¸ÿ ÿüÓ$8ÿÿþ©þÖÿÿýõ"ýNÒÿÿúð~ Sÿÿþÿþró4{»×ìüòÖ¥^ þ‚ÿÿþPÿ!þ»ÿÿþÿ ýñÿÿþÐÿ þJÿÿþ|ÿ þ®ÿÿýý!7ý$úÿÿþ°8þ¼ÿÿýþ27þpÿÿþ¡(ý± þlÿÿýå(ûÿô‡ý¬ÿÿýù>)ÿôú°i./d±÷ÿÿýüZ*ÿýöT2LÍï ?vŸÃáïúøêÛÉj5ðð.e’¶ØêöúëÜÁ[ü@vÿÿ û$lµóÿ ÿüø¨6û [ªñÿÿ ÿüý• ü2—ñÿ ÿ ÿýÏ ÿ ÿóÞg5 5g·üÿÿýÔ ÿüâÿ¯ÿÿ ÿüå‡4 ý'Àÿÿþ ÿùþµDïÿÿ üÉZ ý«ÿÿýü!ÿý¼3ýdÿÿý ãÿÿþwüÿæVÿ þtÿÿþÁý¨ÿ þ,ÿÿþàÿ þÿÿþøÿ þ ÿÿþòÿ þ#ÿÿþØÿ þeÿÿþ¡ÿýÑÿÿþJÿþ‹ÿÿýÏÿý¢ÿÿýö1ÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿýàÿý¦ÿÿý× ÿýcþÿÿþÿ þzÿÿýøÿ ýØÿÿþsÿ!þwÿÿþ³ ÿþ0ÿÿþà ÿþÿÿþôþÿ ÿþÿÿþû ý³ÿ ÿþÿÿþî ú®ÿÿÿ!þ=ÿÿþÏ ù©ÿÿÿÿ!þˆÿÿþŸ ý£ÿÿÿ ý çÿÿþY ýÿÿÿ þ–ÿÿýï þ•ÿÿÿ ý¼5ý†ÿÿþz þÿÿüþÿÿ ÿü´U ý5ÅÿÿýÑþ…ÿÿügÿÿ ÿòò¯}K($OÒÿÿýå ÿÿ ÿýÒ! ÿ2LÍõ©Óæùóâѧn24 ÿüÏdù%[Æ÷ÿÿ ÿýÒ0úO…ºïÿÿ ÿýú] ÿö“R% 9xÚÿÿýüT ÿüeõÿÿý÷! ÿúæ³€Mÿÿý0ðÿÿþ± úæ³€MÿþIÿÿþ*ÿþµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿýÚÿÿþ‰ÿþ\ÿÿþFÿýåÿÿýæÿþ¨ÿÿþrÿþkÿÿýÛÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿþ¸ÿÿýì,ÿÿýï1ÿÿýó8 ÿÿýõ>!ÿÿýøE"ÿüÿúM#ÿýüU$ÿþ^%ÿ:ÿÿþ8 ÿ ÿþ8 ÿ 2LÍóB†·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ ÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿ þCÿÿýûÿ þ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýé$ÿ þÇÿÿþ%ÿ þ(ÿÿþ,%ÿ þ‰ÿÿþË&ÿ ýæÿÿþj&ÿ þKÿÿý÷&ÿ þ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ2LÍó7€·Þñüñß¶†Aò@v©Óæùóâѧn2übÖÿ ÿüð—2 û [ªñÿ ÿýÏd ý)Îÿÿ ü2—ñÿÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿõâ“R% 9xÚÿÿ ý;øÿÿý°!û‰õÿ ÿûþµDûeõÿ ýãÿÿþo ý± ÿý¼3 ý0ð þžÿÿþrüÿæVþIý0ýÿÿþ½ý¨þ®ÿÿýú%7ý üÿÿþ­8þ{ÿÿþJ8þÏÿÿýñ7ýþÿÿþº8þPÿÿþó \¤ÔòûëÕ¹x1)þ€ÿÿúRzïÿÿýÎHþþ©ÿÿü7"Ðÿ ÿý° þ\þÈÿÿýBæÿÿýÍýåþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊý¨ÿþðÿÿý~ýÿÿþükÿÿþùÿÿþuþvÿÿþ.ûBúÿÿþþÿÿþº þ¼ÿÿþ¢ý)îÿÿþûÿÿþ* þ,ÿÿýúýâÿÿþõÿÿþÆ þÇÿÿþUýÙÿÿþêÿÿþw þxÿÿþ“ýÒÿÿþÓþ×ÿÿþD þFÿÿþÆýËÿÿýÚþÁÿÿþ þÿÿþÛý Æÿÿýàþ¢ÿÿþ þÿÿþíý Áÿÿúä"ÿþ€ÿÿþ þÿÿþûý¼ÿÿýè'þÿþQÿÿþ þÿÿþì ý¸ÿÿýì,þÿþÿÿþ þÿÿþÙ ý³ÿÿýï1þÿþÞÿÿþD þFÿÿþ ý®ÿÿýó8 þ—ÿÿþx þyÿÿþ‹ ý©ÿÿýõ>þ@ÿÿþÇ þÉÿÿþL ý£ÿÿýøEýÝÿÿþ+ þ,ÿÿýôýÿÿýúMþjÿÿþ» þ¼ÿÿþ þ•ÿÿýüUýÛÿÿþuþvÿÿýúþÿÿýþ^ýEþÿÿý~ýÿÿþsþ…ÿÿþgþ„ÿÿ÷Óm( (mÓÿÿþ± ÿ ýšÿÿýµ ÿ2LÍï ?vŸÃáïúøêÛÉj5øB†·ßñüÓð.e’¶ØêöúëÜÁ[þû$lµóÿ ÿüø¨6ýÒ0 ÿüý•üÿú] ÿýÏÿýüT ÿóÞg5 5g·üÿÿýÔ ÿý÷! ÿüå‡4 ý'Àÿÿþÿþ± üÉZ ý«ÿÿýü!ÿþ*ý ãÿÿþwýGµÿÿþzþtÿÿþÁüâXÿÿþ¿þ,ÿÿþàüšÿÿÿþÜþÿÿþøûDÿÿÿÿþôþ ÿÿþòú àÿÿ ÿÿþôþ#ÿÿþØþ—ÿÿþ4ÿÿþßþeÿÿþ¡ýAþÿÿþyÿÿþÅýÑÿÿþJý ÞÿÿýÕÚÿÿþ‰þ‹ÿÿýÏþ”ÿÿýý8ÿÿþFý¢ÿÿýö1ý?þÿÿý‘ÿÿýæù*Z¢ôÿÿýôIý Üÿÿüß ÿÿþr ÿýÅ*þ‘ÿÿüFÿÿýÛ ÿý¬Eý<ýÿÿþ ÿýþ? ÿüö¯>ý Úÿÿýèÿþ†ÿý± þŽÿÿþTüÿ¼ù 4i®ûÿÿýà ý9ýÿÿþ¯ýË ý¦ÿÿý× ýØÿÿýïþ ýcþÿÿþþ‹ÿÿþc(þzÿÿýøý7üÿÿþ½)ýØÿÿþsþÖÿÿýõ"*þwÿÿþ³ÿþr+þ0ÿÿþà ÿ$þÿÿþô ÿ$þÿÿþû ÿ$þÿÿþî ÿ$þ=ÿÿþÏ8þˆÿÿþŸ7ý çÿÿþY7þ–ÿÿýï #ý¼5ý†ÿÿþz$ÿü´U ý5ÅÿÿýÑÿþ8ÿòò¯}K($OÒÿÿýåÿþ8ÿýÒ!2LÍúóß¹ƒ:ó7€·Þñüñß¶†AþLÿÿübÖÿ ÿüð—2ýåÿÿý)Îÿÿþ ÿÿýPõÿÿ ü:JÿÿýVüÿÿôø´g1.k²úÿÿ û$ñäÿÿþ¯ÿÿý;øÿÿý°!û‰õÿ ü¶ÿÿÿýïÿÿýãÿÿþo ý± þ8ÿÿýdÿÿþžÿÿþrþ‹ÿÿü½ÿÿý0ýÿÿþ½þÌÿÿûõ"ÿÿþ®ÿÿýú%þæÿÿþsÿ ý üÿÿþ­þúÿÿýÊÿ þ{ÿÿþJúðÿÿú-ÿ þÏÿÿýñûÓÿÿ‚ÿ ýþÿÿþºûšÿÿÿ þPÿÿþó \¤ÔòûëÕ¹x1üAÿÿÿ þ€ÿÿúRzïÿÿýÎHýÆÿÿ þ©ÿÿü7"Ðÿ ÿý° ý*óÿ þÈÿÿýBæÿÿýÍ þBÿ þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊÿ þðÿÿý~ýÿÿþÿ þùÿÿþuþvÿÿþ.ÿ þþÿÿþº þ¼ÿÿþ¢ þÿ þûÿÿþ* þ,ÿÿýúý Æÿ þõÿÿþÆ þÇÿÿþUü¼ÿÿ þêÿÿþw þxÿÿþ“üpÿÿÿ þ×ÿÿþD þFÿÿþÆû ïÿÿÿ þÁÿÿþ þÿÿþÛþaÿÿÿ þ¢ÿÿþ þÿÿþíþ§ÿÿþ€ÿÿþ þÿÿþûþÚÿÿþQÿÿþ þÿÿþìþñÿÿþÿÿþ þÿÿþÙþûÿÿþÞÿÿþD þFÿÿþÂþêÿÿÿ þ—ÿÿþx þyÿÿþ‹þÖÿÿÿ þ@ÿÿþÇ þÉÿÿþLþ³ÿÿÿ ýÝÿÿþ+ þ,ÿÿýôþpÿÿÿþjÿÿþ» þ¼ÿÿþþ)ÿÿÿýÛÿÿþuþvÿÿýúü·ÿÿÿýEþÿÿý~ýÿÿþs ü2þÿÿþ„ÿÿ÷Óm( (mÓÿÿþ± ýyÿÿýšÿÿýµ ”2LÍô'xµÞôûêÔ´o&ï ?vŸÃáïúøêÛÉj5Ðóÿÿþ þ‡ÿÿþÃÿÿýý •ÿÿýñ'ÿþòÿÿõç…CFŠëÿÿýñ>ÿý&ÃÿÿýÂ$ÿüD¦þÿÿüþ¥Cÿü'›íÿ ÿüí›'ÿýüÿÿüü‘ÿÿõãƒD E„äÿÿýÆ ÿÿüùqütúÿÿý¼ÿÿýø= ý@ùÿÿþoÿÿþc þfÿÿýî ÿüÿÓ ýÔÿÿþaÿýÿsþuÿÿþ¦ÿýÿ1þ3ÿÿþÙÿýÿþÿÿþðÿýÿþÿÿþúÿýÿþÿÿþéÿýÿ1þ3ÿÿþÕÿýÿsþwÿÿþ³ÿüÿÒ ý×ÿÿþoÿÿþc þlÿÿþ)ÿÿý÷= ýFúÿÿþ¶ÿÿüùpüxûÿÿýþ1ÿÿõâ‚C E…æÿÿþx ÿÿþ“ ÿ2LÍ,óB†·ßñüóß¹ƒ:öóBÄéùùéÄBþLÿÿýP×ÿÿý×Pýåÿÿý£ÿ ÿý¢þ ÿÿý¾ÿÿý½þJÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ýäÿÿþ¯ÿÿþ`ÿÿý‡ýˆÿÿþÿÿýïÿÿýêÿÿþþ„ÿÿþGÿÿýdÿÿþ~ÿÿýÂýÄÿÿ ýâÿÿü½ÿÿ ýéÿÿþ3 þ4ÿÿ þšÿÿûõ"ÿÿ þNÿÿþÀ üÀÿÿ þDÿÿþsÿ þ¢ÿÿþb ücÿÿ ý àÿÿýÊÿ þæÿÿýþ üÿÿ þ—ÿÿýú-ÿ þ$ÿÿþÕýÖÿ ýAþÿÿþ‚ÿ þVÿÿþ¡ý¢ÿý ÞÿÿýÕÿ þƒÿÿþwýxÿþ”ÿÿýý8ÿ þ¥ÿÿþTýTÿý?þÿÿþ‘ÿ þÃÿÿþ9ý:ÿý Üÿÿýß ÿ þØÿÿþ#ý#ÿþ‘ÿÿþFÿ þéÿÿþýÿý<ýÿÿþ ÿ þõÿÿþ ý ÿý Úÿÿýèÿ þûÿÿþýÿþŽÿÿþTÿ ÿþýÿý9ýÿÿþ¯ ÿ þûÿÿþýÿýØÿÿýï ÿ þõÿÿþý ÿþ‹ÿÿþc ÿ þêÿÿþýÿý7üÿÿþ½ ÿ þØÿÿþ"ý#ÿþÖÿÿýõ" ÿ þÃÿÿþ9ý:ÿÿþr ÿ þ¥ÿÿþSýTÿÿþƒÿÿþwýxÿÿþWÿÿþ¡ý¢ÿÿþ%ÿÿþÕýÕÿÿþæÿÿýþ üþÿÿ þ£ÿÿþb übÿÿÿ þOÿÿþ¿ üÀÿÿÿ ýêÿÿþ3 þ4ÿÿÿþ€ÿÿýÂýÃÿÿÿýëÿÿþþƒÿÿÿþcÿÿý†ý‡ÿÿÿþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý ÁÿÿþÀ 2LÍ8ø'xµÞôûêôô@v©Óæùóâѧù%[Æ÷ÿÿû [ªñÿÿ úO…ºïÿÿü2—ñÿ ÿ ÿÿ ÿÿõâ“R% 9x_ ÿúæ³€MÿÿÿûþµDýé úæ³€Mÿÿý¼3 ýÿ|ÿüÿæV üÿèÿý¨ ÿþLÿ"ÿþ¡ÿ"ÿþåÿ"ÿþ$ÿ"ÿþUÿ"ÿþÿ"ÿþ£ÿ"ÿþÁÿ"ÿþÖÿ"ÿþèÿ"ÿþôÿ"ÿþùÿ"ÿþþÿ!þ)ÿÿþúÿ ýâÿÿþôÿýÙÿÿþèÿýÒÿÿþÖÿýËÿÿþÂÿý Æÿÿþ£ÿý Áÿÿþ‚ÿý¼ÿÿþèÿÿþUÿý¸ÿÿýì,ÿÿþ$ÿý³ÿÿùï1ÿÿæÿý®ÿÿøó8ÿÿ¢ÿý©ÿÿýõ>ÿþMÿý£ÿÿýøEüÿéÿýÿÿýúMýÿ~ÿþ•ÿÿýüUýëÿþÿÿýþ^þbÿþ…ÿÿþgÿ ÿÿ ÿ2LÍûÔ´o&ï ?vŸÃáïúøêÛÉj5Øýn2óBÄéùùéÄBö.e’ÿÿÏdýP×ÿÿý×Pû$lµóÿÿýÒ0ý£ÿ ÿý¢ ÿýú]ý¾ÿÿý½ ÿþÚÿÿýüTþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿúÞeõÿÿý÷! þ`ÿÿý‡ýˆÿÿþ_ ÿüå‡4ý0ðÿÿþ± ýêÿÿþþ„ÿÿýé üÉZþIÿÿþ* þ~ÿÿýÂýÄÿÿþ|þµÿÿþz ýéÿÿþ3 þ4ÿÿýèþXÿÿþ¿ þNÿÿþÀ þÀÿÿþLþÿÿþÜ þ¢ÿÿþb þcÿÿþ¡þÿÿþô þæÿÿýþ þÿÿþåþ ÿÿþôþ$ÿÿþÕþÖÿÿþ$þ4ÿÿþßþVÿÿþ¡þ¢ÿÿþUþyÿÿþÅþƒÿÿþwþxÿÿþýÚÿÿþ‰þ¥ÿÿþTþTÿÿþ£þ\ÿÿþFþÃÿÿþ9þ:ÿÿþÁýåÿÿýæþØÿÿþ#þ#ÿÿþÖþ¨ÿÿþr þéÿÿþþÿÿþè üÿkÿÿýÛ þõÿÿþ þ ÿÿþô üÿBúÿÿýþ? þûÿÿþþÿÿþù ýÿîÿÿþ† ÿþþÿÿþþ ÿý¼ þûÿÿþþÿÿþúÿýË þõÿÿþþ ÿÿþôÿýÓ þêÿÿþþÿÿþèÿýÚþØÿÿþ"þ#ÿÿþÖüÿàþÃÿÿþ9þ:ÿÿþÂýä"þ¥ÿÿþSþTÿÿþ£þ'þƒÿÿþwþxÿÿþ‚"þWÿÿþ¡þ¢ÿÿþU"þ%ÿÿþÕþÕÿÿþ$#þæÿÿýþ ýþÿÿþæ$þ£ÿÿþb þbÿÿþ¢$þOÿÿþ¿ þÀÿÿþM$ýêÿÿþ3 þ4ÿÿýé%þ€ÿÿýÂýÃÿÿþ~&ýëÿÿþþƒÿÿýëý¼5þcÿÿý†ý‡ÿÿþb ÿü´U  ÿþ8 þ«ÿÿ÷Öh%&j×ÿÿþ© ÿûò¯}Kÿÿþ8 ý ÁÿÿýÀ ÿ2LÍ óB†·ßñüóß¹ƒ:Òô¶ØêöúëÜÁ[óBÄéùùéÄB ÿüø¨6ýP×ÿÿý×P ÿüý•ý£ÿ ÿý¢ ÿýÏý¾ÿÿý½ õg5 5g·üÿÿýÔ þ§ÿÿ÷Öi& (kØÿÿþ¦ý'Àÿÿþ þ`ÿÿý‡ýˆÿÿþ_ý«ÿÿýü! ýêÿÿþþ„ÿÿýéý ãÿÿþw þ~ÿÿýÂýÄÿÿþ|þtÿÿþÁ ýéÿÿþ3 þ4ÿÿýèþ,ÿÿþà þNÿÿþÀ þÀÿÿþLþÿÿþø þ¢ÿÿþb þcÿÿþ¡þ ÿÿþò þæÿÿýþ þÿÿþåþ#ÿÿþØþ$ÿÿþÕþÖÿÿþ$þeÿÿþ¡þVÿÿþ¡þ¢ÿÿþUýÑÿÿþJþƒÿÿþwþxÿÿþþ‹ÿÿýÏþ¥ÿÿþTþTÿÿþ£ý¢ÿÿýö1 þÃÿÿþ9þ:ÿÿþÁ ù*Z¢ôÿÿýôI þØÿÿþ#þ#ÿÿþÖ ÿýÅ* þéÿÿþþÿÿþè ÿý¬E þõÿÿþ þ ÿÿþô ÿüö¯> þûÿÿþþÿÿþù ÿý± ÿþþÿÿþþ ù 4i®ûÿÿýà þûÿÿþþÿÿþúý¦ÿÿý× þõÿÿþþ ÿÿþôýcþÿÿþþêÿÿþþÿÿþèþzÿÿýøþØÿÿþ"þ#ÿÿþÖþ7 ýØÿÿþsþÃÿÿþ9þ:ÿÿþÂþÖ þwÿÿþ³þ¥ÿÿþSþTÿÿþ£þÿ þ0ÿÿþàþƒÿÿþwþxÿÿþ‚þÿ þÿÿþôþWÿÿþ¡þ¢ÿÿþUþÿ þÿÿþûþ%ÿÿþÕþÕÿÿþ$þÿ þÿÿþîþæÿÿýþ ýþÿÿþæþÿ þ=ÿÿþÏþ£ÿÿþb þbÿÿþ¢þˆÿÿþŸþOÿÿþ¿ þÀÿÿþMý çÿÿþYýêÿÿþ3 þ4ÿÿýéþ–ÿÿýï þ€ÿÿýÂýÃÿÿþ~ý†ÿÿþz ýëÿÿþþƒÿÿýëý5ÅÿÿýÑ þcÿÿý†ý‡ÿÿþb ö($OÒÿÿýå þ«ÿÿ÷Öh%&j×ÿÿþ© ÿýÒ!ý ÁÿÿýÀ 2LÍ,ô'xµÞôûêÔ´o&þLÿÿ ÿýåÿÿ ÿþ ÿÿ ÿþë þJÿÿ ÿþ ýäÿÿþ¯ÿÿþ)ÿÿþ/ þÿÿýïÿÿþŠÿÿþÎ þGÿÿýdÿÿýçÿÿþm ýâÿÿü½ÿÿþLÿÿýø þšÿÿûõ"ÿÿþ­ÿÿþª þDÿÿþsÿýúÿÿþI ý àÿÿýÊÿþoÿÿýå þ—ÿÿýú-ÿþÐÿÿþ‡ ýAþÿÿþ‚ÿþ1ÿÿþ& ý ÞÿÿýÕÿþ’ÿÿþÄ þ”ÿÿýý8ÿýìÿÿþc ý?þÿÿþ‘ÿþTÿÿýõ ý Üÿÿýß ÿþ¶ÿÿþ¡ þ‘ÿÿþFÿýüÿÿþ?ý<ýÿÿþ ÿþxÿÿýÝý ÚÿÿýèÿþØÿÿþ}þŽÿÿþTÿþ:ÿÿýýý9ýÿÿþ¯ ÿþ›ÿÿþ»ýØÿÿýï ÿý ñÿÿþYþ‹ÿÿþc ÿþ]ÿÿýïþüÿÿþ½ ÿþ¾ÿÿþ—ÿýõ" ÿý þÿÿþ6ÿþr ÿþ€ÿÿþÔ ÿýßÿÿþs ÿþCÿÿýû ÿþ¤ÿÿþ± ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿý÷ÿþ¬ÿÿþ§ÿýùÿÿþF 2LÍ0óB†·ßñüóß¹ƒ:Õó7€·Þñüñß¶†AóBÄéùùéÄBübÖÿ ÿüð—2ýP×ÿÿþ× ý)Îÿÿý£ÿ ÿ ýPõÿÿý¾ÿ ÿ ýVüÿÿôø´g1.k²úÿÿþ§ÿÿõÖi& (kØÿÿ ý;øÿÿý°!û‰õÿ þ`ÿÿý‡üˆÿ ýãÿÿþo ý± ýêÿÿþþ„ þžÿÿþrþ~ÿÿýÂþý0ýÿÿþ½ýéÿÿþ3þ®ÿÿýú%þNÿÿþÀý üÿÿþ­þ¢ÿÿþbþ{ÿÿþJþæÿÿýþþÏÿÿýñþ$ÿÿþÕýþÿÿþºþVÿÿþ¡þPÿÿþó \¤ÔòûëÕ¹x1 þƒÿÿþwþ€ÿÿúRzïÿÿýÎH þ¥ÿÿþTþ©ÿÿü7"Ðÿ ÿý° þÃÿÿþ9þÈÿÿýBæÿÿýÍ þØÿÿþ#þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþéÿÿþþðÿÿý~ýÿÿþþõÿÿþ þùÿÿþuþvÿÿþ.þûÿÿþþþÿÿþº þ¼ÿÿþ¢ÿþþûÿÿþ* þ,ÿÿýúþûÿÿþþõÿÿþÆ þÇÿÿþUþõÿÿþþêÿÿþw þxÿÿþ“þêÿÿþþ×ÿÿþD þFÿÿþÆþØÿÿþ"þÁÿÿþ þÿÿþÛþÃÿÿþ9þ¢ÿÿþ þÿÿþíþ¥ÿÿþSþ€ÿÿþ þÿÿþûþƒÿÿþwþQÿÿþ þÿÿþìþWÿÿþ¡þÿÿþ þÿÿþÙþ%ÿÿþÕþÞÿÿþD þFÿÿþÂþæÿÿýþþ—ÿÿþx þyÿÿþ‹þ£ÿÿþbþ@ÿÿþÇ þÉÿÿþLþOÿÿþ¿ýÝÿÿþ+ þ,ÿÿýôýêÿÿþ3þjÿÿþ» þ¼ÿÿþ þ€ÿÿýÂþýÛÿÿþuþvÿÿýú ýëÿÿþþƒ ýEþÿÿý~ýÿÿþs þcÿÿý†ü‡ÿ þ„ÿÿ÷Óm( (mÓÿÿþ± þ«ÿÿõÖh%&j×ÿÿ ýšÿÿýµ ý Áÿ ÿ2LÍï ?vŸÃáïúøêÛÉj5þP ÿ ÿý¢ ÿ ÿý½ ÿþë ÿþ¦ ÿþ ÿþ_þ)ÿÿþ/ ÿÿýéþŠÿÿþÎ ÿþÄÿÿþ|ýçÿÿþm ÿþ4ÿÿýèþLÿÿýø ÿþÀÿÿþLþ­ÿÿþª ÿþcÿÿþ¡ýúÿÿþI ÿþÿÿþåþoÿÿýå ÿþÖÿÿþ$þÐÿÿþ‡ ÿþ¢ÿÿþUþ1ÿÿþ& ÿþxÿÿþþ’ÿÿþÄÿþTÿÿþ£ýìÿÿþcÿ÷n«×òü:ÿÿþÁþTÿÿýõ  ÿþ#ÿÿþÖþ¶ÿÿþ¡ ÿþÿÿþèýüÿÿþ? ÿþ ÿÿþôþxÿÿýÝÿôúÁ}P' ÿÿþùþØÿÿþ}üÍhþÿÿþþþ:ÿÿýýþÿÿþúþ›ÿÿþ»þ ÿÿþôý ñÿÿþYþÿÿþèþ]ÿÿýïþ#ÿÿþÖþ¾ÿÿþ—þ:ÿÿþÂý þÿÿþ6þTÿÿþ£þ€ÿÿþÔþxÿÿþ‚ýßÿÿþsþ¢ÿÿþUþCÿÿýûþÕÿÿþ$þ¤ÿÿþ±ýþÿÿþæýöÿÿþPþbÿÿþ¢þfÿÿýéþÀÿÿþMþÇÿÿþþ4ÿÿýéþ(ÿÿþ,þÃÿÿþ~þ‰ÿÿþËýž ÿýëýæÿÿþjüÿÚBÿþbþKÿÿý÷ÿýµ>ÿþ©þ¬ÿÿþ§ÿôàšV0ÿÿÀ ýùÿÿþF ÿ2LÍ ô%n³ÓéûòÝ´v& ÿý3¼ÿÿüþ·- ÿü“þÿ ÿýûw ÿý µÿÿþ—þ:ÿ ÿý²ÿÿöì‹==Œíÿÿþ€ ý$ñþtÿÿý¨ý«ÿÿýýB ý¶ÿýúÿÿýœý ÿÿýØ ü8ÿÿþÿÿýÑ ýÕÿÿþf ü‹ÿÿýôÿÿþ> þAÿÿýÚüÌÿÿþMÿÿþÓ þÖÿÿþ=üæÿÿþŒÿÿþ þÿÿþ•üúÿÿþÃÿÿþI þKÿÿþÜüðÿÿþÚÿÿþ þ!ÿÿþüÓÿÿþíÿÿþ þÿÿþOüšÿÿþûÿÿþ þÿÿþ}öAÿÿïÛÇ”Sþïÿÿþ þÿÿþŸþÆÿÿüù›#þÝÿÿþ þ ÿÿþ¿ý*óÿÿüü~ þÉÿÿþH þJÿÿþÔ þBÿÿý³ þ—ÿÿþ~ þÿÿþç û!IŠàÿÿý´ þYÿÿþÑ þÓÿÿþô üfñÿÿþŠ ýüÿÿþ: þ=ÿÿþùý'Ûÿÿýý* þ©ÿÿýÎ ýÑÿÿþþ þý&ïÿÿþª þ5ÿÿþ•ý™ÿÿþøý Æþ`ÿÿýþ þ›ÿÿý£ý¥ÿÿþðü¼ÿýÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßüpÿÿþ…ÿÿþ£ ýÕÿÿýèDÿÿþÇû ïÿÿþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿþÿÿþáýNÒÿÿúð~ Sÿÿþþ§ÿÿþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ ÿÿþúþ»ÿÿþþñÿÿþÿÿþîýñÿÿþÐþûÿÿþCÿÿþÒþJÿÿþ|þêÿÿþ‡ÿÿþªþ®ÿÿýý!þÖÿÿýÝÿÿþoý$úÿÿþ°þ³ÿÿþeÿÿþþ¼ÿÿýþ2þpÿÿý*ñÿÿþ¶þpÿÿþ¡ þ)ÿÿý+ßÿÿýý6 ý± þlÿÿýå ü·ÿÿülôÿÿþ ûÿô‡ý¬ÿÿýù> ø2þÿ"NŽæÿÿýº ÿôú°i./d±÷ÿÿýüZ þyÿÿý§ ÿýöT”2LÍô'xµÞôûêÔ´o&óóþ’ÿÿþÄÿþ þ‡ÿÿþÃýìÿÿþcÿýý •ÿÿýñ'þTÿÿýõ þòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ý&ÃÿÿýÂ$ýüÿÿþ? üD¦þÿÿüþ¥CþxÿÿýÝ ü'›íÿ ÿüí›'þØÿÿþ} ýüÿÿüü‘þ:ÿÿýý ÿõãƒD E„äÿÿýÆ þ›ÿÿþ» ÿüùqütúÿÿý¼ý ñÿÿþY ÿýø= ý@ùÿÿþoþ]ÿÿýï ÿþc þfÿÿýî þ¾ÿÿþ— üÿÓ ýÔÿÿþaý þÿÿþ6 ýÿsþuÿÿþ¦þ€ÿÿþÔ ýÿ1þ3ÿÿþÙýßÿÿþs ýÿþÿÿþðþCÿÿýû ýÿþÿÿþúþ¤ÿÿþ±ýÿþÿÿþéýöÿÿþPýÿ1þ3ÿÿþÕþfÿÿýéýÿsþwÿÿþ³þÇÿÿþüÿÒ ý×ÿÿþoþ(ÿÿþ,ÿþc þlÿÿþ)þ‰ÿÿþËÿý÷= ýFúÿÿþ¶ýæÿÿþjÿüùpüxûÿÿýþ1þKÿÿý÷ÿõâ‚C E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF2LÍï ?vŸÃáïúøêÛÉj5ô'xµÞôûêÔ´o&ðò@v©Óæùóâѧn2þLÿÿû [ªñÿ ÿüÏdýåÿÿ ü2—ñÿÿýÒ0þ ÿÿ ÿýú]þJÿÿ ÿõâ“R% 9xÚÿÿýüTýäÿÿþ¯ÿÿ ÿûþµDüeõÿÿþ÷þÿÿýïÿÿ ÿý¼3 ý0ðÿÿþGÿÿýdÿÿ üÿæVþIÿÿ ýâÿÿü½ÿÿ ý¨þµÿÿ þšÿÿûõ"ÿÿ þXÿÿ þDÿÿþsÿ þÿÿ ý àÿÿýÊÿ þÿÿ þ—ÿÿýú-ÿ þ ÿÿ ýAþÿÿþ‚ÿ þ4ÿÿ ý ÞÿÿýÕÿ þyÿÿ þ”ÿÿýý8ÿýÚÿÿý?þÿÿþ‘ÿþ\ÿÿý Üÿÿýß ÿýåÿÿþ‘ÿÿþFÿþ¨ÿÿý<ýÿÿþ ÿþkÿÿþÛý ÚÿÿýèÿýBúÿÿýþ?þŽÿÿþTÿý)îÿÿþ†ý9ýÿÿþ¯ ÿýâÿÿý¼ýØÿÿýï ÿýÙÿÿýË þ‹ÿÿþc ÿýÒÿÿýÓý7üÿÿþ½ ÿýËÿÿýÚþÖÿÿýõ" ÿý Æÿÿýàÿþr ÿý Áÿÿýä"ÿý¼ÿÿýè'ÿ ý¸ÿÿýì, ÿ ý³ÿÿýï1 ÿ ý®ÿÿýó8ÿý©ÿÿýõ>ÿý£ÿÿýøE ÿýÿÿýúM!ÿþ•ÿÿýüU"ÿ þÿÿýþ^#ÿ þ…ÿÿþg$ÿ ÿÿ ÿ2LÍLÿþL ÿýå ÿþëý ÿ ÿþûJÿÿ!þ)ÿÿþ/úäÿÿ±þŠÿÿþÎþÿÿþ*ýçÿÿþmþGÿÿþzþLÿÿýøýâÿÿü½ÿ¿þ­ÿÿþªþšÿÿûõ"ÿÜýúÿÿþIþDÿÿûsÿôþoÿÿýåý àÿÿúÊÿôþÐÿÿþ‡þ—ÿÿùú-ÿßþ1ÿÿþ&ýAþÿÿþ‚ýÿÅþ’ÿÿþÄý ÞÿÿýÕýÿ‰ýìÿÿþcþ”ÿÿýý8ýÿFþTÿÿýõ ý?þÿÿþ‘ýæþ¶ÿÿþ¡ý Üÿÿýß þrýüÿÿþ?þ‘ÿÿþFþþxÿÿýÝý<ýÿÿþ þØÿÿþ}ý Úÿÿýèþ:ÿÿýýþŽÿÿþTþ›ÿÿþ»ý9ýÿÿþ¯ý ñÿÿþYýØÿÿýïþ]ÿÿýïþ‹ÿÿþc þ¾ÿÿþ—ý7üÿÿþ½ ý þÿÿþ6þÖÿÿýõ" þ€ÿÿþÔÿþr ýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýé7þÇÿÿþ7þ(ÿÿþ,7þ‰ÿÿþË7ýæÿÿþj7þKÿÿý÷$ÿþ8þ¬ÿÿþ§%ÿþ8 ýùÿÿþF%2LÍ:ú ?vŸÃÿÿÿý%ÿÿÿúO…ºïÿÿÿ ÿÿÿþ¯ÿÿÿÿüæïÿÿÿ÷æ³€Mdÿÿÿ&ÿÿ&ÿÿ&ÿÿ&ÿÿ&ÿÿ&ÿÿ&ÿÿ&ÿÿôn«×òüïÛÇ”Sÿÿüù›#ÿÿüü~ÿÿý³ ÿÿóúÁ}P' !IŠàÿÿý´ÿüÍhüfñÿÿþŠÿý'Ûÿÿýý*ÿý&ïÿÿþªÿþ`ÿÿýþÿýÛÿÿþ_ÿ þ…ÿÿþ£ÿ þBÿÿþÍÿ þÿÿþá ÿþ ÿÿþõ ÿþ ÿÿþú ÿþÿÿþî ÿþCÿÿþÒÿ þ‡ÿÿþªÿýÝÿÿþoÿþeÿÿþÿ ýž ý*ñÿÿþ¶ÿ üÿÚB ý+ßÿÿýý6ÿ ÿýµ>ülôÿÿþÿ ÿôàšV0"NŽæÿÿýº ÿÿ ÿý§ ÿ2LÍôáïúøêÛÉj5óBÄéùùéÄBû[Æ÷ÿÿýP×ÿÿý×P ÿý£ÿ ÿý¢ ÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ û³€Mÿÿþ`ÿÿý‡ýˆÿÿþ_ ÿýêÿÿþþ„ÿÿýé ÿþ~ÿÿýÂýÄÿÿþ| ÿýéÿÿþ3 þ4ÿÿýè ÿþNÿÿþÀ þÀÿÿþL ÿþ¢ÿÿþb þcÿÿþ¡ ÿþæÿÿýþ þÿÿþå ÿþ$ÿÿþÕþÖÿÿþ$ ÿþVÿÿþ¡þ¢ÿÿþU ÿþƒÿÿþwþxÿÿþ ÿþ¥ÿÿþTþTÿÿþ£ ÿþÃÿÿþ9þ:ÿÿþÁ ÿþØÿÿþ#þ#ÿÿþÖ ÿþéÿÿþþÿÿþè ÿþõÿÿþ þ ÿÿþô ÿþûÿÿþþÿÿþù ÿÿþþÿÿþþ ÿþûÿÿþþÿÿþú ÿþõÿÿþþ ÿÿþô ÿþêÿÿþþÿÿþè ÿþØÿÿþ"þ#ÿÿþÖ ÿþÃÿÿþ9þ:ÿÿþ ÿþ¥ÿÿþSþTÿÿþ£ ÿþƒÿÿþwþxÿÿþ‚ ÿþWÿÿþ¡þ¢ÿÿþU ÿþ%ÿÿþÕþÕÿÿþ$ ÿþæÿÿýþ ýþÿÿþæ ÿþ£ÿÿþb þbÿÿþ¢ ÿþOÿÿþ¿ þÀÿÿþM ÿýêÿÿþ3 þ4ÿÿýé ÿþ€ÿÿýÂýÃÿÿþ~ ÿýëÿÿþþƒÿÿýë ÿþcÿÿý†ý‡ÿÿþb ÿ þ«ÿÿ÷Öh%&j×ÿÿþ© ÿ ý ÁÿÿýÀ 2LÍóB†·ßñüóß¹ƒ:ð.e’¶ØêöúëÜÁ[ ÿ û$lµóÿ ÿüø¨6ÿ ÿüý•ÿ ÿýÏÿ ÿóÞg5 5g·üÿÿýÔ ÿÿüå‡4 ý'ÀÿÿþÿüÉZ ý«ÿÿýü!ÿ/ý ãÿÿþwÿ0þtÿÿþÁÿ0þ,ÿÿþàÿ0þÿÿþøÿ0þ ÿÿþòÿ0þ#ÿÿþØÿ0þeÿÿþ¡ÿ/ýÑÿÿþJÿôn«×òüïÛÇ”S#þ‹ÿÿýÏÿüù›#ý¢ÿÿýö1ÿüü~ù*Z¢ôÿÿýôIÿý³  ÿýÅ*ÿóúÁ}P' !IŠàÿÿý´ ÿý¬EüÍhüfñÿÿþŠ ÿüö¯>ý'Ûÿÿýý*ÿý±ý&ïÿÿþªù 4i®ûÿÿýàþ`ÿÿýþý¦ÿÿý× ýÛÿÿþ_ýcþÿÿþþ…ÿÿþ£þzÿÿýøþBÿÿþÍýØÿÿþsþÿÿþáþwÿÿþ³þ ÿÿþõþ0ÿÿþàþ ÿÿþúþÿÿþôþÿÿþîþÿÿþûþCÿÿþÒþÿÿþîþ‡ÿÿþªþ=ÿÿþÏýÝÿÿþoþˆÿÿþŸþeÿÿþý çÿÿûYž ý*ñÿÿþ¶þ–ÿÿùï ÿÚB ý+ßÿÿýý6 ý¼5ý†ÿÿüzÿÿýµ>ülôÿÿþ ÿü´U ý5ÅÿÿûÑÿÿôàšV0"NŽæÿÿýº ÿòò¯}K($OÒÿÿýåÿý§ ÿýÒ!2LÍ ï ?vŸÃáïúøêÛÉj5óB†·ßñüóß¹ƒ:Òóþ’ÿÿ þÆÿÿþ þ‡ÿÿþÃýìÿÿ ý*óÿÿýý •ÿÿýñ'þTÿÿ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿ ý&ÃÿÿýÂ$ýüÿÿ üD¦þÿÿüþ¥CþxÿÿþÝ ü'›íÿ ÿüí›'þØÿÿþ} üüÿÿüü‘þ:ÿÿýýý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþ»ý¼ÿÿüùqütúÿÿý¼ý ñÿÿþYþpÿÿýø= ý@ùÿÿþoþ]ÿÿýïý ïÿÿþc þfÿÿýî þ¾ÿÿþ—þaÿÿýÓ ýÔÿÿþaý þÿÿþ6þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÔ þÚÿÿþ1þ3ÿÿþÙýßÿÿþs þñÿÿþþÿÿþðþCÿÿýû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP þÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþF2LÍóBÄéùùéÄBÿýP×ÿÿý×Pÿý£ÿ ÿý¢ÿþë ý¾ÿÿý½ÿþ þ§ÿÿ÷Öi& (kØÿÿþ¦ÿþ/ þ`ÿÿý‡ýˆÿÿþ_ÿþÎ ýêÿÿþþ„ÿÿýéÿþm þ~ÿÿýÂýÄÿÿþ|þGÿÿýø ýéÿÿþ3 þ4ÿÿýèýâÿÿþª þNÿÿþÀ þÀÿÿþLþšÿÿþI þ¢ÿÿþb þcÿÿþ¡þDÿÿýå þæÿÿýþ þÿÿþåý àÿÿþ‡ þ$ÿÿþÕþÖÿÿþ$þ—ÿÿþ& þVÿÿþ¡þ¢ÿÿþU ýAþÿÿþÄ þƒÿÿþwþxÿÿþ ý ÞÿÿüÕÿc þ¥ÿÿþTþTÿÿþ£ þ”ÿÿûý8õ þÃÿÿþ9þ:ÿÿþÁ ý?þÿÿü‘¡ þØÿÿþ#þ#ÿÿþÖ ý Üÿÿûß ? þéÿÿþþÿÿþè þ‘ÿÿûF þõÿÿþ þ ÿÿþô ý<ýÿÿþ þûÿÿþþÿÿþùý ÚÿÿýèÿþþÿÿþþþŽÿÿþTþûÿÿþþÿÿþúý9ýÿÿþ¯þõÿÿþþ ÿÿþôýØÿÿýïþêÿÿþþÿÿþèþ‹ÿÿþcþØÿÿþ"þ#ÿÿþÖý7üÿÿþ½þÃÿÿþ9þ:ÿÿþÂþÖÿÿýõ"þ¥ÿÿþSþTÿÿþ£ÿþrþƒÿÿþwþxÿÿþ‚ ÿþWÿÿþ¡þ¢ÿÿþU ÿþ%ÿÿþÕþÕÿÿþ$ ÿþæÿÿýþ ýþÿÿþæ ÿþ£ÿÿþb þbÿÿþ¢$þOÿÿþ¿ þÀÿÿþM$ýêÿÿþ3 þ4ÿÿýé%þ€ÿÿýÂýÃÿÿþ~&ýëÿÿþþƒÿÿýë'þcÿÿý†ý‡ÿÿþb)þ«ÿÿ÷Öh%&j×ÿÿþ©*ý ÁÿÿýÀ 2LÍóB†·ßñüóß¹ƒ:þ þLÿÿù%[Æ÷ÿÿýåÿÿúO…ºïÿÿþ ÿÿÿü:Jÿÿÿû$ñäÿÿþ¯ÿÿÿúæ³€Mÿÿü¶ÿÿÿýïÿÿúæ³€Mÿþ8ÿÿýdÿÿÿþ‹ÿÿü½ÿÿÿþÌÿÿûõ"ÿÿÿþæÿÿþsÿÿþúÿÿýÊÿÿúðÿÿú-ÿÿûÓÿÿ‚ÿÿûšÿÿÿÿüAÿÿÿÿýÆÿÿÿý*óÿÿþBÿÿÿÿÿÿÿÿþÿÿý Æÿÿü¼ÿÿÿüpÿÿÿÿû ïÿÿÿÿþaÿÿÿÿþ§ÿÿÿþÚÿÿÿþñÿÿÿþûÿÿÿþêÿÿÿÿþÖÿÿÿÿþ³ÿÿÿÿþpÿÿÿÿþ)ÿÿÿÿü·ÿÿÿÿü2þÿÿÿ ýyÿÿÿ ”2LÍð?vŸÃáïúøêÛÉj5ôóýÑÿÿþJÿþ þ‡ÿÿþÃþ‹ÿÿýÏÿýý •ÿÿýñ'ý¢ÿÿýö1þòÿÿõç…CFŠëÿÿýñ>ù*Z¢ôÿÿýôIý&ÃÿÿýÂ$ ÿýÅ* üD¦þÿÿüþ¥C ÿý¬E ü'›íÿ ÿüí›' ÿüö¯>ýüÿÿüü‘ÿý±ÿõãƒD E„äÿÿýÆ ù 4i®ûÿÿýàÿüùqütúÿÿý¼ý¦ÿÿý× ÿýø= ý@ùÿÿþoýcþÿÿþÿþc þfÿÿýî þzÿÿýøüÿÓ ýÔÿÿþaýØÿÿþsýÿsþuÿÿþ¦þwÿÿþ³ýÿ1þ3ÿÿþÙþ0ÿÿþàýÿþÿÿþðþÿÿþôýÿþÿÿþúþÿÿþûýÿþÿÿþéþÿÿþîýÿ1þ3ÿÿþÕþ=ÿÿþÏýÿsþwÿÿþ³þˆÿÿþŸüÿÒ ý×ÿÿþoý çÿÿþYÿþc þlÿÿþ)þ–ÿÿýï ÿý÷= ýFúÿÿþ¶ý¼5ý†ÿÿþzÿüùpüxûÿÿýþ1ÿü´U ý5ÅÿÿýÑÿõâ‚C E…æÿÿþxÿòò¯}K($OÒÿÿýåÿþ“ ÿýÒ!2LÍ ô'xµÞôûêÔ´o&óB†·ßñüóß¹ƒ:Ïò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdù%[Æ÷ÿÿ ü2—ñÿÿýÒ0úO…ºïÿÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿ ÿý¼3 ý0ðÿÿþ± úæ³€Mÿ üÿæVþIÿÿþ*ÿ ý¨þµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿýÚÿÿþ‰ÿþ\ÿÿþFÿýåÿÿýæÿþ¨ÿÿþrÿþkÿÿýÛÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8 ÿý©ÿÿýõ>!ÿ ý£ÿÿýøE"ÿ ýÿÿýúM#ÿ þ•ÿÿýüU$ÿ þÿÿýþ^%ÿ þ…ÿÿþg&ÿ ÿþ8 ÿÿþ8 ÿ2LÍ2ò ?vŸÃáïúøêÛÉ÷÷BÄéùùé ÿýP×ÿÿ ÿý£ÿÿ ÿþë ý¾ÿÿ ÿþ þ§ÿÿùÖi& (þ)ÿÿþ/ þ`ÿÿý‡"þŠÿÿþÎ ýêÿÿþ#ýçÿÿþm þ~ÿÿýÂ#þLÿÿýø ýéÿÿþ3$þ­ÿÿþª þNÿÿþÀ$ýúÿÿþI þ¢ÿÿþb$þoÿÿýå þæÿÿýþ$þÐÿÿþ‡ þ$ÿÿþÕ$þ1ÿÿþ& þVÿÿþ¡$þ’ÿÿþÄ þƒÿÿþw#ýìÿÿþc þ¥ÿÿþT#þTÿÿýõ þÃÿÿþ9#þ¶ÿÿþ¡ þØÿÿþ#"ýüÿÿþ? þéÿÿþ"þxÿÿýÝ þõÿÿþ "þØÿÿþ}þûÿÿþ!þ:ÿÿýýÿþ!þ›ÿÿþ»þûÿÿþ ý ñÿÿþYþõÿÿþ þ]ÿÿýïþêÿÿþ þ¾ÿÿþ—þØÿÿþ"ý þÿÿþ6þÃÿÿþ9þ€ÿÿþÔþ¥ÿÿþSýßÿÿþsþƒÿÿþwþCÿÿýûþWÿÿþ¡þ¤ÿÿþ±þ%ÿÿþÕýöÿÿþPþæÿÿýþþfÿÿýéþ£ÿÿþbþÇÿÿþþOÿÿþ¿þ(ÿÿþ,ýêÿÿþ3þ‰ÿÿþËþ€ÿÿýÂýæÿÿþjýëÿÿþþKÿÿý÷þcÿÿý†ÿþ¬ÿÿþ§þ«ÿÿ÷Öh%&ÿÿýùÿÿþFý Áÿÿ2LÍüj5ô'xµÞôûêÔ´o&×ûÄB:ÿý×PþLÿÿý3¼ÿÿý¢ýåÿÿü“þÿÿý½þ ÿÿý µÿÿýkØÿÿþ¦þJÿÿý²ÿÿüˆÿÿþ_ýäÿÿþ¯ÿÿþtÿÿþ„ÿÿýéþÿÿýïÿÿ ýúÿÿþœýÄÿÿþ|þGÿÿýdÿÿ þÿÿýÑþ4ÿÿýèýâÿÿü½ÿÿ ýôÿÿþ>þÀÿÿþLþšÿÿûõ"ÿÿ þMÿÿþÓþcÿÿþ¡þDÿÿþsÿ þŒÿÿþþÿÿþåý àÿÿýÊÿ þÃÿÿþIþÖÿÿþ$þ—ÿÿýú-ÿ þÚÿÿþþ¢ÿÿþU ýAþÿÿþ‚ÿ þíÿÿþþxÿÿþ ý ÞÿÿýÕÿ þûÿÿþþTÿÿþ£ þ”ÿÿýý8ÿ þïÿÿþþ:ÿÿþÁ ý?þÿÿþ‘ÿ þÝÿÿþþ#ÿÿþÖ ý Üÿÿýß ÿ þÉÿÿþHþÿÿþè þ‘ÿÿþFÿ þ—ÿÿþ~þ ÿÿþô ý<ýÿÿþ ÿ þYÿÿþÑþÿÿþùý Úÿÿýèÿ ýüÿÿþ:þÿÿþþþŽÿÿþTÿ þ©ÿÿýÎþÿÿþúý9ýÿÿþ¯ ÿ þ5ÿÿþ•þ ÿÿþôýØÿÿýï ÿþ›ÿÿþÿÿþèþ‹ÿÿþc ÿý Òÿÿþ#ÿÿþÖý7üÿÿþ½ ÿýÕÿÿþ:ÿÿþÂþÖÿÿýõ" ÿû¸ÿÿþTÿÿþ£ÿþr ÿýNÒþxÿÿþ‚ÿ þþ¢ÿÿþUÿþÕÿÿþ$ÿýþÿÿþæÿþbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿýÃÿÿþ~ÿþƒÿÿýëÿý±ý‡ÿÿþbÿøÿô‡j×ÿÿþ©ÿÿýú°ÿÿýÀ ÿÿ2LÍô%n³ÓéûòÝ´v&óBÄéùùéÄB ÿüþ·-ýP×ÿÿý×P ÿýûwý£ÿ ÿý¢ ÿþ—ý¾ÿÿý½ õÿì‹==Œíÿÿþ€þ§ÿÿ÷Öi& (kØÿÿþ¦ ý¨ý«ÿÿýýB þ`ÿÿý‡ýˆÿÿþ_ þý ÿÿýØ ýêÿÿþþ„ÿÿýéýÕÿÿþf þ~ÿÿýÂýÄÿÿþ|þAÿÿýÚýéÿÿþ3 þ4ÿÿýèþÖÿÿþ=þNÿÿþÀ þÀÿÿþLþÿÿþ•þ¢ÿÿþb þcÿÿþ¡þKÿÿþÜþæÿÿýþ þÿÿþåþ!ÿÿþþ$ÿÿþÕþÖÿÿþ$þÿÿþOþVÿÿþ¡þ¢ÿÿþUþÿÿþ}þƒÿÿþwþxÿÿþþÿÿþŸþ¥ÿÿþTþTÿÿþ£þ ÿÿþ¿þÃÿÿþ9þ:ÿÿþÁþJÿÿþÔþØÿÿþ#þ#ÿÿþÖþÿÿþçþéÿÿþþÿÿþèþÓÿÿþôþõÿÿþ þ ÿÿþôþ=ÿÿþùþûÿÿþþÿÿþùýÑÿÿþþÿþþÿÿþþý™ÿÿþøþûÿÿþþÿÿþúý£ý¥ÿÿþðþõÿÿþþ ÿÿþôõÿëˆ;;‰ëÿÿþÞÿÿþßþêÿÿþþÿÿþè ÿýèDÿÿþÇþØÿÿþ"þ#ÿÿþÖ ÿüÓ$8ÿÿþ©þÃÿÿþ9þ:ÿÿþ ÿúð~ Sÿÿþþ¥ÿÿþSþTÿÿþ£ô4{»×ìüòÖ¥^ þ‚ÿÿþPþƒÿÿþwþxÿÿþ‚þ»ÿÿþþWÿÿþ¡þ¢ÿÿþUýñÿÿþÐþ%ÿÿþÕþÕÿÿþ$þJÿÿþ|þæÿÿýþ ýþÿÿþæþ®ÿÿýý!þ£ÿÿþb þbÿÿþ¢ý$úÿÿþ° þOÿÿþ¿ þÀÿÿþMþ¼ÿÿýþ2 ýêÿÿþ3 þ4ÿÿýéþpÿÿþ¡ þ€ÿÿýÂýÃÿÿþ~þlÿÿýå ýëÿÿþþƒÿÿýëý¬ÿÿýù> þcÿÿý†ý‡ÿÿþb öi./d±÷ÿÿýüZþ«ÿÿ÷Öh%&j×ÿÿþ© ÿýöTý ÁÿÿýÀ 2LÍô'xµÞôûêÔ´o&óB†·ßñüóß¹ƒ:Õó7€·Þñüñß¶†A/übÖÿ ÿüð—2 ÿ ý)Îÿÿ ÿ ýPõÿÿ ÿ ýVüÿÿôø´g1.k²úÿÿ ÿý;øÿÿý°!û‰õÿ ÿýãÿÿþo ý± ÿþžÿÿþrÿý0ýÿÿþ½ÿþ®ÿÿýú%ÿý üÿÿþ­ÿþ{ÿÿþJÿþÏÿÿýñÿýþÿÿþºÿþPÿÿþó \¤ÔòûëÕ¹x1ÿþ€ÿÿúRzïÿÿýÎHÿôn«×òüïÛÇ”Sþ©ÿÿü7"Ðÿ ÿý° ÿüù›#þÈÿÿýBæÿÿýÍ ÿüü~þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ ÿý³ þðÿÿý~ýÿÿþ ÿóúÁ}P' !IŠàÿÿý´þùÿÿþuþvÿÿþ. üÍhüfñÿÿþŠþþÿÿþº þ¼ÿÿþ¢ý'Ûÿÿýý*þûÿÿþ* þ,ÿÿýúý&ïÿÿþªþõÿÿþÆ þÇÿÿþUþ`ÿÿúþêÿÿþw þxÿÿþ“ýÛÿÿû_×ÿÿþD þFÿÿþÆþ…ÿÿû£Áÿÿþ þÿÿþÛþBÿÿûÍ¢ÿÿþ þÿÿþíþÿÿûá€ÿÿþ þÿÿþûþ ÿÿûõQÿÿþ þÿÿþìþ ÿÿûúÿÿþ þÿÿþÙþÿÿþîþÞÿÿþD þFÿÿþÂþCÿÿþÒþ—ÿÿþx þyÿÿþ‹þ‡ÿÿþªþ@ÿÿþÇ þÉÿÿþLýÝÿÿþoýÝÿÿþ+ þ,ÿÿýôþeÿÿþþjÿÿþ» þ¼ÿÿþýž ý*ñÿÿþ¶ýÛÿÿþuþvÿÿýúüÿÚB ý+ßÿÿýý6ýEþÿÿý~ýÿÿþsÿýµ>ülôÿÿþþ„ÿÿ÷Óm( (mÓÿÿþ± ÿôàšV0"NŽæÿÿýºýšÿÿýµ ÿý§ 2LÍ4ô'xµÞôûêÔ´o&óóülôÿÿþ ý2þÿÿüùpýxÿôàšV0"NŽæÿÿýº þyÿÿôâ‚C E…æÿÿý§ þ”ÿÿ2LÍóB†·ßñüóß¹ƒ:öô%n³ÓéûòÝ´v&øBÄÙoý3¼ÿÿüþ·-ýP×ÿÿýÐ/ü“þÿ ÿýûwý£ÿÿýò9 ý µÿÿþ—ý¾ÿÿýð# ý²ÿÿöì‹==Œíÿÿþ€þ§ÿÿýÖiÿÿþµ þtÿÿý¨ý«ÿÿýýB þ`ÿÿû‡‹ÿÿþ8ýúÿÿýœý ÿÿýØ ýêÿÿþýÕÿÿþŠþÿÿýÑ ýÕÿÿþf þ~ÿÿýÂþhÿÿþËýôÿÿþ> þAÿÿýÚýéÿÿþ3þ&ÿÿþåþMÿÿþÓ þÖÿÿþ=þNÿÿþÀþ ÿÿþùþŒÿÿþ þÿÿþ•þ¢ÿÿþbþ ÿÿþïþÃÿÿþI þKÿÿþÜþæÿÿýþþ%ÿÿþÒþÚÿÿþ þ!ÿÿþþ$ÿÿþÕþgÿÿþ™þíÿÿþ þÿÿþOþVÿÿþ¡ýÔÿÿþ>þûÿÿþ þÿÿþ}þƒÿÿþwþ‡ÿÿþÃþïÿÿþ þÿÿþŸþ¥ÿÿþTÿýñ'þÝÿÿþ þ ÿÿþ¿þÃÿÿþ9ÿýñ> þÉÿÿþH þJÿÿþÔþØÿÿþ#ÿýÂ$ þ—ÿÿþ~ þÿÿþçþéÿÿþý¥C þYÿÿþÑ þÓÿÿþôþõÿÿþ üí›' ýüÿÿþ: þ=ÿÿþùþûÿÿþÿüü‘ þ©ÿÿýÎ ýÑÿÿþþÿþÿýÆ þ5ÿÿþ•ý™ÿÿþøþûÿÿþþúÿÿý¼ þ›ÿÿý£ý¥ÿÿþðþõÿÿþý@ùÿÿþo ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþêÿÿþþfÿÿýî ýÕÿÿýèDÿÿþÇþØÿÿþ"ýÔÿÿþa ý¸ÿ ÿüÓ$8ÿÿþ©þÃÿÿþ9þuÿÿþ¦ ýNÒÿÿúð~ Sÿÿþþ¥ÿÿþSþ3ÿÿþÙ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþƒÿÿþwþÿÿþðþ»ÿÿþþWÿÿþ¡þÿÿþúýñÿÿþÐþ%ÿÿþÕþÿÿþéþJÿÿþ|þæÿÿýþþ3ÿÿþÕþ®ÿÿýý!þ£ÿÿþbþwÿÿþ³ý$úÿÿþ° þOÿÿþ¿ý×ÿÿþoþ¼ÿÿýþ2 ýêÿÿþ3þlÿÿþ)þpÿÿþ¡ þ€ÿÿýÂýFúÿÿþ¶ ý± þlÿÿýå ýëÿÿþþûÿÿýþ1 ûÿô‡ý¬ÿÿýù> þcÿÿü†ÿÿþx ÿôú°i./d±÷ÿÿýüZþ«ÿÿýÖhÿÿþ“ ÿýöTý Áÿÿ€2€L€ÍðõéùùéÄBÿÿü×Pÿÿþ¢ÿÿù& (kØÿÿýˆÿÿü„ÿÿüÄÿý4ÿþÀþcþÆþþbþÀý4ÿüÃÿüƒÿÿý‡ÿÿù%&j×ÿ ÿ2LÍ þnÿÿýãþnÿÿýãþÏÿÿþ„þÏÿÿþ„7ð.e’¶ØêöúëÜÁ[ ù%[Æ÷ÿÿû$lµóÿ ÿüø¨6úO…ºïÿÿÿüý•ÿÿýÏÿÿóÞg5 5g·üÿÿþÔÿúæ³€Mÿÿÿüå‡4 ý'Àÿÿúæ³€MÿüÉZ ý«ÿÿÿ%ý ãÿÿÿ&þtÿÿÿ&þ,ÿÿÿ&þÿÿÿ&þ ÿÿÿ&þ#ÿÿÿ&þeÿÿÿ%ýÑÿÿÿ%þ‹ÿÿÿ#ý¢ÿÿþöÿù*Z¢ôÿÿýôIÿ ÿýÅ*ÿ ÿý¬Eÿ ÿüö¯>ÿÿý±ÿù 4i®ûÿÿþàÿ#ý¦ÿÿÿ%ýcþÿÿÿ&þzÿÿÿ&ûØÿÿÿ'üwÿÿÿ'ü0ÿÿÿ'üÿÿÿ'üÿÿÿ'üÿÿÿ'ü=ÿÿÿ'üˆÿÿÿ&û çÿÿÿ&þ–ÿÿÿý¼5ý†ÿÿÿÿü´U ý5Åÿÿ2LÍÿýÑ-,ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:÷BÄéùùéþLÿÿýP×ÿÿýåÿÿý£ÿÿþ ÿÿý¾ÿÿþ þJÿÿþ§ÿÿøÖi& (ýäÿÿþ¯ÿÿþ`ÿÿý‡ýü!þÿÿýïÿÿýêÿÿþýÿwþGÿÿýdÿÿþ~ÿÿýÂýÿÁýâÿÿü½ÿÿ ýéÿÿþ3ýÿàþšÿÿûõ"ÿÿ þNÿÿþÀýÿøþDÿÿþsÿ þ¢ÿÿþbýÿòý àÿÿýÊÿ þæÿÿýþýÿØþ—ÿÿýú-ÿ þ$ÿÿþÕýÿ¡ýAþÿÿþ‚ÿ þVÿÿþ¡ýÿJý ÞÿÿýÕÿ þƒÿÿþwýÏþ”ÿÿýý8ÿ þ¥ÿÿþTþ1ý?þÿÿþ‘ÿ þÃÿÿþ9ý Üÿÿýß ÿ þØÿÿþ#þ‘ÿÿþFÿ þéÿÿþý<ýÿÿþ ÿ þõÿÿþ ý Úÿÿýèÿ þûÿÿþþŽÿÿþTÿ ÿþþ ý9ýÿÿþ¯ ÿ þûÿÿþý× ýØÿÿýï ÿ þõÿÿþýÿþ‹ÿÿþc ÿ þêÿÿþüÿøý7üÿÿþ½ ÿ þØÿÿþ"ÿþsþÖÿÿýõ" ÿ þÃÿÿþ9ÿþ³ÿþr ÿ þ¥ÿÿþSÿþàÿþƒÿÿþwÿþôÿþWÿÿþ¡ÿþûÿþ%ÿÿþÕÿþîÿþæÿÿýþÿþÏÿ þ£ÿÿþbÿþŸÿ þOÿÿþ¿ÿþYÿ ýêÿÿþ3üÿï ÿþ€ÿÿýÂýÿzÿýëÿÿþýÑÿþcÿÿý†2LÍÿ ÿüø} ÿÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5ØûÄBóþTÿÿþ£þÆÿÿþ þ‡ÿÿþÃþ:ÿÿþÁý*óÿÿýý •ÿÿýñ'þ#ÿÿþÖ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþè ý&ÃÿÿýÂ$þ ÿÿþô üD¦þÿÿüþ¥Cþÿÿþù ü'›íÿ ÿüí›'þÿÿþþ üüÿÿüü‘þÿÿþúý ÆÿÿõãƒD E„äÿÿýÆ þ ÿÿþôý¼ÿÿüùqütúÿÿý¼þÿÿþèþpÿÿýø= ý@ùÿÿþoþ#ÿÿþÖý ïÿÿþc þfÿÿýî þ:ÿÿþÂþaÿÿýÓ ýÔÿÿþaþTÿÿþ£þ§ÿÿþsþuÿÿþ¦þxÿÿþ‚þÚÿÿþ1þ3ÿÿþÙþ¢ÿÿþUþñÿÿþþÿÿþðþÕÿÿþ$þûÿÿþþÿÿþúýþÿÿþæþêÿÿþþÿÿþéþbÿÿþ¢þÖÿÿþ1þ3ÿÿþÕþÀÿÿþMþ³ÿÿþsþwÿÿþ³þ4ÿÿýéþpÿÿýÒ ý×ÿÿþoýÃÿÿþ~þ)ÿÿþc þlÿÿþ)þƒÿÿýë þ·ÿÿý÷= ýFúÿÿþ¶ý‡ÿÿþb ý2þÿÿüùpüxûÿÿýþ12LÍÿþ8 ÿ ÿþ8 ÿJû[Æ÷ÿÿÿ ÿÿ ÿÿþëÿÿþû³€Mÿÿ%þ)ÿÿþ/ ÿ%þŠÿÿþÎ ÿ$ýçÿÿþm ÿ$þLÿÿýø ÿ$þ­ÿÿþªÿ#ýúÿÿþIÿ#þoÿÿýåÿ#þÐÿÿþ‡ÿ"þ1ÿÿþ&ÿ"þ’ÿÿþÄÿ!ýìÿÿþcÿ!þTÿÿýõ ÿ!þ¶ÿÿþ¡ÿ ýüÿÿþ?ÿ þxÿÿýÝÿ þØÿÿþ}ÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿý÷2LÍþnÿÿýã'ÿ þÏÿÿþ„(ÿ ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþg2LÍ ýyüÿ ÿüþ” ÿý.¸ÿ ÿý¼4 ÿô'xµÞôûêÔ´o&óô%n³ÓéûòÝ´v&ó þAÿÿýÚþÌÿÿþfþMÿÿþÓ þÖÿÿþ=þæÿÿþ$þŒÿÿþ þÿÿþ•þúÿÿþ þÃÿÿþI þKÿÿþÜþðÿÿþ þÚÿÿþ þ!ÿÿþþÓÿÿþ$þíÿÿþ þÿÿþOþšÿÿþeþûÿÿþ þÿÿþ}þAÿÿýÑþïÿÿþ þÿÿþŸþÆÿÿþþÝÿÿþ þ ÿÿþ¿ý*óÿÿýý •þÉÿÿþH þJÿÿþÔ ýBòÿÿôç…CFŠëÿþ—ÿÿþ~ þÿÿþç ý&Ãÿ ÿþYÿÿþÑ þÓÿÿþô üD¦þÿÿþþýüÿÿþ: þ=ÿÿþù ü'›íÿ ÿþ©ÿÿýÎ ýÑÿÿþþ üüÿ ÿþ5ÿÿþ•ý™ÿÿþøý ÆÿÿôãƒD E„äÿþ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùqýtý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø=ýÕÿÿýèDÿÿþÇý ïÿÿþcý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓýNÒÿÿúð~ Sÿÿþþ§ÿÿþsó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1*þ»ÿÿþþñÿÿþ)ýñÿÿþÐþûÿÿþ)þJÿÿþ|þêÿÿþ)þ®ÿÿýý!þÖÿÿþ1(ý$úÿÿþ°þ³ÿÿþs(þ¼ÿÿýþ2þpÿÿýÒ&þpÿÿþ¡ þ)ÿÿþcý± þlÿÿýå þ·ÿÿý÷=ûÿô‡ý¬ÿÿýù> ý2þÿÿüùpþx2LÍÿþ8ÿüø}ÿþ8û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5ø ý ÞÿÿýÕÿ þAÿÿýÑþ‡ÿÿþÃþ”ÿÿýý8ÿþÆÿÿþÿýñ' ý?þÿÿþ‘ÿý*óÿÿûÿÿýñ> ý Üÿÿýß ÿýBòÿÿøç…CÿÿÂ$þ‘ÿÿþFÿý&Ãÿÿý¥Cý<ýÿÿþ ÿüD¦þÿÿüí›' ý Úÿÿýèÿü'›íÿÿüü‘ þŽÿÿþTÿüüÿÿýÆ ý9ýÿÿþ¯ ÿý ÆÿÿûãƒDúÿÿý¼ýØÿÿýï ÿ ý¼ÿÿøùq@ùÿÿþoþ‹ÿÿþc ÿ þpÿÿýø=þfÿÿýî ý7üÿÿþ½ ÿ ý ïÿÿþcýÔÿÿþaþÖÿÿýõ" ÿ þaÿÿýÓþuÿÿþ¦ÿþr ÿ þ§ÿÿþsþ3ÿÿþÙÿþÚÿÿþ1þÿÿþðÿþñÿÿþþÿÿþúÿþûÿÿþþÿÿþéÿþêÿÿþþ3ÿÿþÕÿ þÖÿÿþ1þwÿÿþ³ÿ þ³ÿÿþsý×ÿÿþoÿ þpÿÿýÒþlÿÿþ)ÿ þ)ÿÿþcýFúÿÿþ¶ÿ þ·ÿÿý÷=þûÿÿýþ1ÿ ý2þÿÿüùp2LÍÿýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼41ô'xµÞôûêÔ´o&Ó÷ç÷øè×°z=6ÿüÙoù%[Æ÷ÿÿ ÿýÐ/ úO…ºïÿÿ ÿýò9 ÿø H‹íÿÿýð# ÿý šÿÿþµ ÿúæ³€Mÿÿþ`þ‹ÿÿþ8 úæ³€MÿýêýÕÿÿþŠÿý~ÿþhÿÿþËÿüéÿþ&ÿÿþåÿüNÿÿþ ÿÿþùÿü¢ÿÿþ ÿÿþïÿüæÿÿþ%ÿÿþÒÿþ$ÿÿþgÿÿþ™ÿþVÿÿýÔÿÿþ>ÿþƒÿÿþ‡ÿÿþÃÿþ¥ÿÿý •ÿÿýñ'ÿþÃÿÿøFŠëÿÿýñ>ÿþØÿ ÿýÂ$ÿþéÿÿüþ¥Cÿþõÿ ÿüí›'ÿþûÿ ÿüü‘ÿÿø E„äÿÿýÆ ÿþûÿÿütúÿÿý¼ÿþõÿÿý@ùÿÿþoÿþêÿÿþfÿÿýî ÿþØÿÿýÔÿÿþaÿþÃÿÿ þuÿÿþ¦ÿþ¥ÿÿ þ3ÿÿþÙÿþƒÿÿ þÿÿþðÿþWÿÿ þÿÿþúÿþ%ÿÿ þÿÿþéÿüæÿÿþ3ÿÿþÕÿü£ÿÿþwÿÿþ³ÿüOÿÿý×ÿÿþoÿüêÿþlÿÿþ)ÿý€ÿýFúÿÿþ¶ÿýëüxûÿÿýþ1ÿc2LÍý_òÿÿýò_ ÿüŠíÿ ÿüíŠÿñ Jƒ¹×èøøè×¹ƒJ òóBÄéùùéÄBð.e’¶ØêöúëÜÁ[ýP×ÿÿý×Pû$lµóÿ ÿüø¨6 ý£ÿ ÿý¢ ÿüý•ý¾ÿÿý½ ÿýÏþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿóÞg5 5g·üÿÿýÔ ÿý‡ýˆÿÿþ_ ÿüå‡4 ý'Àÿÿþÿþþ„ÿÿýé üÉZ ý«ÿÿýü!ÿýÂýÄÿÿþ|ý ãÿÿþwÿþ3 þ4ÿÿýèþtÿÿþÁÿþÀ þÀÿÿþLþ,ÿÿþàÿþb þcÿÿþ¡þÿÿþøüÿþ þÿÿþåþ ÿÿþòýÿÕþÖÿÿþ$þ#ÿÿþØýÿ¡þ¢ÿÿþUþeÿÿþ¡ýÿwþxÿÿþýÑÿÿþJýÿTþTÿÿþ£þ‹ÿÿýÏýÿ9þ:ÿÿþÁý¢ÿÿýö1ýÿ#þ#ÿÿþÖù*Z¢ôÿÿýôIýÿþÿÿþè ÿýÅ*ýÿ þ ÿÿþô ÿý¬E ýÿþÿÿþù ÿüö¯>ýÿþÿÿþþ ÿý±ýÿþÿÿþúù 4i®ûÿÿýàýÿþ ÿÿþôý¦ÿÿý× ýÿþÿÿþèýcþÿÿþýÿ"þ#ÿÿþÖþzÿÿýøýÿ9þ:ÿÿþÂýØÿÿþsýÿSþTÿÿþ£þwÿÿþ³ýÿwþxÿÿþ‚þ0ÿÿþàýÿ¡þ¢ÿÿþUþÿÿþôýÿÕþÕÿÿþ$þÿÿþûüÿþ ýþÿÿþæþÿÿþîÿþb þbÿÿþ¢þ=ÿÿþÏÿþ¿ þÀÿÿþMþˆÿÿþŸÿþ3 þ4ÿÿýéý çÿÿþYÿýÂýÃÿÿþ~þ–ÿÿýï ÿþþƒÿÿýëý¼5ý†ÿÿþzÿý†ý‡ÿÿþb ÿü´U ý5ÅÿÿýÑ2LÍÿý ¦ÿ ÿý¥ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘CÌò@v©Óæùóâѧn2.û [ªñÿ ÿüÏd ÿü2—ñÿÿýÒ0 ÿÿýú] ÿÿõâ“R% 9xÚÿÿýüT ÿÿûþµDüeõÿÿý÷!þ)ÿÿÿý¼3 ý0ðÿÿþ±þŠÿÿüÿæVþIÿÿþ*ýçÿÿý¨þµÿÿþzþLÿÿþøþXÿÿþ¿þ­ÿÿþªþÿÿþÜýúÿÿþIþÿÿþôþoÿÿýåþ ÿÿþôþÐÿÿþ‡þ4ÿÿþßþ1ÿÿþ&þyÿÿþÅþ’ÿÿþÄýÚÿÿþ‰ýìÿÿþcþ\ÿÿþFþTÿÿýõ ýåÿÿýæþ¶ÿÿþ¡þ¨ÿÿþrýüÿÿþ?þkÿÿýÛþxÿÿýÝýBúÿÿýþ?þØÿÿþ}ý)îÿÿþ†þ:ÿÿýýýâÿÿý¼þ›ÿÿþ»ýÙÿÿýË ý ñÿÿþYýÒÿÿýÓþ]ÿÿýïýËÿÿýÚþ¾ÿÿþ—ý Æÿÿýàý þÿÿþ6ý Áÿÿýä"þ€ÿÿþÔý¼ÿÿýè'ýßÿÿþsý¸ÿÿýì,þCÿÿýûý³ÿÿýï1þ¤ÿÿþ±ý®ÿÿýó8ýöÿÿþPý©ÿÿýõ>þfÿÿýé ý£ÿÿýøEþÇÿÿþ ýÿÿýúMþ(ÿÿþ, þ•ÿÿýüU þ‰ÿÿþË þÿÿýþ^ ýæÿÿþj þ…ÿÿþg!þKÿÿý÷2LÍÿ ÿÿ ÿ8õBÄéùùéÿÿþLÿÿýP×ÿÿýåÿÿý£ÿÿþëþ ÿÿý¾ÿ ÿþþJÿÿþ§ÿÿ÷Öi& (ÿ/ýäÿÿþ¯ÿÿþ`ÿÿý‡þÎþÿÿýïÿÿýêÿÿþþmþGÿÿýdÿÿþ~ÿÿýÂþýâÿÿü½ÿÿ ýéÿÿþ3þšÿÿûõ"ÿÿ þNÿÿþÀþDÿÿþsÿ þ¢ÿÿþbý àÿÿýÊÿ þæÿÿýþþ—ÿÿýú-ÿ þ$ÿÿþÕýAþÿÿþ‚ÿ þVÿÿþ¡ý ÞÿÿýÕÿ þƒÿÿþwþ”ÿÿýý8ÿ þ¥ÿÿþTý?þÿÿþ‘ÿ þÃÿÿþ9ý Üÿÿýß ÿ þØÿÿþ#þ‘ÿÿþFÿ þéÿÿþý<ýÿÿþ ÿ þõÿÿþ ý Úÿÿýèÿ þûÿÿþþŽÿÿþTÿ ÿþý9ýÿÿþ¯ ÿ þûÿÿþýØÿÿýï ÿ þõÿÿþþ‹ÿÿþc ÿ þêÿÿþý7üÿÿþ½ ÿ þØÿÿþ"þÖÿÿýõ" ÿ þÃÿÿþ9ÿþr ÿ þ¥ÿÿþSÿþƒÿÿþwÿþWÿÿþ¡ÿþ%ÿÿþÕÿþæÿÿýþ%ÿ þ£ÿÿþb%ÿ þOÿÿþ¿%ÿ ýêÿÿþ3$ÿþ€ÿÿýÂ#ÿýëÿÿþ#ÿþcÿÿý†2LÍ ÿþ8 ý ¦ÿ ÿý¥ ÿþ8ýRØÿÿýØR û'vÃúÿÿóD‘ÆêùùêÆ‘Cú ?vŸÃ¿ûÄB:ÿý×Pù%[Æ÷ÿÿý3¼ÿÿý¢ úO…ºïÿÿü“þÿÿý½ ÿý µÿÿýkØÿÿþ¦ ÿý²ÿÿüˆÿÿþ_ ÿúæ³€Mÿÿþtÿÿþ„ÿÿýé úæ³€MÿýúÿÿþœýÄÿÿþ|ÿþÿÿýÑþ4ÿÿýèÿýôÿÿþ>þÀÿÿþLÿþMÿÿþÓþcÿÿþ¡ÿþŒÿÿþþÿÿþåÿþÃÿÿþIþÖÿÿþ$ÿþÚÿÿþþ¢ÿÿþUÿþíÿÿþþxÿÿþÿþûÿÿþþTÿÿþ£ÿþïÿÿþþ:ÿÿþÁÿþÝÿÿþþ#ÿÿþÖÿþÉÿÿþHþÿÿþèÿþ—ÿÿþ~þ ÿÿþôÿþYÿÿþÑþÿÿþùÿýüÿÿþ:þÿÿþþÿþ©ÿÿýÎþÿÿþúÿþ5ÿÿþ•þ ÿÿþôÿþ›ÿÿþÿÿþèÿý Òÿÿþ#ÿÿþÖÿýÕÿÿþ:ÿÿþÂÿû¸ÿÿþTÿÿþ£ÿýNÒþxÿÿþ‚ÿþþ¢ÿÿþUÿ þÕÿÿþ$ÿýþÿÿþæÿþbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿýÃÿÿþ~ÿþƒÿÿýëÿý±ý‡ÿÿþbÿûÿô‡2LÍ ÿüø}ý ¦ÿ ÿý¥ ÿüàýRØÿÿýØR ôáïúøêÛÉj5óD‘ÆêùùêÆ‘CÏô%n³ÓéûòÝ´v&ð.e’¶ØêöúëÜÁ[ ÿüþ·-û$lµóÿ ÿüø¨6 ÿýûw ÿüý• ÿþ— ÿýÏ õÿì‹==Œíÿÿþ€ ÿóÞg5 5g·üÿÿýÔ ý¨ý«ÿÿýýB ÿüå‡4 ý'Àÿÿþ þý ÿÿýØ üÉZ ý«ÿÿýü!ýÕÿÿþfý ãÿÿþwþAÿÿýÚþtÿÿþÁþÖÿÿþ=þ,ÿÿþàþÿÿþ•þÿÿþøþKÿÿþÜþ ÿÿþòþ!ÿÿþþ#ÿÿþØþÿÿþOþeÿÿþ¡þÿÿþ}ýÑÿÿþJþÿÿþŸþ‹ÿÿýÏþ ÿÿþ¿ý¢ÿÿýö1þJÿÿþÔù*Z¢ôÿÿýôIþÿÿþç ÿýÅ*þÓÿÿþô ÿý¬Eþ=ÿÿþù ÿüö¯>ýÑÿÿþþ ÿý±ý™ÿÿþøù 4i®ûÿÿýà ý£ý¥ÿÿþðý¦ÿÿý× õÿëˆ;;‰ëÿÿþÞÿÿþßýcþÿÿþ ÿýèDÿÿþÇþzÿÿýø ÿüÓ$8ÿÿþ©ýØÿÿþs ÿúð~ Sÿÿþþwÿÿþ³ô4{»×ìüòÖ¥^ þ‚ÿÿþPþ0ÿÿþàþ»ÿÿþþÿÿþôýñÿÿþÐþÿÿþûþJÿÿþ|þÿÿþîþ®ÿÿýý!þ=ÿÿþÏý$úÿÿþ°þˆÿÿþŸþ¼ÿÿýþ2ý çÿÿþYþpÿÿþ¡þ–ÿÿýï þlÿÿýå ý¼5ý†ÿÿþzý¬ÿÿýù> ÿü´U ý5ÅÿÿýÑ2LÍÿþnÿÿýãÿþÏÿÿþ„OÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿ þCÿÿýûÿ þ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýé$ÿ þÇÿÿþ%ÿ þ(ÿÿþ,%ÿ þ‰ÿÿþË&ÿ ýæÿÿþj&ÿ þKÿÿý÷&ÿ2LÍ ýyüÿ ÿüþ”ý ¦ÿ ÿý.¸ÿ ÿý¼4ýRØÿÿþØô'xµÞôûêÔ´o&óD‘ÆêùùêÆ‘CÏóBÄéùùéÄBô%n³ÓéûòÝ´v&ýP×ÿÿý×Pý3¼ÿÿýþ· ý£ÿ ÿý¢ü“þÿ ÿ ý¾ÿÿý½ ý µÿ ÿ þ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿôì‹==Œíÿÿ þ`ÿÿý‡ýˆÿÿþ_ þtÿÿý¨ü«ÿýêÿÿþþ„ÿÿýé ýúÿÿýœý þ~ÿÿýÂýÄÿÿþ| þÿÿýÑ þýéÿÿþ3 þ4ÿÿýèýôÿÿþ>þNÿÿþÀ þÀÿÿþLþMÿÿþÓþ¢ÿÿþb þcÿÿþ¡þŒÿÿþþæÿÿýþ þÿÿþåþÃÿÿþIþ$ÿÿþÕþÖÿÿþ$þÚÿÿþþVÿÿþ¡þ¢ÿÿþUþíÿÿþþƒÿÿþwþxÿÿþþûÿÿþþ¥ÿÿþTþTÿÿþ£þïÿÿþþÃÿÿþ9þ:ÿÿþÁþÝÿÿþþØÿÿþ#þ#ÿÿþÖþÉÿÿþHþéÿÿþþÿÿþèþ—ÿÿþ~þõÿÿþ þ ÿÿþôþYÿÿþÑþûÿÿþþÿÿþùýüÿÿþ:ÿþþÿÿþþþ©ÿÿýÎ þþûÿÿþþÿÿþúþ5ÿÿþ•ý™þõÿÿþþ ÿÿþôþ›ÿÿý£ü¥ÿþêÿÿþþÿÿþèý Òÿÿôëˆ;;‰ëÿÿþØÿÿþ"þ#ÿÿþÖ ýÕÿ ÿþÃÿÿþ9þ:ÿÿþ ý¸ÿ ÿþ¥ÿÿþSþTÿÿþ£ ýNÒÿÿüð~ÿþƒÿÿþwþxÿÿþ‚ ñ4{»×ìüòÖ¥^ ÿþWÿÿþ¡þ¢ÿÿþUþÿþ%ÿÿþÕþÕÿÿþ$þÿþæÿÿýþ ýþÿÿþæ$þ£ÿÿþb þbÿÿþ¢$þOÿÿþ¿ þÀÿÿþM$ýêÿÿþ3 þ4ÿÿýé%þ€ÿÿýÂýÃÿÿþ~þpýëÿÿþþƒÿÿýë ý± ýlÿ þcÿÿý†ý‡ÿÿþb ûÿô‡ý¬ÿÿ2LÍüÿ¥þnÿÿýã ÿþRþÏÿÿþ„û)zÊýÿÿ6öI¨Íæóüñ×óþÿÿþŸþÆÿÿþ þ‡ÿÿþÃþ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþç ý&ÃÿÿýÂ$þÓÿÿþô üD¦þÿÿüþ¥Cþ=ÿÿþù ü'›íÿ ÿüí›'þÑÿÿþþ üüÿÿüü‘ÿþøý ÆÿÿõãƒD E„äÿÿýÆ ÿþðý¼ÿÿüùqütúÿÿý¼ÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþoüÿèDÿÿþÇý ïÿÿþc þfÿÿýî üÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþaû Sÿÿþþ§ÿÿþsþuÿÿþ¦û€‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙúß»ÿÿþþñÿÿþþÿÿþðúCÿñÿÿþÐþûÿÿþþÿÿþúû¤ÿJÿÿþ|þêÿÿþþÿÿþéúöÿ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕúfÿÿ$úÿÿþ°þ³ÿÿþsþwÿÿþ³ûÇÿÿ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ¡ þ)ÿÿþc þlÿÿþ)þ‰ÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿýù> ý2þÿÿüùpüxûÿÿýþ1þKÿÿ2LÍÿýóaÿýÑ-ÿüãyü3˜ðÿ ÿüØeùàÏ«r8óB†·ßñüóß¹ƒ: ÿù%[Æ÷ÿÿÿ úO…ºïÿÿÿþë ÿÿþ ÿÿþ)ÿÿþ/ ÿúæ³€MÿÿÿþŠÿÿþÎ úæ³€MÿÿýçÿÿþmÿÿþLÿÿýøÿÿþ­ÿÿþªÿÿýúÿÿþIÿÿþoÿÿýåÿÿþÐÿÿþ‡ÿÿþ1ÿÿþ&ÿÿþ’ÿÿþÄÿÿýìÿÿþcÿÿþTÿÿýõ ÿÿþ¶ÿÿþ¡ÿÿýüÿÿþ?ÿÿþxÿÿýÝÿÿþØÿÿþ}ÿûÍh:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿþþÿÿþ6ÿÿþÔÿÿþsÿÿýûÿÿþ±ÿÿþPÿÿýéÿÿþÿÿþ,ÿýÿË ÿùž ÿj ÿùÿÚB÷ ÿÿµ2LÍý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ óBÄéùùéÄB ÿýP×ÿÿý×P ÿý£ÿ ÿý¢ÿý¾ÿÿý½ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ÿþ`ÿÿý‡ýˆÿÿþ_ÿýêÿÿþþ„ÿÿýéÿþ~ÿÿýÂýÄÿÿþ|ÿýéÿÿþ3 þ4ÿÿýèÿþNÿÿþÀ þÀÿÿþLÿþ¢ÿÿþb þcÿÿþ¡ÿþæÿÿýþ þÿÿþåÿþ$ÿÿþÕþÖÿÿþ$ÿþVÿÿþ¡þ¢ÿÿþUÿþƒÿÿþwþxÿÿþÿôn«×òüïÛÇ”Sþ¥ÿÿþTþTÿÿþ£ ÿüù›#þÃÿÿþ9þ:ÿÿþÁÿüü~ þØÿÿþ#þ#ÿÿþÖÿý³ þéÿÿþþÿÿþèóúÁ}P' !IŠàÿÿý´ þõÿÿþ þ ÿÿþôþüfñÿÿþŠ þûÿÿþþÿÿþùý'Ûÿÿýý* ÿþþÿÿþþý&ïÿÿþª þûÿÿþþÿÿþúþ`ÿÿýþþõÿÿþþ ÿÿþôýÛÿÿþ_þêÿÿþþÿÿþèþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþMþeÿÿþ ýêÿÿþ3 þ4ÿÿýéý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿþ~ý+ßÿÿýý6 ýëÿÿþþƒÿÿýëþ>ülôÿÿþ þcÿÿý†ý‡ÿÿþb2LÍÿ ÿÿ ÿó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿ ý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿý;øÿÿý°!û‰õÿýäÿÿþ¯ÿÿýãÿÿþo ý±þÿÿýïÿÿþžÿÿþr$þGÿÿýdÿÿý0ýÿÿþ½$ýâÿÿü½ÿÿþ®ÿÿýú%$þšÿÿûõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿþ—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿþjÿÿþ» þ¼ÿÿþÿýÛÿÿþuþvÿÿýúÿýEþÿÿý~ýÿÿþsÿ2LÍÿþ8 þnÿÿýã%ÿþ8 þÏÿÿþ„uÿù%[Æ÷ÿÿ ÿúO…ºïÿÿ ÿ ÿ ÿ ÿ ÿÿúæ³€Mÿÿ ÿúæ³€Mÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿôn«×òüïÛÇ”Sÿ ÿüù›#ÿ ÿüü~ÿ ÿý³ ÿ ÿóúÁ}P' !IŠàÿÿý´ÿ üÍhüfñÿÿþŠÿý'Ûÿÿýý*ÿý&ïÿÿþªÿþ`ÿÿýþÿýÛÿÿþ_ÿþ…ÿÿþ£ÿþBÿÿþÍÿþÿÿþáÿþ ÿÿþõÿþ ÿÿþúÿþÿÿþîÿþCÿÿþÒÿþ‡ÿÿþªÿýÝÿÿþoÿþeÿÿþÿ ýž ý*ñÿÿþ¶ÿ üÿÚB ý+ßÿÿýý6ÿ ÿýµ>ülôÿÿþÿ2LÍÿ ÿýóaÿÿ û)zÊýÿ ÿüãyÿðI¨ÍæóüñàÏ«r8þÿÿ ÿÿ ÿÿ ÿÿ ÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿ$þÿÿôn«×òüïÛÇ”Sþÿÿüù›#þÿÿüü~þÿÿý³ þÿÿóúÁ}P' !IŠàÿÿý´þÿüÍhüfñÿÿþŠþÿ"ý'Ûÿÿýý*þÿ#ý&ïÿÿþªþÿ$þ`ÿÿýþþÿ$ýÛÿÿþ_þÿ%þ…ÿÿþ£þÿ%þBÿÿþÍþÿ%þÿÿþáþÿ%þ ÿÿþõþÿ%þ ÿÿþúþÿ%þÿÿþîþÿ%þCÿÿþÒþÿ%þ‡ÿÿþªþÿ$ýÝÿÿþoþÿ$þeÿÿþþÿýž ý*ñÿÿþ¶þÿüÿÚB ý+ßÿÿýý6ýÿÿýµ>ülôÿÿþK2LÍÿý ¦ÿ ÿý¥ ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘Cÿ ÿ ÿ ÿ ÿþëÿþëÿþÿþþ)ÿÿþ/þ)ÿÿþ/þŠÿÿþÎþŠÿÿþÎýçÿÿþmýçÿÿþmþLÿÿýøþLÿÿýøþ­ÿÿþªþ­ÿÿþªýúÿÿþIýúÿÿþIþoÿÿýåþoÿÿýåþÐÿÿþ‡þÐÿÿþ‡þ1ÿÿþ&þ1ÿÿþ&þ’ÿÿþÄþ’ÿÿþÄýìÿÿþcýìÿÿþcþTÿÿýõ þTÿÿýõ þ¶ÿÿþ¡þ¶ÿÿþ¡ýüÿÿþ?ýüÿÿþ?þxÿÿýÝþxÿÿýÝþØÿÿþ}þØÿÿþ}þ:ÿÿýýþ:ÿÿýýþ›ÿÿþ»þ›ÿÿþ»ý ñÿÿþYý ñÿÿþYþ]ÿÿýïþ]ÿÿýïþ¾ÿÿþ—þ¾ÿÿþ—ý þÿÿþ6ý þÿÿþ6þ€ÿÿþÔþ€ÿÿþÔýßÿÿþsýßÿÿþsþCÿÿýûþCÿÿýûþ¤ÿÿþ±þ¤ÿÿþ±ýöÿÿþPýöÿÿþPþfÿÿýéþfÿÿýéþÇÿÿþþÇÿÿþþ(ÿÿþ,þ(ÿÿþ,þ‰ÿÿþËþ‰ÿÿþËþæÿÿþjýæÿÿþjÿý÷þKÿÿý÷2LÍÿýóa ÿüø}û)zÊýÿ ÿüãyû'vÃúÿ ÿüàðI¨ÍæóüñàÏ«r8ï ?vŸÃáïúøêÛÉj5Óó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿ ý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿý;øÿÿý°!û‰õÿýäÿÿþ¯ÿÿýãÿÿþo ý±þÿÿýïÿÿþžÿÿþr$þGÿÿýdÿÿý0ýÿÿþ½$ýâÿÿü½ÿÿþ®ÿÿýú%$þšÿÿûõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿýÞÿÿþD þFÿÿþÂÿý—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿþjÿÿþ» þ¼ÿÿþÿýÛÿÿþuþvÿÿýúÿýEþÿÿý~ýÿÿþsÿ2LÍ ý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ ïò@v©Óæùóâѧn2óþÖÿÿþ1ý£ÿÿýøEþ³ÿÿþsýÿÿýúMþpÿÿýÒþ•ÿÿýüUþ)ÿÿþcþÿÿýþ^þ·ÿÿý÷=þ…ÿÿþgý2þÿÿüùpþx2LÍý ¦ÿ ÿý¥.ýRØÿÿýØR1óD‘ÆêùùêÆ‘Cïð.e’¶ØêöúëÜÁ[üÙo û$lµóÿ ÿüø¨6 ÿýÐ/ ÿüý• ÿýò9 ÿýÏ ÿýð# ÿóÞg5 5g·üÿÿýÔ ÿþµ ÿüå‡4 ý'Àÿÿþ ÿþ‹ÿÿþ8üÉZ ý«ÿÿýü! ÿýÕÿÿþŠý ãÿÿþw ÿþhÿÿþËþtÿÿþÁ ÿþ&ÿÿþåþ,ÿÿþà ÿþ ÿÿþùþÿÿþø ÿþ ÿÿþïþ ÿÿþò ÿþ%ÿÿþÒþ#ÿÿþØ ÿþgÿÿþ™þeÿÿþ¡ ÿýÔÿÿþ>ýÑÿÿþJ ÿþ‡ÿÿþÃþ‹ÿÿýÏ ÿún«×òüÿÿýñ'ý¢ÿÿýö1 ÿýñ>ù*Z¢ôÿÿýôI ÿýÂ$ ÿýÅ* ÿý¥C ÿý¬EÿôúÁ}P' í›' ÿüö¯>üÍhÿüü‘ÿý±ÿýÆ ù 4i®ûÿÿýàþúÿÿý¼ý¦ÿÿý× ý@ùÿÿþoýcþÿÿþþfÿÿýî þzÿÿýøýÔÿÿþaýØÿÿþsþuÿÿþ¦þwÿÿþ³þ3ÿÿþÙþ0ÿÿþàþÿÿþðþÿÿþôþÿÿþúþÿÿþûþÿÿþéþÿÿþîþ3ÿÿþÕþ=ÿÿþÏþwÿÿþ³þˆÿÿþŸý×ÿÿþoý çÿÿþYþlÿÿþ)þ–ÿÿýï ýž ýFúÿÿþ¶ý¼5ý†ÿÿþzüÿÚBþûÿÿýþ1ÿü´U ý5ÅÿÿýÑÿýµ>2LÍÿÿÿÿ.ô%n³ÓéûòÝ´v& ÿý3¼ÿÿüþ·- ÿü“þÿ ÿýûw ÿý µÿÿþ—þ ÿ ÿý²ÿÿöì‹==Œíÿÿþ€ ý²þtÿÿý¨ý«ÿÿýýB ýtÿýúÿÿýœý ÿÿýØ üúÿþÿÿýÑ ýÕÿÿþf üÿÿýôÿÿþ> þAÿÿýÚûôÿÿþMÿÿþÓ þÖÿÿþ=þMÿÿþŒÿÿþ þÿÿþ•þŒÿÿþÃÿÿþI þKÿÿþÜþÃÿÿþÚÿÿþ þ!ÿÿþþÚÿÿþíÿÿþ þÿÿþOþíÿÿþûÿÿþ þÿÿþ}þûÿÿùïÛÇ”Sþïÿÿþ þÿÿþŸþïÿÿüù›#þÝÿÿþ þ ÿÿþ¿þÝÿÿüü~ þÉÿÿþH þJÿÿþÔþÉÿ ÿý³ þ—ÿÿþ~ þÿÿþçþ—ÿÿû!IŠàÿÿý´ þYÿÿþÑ þÓÿÿþôþYÿÿüfñÿÿþŠ ýüÿÿþ: þ=ÿÿþùûüÿÿý'Ûÿÿýý* þ©ÿÿýÎ ýÑÿÿþþü©ÿÿý&ïÿÿþª þ5ÿÿþ•ý™ÿÿþøü5ÿÿþ`ÿÿýþ þ›ÿÿý£ý¥ÿÿþðý›ÿýÛÿÿþ_ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßý Òþ…ÿÿþ£ ýÕÿÿýèDÿÿþÇ þþBÿÿþÍ ý¸ÿ ÿüÓ$8ÿÿþ©þÿÿþáýNÒÿÿúð~ Sÿÿþþ ÿÿþõó4{»×ìüòÖ¥^ þ‚ÿÿþPþ ÿÿþúþ»ÿÿþþÿÿþîýñÿÿþÐþCÿÿþÒþJÿÿþ|þ‡ÿÿþªþ®ÿÿýý!ýÝÿÿþoý$úÿÿþ°þeÿÿþþ¼ÿÿýþ2ý*ñÿÿþ¶þpÿÿþ¡ý+ßÿÿýý6 ý± þlÿÿýå þ±ülôÿÿþ ûÿô‡ý¬ÿÿýù> ÿ2LÍý_òÿÿýò_ ÿüø}üŠíÿ ÿüíŠ û'vÃúÿ ÿüà ñ Jƒ¹×èøøè×¹ƒJ ï ?vŸÃáïúøêÛÉj5Ðô%n³ÓéûòÝ´v&ò@v©Óæùóâѧn2ý3¼ÿÿüþ·-û [ªñÿ ÿüÏd ü“þÿ ÿýûw ü2—ñÿÿýÒ0þµÿÿþ— ÿýú]ÿöì‹==Œíÿÿþ€ ÿõâ“R% 9xÚÿÿýüTÿý¨ý«ÿÿýýB ÿûþµDüeõÿÿý÷!ÿýœý ÿÿýØÿý¼3 ý0ðÿÿþ±ÿýÑ ýÕÿÿþfüÿæVþIÿÿþ*ÿþ> þAÿÿýÚý¨þµÿÿþzýÿÓ þÖÿÿþ=þXÿÿþ¿ýÿ þÿÿþ•þÿÿþÜýÿI þKÿÿþÜþÿÿþôýÿ þ!ÿÿþþ ÿÿþôýÿ þÿÿþOþ4ÿÿþßýÿ þÿÿþ}þyÿÿþÅýÿ þÿÿþŸýÚÿÿþ‰ýÿ þ ÿÿþ¿þ\ÿÿþFýÿH þJÿÿþÔýåÿÿýæýÿ~ þÿÿþçþ¨ÿÿþrýÿÑ þÓÿÿþôþkÿÿýÛÿþ: þ=ÿÿþùýBúÿÿýþ?ÿýÎ ýÑÿÿþþý)îÿÿþ†ÿþ•ý™ÿÿþøýâÿÿý¼ÿý£ý¥ÿÿþðýÙÿÿýË ÿöëˆ;;‰ëÿÿþÞÿÿþßýÒÿÿýÓ þÕÿÿýèDÿÿþÇýËÿÿýÚ ý¸ÿ ÿüÓ$8ÿÿþ©ý Æÿÿýà ýNÒÿÿúð~ Sÿÿþý Áÿÿýä"ó4{»×ìüòÖ¥^ þ‚ÿÿþPý¼ÿÿýè'þ»ÿÿþ ý¸ÿÿýì,ýñÿÿþÐ ý³ÿÿýï1 þJÿÿþ| ý®ÿÿýó8!þ®ÿÿýý! ý©ÿÿýõ>!ý$úÿÿþ° ý£ÿÿýøE"þ¼ÿÿýþ2 ýÿÿýúM"þpÿÿþ¡ þ•ÿÿýüUþ þlÿÿýå þÿÿýþ^üô‡ý¬ÿÿýù> þ…ÿÿþg2LÍÿþ8 ÿÿþ8 ÿFÿù%[Æ÷ÿÿ ÿúO…ºïÿÿ ÿÿ ÿÿ ÿÿúæ³€Mÿÿ ÿúæ³€Mÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿ(ÿ ÿôn«×òüïÛÇ”Sÿ ÿüù›#ÿ ÿüü~ÿ ÿý³ ÿ ÿóúÁ}P' !IŠàÿÿý´ÿ üÍhüfñÿÿþŠÿý'Ûÿÿýý*ÿý&ïÿÿþªÿþ`ÿÿýþÿýÛÿÿþ_ÿþ…ÿÿþ£ÿþBÿÿþÍÿþÿÿþáÿþ ÿÿþõÿþ ÿÿþúÿþÿÿþîÿþCÿÿþÒÿþ‡ÿÿþªÿýÝÿÿþoÿþeÿÿþÿ ýž ý*ñÿÿþ¶ÿ üÿÚB ý+ßÿÿýý6ÿ ÿýµ>ülôÿÿþÿ2LÍÿþnÿÿýãý ¦ÿ ÿþÏÿÿþ„ýRØÿÿ7÷D‘ÆêùùêÓóBÄéùùéÄB÷BÄéùùéýP×ÿÿý×PýP×ÿÿý£ÿ ÿý¢ý£ÿÿý¾ÿÿý½ý¾ÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦þ§ÿÿùÖi& ( þ`ÿÿý‡ýˆÿÿþ_ þ`ÿÿý‡ýêÿÿþþ„ÿÿýé ýêÿÿþþ~ÿÿýÂýÄÿÿþ| þ~ÿÿýÂýéÿÿþ3 þ4ÿÿýèýéÿÿþ3þNÿÿþÀ þÀÿÿþLþNÿÿþÀþ¢ÿÿþb þcÿÿþ¡þ¢ÿÿþbþæÿÿýþ þÿÿþåþæÿÿýþþ$ÿÿþÕþÖÿÿþ$þ$ÿÿþÕþVÿÿþ¡þ¢ÿÿþUþVÿÿþ¡þƒÿÿþwþxÿÿþþƒÿÿþwþ¥ÿÿþTþTÿÿþ£þ¥ÿÿþTþÃÿÿþ9þ:ÿÿþÁþÃÿÿþ9þØÿÿþ#þ#ÿÿþÖþØÿÿþ#þéÿÿþþÿÿþèþéÿÿþþõÿÿþ þ ÿÿþôþõÿÿþ þûÿÿþþÿÿþùþûÿÿþÿþþÿÿþþÿþþûÿÿþþÿÿþúþûÿÿþþõÿÿþþ ÿÿþôþõÿÿþþêÿÿþþÿÿþèþêÿÿþþØÿÿþ"þ#ÿÿþÖþØÿÿþ"þÃÿÿþ9þ:ÿÿþÂþÃÿÿþ9þ¥ÿÿþSþTÿÿþ£þ¥ÿÿþSþƒÿÿþwþxÿÿþ‚þƒÿÿþwþWÿÿþ¡þ¢ÿÿþUþWÿÿþ¡þ%ÿÿþÕþÕÿÿþ$þ%ÿÿþÕþæÿÿýþ ýþÿÿþæþæÿÿýþþ£ÿÿþb þbÿÿþ¢þ£ÿÿþbþOÿÿþ¿ þÀÿÿþMþOÿÿþ¿ýêÿÿþ3 þ4ÿÿýéýêÿÿþ3þ€ÿÿýÂýÃÿÿþ~ þ€ÿÿýÂýëÿÿþþƒÿÿýë ýëÿÿþþcÿÿý†ý‡ÿÿþb þcÿÿý†2LÍÿý¥ÿÿýØRÿö3˜ðÿÿÆ‘C7üB†¿ûÄBô%n³ÓéûòÝ´v&ÿý×Pý3¼ÿÿüþ·- ÿý¢ü“þÿ ÿýûw ÿý½ ý µÿÿþ— ÿýkØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ ÿüˆÿÿþ_ þtÿÿý¨ý«ÿÿýýBþ„ÿÿýé ýúÿÿýœý ÿÿýØýÄÿÿþ| þÿÿýÑ ýÕÿÿþfþ4ÿÿýèýôÿÿþ> þAÿÿýÚþÀÿÿþLþMÿÿþÓ þÖÿÿþ=þcÿÿþ¡þŒÿÿþ þÿÿþ•þÿÿþåþÃÿÿþI þKÿÿþÜþÖÿÿþ$þÚÿÿþ þ!ÿÿþþ¢ÿÿþUþíÿÿþ þÿÿþOþxÿÿþþûÿÿþ þÿÿþ}þTÿÿþ£þïÿÿþ þÿÿþŸþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿þ#ÿÿþÖþÉÿÿþH þJÿÿþÔþÿÿþèþ—ÿÿþ~ þÿÿþçþ ÿÿþôþYÿÿþÑ þÓÿÿþôþÿÿþùýüÿÿþ: þ=ÿÿþùþÿÿþþþ©ÿÿýÎ ýÑÿÿþþþÿÿþúþ5ÿÿþ•ý™ÿÿþøþ ÿÿþôþ›ÿÿý£ý¥ÿÿþðþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþ¢ÿÿþUþ»ÿÿþþÕÿÿþ$ýñÿÿþÐýþÿÿþæþJÿÿþ|þbÿÿþ¢þ®ÿÿýý!þÀÿÿþMý$úÿÿþ°þ4ÿÿýéþ¼ÿÿýþ2ýÃÿÿþ~þpÿÿþ¡þƒÿÿýë ý± þlÿÿýåû‡ÿÿþb ûÿô‡ý¬ÿÿýù>K2LÍ ÿýÑ-ý ¦ÿ ÿý¥ ÿüØeýRØÿÿýØR ö·ßñüóß¹ƒ:óD‘ÆêùùêÆ‘Cïð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý• ÿþë ÿýÏ ÿþ ÿóÞg5 5g·üÿÿýÔ þ)ÿÿþ/ ÿüå‡4 ý'ÀÿÿþþŠÿÿþÎ üÉZ ý«ÿÿýü!ýçÿÿþmý ãÿÿþwþLÿÿýøþtÿÿþÁþ­ÿÿþªþ,ÿÿþàýúÿÿþIþÿÿþøþoÿÿýåþ ÿÿþòþÐÿÿþ‡þ#ÿÿþØþ1ÿÿþ&þeÿÿþ¡þ’ÿÿþÄýÑÿÿþJýìÿÿþcþ‹ÿÿýÏþTÿÿýõ ý¢ÿÿýö1þ¶ÿÿþ¡ù*Z¢ôÿÿýôIýüÿÿþ? ÿýÅ*þxÿÿýÝ ÿý¬EþØÿÿþ} ÿüö¯>þ:ÿÿýýÿý±þ›ÿÿþ»ù 4i®ûÿÿýà ý ñÿÿþY ý¦ÿÿý× þ]ÿÿýï"ýcþÿÿþ þ¾ÿÿþ—$þzÿÿýø ý þÿÿþ6$ýØÿÿþs þ€ÿÿþÔ&þwÿÿþ³ ýßÿÿþs&þ0ÿÿþà þCÿÿýû&þÿÿþô þ¤ÿÿþ±'þÿÿþûýöÿÿþP'þÿÿþîþfÿÿýé'þ=ÿÿþÏþÇÿÿþ(þˆÿÿþŸþ(ÿÿþ,'ý çÿÿþYþ‰ÿÿþË(þ–ÿÿýï þæÿÿþjý¼5ý†ÿÿþzÿý÷ÿü´U ý5ÅÿÿýÑ2LÍýyüÿ ÿüþ” ÿýóa ý.¸ÿ ÿý¼4 û)zÊýÿ ÿüãyô'xµÞôûêÔ´o&ðI¨ÍæóüñàÏ«r8Îò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdù%[Æ÷ÿÿ ü2—ñÿÿýÒ0úO…ºïÿÿ ÿýú] ÿ ÿõâ“R% 9xÚÿÿýüT ÿ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿ ÿý¼3 ý0ðÿÿþ± úæ³€Mÿ üÿæVþIÿÿþ*ÿ ý¨þµÿÿþzÿþXÿÿþ¿ÿþÿÿþÜÿþÿÿþôÿþ ÿÿþôÿþ4ÿÿþßÿþyÿÿþÅÿýÚÿÿþ‰ÿþ\ÿÿþFÿýåÿÿýæÿþ¨ÿÿþrÿþkÿÿýÛÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8 ÿý©ÿÿýõ>!ÿ ý£ÿÿýøE"ÿ ýÿÿýúM#ÿ þ•ÿÿýüU$ÿ þÿÿýþ^%ÿ þ…ÿÿþg&ÿ 2LÍÿýóaý_òÿ ÿû)zÊýÿ ÿüãyüŠíÿ ÿ ðI¨ÍæóüñàÏ«r8ò Jƒ¹×èøøè×¹ƒJÏô%n³ÓéûòÝ´v&1ý3¼ÿÿüþ·-þLÿÿ ü“þÿ ÿýûwýåÿÿ ý µÿÿþ—þ ÿÿ ý²ÿÿöì‹==Œíÿÿþ€þJÿÿ þtÿÿý¨ý«ÿÿýýBýäÿÿü¯ÿÿýúÿÿýœý ÿÿýØþÿÿûïÿÿþÿÿýÑ ýÕÿÿþfþGÿÿûdÿÿýôÿÿþ> þAÿÿýÚýâÿÿú½ÿÿþMÿÿþÓ þÖÿÿþ=þšÿÿùõ"ÿÿþŒÿÿþ þÿÿþ•þDÿÿþsÿþÃÿÿþI þKÿÿþÜý àÿÿýÊÿþÚÿÿþ þ!ÿÿþþ—ÿÿýú-ÿþíÿÿþ þÿÿþO ýAþÿÿþ‚ÿþûÿÿþ þÿÿþ} ý ÞÿÿýÕÿþïÿÿþ þÿÿþŸ þ”ÿÿýý8ÿþÝÿÿþ þ ÿÿþ¿ ý?þÿÿþ‘ÿþÉÿÿþH þJÿÿþÔ ý Üÿÿýß ÿþ—ÿÿþ~ þÿÿþç þ‘ÿÿþFÿþYÿÿþÑ þÓÿÿþô ý<ýÿÿþ ÿýüÿÿþ: þ=ÿÿþùý Úÿÿýèÿþ©ÿÿýÎ ýÑÿÿþþþŽÿÿþTÿþ5ÿÿþ•ý™ÿÿþøý9ýÿÿþ¯ ÿ þ›ÿÿý£ý¥ÿÿþðýØÿÿýï ÿ ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ‹ÿÿþc ÿ ýÕÿÿýèDÿÿþÇý7üÿÿþ½ ÿ ý¸ÿ ÿüÓ$8ÿÿþ©þÖÿÿýõ" ÿ ýNÒÿÿúð~ Sÿÿþÿþr ÿó4{»×ìüòÖ¥^ þ‚ÿÿþPÿþ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿþ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ ý± þlÿÿýåÿ ûÿô‡ý¬ÿÿýù>ÿ2LÍÿýò_ ÿýÑ-ý ¦ÿÿüíŠü3˜ðÿ ÿüØeýRØÿÿþ óB†·ßñüóß¹ƒ:ûD‘Æûû%n³Óÿÿù%[Æ÷ÿÿý3¼ÿÿúO…ºïÿÿü“þÿÿÿý µÿÿÿý²ÿÿüì‹=ÿÿÿúæ³€Mÿÿþtÿÿû¨ÿÿúæ³€MÿýúÿÿýœÿÿþÿÿýÑÿÿýôÿÿþ>ÿÿþMÿÿþÓÿÿþŒÿÿþÿÿþÃÿÿþIÿÿþÚÿÿþÿÿþíÿÿþÿÿþûÿÿþÿÿþïÿÿþÿÿþÝÿÿþÿÿþÉÿÿþHÿÿþ—ÿÿþ~ÿÿþYÿÿþÑÿÿýüÿÿþ:ÿÿþ©ÿÿýÎÿÿþ5ÿÿþ•ÿÿþ›ÿÿû£ÿÿÿý Òÿÿüëˆ;ÿÿÿýÕÿÿÿý¸ÿÿÿýNÒÿ ÿÿú4{»×ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿý±ÿÿûÿô‡€2€L€Íÿþ¥ÿÿôØRêùùêÆ‘CçøéûòÝ´v&ÿûþ·-ÿÿýûwÿÿù=Œíÿÿý«ÿÿû ÿÿüÕÿýAÿþÖþþKþ!þþþþ þJþþÓý=ÿüÑÿû™ÿÿý¥ÿÿù;‰ëÿ ÿþèÿÿýÓ$ÿÿôð~ ìüòÖ¥^ þþJþ®ý$úý¼ÿüpÿÿþlÿÿý¬ÿÿ2LÍÿ ÿòò¯}K($OÒÿÿþåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿüþ·-úO…ºïÿÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿúæ³€Mÿÿþtÿÿý¨ý«ÿÿþýúæ³€Mÿýúÿÿýœý ÿÿÿþÿÿýÑ ýÕÿÿÿýôÿÿþ> þAÿÿÿþMÿÿþÓ üÖÿÿÿþŒÿÿþ üÿÿÿþÃÿÿþI üKÿÿÿþÚÿÿþ ü!ÿÿÿþíÿÿþ üÿÿÿþûÿÿþ üÿÿÿþïÿÿþ üÿÿÿþÝÿÿþ ü ÿÿÿþÉÿÿþH üJÿÿÿþ—ÿÿþ~ üÿÿÿþYÿÿþÑ üÓÿÿÿýüÿÿþ: þ=ÿÿÿþ©ÿÿýÎ ýÑÿÿÿþ5ÿÿþ•ý™ÿÿÿþ›ÿÿý£ý¥ÿÿÿý Òÿÿöëˆ;;‰ëÿÿýÞÿÿýÕÿÿüèDÿÿý¸ÿ ÿûÓ$8ÿÿýNÒÿÿùð~ Sÿÿó4{»×ìüòÖ¥^ ý‚ÿÿ(ý»ÿÿ'üñÿÿ'üJÿÿÿ'ü®ÿÿÿ&û$úÿÿÿ&þ¼ÿÿÿ%þpÿÿ2LÍþÿþ«ÿÿùÖh%&ÿý Áÿÿÿý ¦ÿÿÿýRØÿÿ7÷D‘Æêùùêóó.e’¶ØêöúëÜÁ ÿ û$lµóÿ ÿ ÿ ÿ ÿþë ÿ ÿþ ÿôÞg5 5gBþ)ÿÿþ/ ÿüå‡4ýØþŠÿÿþÎ üÉZ ýÿfýçÿÿþmüÿÚþLÿÿýøÿþ=þ­ÿÿþªÿþ•ýúÿÿþIÿþÜþoÿÿýåÿþþÐÿÿþ‡ÿþOþ1ÿÿþ&ÿþ}þ’ÿÿþÄÿþŸýìÿÿþcÿþ¿þTÿÿýõ ÿþÔþ¶ÿÿþ¡û*Zÿÿþçýüÿÿþ? ÿþôþxÿÿýÝ ÿþùþØÿÿþ} ÿþþþ:ÿÿýý ÿþøþ›ÿÿþ»û 4iÿÿþðý ñÿÿþYÿþßþ]ÿÿýïÿþÇþ¾ÿÿþ— ÿþ©ý þÿÿþ6 ÿþþ€ÿÿþÔ!ÿþPýßÿÿþs!ÿþþCÿÿýû!ÿþÐþ¤ÿÿþ±"ÿþ|ýöÿÿþP"üÿý!þfÿÿýé"ýÿ°þÇÿÿþ#ýþ2þ(ÿÿþ,#þ¡þ‰ÿÿþË$2LÍýj×ÿÿþ© þyÿÿõâ‚C E…æÿÿþx ÿýÀ þ”ÿÿþ“ ÿý¥ý_òÿÿýò_ ÿýØRüŠíÿ ÿüíŠÿûÆ‘Cñ Jƒ¹×èøøè×¹ƒJ Öü[ò@v©Óæùóâѧn2ÿüø¨6û [ªñÿ ÿüÏdý3¼ÿÿüý• ü2—ñÿÿýÒ0ü“þÿÿýÏ ÿýú]ý µÿÿý·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüT ý²ÿÿü'Àÿÿþ ÿûþµDüeõÿÿý÷! þtÿÿý«ÿÿýü!ÿý¼3 ý0ðÿÿþ± ýúÿÿþœý ãÿÿþwüÿæVþIÿÿþ* þÿÿýÑþtÿÿþÁý¨þµÿÿþzýôÿÿþ>þ,ÿÿþàþXÿÿþ¿þMÿÿþÓþÿÿþøþÿÿþÜþŒÿÿþþ ÿÿþòþÿÿþôþÃÿÿþIþ#ÿÿþØþ ÿÿþôþÚÿÿþþeÿÿþ¡þ4ÿÿþßþíÿÿþýÑÿÿþJþyÿÿþÅþûÿÿþþ‹ÿÿýÏýÚÿÿþ‰þïÿÿþý¢ÿÿýö1þ\ÿÿþFþÝÿÿú¢ôÿÿýôIýåÿÿýæþÉÿÿüHÿÿýÅ*þ¨ÿÿþr þ—ÿÿü~ÿÿý¬EþkÿÿýÛ þYÿÿüÑÿÿüö¯>ýBúÿÿýþ? ýüÿÿý:ÿÿý±ý)îÿÿþ† þ©ÿÿûήûÿÿýàýâÿÿý¼ þ5ÿÿû•¦ÿÿý× ýÙÿÿýË þ›ÿÿýcþÿÿþýÒÿÿýÓý ÒÿÿþzÿÿýøýËÿÿýÚýÕÿÿýØÿÿþsý Æÿÿýàû¸ÿÿþwÿÿþ³ý Áÿÿýä"ýNÒþ0ÿÿþàý¼ÿÿýè'þþÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU 2LÍÿþ¬ÿÿþ§ÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„ô%n³ÓéûòÝ´v&3 ÿüþ·-ù%[Æ÷ÿÿ ÿýûwúO…ºïÿÿ ÿþ— ÿõÿì‹==Œíÿÿþ€ ÿý¨ý«ÿÿýýB ÿúæ³€Mÿÿþý ÿÿýØ úæ³€MÿýÕÿÿþfÿþAÿÿýÚÿþÖÿÿþ=ÿþÿÿþ•ÿþKÿÿþÜÿþ!ÿÿþÿþÿÿþOÿþÿÿþ}ÿþÿÿþŸÿþ ÿÿþ¿ÿþJÿÿþÔÿþÿÿþçÿþÓÿÿþôÿþ=ÿÿþùÿýÑÿÿþþÿý™ÿÿþøÿý£ý¥ÿÿþðÿõÿëˆ;;‰ëÿÿþÞÿÿþßÿ ÿýèDÿÿþÇÿþ7ÿ ÿüÓ$8ÿÿþ©ÿþÖÿÿúð~ Sÿÿþÿóÿ4{»×ìüòÖ¥^ þ‚ÿÿþPÿþÿ þ»ÿÿþÿþÿ ýñÿÿþÐÿþÿ þJÿÿþ|ÿþÿ þ®ÿÿýý!ÿý$úÿÿþ°ÿþ¼ÿÿýþ2ÿþpÿÿþ¡ÿ2LÍÿòò¯}K($OÒÿÿýå ÿý8ÿÿýÒ! ÿý8ÿÿüø} ÿù8'vÃúÿ ÿüà ÿþ8ï ?vŸÃáïúøêÛÉj5ô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿýýB þÿÿýïÿÿ ýúÿÿýœý ÿÿýØ þGÿÿýdÿÿ þÿÿýÑ ýÕÿÿþf ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿýÚ þšÿÿûõ"ÿÿ þMÿÿþÓ þÖÿÿþ=þDÿÿþsÿ þŒÿÿþ þÿÿþ•ý àÿÿýÊÿ þÃÿÿþI þKÿÿþÜþ—ÿÿýú-ÿ þÚÿÿþ þ!ÿÿþýAþÿÿþ‚ÿ þíÿÿþ þÿÿþOý ÞÿÿýÕÿ þûÿÿþ þÿÿþ}þ”ÿÿýý8ÿ þïÿÿþ þÿÿþŸý?þÿÿþ‘ÿ þÝÿÿþ þ ÿÿþ¿ý Üÿÿýß ÿ þÉÿÿþH þJÿÿþÔþ‘ÿÿþFÿ þ—ÿÿþ~ þÿÿþçý<ýÿÿþ ÿ þYÿÿþÑ þÓÿÿúô Úÿÿýèÿ ýüÿÿþ: þ=ÿÿûùŽÿÿþTÿ þ©ÿÿýÎ ýÑÿÿûþ9ýÿÿþ¯ ÿ þ5ÿÿþ•ý™ÿÿüøØÿÿýï ÿþ›ÿÿý£ý¥ÿÿýð‹ÿÿþc ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿýßüÿÿþ½ ÿýÕÿÿýèDÿÿþÇÿÿýõ" ÿý¸ÿ ÿüÓ$8ÿÿþ©ÿÿþr ÿýNÒÿÿúð~ Sÿÿþÿÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿÿþ»ÿÿþÿÿýñÿÿýÐÿÿþJÿÿþ|ÿ!þ®ÿÿýý!ÿ ý$úÿÿþ°ÿ þ¼ÿÿýþ2ÿþpÿÿþ¡2LÍ ÿôú°i./d±÷ÿÿýüZ þyÿÿôâ‚C E…æÿ ÿýöTþ”ÿÿ ÿýÑ-ý_òÿ ÿ ü3˜ðÿ ÿüØeüŠíÿ ÿ óB†·ßñüóß¹ƒ:ò Jƒ¹×èøøè×¹ƒJóóýÑÿÿþJþ‡ÿÿþÃþ‹ÿÿýÏÿýñ'ý¢ÿÿýö1ÿýñ>ù*Z¢ôÿÿýôIÿýÂ$ ÿýÅ*ý¥C ÿý¬Eüí›' ÿüö¯>ÿüü‘ÿý±ÿýÆ ù 4i®ûÿÿýàþúÿÿý¼ý¦ÿÿý× ý@ùÿÿþoýcþÿÿþþfÿÿýî þzÿÿýøûÔÿÿþaýØÿÿþsú Æuÿÿþ¦þwÿÿþ³ù Áÿ3ÿÿþÙþ0ÿÿþàø¼ÿÿÿÿþðþÿÿþôý¸ÿÿþÿÿþúþÿÿþû ý³ÿÿþÿÿþéþÿÿþî ý®ÿÿþ3ÿÿþÕþ=ÿÿþÏ ý©ÿÿûõwÿÿþ³þˆÿÿþŸ ý£ÿÿúøE×ÿÿþoý çÿÿþY ýÿÿúúMlÿÿþ)þ–ÿÿýï þ•ÿÿýüU2LÍø E…æÿÿþx ÿ ÿþ“ ÿ ÿýò_ ÿ ÿüíŠÿ öèøøè×¹ƒJ öùóâѧn2ó7€·Þñüñß¶†AÿüÏdübÖÿ ÿüð—2 ÿýÒ0ý)Îÿÿÿýú]ýPõÿÿú9xÚÿÿýüTýVüÿÿôø´g1.k²úÿÿüeõÿÿý÷! ý;øÿÿý°!û‰õÿý0ðÿÿþ± ýãÿÿþo ý±þIÿÿþ* þžÿÿþr%þµÿÿþz ý0ýÿÿþ½&þXÿÿþ¿ þ®ÿÿýú%&þÿÿþÜ ý üÿÿþ­'þÿÿþô þ{ÿÿþJ'þ ÿÿþô þÏÿÿýñ'þ4ÿÿþßýþÿÿþº(þyÿÿþÅþPÿÿþó \¤ÔòûëÕ¹x1ýÚÿÿþ‰þ€ÿÿúRzïÿÿýÎHþ\ÿÿþFþ©ÿÿü7"Ðÿ ÿý° ýåÿÿýæþÈÿÿýBæÿÿýÍþ¨ÿÿþr þàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊþkÿÿýÛ þðÿÿý~ýÿÿþ þ<ýBúÿÿýþ? þùÿÿþuþvÿÿþ. ý Úý)îÿÿþ† þþÿÿþº þ¼ÿÿþ¢ ùŽÿâÿÿý¼ þûÿÿþ* þ,ÿÿýúù9ýÿÙÿÿýË þõÿÿþÆ þÇÿÿþUùØÿÿÒÿÿýÓ þêÿÿþw þxÿÿþ“þ‹ÿÿþËÿÿýÚþ×ÿÿþD þFÿÿþÆý7üÿÿýàþÁÿÿþ þÿÿþÛþÖÿÿþõÿÿýä"þ¢ÿÿþ þÿÿþíÿþrÿÿýè'þ€ÿÿþ þÿÿþûÿýì,þQÿÿþ þÿÿþìÿýï1þÿÿþ þÿÿþÙÿýó8þÞÿÿþD þFÿÿþÂÿþ>þ—ÿÿþx þyÿÿþ‹#þ@ÿÿþÇ þÉÿÿþL#ýÝÿÿþ+ þ,ÿÿýô$þjÿÿþ» þ¼ÿÿþ 2LÍþ«ÿÿ÷Öh%&j×ÿÿþ© ÿòò¯}K($OÒÿÿýåý ÁÿÿýÀ ÿýÒ!ý ¦ÿ ÿý¥ ÿüø} ýRØÿÿýØR û'vÃúÿ ÿüà óD‘ÆêùùêÆ‘Cï ?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿýýB þÿÿýïÿÿ ýúÿÿýœý ÿÿýØ þGÿÿýdÿÿ þÿÿýÑ ýÕÿÿþf ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿýÚ þšÿÿûõ"ÿÿ þMÿÿþÓ þÖÿÿþ=þDÿÿþsÿ þŒÿÿþ þÿÿþ•ý àÿÿýÊÿ þÃÿÿþI þKÿÿþÜþ—ÿÿýú-ÿ þÚÿÿþ þ!ÿÿþýAþÿÿþ‚ÿ þíÿÿþ þÿÿþOý ÞÿÿýÕÿ þûÿÿþ þÿÿþ}þ”ÿÿýý8ÿ þïÿÿþ þÿÿþŸý?þÿÿþ‘ÿ þÝÿÿþ þ ÿÿþ¿ý Üÿÿýß ÿ þÉÿÿþH þJÿÿþÔþ‘ÿÿþFÿ þ—ÿÿþ~ þÿÿþçþýÿÿþ ÿ þYÿÿþÑ þÓÿÿþôÿýèÿ ýüÿÿþ: þ=ÿÿþùÿþTÿ þ©ÿÿýÎ ýÑÿÿþþÿþ¯ ÿ þ5ÿÿþ•ý™ÿÿþøüÿï ÿþ›ÿÿý£ý¥ÿÿþðýÿc ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ½ ÿýÕÿÿýèDÿÿþÇþ" ÿý¸ÿ ÿüÓ$8ÿÿþ©ÿýNÒÿÿúð~ Sÿÿþÿ ó4{»×ìüòÖ¥^ þ‚ÿÿþPÿþ»ÿÿþÿýñÿÿþÐÿþJÿÿþ|ÿ!þ®ÿÿýý!ÿ ý$úÿÿþ°ÿ þ¼ÿÿýþ2ÿþpÿÿþ¡2LÍÿþ8þ¬ÿÿþ§ ÿþ8 ýùÿÿþF ÿþ8 þnÿÿýã ÿþ8 þÏÿÿþ„;ô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿüþ·-úO…ºïÿÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿúæ³€Mÿÿþtÿÿý¨ý«ÿÿþýúæ³€Mÿýúÿÿýœý ÿÿÿþÿÿýÑ ýÕÿÿÿýôÿÿþ> þAÿÿÿþMÿÿþÓ üÖÿÿÿþŒÿÿþ üÿÿÿþÃÿÿþI üKÿÿÿþÚÿÿþ ü!ÿÿÿþíÿÿþ üÿÿÿþûÿÿþ üÿÿÿþïÿÿþ üÿÿÿþÝÿÿþ ü ÿÿÿþÉÿÿþH üJÿÿÿþ—ÿÿþ~ üÿÿÿþYÿÿþÑ üÓÿÿÿýüÿÿþ: þ=ÿÿÿþ©ÿÿýÎ ýÑÿÿÿþ5ÿÿþ•ý™ÿÿÿþ›ÿÿý£ý¥ÿÿÿý Òÿÿöëˆ;;‰ëÿÿýÞÿÿýÕÿÿüèDÿÿý¸ÿ ÿûÓ$8ÿÿýNÒÿÿùð~ Sÿÿó4{»×ìüòÖ¥^ ý‚ÿÿ(ý»ÿÿ'üñÿÿ'üJÿÿÿ'ü®ÿÿÿ&û$úÿÿÿ&þ¼ÿÿÿ%þpÿÿ2LÍÿþ«ÿÿùÖh%&ÿý Áÿÿÿý ¦ÿÿÿýRØÿÿ7÷D‘ÆêùùêÓóÿþŸþÆÿÿþ þ‡ÿÿþÃþÿÿþ¿ý*óÿÿýý •ÿÿýñ'þTÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿþç ý&ÃÿÿýÂ$ýüÿÿþô üD¦þÿÿüþ¥Cþxÿÿþù ü'›íÿ ÿüí›'þØÿÿþþ üüÿÿüü‘þ:ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþðý¼ÿÿüùqütúÿÿý¼ý ñÿÿþßþpÿÿýø= ý@ùÿÿþoþ]ÿÿþÇý ïÿÿþc þfÿÿýî þ¾ÿÿþ©þaÿÿýÓ ýÔÿÿþaý þÿÿþþ§ÿÿþsþuÿÿþ¦þ€ÿÿþPþÚÿÿþ1þ3ÿÿþÙýßÿÿþþñÿÿþþÿÿþðþCÿÿûûÿÿÐþûÿÿþþÿÿþúþ¤ÿÿû±ÿÿ|þêÿÿþþÿÿþéýöÿÿûPÿý!þÖÿÿþ1þ3ÿÿþÕþfÿÿûéÿ°þ³ÿÿþsþwÿÿþ³þÇÿÿûþ2þpÿÿýÒ ý×ÿÿþoþ(ÿÿü,¡ þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË2LÍýj×ÿÿþ© ÿ ÿýú°ÿÿýÀ ÿ ÿý¥ÿ ÿýØRÿ ö3˜ðÿÿÆ‘C7üB†ÿ ÿþLÿÿý%ÿÿýåÿÿúO…ºïÿÿþëþ ÿÿÿþþJÿÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿÿþæþŠÿÿþÎþÿÿýïÿÿúæ³€MýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿþìÿÿþcþ”ÿÿýý8ÿÿýõ ý?þÿÿþ‘ÿÿþ¡ý Üÿÿýß ÿÿþ?þ‘ÿÿþFÿÿýÝý<ýÿÿþ ÿÿþ}ý ÚÿÿýèÿÿýýþŽÿÿþTÿÿþ»ý9ýÿÿþ¯ ÿÿþYýØÿÿýï ÿüÿïþ‹ÿÿþc ÿýÿ—ý7üÿÿþ½ ÿýÿ6þÖÿÿýõ" ÿþÔÿþr ÿþsÿþÿ!ÿ!ÿ4ÿ:ÿ:ÿ:ÿ2LÍöi./d±÷ÿÿýüZ ÿòò¯}K($OÒÿÿýå ÿýöT ÿýÒ! ÿýÑ- ÿüø} ÿüØeû'vÃúÿ ÿüà ö·ßñüóß¹ƒ:ï ?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v&û[Æ÷ÿÿý3¼ÿÿüþ·- ÿü“þÿ ÿýûw ÿý µÿÿþ— ÿý²ÿÿöì‹==Œíÿÿþ€ û³€Mÿÿþtÿÿý¨ý«ÿÿýýB ÿýúÿÿýœý ÿÿýØ ÿþÿÿýÑ ýÕÿÿþf ÿýôÿÿþ> þAÿÿýÚ ÿþMÿÿþÓ þÖÿÿþ= ÿþŒÿÿþ þÿÿþ• ÿþÃÿÿþI þKÿÿþÜ ÿþÚÿÿþ þ!ÿÿþ ÿþíÿÿþ þÿÿþO ÿþûÿÿþ þÿÿþ} ÿþïÿÿþ þÿÿþŸ ÿþÝÿÿþ þ ÿÿþ¿ ÿþÉÿÿþH þJÿÿþÔ ÿþ—ÿÿþ~ þÿÿþç ÿþYÿÿþÑ þÓÿÿþô ÿýüÿÿþ: þ=ÿÿþù ÿþ©ÿÿýÎ ýÑÿÿþþ ÿþ5ÿÿþ•ý™ÿÿþø ÿþ›ÿÿý£ý¥ÿÿþð ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ÿýÕÿÿýèDÿÿþÇ ÿý¸ÿ ÿüÓ$8ÿÿþ© ÿýNÒÿÿúð~ Sÿÿþ ÿó4{»×ìüòÖ¥^ þ‚ÿÿþP ÿ(þ»ÿÿþ ÿ'ýñÿÿþÐ ÿ'þJÿÿþ| ÿ'þ®ÿÿýý! ÿ&ý$úÿÿþ° ÿ&þ¼ÿÿýþ2 ÿ%þpÿÿþ¡ 2LÍþ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ þnÿÿýã'ÿ þÏÿÿþ„(ÿ ð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU2LÍ þ«ÿÿ÷Öh%&j×ÿÿþ© ÿôú°i./d±÷ÿÿ ý ÁÿÿýÀ ÿ ý ¦ÿ ÿý¥ÿþÑ ýRØÿÿýØRü3˜ðÿ ÿüØeóD‘ÆêùùêÆ‘CóB†·ßñüóß¹ƒ:Õó7€·Þñüñß¶†A/übÖÿ ÿüð—2þLÿÿý)Îÿÿýåÿÿ ýPõÿÿþ ÿÿ ýVüÿÿôø´g1.k²úÿÿþJÿÿ ý;øÿÿý°!û‰õÿýäÿÿü¯ÿÿ ýãÿÿþo ý±þÿÿûïÿÿ þžÿÿþr$þGÿÿûdÿÿý0ýÿÿþ½$ýâÿÿú½ÿÿþ®ÿÿýú%$þšÿÿùõ"ÿÿý üÿÿþ­$þDÿÿþsÿþ{ÿÿþJ#ý àÿÿýÊÿþÏÿÿýñ#þ—ÿÿýú-ÿýþÿÿþº#ýAþÿÿþ‚ÿþPÿÿþó \¤ÔòûëÕ¹x1ý ÞÿÿýÕÿþ€ÿÿúRzïÿÿýÎHþ”ÿÿýý8ÿþ©ÿÿü7"Ðÿ ÿý° ý?þÿÿþ‘ÿþÈÿÿýBæÿÿýÍ ý Üÿÿýß ÿþàÿÿþÝÿÿ÷Ón( (nÓÿÿýÊ þ‘ÿÿþFÿþðÿÿý~ýÿÿþ ý<ýÿÿþ ÿþùÿÿþuþvÿÿþ. ý Úÿÿýèÿþþÿÿþº þ¼ÿÿþ¢ þŽÿÿþTÿþûÿÿþ* þ,ÿÿýúý9ýÿÿþ¯ ÿþõÿÿþÆ þÇÿÿþUýØÿÿýï ÿþêÿÿþw þxÿÿþ“þ‹ÿÿþc ÿþ×ÿÿþD þFÿÿþÆý7üÿÿþ½ ÿþÁÿÿþ þÿÿþÛþÖÿÿýõ" ÿþ¢ÿÿþ þÿÿþíÿþr ÿþ€ÿÿþ þÿÿþûÿþQÿÿþ þÿÿþìÿþÿÿþ þÿÿþÙÿþÞÿÿþD þFÿÿþÂÿþ—ÿÿþx þyÿÿþ‹ÿþ@ÿÿþÇ þÉÿÿþLÿýÝÿÿþ+ þ,ÿÿýôÿ þjÿÿþ» þ¼ÿÿþÿ2LÍüÿüZ þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿýöTþ”ÿÿþ“ýùÿÿþ-ý_òÿÿýò_þnÿÿþãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ òóBÄéùùéÄBÿýP×ÿÿý×Pù%[Æ÷ÿÿý£ÿ ÿý¢ úO…ºïÿÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿþ`ÿÿý‡ýˆÿÿþ_ ÿúæ³€Mÿÿýêÿÿþþ„ÿÿýé úæ³€Mÿþ~ÿÿýÂýÄÿÿþ|ÿ ýéÿÿþ3 þ4ÿÿýèÿ þNÿÿþÀ þÀÿÿþLÿ þ¢ÿÿþb þcÿÿþ¡ÿ þæÿÿýþ þÿÿþåÿ þ$ÿÿþÕþÖÿÿþ$ÿ þVÿÿþ¡þ¢ÿÿþUÿ þƒÿÿþwþxÿÿþÿ þ¥ÿÿþTþTÿÿþ£ÿ þÃÿÿþ9þ:ÿÿþÁÿ þØÿÿþ#þ#ÿÿþÖÿ þéÿÿþþÿÿþèÿ þõÿÿþ þ ÿÿþôÿ þûÿÿþþÿÿþùÿ ÿþþÿÿþþÿ þûÿÿþþÿÿþúÿ þõÿÿþþ ÿÿþôÿ þêÿÿþþÿÿþèÿ þØÿÿþ"þ#ÿÿþÖÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ÿþƒÿÿþwþxÿÿþ‚ÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~2LÍþ§ÿ ÿþFÿ ÿþÿ ÿÿ û)zÊý=þÛð.e’¶ØêöúëÜÁ[ÿû$lµóÿ ÿüø¨6ÿÿüý• ÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿÿüå‡4 ý'Àÿÿþ ÿüÉZ ý«ÿÿýü! ÿ%ý ãÿÿþw ÿ&þtÿÿþÁ ÿ&þ,ÿÿþà ÿ&þÿÿþø ÿ&þ ÿÿþò ÿ&þ#ÿÿþØ ÿ&þeÿÿþ¡ ÿ%ýÑÿÿþJ ÿ%þ‹ÿÿýÏ ÿ#ý¢ÿÿýö1 ÿù*Z¢ôÿÿýôI ÿ ÿýÅ* ÿ ÿý¬Eÿ ÿüö¯>ýÍhÿÿÿý±ÿù 4i®ûÿÿýà ÿ#ý¦ÿÿý× ÿ%ýcþÿÿþ ÿ&þzÿÿýø ÿ&ýØÿÿþs ÿ'þwÿÿþ³ ÿ'þ0ÿÿþà ÿ'þÿÿþô ÿ'þÿÿþû ÿ'þÿÿþî ÿ'þ=ÿÿþÏ ÿ'þˆÿÿþŸ ÿ&ý çÿÿþY ÿ&þ–ÿÿýï ýž 2LÍóÿàšV0"NŽæÿÿýºþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥ ÿüãyýRØÿÿýØR ñI¨ÍæóüñàÏ«r8óD‘ÆêùùêÆ‘CóóBÄéùùéÄB ÿýP×ÿÿý×P ÿý£ÿ ÿý¢ÿý¾ÿÿý½ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ÿþ`ÿÿý‡ýˆÿÿþ_ÿýêÿÿþþ„ÿÿýéÿþ~ÿÿýÂýÄÿÿþ|ÿýéÿÿþ3 þ4ÿÿýèÿþNÿÿþÀ þÀÿÿþLÿþ¢ÿÿþb þcÿÿþ¡ÿþæÿÿýþ þÿÿþåÿþ$ÿÿþÕþÖÿÿþ$ÿþVÿÿþ¡þ¢ÿÿþUÿþƒÿÿþwþxÿÿþÿôn«×òüïÛÇ”Sþ¥ÿÿþTþTÿÿþ£ ÿüù›#þÃÿÿþ9þ:ÿÿþÁÿüü~ þØÿÿþ#þ#ÿÿþÖÿý³ þéÿÿþþÿÿþèóúÁ}P' !IŠàÿÿý´ þõÿÿþ þ ÿÿþôþüfñÿÿþŠ þûÿÿþþÿÿþùý'Ûÿÿýý* ÿþþÿÿþþý&ïÿÿþª þûÿÿþþÿÿþúþ`ÿÿýþþõÿÿþþ ÿÿþôýÛÿÿþ_þêÿÿþþÿÿþèþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþMþeÿÿþ ýêÿÿþ3 þ4ÿÿýéý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿþ~2LÍþ„ÿÿ÷Óm( (mÓÿÿþ±ÿýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿ ý.¸ÿ ÿý¼4ÿ ô'xµÞôûêÔ´o&1ù%[Æ÷ÿÿ!þLÿÿúO…ºïÿÿ ýåÿÿÿ þ ÿÿÿþJÿÿÿúæ³€Mÿÿýäÿÿþ¯ÿÿúæ³€MÿþÿÿýïÿÿÿþGÿÿýdÿÿÿýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿÿÿÿÿÿÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿ2LÍ ÿôàšV0"NŽæÿÿýº ÿ ÿý§  ÿ ÿýóa ÿ û)zÊýÿ ÿüãy ÿðI¨ÍæóüñàÏ«r8÷BÄéùùé ÿýP×ÿÿ ÿý£ÿÿ ÿþë ý¾ÿÿ ÿþ þ§ÿÿùÖi& (þ)ÿÿþ/ þ`ÿÿý‡"þŠÿÿþÎ ýêÿÿþ#ýçÿÿþm þ~ÿÿýÂ#þLÿÿýø ýéÿÿþ3$þ­ÿÿþª þNÿÿþÀ$ýúÿÿþI þ¢ÿÿþb$þoÿÿýå þæÿÿýþ$þÐÿÿþ‡ þ$ÿÿþÕ$þ1ÿÿþ& þVÿÿþ¡$þ’ÿÿþÄ þƒÿÿþw#ýìÿÿþc þ¥ÿÿþT#þTÿÿýõ þÃÿÿþ9#þ¶ÿÿþ¡ þØÿÿþ#"ýüÿÿþ? þéÿÿþ"þxÿÿýÝ þõÿÿþ "þØÿÿþ}þûÿÿþ!þ:ÿÿýýÿþ!þ›ÿÿþ»þûÿÿþ ý ñÿÿþYþõÿÿþ þ]ÿÿýïþêÿÿþ þ¾ÿÿþ—þØÿÿþ"ý þÿÿþ6þÃÿÿþ9þ€ÿÿþÔþ¥ÿÿþSÿýßÿÿþsþƒÿÿþwÿþCÿÿýûþWÿÿþ¡ÿþ¤ÿÿþ±þ%ÿÿþÕÿýöÿÿþPþæÿÿýþþfÿÿýéþ£ÿÿþbþÇÿÿþþOÿÿþ¿þ(ÿÿþ,ýêÿÿþ3þ‰ÿÿþËþ€ÿÿýÂ2LÍ ÿ ÿôàšV0"NŽæÿÿýºþ¬ÿÿ ÿý§ ýùÿÿ ÿýóaþnÿ ÿ û)zÊýÿ ÿüãyýÏÿðI¨ÍæóüñàÏ«r8ÙûÄB:ÿý×Pù%[Æ÷ÿÿÿý¢ úO…ºïÿÿÿý½ ÿýkØÿÿþ¦ ÿýˆÿÿþ_ ÿúæ³€Mÿÿþ„ÿÿýé úæ³€MÿýÄÿÿþ|ÿþ4ÿÿýèÿþÀÿÿþLÿþcÿÿþ¡ÿþÿÿþåÿ þÖÿÿþ$ÿ þ¢ÿÿþUÿþAþxÿÿþÿý ÞþTÿÿþ£ÿý”ÿþ:ÿÿþÁÿü?þÿþ#ÿÿþÖÿû Üÿÿþÿÿþèÿþ‘ÿÿþ ÿÿþôÿý<ýÿÿþÿÿþùÿý ÚÿÿþèþÿÿþþÿþŽÿÿþTþÿÿþúÿý9ýÿÿþ¯þ ÿÿþôÿýØÿÿýïþÿÿþèÿþ‹ÿÿþcþ#ÿÿþÖÿý7üÿÿþ½þ:ÿÿþÂÿþÖÿÿýõ"þTÿÿþ£ÿÿþrþxÿÿþ‚ÿÿþ¢ÿÿþUÿÿþÕÿÿþ$ÿÿýþÿÿþæÿÿþbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿýÃÿÿþ~ÿ2LÍÿþ§þ¬ÿÿþ§ÿþFýùÿÿþFÿýãþnÿÿýãÿþ„þÏÿÿþ„;óBÄéùùéÄBþLÿÿýP×ÿÿý×Pýåÿÿý£ÿ ÿý¢þ ÿÿý¾ÿÿý½þJÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ýäÿÿþ¯ÿÿþ`ÿÿý‡ýˆÿÿþ_ þÿÿýïÿÿýêÿÿþþ„ÿÿýé þGÿÿýdÿÿþ~ÿÿýÂýÄÿÿþ| ýâÿÿü½ÿÿ ýéÿÿþ3 þ4ÿÿýè þšÿÿûõ"ÿÿ þNÿÿþÀ þÀÿÿþLþDÿÿþsÿ þ¢ÿÿþb þcÿÿþ¡ý àÿÿýÊÿ þæÿÿýþ þÿÿþåþ—ÿÿýú-ÿ þ$ÿÿþÕþÖÿÿþ$þþÿÿþ‚ÿ þVÿÿþ¡þ¢ÿÿþUÿýÕÿ þƒÿÿþwþxÿÿþÿýý8ÿ þ¥ÿÿþTþTÿÿþ£ÿþ‘ÿ þÃÿÿþ9þ:ÿÿþÁüÿß ÿ þØÿÿþ#þ#ÿÿþÖýÿFÿ þéÿÿþþÿÿþèþ ÿ þõÿÿþ þ ÿÿþôþÿ þûÿÿþþÿÿþùÿ ÿþþÿÿþþÿ þûÿÿþþÿÿþúÿ þõÿÿþþ ÿÿþôÿ þêÿÿþþÿÿþèÿ þØÿÿþ"þ#ÿÿþÖÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ÿþƒÿÿþwþxÿÿþ‚ÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~2LÍþ„ÿÿ÷Óm( (mÓÿÿþ±ÿýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿ ý.¸ÿ ÿý¼4ÿ ô'xµÞôûêÔ´o&ô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿüþ·-úO…ºïÿÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿúæ³€Mÿÿþtÿÿý¨ý«ÿÿýýBúæ³€Mÿýúÿÿýœý ÿÿýØ ÿþÿÿýÑ ýÕÿÿþf ÿýôÿÿþ> þAÿÿýÚ ÿþMÿÿþÓ þÖÿÿþ= ÿþŒÿÿþ þÿÿþ• ÿþÃÿÿþI þKÿÿþÜ ÿþÚÿÿþ þ!ÿÿþ ÿþíÿÿþ þÿÿþO ÿþûÿÿþ þÿÿþ} ÿþïÿÿþ þÿÿþŸ ÿþÝÿÿþ þ ÿÿþ¿ ÿþÉÿÿþH þJÿÿþÔ ÿþ—ÿÿþ~ þÿÿþç ÿþYÿÿþÑ þÓÿÿþô ÿýüÿÿþ: þ=ÿÿþù ÿþ©ÿÿýÎ ýÑÿÿþþ ÿþ5ÿÿþ•ý™ÿÿþø ÿþ›ÿÿý£ý¥ÿÿþð ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ÿýÕÿÿýèDÿÿþÇ ÿý¸ÿ ÿüÓ$8ÿÿþ© ÿýNÒÿÿúð~ Sÿÿþ ÿó4{»×ìüòÖ¥^ þ‚ÿÿþP ÿ(þ»ÿÿþ ÿ'ýñÿÿþÐ ÿ'þJÿÿþ| ÿ'þ®ÿÿýý! ÿ&ý$úÿÿþ° ÿ&þ¼ÿÿýþ2 ÿ%þpÿÿþ¡2LÍÿþ8 þyÿÿôâ‚C E…æÿÿþ8 þ”ÿÿÿþ8 ý_òÿ ÿÿþ8 üŠíÿ ÿ2ò Jƒ¹×èøøè×¹ƒJÏóþ’ÿÿ þÆÿÿþ þ‡ÿÿþÃýìÿÿ ý*óÿÿýý •ÿÿýñ'þTÿÿ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿ ý&ÃÿÿýÂ$ýüÿÿ üD¦þÿÿüþ¥CþxÿÿþÝ ü'›íÿ ÿüí›'þØÿÿþ} üüÿÿüü‘þ:ÿÿýýý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþ»ý¼ÿÿüùqütúÿÿý¼ý ñÿÿþYþpÿÿýø= ý@ùÿÿþoþ]ÿÿýïý ïÿÿþc þfÿÿýî þ¾ÿÿþ—þaÿÿýÓ ýÔÿÿþaý þÿÿþ6þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÔ þÚÿÿþ1þ3ÿÿþÙýßÿÿþs þñÿÿþþÿÿþðþCÿÿýû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP þÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË2LÍÿþxÿòò¯}K($OÒÿÿýå ÿøàšV0ÿÿþ“ ÿýÒ! ÿýò_ ÿüø} ÿüíŠ û'vÃúÿ ÿüà û)zÊýÿÿþ ï ?vŸÃáïúøêÛÉj5öI¨ÍæóüñûûBÄÿÿþLÿÿýP×ÿÿýåÿÿý£ÿÿþëþ ÿÿý¾ÿ ÿþþJÿÿþ§ÿÿýÖiÿÿþ/ýäÿÿþ¯ÿÿþ`ÿÿü‡ÿÿþÎþÿÿýïÿÿýêÿÿþÿþmþGÿÿýdÿÿþ~ÿÿýÂÿýøýâÿÿü½ÿÿ ýéÿÿþ3ÿþªþšÿÿûõ"ÿÿ þNÿÿþÀÿþIþDÿÿþsÿ þ¢ÿÿþbÿýåý àÿÿýÊÿ þæÿÿýþÿþ‡þ—ÿÿýú-ÿ þ$ÿÿþÕÿþ&ýAþÿÿþ‚ÿ þVÿÿþ¡ýÿÄý ÞÿÿýÕÿ þƒÿÿþwýÿcþ”ÿÿýý8ÿ þ¥ÿÿþTýõ ý?þÿÿþ‘ÿ þÃÿÿþ9þ¡ý Üÿÿýß ÿ þØÿÿþ#þ?þ‘ÿÿþFÿ þéÿÿþþý<ýÿÿþ ÿ þõÿÿþ ý Úÿÿýèÿ þûÿÿþþŽÿÿþTÿ ÿþý9ýÿÿþ¯ ÿ þûÿÿþýØÿÿýï ÿ þõÿÿþþ‹ÿÿþc ÿ þêÿÿþý7üÿÿþ½ ÿ þØÿÿþ"þÖÿÿýõ" ÿ þÃÿÿþ9ÿþr ÿ þ¥ÿÿþSÿþƒÿÿþwÿþWÿÿþ¡ÿþ%ÿÿþÕÿþæÿÿýþ%ÿ þ£ÿÿþb%ÿ þOÿÿþ¿%ÿ ýêÿÿþ3$ÿþ€ÿÿýÂ2LÍû"NŽæÿÿýº ÿôú°i./d±÷ÿÿýüZ ÿý§ ÿýöTÿýóaÿýÑ-ÿüãyü3˜ðÿ ÿüØeø3àÏ«r8óB†·ßñüóß¹ƒ:Ö÷éùùéÄBóBÄéùùéÄBÿý×PýP×ÿÿý×Pü$lµÿÿý¢ý£ÿ ÿý¢ ÿý½ý¾ÿÿý½ ÿù& (kØÿÿþ¦þ§ÿÿ÷Öi& (kØÿÿþ¦ ÿýˆÿÿþ_ þ`ÿÿý‡ýˆÿÿþ_ ÿþåþ„ÿÿýé ýêÿÿþþ„ÿÿýé üÉZýÄÿÿþ| þ~ÿÿýÂýÄÿÿþ|þ4ÿÿýèýéÿÿþ3 þ4ÿÿýèþÀÿÿþLþNÿÿþÀ þÀÿÿþLþcÿÿþ¡þ¢ÿÿþb þcÿÿþ¡þÿÿþåþæÿÿýþ þÿÿþåþÖÿÿþ$þ$ÿÿþÕþÖÿÿþ$þ¢ÿÿþUþVÿÿþ¡þ¢ÿÿþUþxÿÿþþƒÿÿþwþxÿÿþþTÿÿþ£þ¥ÿÿþTþTÿÿþ£þ:ÿÿþÁþÃÿÿþ9þ:ÿÿþÁþ#ÿÿþÖþØÿÿþ#þ#ÿÿþÖþÿÿþèþéÿÿþþÿÿþèþ ÿÿþôþõÿÿþ þ ÿÿþôþÿÿþùþûÿÿþþÿÿþùþÿÿþþÿþþÿÿþþþÿÿþúþûÿÿþþÿÿþúþ ÿÿþôþõÿÿþþ ÿÿþôþÿÿþèþêÿÿþþÿÿþèþ#ÿÿþÖþØÿÿþ"þ#ÿÿþÖþ:ÿÿþÂþÃÿÿþ9þ:ÿÿþÂþTÿÿþ£þ¥ÿÿþSþTÿÿþ£þxÿÿþ‚þƒÿÿþwþxÿÿþ‚þ¢ÿÿþUþWÿÿþ¡þ¢ÿÿþUþÕÿÿþ$þ%ÿÿþÕþÕÿÿþ$ýþÿÿþæþæÿÿýþ ýþÿÿþæþbÿÿþ¢þ£ÿÿþb þbÿÿþ¢þÀÿÿþMþOÿÿþ¿ þÀÿÿþMþ4ÿÿýéýêÿÿþ3 þ4ÿÿýéýÃÿÿþ~ þ€ÿÿýÂýÃÿÿþ~ 2LÍÿôú°i./d±÷ÿÿýüZ ÿþ8ÿýöT ÿþ8ÿýÑ- ÿþ8ý˜ðÿ ÿüØeÿþ8óB†·ßñüóß¹ƒ:òð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 þóÿ ÿüø¨6û [ªñÿ ÿüÏd ÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTý‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU2LÍÿôàšV0"NŽæÿÿýº ÿÿý§ ÿÿýóaÿû)zÊýÿ ÿüãyÿðI¨ÍæóüñàÏ«r8ô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿüþ·-úO…ºïÿÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿúæ³€Mÿÿþtÿÿý¨ý«ÿÿþýúæ³€Mÿýúÿÿýœý ÿÿÿþÿÿýÑ ýÕÿÿÿýôÿÿþ> þAÿÿÿþMÿÿþÓ üÖÿÿÿþŒÿÿþ üÿÿÿþÃÿÿþI üKÿÿÿþÚÿÿþ ü!ÿÿÿþíÿÿþ üÿÿÿþûÿÿþ üÿÿÿþïÿÿþ üÿÿÿþÝÿÿþ ü ÿÿÿþÉÿÿþH üJÿÿÿþ—ÿÿþ~ üÿÿÿþYÿÿþÑ üÓÿÿÿýüÿÿþ: þ=ÿÿÿþ©ÿÿýÎ ýÑÿÿÿþ5ÿÿþ•ý™ÿÿÿþ›ÿÿý£ý¥ÿÿÿý Òÿÿöëˆ;;‰ëÿÿýÞÿÿýÕÿÿüèDÿÿý¸ÿ ÿûÓ$8ÿÿýNÒÿÿùð~ Sÿÿó4{»×ìüòÖ¥^ ý‚ÿÿ(ý»ÿÿ'üñÿÿ'üJÿÿÿ'ü®ÿÿÿ&û$úÿÿÿ&þ¼ÿÿÿ%þpÿÿ2LÍÿ þ«ÿÿ÷Öh%&j×ÿÿþ©þ«ÿÿ÷Öh%&ÿÿ ý ÁÿÿýÀ ý Áÿ ÿý ¦ÿ ÿý¥ý ¦ÿ ÿýRØÿÿýØRýRØÿÿóD‘ÆêùùêÆ‘C÷D‘ÆêùùêÓó ý ÞÿÿýÕÿþŸþÆÿÿþ þ‡ÿÿþÃþ”ÿÿýý8ÿþ¿ý*óÿÿýý •ÿÿýñ' ý?þÿÿþ‘ÿþÔ ýBòÿÿõç…CFŠëÿÿýñ> ý Üÿÿýß ÿþç ý&ÃÿÿýÂ$þ‘ÿÿþFÿþô üD¦þÿÿüþ¥Cý<ýÿÿþ ÿþù ü'›íÿ ÿüí›' ý Úÿÿýèÿþþ üüÿÿüü‘ þŽÿÿþTÿþøý ÆÿÿõãƒD E„äÿÿýÆ ý9ýÿÿþ¯ÿþðý¼ÿÿüùqütúÿÿý¼ýØÿÿýïÿþßþpÿÿýø= ý@ùÿÿþoþ‹ÿÿþcÿþÇý ïÿÿþc þfÿÿýî ý7üÿÿþ½ ÿþ©þaÿÿýÓ ýÔÿÿþaþÖÿÿýõ" ÿþþ§ÿÿþsþuÿÿþ¦ÿþr ÿþPþÚÿÿþ1þ3ÿÿþÙÿþþñÿÿþþÿÿþðÿþÐþûÿÿþþÿÿþúÿþ|þêÿÿþþÿÿþéÿýý!þÖÿÿþ1þ3ÿÿþÕýÿ°þ³ÿÿþsþwÿÿþ³ýþ2þpÿÿýÒ ý×ÿÿþoþ¡ þ)ÿÿþc þlÿÿþ)2LÍýj×ÿÿþ© ÿôú°i./d±÷ÿÿýüZþ¬ÿÿýÀ ÿýöTýùÿÿý¥ÿýÑ-þnÿÿýØRü3˜ðÿ ÿüØeùÏÿÆ‘CóB†·ßñüóß¹ƒ:ÿ ÿþPÿÿ ÿý£ÿÿ ÿþë ý¾ÿÿ ÿþ þ§ÿÿþ¯ÿÿþ)ÿÿþ/ þ`ÿÿýïÿÿþŠÿÿþÎ ýêÿÿýdÿÿýçÿÿþm þ~ÿÿüÂÿÿþLÿÿýø ýéÿÿü3ÿÿþ­ÿÿþª þNÿÿþÀÿýúÿÿþI þ¢ÿÿþbÿþoÿÿýå þæÿÿýþÿþÐÿÿþ‡ þ$ÿÿþÕÿþ1ÿÿþ& þVÿÿþ¡ÿþ’ÿÿþÄ þƒÿÿþwÿýìÿÿþc þ¥ÿÿþTÿþTÿÿýõ þÃÿÿþ9ÿþ¶ÿÿþ¡ þØÿÿþ#ÿýüÿÿþ? þéÿÿþÿþxÿÿýÝ þõÿÿþ ÿþØÿÿþ}þûÿÿþÿþ:ÿÿýýÿþÿþ›ÿÿþ»þûÿÿþÿý ñÿÿþYþõÿÿþÿþ]ÿÿýïþêÿÿþÿþ¾ÿÿþ—þØÿÿþ"ÿý þÿÿþ6þÃÿÿþ9ÿþ€ÿÿþÔþ¥ÿÿüSÿ ÿýßÿÿþsþƒÿÿüwÿ ÿþCÿÿýûþWÿÿü¡ÿ ÿþ¤ÿÿþ±þ%ÿÿüÕÿ ÿýöÿÿþPþæÿÿýþÿþfÿÿýéþ£ÿÿþbÿþÇÿÿþþOÿÿþ¿ÿþ(ÿÿþ,ýêÿÿü3ÿÿþ‰ÿÿþËþ€ÿÿÂ2LÍÿþ§ÿòò¯}K($OÒÿÿýå ÿþFÿýÒ! ÿýãÿüø} ÿþ„û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5ÐóBÄéùùéÄBô%n³ÓéûòÝ´v&þ×ÿÿý×Pý3¼ÿÿüþ·- ÿý¢ü“þÿ ÿýûw ÿý½ ý µÿÿþ— ÿ÷Öi& (kØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ üÿ‡ýˆÿÿþ_ þtÿÿý¨ý«ÿÿýýB þþ„ÿÿýé ýúÿÿýœý ÿÿýØþýÄÿÿþ| þÿÿýÑ ýÕÿÿþfþ4ÿÿýèýôÿÿþ> þAÿÿýÚþÀÿÿþLþMÿÿþÓ þÖÿÿþ=þcÿÿþ¡þŒÿÿþ þÿÿþ•þÿÿþåþÃÿÿþI þKÿÿþÜþÖÿÿþ$þÚÿÿþ þ!ÿÿþþ¢ÿÿþUþíÿÿþ þÿÿþOþxÿÿþþûÿÿþ þÿÿþ}þTÿÿþ£þïÿÿþ þÿÿþŸþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿þ#ÿÿþÖþÉÿÿþH þJÿÿþÔþÿÿþèþ—ÿÿþ~ þÿÿþçþ ÿÿþôþYÿÿþÑ þÓÿÿþôþÿÿþùýüÿÿþ: þ=ÿÿþùþÿÿþþþ©ÿÿýÎ ýÑÿÿþþþÿÿþúþ5ÿÿþ•ý™ÿÿþøþ ÿÿþôþ›ÿÿý£ý¥ÿÿþðþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþ¢ÿÿþUþ»ÿÿþþÕÿÿþ$ýñÿÿþÐýþÿÿþæþJÿÿþ|þbÿÿþ¢þ®ÿÿýý!þÀÿÿþMý$úÿÿþ°þ4ÿÿýéþ¼ÿÿýþ2þýÃÿÿþ~þpÿÿþ¡ 2LÍÿþ8 ÿÿþ8 ÿÿþ8 ÿÿþ8 ÿð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿý÷!üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿþ±ý ãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßýÑÿÿþJþyÿÿþÅþ‹ÿÿýÏýÚÿÿþ‰ý¢ÿÿýö1þ\ÿÿþF ù*Z¢ôÿÿýôIýåÿÿýæ ÿýÅ*þ¨ÿÿþr ÿý¬EþkÿÿýÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU2LÍ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe ÿ óB†·ßñüóß¹ƒ:4ù%[Æ÷ÿÿ!þLÿÿ úO…ºïÿÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿ ÿúæ³€Mÿÿýäÿÿü¯ÿÿúæ³€MÿþÿÿûïÿÿÿþGÿÿûdÿÿÿýâÿÿú½ÿÿÿþšÿÿùõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿÿÿÿÿÿÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿ2LÍÿÿ ÿùú°i.ÿÿÿ ÿÿ ÿÿ ü3˜ðÿÿ8øB†·ßñü×óBÄéùùéÄBû%n³ÓÿÿýP×ÿÿý×Pý3¼ÿÿý£ÿ ÿý¢ü“þÿÿý¾ÿÿý½ ý µÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿüì‹=ÿÿþ`ÿÿý‡ýˆÿÿþ_ þtÿÿû¨ÿÿýêÿÿþþ„ÿÿýé ýúÿÿýœÿþ~ÿÿýÂýÄÿÿþ| þÿÿýÑÿ ýéÿÿþ3 þ4ÿÿýèýôÿÿþ>ÿ þNÿÿþÀ þÀÿÿþLþMÿÿþÓÿ þ¢ÿÿþb þcÿÿþ¡þŒÿÿþÿ þæÿÿýþ þÿÿþåþÃÿÿþIÿ þ$ÿÿþÕþÖÿÿþ$þÚÿÿþÿ þVÿÿþ¡þ¢ÿÿþUþíÿÿþÿ þƒÿÿþwþxÿÿþþûÿÿþÿ þ¥ÿÿþTþTÿÿþ£þïÿÿþÿ þÃÿÿþ9þ:ÿÿþÁþÝÿÿþÿ þØÿÿþ#þ#ÿÿþÖþÉÿÿþHÿ þéÿÿþþÿÿþèþ—ÿÿþ~ÿ þõÿÿþ þ ÿÿþôþYÿÿþÑÿ þûÿÿþþÿÿþùýüÿÿþ:ÿ ÿþþÿÿþþþ©ÿÿýÎÿ þûÿÿþþÿÿþúþ5ÿÿþ•ÿ þõÿÿþþ ÿÿþôþ›ÿÿû£ÿÿ þêÿÿþþÿÿþèý Òÿÿüëˆ;ÿÿ þØÿÿþ"þ#ÿÿþÖ ýÕÿÿ þÃÿÿþ9þ:ÿÿþ ý¸ÿÿ þ¥ÿÿþSþTÿÿþ£ ýNÒÿ ÿþƒÿÿþwþxÿÿþ‚ ú4{»×ÿÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~€2€L€Íú/d±÷ÿÿþüÿÿýöTÿÿüÑ-ÿÿõØeóß¹ƒ:êøéûòÝ´v&ÿûþ·-ÿÿýûwÿÿù=Œíÿÿý«ÿÿû ÿÿüÕÿýAÿþÖþþKþ!þþþþ þJþþÓý=ÿüÑÿû™ÿÿý¥ÿÿù;‰ëÿ ÿþèÿÿýÓ$ÿÿôð~ ìüòÖ¥^ þþJþ®ý$úý¼ÿþpÿÿ2LÍÿý± þlÿÿþåÿûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:ÒóBÄéùùéÄBô%n³ÓéûòÝ´v&ýP×ÿÿý×Pý3¼ÿÿüþ·- ý£ÿ ÿý¢ü“þÿ ÿýûwý¾ÿÿý½ ý µÿÿþ—þ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€þ`ÿÿý‡ýˆÿÿþ_ þtÿÿý¨ý«ÿÿþýýêÿÿþþ„ÿÿýé ýúÿÿýœý ÿÿþ~ÿÿýÂýÄÿÿþ| þÿÿýÑ ýÕÿÿýéÿÿþ3 þ4ÿÿýèýôÿÿþ> þAÿÿþNÿÿþÀ þÀÿÿþLþMÿÿþÓ üÖÿÿþ¢ÿÿþb þcÿÿþ¡þŒÿÿþ üÿÿþæÿÿýþ þÿÿþåþÃÿÿþI üKÿÿþ$ÿÿþÕþÖÿÿþ$þÚÿÿþ ü!ÿÿþVÿÿþ¡þ¢ÿÿþUþíÿÿþ üÿÿþƒÿÿþwþxÿÿþþûÿÿþ üÿÿþ¥ÿÿþTþTÿÿþ£þïÿÿþ üÿÿþÃÿÿþ9þ:ÿÿþÁþÝÿÿþ ü ÿÿþØÿÿþ#þ#ÿÿþÖþÉÿÿþH üJÿÿþéÿÿþþÿÿþèþ—ÿÿþ~ üÿÿþõÿÿþ þ ÿÿþôþYÿÿþÑ üÓÿÿþûÿÿþþÿÿþùýüÿÿþ: þ=ÿÿÿþþÿÿþþþ©ÿÿýÎ ýÑÿÿþûÿÿþþÿÿþúþ5ÿÿþ•ý™ÿÿþõÿÿþþ ÿÿþôþ›ÿÿý£ý¥ÿÿþêÿÿþþÿÿþèý Òÿÿöëˆ;;‰ëÿÿýÞÿþØÿÿþ"þ#ÿÿþÖ ýÕÿÿüèDÿþÃÿÿþ9þ:ÿÿþ ý¸ÿ ÿûÓ$8ÿþ¥ÿÿþSþTÿÿþ£ ýNÒÿÿùð~ Sÿþƒÿÿþwþxÿÿþ‚ ó4{»×ìüòÖ¥^ ý‚ÿþWÿÿþ¡þ¢ÿÿþUý»ÿþ%ÿÿþÕþÕÿÿþ$üñÿþæÿÿýþ ýþÿÿþæüJÿÿþ£ÿÿþb þbÿÿþ¢ü®ÿÿþOÿÿþ¿ þÀÿÿþMý$úÿÿ2LÍþýæÿÿþjý¼5þKÿÿý÷ÿü´U þ¬ÿÿþ§ÿóò¯}K($OýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„û'vÃúÿ ÿ2ò ?vŸÃáïúøêÛÉÓóÿþŸþÆÿÿþ þ‡ÿÿþÃÿþ¿ý*óÿÿýý •ÿÿýñ'ÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>ÿþç ý&ÃÿÿýÂ$ÿþô üD¦þÿÿüþ¥Cÿþù ü'›íÿ ÿüí›'ÿþþ üüÿÿüü‘ÿþøý ÆÿÿõãƒD E„äÿÿýÆ ÿþðý¼ÿÿüùqütúÿÿý¼ÿþßþpÿÿýø= ý@ùÿÿþoÿþÇý ïÿÿþc þfÿÿýî ÿþ©þaÿÿýÓ ýÔÿÿþaÿþþ§ÿÿþsþuÿÿþ¦ÿþPþÚÿÿþ1þ3ÿÿþÙÿþþñÿÿþþÿÿþðÿþÐþûÿÿþþÿÿþúÿþ|þêÿÿþþÿÿþéÿýý!þÖÿÿþ1þ3ÿÿþÕÿþ°þ³ÿÿþsþwÿÿþ³ÿ2LÍý†ÿÿþz þÿÿýþ^ý±ý5ÅÿÿýÑþ…ÿÿþgùÿô‡Òÿÿýå ÿþ8 ÿýú°ÿÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿüà ÿþ8 ÷3˜ðÿÿj58üB†ûú.e’ÿ þLÿÿ û$lµóÿÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿ ÿüÞÿýäÿÿþ¯ÿÿ ÿùå‡4ÿþÿÿýïÿÿ üÉZþÿþGÿÿýdÿÿþÿýâÿÿü½ÿÿþÿþšÿÿûõ"ÿÿþÿþDÿÿþsÿþÿý àÿÿýÊÿþÿþ—ÿÿýú-ÿþÿýAþÿÿþ‚ÿþÿý ÞÿÿýÕÿþÿþ”ÿÿýý8ÿþÿý?þÿÿþ‘ÿþÿý Üÿÿýß ÿþÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿþÿýØÿÿýï ÿþÿþ‹ÿÿþc ÿþÿý7üÿÿþ½ ÿþÿþÖÿÿýõ" ÿþÿÿþr ÿþÿÿþÿÿþÿÿþÿÿþÿ#ÿþÿ#ÿ2LÍ þlÿÿýåÿý¬ÿÿýù>ÿöi./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ÿüØeÿ ö·ßñüóß¹ƒ:öô¶ØêöúëÜÁ[3 ÿüø¨6 ÿ ÿüý• ÿ ÿýÏ ÿþëõg5 5g·üÿÿýÔ ÿþý'Àÿÿþþ)ÿÿþ/ý«ÿÿýü!þŠÿÿþÎý ãÿÿþwýçÿÿþmþtÿÿþÁþLÿÿýøþ,ÿÿþàþ­ÿÿþªþÿÿþøýúÿÿþIþ ÿÿþòþoÿÿýåþ#ÿÿþØþÐÿÿþ‡þeÿÿþ¡þ1ÿÿþ&ýÑÿÿþJþ’ÿÿþÄþ‹ÿÿýÏýìÿÿþcý¢ÿÿýö1þTÿÿýõ ù*Z¢ôÿÿýôIþ¶ÿÿþ¡ ÿýÅ*ýüÿÿþ? ÿý¬EþxÿÿýÝ ÿüö¯>þØÿÿþ} ÿý±þ:ÿÿýýù 4i®ûÿÿýàþ›ÿÿþ»ý¦ÿÿý× ý ñÿÿþYýcþÿÿþþ]ÿÿýïþzÿÿýøþ¾ÿÿþ—ýØÿÿþsý þÿÿþ6þwÿÿþ³þ€ÿÿþÔþ0ÿÿþàýßÿÿþsþÿÿþôþCÿÿýûþÿÿþûþ¤ÿÿþ±þÿÿþîýöÿÿþPþ=ÿÿþÏþfÿÿýéþˆÿÿþŸþÇÿÿþ2LÍÿý± þlÿÿýåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:ÒóBÄéùùéÄBó7€·Þñüñß¶†A ýP×ÿÿý×PübÖÿ ÿüð—2ý£ÿ ÿý¢ý)Îÿÿý¾ÿÿý½ýPõÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ýVüÿÿôø´g1.k²úÿÿþ`ÿÿý‡ýˆÿÿþ_ ý;øÿÿý°!û‰õÿýêÿÿþþ„ÿÿýé ýãÿÿþo ý±þ~ÿÿýÂýÄÿÿþ| þžÿÿþrýéÿÿþ3 þ4ÿÿýè ý0ýÿÿþ½þNÿÿþÀ þÀÿÿþL þ®ÿÿýú%þ¢ÿÿþb þcÿÿþ¡ý üÿÿþ­þæÿÿýþ þÿÿþåþ{ÿÿþJþ$ÿÿþÕþÖÿÿþ$þÏÿÿýñþVÿÿþ¡þ¢ÿÿþUýþÿÿþºþƒÿÿþwþxÿÿþþPÿÿþó \¤ÔòûëÕ¹x1þ¥ÿÿþTþTÿÿþ£þ€ÿÿúRzïÿÿýÎHþÃÿÿþ9þ:ÿÿþÁþ©ÿÿü7"Ðÿ ÿý° þØÿÿþ#þ#ÿÿþÖþÈÿÿýBæÿÿýÍþéÿÿþþÿÿþèþàÿÿþÝÿÿ÷Ón( (nÓÿÿúÊõÿÿþ þ ÿÿþôþðÿÿý~ýÿÿûûÿÿþþÿÿþùþùÿÿþuþvÿÿý.ÿÿþþÿÿþþþþÿÿþº þ¼ÿÿü¢ûÿÿþþÿÿþúþûÿÿþ* þ,ÿÿüúõÿÿþþ ÿÿþôþõÿÿþÆ þÇÿÿýUêÿÿþþÿÿþèþêÿÿþw þxÿÿý“Øÿÿþ"þ#ÿÿþÖþ×ÿÿþD þFÿÿýÆÃÿÿþ9þ:ÿÿþÂþÁÿÿþ þÿÿýÛ¥ÿÿþSþTÿÿþ£þ¢ÿÿþ þÿÿýíƒÿÿþwþxÿÿþ‚þ€ÿÿþ þÿÿýûWÿÿþ¡þ¢ÿÿþUþQÿÿþ þÿÿýì%ÿÿþÕþÕÿÿþ$þÿÿþ þÿÿüÙæÿÿýþ ýþÿÿþæþÞÿÿþD þFÿÿü£ÿÿþb þbÿÿþ¢þ—ÿÿþx þyÿÿü‹Oÿÿþ¿ þÀÿÿþMþ@ÿÿþÇ þÉÿÿL2LÍÿþ·ÿÿý÷=ÿý2þÿÿüùpýx ÿ þyÿÿôâ‚C E…æÿ ÿ þ”ÿÿ ÿ ý_òÿ ÿ ÿüŠíÿ ÿ2ò Jƒ¹×èøøè×¹ƒJóóBÄéùùéÄBÿýP×ÿÿþ×ÿý£ÿ ÿ ÿý¾ÿ ÿ ÿþ§ÿÿõÖi& (kØÿÿÿþ`ÿÿý‡üˆÿÿýêÿÿþþ„ÿþ~ÿÿýÂþÿýéÿÿþ3ÿþNÿÿþÀÿþ¢ÿÿþbÿþæÿÿýþÿþ$ÿÿþÕÿþVÿÿþ¡ÿþƒÿÿþwÿôn«×òüïÛÇ”Sþ¥ÿÿþTÿüù›#þÃÿÿþ9ÿüü~ þØÿÿþ#ÿý³ þéÿÿþÿóúÁ}P' !IŠàÿÿý´ þõÿÿþ üÍhüfñÿÿþŠ þûÿÿþ%ý'Ûÿÿýý* ÿþ&ý&ïÿÿþª þûÿÿþ'þ`ÿÿýþþõÿÿþ'ýÛÿÿþ_þêÿÿþ(þ…ÿÿþ£þØÿÿþ"(þBÿÿþÍþÃÿÿþ9(þÿÿþáþ¥ÿÿþS(þ ÿÿþõþƒÿÿþw(þ ÿÿþúþWÿÿþ¡(þÿÿþîþ%ÿÿþÕ(þCÿÿþÒ þæÿÿýþ'þ‡ÿÿþª þ£ÿÿþb&ýÝÿÿþo þOÿÿþ¿ 2LÍýFúÿÿþ¶ý¼5ý†ÿÿþz þÿÿýþ^þûÿÿýþ1ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿþxÿòò¯}K($OÒÿÿýå ÿþ“ ÿýÒ! ÿýò_ ÿüø} ÿüíŠ û'vÃúÿ ÿüà ÿþ ï ?vŸÃáïúøêÛÉj5úþ’ÿÿþÄþ‡ÿÿþÃýìÿÿþcý •ÿÿýñ'þTÿÿýõ øFŠëÿÿýñ>þ¶ÿÿþ¡ ÿýÂ$ýüÿÿþ?ÿüþ¥CþxÿÿýÝÿüí›'þØÿÿþ} ÿüü‘þ:ÿÿýýø E„äÿÿýÆ þ›ÿÿþ»ütúÿÿý¼ý ñÿÿþYý@ùÿÿþoþ]ÿÿýïþfÿÿýî þ¾ÿÿþ—ýÔÿÿþaý þÿÿþ6þuÿÿþ¦þ€ÿÿþÔþ3ÿÿþÙýßÿÿþsþÿÿþðþCÿÿýûþÿÿþúþ¤ÿÿþ± þÿÿþéýöÿÿþP þ3ÿÿþÕþfÿÿýé þwÿÿþ³þÇÿÿþ2LÍ ÿý± þlÿÿýåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Ïò@v©Óæùóâѧn2ð.e’¶ØêöúëÜÁ[ ýªñÿ ÿüÏdû$lµóÿ ÿüø¨6 ÿýÒ0 ÿüý•ÿýú] ÿýÏÿõâ“R% 9xÚÿÿýüT ÿóÞg5 5g·üÿÿýÔ ûþµDüeõÿÿý÷! ÿüå‡4 ý'Àÿÿþþ3 ý0ðÿÿþ± üÉZ ý«ÿÿýü!þIÿÿþ*ý ãÿÿþwþµÿÿþzþtÿÿþÁþXÿÿþ¿þ,ÿÿþàþÿÿþÜþÿÿþøþÿÿþôþ ÿÿþòþ ÿÿþôþ#ÿÿþØþ4ÿÿþßþeÿÿþ¡þyÿÿþÅýÑÿÿþJýÚÿÿþ‰þ‹ÿÿýÏþ\ÿÿþFý¢ÿÿýö1ýåÿÿýæù*Z¢ôÿÿýôIþ¨ÿÿþr ÿýÅ*þkÿÿýÛ ÿý¬EýBúÿÿýþ? ÿüö¯>ý)îÿÿþ†ÿý±ýâÿÿý¼ù 4i®ûÿÿýàýÙÿÿýË ý¦ÿÿý× ýÒÿÿýÓ ýcþÿÿþ ýËÿÿýÚ"þzÿÿýø ý Æÿÿýà#ýØÿÿþsý Áÿÿýä"%þwÿÿþ³ý¼ÿÿýè'&þ0ÿÿþàý¸ÿÿýì,'þÿÿþôý³ÿÿýï1(þÿÿþûý®ÿÿýó8)þÿÿþîý©ÿÿýõ>*þ=ÿÿþÏþ£ÿÿýøE+þˆÿÿþŸ2LÍÿý± þlÿÿþåÿûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:ÒóBÄéùùéÄBóþ’ÿÿþÄý ÞÿÿýÕýÿÃýìÿÿþcþ”ÿÿýý8ýñ'þTÿÿýõ ý?þÿÿþ‘þ>þ¶ÿÿþ¡ý Üÿÿýß ýüÿÿþ?þ‘ÿÿþFþxÿÿýÝý<ýÿÿþ þØÿÿþ}ý Úÿÿýèþþ:ÿÿýýþŽÿÿþTýÆ þ›ÿÿþ»ý9ýÿÿþ¯üÿ¼ý ñÿÿþYýØÿÿýïÿþoþ]ÿÿýïþ‹ÿÿþcÿýî þ¾ÿÿþ—ý7üÿÿþ½ ÿþaý þÿÿþ6þÖÿÿýõ" ÿþ¦þ€ÿÿþÔÿþr ÿþÙýßÿÿþsÿþðþCÿÿýûÿþúþ¤ÿÿþ±ÿþéýöÿÿþPÿþÕþfÿÿýé"ÿþ³þÇÿÿþ#2LÍ%ÿ:ÿ:ÿÿ%ÿÿ%ÿÿ%ÿÿóBÄéùùéÄBÿýP×ÿÿý×Pý%ÿÿý£ÿ ÿý¢ úO…ºïÿÿý¾ÿÿý½ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ÿþ¯ÿÿþ`ÿÿý‡ýˆÿÿþ_ ÿüæïÿÿýêÿÿþþ„ÿÿýé ÷æ³€Mdÿÿþ~ÿÿýÂýÄÿÿþ|ÿ ýéÿÿþ3 þ4ÿÿýèÿ þNÿÿþÀ þÀÿÿþLÿ þ¢ÿÿþb þcÿÿþ¡ÿ þæÿÿýþ þÿÿþåÿ þ$ÿÿþÕþÖÿÿþ$ÿ þVÿÿþ¡þ¢ÿÿþUÿ þƒÿÿþwþxÿÿþÿ þ¥ÿÿþTþTÿÿþ£ÿ þÃÿÿþ9þ:ÿÿþÁÿ þØÿÿþ#þ#ÿÿþÖÿ þéÿÿþþÿÿþèÿ þõÿÿþ þ ÿÿþôÿ þûÿÿþþÿÿþùÿ ÿþþÿÿþþÿ þûÿÿþþÿÿþúÿ þõÿÿþþ ÿÿþôÿ þêÿÿþþÿÿþèÿ þØÿÿþ"þ#ÿÿþÖÿ þÃÿÿþ9þ:ÿÿþÂÿ þ¥ÿÿþSþTÿÿþ£ ÿþƒÿÿþwþxÿÿþ‚ ÿþWÿÿþ¡þ¢ÿÿþU ÿþ%ÿÿþÕþÕÿÿþ$ ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþM2LÍÿý± þlÿÿýå ÿûÿô‡ý¬ÿÿýù> ÿ ÿôú°i./d±÷ÿÿýüZ ÿ ÿýöT ÿ ÿýÑ- ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:öó ÿþÆÿÿþ þ‡ÿÿþà ÿý*óÿÿýý •ÿÿýñ' ÿýBòÿÿõç…CFŠëÿÿýñ> ÿý&ÃÿÿýÂ$ÿüD¦þÿÿüþ¥Cÿü'›íÿ ÿüí›'ÿüüÿÿüü‘ ÿý ÆÿÿõãƒD E„äÿÿýÆ ÿý¼ÿÿüùqütúÿÿý¼ ÿþpÿÿýø= ý@ùÿÿþo ÿý ïÿÿþc þfÿÿýî ÿþaÿÿýÓ ýÔÿÿþa ÿþ§ÿÿþsþuÿÿþ¦ ÿþÚÿÿþ1þ3ÿÿþÙ ÿþñÿÿþþÿÿþð ÿþûÿÿþþÿÿþú ÿþêÿÿþþÿÿþé ÿþÖÿÿþ1þ3ÿÿþÕ ÿþ³ÿÿþsþwÿÿþ³2LÍý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿý8ÿÿýÒ! ÿý8ÿÿüø} ÿù8'vÃúÿ ÿüà ÿþ8ï ?vŸÃáïúøêÛÉj5ðð.e’¶ØêöúëÜÁ[,û$lµóÿ ÿüø¨6 ÿÿüý• ÿÿýÏ ÿþëÿóÞg5 5g·üÿÿýÔ ÿþÿüå‡4 ý'Àÿÿþþ)ÿÿþ/üÉZ ý«ÿÿýü!þŠÿÿþÎý ãÿÿþwýçÿÿþmþtÿÿþÁþLÿÿýøþ,ÿÿþàþ­ÿÿþªþÿÿþøýúÿÿþIþ ÿÿþòþoÿÿýåþ#ÿÿþØþÐÿÿþ‡þeÿÿþ¡þ1ÿÿþ&ýÑÿÿþJþ’ÿÿþÄþ‹ÿÿýÏýìÿÿþcý¢ÿÿýö1þTÿÿýõ ù*Z¢ôÿÿýôIþ¶ÿÿþ¡ ÿýÅ*ýüÿÿþ? ÿý¬EþxÿÿýÝ ÿüö¯>þØÿÿþ} ÿý±þ:ÿÿýýù 4i®ûÿÿýàþ›ÿÿþ»ý¦ÿÿý× ý ñÿÿþYýcþÿÿþþ]ÿÿýïþzÿÿýøþ¾ÿÿþ—ýØÿÿþsý þÿÿþ6þwÿÿþ³þ€ÿÿþÔþ0ÿÿþàýßÿÿþsþÿÿþôþCÿÿýûþÿÿþûþ¤ÿÿþ±þÿÿþîýöÿÿþPþ=ÿÿþÏþfÿÿýéþˆÿÿþŸþÇÿÿþ 2LÍ ýÛÿÿþuþvÿÿýúÿ ýEþÿÿý~ýÿÿþsÿ þ„ÿÿ÷Óm( (mÓÿÿþ±ÿ ýšÿÿýµ ÿ ýyüÿ ÿüþ”ÿý.¸ÿ ÿý¼4ÿô'xµÞôûêÔ´o&óBÄéùùéÄBþLÿÿýP×ÿÿþ×ýåÿÿý£ÿ ÿþ ÿÿý¾ÿ ÿþJÿÿþ§ÿÿõÖi& (kØÿÿýäÿÿþ¯ÿÿþ`ÿÿý‡üˆÿþÿÿýïÿÿýêÿÿþþ„þGÿÿýdÿÿþ~ÿÿýÂþýâÿÿü½ÿÿ ýéÿÿþ3þšÿÿûõ"ÿÿ þNÿÿþÀþDÿÿþsÿ þ¢ÿÿþbý àÿÿýÊÿ þæÿÿýþþ—ÿÿýú-ÿ þ$ÿÿþÕýAþÿÿþ‚ÿ þVÿÿþ¡ý ÞÿÿýÕÿ þƒÿÿþwþ”ÿÿýý8ÿ þ¥ÿÿþTý?þÿÿþ‘ÿ þÃÿÿþ9ý Üÿÿýß ÿ þØÿÿþ#þ‘ÿÿþFÿ þéÿÿþý<ýÿÿþ ÿ þõÿÿþ ý Úÿÿýèÿ þûÿÿþþŽÿÿþTÿ ÿþý9ýÿÿþ¯ ÿ þûÿÿþýØÿÿýï ÿ þõÿÿþþ‹ÿÿþc ÿ þêÿÿþý7üÿÿþ½ ÿ þØÿÿþ"þÖÿÿýõ" ÿ þÃÿÿþ9ÿþr ÿ þ¥ÿÿþSÿþƒÿÿþwÿþWÿÿþ¡ÿþ%ÿÿþÕÿþæÿÿýþ%ÿ þ£ÿÿþb%ÿ þOÿÿþ¿ 2LÍÿýëÿÿþþƒÿÿýëÿþcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ ÿýRØÿÿýØRÿóD‘ÆêùùêÆ‘Cóô%n³ÓéûòÝ´v&ú þAÿÿýÚþÌÿÿþfþÀÿÿþLþMÿÿþÓ þÖÿÿþ=þæÿÿþ$þcÿÿþ¡þŒÿÿþ þÿÿþ•þúÿÿþ þÿÿþåþÃÿÿþI þKÿÿþÜþðÿÿþ þÖÿÿþ$þÚÿÿþ þ!ÿÿþþÓÿÿþ$þ¢ÿÿþUþíÿÿþ þÿÿþOþšÿÿþeþxÿÿþþûÿÿþ þÿÿþ}þAÿÿýÑþTÿÿþ£þïÿÿþ þÿÿþŸþÆÿÿþþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿ý*óÿÿýþ#ÿÿþÖþÉÿÿþH þJÿÿþÔ ýBòÿÿùç…Cÿÿþèþ—ÿÿþ~ þÿÿþç ý&Ãÿÿþ ÿÿþôþYÿÿþÑ þÓÿÿþô üD¦þÿÿþÿÿþùýüÿÿþ: þ=ÿÿþù ü'›íÿÿþÿÿþþþ©ÿÿýÎ ýÑÿÿþþ üüÿÿþÿÿþúþ5ÿÿþ•ý™ÿÿþøý ÆÿÿùãƒD ÿÿþôþ›ÿÿý£ý¥ÿÿþðý¼ÿÿüùqþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø=þ#ÿÿþÖ ýÕÿÿýèDÿÿþÇý ïÿÿþcþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓþTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ¢ÿÿþUþ»ÿÿþþñÿÿþþÕÿÿþ$ýñÿÿþÐþûÿÿþýþÿÿþæþJÿÿþ|þêÿÿþþbÿÿþ¢þ®ÿÿýý!þÖÿÿþ1þÀÿÿþMý$úÿÿþ°þ³ÿÿþs2LÍÿý¼5ý†ÿÿþzûÿÚBÿÿÿü´U ý5ÅÿÿýÑÿþµÿ ÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà û)zÊýï ?vŸÃáïúøêÛÉj5þ¿÷ç÷øè×°z=ð.e’¶ØêöúëÜÁ[ÿüÙo û$lµóÿ ÿüø¨6 ÿýÐ/ ÿüý• ýOÿ ÿýò9 ÿýÏ ÿø H‹íÿÿýð# ÿóÞg5 5g·üÿÿýÔ ÿý šÿÿþµ ÿüå‡4 ý'Àÿÿþ ÿþ‹ÿÿþ8üÉZ ý«ÿÿýü! ýæ³ýÕÿÿþŠý ãÿÿþwþhÿÿþËþtÿÿþÁþ&ÿÿþåþ,ÿÿþàþ ÿÿþùþÿÿþøþ ÿÿþïþ ÿÿþòþ%ÿÿþÒþ#ÿÿþØþgÿÿþ™þeÿÿþ¡ýÔÿÿþ>ýÑÿÿþJþ‡ÿÿþÃþ‹ÿÿýÏý •ÿÿýñ'ý¢ÿÿýö1 øFŠëÿÿýñ>ù*Z¢ôÿÿýôI ÿýÂ$ ÿýÅ*ÿüþ¥C ÿý¬Eÿüí›' ÿüö¯> ÿüü‘ÿý±ø E„äÿÿýÆ ù 4i®ûÿÿýàütúÿÿý¼ý¦ÿÿý× ý@ùÿÿþoýcþÿÿþþfÿÿýî þzÿÿýøýÔÿÿþaýØÿÿþsþuÿÿþ¦þwÿÿþ³þ3ÿÿþÙþ0ÿÿþàþÿÿþðþÿÿþôþÿÿþúþÿÿþûþÿÿþéþÿÿþîþ3ÿÿþÕþ=ÿÿþÏþwÿÿþ³þˆÿÿþŸ 2LÍ ý+ßÿÿýý6 ýëÿÿþþƒÿÿýëþ>ülôÿÿþ þcÿÿý†ý‡ÿÿþbóÿàšV0"NŽæÿÿýºþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥ ÿüãyýRØÿÿýØR ñI¨ÍæóüñàÏ«r8óD‘ÆêùùêÆ‘Cðò@v©Óæùóâѧn2ù%[Æ÷ÿÿû [ªñÿ ÿüÏd ü…ºïÿÿü2—ñÿÿýÒ0 ÿÿýú] ÿÿõâ“R% 9xÚÿÿýüTÿúæ³€MÿÿÿûþµDüeõÿÿý÷!ü€Mÿÿý¼3 ý0ðÿÿþ± ÿüÿæVþIÿÿþ* ÿý¨þµÿÿþz ÿ&þXÿÿþ¿ ÿ&þÿÿþÜ ÿ&þÿÿþô ÿ&þ ÿÿþô ÿ&þ4ÿÿþß ÿ&þyÿÿþÅ ÿ%ýÚÿÿþ‰ ÿ%þ\ÿÿþF ÿ$ýåÿÿýæ ÿ$þ¨ÿÿþr ÿ#þkÿÿýÛ ÿ"ýBúÿÿýþ?ÿ!ý)îÿÿþ†ÿ ýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿý³ÿÿýï1ÿý®ÿÿýó8ÿý©ÿÿýõ>ÿý£ÿÿýøE2LÍÿ$ÿÿ$ÿÿÿÿÿÿÿÿÿEÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþŠÿÿþÎþÿÿýïÿÿýçÿÿþmþGÿÿýdÿÿþLÿÿýøýâÿÿü½ÿÿþ­ÿÿþªþšÿÿûõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿ þCÿÿýûÿ þ¤ÿÿþ±ÿ ýöÿÿþPÿ þfÿÿýé$ÿ þÇÿÿþ%ÿ2LÍýæÿÿþjýëÿÿþþKÿÿý÷þcÿÿý†þ¬ÿÿþ§þ«ÿÿùÖh%&ýùÿÿþFý Áÿÿþnÿÿýãý ¦ÿÿþÏÿÿþ„ýRØÿÿ7÷D‘ÆêùùêÓóBÄéùùéÄB÷ þAÿÿýÚþ&ÿÿþåþMÿÿþÓ þÖÿÿþ=þ ÿÿþùþŒÿÿþ þÿÿþ•þ ÿÿþïþÃÿÿþI þKÿÿþÜþ%ÿÿþÒþÚÿÿþ þ!ÿÿþþgÿÿþ™þíÿÿþ þÿÿþOýÔÿÿþ>þûÿÿþ þÿÿþ}þ‡ÿÿþÃþïÿÿþ þÿÿþŸý •ÿÿýñ'þÝÿÿþ þ ÿÿþ¿üFŠëÿÿýñ> þÉÿÿþH þJÿÿþÔÿýÂ$ þ—ÿÿþ~ þÿÿþçÿüþ¥C þYÿÿþÑ þÓÿÿþôÿüí›' ýüÿÿþ: þ=ÿÿþùÿüü‘ þ©ÿÿýÎ ýÑÿÿþþüE„äÿÿýÆ þ5ÿÿþ•ý™ÿÿþøütúÿÿý¼ þ›ÿÿý£ý¥ÿÿþðý@ùÿÿþo ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþfÿÿýî ýÕÿÿýèDÿÿþÇýÔÿÿþa ý¸ÿ ÿüÓ$8ÿÿþ©þuÿÿþ¦ ýNÒÿÿúð~ Sÿÿþþ3ÿÿþÙ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÿÿþðþ»ÿÿþþÿÿþúýñÿÿþÐþÿÿþéþJÿÿþ|þ3ÿÿþÕþ®ÿÿýý!þwÿÿþ³ý$úÿÿþ°2LÍ ÿýëÿÿþþƒÿÿýëÿþcÿÿý†ý‡ÿÿþbÿþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØR1óD‘ÆêùùêÆ‘Cïð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý• ÿþë ÿýÏ ÿþ ÿóÞg5 5g·üÿÿýÔ þ)ÿÿþ/ ÿüå‡4 ý'ÀÿÿþþŠÿÿþÎ üÉZ ý«ÿÿýü!ýçÿÿþmý ãÿÿþwþLÿÿýøþtÿÿþÁþ­ÿÿþªþ,ÿÿþàýúÿÿþIþÿÿþøþoÿÿýåþ ÿÿþòþÐÿÿþ‡þ#ÿÿþØþ1ÿÿþ&þeÿÿþ¡þ’ÿÿþÄýÑÿÿþJýìÿÿþcþ‹ÿÿýÏþTÿÿýõ ý¢ÿÿýö1þ¶ÿÿþ¡ù*Z¢ôÿÿýôIýüÿÿþ? ÿýÅ*þxÿÿýÝ ÿý¬EþØÿÿþ} ÿüö¯>þ:ÿÿýýÿý±þ›ÿÿþ»ù 4i®ûÿÿýà ý ñÿÿþY ý¦ÿÿý× þ]ÿÿýï"ýcþÿÿþ þ¾ÿÿþ—$þzÿÿýø ý þÿÿþ6$ýØÿÿþs þ€ÿÿþÔ&þwÿÿþ³ ýßÿÿþs&þ0ÿÿþà þCÿÿýû&þÿÿþô þ¤ÿÿþ±'þÿÿþûýöÿÿþP'þÿÿþîþfÿÿýé'þ=ÿÿþÏþÇÿÿþ(þˆÿÿþŸ2LÍ ÿý± þlÿÿýå ÿûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:öóBÄéùùéÄBÿýP×ÿÿý×Pÿý£ÿ ÿý¢ÿý¾ÿÿý½ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ÿþ`ÿÿý‡ýˆÿÿþ_ÿýêÿÿþþ„ÿÿýéÿþ~ÿÿýÂýÄÿÿþ|ÿýéÿÿþ3 þ4ÿÿýèÿþNÿÿþÀ þÀÿÿþLÿþ¢ÿÿþb þcÿÿþ¡ÿþæÿÿýþ þÿÿþåÿþ$ÿÿþÕþÖÿÿü$ÿÿþVÿÿþ¡þ¢ÿÿüUÿÿþƒÿÿþwþxÿÿüÿÿôn«×òüïÛÇ”Sþ¥ÿÿþTþTÿÿü£ÿ ÿüù›#þÃÿÿþ9þ:ÿÿüÁÿÿüü~ þØÿÿþ#þ#ÿÿüÖÿÿý³ þéÿÿþþÿÿîèÿÿúÁ}P' !IŠàÿÿý´ þõÿÿþ þ ÿÿùôÍhüfñÿÿþŠ þûÿÿþþÿÿþùý'Ûÿÿýý* ÿþþÿÿþþý&ïÿÿþª þûÿÿþþÿÿþúþ`ÿÿýþþõÿÿþþ ÿÿþôýÛÿÿþ_þêÿÿþþÿÿþèþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþM2LÍþ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ 0ù%[Æ÷ÿÿ!þLÿÿ úO…ºïÿÿ ýåÿÿ ÿ þ ÿÿ ÿþJÿÿ ÿúæ³€Mÿÿýäÿÿü¯ÿÿúæ³€MÿþÿÿûïÿÿÿþGÿÿûdÿÿÿýâÿÿú½ÿÿÿþšÿÿùõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿý ÚÿÿýèÿÿþŽÿÿþTÿÿý9ýÿÿþ¯ ÿÿýØÿÿýï ÿÿþ‹ÿÿþc ÿÿý7üÿÿþ½ ÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿÿÿÿÿÿÿÿ$ÿÿ$ÿ2LÍ!ÿýëÿÿþ#ÿþcÿÿý†!ÿþ«ÿÿýÖh ÿý Áÿÿ!ÿý ¦ÿÿ!ÿýRØÿÿ;ûD‘Æÿÿ ÿ ÿ ÿ ÿ ÿþë ÿ ÿþ ÿþ)ÿÿþ/ ÿÿþŠÿÿþÎ ÿÿýçÿÿþm ÿÿþLÿÿýø ÿÿþ­ÿÿþª ÿÿýúÿÿþI ÿÿþoÿÿýå ÿÿþÐÿÿþ‡ ÿÿþ1ÿÿþ& ÿÿþ’ÿÿþÄÿÿýìÿÿþcÿún«×òüÿÿþTÿÿýõ  ÿþ¶ÿÿþ¡ ÿýüÿÿþ? ÿþxÿÿýÝÿ÷úÁ}P' ÿÿþØÿÿþ}üÍhÿþ:ÿÿýýÿþ›ÿÿþ»ÿý ñÿÿþYÿþ]ÿÿýïÿþ¾ÿÿþ—ÿý þÿÿþ6ÿþ€ÿÿþÔÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþ2LÍþƒÿÿýë ýëÿÿþþƒÿÿýëý¼5ý‡ÿÿþb þcÿÿý†ý‡ÿÿþb ÿ÷´U%&j×ÿÿþ©þ«ÿÿ÷Öh%&j×ÿÿþ© ÿýÀ ý ÁÿÿýÀ ÿý¥ý ¦ÿ ÿý¥ ÿýØRýRØÿÿýØR ó'vÃúêùùêÆ‘CóD‘ÆêùùêÆ‘Cþ ßóBÄéùùéÄB ÿýP×ÿÿý×P ÿý£ÿ ÿý¢ ÿý¾ÿÿý½ þ ÿ ÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ý²þ`ÿÿý‡ýˆÿÿþ_ ýtÿýêÿÿþþ„ÿÿýé üúÿþ~ÿÿýÂýÄÿÿþ| üÿÿýéÿÿþ3 þ4ÿÿýèûôÿÿþNÿÿþÀ þÀÿÿþLþMÿÿþ¢ÿÿþb þcÿÿþ¡þŒÿÿþæÿÿýþ þÿÿþåþÃÿÿþ$ÿÿþÕþÖÿÿþ$þÚÿÿþVÿÿþ¡þ¢ÿÿþUþíÿÿþƒÿÿþwþxÿÿþþûÿÿùïÛÇ”Sþ¥ÿÿþTþTÿÿþ£þïÿÿüù›#þÃÿÿþ9þ:ÿÿþÁþÝÿÿüü~ þØÿÿþ#þ#ÿÿþÖþÉÿ ÿý³ þéÿÿþþÿÿþèþ—ÿÿû!IŠàÿÿý´ þõÿÿþ þ ÿÿþôþYÿÿüfñÿÿþŠ þûÿÿþþÿÿþùûüÿÿý'Ûÿÿýý* ÿþþÿÿþþü©ÿÿý&ïÿÿþª þûÿÿþþÿÿþúü5ÿÿþ`ÿÿýþþõÿÿþþ ÿÿþôý›ÿýÛÿÿþ_þêÿÿþþÿÿþèý Òþ…ÿÿþ£þØÿÿþ"þ#ÿÿþÖ þþBÿÿþÍþÃÿÿþ9þ:ÿÿþÂþÿÿþáþ¥ÿÿþSþTÿÿþ£þ ÿÿþõþƒÿÿþwþxÿÿþ‚þ ÿÿþúþWÿÿþ¡þ¢ÿÿþUþÿÿþîþ%ÿÿþÕþÕÿÿþ$þCÿÿþÒ þæÿÿýþ ýþÿÿþæþ‡ÿÿþª þ£ÿÿþb þbÿÿþ¢ýÝÿÿþo þOÿÿþ¿ þÀÿÿþM 2LÍ ý†ÿÿþz þÿÿýþ^þ ý5ÅÿÿýÑþ…ÿÿþgòò¯}K($OÒÿÿýå ÿþ8ÿýÒ! ÿþ8ÿüø} ÿþ8 ÿüà ÿþ8ð?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v&ó þAÿÿýÚþÌÿÿþf þhÿÿþËýÿÓ þÖÿÿþ=þæÿÿþ$ þ&ÿÿþåýÿ þÿÿþ•þúÿÿþ þ ÿÿþùýÿI þKÿÿþÜþðÿÿþ þ ÿÿþïýÿ þ!ÿÿþþÓÿÿþ$ þ%ÿÿþÒýÿ þÿÿþOþšÿÿþe þgÿÿþ™ýÿ þÿÿþ}þAÿÿýÑ ýÔÿÿþ>ýÿ þÿÿþŸþÆÿÿþ þ‡ÿÿþÃýÿ þ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'ýÿH þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>ýÿ~ þÿÿþç ý&ÃÿÿýÂ$ýÿÑ þÓÿÿþô üD¦þÿÿüþ¥Cÿþ: þ=ÿÿþù ü'›íÿ ÿüí›'ÿýÎ ýÑÿÿþþ üüÿÿüü‘ÿþ•ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ÿý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼ÿöëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþoþÕÿÿýèDÿÿþÇý ïÿÿþc þfÿÿýî ý¸ÿ ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþaýNÒÿÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ó4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþéþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³2LÍÿý± þlÿÿþåÿûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:Îð.e’¶ØêöúëÜÁ[ò@v©Óæùóâѧn2 û$lµóÿ ÿüø¨6û [ªñÿ ÿüÏdÿüý• ü2—ñÿÿýÒ0ÿýÏ ÿýú]ÿóÞg5 5g·üÿÿýÔ ÿõâ“R% 9xÚÿÿýüTÿüå‡4 ý'Àÿÿþ ÿûþµDüeõÿÿþ÷üÉZ ý«ÿÿýü!ÿý¼3 ý0ðÿÿý ãÿÿþwüÿæVþIÿÿþtÿÿþÁý¨þµÿÿþ,ÿÿþàþXÿÿþÿÿþøþÿÿþ ÿÿþòþÿÿþ#ÿÿþØþ ÿÿþeÿÿþ¡þ4ÿÿýÑÿÿþJþyÿÿþ‹ÿÿýÏýÚÿÿý¢ÿÿýö1þ\ÿÿù*Z¢ôÿÿýôIýåÿÿ ÿýÅ*þ¨ÿÿ ÿý¬EþkÿÿþÛ ÿüö¯>ýBúÿÿýþ? ÿý±ý)îÿÿþ†ù 4i®ûÿÿýàýâÿÿý¼ý¦ÿÿý× ýÙÿÿýË ýcþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8!þ=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE 2LÍþ þ·ÿÿý÷= ýFúÿÿþ¶$ý2þÿÿüùpüxûÿÿýþ1%þyÿÿõâ‚C E…æÿÿþx'þ”ÿÿþ“)ý_òÿÿýò_+üŠíÿ ÿüíŠ.ñ Jƒ¹×èøøè×¹ƒJ 0ù%[Æ÷ÿÿÿ úO…ºïÿÿÿ ÿÿ ÿÿþ! ÿúæ³€Mÿÿ"þ± úæ³€Mÿ"ýÿ*ÿ"ýÿzÿ"ýÿ¿ÿ"ýÿÜÿ"ýÿôÿ"ýÿôÿ"ýÿßÿ"ýÿÅÿ"ýÿ‰ÿ!üÿFÿ!üTæÿ!ý¶rÿ üüÿ ýxÿÿ ýØÿÿü:ÿÿÿü›ÿÿÿû ñÿÿÿþ]ÿÿÿþ¾ÿÿÿý þÿÿÿþ€ÿÿÿýßÿÿÿþCÿÿþûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýéÿþÇÿÿþ2LÍÿýæÿÿþjýëÿÿÿþKÿÿý÷þcÿÿÿþ¬ÿÿþ§þ«ÿÿÿýùÿÿþFù Áÿÿÿÿþnÿÿýãú ¦ÿÿÿþÏÿÿþ„þR? ÿþLÿÿþPÿÿýåÿÿý£ÿÿþëþ ÿÿý¾ÿ ÿþþJÿÿþ§ÿÿþ)ÿÿþ/ýäÿÿþ¯ÿÿþ`ÿÿþŠÿÿþÎþÿÿýïÿÿýêÿÿýçÿÿþmþGÿÿýdÿÿþ~ÿÿûÂLÿÿýøýâÿÿü½ÿÿ ýéÿÿû3­ÿÿþªþšÿÿûõ"ÿÿ þNÿÿúÀúÿÿþIþDÿÿþsÿ þ¢ÿÿûboÿÿýåý àÿÿýÊÿ þæÿÿúþÐÿÿþ‡þ—ÿÿýú-ÿ þ$ÿÿûÕ1ÿÿþ&ýAþÿÿþ‚ÿ þVÿÿû¡’ÿÿþÄý ÞÿÿýÕÿ þƒÿÿûwìÿÿþcþ”ÿÿýý8ÿ þ¥ÿÿüTÿÿýõ ý?þÿÿþ‘ÿ þÃÿÿü9ÿÿþ¡ý Üÿÿýß ÿ þØÿÿü#ÿÿþ?þ‘ÿÿþFÿ þéÿÿüÿÿýÝý<ýÿÿþ ÿ þõÿÿü ÿÿþ}ý Úÿÿýèÿ þûÿÿøÿÿýþŽÿÿþTÿ ÿùÿÿ»ý9ýÿÿþ¯ ÿ þûÿÿùÿÿYýØÿÿýï ÿ þõÿÿùÿïþ‹ÿÿþc ÿ þêÿÿúÿ—ý7üÿÿþ½ ÿ þØÿÿú"ÿ6þÖÿÿýõ" ÿ þÃÿÿû9Ôÿþr ÿ þ¥ÿÿûSsÿþƒÿÿûwÿþWÿÿþ¡ÿþ%ÿÿþÕÿþæÿÿýþ%ÿ þ£ÿÿþb%ÿ þOÿÿþ¿2LÍþþƒÿÿýë ý± þlÿÿýå üÿ†ý‡ÿÿþb ûÿô‡ý¬ÿÿýù> ÿ÷Öh%&j×ÿÿþ© ÿôú°i./d±÷ÿÿýüZ ÿýÀ ÿýöT ÿý¥ÿýÑ- þØÿÿýØRü3˜ðÿ ÿüØeóD‘ÆêùùêÆ‘CóB†·ßñüóß¹ƒ:ÒóBÄéùùéÄBô%n³ÓéûòÝ´v&þ×ÿÿý×Pý3¼ÿÿüþ·- ÿý¢ü“þÿ ÿýûw ÿý½ ý µÿÿþ— ÿ÷Öi& (kØÿÿþ¦ ý²ÿÿöì‹==Œíÿÿþ€ üÿ‡ýˆÿÿþ_ þtÿÿý¨ý«ÿÿýýB þþ„ÿÿýé ýúÿÿýœý ÿÿýØþýÄÿÿþ| þÿÿýÑ ýÕÿÿþfþ4ÿÿýèýôÿÿþ> þAÿÿýÚþÀÿÿþLþMÿÿþÓ þÖÿÿþ=þcÿÿþ¡þŒÿÿþ þÿÿþ•þÿÿþåþÃÿÿþI þKÿÿþÜþÖÿÿþ$þÚÿÿþ þ!ÿÿþþ¢ÿÿþUþíÿÿþ þÿÿþOþxÿÿþþûÿÿþ þÿÿþ}þTÿÿþ£þïÿÿþ þÿÿþŸþ:ÿÿþÁþÝÿÿþ þ ÿÿþ¿þ#ÿÿþÖþÉÿÿþH þJÿÿþÔþÿÿþèþ—ÿÿþ~ þÿÿþçþ ÿÿþôþYÿÿþÑ þÓÿÿþôþÿÿþùýüÿÿþ: þ=ÿÿþùþÿÿþþþ©ÿÿýÎ ýÑÿÿþþþÿÿþúþ5ÿÿþ•ý™ÿÿþøþ ÿÿþôþ›ÿÿý£ý¥ÿÿþðþÿÿþèý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþßþ#ÿÿþÖ ýÕÿÿýèDÿÿþÇþ:ÿÿþ ý¸ÿ ÿüÓ$8ÿÿþ©þTÿÿþ£ ýNÒÿÿúð~ Sÿÿþþxÿÿþ‚ ó4{»×ìüòÖ¥^ þ‚ÿÿþPþ¢ÿÿþUþ»ÿÿþþÕÿÿþ$ýñÿÿþÐýþÿÿþæþJÿÿþ|þbÿÿþ¢þ®ÿÿýý!þÀÿÿþMý$úÿÿþ°2LÍý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿý8ÿÿýÒ! ÿý8ÿÿüø} ÿù8'vÃúÿ ÿüà ÿþ8ï ?vŸÃáïúøêÛÉj5ôóýÑÿÿþJþÆÿÿþ þ‡ÿÿþÃþ‹ÿÿýÏý*óÿÿýý •ÿÿýñ'ý¢ÿÿýö1ýBòÿÿõç…CFŠëÿÿýñ>ù*Z¢ôÿÿýôIý&ÃÿÿýÂ$ ÿýÅ* üD¦þÿÿüþ¥C ÿý¬E ü'›íÿ ÿüí›' ÿüö¯>üüÿÿüü‘ÿý±ý ÆÿÿõãƒD E„äÿÿýÆ ù 4i®ûÿÿýàý¼ÿÿüùqütúÿÿý¼ý¦ÿÿý× þpÿÿýø= ý@ùÿÿþoýcþÿÿú ïÿÿþc þfÿÿýî þzÿÿûøaÿÿýÓ ýÔÿÿþaýØÿÿüs§ÿÿþsþuÿÿþ¦þwÿÿü³Úÿÿþ1þ3ÿÿþÙþ0ÿÿüàñÿÿþþÿÿþðþÿÿüôûÿÿþþÿÿþúþÿÿüûêÿÿþþÿÿþéþÿÿüîÖÿÿþ1þ3ÿÿþÕþ=ÿÿüϳÿÿþsþwÿÿþ³þˆÿÿþŸ2LÍÿ$ÿÿ$ÿ ÿÿ ÿÿ ÿÿ ÿÿHÿþLÿÿÿýåÿÿÿþëþ ÿÿÿþþJÿÿþ)ÿÿþ/ýäÿÿü¯ÿÿþŠÿÿþÎþÿÿûïÿÿýçÿÿþmþGÿÿûdÿÿþLÿÿýøýâÿÿú½ÿÿþ­ÿÿþªþšÿÿùõ"ÿÿýúÿÿþIþDÿÿþsÿþoÿÿýåý àÿÿýÊÿþÐÿÿþ‡þ—ÿÿýú-ÿþ1ÿÿþ&ýAþÿÿþ‚ÿþ’ÿÿþÄý ÞÿÿýÕÿýìÿÿþcþ”ÿÿýý8ÿþTÿÿýõ ý?þÿÿþ‘ÿþ¶ÿÿþ¡ý Üÿÿýß ÿýüÿÿþ?þ‘ÿÿþFÿþxÿÿýÝý<ýÿÿþ ÿþØÿÿþ}ý Úÿÿýèÿþ:ÿÿýýþŽÿÿþTÿþ›ÿÿþ»ý9ýÿÿþ¯ ÿý ñÿÿþYýØÿÿýï ÿþ]ÿÿýïþ‹ÿÿþc ÿþ¾ÿÿþ—ý7üÿÿþ½ ÿý þÿÿþ6þÖÿÿýõ" ÿþ€ÿÿþÔÿþr ÿýßÿÿþsÿþCÿÿýûÿþ¤ÿÿþ±ÿýöÿÿþPÿþfÿÿýé$ÿþÇÿÿþ%ÿ2LÍÿýëÿÿþþƒÿÿýë ý±ÿþcÿÿý†ý‡ÿÿþb ûÿô‡ÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿùú°i.ÿÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ ÿýRØÿÿýØRü3˜ðÿÿóD‘ÆêùùêÆ‘CøB†·ßñü×óBÄéùùéÄBû%n³ÓÿÿýP×ÿÿý×Pý3¼ÿÿý£ÿ ÿý¢ü“þÿÿý¾ÿÿý½ ý µÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿüì‹=ÿÿþ`ÿÿý‡ýˆÿÿþ_ þtÿÿû¨ÿÿýêÿÿþþ„ÿÿýé ýúÿÿýœÿþ~ÿÿýÂýÄÿÿþ| þÿÿýÑÿ ýéÿÿþ3 þ4ÿÿýèýôÿÿþ>ÿ þNÿÿþÀ þÀÿÿþLþMÿÿþÓÿ þ¢ÿÿþb þcÿÿþ¡þŒÿÿþÿ þæÿÿýþ þÿÿþåþÃÿÿþIÿ þ$ÿÿþÕþÖÿÿþ$þÚÿÿþÿ þVÿÿþ¡þ¢ÿÿþUþíÿÿþÿ þƒÿÿþwþxÿÿþþûÿÿþÿ þ¥ÿÿþTþTÿÿþ£þïÿÿþÿ þÃÿÿþ9þ:ÿÿþÁþÝÿÿþÿ þØÿÿþ#þ#ÿÿþÖþÉÿÿþHÿ þéÿÿþþÿÿþèþ—ÿÿþ~ÿ þõÿÿþ þ ÿÿþôþYÿÿþÑÿ þûÿÿþþÿÿþùýüÿÿþ:ÿ ÿþþÿÿþþþ©ÿÿýÎÿ þûÿÿþþÿÿþúþ5ÿÿþ•ÿ þõÿÿþþ ÿÿþôþ›ÿÿû£ÿÿ þêÿÿþþÿÿþèý Òÿÿüëˆ;ÿÿ þØÿÿþ"þ#ÿÿþÖ ýÕÿÿ þÃÿÿþ9þ:ÿÿþ ý¸ÿÿ þ¥ÿÿþSþTÿÿþ£ ýNÒÿ ÿþƒÿÿþwþxÿÿþ‚ ú4{»×ÿÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþM€2€L€Íþlÿÿý¬ÿÿú/d±÷ÿÿþüÿÿýöTÿÿüÑ-ÿÿõØeóß¹ƒ:êøéûòÝ´v&ÿûþ·-ÿÿýûwÿÿù=Œíÿÿý«ÿÿû ÿÿüÕÿýAÿþÖþþKþ!þþþþ þJþþÓý=ÿüÑÿû™ÿÿý¥ÿÿù;‰ëÿ ÿþèÿÿýÓ$ÿÿôð~ ìüòÖ¥^ þþJþ®þ$ú2LÍýêÿÿþ3 þ4ÿÿýéþ¼ÿÿþ€ÿÿýÂýÃÿÿþ~þpÿÿýëÿÿþþƒÿÿýë ý± þlÿÿþåþcÿÿý†ý‡ÿÿþb ûÿô‡ý¬ÿÿýù>þ«ÿÿ÷Öh%&j×ÿÿþ© ÿôú°i./d±÷ÿÿýüZý ÁÿÿýÀ ÿýöT ý ¦ÿ ÿý¥ÿýÑ- ýRØÿÿýØRü3˜ðÿ ÿüØeóD‘ÆêùùêÆ‘CóB†·ßñüóß¹ƒ:öô%n³ÓéûòÝ´v&þLÿÿý3¼ÿÿüþ·-ýåÿÿü“þÿ ÿýûwþ ÿÿý µÿÿþ—þJÿÿý²ÿÿöì‹==Œíÿÿþ€ýäÿÿþ¯ÿÿþtÿÿý¨ý«ÿÿþýþÿÿýïÿÿ ýúÿÿýœý ÿÿþGÿÿýdÿÿ þÿÿýÑ ýÕÿÿ ýâÿÿü½ÿÿ ýôÿÿþ> þAÿÿ þšÿÿûõ"ÿÿ þMÿÿþÓ üÖÿÿ þDÿÿþsÿ þŒÿÿþ üÿÿ ý àÿÿýÊÿ þÃÿÿþI üKÿÿ þ—ÿÿýú-ÿ þÚÿÿþ ü!ÿÿ ýAþÿÿþ‚ÿ þíÿÿþ üÿÿý ÞÿÿýÕÿ þûÿÿþ üÿÿþ”ÿÿýý8ÿ þïÿÿþ üÿÿý?þÿÿþ‘ÿ þÝÿÿþ ü ÿÿý Üÿÿýß ÿ þÉÿÿþH üJÿÿþ‘ÿÿþFÿ þ—ÿÿþ~ üÿÿý<ýÿÿþ ÿ þYÿÿþÑ üÓÿÿý Úÿÿýèÿ ýüÿÿþ: þ=ÿÿþŽÿÿþTÿ þ©ÿÿýÎ ýÑÿÿý9ýÿÿþ¯ ÿ þ5ÿÿþ•ý™ÿÿýØÿÿýï ÿþ›ÿÿý£ý¥ÿÿþ‹ÿÿþc ÿý Òÿÿöëˆ;;‰ëÿÿýÞÿý7üÿÿþ½ ÿýÕÿÿüèDÿþÖÿÿýõ" ÿý¸ÿ ÿûÓ$8ÿÿþr ÿýNÒÿÿùð~ Sÿÿ ó4{»×ìüòÖ¥^ ý‚ÿÿý»ÿÿüñÿÿþJÿÿ2LÍýþ2þpÿÿýÒ ý×ÿÿþoÿþ¡ þ)ÿÿþc þlÿÿþ)ÿþ þ·ÿÿý÷= ýFúÿÿþ¶ÿ ý2þÿÿüùpüxûÿÿýþ1ÿ þyÿÿõâ‚C E…æÿÿþx ÿþ”ÿÿþ“ ÿý_òÿÿýò_ ÿüŠíÿ ÿüíŠ ÿñ Jƒ¹×èøøè×¹ƒJ òóÿþŸþÆÿÿþ þ‡ÿÿþÃÿþ¿ý*óÿÿýý •ÿÿýñ'ÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>ÿþç ý&ÃÿÿýÂ$ÿþô üD¦þÿÿüþ¥Cÿþù ü'›íÿ ÿüí›'ÿþþ üüÿÿüü‘ÿþøý ÆÿÿõãƒD E„äÿÿýÆ ÿþðý¼ÿÿüùqütúÿÿý¼ÿþßþpÿÿýø= ý@ùÿÿþoÿþÇý ïÿÿþc þfÿÿýî ÿþ©þaÿÿýÓ ýÔÿÿþaÿþþ§ÿÿþsþuÿÿþ¦ÿþPþÚÿÿþ1þ3ÿÿþÙÿþþñÿÿþþÿÿþðÿþÐþûÿÿþþÿÿþúÿþ|þêÿÿþþÿÿþéÿ2LÍþÿ#ÿþÿ#ÿþÿ#ÿ ý¼5þÿ#ÿ ÿü´U  ÿÿ ÿûò¯}Kÿÿÿ ÿÿ ÿÿ û'vÃúÿÿ:ú ?vŸÃ×ð.e’¶ØêöúëÜÁ[û@vÿû$lµóÿ ÿüø¨6û [ªñÿÿÿüý• ü2—ñÿÿÿýÏ ÿÿóÞg5 5g·üÿÿýÔ ÿýâÿÿüå‡4 ý'Àÿÿþ ÿúþµDÿüÉZ ý«ÿÿýü!ÿý¼3þÿ$ý ãÿÿþwüÿæVþÿ%þtÿÿþÁý¨þÿ%þ,ÿÿþàþÿ%þÿÿþøþÿ%þ ÿÿþòþÿ%þ#ÿÿþØþÿ%þeÿÿþ¡þÿ$ýÑÿÿþJþÿ$þ‹ÿÿýÏþÿ"ý¢ÿÿýö1þÿù*Z¢ôÿÿýôIþÿ ÿýÅ*þÿ ÿý¬Eþÿ ÿüö¯>þÿÿý±þÿù 4i®ûÿÿýàþÿ"ý¦ÿÿý× þÿ$ýcþÿÿþþÿ%þzÿÿýøþÿ%ýØÿÿþsþÿ&þwÿÿþ³þÿ&þ0ÿÿþàþÿ&þÿÿþôýÿ&þÿÿþû ü³ÿ&þÿÿþî ý®ÿ2LÍ ý çÿÿþYþ(ÿÿþ,þ–ÿÿýï þ‰ÿÿþËý†ÿÿþzýæÿÿþjý5ÅÿÿýÑþKÿÿý÷ö($OÒÿÿýåþ¬ÿÿþ§ ÿýÒ!ýùÿÿþF ÿüø}þnÿÿýã ÿüàþÏÿÿþ„ôáïúøêÛÉj5ôõ©Óæùóâѧn24 ÿüÏdþLÿÿ ÿýÒ0ýåÿÿ ÿýú]þ ÿÿ ö“R% 9xÚÿÿýüTþJÿÿüeõÿÿý÷!ýäÿÿþ¯ÿÿý0ðÿÿþ±þÿÿýïÿÿþIÿÿþ*þGÿÿýdÿÿþµÿÿþzýâÿÿü½ÿÿþXÿÿþ¿þšÿÿûõ"ÿÿþÿÿþÜþDÿÿþsÿþÿÿþôý àÿÿýÊÿþ ÿÿþôþ—ÿÿýú-ÿþ4ÿÿþßýAþÿÿþ‚ÿþyÿÿþÅý ÞÿÿýÕÿýÚÿÿþ‰þ”ÿÿýý8ÿþ\ÿÿþF ý?þÿÿþ‘ÿýåÿÿýæ ý Üÿÿýß ÿþ¨ÿÿþr þ‘ÿÿþFÿþkÿÿýÛ ý<ýÿÿþ ÿýBúÿÿýþ? ý Úÿÿýèÿý)îÿÿþ† þŽÿÿþTÿýâÿÿý¼ ý9ýÿÿþ¯ ÿýÙÿÿýË ýØÿÿýï ÿýÒÿÿýÓ þ‹ÿÿþc ÿýËÿÿýÚ ý7üÿÿþ½ ÿý ÆÿÿýàþÖÿÿýõ" ÿ ý Áÿÿýä"ÿþr ÿ ý¼ÿÿýè'ÿþ¸ÿÿýì,ÿÿýï1ÿÿýó8ÿ2LÍüêÿÿþ3 þ4ÿÿýéýÝÿÿþ+ þ,ÿÿúô€ÿÿýÂýÃÿÿþ~ þjÿÿþ» þ¼ÿÿþýëÿÿþþƒÿÿýë ýÛÿÿþuþvÿÿýúþcÿÿý†ý‡ÿÿþb ýEþÿÿý~ýÿÿþsþ«ÿÿ÷Öh%&j×ÿÿþ©þ„ÿÿ÷Óm( (mÓÿÿþ±ý ÁÿÿýÀ ýšÿÿýµ ý ¦ÿ ÿý¥ýyüÿ ÿüþ” ýRØÿÿýØRý.¸ÿ ÿý¼4 óD‘ÆêùùêÆ‘Cô'xµÞôûêÔ´o&óô%n³ÓéûòÝ´v&ÿý3¼ÿÿüþ·-ÿ ü“þÿ ÿýûwÿþë ý µÿÿþ—ÿþ ý²ÿÿöì‹==Œíÿÿþ€þ)ÿÿþ/ þtÿÿý¨ý«ÿÿýýBþŠÿÿþÎ ýúÿÿýœý ÿÿýØýçÿÿþm þÿÿýÑ ýÕÿÿþfþLÿÿýø ýôÿÿþ> þAÿÿýÚþ­ÿÿþª þMÿÿþÓ þÖÿÿþ=ýúÿÿþI þŒÿÿþ þÿÿþ•þoÿÿýå þÃÿÿþI þKÿÿþÜþÐÿÿþ‡ þÚÿÿþ þ!ÿÿþþ1ÿÿþ& þíÿÿþ þÿÿþOþ’ÿÿþÄ þûÿÿþ þÿÿþ} ýìÿÿþc þïÿÿþ þÿÿþŸ þTÿÿýõ þÝÿÿþ þ ÿÿþ¿ þ¶ÿÿþ¡ þÉÿÿþH þJÿÿþÔ ýüÿÿþ? þ—ÿÿþ~ þÿÿþç þxÿÿýÝ þYÿÿþÑ þÓÿÿþô þØÿÿþ}ýüÿÿþ: þ=ÿÿþù þ:ÿÿýýþ©ÿÿýÎ ýÑÿÿþþ þ›ÿÿþ»þ5ÿÿþ•ý™ÿÿþø ý ñÿÿþYþ›ÿÿý£ý¥ÿÿþð þ]ÿÿýïý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß þ¾ÿÿþ—ýÕÿÿýèDÿÿþÇ ý þÿÿþ6ý¸ÿ ÿüÓ$8ÿÿþ© þ€ÿÿþÔýNÒÿÿúð~ Sÿÿþýßÿÿþsó4{»×ìüòÖ¥^ þ‚ÿÿþPþCÿÿýû'þ»ÿÿþþ¤ÿÿþ±'ýñÿÿþÐýöÿÿþP'þJÿÿþ|2LÍþeÿÿþ ýêÿÿþ3ýž ý*ñÿÿþ¶ þ€ÿÿýÂþüÿÚB ý+ßÿÿýý6 ýëÿÿþþƒÿýµ>ülôÿÿþ þcÿÿý†ü‡ÿÿôàšV0"NŽæÿÿýºþ«ÿÿõÖh%&j×ÿÿÿý§ ý Áÿ ÿÿýóaý ¦ÿ ÿû)zÊýÿ ÿüãyýRØÿÿþØ ðI¨ÍæóüñàÏ«r8óD‘ÆêùùêÆ‘CÏóþþÆÿÿþ þ‡ÿÿþÃþ‹ý*óÿÿýý •ÿÿýñ'ü¢ÿ ýBòÿÿõç…CFŠëÿÿýñ>÷*Z¢ôÿÿ ý&ÃÿÿýÂ$ ÿ üD¦þÿÿüþ¥C ÿþ¬ ü'›íÿ ÿüí›' ÿþö üüÿÿüü‘ ÿ ý ÆÿÿõãƒD E„äÿÿýÆ ÷ 4i®ûÿÿý¼ÿÿüùqütúÿÿý¼ü¦ÿþpÿÿýø= ý@ùÿÿþoþcý ïÿÿþc þfÿÿýî "þaÿÿýÓ ýÔÿÿþa"þ§ÿÿþsþuÿÿþ¦"þÚÿÿþ1þ3ÿÿþÙ"þñÿÿþþÿÿþð"þûÿÿþþÿÿþú"þêÿÿþþÿÿþé2LÍþ4ÿÿýéþeÿÿþþpÿÿýÒþÃÿÿþ~ýž ý*ñÿÿþ¶ þ)ÿÿþcÿýëüÿÚB ý+ßÿÿýý6 þ·ÿÿý÷=ÿþb ÿýµ>ülôÿÿþ ý2þÿÿúùpÿÿþ© ÿôàšV0"NŽæÿÿýº þyÿÿøâ‚CÿÿÀ ÿý§ þ”ÿÿý¥ ÿýóaý_òÿÿþR û)zÊýÿ ÿüãyüŠíÿÿðI¨ÍæóüñàÏ«r8ú Jƒ¹×Ôò@v©Óæùóâѧn2þ6û [ªñÿ ÿüÏdö%[Æ÷ý• ü2—ñÿÿýÒ0úO…ºïÿÿýÏ ÿýú] ÿýÔ ÿõâ“R% 9xÚÿÿýüT ÿþ ÿûþµDüeõÿÿý÷! ÿúæ³€Mÿÿýü!ÿý¼3 ý0ðÿÿþ± úæ³€MþãÿÿþwüÿæVþIÿÿþ*þtÿÿþÁý¨þµÿÿþzþ,ÿÿþàþXÿÿþ¿þÿÿþøþÿÿþÜþ ÿÿþòþÿÿþôþ#ÿÿþØþ ÿÿþôþeÿÿþ¡þ4ÿÿþßþÑÿÿþJþyÿÿþÅÿýÏýÚÿÿþ‰ÿýö1þ\ÿÿþFÿýôIýåÿÿýæüÿÅ*þ¨ÿÿþrþEþkÿÿýÛý¯>ýBúÿÿýþ?ÿý±ý)îÿÿþ†ÿýàýâÿÿý¼ÿý× ýÙÿÿýË þþÿÿþýÒÿÿýÓþzÿÿýøýËÿÿýÚýØÿÿþsý Æÿÿýàþwÿÿþ³ý Áÿÿýä"þ0ÿÿþàý¼ÿÿýè'þÿÿþôý¸ÿÿýì,þÿÿþû ý³ÿÿýï1 þÿÿþî ý®ÿÿýó8 2LÍý×ÿÿþoþ(ÿÿþ,ýþlÿÿþ)þ‰ÿÿþËý•ÿýFúÿÿþ¶ýæÿÿþjüÿÿüxûÿÿýþ1þKÿÿý÷þ…ÿÿø E…æÿÿþxþ¬ÿÿþ§ÿþ“ýùÿÿþF ÿýò_þnÿÿýã ÿüíŠþÏÿÿþ„ÿöèøøè×¹ƒJ 6ÿ!þLÿÿÿ ýåÿÿÿ þ ÿÿþ ÿÿþJÿÿý²ÿÿýäÿÿþ¯ÿÿþtÿÿþÿÿýïÿÿ ýúÿÿþGÿÿýdÿÿ þÿÿýâÿÿü½ÿÿ ýôÿÿþšÿÿûõ"ÿÿ þMÿÿþDÿÿþsÿ þŒÿÿý àÿÿýÊÿ þÃÿÿþ—ÿÿýú-ÿ þÚÿÿýAþÿÿþ‚ÿ þíÿÿý ÞÿÿýÕÿ þûÿÿþ”ÿÿýý8ÿ þïÿÿý?þÿÿþ‘ÿ þÝÿÿý Üÿÿýß ÿ þÉÿÿþ‘ÿÿþFÿ þ—ÿÿý<ýÿÿþ ÿ þYÿÿý Úÿÿýèÿ ýüÿÿþŽÿÿþTÿ þ©ÿÿý9ýÿÿþ¯ ÿ þ5ÿÿýØÿÿýï ÿþ›ÿÿþ‹ÿÿþc ÿý Òÿÿý7üÿÿþ½ ÿþÿÿþÖÿÿýõ" ÿÿÿþr ÿÿÿ ÿÿ ÿÿ ÿÿ 2LÍÿýúM+ý çÿÿþYÿýüU,þ–ÿÿýï ÿýþ^ý¼5ý†ÿÿþzÿþgÿü´U ý5ÅÿÿýÑÿþ8ÿòò¯}K($OÒÿÿýåÿþ8ÿýÒ!ÿþ8ÿüø}ÿþ8û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5Ðô%n³ÓéûòÝ´v&ð.e’¶ØêöúëÜÁ[ ý3¼ÿÿüþ·-û$lµóÿ ÿüø¨6 ü“þÿ ÿýûw ÿüý•þµÿÿþ— ÿýÏÿöì‹==Œíÿÿþ€ ÿóÞg5 5g·üÿÿýÔ ÿý¨ý«ÿÿýýB ÿüå‡4 ý'Àÿÿþÿýœý ÿÿýØ üÉZ ý«ÿÿýü!ÿýÑ ýÕÿÿþfý ãÿÿþwÿþ> þAÿÿýÚþtÿÿþÁýÿÓ þÖÿÿþ=þ,ÿÿþàýÿ þÿÿþ•þÿÿþøýÿI þKÿÿþÜþ ÿÿþòýÿ þ!ÿÿþþ#ÿÿþØýÿ þÿÿþOþeÿÿþ¡ýÿ þÿÿþ}ýÑÿÿþJýÿ þÿÿþŸþ‹ÿÿýÏýÿ þ ÿÿþ¿ý¢ÿÿýö1ýÿH þJÿÿþÔù*Z¢ôÿÿýôIýÿ~ þÿÿþç ÿýÅ*ýÿÑ þÓÿÿþô ÿý¬E ÿþ: þ=ÿÿþù ÿüö¯>ÿýÎ ýÑÿÿþþ ÿý±ÿþ•ý™ÿÿþøù 4i®ûÿÿýàÿý£ý¥ÿÿþðý¦ÿÿý× ÿöëˆ;;‰ëÿÿþÞÿÿþßýcþÿÿþþÕÿÿýèDÿÿþÇþzÿÿýøý¸ÿ ÿüÓ$8ÿÿþ©ýØÿÿþsýNÒÿÿúð~ Sÿÿþþwÿÿþ³ó4{»×ìüòÖ¥^ þ‚ÿÿþPþ0ÿÿþàþ»ÿÿþþÿÿþôýñÿÿþÐþÿÿþûþJÿÿþ|þÿÿþî2LÍýêÿÿþ3 þ4ÿÿýéþpÿÿýÒ ü×ÿþ€ÿÿýÂýÃÿÿþ~þ)ÿÿþc ülÿÿýëÿÿþþƒÿÿýë þ·ÿÿý÷= ûFúÿÿþcÿÿý†ý‡ÿÿþb ý2þÿÿüùpüxûÿÿþ«ÿÿ÷Öh%&j×ÿÿþ© þyÿÿõâ‚C E…æÿÿý ÁÿÿýÀ þ”ÿÿý ¦ÿ ÿý¥ý_òÿÿýò_ ýRØÿÿýØRüŠíÿ ÿüíŠ óD‘ÆêùùêÆ‘Cñ Jƒ¹×èøøè×¹ƒJ ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿôn«×òüïÛÇ”Sÿôn«×òüïÛÇ”S ÿüù›#ÿüù›#ÿüü~ÿüü~ÿý³ ÿý³ ÿóúÁ}P' !IŠàÿÿý´ ÿóúÁ}P' !IŠàÿÿý´üÍhüfñÿÿþŠ üÍhüfñÿÿþŠý'Ûÿÿýý*ý'Ûÿÿþýý&ïÿÿþªý&ïÿÿþ`ÿÿýþþ`ÿÿýÛÿÿþ_ýÛÿÿþ…ÿÿþ£þ…ÿÿþBÿÿþÍþBÿÿþÿÿþáþÿÿþ ÿÿþõþ ÿÿþ ÿÿþúþ ÿÿþÿÿþîþÿÿþCÿÿþÒþCÿÿ2LÍÿþoþ(ÿÿþ,#ÿþ)þ‰ÿÿþË$ÿþ¶ýæÿÿþj$üÿþ1þKÿÿý÷$ýÿxþ¬ÿÿþ§%þ“ýùÿÿþF7þnÿÿýã7þÏÿÿþ„;óBÄéùùéÄB÷þ&ÿÿþå ÿþMÿÿþÓþ ÿÿþù ÿþŒÿÿþþ ÿÿþï ÿþÃÿÿþIþ%ÿÿþÒ ÿþÚÿÿþþgÿÿþ™ ÿþíÿÿþýÔÿÿþ> ÿþûÿÿþþ‡ÿÿþà ÿôn«×òüïÛÇ”Sþïÿÿþý •ÿÿýñ' ÿüù›#þÝÿÿùFŠëÿÿýñ> ÿüü~ þÉÿÿüHÿÿýÂ$ ÿý³ þ—ÿÿü~ÿÿüþ¥CÿóúÁ}P' !IŠàÿÿý´ þYÿÿüÑÿÿüí›' üÍhüfñÿÿþŠ ýüÿÿý:ÿÿüü‘ý'Ûÿÿýý* þ©ÿÿúÎE„äÿÿýÆ ý&ïÿÿþª þ5ÿÿù•túÿÿý¼þ`ÿÿýþ þ›ÿÿý@ùÿÿþoýÛÿÿþ_ ý Òÿÿþfÿÿýî þ…ÿÿþ£ ýÕÿÿýÔÿÿþaþBÿÿþÍ û¸ÿÿþuÿÿþ¦þÿÿþáýNÒþ3ÿÿþÙþ ÿÿþõþþÿÿþðþ ÿÿþúþÿÿþúþÿÿþîþÿÿþéþCÿÿþÒ2LÍÿþpÿÿýÒ ý×ÿÿþo ÿþ)ÿÿþc þlÿÿþ) ÿþ·ÿÿý÷= ýFúÿÿþ¶ ÿý2þÿÿüùpüxûÿÿýþ1ÿ þyÿÿõâ‚C E…æÿÿþxÿ þ”ÿÿþ“ ÿ ý_òÿÿýò_ ÿüŠíÿ ÿüíŠ.ñ Jƒ¹×èøøè×¹ƒJ Îô%n³ÓéûòÝ´v&ð.e’¶ØêöúëÜÁ[ ÿüþ·-û$lµóÿ ÿüø¨6 ÿýûw ÿüý• ÿþ— ÿýÏ õÿì‹==Œíÿÿþ€ ÿóÞg5 5g·üÿÿýÔ ý¨ý«ÿÿýýB ÿüå‡4 ý'Àÿÿþ þý ÿÿýØ üÉZ ý«ÿÿýü!ýÕÿÿþfý ãÿÿþwþAÿÿýÚþtÿÿþÁþÖÿÿþ=þ,ÿÿþàþÿÿþ•þÿÿþøþKÿÿþÜþ ÿÿþòþ!ÿÿþþ#ÿÿþØþÿÿþOþeÿÿþ¡þÿÿþ}ýÑÿÿþJþÿÿþŸþ‹ÿÿýÏþ ÿÿþ¿ý¢ÿÿýö1þJÿÿþÔù*Z¢ôÿÿýôIþÿÿþç ÿýÅ*þÓÿÿþô ÿý¬Eþ=ÿÿþù ÿüö¯>ýÑÿÿþþ ÿý±ý™ÿÿþøù 4i®ûÿÿýà ý£ý¥ÿÿþðý¦ÿÿý× õÿëˆ;;‰ëÿÿþÞÿÿþßýcþÿÿþ ÿýèDÿÿþÇþzÿÿýø ÿüÓ$8ÿÿþ©ýØÿÿþs ÿúð~ Sÿÿþþwÿÿþ³ô4{»×ìüòÖ¥^ þ‚ÿÿþPþ0ÿÿþàþ»ÿÿþþÿÿþôýñÿÿþÐþÿÿþûþJÿÿþ|þÿÿþî2LÍý çÿÿþYþ(ÿÿþ,þ–ÿÿýï þ‰ÿÿþË ý¼5ý†ÿÿþzýæÿÿþj ÿü´U ý5ÅÿÿýÑþKÿÿý÷ ÿòò¯}K($OÒÿÿýåþ¬ÿÿþ§ ÿýÒ!ýùÿÿþF ÿüø}þnÿÿýã û'vÃúÿ ÿüàþÏÿÿþ„ï ?vŸÃáïúøêÛÉj5ôó þAÿÿúÚæÿÿþ$ þ&ÿÿþåþMÿÿþÓ þÖÿÿû=úÿÿþ þ ÿÿþùþŒÿÿþ þÿÿû•ðÿÿþ þ ÿÿþïþÃÿÿþI þKÿÿûÜÓÿÿþ$ þ%ÿÿþÒþÚÿÿþ þ!ÿÿüšÿÿþe þgÿÿþ™þíÿÿþ þÿÿüOAÿÿýÑ ýÔÿÿþ>þûÿÿþ þÿÿû}Æÿÿþ þ‡ÿÿþÃþïÿÿþ þÿÿúŸ*óÿÿýý •ÿÿýñ'þÝÿÿþ þ ÿÿþ¿ýBòÿÿõç…CFŠëÿÿýñ> þÉÿÿþH þJÿÿþÔý&ÃÿÿýÂ$ þ—ÿÿþ~ þÿÿþçüD¦þÿÿüþ¥C þYÿÿþÑ þÓÿÿþôü'›íÿ ÿüí›' ýüÿÿþ: þ=ÿÿþùüüÿÿüü‘ þ©ÿÿýÎ ýÑÿÿúþ ÆÿÿõãƒD E„äÿÿýÆ þ5ÿÿþ•ý™ÿÿûø¼ÿÿüùqütúÿÿý¼ þ›ÿÿý£ý¥ÿÿüðpÿÿýø= ý@ùÿÿþo ý Òÿÿöëˆ;;‰ëÿÿþÞÿÿüß ïÿÿþc þfÿÿýî ýÕÿÿýèDÿÿýÇaÿÿýÓ ýÔÿÿþa ý¸ÿ ÿüÓ$8ÿÿý©§ÿÿþsþuÿÿþ¦ ýNÒÿÿúð~ SÿÿýÚÿÿþ1þ3ÿÿþÙ ó4{»×ìüòÖ¥^ þ‚ÿÿýPñÿÿþþÿÿþðþ»ÿÿýûÿÿþþÿÿþúýñÿÿüÐêÿÿþþÿÿþéþJÿÿþ|2LÍÿ ýêÿÿþ3$ÿþ€ÿÿýÂþÿýëÿÿþþƒÿþcÿÿý†ü‡ÿÿþ«ÿÿõÖh%&j×ÿÿÿý Áÿ ÿÿý ¦ÿ ÿÿýRØÿÿþØ2óD‘ÆêùùêÆ‘CÏóBÄéùùéÄB1ýP×ÿÿý×Pÿ ý£ÿ ÿý¢ ÿ ý¾ÿÿý½ ÿ þ§ÿÿ÷Öi& (kØÿÿþ¦ ÿ þ`ÿÿý‡ýˆÿÿþ_ ÿýêÿÿþþ„ÿÿýé ÿþ~ÿÿýÂýÄÿÿþ| ÿýéÿÿþ3 þ4ÿÿýè ÿþNÿÿþÀ þÀÿÿþL ÿþ¢ÿÿþb þcÿÿþ¡ ÿþæÿÿýþ þÿÿþå ÿþ$ÿÿþÕþÖÿÿþ$ÿþVÿÿþ¡þ¢ÿÿþUÿþƒÿÿþwþxÿÿþÿþ¥ÿÿþTþTÿÿþ£ÿôn«×òüïÛÇ”SþÃÿÿþ9þ:ÿÿþÁÿüù›#þØÿÿþ#þ#ÿÿþÖÿþüþéÿÿþþÿÿþèÿþõÿÿþ þ ÿÿþôÿóúÁ}P' !IŠàÿÿþûÿÿþþÿÿþùüÍhúfñÿÿÿþþÿÿþþü'Ûÿþûÿÿþþÿÿþúý&ïþõÿÿþþ ÿÿþôþ`þêÿÿþþÿÿþèþþØÿÿþ"þ#ÿÿþÖ"þÃÿÿþ9þ:ÿÿþÂ"þ¥ÿÿþSþTÿÿþ£"þƒÿÿþwþxÿÿþ‚"þWÿÿþ¡þ¢ÿÿþU"þ%ÿÿþÕþÕÿÿþ$#þæÿÿýþ ýþÿÿþæ2LÍþ4ÿÿýéþ¼ÿÿýþ2þpÿÿýÒþÃÿÿþ~þpÿÿþ¡ þ)ÿÿþcÿýë ý± þlÿÿýå þ·ÿÿý÷=ÿþb ûÿô‡ý¬ÿÿýù> ý2þÿÿúùpÿÿþ© ÿôú°i./d±÷ÿÿýüZ þyÿÿøâ‚CÿÿÀ ÿýöTþ”ÿÿý¥ÿýÑ-ý_òÿÿþRü3˜ðÿ ÿüØeüŠíÿÿóB†·ßñüóß¹ƒ:ú Jƒ¹××óþæÿÿþ$ þ&ÿÿþåþMÿÿþÓþúÿÿþ þ ÿÿþùþŒÿÿþþðÿÿþ þ ÿÿþïþÃÿÿþIþÓÿÿþ$ þ%ÿÿþÒþÚÿÿþþšÿÿþe þgÿÿþ™þíÿÿþþAÿÿýÑ ýÔÿÿþ>þûÿÿþþÆÿÿþ þ‡ÿÿþÃþïÿÿþý*óÿÿýý •ÿÿýñ'þÝÿÿþý~ýBòÿÿõç…CFŠëÿÿýñ> þÉÿÿþHüÿ³ ý&ÃÿÿýÂ$ þ—ÿÿþ~ÿý´üD¦þÿÿüþ¥C þYÿÿþÑÿþŠü'›íÿ ÿüí›' ýüÿÿþ:ÿýý* üüÿÿüü‘ þ©ÿÿýÎÿþª ý ÆÿÿõãƒD E„äÿÿýÆ þ5ÿÿþ•ÿýþ ý¼ÿÿüùqütúÿÿý¼ þ›ÿÿú£Ûÿÿþ_ þpÿÿýø= ý@ùÿÿþo ý Òÿÿûëˆ;…ÿÿþ£ý ïÿÿþc þfÿÿýî ýÕÿÿþBÿÿþÍþaÿÿýÓ ýÔÿÿþa ý¸ÿÿþÿÿþáþ§ÿÿþsþuÿÿþ¦ ýNÒÿÿþ ÿÿþõþÚÿÿþ1þ3ÿÿþÙ ù4{»× ÿÿþúþñÿÿþþÿÿþðþÿÿþîþûÿÿþþÿÿþúþCÿÿþÒþêÿÿþþÿÿþé2LÍý×ÿÿþoý çÿÿþYþlÿÿþ)þ–ÿÿýï ýFúÿÿþ¶ý¼5ý†ÿÿþzüxûÿÿýþ1ÿü´U ý5ÅÿÿýÑ ø E…æÿÿþxÿòò¯}K($OÒÿÿýå ÿþ“ ÿýÒ! ÿýò_ ÿüø}ÿüíŠ û'vÃúÿ ÿüàõÿèøøè×¹ƒJ ï ?vŸÃáïúøêÛÉj5ÔøéûòÝ´v&7ÿüþ·- ÿ ÿýûw ÿ ÿþ— ÿþë ù=Œíÿÿþ€ ÿþý«ÿÿýýBþ)ÿÿþ/ý ÿÿýØþŠÿÿþÎýÕÿÿþfýçÿÿþmþAÿÿýÚþLÿÿýøþÖÿÿþ=þ­ÿÿþªþÿÿþ•ýúÿÿþIþKÿÿþÜþoÿÿýåþ!ÿÿþþÐÿÿþ‡þÿÿþOþ1ÿÿþ&þÿÿþ}þ’ÿÿþÄþÿÿþŸýìÿÿþcþ ÿÿþ¿þTÿÿýõ þJÿÿþÔþ¶ÿÿþ¡þÿÿþçýüÿÿþ?þÓÿÿþôþxÿÿýÝþ<þ=ÿÿþùþØÿÿþ}ý ÚýÑÿÿþþþ:ÿÿýýýŽÿý™ÿÿþøþ›ÿÿþ»ü9ýÿý¥ÿÿþðý ñÿÿþYõØÿÿ;‰ëÿÿþÞÿÿþßþ]ÿÿýïþ‹ÿ ÿýèDÿÿþÇþ¾ÿÿþ—ý7üÿ ÿüÓ$8ÿÿþ©ý þÿÿþ6þÖÿÿþõÿÿúð~ Sÿÿþþ€ÿÿþÔÿ÷rìüòÖ¥^ þ‚ÿÿþPýßÿÿþsÿ þ»ÿÿþþCÿÿýûÿýñÿÿþÐþ¤ÿÿþ±ÿþJÿÿþ|ýöÿÿþPÿ2LÍÿýÿÿýúMÿþ•ÿÿýüUÿþÿÿýþ^ÿþ…ÿÿþgÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8(ð.e’¶ØêöúëÜÁ[þLÿÿ û$lµóÿ ÿüø¨6ýåÿÿ ÿüý•þ ÿÿ ÿýÏþJÿÿ ÿóÞg5 5g·üÿÿýÔ ýäÿÿþ¯ÿÿ ÿüå‡4 ý'Àÿÿþ þÿÿýïÿÿ üÉZ ý«ÿÿýü! þGÿÿýdÿÿý ãÿÿþw ýâÿÿü½ÿÿ þtÿÿþÁ þšÿÿûõ"ÿÿ þ,ÿÿþà þDÿÿþsÿ þÿÿþøý àÿÿýÊÿ þ ÿÿþòþ—ÿÿýú-ÿ þ#ÿÿþØýAþÿÿþ‚ÿ þeÿÿþ¡ý ÞÿÿýÕÿýÑÿÿþJþ”ÿÿýý8ÿþ‹ÿÿýÏý?þÿÿþ‘ÿý¢ÿÿýö1ý Üÿÿýß ÿù*Z¢ôÿÿýôIþ‘ÿÿþFÿ ÿýÅ*þýÿÿþ ÿ ÿý¬E ÿýèÿ ÿüö¯>ÿþTÿÿý±ÿþ¯ ÿù 4i®ûÿÿýàüÿï ÿý¦ÿÿý× ýÿc ÿýcþÿÿþþ½ ÿ þzÿÿýøþ" ÿ ýØÿÿþsÿ!þwÿÿþ³ÿþ0ÿÿþàÿþÿÿþôÿþÿÿþûÿþÿÿþî2LÍ þ(ÿÿþ,%ÿ þ‰ÿÿþË&ÿ ýæÿÿþj&ÿ þKÿÿý÷&ÿ þ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ þnÿÿýã'ÿ þÏÿÿþ„(ÿ óþ’ÿÿþÄþÆÿÿþ þ‡ÿÿþÃýìÿÿþcý*óÿÿýý •ÿÿýñ'þTÿÿýõ ýBòÿÿõç…CFŠëÿÿýñ>þ¶ÿÿþ¡ ý&ÃÿÿýÂ$ýüÿÿþ? üD¦þÿÿüþ¥CþxÿÿýÝ ü'›íÿ ÿüí›'þØÿÿþ} üüÿÿüü‘þ:ÿÿýýý ÆÿÿõãƒD E„äÿÿýÆ þ›ÿÿþ»ý¼ÿÿüùqütúÿÿý¼ý ñÿÿþYþpÿÿýø= ý@ùÿÿþoþ]ÿÿýïý ïÿÿþc þfÿÿýî þ¾ÿÿþ—þaÿÿýÓ ýÔÿÿþaý þÿÿþ6þ§ÿÿþsþuÿÿþ¦þ€ÿÿþÔ þÚÿÿþ1þ3ÿÿþÙýßÿÿþs þñÿÿþþÿÿþðþCÿÿýû þûÿÿþþÿÿþúþ¤ÿÿþ± þêÿÿþþÿÿþéýöÿÿþP2LÍ ýêÿÿþ3 þ4ÿÿýéþpÿÿýÒþ€ÿÿýÂýÃÿÿþ~þ)ÿÿþcýëÿÿþþƒÿÿýë þ·ÿÿý÷=þcÿÿý†ý‡ÿÿþb ý2þÿÿüùpþ«ÿÿ÷Öh%&j×ÿÿþ© þyÿÿøâ‚C ý ÁÿÿýÀ þ”ÿ ÿý ¦ÿ ÿý¥ý_òÿÿýRØÿÿýØRüŠíÿÿóD‘ÆêùùêÆ‘Cö Jƒ¹×èøøèÿÿþLÿÿù%[Æ÷ÿÿýåÿÿúO…ºïÿÿþëþ ÿÿÿþþJÿÿÿþ/ýäÿÿþ¯ÿÿÿúæ³€MÿÿþÎþÿÿýïÿÿúæ³€MÿþmþGÿÿýdÿÿÿþýâÿÿü½ÿÿÿþšÿÿûõ"ÿÿÿþDÿÿþsÿÿý àÿÿýÊÿÿþ—ÿÿýú-ÿÿýAþÿÿþ‚ÿÿý ÞÿÿýÕÿÿþ”ÿÿýý8ÿÿý?þÿÿþ‘ÿÿý Üÿÿýß ÿÿþ‘ÿÿþFÿÿý<ýÿÿþ ÿÿ ý Úÿÿýèÿÿ þŽÿÿþTÿÿ ý9ýÿÿþ¯ ÿÿ ýØÿÿýï ÿÿ þ‹ÿÿþc ÿÿ ý7üÿÿþ½ ÿÿ þÖÿÿýõ" ÿÿ ÿþr ÿÿ ÿÿ ÿÿ ÿÿ ÿÿ2LÍý×ÿÿþoþ¼ÿÿýþ2þlÿÿþ)þpÿÿþ¡ýFúÿÿþ¶ ý± þlÿÿýåùxûÿÿýþ1 ûÿô‡ý¬ÿÿýù>ûKE…æÿÿþx ÿôú°i./d±÷ÿÿýüZþ¬ÿÿþ“ ÿýöTýùÿÿýò_ ÿýÑ-þnÿÿüíŠü3˜ðÿ ÿüØeøÏÿ×¹ƒJ óB†·ßñüóß¹ƒ:öóBÄéùùéÄBþÿýP×ÿÿý×Pü3¼ÿý£ÿ ÿý¢ú“þÿÿý¾ÿÿý½ ý µÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿþ`ÿÿý‡ýˆÿÿþ_ þtÿÿýêÿÿþþ„ÿÿýé ýúÿÿýœÿþ~ÿÿýÂýÄÿÿþ| þÿÿüÑÿýéÿÿþ3 þ4ÿÿýèýôÿÿü>ÿþNÿÿþÀ þÀÿÿþLþMÿÿûÓÿþ¢ÿÿþb þcÿÿþ¡þŒÿÿûÿþæÿÿýþ þÿÿþåþÃÿÿûIÿþ$ÿÿþÕþÖÿÿþ$þÚÿÿûÿþVÿÿþ¡þ¢ÿÿþUþíÿÿûÿþƒÿÿþwþxÿÿþþûÿÿûÿþ¥ÿÿþTþTÿÿþ£þïÿÿûÿþÃÿÿþ9þ:ÿÿþÁþÝÿÿûÿþØÿÿþ#þ#ÿÿþÖþÉÿÿûHÿþéÿÿþþÿÿþèþ—ÿÿû~ÿþõÿÿþ þ ÿÿþôþYÿÿûÑÿþûÿÿþþÿÿþùýüÿÿü:ÿÿþþÿÿþþþ©ÿÿüÎÿþûÿÿþþÿÿþúþ5ÿÿý•ÿþõÿÿþþ ÿÿþôþ›ÿÿþêÿÿþþÿÿþèý ÒÿÿþØÿÿþ"þ#ÿÿþÖ ýÕÿÿþÃÿÿþ9þ:ÿÿþ ý¸ÿÿþ¥ÿÿþSþTÿÿþ£ üNÒÿþƒÿÿþwþxÿÿþ‚ ýÿþWÿÿþ¡þ¢ÿÿþUþÿþ%ÿÿþÕþÕÿÿþ$þÿþæÿÿýþ ýþÿÿþæ2LÍþ(ÿÿþ,'ý çÿÿþYþ‰ÿÿþË(þ–ÿÿýï þæÿÿþjý¼5ý†ÿÿþzÿý÷ÿü´U ý5ÅÿÿýÑÿþ§ÿòò¯}K($OÒÿÿýå ÿþFÿýÒ! ÿýãÿüø} ÿþ„û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5Ðô%n³ÓéûòÝ´v&óþÿÿþŸþÆÿÿþ þ‡ÿÿþÃþ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþç ý&ÃÿÿýÂ$þÓÿÿþô üD¦þÿÿüþ¥Cþ=ÿÿþù ü'›íÿ ÿüí›'ýÑÿÿþþ üüÿÿüü‘ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ý£ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼õÿëˆ;;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþo ÿýèDÿÿþÇý ïÿÿþc þfÿÿýî  ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþa ÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ô4{»×ìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþé2LÍþeÿÿþ ýêÿÿþ3 þ4ÿÿúéž ý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿù~ÿÚB ý+ßÿÿýý6 ýëÿÿþþƒÿÿûëÿÿýµ>ülôÿÿþ þcÿÿý†ý‡ÿÿþbÿôàšV0"NŽæÿÿýºþ«ÿÿ÷Öh%&j×ÿÿþ©ÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥û)zÊýÿ ÿüãyýRØÿÿýØRðI¨ÍæóüñàÏ«r8óD‘ÆêùùêÆ‘Cïð.e’¶ØêöúëÜÁ[ÿ û$lµóÿ ÿüø¨6ÿ ÿüý•ÿþë ÿýÏÿþ ÿóÞg5 5g·üÿÿýÔ þ)ÿÿþ/ ÿüå‡4 ý'ÀÿÿþþŠÿÿþÎ üÉZ ý«ÿÿýü!ýçÿÿþmý ãÿÿþwþLÿÿýøþtÿÿþÁþ­ÿÿþªþ,ÿÿþàýúÿÿþIþÿÿþøþoÿÿýåþ ÿÿþòþÐÿÿþ‡þ#ÿÿþØþ1ÿÿþ&þeÿÿþ¡þ’ÿÿþÄýÑÿÿþJýìÿÿþcþ‹ÿÿýÏþTÿÿýõ ý¢ÿÿýö1þ¶ÿÿþ¡ù*Z¢ôÿÿýôIýüÿÿþ? ÿýÅ*þxÿÿýÝ ÿý¬EþØÿÿþ} ÿüö¯>þ:ÿÿýýÿý±þ›ÿÿþ»ù 4i®ûÿÿýà ý ñÿÿþY ý¦ÿÿý× þ]ÿÿýï"ýcþÿÿþ þ¾ÿÿþ—$þzÿÿýø ý þÿÿþ6$ýØÿÿþs þ€ÿÿþÔ&þwÿÿþ³ ýßÿÿþs&þ0ÿÿþà þCÿÿýû&þÿÿþô þ¤ÿÿþ±'þÿÿþûýöÿÿþP'þÿÿþî2LÍÿ$ÿÿ$ÿÿ$ÿÿ$ÿ ÿÿ ÿÿ ÿÿ ÿÿ ò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdþLÿÿü2—ñÿÿýÒ0ýåÿÿÿýú]þ ÿÿÿõâ“R% 9xÚÿÿýüTþJÿÿÿûþµDüeõÿÿý÷!ýäÿÿü¯ÿÿÿý¼3 ý0ðÿÿþ±þÿÿûïÿÿüÿæVþIÿÿþ*þGÿÿûdÿÿý¨þµÿÿþzýâÿÿú½ÿÿþXÿÿþ¿þšÿÿùõ"ÿÿþÿÿþÜþDÿÿþsÿþÿÿþôý àÿÿýÊÿþ ÿÿþôþ—ÿÿýú-ÿþ4ÿÿþßýAþÿÿþ‚ÿþyÿÿþÅý ÞÿÿýÕÿýÚÿÿþ‰þ”ÿÿýý8ÿþ\ÿÿþF ý?þÿÿþ‘ÿýåÿÿýæ ý Üÿÿýß ÿþ¨ÿÿþr þ‘ÿÿþFÿþkÿÿýÛ ý<ýÿÿþ ÿýBúÿÿýþ? ý Úÿÿýèÿý)îÿÿþ† þŽÿÿþTÿýâÿÿý¼ ý9ýÿÿþ¯ ÿýÙÿÿýË ýØÿÿýï ÿýÒÿÿýÓ þ‹ÿÿþc ÿýËÿÿýÚ ý7üÿÿþ½ ÿý ÆÿÿýàþÖÿÿýõ" ÿý Áÿÿýä"ÿþr ÿý¼ÿÿýè'ÿý¸ÿÿýì,ÿ ý³ÿÿýï1ÿ ý®ÿÿýó8ÿ2LÍÿþ(ÿÿþ,ÿþ‰ÿÿþËýž ÿýæÿÿþjüÿÚBÿþKÿÿý÷ÿýµ>ÿþ¬ÿÿþ§ÿøàšV0ÿÿýùÿÿþFÿþnÿÿýãÿþÏÿÿþ„û)zÊýÿÿ6öI¨Íæóüñ×óBÄéùùéÄBû%n³ÓÿÿýP×ÿÿý×Pý3¼ÿÿý£ÿ ÿý¢ü“þÿÿý¾ÿÿý½ ý µÿÿþ§ÿÿ÷Öi& (kØÿÿþ¦ ý²ÿÿüì‹=ÿÿþ`ÿÿý‡ýˆÿÿþ_ þtÿÿû¨ÿÿýêÿÿþþ„ÿÿýé ýúÿÿýœÿþ~ÿÿýÂýÄÿÿþ| þÿÿýÑÿ ýéÿÿþ3 þ4ÿÿýèýôÿÿþ>ÿ þNÿÿþÀ þÀÿÿþLþMÿÿþÓÿ þ¢ÿÿþb þcÿÿþ¡þŒÿÿþÿ þæÿÿýþ þÿÿþåþÃÿÿþIÿ þ$ÿÿþÕþÖÿÿþ$þÚÿÿþÿ þVÿÿþ¡þ¢ÿÿþUþíÿÿþÿ þƒÿÿþwþxÿÿþþûÿÿþÿ þ¥ÿÿþTþTÿÿþ£þïÿÿþÿ þÃÿÿþ9þ:ÿÿþÁþÝÿÿþÿ þØÿÿþ#þ#ÿÿþÖþÉÿÿþHÿ þéÿÿþþÿÿþèþ—ÿÿþ~ÿ þõÿÿþ þ ÿÿþôþYÿÿþÑÿ þûÿÿþþÿÿþùýüÿÿþ:ÿ ÿþþÿÿþþþ©ÿÿýÎÿ þûÿÿþþÿÿþúþ5ÿÿþ•ÿ þõÿÿþþ ÿÿþôþ›ÿÿû£ÿÿ þêÿÿþþÿÿþèý Òÿÿüëˆ;ÿÿ þØÿÿþ"þ#ÿÿþÖ ýÕÿÿ þÃÿÿþ9þ:ÿÿþ ý¸ÿÿ þ¥ÿÿþSþTÿÿþ£ ýNÒÿ ÿþƒÿÿþwþxÿÿþ‚ ú4{»×ÿÿþWÿÿþ¡þ¢ÿÿþUÿþ%ÿÿþÕþÕÿÿþ$ÿþæÿÿýþ ýþÿÿþæ2LÍþeÿÿþ ýêÿÿþ3 þ4ÿÿýéý*ñÿÿþ¶ þ€ÿÿýÂýÃÿÿþ~ý+ßÿÿýý6 ýëÿÿþþƒÿÿýë þ±ülôÿÿþ þcÿÿý†ý‡ÿÿþb úÿ"NŽæÿÿýºþ«ÿÿ÷Öh%&j×ÿÿþ© ÿý§ ý ÁÿÿýÀ ÿýóaý ¦ÿ ÿý¥ÿüãyýRØÿÿýØRø3àÏ«r8óD‘ÆêùùêÆ‘CÓøéûòÝ´v&óþÿÿþŸþÆÿÿþ þ‡ÿÿþÃþ ÿÿþ¿ý*óÿÿýý •ÿÿýñ'þJÿÿþÔ ýBòÿÿõç…CFŠëÿÿýñ>þÿÿþç ý&ÃÿÿýÂ$þÓÿÿþô üD¦þÿÿüþ¥Cþ=ÿÿþù ü'›íÿ ÿüí›'ýÑÿÿþþ üüÿÿüü‘ý™ÿÿþøý ÆÿÿõãƒD E„äÿÿýÆ ý¥ÿÿþðý¼ÿÿüùqütúÿÿý¼ ù;‰ëÿÿþÞÿÿþßþpÿÿýø= ý@ùÿÿþo ÿýèDÿÿþÇý ïÿÿþc þfÿÿýî ÿüÓ$8ÿÿþ©þaÿÿýÓ ýÔÿÿþa ÿúð~ Sÿÿþþ§ÿÿþsþuÿÿþ¦ øìüòÖ¥^ þ‚ÿÿþPþÚÿÿþ1þ3ÿÿþÙþ»ÿÿþþñÿÿþþÿÿþðýñÿÿþÐþûÿÿþþÿÿþúþJÿÿþ|þêÿÿþþÿÿþé 2LÍþ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þ þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶üô‡ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1ÿôú°i./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþxÿýöTþ”ÿÿþ“ÿýÑ-ý_òÿÿýò_ý˜ðÿ ÿüØeüŠíÿ ÿüíŠóB†·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ îð.e’¶ØêöúëÜÁ[ ÿ û$lµóÿ ÿüø¨6 ÿ ÿüý•ÿþë ÿýÏÿþ ÿóÞg5 5g·üÿÿýÔ þ)ÿÿþ/ ÿüå‡4 ý'ÀÿÿþþŠÿÿþÎ üÉZ ý«ÿÿýü!ýçÿÿþmý ãÿÿþwþLÿÿýøþtÿÿþÁþ­ÿÿþªþ,ÿÿþàýúÿÿþIþÿÿþøþoÿÿýåþ ÿÿþòþÐÿÿþ‡þ#ÿÿþØþ1ÿÿþ&þeÿÿþ¡þ’ÿÿþÄýÑÿÿþJýìÿÿþcþ‹ÿÿýÏþTÿÿýõ ý¢ÿÿýö1þ¶ÿÿþ¡ù*Z¢ôÿÿýôIýüÿÿþ? ÿýÅ*þxÿÿýÝ ÿý¬EþØÿÿþ} ÿüö¯>þ:ÿÿýýÿý±þ›ÿÿþ»ù 4i®ûÿÿýà ý ñÿÿþY ý¦ÿÿý× þ]ÿÿýï"ýcþÿÿþ þ¾ÿÿþ—$þzÿÿýø ý þÿÿþ6$ýØÿÿþs þ€ÿÿþÔ&þwÿÿþ³ ýßÿÿþs&þ0ÿÿþà þCÿÿýû&þÿÿþô þ¤ÿÿþ±'þÿÿþûýöÿÿþP'þÿÿþî2LÍý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüUý¼5ý†ÿÿþz þÿÿýþ^ÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿòò¯}K($OÒÿÿýå ÿÿýÒ! ÿÿüø} ÿû'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5ñò@v©Óæùóâѧn2.û [ªñÿ ÿüÏdþLÿÿü2—ñÿÿýÒ0ýåÿÿÿýú]þ ÿÿÿõâ“R% 9xÚÿÿýüTþJÿÿÿûþµDüeõÿÿý÷!ýäÿÿþ¯ÿÿÿý¼3 ý0ðÿÿþ±þÿÿýïÿÿüÿæVþIÿÿþ*þGÿÿýdÿÿý¨þµÿÿþzýâÿÿü½ÿÿþXÿÿþ¿þšÿÿûõ"ÿÿþÿÿþÜþDÿÿþsÿþÿÿþôý àÿÿýÊÿþ ÿÿþôþ—ÿÿýú-ÿþ4ÿÿþßýAþÿÿþ‚ÿþyÿÿþÅý ÞÿÿýÕÿýÚÿÿþ‰þ”ÿÿýý8ÿþ\ÿÿþF ý?þÿÿþ‘ÿýåÿÿýæ ý Üÿÿýß ÿþ¨ÿÿþr þ‘ÿÿþFÿþkÿÿýÛ ý<ýÿÿþ ÿýBúÿÿýþ? ý Úÿÿýèÿý)îÿÿþ† þŽÿÿþTÿýâÿÿý¼ ý9ýÿÿþ¯ ÿýÙÿÿýË ýØÿÿýï ÿýÒÿÿýÓ þ‹ÿÿþc ÿýËÿÿýÚ ý7üÿÿþ½ ÿý ÆÿÿýàþÖÿÿýõ" ÿ ý Áÿÿýä"ÿþr ÿ ý¼ÿÿýè'ÿ ý¸ÿÿýì,ÿ ý³ÿÿýï1ÿý®ÿÿýó8ÿ2LÍÿþ(ÿÿþ,ÿþ‰ÿÿþËÿýæÿÿþjÿþKÿÿø÷ÿÿ8 ÿþ¬ÿÿþ§ÿþ8 ÿýùÿÿþFÿþ8 ÿþnÿÿýãÿþ8 ÿþÏÿÿþ„ð.e’¶ØêöúëÜÁ[÷BÄéùùé û$lµóÿ ÿüø¨6ýP×ÿÿ ÿüý•ý£ÿÿ ÿýÏý¾ÿÿ ÿóÞg5 5g·üÿÿýÔ þ§ÿÿùÖi& ( ÿüå‡4 ý'Àÿÿþ þ`ÿÿý‡üÉZ ý«ÿÿýü! ýêÿÿþ$ý ãÿÿþw þ~ÿÿýÂ%þtÿÿþÁ ýéÿÿþ3&þ,ÿÿþà þNÿÿþÀ'þÿÿþø þ¢ÿÿþb'þ ÿÿþò þæÿÿýþ'þ#ÿÿþØþ$ÿÿþÕ(þeÿÿþ¡þVÿÿþ¡'ýÑÿÿþJþƒÿÿþw'þ‹ÿÿýÏþ¥ÿÿþT%ý¢ÿÿýö1 þÃÿÿþ9 ù*Z¢ôÿÿýôI þØÿÿþ# ÿýÅ* þéÿÿþ ÿý¬E þõÿÿþ  ÿüö¯> þûÿÿþÿý± ÿþ ù 4i®ûÿÿýà þûÿÿþ%ý¦ÿÿý× þõÿÿþ'ýcþÿÿþþêÿÿþ(þzÿÿýøþØÿÿþ"(ýØÿÿþsþÃÿÿþ9)þwÿÿþ³þ¥ÿÿþSÿþ0ÿÿþàþƒÿÿþwÿþÿÿþôþWÿÿþ¡ÿþÿÿþûþ%ÿÿþÕÿþÿÿþîþæÿÿýþ2LÍ%ÿ ýêÿÿþ3$ÿþ€ÿÿþÂ$ÿýëÿÿ%ÿþcÿÿ%ÿþ«ÿÿ%ÿû Áÿÿ$ÿü ¦ÿ$ÿþRÿûÄBó ý ÞþTÿÿþ£þÆÿÿþ þ‡ÿÿþÃý”ÿþ:ÿÿþÁý*óÿÿýý •ÿÿýñ' ü?þÿþ#ÿÿþÖ ýBòÿÿõç…CFŠëÿÿýñ> û Üÿÿþÿÿþè ý&ÃÿÿýÂ$þ‘ÿÿþ ÿÿþô üD¦þÿÿüþ¥Cý<ýÿÿþÿÿþù ü'›íÿ ÿüí›' ý Úÿÿþèþÿÿþþ üüÿÿüü‘ þŽÿÿþTþÿÿþúý ÆÿÿõãƒD E„äÿÿýÆ ý9ýÿÿþ¯þ ÿÿþôý¼ÿÿüùqütúÿÿý¼ýØÿÿýïþÿÿþèþpÿÿýø= ý@ùÿÿþoþ‹ÿÿþcþ#ÿÿþÖý ïÿÿþc þfÿÿýî ý7üÿÿþ½þ:ÿÿþÂþaÿÿýÓ ýÔÿÿþaþÖÿÿýõ"þTÿÿþ£þ§ÿÿþsþuÿÿþ¦ÿþrþxÿÿþ‚þÚÿÿþ1þ3ÿÿþÙÿþ¢ÿÿþUþñÿÿþþÿÿþðÿþÕÿÿþ$þûÿÿþþÿÿþúÿýþÿÿþæþêÿÿþþÿÿþéÿ2LÍ þ4ÿÿýéþ¼ÿÿýþ2þýÃÿÿþ~þpÿÿþ¡ þþƒÿÿýë ý± þlÿÿýå üÿ†ý‡ÿÿþb ûÿô‡ý¬ÿÿýù> ÿ÷Öh%&j×ÿÿþ© ÿôú°i./d±÷ÿÿýüZ ÿýÀ ÿýöT ÿý¥ÿýÑ- þØÿÿýØRü3˜ðÿ ÿüØeóD‘ÆêùùêÆ‘CóB†·ßñüóß¹ƒ:óò@v©Óæùóâѧn2þLÿÿû [ªñÿ ÿüÏdýåÿÿ ü2—ñÿÿýÒ0þ ÿÿ ÿýú]þJÿÿ ÿõâ“R% 9xÚÿÿýüTýäÿÿþ¯ÿÿ ÿûþµDüeõÿÿý÷! þÿÿýïÿÿ ÿý¼3 ý0ðÿÿþ± þGÿÿýdÿÿ üÿæVþIÿÿþ* ýâÿÿü½ÿÿ ý¨þµÿÿþz þšÿÿûõ"ÿÿ þXÿÿþ¿ þDÿÿþsÿ þÿÿþÜý àÿÿýÊÿ þÿÿþôþ—ÿÿýú-ÿ þ ÿÿþôþþÿÿþ‚ÿ þ4ÿÿþßÿýÕÿ þyÿÿþÅÿýý8ÿýÚÿÿþ‰ÿþ‘ÿþ\ÿÿþFüÿß ÿýåÿÿýæýÿFÿþ¨ÿÿþr þ ÿþkÿÿýÛ þÿýBúÿÿýþ?ÿý)îÿÿþ†ÿýâÿÿý¼ÿýÙÿÿýË ÿýÒÿÿýÓÿýËÿÿýÚÿý Æÿÿýàÿý Áÿÿýä"ÿý¼ÿÿýè'ÿ ý¸ÿÿýì,ÿ ý³ÿÿýï1ÿ ý®ÿÿýó82LÍþpÿÿýÒ ý×ÿÿþoý çÿÿüY)ÿÿþc þlÿÿþ)þ–ÿÿúï ·ÿÿý÷= ýFúÿÿþ¶ý¼5ý†ÿÿþzý2þÿÿüùpüxûÿÿýþ1ÿü´U ý5ÅÿÿýÑþyÿÿõâ‚C E…æÿÿþxÿòò¯}K($OÒÿÿýåþ”ÿÿþ“ ÿýÒ!ý_òÿÿýò_ ÿüø}üŠíÿ ÿüíŠ û'vÃúÿ ÿüà ñ Jƒ¹×èøøè×¹ƒJ ï ?vŸÃáïúøêÛÉj5ôô%n³ÓéûòÝ´v& ù%[Æ÷ÿÿý3¼ÿÿüþ·-úO…ºïÿÿü“þÿ ÿýûwÿý µÿÿþ—ÿý²ÿÿöì‹==Œíÿÿþ€ÿúæ³€Mÿÿþtÿÿý¨ý«ÿÿýýBúæ³€Mÿýúÿÿýœý ÿÿýØ ÿþÿÿýÑ ýÕÿÿþf ÿýôÿÿþ> þAÿÿýÚ ÿþMÿÿþÓ þÖÿÿþ= ÿþŒÿÿþ þÿÿþ• ÿþÃÿÿþI þKÿÿþÜ ÿþÚÿÿþ þ!ÿÿþ ÿþíÿÿþ þÿÿþO ÿþûÿÿþ þÿÿþ} ÿþïÿÿþ þÿÿþŸ ÿþÝÿÿþ þ ÿÿþ¿ ÿþÉÿÿþH þJÿÿþÔ ÿþ—ÿÿþ~ þÿÿþç ÿþYÿÿþÑ þÓÿÿþô ÿýüÿÿþ: þ=ÿÿþù ÿþ©ÿÿýÎ ýÑÿÿþþ ÿþ5ÿÿþ•ý™ÿÿþø ÿþ›ÿÿý£ý¥ÿÿþð ÿý Òÿÿöëˆ;;‰ëÿÿþÞÿÿþß ÿýÕÿÿýèDÿÿþÇ ÿý¸ÿ ÿüÓ$8ÿÿþ© ÿýNÒÿÿúð~ Sÿÿþ ÿó4{»×ìüòÖ¥^ þ‚ÿÿþP ÿ(þ»ÿÿþ ÿ'ýñÿÿþÐ ÿ'þJÿÿþ|2LÍþ(ÿÿþ,%ÿþ‰ÿÿþË&ÿýæÿÿþj&ÿþKÿÿý÷&ÿþ¬ÿÿþ§'ÿ ýùÿÿþF'ÿ þnÿÿýã'ÿ þÏÿÿþ„(ÿ4óBÄéùùéÄBÿýP×ÿÿþ×ÿý£ÿ ÿÿþë ý¾ÿ ÿÿþ þ§ÿÿõÖi& (kØÿÿþ)ÿÿþ/ þ`ÿÿý‡üˆÿþŠÿÿþÎ ýêÿÿþþ„ýçÿÿþm þ~ÿÿýÂþþLÿÿýø ýéÿÿþ3$þ­ÿÿþª þNÿÿþÀ$ýúÿÿþI þ¢ÿÿþb$þoÿÿýå þæÿÿýþ$þÐÿÿþ‡ þ$ÿÿþÕ$þ1ÿÿþ& þVÿÿþ¡$þ’ÿÿþÄ þƒÿÿþw#ýìÿÿþc þ¥ÿÿþT#þTÿÿýõ þÃÿÿþ9#þ¶ÿÿþ¡ þØÿÿþ#"ýüÿÿþ? þéÿÿþ"þxÿÿýÝ þõÿÿþ "þØÿÿþ}þûÿÿþ!þ:ÿÿýýÿþ!þ›ÿÿþ»þûÿÿþ ý ñÿÿþYþõÿÿþ þ]ÿÿýïþêÿÿþ þ¾ÿÿþ—þØÿÿþ"ý þÿÿþ6þÃÿÿþ9þ€ÿÿþÔþ¥ÿÿþSýßÿÿþsþƒÿÿþwþCÿÿýûþWÿÿþ¡þ¤ÿÿþ±þ%ÿÿþÕýöÿÿþPþæÿÿýþ 2LÍÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~ÿýëÿÿþþƒÿÿýë ý±ÿþcÿÿý†ý‡ÿÿþb ûÿô‡ÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿùú°i.ÿÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ ÿýRØÿÿýØRü3˜ðÿÿóD‘ÆêùùêÆ‘CøB†·ßñüûú%n³ÓPù%[Æ÷ÿÿý3¼ÿÿý¢ úO…ºïÿÿü“þÿÿý½ ÿý µÿÿþ¦ ÿý²ÿÿüì‹=ÿÿþ_ ÿúæ³€Mÿÿþtÿÿû¨ÿÿýé úæ³€MÿýúÿÿýœþÄÿÿþ|ÿþÿÿýÑþ4ÿÿýèÿýôÿÿþ>þÀÿÿþLÿþMÿÿþÓþcÿÿþ¡ÿþŒÿÿþþÿÿþåÿþÃÿÿþIþÖÿÿþ$ÿþÚÿÿþþ¢ÿÿþUÿþíÿÿþþxÿÿþÿþûÿÿþþTÿÿþ£ÿþïÿÿþþ:ÿÿþÁÿþÝÿÿþþ#ÿÿþÖÿþÉÿÿþHþÿÿþèÿþ—ÿÿþ~þ ÿÿþôÿþYÿÿþÑþÿÿþùÿýüÿÿþ:þÿÿþþÿþ©ÿÿýÎþÿÿþúÿþ5ÿÿþ•þ ÿÿþôÿþ›ÿÿý£þÿÿþèÿý Òÿÿùëˆ;#ÿÿþÖÿýÕÿÿþ:ÿÿþÂÿý¸ÿÿþTÿÿþ£ÿýNÒÿÿþxÿÿþ‚ÿ÷4{»×¢ÿÿþUÿ þÕÿÿþ$ÿýþÿÿþæÿ€2€L€Íý¼ÿüpÿÿþlÿÿý¬ÿÿú/d±÷ÿÿþüÿÿýöTÿÿüÑ-ÿÿõØeóß¹ƒ:êøéûòÝ´v&ÿûþ·-ÿÿýûwÿÿù=Œíÿÿý«ÿÿû ÿÿüÕÿýAÿþÖþþKþ!þþþþ þJþþÓý=ÿüÑÿû™ÿÿý¥ÿÿù;‰ëÿ ÿþèÿÿýÓ$ÿÿôð~ ìüòÖ¥^ þJÀ2ÀLÀÍÿ!ü®ÿÿÿ û$úÿÿÿ þ¼ÿÿÿþpÿÿÿý± þlÿÿþåÿûÿô‡ý¬ÿÿýù>ÿÿôú°i./d±÷ÿÿýüZÿÿýöTÿÿýÑ-ÿü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ:À2ÀLÀÍüÿý!þÖÿÿþ1þ3ÿÿþÕÿþ°þ³ÿÿþsþwÿÿþ³ÿýþ2þpÿÿýÒ ý×ÿÿþoÿþ¡ þ)ÿÿþc þlÿÿþ)ÿþ þ·ÿÿý÷= ýFúÿÿþ¶ÿ ý2þÿÿüùpüxûÿÿýþ1ÿ þyÿÿõâ‚C E…æÿÿþx ÿþ”ÿÿþ“ ÿý_òÿÿýò_ ÿüŠíÿ ÿüíŠ ÿñ Jƒ¹×èøøè×¹ƒJ À2ÀLÀÍþÿ&þ=ÿÿþÏ ý©ÿÿ'þˆÿÿþŸ ý£ÿÿ&ý çÿÿþY ýÿÿ&þ–ÿÿýï þ•ÿÿý¼5ý†ÿÿþz þÿÿýþÿÿü´U ý5ÅÿÿýÑþ…ÿÿþgÿÿ ÿòò¯}K($OÒÿÿýå ÿ ÿýÒ! ÿ ÿüø} ÿ û'vÃúÿ ÿüà ÿï ?vŸÃáïúøêÛÉj5À2ÀLÀÍÿýõ>'ÿ ÿýøE(ÿ üÿúM)ÿ ýüU*ÿ þ^+ÿ:ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿMÀ2ÀLÀÍþfÿÿýé'þ®ÿÿýý!þÇÿÿþ'ý$úÿÿþ°þ(ÿÿþ,'þ¼ÿÿýþ2þ‰ÿÿþË'þpÿÿþ¡ýæÿÿþjý± þlÿÿýåþKÿÿý÷ûÿô‡ý¬ÿÿýù> þ¬ÿÿþ§ÿôú°i./d±÷ÿÿýüZ ýùÿÿþFÿýöT þnÿÿýãÿýÑ- þÏÿÿþ„ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ: À2ÀLÀÍþÖÿÿþ1þ3ÿÿþÕ"þ³ÿÿþsþwÿÿþ³"þpÿÿýÒ ý×ÿÿþo"þ)ÿÿþc þlÿÿþ)#þ·ÿÿý÷= ýFúÿÿþ¶ý¼5ý†ý2þÿÿüùpüxûÿÿýþ1ÿü´U ü5Åÿþyÿÿõâ‚C E…æÿÿþxÿòò¯}K($OÒÿÿ þ”ÿÿþ“ ÿ ý_òÿÿýò_ ÿ üŠíÿ ÿüíŠ û'vÃúÿ ÿýà ñ Jƒ¹×èøøè×¹ƒJ ï ?vŸÃáïúøêÛÉj5À2ÀLÀÍý=ÿÿþÏ ý©ÿÿýõ>"þˆÿÿþŸ ý£ÿÿýøE"ý çÿÿþY ýÿÿýúM#þ–ÿÿýï þ•ÿÿýüU$ÿþz þÿÿýþ^%ÿýÑþ…ÿÿþg&ÿýå ÿþ8 ÿýÒ! ÿþ8 ÿüø} ÿþ8 ÿþ ÿþ8 ÿ@À2ÀLÀÍÿ$ÿÿ$ÿÿ$ÿÿ$ÿÿ$ÿþ±ÿÿ$ÿÿÿÿÿÿÿÿÿþ3?À2ÀLÀÍþ®ÿÿýý!þ=ÿÿþÏý$úÿÿþ°þˆÿÿþŸþ¼ÿÿýþ2ý çÿÿþYþpÿÿþ¡þ–ÿÿýï þ þlÿÿýå ý¼5ý†ÿÿþzüô‡ý¬ÿÿýù> ÿü´U ý5ÅÿÿýÑÿôú°i./d±÷ÿÿýüZ ÿòò¯}K($OÒÿÿýåÿýöT ÿýÒ!ÿýÑ- ÿüø}ý˜ðÿ ÿüØeû'vÃúÿ ÿüà óB†·ßñüóß¹ƒ:ï ?vŸÃáïúøêÛÉj5 À2ÀLÀÍþ‡ÿÿþªþ‡ÿÿýÝÿÿþoýÝÿÿþeÿÿþþeÿÿýž ý*ñÿÿþ¶ ýž ý*ñÿÿüÿÚB ý+ßÿÿýý6 üÿÚB ý+ßÿÿþýÿýµ>ülôÿÿþ ÿýµ>ülôÿÿþÿôàšV0"NŽæÿÿýº ÿôàšV0"NŽæÿÿýºÿý§ ÿý§ ÿýóa ÿýóaû)zÊýÿ ÿüãyû)zÊýÿ ÿüãy ðI¨ÍæóüñàÏ«r8ðI¨ÍæóüñàÏ«r8À2ÀLÀÍýÿª þ£ÿÿþb þbÿÿþ¢þÖÿÿþ1ýÿo þOÿÿþ¿ þÀÿÿþMþ³ÿÿþsýÿ ýêÿÿþ3 þ4ÿÿýéþpÿÿýÒþ¶ þ€ÿÿýÂýÃÿÿþ~þ)ÿÿþcþ6 ýëÿÿþþƒÿÿýë þ·ÿÿý÷=þcÿÿý†ý‡ÿÿþb ý2þÿÿüùpþ«ÿÿ÷Öh%&j×ÿÿþ© þyÿÿøâ‚C ý ÁÿÿýÀ þ”ÿ ÿý ¦ÿ ÿý¥ý_òÿÿýRØÿÿýØRüŠíÿÿóD‘ÆêùùêÆ‘Cö Jƒ¹×èøøèÿÀ2ÀLÀÍþ3ÿÿþÕþ‡ÿÿþªþwÿÿþ³ýÝÿÿþoý×ÿÿþoþeÿÿþþlÿÿþ)ýž ý*ñÿÿþ¶ýFúÿÿþ¶üÿÚB ý+ßÿÿýý6 ý±üxûÿÿýþ1ÿýµ>ülôÿÿþ ÷ÿô‡E…æÿÿþxÿôàšV0"NŽæÿÿýº ÿýú°ÿÿþ“ ÿý§  ÿýò_ ÿýóaÿüíŠ û)zÊýÿ ÿüãyõ3˜ðÿÿ×¹ƒJ ðI¨ÍæóüñàÏ«r8üB†ÿÀ2ÀLÀÍ þ®ÿÿýý!þ=ÿÿþÏý$úÿÿþ°þˆÿÿþŸþ¼ÿÿýþ2ý çÿÿþYþpÿÿþ¡þ–ÿÿýï þlÿÿýå ý¼5ý†ÿÿþzý¬ÿÿýù> ÿü´U ý5ÅÿÿýÑöi./d±÷ÿÿýüZ ÿòò¯}K($OÒÿÿýå ÿýöT ÿýÒ! ÿýÑ- ÿüø} ÿüØeû'vÃúÿ ÿüà ö·ßñüóß¹ƒ:ï ?vŸÃáïúøêÛÉj5À2ÀLÀÍþÖÿÿþ1þ3ÿÿþÕþ®ÿÿûý!³ÿÿþsþwÿÿþ³ý$úÿÿû°pÿÿýÒ ý×ÿÿþoþ¼ÿÿúþ2)ÿÿþc þlÿÿþ)þpÿÿþ¡þ·ÿÿý÷= ýFúÿÿþ¶ ý± þlÿÿýåý2þÿÿüùpüxûÿÿýþ1 ûÿô‡ý¬ÿÿýù>þyÿÿõâ‚C E…æÿÿþx ÿôú°i./d±÷ÿÿýüZþ”ÿÿþ“ ÿýöTý_òÿÿýò_ ÿýÑ- üŠíÿ ÿüíŠü3˜ðÿ ÿüØe ñ Jƒ¹×èøøè×¹ƒJ óB†·ßñüóß¹ƒ: À2ÀLÀÍþ£ÿÿþb þbÿÿþ¢$þOÿÿþ¿ þÀÿÿþMþýêÿÿþ3 þ4ÿÿýéþeþ€ÿÿýÂýÃÿÿþ~ýž ý*ñýëÿÿþþƒÿÿýëüÿÚB ü+ßÿ þcÿÿý†ý‡ÿÿþb ÿýµ>úlôÿÿ þ«ÿÿ÷Öh%&j×ÿÿþ© ÿôàšV0"NŽæÿÿ ý ÁÿÿýÀ ÿ ý ¦ÿ ÿý¥ ÿþó ýRØÿÿýØR û)zÊýÿ ÿüãyóD‘ÆêùùêÆ‘CðI¨ÍæóüñàÏ«r8À2ÀLÀÍþ‡ÿÿþªþÖÿÿþ1þ3ÿÿþÕþÝÿÿþoþ³ÿÿþsþwÿÿþ³ÿþþpÿÿýÒ ý×ÿÿþoÿþ¶ þ)ÿÿþc þlÿÿþ)ÿýý6 þ·ÿÿý÷= ýFúÿÿþ¶ ý±ÿþ ý2þÿÿüùpüxûÿÿýþ1 ûÿô‡ÿýº þyÿÿõâ‚C E…æÿÿþx ÿöú°i.ÿ§ þ”ÿÿþ“ ÿþaý_òÿÿýò_ ÿüŠíÿ ÿüíŠü3˜ðÿÿñ Jƒ¹×èøøè×¹ƒJ øB†·ßñüÿÀ2ÀLÀÍþ®ÿÿýý!þfÿÿýéý$úÿÿþ°þÇÿÿþþ¼ÿÿýþ2þ(ÿÿþ,þpÿÿþ¡þ‰ÿÿþËþlÿÿýåýæÿÿþjý¬ÿÿýù>þKÿÿý÷ú/d±÷ÿÿýüZþ¬ÿÿþ§ÿýöTýùÿÿþFÿýÑ-þnÿÿýãÿüØeþÏÿÿþ„úóß¹ƒ::À2ÀLÀÍ ÿ!þ=ÿÿþÏÿ!þˆÿÿþŸÿ ý çÿÿþYÿ þ–ÿÿýï ÿ ý¼5ý†ÿÿþzÿ ÿü´U ý5ÅÿÿýÑÿ ÿòò¯}K($OÒÿÿýåÿ ÿýÒ!ÿ ÿüø}ÿ û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5 À2ÀLÀÍþÖÿÿþ1þ3ÿÿþÕþfÿÿýé þ³ÿÿþsþwÿÿþ³þÇÿÿþ þpÿÿýÒ ý×ÿÿþoþ(ÿÿþ, þ)ÿÿþc þlÿÿþ)þ‰ÿÿþË þ·ÿÿý÷= ýFúÿÿþ¶ýæÿÿþj ý2þÿÿüùpüxûÿÿýþ1þKÿÿý÷þyÿÿõâ‚C E…æÿÿþxþ¬ÿÿþ§þ”ÿÿþ“ýùÿÿþFý_òÿÿýò_þnÿÿýãüŠíÿ ÿüíŠþÏÿÿþ„ñ Jƒ¹×èøøè×¹ƒJ &À2ÀLÀÍÿÿÿÿÿÿÿÿÿÿÿÿÿ ÿÿ ÿÿ ÿÿ ÿ@À2ÀLÀÍþÿþ£ÿÿþb þbÿÿþ¢þÿþOÿÿþ¿ þÀÿÿþMþÿýêÿÿþ3 þ4ÿÿýéþÿþ€ÿÿýÂýÃÿÿþ~þÿýëÿÿþþƒÿÿýë ý±þÿþcÿÿý†ý‡ÿÿþb úÿô‡ÿÿ þ«ÿÿ÷Öh%&j×ÿÿþ© ÿýú°ÿÿ ý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ÿýRØÿÿýØRú3˜ðÿÿóD‘ÆêùùêÆ‘CüB†ÿÀ2ÀLÀÍ þ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1öi./d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþx ÿýöTþ”ÿÿþ“ ÿýÑ-ý_òÿÿýò_ ÿüØeüŠíÿ ÿüíŠ ö·ßñüóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ À2ÀLÀÍþfÿÿýé'þ=ÿÿþÏþÇÿÿþ(þˆÿÿþŸþ(ÿÿþ,'ý çÿÿþYþ‰ÿÿþË(þ–ÿÿýï ýæÿÿþjý¼5ý†ÿÿþzþKÿÿý÷ÿü´U ý5ÅÿÿýÑþ¬ÿÿþ§ÿòò¯}K($OÒÿÿýåýùÿÿþFÿýÒ!þnÿÿýãÿüø} þÏÿÿþ„û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5À2ÀLÀÍ ý©ÿÿýõ>'ÿ ý£ÿÿýøE(ÿ ýÿÿýúM)ÿ þ•ÿÿýüU*ÿþÿÿýþ^+ÿþ…ÿÿþg,ÿÿþ8ÿÿþ8ÿÿþ8ÿÿþ8ÿ@À2ÀLÀÍÿ þ£ÿÿþb þbÿÿþ¢ÿ þOÿÿþ¿ þÀÿÿþMÿ ýêÿÿþ3 þ4ÿÿýéÿþ€ÿÿýÂýÃÿÿþ~ÿýëÿÿþþƒÿÿýë ý±ÿþcÿÿý†ý‡ÿÿþb ûÿô‡ÿþ«ÿÿ÷Öh%&j×ÿÿþ© ÿùú°i.ÿÿý ÁÿÿýÀ ÿý ¦ÿ ÿý¥ ÿýRØÿÿýØRü3˜ðÿÿóD‘ÆêùùêÆ‘CøB†·ßñüÿÀ2ÀLÀÍþ®ÿÿýý!þÖÿÿþ1þ3ÿÿþÕý$úÿÿþ°þ³ÿÿþsþwÿÿþ³þ¼ÿÿýþ2þpÿÿýÒ ý×ÿÿþoþpÿÿþ¡ þ)ÿÿþc þlÿÿþ)þlÿÿýå þ·ÿÿý÷= ýFúÿÿþ¶ý¬ÿÿýù> ý2þÿÿüùpüxûÿÿýþ1 ú/d±÷ÿÿýüZ þyÿÿõâ‚C E…æÿÿþx ÿýöTþ”ÿÿþ“ ÿýÑ-ý_òÿÿýò_ÿüØeüŠíÿ ÿüíŠúóß¹ƒ:ñ Jƒ¹×èøøè×¹ƒJ À2ÀLÀÍþfÿÿýé'þ=ÿÿþÏþÇÿÿþ(þˆÿÿþŸþ(ÿÿþ,'ý çÿÿþYþ‰ÿÿþË(þ–ÿÿýï ýæÿÿþjý¼5ý†ÿÿþzþKÿÿý÷ÿü´U ý5ÅÿÿýÑþ¬ÿÿþ§ÿòò¯}K($OÒÿÿýåýùÿÿþFÿýÒ!þnÿÿýãÿüø} þÏÿÿþ„û'vÃúÿ ÿüà,ï ?vŸÃáïúøêÛÉj5 À2ÀLÀÍý©ÿÿýõ>'ÿý£ÿÿýøE(ÿýÿÿýúM)ÿþ•ÿÿýüU*ÿþÿÿýþ^+ÿþ…ÿÿþg,ÿÿþ8ÿÿþ8ÿÿþ8ÿÿþ8ÿAÀ2ÀLÀÍ þ=ÿÿþÏþ£ÿÿþb(þˆÿÿþŸþOÿÿþ¿'ý çÿÿþYýêÿÿþ3&þ–ÿÿýï þ€ÿÿýÂý¼5ý†ÿÿþz ýëÿÿþÿü´U ý5ÅÿÿýÑ þcÿÿý†ÿòò¯}K($OÒÿÿýå þ«ÿÿùÖh%& ÿýÒ!ý Áÿÿ ÿüø}ý ¦ÿÿ û'vÃúÿ ÿüàýRØÿÿï ?vŸÃáïúøêÛÉj5÷D‘ÆêùùêÿÀ2ÀLÀÍþbÿÿþ¢þÖÿÿþ1þ3ÿÿþÕþÀÿÿþMþ³ÿÿþsþwÿÿþ³þ4ÿÿýéþpÿÿýÒ ý×ÿÿþoýÃÿÿþ~þ)ÿÿþc þlÿÿþ)þƒÿÿýë þ·ÿÿý÷= ýFúÿÿþ¶ý‡ÿÿþb ý2þÿÿüùpüxûÿÿýþ1ýj×ÿÿþ© þyÿÿõâ‚C E…æÿÿþxÿýÀ þ”ÿÿþ“ÿý¥ý_òÿÿýò_ÿýØRüŠíÿ ÿüíŠûÆ‘Cñ Jƒ¹×èøøè×¹ƒJ À2ÀLÀÍ ÿý©ÿÿýõ>ÿý£ÿÿýøE ÿýÿÿýúM!ÿþ•ÿÿýüU"ÿ þÿÿýþ^#ÿ þ…ÿÿþg$ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8ÿ ÿþ8HÀ2ÀLÀÍ ÿ'þ®ÿÿýý! ÿ&ý$úÿÿþ° ÿ&þ¼ÿÿýþ2 ÿ%þpÿÿþ¡ ÿý± þlÿÿýå ÿûÿô‡ý¬ÿÿýù>ÿ ÿôú°i./d±÷ÿÿýüZÿ ÿýöTÿ ÿýÑ-ÿ ü3˜ðÿ ÿüØe/óB†·ßñüóß¹ƒ: À2ÀLÀÍþfÿÿýéþ£ÿÿþbþÇÿÿþþOÿÿþ¿þ(ÿÿþ,ýêÿÿþ3þ‰ÿÿþËþ€ÿÿýÂþ ýæÿÿþjýëÿÿþþƒ þKÿÿý÷þcÿÿý†ü‡ÿ þ¬ÿÿþ§þ«ÿÿõÖh%&j×ÿÿ ýùÿÿþFý Áÿ ÿ þnÿÿýãý ¦ÿ ÿ þÏÿÿþ„ýRØÿÿþØ2óD‘ÆêùùêÆ‘CÿÀ2ÀLÀÍýbÿÿþ¢ÿþÀÿÿþMÿþ4ÿÿýéÿþÃÿÿþ~ÿÿýëÿý±ÿþbÿûÿô‡ÿþ© ÿ ÿõú°i.ÿÿÀ ÿ ÿý¥ÿ ÿþRÿ ü3˜ðÿÿ8øB†·ßñüÿ–2–L–Íþ®ý$úý¼ÿüpÿÿþlÿÿý¬ÿÿú/d±÷ÿÿþüÿÿýöTÿÿüÑ-ÿÿõØeóß¹ƒ:+E‡"Ãaˆ0D" êK New Layerÿ     ’êK¾Å*Å6ÅBÅNÅZÅfêK¥ª¥º¥Ê¥Ú¥ê¥ú¦ ¦¦*¦:¦J¦Z¦j¦z¦Š¦š¦ª¦º¦Ê¦Ú¦ê¦ú§ §§*§:§J§Z§j§z§Š§š§ª§º§Ê§Ú§ê§ú¨ ¨¨*¨:¨J¨Z¨j¨z¨Š¨š¨ª¨º¨Ê¨Ú¨ê¨ú© ©©*©:©J©Z©j©z©Š©š©ª©º©Ê©Ú©ê©úª ªª*ª:ªJªZªjªzªŠªšªªªºªÊªÚªêªú« ««*«:«J«Z«j«z«Š«š«ª«º«Ê«Ú«ê«ú¬ ¬¬*¬:¬J¬Z¬j¬z¬Š¬š¬ª¬º¬Ê¬Ú¬ê¬ú­ ­­*­:­J­Z­j­z­Š­š­ª­º­Ê­Ú­ê­ú® ®®*®:®J®Z®j®z®Š®š®ª®º®Ê®Ú®ê®ú¯ ¯¯*¯:¯J¯Z¯j¯z¯Š¯š¯ª¯º¯Ê¯Ú¯ê¯ú° °°*°:°J°Z°j°z°Š°š°ª°º°Ê°Ú°ê°ú± ±±*±:±J±Z±j±z±Š±š±ª±º±Ê±Ú±ê±ú² ²²*²:²J²Z²j²z²Š²š²ª²º²Ê²Ú²ê²ú³ ³³*³:³J³Z³j³z³Š³š³ª³º³Ê³Ú³ê³ú´ ´´*´:´J´Z´j´z´Š´š´ª´º´Ê´Ú´ê´úµ µµ*µ:µJµZµjµzµŠµšµªµºµÊµÚµêµú¶ ¶¶*¶:¶J¶Z¶j¶z¶Š¶š¶ª¶º¶Ê¶Ú¶ê¶ú· ··*·:·J·Z·j·z·Š·š·ª·º·Ê·Ú·ê·ú¸ ¸¸*¸:¸J¸Z¸j¸z¸Š¸š¸ª¸º¸Ê¸Ú¸ê¸ú¹ ¹¹*¹:¹J¹Z¹j¹z¹Š¹š¹ª¹º¹Ê¹Ú¹ê¹úº ºº*º:ºJºZºjºzºŠºšºªºººÊºÚºêºú» »»*»:»J»Z»j»z»Š»š»ª»º»Ê»Ú»ê»ú¼ ¼¼*¼:¼J¼Z¼j¼z¼Š¼š¼ª¼º¼Ê¼Ú¼ê¼ú½ ½½*½:½J½Z½j½z½Š½š½ª½º½Ê½Ú½ê½ú¾ ¾¾*¾:¾J¾Z¾j¾z¾Š¾š¾ª¾º¾Ê¾Ú¾ê¾ú¿ ¿¿*¿:¿J¿Z¿j¿z¿Š¿š¿ª¿º¿Ê¿Ú¿ê¿úÀ ÀÀ*À:ÀJÀZÀjÀzÀŠÀšÀªÀºÀÊÀÚÀêÀúÁ ÁÁ*Á:ÁJÁZÁjÁzÁŠÁšÁªÁºÁÊÁÚÁêÁú ÂÂ*Â:ÂJÂZÂjÂzŠšªºÂÊÂÚÂêÂúà ÃÃ*Ã:ÃJÃZÃjÃzÊÚêúÃÊÃÚÃêÃúÄ ÄÄ*Ä:ÄJÄZÄjÄzÄŠÄšĪĺÄÊÄÚÄêÄúÅ Åÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ €ÿ €ÿ €ÿ €ÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÀÿÎÿÎÿÎÿÎÿu¥:ÒiŽ4G# nco-4.5.4/doc/logo_vs2010.png000066400000000000000000000077161264355130400155470ustar00rootroot00000000000000‰PNG  IHDR€€ôà‘ùsRGB®ÎéýPLTEîïï# Y ˜Õœ¬`˜x˜¨gi„ N˜C™Â:ÊÞçzÂoÂíUlµ¥ß\*\P|ÁÍÕRx—E»íl®ß ‹Äf3™ln¹Jc­TH–H†¼9ˆ¢¸ÂF¤ã/£×Uc­k§Ét…—Bb¥cHœ#Bš3™ÌJKžçäè9…ÂMr¿›r®Úø¯Ðá;d¬k2”d~½‹y¤µÅË%A~Uc¦CtÁdg­®ç^·d1Ž)›ÔžÒéZB”Ty½vQ1j³±µº{½çÞÞÞ„Íð„ƒ I0‡Z2“}‘¶ÖQR¥B^¨cÇïHÁêj9“p˜¸¥rº8 k2ºìžÂÖ”d¦§¿Ï[R§×Ýã‹ižIh¬nµ(`°RB—„d¥"‘ΊÈÜÕÞux¡´çVÕE.†„ˆ°¨œ¹`šm°J]¥b±à{KŸAj·DŽÍ“f¶”Œc©×ÈØR0“SÅíKA—ǼΑ– )VªzËïÌ×Þ"j­"¥Þc9”S‚űÇÔ1µé4•ÖÖÖÖR>‡]³ã¤ÝúŒ©¶n:ˆÀµÅK8–ƒÁèn½èŠt»Iv³”Öö/nH“ÐX›Ê:s´—ƒ¦C‹ÅA){dU¨z¬ÊYNhˆ®Wr¸Xs¬cgxa¥s\©QZ©£Ô쪭¸”Ô“ºÍÁîr¶9 t„o¸ªé"Ú ŠÎ.T—we®I{ÀoÌñJ;‰c¾ä:¿ï2x²RQžC{À\:”¤©°T3Œu=œÅÅÅÂ×ݬޒšºs1•«ÙïE´æ,v¯nw¬ÌÌÌ*›ßgd©a¤×޶ÍHÆðCŸÍcB™¯°ÁÇæ2«çJcµ¿¹ÍB„ÅŠÕõF:˜o°…˜¦JQ¥YY©žxµ8k´ga–¬[BŒÍï™ÝkA–¿Ðܶ¢¼„^£XˆºÏÄÔ:“ÎJk¶¼¼¼%|ÀRy…¨Bs¶n1‰=)sY»èÝÙã1‰ÅG2w7\;ŽÎ€|­.ÅôBd®RJmµãZ¡Ê[Äî="zlT”Qq¼Š–³IZ¬ZO–V‹Æàâèú1l¥tRNS@æØfbKGDˆH pHYs  šœtIMEÜ3de¹: =IDATxÚí™{4•éÇwÔ¡‘&Õa'—ÒV E.‰“3Ô‘Ø"—tqªi Ù‰jÒ¶äÒ˜ÛIvJS#bW£Ò„šŠŒ0aLšâtcÍïyoûbï­YkjÖ:ëýüÑem¯ïçù=¿çyÞ÷Ý  Íÿ/ú¾÷ÃÂ8¾¶KvX[Š»ÿ ÷”aÃï2Ý·möƒÍ"$$X¹·½£J ·¹CúiŒsÂ$XÍÛóöãïß "ÓOŸ^NA:øÿvã÷¸oËþ ÃȈ4Hp{{ñaîøà‰l##£EòoôpØœò–úq8Åj³pÙÑȉWâÁ[)Â}¯Ó­­­"…ÿ§JSHØø×ç·YµbPé"ù 0èííMHù«·”ÖÓ§% |‚!RÌÂ]_ætž™3Ç%×ïâ2çû òuomÅò?ÊWéì3õKŽoCôqi¹£IlõÇùòe*û$†°éLAóà.ù—½gqlpð"ËÇLã«ÈZ}VD`[8:/:âââ´Ób¤æ?ÇòïÜ‘ >«¹$¬…ïŽ9••99mÛ6ˆ˜€ñù³gϺ4c‰ùמëèèÀØï'%#iÐbH¸/ÖzÛV>)CÅÇF?ž=ûàƒ¿Œ—Рׂ°xi0²dÀ`¹¿èì/uÊ{òä"ê>GÇcÀv¤€êêÖ-Ô6~Ù%@öööÐðŸSL™Òkd´Q$¿ å_Dóï(ˆß¾} ÓIIê/Åæÿ Î›œDÑAA[B[‚–ƒj+Á-Ûp%™ÆÁKIp(Áº¤þd¦ðIrÿG”¯s‡d1ÁËA‡Ÿ/~ôègçGï[mñ ‚ý ä©ù¿[ùÐxý…â—îÛ·`\^²ª îg½¬ÁX, ¯ãåuøò#gç/cέ!Þ_tîœ9‹myyOÊʰ|$ÁwI0\@ºƒ2`¯=tèõëCkHDj<÷š'¿l áŒkŒó[‚GHoï¹åDÜ;–‡ PFNùª@h¨µ§*n­ßÝÜìF¤?}út¨9':^)ò• Ʋ]¥p¢_ŒÉßâ‘pîœ?±ÿ8å30HLÀõ¸&Ðolí©…]´¡ÙÍÍŒÇ1À†ÿÕ¼•è‡m&•––®_Ÿ äççã _ý;Á¨Õ}s¬0/o%1Hà:Êß½{÷w_]_oQ__¿¬@²uD„B7\s廹•OÅ ÿñí.¼Ä¶ÿØEü/ f'ô¶¡bZ8ùå­¤ðìþzŽ«Æ÷G*äo¿ŒOƒørH=ôÄŽ3ça¸.p£Ä >Áá”#Ô2 ßÀ^`/dÿÛO!½èDˆ4,$Ð €®°Ð¨èâPýn[YѸBšð(ÌühþÙÌìfà_#Á‡ nW Vlפŋ¡¥¸sªGj‚÷ÍÌÌv®\9y2.°ô€K¼|ø¦Wž>Ä…ôVâ«WÙ”‚x%jW?ˆÀ¬Y#(B*®‘ßêaµΠ2$°sçäÉè8¶´>>¼Fҹù^rËSAaü¦hÖ ­laB‚Š?HÍ>ɲ]¢ÅŠ@*€CÈO{¶w¯˜™^¹r¥ªª¯ à0®BÚÑ[Ù˜i­ `Íb±¦!²…-ÊIôôjËsÄ. ŸtèLÌ.hFûõëñvLMuúO#òúD Tõ9NHë®”qóW‘ÎJºõ;0m¤î W^m7r6¯0Às‹_ÝÜÈ0Þ.‡¢0>mfÌû¯ðÌuÉ,–À€’  ´ªí$ ¡æG´e îܻמ"5uöF†ë99¹¢"(ÁôªÉuÌ.™ù»!¯çVʨBSSSyy“éÚpIÁœñm ú`/QÌ`U#æx1fpáÂôªéíò£äðzzJÀ)\+8dÏeJî áe¸ÙŠ¤Ã–= ×Ï‘@NQ‘¦æô!¦Ì7S»zJJ@gg§¨@yùÕv¦”Ò_†6ŽfâØÚK²~UCc»ZqqNN޹¹f’jŨù<Ü ‡Åê2˜ö í Ê 9Ò.¶kÆ Ð™ñ)äÿ`¿j+Ãø®ššZqŽ··y¬:SÖ[ N#ä'–H¡‡µIÜ 1]^úi3¾y‚Á§$?”®ú•¡r@÷¨Rq±wGbø(ù %%<YÜ`õêÕø,LS_a#cÛ™ššÛ÷S=== t6ì’qGÁÀÇÇ硪ŒßÀ‰¯ë‡üžÀ §SØ }œŒ „a»Á7@«U ¬Aw$.†JG•U©3Ȩ‰×î7Poh xØj €Yíñ¾²ú§f-äkiiQG˜žš‹×赑Ëõ¸ÈÀç„ô5Pɯ nÀ€p²J:q~O’—ù¼Ë¨¬ÎPVV-òøhjçp1ÎrÇÂ,(gJ»Ü˜?Ðp)Dhh(Ò@ mFy‚>R!jÛVÓÓO °µãœ{ã†ÒùFiùëúq¸ÂÉÉÉ<Þ,Èç®èíþ¶ii@ìÛÈÀ­ ûÐåRŸ!2"À‰qPŒí „ z`G å%&¶ãŒ–Ïé례 @áø„ü‡?+©ÛŒ*p{n´%â¹y¡ø¦oÚÈmss]GÃ8±VÒ¯ÔpÙ§knn jÐOõbr²Áùñãw(Æò¸«Ú’@Wqjon%@ãR‹··æàR ›®ÇÖ—SÓe£‘ëðyœfQQ‘˜—X €ÁŽñãçäÙŸ¦"SÀ.#À^+÷jö´ým‚ŸHÓÍ)òöî˜î¸½¾žÏÏåóö-9ÞwżÏÇ 0‡ØX.Ú“´Ο9SAA!âçK¹‘Òó+T££Û££Ñîñ‚PØ´é`Á<¡Þax·@¼‹ w–Mª®h¢Á‰Ä’Ë•Ëg0Tÿ‹ˆˆ8jç)õµB%P'·ñeåÕûEÞÑÜSÌiq"Ü ›M$ˆŠŠê\øƒËíîWDïÂpOOO%Í@É úÌÌè!D ~”õ„š˜tj=Þ?O´å]s…~~~ß’Dá`«òû´ñÇä³0üˆËÚÚÚ 6Žo<²ÃUQ~p0$` Í(˜=â½¹ëÜ–Ÿ3ˆ'Š€•Á\h°)h§^×0gxzÂ}:ÚNœè_§/æ®ÊMJBÁÔ–8uˆÿÈ—d.ºrr>>-…$Ô°5MŒÒ|øe?Fÿ .2î@Ù¤æ€?¶,X°‹ÿ“_\¿w&&æ^$ûͯP9›ð±øc dmèb¼ô_V¯Uø8 `AV÷ßw÷õ9Ûøû³ÝÕ™8YÕÎQÑg¼s†ÙìÈk*‘‘ì¿!›††††††††††††††æOñ;žçíWÿî+IEND®B`‚nco-4.5.4/doc/man_end.txt000066400000000000000000000032551264355130400152220ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2012 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/doc/man_srt.txt000066400000000000000000000002521264355130400152560ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: Header file for NCO man pages .\" Pre-pend this file to top of each NCO man page .\" Usage: .\" nroff -man ~/nco/man/ncra.1 | less nco-4.5.4/doc/milestones_old.shtml000066400000000000000000000127011264355130400171450ustar00rootroot00000000000000 NCO Homepage

    Releases & Milestones from 2003–2012 (versions 2.8.4–4.2.3)

    • 2012 Dec 05: NCO Talk at Fall AGU, San Francisco, California
    • 2012 Nov 28: NCO Poster at NASA ESDSWG, Annapolis, Maryland
    • 2012 Nov 13: NCO 4.2.3 (GPE)
    • 2012 Oct 29: NCO 4.2.2 (ncks, ncecat Groups)
    • 2012 Aug 02: NCO 4.2.1 (RAM disks)
    • 2012 Jun 12: NCO 4.2.0 (Windows support)
    • 2012 Apr 23: Received funding for NASA ACCESS 2011 project
    • 2012 Mar 29: NCO 4.1.0 (MD5 support, MM3)
    • 2012 Feb 13: NCO 4.0.9
    • 2011 Jun 03: Submitted NASA ACCESS 2011 proposal
    • 2011 Apr 28: NCO 4.0.8 (HPSS support, NOFILL workaround, upgrade recommended)
    • 2011 Feb 21: NCO 4.0.7 (upgrade recommended)
    • 2011 Jan 15: NCO 4.0.6
    • 2010 Oct 13: NCO 4.0.5
    • 2010 Sep 24: NCO 4.0.4 (chunking everywhere)
    • 2010 Sep 02: NCO 4.0.3
    • 2010 Jun 27: NCO 4.0.2
    • 2010 Apr 05: NCO 4.0.1
    • 2010 Jan 05: NCO 4.0.0 (bilinear interpolation, calendar attributes)
    • 2009 Jul 15: NCO 3.9.9 (chunking, re-basing, GSL stats/interp)
    • 2009 Apr 29: NCO 3.9.8 (GSL RNG/PDF functions)
    • 2009 Mar 18: NCO 3.9.7
    • 2009 Jan 22: NCO 3.9.6 (GSL special functions) (upgrade highly recommended)
    • 2008 Sep 24: ncap2 documentation
    • 2008 Aug 31: NSF funding ends
    • 2008 Aug 08: NCO Wiki!
    • 2008 May 22: SWAMP Talk at CCGRID08 in Lyon, France
    • 2008 May 11: NCO 3.9.5
    • 2008 Apr 28: NCO overview paper in EMS
    • 2008 Mar 04: NCO 3.9.4
    • 2007 Dec 10: SWAMP Poster at Fall AGU, San Francisco, California
    • 2007 Dec 07: NCO 3.9.3 (SWAMP!)
    • 2007 Dec 04: NCO scaling paper in IJHPCA
    • 2007 Aug 29: NCO 3.9.2 (_FillValues)
    • 2007 Aug 27: SWAMP site spins-off from NCO
    • 2007 Jun 29: NCO 3.9.1 (netCDF4 deflation)
    • 2007 May 26: NCO 3.9.0 (netCDF4 atomic types)
    • 2007 May 02: SWAMP Talk at GPC, Paris, France
    • 2007 Apr 20: NCO 3.2.0
    • 2007 Mar 29: NCO 3.1.9 x86_64 RPMs
    • 2007 Mar 10: NCO 3.1.9 (i386/x86_64 debs and i386 RPMs)
    • 2007 Feb 22: SWAMP Talk at OPeNDAP Developer's Workshop, Boulder, Colorado
    • 2007 Jan 15: Talk and Extended Abstract on NCO Scaling at AMS IIPS, San Antonio, Texas
    • 2007 Jan 09: Poster on NCO Scaling at Fall AGU, San Francisco, California
    • 2006 Dec 09: Poster on SWAMP at Fall AGU, San Francisco, California
    • 2006 Dec 06: NCO 3.1.8
    • 2006 Nov 11: NCO 3.1.7
    • 2006 Sep 18: NCO 3.1.6
    • 2006 Aug 29: NCO 3.1.5
    • 2006 Jun 07: NCO 3.1.4
    • 2006 May 30: NCO 3.1.3
    • 2006 Apr 21: NCO 3.1.2
    • 2006 Jan 30: NCO 3.1.1
    • 2005 Dec 02: NCO 3.1.0 (MPI!)
    • 2005 Oct 28: NCO 3.0.3
    • 2005 Oct 17: NCO parallel benchmarks
    • 2005 Aug 22: NCO 3.0.2
    • 2005 Jun 10: NCO 3.0.1
    • 2005 Mar 24: NCO 3.0.0
    • 2004 Sep 07: NCO 2.9.9 (ncpdq packs data quietly)
    • 2004 Sep 01: Funding for NSF SEI Project begins
    • 2004 Aug 07: NCO 2.9.8 (ncpdq re-orders dimensions)
    • 2004 Mar 04: Submit NSF SEI proposal

    nco-4.5.4/doc/mpi.txt000066400000000000000000000117511264355130400144060ustar00rootroot00000000000000$Header$ -*-text-*- Installing an MPI Environment for NCO: Choose an MPI distribution: LAM-MPI (deprecated), MPICH, MPICH2 (recommended), Open MPI, and PPE (AIX only) MPI distribution-specific instructions are given below, in alphabetical order of distribution for these parallel environments: LAM, MPICH, MPICH2, Open MPI, and PPE (AIX only). Support for Open MPI is new. No other MPI environments are supported. Test NCO once one of these environments is installed. ************************************************************************ Determining the Parallel Environment ************************************************************************ Linux in particular has a large number of available MPI environments. Determining which environment is active may be necessary. The active MPI environment provides a C-compiler wrapper (usually called mpicc) which simplifies building C programs like NCO. mpicc --version # LAM, MPICH, MPICH2: C Compiler/version mpicxx --version # MPICH2 (only): C++ Compiler/version mpiCC --version # LAM-MPI, Open MPI: C++ Compiler/version mpic++ --version # LAM-MPI, Open MPI: C++ Compiler/version mpicc --showme # LAM-MPI, Open MPI: C compilation switches mpiCC --showme # LAM-MPI, Open MPI: C++ compilation switches mpic++ --showme # LAM-MPI, Open MPI: C++ compilation switches mpcc -v # PPE (only): C compilation switches mpCC -v # PPE (only): C++ compilation switches ************************************************************************ Testing NCO in a parallel environment ************************************************************************ 1. Start any required process management daemon Typically, these are lamd (LAM), mpd (MPICH/MPICH2), and pmd (PPE). If regression test results are unpredictable and/or terrible, try re-starting the process management daemon. 2. Run NCO regression tests in parallel mode These two commands are equivalent (Makefile translates the first): make MPI_PRC=3 tst ~/nco/bm/nco_bm.pl --dbg=0 --mpi=3 --regress --udp ************************************************************************ MPI Distribution-specific Instructions ************************************************************************ LAM Instructions: Up-to-date versions of LAM-MPI are distributed in RPM and Deb formats. (LAM features are included in Open MPI) 0. Remove LAM-MPI packages sudo aptitude remove lam4c2 lam4-dev lam-mpidoc lam-runtime sudo rpm -e lam sudo yum remove lam 1. Install LAM-MPI packages sudo aptitude install lam4c2 lam4-dev lam-mpidoc lam-runtime sudo rpm -i lam-7.0.6-3.i386.rpm 2. Start lamd if not already running: lamboot -v # Start lamd in verbose mode 3. End lamd lamwipe # Kill lamd ************************************************************************ MPICH (version 1, http://www-unix.mcs.anl.gov/mpi/mpich) Instructions: 1. Install MPICH packages sudo aptitude install mpich mpich-common sudo rpm -i mpich mpich-doc sudo yum install mpich mpich-doc sudo rpm -i mpich-1.2.5.2-1mdk.i586.rpm 2. Test mpich version: mpichversion # Report MPICH1 version and device (ch_p4 indicates GB Ethernet) ************************************************************************ MPICH2 (i.e., MPICH version 2, http://www-unix.mcs.anl.gov/mpi/mpich2) Instructions: 0. Remove MPICH2 packages sudo aptitude remove libmpich2-1.0 mpich2-doc mpich2 mpich2-mpd mpich2-dev 1. Install MPICH2 (requires python 2.3 or 2.4) wget http://torvalds.cs.mtsu.edu/~zach/debian/1.0.2p1/libmpich2-1.0_1.0.2p1-2_i386.deb wget http://torvalds.cs.mtsu.edu/~zach/debian/1.0.2p1/mpich2-doc_1.0.2p1-2_i386.deb wget http://torvalds.cs.mtsu.edu/~zach/debian/1.0.2p1/mpich2_1.0.2p1-2_i386.deb wget http://torvalds.cs.mtsu.edu/~zach/debian/1.0.2p1/mpich2-mpd_1.0.2p1-2_i386.deb wget http://torvalds.cs.mtsu.edu/~zach/debian/1.0.2p1/mpich2-dev_1.0.2p1-2_i386.deb sudo aptitude install python2.3 python2.3-xml cd ${DATA}/tmp sudo dpkg --install \ libmpich2-1.0_1.0.2p1-2_i386.deb \ mpich2-doc_1.0.2p1-2_i386.deb \ mpich2_1.0.2p1-2_i386.deb \ mpich2-mpd_1.0.2p1-2_i386.deb \ mpich2-dev_1.0.2p1-2_i386.deb cd - 2. Install .mpd.conf in ${HOME} or set START="yes" in /etc/default/mpd 3. Start mpd if not already running: mpd & # Start MPD mpdtrace # Test MPD mpdallexit # Exit MPD mpich2version # Report MPICH2 version ************************************************************************ Open MPI Instructions: Up-to-date versions of LAM-MPI are distributed in RPM and Deb formats. 0. Remove Open MPI packages sudo aptitude remove openmpi_bin 1. Install Open MPI packages sudo aptitude install openmpi-bin openmpi-doc openmpi-dev ************************************************************************ Parallel Programming Environment (PPE) (AIX only): 1. poe requires a hostfile. hostfile defaults to ./host.list. Create host.list with, e.g., echo ${HOST} > ./host.list 2. poe -hostfile=~/nco/bld/host.list -node=1 -tasks_per_node=3 $MY_BIN_DIR/mpncwa -O -D 3 -p ${HOME}/nco/data in.nc ~/foo.nc nco-4.5.4/doc/my-bib-macros.texi000066400000000000000000000147331264355130400164170ustar00rootroot00000000000000@c % csz 20100313 remove next line to prevent "\input texinfo" from @c % appearing in printed output @c %% \input texinfo @c -*-texinfo-*- @c %% my-bib-macros.texi --- Texinfo macros providing a crude @c %% bibliography and citation capability. @c % Copyright (C) 2004 Aaron S. Hawley @c % Author: Aaron S. Hawley @c % Keywords: docs, texinfo, extensions, bib @c % This file is free software; you can redistribute it and/or modify @c % it under the terms of the GNU General Public License as published by @c % the Free Software Foundation; either version 2, or (at your option) @c % any later version. @c % This file is distributed in the hope that it will be useful, @c % but WITHOUT ANY WARRANTY; without even the implied warranty of @c % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the @c % GNU General Public License for more details. @c % You should have received a copy of the GNU General Public License @c % along with GNU Emacs; see the file COPYING. If not, write to @c % the Free Software Foundation, Inc., 59 Temple Place - Suite 330, @c % Boston, MA 02111-1307, USA. @c %% Commentary: @c %%% Introduction @c %% Creates references to a ``Bibliography'' or ``References'' @c %% section of a Texinfo document, using Texinfo's @c %% macro system. Although not as terse a way to cite systems as is @c %% found in document systems like TeX, the format is simpler and @c %% the rendering is easier for non-academic readers. @c % @c %%% Usage @c %% References to cited works can be put in any section of a document. @c %% The cited works must be put in either a Texinfo table (for @c %% instance with ``@table @asis ... @end table'') or within a @c %% Texinfo list (something like ``@enumerate ... @end enumerate'' @c %% or ``@itemize @bullet ... @end itemize''). They are created @c %% with the command ``@mybibitem{REF-NAME}''. To cite a reference @c %% with a @mybibitem use ``@mybibcite{REF-NAME}''. @c %% The beginning of a document must include (using the @include @c %% command) the file my-bib-macros.texi, which should be made @c %% available in the current directory of the parent file. A single @c %% call should be made to choose to use a list or a table. The @c %% command to chose is called @mybibuselist{NODE}, where NODE is @c %% the node containing the location where the references are listed. @c % @c %%% Example @c %% \input texinfo @c -*-texinfo-*- @c %% @comment %**start of header @c %% @setfilename my-file-with-bib.info @c %% @settitle Texinfo with a Bibliography and References @c %% @c %% @include my-bib-macros.texi @c %% @mybibuselist{References} @c %% @c %% @comment %**end of header @c %% @c %% @node Top @c %% @top Top @c %% @c %% @menu @c %% * Introduction:: @c %% * @mybibnode{}:: @c %% @c %% @end menu @c %% @c %% @node Introduction @c %% @chapter Introduction @c %% @c %% The ability of a documentation format to make cross references to a @c %% bibliography, a feature of LaTeX @mybibcite{LaTeX2e}, isn't @c %% currently supported in Texinfo. @c %% @c %% @node @mybibnode{} @c %% @chapter References @c %% @c %% @itemize @asis @c %% @c %% @mybibitem{LaTeX2e} Leslie Lamport, LaTeX User's Guide and @c %% Reference Manual, 2nd edition, Addison-Wesley, Reading, @c %% Massachusetts, 1994. @c %% @c %% @end itemize @c %% @c %% @bye @c %% @c %% This example produces (in Info): @c %% 1 Introduction @c %% ************** @c %% @c %% The ability of a documentation format to make cross @c %% references to a bibliography, a feature of LaTeX (See item @c %% [LaTeX2e] in *Note LaTeX2e: References.), is not currently @c %% supported in Texinfo. @c %% @c %% @c %% 2 References @c %% ************ @c %% @c %% [LaTeX2e] Leslie Lamport, LaTeX User's Guide and Reference @c %% Manual, 2nd edition, Addison-Wesley, Reading, @c %% Massachusetts, 1994. @c %% and (in printed output): @c %% 1 Introduction @c %% ************** @c %% @c %% The ability of a documentation format to make cross @c %% references to a bibliography, a feature of LaTeX (See item @c %% [LaTeX2e] in Chapter 2 [References], page 3.), is not @c %% currently supported in Texinfo. @c %% @c %% @c %% 2 References @c %% ************ @c %% @c %% [LaTeX2e] Leslie Lamport, LaTeX User's Guide and Reference @c %% Manual, 2nd edition, Addison-Wesley, Reading, @c %% Massachusetts, 1994. @c % @c %%% Notes @c %% The pointers to references will be functional in hypertext @c %% documentation (info, HTML, XML and others) and properly rendered @c %% in print documents, because they are implemented with Texinfo's @c %% cross referencing capabilities (using @anchor and @ref). Failures @c %% by an author to make proper references with ``my-bib-macros'' in @c %% their document will give cross referencing errors by Texinfo @c %% conversion tools. @c %% Only one ``Reference'' section is allowed per document. @c %% An improvement of this system would create cross references @c %% (with @xref) at each cited work to all the originating cross @c %% refererences. @c % @c %% Code: @c % Configuration Options @c %% @mybibsetrefnode : Defines the name of the node to contain @c %% references. @macro mybibsetrefnode{node} @set mybibrefnode \node\ @end macro @c %% @mybibnode{} : Macro to be placed at node containing references @c %% and calls to @mybibcite{} @macro mybibnode{} @value{mybibrefnode} @end macro @c %% @mybibusetable : Whether each @mybibitem will be put in a @c %% table. @macro mybibusetable{node} @set mybibtable true @ifset mybiblist @clear mybiblist @end ifset @mybibsetrefnode{\node\} @end macro @c %% @mybibuselist : Whether each @mybibitem will be put in a @c %% list. @macro mybibuselist{node} @set mybiblist true @ifset mybibtable @clear mybibtable @end ifset @mybibsetrefnode{\node\} @end macro @c %% @mybibcite{REF} : Cites the cross reference REF. @macro mybibcite{ref} @ifclear mybibrefnode @mybibmakeref{mybibsetrefnode was not used, \ref\} @end ifclear @c %**else if @ifset mybibrefnode @mybibmakeref{@mybibnode{}, \ref\} @end ifset @end macro @macro mybibmakeref{node, ref} (See item [\ref\] in @ref{\node\, \ref\}.) @end macro @c %% @mybibcite{REF} : Creates a cross referenced citation REF. @macro mybibitem{ref} @ifclear mybiblist @ifclear mybibtable @set mybiblist true @end ifclear @end ifclear @ifset mybiblist @item @anchor{\ref\}[\ref\] @end ifset @c %**else if @ifset mybibtable @item @anchor{\ref\}[\ref\] @end ifset @end macro @c %% my-bib-macros.texi ends here nco-4.5.4/doc/nasa.png000066400000000000000000000255051264355130400145120ustar00rootroot00000000000000‰PNG  IHDRðì0‹åëPLTEŒªÒZ¨`[“塬أ³Þ9I¿ÐæÙâïåÆÐ‡¦ÐË3J;i­Þ.?eŠ¿Ìr†v™Égƒ·t°òöú×âðhJ€}¼‚Dr¼7R¶Øï‰‘àYhIx·ûãå©¿Ý«BblI}†Co™´×vYŠÅax|žËÜåñúÚÝéJV*Y¢ˆ§ÐqH{‹Bm«;[üëì4i¯Ëbwò §¼Íåýïð'W¢íwÝ/@ƒ£ÎhÄL{¹ãêôëjuóáæVRŽ“§ÍV‚¼ã0?¶Éâ³7UðŒ”ö¹¾Óvˆ;c¨ßèóÂÒçô¬²ßä4Cg}²>S—’@i¹8TQ~º6j°VK‡æER¾5Op]–±Ö†i•ÐÔäÓ?Så8Gñ”›äÞ盲â|‰÷ÁÅ/WŸçIVIQ‘Ò4H\L†–?fæ§±éBNÜ\lŒR}É×êådmG|µ8Vê^iù¼À Ìæ@N+b«ˆ˜Áµu‘ì’œóñõ¦<^À6PW¦ëð÷Ú0BÓ1E¬QqÒ/D²ÆàÃG`´_|†˜Â^ˆ¿CtµÍŸ²2Z¡£»Ûk‘ÅTzµ¯ÄàéNZ>p³Öáï­·Ô•@gã.=Ž?jùÓÖ«ªÈÐXlÎnq–ÇýóôYMˆënyøÊÎJZšþ÷ø(_ªî‰äfrZi£ß¯¼DR”dK‚wFw…tŸéÁÉö½ÂíÒÚñ‡øÎÑèVb]‡Àûßá[…¾Ö:M$]©„^ŠÙK]|EuŸ¸ÙGOó¥«ë¼ÄéZfÿÿÿï‡ÅE]õ´ºÆÕèñ˜ŸøÇÊs—È÷ÅÉçMZíz„ô©¯3V:m±,W SO‹îòøY¦úÖÙ¡=aÒÞí¼ÇÞüçècŒÂòœ£èQ^çQ]·†¡êbm¦„¤éîöìs|ÍÚë@c¦õ±¶öùü&`ªØƒ“ëfq¨ÏOO±:YÄ5N1g®¬ÂÞ‘®Ô±«ÉÍà Z§:T™æª´tGyXy³U]™Hw·Ã\t´Nmy IDATxœí}|×–Ÿ¦Ý-5z«¤ ÖP +gÍ/õ)ú‘ݵh%Ö ØËÖm¡-„@ß®¡Û6¿¦}ŒáÅí³ºR_ìÍ„m aå×­I›¾¢N—lšIŸ_œð,ìôbÞkV¨Í’ºÃÒ²öÎ/ifîÑ2Ÿ~>û [šÝûÕ½çžsî9çúø?¾‡üù¾òÃà ¦²/Ž„ëõH0+a.¸y8SK¤ŠÝqÿChËKL%>2Øœ UiNÁ†ÿ‡¿rÓt(Ö3áɇOϲS‹,¥iA€<¦â»\¨/»iäážå!fq$“MW9`EIƒ™. Fɇ&~ÚOL%™ öÑâ´iMŠŽ ®õ¥ÛÞDÚLL¥X‹Æ6+ v@Ç|©x{[‰C;‰©3Ѫà”ÍÈáÒ‘ðhŠCûˆ)…§V 厕;Ü`}rYåM»ˆ™ô¥iÆRj„P4±Œâ¦-ÄTÂò)DÓ¤Üp}ÃË&mÚ@Ìb"JÛ˜B¡T†#½i_·÷-ÆÁsbüc}œy B#ë§m\†"+¼n3‚íŸ{MŒ,OÛ]…BU[wPv·WŸ;ø¸·ÄT}Ó$Ê­KÀQÓqÂËvñÁ›9/‰©Ìfm§Ôéá’w-7à³O?ðRÆ$;ªž®Ï­¨éK´ÉÈ<÷Ôñϼ#ÆŸI/ÓhiPCÏMzÔxr?`¯æ<#f$:½ŒÃE¥¦0Üo×ïó3º©àýp!Pû·4âEûµ8ûûîç¼7ĤòB¦QŒD»aBõQzÐĺYö†øƒ{bCí.Ù„¥¢ë.4ñÄ“,ûÌ:ñ'×Ä$£œS^Ìd@~vŽÌÜb†2ž-O¹X–½”tKÌXÚ±cŒ™It¬³›/ù.‘<‡™žóÈ´ÌÝ`Ùýg¥ŸÝ³ès®Ò®xR+³µÃƒ.äS|w´@fwÃáå‰ Î톼°ß•qELwÖñ4‚ÝIËMb¸È°NT‰LžÜ!Ê2XO»C^Ž¿ãž˜Ù˜;©[(4y(tW¢ú§-ÙŒ`:2ê–—]"/Š„qELmÈ¥N§\$`(ib/Œ¬KAsh¿ÈËñ³¼Kbüu{ÞÛ m#ä]­Û2/ìGêïN‰ñG¦—Ù6j ЕrÎË.™—ýê€qJLiîaÓ€ ;ååû’|aÙƒWœ“\j‡à šqÔÜn…ÉJrAL2ïLì¢Ë/ãí  0“ûšÂËÀ—ÍÓÝçl¸p£@M›*¿AÛVhrd^Ø›9WÄL:äT‹ÉáÖõñ oç$°ÍÌöKý /'/h^¶OLrÐqWò—‡†Çu¯tf¼^ôí2³ý&«â†öuÛÄ8GR£™ÁÑ€ ›<Ï$Á.3Ÿ}Ñàå¥ínˆ‰;”» ¸¾UùÚƒ6¯h6$ð'Ÿ6x9~H÷ŽMbJKnƒ:˜ ?Šã–saQ­‘õ&÷Ãý ^Ø9Ý{öˆñwÚj E zo   ÆïU3!TèVizç¾q€5™H6‰© Ë­FÔPÆ ¹ÐNTfpÄd’î¿€ »éó«ýM^N2¼k‹˜ Ùî;Ô³º¢uß·ç–ÐBsÓøN˜ŠîPÁK9 b-wþßùÕàÆ·í“¨µ‰ë ¤ÔýÓJid}G$G~ëår—™ó x»/¢£–}Éí~FËËÍíÆ l3B²y¨A5îÉï÷Ë릿˜rE¼™#¢ÖD¬\äÛ/ hyyíqä rbˆ;@GD‘$Ó1µ4> Ö×§ä"DѲŒ¦çtÀ¼/gŸÒÒÂJ[N‰ñw’tŠÀA²X§%ñ+‰àét6#Æ1Ç3±euမ{&·K7Xö`½ˆ˜˜a’8)Nü–Â1N//.4žãfq,Ò ÄödûGz^žzs)1)¢·Ã¸+ŽTxÿÆ…åÛü§²81sá =-컨€!'&#è3ç+u“U0Õ©”Ÿ_ÌÄ©©’sZ`éHn÷~/'߯ö˜Œ?‘'sjâ U‡¡£ ?_ª“hrLz¤æšTÌ|ö¤a±»ñ]&#&@¢|1ãþ30ÓÑ24Ð;[ÇF3K•îƒ@ŸnO%÷姬;1‚—˜˜b¡uáÖx+N¨`’¯„[/ýôÔeTaÑtcÝUãpšNð’ƒ7‡`Ò%¾F²ê¤~>î µz¦'î`J4†Ë®wZØ—Ö™uš„²Èmæe¾2N·Á‰ó©=ÑF@L™Lë.@yùñYÓNS\EÔ.Ì—.]³Ö†|%~Ô·ç „_ø·¸áÂÜ0Y¨ ‰é l¨óEÍVH¨žW~âèÀbº@ òp{=ã̯9ƒ£…0S`‰!SaDdø°¶÷ªß®ÍÀ93<Žñè2U¸pw·u¼÷âZ,-,û‘5/­ˆ©t’®PÆÕŒ¯‰˜«¦k•z¯Þsq¾iWj%E¸ô‘£ç覼<Ùškbüäû±b„Æ’¥¶¦ë>iÅ,\7§…½jf83Fnßâˆ!½•‹,òq2ýšÜ‘c¦Â…lµ Ɔ„„¡n>à´€ƒ0WâKSÎn6‚~ãJ ZˆæQ bÕ2¿Þyw–’¼Ÿxÿ×”0³Õ’ö/VÄØ0tŠO8ïÓíƒù×XPž5Ö´ \j¹N·&&lKñâj|ÊÅWÎÄVð•º+f(¨þ[ÓÒÒ #fÎÖ |1ä¢öˆ•]1CQ÷Öܵ¦¥•ÝHHL‘(Y¨Ù1_êr£Û3±ÞïsÌÌž+-F ˰Á‹1{½d‚|ÅÎ*†A:åxÌÌll5ZXö§ÿ!9-ÄØ3e¢›ÌÍì}ÖB¬¨?¼²@uÙ©z`FŒ-åNš´£)ã!2ãï°åï\8fAË«¯¨–Á¾JàÆ< fÖ®“pa>é:/ÄŠv" {Z*ÿûN©ïžš¡(tÚ6#¦n[\ÀõÚï¹—®ãZÐr碪ñS÷TñrjÆòé`ŠLÈ`ˆÉ¸éX‡ %ZC/\oÚÎož{â)<+ЄÕ9å¶óû”×Ì[Ë&Ód0Ä †ÿa¤:'òÝG‰»ˆ‰H—øI}rPsÝÄcM”_0ÔK]¤¨ùÛï®Övÿ ÿÙq´¬|}£”çP½/œiL£Vò±Jæz@‰A·¬;‰ZFm–NŸ¯áÛ‰D6wÒÓcgÎt6¨`nJÁÜÜ W[ªç¹5ûV÷³r:tÿþ¿xêæW7ÏjÄÌ~%yõ+{e´ÜºuëÞë —×‡“aA ¡ôE‰A<Ú †¸JãM+¤›ß@e˜f¢~ƒûo3nN£BªwÏ ÛñÙßò‹¯zü\ŽÏAð¹C;¿úÉþv൷?‰9sêèauÐP&õþ¥LåñoüQ8œ ' ¬¢mÈìH”˜2bA‚(R67ܸˆª‚õ´@Ñ)~QgœsuÌÇŽê%4,O=Ë*c…Ý¿óqCPBnû{vï^Çïêg×®™é¥š³™zäN¾ïÝCÍزùÒÈI_”œßÖg|–Nó(ï&Dá"féÓU°%(ê:V޾ñJS°ô_úÌ´¹ÿíŸ\œ§(m§ç•Uºÿ¦6ÃÆoîÌgbD5KQb"˜GÒȼ,6'PÞ• I>®Ó„°ëÀ¤ì Pÿ¸½f­Ö:ð5‹–M‹’EÃÌÌ6ù®ã?Ðß5lÆ‹ä´wD .k‹É"—i¾rFvr¨¶'Ô |úŒI ÷3¢ÀíYXcð²ø½¸ ½lÜÅÇð…1ÁfÒܦ‰*–"ÄøqþlÝwˆ7m"¦kT|%)Ç€q¾[ß,Ü\Ê gæÊcäv¿®Ò¹³»w^½ôƒö¸úñ:bÀüVùöhü˜Å×zGÄ,>@ŸÀ#¨ÀjbÔl>8@‚Úz´4NsXñ»÷ŸÆ8*ojgÄÛ/I õêmí·pÄ,¼¨¨4Œ‰{1ßâbp«Akb°Îp%¦™ b21ŠbÇ –øYM" ƒ×5ÿNm;ðIó‚Ü"-§_¼r¾—™˜äGf+Zs…â¶(úñ©ŒËÈ7·ø˜æòÖÄŒàÊŒqÌ­ kQ1ªÆËexm Z“ý¿âˆySóÝþs왵{‹âdýñüËq~ä–Ê˽×eÙMiìó+¦®Ì”#b°Ž&ŒŒ3STb”jUÒÙØ›°Ÿ û _[–ãñÿþÆùk@µ†|‚N'”¤J8¿V¾cß‚䆃iF/³äˆ˜®¶ƒ‘1MÉß F½\2ME‡ÆWåÈÝD‰9®Íjýæ/k*9B™ïdªyék£æ•¼’Ó[ïQfnܸYæÓG¢á!Ä`£¢ÜTR—l ÓÝHãëp$n)¿11Ioð#jÕ÷ûb>ý\{Áì£m‚?™VŠe?§l¼r”£¤`},p ™ô¤$ö5B öqØ©¿Y±o¬JëÁ0ïW¥Œ2¥ÿü0Þýùk1/éµ´òåfmÀàB£®½%Kݯ什¸Edé3ØXE²‰Ä“Å‚J-@ZbàI)RFq™]2ÖSãùb¾0(½þL>¤–T…"$3ŠGjå–JóüdŽcéºì„˜)<1Ò{ȰỸ戙ԮguyY€ù›’¢¹ýÝ~cA5Ñ"ÔbÇÚÿ™oþr=&×·­¿‘P¯âØÝ¡:ê€,Âü1y>ka¶Ï‘TŠFˆÁjŒb¬*Äbe$hÐPð&5ñ `¨Ì@™3þØÏJ£àÐû—7oo[8½òÔ Gæñ⢔Фš3Ð&ûíc²®»òþ5eµRÜdué®Y!GR>!f ç^SˆùöûÆ«¥%CŒÀÌñü?ÿ•½wO³;¥ o@ÉŠ˜Ø©°òâÖóó=âºl6ÈãÃi1-ìß”¶ËÞ¼mGŽ:1ø"€ÑÛFMR—‰\UFb*ãÆj‡Ò§Ëq%ˆËJ,çÐøÒš7RÂÿü×ßû=Ñ•Ð/Õ 8÷´hvo¾p€]½òØ–…ê7kUIHÖ Pº|ƒÿr@Ôé´~]ÉBçír®›Ïd.‘„â!Ä`#@”3Åø!¼Y4"K*1©5¿°æWËI©ÔYQ»ÒxóòÆùy4½VÁç¿Þe¿~j?/.h›&G=*j݈kÎl.yѱšr!CÒˆzu–§$6n49Ò}:Ð9TIŠƒ\·âfî¯ë¶@Ÿ$¯k¢ÓaÕ¬l ‰sÓ&1CPëªAb(pøÈÆ}ºÍfÉ“·@‚–H ƒ-D§âòŽäÀ2ÆMÊ­y*#½Ã¼$¦¢C#½ÔÇL(Äô¹²Íà`DÌ:¹[_}sþËú5ЬLüÙ'w÷¿úåÑn]ö‡¼ôÊ.CÔh*ã£H=1SPˆ\F¾ÒÚ´ó÷~}®ñš¤ä)ïzüô'Æ{„еtû ¥ÌÉÇ/¿ÏoÒ^^¾“„”²Â NK|oƒÛ°j_É@4À?.·îqÜ.ó“Ò%—DÕãécG¿mœˆE¤˜00“» lEÿêΓqïPòr)ûÅ:œ±–Ÿ÷SI °Ã¸¶Ãÿç„1òOüÚÓ[/Þë ¢ÀUòÈÇíÕS&äÝ‘Ôwt›Òb­î ÄÓ‚ïxÄ -&yˆÌäÊO­3#F^ˆþèwKË@ƒù1Þ|À-¥Tjr‡^’t`§jxg’‹ÍM)y+WåaVMã¡M2-×—-l¥)y¤l|ÈçO˜óê_—Äífq×ZÜáFã™&1_)ÁÑŒ4¶ÞûHyæ‡o7t îZÓÅĤ­@8aD/¢šc]¿ŽˆÁ&p©SIzÏ,íçñ“:RÎÜ}~Ãí_”žP·¯ƒ>d.am3¨'¦#åoîR¶ó\ÒúijɆ~‚Ò+tUD~O®B‡Œ#“ÀĈTGŒ4dL´°÷šÄœÙw}ËÌ ÿšL"ß&XÒ™iåvP¢›ÁV {O®{ºãî±û3פ¸eÃÉ&ÅåAï[ÊæÊñƒGNw>©„®ƒBëc¯1^·¹‚˜vŃ'§¨ð›ÿ÷(8bvܽ¾áö¼ î.‹&vKàòÞðœö¾ïÓpƒ¿Ï§¤²‚|ëmè8J¼3GλŸ/$ PžûOÿ•Ï‘ñüÏkãÑyNkü‹²Ý è«=ÉN¹ù+Êp9³užž2,5þÁtRñ‘ÄÓ½Œx ˆ2-Èœáà²ô^=G¤j‘I;‘“°irúU ßqIãÍç¦ âó+O«Ãåß8n¸¡U"1òTÒD–¢î8”yY,u‰úî˜: Q¤v35±î{JuÙg×4’$ôyiñ@thÅ'€l¶Â3¦⋆²•·hq5€¢±þ°éÖ_ýJŒl[®¨‚ôd3- ³’ŸÓó?TÿøÛê® úÊZʼnmF¢eýf;†øG Ä8ÛÔ_Druøè¿ˆ¹ h\gÖî=zÑ«K†8 E4ihÜùùQeªÔ ¨&P÷ö*þÐãÿëg†hN<«ft²2!h8‹ÊÕ¼ô|þó`Ôø|cáB¢ØpÔ"4˜×uíâÕß“ÞÛ.0szÛ•#¢ªòÀ¨\3r‹#pëá¿J÷Ñ]hˆ;ŒÜE5ë«wx2õ~$NtëXJf_tfef,dB‚BŒª QZ:)ÕîŸÀѲaÛjöëÊYÇßÿ»Ïoy®‡’”ê0ÞYLëxQ"Å@+0Q†=¾k0F³@íP{^Wœ'o˜Öת$5Qüˆ<’Œþ(1üf1Ug¡fpîjvAoÙG÷µ$pî·§›étCÈ$š‚›i1'ïH.ÂuYì‡Èþ,ÓÛ.o¾cÚØÑæ¹ã ¦.û+ô²DÑÅX·[@3ÓŒ+‡»#Nú“4ÖæÊËÍï‡A›Ð¬ýRh:ƒð@?£âÖ3ötŸ‘ß}C.ÏÜ0/kn–W¤„%•˜Š.?<ÀĵU" Ëq8«; zŽÞ‘V¡¯ðó¿‘\Q|T´`‹©¦“ˆBƒ\!é°_<^I¨XƒTá2º¢KèåáKêÿâ_<üïíßS†Ë¿Ç$î+­;5ß;ÝÙtï–µ%‡`çI\S±’lµÆsBow^­…û_¾õ·V…dÇMkÔ*4 ¢94Ñ—ïÿôIGzƒ.8÷S«Æ³¢éo(î¨3oýd S˜è3Šx"ÒêÕÑÄȈŸïž¡ÅÕLQʼn'’2NÄã³Kkˆ 8l’ÅeŽÔ#Š(<ýâ•Û½r“ĤC ;çž’2Nùoå@;õ{‘ÓMä÷ä‰[F›8ùõ.ѯw{›²HŸzdøxpZÜ$žˆF‰Éx©TŠ—k¾©.N÷Á7MÓc|7=ÍÑÚ²Û\¨‰‰ôDþÿmžGäÁ¦åtÀb¯l­Ü¸p¨0ºß]ˆ¤ ¯ˆ‡/U"ÒÕšW«†ôÊ-×()öIïJÄM‡ °c…*Th0J'š$¦*¾‘ý׉ ®%"&sø¾´Bœ>uÿ^Ëì30sH 0”’òV4‹Ô*/;®Kñ.Ù˜~‰ÑPýãÒqŒ¯¥5È"æ1Äœû))®xåë·{\B /§‘<ùA(UË“£™ßÙŒw!œ*Ê^„˜Ü®/ Þ¿úEƒEmfø‹b¦aN ÔŒZޏE# ¯·Ÿ¾É8Jͽ}ó€8‡6ÌSi뮈Ú]¥Î)žl5CÂÉpDo„¿Ûö¡Ð@p^œ{ç*\7OÞüƒ¤Z„WUŸEI١µ¶-´¼Íäa³~ÛÙïÄd4Äœ½i9þÝwr#í:("ý¨xâ$C5NRXyÅÑpêúd¢{°¡ÜVĬ;¸Òòä;9ûe6mA4šRCóo¨ÃåˆóÁÉdu¦u rD©'MbÎíþ Ëܼ EŽË¤€û64þ@.gœAZ°›Ç­€B‘ 47 Ëâjóñ›p)új—×hý ÎA>Wî8•. ¦ÃÍ¢Q 4¦Ë„§±U“ìÖY·6ôÓšf­Eªø3¿¦ —-’ê[c“îH'ÝÚÂÆ²4‡Ñœ˜CïŠA9Ú \|,ˆ' ®]QBôÖžw«)AIªÝÐë̃øò²ÄE%!1ïíþê«Oô»!ŽÊ½ሒõ:pé/ºW @zTWv¸i>p¡±‘AÌ™NDù*1Pôƒÿ\{æÕs_1~üv.é^Äs¡¤ÖGÏEe.¸têKÅ—ÝPB戉A€nxÕXý­ÿ ?$>çòÈ©`j.åoÚ‘àr¥¤$œÐ¡¥îÅ`©²MZ<Æ”GEH[¡çbÃè‘"Ÿü>W“«ñ™@E[e"5ÖÈ>d¢”vÌÖ]b¼(¤5¿WñÞ9"*â§Tj®ŠÃÅ6§çt9¡tsˆ€¦ˆyy@SbFí:¶Î+IÒg¤Ê7j¥ŒrŸ›‡2Ì6žG|¯Š9|΃BÇÚ VÏÞ[»ÀÉ«‘R)#nqZÁs+f ÅÔQ¢¥Ý3âEÉbµAÔŒâ§;½w*h¥@%S°»nkT—tü;ÄÎùUBÝãöT -{¯+7p šQ±©.[OÕ¾¦Z1kN ݙխK¤•Þ,‰±}`ÕƒG©¥)ØSGtìSö£¶ÓYiʺ\Ä—yícþQ­S ¡3Nˆ)ü6Áåc2µ J’ôé5KºYȨÛÎIN VS6ý²™47;‰%†O\%Öë‚7G|ˆ©k.Àäý'Äà:Nuw¿‚©7Ö©n–’Ÿ_*BËÓ#|DHuWqÄd¤Ø Y)Ö»ô„˜bÁ”aSC¢ÿRŽ5Z-'넹QåÃÌ Y s}‰Á½åK %È;¢×òà)—gß A-tA)Û÷ììV ¦÷HÊÙéA`zO ‡xc(²èbÈ[Ńáî+Ê˾ۦ=Ë—¥Ï"=#ÙQø¶†ØÓ’?ÆüÕE\˜nJ æ¥m€þþÓ{ï™_ üu IDAT ¾îÅRÀéwPHâ‚)qŸƒ†f8&†CÇ·† ŠÌY-éÏÉž—þ•/ôZ„!9 @l1L6 MòœÓ,¶Ôx|ᑆuÉDqqú š…’¶œ’° dþi`K¹kE ªäz3e LŒÌjhC¥Nö¼ìØ{¸]{wR"øê%è…y$ Ý 1~cB7ÏhCœY„µGq`®|Œk'/¢’Ofºpß±ÉK‹cÃFɦ¯Y‹—¾ q4€Þð ”ôwiˆ19‡]À%E»#ÆæInrµß^e•Þ±×õö\¨Qo¼2ÒœÍ`¢ü>~€bòŽ]ç,¼¨G•ÞÔ ÀaE¼¬|¡=ÓˆYZÑs5ÝöÉÄÈûøå _ê– çïTØXêL$kœêzyñ¶ëm#<˜¥¢B 4—õ974MãŽC!{J/1ES¯l]ª#ª78±p·­ÓHúÅ6³OÂúu¤ÑÒÒ¤Y6‰1/^}0øÈ„äHÃ3[Ú¹©NÀ)¿qÙÙ ä‰Ñ)å mˬ&%&nvÖ’XËk¿!êÚšêî«&kÍ&EÍ>Mcë4®‹%õÕ9®z¹{4X …|DFV£ð„óÒŒ¢n±Ül5ÿº,^®kØØœ°ZI7Br¹¹`m“*ÄCH˺yÎ¥ç¾|@×´¢ŒÛÕ퉩̙w,O5ˆ¡”bÌ;®ôjøè³ 3tÄžÎétg}.ÍaÔ% \^Áw†à ‰ò ü7ÕFדdY;!†_a`ÅÅšP¥,¨ñd€ìì¥2•ÒÉÊFêÁ­#¢t`”/£Gf€Á¨>­y‡ôÜ ûÄðS˾QíŠ óŽ106Òž1ø˜.õe2ƒPvH'>:­ÅùÑaÌz †Œ›îJUÇöSi}0wÿ´¼o4ßêJû 7­¯O$2u_‡¯žIÅ+|1Ó‡}€6$† ˜FÞÃO¶ŠVì‘kàŸ¹ïÝ©Sz0€+ŒwÖÇf‹ÅâH-òHˆÔWáD…!'ÆpЀÔü1Y¼˜ƒå §Ä4g¶R¡·äN$Rb*A‹O§öÈV@3îÝÚç©i7aÿœ„H²sJ 7ß,¤f¤­€k–H’)EÑ– œ{ÜçŒR­ñé·×Ê$.Bßé afSÙUxLkLÙ7ªmÃLàó+eñ¢QêÀD·6-Älbq›Ê˜:IÞé"éuEL%ˆÝ2»ø¬äñÖk/\A28>o8hïTçÆ1Xk’Û òÒÿºÑÇ Ïæ5;T‚TF;‚IqÊ6£ËM“?[N;s¥Ç¢‡ ”‰¶±ÿæÀxÕbø°Q_½ +[›Öî5ÙäS³ŽljgÄÎæî]#¦ï{®­$úÜ^ÛÄð>ÍÒÔ+C~ÝôpÓ‡ ±bͲSiœ§J]Û*ju[ÛçÚu&íÌãœ~4+Aõlé+Èí²'[ ¹æÅ.1||I>w/œGÏZú ð‰TÞuÞ"²„¶çì1ü ±ôõ7¤Xf«†ÇœõK®Ï4vÐ.,$ÄðÉ<ÕsŒm•DÎd‘]'Ò£fñ^n;çÄðÉŸÇË1+± ˜j-ÓÎüÁjG/à /î;Äœû%ÑÉ`•þz«Ð—á+õ¾BÛ°i˜ð†Äl¿:—#Ë.s¡Áïßœö0 ‘¡ðˆyïM–=ùg­Á•šHoªžñ y±9#æìK,ûÌÇübg‹YÂ,µSøš à^¯sJÌ;ï²ì‡b=6¿oÚr@0ƒ±å&†‰9ˆöðˆ˜ ?fÙ¯ä£]*ÃÖ„^n#\&Oxôš˜CϰìÍFñg$\ÿapSŽwJ\óå~–ýHSî±<ØVœºîÂñí’˜ÝÇÙºÔõøÔ²¯@¡æõ4AF̹ìþ·ñïù3®RáÜÒ"d½ŸF"ˆˆ9wi€}Æ„ˆ‘¥‡´•º¡aW#$Äœû.4SÆ4X|¿å¾Ì¸hÙ#³ýj?ûÚÇÖ׳íõdâ‘´i¸ðDÄìdÙO/´ºÈ_‹ Ë+jàbd£Tƒm´&&÷û©yï&âõUËÈ ÆÃíXŒ æ¥ýVòEƒâ½LÔ¡ëýQwo…ÖÄlÊ|=2 ^¢q‡{Ì …ºÛØ– s0Ž)üáËí¦€tG;…‹‡qÓæ¨$–¦Û¹q"òÚω£&5UmϨP¶ /ÃhÑbਠº,²‚r"nVÑ—ß_–Ñ"¢-Ä@$‡cž ÀCS©öésÚE ´Rt> :@Ï€l'ÚG DrýÔ.ÛÈ&+ó-ç`‘ÐVb ´éþQvâ–xf‚3V ÎRížmo+qh31"âµH>„«Æßš”[éìpy¹ÇŠŒe Â_¬Íu…8häHi° GOäëáe[„,1"F“a_6Våù¤³Q"&çBN:3Åø² [#– £ÅDÆ×™O‡h±ä£|` #Û"p] ue#õÔò.@X,312üñîâl¸V Ô#ê9ØÃ™Z"|Jd<bþÀŸc‚ÿ”æZnsm_nm == nsm_nm[nsm_idx]){ensemble statistics}; else skip/continue; ---or--- fl_idx=0,fl_nbr-1 nco_nsm_rfr(): new. refresh mbr_nbr, mbr_nm for all ensembles OpenMP over var loop: var_idx=0,nbr_var_prc-1 mbr_idx=0,mbr_nbr[var_idx]-1 ensemble statistics (same as ncea) nces code change details: nco_bld_trv_tbl() first include/exclude -g -v --unn options. few if any changes. multiple (nsm_nbr) copies of each output ensemble member are now flagged with flg_xtr before nco_fll_var_trv() implement new function nco_bld_nsm(), similar to nco_bld_rec_dmn() nco_bld_nsm() crawls trv_tbl and identifies similar leaf groups as ensemble members their common parent group is the ensemble parent nco_bld_nsm() sets flags/variables/arrays in member and parent groups/variables: nco_fll_var_trv() exports, for ncga, var list containing only variables with (!flg_mbr && flg_xtr) and (flg_mbr && flg_nsm_tpl). nco_var_lst_dvd() for ncga: as usual coordinates are typ_fix variables with flg_nsm_tpl are typ_prc variables without flg_nsm_tpl are typ_fix. nco_xtr_dfn() for ncga: if !flg_nsm_tpl then grp_nm_fll_out=gpe(grp_nm_fll_in) (same as usual) if flg_nsm_tpl then grp_nm_fll_out=gpe(grp_nm_nsm_prn)=gpe(grp_nm_fll_in-grp_nm_in)=gpe(grp_nm_fll_in,:-1) nco_cpy_fix_var_trv() for ncga: if !flg_nsm_tpl grp_nm_fll_out=gpe(grp_nm_fll_in) (same as usual) if flg_nsm_tpl grp_nm_fll_out=gpe(grp_nm_nsm_prn)=gpe(grp_nm_fll_in-grp_nm_in)=gpe(grp_nm_fll_in,:-1) nco_nsm_rfr(): nsm_nbr and nsm_nm never change for these ensembles, refresh mbr_nbr, mbr_nm once per file nco-4.5.4/doc/nco.css000066400000000000000000000051201264355130400143420ustar00rootroot00000000000000* { display: inline; } texinfo { margin: 3em; display: block; max-width: 50em; } para { display: block; margin-bottom: 1em; text-indent: 2em; } para[role="continues"] { text-indent: 0; } setfilename, settitle, setvalue, clearvalue { display: none; } titlepage { display: block; margin-bottom: 4em; text-align: center; } titlepage > booktitle { display: block; font-size: 200%; margin-bottom: .2em; letter-spacing: .2em; } titlepage > booksubtitle { display: block; font-size: 140%; margin-bottom: .2em; letter-spacing: .14em; font-style: italic; } titlepage > author { display: block; font-size: 110%; margin-bottom: .2em; } titlepage > para { text-align: justify; margin-bottom: 1em; font-size: 75%; display: block; } nodename, nodenext, nodeprev, nodeup { display: none; } menu { display: none; } chapter, section, subsection, subsubsection, unnumbered, unnumberedsec, unnumberedsubsec, unnumberedsubsubsec, appendix, appendixsec, appendixsubsec, appendixsubsubsec { display: block; margin-bottom: 2em; } chapter > title, section > title, subsection > title, subsubsection > title, unnumbered > title, unnumberedsec > title, unnumberedsubsec > title, unnumberedsubsubsec > title, appendix > title, appendixsec > title, appendixsubsec > title, appendixsubsubsec > title { display: block; margin-bottom: .2em; } chapter > title, unnumbered > title, appendix > title { font-size: 150%; } section > title, unnumberedsec > title, appendixsec > title { font-size: 140%; } subsection > title, unnumberedsubsec > title, appendixsubsec > title { font-size: 130%; } subsubsection > title, unnumberedsubsubsec > title, appendixsubsubsec > title { font-size: 120%; } /* Counters */ chapter > title:before { content: counter(chapter) ". "; counter-increment: chapter; counter-reset: section; counter-reset: subsection; counter-reset: subsubsection; } section > title:before { content: counter(chapter) "." counter(section) " "; counter-increment: section; counter-reset: subsection; counter-reset: subsubsection; } subsection > title:before { content: counter(chapter) "." counter(section) "." counter(subsection) " "; counter-increment: subsection; counter-reset: subsubsection; } subsubsection > title:before { content: counter(chapter) "." counter(section) "." counter(subsection) "." counter(subsubsection) " "; counter-increment: subsubsection; } indexterm { display: none; } acronym > acronymword { font-family: monospace; font-variant: small-caps; border-bottom: 1px dashed black; } nco-4.5.4/doc/nco.png000066400000000000000000000037071264355130400143470ustar00rootroot00000000000000‰PNG  IHDRBkæPLTEÿÿÿ¥ÙŸÝ pHYs  šœtIMEÕ 6 åߢlTIDAThÞ•š[lEÇg³Ú}à²Q(IíÆ[ˆ1‘[0…%ÆË‹ ‘⃡Jb_|Àµ²‹ 5X¥F1ÑTcQ£À¨Ä.6¡Š&&j"˜niJK4ai¹lévÆ™=gggöìéù»MÏžß™ý.³ß7ó}CX£+!úgJø5;"b̆„)Bìú%Õ«>fˆ]ÉM ‰%BÜ:H#V9B‰r•#±Š¸¥H "V)¢ŠN ’hñJHGœ$Ыщ\˜)ˆ’ “#Qqj ˆX5ˆ_DÌ"BIÍUD’ZÄ+ Q-â°± ˆ_‹˜¤–Èì›!%Ò¢#qâjHT†8–!¶†øeˆ©!eDU¥*BK¢"I9â)H\ޏ •#Ž‚„刭 A9b)ˆ_Ž˜ RNT SA꘥b˜„Ìb–Ša*H\q%ÕC‰„õ["Af†¤Ä0Ä—?¡µ†© Êìˆk “"T £~Ñ09b–E_‰$Zøó ¶K‘X‹èQÁv)¢µn» ÕçèOR‘²ÜV±Uй>!¿™èæM_†šŽ§›7CÜLæ;êLÎ\ß´BKUÛ¨ TŠBIÓŠ˜h–ˆ=gþ„x´I¤UÒöüvþÁW= XFaŸt>lsEÕUDªÜù¨é›ª¼$ʤål²ý\`¨ò:)f>Œˆ‘l\µV“×®"v&­™¬=ÕÎ/"A>'­x¨y‰¦’UE¼LZ+þeÝJþ˰€øy·§~~¼…¨.0+ˆ!r&÷Ìiå·ã’)ÄGw'ý¯{¹ïÅ)""ÞXó3ÝüÁTGhæ!®;³õ½Á@›UÄÍ‚¼Áö<÷dÈ5ô5$©êœÙLŸ‹ùorGz)"²è2ï䢄?9ÔØo¡?Ñq±‡q$7Œ+Sêì„÷ºù¶bD¦ÔÙÝñçÐøk,TÕ#Kf-j 0z\ܡڙØÜÉf>qS1Œ-,‘+´»[ïP£ˆ¸Ò‰¾ÓÊØ É %<$ð2×ï!F»|ÏWÒ•#\çØ¢Œ~AâgN4'G¦.1v8$í^Ž˜Ù‘él·Y{:6o‰—›7G¸Îî™wԾÞÚïææH–ö ÖóÍèÞMÿÝ|c¯››×àˆUÕÙ¢ –ÝÚ¾búöÃÝï”!!·ôƒóÿYÊØEçõÜ¡vÕ‰,^¶ ›`æ{ÚŠ“$ÂãA¼<úHüûÝc¶âŽ8…ø4Úê Šÿ—.îîR<¤ºvàÖzyhS*ùP—ŠtV1õ‚Xê‹):¹SqGÒÛbÒøÕwûFO¿†Ä)âó¿ät™Iúû?¶‘8½-B°Ñ“ s׉Z$±„8Û³åëÃJæj#Sé|âšGM»«aþÊ‘PC.§¶å¿æNW‘“Ò’"Ôàâ’•÷UD¿ •LÛB&…Uš>ÿ¦¯Žrmè‘`ÞS|’Nöf9vnè峡…Œ ­ÚËÉùÁl5AEæ $"Sbêý$èêv·€øÆåçè"öö«òGhŽ\â¼5''X“6Іð0ܵãÅmsº3YNmÑA>3œá[údÛ:±ÅɧÝMdP¼AÃí§ÙtUnÏ®êÈÝiÛ·ø‚Ü+ž) úʳOJ䆎ü(²hïÏ·âߪ!ÇE.v×36ýR>Jd«+écYó7˜= âÑ7Ål:*‘}"\矣lfgÿ¢O"»t$ä–›lú”ñ«DF‹ˆÉn^sˆÑ/‘Ó:ð¸¾pxÈY‰,,"óɶ•+ø×%ò¥@Bi&ñ‘ëZuäñI»9qr“: }_Gº™o]Û½Xe¹Žô½Õi_ò­œ2¢#Ôrà }C*2³YäËIZÉå+‡´çLÞ-wO¸r¾€ŒìݶA¯ý5ò¿Gd4ìXðàih¾4œuÀÜÞà=ÞFà"_€(Ä:$bq·qôrI€|d5 7b¶Qž²=°fVÀúXk)dEÖx]¬‘5fã•*°ÞEVÍ×ÞÀ Ù» `Oìl€ý°ËöjÀŽÙ76Þ}{X`' ì§]9°·*@¨V5¤rÔ_€*P *J@] ¨n52 ÒÔ뀪P;*@©†5U 2 Ôw£ÆUb Ö T¬º7P=jð@%é] 7t8€> Ðmz6@çé]( —tÄ€¾Ðz|@§é7]K ÷ tPiã>,ÐÍEzÂ@gèO]n WtÜ‘¾=ÐýÎ'ó À©àlpB9çœΜ'Wó/À)ä,p¢8„œ.*=£ô¨ Zã MîœIEND®B`‚nco-4.5.4/doc/nco.texi000066400000000000000000033404001264355130400145310ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c \input /home/zender/texinfo_fedora.tex @c \input /home/zender/texinfo_ubuntu.tex @c 19980817: TeX-based systems (texi2dvi, texi2dvi --pdf) require texinfo.tex @c Hyper-text systems (texi2html, makeinfo) do not require texinfo.tex @ignore $Header$ Purpose: TeXInfo documentation for netCDF Operators (NCO) URL: http://nco.sf.net/nco.texi Copyright (C) 1995--2016 Charlie Zender Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. The license is available online at http://www.gnu.org/copyleft/fdl.html The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Charlie Zender (yes, my surname is zender) Department of Earth System Science 3200 Croul Hall University of California, Irvine Irvine, CA 92697-3100 After editing any hyperlink locations, Emacs users update indices with C-c C-u C-a texinfo-all-menus-update C-c C-u C-e texinfo-every-node-update Multiple files: M-x texinfo-multiple-files-update Usage: export TEX='tex --src-specials' cd ~/nco/doc;texi2dvi nco.texi;makeinfo --html --ifinfo --no-split --output=nco.html nco.texi;makeinfo nco.texi;dvips -o nco.ps nco.dvi;texi2dvi --pdf nco.texi;makeinfo --xml --ifinfo --no-split --output=nco.xml nco.texi;makeinfo --no-headers --output=nco.txt nco.texi cd ~/nco/doc;/usr/bin/scp index.shtml nco_news.shtml ChangeLog TODO README VERSION nco.dvi nco.html nco.info* nco.pdf nco.ps nco.texi nco.txt nco.xml ../data/ncap.in ../data/ncap2.in zender,nco@web.sf.net:/home/project-web/nco/htdocs;cd - dvips -o nco.ps nco.dvi dvips -Ppdf -G0 -o nco.ps nco.dvi makeinfo --html --ifinfo --no-split --output=nco.html nco.texi makeinfo --no-split --output=nco.info nco.texi makeinfo --no-headers --no-split --output=nco.txt nco.texi makeinfo --xml --no-split --output=nco.xml nco.texi makeinfo --docbook --no-split --output=nco.xml nco.texi pdftotext nco.pdf nco.txt ps2pdf -dMaxSubsetPct=100 -dCompatibilityLevel=1.2 -dSubsetFonts=true -dEmbedAllFonts=true nco.ps nco.pdf texi2dvi --output=nco.dvi nco.texi texi2dvi --pdf --output=nco.pdf nco.texi texi2html -monolithic -verbose nco.texi texi2html -l2h -l2h_tmp=./l2h_tmp -monolithic -verbose nco.texi # Invoke latex2html # 20130806 Copy CMIP5 images (takes additional time) cd ~/nco/doc/xmp;/usr/bin/scp fgr*.png fgr*.eps zender,nco@web.sf.net:/home/project-web/nco/htdocs/xmp;cd - # 20120203 Copy all nco.html PNG images (takes additional time) cd ~/nco/doc;/usr/bin/scp nco_*.png zender,nco@web.sf.net:/home/project-web/nco/htdocs;cd - # 20130801 Copy nco.texi to Ubuntu machine for quick build-tests scp ~/nco/doc/nco.texi givre.ess.uci.edu:nco/doc NB: @cindex references in footnotes propagate to PDF file, not to HTML files, bug-report sent to makeinfo people 20040229 Producing HTML, makeinfo vs. texi2html: makeinfo: Better format overall Uses node names for cross references and index Acronyms look better Excludes @ifinfo sections by default (override with --ifinfo) texi2html: Index sub-divided by first character More fancy options (e.g., latex2html), though none very useful Misprints title Includes @ifinfo sections by default Official TeXInfo documentation: http://www.gnu.org/software/texinfo/manual/texinfo/texinfo.html Legend (defined in "highlighting" section of TeXInfo manual): @code{}: Program text, e.g., @code{if(foo) x=y;} @command{}: Commands, e.g., @command{ncra} @dfn{}: Define use of term, e.g., @dfn{supercalifragilisticexpialidocious} @email{}: E-mail address, e.g., @email{surname at uci dot edu} @emph{}: Emphasize text, e.g., @emph{important} @env{}: Environment variable, e.g., @env{HOME} @file{}: Filename, e.g., @file{in.nc} @html: Text until @end html passed without translation @ifhtml: Text until @end ifhtml passed with translation @kbd{}: Keyboard input, e.g., @kbd{ncra in.nc out.nc} @key{}: Key name, e.g., @key{ESC} (rarely needed) @option{}: Command-line option, e.g., @option{--dbg} @samp{}: Extended commands, character sequences, e.g., @samp{ncra in.nc out.nc} @uref{}: URL with optional alternate text, e.g., @uref{http://nco.sf.net,NCO homepage} @url{}: URL, synonym for @uref @var{}: Metasyntactic variable, e.g., @var{input} @verbatim: Anything goes inside environment (no @'s needed to protect special characters like braces) @verbatiminclude: Insert contents of file here, e.g., @verbatiminclude{nco.sh} @example: Quoted environment (@'s needed to protect special characters like braces) @w{}: Unbreakable text, e.g., @w{of 1} Use '@*' to force hard carriage return Use '@:', after periods, questions marks, exclamation marks, or colons that do not end sentences, e.g., 'vs.@:' Use '@.', '@!', and `@?' to end sentences that end with single capital letters (e.g., initials) Resources: Octave TeXInfo manual shows clean TeXInfo structure /usr/share/doc/octave-2.1.34/interpreter/octave.texi @end ignore @c Start of header @c No variables may be defined before TeXInfo @setfilename header @setfilename nco.info @c Define edition, date, ... @set nco-edition 4.5.4 @set doc-edition 4.5.4 @set copyright-years 1995--2016 @set update-year 2015 @set update-date 1 January 2016 @set update-month January 2016 @settitle @acronym{NCO} @value{nco-edition} User Guide @c Uncomment following line to produce guide in smallbook format @c @smallbook @c Merge function index into concept index @syncodeindex fn cp @c 20090226 Add bibliography capabilities as per @c http://lists.gnu.org/archive/html//help-texinfo/2004-12/txtPW9h_VG8ez.txt @include my-bib-macros.texi @mybibuselist{References} @c 20150616 Add version info as per @c http://www.gnu.org/software/automake/manual/html_node/Texinfo.html @c Seems to require running automake --add-missing on local maching @c Nightmare because it means clients must run autoconf @c @include version.texi @c end of header @c TeXInfo macros may not appear before TeXInfo @setfilename header @c [idx] Index @macro idx {} i @end macro @c [m s-1] Meridional wind speed @macro wndmrd {} v @end macro @c [m s-1] Zonal wind speed @macro wndznl {} u @end macro @macro xxx {} x @end macro @c TeX macros may appear anywhere after line 1 @tex % Define TeX macros to roughly correspond to LaTeX style files % Use \gdef instead of \def to make definition persistent across TeX blocks % These should be consistent with any TeXInfo macros % 1. Primary commands \gdef\dmn{D} % [dmn] Variable dimension \gdef\rdr{R} % [dmn] Re-order dimension \gdef\shr{S} % [dmn] Share dimension \gdef\dmnidx{n} % [idx] Dimension index \gdef\dmnnbr{N} % [nbr] Dimension number \gdef\rdridx{r} % [idx] Re-order index \gdef\rdrnbr{R} % [nbr] Re-order number \gdef\shridx{s} % [idx] Share index \gdef\shrnbr{S} % [nbr] Share number \gdef\dfr{{\rm d}} % [frc] Math differential fxm: upright \gdef\idx{i} % [idx] Index \gdef\psl{\epsilon} % [frc] epsilon \gdef\iii{i} % [idx] i \gdef\jjj{j} % [idx] j \gdef\kkk{k} % [idx] k \gdef\lmnidx{i} % [idx] Element index \gdef\outnbr{J} % [nbr] Number of elements in output hyperslab \gdef\lmnnbr{N} % [nbr] Number of elements in input hyperslab \gdef\tllnbr{M} % [nbr] Tally (number of valid elements in input hyperslab) \gdef\me{{\rm e}} % [frc] Math e fxm: upright \gdef\mi{{\rm i}} % [frc] Math i fxm: upright \gdef\mpi{\pi} % [frc] Math pi \gdef\mpp{\cal{M}} % [map] Map \gdef\mskflg{m} % [flg] Mask flag \gdef\mssflg{\mu} % [flg] Missing value flag \gdef\qqq{q} % [ltr] q \gdef\tm{t} % [s] Time \gdef\prmsbs{\prime} % [sbs] Prime subscript \gdef\wgt{w} % [frc] Weight \gdef\wndmrd{v} % [m s-1] Meridional wind speed \gdef\wndznl{u} % [m s-1] Zonal wind speed \gdef\vvv{v} % [ltr] v \gdef\xxx{x} % [ltr] x \gdef\yyy{y} % [ltr] y % 2. Derived commands \gdef\pslavg{\bar{\epsilon}} % [frc] Mean error \gdef\pslmax{\epsilon_{\rm max}} % [frc] Maximum error \gdef\pslmin{\epsilon_{\rm min}} % [frc] Minimum error \gdef\pslmabs{\epsilon_{\rm mabs}^{+}} % [frc] Maximum absolute error \gdef\pslmibs{\epsilon_{\rm mibs}^{+}} % [frc] Minimum absolute error \gdef\pslmebs{\bar{\epsilon}^{+}} % [frc] Mean absolute error \gdef\dmnvct{{\bf \dmn}} % [vct] Dimension vector \gdef\dmnprm{\dmn^{\prmsbs}} % [vct] Dimension prime \gdef\dmnsubnnn{\dmn_{\dmnidx}} % [dmn] Dimension sub nnn \gdef\shrsubnnn{\shr_{\dmnidx}} % [dmn] Share dimension sub nnn \gdef\shrsubsss{\shr_{\shridx}} % [dmn] Share dimension sub sss \gdef\dmnsubnnnprm{\dmn_{\dmnidx}^{\prmsbs}} % [vct] Dimension prime sub nnn \gdef\dmnvctprm{{\bf \dmn}^{\prmsbs}} % [vct] Dimension vector prime \gdef\rdrvct{{\bf \rdr}} % [vct] Re-order vector \gdef\shrvct{{\bf \shr}} % [vct] Share vector \gdef\xxxprm{\xxx^{\prmsbs}} % [ltr] x prime % 3. Doubly derived commands @end tex @c install-info installs NCO info into this category @dircategory netCDF @direntry * NCO:: User Guide for the netCDF Operator suite @end direntry @iftex @tolerance 10000 @end iftex @c Set smallbook if printing in smallbook format @c Example of smallbook font is actually written using smallbook @c In bigbook, a kludge is used for TeX output @c set smallbook @clear smallbook @tex % fxm: Try to get thumbnails working with texinfo --pdf -generated PDF files % \input thumbpdf.sty % Experiment with smaller amounts of whitespace between chapters and sections \global\chapheadingskip = 15pt plus 4pt minus 2pt \global\secheadingskip = 12pt plus 3pt minus 2pt \global\subsecheadingskip = 9pt plus 2pt minus 2pt @end tex @c Experiment with smaller amounts of whitespace between paragraphs in the 8.5 by 11 inch format @ifclear smallbook @tex \global\parskip 6pt plus 1pt @end tex @end ifclear @c Uncomment next line to remove ugly TeX warning blocks from overfull hboxes @finalout @ifinfo This file documents @acronym{NCO}, a collection of utilities to manipulate and analyze netCDF files. Copyright @copyright{} @value{copyright-years} Charlie Zender This is the first edition of the @cite{NCO User Guide},@* and is consistent with @w{version 2} of @file{texinfo.tex}. Permission is granted to copy, distribute and/or modify this document under the terms of the @acronym{GNU} Free Documentation License, @w{Version 1.3} or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. The license is available online at @uref{http://www.gnu.org/copyleft/fdl.html} The original author of this software, Charlie Zender, wants to improve it with the help of your suggestions, improvements, bug-reports, and patches.@* Charlie Zender (yes, my surname is zender)@* 3200 Croul Hall@* Department of Earth System Science@* University of California, Irvine@* Irvine, CA 92697-3100@* @ignore Permission is granted to process this file through TeX and print the results, provided the printed document carries copying permission notice identical to this one except for the removal of this paragraph (this paragraph not being relevant to the printed manual). @end ignore @end ifinfo @setchapternewpage odd @titlepage @html @end html @html @end html @title NCO User Guide @subtitle A suite of netCDF operators @subtitle Edition @value{doc-edition}, for @acronym{NCO} Version @value{nco-edition} @subtitle @value{update-month} @author by Charlie Zender @author Departments of Earth System Science and of Computer Science @author University of California, Irvine @html

    WWW readers: Having trouble finding the section you want?

    Search for keywords in the (hyper) index at the end

    @end html @c Include Distribution inside titlepage so that headings are turned off @page @vskip 0pt plus 1filll Copyright @copyright{} @value{copyright-years} Charlie Zender. @sp 2 This is the first edition of the @cite{NCO User Guide},@* and is consistent with @w{version 2} of @file{texinfo.tex}. @sp 2 Published by Charlie Zender@* Department of Earth System Science@* 3200 Croul Hall@* University of California, Irvine@* Irvine, CA 92697-3100 USA@* Permission is granted to copy, distribute and/or modify this document under the terms of the @acronym{GNU} Free Documentation License, @w{Version 1.3} or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. The license is available online at @uref{http://www.gnu.org/copyleft/fdl.html} @sp 2 The original author of this software, Charlie Zender, wants to improve it with the help of your suggestions, improvements, bug-reports, and patches.@* Charlie Zender (yes, my surname is zender)@* Department of Earth System Science@* 3200 Croul Hall@* University of California, Irvine@* Irvine, CA 92697-3100@* @sp 2 @c Cover art by Robynn Rudel @end titlepage @c Print table of contents @contents @node Top, Foreword, (dir), (dir) @ifinfo @top NCO User Guide @c node format: node-name, next, previous, up @ifhtml @cartouche @html

    Note to readers of the NCO User Guide in HTML format: The NCO User Guide in PDF format (also on SourceForge) contains the complete NCO documentation.
    This HTML documentation is equivalent except it refers you to the printed (i.e., DVI, PostScript, and PDF) documentation for description of complex mathematical expressions. Also, images appear only in the PDF document due to SourceForge limitations. @end html @end cartouche @end ifhtml @ifnothtml @emph{Note to readers of the NCO User Guide in Info format}: @emph{The @uref{./nco.pdf,NCO User Guide in PDF format} (also on @uref{http://nco.sf.net/nco.pdf,SourceForge}) contains the complete @acronym{NCO} documentation.} This Info documentation is equivalent except it refers you to the printed (i.e., DVI, PostScript, and PDF) documentation for description of complex mathematical expressions. Also, images appear only in the PDF document due to SourceForge limitations. @end ifnothtml The netCDF Operators, or @acronym{NCO}, are a suite of programs known as operators. The operators facilitate manipulation and analysis of data stored in the self-describing netCDF format, available from (@uref{http://www.unidata.ucar.edu/packages/netcdf}). Each @acronym{NCO} operator (e.g., ncks) takes netCDF input file(s), performs an operation (e.g., averaging, hyperslabbing, or renaming), and outputs a processed netCDF file. Although most users of netCDF data are involved in scientific research, these data formats, and thus @acronym{NCO}, are generic and are equally useful in fields from agriculture to zoology. The @acronym{NCO} User Guide illustrates @acronym{NCO} use with examples from the field of climate modeling and analysis. The @acronym{NCO} homepage is @uref{http://nco.sf.net}, and there is a mirror at @uref{http://dust.ess.uci.edu/nco}. This documentation is for @acronym{NCO} version @value{nco-edition}. It was last updated @value{update-date}. Corrections, additions, and rewrites of this documentation are very welcome. Enjoy,@* Charlie Zender @end ifinfo @menu * Foreword:: * Summary:: * Introduction:: * Strategies:: * Shared features:: * Reference Manual:: * Contributing:: * Quick Start:: * CMIP5 Example:: * Parallel:: * CCSM Example:: * mybibnode:: * General Index:: @end menu @html @end html @node Foreword, Summary, Top, Top @unnumbered Foreword @cindex foreword @cindex Charlie Zender @acronym{NCO} is the result of software needs that arose while I worked on projects funded by @acronym{NCAR}, @acronym{NASA}, and @acronym{ARM}. Thinking they might prove useful as tools or templates to others, it is my pleasure to provide them freely to the scientific community. Many users (most of whom I have never met) have encouraged the development of @acronym{NCO}. Thanks espcially to Jan Polcher, Keith Lindsay, Arlindo @w{da Silva}, John Sheldon, and William Weibel for stimulating suggestions and correspondence. Your encouragment motivated me to complete the @cite{NCO User Guide}. So if you like @acronym{NCO}, send me a note! @w{I should} mention that @acronym{NCO} is not connected to or officially endorsed by Unidata, @acronym{ACD}, @acronym{ASP}, @acronym{CGD}, or Nike.@* @sp 1 @noindent Charlie Zender@* May 1997@* Boulder, Colorado@* @sp 2 Major feature improvements entitle me to write another Foreword. In the last five years a lot of work has been done to refine @acronym{NCO}. @cindex open source @acronym{NCO} is now an open source project and appears to be much healthier for it. The list of illustrious institutions that do not endorse @acronym{NCO} continues to grow, and now includes @acronym{UCI}.@* @sp 1 @noindent Charlie Zender@* October 2000@* Irvine, California@* @sp 2 The most remarkable advances in @acronym{NCO} capabilities in the last few years are due to contributions from the Open Source community. Especially noteworthy are the contributions of Henry Butowsky and Rorik Peterson.@* @sp 1 @noindent Charlie Zender@* January 2003@* Irvine, California@* @sp 2 @acronym{NCO} was generously supported from 2004--2008 by US National Science Foundation (@acronym{NSF}) grant @uref{http://www.nsf.gov/awardsearch/showAward.do?AwardNumber=0431203,IIS-0431203}. This support allowed me to maintain and extend core @acronym{NCO} code, and others to advance @acronym{NCO} in new directions: Gayathri Venkitachalam helped implement @acronym{MPI}; Harry Mangalam improved regression testing and benchmarking; Daniel Wang developed the server-side capability, @acronym{SWAMP}; and Henry Butowsky, a long-time contributor, developed @command{ncap2}. This support also led @acronym{NCO} to debut in professional journals and meetings. The personal and professional contacts made during this evolution have been immensely rewarding.@* @sp 1 @noindent Charlie Zender@* March 2008@* Grenoble, France@* @sp 2 The end of the @acronym{NSF} @acronym{SEI} grant in August, 2008 curtailed @acronym{NCO} development. Fortunately we could justify supporting Henry Butowsky on other research grants until May, 2010 while he developed the key @command{ncap2} features used in our climate research. And recently the @acronym{NASA} @acronym{ACCESS} program commenced funding us to support netCDF4 group functionality. Thus @acronym{NCO} will grow and evade bit-rot for the foreseeable future. I continue to receive with gratitude the thanks of @acronym{NCO} users at nearly every scientific meeting I attend. People introduce themselves, shake my hand and extol @acronym{NCO}, often effusively, while I grin in stupid embarassment. These exchanges lighten me like anti-gravity. Sometimes I daydream how many hours @acronym{NCO} has turned from grunt work to productive research for researchers world-wide, or from research into early happy-hours. It's a cool feeling. @sp 1 @noindent Charlie Zender@* April, 2012@* Irvine, California@* @sp 2 @c 20150619 Test values automagically installed by version.texi, which is a nightmare @c Test print @value{EDITION}, @value{VERSION}, @value{UPDATED}, @value{UPDATED-MONTH}. The @acronym{NASA} @acronym{ACCESS} 2011 program generously supported (Cooperative Agreement NNX12AF48A) @acronym{NCO} from 2012--2015. This allowed us to produce the first iteration of a Group-oriented Data Analysis and Distribution (@acronym{GODAD}) software ecosystem. Shifting more geoscience data analysis to @acronym{GODAD} is a long-term plan. Then the @acronym{NASA} @acronym{ACCESS} 2013 program agreed to support (Cooperative Agreement NNX14AH55A) @acronym{NCO} from 2014--2016. This support permits us to implement support for Swath-like Data (@acronym{SLD}). Most recently, the @acronym{DOE} has funded me to implement @acronym{NCO} re-gridding and parallelization in support of their @acronym{ACME} program. After many years of crafting @acronym{NCO} as an after-hours hobby, I finally have the cushion necessary to give it some real attention. And I'm looking forward to this next, and most intense yet, phase of @acronym{NCO} development. @sp 1 @noindent Charlie Zender@* June, 2015@* Irvine, California@* @html @end html @node Summary, Introduction, Foreword, Top @unnumbered Summary @cindex operators @cindex summary This manual describes @acronym{NCO}, which stands for netCDF Operators. @acronym{NCO} is a suite of programs known as @dfn{operators}. Each operator is a standalone, command line program executed at the shell-level like, e.g., @command{ls} or @command{mkdir}. The operators take netCDF files (including @acronym{HDF5} files constructed using the netCDF @acronym{API}) as input, perform an operation (e.g., averaging or hyperslabbing), and produce a netCDF file as output. The operators are primarily designed to aid manipulation and analysis of data. The examples in this documentation are typical applications of the operators for processing climate model output. This stems from their origin, though the operators are as general as netCDF itself. @html @end html @node Introduction, Strategies, Summary, Top @chapter Introduction @cindex introduction @menu * Availability:: * How to Use This guide:: * Compatability:: * Symbolic Links:: * Libraries:: * netCDF2/3/4 and HDF4/5 Support:: * Help Requests and Bug Reports:: @end menu @node Availability, How to Use This guide, Introduction, Introduction @section Availability @cindex @acronym{NCO} availability @cindex source code The complete @acronym{NCO} source distribution is currently distributed as a @dfn{compressed tarfile} from @uref{http://sf.net/projects/nco} and from @uref{http://dust.ess.uci.edu/nco/nco.tar.gz}. The compressed tarfile must be uncompressed and untarred before building @acronym{NCO}. Uncompress the file with @samp{gunzip nco.tar.gz}. Extract the source files from the resulting tarfile with @samp{tar -xvf nco.tar}. @acronym{GNU} @code{tar} lets you perform both operations in one step with @samp{tar -xvzf nco.tar.gz}. @cindex documentation @cindex @acronym{WWW} documentation @cindex on-line documentation @cindex @acronym{HTML} @cindex @TeX{}info @cindex Info @cindex @cite{User Guide} @cindex @cite{NCO User Guide} The documentation for @acronym{NCO} is called the @cite{NCO User Guide}. The @cite{User Guide} is available in @acronym{PDF}, Postscript, @acronym{HTML}, @acronym{DVI}, @TeX{}info, and Info formats. These formats are included in the source distribution in the files @file{nco.pdf}, @file{nco.ps}, @file{nco.html}, @file{nco.dvi}, @file{nco.texi}, and @file{nco.info*}, respectively. All the documentation descends from a single source file, @file{nco.texi} @footnote{ To produce these formats, @file{nco.texi} was simply run through the freely available programs @code{texi2dvi}, @code{dvips}, @code{texi2html}, and @code{makeinfo}. Due to a bug in @TeX{}, the resulting Postscript file, @file{nco.ps}, contains the Table of Contents as the final pages. Thus if you print @file{nco.ps}, remember to insert the Table of Contents after the cover sheet before you staple the manual. }. Hence the documentation in every format is very similar. However, some of the complex mathematical expressions needed to describe @command{ncwa} can only be displayed in @acronym{DVI}, Postscript, and @acronym{PDF} formats. @cindex publications @cindex presentations A complete list of papers and publications on/about @acronym{NCO} is available on the @acronym{NCO} homepage. Most of these are freely available. @c 20130526 fxm Replace mybibnode with @mybibnode{} @c 20130526 Doing so, unfortunately, produces error "TeX capacity exceeded, sorry [input stack size=5000]." @c 20130526 Denude document of @mybibcite{} until it works @c The primary refereed publications are @mybibcite{ZeM06} and @mybibcite{Zen08}. The primary refereed publications are ZeM06 and Zen08. These contain copyright restrictions which limit their redistribution, but they are freely available in preprint form from the @acronym{NCO}. @cindex @acronym{NCO} homepage If you want to quickly see what the latest improvements in @acronym{NCO} are (without downloading the entire source distribution), visit the @acronym{NCO} homepage at @uref{http://nco.sf.net}. The @acronym{HTML} version of the @cite{User Guide} is also available online through the World Wide Web at @acronym{URL} @uref{http://nco.sf.net/nco.html}. @cindex netCDF To build and use @acronym{NCO}, you must have netCDF installed. The netCDF homepage is @uref{http://www.unidata.ucar.edu/packages/netcdf}. New @acronym{NCO} releases are announced on the netCDF list and on the @code{nco-announce} mailing list @uref{http://lists.sf.net/mailman/listinfo/nco-announce}. @ignore This tests incorporates an image using the @code{@@image} command. @image{/data/zender/ps/odxc,6in,} @end ignore @node How to Use This guide, Compatability, Availability, Introduction @section How to Use This Guide @cindex contents @cindex introduction Detailed instructions about @uref{http://nco.sf.net/#Source, how to download the newest version}, and @uref{http://nco.sf.net/#bld, how to complie source code}, as well as a @uref{http://nco.sf.net/#FAQ, @acronym{FAQ}} and descriptions of @uref{http://nco.sf.net/#bug, Known Problems} etc. are on our homepage (@uref{http://nco.sf.net/}). There are twelve operators in the current version (@value{nco-edition}). The function of each is explained in @ref{Reference Manual, Reference Manual}. Many of the tasks that @acronym{NCO} can accomplish are described during the explanation of common @acronym{NCO} Features (@pxref{Shared features}). More specific use examples for each operator can be seen by visiting the operator-specific examples in the @ref{Reference Manual}. These can be found directly by prepending the operator name with the @code{xmp_} tag, e.g., @uref{http://nco.sf.net/nco.html#xmp_ncks}. Also, users can type the operator name on the shell command line to see all the available options, or type, e.g., @samp{man ncks} to see a help man-page. @acronym{NCO} is a command-line language. You may either use an operator after the prompt (e.g., @samp{$} here), like, @example $ @command{operator} @option{[options]} @file{input} @file{[output]} @end example or write all commands lines into a shell script, as in the @acronym{CMIP5} Example (@pxref{CMIP5 Example}). If you are new to @acronym{NCO}, the Quick Start (@pxref{Quick Start}) shows simple examples about how to use @acronym{NCO} on different kinds of data files. More detailed ``real-world'' examples are in the @ref{CMIP5 Example, @acronym{CMIP5} Example}. The @ref{General Index, Index} is presents multiple keyword entries for the same subject. If these resources do not help enough, please @pxref{Help Requests and Bug Reports}. @node Compatability, Symbolic Links, How to Use This guide, Introduction @section Operating systems compatible with @acronym{NCO} @cindex @acronym{OS} @cindex @acronym{IBM} @cindex @acronym{NEC} @cindex @acronym{SGI} @cindex @acronym{HP} @cindex @acronym{DEC} @cindex @acronym{PGI} @cindex Cray @cindex Digital @cindex Sun @cindex Intel @cindex Comeau @cindex Compaq @cindex Macintosh @cindex Microsoft @cindex Windows @cindex PathScale @cindex QLogic @cindex compatability @cindex portability @cindex installation In its time on Earth, @acronym{NCO} has been successfully ported and tested on so many 32- and 64-bit platforms that if we did not write them down here we would forget their names: @c alphabetize by OS name @acronym{IBM AIX} 4.x, 5.x, FreeBSD 4.x, @acronym{GNU}/Linux 2.x, LinuxPPC, LinuxAlpha, LinuxARM, LinuxSparc64, LinuxAMD64, @acronym{SGI IRIX} 5.x and 6.x, @w{MacOS X} 10.x, @acronym{DEC OSF}, @acronym{NEC} Super-UX 10.x, Sun SunOS 4.1.x, Solaris 2.x, @acronym{Cray UNICOS} 8.x--10.x, and Microsoft Windows (95, 98, @acronym{NT}, 2000, @acronym{XP}, Vista, 7, 8, 10). If you port the code to a new operating system, please send me a note and any patches you required. @cindex @acronym{UNIX} @cindex Unidata @cindex UDUnits The major prerequisite for installing @acronym{NCO} on a particular platform is the successful, prior installation of the netCDF library (and, as of 2003, the UDUnits library). Unidata has shown a commitment to maintaining netCDF and UDUnits on all popular @acronym{UNIX} platforms, and is moving towards full support for the Microsoft Windows operating system (@acronym{OS}). Given this, the only difficulty in implementing @acronym{NCO} on a particular platform is standardization of various @w{C}-language API system calls. @acronym{NCO} code is tested for @acronym{ANSI} compliance by compiling with @w{C99 compilers} including those from @cindex @command{CC} @cindex @command{c++} @cindex @command{cc} @cindex @command{clang} @cindex @command{como} @cindex @command{cxx} @cindex @command{gcc} @cindex @command{g++} @cindex @command{icc} @cindex @command{MVS} @cindex @command{pgcc} @cindex @command{pgCC} @cindex @command{pathcc} @cindex @command{pathCC} @cindex @command{xlC} @cindex @command{xlc} @acronym{GNU} (@samp{gcc -std=c99 -pedantic -D_BSD_SOURCE -D_POSIX_SOURCE} -Wall) @footnote{ The @samp{_BSD_SOURCE} token is required on some Linux platforms where @command{gcc} dislikes the network header files like @file{netinet/in.h}).}, Comeau Computing (@samp{como --c99}), Cray (@samp{cc}), @acronym{HP}/Compaq/@acronym{DEC} (@samp{cc}), @acronym{IBM} (@samp{xlc -c -qlanglvl=extc99}), Intel (@samp{icc -std=c99}), @cindex @acronym{LLVM} @acronym{LLVM} (@samp{clang}), @acronym{NEC} (@samp{cc}), PathScale (QLogic) (@samp{pathcc -std=c99}), @acronym{PGI} (@samp{pgcc -c9x}), @acronym{SGI} (@samp{cc -c99}), and Sun (@samp{cc}). @cindex C++ @cindex @acronym{ISO} @cindex @command{libnco} @acronym{NCO} (all commands and the @command{libnco} library) and the C++ interface to netCDF (called @command{libnco_c++}) comply with the @acronym{ISO} C++ standards as implemented by Comeau Computing (@samp{como}), Cray (@samp{CC}), @acronym{GNU} (@samp{g++ -Wall}), @acronym{HP}/Compaq/@acronym{DEC} (@samp{cxx}), @acronym{IBM} (@samp{xlC}), Intel (@samp{icc}), Microsoft (@samp{MVS}), @acronym{NEC} (@samp{c++}), PathScale (Qlogic) (@samp{pathCC}), @acronym{PGI} (@samp{pgCC}), @acronym{SGI} (@samp{CC -LANG:std}), and Sun (@samp{CC -LANG:std}). @cindex @file{Makefile} See @file{nco/bld/Makefile} and @file{nco/src/nco_c++/Makefile.old} for more details and exact settings. @cindex @acronym{ANSI} @cindex C89 @cindex @code{printf} Until recently (and not even yet), @acronym{ANSI}-compliant has meant compliance with the 1989 @acronym{ISO} C-standard, usually called C89 (with minor revisions made in 1994 and 1995). C89 lacks variable-size arrays, restricted pointers, some useful @code{printf} formats, and many mathematical special functions. @cindex C99 These are valuable features of C99, the 1999 @acronym{ISO} C-standard. @acronym{NCO} is C99-compliant where possible and C89-compliant where necessary. Certain branches in the code are required to satisfy the native @acronym{SGI} and SunOS @w{C compilers}, which are strictly @acronym{ANSI} C89 compliant, and cannot benefit from C99 features. However, C99 features are fully supported by modern @acronym{AIX}, @acronym{GNU}, Intel, @acronym{NEC}, Solaris, and @acronym{UNICOS} compilers. @acronym{NCO} requires a C99-compliant compiler as of @acronym{NCO} @w{version 2.9.8}, released in August, 2004. The most time-intensive portion of @acronym{NCO} execution is spent in arithmetic operations, e.g., multiplication, averaging, subtraction. These operations were performed in Fortran by default until August, 1999. This was a design decision based on the relative speed of Fortran-based object code vs.@: C-based object code in late 1994. @w{C compiler} vectorization capabilities have dramatically improved since 1994. We have accordingly replaced all Fortran subroutines with @w{C functions}. This greatly simplifies the task of building @acronym{NCO} on nominally unsupported platforms. @cindex C language As of August 1999, @acronym{NCO} built entirely @w{in C} by default. This allowed @acronym{NCO} to compile on any machine with an @acronym{ANSI} @w{C compiler}. @cindex C99 @cindex C89 @cindex @code{restrict} In August 2004, the first C99 feature, the @code{restrict} type qualifier, entered @acronym{NCO} in version 2.9.8. @w{C compilers} can obtain better performance with C99 restricted pointers since they inform the compiler when it may make Fortran-like assumptions regarding pointer contents alteration. Subsequently, @acronym{NCO} requires a C99 compiler to build correctly @footnote{@acronym{NCO} may still build with an @acronym{ANSI} or @acronym{ISO} C89 or C94/95-compliant compiler if the @w{C pre-processor} undefines the @code{restrict} type qualifier, e.g., by invoking the compiler with @samp{-Drestrict=''}.}. @cindex @acronym{GSL} @findex ncap2 In January 2009, @acronym{NCO} version 3.9.6 was the first to link to the @acronym{GNU} Scientific Library (@acronym{GSL}). @acronym{GSL} must be @w{version 1.4} or later. @acronym{NCO}, in particular @command{ncap2}, uses the @acronym{GSL} special function library to evaluate geoscience-relevant mathematics such as Bessel functions, Legendre polynomials, and incomplete gamma functions (@pxref{GSL special functions}). @cindex @var{gamma} In June 2005, @acronym{NCO} version 3.0.1 began to take advantage of C99 mathematical special functions. These include the standarized gamma function (called @code{tgamma()} for ``true gamma''). @cindex automagic @acronym{NCO} automagically takes advantage of some @acronym{GNU} Compiler Collection (@acronym{GCC}) extensions to @w{@acronym{ANSI} C}. As of July 2000 and @acronym{NCO} @w{version 1.2}, @acronym{NCO} no longer performs arithmetic operations in Fortran. We decided to sacrifice executable speed for code maintainability. Since no objective statistics were ever performed to quantify the difference in speed between the Fortran and @w{C code}, the performance penalty incurred by this decision is unknown. Supporting Fortran involves maintaining two sets of routines for every arithmetic operation. The @code{USE_FORTRAN_ARITHMETIC} flag is still retained in the @file{Makefile}. The file containing the Fortran code, @file{nco_fortran.F}, has been deprecated but a volunteer (@w{Dr.@: Frankenstein}?) could resurrect it. If you would like to volunteer to maintain @file{nco_fortran.F} please contact me. @c Following section is obsolete @ignore It is still possible to request Fortran routines to perform arithmetic operations, however. @cindex preprocessor tokens @cindex @code{USE_FORTRAN_ARITHMETIC} This can be accomplished by defining the preprocessor token @code{USE_FORTRAN_ARITHMETIC} and rebuilding @acronym{NCO}. @cindex performance As its name suggests, the @code{USE_FORTRAN_ARITHMETIC} token instructs @acronym{NCO} to attempts to interface the @w{C routines} with Fortran arithmetic. Although using Fortran calls instead @w{of C} reduces the portability and and increases the maintenance of the @acronym{NCO} operators, it may also increase the performance of the numeric operators. Presumably this will depend on your machine type, the quality of @w{the C} and Fortran compilers, and the size of the data files @footnote{If you decide to test the efficiency of the averagers compiled with @code{USE_FORTRAN_ARITHMETIC} versus the default @w{C averagers} I would be most interested to hear the results. Please E-mail me the results including the size of the datasets, the platform, and the change in the wallclock time for execution.}. @end ignore @menu * Windows Operating System:: @end menu @html @end html @node Windows Operating System, , Compatability, Compatability @subsection Compiling @acronym{NCO} for Microsoft Windows @acronym{OS} @cindex Windows @cindex Microsoft @cindex @acronym{XP} (Microsoft operating system) @cindex @acronym{NT} (Microsoft operating system) @cindex Vista (Microsoft operating system) @cindex @acronym{MVS} @cindex Microsoft Visual Studio @acronym{NCO} has been successfully ported and tested on most Microsoft Windows operating systems including: @acronym{XP} SP2/Vista/7. Support is provided for compiling either native Windows executables, using the Microsoft Visual Studio 2010 Compiler, or with Cygwin, the @acronym{UNIX}-emulating compatibility layer with the @acronym{GNU} toolchain. The switches necessary to accomplish both are included in the standard distribution of @acronym{NCO}. @cindex Qt @cindex C99 Using Microsoft Visual Studio (@acronym{MVS}), one must build @acronym{NCO} with the C++ compiler since @acronym{MVS} does not support C99. Qt, a convenient integrated development environment, was used to convert the project files to @acronym{MVS} format. The Qt files themselves are distributed in the @file{nco/qt} directory. Using the freely available Cygwin (formerly gnu-win32) development environment @footnote{The Cygwin package is available from@* @code{http://sourceware.redhat.com/cygwin}@* @cindex @code{gcc} @cindex @code{g++} Currently, @w{Cygwin 20.x} comes with the @acronym{GNU} C/C++ compilers (@command{gcc}, @command{g++}. These @acronym{GNU} compilers may be used to build the netCDF distribution itself.}, the compilation process is very similar to installing @acronym{NCO} on a @acronym{UNIX} system. @cindex preprocessor tokens @cindex Cygwin @cindex @code{gnu-win32} @cindex @code{WIN32} @cindex @file{GNUmakefile} @cindex @file{Makefile} @cindex @code{f90} Set the @code{PVM_ARCH} preprocessor token to @code{WIN32}. Note that defining @code{WIN32} has the side effect of disabling Internet features of @acronym{NCO} (see below). @acronym{NCO} should now build like it does on @acronym{UNIX}. @cindex @acronym{UNIX} @cindex @code{getuid} @cindex @code{gethostname} @findex @file{} @findex @file{} The least portable section of the code is the use of standard @acronym{UNIX} and Internet protocols (e.g., @code{ftp}, @code{rcp}, @code{scp}, @code{sftp}, @code{getuid}, @code{gethostname}, and header files @file{} and @file{}). @cindex @code{ftp} @cindex @code{sftp} @cindex @code{rcp} @cindex @code{scp} @cindex @acronym{SSH} @cindex remote files Fortunately, these @acronym{UNIX}-y calls are only invoked by the single @acronym{NCO} subroutine which is responsible for retrieving files stored on remote systems (@pxref{Remote storage}). In order to support @acronym{NCO} on the Microsoft Windows platforms, this single feature was disabled (on Windows @acronym{OS} only). This was required by @w{Cygwin 18.x}---newer versions of Cygwin may support these protocols (let me know if this is the case). The @acronym{NCO} operators should behave identically on Windows and @acronym{UNIX} platforms in all other respects. @html @end html @node Symbolic Links, Libraries, Compatability, Introduction @section Symbolic Links @cindex symbolic links @acronym{NCO} relies on a common set of underlying algorithms. To minimize duplication of source code, multiple operators sometimes share the same underlying source. This is accomplished by symbolic links from a single underlying executable program to one or more invoked executable names. For example, @command{nces} and @command{ncrcat} are symbolically linked to the @command{ncra} executable. The @command{ncra} executable behaves slightly differently based on its invocation name (i.e., @samp{argv[0]}), which can be @command{nces}, @command{ncra}, or @command{ncrcat}. Logically, these are three different operators that happen to share the same executable. @cindex Cygwin @cindex synonym @cindex pseudonym @cindex @code{--pseudonym} For historical reasons, and to be more user friendly, multiple synonyms (or pseudonyms) may refer to the same operator invoked with different switches. For example, @command{ncdiff} is the same as @command{ncbo} and @command{ncpack} is the same as @command{ncpdq}. We implement the symbolic links and synonyms by the executing the following @acronym{UNIX} commands in the directory where the @acronym{NCO} executables are installed. @example ln -s -f ncbo ncdiff # ncbo --op_typ='-' ln -s -f ncra nces # ncra --pseudonym='nces' ln -s -f ncra ncrcat # ncra --pseudonym='ncrcat' ln -s -f ncbo ncadd # ncbo --op_typ='+' ln -s -f ncbo ncsubtract # ncbo --op_typ='-' ln -s -f ncbo ncmultiply # ncbo --op_typ='*' ln -s -f ncbo ncdivide # ncbo --op_typ='/' ln -s -f ncpdq ncpack # ncpdq ln -s -f ncpdq ncunpack # ncpdq --unpack # NB: Windows/Cygwin executable/link names have '.exe' suffix, e.g., ln -s -f ncbo.exe ncdiff.exe ... @end example The imputed command called by the link is given after the comment. As can be seen, some these links impute the passing of a command line argument to further modify the behavior of the underlying executable. For example, @command{ncdivide} is a pseudonym for @command{ncbo --op_typ='/'}. @html @end html @node Libraries, netCDF2/3/4 and HDF4/5 Support, Symbolic Links, Introduction @section Libraries @cindex libraries @cindex @code{LD_LIBRARY_PATH} @cindex dynamic linking @cindex static linking Like all executables, the @acronym{NCO} operators can be built using dynamic linking. @cindex performance @cindex operator speed @cindex speed @cindex execution time This reduces the size of the executable and can result in significant performance enhancements on multiuser systems. Unfortunately, if your library search path (usually the @env{LD_LIBRARY_PATH} environment variable) is not set correctly, or if the system libraries have been moved, renamed, or deleted since @acronym{NCO} was installed, it is possible @acronym{NCO} operators will fail with a message that they cannot find a dynamically loaded (aka @dfn{shared object} or @samp{.so}) library. This will produce a distinctive error message, such as @samp{ld.so.1:@- /usr/local/bin/nces:@- fatal:@- libsunmath.@-so.1:@- can't open@- file:@- errno@-=2}. If you received an error message like this, ask your system administrator to diagnose whether the library is truly missing @footnote{The @command{ldd} command, if it is available on your system, will tell you where the executable is looking for each dynamically loaded library. Use, e.g., @code{ldd `which nces`}.}, or whether you simply need to alter your library search path. As a final remedy, you may re-compile and install @acronym{NCO} with all operators statically linked. @node netCDF2/3/4 and HDF4/5 Support, Help Requests and Bug Reports, Libraries, Introduction @section netCDF2/3/4 and HDF4/5 Support @cindex netCDF2 @cindex netCDF3 netCDF @w{version 2} was released in 1993. @acronym{NCO} (specifically @command{ncks}) began soon after this in 1994. @w{netCDF 3.0} was released in 1996, and we were not exactly eager to convert all code to the newer, less tested netCDF implementation. One @w{netCDF3} interface call (@code{nc_inq_libvers}) was added to @acronym{NCO} in January, 1998, to aid in maintainance and debugging. In March, 2001, the final @acronym{NCO} conversion to @w{netCDF3} was completed (coincidentally on the same day @w{netCDF 3.5} was released). @acronym{NCO} @w{versions 2.0} and higher are built with the @code{-DNO_NETCDF_2} flag to ensure no @w{netCDF2} interface calls are used. @cindex @code{NO_NETCDF_2} @cindex @acronym{HDF} @cindex Hierarchical Data Format @cindex Mike Folk However, the ability to compile @acronym{NCO} with only @w{netCDF2} calls is worth maintaining because @acronym{HDF} @w{version 4}, aka @acronym{HDF4} or simply @acronym{HDF}, @footnote{The Hierarchical Data Format, or @acronym{HDF}, is another self-describing data format similar to, but more elaborate than, netCDF. @acronym{HDF} comes in two flavors, @acronym{HDF4} and @acronym{HDF5}. Often people use the shorthand @acronym{HDF} to refer to the older format @acronym{HDF4}. People almost always use @acronym{HDF5} to refer to @acronym{HDF5}.} (available from @uref{http://hdfgroup.org, HDF}) supports only the @w{netCDF2} library calls (see @uref{http://hdfgroup.org/UG41r3_html/SDS_SD.fm12.html#47784}). There are two versions of @acronym{HDF}. Currently @acronym{HDF} @w{version 4.x} supports the full @w{netCDF2} @acronym{API} and thus @acronym{NCO} @w{version 1.2.x}. If @acronym{NCO} @w{version 1.2.x} (or earlier) is built with only @w{netCDF2} calls then all @acronym{NCO} operators should work with @acronym{HDF4} files as well as netCDF files @footnote{One must link the @acronym{NCO} code to the @acronym{HDF4} @acronym{MFHDF} library instead of the usual netCDF library. Apparently @samp{MF} stands for Multi-file not for Mike Folk. In any case, until about 2007 the @acronym{MFHDF} library only supported @w{netCDF2} calls. Most people will never again install @acronym{NCO} 1.2.x and so will never use @acronym{NCO} to write @acronym{HDF4} files. It is simply too much trouble.}. @cindex @code{NETCDF2_ONLY} The preprocessor token @code{NETCDF2_ONLY} exists in @acronym{NCO} @w{version 1.2.x} to eliminate all @w{netCDF3} calls. Only versions of @acronym{NCO} numbered 1.2.x and earlier have this capability. @cindex Unidata @cindex @acronym{NCSA} @cindex netCDF4 @cindex @acronym{HDF5} @acronym{HDF} @w{version 5} became available in 1999, but did not support netCDF (or, for that matter, Fortran) as of December 1999. By early 2001, @acronym{HDF5} did support Fortran90. Thanks to an @acronym{NSF}-funded ``harmonization'' partnership, @acronym{HDF} began to fully support the @w{netCDF3} read interface (which is employed by @w{@acronym{NCO} 2.x} and later). In 2004, Unidata and @acronym{THG} began a project to implement the @acronym{HDF5} features necessary to support the netCDF API. @acronym{NCO} version 3.0.3 added support for reading/writing netCDF4-formatted @acronym{HDF5} files in October, 2005. See @ref{File Formats and Conversion} for more details. HDF support for netCDF was completed with HDF5 version @w{version 1.8} in 2007. The netCDF front-end that uses this @acronym{HDF5} back-end was completed and released soon after as netCDF @w{version 4}. Download it from the @uref{http://my.unidata.ucar.edu/content/software/netcdf/netcdf-4,netCDF4} website. @html @end html @acronym{NCO} version 3.9.0, released in May, 2007, added support for all netCDF4 atomic data types except @code{NC_STRING}. Support for @code{NC_STRING}, including ragged arrays of strings, was finally added in version 3.9.9, released in June, 2009. Support for additional netCDF4 features has been incremental. We add one netCDF4 feature at a time. You must build @acronym{NCO} with netCDF4 to obtain this support. @cindex @code{NC_UBYTE} @cindex @code{NC_USHORT} @cindex @code{NC_UINT} @cindex @code{NC_INT64} @cindex @code{NC_UINT64} @acronym{NCO} supports many netCDF4 features including atomic data types, Lempel-Ziv compression (deflation), chunking, and groups. The new atomic data types are @code{NC_UBYTE}, @code{NC_USHORT}, @code{NC_UINT}, @code{NC_INT64}, and @code{NC_UINT64}. Eight-byte integer support is an especially useful improvement from netCDF3. All @acronym{NCO} operators support these types, e.g., @command{ncks} copies and prints them, @command{ncra} averages them, and @command{ncap2} processes algebraic scripts with them. @command{ncks} prints compression information, if any, to screen. @cindex deflation @acronym{NCO} version 3.9.1 (June, 2007) added support for netCDF4 Lempel-Ziv deflation. Lempel-Ziv deflation is a lossless compression technique. See @ref{Deflation} for more details. @cindex chunking @acronym{NCO} version 3.9.9 (June, 2009) added support for netCDF4 chunking in @command{ncks} and @command{ncecat}. @acronym{NCO} version 4.0.4 (September, 2010) completed support for netCDF4 chunking in the remaining operators. See @ref{Chunking} for more details. @cindex groups @acronym{NCO} version 4.2.2 (October, 2012) added support for netCDF4 groups in @command{ncks} and @command{ncecat}. Group support for these operators was complete (e.g., regular expressions to select groups and Group Path Editing) as of @acronym{NCO} version 4.2.6 (March, 2013). See @ref{Group Path Editing} for more details. Group support for all other operators was finished in the @acronym{NCO} version 4.3.x series completed in December, 2013. @cindex broadcasting groups Support for netCDF4 in the first arithmetic operator, @command{ncbo}, was introduced in @acronym{NCO} version 4.3.0 (March, 2013). @acronym{NCO} version 4.3.1 (May, 2013) completed this support and introduced the first example of automatic group broadcasting. See @ref{ncbo netCDF Binary Operator} for more details. @cindex @acronym{HDF5} @cindex @code{-4} @cindex @code{-3} netCDF4-enabled @acronym{NCO} handles netCDF3 files without change. In addition, it automagically handles netCDF4 (@acronym{HDF5}) files: If you feed @acronym{NCO} netCDF3 files, it produces netCDF3 output. If you feed @acronym{NCO} netCDF4 files, it produces netCDF4 output. Use the handy-dandy @samp{-4} switch to request netCDF4 output from netCDF3 input, i.e., to convert netCDF3 to netCDF4. See @ref{File Formats and Conversion} for more details. @html @end html @cindex @acronym{HDF4} @cindex @samp{--hdf4} When linked to a netCDF library that was built with @acronym{HDF4} support @footnote{The procedure for doing this is documented at @uref{http://www.unidata.ucar.edu/software/netcdf/docs/build_hdf4.html}.}, @acronym{NCO} automatically supports reading @acronym{HDF4} files and writing them as netCDF3/netCDF4/@acronym{HDF5} files. @acronym{NCO} can only write through the netCDF @acronym{API}, which can only write netCDF3/netCDF4/@acronym{HDF5} files. So @acronym{NCO} can @emph{read} @acronym{HDF4} files, perform manipulations and calculations, and then it must @emph{write} the results in netCDF format. @acronym{NCO} support for @acronym{HDF4} has been quite functional since December, 2013. For best results install @acronym{NCO} versions 4.4.0 or later on top of netCDF versions 4.3.1 or later. Getting to this point has been an iterative effort where Unidata improved netCDF library capabilities in response to our requests. @acronym{NCO} versions 4.3.6 and earlier do not explicitly support @acronym{HDF4}, yet should work with @acronym{HDF4} if compiled with a version of netCDF (4.3.2 or later?) that does not unexpectedly die when probing @acronym{HDF4} files with standard netCDF calls. @acronym{NCO} versions 4.3.7--4.3.9 (October--December, 2013) use a special flag to workaround netCDF @acronym{HDF4} issues. The user must tell these versions of @acronym{NCO} that an input file is @acronym{HDF4} format by using the @samp{--hdf4} switch. @cindex @code{HDF4_UNKNOWN} When compiled with netCDF version 4.3.1 (20140116) or later, @acronym{NCO} versions 4.4.0 (January, 2014) and later more gracefully handle @acronym{HDF4} files. In particular, the @samp{--hdf4} switch is obsolete. Current versions of @acronym{NCO} use netCDF to determine automatically whether the underlying file is @acronym{HDF4}, and then take appropriate precautions to avoid netCDF4 @acronym{API} calls that fail when applied to @acronym{HDF4} files (e.g., @code{nc_inq_var_chunking()}, @code{nc_inq_var_deflate()}). When compiled with netCDF version 4.3.2 (20140423) or earlier, @acronym{NCO} will report that chunking and deflation properties of @acronym{HDF4} files as @code{HDF4_UNKNOWN}, because determining those properties was impossible. When compiled with netCDF version 4.3.3-rc2 (20140925) or later, @acronym{NCO} versions 4.4.6 (October, 2014) and later fully support chunking and deflation features of @acronym{HDF4} files. The @samp{--hdf4} switch is supported (for backwards compatibility) yet redundant (i.e., does no harm) with current versions of @acronym{NCO} and netCDF. Converting @acronym{HDF4} files to netCDF: Since @acronym{NCO} reads @acronym{HDF4} files natively, it is now easy to convert @acronym{HDF4} files to netCDF files directly, e.g., @example ncks fl.hdf fl.nc # Convert HDF4->netCDF4 (NCO 4.4.0+, netCDF 4.3.1+) ncks --hdf4 fl.hdf fl.nc # Convert HDF4->netCDF4 (NCO 4.3.7-4.3.9) @end example The most efficient and accurate way to convert @acronym{HDF4} data to netCDF format is to convert to netCDF4 using @acronym{NCO} as above. Many @acronym{HDF4} producers (@acronym{NASA}!) love to use netCDF4 types, e.g., unsigned bytes, so this procedure is the most typical. Conversion of @acronym{HDF4} to netCDF4 as above suffices when the data will only be processed by @acronym{NCO} and other netCDF4-aware tools. @cindex @command{ncl_convert2nc} @cindex @command{nc3tonc4} However, many tools are not fully netCDF4-aware, and so conversion to netCDF3 may be desirable. Obtaining any netCDF file from an @acronym{HDF4} is easy: @example ncks -3 fl.hdf fl.nc # HDF4->netCDF3 (NCO 4.4.0+, netCDF 4.3.1+) ncks -4 fl.hdf fl.nc # HDF4->netCDF4 (NCO 4.4.0+, netCDF 4.3.1+) ncks -6 fl.hdf fl.nc # HDF4->netCDF3 64-bit (NCO 4.4.0+, ...) ncks -7 -L 1 fl.hdf fl.nc # HDF4->netCDF4 classic (NCO 4.4.0+, ...) ncks --hdf4 -3 fl.hdf fl.nc # HDF4->netCDF3 (netCDF 4.3.0-) ncks --hdf4 -4 fl.hdf fl.nc # HDF4->netCDF4 (netCDF 4.3.0-) ncks --hdf4 -6 fl.hdf fl.nc # HDF4->netCDF3 64-bit (netCDF 4.3.0-) ncks --hdf4 -7 fl.hdf fl.nc # HDF4->netCDF4 classic (netCDF 4.3.0-) @end example As of @acronym{NCO} version 4.4.0 (January, 2014), these commands work even when the @acronym{HDF4} file contains netCDF4 atomic types (e.g., unsigned bytes, 64-bit integers) because @acronym{NCO} can autoconvert everything to atomic types supported by netCDF3 @footnote{ Prior to @acronym{NCO} version 4.4.0 (January, 2014), we recommended the @command{ncl_convert2nc} tool to convert @acronym{HDF} to netCDF3 when both these are true: @w{1. You} must have netCDF3 and @w{2. the} @acronym{HDF} file contains netCDF4 atomic types. More recent versions of @acronym{NCO} handle this problem fine, and include other advantages so we no longer recommend @command{ncl_convert2nc} because @command{ncks} is faster and more space-efficient. Both automatically convert netCDF4 types to netCDF3 types, yet @command{ncl_convert2nc} cannot produce full netCDF4 files. In contrast, @command{ncks} will happily convert @acronym{HDF} straight to netCDF4 files with netCDF4 types. Hence @command{ncks} can and does preserve the variable types. Unsigned bytes stay unsigned bytes. 64-bit integers stay 64-bit integers. Strings stay strings. Hence, @command{ncks} conversions often result in smaller files than @command{ncl_convert2nc} conversions. A tool useful for converting netCDF3 to netCDF4 files is the Python script @command{nc3tonc4} by Jeff Whitaker.}. @cindex @code{hdf_name} @cindex illegal names As of @acronym{NCO} version 4.4.4 (May, 2014) both @command{ncl_convert2nc} and @acronym{NCO} have built-in, automatic workarounds to handle element names that contain characters that are legal in @acronym{HDF} though are illegal in @acronym{netCDF}. For example, slashes and leading special characters are are legal in @acronym{HDF} and illegal in @acronym{netCDF} element (i.e., group, variable, dimension, and attribute) names. @acronym{NCO} converts these forbidden characters to underscores, and retains the original names of variables in automatically produced attributes named @code{hdf_name} @footnote{Two real-world examples: @acronym{NCO} translates the @acronym{NASA} @acronym{CERES} dimension @code{(FOV) Footprints} to @code{_FOV_ Footprints}, and @code{Cloud & Aerosol, Cloud Only, Clear Sky w/Aerosol, and Clear Sky} (yes, the dimension name includes whitespace and special characters) to @code{Cloud & Aerosol, Cloud Only, Clear Sky w_Aerosol, and Clear Sky} @command{ncl_convert2nc} makes the element name netCDF-safe in a slightly different manner, and also stores the original name in the @code{hdf_name} attribute.}. @cindex @acronym{H4CF} @cindex @command{h4tonccf} Finally, in February 2014, we learned that the @acronym{HDF} group has a project called @acronym{H4CF} (described @uref{http://hdfeos.org/software/h4cflib.php, here}) whose goal is to make @acronym{HDF4} files accessible to @acronym{CF} tools and conventions. Their project includes a tool named @command{h4tonccf} that converts @acronym{HDF4} files to netCDF3 or netCDF4 files. We are not yet sure what advantages or features @command{h4tonccf} has that are not in @acronym{NCO}, though we suspect both methods have their own advantages. Corrections welcome. @cindex @acronym{RPM} @cindex Debian As of 2012, netCDF4 is relatively stable software. Problems with netCDF4 and @acronym{HDF} libraries have mainly been fixed. Binary @acronym{NCO} distributions shipped as @acronym{RPM}s and as debs have used the netCDF4 library since 2010 and 2011, respectively. @cindex @code{NETCDF4_ROOT} One must often build @acronym{NCO} from source to obtain netCDF4 support. Typically, one specifies the root of the netCDF4 installation directory. Do this with the @code{NETCDF4_ROOT} variable. Then use your preferred @acronym{NCO} build mechanism, e.g., @example export NETCDF4_ROOT=/usr/local/netcdf4 # Set netCDF4 location cd ~/nco;./configure --enable-netcdf4 # Configure mechanism -or- cd ~/nco/bld;./make NETCDF4=Y allinone # Old Makefile mechanism @end example We carefully track the netCDF4 releases, and keep the netCDF4 atomic type support and other features working. Our long term goal is to utilize more of the extensive new netCDF4 feature set. The next major netCDF4 feature we are likely to utilize is parallel I/O. We will enable this in the @acronym{MPI} netCDF operators. @html @end html @node Help Requests and Bug Reports, , netCDF2/3/4 and HDF4/5 Support, Introduction @section Help Requests and Bug Reports @cindex reporting bugs @cindex bugs, reporting @cindex core dump @cindex help @cindex features, requesting We generally receive three categories of mail from users: help requests, bug reports, and feature requests. Notes saying the equivalent of ``Hey, @acronym{NCO} continues to work great and it saves me more time everyday than it took to write this note'' are a distant fourth. There is a different protocol for each type of request. The preferred etiquette for all communications is via @acronym{NCO} Project Forums. Do not contact project members via personal e-mail unless your request comes with money or you have damaging information about our personal lives. @emph{Please use the Forums}---they preserve a record of the questions and answers so that others can learn from our exchange. Also, since @acronym{NCO} is government-funded, this record helps us provide program officers with information they need to evaluate our project. Before posting to the @acronym{NCO} forums described below, you might first @uref{https://sf.net/account/register.php, register} your name and email address with SourceForge.net or else all of your postings will be attributed to @emph{nobody}. Once registered you may choose to @emph{monitor} any forum and to receive (or not) email when there are any postings including responses to your questions. We usually reply to the forum message, not to the original poster. If you want us to include a new feature in @acronym{NCO}, check first to see if that feature is already on the @uref{file:./TODO,TODO} list. If it is, why not implement that feature yourself and send us the patch? If the feature is not yet on the list, then send a note to the @uref{http://sf.net/p/nco/discussion/9829, NCO Discussion forum}. Read the manual before reporting a bug or posting a help request. Sending questions whose answers are not in the manual is the best way to motivate us to write more documentation. We would also like to accentuate the contrapositive of this statement. If you think you have found a real bug @emph{the most helpful thing you can do is simplify the problem to a manageable size and then report it}. The first thing to do is to make sure you are running the latest publicly released version of @acronym{NCO}. Once you have read the manual, if you are still unable to get @acronym{NCO} to perform a documented function, submit a help request. Follow the same procedure as described below for reporting bugs (after all, it might be a bug). @cindex debugging @cindex @code{-r} @cindex @code{-D} That is, describe what you are trying to do, and include the complete commands (run with @samp{-D 5}), error messages, and version of @acronym{NCO} (with @samp{-r}). Post your help request to the @uref{http://sf.net/p/nco/discussion/9830, NCO Help forum}. If you think you used the right command when @acronym{NCO} misbehaves, then you might have found a bug. Incorrect numerical answers are the highest priority. We usually fix those within one or two days. Core dumps and sementation violations receive lower priority. They are always fixed, eventually. How do you simplify a problem that reveal a bug? Cut out extraneous variables, dimensions, and metadata from the offending files and re-run the command until it no longer breaks. Then back up one step and report the problem. Usually the file(s) will be very small, i.e., one variable with one or two small dimensions ought to suffice. @html @end html @cindex @code{-r} @cindex @code{--revision} @cindex @code{--version} @cindex @code{--vrs} @cindex @code{-D @var{debug-level}} @cindex @code{--debug-level @var{debug-level}} @cindex @code{--dbg_lvl @var{debug-level}} @cindex @var{debug-level} @cindex @var{dbg_lvl} Run the operator with @samp{-r} and then run the command with @samp{-D 5} to increase the verbosity of the debugging output. It is very important that your report contain the exact error messages and compile-time environment. Include a copy of your sample input file, or place one on a publicly accessible location, of the file(s). If you are sure it is a bug, post the full report to the @uref{http://sf.net/p/nco/bugs, NCO Project buglist}. Otherwise post all the information to @uref{http://sf.net/p/nco/discussion/9830, NCO Help forum}. @cindex installation @cindex @command{autoconf} @cindex @file{nco.configure.$@{GNU_TRP@}.foo} @cindex @file{nco.config.log.$@{GNU_TRP@}.foo} @cindex @file{nco.make.$@{GNU_TRP@}.foo} @cindex @file{config.guess} @cindex @file{configure.eg} Build failures count as bugs. Our limited machine access means we cannot fix all build failures. The information we need to diagnose, and often fix, build failures are the three files output by @acronym{GNU} build tools, @file{nco.config.log.$@{GNU_TRP@}.foo}, @file{nco.configure.$@{GNU_TRP@}.foo}, and @file{nco.make.$@{GNU_TRP@}.foo}. The file @file{configure.eg} shows how to produce these files. Here @code{$@{GNU_TRP@}} is the ``@acronym{GNU} architecture triplet'', the @var{chip-vendor-OS} string returned by @file{config.guess}. Please send us your improvements to the examples supplied in @file{configure.eg}. @cindex regressions archive The regressions archive at @url{http://dust.ess.uci.edu/nco/rgr} contains the build output from our standard test systems. You may find you can solve the build problem yourself by examining the differences between these files and your own. @html @end html @node Strategies, Shared features, Introduction, Top @chapter Operator Strategies @menu * Philosophy:: * Climate Model Paradigm:: * Temporary Output Files:: * Appending Variables:: * Simple Arithmetic and Interpolation:: * Statistics vs. Concatenation:: * Large Numbers of Files:: * Large Datasets:: * Memory Requirements:: * Performance:: @end menu @html @end html @node Philosophy, Climate Model Paradigm, Strategies, Strategies @section Philosophy @cindex philosophy @cindex climate model The main design goal is command line operators which perform useful, scriptable operations on netCDF files. Many scientists work with models and observations which produce too much data to analyze in tabular format. Thus, it is often natural to reduce and massage this raw or primary level data into summary, or second level data, e.g., temporal or spatial averages. These second level data may become the inputs to graphical and statistical packages, and are often more suitable for archival and dissemination to the scientific community. @acronym{NCO} performs a suite of operations useful in manipulating data from the primary to the second level state. @cindex @acronym{IDL} @cindex Matlab @cindex @acronym{NCL} @cindex Perl @cindex Yorick Higher level interpretive languages (e.g., @acronym{IDL}, Yorick, Matlab, @acronym{NCL}, Perl, Python), and lower level compiled languages (e.g., C, Fortran) can always perform any task performed by @acronym{NCO}, but often with more overhead. NCO, on the other hand, is limited to a much smaller set of arithmetic and metadata operations than these full blown languages. @cindex command line switches Another goal has been to implement enough command line switches so that frequently used sequences of these operators can be executed from a shell script or batch file. Finally, @acronym{NCO} was written to consume the absolute minimum amount of system memory required to perform a given job. The arithmetic operators are extremely efficient; their exact memory usage is detailed in @ref{Memory Requirements}. @html @end html @node Climate Model Paradigm, Temporary Output Files, Philosophy, Strategies @section Climate Model Paradigm @cindex climate model @cindex @acronym{NCAR} @cindex @acronym{GCM} @acronym{NCO} was developed at @acronym{NCAR} to aid analysis and manipulation of datasets produced by General Circulation Models (@acronym{GCM}s). @acronym{GCM} datasets share many features with other gridded scientific datasets and so provide a useful paradigm for the explication of the @acronym{NCO} operator set. Examples in this manual use a @acronym{GCM} paradigm because latitude, longitude, time, temperature and other fields related to our natural environment are as easy to visualize for the layman as the expert. @html @end html @node Temporary Output Files, Appending Variables, Climate Model Paradigm, Strategies @section Temporary Output Files @cindex data safety @cindex error tolerance @cindex safeguards @cindex temporary output files @cindex temporary files @acronym{NCO} operators are designed to be reasonably fault tolerant, so that a system failure or user-abort of the operation (e.g., with @kbd{C-c}) does not cause loss of data. The user-specified @var{output-file} is only created upon successful completion of the operation @footnote{The @command{ncrename} and @command{ncatted} operators are exceptions to this rule. @xref{ncrename netCDF Renamer}.}. This is accomplished by performing all operations in a temporary copy of @var{output-file}. The name of the temporary output file is constructed by appending @code{.pid@var{}.@var{}.tmp} to the user-specified @var{output-file} name. When the operator completes its task with no fatal errors, the temporary output file is moved to the user-specified @var{output-file}. This imbues the process with fault-tolerance since fatal error (e.g., disk space fills up) affect only the temporary output file, leaving the final output file not created if it did not already exist. Note the construction of a temporary output file uses more disk space than just overwriting existing files ``in place'' (because there may be two copies of the same file on disk until the @acronym{NCO} operation successfully concludes and the temporary output file overwrites the existing @var{output-file}). @cindex performance @cindex operator speed @cindex speed @cindex execution time Also, note this feature increases the execution time of the operator by approximately the time it takes to copy the @var{output-file} @footnote{The OS-specific system move command is used. This is @command{mv} for @acronym{UNIX}, and @command{move} for Windows.}. Finally, note this fault-tolerant feature allows the @var{output-file} to be the same as the @var{input-file} without any danger of ``overlap''. @html @end html @cindex @code{--no_tmp_fl} @cindex @code{--wrt_tmp_fl} @cindex @code{--write_tmp_fl} @cindex @code{--create_ram} @cindex @code{--open_ram} @cindex @acronym{RAM} disks @cindex @acronym{RAM} files Over time many ``power users'' have requested a way to turn-off the fault-tolerance safety feature of automatically creating a temporary file. Often these users build and execute production data analysis scripts that are repeated frequently on large datasets. Obviating an extra file write can then conserve significant disk space and time. For this purpose @acronym{NCO} has, since version 4.2.1 in August, 2012, made configurable the controls over temporary file creation. The @samp{--wrt_tmp_fl} and equivalent @samp{--write_tmp_fl} switches ensure @acronym{NCO} writes output to an intermediate temporary file. This is and has always been the default behavior so there is currently no need to specify these switches. However, the default may change some day, especially since writing to RAM disks (@pxref{RAM disks}) may some day become the default. The @samp{--no_tmp_fl} switch causes @acronym{NCO} to write directly to the final output file instead of to an intermediate temporary file. ``Power users'' may wish to invoke this switch to increase performance (i.e., reduce wallclock time) when manipulating large files. When eschewing temporary files, users may forsake the ability to have the same name for both @var{output-file} and @var{input-file} since, as described above, the temporary file prevented overlap issues. However, if the user creates the output file in @acronym{RAM} (@pxref{RAM disks}) then it is still possible to have the same name for both @var{output-file} and @var{input-file}. @example ncks in.nc out.nc # Default: create out.pid.tmp.nc then move to out.nc ncks --wrt_tmp_fl in.nc out.nc # Same as default ncks --no_tmp_fl in.nc out.nc # Create out.nc directly on disk ncks --no_tmp_fl in.nc in.nc # ERROR-prone! Overwrite in.nc with itself ncks --create_ram --no_tmp_fl in.nc in.nc # Create in RAM, write to disk ncks --open_ram --no_tmp_fl in.nc in.nc # Read into RAM, write to disk @end example @noindent There is no reason to expect the fourth example to work. The behavior of overwriting a file while reading from the same file is undefined, much as is the shell command @samp{cat foo > foo}. Although it may ``work'' in some cases, it is unreliable. One way around this is to use @samp{--create_ram} so that the output file is not written to disk until the input file is closed, @xref{RAM disks}. However, as of 20130328, the behavior of the @samp{--create_ram} and @samp{--open_ram} examples has not been thoroughly tested. The @acronym{NCO} authors have seen compelling use cases for utilizing the @acronym{RAM} switches, though not (yet) for combining them with @samp{--no_tmp_fl}. @acronym{NCO} implements both options because they are largely independent of eachother. It is up to ``power users'' to discover which best fit their needs. We welcome accounts of your experiences posted to the forums. @html @end html @cindex @code{-A} @cindex @code{-O} @cindex @code{--apn} @cindex @code{--append} @cindex @code{--ovr} @cindex @code{--overwrite} @cindex overwriting files @cindex appending variables @cindex appending to files Other safeguards exist to protect the user from inadvertently overwriting data. If the @var{output-file} specified for a command is a pre-existing file, then the operator will prompt the user whether to overwrite (erase) the existing @var{output-file}, attempt to append to it, or abort the operation. However, in processing large amounts of data, too many interactive questions slows productivity. Therefore @acronym{NCO} also implements two ways to override its own safety features, the @samp{-O} and @samp{-A} switches. Specifying @samp{-O} tells the operator to overwrite any existing @var{output-file} without prompting the user interactively. Specifying @samp{-A} tells the operator to attempt to append to any existing @var{output-file} without prompting the user interactively. These switches are useful in batch environments because they suppress interactive keyboard input. @html @end html @node Appending Variables, Simple Arithmetic and Interpolation, Temporary Output Files, Strategies @section Appending Variables Adding variables from one file to another is often desirable. @cindex concatenation @cindex appending variables @cindex merging files @cindex pasting variables This is referred to as @dfn{appending}, although some prefer the terminology @dfn{merging} @footnote{The terminology @dfn{merging} is reserved for an (unwritten) operator which replaces hyperslabs of a variable in one file with hyperslabs of the same variable from another file} or @dfn{pasting}. Appending is often confused with what @acronym{NCO} calls @dfn{concatenation}. @cindex record dimension In @acronym{NCO}, concatenation refers to splicing a variable along the record dimension. The length along the record dimension of the output is the sum of the lengths of the input files. Appending, on the other hand, refers to copying a variable from one file to another file which may or may not already contain the variable @footnote{Yes, the terminology is confusing. By all means mail me if you think of a better nomenclature. Should @acronym{NCO} use @dfn{paste} instead of @dfn{append}? }. @acronym{NCO} can append or concatenate just one variable, or all the variables in a file at the same time. In this sense, @command{ncks} can append variables from one file to another file. This capability is invoked by naming two files on the command line, @var{input-file} and @var{output-file}. When @var{output-file} already exists, the user is prompted whether to @dfn{overwrite}, @dfn{append/replace}, or @dfn{exit} from the command. Selecting @dfn{overwrite} tells the operator to erase the existing @var{output-file} and replace it with the results of the operation. Selecting @dfn{exit} causes the operator to exit---the @var{output-file} will not be touched in this case. Selecting @dfn{append/replace} causes the operator to attempt to place the results of the operation in the existing @var{output-file}, @xref{ncks netCDF Kitchen Sink}. @html @end html @cindex union of files @cindex disjoint files The simplest way to create the union of two files is @example ncks -A fl_1.nc fl_2.nc @end example This puts the contents of @file{fl_1.nc} into @file{fl_2.nc}. The @samp{-A} is optional. On output, @file{fl_2.nc} is the union of the input files, regardless of whether they share dimensions and variables, or are completely disjoint. The append fails if the input files have differently named record dimensions (since netCDF supports only one), or have dimensions of the same name but different sizes. @html @end html @node Simple Arithmetic and Interpolation, Statistics vs. Concatenation, Appending Variables, Strategies @section Simple Arithmetic and Interpolation Users comfortable with @acronym{NCO} semantics may find it easier to perform some simple mathematical operations in @acronym{NCO} rather than higher level languages. @command{ncbo} (@pxref{ncbo netCDF Binary Operator}) does file addition, subtraction, multiplication, division, and broadcasting. It even does group broadcasting. @command{ncflint} (@pxref{ncflint netCDF File Interpolator}) does file addition, subtraction, multiplication and interpolation. Sequences of these commands can accomplish simple yet powerful operations from the command line. @html @end html @node Statistics vs. Concatenation, Large Numbers of Files, Simple Arithmetic and Interpolation, Strategies @section Statistics vs.@: Concatenation @html @end html @cindex symbolic links The most frequently used operators of @acronym{NCO} are probably the @dfn{statisticians} (i.e., tools that do statistics) and concatenators. Because there are so many types of statistics like averaging (e.g., across files, within a file, over the record dimension, over other dimensions, with or without weights and masks) and of concatenating (across files, along the record dimension, along other dimensions), there are currently no fewer than five operators which tackle these two purposes: @command{ncra}, @command{nces}, @command{ncwa}, @command{ncrcat}, and @command{ncecat}. These operators do share many capabilities @footnote{Currently @command{nces} and @command{ncrcat} are symbolically linked to the @command{ncra} executable, which behaves slightly differently based on its invocation name (i.e., @samp{argv[0]}). These three operators share the same source code, and merely have different inner loops.}, though each has its unique specialty. Two of these operators, @command{ncrcat} and @command{ncecat}, concatenate hyperslabs across files. The other two operators, @command{ncra} and @command{nces}, compute statistics across (and/or within) files @footnote{The third averaging operator, @command{ncwa}, is the most sophisticated averager in @acronym{NCO}. However, @command{ncwa} is in a different class than @command{ncra} and @command{nces} because it operates on a single file per invocation (as opposed to multiple files). On that single file, however, @command{ncwa} provides a richer set of averaging options---including weighting, masking, and broadcasting.}. First, let's describe the concatenators, then the statistics tools. @menu * Concatenation:: * Averaging:: * Interpolating:: @end menu @html @end html @node Concatenation, Averaging, Statistics vs. Concatenation, Statistics vs. Concatenation @subsection Concatenators @command{ncrcat} and @command{ncecat} @cindex @command{ncecat} @cindex @command{ncrcat} Joining together independent files along a common record dimension is called @dfn{concatenation}. @command{ncrcat} is designed for concatenating record variables, while @command{ncecat} is designed for concatenating fixed length variables. Consider five files, @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}} each containing a year's worth of data. Say you wish to create from them a single file, @file{8589.nc} containing all the data, i.e., spanning all five years. If the annual files make use of the same record variable, then @command{ncrcat} will do the job nicely with, e.g., @code{ncrcat 8?.nc 8589.nc}. The number of records in the input files is arbitrary and can vary from file to file. @xref{ncrcat netCDF Record Concatenator}, for a complete description of @command{ncrcat}. However, suppose the annual files have no record variable, and thus their data are all fixed length. @cindex ensemble @cindex climate model For example, the files may not be conceptually sequential, but rather members of the same group, or @dfn{ensemble}. Members of an ensemble may have no reason to contain a record dimension. @command{ncecat} will create a new record dimension (named @var{record} by default) with which to glue together the individual files into the single ensemble file. If @command{ncecat} is used on files which contain an existing record dimension, that record dimension is converted to a fixed-length dimension of the same name and a new record dimension (named @code{record}) is created. Consider five realizations, @file{85a.nc}, @file{85b.nc}, @w{@dots{} @file{85e.nc}} of 1985 predictions from the same climate model. Then @code{ncecat 85?.nc 85_ens.nc} glues together the individual realizations into the single file, @file{85_ens.nc}. If an input variable was dimensioned [@code{lat},@code{lon}], it will have dimensions [@code{record},@code{lat},@code{lon}] in the output file. @w{A restriction} of @command{ncecat} is that the hyperslabs of the processed variables must be the same from file to file. Normally this means all the input files are the same size, and contain data on different realizations of the same variables. @xref{ncecat netCDF Ensemble Concatenator}, for a complete description of @command{ncecat}. @cindex @command{ncpdq} @html @end html @command{ncpdq} makes it possible to concatenate files along any dimension, not just the record dimension. First, use @command{ncpdq} to convert the dimension to be concatenated (i.e., extended with data from other files) into the record dimension. Second, use @command{ncrcat} to concatenate these files. Finally, if desirable, use @command{ncpdq} to revert to the original dimensionality. As a concrete example, say that files @file{x_01.nc}, @file{x_02.nc}, @w{@dots{} @file{x_10.nc}} contain time-evolving datasets from spatially adjacent regions. The time and spatial coordinates are @code{time} and @code{x}, respectively. Initially the record dimension is @code{time}. Our goal is to create a single file that contains joins all the spatially adjacent regions into one single time-evolving dataset. @example @verbatim for idx in 01 02 03 04 05 06 07 08 09 10; do # Bourne Shell ncpdq -a x,time x_${idx}.nc foo_${idx}.nc # Make x record dimension done ncrcat foo_??.nc out.nc # Concatenate along x ncpdq -a time,x out.nc out.nc # Revert to time as record dimension @end verbatim @end example Note that @command{ncrcat} will not concatenate fixed-length variables, whereas @command{ncecat} concatenates both fixed-length and record variables along a new record variable. To conserve system memory, use @command{ncrcat} where possible. @html @end html @node Averaging, Interpolating, Concatenation, Statistics vs. Concatenation @subsection Averagers @command{nces}, @command{ncra}, and @command{ncwa} @cindex @command{nces} @cindex @command{ncra} @cindex @command{ncwa} The differences between the averagers @command{ncra} and @command{nces} are analogous to the differences between the concatenators. @command{ncra} is designed for averaging record variables from at least one file, while @command{nces} is designed for averaging fixed length variables from multiple files. @command{ncra} performs a simple arithmetic average over the record dimension of all the input files, with each record having an equal weight in the average. @command{nces} performs a simple arithmetic average of all the input files, with each file having an equal weight in the average. Note that @command{ncra} cannot average fixed-length variables, but @command{nces} can average both fixed-length and record variables. To conserve system memory, use @command{ncra} rather than @command{nces} where possible (e.g., if each @var{input-file} is one record long). The file output from @command{nces} will have the same dimensions (meaning dimension names as well as sizes) as the input hyperslabs (@pxref{nces netCDF Ensemble Statistics}, for a complete description of @command{nces}). The file output from @command{ncra} will have the same dimensions as the input hyperslabs except for the record dimension, which will have a size @w{of 1} (@pxref{ncra netCDF Record Averager}, for a complete description of @command{ncra}). @html @end html @node Interpolating, , Averaging, Statistics vs. Concatenation @subsection Interpolator @command{ncflint} @cindex @command{ncflint} @command{ncflint} can interpolate data between or two files. Since no other operators have this ability, the description of interpolation is given fully on the @command{ncflint} reference page (@pxref{ncflint netCDF File Interpolator}). Note that this capability also allows @command{ncflint} to linearly rescale any data in a netCDF file, e.g., to convert between differing units. @html @end html @node Large Numbers of Files, Large Datasets, Statistics vs. Concatenation, Strategies @section Large Numbers of Files @cindex files, numerous input @cindex @code{-n @var{loop}} Occasionally one desires to digest (i.e., concatenate or average) hundreds or thousands of input files. @cindex automagic @cindex @acronym{NASA EOSDIS} Unfortunately, data archives (e.g., @acronym{NASA EOSDIS}) may not name netCDF files in a format understood by the @samp{-n @var{loop}} switch (@pxref{Specifying Input Files}) that automagically generates arbitrary numbers of input filenames. The @samp{-n @var{loop}} switch has the virtue of being concise, and of minimizing the command line. This helps keeps output file small since the command line is stored as metadata in the @code{history} attribute (@pxref{History Attribute}). However, the @samp{-n @var{loop}} switch is useless when there is no simple, arithmetic pattern to the input filenames (e.g., @file{h00001.nc}, @file{h00002.nc}, @w{@dots{} @file{h90210.nc}}). Moreover, filename globbing does not work when the input files are too numerous or their names are too lengthy (when strung together as a single argument) to be passed by the calling shell to the @acronym{NCO} operator @footnote{The exact length which exceeds the operating system internal limit for command line lengths varies from @acronym{OS} to @acronym{OS} and from shell to shell. @acronym{GNU} @code{bash} may not have any arbitrary fixed limits to the size of command line arguments. Many @acronym{OS}s cannot handle command line arguments (including results of file globbing) exceeding 4096 characters.}. When this occurs, the @acronym{ANSI} C-standard @code{argc}-@code{argv} method of passing arguments from the calling shell to a C-program (i.e., an @acronym{NCO} operator) breaks down. There are (at least) three alternative methods of specifying the input filenames to @acronym{NCO} in environment-limited situations. @html @end html @cindex standard input @cindex provenance @cindex @code{stdin} The recommended method for sending very large numbers (hundreds or more, typically) of input filenames to the multi-file operators is to pass the filenames with the @acronym{UNIX} @dfn{standard input} feature, aka @code{stdin}: @example @verbatim # Pipe large numbers of filenames to stdin /bin/ls | grep ${CASEID}_'......'.nc | ncecat -o foo.nc @end verbatim @end example This method avoids all constraints on command line size imposed by the operating system. A drawback to this method is that the @code{history} attribute (@pxref{History Attribute}) does not record the name of any input files since the names were not passed on the command line. This makes determining the data provenance at a later date difficult. @cindex @code{nco_input_file_number} @cindex @code{nco_input_file_list} @cindex global attributes @cindex attributes, global To remedy this situation, multi-file operators store the number of input files in the @code{nco_input_file_number} global attribute and the input file list itself in the @code{nco_input_file_list} global attribute (@pxref{File List Attributes}). Although this does not preserve the exact command used to generate the file, it does retains all the information required to reconstruct the command and determine the data provenance. @cindex globbing @cindex shell @cindex extended regular expressions @cindex regular expressions @cindex pattern matching @cindex @command{xargs} @cindex @acronym{UNIX} A second option is to use the @acronym{UNIX} @command{xargs} command. This simple example selects as input to @command{xargs} all the filenames in the current directory that match a given pattern. For illustration, consider a user trying to average millions of files which each have a six character filename. If the shell buffer cannot hold the results of the corresponding globbing operator, @file{??????.nc}, then the filename globbing technique will fail. Instead we express the filename pattern as an extended regular expression, @file{......\.nc} (@pxref{Subsetting Files}). We use @command{grep} to filter the directory listing for this pattern and to pipe the results to @command{xargs} which, in turn, passes the matching filenames to an @acronym{NCO} multi-file operator, e.g., @command{ncecat}. @example @verbatim # Use xargs to transfer filenames on the command line /bin/ls | grep ${CASEID}_'......'.nc | xargs -x ncecat -o foo.nc @end verbatim @end example @cindex pipes The single quotes protect the only sensitive parts of the extended regular expression (the @command{grep} argument), and allow shell interpolation (the @code{$@{CASEID@}} variable substitution) to proceed unhindered on the rest of the command. @command{xargs} uses the @acronym{UNIX} pipe feature to append the suitably filtered input file list to the end of the @command{ncecat} command options. @cindex output file @cindex input files @cindex @code{-o @var{fl_out}} The @code{-o foo.nc} switch ensures that the input files supplied by @command{xargs} are not confused with the output file name. @command{xargs} does, unfortunately, have its own limit (usually about 20,000 characters) on the size of command lines it can pass. Give @command{xargs} the @samp{-x} switch to ensure it dies if it reaches this internal limit. When this occurs, use either the @code{stdin} method above, or the symbolic link presented next. @cindex symbolic links Even when its internal limits have not been reached, the @command{xargs} technique may not be sophisticated enough to handle all situations. A full scripting language like Perl can handle any level of complexity of filtering input filenames, and any number of filenames. The technique of last resort is to write a script that creates symbolic links between the irregular input filenames and a set of regular, arithmetic filenames that the @samp{-n @var{loop}} switch understands. @cindex Perl For example, the following Perl script creates a monotonically enumerated symbolic link to up to one million @file{.nc} files in a directory. If there are 999,999 netCDF files present, the links are named @file{000001.nc} to @file{999999.nc}: @cindex @code{-n @var{loop}} @example @verbatim # Create enumerated symbolic links /bin/ls | grep \.nc | perl -e \ '$idx=1;while(){chop;symlink $_,sprintf("%06d.nc",$idx++);}' ncecat -n 999999,6,1 000001.nc foo.nc # Remove symbolic links when finished /bin/rm ??????.nc @end verbatim @end example The @samp{-n @var{loop}} option tells the @acronym{NCO} operator to automatically generate the filnames of the symbolic links. This circumvents any @acronym{OS} and shell limits on command line size. The symbolic links are easily removed once @acronym{NCO} is finished. @cindex @code{history} @cindex provenance One drawback to this method is that the @code{history} attribute (@pxref{History Attribute}) retains the filename list of the symbolic links, rather than the data files themselves. This makes it difficult to determine the data provenance at a later date. @node Large Datasets, Memory Requirements, Large Numbers of Files, Strategies @section Large Datasets @cindex large datasets @cindex @acronym{LFS} @cindex Large File Support @dfn{Large datasets} are those files that are comparable in size to the amount of random access memory (@acronym{RAM}) in your computer. Many users of @acronym{NCO} work with files larger than @w{100 MB}. Files this large not only push the current edge of storage technology, they present special problems for programs which attempt to access the entire file at once, such as @command{nces} and @command{ncecat}. @cindex swap space If you work with a @w{300 MB} files on a machine with only @w{32 MB} of memory then you will need large amounts of swap space (virtual memory on disk) and @acronym{NCO} will work slowly, or even fail. There is no easy solution for this. The best strategy is to work on a machine with sufficient amounts of memory and swap space. Since about 2004, many users have begun to produce or analyze files exceeding @w{2 GB} in size. These users should familiarize themselves with @acronym{NCO}'s Large File Support (@acronym{LFS}) capabilities (@pxref{Large File Support}). The next section will increase your familiarity with @acronym{NCO}'s memory requirements. With this knowledge you may re-design your data reduction approach to divide the problem into pieces solvable in memory-limited situations. @html @end html @cindex server @cindex @acronym{UNICOS} @cindex Cray @cindex @acronym{GNU}/Linux @cindex @code{ulimit} @cindex @code{core dump} If your local machine has problems working with large files, try running @acronym{NCO} from a more powerful machine, such as a network server. If you get a memory-related core dump (e.g., @samp{Error exit (core dumped)}) on a @acronym{GNU}/Linux system, or the operation ends before the entire output file is written, try increasing the process-available memory with @code{ulimit}: @example ulimit -f unlimited @end example This may solve constraints on clusters where sufficient hardware resources exist yet where system administrators felt it wise to prevent any individual user from consuming too much of resource. Certain machine architectures, e.g., Cray @acronym{UNICOS}, have special commands which allow one to increase the amount of interactive memory. @cindex @code{ilimit} On Cray systems, try to increase the available memory with the @code{ilimit} command. @cindex speed The speed of the @acronym{NCO} operators also depends on file size. When processing large files the operators may appear to hang, or do nothing, for large periods of time. In order to see what the operator is actually doing, it is useful to activate a more verbose output mode. This is accomplished by supplying a number greater @w{than 0} to the @samp{-D @var{debug-level}} (or @samp{--debug-level}, or @samp{--dbg_lvl}) switch. @cindex @code{-D @var{debug-level}} @cindex @code{--debug-level @var{debug-level}} @cindex @code{--dbg_lvl @var{debug-level}} @cindex @var{debug-level} @cindex @var{dbg_lvl} @cindex debugging When the @var{debug-level} is nonzero, the operators report their current status to the terminal through the @var{stderr} facility. Using @samp{-D} does not slow the operators down. Choose a @var{debug-level} @w{between 1} @w{and 3} for most situations, e.g., @code{nces -D 2 85.nc 86.nc 8586.nc}. @w{A full} description of how to estimate the actual amount of memory the multi-file @acronym{NCO} operators consume is given in @ref{Memory Requirements}. @html @end html @node Memory Requirements, Performance, Large Datasets, Strategies @section Memory Requirements @cindex memory requirements @cindex memory available @cindex @acronym{RAM} @cindex swap space @cindex peak memory usage @cindex @code{--ram_all} @cindex @code{--open_ram} @cindex @code{--diskless_all} Many people use @acronym{NCO} on gargantuan files which dwarf the memory available (free @acronym{RAM} plus swap space) even on today's powerful machines. These users want @acronym{NCO} to consume the least memory possible so that their scripts do not have to tediously cut files into smaller pieces that fit into memory. We commend these greedy users for pushing @acronym{NCO} to its limits! @cindex threads @cindex OpenMP @cindex shared memory machines This section describes the memory @acronym{NCO} requires during operation. The required memory is based on the underlying algorithms. The description below is the memory usage per thread. Users with shared memory machines may use the threaded @acronym{NCO} operators (@pxref{OpenMP Threading}). The peak and sustained memory usage will scale accordingly, i.e., by the number of threads. Memory consumption patterns of all operators are similar, with the exception of @command{ncap2}. @menu * Single and Multi-file Operators:: * Memory for ncap2:: @end menu @node Single and Multi-file Operators, Memory for ncap2, Memory Requirements, Memory Requirements @subsection Single and Multi-file Operators @cindex multi-file operators The multi-file operators currently comprise the record operators, @command{ncra} and @command{ncrcat}, and the ensemble operators, @command{nces} and @command{ncecat}. The record operators require @emph{much less} memory than the ensemble operators. This is because the record operators operate on one single record (i.e., time-slice) at a time, whereas the ensemble operators retrieve the entire variable into memory. Let @math{MS} be the peak sustained memory demand of an operator, @math{FT} be the memory required to store the entire contents of all the variables to be processed in an input file, @math{FR} be the memory required to store the entire contents of a single record of each of the variables to be processed in an input file, @math{VR} be the memory required to store a single record of the largest record variable to be processed in an input file, @math{VT} be the memory required to store the largest variable to be processed in an input file, @math{VI} be the memory required to store the largest variable which is not processed, but is copied from the initial file to the output file. All operators require @math{MI = VI} during the initial copying of variables from the first input file to the output file. This is the @emph{initial} (and transient) memory demand. The @emph{sustained} memory demand is that memory required by the operators during the processing (i.e., averaging, concatenation) phase which lasts until all the input files have been processed. The operators have the following memory requirements: @command{ncrcat} requires @math{MS <= VR}. @command{ncecat} requires @math{MS <= VT}. @command{ncra} requires @math{MS = 2FR + VR}. @command{nces} requires @math{MS = 2FT + VT}. @command{ncbo} requires @math{MS <= 3VT} (both input variables and the output variable). @command{ncflint} requires @math{MS <= 3VT} (both input variables and the output variable). @command{ncpdq} requires @math{MS <= 2VT} (one input variable and the output variable). @command{ncwa} requires @math{MS <= 8VT} (see below). Note that only variables that are processed, e.g., averaged, concatenated, or differenced, contribute to @math{MS}. Variables which do not appear in the output file (@pxref{Subsetting Files}) are never read and contribute nothing to the memory requirements. Further note that some operators perform internal type-promotion on some variables prior to arithmetic (@pxref{Type Conversion}). For example, @command{ncra} and @command{nces} both promote integer types to double-precision floating point prior to arithmetic, then perform the arithmetic, then demote back to the original integer type after arithmetic. This preserves the on-disk storage type while obtaining the accuracy advantages of floating point arithmetic. Since version 4.3.6 (released in September, 2013), @acronym{NCO} also by default converts single-precision floating point to double-precision prior to arithmetic, which incurs the same @acronym{RAM} penalty. Hence, the sustained memory required for integer variables and single-precision floats are two or four-times their on-disk, uncompressed, unpacked sizes if they meet the rules for automatic internal promotion. Put another way, disabling auto-promotion of single-precision variables (with @samp{--flt}) considerably reduces the @acronym{RAM} footprint of arithmetic operators. The @samp{--open_ram} switch (and switches that invoke it like @samp{--ram_all} and @samp{--diskless_all}) incurs a @acronym{RAM} penalty. These switches cause each input file to be copied to @acronym{RAM} upon opening. Hence any operator invoking these switches utilizes an additional @math{FT} of @acronym{RAM} (i.e., @math{MS += FT}). See @ref{RAM disks} for further details. @html @end html @command{ncwa} consumes between two and seven times the memory of a variable in order to process it. Peak consumption occurs when storing simultaneously in memory one input variable, one tally array, one input weight, one conformed/working weight, one weight tally, one input mask, one conformed/working mask, and one output variable. When invoked, the weighting and masking features contribute up to three-sevenths and two-sevenths of these requirements apiece. If weights and masks are @emph{not} specified (i.e., no @samp{-w} or @samp{-a} options) then @command{ncwa} requirements drop to @math{MS <= 3VT} (one input variable, one tally array, and the output variable). @cindex OpenMP @cindex threads The above memory requirements must be multiplied by the number of threads @var{thr_nbr} (@pxref{OpenMP Threading}). @cindex @code{-t @var{thr_nbr}} If this causes problems then reduce (with @samp{-t @var{thr_nbr}}) the number of threads. @node Memory for ncap2, , Single and Multi-file Operators, Memory Requirements @subsection Memory for @command{ncap2} @cindex @command{ncap2} @cindex binary operations @cindex unary operations @cindex memory leaks @cindex left hand casting @command{ncap2} has unique memory requirements due its ability to process arbitrarily long scripts of any complexity. All scripts acceptable to @command{ncap2} are ultimately processed as a sequence of binary or unary operations. @command{ncap2} requires @math{MS <= 2VT} under most conditions. An exception to this is when left hand casting (@pxref{Left hand casting}) is used to stretch the size of derived variables beyond the size of any input variables. Let @math{VC} be the memory required to store the largest variable defined by left hand casting. In this case, @math{MS <= 2VC}. @findex malloc() @command{ncap2} scripts are complete dynamic and may be of arbitrary length. A script that contains many thousands of operations, may uncover a slow memory leak even though each single operation consumes little additional memory. Memory leaks are usually identifiable by their memory usage signature. Leaks cause peak memory usage to increase monotonically with time regardless of script complexity. Slow leaks are very difficult to find. Sometimes a @command{malloc()} (or @command{new[]}) failure is the only noticeable clue to their existance. If you have good reasons to believe that a memory allocation failure is ultimately due to an @acronym{NCO} memory leak (rather than inadequate @acronym{RAM} on your system), then we would be very interested in receiving a detailed bug report. @node Performance, , Memory Requirements, Strategies @section Performance @cindex papers @cindex overview An overview of @acronym{NCO} capabilities as of about 2006 is in Zender, C. S. (2008), ``Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO)'', Environ. Modell. Softw., doi:10.1016/j.envsoft.2008.03.004. This paper is also available at @url{http://dust.ess.uci.edu/ppr/ppr_Zen08.pdf}. @cindex scaling @cindex performance @acronym{NCO} performance and scaling for arithmetic operations is described in Zender, C. S., and H. J. Mangalam (2007), ``Scaling Properties of Common Statistical Operators for Gridded Datasets'', Int. @w{J. High} Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. This paper is also available at @url{http://dust.ess.uci.edu/ppr/ppr_ZeM07.pdf}. It is helpful to be aware of the aspects of @acronym{NCO} design that can limit its performance: @enumerate @item @cindex buffering No data buffering is performed during @command{nc_get_var} and @command{nc_put_var} operations. @cindex performance @cindex operator speed @cindex speed @cindex execution time Hyperslabs too large too hold in core memory will suffer substantial performance penalties because of this. @item @cindex monotonic coordinates Since coordinate variables are assumed to be monotonic, the search for bracketing the user-specified limits should employ a quicker algorithm, like bisection, than the two-sided incremental search currently implemented. @item @cindex @var{C_format} @cindex @var{FORTRAN_format} @cindex @var{signedness} @cindex @var{scale_format} @cindex @var{add_offset} @var{C_format}, @var{FORTRAN_format}, @var{signedness}, @var{scale_format} and @var{add_offset} attributes are ignored by @command{ncks} when printing variables to screen. @item @cindex Yorick In the late 1990s it was discovered that some random access operations on large files on certain architectures (e.g., @acronym{UNICOS}) were much slower with @acronym{NCO} than with similar operations performed using languages that bypass the netCDF interface (e.g., Yorick). This may have been a penalty of unnecessary byte-swapping in the netCDF interface. It is unclear whether such problems exist in present day (2007) netCDF/@acronym{NCO} environments, where unnecessary byte-swapping has been reduced or eliminated. @end enumerate @html @end html @node Shared features, Reference Manual, Strategies, Top @chapter Shared Features Many features have been implemented in more than one operator and are described here for brevity. The description of each feature is preceded by a box listing the operators for which the feature is implemented. @cindex command line switches Command line switches for a given feature are consistent across all operators wherever possible. If no ``key switches'' are listed for a feature, then that particular feature is automatic and cannot be controlled by the user. @menu * Internationalization:: * Metadata Optimization:: * OpenMP Threading:: * Command Line Options:: * Specifying Input Files:: * Specifying Output Files:: * Remote storage:: * Retaining Retrieved Files:: * File Formats and Conversion:: * Large File Support:: * Subsetting Files:: * Subsetting Coordinate Variables:: * Group Path Editing:: * C and Fortran Index Conventions:: * Hyperslabs:: * Stride:: * Record Appending:: * Subcycle:: * Multislabs:: * Wrapped Coordinates:: * Auxiliary Coordinates:: * Grid Generation:: * Regridding:: * UDUnits Support:: * Rebasing Time Coordinate:: * Multiple Record Dimensions:: * Missing Values:: * Chunking:: * Compression:: * Deflation:: * MD5 digests:: * Buffer sizes:: * RAM disks:: * Packed data:: * Operation Types:: * Type Conversion:: * Batch Mode:: * Global Attribute Addition:: * History Attribute:: * File List Attributes:: * CF Conventions:: * ARM Conventions:: * Operator Version:: @end menu @html @end html @node Internationalization, Metadata Optimization, Shared features, Shared features @section Internationalization @cindex Internationalization @cindex I18N @cartouche Availability: All operators@* @end cartouche @cindex L10N @acronym{NCO} support for @dfn{internationalization} of textual input and output (e.g., Warning messages) is nascent. We introduced the first foreign language string catalogues (French and Spanish) in 2004, yet did not activate these in distributions because the catalogues were nearly empty. We seek volunteers to populate our templates with translations for their favorite languages. @c fxm: Work on this section @html @end html @node Metadata Optimization, OpenMP Threading, Internationalization, Shared features @section Metadata Optimization @cindex metadata optimization @cindex performance @cindex operator speed @cindex speed @cindex execution time @cindex @code{nc__enddef()} @cindex @code{--hdr_pad @var{hdr_pad}} @cindex @code{--header_pad @var{hdr_pad}} @cartouche Availability: All operators@* Short options: None@* Long options: @samp{--hdr_pad}, @samp{--header_pad}@* @end cartouche @acronym{NCO} supports padding headers to improve the speed of future metadata operations. Use the @samp{--hdr_pad} and @samp{--header_pad} switches to request that @var{hdr_pad} bytes be inserted into the metadata section of the output file. Future metadata expansions will not incur the netCDF3 performance penalty of copying the entire output file unless the expansion exceeds the amount of header padding exceeded. This can be beneficial when it is known that some metadata will be added at a future date. The operators which benefit most from judicious use of header padding are @command{ncatted} and @command{ncrename}, since they only alter metadata. This optimization exploits the netCDF library @code{nc__enddef()} function, which behaves differently with different versions of netCDF. It will improve speed of future metadata expansion with @code{CLASSIC} and @code{64bit} netCDF files, though not necessarily with @code{NETCDF4} files, i.e., those created by the netCDF interface to the @acronym{HDF5} library (@pxref{File Formats and Conversion}). @html @end html @node OpenMP Threading, Command Line Options, Metadata Optimization, Shared features @section OpenMP Threading @cindex OpenMP @cindex threads @cindex @acronym{SMP} @cindex shared memory parallelism @cindex parallelism @cindex @code{nco_openmp_thread_number} @cindex @code{--thr_nbr @var{thr_nbr}} @cindex @code{--threads @var{thr_nbr}} @cindex @code{--omp_num_threads @var{thr_nbr}} @cindex @code{-t @var{thr_nbr}} @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-t}@* Long options: @samp{--thr_nbr}, @samp{--threads}, @samp{--omp_num_threads}@* @end cartouche @acronym{NCO} supports shared memory parallelism (@acronym{SMP}) when compiled with an OpenMP-enabled compiler. Threads requests and allocations occur in two stages. First, users may request a specific number of threads @var{thr_nbr} with the @samp{-t} switch (or its long option equivalents, @samp{--thr_nbr}, @samp{--threads}, and @samp{--omp_num_threads}). If not user-specified, OpenMP obtains @var{thr_nbr} from the @code{OMP_NUM_THREADS} environment variable, if present, or from the @acronym{OS}, if not. @cartouche Caveat: Unfortunately, threading does not improve @acronym{NCO} throughput (i.e., wallclock time) because nearly all @acronym{NCO} operations are I/O-bound. This means that @acronym{NCO} spends negligible time doing anything compared to reading and writing. We have seen some and can imagine other use cases where @command{ncwa}, @command{ncpdq}, and @command{ncap2} (with long scripts) will complete faster due to threading. The main benefits of threading so far have been to isolate the serial from parallel portions of code. This parallelism is now exploited by OpenMP but then runs into the I/O bottleneck during output. The bottleneck will be ameliorated for large files by the use of MPI-enabled calls in the netCDF4 library when the underlying filesystem is parallel (e.g., @acronym{PVFS} or @acronym{JFS}). Implementation of the parallel output calls in @acronym{NCO} is not a goal of our current funding and would require new volunteers or funding. @end cartouche @cindex @var{thr_nbr} @cindex @code{OMP_NUM_THREADS} @cindex @command{ncrcat} @cindex @command{ncwa} @cindex @command{ncap2} @cindex @command{ncpdq} @cindex large datasets @acronym{NCO} may modify @var{thr_nbr} according to its own internal settings before it requests any threads from the system. Certain operators contain hard-code limits to the number of threads they request. We base these limits on our experience and common sense, and to reduce potentially wasteful system usage by inexperienced users. For example, @code{ncrcat} is extremely I/O-intensive so we restrict @math{@var{thr_nbr} <= 2} for @code{ncrcat}. This is based on the notion that the best performance that can be expected from an operator which does no arithmetic is to have one thread reading and one thread writing simultaneously. In the future (perhaps with netCDF4), we hope to demonstrate significant threading improvements with operators like @code{ncrcat} by performing multiple simultaneous writes. Compute-intensive operators (@code{ncap2}, @code{ncwa} and @code{ncpdq}) benefit most from threading. The greatest increases in throughput due to threading occur on large datasets where each thread performs millions, at least, of floating point operations. Otherwise, the system overhead of setting up threads probably outweighs the speed enhancements due to @acronym{SMP} parallelism. However, we have not yet demonstrated that the @acronym{SMP} parallelism scales beyond four threads for these operators. Hence we restrict @math{@var{thr_nbr} <= 4} for all operators. We encourage users to play with these limits (edit file @file{nco_omp.c}) and send us their feedback. @cindex debugging @cindex @var{dbg_lvl} Once the initial @var{thr_nbr} has been modified for any operator-specific limits, @acronym{NCO} requests the system to allocate a team of @var{thr_nbr} threads for the body of the code. The operating system then decides how many threads to allocate based on this request. Users may keep track of this information by running the operator with @math{@var{dbg_lvl} > 0}. By default, threaded operators attach one global attribute, @code{nco_openmp_thread_number}, to any file they create or modify. This attribute contains the number of threads the operator used to process the input files. This information helps to verify that the answers with threaded and non-threaded operators are equal to within machine precision. @cindex benchmarks This information is also useful for benchmarking. @html @end html @node Command Line Options, Specifying Input Files, OpenMP Threading, Shared features @section Command Line Options @cindex command line options @cartouche Availability: All operators@* @end cartouche @cindex @acronym{POSIX} @cindex @acronym{UNIX} @cindex @acronym{GNU} @cindex switches @acronym{NCO} achieves flexibility by using @dfn{command line options}. These options are implemented in all traditional @acronym{UNIX} commands as single letter @dfn{switches}, e.g., @samp{ls -l}. For many years @acronym{NCO} used only single letter option names. In late 2002, we implemented @acronym{GNU}/@acronym{POSIX} extended or long option names for all options. This was done in a backward compatible way such that the full functionality of @acronym{NCO} is still available through the familiar single letter options. In the future, however, some features of @acronym{NCO} may require the use of long options, simply because we have nearly run out of single letter options. More importantly, mnemonics for single letter options are often non-intuitive so that long options provide a more natural way of expressing intent. @cindex long options Extended options, also called long options, are implemented using the system-supplied @file{getopt.h} header file, if possible. @cindex @code{BSD} @cindex @code{getopt} @cindex @code{getopt_long} @cindex @file{getopt.h} This provides the @command{getopt_long} function to @acronym{NCO} @footnote{ If a @command{getopt_long} function cannot be found on the system, @acronym{NCO} will use the @command{getopt_long} from the @command{my_getopt} package by Benjamin Sittler @email{bsittler@@iname.com}. This is @acronym{BSD}-licensed software available from @uref{http://www.geocities.com/ResearchTriangle/Node/9405/#my_getopt}.}. @cindex @code{-D @var{debug-level}} @cindex @code{--dbg_lvl @var{debug-level}} The syntax of @dfn{short options} (single letter options) is @kbd{-@var{key} @var{value}} (dash-key-space-value). Here, @var{key} is the single letter option name, e.g., @samp{-D 2}. The syntax of @dfn{long options} (multi-letter options) is @kbd{--@var{long_name} @var{value}} (dash-dash-key-space-value), e.g., @samp{--dbg_lvl 2} or @kbd{--@var{long_name}=@var{value}} (dash-dash-key-equal-value), e.g., @samp{--dbg_lvl=2}. Thus the following are all valid for the @samp{-D} (short version) or @samp{--dbg_lvl} (long version) command line option. @example ncks -D 3 in.nc # Short option ncks --dbg_lvl=3 in.nc # Long option, preferred form ncks --dbg_lvl 3 in.nc # Long option, alternate form @end example @noindent The last example is preferred for two reasons. First, @samp{--dbg_lvl} is more specific and less ambiguous than @samp{-D}. The long option form makes scripts more self documenting and less error prone. Often long options are named after the source code variable whose value they carry. Second, the equals sign @kbd{=} joins the key (i.e., @var{long_name}) to the value in an uninterruptible text block. Experience shows that users are less likely to mis-parse commands when restricted to this form. @acronym{GNU} implements a superset of the @acronym{POSIX} standard which allows any unambiguous truncation of a valid option to be used. @example ncks -D 3 in.nc # Short option ncks --dbg_lvl=3 in.nc # Long option, full form ncks --dbg=3 in.nc # Long option, unambiguous truncation ncks --db=3 in.nc # Long option, unambiguous truncation ncks --d=3 in.nc # Long option, ambiguous truncation @end example @noindent The first four examples are equivalent and will work as expected. The final example will exit with an error since @command{ncks} cannot disambiguate whether @samp{--d} is intended as a truncation of @samp{--dbg_lvl}, of @samp{--dimension}, or of some other long option. @acronym{NCO} provides many long options for common switches. For example, the debugging level may be set in all operators with any of the switches @samp{-D}, @samp{--debug-level}, or @samp{--dbg_lvl}. This flexibility allows users to choose their favorite mnemonic. For some, it will be @samp{--debug} (an unambiguous truncation of @samp{--debug-level}, and other will prefer @samp{--dbg}. Interactive users usually prefer the minimal amount of typing, i.e., @samp{-D}. We recommend that scripts which are re-usable employ some form of the long options for future maintainability. This manual generally uses the short option syntax in examples. This is for historical reasons and to conserve space in printed output. Users are expected to pick the unambiguous truncation of each option name that most suits their taste. @html @end html @node Specifying Input Files, Specifying Output Files, Command Line Options, Shared features @section Specifying Input Files @cindex input files @cindex globbing @cindex regular expressions @cindex wildcards @cindex @code{NINTAP} @cindex Processor, @acronym{CCM} @cindex @acronym{CCM} Processor @cindex @code{-n @var{loop}} @cindex @code{--nintap @var{loop}} @cindex @code{-p @var{input-path}} @cindex @code{--pth @var{input-path}} @cindex @code{--path @var{input-path}} @cindex @var{input-path} @cartouche Availability (@code{-n}): @command{nces}, @command{ncecat}, @command{ncra}, @command{ncrcat}@* Availability (@code{-p}): All operators@* Short options: @samp{-n}, @samp{-p}@* Long options: @samp{--nintap}, @samp{--pth}, @samp{--path}@* @end cartouche It is important that users be able to specify multiple input files without typing every filename in full, often a tedious task even by graduate student standards. @cindex @acronym{UNIX} There are four different ways of specifying input files to @acronym{NCO}: explicitly typing each, using @acronym{UNIX} shell wildcards, and using the @acronym{NCO} @samp{-n} and @samp{-p} switches (or their long option equivalents, @samp{--nintap} or @samp{--pth} and @samp{--path}, respectively). Techniques to augment these methods to specify arbitrary numbers (e.g., thousands) and patterns of filenames are discussed separately (@pxref{Large Numbers of Files}). To illustrate these methods, consider the simple problem of using @command{ncra} to average five input files, @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}}, and store the results in @file{8589.nc}. Here are the four methods in order. They produce identical answers. @example ncra 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc ncra 8[56789].nc 8589.nc ncra 8?.nc 8589.nc ncra -p @var{input-path} 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc ncra -n 5,2,1 85.nc 8589.nc @end example The first method (explicitly specifying all filenames) works by brute force. The second method relies on the operating system shell to @dfn{glob} (expand) the @dfn{regular expression} @code{8[56789].nc}. The shell then passes the valid filenames (those which match the regular expansion) to @command{ncra}. In this case @command{ncra} never knows that a regular expression was used, because the shell intercepts and expands and matches the regular expression before @command{ncra} is actually invoked. The third method is uses globbing with a different regular expression that is less safe (it will also match unwanted files such as @file{81.nc} and @file{8Z.nc} if present). The fourth method uses the @samp{-p @var{input-path}} argument to specify the directory where all the input files reside. @acronym{NCO} prepends @var{input-path} (e.g., @file{/data/username/model}) to all @var{input-files} (though not to @var{output-file}). Thus, using @samp{-p}, the path to any number of input files need only be specified once. Note @var{input-path} need not end with @samp{/}; the @samp{/} is automatically generated if necessary. The last method passes (with @samp{-n}) syntax concisely describing the entire set of filenames @footnote{The @samp{-n} option is a backward-compatible superset of the @code{NINTAP} option from the @acronym{NCAR} @acronym{CCM} Processor. The @acronym{CCM} Processor was custom-written Fortran code maintained for many years by Lawrence Buja at @acronym{NCAR}, and phased-out in the late 1990s. @acronym{NCO} stole some ideas, like @code{NINTAP}-functionality, from @acronym{CCM} Processor capabilities.}. @cindex multi-file operators @cindex files, multiple This option is only available with the @dfn{multi-file operators}: @command{ncra}, @command{ncrcat}, @command{nces}, and @command{ncecat}. By definition, multi-file operators are able to process an arbitrary number of @var{input-files}. This option is very useful for abbreviating lists of filenames representable as @var{alphanumeric_prefix}+@var{numeric_suffix}+@file{.}+@var{filetype} where @var{alphanumeric_prefix} is a string of arbitrary length and composition, @var{numeric_suffix} is a fixed width field of digits, and @var{filetype} is a standard filetype indicator. For example, in the file @file{ccm3_h0001.nc}, we have @var{alphanumeric_prefix} = @file{ccm3_h}, @var{numeric_suffix} = @file{0001}, and @var{filetype} = @file{nc}. @acronym{NCO} decodes lists of such filenames encoded using the @samp{-n} syntax. The simpler (three-argument) @samp{-n} usage takes the form @code{-n @var{file_number},@var{digit_number},@var{numeric_increment}} where @var{file_number} is the number of files, @var{digit_number} is the fixed number of numeric digits comprising the @var{numeric_suffix}, and @var{numeric_increment} is the constant, integer-valued difference between the @var{numeric_suffix} of any two consecutive files. The value of @var{alphanumeric_prefix} is taken from the input file, which serves as a template for decoding the filenames. In the example above, the encoding @code{-n 5,2,1} along with the input file name @file{85.nc} tells @acronym{NCO} to construct five (5) filenames identical to the template @file{85.nc} except that the final two (2) digits are a numeric suffix to be incremented by one (1) for each successive file. Currently @var{filetype} may be either be empty, @file{nc}, @file{h5}, @file{cdf}, @file{hdf}, @file{hd5}, or @file{he5}. If present, these @var{filetype} suffixes (and the preceding @file{.}) are ignored by @acronym{NCO} as it uses the @samp{-n} arguments to locate, evaluate, and compute the @var{numeric_suffix} component of filenames. @cindex wrapped filenames @cindex climate model Recently the @samp{-n} option has been extended to allow convenient specification of filenames with ``circular'' characteristics. This means it is now possible for @acronym{NCO} to automatically generate filenames which increment regularly until a specified maximum value, and then wrap back to begin again at a specified minimum value. The corresponding @samp{-n} usage becomes more complex, taking one or two additional arguments for a total of four or five, respectively: @code{-n @var{file_number},@var{digit_number},@var{numeric_increment}[,@var{numeric_max}[,@var{numeric_min}]]} where @var{numeric_max}, if present, is the maximum integer-value of @var{numeric_suffix} and @var{numeric_min}, if present, is the minimum integer-value of @var{numeric_suffix}. Consider, for example, the problem of specifying non-consecutive input files where the filename suffixes end with the month index. In climate modeling it is common to create summertime and wintertime averages which contain the averages of the months June--July--August, and December--January--February, respectively: @example ncra -n 3,2,1 85_06.nc 85_0608.nc ncra -n 3,2,1,12 85_12.nc 85_1202.nc ncra -n 3,2,1,12,1 85_12.nc 85_1202.nc @end example The first example shows that three arguments to the @samp{-n} option suffice to specify consecutive months (@code{06, 07, 08}) which do not ``wrap'' back to a minimum value. The second example shows how to use the optional fourth and fifth elements of the @samp{-n} option to specify a wrap value. The fourth argument to @samp{-n}, when present, specifies the maximum integer value of @var{numeric_suffix}. In the example the maximum value @w{is 12,} and will be formatted as @file{12} in the filename string. The fifth argument to @samp{-n}, when present, specifies the minimum integer value of @var{numeric_suffix}. The default minimum filename suffix @w{is 1,} which is formatted as @file{01} in this case. Thus the second and third examples have the same effect, that is, they automatically generate, in order, the filenames @file{85_12.nc}, @file{85_01.nc}, and @file{85_02.nc} as input to @acronym{NCO}. As of @acronym{NCO} version 4.5.2 (September, 2015), @acronym{NCO} supports an optional sixth argument to @samp{-n}, the month-indicator. The month-indicator affirms to @acronym{NCO} that the right-most digits being manipulated in the generated filenames correspond to month numbers (with January formatted as @file{01} and December as @file{12}). Moreover, it assumes digits to the left of the month are the year. The full (six-argument) @samp{-n} usage takes the form @code{-n @var{file_number},@var{digit_number},@var{month_increment},@var{max_month},@var{min_month},@samp{yyyymm}}. The @samp{yyyymm} string is a clunky way (can you think of a clearer way?) to tell @acronym{NCO} to enumerate files in year-month mode. When present, @samp{yyyymm} string causes @acronym{NCO} to automatically generate series of filenames whose right-most two digits increment from @var{min_month} by @var{month_increment} up to @var{max_month} and then the leftmost digits (i.e., the year) increment by one, and the whole process is reapeated until the @var{file_number} filenames are generated. @example ncrcat -n 3,6,1,12,1 198512.nc 198512_198502.nc ncrcat -n 3,6,1,12,1,yyyymm 198512.nc 198512_198602.nc ncrcat -n 3,6,1,12,12,yyyymm 198512.nc 198512_198712.nc @end example The first command concatenates three files (@file{198512.nc}, @file{198501.nc}, @file{198502.nc}) into the output file. The second command concatenates three files (@file{198512.nc}, @file{198601.nc}, @file{198602.nc}). The @samp{yyyymm}-indicator causes the left-most digits to increment each time the right-most two digits reach their maximum and then wrap. The first command does not have the indicator so it is always 1985. The third command concatenates three files (@file{198512.nc}, @file{198612.nc}, @file{198712.nc}). @html @end html @node Specifying Output Files, Remote storage, Specifying Input Files, Shared features @section Specifying Output Files @cindex output file @cindex input files @cindex positional arguments @cindex command line switches @cindex @code{-o @var{fl_out}} @cindex @code{--output @var{fl_out}} @cindex @code{--fl_out @var{fl_out}} @cartouche Availability: All operators@* Short options: @samp{-o}@* Long options: @samp{--fl_out}, @samp{--output}@* @end cartouche @acronym{NCO} commands produce no more than one output file, @var{fl_out}. Traditionally, users specify @var{fl_out} as the final argument to the operator, following all input file names. This is the @dfn{positional argument} method of specifying input and ouput file names. The positional argument method works well in most applications. @acronym{NCO} also supports specifying @var{fl_out} using the command line switch argument method, @samp{-o @var{fl_out}}. Specifying @var{fl_out} with a switch, rather than as a positional argument, allows @var{fl_out} to precede input files in the argument list. @cindex multi-file operators This is particularly useful with multi-file operators for three reasons. Multi-file operators may be invoked with hundreds (or more) filenames. Visual or automatic location of @var{fl_out} in such a list is difficult when the only syntactic distinction between input and output files is their position. @cindex @command{xargs} @cindex input files Second, specification of a long list of input files may be difficult (@pxref{Large Numbers of Files}). Making the input file list the final argument to an operator facilitates using @command{xargs} for this purpose. Some alternatives to @command{xargs} are heinous and undesirable. Finally, many users are more comfortable specifying output files with @samp{-o @var{fl_out}} near the beginning of an argument list. @cindex compilers @cindex linkers Compilers and linkers are usually invoked this way. Users should specify @var{fl_out} using either (not both) method. If @var{fl_out} is specified twice (once with the switch and once as the last positional argument), then the positional argument takes precedence. @html @end html @node Remote storage, Retaining Retrieved Files, Specifying Output Files, Shared features @section Accessing Remote Files @cindex @code{rcp} @cindex @code{scp} @cindex @file{.rhosts} @cindex @acronym{NCAR MSS} @cindex @acronym{MSS} @cindex Mass Store System @cindex @acronym{URL} @cindex @code{ftp} @cindex @code{sftp} @cindex @code{wget} @cindex remote files @cindex synchronous file access @cindex asynchronous file access @cindex @code{--pth @var{input-path}} @cindex @code{--path @var{input-path}} @cindex @code{--lcl @var{output-path}} @cindex @code{--local @var{output-path}} @cindex @code{-l @var{output-path}} @cindex @file{.netrc} @cindex @code{history} @cartouche Availability: All operators@* Short options: @samp{-p}, @samp{-l}@* Long options: @samp{--pth}, @samp{--path}, @samp{--lcl}, @samp{--local}@* @end cartouche All @acronym{NCO} operators can retrieve files from remote sites as well as from the local file system. @w{A remote} site can be an anonymous @acronym{FTP} server, a machine on which the user has @command{rcp}, @command{scp}, or @command{sftp} privileges, @acronym{NCAR}'s Mass Storage System (@acronym{MSS}), or an @acronym{OPeNDAP} server. Examples of each are given below, following a brief description of the particular access protocol. @html @end html To access a file via an anonymous @acronym{FTP} server, simply supply the remote file's @acronym{URL}. Anonymous @acronym{FTP} usually requires no further credentials, e.g., no @file{.netrc} file is necessary. @acronym{FTP} is an intrinsically insecure protocol because it transfers passwords in plain text format. Users should access sites using anonymous @acronym{FTP}, or better yet, secure @acronym{FTP} (@acronym{SFTP}, see below) when possible. Some @acronym{FTP} servers require a login/password combination for a valid user account. @acronym{NCO} allows transactions that require additional credentials so long as the required information is stored in the @file{.netrc} file. Usually this information is the remote machine name, login, and password, in plain text, separated by those very keywords, e.g., @example machine dust.ess.uci.edu login zender password bushlied @end example Eschew using valuable passwords for @acronym{FTP} transactions, since @file{.netrc} passwords are potentially exposed to eavesdropping software @footnote{@acronym{NCO} does not implement command line options to specify @acronym{FTP} logins and passwords because copying those data into the @code{history} global attribute in the output file (done by default) poses an unacceptable security risk. }. @html @end html @acronym{SFTP}, i.e., secure @acronym{FTP}, uses @acronym{SSH}-based security protocols that solve the security issues associated with plain @acronym{FTP}. @acronym{NCO} supports @acronym{SFTP} protocol access to files specified with a homebrew syntax of the form @example sftp://machine.domain.tld:/path/to/filename @end example Note the second colon following the top-level-domain, @code{tld}. This syntax is a hybrid between an @acronym{FTP URL} and standard remote file syntax. @html @end html To access a file using @command{rcp} or @command{scp}, specify the Internet address of the remote file. Of course in this case you must have @command{rcp} or @command{scp} privileges which allow transparent (no password entry required) access to the remote machine. This means that @file{~/.rhosts} or @file{~/ssh/authorized_keys} must be set accordingly on both local and remote machines. @cindex @acronym{HPSS} @cindex @command{hsi} @cindex @command{msrcp} @cindex @command{msread} @cindex @command{nrnet} @html @end html To access a file on a High Performance Storage System (@acronym{HPSS}) (such as that at @acronym{NCAR}, @acronym{ECMWF}, @acronym{LANL}, @acronym{DKRZ}, @acronym{LLNL}) specify the full @acronym{HPSS} pathname of the remote file. @acronym{NCO} will attempt to detect whether the local machine has direct (synchronous) @acronym{HPSS} access. In this case, @acronym{NCO} attempts to use the Hierarchical Storage Interface (@acronym{HSI}) command @command{hsi get} @footnote{The @command{hsi} command must be in the user's path in one of the following directories: @code{/usr/local/bin}, @code{/opt/hpss/bin}, or @code{/ncar/opt/hpss/hsi}. Tell us if the @acronym{HPSS} installation at your site places the @command{hsi} command in a different location, and we will add that location to the list of acceptable paths to search for @command{hsi}. }. The following examples show how one might analyze files stored on remote systems. @c HPSS syntax at http://www2.cisl.ucar.edu/docs/hpss/hsi @example ncks -l . ftp://dust.ess.uci.edu/pub/zender/nco/in.nc ncks -l . sftp://dust.ess.uci.edu:/home/ftp/pub/zender/nco/in.nc ncks -l . dust.ess.uci.edu:/home/zender/nco/data/in.nc ncks -l . /ZENDER/nco/in.nc ncks -l . /home/zender/nco/in.nc ncks -l . http://thredds-test.ucar.edu/thredds/dodsC/testdods/in.nc @end example @noindent The first example works verbatim if your system is connected to the Internet and is not behind a firewall. The second example works if you have @command{sftp} access to the machine @code{dust.ess.uci.edu}. The third example works if you have @command{rcp} or @command{scp} access to the machine @code{dust.ess.uci.edu}. The fourth and fifth examples work on @acronym{NCAR} computers with local access to the @acronym{HPSS} @command{hsi get} command @footnote{@acronym{NCO} supported the old @acronym{NCAR} Mass Storage System (@acronym{MSS}) until version 4.0.7 in April, 2011. @acronym{NCO} supported @acronym{MSS}-retrievals via a variety of mechanisms including the @command{msread}, @command{msrcp}, and @command{nrnet} commands invoked either automatically or with sentinels like @command{ncks -p mss:/ZENDER/nco -l . in.nc}. Once the @acronym{MSS} was decommissioned in March, 2011, support for these retrieval mechanisms was replaced by support for @acronym{HPSS} in @acronym{NCO}. }. The sixth command works if your local version of @acronym{NCO} is @acronym{OPeNDAP}-enabled (this is fully described in @ref{OPeNDAP}), or if the remote file is accessible via @command{wget}. The above commands can be rewritten using the @samp{-p @var{input-path}} option as follows: @cindex @code{-p @var{input-path}} @cindex @var{input-path} @cindex @code{-l @var{output-path}} @cindex @var{output-path} @example ncks -p ftp://dust.ess.uci.edu/pub/zender/nco -l . in.nc ncks -p sftp://dust.ess.uci.edu:/home/ftp/pub/zender/nco -l . in.nc ncks -p dust.ess.uci.edu:/home/zender/nco -l . in.nc ncks -p /ZENDER/nco -l . in.nc ncks -p /home/zender/nco -l . in.nc # HPSS ncks -p http://thredds-test.ucar.edu/thredds/dodsC/testdods \ -l . in.nc @end example @noindent Using @samp{-p} is recommended because it clearly separates the @var{input-path} from the filename itself, sometimes called the @dfn{stub}. @cindex stub When @var{input-path} is not explicitly specified using @samp{-p}, @acronym{NCO} internally generates an @var{input-path} from the first input filename. The automatically generated @var{input-path} is constructed by stripping the input filename of everything following the final @samp{/} character (i.e., removing the stub). The @samp{-l @var{output-path}} option tells @acronym{NCO} where to store the remotely retrieved file. It has no effect on locally-retrieved files, or on the output file. Often the path to a remotely retrieved file is quite different than the path on the local machine where you would like to store the file. If @samp{-l} is not specified then @acronym{NCO} internally generates an @var{output-path} by simply setting @var{output-path} equal to @var{input-path} stripped of any machine names. If @samp{-l} is not specified and the remote file resides on the @acronym{NCAR} @acronym{HPSS} system, then the leading character of @var{input-path}, @samp{/}, is also stripped from @var{output-path}. Specifying @var{output-path} as @samp{-l ./} tells @acronym{NCO} to store the remotely retrieved file and the output file in the current directory. Note that @samp{-l .} is equivalent to @samp{-l ./} though the latter is syntactically more clear. @menu * OPeNDAP:: @end menu @html @end html @node OPeNDAP, , Remote storage, Remote storage @subsection @acronym{OPeNDAP} @cindex @acronym{DAP} @cindex @acronym{DODS} @cindex @acronym{HTTP} protocol @cindex @env{DODS_ROOT} @cindex Distributed Oceanographic Data System @cindex oceanography @cindex data access protocol @cindex Open-source Project for a Network Data Access Protocol @cindex @acronym{OPeNDAP}. @cindex server @cindex client-server The Distributed Oceanographic Data System (@acronym{DODS}) provides useful replacements for common data interface libraries like netCDF. The @acronym{DODS} versions of these libraries implement network transparent access to data via a client-server data access protocol that uses the @acronym{HTTP} protocol for communication. Although @acronym{DODS}-technology originated with oceanography data, it applyies to virtually all scientific data. In recognition of this, the data access protocol underlying @acronym{DODS} (which is what @acronym{NCO} cares about) has been renamed the Open-source Project for a Network Data Access Protocol, @acronym{OPeNDAP}. We use the terms @acronym{DODS} and @acronym{OPeNDAP} interchangeably, and often write @acronym{OPeNDAP}/@acronym{DODS} for now. In the future we will deprecate @acronym{DODS} in favor of @acronym{DAP} or @acronym{OPeNDAP}, as appropriate @footnote{ @cindex @acronym{NVODS} @cindex National Virtual Ocean Data System @cindex open source @acronym{DODS} is being deprecated because it is ambiguous, referring both to a protocol and to a collection of (oceanography) data. It is superceded by two terms. @acronym{DAP} is the discipline-neutral Data Access Protocol at the heart of @acronym{DODS}. The National Virtual Ocean Data System (@acronym{NVODS}) refers to the collection of oceanography data and oceanographic extensions to @acronym{DAP}. In other words, @acronym{NVODS} is implemented with @acronym{OPeNDAP}. @acronym{OPeNDAP} is @emph{also} the open source project which maintains, develops, and promulgates the @acronym{DAP} standard. @acronym{OPeNDAP} and @acronym{DAP} really are interchangeable. Got it yet?}. @acronym{NCO} may be @acronym{DAP}-enabled by linking @acronym{NCO} to the @acronym{OPeNDAP} libraries. @cindex @file{Makefile} This is described in the @acronym{OPeNDAP} documentation and automagically implemented in @acronym{NCO} build mechanisms @footnote{ Automagic support for @acronym{DODS} version 3.2.x was deprecated in December, 2003 after @acronym{NCO} version 2.8.4. @acronym{NCO} support for @acronym{OPeNDAP} versions 3.4.x commenced in December, 2003, with @acronym{NCO} version 2.8.5. @acronym{NCO} support for @acronym{OPeNDAP} versions 3.5.x commenced in June, 2005, with @acronym{NCO} version 3.0.1. @acronym{NCO} support for @acronym{OPeNDAP} versions 3.6.x commenced in June, 2006, with @acronym{NCO} version 3.1.3. @acronym{NCO} support for @acronym{OPeNDAP} versions 3.7.x commenced in January, 2007, with @acronym{NCO} version 3.1.9.}. The @file{./configure} mechanism automatically enables @acronym{NCO} as @acronym{OPeNDAP} clients if it can find the required @acronym{OPeNDAP} libraries @footnote{ The minimal set of libraries required to build @acronym{NCO} as @acronym{OPeNDAP} clients, where @acronym{OPeNDAP} is supplied as a separate library apart from @file{libnetcdf.a}, are, in link order, @file{libnc-dap.a}, @file{libdap.a}, and @file{libxml2} and @file{libcurl.a}.}. in the usual locations. The @env{$DODS_ROOT} environment variable may be used to override the default @acronym{OPeNDAP} library location at @acronym{NCO} compile-time. Building @acronym{NCO} with @file{bld/Makefile} and the command @code{make DODS=Y} adds the (non-intuitive) commands to link to the @acronym{OPeNDAP} libraries installed in the @env{$DODS_ROOT} directory. The file @file{doc/opendap.sh} contains a generic script intended to help users install @acronym{OPeNDAP} before building @acronym{NCO}. The documentation at the @uref{http://www.opendap.org, OPeNDAP Homepage} is voluminous. Check there and on the @uref{http://www.unidata.ucar.edu/packages/dods/home/mailLists/, DODS mail lists}. to learn more about the extensive capabilities of @acronym{OPeNDAP} @footnote{ We are most familiar with the @acronym{OPeNDAP} ability to enable network-transparent data access. @cindex constraint expressions @cindex server-side processing @acronym{OPeNDAP} has many other features, including sophisticated hyperslabbing and server-side processing via @dfn{constraint expressions}. If you know more about this, please consider writing a section on ``@acronym{OPeNDAP} Capabilities of Interest to @acronym{NCO} Users'' for incorporation in the @cite{NCO User Guide}.}. Once @acronym{NCO} is @acronym{DAP}-enabled the operators are @acronym{OPeNDAP} clients. All @acronym{OPeNDAP} clients have network transparent access to any files controlled by a @acronym{OPeNDAP} server. Simply specify the input file path(s) in @acronym{URL} notation and all @acronym{NCO} operations may be performed on remote files made accessible by a @acronym{OPeNDAP} server. This command tests the basic functionality of @acronym{OPeNDAP}-enabled @acronym{NCO} clients: @example % ncks -O -o ~/foo.nc -C -H -v one -l /tmp \ -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc % ncks -H -v one ~/foo.nc one = 1 @end example The @code{one = 1} outputs confirm (first) that @command{ncks} correctly retrieved data via the @acronym{OPeNDAP} protocol and (second) that @command{ncks} created a valid local copy of the subsetted remote file. With minor changes to the above command, netCDF4 can be used as both the input and output file format: @example % ncks -4 -O -o ~/foo.nc -C -H -v one -l /tmp \ -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in_4.nc % ncks -H -v one ~/foo.nc one = 1 @end example And, of course, @acronym{OPeNDAP}-enabled @acronym{NCO} clients continue to support orthogonal features such as UDUnits (@pxref{UDUnits Support}): @example % ncks -u -C -H -v wvl -d wvl,'0.4 micron','0.7 micron' \ -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in_4.nc % wvl[0]=5e-07 meter @end example The next command is a more advanced example which demonstrates the real power of @acronym{OPeNDAP}-enabled @acronym{NCO} clients. The @command{ncwa} client requests an equatorial hyperslab from remotely stored @acronym{NCEP reanalyses data} of the @w{year 1969}. The @acronym{NOAA} @acronym{OPeNDAP} server (hopefully!) serves these data. The local @command{ncwa} client then computes and stores (locally) the regional mean surface pressure @w{(in Pa)}. @example ncwa -C -a lat,lon,time -d lon,-10.,10. -d lat,-10.,10. -l /tmp -p \ http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.dailyavgs/surface \ pres.sfc.1969.nc ~/foo.nc @end example @noindent @cindex packing @cindex unpacking All with one command! The data in this particular input file also happen to be packed (@pxref{Methods and functions}), although this complication is transparent to the user since @acronym{NCO} automatically unpacks data before attempting arithmetic. @acronym{NCO} obtains remote files from the @acronym{OPeNDAP} server (e.g., @file{www.cdc.noaa.gov}) rather than the local machine. Input files are first copied to the local machine, then processed. The @acronym{OPeNDAP} server performs data access, hyperslabbing, and transfer to the local machine. @cindex I/O This allows the I/O to appear to @acronym{NCO} as if the input files were local. The local machine performs all arithmetic operations. Only the hyperslabbed output data are transferred over the network (to the local machine) for the number-crunching to begin. The advantages of this are obvious if you are examining small parts of large files stored at remote locations. Natually there are many versions of @acronym{OPeNDAP} servers supplying data and bugs in the server can appear to be bugs in @acronym{NCO}. However, with very few exceptions @footnote{For example, @acronym{DAP} servers do not like variables with periods (``.'') in their names even though this is perfectly legal with netCDF. Such names may cause the @acronym{DAP} service to fail because @acronym{DAP} interprets the period as structure delimiter in an @acronym{HTTP} query string.} an @acronym{NCO} command that works on a local file must work across an @acronym{OPeNDAP} connection or else there is a bug in the server. This is because @acronym{NCO} does nothing special to handle files served by @acronym{OPeNDAP}, the whole process is (supposed to be) completely transparent to the client @acronym{NCO} software. Therefore it is often useful to try @acronym{NCO} commands on various @acronym{OPeNDAP} servers in order to isolate whether a problem may be due to a bug in the @acronym{OPeNDAP} server on a particular machine. For this purpose, one might try variations of the following commands that access files on public @acronym{OPeNDAP} servers: @example # Strided access to HDF5 file ncks -v Time -d Time,0,10,2 http://eosdap.hdfgroup.uiuc.edu:8080/opendap/data/NASAFILES/hdf5/BUV-Nimbus04_L3zm_v01-00-2012m0203t144121.h5 # Strided access to netCDF3 file ncks -O -D 1 -d time,1 -d lev,0 -d lat,0,100,10 -d lon,0,100,10 -v u_velocity http://nomads.ncep.noaa.gov:9090/dods/rtofs/rtofs_global20140303/rtofs_glo_2ds_forecast_daily_prog ~/foo.nc @end example @noindent These servers were operational at the time of writing, March 2014. Unfortunately, administrators often move or rename path directories. Recommendations for additional public @acronym{OPeNDAP} servers on which to test @acronym{NCO} are welcome. @html @end html @node Retaining Retrieved Files, File Formats and Conversion, Remote storage, Shared features @section Retaining Retrieved Files @cindex file deletion @cindex file removal @cindex file retention @cindex @code{-R} @cindex @code{--rtn} @cindex @code{--retain} @cartouche Availability: All operators@* Short options: @samp{-R}@* Long options: @samp{--rtn}, @samp{--retain}@* @end cartouche In order to conserve local file system space, files retrieved from remote locations are automatically deleted from the local file system once they have been processed. Many @acronym{NCO} operators were constructed to work with numerous large (e.g., @w{200 MB}) files. Retrieval of multiple files from remote locations is done serially. Each file is retrieved, processed, then deleted before the cycle repeats. In cases where it is useful to keep the remotely-retrieved files on the local file system after processing, the automatic removal feature may be disabled by specifying @samp{-R} on the command line. Invoking @code{-R} disables the default printing behavior of @command{ncks}. This allows @command{ncks} to retrieve remote files without automatically trying to print them. See @ref{ncks netCDF Kitchen Sink}, for more details. @cindex @acronym{FTP} @cindex @acronym{SSH} @cindex @acronym{msrcp} Note that the remote retrieval features of @acronym{NCO} can always be used to retrieve @emph{any} file, including non-netCDF files, via @command{SSH}, anonymous @acronym{FTP}, or @command{msrcp}. Often this method is quicker than using a browser, or running an @acronym{FTP} session from a shell window yourself. @cindex server For example, say you want to obtain a @acronym{JPEG} file from a weather server. @example ncks -R -p ftp://weather.edu/pub/pix/jpeg -l . storm.jpg @end example @noindent In this example, @command{ncks} automatically performs an anonymous @acronym{FTP} login to the remote machine and retrieves the specified file. When @command{ncks} attempts to read the local copy of @file{storm.jpg} as a netCDF file, it fails and exits, leaving @file{storm.jpg} in the current directory. @cindex @acronym{DODS} @cindex server If your @acronym{NCO} is @acronym{DAP}-enabled (@pxref{OPeNDAP}), then you may use @acronym{NCO} to retrieve any files (including netCDF, @acronym{HDF}, etc.) served by an @acronym{OPeNDAP} server to your local machine. For example, @example ncks -R -l . -p \ http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.dailyavgs/surface \ pres.sfc.1969.nc @end example It may occasionally be useful to use @acronym{NCO} to transfer files when your other preferred methods are not available locally. @html @end html @node File Formats and Conversion, Large File Support, Retaining Retrieved Files, Shared features @section File Formats and Conversion @cindex @acronym{HDF} @cindex netCDF2 @cindex netCDF3 @cindex netCDF4 @cindex @code{NETCDF4_CLASSIC} files @cindex @code{NETCDF4} files @cindex @code{CLASSIC} files @cindex @code{64BIT} files @cindex @code{--3} @cindex @code{-3} @cindex @code{-4} @cindex @code{-5} @cindex @code{-6} @cindex @code{-7} @cindex @code{--4} @cindex @code{--5} @cindex @code{--6} @cindex @code{--7} @cindex @code{--netcdf4} @cindex @code{--fl_fmt} @cindex @code{--file_format} @cindex @code{--64bit} @cartouche Availability: @command{ncap2}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-3}, @samp{-4}, @samp{-6}, @samp{-7}@* Long options: @samp{--3}, @samp{--4}, @samp{--6}, @samp{--64bit}, @samp{--7}, @samp{--fl_fmt}, @samp{--netcdf4}@* @end cartouche All @acronym{NCO} operators support (read and write) all three (or four, depending on how one counts) file formats supported by netCDF4. The default output file format for all operators is the input file format. The operators listed under ``Availability'' above allow the user to specify the output file format independent of the input file format. These operators allow the user to convert between the various file formats. (The operators @command{ncatted} and @command{ncrename} do not support these switches so they always write the output netCDF file in the same format as the input netCDF file.) @menu * File Formats:: * Determining File Format:: * File Conversion:: * Autoconversion:: @end menu @node File Formats, Determining File Format, File Formats and Conversion, File Formats and Conversion @subsection File Formats netCDF supports four types of files: @code{CLASSIC}, @code{64BIT}, @code{NETCDF4}, and @code{NETCDF4_CLASSIC}, The @code{CLASSIC} format is the traditional 32-bit offset written by netCDF2 and netCDF3. As of 2005, nearly all netCDF datasets were in @code{CLASSIC} format. The @code{64BIT} format was added in Fall, 2004. As of 2010, many netCDF datasets were in @code{64BIT} format. As of 2013, an increasing number of netCDF datasets were in @code{NETCDF4_CLASSIC} format. The @code{NETCDF4} format uses @acronym{HDF5} as the file storage layer. The files are (usually) created, accessed, and manipulated using the traditional netCDF3 @acronym{API} (with numerous extensions). The @code{NETCDF4_CLASSIC} format refers to netCDF4 files created with the @code{NC_CLASSIC_MODEL} mask. Such files use @acronym{HDF5} as the back-end storage format (unlike netCDF3), though they incorporate only netCDF3 features. Hence @code{NETCDF4_CLASSIC} files are entirely readable by applications that use only the netCDF3 @acronym{API} (though the applications must be linked with the netCDF4 library). @acronym{NCO} must be built with @w{netCDF4} to write files in the new @code{NETCDF4} and @code{NETCDF4_CLASSIC} formats, and to read files in these formats. Datasets in the default @code{CLASSIC} or the newer @code{64BIT} formats have maximum backwards-compatibility with older applications. @acronym{NCO} has deep support for @code{NETCDF4} formats. If performance or disk-space as important as backwards compatibility, then use @code{NETCDF4_CLASSIC} instead of @code{CLASSIC} format files. As of 2014, @acronym{NCO} support for the @code{NETCDF4} format is nearly complete and the most powerful and disk/@acronym{RAM} efficient workflows will utilize this format. As mentioned above, all operators write use the input file format for output files unless told otherwise. Toggling the short option @samp{-6} or the long option @samp{--6} or @samp{--64bit} (or their @var{key}-@var{value} equivalent @samp{--fl_fmt=64bit}) produces the netCDF3 64-bit offset format named @code{64BIT}. @acronym{NCO} must be built with @w{netCDF 3.6} or higher to produce a @code{64BIT} file. Using the @samp{-4} switch (or its long option equivalents @samp{--4} or @samp{--netcdf4}), or setting its @var{key}-@var{value} equivalent @samp{--fl_fmt=netcdf4} produces a @code{NETCDF4} file (i.e., with all supported @acronym{HDF5} features). Using the @samp{-7} switch (or its long option equivalent @samp{--7} @footnote{ The reason (and mnemonic) for @samp{-7} is that @code{NETCDF4_CLASSIC} files include great features of both netCDF3 (compatibility) and netCDF4 (compression, chunking) and, well, @math{3+4=7}.}, or setting its @var{key}-@var{value} equivalent @samp{--fl_fmt=netcdf4_classic} produces a @code{NETCDF4_CLASSIC} file (i.e., with all supported @acronym{HDF5} features like compression and chunking but without groups or new atomic types). Operators given the @samp{-3} (or @samp{--3}) switch without arguments will (attempt to) produce netCDF3 @code{CLASSIC} output, even from netCDF4 input files. Note that @code{NETCDF4} and @code{NETCDF4_CLASSIC} are the same binary format. The latter simply causes a writing application to fail if it attempts to write a @code{NETCDF4} file that cannot be completely read by the netCDF3 library. Conversely, @code{NETCDF4_CLASSIC} indicates to a reading application that all of the file contents are readable with the netCDF3 library. @acronym{NCO} has supported reading/writing basic @code{NETCDF4} and @code{NETCDF4_CLASSIC} files since October, 2005. @html @end html @node Determining File Format, File Conversion, File Formats, File Formats and Conversion @subsection Determining File Format Input files often end with the generic @code{.nc} suffix that leaves (perhaps by intention) the internal file format ambiguous. There are at least three ways to discover the internal format of a netCDF-supported file. These methods determine whether it is a classic (32-bit offset) or newer 64-bit offset netCDF3 format, or is a netCDF4 format. Each method returns the information using slightly different terminology that becomes easier to understand with practice. First, examine the first line of global metadata output by @samp{ncks -M}: @cindex netCDF3 classic file format @cindex netCDF4 classic file format @cindex netCDF4 file format @cindex 32-bit offset file format @cindex 64-bit offset file format @cindex @command{ncks} @cindex @code{-M} @example % ncks -M foo_3c.nc Summary of foo_3c.nc: filetype = NC_FORMAT_CLASSIC, 0 groups ... % ncks -M foo_364.nc Summary of foo_364.nc: filetype = NC_FORMAT_64BIT, 0 groups ... % ncks -M foo_4c.nc Summary of foo_4c.nc: filetype = NC_FORMAT_NETCDF4_CLASSIC, 0 groups ... % ncks -M foo_4.nc Summary of foo_4.nc: filetype = NC_FORMAT_NETCDF4, 0 groups ... @end example This method requires a netCDF4-enabled @acronym{NCO} version 3.9.0+ (i.e., from 2007 or later). @cindex extended file format @cindex underlying file format @cindex @code{NC_FORMAT_NC3} @cindex @code{NC_FORMAT_NC_HDF5} @cindex @code{NC_FORMAT_NC_HDF4} @cindex @code{NC_FORMAT_PNETCDF} @cindex @code{NC_FORMAT_DAP2} @cindex @code{NC_FORMAT_DAP4} As of @acronym{NCO} version 4.4.0 (January, 2014), @command{ncks} will also print the extended or underlying format of the input file. The extended filetype will be one of the six underlying formats that are accessible through the netCDF @acronym{API}. These formats are @code{NC_FORMAT_NC3} (classic and 64-bit versions of netCDF3 formats), @code{NC_FORMAT_NC_HDF5} (classic and extended versions of netCDF4, and ``pure'' HDF5 format), @code{NC_FORMAT_NC_HDF4} (HDF4 format), @code{NC_FORMAT_PNETCDF} (PnetCDF format), @code{NC_FORMAT_DAP2} (accessed via DAP2 protocol), and @code{NC_FORMAT_DAP4} (accessed via DAP2 protocol). For example, @example % ncks -D 2 -M hdf.hdf Summary of hdf.hdf: filetype = NC_FORMAT_NETCDF4 (representation of \ extended/underlying filetype NC_FORMAT_HDF4), 0 groups ... % ncks -D 2 -M http://thredds-test.ucar.edu/thredds/dodsC/testdods/in.nc Summary of http://thredds-test.ucar.edu/thredds/dodsC/testdods/in.nc: \ filetype = NC_FORMAT_CLASSIC (representation of extended/underlying \ filetype NC_FORMAT_DAP2), 0 groups % ncks -D 2 -M foo_4.nc Summary of foo_4.nc: filetype = NC_FORMAT_NETCDF4 (representation of \ extended/underlying filetype NC_FORMAT_HDF5), 0 groups @end example The extended filetype determines some of the capabilities that netCDF has to alter the file. Second, query the file with @samp{ncdump -k}: @cindex @command{ncdump} @example % ncdump -k foo_3c.nc classic % ncdump -k foo_364.nc 64-bit-offset % ncdump -k foo_4c.nc netCDF-4 classic model % ncdump -k foo_4.nc netCDF-4 @end example This method requires a netCDF4-enabled @acronym{netCDF} 3.6.2+ (i.e., from 2007 or later). The third option uses the POSIX-standard @command{od} (octal dump) command: @cindex @command{od} @cindex octal dump @example % od -An -c -N4 foo_3c.nc C D F 001 % od -An -c -N4 foo_364.nc C D F 002 % od -An -c -N4 foo_4c.nc 211 H D F % od -An -c -N4 foo_4.nc 211 H D F @end example This option works without @acronym{NCO} and @command{ncdump}. Values of @samp{C D F 001} and @samp{C D F 002} indicate 32-bit (classic) and 64-bit netCDF3 formats, respectively, while values of @samp{211 H D F} indicate either of the newer netCDF4 file formats. @html @end html @node File Conversion, Autoconversion, Determining File Format, File Formats and Conversion @subsection File Conversion Let us demonstrate converting a file from any netCDF-supported input format into any netCDF output format (subject to limits of the output format). Here the input file @file{in.nc} may be in any of these formats: netCDF3 (classic and 64bit), netCDF4 (classic and extended), HDF4, HDF5, HDF-EOS (version 2 or 5), and DAP. The switch determines the output format written in the comment: @footnote{The switches @samp{-5}, @samp{--5}, and @samp{pnetcdf} are reserved for PnetCDF files, i.e., @code{NC_FORMAT_PNETCDF}. Such files are similar to netCDF3 classic files, yet also support 64-bit offsets and the additional netCDF4 atomic types.} @example ncks --fl_fmt=classic in.nc foo_3c.nc # netCDF3 classic ncks --fl_fmt=64bit in.nc foo_364.nc # netCDF3 64bit ncks --fl_fmt=netcdf4_classic in.nc foo_4c.nc # netCDF4 classic ncks --fl_fmt=netcdf4 in.nc foo_4.nc # netCDF4 ncks -3 in.nc foo_3c.nc # netCDF3 classic ncks --3 in.nc foo_3c.nc # netCDF3 classic ncks -6 in.nc foo_364.nc # netCDF3 64bit ncks --64 in.nc foo_364.nc # netCDF3 64bit ncks -4 in.nc foo_4.nc # netCDF4 ncks --4 in.nc foo_4.nc # netCDF4 ncks -7 in.nc foo_4c.nc # netCDF4 classic ncks --7 in.nc foo_4c.nc # netCDF4 classic @end example Of course since most operators support these switches, the ``conversions'' can be done at the output stage of arithmetic or metadata processing rather than requiring a separate step. Producing (netCDF3) @code{CLASSIC} or @code{64BIT} files from @code{NETCDF4_CLASSIC} files will always work. @html @end html @node Autoconversion, , File Conversion, File Formats and Conversion @subsection Autoconversion Because of the dearth of support for netCDF4 amongst tools and user communities (including the @acronym{CF} conventions), it is often useful to convert netCDF4 to netCDF3 for certain applications. Until @acronym{NCO} version 4.4.0 (January, 2014), producing netCDF3 files from netCDF4 files only worked if the input files contained no netCDF4-specific features (e.g., atomic types, multiple record dimensions, or groups). As of @acronym{NCO} version 4.4.0, @command{ncks} supports @dfn{autoconversion} of many netCDF4 features to their closest netCDF3-compatible representations. Since converting netCDF4 to netCDF3 results in loss of features, ``automatic down-conversion'' may be a more precise description of what we term autoconversion. @acronym{NCO} employs three algorithms to downconvert netCDF4 to netCDF3: @enumerate @item @cindex autoconversion Autoconversion of atomic types: Autoconversion automatically promotes @code{NC_UBYTE} to @code{NC_SHORT}, and @code{NC_USHORT} to @code{NC_INT}. It automatically demotes the three types @code{NC_UINT}, @code{NC_UINT64}, and @code{NC_INT64} to @code{NC_INT}. And it converts @code{NC_STRING} to @code{NC_CHAR}. All numeric conversions work for attributes and variables of any rank. Two numeric types (@code{NC_UBYTE} and @code{NC_USHORT}) are @emph{promoted} to types with greater range (and greater storage). This extra range is often not used so promotion perhaps conveys the wrong impression. However, promotion never truncates values or loses data (this perhaps justifies the extra storage). Three numeric types (@code{NC_UINT}, @code{NC_UINT64} and @code{NC_INT64}) are @emph{demoted}. Since the input range is larger than the output range, demotion can result in numeric truncation and thus loss of data. In such cases, it would possible to convert the data to floating point values instead. If this feature interests you, please be the squeaky wheel and let us know. String conversions (to @code{NC_CHAR}) work for all attributes, but not for variables. This is because attributes are at most one-dimensional and may be of any size whereas variables require gridded dimensions that usually do not fit the ragged sizes of text strings. Hence scalar @code{NC_STRING} attributes are correctly converted to and stored as @code{NC_CHAR} attributes in the netCDF3 output file, but @code{NC_STRING} variables are not correctly converted. If this limitation annoys or enrages you, please let us know by being the squeaky wheel. @item @cindex @code{--fix_rec_dmn all} Convert multiple record dimensions to fixed-size dimensions. Many netCDF4 and @acronym{HDF5} datasets have multiple unlimited dimensions. Since a netCDF3 file may have at most one unlimited dimension, all but possibly one unlimited dimension from the input file must be converted to fixed-length dimensions prior to storing netCDF4 input as netCDF3 output. By invoking @code{--fix_rec_dmn all} the user ensures the output file will adhere to netCDF3 conventions and the user need not know the names of the specific record dimensions to fix. See @ref{ncks netCDF Kitchen Sink} for a description of the @samp{--fix_rec_dmn} option. @item @cindex flattening Flattening (removal) of groups. Many netCDF4 and @acronym{HDF5} datasets have group hierarchies. Since a netCDF3 file may not have any groups, groups in the input file must be removed. This is also called ``flattening'' the hierarchical file. See @ref{Group Path Editing} for a description of the @acronym{GPE} option @samp{-G :} to flatten files. @end enumerate Putting the three algorithms together, one sees that the recipe to convert netCDF4 to netCDF4 becomes increasingly complex as the netCDF4 features in the input file become more elaborate: @example # Convert file with netCDF4 atomic types ncks -3 in.nc4 out.nc3 # Convert file with multiple record dimensions + netCDF4 atomic types ncks -3 --fix_rec_dmn=all in.nc4 out.nc3 # Convert file with groups, multiple record dimensions + netCDF4 atomic types ncks -3 -G : --fix_rec_dmn=all in.nc4 out.nc3 @end example Future versions of @acronym{NCO} may automatically invoke the record dimension fixation and group flattening when converting to netCDF3 (rather than requiring it be specified manually). If this feature would interest you, please let us know. @html @end html @node Large File Support, Subsetting Files, File Formats and Conversion, Shared features @section Large File Support @cindex @acronym{LFS} @cindex Large File Support @cartouche Availability: All operators@* Short options: none@* Long options: none@* @end cartouche @acronym{NCO} has Large File Support (@acronym{LFS}), meaning that @acronym{NCO} can write files larger than @w{2 GB} on some 32-bit operating systems with netCDF libraries earlier than @w{version 3.6}. If desired, @acronym{LFS} support must be configured when both netCDF and @acronym{NCO} are installed. netCDF @w{versions 3.6} and higher support 64-bit file addresses as part of the netCDF standard. We recommend that users ignore @acronym{LFS} support which is difficult to configure and is implemented in @acronym{NCO} only to support netCDF versions prior @w{to 3.6}. This obviates the need for configuring explicit @acronym{LFS} support in applications (such as @acronym{NCO}) that now support 64-bit files directly through the netCDF interface. See @ref{File Formats and Conversion} for instructions on accessing the different file formats, including 64-bit files, supported by the modern netCDF interface. If you are still interested in explicit @acronym{LFS} support for netCDF versions prior @w{to 3.6}, know that @acronym{LFS} support depends on a complex, interlocking set of operating system @footnote{ Linux and @acronym{AIX} do support @acronym{LFS}.} and netCDF support issues. The netCDF @acronym{LFS} @uref{http://my.unidata.ucar.edu/content/software/netcdf/faq-lfs.html,FAQ} describes the various file size limitations imposed by different versions of the netCDF standard. @acronym{NCO} and netCDF automatically attempt to configure @acronym{LFS} at build time. @html @end html @node Subsetting Files, Subsetting Coordinate Variables, Large File Support, Shared features @section Subsetting Files @cindex subsetting @cindex union @cindex intersection @cindex exclusion @cindex extraction @cindex @code{-v @var{var}} @cindex @code{--variable @var{var}} @cindex @code{-g @var{grp}} @cindex @code{--grp @var{grp}} @cindex @code{--group @var{grp}} @cindex @code{-x} @cindex @code{--exclude} @cindex @code{--xcl} @cindex @code{--unn} @cindex @code{--union} @cindex @code{--gxvx} @cindex @code{--grp_xtr_var_xcl} @cartouche Options @code{-g @var{grp}}@* Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-g}@* Long options: @samp{--grp} and @samp{--group}@* Options @code{-v @var{var}} and @code{-x}@* Availability: (@command{ncap2}), @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-v}, @samp{-x}@* Long options: @samp{--variable}, @samp{--exclude} or @samp{--xcl}@* Options @code{--unn}@* Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @* Long options: @samp{--unn} and @samp{--union}@* Options @code{--grp_xtr_var_xcl}@* Availability: @command{ncks}@* Short options: @* Long options: @samp{--gxvx} and @samp{--grp_xtr_var_xcl}@* @end cartouche Subsetting variables refers to explicitly specifying variables and groups to be included or excluded from operator actions. Subsetting is controlled by the @samp{-v @var{var}[,@dots{}]} and @samp{-x} options for directly specifying variables. Specifying groups, whether in addition to or instead of variables, is quite similar and is controlled by the @samp{-g @var{grp}[,@dots{}]} and @samp{-x} options. @w{A list} of variables or groups to extract is specified following the @samp{-v} and @samp{-g} options, e.g., @samp{-v time,lat,lon} or @samp{-g grp1,grp2}. Both options may be specified simultaneously and @acronym{NCO} will extract the intersection of the lists, i.e., only variables of the specified names found in groups of the specified names. The @samp{--unn} option causes @acronym{NCO} to extract the union, rather than the intersection, of the specified groups and variables. Not using the @samp{-v} or @samp{-g} option is equivalent to specifying all variables or groupp, respectively. The @samp{-x} option causes the list of variables specified with @samp{-v} to be @emph{excluded} rather than @emph{extracted}. Thus @samp{-x} saves typing when you only want to extract fewer than half of the variables in a file. Variables or groups explicitly specified for extraction with @samp{-v @var{var}[,@dots{}]} or @samp{-g @var{grp}[,@dots{}]} @emph{must} be present in the input file or an error will result. Variables explicitly specified for @emph{exclusion} with @samp{-x -v @var{var}[,@dots{}]} need not be present in the input file. To accord with the sophistication of the underlying hierarchy, group subsetting is controlled by a few powerful yet subtle syntactical distinctions. When learning this syntax it is helpful to keep in mind the similarity between group hierarchies and directory structures. @html @end html As of @acronym{NCO} 4.4.4 (June, 2014), @command{ncks} (alone) supports an option to include specified groups yet exclude specified variables. The @samp{--grp_xtr_var_xcl} switch (with long option equivalent @samp{--gxvx}) extracts all contents of groups given as arguments to @samp{-g @var{grp}[,@dots{}]}, except for variables given as arguments to @samp{-v @var{var}[,@dots{}]}. Use this when one or a few variables in hierarchical files are not to be extracted, and all other variables are. This is useful when coercing netCDF4 files into netCDF3 files such as with converting, flattening, or dismembering files (see @ref{Flattening Groups}). @example ncks --grp_xtr_var_xcl -g g1 -v v1 # Extract all of group g1 except v1 @end example @cindex @command{mv} @cindex @command{cp} @cindex recursion @cindex recursive @cindex anchor @cindex anchoring @html @end html Two properties of subsetting, recursion and anchoring, are best illustrated by reminding the user of their @acronym{UNIX} equivalents. The @acronym{UNIX} command @command{mv src dst} moves @file{src} @emph{and all its subdirectories} (and all their subdirectories etc.) to @file{dst}. In other words @command{mv} is, by default, @emph{recursive}. In contrast, the @acronym{UNIX} command @command{cp src dst} moves @file{src}, and only @file{src}, to @file{dst}, If @file{src} is a directory, not a file, then that command fails. One must explicitly request to copy directories recursively, i.e., with @command{cp -r src dst}. In @acronym{NCO} recursive extraction (and copying) of groups is the default (like with @command{mv}, not with @command{cp}). Recursion is turned off by appending a trailing slash to the path. These @acronym{UNIX} commands also illustrate a property we call @emph{anchoring}. The command @command{mv src dst} moves (recursively) the source directory @file{src} to the destination directory @file{dst}. If @file{src} begins with the slash character then the specified path is relative to the root directory, otherwise the path is relative to the current working directory. In other words, an initial slash character anchors the subsequent path to the root directory. In @acronym{NCO} an initial slash anchors the path at the root group. Paths that begin and end with slash characters (e.g., @file{//}, @file{/g1/}, and @file{/g1/g2/}) are both anchored and non-recursive. Consider the following commands, all of which may be assumed to end with @samp{in.nc out.nc}: @example ncks -g g1 # Extract, recursively, all groups with a g1 component ncks -g g1/ # Extract, non-recursively, all groups terminating in g1 ncks -g /g1 # Extract, recursively, root group g1 ncks -g /g1/ # Extract, non-recursively root group g1 ncks -g // # Extract, non-recursively the root group @end example The first command is probably the most useful and common. It would extract these groups, if present, and all their direct ancestors and children: @file{/g1}, @file{/g2/g1}, and @file{/g3/g1/g2}. In other words, the simplest form of @samp{-g grp} grabs all groups that (and their direct ancestors and children, recursively) that have @file{grp} as a complete component of their path. A simple string match is insufficient, @var{grp} must be a complete component (i.e., group name) in the path. The option @samp{-g g1} would not extract these groups because @file{g1} is not a complete component of the path: @file{/g12}, @file{/fg1}, and @file{/g1g1}. The second command above shows how a terminating slash character @kbd{/} cancels the recursive copying of groups. An argument to @samp{-g} which terminates with a slash character extracts the group and its direct ancestors, but none of its children. The third command above shows how an initial slash character @kbd{/} anchors the argument to the root group. The third command would not extract the group @file{/g2/g1} because the @file{g1} group is not at the root level, but it would extract, any group @file{/g1} at the root level and all its children, recursively. The fourth command is the non-recursive version of the third command. The fifth command is a special case of the fourth command. @html @end html @cindex union @cindex intersection @cindex @code{--unn} @cindex @code{--union} @cindex @code{--nsx} @cindex @code{--intersection} As mentioned above, both @samp{-v} and @samp{-g} options may be specified simultaneously and @acronym{NCO} will, by default, extract the intersection of the lists, i.e., the specified variables found in the specified groups @footnote{ Intersection-mode can also be explicitly invoked with the @samp{--nsx} or @samp{--intersection} switches. These switches are supplied for clarity and consistency and do absolutely nothing since intersection-mode is the default.}. The @samp{--unn} option causes @acronym{NCO} to extract the union, rather than the intersection, of the specified groups and variables. Consider the following commands (which may be assumed to end with @samp{in.nc out.nc}): @example # Intersection-mode subsetting (default) ncks -g g1 -v v1 # Yes: /g1/v1, /g2/g1/v1. No: /v1, /g2/v1 ncks -g /g1 -v v1 # Yes: /g1/v1, /g1/g2/v1. No: /v1, /g2/v1, /g2/g1/v1 ncks -g g1/ -v v1 # Yes: /g1/v1, /g2/g1/v1. No: /v1, /g2/v1, /g1/g2/v1 ncks -v g1/v1 # Yes: /g1/v1, /g2/g1/v1. No: /v1, /g2/v1, /g1/g2/v1 ncks -g /g1/ -v v1 # Yes: /g1/v1. No: /g2/g1/v1, /v1, /g2/v1 ... ncks -v /g1/v1 # Yes: /g1/v1. No: /g2/g1/v1, /v1, /g2/v1 ... # Union-mode subsetting (invoke with --unn or --union) ncks -g g1 -v v1 --unn # All variables in g1 or progeny, or named v1 ncks -g /g1 -v v1 --unn # All variables in /g1 or progeny, or named v1 ncks -g g1/ -v v1 --unn # All variables in g1 or named v1 ncks -g /g1/ -v v1 --unn # All variables in /g1 or named v1 @end example The first command (@samp{-g g1 -v v1}) extracts the variable @file{v1} from any group named @file{g1} or descendent @file{g1}. The second command extracts @file{v1} from any root group named @file{g1} and any descendent groups as well. The third and fourth commands are equivalent ways of extracting @file{v1} only from the root group named @file{g1} (not its descendents). The fifth and sixth commands are equivalent ways of extracting the variable @file{v1} only from the root group named @file{g1}. Subsetting in union-mode (with @samp{--unn}) causes all variables to be extracted which meet either one or both of the specifications of the variable and group specifications. Union-mode subsetting is simply the logical ``OR'' of intersection-mode subsetting. As discussed below, the group and variable specifications may be comma separated lists of regular expressions for added control over subsetting. @cindex memory requirements Remember, if averaging or concatenating large files stresses your systems memory or disk resources, then the easiest solution is often to subset (with @samp{-g} and/or @samp{-v}) to retain only the most important variables (@pxref{Memory Requirements}). @example ncks in.nc out.nc # Extract all groups and variables ncks -v scl # Extract variable scl from all groups ncks -g g1 # Extract group g1 and descendents ncks -x -g g1 # Extract all groups except g1 and descendents ncks -g g2,g3 -v scl # Extract scl from groups g2 and g3 @end example Overwriting and appending work as expected: @example # Replace scl in group g2 in out.nc with scl from group g2 from in.nc ncks -A -g g2 -v scl in.nc out.nc @end example Due to its special capabilities, @command{ncap2} interprets the @samp{-v} switch differently (@pxref{ncap2 netCDF Arithmetic Processor}). For @command{ncap2}, the @samp{-v} switch takes no arguments and indicates that @emph{only} user-defined variables should be output. @command{ncap2} neither accepts nor understands the @var{-x} and @var{-g} switches. @html @end html @cindex extended regular expressions @cindex regular expressions @cindex pattern matching @cindex wildcards @cindex @command{grep -E} @cindex @command{egrep} @cindex @command{ncatted} @cindex @acronym{GNU} Regular expressions the syntax that @acronym{NCO} use pattern-match object names in netCDF file against user requests. The user can select all variables beginning with the string @samp{DST} from an input file by supplying the regular expression @samp{^DST} to the @samp{-v} switch, i.e., @samp{-v '^DST'}. The meta-characters used to express pattern matching operations are @samp{^$+?.*[]@{@}|}. If the regular expression pattern matches @emph{any} part of a variable name then that variable is selected. This capability is also called @dfn{wildcarding}, and is very useful for sub-setting large data files. Extended regular expressions are defined by the @acronym{POSIX} @command{grep -E} (aka @command{egrep}) command. As of @acronym{NCO} 2.8.1 (August, 2003), variable name arguments to the @samp{-v} switch may contain @dfn{extended regular expressions}. As of @acronym{NCO} 3.9.6 (January, 2009), variable names arguments to @command{ncatted} may contain @dfn{extended regular expressions}. As of @acronym{NCO} 4.2.4 (November, 2012), group name arguments to the @samp{-g} switch may contain @dfn{extended regular expressions}. @cindex @acronym{POSIX} @cindex @code{regex} Because of its wide availability, @acronym{NCO} uses the @acronym{POSIX} regular expression library @code{regex}. Regular expressions of arbitary complexity may be used. Since netCDF variable names are relatively simple constructs, only a few varieties of variable wildcards are likely to be useful. For convenience, we define the most useful pattern matching operators here: @cindex @code{.} (wildcard character) @cindex @code{$} (wildcard character) @cindex @code{^} (wildcard character) @cindex @code{?} (filename expansion) @cindex @code{*} (filename expansion) @table @samp @item ^ Matches the beginning of a string @item $ Matches the end of a string @item . Matches any single character @end table @noindent The most useful repetition and combination operators are @cindex @code{?} (wildcard character) @cindex @code{*} (wildcard character) @cindex @code{+} (wildcard character) @cindex @code{|} (wildcard character) @table @samp @item ? The preceding regular expression is optional and matched at most once @item * The preceding regular expression will be matched zero or more times @item + The preceding regular expression will be matched one or more times @item | The preceding regular expression will be joined to the following regular expression. The resulting regular expression matches any string matching either subexpression. @end table @noindent To illustrate the use of these operators in extracting variables and groups, consider file @file{in_grp.nc} with groups @code{g0}--@code{g9}, and subgroups @code{s0}--@code{s9}, in each of those groups, and file @file{in.nc} with variables @code{Q}, @code{Q01}--@code{Q99}, @code{Q100}, @code{QAA}--@code{QZZ}, @code{Q_H2O}, @code{X_H2O}, @code{Q_CO2}, @code{X_CO2}. @example @verbatim ncks -v '.+' in.nc # All variables (default) ncks -v 'Q.?' in.nc # Variables that contain Q ncks -v '^Q.?' in.nc # Variables that start with Q ncks -v '^Q+.?.' in.nc # Q, Q0--Q9, Q01--Q99, QAA--QZZ, etc. ncks -v '^Q..' in.nc # Q01--Q99, QAA--QZZ, etc. ncks -v '^Q[0-9][0-9]' in.nc # Q01--Q99, Q100 ncks -v '^Q[[:digit:]]{2}' in.nc # Q01--Q99 ncks -v 'H2O$' in.nc # Q_H2O, X_H2O ncks -v 'H2O$|CO2$' in.nc # Q_H2O, X_H2O, Q_CO2, X_CO2 ncks -v '^Q[0-9][0-9]$' in.nc # Q01--Q99 ncks -v '^Q[0-6][0-9]|7[0-3]' in.nc # Q01--Q73, Q100 ncks -v '(Q[0-6][0-9]|7[0-3])$' in.nc # Q01--Q73 ncks -v '^[a-z]_[a-z]{3}$' in.nc # Q_H2O, X_H2O, Q_CO2, X_CO2 ncks -g 'g.' in_grp.nc # 10 Groups g0-g9 ncks -g 's.' in_grp.nc # 100 sub-groups g0/s0, g0/s1, ... g9/s9 ncks -g 'g.' -v 'v.' in_grp.nc # All variables 'v.' in groups 'g.' @end verbatim @end example Beware---two of the most frequently used repetition pattern matching operators, @samp{*} and @samp{?}, are also valid pattern matching operators for filename expansion (globbing) at the shell-level. Confusingly, their meanings in extended regular expressions and in shell-level filename expansion are significantly different. In an extended regular expression, @samp{*} matches zero or more occurences of the preceding regular expression. Thus @samp{Q*} selects all variables, and @samp{Q+.*} selects all variables containing @samp{Q} (the @samp{+} ensures the preceding item matches at least once). To match zero or one occurence of the preceding regular expression, use @samp{?}. Documentation for the @acronym{UNIX} @command{egrep} command details the extended regular expressions which @acronym{NCO} supports. @html @end html @cindex globbing @cindex shell @cindex @command{bash} @cindex @command{csh} @cindex quotes One must be careful to protect any special characters in the regular expression specification from being interpreted (globbed) by the shell. This is accomplish by enclosing special characters within single or double quotes @example ncra -v Q?? in.nc out.nc # Error: Shell attempts to glob wildcards ncra -v '^Q+..' in.nc out.nc # Correct: NCO interprets wildcards ncra -v '^Q+..' in*.nc out.nc # Correct: NCO interprets, Shell globs @end example The final example shows that commands may use a combination of variable wildcarding and shell filename expansion (globbing). For globbing, @samp{*} and @samp{?} @emph{have nothing to do} with the preceding regular expression! In shell-level filename expansion, @samp{*} matches any string, including the null string and @samp{?} matches any single character. Documentation for @command{bash} and @command{csh} describe the rules of filename expansion (globbing). @html @end html @node Subsetting Coordinate Variables, Group Path Editing, Subsetting Files, Shared features @section Subsetting Coordinate Variables @cindex subsetting @cindex @code{-C} @cindex @code{-c} @cindex @code{--no-coords} @cindex @code{--no-crd} @cindex @code{--coords} @cindex @code{--crd} @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-C}, @samp{-c}@* Long options: @samp{--no-coords}, @samp{--no-crd}, @samp{--crd}, @samp{--coords}@* @end cartouche By default, coordinates variables associated with any variable appearing in the @var{input-file} will be placed in the @var{output-file}, even if they are not explicitly specified, e.g., with the @samp{-v} switch. Thus variables with a latitude coordinate @code{lat} always carry the values of @code{lat} with them into the @var{output-file}. This feature can be disabled with @samp{-C}, which causes @acronym{NCO} to not automatically add coordinates to the variables appearing in the @var{output-file}. However, using @samp{-C} does not preclude the user from including some coordinates in the output files simply by explicitly selecting the coordinates with the @var{-v} option. The @samp{-c} option, on the other hand, is a shorthand way of automatically specifying that @emph{all} coordinate variables in the @var{input-files} should appear in the @var{output-file}. Thus @samp{-c} allows the user to select all the coordinate variables without having to know their names. @cindex @acronym{CF} conventions As of @acronym{NCO} version 4.4.5 (July, 2014) both @samp{-c} and @samp{-C} honor the @acronym{CF} @code{ancillary_variables} convention described in @ref{CF Conventions}. As of @acronym{NCO} version 4.0.8 (April, 2011) both @samp{-c} and @samp{-C} honor the @acronym{CF} @code{bounds} convention described in @ref{CF Conventions}. As of @acronym{NCO} version 4.4.9 (May, 2015) both @samp{-c} and @samp{-C} honor the @acronym{CF} @code{climatology} convention described in @ref{CF Conventions}. As of @acronym{NCO} version 3.9.6 (January, 2009) both @samp{-c} and @samp{-C} honor the @acronym{CF} @code{coordinates} convention described in @ref{CF Conventions}. @html @end html @node Group Path Editing, C and Fortran Index Conventions, Subsetting Coordinate Variables, Shared features @section Group Path Editing @cindex @code{-G @var{gpe_dsc}} @cindex @code{--gpe @var{gpe_dsc}} @cartouche Options @code{-G @var{gpe_dsc}}@* Availability: @command{ncbo}, @command{ncecat}, @command{nces}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-G}@* Long options: @samp{--gpe}@* @end cartouche @dfn{Group Path Editing}, or @acronym{GPE}, allows the user to restructure (i.e., add, remove, and rename groups) in the output file relative to the input file based on the instructions they provide. As of @acronym{NCO} 4.2.3 (November, 2012), all operators that accept netCDF4 files with groups accept the @samp{-G} switch, or its long-option equivalent @samp{--gpe}. To master @acronym{GPE} one must understand the meaning of the required @var{gpe_dsc} structure/argument that specifies the transformation of input-to-output group paths. Each @var{gpe_dsc} contains up to three elements (two are optional) in the following order:@* @var{gpe_dsc} = @var{grp_pth}:@var{lvl_nbr} or @var{grp_pth}@@@var{lvl_nbr} @table @var @item grp_pth Group Path. @cindex group path This (optional) component specifies the output group path that should be appended after any editing (i.e., deletion or truncation) of the input path is performed. @item lvl_nbr The number of levels to delete (from the head) or truncate (from the tail) of the input path. @end table @noindent If both components of the argument are present, then a single character, either the colon or at-sign (@code{:} or @code{@@}), must separate them. If only @var{grp_pth} is specifed, the separator character may be omitted, e.g., @samp{-G g1}. If only @var{lvl_nbr} is specifed, the separator character is still required to indicate it is a @var{lvl_nbr} arugment and not a @var{grp_pth}, e.g., @samp{-G :-1} or @samp{-G @@1}. If the at-sign separator character @code{@@} is used instead of the colon separator character @code{:}, then the following @var{lvl_nbr} arugment must be positive and it will be assumed to refer to Truncation-Mode. Hence, @samp{-G :-1} is the same as @samp{-G @@1}. This is simply a way of making the @var{lvl_nbr} argument positive-definite. @menu * Flattening Groups:: * Moving Groups:: * Dismembering Files:: * Checking CF-compliance:: @end menu @node Flattening Groups, Moving Groups, Group Path Editing, Group Path Editing @subsection Deletion, Truncation, and Flattening of Groups @html @end html @cindex @code{@@} (separator character) @cindex @code{:} (separator character) @cindex delete (groups) @cindex truncate (groups) @cindex flatten (groups) @acronym{GPE} has three editing modes: Delete, Truncate, and Flatten. Select one of @acronym{GPE}'s three editing modes by supplying a @var{lvl_nbr} that is positive, negative, or zero for Delete-, Truncate- and Flatten-mode, respectively. In Delete-mode, @var{lvl_nbr} is a positive integer which specifies the maximum number of group path components (i.e., groups) that @acronym{GPE} will try to delete from the head of @var{grp_pth}. For example @math{@var{lvl_nbr} = 3} changes the input path @file{/g1/g2/g3/g4/g5} to the output path @file{/g4/g5}. Input paths with @var{lvl_nbr} or fewer components (groups) are completely erased and the output path commences from the root level. In other words, @acronym{GPE} is tolerant of specifying too many group components to delete. It deletes as many as possible, without complaint, and then begins to flatten the file (which fails if namespace conflicts arise). In Truncate-mode, @var{lvl_nbr} is a negative integer which specifies the maximum number of group path components (i.e., groups) that @acronym{GPE} will try to truncate from the tail of @var{grp_pth}. For example @math{@var{lvl_nbr} = -3} changes the input path @file{/g1/g2/g3/g4/g5} to the output path @file{/g1/g2}. Input paths with @var{lvl_nbr} or fewer components (groups) are completely erased and the output path commences from the root level. In Flatten-mode, indicated by the separator character alone or with @math{@var{lvl_nbr} = 0}, @acronym{GPE} removes the entire group path from the input file and constructs the output path beginning at the root level. For example @code{-G :0} and @code{-G :} are identical and change the input path @file{/g1/g2/g3/g4/g5} to the output path @file{/} whereas @code{-G g1:0} and @code{-G g1:} are identical and result in the output path @file{/g1} for all variables. Subsequent to the alteration of the input path by the specified editing mode, if any, @acronym{GPE} prepends (in Delete Mode) or Appends (in Truncate-mode) any specifed @var{grp_pth} to the output path. For example @code{-G g2} changes the input paths @file{/} and @file{/g1} to @file{/g2} and @file{/g1/g2}, respectively. Likewise, @code{-G g2/g3} changes the input paths @file{/} and @file{/g1} to @file{/g2/g3} and @file{/g1/g2/g3}, respectively. When @var{grp_pth} and @var{lvl_nbr} are both specified, the editing actions are taken in sequence so that, e.g., @code{-G g1/g2:2} changes the input paths @file{/} and @file{/h1/h2/h3/h4} to @file{/g1/g2} and @file{/g1/g2/h3/h4}, respectively. Likewise, @code{-G g1/g2:-2} changes the input paths @file{/} and @file{/h1/h2/h3/h4} to @file{/g1/g2} and @file{/h1/h2/g1/g2}, respectively. Combining @acronym{GPE} with subsetting (@pxref{Subsetting Files}) yields powerful control over the extracted (or excluded) variables and groups and their placement in the output file as shown by the following commands. All commands below may be assumed to end with @samp{in.nc out.nc}. @example @verbatim # Prepending paths without editing: ncks # /g?/v? -> /g?/v? ncks -v v1 # /g?/v1 -> /g?/v1 ncks -g g1 # /g1/v? -> /g1/v? ncks -G o1 # /g?/v? -> /o1/g?/v? ncks -G o1 -g g1 # /g1/v? -> /o1/g1/v? ncks -g g1 -v v1 # /g1/v1 -> /g1/v1 ncks -G o1 -v v1 # /g?/v1 -> /o1/g?/v1 ncks -G o1 -g g1 -v v1 # /g1/v1 -> /o1/g1/v1 ncks -G g1 -g / -v v1 # /v1 -> /g1/v1 ncks -G g1/g2 -v v1 # /g?/v1 -> /g1/g2/g?/v1 # Delete-mode: Delete from and Prepend to path head # Syntax: -G [ppn]:lvl_nbr = # of levels to delete ncks -G :1 -g g1 -v v1 # /g1/v1 -> /v1 ncks -G :1 -g g1/g1 -v v1 # /g1/g1/v1 -> /g1/v1 ncks -G :2 -g g1/g1 -v v1 # /g1/g1/v1 -> /v1 ncks -G :2 -g g1 -v v1 # /g1/v1 -> /v1 ncks -G g2:1 -g g1 -v v1 # /g1/v1 -> /g2/v1 ncks -G g2:2 -g g1/g1 -v v1 # /g1/g1/v1 -> /g2/v1 ncks -G g2:1 -g / -v v1 # /v1 -> /g2/v1 ncks -G g2:1 -v v1 # /v1 -> /g2/v1 ncks -G g2:1 -g g1/g1 -v v1 # /g1/g1/v1 -> /g2/g1/v1 # Flatten-mode: Remove all input path components # Syntax: -G [apn]: colon without numerical argument ncks -G : -v v1 # /g?/v1 -> /v1 ncks -G : -g g1 -v v1 # /g1/v1 -> /v1 ncks -G : -g g1/g1 -v v1 # /g1/g1/v1 -> /v1 ncks -G g2: -v v1 # /g?/v1 -> /g2/v1 ncks -G g2: # /g?/v? -> /g2/v? ncks -G g2: -g g1/g1 -v v1 # /g1/g1/v1 -> /g2/v1 # Truncate-mode: Truncate from and Append to path tail # Syntax: -G [apn]:-lvl_nbr = # of levels to truncate # NB: -G [apn]:-lvl_nbr is equivalent to -G [apn]@lvl_nbr ncks -G :-1 -g g1 -v v1 # /g1/v1 -> /v1 ncks -G :-1 -g g1/g2 -v v1 # /g1/g2/v1 -> /g1/v1 ncks -G :-2 -g g1/g2 -v v1 # /g1/g2/v1 -> /v1 ncks -G :-2 -g g1 -v v1 # /g1/v1 -> /v1 ncks -G g2:-1 -v v1 # /g?/v1 -> /g2/v1 ncks -G g2:-1 -g g1 -v v1 # /g1/v1 -> /g2/v1 ncks -G g1:-1 -g g1/g2 -v v1 # /g1/g2/v1 -> /g1/g1/v1 @end verbatim @end example @html @end html @node Moving Groups, Dismembering Files, Flattening Groups, Group Path Editing @subsection Moving Groups @cindex move groups @cindex groups, moving @cindex rename groups @cindex groups, renaming Until fall 2013 (netCDF version 4.3.1-pre1), netCDF contained no library function for renaming groups, and therefore @command{ncrename} cannot rename groups. However, @acronym{NCO} built on earlier versions of netCDF than 4.3.1 can use a @acronym{GPE}-based workaround mechanism to ``rename'' groups. The @acronym{GPE} mechanism actually @emph{moves} (i.e., copies to a new location) groups, a more arduous procedure than simply renaming them. @acronym{GPE} applies to all selected groups, so, in the general case, one must move only the desired group to a new file, and then merge that new file with the original to obtain a file where the desired group has been ``renamed'' and all else is unchanged. Here is how to ``rename'' group @file{/g4} to group @file{/f4} with @acronym{GPE} instead of @command{ncrename} @example ncks -O -G f4:1 -g g4 ~/nco/data/in_grp.nc ~/tmp.nc # Move /g4 to /f4 ncks -O -x -g g4 ~/nco/data/in_grp.nc ~/out.nc # Excise /g4 ncks -A ~/tmp.nc ~/out.nc # Add /f4 to new file @end example If the original group @file{g4} is not excised from @file{out.nc} (step two above), then the final output file would contain both @file{g4} and a copy named @file{f4}. Thus GPE can be used to both ``rename'' and copy groups. The recommended way to rename groups when when netCDF version 4.3.1 is availale is to use @command{ncrename} (@pxref{ncrename netCDF Renamer}). @html @end html One may wish to flatten hierarchical group files for many reasons. These include @w{1. Obtaining} flat netCDF3 files for use with tools that do not work with netCDF4 files, @w{2. Splitting} apart hierarchies to re-assemble into different hierarchies, and @w{3. Providing} a subset of a hierarchical file with the simplest possible storage structure. @example ncks -O -G : -g cesm -3 ~/nco/data/cmip5.nc ~/cesm.nc # Extract /cesm to / @end example The @option{-3} switch @footnote{Note that the @option{-3} switch should appear @emph{after} the @option{-G} and @option{-g} switches. This is due to an artifact of the @acronym{GPE} implementation which we wish to remove in the future.} specifies the output dataset should be in netCDF3 format, the @option{-G :} option flattens all extracted groups, and the @option{-g cesm} option extracts only the @code{cesm} group and leaves all other groups (e.g., @code{ecmwf}, @code{giss}). @html @end html @node Dismembering Files, Checking CF-compliance, Moving Groups, Group Path Editing @subsection Dismembering Files @cindex disaggregate @cindex dismember @findex ncdismember Let us show how to completely disaggregate (or, more memorably) @emph{dismember} a hierarchical dataset. For now we take this to mean: store each group as a standalone flat dataset in netCDF3 format. This can be accomplished by looping the previous example over all groups. This script @file{ncdismember} dismembers the input file @var{fl_in} specified in the first argument and places the resulting files in the directory @var{drc_out} specified by the second argument: @example @verbatim cat > ~/ncdismember << 'EOF' #!/bin/sh # Purpose: Dismember netCDF4/HDF5 hierarchical files. CF-check them. # Place each input file group in separate netCDF3 output file # Described in NCO User Guide at http://nco.sf.net/nco.html#dismember # Requirements: NCO 4.3.x+, UNIX shell utilities awk, grep, sed # Optional: Decker CFchecker https://bitbucket.org/mde_/cfchecker # Usage: # ncdismember [cf_chk] [cf_vrs] [opt] # where fl_in is input file/URL to dismember, drc_out is output directory # CF-compliance check is performed when optional third argument is not '0' # Default checker is Decker's cfchecker installed locally # Specify cf_chk=nerc for smallified uploads to NERC checker # Optional fourth argument cf_vrs is CF version to check # Optional fifth argument opt passes straight-through to ncks # Arguments must not use shell expansion/globbing # NB: ncdismember does not clean-up output directory, so user must # chmod a+x ~/sh/ncdismember # Examples: # ncdismember ~/nco/data/mdl_1.nc /data/zender/tmp # ncdismember http://dust.ess.uci.edu/nco/mdl_1.nc /tmp # ncdismember http://thredds-test.ucar.edu/thredds/dodsC/testdods/foo.nc /tmp # ncdismember ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf # ncdismember ~/nco/data/mdl_1.nc /data/zender/nco/tmp nerc # ncdismember ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf 1.3 # ncdismember ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf 1.5 --fix_rec_dmn=all # Command-line argument defaults fl_in="${HOME}/nco/data/mdl_1.nc" # [sng] Input file to dismember/check drc_out="${DATA}/nco/tmp" # [sng] Output directory cf_chk='0' # [flg] Perform CF-compliance check? Which checker? cf_vrs='1.5' # [sng] Compliance-check this CF version (e.g., '1.5') opt='' # [flg] Additional ncks options (e.g., '--fix_rec_dmn=all') # Use single quotes to pass multiple arguments to opt=${5} # Otherwise arguments would be seen as ${5}, ${6}, ${7} ... # Command-line argument option parsing if [ -n "${1}" ]; then fl_in=${1}; fi if [ -n "${2}" ]; then drc_out=${2}; fi if [ -n "${3}" ]; then cf_chk=${3}; fi if [ -n "${4}" ]; then cf_vrs=${4}; fi if [ -n "${5}" ]; then opt=${5}; fi # Prepare output directory echo "NCO dismembering file ${fl_in}" fl_stb=$(basename ${fl_in}) drc_out=${drc_out}/${fl_stb} mkdir -p ${drc_out} cd ${drc_out} chk_dck='n' chk_nrc='n' if [ ${cf_chk} = 'nerc' ]; then chk_nrc='y' fi # chk_nrc if [ ${cf_chk} != '0' ] && [ ${cf_chk} != 'nerc' ]; then chk_dck='y' hash cfchecker 2>/dev/null || { echo >&2 "Local cfchecker command not found, will smallify and upload to NERC checker instead"; chk_nrc='y'; chk_dck='n'; } fi # !cf_chk # Obtain group list grp_lst=`ncks --cdl -m ${fl_in} | grep '// group' | awk '{$1=$2=$3="";sub(/^ */,"",$0);print}'` IFS=$'\n' # Change Internal-Field-Separator from to for grp_in in ${grp_lst} ; do # Replace slashes by dots for output group filenames grp_out=`echo ${grp_in} | sed 's/\///' | sed 's/\//./g'` if [ "${grp_out}" = '' ]; then grp_out='root' ; fi # Tell older NCO/netCDF if HDF4 with --hdf4 switch (signified by .hdf/.HDF suffix) hdf4=`echo ${fl_in} | awk '{if(match(tolower($1),".hdf$")) hdf4="--hdf4"; print hdf4}'` # Flatten to netCDF3, anchor, no history, no temporary file, padding, HDF4 flag, options cmd="ncks -O -3 -G : -g ${grp_in}/ -h --no_tmp_fl --hdr_pad=40 ${hdf4} ${opt} ${fl_in} ${drc_out}/${grp_out}.nc" # Use eval in case ${opt} contains multiple arguments separated by whitespace eval ${cmd} if [ ${chk_dck} = 'y' ]; then # Decker checker needs Conventions <= 1.6 no_bck_sls=`echo ${drc_out}/${grp_out} | sed 's/\\\ / /g'` ncatted -h -a Conventions,global,o,c,CF-${cf_vrs} ${no_bck_sls}.nc else # !chk_dck echo ${drc_out}/${grp_out}.nc fi # !chk_dck done if [ ${chk_dck} = 'y' ]; then echo 'Decker CFchecker reports CF-compliance of each group in flat netCDF3 format' cfchecker -c ${cf_vrs} *.nc fi if [ ${chk_nrc} = 'y' ]; then # Smallification and NERC upload from qdcf script by Phil Rasch (PJR) echo 'Using remote CFchecker http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl' cf_lcn='http://puma.nerc.ac.uk/cgi-bin/cf-checker.pl' for fl in ${drc_out}/*.nc ; do fl_sml=${fl} cf_out=${fl%.nc}.html dmns=`ncdump -h ${fl_in} | sed -n -e '/dimensions/,/variables/p' | grep = | sed -e 's/=.*//'` hyp_sml='' for dmn in ${dmns}; do dmn_lc=`echo ${dmn} | tr "[:upper:]" "[:lower:]"` if [ ${dmn_lc} = 'lat' ] || [ ${dmn_lc} = 'latitude' ] || [ ${dmn_lc} = 'lon' ] || [ ${dmn_lc} = 'longitude' ] || [ ${dmn_lc} = 'time' ]; then hyp_sml=`echo ${hyp_sml}" -d ${dmn},0"` fi # !dmn_lc done # Create small version of input file by sampling only first element of lat, lon, time ncks -O ${hyp_sml} ${fl} ${fl_sml} # Send small file to NERC checker curl --form cfversion=1.6 --form upload=@${fl_sml} --form press="Check%20file" ${cf_lcn} -o ${cf_out} # Strip most HTML to improve readability cat ${cf_out} | sed -e "s/<[^>]*>//g" -e "/DOCTYPE/,/\]\]/d" -e "s/CF-Convention//g" -e "s/Output of//g" -e "s/Compliance Checker//g" -e "s/Check another//g" -e "s/CF-Checker follows//g" -e "s/Received//g" -e "s/for NetCDF//g" -e "s/NetCDF format//g" -e "s/against CF version 1//g" -e "s/\.\.\.//g" echo "Full NERC compliance-check log for ${fl} in ${cf_out}" done fi # !nerc EOF chmod 755 ~/ncdismember # Make command executable /bin/mv -f ~/ncdismember ~/sh # Store in location on $PATH, e.g., /usr/local/bin zender@roulee:~$ ncdismember ~/nco/data/mdl_1.nc ${DATA}/nco/tmp NCO dismembering file /home/zender/nco/data/mdl_1.nc /data/zender/nco/tmp/mdl_1.nc/cesm.cesm_01.nc /data/zender/nco/tmp/mdl_1.nc/cesm.cesm_02.nc /data/zender/nco/tmp/mdl_1.nc/cesm.nc /data/zender/nco/tmp/mdl_1.nc/ecmwf.ecmwf_01.nc /data/zender/nco/tmp/mdl_1.nc/ecmwf.ecmwf_02.nc /data/zender/nco/tmp/mdl_1.nc/ecmwf.nc /data/zender/nco/tmp/mdl_1.nc/root.nc @end verbatim @end example A (potentially more portable) binary executable could be written to dismember all groups with a single invocation, yet dismembering without loss of information is possible now with this simple script on all platforms with @acronym{UNIX}y utilities. Note that all dimensions inherited by groups in the input file are correctly placed by @command{ncdismember} into the flat files. Moreover, each output file preserves the group metadata of all ancestor groups, including the global metadata from the input file. As written, the script could fail on groups that contain advanced netCDF4 features because the user requests (with the @samp{-3} switch) that output be netCDF3 classic format. However, @command{ncks} detects many format incompatibilities in advance and works around them. For example, @command{ncks} autoconverts netCDF4-only atomic-types (such as @code{NC_STRING} and @code{NC_UBYTE}) to corresponding netCDF3 atomic types (@code{NC_CHAR} and @code{NC_SHORT}) when the output format is netCDF3. @node Checking CF-compliance, , Dismembering Files, Group Path Editing @subsection Checking CF-compliance @cindex @acronym{CF} compliance checker @findex cfchecker @findex ncdismember @cindex compliance checker @cindex Martin Schultz @cindex Michael Decker One application of dismembering is to check the @acronym{CF}-compliance of each group in a file. When invoked with the optional third argumnt @samp{cf}, @command{ncdismember} passes each file it generates to the freely available @footnote{CFchecker is developed by Michael Decker and Martin Schultz at Forschungszentrum J@"ulich and distributed at @uref{https://bitbucket.org/mde_/cfchecker}.} @command{cfchecker} command. @example @verbatim zender@roulee:~$ ncdismember ~/nco/data/mdl_1.nc /data/zender/nco/tmp cf NCO dismembering file /home/zender/nco/data/mdl_1.nc CFchecker reports CF-compliance of each group in flat netCDF3 format WARNING: Using the default (non-CF) Udunits database cesm.cesm_01.nc: INFO: INIT: running CFchecker version 1.5.15 INFO: INIT: checking compliance with convention CF-1.5 INFO: INIT: using standard name table version: 25, last modified: 2013-07-05T05:40:30Z INFO: INIT: using area type table version: 2, date: 10 July 2013 INFO: 2.4: no axis information found in dimension variables, not checking dimension order WARNING: 3: variable "tas1" contains neither long_name nor standard_name attribute WARNING: 3: variable "tas2" contains neither long_name nor standard_name attribute INFO: 3.1: variable "tas1" does not contain units attribute INFO: 3.1: variable "tas2" does not contain units attribute -------------------------------------------------- cesm.cesm_02.nc: ... @end verbatim @end example By default the @acronym{CF} version checked is determined automatically by @command{cfchecker}. The user can override this default by supplying a supported @acronym{CF} version, e.g., @samp{1.3}, as an optional fourth argument to @command{ncdismember}. Current valid @acronym{CF} options are @samp{1.0}, @samp{1.1}, @samp{1.2}, @samp{1.3}, @samp{1.4}, and @samp{1.5}. @html @end html Our development and testing of @command{ncdismember} is funded by our involvement in @acronym{NASA}'s Dataset Interoperability Working Group (@uref{https://wiki.earthdata.nasa.gov/display/ESDSWG/Dataset+Interoperability+Working+Group, DIWG}), though our interest extends beyond @acronym{NASA} datasets. Taken together, @acronym{NCO}'s features (autoconversion to netCDF3 atomic types, fixing multiple record dimensions, autosensing @acronym{HDF4} input, scoping rules for CF conventions) make @command{ncdismember} reliable and friendly for both dismembering hierarchical files and for @acronym{CF}-compliance checks. Most @acronym{HDF4} and @acronym{HDF5} datasets can be checked for @acronym{CF}-compliance with a one-line command. Example compliance checks of common @acronym{NASA} datasets are at @uref{http://dust.ess.uci.edu/diwg}. Our long-term goal is to enrich the hierarchical data model with the expressivity and syntactic power of @acronym{CF} conventions. @html @end html @acronym{NASA} asked the @acronym{DIWG} to prepare a one-page summary of the procedure necessary to check @acronym{HDF} files for @acronym{CF}-compliance: @example @verbatim cat > ~/ncdismember.txt << 'EOF' Preparing an RPM-based OS to Test HDF & netCDF Files for CF-Compliance By Charlie Zender, UCI & NASA Dataset Interoperability Working Group (DIWG) Installation Summary: 1. HDF4 [with internal netCDF support _disabled_] 2. HDF5 3. netCDF [with external HDF4 support _enabled_] 4. NCO 5. numpy 6. netcdf4-python 7. python-lxml 8. CFunits-python 9. CFChecker 10. ncdismember All 10 packages can use default installs _except_ HDF4 and netCDF. Following instructions for Fedora Core 20 (FC20), an RPM-based Linux OS Feedback and changes for other Linux-based OS's welcome to zender at uci.edu ${H4DIR}, ${H5DIR}, ${NETCDFDIR}, ${NCODIR}, may all be different For simplicity CZ sets them all to /usr/local # 1. HDF4. Build in non-default manner. Turn-off its own netCDF support. # Per http://www.unidata.ucar.edu/software/netcdf/docs/build_hdf4.html # HDF4 support not necessary though it makes ncdismember more comprehensive wget -c http://www.hdfgroup.org/ftp/HDF/HDF_Current/src/hdf-4.2.9.tar.gz tar xvzf hdf-4.2.9.tar.gz cd hdf-4.2.9 ./configure --enable-shared --disable-netcdf --disable-fortran --prefix=${H4DIR} make && make check && make install # 2. HDF5. Build normally. RPM may work too. Please let me know if so. # HDF5 is a necessary pre-requisite for netCDF4 wget -c ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4/hdf5-1.8.11.tar.gz tar xvzf hdf5-1.8.11.tar.gz cd hdf5-1.8.11 ./configure --enable-shared --prefix=${H5DIR} make && make check && make install # 3. netCDF version 4.3.1 or later. Build in non-default manner with HDF4. # Per http://www.unidata.ucar.edu/software/netcdf/docs/build_hdf4.html # Earlier versions of netCDF may fail checking some HDF4 files wget -c ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4.3.2.tar.gz tar xvzf netcdf-4.3.2.tar.gz cd netcdf-4.3.2 CPPFLAGS="-I${H5DIR}/include -I${H4DIR}/include" \ LDFLAGS="-L${H5DIR}/lib -L${H4DIR}/lib" \ ./configure --enable-hdf4 --enable-hdf4-file-tests make && make check && make install # 4. NCO version 4.4.0 or later. Some RPMs available. Or install by hand. # Later versions of NCO have much better support for ncdismember wget http://nco.sourceforge.net/src/nco-4.4.4.tar.gz . tar xvzf nco-4.4.4.tar.gz cd nco-4.4.4 ./configure --prefix=${NCODIR} make && make install # 5. numpy sudo yum install numpy -y # 6. netcdf4-python sudo yum install netcdf4-python -y # 7. python-lxml sudo yum install python-lxml -y # 8. CFunits-python. No RPM available. Must install by hand. # http://code.google.com/p/cfunits-python/ wget http://cfunits-python.googlecode.com/files/cfunits-0.9.6.tar.gz . tar xvzf cfunits-0.9.6.tar.gz cd cfunits-0.9.6 sudo python setup.py install # 9. CFChecker. No RPM available. Must install by hand. # https://bitbucket.org/mde_/cfchecker wget https://bitbucket.org/mde_/cfchecker/downloads/CFchecker-1.5.15.tar.bz2 . tar xvjf CFchecker-1.5.15.tar.bz2 cd CFchecker sudo python setup.py install # 10. ncdismember. Copy script from http://nco.sf.net/nco.html#ncdismember # Store dismembered files somewhere, e.g., ${DATA}/nco/tmp/hdf mkdir -p ${DATA}/nco/tmp/hdf # Many datasets work with a simpler command... ncdismember ~/nco/data/in.nc ${DATA}/nco/tmp/hdf cf 1.5 ncdismember ~/nco/data/mdl_1.nc ${DATA}/nco/tmp/hdf cf 1.5 ncdismember ${DATA}/hdf/AMSR_E_L2_Rain_V10_200905312326_A.hdf \ ${DATA}/nco/tmp/hdf cf 1.5 ncdismember ${DATA}/hdf/BUV-Nimbus04_L3zm_v01-00-2012m0203t144121.h5 \ ${DATA}/nco/tmp/hdf cf 1.5 ncdismember ${DATA}/hdf/HIRDLS-Aura_L3ZAD_v06-00-00-c02_2005d022-2008d077.he5 ${DATA}/nco/tmp/hdf cf 1.5 # Some datasets, typically .h5, require the --fix_rec_dmn=all argument ncdismember_${DATA}/hdf/GATMO_npp_d20100906_t1935191_e1935505_b00012_c20110707155932065809_noaa_ops.h5 ${DATA}/nco/tmp/hdf cf 1.5 --fix_rec_dmn=all ncdismember ${DATA}/hdf/mabel_l2_20130927t201800_008_1.h5 \ ${DATA}/nco/tmp/hdf cf 1.5 --fix_rec_dmn=all EOF @end verbatim @end example @c scp ~/ncdismember.pdf dust.ess.uci.edu:/var/www/html/diwg A @acronym{PDF} version of these instructions is available @uref{http://dust.ess.uci.edu/diwg/ncdismember.pdf, here}. @html @end html @node C and Fortran Index Conventions, Hyperslabs, Group Path Editing, Shared features @section C and Fortran Index conventions @cindex index convention @cindex Fortran index convention @cindex C index convention @cindex @code{-F} @cindex @code{--fortran} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-F}@* Long options: @samp{--fortran}@* @end cartouche @cindex I/O The @samp{-F} switch changes @acronym{NCO} to read and write with the Fortran index convention. By default, @acronym{NCO} uses C-style (0-based) indices for all I/O. @w{In C}, indices count @w{from 0} (rather @w{than 1}), and dimensions are ordered from slowest (inner-most) to fastest (outer-most) varying. In Fortran, indices count @w{from 1} (rather @w{than 0}), and dimensions are ordered from fastest (inner-most) to slowest (outer-most) varying. @cindex transpose Hence @w{C and} Fortran data storage conventions represent mathematical transposes of eachother. @cindex record variable Note that record variables contain the record dimension as the most slowly varying dimension. See @ref{ncpdq netCDF Permute Dimensions Quickly} for techniques to re-order (including transpose) dimensions and to reverse data storage order. @cindex record dimension Consider a file @file{85.nc} containing @w{12 months} of data in the record dimension @code{time}. The following hyperslab operations produce identical results, a June-July-August average of the data: @example ncra -d time,5,7 85.nc 85_JJA.nc ncra -F -d time,6,8 85.nc 85_JJA.nc @end example Printing variable @var{three_dmn_var} in file @file{in.nc} first with the @w{C indexing} convention, then with Fortran indexing convention results in the following output formats: @example % ncks -v three_dmn_var in.nc lat[0]=-90 lev[0]=1000 lon[0]=-180 three_dmn_var[0]=0 ... % ncks -F -v three_dmn_var in.nc lon(1)=0 lev(1)=100 lat(1)=-90 three_dmn_var(1)=0 ... @end example @html @end html @node Hyperslabs, Stride, C and Fortran Index Conventions, Shared features @section Hyperslabs @cindex hyperslab @cindex dimension limits @cindex coordinate limits @cindex @code{-0} @cindex @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* Long options: @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]},@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* @end cartouche @w{A @dfn{hyperslab}} is a subset of a variable's data. The coordinates of a hyperslab are specified with the @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} short option (or with the same arguments to the @samp{--dimension} or @samp{--dmn} long options). At least one hyperslab argument (@var{min}, @var{max}, or @var{stride}) must be present. The bounds of the hyperslab to be extracted are specified by the associated @var{min} and @var{max} values. @w{A half}-open range is specified by omitting either the @var{min} or @var{max} parameter. The separating comma must be present to indicate the omission of one of these arguments. The unspecified limit is interpreted as the maximum or minimum value in the unspecified direction. @w{A cross}-section at a specific coordinate is extracted by specifying only the @var{min} limit and omitting a trailing comma. Dimensions not mentioned are passed with no reduction in range. The dimensionality of variables is not reduced (in the case of a cross-section, the size of the constant dimension will be one). @example # First and second longitudes ncks -F -d lon,1,2 in.nc out.nc # Second and third longitudes ncks -d lon,1,2 in.nc out.nc @end example As of version 4.2.1 (August, 2012), @acronym{NCO} allows one to extract the last @var{N} elements of a hyperslab. Negative integers as @var{min} or @var{max} elements of a hyperslab specification indicate offsets from the end (Python also uses this convention). Consistent with this convention, the value @samp{-1} (negative one) indicates the last element of a dimension, and negative zero is algebraically equivalent to zero and so indicates the first element of a dimension. Previously, for example, @samp{-d time,-2,-1} caused a domain error. Now it means select the penultimate and last timesteps, independent of the size of the @code{time} dimension. Select only the first and last timesteps, respectively, with @samp{-d time,0} and @samp{-d time,-1}. Negative integers work for @var{min} and @var{max} indices, though not for @var{stride}. @example # Second through penultimate longitudes ncks -d lon,1,-2 in.nc out.nc # Second through last longitude ncks -d lon,1,-1 in.nc out.nc # Second-to-last to last longitude ncks -d lon,-3,-1 in.nc out.nc # Second-to-last to last longitude ncks -d lon,-3, in.nc out.nc @end example @noindent The @samp{-F} argument, if any, applies the Fortran index convention only to indices specified as positive integers: @example # First through penultimate longitudes ncks -F -d lon,1,-2 in.nc out.nc (-F affects only start index) # First through last longitude ncks -F -d lon,1,-1 in.nc out.nc # Second-to-last to penultimate longitude (-F has no effect) ncks -F -d lon,-3,-1 in.nc out.nc # Second-to-last to last longitude (-F has no effect) ncks -F -d lon,-3, in.nc out.nc @end example @cindex stride Coordinate values should be specified using real notation with a decimal point required in the value, whereas dimension indices are specified using integer notation without a decimal point. This convention serves only to differentiate coordinate values from dimension indices. It is independent of the type of any netCDF coordinate variables. For a given dimension, the specified limits must both be coordinate values (with decimal points) or dimension indices (no decimal points). If values of a coordinate-variable are used to specify a range or cross-section, then the coordinate variable must be monotonic (values either increasing or decreasing). In this case, command-line values need not exactly match coordinate values for the specified dimension. Ranges are determined by seeking the first coordinate value to occur in the closed range [@var{min},@var{max}] and including all subsequent values until one falls outside the range. The coordinate value for a cross-section is the coordinate-variable value closest to the specified value and must lie within the range or coordinate-variable values. The @var{stride} argument, if any, must be a dimension index, not a coordinate value. @xref{Stride}, for more information on the @var{stride} option. @example # All longitude values between 1 and 2 degrees ncks -d lon,1.0,2.0 in.nc out.nc # All longitude values between 1 and 2 degrees ncks -F -d lon,1.0,2.0 in.nc out.nc # Every other longitude value between 0 and 90 degrees ncks -F -d lon,0.0,90.0,2 in.nc out.nc @end example As shown, we recommend using a full floating point suffix of @code{.0} instead of simply @code{.} in order to make obvious the selection of hyperslab elements based on coordinate value rather than index. @cindex @code{NC_CHAR} User-specified coordinate limits are promoted to double-precision values while searching for the indices which bracket the range. Thus, hyperslabs on coordinates of type @code{NC_CHAR} are computed numerically rather than lexically, so the results are unpredictable. @cindex wrapped coordinates The relative magnitude of @var{min} and @var{max} indicate to the operator whether to expect a @dfn{wrapped coordinate} (@pxref{Wrapped Coordinates}), such as longitude. If @math{@var{min} > @var{max}}, the @acronym{NCO} expects the coordinate to be wrapped, and a warning message will be printed. When this occurs, @acronym{NCO} selects all values outside the domain [@math{@var{max} < @var{min}}], i.e., all the values exclusive of the values which would have been selected if @var{min} and @var{max} were swapped. If this seems confusing, test your command on just the coordinate variables with @command{ncks}, and then examine the output to ensure @acronym{NCO} selected the hyperslab you expected (coordinate wrapping is currently only supported by @command{ncks}). Because of the way wrapped coordinates are interpreted, it is very important to make sure you always specify hyperslabs in the monotonically increasing sense, i.e., @math{@var{min} < @var{max}} (even if the underlying coordinate variable is monotonically decreasing). The only exception to this is when you are indeed specifying a wrapped coordinate. The distinction is crucial to understand because the points selected by, e.g., @code{-d longitude,50.,340.}, are exactly the complement of the points selected by @code{-d longitude,340.,50.}. Not specifying any hyperslab option is equivalent to specifying full ranges of all dimensions. This option may be specified more than once in a single command (each hyperslabbed dimension requires its own @code{-d} option). @html @end html @node Stride, Record Appending, Hyperslabs, Shared features @section Stride @cindex stride @cindex @code{-d @var{dim},[@var{min}],[@var{max}],@var{stride}} @cindex @code{--dimension @var{dim},[@var{min}],[@var{max}],@var{stride}} @cindex @code{--dmn @var{dim},[@var{min}],[@var{max}],@var{stride}} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* Long options: @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]},@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* @end cartouche All data operators support specifying a @dfn{stride} for any and all dimensions at the same time. The @var{stride} is the spacing between consecutive points in a hyperslab. @w{A @var{stride}} @w{of 1} picks all the elements of the hyperslab, and a @var{stride} @w{of 2} skips every other element, etc.@. @command{ncks} multislabs support strides, and are more powerful than the regular hyperslabs supported by the other operators (@pxref{Multislabs}). Using the @var{stride} option for the record dimension with @command{ncra} and @command{ncrcat} makes it possible, for instance, to average or concatenate regular intervals across multi-file input data sets. The @var{stride} is specified as the optional fourth argument to the @samp{-d} hyperslab specification: @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}. Specify @var{stride} as an integer (i.e., no decimal point) following the third comma in the @samp{-d} argument. There is no default value for @var{stride}. Thus using @samp{-d time,,,2} is valid but @samp{-d time,,,2.0} and @samp{-d time,,,} are not. When @var{stride} is specified but @var{min} is not, there is an ambiguity as to whether the extracted hyperslab should begin with (using C-style, 0-based indexes) @w{element 0} or element @samp{stride-1}. @acronym{NCO} must resolve this ambiguity and it chooses @w{element 0} as the first element of the hyperslab when @var{min} is not specified. Thus @samp{-d time,,,@var{stride}} is syntactically equivalent to @samp{-d time,0,,@var{stride}}. This means, for example, that specifying the operation @samp{-d time,,,2} on the array @samp{1,2,3,4,5} selects the hyperslab @samp{1,3,5}. To obtain the hyperslab @samp{2,4} instead, simply explicitly specify the starting index @w{as 1,} i.e., @samp{-d time,1,,2}. For example, consider a file @file{8501_8912.nc} which contains 60 consecutive months of data. Say you wish to obtain just the March data from this file. Using 0-based subscripts (@pxref{C and Fortran Index Conventions}) these data are stored in records @w{2, 14, @dots{} 50} so the desired @var{stride} @w{is 12.} Without the @var{stride} option, the procedure is very awkward. One could use @command{ncks} five times and then use @command{ncrcat} to concatenate the resulting files together: @cindex Bourne Shell @cindex C Shell @example @verbatim for idx in 02 14 26 38 50; do # Bourne Shell ncks -d time,${idx} 8501_8912.nc foo.${idx} done foreach idx (02 14 26 38 50) # C Shell ncks -d time,${idx} 8501_8912.nc foo.${idx} end ncrcat foo.?? 8589_03.nc rm foo.?? @end verbatim @end example With the @var{stride} option, @command{ncks} performs this hyperslab extraction in one operation: @example ncks -d time,2,,12 8501_8912.nc 8589_03.nc @end example @xref{ncks netCDF Kitchen Sink}, for more information on @command{ncks}. Applying the @var{stride} option to the record dimension in @command{ncra} and @command{ncrcat} makes it possible, for instance, to average or concatenate regular intervals across multi-file input data sets. @example ncra -F -d time,3,,12 85.nc 86.nc 87.nc 88.nc 89.nc 8589_03.nc ncrcat -F -d time,3,,12 85.nc 86.nc 87.nc 88.nc 89.nc 8503_8903.nc @end example @html @end html @node Record Appending, Subcycle, Stride, Shared features @section Record Appending @cindex record append @cindex @code{--rec_apn} @cindex @code{--record_append} @cartouche Availability: @command{ncra}, @command{ncrcat}@* Short options: None@* Long options: @samp{--rec_apn}, @samp{--record_append}@* @end cartouche As of version 4.2.6 (March, 2013), @acronym{NCO} allows both Multi-File, Multi-Record operators (@command{ncra} and @command{ncrcat}) to append their output directly to the end of an existing file. This feature may be used to augment a target file, rather than construct it from scratch. This helps, for example, when a timeseries is concatenated from input data that becomes available in stages rather than all at once. In such cases this switch significantly speeds writing. Consider the use case where one wishes to preserve the contents of @file{fl_1.nc}, and add to them new records contained in @file{fl_2.nc}. Previously the output had to be placed in a third file, @file{fl_3.nc} (which could also safely be named @file{fl_2.nc}), via @example ncrcat -O fl_1.nc fl_2.nc fl_3.nc @end example Under the hood this operation copies all information in @file{fl_1.nc} and @file{fl_2.nc} not once but twice. The first copy is performed through the netCDF interface, as all data from @file{fl_1.nc} and @file{fl_2.nc} are extracted and placed in the output file. The second copy occurs (usually much) more quickly as the (by default) temporary output file is copied (sometimes a quick re-link suffices) to the final output file (@pxref{Temporary Output Files}). All this copying is expensive for large files. The @samp{--record_append} switch appends all records in @file{fl_2.nc} to the end (after the last record) of @file{fl_1.nc}: @example ncrcat --rec_apn fl_2.nc fl_1.nc @end example The ordering of the filename arguments may seem non-intuitive. If the record variable represents time in these files, then the values in @file{fl_1.nc} precede those in @file{fl_2.nc}, so why do the files appear in the reverse order on the command line? @file{fl_1.nc} is the last file named because it is the pre-existing output file to which we will append all the other input files listed (in this case only @file{fl_2.nc}). The contents of @file{fl_1.nc} are completely preserved, and only values in @file{fl_2.nc} (and any other input files) are copied. This switch avoids the necessity of copying all of @file{fl_1.nc} through the netCDF interface to a new output file. The @samp{--rec_apn} switch automatically puts @acronym{NCO} into append mode (@pxref{Appending Variables}), so specifying @samp{-A} is redundant, and simultaneously specifying overwrite mode with @samp{-O} causes an error. By default, NCO works in an intermediate temporary file. Power users may combine @samp{--rec_apn} with the @samp{--no_tmp_fl} switch (@pxref{Temporary Output Files}): @example ncrcat --rec_apn --no_tmp_fl fl_2.nc fl_1.nc @end example This avoids creating an intermediate file, and copies only the minimal amount of data (i.e., all of @file{fl_2.nc}). Hence, it is fast. We recommend users try to understand the safety trade-offs involved. @html @end html @node Subcycle, Multislabs, Record Appending, Shared features @section Subcycle @cindex duration @cindex sub-cycle @cindex subcycle @cindex MRO @cindex Multi-Record Operator @cindex @code{--mro} @cindex @code{-d @var{dim},[@var{min}],[@var{max}],[@var{stride}],[@var{subcycle}]} @cindex @code{--dimension @var{dim},[@var{min}],[@var{max}],[@var{stride}],[@var{subcycle}]} @cindex @code{--dmn @var{dim},[@var{min}],[@var{max}],[@var{stride}],@var{subcycle}]} @cartouche Availability: @command{ncra}, @command{ncrcat}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]]}@* Long options: @samp{--mro} @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]]}@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]]}@* @end cartouche As of version 4.2.1 (August, 2012), @acronym{NCO} allows both Multi-File, Multi-Record operators, @command{ncra} and @command{ncrcat}, to extract and operate on multiple groups of records. These groups may be connected to physical @emph{sub-cycles} of a periodic nature, e.g., months of a year, or hours of a day. Or they may be thought of as groups of a specifed duration. The feature and the terminology to describe it are new. For now, we call this the @dfn{subcycle feature}, sometimes abbreviated @acronym{SSC} @footnote{When originally released in 2012 this was called the @dfn{duration feature}, and was abbreviated @acronym{DRN}.}. The subcycle feature allows processing of groups of records separated by regular intervals of records. It is perhaps best illustrated by an extended example which describes how to solve the same problem both with and without the @acronym{SSC} feature. The first task in climate data processing is often creating seasonal cycles. Suppose a 150-year climate simulation produces 150 output files, each comprising 12 records, each record a monthly mean: @file{1850.nc}, @file{1851.nc}, ... @file{1999.nc}. Our goal is to create a single file containing the summertime (June, July, and August, aka JJA) mean. Traditionally, we would first compute the climatological monthly mean for each month of summer. Each of these is a 150-year mean, i.e., @example @verbatim # Step 1: Create climatological monthly files clm06.nc..clm08.nc for mth in {6..8}; do mm=`printf "%02d" $mth` ncra -O -F -d time,${mm},,12 -n 150,4,1 1850.nc clm${mm}.nc done # Step 2: Average climatological monthly files into summertime mean ncra -O clm06 clm07.nc clm08.nc clm_JJA.nc @end verbatim @end example @noindent So far, nothing is unusual and this task can be performed by any @acronym{NCO} version. The @acronym{SSC} feature makes obsolete the need for the shell loop used in @w{Step 1} above. The new @acronym{SSC} option aggregates more than one input record at a time before performing arithmetic operations, and, with an additional switch, allows us to archive those results in multiple record output (MRO) files. This reduces the task of producing the climatological summertime mean to one step: @example # Step 1: Compute climatological summertime mean ncra -O -F -d time,6,,12,3 -n 150,4,1 1850.nc clm_JJA.nc @end example @noindent The @acronym{SSC} option instructs @command{ncra} (or @command{ncrcat}) to process files in groups of three records. To better understand the meaning of each argument to the @samp{-d} hyperslab option, read it this way: ``for the time dimension start with the sixth record, continue without end, repeat the process every twelfth record, and define a sub-cycle as three consecutive records''. A separate option, @samp{--mro}, instructs @command{ncra} to output its results from each sub-group, and to produce a @dfn{Multi-Record Output} (MRO) file rather than a @dfn{Single-Record Output} (SRO) file. Unless @samp{--mro} is specified, @command{ncra} collects together all the sub-groups, operates on their ensemble, and produces a single output record. The addition of @samp{--mro} to the above example causes @command{ncra} to archive all (150) annual summertime means to one file: @example # Step 1: Archive all 150 summertime means in one file ncra --mro -O -F -d time,6,,12,3 -n 150,4,1 1850.nc 1850_2009_JJA.nc # ...or all (150) annual means... ncra --mro -O -d time,,,12,12 -n 150,4,1 1850.nc 1850_2009.nc @end example @noindent These operations generate and require no intermediate files. This contrasts to previous @acronym{NCO} methods, which require generating, averaging, then catenating 150 files. The @samp{--mro} option has no effect on, or rather is redundant for, @command{ncrcat} since @command{ncrcat} always outputs all selected records. @html @end html @node Multislabs, Wrapped Coordinates, Subcycle, Shared features @section Multislabs @cindex multislab @cindex multi-hyperslab @cindex @acronym{MSA} @cindex @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--msa} @cindex @code{--msa_usr_rdr} @cindex @code{--msa_user_order} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* Long options: @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]},@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* @samp{--msa_usr_rdr}, @samp{--msa_user_order}@* @end cartouche A @w{multislab} is a union of one or more hyperslabs. One defines multislabs by chaining together hyperslab commands, i.e., @kbd{-d} options (@pxref{Hyperslabs}). Support for specifying a @dfn{multi-hyperslab} or @dfn{multislab} for any variable was first added to @command{ncks} in late 2002. The other operators received these capabilities in April 2008. Multi-slabbing is often referred to by the acronym @acronym{MSA}, which stands for ``Multi-Slabbing Algorithm''. As explained below, the user may additionally request that the multislabs be returned in the user-specified order, rather than the on-disk storage order. Although @acronym{MSA} user-ordering has been available in all operators since 2008, most users were unaware of it since the documentation (below, and in the man pages) was not written until July 2013. Multislabs overcome many restraints that limit simple hyperslabs. @w{A single} @kbd{-d} option can only specify a contiguous and/or a regularly spaced multi-dimensional data array. Multislabs are constructed from multiple @kbd{-d} options and may therefore have non-regularly spaced arrays. For example, suppose it is desired to operate on all longitudes from 10.0 to 20.0 and from 80.0 to @w{90.0 degrees}. The combined range of longitudes is not selectable in a single hyperslab specfication of the form @samp{-d @var{dimension},@var{min},@var{max}} or @samp{-d @var{dimension},@var{min},@var{max},@var{stride}} because its elements are irregularly spaced in coordinate space (and presumably in index space too). The multislab specification for obtaining these values is simply the union of the hyperslabs specifications that comprise the multislab, i.e., @example ncks -d lon,10.,20. -d lon,80.,90. in.nc out.nc ncks -d lon,10.,15. -d lon,15.,20. -d lon,80.,90. in.nc out.nc @end example @noindent Any number of hyperslabs specifications may be chained together to specify the multislab. @acronym{MSA} creates an output dimension equal in size to the sum of the sizes of the multislabs. This can be used to extend and or pad coordinate grids. @cindex stride Users may specify redundant ranges of indices in a multislab, e.g., @example ncks -d lon,0,4 -d lon,2,9,2 in.nc out.nc @end example @noindent This command retrieves the first five longitudes, and then every other longitude value up to the tenth. Elements 0, 2, @w{and 4} are specified by both hyperslab arguments (hence this is redundant) but will count only once if an arithmetic operation is being performed. This example uses index-based (not coordinate-based) multislabs because the @var{stride} option only supports index-based hyper-slabbing. @xref{Stride}, for more information on the @var{stride} option. Multislabs are more efficient than the alternative of sequentially performing hyperslab operations and concatenating the results. @cindex I/O This is because @acronym{NCO} employs a novel multislab algorithm to minimize the number of I/O operations when retrieving irregularly spaced data from disk. The @acronym{NCO} multislab algorithm retrieves each element from disk once and only once. Thus users may take some shortcuts in specifying multislabs and the algorithm will obtain the intended values. Specifying redundant ranges is not encouraged, but may be useful on occasion and will not result in unintended consequences. Suppose the @var{Q} variable contains three dimensional arrays of distinct chemical constituents in no particular order. We are interested in the NOy species in a certain geographic range. Say that NO, NO2, and N2O5 are @w{elements 0}, 1, @w{and 5} of the @var{species} dimension of @var{Q}. The multislab specification might look something like @example ncks -d species,0,1 -d species,5 -d lon,0,4 -d lon,2,9,2 in.nc out.nc @end example @noindent Multislabs are powerful because they may be specified for every dimension at the same time. Thus multislabs obsolete the need to execute multiple @command{ncks} commands to gather the desired range of data. @html @end html The @acronym{MSA} user-order switch @samp{--msa_usr_rdr} (or @samp{--msa_user_order}, both of which shorten to @samp{--msa}) requests that the multislabs be output in the user-specified order from the command-line, rather than in the input-file on-disk storage order. This allows the user to perform complex data re-ordering in one operation that would otherwise require cumbersome steps of hyperslabbing, concatenating, and permuting. Consider the recent example of a user who needed to convert datasets stored with the longitude coordinate @code{Lon} ranging from [@minus{}180,180) to datasets that follow the [0,360) convention. @example % ncks -H -v Lon in.nc Lon[0]=-180 Lon[1]=-90 Lon[2]=0 Lon[3]=90 @end example @noindent Although simple in theory, this task requires both mathematics to change the numerical value of the longitude coordinate, data hyperslabbing to split the input on-disk arrays at Greenwich, and data re-ordering within to stitch the western hemisphere onto the eastern hemisphere at the date-line. The @samp{--msa} user-order switch overrides the default that data are output in the same order in which they are stored on-disk in the input file, and instead stores them in the same order as the multi-slabs are given to the command line. This default is intuitive and is not important in most uses. However, the @acronym{MSA} user-order switch allows users to meet their output order needs by specifying multi-slabs in a certain order. Compare the results of default ordering to user-ordering for longitude: @example % ncks -O -H -v Lon -d Lon,0.,180. -d Lon,-180.,-1.0 in.nc Lon[0]=-180 Lon[1]=-90 Lon[2]=0 Lon[3]=90 % ncks -O -H --msa -v Lon -d Lon,0.,180. -d Lon,-180.,-1.0 in.nc Lon[0]=0 Lon[1]=90 Lon[2]=-180 Lon[3]=-90 @end example @noindent The two multi-slabs are the same but they can be presented to screen, or to an output file, in either order. The second example shows how to place the western hemisphere after the eastern hemisphere, although they are stored in the opposite order in the input file. With this background, one sees that the following commands suffice to rotate the input file by @w{180 degrees} longitude: @example % ncks -O -v LatLon --msa -d Lon,0.,180. -d Lon,-180.,-1.0 in.nc out.nc % ncap2 -O -s 'where(Lon < 0) Lon=Lon+360' out.nc out.nc % ncks -C -H -v LatLon ~/nco/data/in.nc Lat[0]=-45 Lon[0]=-180 LatLon[0]=0 Lat[0]=-45 Lon[1]=-90 LatLon[1]=1 Lat[0]=-45 Lon[2]=0 LatLon[2]=2 Lat[0]=-45 Lon[3]=90 LatLon[3]=3 Lat[1]=45 Lon[0]=-180 LatLon[4]=4 Lat[1]=45 Lon[1]=-90 LatLon[5]=5 Lat[1]=45 Lon[2]=0 LatLon[6]=6 Lat[1]=45 Lon[3]=90 LatLon[7]=7 % ncks -C -H -v LatLon ~/out.nc Lat[0]=-45 Lon[0]=0 LatLon[0]=2 Lat[0]=-45 Lon[1]=90 LatLon[1]=3 Lat[0]=-45 Lon[2]=180 LatLon[2]=0 Lat[0]=-45 Lon[3]=270 LatLon[3]=1 Lat[1]=45 Lon[0]=0 LatLon[4]=6 Lat[1]=45 Lon[1]=90 LatLon[5]=7 Lat[1]=45 Lon[2]=180 LatLon[6]=4 Lat[1]=45 Lon[3]=270 LatLon[7]=5 @end example @noindent There are other workable, valid methods to accomplish this rotation, yet none are simpler nor more efficient than utilizing @acronym{MSA} user-ordering. Some final comments on applying this algorithm: Be careful to specify hemispheres that do not overlap, e.g., by inadvertently specifying coordinate ranges that both include Greenwich. Some users will find using index-based rather than coordinate-based hyperslabs makes this clearer. @html @end html @node Wrapped Coordinates, Auxiliary Coordinates, Multislabs, Shared features @section Wrapped Coordinates @cindex wrapped coordinates @cindex longitude @cindex @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cartouche Availability: @command{ncks}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* Long options: @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]},@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* @end cartouche @w{A @dfn{wrapped coordinate}} is a coordinate whose values increase or decrease monotonically (nothing unusual so far), but which represents a dimension that ends where it begins (i.e., wraps around on itself). Longitude (i.e., degrees on a circle) is a familiar example of a wrapped coordinate. Longitude increases to the East of Greenwich, England, where it is defined to be zero. Halfway around the globe, the longitude is @w{180 degrees} East (or West). Continuing eastward, longitude increases to @w{360 degrees} East at Greenwich. The longitude values of most geophysical data are either in the range [0,360), or [@minus{}180,180). In either case, the Westernmost and Easternmost longitudes are numerically separated by @w{360 degrees}, but represent contiguous regions on the globe. For example, the Saharan desert stretches from roughly 340 to @w{50 degrees} East. Extracting the hyperslab of data representing the Sahara from a global dataset presents special problems when the global dataset is stored consecutively in longitude from 0 to @w{360 degrees}. This is because the data for the Sahara will not be contiguous in the @var{input-file} but is expected by the user to be contiguous in the @var{output-file}. In this case, @command{ncks} must invoke special software routines to assemble the desired output hyperslab from multiple reads of the @var{input-file}. Assume the domain of the monotonically increasing longitude coordinate @code{lon} is @math{0 < @var{lon} < 360}. @command{ncks} will extract a hyperslab which crosses the Greenwich meridian simply by specifying the westernmost longitude as @var{min} and the easternmost longitude as @var{max}. The following commands extract a hyperslab containing the Saharan desert: @example ncks -d lon,340.,50. in.nc out.nc ncks -d lon,340.,50. -d lat,10.,35. in.nc out.nc @end example @noindent The first example selects data in the same longitude range as the Sahara. The second example further constrains the data to having the same latitude as the Sahara. The coordinate @code{lon} in the @var{output-file}, @file{out.nc}, will no longer be monotonic! The values of @code{lon} will be, e.g., @samp{340, 350, 0, 10, 20, 30, 40, 50}. This can have serious implications should you run @file{out.nc} through another operation which expects the @code{lon} coordinate to be monotonically increasing. Fortunately, the chances of this happening are slim, since @code{lon} has already been hyperslabbed, there should be no reason to hyperslab @code{lon} again. Should you need to hyperslab @code{lon} again, be sure to give dimensional indices as the hyperslab arguments, rather than coordinate values (@pxref{Hyperslabs}). @html @end html @node Auxiliary Coordinates, Grid Generation, Wrapped Coordinates, Shared features @section Auxiliary Coordinates @cindex @code{-X} @cindex @code{--auxiliary} @cindex @code{standard_name} @cindex @code{coordinates} @cindex auxiliary coordinates @cindex @acronym{CF} conventions @cindex @code{-X @var{lon_min},@var{lon_max},@var{lat_min},@var{lat_max}} @cindex @code{--auxiliary @var{lon_min},@var{lon_max},@var{lat_min},@var{lat_max}} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}@* Short options: @samp{-X @var{lon_min},@var{lon_max},@var{lat_min},@var{lat_max}}@* Long options: @samp{--auxiliary @var{lon_min},@var{lon_max},@var{lat_min},@var{lat_max}}@* @end cartouche Utilize auxiliary coordinates specified in values of the coordinate variable's @code{standard_name} attributes, if any, when interpreting hyperslab and multi-slab options. Also @samp{--auxiliary}. This switch supports hyperslabbing cell-based grids (aka unstructured grids) over coordinate ranges. This works on datasets that associate coordinate variables to grid-mappings using the @acronym{CF}-convention (@pxref{CF Conventions}) @code{coordinates} and @code{standard_name} attributes described @uref{http://cfconventions.org/1.6.html#coordinate-system, here}. Currently, @acronym{NCO} understands auxiliary coordinate variables pointed to by the @code{standard_name} attributes for @var{latitude} and @var{longitude}. Cells that contain a value within the user-specified range [@var{lon_min},@var{lon_max},@var{lat_min},@var{lat_max}] are included in the output hyperslab. @cindex unstructured grid @cindex cell-based grid A cell-based or unstructured grid collapses the horizontal spatial information (latitude and longitude) and stores it along a one-dimensional coordinate that has a one-to-one mapping to both latitude and longitude coordinates. Rectangular (in longitude and latitude) horizontal hyperslabs cannot be selected using the typical procedure (@pxref{Hyperslabs}) of separately specifying @samp{-d} arguments for longitude and latitude. Instead, when the @samp{-X} is used, @acronym{NCO} learns the names of the latitude and longitude coordinates by searching the @code{standard_name} attribute of all variables until it finds the two variables whose @code{standard_name}'s are ``latitude'' and ``longitude'', respectively. This @code{standard_name} attribute for latitude and longitude coordinates follows the @acronym{CF}-convention (@pxref{CF Conventions}). Putting it all together, consider a variable @var{gds_3dvar} output from simulations on a cell-based geodesic grid. Although the variable contains three dimensions of data (time, latitude, and longitude), it is stored in the netCDF file with only two dimensions, @code{time} and @code{gds_crd}. @example % ncks -m -C -v gds_3dvar ~/nco/data/in.nc gds_3dvar: type NC_FLOAT, 2 dimensions, 4 attributes, chunked? no, \ compressed? no, packed? no, ID = 41 gds_3dvar RAM size is 10*8*sizeof(NC_FLOAT) = 80*4 = 320 bytes gds_3dvar dimension 0: time, size = 10 NC_DOUBLE, dim. ID = 20 \ (CRD)(REC) gds_3dvar dimension 1: gds_crd, size = 8 NC_FLOAT, dim. ID = 17 (CRD) gds_3dvar attribute 0: long_name, size = 17 NC_CHAR, value = \ Geodesic variable gds_3dvar attribute 1: units, size = 5 NC_CHAR, value = meter gds_3dvar attribute 2: coordinates, size = 15 NC_CHAR, value = \ lat_gds lon_gds gds_3dvar attribute 3: purpose, size = 64 NC_CHAR, value = \ Test auxiliary coordinates like those that define geodesic grids @end example The @code{coordinates} attribute lists the names of the latitude and longitude coordinates, @code{lat_gds} and @code{lon_gds}, respectively. The @code{coordinates} attribute is recommended though optional. With it, the user can immediately identify which variables contain the latitude and longitude coordinates. Without a @code{coordinates} attribute it would be unclear at first glance whether a variable resides on a cell-based grid. In this example, @code{time} is a normal record dimension and @code{gds_crd} is the cell-based dimension. The cell-based grid file must contain two variables whose @code{standard_name} attributes are ``latitude'', and ``longitude'': @example % ncks -m -C -v lat_gds,lon_gds ~/nco/data/in.nc lat_gds: type NC_DOUBLE, 1 dimensions, 4 attributes, \ chunked? no, compressed? no, packed? no, ID = 37 lat_gds RAM size is 8*sizeof(NC_DOUBLE) = 8*8 = 64 bytes lat_gds dimension 0: gds_crd, size = 8 NC_FLOAT, dim. ID = 17 (CRD) lat_gds attribute 0: long_name, size = 8 NC_CHAR, value = Latitude lat_gds attribute 1: standard_name, size = 8 NC_CHAR, value = latitude lat_gds attribute 2: units, size = 6 NC_CHAR, value = degree lat_gds attribute 3: purpose, size = 62 NC_CHAR, value = \ 1-D latitude coordinate referred to by geodesic grid variables lon_gds: type NC_DOUBLE, 1 dimensions, 4 attributes, \ chunked? no, compressed? no, packed? no, ID = 38 lon_gds RAM size is 8*sizeof(NC_DOUBLE) = 8*8 = 64 bytes lon_gds dimension 0: gds_crd, size = 8 NC_FLOAT, dim. ID = 17 (CRD) lon_gds attribute 0: long_name, size = 9 NC_CHAR, value = Longitude lon_gds attribute 1: standard_name, size = 9 NC_CHAR, value = longitude lon_gds attribute 2: units, size = 6 NC_CHAR, value = degree lon_gds attribute 3: purpose, size = 63 NC_CHAR, value = \ 1-D longitude coordinate referred to by geodesic grid variables @end example In this example @code{lat_gds} and @code{lon_gds} represent the latitude or longitude, respectively, of cell-based variables. These coordinates (must) have the same single dimension (@code{gds_crd}, in this case) as the cell-based variables. And the coordinates must be one-dimensional---multidimensional coordinates will not work. This infrastructure allows @acronym{NCO} to identify, interpret, and process (e.g., hyperslab) the variables on cell-based grids as easily as it works with regular grids. To time-average all the values between zero and @w{180 degrees} longitude and between plus and minus @w{30 degress} latitude, we use @example ncra -O -X 0.,180.,-30.,30. -v gds_3dvar in.nc out.nc @end example @acronym{NCO} accepts multiple @samp{-X} arguments for cell-based grid multi-slabs, just as it accepts multiple @samp{-d} arguments for multi-slabs of regular coordinates. @example ncra -O -X 0.,180.,-30.,30. -X 270.,315.,45.,90. in.nc out.nc @end example The arguments to @samp{-X} are always interpreted as floating point numbers, i.e., as coordinate values rather than dimension indices so that these two commands produce identical results @example ncra -X 0.,180.,-30.,30. in.nc out.nc ncra -X 0,180,-30,30 in.nc out.nc @end example In contrast, arguments to @samp{-d} require decimal places to be recognized as coordinates not indices (@pxref{Hyperslabs}). We recommend always using decimal points with @samp{-X} arguments to avoid confusion. @html @end html @node Grid Generation, Regridding, Auxiliary Coordinates, Shared features @section Grid Generation @cindex Gaussian grid @cindex Equi-Angular grid @cindex FV grid @cindex CAM-FV grid @cindex grid, Fixed @cindex grid, Offset @cindex grid, FV @cindex grid, CAM-FV @cindex grid, Equi-Angular @cindex grid, Gaussian @cindex gridfile @cindex @code{--map} @cindex @acronym{ESMF} @cindex @acronym{SCRIP} @cindex @code{--rgr @var{key}=@var{val}} @cartouche Availability: @command{ncks}@* Short options: None@* Long options: @samp{--rgr @var{key}=@var{val}} (multiple invocations allowed)@* @end cartouche As of @acronym{NCO} version 4.5.2 (August, 2015), @command{ncks} generates accurate and complete SCRIP-format gridfiles for select grid types, including uniform, capped and Gaussian rectangular latitude/longitude grids. The grids are stored in an external @var{grid-file}. All options pertinent to the grid geometry and metadata are passed to @acronym{NCO} via key-value pairs prefixed by the @samp{--rgr} option. Perhaps the two most important key-value pair arguments are The text strings that describe the grid and name the file are important aids to convey the grid geometry to other users. These arguments, and their corresponding keys, are the grid title (@var{grd_ttl}), and grid filename (@var{grid}), respectively. The numbers of latitudes (@var{lat_nbr}) and longitudes (@var{lon_nbr}) are independent, and together determine the grid storage size. These four options should be considered mandatory, although @acronym{NCO} provides defaults for any arguments omitted. The remaining arguments depend on the whether the grid is global or regional. For global grids, one should specify only two more arguments, the latitude (@var{lat_typ}) and longitude (@var{lon_typ}) grid-types. These types are chosen as described below from a small selection of options that together define the most common rectangular global grids. For regional grids, one must specify the bounding box, i.e., the edges of the rectangular grid on the North (@var{lat_nrt}), South (@var{lat_sth}), East (@var{lat_est}), and West (@var{lat_nrt}) sides. Specifying a bounding box for global grids is redundant and will cause an error to ensure the user intends a global grid. @acronym{NCO} assumes that regional grids are uniform, though it will attempt to produce regional grids of other types if the user specifies other latitude (@var{lat_typ}) and longitude (@var{lon_typ}) grid-types, e.g., Gaussian or Cap. Edges of a regional bounding box may be specified individually, or in the single-argument forms. The full description of grid-generation arguments, and their corresponding keys, is: @table @dfn @cindex @var{grd_ttl} @cindex @samp{--rgr grd_ttl=@var{grd_ttl}} @item Grid Title: @var{grd_ttl} It is surprisingly difficult to discern the geometric configuration of a grid from the coordinates of a @acronym{SCRIP}-format gridfile. A human-readable grid description should be placed in @var{grd_ttl}. Examples include ``CAM-FV scalar grid 129x256'' and ``T42 Gaussian grid''. @cindex @var{grid} @cindex @samp{--rgr grid=@var{grid}} @item Grid File: @var{grid} The grid-generation @acronym{API} was bolted-on to @acronym{NCO} and is somewhat primitive, e.g., having to repeat the @samp{--rgr} option. Another aspect of this is that the output grid filename is distinct from the output filename of the host @command{ncks} command. Specify the output gridfile name with @var{grid}, e.g., @file{t42_SCRIP.20150901.nc}. It is conventional to include a datestamp in the gridfile name. This helps users identify up-to-date and out-of-date grids. Any valid netCDF file may be named as the source (e.g., @file{in.nc}). It will not be altered. The destination file (e.g., @file{foo.nc}) will be overwritten. Its contents are immaterial. @cindex @var{lat_typ} @cindex @var{lon_typ} @cindex @samp{--rgr lon_typ=@var{lon_typ}} @cindex @samp{--rgr lat_typ=@var{lat_typ}} @item Grid Types: @var{lat_typ}, @var{lon_typ} The keys that hold the longitude and latitude gridtypes (which are, by the way, independent of eachother) are @var{lon_typ} and @var{lat_typ}. The @var{lat_typ} options for global grids are @samp{uni} for Uniform, @samp{cap} (or @samp{fv}) for Capped (equivalent to @acronym{FV}), and @samp{gss} for Gaussian. These values are all case-independent, so @samp{Gss} and @samp{gss} both work. As its name suggests, the latitudes in a Uniform-latitude grid are uniformly spaced @footnote{ A Uniform grid in latitude could be called ``equi-angular'' in latitude, but @acronym{NCO} reserves the term Equi-angular or ``eqa'' for grids that have the same uniform spacing in both latitude and longitude, e.g., 1@textdegree{}x1@textdegree{} or 2@textdegree{}x2@textdegree{}. @acronym{NCO} reserves the term Regular to refer to grids that are monotonic and rectangular grids. Confusingly, the angular spacing in a Regular grid need not be uniform, it could be irregular, such as in a Gaussian grid. The term Regular is not too useful in grid-generation, because so many other parameters (spacing, centering) are necessary to disambiuate it.}. The Uniform-latitude grid may have any number of latitudes. @acronym{NCO} can only generate longitude grids (below) that are uniformly spaced, so the Uniform-latitude grids we describe are also uniform in the 2D sense. Uniform grids are intuitive, easy to visualize, and simple to program. Hence their popularity in data exchange, visualization, and archives. Moreover, regional grids (unless they include the poles), are free of polar singularities, and thus are well-suited to storage on Uniform grids. Theoretically, a Uniform-latitude grid could have non-uniform longitudes, but @acronym{NCO} currently does not implement non-uniform longitude grids. Their mathematical properties (convergence and excessive resolution at the poles, which can appear as singularities) make Uniform grids fraught for use in global models. One purpose Uniform grids serve in modeling is as ``offset'' or ``staggered'' grids, meaning grids whose centers are the interfaces of another grid. The Finite-Volume (@acronym{FV}) method is often used to represent and solve the equations of motion in climate-related fields. Many @acronym{FV} solutions (including the popular Lin-Rood method as used in the @acronym{CESM} @acronym{CAM-FV} atmospheric model) evaluate scalar (i.e., non-vector) fields (e.g., temperature, water vapor) at gridcell centers of what is therefore called the scalar grid. @acronym{FV} methods (like Lin-Rood) that employ an Arakawa C-grid or D-grid formulation define velocities on the edges of the scalar grid. This @acronym{CAM-FV} velocity grid is therefore ``staggered'' or ``offset'' from the @acronym{CAM-FV} scalar grid by one-half gridcell. The @acronym{CAM-FV} scalar latitude grid has gridpoints (the ``caps'') centered on each pole to avoid singularities. The offset of a Cap-grid is a Uniform-grid, so the Uniform grid is often called an @acronym{FV}-''offset'' or ``staggered'' grid. Hence an @acronym{NCO} Uniform grid is equivalent to an @acronym{NCL} ``Fixed Offset'' grid. For example, a 128x256 Uniform grid is the offset or staggered version of a 129x256 Cap grid (aka @acronym{FV}-grid). Referring the saucer-like cap-points at the poles, @acronym{NCO} uses the term ``Cap grid'' to describe the latitude portion of the @acronym{FV}-scalar grid as used by the @acronym{CAM-FV} Lin-Rood dynamics formulation. @acronym{NCO} accepts the shorthand @acronym{FV}, and the more descriptive ``Yarmulke'', as synonyms for Cap. A Cap-latitude grid differs from a Uniform-latitude grid in many ways: Most importantly, Cap grids are 2D-representations of numerical grids with cap-midpoints instead of zonal-teeth convergence at the poles. The rectangular 2D-representation of each cap contains gridcells shaped like sharp teeth that converge at the poles similar to the Uniform grid, but the Cap gridcells are meant to be aggregated into a single cell centered at the pole in a dynamical transport algorithm. In other words, the polar teeth are a convenient way to encode a non-rectangular grid in memory into a rectangular array on disk. Hence Cap grids have the unusual property that the poles are labeled as being both the centers and the outer interfaces of all polar gridcells. Second, Cap grids are uniform in angle except at the poles, where the latitudes span half the meridional range of the rest of the gridcells. Even though in the host dynamical model the Cap grid polar points are melded into caps uniform (in angle) with the rest of the grid, the disk representation on disk is not uniform. Nevertheless, some call the Cap grid a uniform-angle grid because the information contained at the poles is aggregated in memory to span twice the range of a single polar gridcell (which has half the normal width). The @acronym{NCL} uses the term ``Fixed grid'' for a Cap grid. The ``Fixed'' terminology seems broken. Finally, Gaussian grids are the Cartesian representation of global spectral transform models. Gaussian grids do not have points at the poles, and must have an even number of latitudes. All three latitude grid-type supported by @acronym{NCO} (Uniform, Cap, and Gaussian) are Regular grids in that they are monotonic. The @var{lon_typ} options for global grids are @samp{grn_ctr} and @samp{180_ctr} for the first gridcell centered at Greenwich or @w{180 degrees}, respecitvely. And @samp{grn_wst} and @samp{180_wst} for Greenwich or @w{180 degress} lying on the western edge of the first gridcell. Many global models use the @samp{grn_ctr} longitude grid as their ``scalar grid'' (where, e.g., temperature, humidity, and other scalars are defined). The ``staggered'' or ``offset'' grid (where often the dynamics variables are defined) then must have the @samp{grn_wst} longitude convention. That way the centers of the scalar grid are the vertices of the offset grid, and visa versa. @cindex @var{lat_nbr} @cindex @var{lon_nbr} @cindex @samp{--rgr latlon=@var{lat_nbr},@var{lon_nbr}} @cindex @samp{--rgr lon_nbr=@var{lon_nbr}} @cindex @samp{--rgr lat_nbr=@var{lat_nbr}} @item Grid Resolution: @var{lat_nbr}, @var{lon_nbr} The number of gridcells in the horizontal spatial dimensions are @var{lat_nbr} and @var{lon_nbr}, respectively. There are no restrictions on @var{lon_nbr} for any gridtype. Latitude grids do place some restrictions on @var{lat_nbr} (see above). As of @acronym{NCO} @w{version 4.5.3}, released in October, 2015, the @samp{--rgr latlon=@var{lat_nbr},@var{lon_nbr}} switch may be used to simultaneously specify both latitude and longitude, e.g., @samp{--rgr latlon=180,360}. @cindex @var{lat_nrt} @cindex @var{lat_sth} @cindex @var{lat_est} @cindex @var{lat_wst} @cindex @var{wesn} @cindex @var{snwe} @cindex @samp{--rgr wesn=@var{lon_wst},@var{lon_est},@var{lat_sth},@var{lon_nrt}} @cindex @samp{--rgr snwe=@var{lat_sth},@var{lat_nrt},@var{lon_wst},@var{lon_est}} @cindex @samp{--rgr lat_nrt=@var{lat_nrt}} @cindex @samp{--rgr lat_nbr=@var{lat_nbr}} @item Grid Edges: @var{lon_wst}, @var{lon_est}, @var{lat_sth}, @var{lat_nrt} The outer edges of a regional rectangular grid are specified by the North (@var{lat_nrt}), South (@var{lat_sth}), East (@var{lat_est}), and West (@var{lat_nrt}) sides. Latitudes and longigudes must be specified in degrees (not radians). Latitude edges must be between @w{-90 and 90}. Longitude edges may be positive or negative and separated by no more than 360 degrees. The edges may be specified individually with four arguments, or together in one list to the options @samp{wesn} or @samp{snwe}. These two specifications are equivalent: @example @verbatim ncks ... --rgr lat_sth=30.0 --rgr lat_nrt=70.0 --rgr lon_wst=-120.0 --rgr lon_est=-90.0 ... ncks ... --rgr snwe=30.0,70.0,-120.0,-90.0 ... @end verbatim @end example @end table Generating common grids: @example @verbatim # 180x360 (1x1 degree) Equi-Angular grid, first longitude centered at Greenwich ncks --rgr grd_ttl='Equi-Angular grid 180x360' --rgr grid=${DATA}/grids/180x360_SCRIP.20150901.nc \ --rgr latlon=180,360 --rgr lat_typ=uni --rgr lon_typ=grn_ctr ~zender/nco/data/in.nc ~/foo.nc # 129x256 CAM-FV grid, first longitude centered at Greenwich ncks --rgr grd_ttl='CAM-FV scalar grid 129x256' --rgr grid=${DATA}/grids/129x256_SCRIP.20150901.nc \ --rgr latlon=129,256 --rgr lat_typ=fv --rgr lon_typ=grn_ctr ~zender/nco/data/in.nc ~/foo.nc # 128x256 Equi-Angular grid, Greenwich west edge of first longitude # This is the CAM-FV offset grid for the 129x256 CAM-FV scalar grid above ncks --rgr grd_ttl='Equi-Angular grid 128x256' --rgr grid=${DATA}/grids/128x256_SCRIP.20150901.nc \ --rgr latlon=128,256 --rgr lat_typ=uni --rgr lon_typ=grn_wst ~zender/nco/data/in.nc ~/foo.nc # T42 Gaussian grid, first longitude centered at Greenwich ncks --rgr grd_ttl='T42 Gaussian grid' --rgr grid=${DATA}/grids/t42_SCRIP.20150901.nc \ --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr ~zender/nco/data/in.nc ~/foo.nc @end verbatim @end example @html @end html @cindex infer @cindex @code{--rgr nfr} Often researchers face the problem not of generating a known, idealized grid but of understanding an unknown, possibly irregular or curvilinear grid underlying a dataset produced elsewhere. @acronym{NCO} will @dfn{infer} the grid of a datafile by examining its coordinates (and boundaries, if available), reformat that information as necessary to diagnose gridcell areas, and output the results in @acronym{SCRIP} format. As of @acronym{NCO} @w{version 4.5.3}, released in October, 2015, the @samp{--rgr nfr='y'} switch activates the machinery to infer the grid rather than construct the grid from other user-specified switches. To infer the grid properties, @acronym{NCO} interrogates @var{input-file} for horizontal coordinate information, such as the presence of dimension names rooted in latitude/longitude-naming traditions and conventions. Once @acronym{NCO} identifies the likely horizontal dimensions it looks for horizontal coordinates and bounds. If bounds are not found, @acronym{NCO} assumes the underlying grid comprises quadrilateral cells whose edges are midway between cell centers, for both rectilinear and curvilinear grids. @example @verbatim # Infer the grid of the AIRS swath from input, write it to grd_airs.nc ncks --rgr nfr=y --rgr grid=${DATA}/sld/rgr/grd_airs.nc \ ${DATA}/sld/raw/AIRS.2014.10.01.202.L2.TSurfStd.Regrid010.1DLatLon.nc ~/foo.nc @end verbatim @end example When inferring grids, the grid file (@file{grd_airs.nc}) is written, the input file (@file{AIRS...nc}) is read, and the output file (@file{foo.nc}) is overwritten (its contents are immaterial). @html @end html @cindex skeleton @cindex @code{--rgr skl} Another task that arises in regridding is characterizing new grids. In such cases it can be helpful to have a ``skeleton'' version of a dataset on the grid, so that grid center and interfaces locations can be assessed, continental outlines can be examined, or the skeleton can be manually populated with data rather than relying on a model. @acronym{SCRIP} files can be difficult to visualize and manipulate, so @acronym{NCO} will provide, if requested, a so-called skeleton file on the user-specified grid. As of @acronym{NCO} @w{version 4.5.3}, released in October, 2015, the @samp{--rgr skl=@var{fl_skl}} switch outputs the skeleton file to @var{fl_skl}. The skeleton file may then be examined in a dataset viewer, populated with data, and generally serve as a template for what to expect from datasets of the same geometry. @example @verbatim # Generate T42 Gaussian grid file t42_SCRIP.nc and skeleton file t42_skl.nc ncks --rgr skl=${DATA}/grids/t42_skl.nc --rgr grid=${DATA}/grids/t42_SCRIP.nc \ --rgr latlon=64,128 --rgr lat_typ=gss --rgr lon_typ=Grn_ctr \ ~zender/nco/data/in.nc ~/foo.nc @end verbatim @end example When generating skeleton files, both the grid file (@file{t42_SCRIP.nc}) and the skeleton file (@file{t42_skl.nc}) are written, the input file (@file{in.nc}) is ignored, and the output file (@file{foo.nc}) is overwritten (its contents are immaterial). @html @end html @node Regridding, UDUnits Support, Grid Generation, Shared features @section Regridding @cindex map @cindex regridding @cindex @code{--map} @cindex @acronym{ESMF} @cindex @acronym{SCRIP} @cindex OpenMP @cindex @code{--rgr @var{key}=@var{val}} @cindex @code{--rgr_map} @cindex @var{--map-file} @cartouche Availability: @command{ncks}, @command{ncremap}@* Short options: None@* Long options: @samp{--map @var{map-file}} or @samp{--rgr_map @var{map-file}}@* @samp{--rgr @var{key}=@var{val}} (multiple invocations allowed)@* @samp{--rnr=@var{wgt_thr}} or @samp{--rgr_rnr=@var{wgt_thr}} or @samp{--renormalize=@var{wgt_thr}}@* @end cartouche As of @acronym{NCO} version 4.5.0 (June, 2015), @command{ncks} supports horizontal regridding of global datasets where the grids and weights are all stored in an external @var{map-file}. Use the @samp{--map} or @samp{--rgr_map} options to specify the @var{map-file}, and @acronym{NCO} will regrid the @var{input-file} to a new (or possibly the same, aka, an identity mapping) horizontal grid in the @var{output-file}, using the input and output grids and mapping weights specified in the @acronym{ESMF}- or @acronym{SCRIP}-format @var{map-file}. Currently @acronym{NCO} understands only the mapfile format pioneered by @acronym{SCRIP} (@url{http://oceans11.lanl.gov/svn/SCRIP/trunk/SCRIP}) and later extended by @acronym{ESMF} (@uref{http://www.earthsystemcog.org/projects/regridweightgen}), and adopted by Tempest (@uref{https://github.com/ClimateGlobalChange/tempestremap.git}). See those references for documentation on map formats, grid specification, and weight generation. The regridding currently supported by @acronym{NCO} could equally well be called weight-application. @acronym{NCO} reads-in pre-stored weights from the @var{map-file} and applies them to (almost) every variable, thereby creating a regridded @var{output-file}. Specify regridding with a standard @command{ncks} command and options along with the additional specification of a @var{map-file}: @example @verbatim # Regrid entire file, same output format as input: ncks --map=map.nc in.nc out.nc # Entire file, netCDF4 output: ncks -4 --map=map.nc in.nc out.nc # Deflated netCDF4 output ncks -4 -L 1 --map=map.nc in.nc out.nc # Selected variables ncks -v FS.?,T --map=map.nc in.nc out.nc # Threading ncks -t 8 --map=map.nc in.nc out.nc # Deflated netCDF4 output, threading, selected variables: ncks -4 -L 1 -t 8 -v FS.?,T --map=map.nc in.nc out.nc @end verbatim @end example OpenMP threading works well with regridding large datasets. Threading improves throughput of regridding @w{1--10 GB} files by factors of 2--5. Options specific to regridding are described below. @cindex equiangular grid @cindex Gaussian grid @cindex cubed-sphere grid @cindex @acronym{FV} grid @acronym{NCO} supports 1D@result{}1D, 1D@result{}2D, 2D@result{}1D, and 2D@result{}2D regridding for any unstructured 1D-grid and any rectangular 2D-grid. This has been tested by converting among and between Gaussian, equiangular, @acronym{FV}, unstructured cubed-sphere grids, and regionally refined grids. Support for irregular 2D- and regional grids (e.g., swath-like data) is planned. @html @end html @cindex conservative regridding @cindex renormalized regridding @cindex missing values @cindex data, missing @cindex @code{missing_value} @cindex @code{_FillValue} @cindex @code{--rnr} @cindex @code{--renormalize} @cindex @code{--rgr_rnr} First-order-accurate data regridding is a straightforward procedure of identifying gridcell overlap and apportioning values correctly from source to destination. The presence of missing values forces a decision on how to handle destination gridcells where some but not all source cells are valid. @acronym{NCO} allows the user to choose between two distinct algorithms: ``conservative'' and ``renormalized''. The ``conservative'' algorithm uses all valid data from the input grid on the output grid once and only once. Destination cells receive the weighted valid values of the source cells. This is conservative because the global integrals of the source and destination fields are equal. The ``renormalized'' algorithm divides the destination value by the sum of the valid weights. This produces values equal to the mean of the valid input values, but extended to the entire destination gridcell. Thus renormalization is equivalent to extrapolating valid data to missing regions. Input and output integrals are unequal and renormalized regridding is not conservative. Both algorithms produce identical answers when no missing data maps to the destination gridcell. @cindex @var{wgt_thr} By default, @acronym{NCO} implements the ``conservative'' algorithm because it has useful properties, is simpler to understand, and requires no additional parameters. To employ the ``renormalized'' algorithm instead, use the @samp{--rnr}, @samp{--rgr_rnr}, or @samp{--renormalize} options to supply @var{wgt_thr}, the threshold weight for valid destination values. Valid values must cover at least the fraction @var{wgt_thr} of the destination gridcell to meet the threshold for a non-missing destination value. When @var{wgt_thr} is exceeded, the mean valid value is renormalized by the valid area and placed in the destination gridcell. If the valid area covers less than @var{wgt_thr}, then the destination gridcell is assigned the missing value. Valid values of @var{wgt_thr} range from zero to one. Keep in mind though, that this threshold is potentially a divisor, and values of zero or very near to zero can lead to floating-point underflow and divide-by-zero errors. For convenience @acronym{NCO} permits users to specify a @math{@var{wgt_thr} = 0.0} threshold weight. This indicates that any valid data should be represented and renormalized on the output grid. @example @verbatim ncks --map=map.nc in.nc out.nc # Conservative regridding ncks --rnr=0.1 --map=map.nc in.nc out.nc # Renormalized regridding @end verbatim @end example The first example uses the default conservative algorithm. The second example specifies that valid values must cover at least 10% of the destination gridcell to meet the threshold for a non-missing destination value. For a valid destination area of, say 25%, the renormalized algorithm produces a destination value four-times greater than the conservative algorithm. @acronym{NCO} automatically annotates the output with relevant metadata such as coordinate bounds, axes, and vertices (@w{@`{a} la} @acronym{CF}). These annotations include @table @dfn @cindex @var{lat_nm} @cindex @var{lon_nm} @cindex @samp{--rgr lon_nm=@var{lon_nm}} @cindex @samp{--rgr lat_nm=@var{lat_nm}} @item Horizontal Dimension Names: @var{lat}, @var{lon} The name of the horizontal spatial dimensions assumed to represent latitude and longitude in 2D rectangular input files are @var{lat_nm} and @var{lon_nm}, which default to @code{lat} and @code{lon}, respectively. Variables that contain a @var{lat_nm}-dimension and a @var{lon_nm}-dimension on a 2D-rectangular input grid will be regridded, and variables regridded to a 2D-rectangular output grid will all contain the @var{lat_nm}- and @var{lon_nm}-dimensions, and variables regridded to a 1D-unstructured output grid will have @var{lat_nm} and @var{lon_nm} as auxiliary coordinate variables. To treat different dimensions and variables as latitude and longitude, use the options @samp{--rgr lat_nm=@var{lat_nm}} and @samp{--rgr lon_nm=@var{lon_nm}}. Note that, for now at least, @var{lat_nm} and @var{lon_nm} indicate both the variable names associated @emph{and}, where applicable (i.e., on 2D-grids), the dimensions of the horizontal coordinates. @cindex @code{ncol} @cindex @var{col_nm} @cindex @samp{--rgr col_nm=@var{col_nm}} @item Unstructured Dimension Name: @var{col} The name of the horizontal spatial dimension assumed to delineate an unstructured grid is @var{col_nm}, which defaults to @code{ncol} (number of columns), the name @acronym{CAM} employs. Other common names for the columns in an unstructured grid include @code{lndgrid} (used by @acronym{CLM}), and @code{nCells} (used by @acronym{MPAS-O}). Variables that contain the @var{col_nm}-dimension on an unstructured input grid will be regridded, and regridded variables written to an unstructured output grid will all contain the @var{col_nm}-dimension. To treat a different dimension as unstructured, use the option @samp{--rgr col_nm=@var{col_nm}}. Note: Often there is no coordinate variable for the @var{col_nm}-dimension, i.e., there is no variable named @var{col_nm}, although such a coordinate could contain useful information about the unstructured grid. @cindex @acronym{CF} @cindex @code{latitude} @cindex @code{longitude} @cindex @code{axes} @cindex @code{standard_name} @cindex @code{degrees_east} @cindex @code{degrees_north} @cindex @code{units} @cindex @code{X} axis @cindex @code{Y} axis @cindex auxiliary coordinates @item Structured Grid Standard Names and Units Longitude and latitude coordinates (both regular and auxiliary, i.e., for unstructured grids) receive @acronym{CF} @code{standard_name} values of @code{latitude} and @code{longitude}, @acronym{CF} @code{axes} attributes with values @code{X} and @code{Y}, and @code{units} attributes with values @code{degrees_east} and @code{degrees_north}, respectively. @cindex @code{lat} @cindex @code{lon} @item Unstructured Grid Auxiliary Coordinates Unstructured grid auxiliary coordinates for longitude and latitude receive @acronym{CF} @code{coordinates} attributes with values @code{lon} and @code{lat}, respectively. @cindex @code{lon_bnds} @cindex @code{lat_bnds} @cindex @code{nbnd} @cindex @code{time_bnds} @cindex @var{lat_bnd_nm} @cindex @var{lon_bnd_nm} @cindex @samp{--rgr lat_bnd_nm=@var{lat_bnd_nm}} @cindex @samp{--rgr lon_bnd_nm=@var{lon_bnd_nm}} @item Structured Grid Bounds Variables: @var{bnd}, @var{lat_bnd}, @var{lon_bnd} Structured grids with 1D-coordinates use the dimension @var{bnd_nm} (which defaults to @code{nbnd}) with the spatial bounds variables in @var{lat_bnd_nm} and @var{lon_bnd_nm} which default to @code{lon_bnds} and @code{lat_bnds}, respectively. By default spatial bounds for such structured grids parallel the oft-used temporal bounds dimension (@code{nbnd=2}) and variable (@code{time_bnds}). Bounds are attached to the horizontal spatial dimensions via their @code{bounds} attributes. Change the spatial bounds dimension with the option @samp{--rgr bnd_nm=@var{bnd_nm}}. Rename the spatial bounds variables with the options @samp{--rgr lat_bnd_nm=@var{lat_bnd_nm}} and @samp{--rgr lon_bnd_nm=@var{lon_bnd_nm}}. @cindex @code{lat_vertices} @cindex @code{lon_vertices} @cindex @code{nv} @cindex @code{bounds} @item Unstructured Grid Bounds Variables: @var{bnd}, @var{lat_bnd}, @var{lon_bnd} Unstructured grids with 1D-coordinates use the dimension @var{bnd_nm} (which defaults to @code{nv}, number of vertices) for the spatial bounds variables @var{lat_bnd_nm} and @var{lon_bnd_nm} which default to @code{lat_vertices} and @code{lon_vertices}, respectively. It may be impossible to re-use the temporal bounds dimension (often @code{nbnd}) for unstructure grids, because the gridcells are not rectangles, and thus require specification of all vertices for each gridpoint, rather than only two parallel interfaces per dimension. These bounds are attached to the horizontal spatial dimensions via their @code{bounds} attributes. Change the spatial bounds dimension with the option @samp{--rgr bnd_nm=@var{bnd_nm}}. Rename the spatial bounds variables with the options @samp{--rgr lat_bnd_nm=@var{lat_bnd_nm}} and @samp{--rgr lon_bnd_nm=@var{lon_bnd_nm}}. The temporal bounds dimension in unstructured grid output remains as in the @var{input-file}, usually @code{nbnd}. @cindex @code{area} @cindex @code{cell_methods} @cindex @code{cell_area} @cindex @code{steradian} @cindex @samp{--rgr area_nm=@var{area_nm}} @cindex @var{area_nm} @cindex @acronym{SI} @cindex solid angle @cindex extensive variable @item Gridcell Area: @var{area} The variable @var{area_nm} (which defaults to @code{area}) is always (re-)created in the @var{output_file} to hold the gridcell area in steradians. To store the area in a different variable, use the option @samp{--rgr area=@var{area_nm}}. The @var{area_nm} variable receives a @code{standard_name} attribute of @code{cell_area}, a @code{units} attribute of @code{steradian} (the @acronym{SI} unit of solid angle), and a @code{cell_methods} attribute with value @code{lat, lon: sum}, which indicates that @var{area_nm} is @dfn{extensive}, meaning that its value depends on the gridcell boundaries. Since @var{area_nm} is a property of the grid, it is read directly from the @var{map-file} rather than regridded itself. @cindex @code{frc} @cindex @samp{--rgr frc_nm=@var{frc_nm}} @cindex @var{frc_nm} @cindex extensive variable @item Gridcell Fraction: @var{frc} The variable @var{frc_nm} (which defaults to @code{frac_b}) is automatically copied to the @var{output_file} to hold the valid fraction of each gridcell when certain conditions are met. First, the regridding method must be conservative. Second, at least one value of @var{frc_nm} must be non-unity. These conditions ensure that whenever fractional gridcells affect the regridding, they are also placed in the output file. To store the fraction in a different variable, use the option @samp{--rgr frc_nm=@var{frc_nm}}. The @var{frc_nm} variable receives a @code{cell_methods} attribute with value @code{lat, lon: sum}, which indicates that @var{frc_nm} is @dfn{extensive}, meaning that its value depends on the gridcell boundaries. Since @var{frc_nm} is a property of the grid, it is read directly from the @var{map-file} rather than regridded itself. @cindex @code{gw} @cindex @samp{--rgr lat_weight=@var{lat_wgt_nm}} @cindex @var{lat_wgt_nm} @cindex Gaussian weight @item Latitude weights: @var{lat_wgt} Rectangular 2D-grids use the variable @var{lat_wgt_nm}, which defaults to @code{gw} (originally for ``Gaussian weight''), to store the 1D-weight appropriate for area-weighting the latitude grid. To store the latitude weight in a different variable, use the option @samp{--rgr lat_wgt=@var{lat_wgt_nm}}. The @var{lat_wgt_nm} variable will not appear in 1D-grid output. Weighting statistics by latitude (i.e., by @var{lat_wgt_nm} will produce the same answers (up-to round-off error) as weighting by area (i.e., by @var{area_nm}) in grids that have both variables. The former requires less memory because @var{lat_wgt_nm} is 1D), whereas the latter is more general because @var{area_nm} works on @emph{any} grid. @cindex @code{mapping_file} @cindex @code{source_file} @item Provenance Attributes The @var{map-file} and @var{input-file} names are stored in the @var{output-file} global attributes @code{mapping_file} and @code{source_file}, respectively. @end table One may supply muliple @samp{--rgr @var{key}=@var{value}} options to simultaneously customize multiple grid-field names. The following examples may all be assumed to end with the standard options @samp{--map=map.nc in.nc out.nc}. @example @verbatim ncks --rgr lat_nm=latitude --rgr lon_nm=longitude ncks --rgr col_nm=column --rgr lat_wgt=lat_wgt ncks --rgr bnd_nm=bounds --rgr lat_bnd_nm=lat_bounds --rgr lon_bnd_nm=lon_bounds ncks --rgr bnd_nm=vertices --rgr lat_bnd_nm=lat_vrt --rgr lon_bnd_nm=lon_vrt @end verbatim @end example The first command causes the regridder to associate the latitude and longitude dimensions with the dimension names @code{latitude} and @code{longitude} (instead of the defaults, @code{lat} and @code{lon}). The second command causes the regridder to associate the independent columns in an unstructured grid with the dimension name @code{column} (instead of the default, @code{ncol}) and the variable containing latitude weights to be named @code{lat_wgt} (instead of the default, @code{gw}). The third command associates the latitude and longitude bounds with the dimension @code{bounds} (instead of the default, @code{nbnd}) and the variables @code{lat_bounds} and @code{lon_bounds} (instead of the defaults, @code{lat_bnds} and @code{lon_bnds}, respectively). The fourth command associates the latitude and longitude bounds with the dimension @code{vertices} (instead of the default, @code{nv}) and the variables @code{lat_vrt} and @code{lon_vrt} (instead of the defaults, @code{lat_vertices} and @code{lon_vertices}, respectively). When used with an identity remapping files, regridding can signficantly enhance the metadata and therefore the dataset usability. Consider these selected metadata (those unchanged are not shown for brevity) associated with the variable @code{FSNT} from typical unstructured grid (@acronym{CAM-SE} cubed-sphere) output before and after an identity regridding: @example @verbatim # Raw model output before regridding netcdf ne30_FSNT { dimensions: nbnd = 2 ; ncol = 48602 ; time = UNLIMITED ; // (1 currently) variables: float FSNT(time,ncol) ; FSNT:long_name = "Net solar flux at top of model" ; double time(time) ; time:long_name = "time" ; time:bounds = "time_bnds" ; double time_bnds(time,nbnd) ; time_bnds:long_name = "time interval endpoints" ; } // group / # Same model output after identity regridding netcdf dogfood { dimensions: nbnd = 2 ; ncol = 48602 ; nv = 5 ; time = 1 ; variables: float FSNT(time,ncol) ; FSNT:long_name = "Net solar flux at top of model" ; FSNT:coordinates = "lat lon" ; double lat(ncol) ; lat:long_name = "latitude" ; lat:standard_name = "latitude" ; lat:units = "degrees_north" ; lat:axis = "Y" ; lat:bounds = "lat_vertices" ; lat:coordinates = "lat lon" ; double lat_vertices(ncol,nv) ; lat_vertices:long_name = "gridcell latitude vertices" ; double lon(ncol) ; lon:long_name = "longitude" ; lon:standard_name = "longitude" ; lon:units = "degrees_east" ; lon:axis = "X" ; lon:bounds = "lon_vertices" ; lon:coordinates = "lat lon" ; double lon_vertices(ncol,nv) ; lon_vertices:long_name = "gridcell longitude vertices" ; double time(time) ; time:long_name = "time" ; time:bounds = "time_bnds" ; double time_bnds(time,nbnd) ; time_bnds:long_name = "time interval endpoints" ; } // group / @end verbatim @end example The raw model output lacks the @acronym{CF} @code{coordinates} and @code{bounds} attributes that the regridder adds. The metadata turns @code{lat} and @code{lon} into auxiliary coordinate variables (@pxref{Auxiliary Coordinates}) which can then be hyperslabbed (with @samp{-X}) using latitude/longitude coordinates bounding the region of interest: @example @verbatim % ncks -u -H -X 314.6,315.3,-35.6,-35.1 -v FSNT dogfood.nc time[0]=31 ncol[0] FSNT[0]=344.575 W/m2 ncol[0] lat[0]=-35.2643896828 degrees_north ncol[0] nv[0] lat_vertices[0]=-35.5977213708 ncol[0] nv[1] lat_vertices[1]=-35.5977213708 ncol[0] nv[2] lat_vertices[2]=-35.0972113817 ncol[0] nv[3] lat_vertices[3]=-35.0972113817 ncol[0] nv[4] lat_vertices[4]=-35.0972113817 ncol[0] lon[0]=315 degrees_east ncol[0] nv[0] lon_vertices[0]=315 ncol[0] nv[1] lon_vertices[1]=315 ncol[0] nv[2] lon_vertices[2]=315.352825437 ncol[0] nv[3] lon_vertices[3]=314.647174563 ncol[0] nv[4] lon_vertices[4]=314.647174563 time[0]=31 days since 1979-01-01 00:00:00 time[0]=31 nbnd[0] time_bnds[0]=0 time[0]=31 nbnd[1] time_bnds[1]=31 @end verbatim @end example Thus auxiliary coordinate variables help to structure unstructured grids. The expanded metadata annotations from an identity regridding may obviate the need to place unstructured data on a rectangular grid. For example, statistics for regions that can be expressed as unions of rectangular regions can now be performed on the native (unstructured) grid. Here are some quick examples of regridding from common models. All examples require @samp{in.nc out.nc} at the end. @example @verbatim # Identity re-map ACME CAM-SE Cubed-Sphere output (to improve metadata) ncks --map=${DATA}/maps/map_ne30np4_to_ne30np4_aave.20150603.nc # Convert ACME CAM-SE Cubed Sphere output to rectangular lat/lon ncks --map=${DATA}/maps/map_ne30np4_to_fv129x256_aave.150418.nc # Convert CAM3 T42 output to Cubed-Sphere grid ncks --map=${DATA}/maps/map_ne30np4_to_t42_aave.20150601.nc @end verbatim @end example @html @end html @node UDUnits Support, Rebasing Time Coordinate, Regridding, Shared features @section UDUnits Support @cindex UDUnits @cindex Unidata @cindex @code{units} @cindex attribute, @code{units} @cindex @code{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cindex @code{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* Long options: @samp{--dimension @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]},@* @samp{--dmn @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]}@* @end cartouche There is more than one way to hyperskin a cat. The @uref{http://www.unidata.ucar.edu/packages/udunits, UDUnits} package provides a library which, if present, @acronym{NCO} uses to translate user-specified physical dimensions into the physical dimensions of data stored in netCDF files. Unidata provides UDUnits under the same terms as netCDF, so sites should install both. Compiling @acronym{NCO} with UDUnits support is currently optional but may become required in a future version of @acronym{NCO}. Two examples suffice to demonstrate the power and convenience of UDUnits support. @cindex MKS units First, consider extraction of a variable containing non-record coordinates with physical dimensions stored in MKS units. In the following example, the user extracts all wavelengths in the visible portion of the spectrum in terms of the units very frequently used in visible spectroscopy, microns: @example % ncks -C -H -v wvl -d wvl,"0.4 micron","0.7 micron" in.nc wvl[0]=5e-07 meter @end example @noindent @cindex @code{units} The hyperslab returns the correct values because the @var{wvl} variable is stored on disk with a length dimension that UDUnits recognizes in the @code{units} attribute. The automagical algorithm that implements this functionality is worth describing since understanding it helps one avoid some potential pitfalls. First, the user includes the physical units of the hyperslab dimensions she supplies, separated by a simple space from the numerical values of the hyperslab limits. She encloses each coordinate specifications in quotes so that the shell does not break the @emph{value-space-unit} string into separate arguments before passing them to @acronym{NCO}. Double quotes (@kbd{"foo"}) or single quotes (@kbd{'foo'}) are equally valid for this purpose. Second, @acronym{NCO} recognizes that units translation is requested because each hyperslab argument contains text characters and non-initial spaces. Third, @acronym{NCO} determines whether the @var{wvl} is dimensioned with a coordinate variable that has a @code{units} attribute. @cindex coordinate variable In this case, @var{wvl} itself is a coordinate variable. The value of its @code{units} attribute is @code{meter}. Thus @var{wvl} passes this test so UDUnits conversion is attempted. If the coordinate associated with the variable does not contain a @code{units} attribute, then @acronym{NCO} aborts. Fourth, @acronym{NCO} passes the specified and desired dimension strings (microns are specified by the user, meters are required by @acronym{NCO}) to the UDUnits library. Fifth, the UDUnits library that these dimension are commensurate and it returns the appropriate linear scaling factors to convert from microns to meters to @acronym{NCO}. If the units are incommensurate (i.e., not expressible in the same fundamental MKS units), or are not listed in the UDUnits database, then NCO aborts since it cannot determine the user's intent. Finally, @acronym{NCO} uses the scaling information to convert the user-specified hyperslab limits into the same physical dimensions as those of the corresponding cooridinate variable on disk. At this point, @acronym{NCO} can perform a coordinate hyperslab using the same algorithm as if the user had specified the hyperslab without requesting units conversion. @cindex @code{units} @cindex @code{time} The translation and dimensional innterpretation of time coordinates shows a more powerful, and probably more common, UDUnits application. In this example, the user prints all data between @w{4 PM} and @w{7 PM} on @w{December 8}, 1999, from a variable whose time dimension is hours since the year 1900: @example % ncks -u -H -C -v time_udunits -d time_udunits,"1999-12-08 \ 16:00:0.0","1999-12-08 19:00:0.0" in.nc time_udunits[1]=876018 hours since 1900-01-01 00:00:0.0 @end example @noindent @cindex stride @cindex whitespace Here, the user invokes the stride (@pxref{Stride}) capability to obtain every other timeslice. This is possible because the UDUnits feature is additive, not exclusive---it works in conjunction with all other hyperslabbing (@pxref{Hyperslabs}) options and in all operators which support hyperslabbing. The following example shows how one might average data in a time period spread across multiple input files @example ncra -d time,"1939-09-09 12:00:0.0","1945-05-08 00:00:0.0" \ in1.nc in2.nc in3.nc out.nc @end example @noindent Note that there is no excess whitespace before or after the individual elements of the @samp{-d} argument. @cindex shell This is important since, as far as the shell knows, @samp{-d} takes only @emph{one} command-line argument. Parsing this argument into its component @code{@var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]]} elements (@pxref{Hyperslabs}) is the job of @acronym{NCO}. When unquoted whitespace is present between these elements, the shell passes @acronym{NCO} arugment fragments which will not parse as intended. @acronym{NCO} implemented support for the UDUnits2 library with version 3.9.2 (August, 2007). The @uref{http://www.unidata.ucar.edu/software/udunits/udunits-2/udunits2.html, UDUnits2} package supports non-ASCII characters and logarithmic units. We are interested in user-feedback on these features. One aspect that deserves mention is that UDUnits, and thus @acronym{NCO}, supports run-time definition of the location of the relevant UDUnits databases. With UDUnits @w{version 1}, users may specify the directory which contains the UDUnits database, @file{udunits.dat}, via the @code{UDUNITS_PATH} environment variable. With UDUnits @w{version 2}, users may specify the UDUnits database file itself, @file{udunits2.xml}, via the @code{UDUNITS2_XML_PATH} environment variable. @example # UDUnits1 export UDUNITS_PATH='/unusual/location/share/udunits' # UDUnits2 export UDUNITS2_XML_PATH='/unusual/location/share/udunits/udunits2.xml' @end example This run-time flexibility can enable the full functionality of pre-built binaries on machines with libraries in different locations. @cindex Climate and Forecast Metadata Convention @cindex @acronym{CF} conventions The @uref{http://www.unidata.ucar.edu/packages/udunits, UDUnits} package documentation describes the supported formats of time dimensions. Among the metadata conventions that adhere to these formats are the @uref{http://cf-pcmdi.llnl.gov, Climate and Forecast (CF) Conventions} and the @uref{http://ferret.wrc.noaa.gov/noaa_coop/coop_cdf_profile.html, Cooperative Ocean/Atmosphere Research Data Service (COARDS) Conventions}. The following @samp{-d arguments} extract the same data using commonly encountered time dimension formats: @c fxm add more formats here @example -d time,'1918-11-11 00:00:0.0','1939-09-09 00:00:0.0' -d time,'1918-11-11 00:00:0.0','1939-09-09 00:00:0.0' -d time,'1918-11-11T00:00:0.0Z','1939-09-09T00:00:0.0Z' -d time,'1918-11-11','1939-09-09' -d time,'1918-11-11','1939-9-9' @end example @noindent All of these formats include at least one dash @kbd{-} in a non-leading character position (a dash in a leading character position is a negative sign). @acronym{NCO} assumes that a space, colon, or non-leading dash in a limit string indicates that a UDUnits units conversion is requested. Some date formats like YYYYMMDD that are valid in UDUnits are ambiguous to @acronym{NCO} because it cannot distinguish a purely numerical date (i.e., no dashes or text characters in it) from a coordinate or index value: @example -d time,1918-11-11 # Interpreted as the date November 11, 1918 -d time,19181111 # Interpreted as time-dimension index 19181111 -d time,19181111. # Interpreted as time-coordinate value 19181111.0 @end example Hence, use the YYYY-MM-DD format rather than YYYYMMDD for dates. @noindent As of version 4.0.0 (January, 2010), @acronym{NCO} supports some calendar attributes specified by the @acronym{CF} conventions. @table @asis @item @strong{Supported types:} "365_day"/"noleap", "360_day", "gregorian", "standard" @item @strong{Unsupported types:} "366_day"/"all_leap","proleptic_gregorian","julian","none" @end table Unsupported types default to mixed Gregorian/Julian as defined by UDUnits. @noindent An Example: Consider the following netCDF variable @example variables: double lon_cal(lon_cal) ; lon_cal:long_name = "lon_cal" ; lon_cal:units = "days since 1964-2-28 0:0:0" ; lon_cal:calendar = "365_day" ; data: lon_cal = 1,2,3,4,5,6,7,8,9,10; @end example @samp{ncks -v lon_cal -d lon_cal,'1964-3-1 0:00:0.0','1964-3-4 00:00:0.0'} results in @code{lon_cal=1,2,3,4}. @cindex MKS units @cindex God netCDF variables should always be stored with MKS (i.e., God's) units, so that application programs may assume MKS dimensions apply to all input variables. The UDUnits feature is intended to alleviate some of the @acronym{NCO} user's pain when handling MKS units. It connects users who think in human-friendly units (e.g., miles, millibars, days) to extract data which are always stored in God's units, MKS (e.g., meters, Pascals, seconds). The feature is not intended to encourage writers to store data in esoteric units (e.g., furlongs, pounds per square inch, fortnights). @html @end html @node Rebasing Time Coordinate, Multiple Record Dimensions, UDUnits Support, Shared features @section Rebasing Time Coordinate @cartouche Availability: @command{ncra}, @command{ncrcat} Short options: None@* @end cartouche Time rebasing is invoked when numerous files share a common record coordinate, and the record coordinate units change among input files. The rebasing is performed automatically if and only if UDUnits is installed. Usually rebasing occurs when the recoordinate is a time-based variable, and times are recorded in units of a time-since-basetime, and the basetime changes from file to file. Since the output file can have only one unit (i.e., one basetime) for the record coordinate, @acronym{NCO}, in such cases, chooses the units of the first input file to be the units of the output file. It is necessary to ``rebase'' all the input record variables to this output time unit in order for the output file to have the correct values. For example suppose the time coordinate is in hours and each day in January is stored in its own daily file. Each daily file records the temperature variable @code{tpt(time)} with an (unadjusted) @code{time} coordinate value between 0--23 hours, and uses the @code{units} attribute to advance the base time: @example file01.nc time:units="hours since 1990-1-1" file02.nc time:units="hours since 1990-1-2" ... file31.nc time:units="hours since 1990-1-31" @end example @example // Mean noontime temperature in January ncra -v tpt -d time,"1990-1-1 12:00:00","1990-1-31 23:59:59",24 \ file??.nc noon.nc // Concatenate day2 noon through day3 noon records ncrcat -v tpt -d time,"1990-1-2 12:00:00","1990-1-3 11:59:59" \ file01.nc file02.nc file03.nc noon.nc // Results: time is "re-based" to the time units in "file01.nc" time=36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, \ 51, 52, 53, 54, 55, 56, 57, 58, 59 ; // If we repeat the above command but with only two input files... ncrcat -v tpt -d time,"1990-1-2 12:00:00","1990-1-3 11:59:59" \ file02.nc file03 noon.nc // ...then output time coordinate is based on time units in "file02.nc" time = 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, \ 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 ; @end example As of @acronym{NCO} version 4.2.1 (August, 2012), @acronym{NCO} automatically rebases not only the record coordinate (@code{time}, here) but also any cell boundaries associated with the record coordinate (e.g., @code{time_bnds}) (@pxref{CF Conventions}). As of @acronym{NCO} version 4.4.9 (May, 2015), @acronym{NCO} also rebases any climatology boundaries associated with the record coordinate (e.g., @code{climatology_bounds}) (@pxref{CF Conventions}). @html @end html @node Multiple Record Dimensions, Missing Values, Rebasing Time Coordinate, Shared features @section Multiple Record Dimensions @cindex netCDF4 @cindex @code{--mrd} @cindex @code{--multiple_record_dimensions} @cartouche Availability: @command{ncecat}, @command{ncpdq} Short options: None@* Long options: @samp{--mrd}@* @end cartouche The netCDF3 file format allows only one record dimension, and that dimension must be the first dimension (i.e., the least rapidly varying dimension) of any variable in which it appears. This imposes certain rules on how operators must perform operations that alter the ordering of dimensions or the number of record variables. The netCDF4 file format has no such restrictions. Files and variables may have any number of record dimensions in any order. This additional flexibility of netCDF4 can only be realized by selectively abandoning the constraints that would make operations behave completely consistently between netCDF3 and netCDF4 files. @acronym{NCO} chooses, by default, to impose netCDF3-based constraints on netCDF4 files. This reduces the number of unanticipated consequences and keeps the operators functioning in a familiar way. Put another way, @acronym{NCO} limits production of additional record dimensions so processing netCDF4 files leads to the same results as processing netCDF4 files. Users can override this default with the @samp{--mrd} (or @samp{--multiple_record_dimension}) switch, which enables netCDF4 variables to accumulate additional record dimensions. How can additional record dimensions be produced? Most commonly @command{ncecat} (in record-aggregate mode) defines a new leading record dimension. In netCDF4 files this becomes an additional record dimension unless the original record dimension is changed to a fixed dimension (as must be done in netCDF3 files). Also when @command{ncpdq} reorders dimensions it can preserve the ``record'' property of record variables. @command{ncpdq} tries to define as a record dimension whichever dimension ends up first in a record variable, and, in netCDF4 files, this becomes an additional record dimension unless the original record dimension is changed to a fixed dimension (as must be done in netCDF3 files). It it easier if @command{ncpdq} and @command{ncecat} do not increase the number of record dimensions in a variable so that is the default. Use @samp{--mrd} to override this. @html @end html @node Missing Values, Chunking, Multiple Record Dimensions, Shared features @section Missing values @cindex missing values @cindex data, missing @cindex averaging data @cindex @code{missing_value} @cindex @code{_FillValue} @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncflint}, @command{ncpdq}, @command{ncra}, @command{ncwa}@* Short options: None@* @end cartouche The phrase @dfn{missing data} refers to data points that are missing, invalid, or for any reason not intended to be arithmetically processed in the same fashion as valid data. @cindex arithmetic operators The @acronym{NCO} arithmetic operators attempt to handle missing data in an intelligent fashion. There are four steps in the @acronym{NCO} treatment of missing data: @enumerate @item Identifying variables that may contain missing data. @acronym{NCO} follows the convention that missing data should be stored with the @var{_FillValue} specified in the variable's @code{_FillValue} attributes. The @emph{only} way @acronym{NCO} recognizes that a variable @emph{may} contain missing data is if the variable has a @code{_FillValue} attribute. In this case, any elements of the variable which are numerically equal to the @var{_FillValue} are treated as missing data. @acronym{NCO} adopted the behavior that the default attribute name, if any, assumed to specify the value of data to ignore is @code{_FillValue} with version 3.9.2 (August, 2007). Prior to that, the @code{missing_value} attribute, if any, was assumed to specify the value of data to ignore. Supporting both of these attributes simultaneously is not practical. Hence the behavior @acronym{NCO} once applied to @var{missing_value} it now applies to any @var{_FillValue}. @acronym{NCO} now treats any @var{missing_value} as normal data @footnote{ The old functionality, i.e., where the ignored values are indicated by @code{missing_value} not @code{_FillValue}, may still be selected @emph{at @acronym{NCO} build time} by compiling @acronym{NCO} with the token definition @c @kbd{CPPFLAGS='-DNCO_MSS_VAL_SNG=missing_value'}. @kbd{CPPFLAGS='-UNCO_USE_FILL_VALUE'}. }. @findex ncrename @findex ncatted It has been and remains most advisable to create both @code{_FillValue} and @code{missing_value} attributes with identical values in datasets. Many legacy datasets contain only @code{missing_value} attributes. @acronym{NCO} can help migrating datasets between these conventions. One may use @command{ncrename} (@pxref{ncrename netCDF Renamer}) to rename all @code{missing_value} attributes to @code{_FillValue}: @example ncrename -a .missing_value,_FillValue inout.nc @end example Alternatively, one may use @command{ncatted} (@pxref{ncatted netCDF Attribute Editor}) to add a @code{_FillValue} attribute to all variables @example ncatted -O -a _FillValue,,o,f,1.0e36 inout.nc @end example @item Converting the @var{_FillValue} to the type of the variable, if neccessary. Consider a variable @var{var} of type @var{var_type} with a @code{_FillValue} attribute of type @var{att_type} containing the value @var{_FillValue}. As a guideline, the type of the @code{_FillValue} attribute should be the same as the type of the variable it is attached to. If @var{var_type} equals @var{att_type} then @acronym{NCO} straightforwardly compares each value of @var{var} to @var{_FillValue} to determine which elements of @var{var} are to be treated as missing data. @cindex C language If not, then @acronym{NCO} converts @var{_FillValue} from @var{att_type} to @var{var_type} by using the implicit conversion rules @w{of C}, or, if @var{att_type} is @code{NC_CHAR} @footnote{For example, the @acronym{DOE} @acronym{ARM} program often uses @var{att_type} = @code{NC_CHAR} and @var{_FillValue} = @samp{-99999.}. }, by typecasting the results of the @w{C function} @code{strtod(@var{_FillValue})}. @cindex @command{ncatted} You may use the @acronym{NCO} operator @command{ncatted} to change the @code{_FillValue} attribute and all data whose data is @var{_FillValue} to a new value (@pxref{ncatted netCDF Attribute Editor}). @item Identifying missing data during arithmetic operations. @cindex performance @cindex operator speed @cindex speed @cindex execution time @cindex arithmetic operators When an @acronym{NCO} arithmetic operator processes a variable @var{var} with a @code{_FillValue} attribute, it compares each value of @var{var} to @var{_FillValue} before performing an operation. Note the @var{_FillValue} comparison imposes a performance penalty on the operator. Arithmetic processing of variables which contain the @code{_FillValue} attribute always incurs this penalty, even when none of the data are missing. Conversely, arithmetic processing of variables which do not contain the @code{_FillValue} attribute never incurs this penalty. In other words, do not attach a @code{_FillValue} attribute to a variable which does not contain missing data. This exhortation can usually be obeyed for model generated data, but it may be harder to know in advance whether all observational data will be valid or not. @item Treatment of any data identified as missing in arithmetic operators. @cindex @command{nces} @cindex @command{ncra} @cindex @command{ncwa} @cindex @command{ncbo} @cindex @command{ncflint} @acronym{NCO} averagers (@command{ncra}, @command{nces}, @command{ncwa}) do not count any element with the value @var{_FillValue} towards the average. @command{ncbo} and @command{ncflint} define a @var{_FillValue} result when either of the input values is a @var{_FillValue}. Sometimes the @var{_FillValue} may change from file to file in a multi-file operator, e.g., @command{ncra}. @acronym{NCO} is written to account for this (it always compares a variable to the @var{_FillValue} assigned to that variable in the current file). Suffice it to say that, in all known cases, @acronym{NCO} does ``the right thing''. It is impossible to determine and store the correct result of a binary operation in a single variable. One such corner case occurs when both operands have differing @var{_FillValue} attributes, i.e., attributes with different numerical values. Since the output (result) of the operation can only have one @var{_FillValue}, some information may be lost. In this case, @acronym{NCO} always defines the output variable to have the same @var{_FillValue} as the first input variable. Prior to performing the arithmetic operation, all values of the second operand equal to the second @var{_FillValue} are replaced with the first @var{_FillValue}. Then the arithmetic operation proceeds as normal, comparing each element of each operand to a single @var{_FillValue}. Comparing each element to two distinct @var{_FillValue}'s would be much slower and would be no likelier to yield a more satisfactory answer. In practice, judicious choice of @var{_FillValue} values prevents any important information from being lost. @end enumerate @html @end html @node Chunking, Compression, Missing Values, Shared features @section Chunking @cindex @code{--cnk_byt} @cindex @code{--cnk_dmn} @cindex @code{--cnk_map} @cindex @code{--cnk_min} @cindex @code{--cnk_plc} @cindex @code{--cnk_scl} @cindex @code{--chunk_byte} @cindex @code{--chunk_dimension} @cindex @code{--chunk_map} @cindex @code{--chunk_min} @cindex @code{--chunk_policy} @cindex @code{--chunk_scalar} @cindex chunking @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: none@* Long options: @samp{--cnk_byt @var{cnk_sz}}, @samp{--chunk_byte @var{cnk_sz}}@* @samp{--cnk_dmn @var{dmn_nm},@var{cnk_sz}}, @samp{--chunk_dimension @var{dmn_nm},@var{cnk_sz}}@*, @samp{--cnk_map @var{cnk_map}}, @samp{--chunk_map @var{cnk_map}},@* @samp{--cnk_min @var{var_sz}}, @samp{--chunk_min @var{var_sz}},@* @samp{--cnk_plc @var{cnk_plc}}, @samp{--chunk_policy @var{cnk_plc}},@* @samp{--cnk_scl @var{cnk_sz}}, @samp{--chunk_scalar @var{cnk_sz}}@* @end cartouche All netCDF4-enabled @acronym{NCO} operators that define variables support a plethora of chunksize options. Chunking can significantly accelerate or degrade read/write access to large datasets. Dataset chunking issues are described by @acronym{THG} and Unidata @uref{http://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html,here}, @uref{http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_why_it_matters,here}, and @uref{http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_choosing_shapes,here}. @acronym{NCO} authors are working on generalized algorithms and applications of chunking strategies (stay tuned for more in 2015). @cindex chunking policy @cindex chunking map @cindex chunksize @cindex blocksize The @acronym{NCO} chunking implementation is designed to be flexible. Users control four aspects of the chunking implementation. These are the @dfn{chunking policy}, @dfn{chunking map}, @dfn{chunksize}, and @dfn{minimum chunksize}. The chunking policy determines @emph{which} variables to chunk, and the chunking map determines how (with what exact sizes) to chunk those variables. These are high-level mechanisms that apply to an entire file and all variables and dimensions. The chunksize option allows per-dimension specification of sizes that will override the selected (or default) chunking map. The @var{var_sz} parameter is the minimum size in bytes (not elements) of variables to chunk. This threshold is intended to restrict use of chunking to variables for which it is efficient. By default this minimum variable size for chunking is twice the system blocksize (when available) and is @w{8192 bytes} otherwise. Users may set this to any value with the @samp{--cnk_min} switch. @cindex hyperslab @findex ncpdq @cindex packing The chunking implementation is similar to a hybrid of the @command{ncpdq} packing policies (@pxref{ncpdq netCDF Permute Dimensions Quickly}) and hyperslab specifications (@pxref{Hyperslabs}). Each aspect is intended to have a sensible default, so that many users only need to set one switch to obtain sensible chunking. Power users can tune chunking with the three switches in tandem to obtain optimal performance. By default, @acronym{NCO} preserves the chunking characteristics of the input file in the output file @footnote{This behavior became the default in November 2014 with @acronym{NCO} version 4.4.7. Prior versions would always use netCDF default chunking in the output file when no @acronym{NCO} chunking switches were activated, regardless of the chunking in the input file.}. In other words, preserving chunking requires no switches or user intervention. Users specify the desired chunking policy with the @samp{-P} switch (or its long option equivalents, @samp{--cnk_plc} and @samp{--chunk_policy}) and its @var{cnk_plc} argument. As of August, 2014, six chunking policies are implemented:@* @cindex @samp{all} @cindex @samp{g2d} @cindex @samp{g3d} @cindex @samp{r1d} @cindex @samp{xpl} @cindex @samp{xst} @cindex @samp{cnk_all} @cindex @samp{cnk_g2d} @cindex @samp{cnk_g3d} @cindex @samp{cnk_r1d} @cindex @samp{cnk_xpl} @cindex @samp{cnk_xst} @cindex @samp{plc_all} @cindex @samp{plc_g2d} @cindex @samp{plc_g3d} @cindex @samp{plc_r1d} @cindex @samp{plc_xpl} @cindex @samp{plc_xst} @table @dfn @item Chunk All Variables Definition: Chunk all variables possible. For obvious reasons, scalar variables cannot be chunked.@* Alternate invocation: @code{ncchunk}@* @var{cnk_plc} key values: @samp{all}, @samp{cnk_all}, @samp{plc_all}@* Mnemonic: All@* @item Chunk Variables with at least Two Dimensions [@emph{default}] Definition: Chunk all variables possible with at least two dimensions@* Alternate invocation: none@* @var{cnk_plc} key values: @samp{g2d}, @samp{cnk_g2d}, @samp{plc_g2d}@* Mnemonic: @emph{G}reater than or equal to @emph{2} @emph{D}imensions@* @item Chunk Variables with at least Three Dimensions Definition: Chunk all variables possible with at least three dimensions@* Alternate invocation: none@* @var{cnk_plc} key values: @samp{g3d}, @samp{cnk_g3d}, @samp{plc_g3d}@* Mnemonic: @emph{G}reater than or equal to @emph{3} @emph{D}imensions@* @item Chunk One-Dimensional Record Variables Definition: Chunk all 1-D record variables@* Alternate invocation: none@* Any specified (with @samp{--cnk_dmn}) record dimension chunksizes will be applied only to 1-D record variables (and to no other variables). Other dimensions may be chunked with their own @samp{--cnk_dmn} options that will apply to all variables. @var{cnk_plc} key values: @samp{r1d}, @samp{cnk_r1d}, @samp{plc_r1d}@* Mnemonic: @emph{R}ecord @emph{1}-@emph{D} variables@* @item Chunk Variables Containing Explicitly Chunked Dimensions Definition: Chunk all variables possible that contain at least one dimension whose chunksize was explicitly set with the @samp{--cnk_dmn} option. Alternate invocation: none@* @var{cnk_plc} key values: @samp{xpl}, @samp{cnk_xpl}, @samp{plc_xpl}@* Mnemonic: E@emph{XPL}icitly specified dimensions@* @item Chunk Variables that are already Chunked Definition: Chunk only variables that are already chunked in the input file. When used in conjunction with @samp{cnk_map=xst} this option preserves and copies the chunking parameters from the input to the output file. Alternate invocation: none@* @var{cnk_plc} key values: @samp{xst}, @samp{cnk_xst}, @samp{plc_xst}@* Mnemonic: E@emph{X}i@emph{ST}ing chunked variables@* @item Chunk Variables with @acronym{NCO} recommendations Definition: Chunk all variables according to @acronym{NCO} best practices. This is a virtual option that ensures the chunking policy is (in the subjective opinion of the authors) the best policy for typical usage. As of @acronym{NCO} version 4.4.8 (February, 2015), this virtual policy implements @samp{map_rew} for 3-D variables and @samp{map_lfp} for all other variables.@* Alternate invocation: none@* @var{cnk_plc} key values: @samp{nco}, @samp{cnk_nco}, @samp{plc_nco}@* Mnemonic: @emph{N}et@emph{C}DF@emph{O}perator@* @item Unchunking Definition: Unchunk all variables possible. The @acronym{HDF5} storge layer requires that record variables (i.e., variables that contain at least one record dimension) must be chunked. Also variables that are compressed or use checksums must be chunked. Such variables cannot be unchunked.@* Alternate invocation: @code{ncunchunk}@* @var{cnk_plc} key values: @samp{uck}, @samp{cnk_uck}, @samp{plc_uck}, @samp{unchunk}@* Mnemonic: @emph{U}n@emph{C}hun@emph{K}@* @end table @noindent Equivalent key values are fully interchangeable. Multiple equivalent options are provided to satisfy disparate needs and tastes of @acronym{NCO} users working with scripts and from the command line. @cindex chunking map @cindex degenerate dimension @cindex @var{cnk_map} @cindex @code{-M @var{cnk_map}} @cindex @code{--cnk_map @var{cnk_map}} @cindex @code{--map @var{cnk_map}} The chunking algorithms must know the chunksizes of each dimension of each variable to be chunked. The correspondence between the input variable shape and the chunksizes is called the @dfn{chunking map}. The user specifies the desired chunking map with the @samp{-M} switch (or its long option equivalents, @samp{--cnk_map} and @samp{--chunk_map}) and its @var{cnk_map} argument. Eight chunking maps are currently implemented:@* @cindex @samp{dmn} @cindex @samp{scl} @cindex @samp{prd} @cindex @samp{lfp} @cindex @samp{rd1} @cindex @samp{xst} @cindex @samp{rew} @cindex @samp{nc4} @cindex @samp{cnk_dmn} @cindex @samp{cnk_scl} @cindex @samp{cnk_prd} @cindex @samp{cnk_lfp} @cindex @samp{cnk_rd1} @cindex @samp{cnk_xst} @cindex @samp{cnk_rew} @cindex @samp{cnk_nc4} @cindex @samp{map_dmn} @cindex @samp{map_scl} @cindex @samp{map_prd} @cindex @samp{map_lfp} @cindex @samp{map_rd1} @cindex @samp{map_xst} @cindex @samp{map_rew} @cindex @samp{map_nc4} @cindex Chris Barker @table @dfn @item Chunksize Equals Dimension Size Definition: Chunksize defaults to dimension size. Explicitly specify chunksizes for particular dimensions with @samp{--cnk_dmn} option.@* @var{cnk_map} key values: @samp{dmn}, @samp{cnk_dmn}, @samp{map_dmn}@* Mnemonic: @emph{D}i@emph{M}e@emph{N}sion@* @item Chunksize Equals Dimension Size except Record Dimension Definition: Chunksize equals dimension size except record dimension has size one. Explicitly specify chunksizes for particular dimensions with @samp{--cnk_dmn} option.@* @var{cnk_map} key values: @samp{rd1}, @samp{cnk_rd1}, @samp{map_rd1}@* Mnemonic: @emph{R}ecord @emph{D}imension size @emph{1}@* @item Chunksize Equals Scalar Size Specified Definition: Chunksize for all dimensions is set with the @samp{--cnk_scl} option.@* @var{cnk_map} key values: @samp{xpl}, @samp{cnk_xpl}, @samp{map_xpl}@* Mnemonic: E@emph{XPL}icitly specified dimensions@* @item Chunksize Product Matches Scalar Size Specified Definition: The product of the chunksizes for each variable matches (approximately equals) the size specified with the @samp{--cnk_scl} option. A dimension of size one is said to be @emph{degenerate}. For a variable of rank @var{R} (i.e., with @var{R} non-degenerate dimensions), the chunksize in each non-degenerate dimension is the @var{R}th root of @var{cnk_scl}.@* @var{cnk_map} key values: @samp{prd}, @samp{cnk_prd}, @samp{map_prd}@* Mnemonic: @emph{PR}o@emph{D}uct@* @item Chunksize Lefter Product Matches Scalar Size Specified [@emph{default for netCDF3 input}] Definition: The product of the chunksizes for each variable (approximately) equals the size specified with the @samp{--cnk_scl} option. This is accomplished by using dimension sizes as chunksizes for the rightmost (most rapidly varying) dimensions, and then ``flexing'' the chunksize of the leftmost (least rapidly varying) dimensions such that the product of all chunksizes matches the specified size. All dimensions to the left of and including the first record dimension define the left-hand side. This map was first proposed by Chris Barker.@* @var{cnk_map} key values: @samp{lfp}, @samp{cnk_lfp}, @samp{map_lfp}@* Mnemonic: @emph{L}e@emph{F}ter @emph{P}roduct@* @item Chunksize Equals Existing Chunksize Definition: Chunksizes are copied from the input to the output file for every variable that is chunked in the input file. Variables not chunked in the input file will be chunked with default mappings.@* @var{cnk_map} key values: @samp{xst}, @samp{cnk_xst}, @samp{map_xst}@* Mnemonic: E@emph{X}i@emph{ST}@* @item Chunksize Balances 1D and (N-1)-D Access to N-D Variable [@emph{default for netCDF4 input}] Definition: Chunksizes are chosen so that 1-D and (@var{N-1})-D hyperslabs of @var{3}-D variables (e.g., point-timeseries orn latitude/longitude surfaces of 3-D fields) both require approximately the number of chunks. Hence their access time should be balanced. Russ Rew explains the motivation and derivation for this strategy @uref{http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_choosing_shapes, here}.@* @var{cnk_map} key values: @samp{rew}, @samp{cnk_rew}, @samp{map_rew}@* Mnemonic: Russ @emph{REW}@* @item Chunksizes use netCDF4 defaults Definition: Chunksizes are determined by the underlying netCDF library. All variables selected by the current chunking policy have their chunksizes determined by netCDF library defaults. The default algorithm netCDF uses to determine chunksizes has changed through the years, and thus depends on the netCDF library version. This map can be used to reset (portions of) previously chunked files to default chunking values.@* @var{cnk_map} key values: @samp{nc4}, @samp{cnk_nc4}, @samp{map_nc4}@* Mnemonic: @emph{N}et@emph{C}DF@emph{4}@* @item Chunksizes use @acronym{NCO} recommendations [@emph{default for netCDF3 input}] Definition: Chunksizes are determined by the currently recommended @acronym{NCO} map. This is a virtual option that ensures the chunking map is (in the subjective opinion of the authors) the best map for typical usage. As of @acronym{NCO} version 4.4.9 (May, 2015), this virtual map calls @samp{map_lfp}.@* @c for 3-D variables and @samp{map_lfp} for all others.@* @var{cnk_map} key values: @samp{nco}, @samp{cnk_nco}, @samp{map_nco}@* Mnemonic: @emph{N}et@emph{C}DF@emph{O}perator@* @end table @noindent It is possible to combine the above chunking map algorithms with user-specified per-dimension (though not per-variable) chunksizes that override specific chunksizes determined by the maps above. The user specifies the per-dimension chunksizes with the (equivalent) long options @samp{--cnk_dmn} or @samp{--chunk_dimension}). The option takes two comma-separated arguments, @var{dmn_nm},@var{cnk_sz}, which are the dimension name and its chunksize, respectively. The @samp{--cnk_dmn} option may be used as many times as necessary. The default behavior of chunking depends on several factors. As mentioned above, when no chunking options are explicitly specified by the user, then @acronym{NCO} preserves the chunking characteristics of the input file in the output file. This is equivalent to specifying both @var{cnk_plc} and @var{cnk_map} as ``existing'', i.e., @samp{--cnk_plc=xst --cnk_map=xst}. If output netCDF4 files are chunked with the default behavior of the netCDF4 library. When any chunking parameter @emph{except} @samp{cnk_plc} or @samp{cnk_map} is specified (such as @samp{cnk_dmn} or @samp{cnk_sz_scl}), then the ``existing'' policy and map are retained and the output chunksizes are modified where necessary in accord with the user-specified parameter. When @samp{cnk_map} is specified and @samp{cnk_plc} is not, then @acronym{NCO} picks (what it thinks is) the optimal chunking policy. This has always been policy @samp{map_g2d}. When @samp{cnk_plc} is specified and @samp{cnk_map} is not, then @acronym{NCO} picks (what it thinks is) the optimal chunking map. This has always been map @samp{map_rd1}. To start afresh and return to netCDF4 chunking defaults, select @samp{cnk_map=nc4}. @html @end html @example # Simple chunking and unchunking ncks -O -4 --cnk_plc=all in.nc out.nc # Chunk in.nc ncks -O -4 --cnk_plc=unchunk in.nc out.nc # Unchunk in.nc # Chunk data then unchunk it, printing informative metadata ncks -O -4 -D 4 --cnk_plc=all ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_plc=uck ~/foo.nc ~/foo.nc # Set total chunksize to 8192 B ncks -O -4 -D 4 --cnk_plc=all --cnk_byt=8192 ~/nco/data/in.nc ~/foo.nc # More complex chunking procedures, with informative metadata ncks -O -4 -D 4 --cnk_scl=8 ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_scl=8 dstmch90_clm.nc ~/foo.nc ncks -O -4 -D 4 --cnk_dmn lat,64 --cnk_dmn lon,128 dstmch90_clm.nc \ ~/foo.nc ncks -O -4 -D 4 --cnk_plc=uck ~/foo.nc ~/foo.nc ncks -O -4 -D 4 --cnk_plc=g2d --cnk_map=rd1 --cnk_dmn lat,32 \ --cnk_dmn lon,128 dstmch90_clm_0112.nc ~/foo.nc # Chunking works with all operators... ncap2 -O -4 -D 4 --cnk_scl=8 -S ~/nco/data/ncap2_tst.nco \ ~/nco/data/in.nc ~/foo.nc ncbo -O -4 -D 4 --cnk_scl=8 -p ~/nco/data in.nc in.nc ~/foo.nc ncecat -O -4 -D 4 -n 12,2,1 --cnk_dmn lat,32 \ -p /data/zender/dstmch90 dstmch90_clm01.nc ~/foo.nc ncflint -O -4 -D 4 --cnk_scl=8 ~/nco/data/in.nc ~/foo.nc ncpdq -O -4 -D 4 -P all_new --cnk_scl=8 -L 5 ~/nco/data/in.nc ~/foo.nc ncrcat -O -4 -D 4 -n 12,2,1 --cnk_dmn lat,32 \ -p /data/zender/dstmch90 dstmch90_clm01.nc ~/foo.nc ncwa -O -4 -D 4 -a time --cnk_plc=g2d --cnk_map=rd1 --cnk_dmn lat,32 \ --cnk_dmn lon,128 dstmch90_clm_0112.nc ~/foo.nc @end example @html @end html Chunking policy @samp{r1d} changes the chunksize of 1-D record variables (and no other variables) to that specified (with @samp{--cnk_dmn}) chunksize. Any specified record dimension chunksizes will be applied to 1-D record variables only. Other dimensions may be chunked with their own @samp{--cnk_dmn} options that will apply to all variables. For example, @example ncks --cnk_plc=r1d --cnk_dmn=time,1000. in.nc out.nc @end example This sets @code{time} chunks to 1000 only in 1-D record variables. Without the @samp{r1d} policy, @code{time} chunks would change in all variables. @cindex record dimension It is appropriate to conclude by informing users about an aspect of chunking that may not be expected. Three types of variables are @emph{always} chunked: Record variables, Deflated (compressed) variables, and Checksummed variables. Hence all variables that contain a record dimension are also chunked (since data must be chunked in all dimensions, not just one). Unless otherwise specified by the user, the other (fixed, non-record) dimensions of record variables are assigned default chunk sizes. The @acronym{HDF5} layer does all this automatically to optimize the on-disk variable/file storage geometry of record variables. Do not be surprised to learn that files created without any explicit instructions to activate chunking nevertheless contain chunked variables. @html @end html @node Compression, Deflation, Chunking, Shared features @section Compression @cindex @code{--ppc} @cindex @code{--precision_preserving_compression} @cindex @code{--quantize} @cindex lossy compression @cindex quantization @cindex rounding @cindex Huffman coding @cindex @command{gzip} @cindex @command{zlib} @cartouche Availability: @command{ncbo}, @command{ncecat}, @command{nces}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: None@* Long options: @samp{--ppc @var{var1}[,@var{var2}[,...]]=@var{prc}},@* @samp{--precision_preserving_compression @var{var1}[,@var{var2}[,...]]=@var{prc}},@* @samp{--quantize @var{var1}[,@var{var2}[,...]]=@var{prc}}@* @end cartouche @acronym{NCO} implements or accesses four different compression algorithms, the standard lossless @acronym{DEFLATE} algorithm and three lossy compression algorithms. All four algorithms reduce the on-disk size of a dataset while sacrificing no (lossless) or a tolerable amount (lossy) of precision. First, @acronym{NCO} can access the lossless @acronym{DEFLATE} algorithm, a combination of Lempel-Ziv encoding and Huffman coding, algorithm on any netCDF4 dataset (@pxref{Deflation}). Because it is lossless, this algorithm re-inflates deflated data to their full original precision. This algorithm is accessed via the @acronym{HDF5} library layer (which itself calls the @command{zlib} library also used by @command{gzip}), and is unavailable with netCDF3. The three lossy compression algorithms are Packing (@pxref{Packed data}), and two precision-preserving algorithms. Packing quantizes data of a higher precision type into a lower precision type (often @code{NC_SHORT}) that thus stores a fewer (though constant) number of bytes per value. Packed data unpacks into a (much) smaller dynamic range than the floating-point data can represent. The type-conversion and reduced dynamic range of the data allows packing to eliminate bits typically used to store an exponent, thus improving its packing efficiency. Packed data also can also be deflated for additional space savings. A limitation of packing is that unpacking data stored as integers into the linear range defined by @code{scale_factor} and @code{add_offset} rapidly loses precision outside of a narrow range of floating point values. Variables packed as @code{NC_SHORT}, for example, can represent only about 64000 discrete values in the range @math{-32768*scale_factor+add_offset} to @math{32767*scale_factor+add_offset}. The precision of packed data equals the value of @code{scale_factor}, and @code{scale_factor} is usually chosen to span the range of valid data, not to represent the intrinsic precision of the variable. In other words, the precision of packed data cannot be specified in advance because it depends on the range of values to quantize. @cindex @acronym{PPC} @cindex @acronym{LSD} @cindex Least Significant Digit @cindex quantization @acronym{NCO} implemented the final two lossy compression algorithms in version 4.4.8 (February, 2015). These are both @dfn{Precision-Preserving Compression} (@acronym{PPC}) algorithms and since standard terminology for precision is remarkably imprecise, so is our nomenclature. The operational definition of ``significant digit'' in our precision preserving algorithms is that the exact value, before rounding or quantization, is within one-half the value of the decimal place occupied by the @dfn{Least Significant Digit} (@acronym{LSD}) of the rounded value. For example, the value @math{pi = 3.14} correctly represents the exact mathematical constant @var{pi} to three significant digits because the @acronym{LSD} of the rounded value @w{(i.e., 4)} is in the one-hundredths digit place, and the difference between the exact value and the rounded value is less than one-half of one one-hundredth, i.e., (@math{3.14159265358979323844 - 3.14 = 0.00159 < 0.005}). @cindex Number of Significant Digits @cindex @acronym{NSD} One @acronym{PPC} algorithm preserves the specified total @dfn{Number of Signifcant Digits} (@acronym{NSD}) of the value. For example there is only one significant digit in the weight of most ``eight-hundred pound gorillas'' that you will encounter, i.e., so @math{@var{nsd=1}}. This is the most straightforward measure of precision, and thus @acronym{NSD} is the default @acronym{PPC} algorithm. @cindex Decimal Significant Digits @cindex @acronym{DSD} The other @acronym{PPC} algorithm preserves the number of @dfn{Decimal Significant Digits} (@acronym{DSD}), i.e., the number of significant digits following (positive, by convention) or preceding (negative) the decimal point. For example, @samp{0.008} and @samp{800} have, respectively, three and negative two digits digits following the decimal point, corresponding to @math{@var{dsd=3}} and @math{@var{dsd=-2}}. The only justifiable @acronym{NSD} for a given value depends on intrinsic accuracy and error characteristics of the model or measurements, and not on the units with which the value is stored. The appropriate @acronym{DSD} for a given value depends on these intrinsic characteristics and, in addition, the units of storage. This is the fundamental difference between the @acronym{NSD} and @acronym{DSD} approaches. The eight-hundred pound gorilla always has @math{@var{nsd=1}} regardless of whether the value is store in pounds or in some other unit. @acronym{DSD} corresponding to this weight is @math{@var{dsd=-2}} if the value is store in pounds, @math{@var{dsd=4}} if stored in megapounds. Users may wish to express the precision to be preserved as either @acronym{NSD} or @acronym{DSD}. Invoke @acronym{PPC} with the long option @samp{--ppc var=prc}, or give the same arguments to the synonyms @samp{--precision_preserving_compression}, or to @samp{--quantize}. Here @var{var} is the variable to quantize, and @var{prc} is the precision. The default algorithm assumes @var{prc} specifies @acronym{NSD} precision, e.g., @samp{T=2} means @math{@var{nsd=2}}. Prepend @var{prc} with a decimal point to specify @acronym{DSD} precision, e.g., @samp{T=.2} means @math{@var{dsd=2}}. @acronym{NSD} precision must be specified as a positive integer. @acronym{DSD} precision may be a positive or negative integer; and is specified as the negative @w{base 10} logarithm of the desired precision, in accord with common usage. For example, specifying @samp{T=.3} or @samp{T=.-2} tells the @acronym{DSD} algorithm to store only enough bits to preserve the value of @var{T} rounded to the nearest thousandth or hundred, respectively. @cindex @acronym{CF} conventions @cindex @code{coordinates} attribute @cindex @code{climatology} attribute @cindex @code{bounds} attribute Setting @var{var} to @code{default} has the special meaning of applying the associated @acronym{NSD} or @acronym{DSD} algorithm to all floating point variables except coordinate variables. Variables @emph{not affected} by @code{default} include integer and non-numeric atomic types, coordinates, and variables mentioned in the @code{bounds}, @code{climatology}, or @code{coordinates} attribute of any variable. @acronym{NCO} applies @acronym{PPC} to coordinate variables only if those variables are explicitly specified (i.e., not with the @samp{default=@var{prc}} mechanism. @acronym{NCO} applies @acronym{PPC} to integer-type variables only if those variables are explicitly specified (i.e., not with the @samp{default=@var{prc}}, and only if the @acronym{DSD} algorithm is invoked with a negative @var{prc}. To prevent @acronym{PPC} from applying to certain non-coordinate variables (e.g., @code{gridcell_area} or @code{gaussian_weight}), explicitly specify a precision @w{exceeding 7} (for @code{NC_FLOAT}) @w{or 15} (for @code{NC_DOUBLE}) for those variables. Since these are the maximum representable precisions in decimal digits, @acronym{NCO} @emph{turns-off} @acronym{PPC} (i.e., does nothing) when more precision is requested. @cindex bitmask @cindex significand @cindex @w{@acronym{IEEE} 754} The time-penalty for compressing and uncompressing data varies according to the algorithm. The Number of Significant Digit (@acronym{NSD}) algorithm quantizes by bitmasking, and employs no floating point math. The Decimal Significant Digit (@acronym{DSD}) algorithm quantizes by rounding, which does require floating point math. Hence @acronym{NSD} is likely faster than @acronym{DSD}, though the difference has not been measured. @acronym{NSD} creates a bitmask to alter the @dfn{significand} of @w{@acronym{IEEE} 754} floating point data. The bitmask is one for all bits to be retained and zero or one for all bits to be ignored. The algorithm assumes that the number of binary digits (i.e., bits) necessary to represent a single base-10 digit is @math{ln(10)/ln(2) = 3.32}. The exact numbers of bits @var{Nbit} retained for single and double precision values are @math{ceil(3.32*@var{nsd})+1} and @math{ceil(3.32*@var{nsd})+2}, respectively. Once these @w{reach 23} @w{and 53}, respectively, bitmasking is completely ineffective. This occurs at @math{@var{nsd}=6.3} @w{and 15.4}, respectively. The @acronym{DSD} algorithm, by contrast, uses rounding to remove undesired precision. @cindex @command{rint()} @cindex C99 @cindex @acronym{IEEE} @cindex significand The rounding @footnote{ Rounding is performed by the internal math library @command{rint()} family of functions that were standardized in C99. The exact alorithm employed is @math{@var{val} := rint(@var{scale}*@var{val})/@var{scale}} where @var{scale} is the nearest power @w{of 2} that exceeds @math{10**@var{prc}}, and the inverse of @var{scale} is used when @math{@var{prc} < 0}. For @math{@var{ppc} = 3} or @math{@var{ppc} = -2}, for example, we have @math{@var{scale} = 1024} and @math{@var{scale} = 1/128}.} zeroes the greatest number of significand bits consistent with the desired precision. To demonstrate the change in @acronym{IEEE} representation caused by @acronym{PPC} rounding algorithms, consider again the case of @var{pi}, represented as an @code{NC_FLOAT}. The @w{@acronym{IEEE} 754} single precision representations of the exact value (3.141592...), the value with only three significant digits treated as exact (3.140000...), and the value as stored (3.140625) after @acronym{PPC}-rounding with either the @acronym{NSD} (@math{@var{prc}=3}) or @acronym{DSD} (@math{@var{prc}=2}) algorithm are, respectively, @ignore ncks -O -v pi --ppc pi=1 ~/nco/data/in.nc ~/foo_nsd1.nc ncks -O -v pi --ppc pi=2 ~/nco/data/in.nc ~/foo_nsd2.nc ncks -O -v pi --ppc pi=3 ~/nco/data/in.nc ~/foo_nsd3.nc ncks -O -v pi --ppc pi=4 ~/nco/data/in.nc ~/foo_nsd4.nc ncks -O -v pi --ppc pi=5 ~/nco/data/in.nc ~/foo_nsd5.nc ncks -O -v pi --ppc pi=6 ~/nco/data/in.nc ~/foo_nsd6.nc ncks -O -v pi --ppc pi=7 ~/nco/data/in.nc ~/foo_nsd7.nc ncks -O -v pi --ppc pi=8 ~/nco/data/in.nc ~/foo_nsd8.nc ncks -O -v pi --ppc pi=9 ~/nco/data/in.nc ~/foo_nsd9.nc ncks -O -v pi --ppc pi=.2 ~/nco/data/in.nc ~/foo_dsd2.nc ncks -s %20.16e -C -H ~/foo_nsd.nc ncks -s %20.16e -C -H ~/foo_dsd.nc ccc --tst=bnr --flt_foo=3.14159265358979323844 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.14000000000000000000 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.00000000000000000000 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.12500000000000000000 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.14062500000000000000 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.14062500000000000000 2> /dev/null | grep "Binary of float" ccc --tst=bnr --flt_foo=3.14147949218750000000 2> /dev/null | grep "Binary of float" @end ignore @example S Exponent Fraction (Significand) Decimal Notes 0 100000001 0010010000111111011011 # 3.14159265 Exact 0 100000001 0010001111010111000011 # 3.14000000 0 100000001 0010010000000000000000 # 3.14062500 NSD = 3 0 100000001 0010010000000000000000 # 3.14062500 DSD = 2 @end example The string of trailing zero-bits in the rounded values facilitates byte-stream compression. Note that the @acronym{NSD} and @acronym{DSD} algorithms do not always produce results that are bit-for-bit identical, although they do in this particular case. @html @end html Reducing the preserved precision of @acronym{NSD}-rounding produces increasingly long strings of identical-bits amenable to compression: @example S Exponent Fraction (Significand) Decimal Notes 0 100000001 0010010000111111011011 # 3.14159265 Exact 0 100000001 0010010000111111011011 # 3.14159265 NSD = 8 0 100000001 0010010000111111011010 # 3.14159262 NSD = 7 0 100000001 0010010000111111011000 # 3.14159203 NSD = 6 0 100000001 0010010000111111000000 # 3.14158630 NSD = 5 0 100000001 0010010000111100000000 # 3.14154053 NSD = 4 0 100000001 0010010000000000000000 # 3.14062500 NSD = 3 0 100000001 0010010000000000000000 # 3.14062500 NSD = 2 0 100000001 0010000000000000000000 # 3.12500000 NSD = 1 @end example The consumption of about @w{3 bits} per digit of base-10 precision is evident, as is the coincidence of a quantized value that greatly exceeds the mandated precision for @math{@acronym{NSD} = 2}. Although the @acronym{NSD} algorithm generally masks some bits for all @math{@var{nsd} <= 7} (for @code{NC_FLOAT}), compression algorithms like @acronym{DEFLATE} may need byte-size-or-greater (i.e., at least eight-bit) bit patterns before their algorithms can take advantage of of encoding such patterns for compression. Do not expect significantly enhanced compression from @math{@var{nsd} > 5} (for @code{NC_FLOAT}) or @math{@var{nsd} > 14} (for @code{NC_DOUBLE}). Clearly values stored as @code{NC_DOUBLE} (i.e., eight-bytes) are susceptible to much greater compression than @code{NC_FLOAT} for a given precision because their significands explicitly contain @w{53 bits} rather than @w{23 bits}. Maintaining non-biased statistical properties during lossy compression requires special attention. The @acronym{DSD} algorithm uses @code{rint()}, which rounds toward the nearest even integer. Thus @acronym{DSD} has no systematic bias. However, the @acronym{NSD} algorithm uses a bitmask technique susceptible to statistical bias. Zeroing all non-significant bits is guaranteed to produce numbers quantized to the specified tolerance, i.e., half of the decimal value of the position occupied by the @acronym{LSD}. However, always zeroing the non-significant bits results in quantized numbers that never exceed the exact number. This would produce a negative bias in statistical quantities (e.g., the average) subsequently derived from the quantized numbers. To avoid this bias, our @acronym{NSD} implementation rounds non-significant bits down (to zero) or up (to one) in an alternating fashion when processing array data. In general, the first element is rounded down, the second up, and so on. This results in a mean bias quite close to zero. The only exception is that the floating point value of zero is never quantized upwards. For simplicity, @acronym{NSD} always rounds scalars downwards. @cindex @acronym{DEFLATE} @cindex @acronym{HDF5} @cindex @command{gzip} @cindex @command{gunzip} Although @acronym{NSD} or @acronym{DSD} are different algorithms under the hood, they both replace the (unwanted) least siginificant bits of the @acronym{IEEE} significand with a string of consecutive zeroes. Byte-stream compression techniques, such as the @command{gzip} @acronym{DEFLATE} algorithm compression available in @acronym{HDF5}, always compress zero-strings more efficiently than random digits. The net result is netCDF files that utilize compression can be significantly reduced in size. This feature only works when the data are compressed, either internally (by netCDF) or externally (by another user-supplied mechanism). It is most straightfoward to compress data internally using the built-in compression and decompression supported by netCDF4. For convenience, @acronym{NCO} automatically activates file-wide Lempel-Ziv deflation (@pxref{Deflation}) level one (i.e., @samp{-L 1}) when @acronym{PPC} is invoked on any variable in a netCDF4 output file. This makes @acronym{PPC} easier to use effectively, since the user need not explicitly specify deflation. Any explicitly specified deflation (including no deflation, @samp{-L 0}) will override the @acronym{PPC} deflation default. If the output file is a netCDF3 format, @acronym{NCO} will emit a message suggesting internal netCDF4 or external netCDF3 compression. netCDF3 files compressed by an external utility such as @command{gzip} accrue approximately the same benefits (shrinkage) as netCDF4, although with netCDF3 the user or provider must uncompress (e.g., @command{gunzip}) the file before accessing the data. There is no benefit to rounding numbers and storing them in netCDF3 files unless such custom compression/decompression is employed. Without that, one may as well maintain the undesired precision. The user accesses @acronym{PPC} through a single switch, @samp{--ppc}, repeated as many times as necessary. To apply the @acronym{NSD} algorithm to variable @var{u} use, e.g., @example ncks -7 --ppc u=2 in.nc out.nc @end example The output file will preserve only two significant digits of @var{u}. The options @samp{-4} or @samp{-7} ensure a netCDF4-format output (regardless of the input file format) to support internal compression. It is recommended though not required to write netCDF4 files after @acronym{PPC}. For clarity the @samp{-4/-7} switches are omitted in subsequent examples. @cindex @code{number_of_significant_digits} @cindex @code{least_significant_digit} @cindex Jeff Whitaker @cindex Rich Signell @cindex John Caron @acronym{NCO} attaches attributes that indicate the algorithm used and degree of precision retained for each variable affected by @acronym{PPC}. The @acronym{NSD} and @acronym{DSD} algorithms store the attributes @code{number_of_significant_digits} and @code{least_significant_digit} @footnote{ A suggestion by Rich Signell and the @command{nc3tonc4} tool by Jeff Whitaker inspired @acronym{NCO} to implement @acronym{PPC}. @acronym{NCO} implements a different @acronym{DSD} algorithm than @command{nc3tonc4}, and produces slightly different (not bit-for-bit) though self-consistent and equivalent results. @command{nc3tonc4} records the precision of its @acronym{DSD} algorithm in the attribute @code{least_significant_digit} and @acronym{NCO} does the same for consistency. The Unidata blog @uref{http://www.unidata.ucar.edu/blogs/developer/en/entry/compression_by_bit_shaving, here} also shows how to compress @acronym{IEEE} floating point data by zeroing insignificant bits. The author, John Caron, writes that the technique has been called ``bit-shaving''. When combined with our bias-elimination procedure that rounds-up to one, a more suitable terminology might be ``bit-grooming''.}, respectively. It is safe to attempt @acronym{PPC} on input that has already been rounded. Variables can be made rounder, not sharper, i.e., variables cannot be ``un-rounded''. Thus @acronym{PPC} attempted on an input variable with an existing @acronym{PPC} attribute proceeds only if the new rounding level exceeds the old, otherwise no new rounding occurs (i.e., a ``no-op''), and the original @acronym{PPC} attribute is retained rather than replaced with the newer value of @var{prc}. To request, say, five significant digits (@math{@var{nsd=5}}) for all fields, except, say, wind speeds which are only known to integer values (@math{@var{dsd=0}}) in the supplied units, requires @samp{--ppc} twice: @example ncks -4 --ppc default=5 --ppc u,v=.0 in.nc out.nc @end example To preserve five digits in all variables except coordinate variables and @var{u} and @var{v}, use the @samp{default} option and separately specify the exceptions: @example ncks --ppc default=5 --ppc u,v=20 in.nc out.nc @end example The @samp{--ppc} option may be specified any number of times to support varying precision types and levels, and each option may aggregate all the variables with the same precision @example ncks --ppc p,w,z=5 --ppc q,RH=4 --ppc T,u,v=3 in.nc out.nc @end example Any @var{var} argument may be a regular expression. This simplifies generating lists of related variables: @example ncks --ppc Q.?=5 --ppc FS.?,FL.?=4 --ppc RH=.3 in.nc out.nc @end example Although @acronym{PPC}-rounding instantly reduces data precision, on-disk storage reduction only occurs once the data are compressed. @html @end html How can one be sure the lossy data are sufficiently precise? @acronym{PPC} preserves all significant digits of every value. The @acronym{DSD} algorithm uses floating point math to round each value optimally so that it has the maximum number of zeroed bits that preserve the specified precision. The @acronym{NSD} algorithm uses a theoretical approach (3.2 bits per base-10 digit), tuned and tested to ensure the @emph{worst} case quantization error is less than half the value of the minimum increment in the least significant digit. @ifhtml @cartouche @html

    Note for HTML users:
    The definition of error metrics relies heavily on mathematical expressions which cannot easily be represented in HTML. See the printed manual for much more detailed and complete documentation of this subject. @end html @end cartouche @end ifhtml @ifnothtml @ifinfo @emph{Note for Info users}: The definition of error metrics relies heavily on mathematical expressions which cannot be easily represented in Info. @emph{See the @uref{./nco.pdf, printed manual} for much more detailed and complete documentation of this subject.} @end ifinfo @end ifnothtml @tex We define several metrics to quantify the quantization error. The mean error~$\pslavg$ and mean absolute error~$\pslmebs$ incurred in quantizing a variable from its true values~$\xxx_{\idx}$ to quantized values~$\qqq_{\idx}$ are, respectively, $$ \pslavg = {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} ( \xxx_{\idx} - \qqq_{\idx} ) \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}}\qquad\hbox{and}\qquad \pslmebs = {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} | \xxx_{\idx} - \qqq_{\idx} | \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}} $$ where $\mssflg_{\idx}$ is~1 unless $\xxx_{\idx}$~equals the missing value, $\mskflg_{\idx}$ is~1 unless $\xxx_{\idx}$~is masked, and $\wgt_{\idx}$~is the weight. The maximum and minimum errors $\pslmax$ and~$\pslmin$ are both signed $$ \pslmax = {\rm max}(\xxx_{\idx} - \qqq_{\idx})\qquad\hbox{and}\qquad \pslmin = {\rm min}(\xxx_{\idx} - \qqq_{\idx}) $$ while the maximum and minimum absolute errors $\pslmabs$ and $\pslmibs$ are positive-definite. $$ \pslmabs = {\rm max}|\xxx_{\idx} - \qqq_{\idx}| = {\rm max}(|\pslmax|,|\pslmin|) $$ $$ \pslmibs = {\rm min}|\xxx_{\idx} - \qqq_{\idx}| = {\rm min}(|\pslmax|,|\pslmin|) $$ Typically $\pslmibs = 0$ for quantization, since many exact values need no quantization. Bit-shifting zeros into the least significant bits (@acronym{LSB}s) always underestimates true values so that $\pslmax = 0$. Conversely, bit-shifting ones into the @acronym{LSB}s always overestimates true values so that $\pslmin = 0$. Our @acronym{NSD} algorithm is balanced because it alternates bit-shifting zeroes and ones. Balanced algorithms should yield $\pslmax \approx -\pslmin$, $\pslmabs \approx \pslmibs$, and $\pslavg \approx 0$. The three most important error metrics for quantization are $\pslmabs$, $\pslmebs$, and~$\pslavg$. The upper bound (worst case) quantization performance is~$\pslmabs$. $\pslmebs$~measures the absolute mean accuracy of quantization, and does not allow positive and negative offsets to compensate eachother and conceal poor performance. The difference bewtween~$\pslmabs$ and~$\pslmebs$ indicates how much of an outlier the worst case is. The mean accuracy~$\pslavg$ indicates whether statistical properties of quantized numbers will accurately reflect the true values. @end tex All three metrics are expressed in terms of the fraction of the ten's place occupied by the @acronym{LSD}. If the @acronym{LSD} is the hundreds digit or the thousandths digit, then the metrics are fractions @w{of 100}, or @w{of 1/100}, respectively. @acronym{PPC} algorithms should produce maximum absolute errors no greater @w{than 0.5} in these units. If the @acronym{LSD} is the hundreds digit, then quantized versions of true values will be within fifty of the true value. It is much easier to satisfy this tolerance for a true value @w{of 100} (only 50% accuracy required) than @w{for 999} @w{(5% accuracy} required). Thus the minimum accuracy guaranteed for @math{@var{nsd}=1} ranges from 5--50%. For this reason, the best and worst cast performance usually occurs for true values whose @acronym{LSD} value is close to one and nine, respectively. Of course most users prefer @math{@var{prc} > 1} because accuracies increase exponentially with @var{prc}. Continuing the previous example to @math{@var{prc}=2}, quantized versions of true values from 1000--9999 will also be @w{within 50} of the true value, i.e., have accuracies from 0.5--5%. In other words, only two significant digits are necessary to guarantee better @w{than 5%} accuracy in quantization. We recommend that dataset producers and users consider quantizing datasets with @math{@var{nsd}=3}. This guarantees accuracy of 0.05--0.5% for individual values. Statistics computed from ensembles of quantized values will, assuming the mean error @set flg @tex $\pslavg$ @clear flg @end tex @ifinfo @math{@var{Emean}} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{Emean} @clear flg @end ifset is small, have much better accuracy @w{than 0.5%}. This accuracy is the most that can be justified for many applications. To demonstrate these principles we conduct error analyses on an artificial, reproducible dataset, and on an actual dataset of observational analysis values. @footnote{The artificial dataset employed is one million evenly spaced values from 1.0--2.0. The analysis data are @math{N=13934592} values of the temperature field from the @acronym{NASA} @acronym{MERRA} analysis of 20130601.} The table summarizes quantization accuracy based on the three metrics. @table @code @item NSD Number of Significant Digits. @item Emabs Maximum absolute error. @item Emebs Mean absolute error. @item Emean Mean error. @end table @ignore 9.9692099683868690e+36f = 0 1111100 111100000000000000000000 NC_FILL_FLOAT 2.3509885615147286E-38f = 0 0000000 111111111111111111111111 Recommended 9.9692099683868690e+36 = 0 1000111100 11110000000000000000000000000000000000000000000000000 NC_FILL_DOUBLE 2.84809453888921745415348453979E-306 = 0 0000000111 11111111111111111111111111111111111111111111111111111 Recommended 2.22507385850720088902458687609E-308 = 0 0000000000 11111111111111111111111111111111111111111111111111111 1.17549435082228737746264717725E-38 = 0 0111000000 11111111111111111111111111111111111111111111111111111 1.17549435082228737746264717725E-38 = 0 0000000 100000000000000000000000 # Accuracy tests # Satellite: ncks -3 -O -v T ${DATA}/hdf/MERRA300.prod.assim.inst3_3d_asm_Cp.20130601.nc ~/foo_T.nc ncatted -a scale_factor,,d,, -a add_offset,,d,, ~/foo_T.nc ncap2 -O -v -s 'ppc=T;nsd1=ppc;nsd2=ppc;nsd3=ppc;nsd4=ppc;nsd5=ppc;nsd6=ppc;nsd7=ppc' ~/foo_T.nc ~/foo_ppc_in.nc # Artificial double ncap2 -O -v -s 'defdim("dmn",1000000);ppc=array(1.0,1.e-6,$dmn);nsd1=ppc;nsd2=ppc;nsd3=ppc;nsd4=ppc;nsd5=ppc;nsd6=ppc;nsd7=ppc' ~/nco/data/in.nc ~/foo_ppc_in.nc # Artificial float ncap2 -O -v -s 'defdim("dmn",1000000);ppc=float(array(1.0,1.e-6,$dmn));nsd1=ppc;nsd2=ppc;nsd3=ppc;nsd4=ppc;nsd5=ppc;nsd6=ppc;nsd7=ppc' ~/nco/data/in.nc ~/foo_ppc_in.nc # nc3tonc4 nc3tonc4 -o --quantize=nsd1=1,nsd2=2,nsd3=3,nsd4=4,nsd5=5,nsd6=6,nsd7=7 --quiet=1 ~/foo_ppc_in.nc ~/foo_ppc_out.nc # DSD ncks -O -C --ppc nsd1=.1 --ppc nsd2=.2 --ppc nsd3=.3 --ppc nsd4=.4 --ppc nsd5=.5 --ppc nsd6=.6 --ppc nsd7=.7 ~/foo_ppc_in.nc ~/foo_ppc_out.nc # NSD ncks -O -C --ppc nsd1=1 --ppc nsd2=2 --ppc nsd3=3 --ppc nsd4=4 --ppc nsd5=5 --ppc nsd6=6 --ppc nsd7=7 ~/foo_ppc_in.nc ~/foo_ppc_out.nc # Generic rounding test: ncbo -O -C ~/foo_ppc_out.nc ~/foo_ppc_in.nc ~/foo_ppc_dff.nc ncbo -O -C -y dvd ~/foo_ppc_dff.nc ~/foo_ppc_in.nc ~/foo_ppc_rat.nc ncap2 -O -v -s 'nsd1*=10;nsd2*=100;nsd3*=1000;nsd4*=10000;nsd5*=100000;nsd6*=1000000;nsd7*=10000000' ~/foo_ppc_rat.nc ~/foo_ppc_rat_scl.nc ncwa -O -C -y avg ~/foo_ppc_rat_scl.nc ~/foo_ppc_avg.nc ncwa -O -C -y max ~/foo_ppc_rat_scl.nc ~/foo_ppc_max.nc ncwa -O -C -y min ~/foo_ppc_rat_scl.nc ~/foo_ppc_min.nc ncwa -O -C -y mabs ~/foo_ppc_rat_scl.nc ~/foo_ppc_mabs.nc ncwa -O -C -y mebs ~/foo_ppc_rat_scl.nc ~/foo_ppc_mebs.nc ncwa -O -C -y mibs ~/foo_ppc_rat_scl.nc ~/foo_ppc_mibs.nc @end ignore @example Artificial Data: N=1000000 values in [1.0,2.0) in steps of 1.0e-6 Single-Precision Double-Precision Single-Precision NSD Emabs Emebs Emean Emabs Emebs Emean DSD Emabs Emebs Emean 1 0.31 0.11 4.1e-4 0.31 0.11 4.0e-4 1 0.30 0.11 -8.1e-4 2 0.39 0.14 6.8e-5 0.39 0.14 5.5e-5 2 0.39 0.14 -1.3e-4 3 0.49 0.17 1.0e-6 0.49 0.17 -5.5e-7 3 0.49 0.17 -2.0e-5 4 0.30 0.11 3.2e-7 0.30 0.11 -6.1e-6 4 0.30 0.11 5.1e-8 5 0.37 0.13 3.1e-7 0.38 0.13 -5.6e-6 5 0.38 0.13 2.6e-6 6 0.36 0.12 -4.4e-7 0.48 0.17 -4.1e-7 6 0.48 0.17 7.2e-6 7 0.00 0.00 0.0 0.30 0.10 1.5e-7 7 0.00 0.00 0.0 Observational Analysis: N=13934592 values MERRA Temperature 20130601 Single-Precision NSD Emabs Emebs Emean 1 0.31 0.11 2.4e-3 2 0.39 0.14 3.8e-4 3 0.49 0.17 -9.6e-5 4 0.30 0.11 2.3e-3 5 0.37 0.13 2.2e-3 6 0.36 0.13 1.7e-2 7 0.00 0.00 0.0 @end example All results show that @acronym{PPC} quantization performs as expected. Absolute maximum errors @math{@var{Emabs} < 0.5} for all @var{prc}. For @math{1 <= @var{prc} <= 6}, quantization results in comparable maximum absolute and mean absolute errors @var{Emabs} and @var{Emebs}, respectively. Mean errors @var{Emean} are orders of magnitude smaller because quantization produces over- and under-estimated values in balance. When @math{@var{prc}=7}, quantization of single-precision values is ineffective, because all available bits are used to represent the maximum precision of seven digits. The maximum and mean absolute errors @var{Emabs} and @var{Emebs} are nearly identical across algorithms, precisions, and dataset types. This is consistent with both the artificial data and empirical data being random, and thus exercising equally strengths and weaknesses of the algorithms over the course of millions of input values. We generated artificial arrays with many different starting values and interval spacing and all gave qualitatively similar results. The results presented are the worst obtained. The artificial data has much smaller mean error @var{Emean} than the observational analysis. The reason why is unclear. It may be because the temperature field is concentrated in particular ranges of values (and associated quantization errors) prevalent on Earth, e.g., @math{200 < @var{T} < 320}. It is worth noting that the mean error @math{@var{Emean} < 0.01} for @math{1 <= @var{prc} < 6}, and that @var{Emean} is typically at least two or more orders of magnitude less than @var{Emabs}. Thus quantized values with precisions as low as @math{@var{prc}=1} still yield highly significant statistics by contemporary scientific standards. Testing shows that @acronym{PPC} quantization enhances compression of typical climate datasets. The degree of enhancement depends, of course, on the required precision. Model results are often computed as @code{NC_DOUBLE} then archived as @code{NC_FLOAT} to save space. @ignore # Unidata Compression Blog: # http://www.unidata.ucar.edu/blogs/developer/en/entry/netcdf_compression # Table entries fl=${DATA}/dstmch90/dstmch90_clm.nc fl=${DATA}/hdf/b1850c5cn_doe_polar_merged_0_cesm1_2_0_HD+MAM4+tun2b.hp.e003.cam.h0.0001-01.nc fl=${DATA}/hdf/MERRA300.prod.assim.inst3_3d_asm_Cp.20130601.nc fl=${DATA}/hdf/OMI-Aura_L2-OMIAuraSO2_2012m1222-o44888_v01-00-2014m0107t114720.h5 # ncks PPC only sz_rgn=`ls -l ${fl} | cut -d ' ' -f 5` fmt_fnc(){ gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}';} cmd="ls -l ${fl}";sz_new=`${cmd} | cut -d ' ' -f 5`;fmt_fnc ${sz_rgn} ${sz_new} sz_new=`bzip2 -1 -f ${fl};ls -l ${fl}.bz2 | cut -d ' ' -f 5`;bunzip2 ${fl}.bz2;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`bzip2 -9 -f ${fl};ls -l ${fl}.bz2 | cut -d ' ' -f 5`;bunzip2 ${fl}.bz2;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 0 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 9 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncpdq -O -7 -L 0 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncpdq -O -7 -L 1 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=7 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=6 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=5 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=4 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=3 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=2 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncks -O -7 -L 1 --ppc default=1 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncpdq -O -7 -L 1 --ppc default=4 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncpdq -O -7 -L 9 --ppc default=4 ${fl} ~/foo.nc;ls -l ~/foo.nc | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' sz_new=`ncpdq -O -3 --ppc default=4 ${fl} ~/foo.nc;bzip2 -1 -f ~/foo.nc;ls -l ~/foo.nc.bz2 | cut -d ' ' -f 5`;echo ${sz_rgn} ${sz_new} | gawk '{print "old=" $1/1000000 " MB, new=" $2/1000000 " MB, cmp=" 100*$2/$1 "%"}' @end ignore @html @end html @cindex Burrows-Wheeler algorithm @cindex @command{bzip2} This table summarizes the performance of lossless and lossy compression on two typical, or at least random, netCDF data files. The files were taken from representative model-simulated and satellite-retrieved datasets. Only floating point data were compressed. No attempt was made to compress integer-type variables as they occupy an insignificant fraction of every dataset. The columns are @table @code @item Type File-type: @kbd{N3} for netCDF @code{CLASSIC}, @kbd{N4} for @code{NETCDF4}, @kbd{N7} for @code{NETCDF4_CLASSIC} (which comprises netCDF3 data types and structures with netCDF4 storage features like compression), @kbd{H4} for @acronym{HDF4}, and @kbd{H5} for @acronym{HDF5}. @kbd{N4/7} means results apply to both @kbd{N4} and @kbd{N7} filetypes. @item LLC Type of lossless compression employed, if any. Bare numbers refer to the strength of the @acronym{DEFLATE} algorithm employed internally by netCDF4/@acronym{HDF5}, while numbers prefixed with @kbd{B} refer to the block size employed by the Burrows-Wheeler algorithm in @command{bzip2}. @item PPC Number of significant digits retained by the precision-preserving compression @acronym{NSD} algorithm. @item Pck @kbd{Y} if the default @command{ncpdq} packing algorithm (convert floating point types to @code{NC_SHORT}) was employed. @item Size Resulting filesize in @acronym{MB}. @item % Compression ratio, i.e., resulting filesize relative to original size, in percent. In some cases the original files is already losslessly compressed. The compression ratios reported are relative to the size of the original file as distributed, not as optimally losslessly compressed. @end table A dash (@kbd{-}) indicates the associated compression feature was not employed. @ignore # Lines trimmed from table as redundant/misleading N7 1 4 Y 7.9 22.9 ncpdq --ppc default=4 N7 9 4 Y 7.7 22.1 ncpdq -L 9 --ppc default=4 N3 B1 4 Y 6.3 18.1 ncpdq --ppc default=4 bzip2 -1 N7 1 4 Y 26.3 21.9 ncpdq --ppc default=4 N7 9 4 Y 25.6 21.4 ncpdq -L 9 --ppc default=4 N3 B1 4 Y 20.9 17.4 ncpdq --ppc default=4 bzip2 -1 N4/7 1 4 Y 133.6 54.7 ncpdq -L 1 --ppc default=4 N4/7 9 4 Y 127.0 52.0 ncpdq -L 9 --ppc default=4 N3 B1 4 Y 114.0 46.7 ncpdq --ppc default=4 bzip2 -1 N4 1 4 Y 13.0 44.0 ncpdq -L 1 --ppc default=4 N4 9 4 Y 12.5 42.5 ncpdq -L 9 --ppc default=4 @end ignore @example # dstmch90_clm.nc Type LLC PPC Pck Size % Flags and Notes N3 - - - 34.7 100.0 Original is not compressed N3 B1 - - 28.9 83.2 bzip2 -1 N3 B9 - - 29.3 84.4 bzip2 -9 N7 - - - 35.0 101.0 N7 1 - - 28.2 81.3 -L 1 N7 9 - - 28.0 80.8 -L 9 N7 - - Y 17.6 50.9 ncpdq -L 0 N7 1 - Y 7.9 22.8 ncpdq -L 1 N7 1 7 - 28.2 81.3 --ppc default=7 N7 1 6 - 27.9 80.6 --ppc default=6 N7 1 5 - 25.9 74.6 --ppc default=5 N7 1 4 - 22.3 64.3 --ppc default=4 N7 1 3 - 18.9 54.6 --ppc default=3 N7 1 2 - 14.5 43.2 --ppc default=2 N7 1 1 - 10.0 29.0 --ppc default=1 # b1850c5cn_doe_polar_merged_0_cesm1_2_0_HD+MAM4+tun2b.hp.e003.cam.h0.0001-01.nc Type LLC PPC Pck Size % Flags and Notes N3 - - - 119.8 100.0 Original is not compressed N3 B1 - - 84.2 70.3 bzip2 -1 N3 B9 - - 84.8 70.9 bzip2 -9 N7 - - - 120.5 100.7 N7 1 - - 82.6 69.0 -L 1 N7 9 - - 82.1 68.6 -L 9 N7 - - Y 60.7 50.7 ncpdq -L 0 N7 1 - Y 26.0 21.8 ncpdq -L 1 N7 1 7 - 82.6 69.0 --ppc default=7 N7 1 6 - 81.9 68.4 --ppc default=6 N7 1 5 - 77.2 64.5 --ppc default=5 N7 1 4 - 69.0 57.6 --ppc default=4 N7 1 3 - 59.3 49.5 --ppc default=3 N7 1 2 - 49.5 41.3 --ppc default=2 N7 1 1 - 38.2 31.9 --ppc default=1 # MERRA300.prod.assim.inst3_3d_asm_Cp.20130601.hdf Type LLC PPC Pck Size % Flags and Notes H4 5 - - 244.3 100.0 Original is compressed H4 B1 - - 244.7 100.1 bzip2 -1 N4 5 - - 214.5 87.8 N7 5 - - 210.6 86.2 N4 B1 - - 215.4 88.2 bzip2 -1 N4 B9 - - 214.8 87.9 bzip2 -9 N3 - - - 617.1 252.6 N4/7 - - - 694.0 284.0 -L 0 N4/7 1 - - 223.2 91.3 -L 1 N4/7 9 - - 207.3 84.9 -L 9 N4/7 - - Y 347.1 142.1 ncpdq -L 0 N4/7 1 - Y 133.6 54.7 ncpdq -L 1 N4/7 1 7 - 223.1 91.3 --ppc default=7 N4/7 1 6 - 225.1 92.1 --ppc default=6 N4/7 1 5 - 221.4 90.6 --ppc default=5 N4/7 1 4 - 201.4 82.4 --ppc default=4 N4/7 1 3 - 185.3 75.9 --ppc default=3 N4/7 1 2 - 150.0 61.4 --ppc default=2 N4/7 1 1 - 100.8 41.3 --ppc default=1 # OMI-Aura_L2-OMIAuraSO2_2012m1222-o44888_v01-00-2014m0107t114720.h5 Type LLC PPC Pck Size % Flags and Notes H5 5 - - 29.5 100.0 Original is compressed H5 B1 - - 29.3 99.6 bzip2 -1 N4 5 - - 29.5 100.0 N4 B1 - - 29.3 99.6 bzip2 -1 N4 B9 - - 29.3 99.4 bzip2 -9 N4 - - - 50.7 172.3 -L 0 N4 1 - - 29.8 101.3 -L 1 N4 9 - - 29.4 99.8 -L 9 N4 - - Y 27.7 94.0 ncpdq -L 0 N4 1 - Y 12.9 43.9 ncpdq -L 1 N4 1 7 - 29.7 100.7 --ppc default=7 N4 1 6 - 29.7 100.8 --ppc default=6 N4 1 5 - 27.3 92.8 --ppc default=5 N4 1 4 - 23.8 80.7 --ppc default=4 N4 1 3 - 20.3 69.0 --ppc default=3 N4 1 2 - 15.1 51.2 --ppc default=2 N4 1 1 - 9.9 33.6 --ppc default=1 @end example @cindex @acronym{NCAR} @cindex @acronym{CAM} @cindex @acronym{GCM} A selective, per-variable approach to @acronym{PPC} yields the best balance of precision and compression yet requires the dataset producer to understand the intrinsic precision of each variable. Such a specification for a @acronym{GCM} dataset might look like this (using names for the @acronym{NCAR} @acronym{CAM} model): @example # Be conservative on non-explicit quantities, so default=5 # Some quantities deserve four significant digits # Many quantities, such as aerosol optical depths and burdens, are # highly uncertain and only useful to three significant digits. ncks -7 -O \ --ppc default=5 \ --ppc AN.?,AQ.?=4 \ --ppc AER.?,AOD.?,ARE.?,AW.?,BURDEN.?=3 \ ncar_cam.nc ~/foo.nc @end example @html @end html @node Deflation, MD5 digests, Compression, Shared features @section Deflation @cindex @code{-L} @cindex @code{--deflate} @cindex @code{--dfl_lvl} @cindex Lempel-Ziv deflation @cindex compression @cindex deflation @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncks}, @command{ncpdq}, @command{ncra}, @command{ncrcat}, @command{ncwa}@* Short options: @samp{-L}@* Long options: @samp{--dfl_lvl}, @samp{--deflate}@* @end cartouche All @acronym{NCO} operators that define variables support the netCDF4 feature of storing variables compressed with the lossless @acronym{DEFLATE} compression algorithm. @acronym{DEFLATE} combines the Lempel-Ziv encoding with Huffman coding. The specific version used by netCDF4/@acronym{HDF5} is that implemented in the @command{zlib} library used by @command{gzip}. Activate deflation with the @code{-L @var{dfl_lvl}} short option (or with the same argument to the @samp{--dfl_lvl} or @samp{--deflate} long options). Specify the deflation level @var{dfl_lvl} on a scale from no deflation (@var{dfl_lvl = 0}) to maximum deflation (@var{dfl_lvl = 9}). Under the hood, this selects the compression blocksize. Minimal deflation (@var{dfl_lvl = 1}) achieves considerable storage compression with little time penalty. Higher deflation levels require more time for compression. File sizes resulting from minimal (@var{dfl_lvl = 1}) and maximal (@var{dfl_lvl = 9}) deflation levels typically differ by less @w{than 10%} in size. To compress an entire file using deflation, use @example ncks -4 -L 0 in.nc out.nc # No deflation (fast, no time penalty) ncks -4 -L 1 in.nc out.nc # Minimal deflation (little time penalty) ncks -4 -L 9 in.nc out.nc # Maximal deflation (much slower) @end example Unscientific testing shows that deflation compresses typical climate datasets by 30-60%. Packing, a lossy compression technique available for all netCDF files (see @ref{Packed data}), can easily compress files by 50%. Packed data may be deflated to squeeze datasets by about 80%: @example ncks -4 -L 1 in.nc out.nc # Minimal deflation (~30-60% compression) ncks -4 -L 9 in.nc out.nc # Maximal deflation (~31-63% compression) ncpdq in.nc out.nc # Standard packing (~50% compression) ncpdq -4 -L 9 in.nc out.nc # Deflated packing (~80% compression) @end example @findex ncks @command{ncks} prints deflation parameters, if any, to screen (@pxref{ncks netCDF Kitchen Sink}). @html @end html @node MD5 digests, Buffer sizes, Deflation, Shared features @section MD5 digests @cindex @code{--md5_digest} @cindex @code{--md5_dgs} @cindex @code{--md5_wrt_att} @cindex @code{--md5_write_attribute} @cindex integrity @cindex security @cindex digest @cindex hash @cindex MD5 digest @cartouche Availability: @command{ncecat}, @command{ncks}, @command{ncrcat}@* Short options: @* Long options: @samp{--md5_dgs}, @samp{--md5_digest}, @samp{--md5_wrt_att}, @samp{--md5_write_attribute}@* @end cartouche As of @acronym{NCO} version 4.1.0 (April, 2012), @acronym{NCO} supports data integrity verification using the @acronym{MD5} digest algorithm. This support is currently implemented in @command{ncks} and in the multifile concantenators @command{ncecat} and @command{ncrcat}. Activate it with the @samp{--md5_dgs} or @samp{--md5_digest} long options. As of @acronym{NCO} version 4.3.3 (July, 2013), @acronym{NCO} will write the @acronym{MD5} digest of each variable as an @code{NC_CHAR} attribute named @code{MD5}. This support is currently implemented in @command{ncks} and in the multifile concantenators @command{ncecat} and @command{ncrcat}. Activate it with the @samp{--md5_wrt_att} or @samp{--md5_write_attribute} long options. The behavior and verbosity of the @acronym{MD5} digest is operator-dependent. When activating @acronym{MD5} digests with @command{ncks} it is assumed that the user simply wishes to see the digest of every variable and this is done when the debugging level exceeds one. This incurs only the minor overhead of performing the hash algorithm for each variable read. @acronym{MD5} digests may be activated in both the one- and two-filename argument forms of @command{ncks}, which are used for printing and for sub-setting, respectively. The @acronym{MD5} digests are shown as a 32-character hexadecimal string in which each two characters represent one byte of the 16-byte digest: @example > ncks -O -D 2 -C --md5 -v md5_a,md5_abc ~/nco/data/in.nc ... ncks: INFO MD5(md5_a) = 0cc175b9c0f1b6a831c399e269772661 md5_a = 'a' ncks: INFO MD5(md5_abc) = 900150983cd24fb0d6963f7d28e17f72 lev[0]=100 md5_abc[0--2]='abc' > ncks -O -D 2 -C -d lev,0 --md5 -v md5_a,md5_abc ~/nco/data/in.nc ... ncks: INFO MD5(md5_a) = 0cc175b9c0f1b6a831c399e269772661 md5_a = 'a' ncks: INFO MD5(md5_abc) = 0cc175b9c0f1b6a831c399e269772661 lev[0]=100 md5_abc[0--0]='a' @end example In fact these examples demonstrate the validity of the hash algorithm since the @acronym{MD5} hashes of the strings ``a'' and ``abc'' are widely known. The second example shows that the hyperslab of variable @code{md5_abc} (= ``abc'') consisting of only its first letter (= ``a'') has the same hash as the variable @code{md5_a} (``a''). This illustrates that @acronym{MD5} digests act only on variable data, not on metadata. When activating @acronym{MD5} digests with @command{ncecat} or @command{ncrcat} it is assumed that the user wishes to verify that every variable written to disk has the same @acronym{MD5} digest as when it is subsequently read from disk. This incurs the major additional overhead of reading in each variable after it is written and performing the hash algorithm again on that to compare to the original hash. Moreover, it is assumed that such operations are generally done ``production mode'' where the user is not interested in actually examining the digests herself. The digests proceed silently unless the debugging level exceeds three: @example > ncecat -O -D 4 --md5 -p ~/nco/data in.nc in.nc ~/foo.nc | grep MD5 ... ncecat: INFO MD5(wnd_spd) = bec190dd944f2ce2794a7a4abf224b28 ncecat: INFO MD5 digests of RAM and disk contents for wnd_spd agree > ncrcat -O -D 4 --md5 -p ~/nco/data in.nc in.nc ~/foo.nc | grep MD5 ... ncrcat: INFO MD5(wnd_spd) = 74699bb0a72b7f16456badb2c995f1a1 ncrcat: INFO MD5 digests of RAM and disk contents for wnd_spd agree @end example Regardless of the debugging level, an error is returned when the digests of the variable read from the source file and from the output file disagree. These rules are evolving and as @acronym{NCO} pays more attention to data integrity. We welcome feedback and suggestions from users. @html @end html @node Buffer sizes, RAM disks, MD5 digests, Shared features @section Buffer sizes @cindex @code{--bfr_sz_hnt} @cindex Buffer sizes @cindex File buffers @cindex @command{stat() system call} @cindex I/O block size @cindex System calls @cartouche Availability: All operators@* Short options: @* Long options: @samp{--bfr_sz_hnt}, @samp{--buffer_size_hint}@* @end cartouche As of @acronym{NCO} version 4.2.0 (May, 2012), @acronym{NCO} allows the user to request specific buffer sizes to allocate for reading and writing files. This buffer size determines how many system calls the netCDF layer must invoke to read and write files. By default, netCDF uses the preferred I/O block size returned as the @samp{st_blksize} member of the @samp{stat} structure returned by the @command{stat()} system call @footnote{ On modern Linux systems the block size defaults to @w{8192 B}. The GLADE filesystem at NCAR has a block size of @w{512 kB}.}. Otherwise, netCDF uses twice the system pagesize. Larger sizes can increase access speed by reducing the number of system calls netCDF makes to read/write data from/to disk. Because netCDF cannot guarantee the buffer size request will be met, the actual buffer size granted by the system is printed as an INFO statement. @example # Request 2 MB file buffer instead of default 8 kB buffer > ncks -O -D 3 --bfr_sz=2097152 ~/nco/data/in.nc ~/foo.nc ... ncks: INFO nc__open() will request file buffer size = 2097152 bytes ncks: INFO nc__open() opened file with buffer size = 2097152 bytes ... @end example @html @end html @node RAM disks, Packed data, Buffer sizes, Shared features @section RAM disks @cindex @code{--ram_all} @cindex @code{--create_ram} @cindex @code{--open_ram} @cindex @code{--diskless_all} @cindex @acronym{RAM} disks @cindex @acronym{RAM} files @cindex @code{NC_DISKLESS} @cindex diskless files @cindex memory requirements @cindex memory available @cindex @acronym{RAM} @cindex swap space @cindex peak memory usage @cartouche Availability: All operators@* Short options: @* Long options: @samp{--ram_all}, @samp{--create_ram}, @samp{--open_ram}, @samp{--diskless_all}@* @end cartouche As of @acronym{NCO} version 4.2.1 (August, 2012), @acronym{NCO} supports the use of diskless files, aka @acronym{RAM} disks, for file access and creation. Two independent switches, @samp{--open_ram} and @samp{--create_ram}, control this feature. Before describing the specifics of these switches, we describe why many @acronym{NCO} operations will not benefit from them. Essentially, reading/writing from/to @acronym{RAM} rather than disk only hastens the task when reads/writes to disk are avoided. Most @acronym{NCO} operations are simple enough that they require a single read-from/write-to disk for every block of input/output. Diskless access does not change this, but it does add an extra read-from/write-to RAM. However this extra @acronym{RAM} write/read does avoid contention for limited system resources like disk-head access. Operators which may benefit from @acronym{RAM} disks include @command{ncwa}, which may need to read weighting variables multiple times, the multi-file operators @command{ncra}, @command{ncrcat}, and @command{ncecat}, which may try to write output at least once per input file, and @command{ncap2} scripts which may be arbitrarily long and convoluted. The @samp{--open_ram} switch causes input files to copied to @acronym{RAM} when opened. All further metadata and data access occurs in @acronym{RAM} and thus avoids access time delays caused by disk-head movement. Usually input data is read at most once so it is unlikely that requesting input files be stored in @acronym{RAM} will save much time. The likeliest exceptions are files that are accessed numerous times, such as those analyzed extensively analyzed by @command{ncap2}. Invoking @samp{--open_ram}, @samp{--ram_all}, or @samp{--diskless_all} uses much more system memory. To copy the input file to @acronym{RAM} increases the sustained memory use by exactly the on-disk filesize of the input file, i.e., @math{MS += FT}. For large input files this can be a huge memory burden that starves the rest of the @acronym{NCO} analysis of sufficient @acronym{RAM}. To be safe, use @samp{--open_ram}, @samp{--ram_all}, or @samp{--diskless_all} only on files that are much (say at least a factor of four) smaller than your available system @acronym{RAM}. See @ref{Memory Requirements} for further details. @cindex @acronym{RAM} variables The @samp{--create_ram} switch causes output files to be created in RAM, rather than on disk. These files are copied to disk only when closed, i.e., when the operator completes. Creating files in @acronym{RAM} may save time, especially with @command{ncap2} computations that are iterative, e.g., loops, and for multi-file operators that write output every record (timestep) or file. RAM files provide many of the same benefits as @acronym{RAM} variables in such cases (@pxref{RAM variables}). Two switches, @samp{--ram_all} and @samp{--diskless_all}, are convenient shortcuts for specifying both @samp{--create_ram} and @samp{--diskless_ram}. Thus @example ncks in.nc out.nc # Default: Open in.nc on disk, write out.nc to disk ncks --open_ram in.nc out.nc # Open in.nc in RAM, write out.nc to disk ncks --create_ram in.nc out.nc # Create out.nc in RAM, write to disk # Open in.nc in RAM, create out.nc in RAM, then write out.nc to disk ncks --open_ram --create_ram in.nc out.nc ncks --ram_all in.nc out.nc # Same as above ncks --diskless_all in.nc out.nc # Same as above @end example It is straightforward to demonstrate the efficacy of @acronym{RAM} disks. For @acronym{NASA} we constructed a test that employs @command{ncecat} an arbitrary number (set to one hundred thousand) of files are all symbolically linked to the same file. Everything is on the local filesystem (not @acronym{DAP}). @example @verbatim # Create symbolic links for benchmark cd ${DATA}/nco # Do all work here for idx in {1..99999}; do idx_fmt=`printf "%05d" ${idx}` /bin/ln -s ${DATA}/nco/LPRM-AMSR_E_L3_D_SOILM3_V002-20120512T111931Z_20020619.nc \ ${DATA}/nco/${idx_fmt}.nc done # Benchmark time to ncecat one hundred thousand files time ncecat --create_ram -O -u time -v ts -d Latitude,40.0 \ -d Longitude,-105.0 -p ${DATA}/nco -n 99999,5,1 00001.nc ~/foo.nc @end verbatim @end example Run normally on a laptop in 201303, this completes in @w{21 seconds}. The @samp{--create_ram} reduces the elapsed time to @w{9 seconds}. Some of this speed may be due to using symlinks and caching. However, the efficacy of @samp{--create_ram} is clear. Placing the output file in @acronym{RAM} avoids thousands of disk writes. It is not unreasonable to for @acronym{NCO} to process a million files like this in a few minutes. However, there is no substitute for benchmarking with real files. @cindex temporary output files @cindex temporary files @cindex @code{--no_tmp_fl} A completely independent way to reduce time spent writing files is to refrain from writing temporary output files. This is accomplished with the @samp{--no_tmp_fl} switch (@pxref{Temporary Output Files}). @html @end html @node Packed data, Operation Types, RAM disks, Shared features @section Packed data @cindex packing @cindex unpacking @cindex @code{add_offset} @cindex @code{scale_factor} @cindex @code{missing_value} @cindex @code{_FillValue} @cindex @command{pack(x)} @cindex @command{unpack(x)} @cindex @code{--hdf_upk} @cindex @code{--hdf_unpack} @cartouche Availability: @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncflint}, @command{ncpdq}, @command{ncra}, @command{ncwa}@* Short options: None@* Long options: @samp{--hdf_upk}, @samp{--hdf_unpack}@* @end cartouche The phrase @dfn{packed data} refers to data which are stored in the standard netCDF3 packing format which employs a lossy algorithm. See @ref{ncks netCDF Kitchen Sink} for a description of deflation, a lossless compression technique available with netCDF4 only. Packed data may be deflated to save additional space. @unnumberedsubsec Packing Algorithm @dfn{Packing} The standard netCDF packing algorithm (described @uref{http://www.unidata.ucar.edu/software/netcdf/docs/netcdf/Attribute-Conventions.html, here}) produces data with the same dynamic range as the original but which requires no more than half the space to store. Like all packing algorithms, it is @emph{lossy}. The packed variable is stored (usually) as type @code{NC_SHORT} with the two attributes required to unpack the variable, @code{scale_factor} and @code{add_offset}, stored at the original (unpacked) precision of the variable @footnote{Although not a part of the standard, @acronym{NCO} enforces the policy that the @code{_FillValue} attribute, if any, of a packed variable is also stored at the original precision.}. Let @var{min} and @var{max} be the minimum and maximum values @w{of @var{x}.} @tex $$ \rm \eqalign{\hbox{scale\_factor} &= (\hbox{max}-\hbox{min})/\hbox{ndrv}\cr \hbox{add\_offset} &= (\hbox{min}+\hbox{max})/2\cr \hbox{pck} &= (\hbox{upk}-\hbox{add\_offset})/\hbox{scale\_factor}\cr &= {\hbox{ndrv}\times[\hbox{upk}-(\hbox{min}+\hbox{max})/2]\over\hbox{max}-\hbox{min}}\cr} $$ @end tex @ifnottex @sp 1 @var{scale_factor} = (@var{max}-@var{min})/@var{ndrv}@* @var{add_offset} = 0.5*(@var{min}+@var{max})@* @var{pck} = (@var{upk}-@var{add_offset})/@var{scale_factor} = (@var{upk}-0.5*(@var{min}+@var{max}))*@var{ndrv}/(@var{max}-@var{min})@* @sp 1 @end ifnottex where @var{ndrv} is the number of discrete representable values for given type of packed variable. The theoretical maximum value for @var{ndrv} is two raised to the number of bits used to store the packed variable. Thus if the variable is packed into type @code{NC_SHORT}, a two-byte datatype, then there are at most @math{2^{16} = 65536} distinct values representable. In practice, the number of discretely representible values is taken to be two less than the theoretical maximum. This leaves space for a missing value and solves potential problems with rounding that may occur during the unpacking of the variable. Thus for @code{NC_SHORT}, @math{ndrv = 65536 - 2 = 65534}. Less often, the variable may be packed into type @code{NC_CHAR}, where @math{ndrv = 2^{8} - 2 = 256 - 2 = 254}, or type @code{NC_INT} where where @math{ndrv = 2^{32} - 2 = 4294967295 - 2 = 4294967293}. One useful feature of (lossy) netCDF packing algorithm is that additional, loss-less packing algorithms perform well on top of it. @html @end html @unnumberedsubsec Unpacking Algorithm @dfn{Unpacking} The unpacking algorithm depends on the presence of two attributes, @code{scale_factor} and @code{add_offset}. If @code{scale_factor} is present for a variable, the data are multiplied by the value @var{scale_factor} after the data are read. If @code{add_offset} is present for a variable, then the @var{add_offset} value is added to the data after the data are read. If both @code{scale_factor} and @code{add_offset} attributes are present, the data are first scaled by @var{scale_factor} before the offset @var{add_offset} is added. @tex $$ \rm \eqalign{\hbox{upk} &= \hbox{scale\_factor}\times\hbox{pck} + \hbox{add\_offset}\cr &= {\hbox{pck}\times(\hbox{max}-\hbox{min})\over\hbox{ndrv}} + {\hbox{min}+\hbox{max}\over2}\cr} $$ @end tex @ifnottex @sp 1 @var{upk} = @var{scale_factor}*@var{pck} + @var{add_offset} = (@var{max}-@var{min})*@var{pck}/@var{ndrv} + 0.5*(@var{min}+@var{max})@* @sp 1 @end ifnottex When @code{scale_factor} and @code{add_offset} are used for packing, the associated variable (containing the packed data) is typically of type @code{byte} or @code{short}, whereas the unpacked values are intended to be of type @code{int}, @code{float}, or @code{double}. An attribute's @code{scale_factor} and @code{add_offset} and @code{_FillValue}, if any, should all be of the type intended for the unpacked data, i.e., @code{int}, @code{float} or @code{double}. @unnumberedsubsec Default Handling of Packed Data @html @end html @cindex interoperability @cindex @acronym{HDF} unpacking Most files originally written in @acronym{HDF} format use the @acronym{HDF} packing/unpacking algorithm. This algorithm is incompatible with the netCDF packing algorithm described above. The unpacking component of the @acronym{HDF} algorithm (described @uref{http://www.hdfgroup.org/HDF5/doc/UG/UG_frame10Datasets.html, here} and in Section 3.10.6 of the HDF4 Users Guide @uref{http://www.hdfgroup.org/release4/doc/UsrGuide_html/UG_PDF.pdf, here}) is @tex $$ \rm \hbox{upk} = \hbox{scale\_factor}\times(\hbox{pck} - \hbox{add\_offset}) $$ @end tex @ifnottex @sp 1 @var{upk} = @var{scale_factor}*(@var{pck} - @var{add_offset})@* @sp 1 @end ifnottex @ignore NB: HDF packing documentation is hard to follow MODIS HDF4 datasets definitely use the ``HDF algorithm'' However, must discriminate between HDF4 and HDF5 packing. HDF4, or at least some HDF4 datasets implement the ``HDF algorithm'', aka linear scale_factor and add_offset in other order from netCDF. HDF5 only implements D-scaling, aka, decimal-scaling bit-packing. D-Scaling uses add_offset (i.e., minimum data value) and scale_factor (integer power of 10 by which the add_offset corrected data are divided before storage) to control D-scaling. @cindex scale-offset compression @cindex scale-offset filter @acronym{HDF} also calls this @dfn{scale-offset compression} and the @dfn{scale-offset filter}. @end ignore Confusingly, the (incompatible) netCDF and @acronym{HDF} algorithms both store their parameters in attributes with the same names (@code{scale_factor} and @code{add_offset}). Data packed with one algorithm should never be unpacked with the other; doing so will result in incorrect answers. Unfortunately, few users are aware that their datasets may be packed, and fewer know the details of the packing algorithm employed. This is what we in the ``bizness'' call an @dfn{interoperability} issue because it hampers data analysis performed on heterogeneous systems. As described below, @acronym{NCO} automatically unpacks data before performing arithmetic. This automatic unpacking occurs silently since there is usually no reason to bother users with these details. There is as yet no generic way for @acronym{NCO} to know which packing convention was used, so @acronym{NCO} @emph{assumes} the netCDF convention was used. @acronym{NCO} uses the same convention for unpacking unless explicitly told otherwise with the @samp{--hdf_upk} (also @samp{--hdf_unpack}) switch. Until and unless a method of automatically detecting the packing method is devised, it must remain the user's responsibility to tell @acronym{NCO} when to use the @acronym{HDF} convention instead of the netCDF convention to unpack. If your data originally came from an @acronym{HDF} file (e.g., @acronym{NASA} @acronym{EOS}) then it was likely packed with the @acronym{HDF} convention and must be unpacked with the same convention. Our recommendation is to only request @acronym{HDF} unpacking when you are certain. Most packed datasets encountered by @acronym{NCO} will have used the netCDF convention. Those that were not will hopefully produce noticeably weird values when unpacked by the wrong algorithm. Before or after panicking, treat this as a clue to re-try your commands with the @samp{--hdf_upk} switch. See @ref{ncpdq netCDF Permute Dimensions Quickly} for an easy technique to unpack data packed with the @acronym{HDF} convention, and then re-pack it with the netCDF convention. @unnumberedsubsec Default Handling of Packed Data All @acronym{NCO} arithmetic operators understand packed data. The operators automatically unpack any packed variable in the input file which will be arithmetically processed. For example, @command{ncra} unpacks all record variables, and @command{ncwa} unpacks all variable which contain a dimension to be averaged. These variables are stored unpacked in the output file. On the other hand, arithmetic operators do not unpack non-processed variables. For example, @command{ncra} leaves all non-record variables packed, and @command{ncwa} leaves packed all variables lacking an averaged dimension. These variables (called fixed variables) are passed unaltered from the input to the output file. Hence fixed variables which are packed in input files remain packed in output files. Completely packing and unpacking files is easily accomplished with @command{ncpdq} (@pxref{ncpdq netCDF Permute Dimensions Quickly}). Pack and unpack individual variables with @command{ncpdq} and the @command{ncap2} @command{pack()} and @command{unpack()} functions (@pxref{Methods and functions}). @html @end html @node Operation Types, Type Conversion, Packed data, Shared features @section Operation Types @cindex operation types @cindex @code{avg} @cindex @code{sqravg} @cindex @code{avgsqr} @cindex @code{min} @cindex @code{max} @cindex @code{mabs} @cindex @code{mebs} @cindex @code{mibs} @cindex @code{rmssdn} @cindex @code{rms} @cindex @code{ttl} @cindex @code{sqrt} @cindex average @cindex mean @cindex total @cindex minimum @cindex maximum @cindex root-mean-square @cindex standard deviation @cindex variance @cindex @code{-y @var{op_typ}} @cindex @code{--operation @var{op_typ}} @cindex @code{--op_typ @var{op_typ}} @cartouche Availability: @command{ncap2}, @command{ncra}, @command{nces}, @command{ncwa}@* Short options: @samp{-y}@* Long options: @samp{--operation}, @samp{--op_typ}@* @end cartouche @noindent The @samp{-y @var{op_typ}} switch allows specification of many different types of operations Set @var{op_typ} to the abbreviated key for the corresponding operation: @table @code @item avg Mean value @item sqravg Square of the mean @item avgsqr Mean of sum of squares @item max Maximum value @item min Minimum value @item mabs Maximum absolute value @item mebs Mean absolute value @item mabs Minimum absolute value @item rms Root-mean-square (normalized by @var{N}) @item rmssdn Root-mean square (normalized by @var{N-1}) @item sqrt Square root of the mean @item ttl Sum of values @end table @noindent @cindex coordinate variable @acronym{NCO} assumes coordinate variables represent grid axes, e.g., longitude. The only rank-reduction which makes sense for coordinate variables is averaging. Hence @acronym{NCO} implements the operation type requested with @samp{-y} on all non-coordinate variables, not on coordinate variables. When an operation requires a coordinate variable to be reduced in rank, i.e., from one dimension to a scalar or from one dimension to a degenerate (single value) array, then @acronym{NCO} @emph{always averages} the coordinate variable regardless of the arithmetic operation type performed on the non-coordinate variables. The mathematical definition of each arithmetic operation is given below. @xref{ncwa netCDF Weighted Averager}, for additional information on masks and normalization. If an operation type is not specified with @samp{-y} then the operator performs an arithmetic average by default. Averaging is described first so the terminology for the other operations is familiar. @ifhtml @cartouche @html

    Note for HTML users:
    The definition of mathematical operations involving rank reduction (e.g., averaging) relies heavily on mathematical expressions which cannot easily be represented in HTML. See the printed manual for much more detailed and complete documentation of this subject. @end html @end cartouche @end ifhtml @ifnothtml @ifinfo @emph{Note for Info users}: The definition of mathematical operations involving rank reduction (e.g., averaging) relies heavily on mathematical expressions which cannot be easily represented in Info. @emph{See the @uref{./nco.pdf, printed manual} for much more detailed and complete documentation of this subject.} @end ifinfo @end ifnothtml @tex The masked, weighted average of a variable $\xxx$ can be generally represented as $$ \bar \xxx_{\jjj} = {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} \xxx_{\idx} \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}} $$ where $\bar \xxx_{\jjj}$ is the $\jjj$'th element of the output hyperslab, $\xxx_{\idx}$ is the $\idx$'th element of the input hyperslab, $\mssflg_{\idx}$ is~1 unless $\xxx_{\idx}$ equals the missing value, $\mskflg_{\idx}$ is~1 unless $\xxx_{\idx}$ is masked, and $\wgt_{\idx}$ is the weight. This formiddable looking formula represents a simple weighted average whose bells and whistles are all explained below. It is not too early to note, however, that when $\mssflg_{\idx} = \mskflg_{\idx} = \wgt_{\idx} = 1$, the generic averaging expression above reduces to a simple arithmetic average. Furthermore, $\mskflg_{\idx} = \wgt_{\idx} = 1$ for all operators except @command{ncwa}. These variables are included in the discussion below for completeness, and for possible future use in other operators. The size $\outnbr$ of the output hyperslab for a given variable is the product of all the dimensions of the input variable which are not averaged over. The size $\lmnnbr$ of the input hyperslab contributing to each $\bar \xxx_{\jjj}$ is simply the product of the sizes of all dimensions which are averaged over (i.e., dimensions specified with @samp{-a}). Thus $\lmnnbr$ is the number of input elements which @emph{potentially} contribute to each output element. An input element $\xxx_{\idx}$ contributes to the output element $\xxx_{\jjj}$ except in two conditions: @cindex missing values @enumerate @item $\xxx_{\idx}$ equals the @var{missing value} (@pxref{Missing Values}) for the variable. @item $\xxx_{\idx}$ is located at a point where the mask condition (@pxref{Mask condition}) is false. @end enumerate Points $\xxx_{\idx}$ in either of these two categories do not contribute to $\xxx_{\jjj}$---they are ignored. We now define these criteria more rigorously. Each~$\xxx_{\idx}$ has an associated Boolean weight~$\mssflg_{\idx}$ whose value is~0 or~1 (false or true). The value of~$\mssflg_{\idx}$ is~1 (true) unless $\xxx_{\idx}$ equals the @var{missing value} (@pxref{Missing Values}) for the variable. Thus, for a variable with no @code{_FillValue} attribute, $\mssflg_{\idx}$~is always~1. All @acronym{NCO} arithmetic operators (@command{ncbo}, @command{ncra}, @command{nces}, @command{ncflint}, @command{ncwa}) treat missing values analogously. Besides (weighted) averaging, @command{ncwa}, @command{ncra}, and @command{nces} also compute some common non-linear operations which may be specified with the @samp{-y} switch (@pxref{Operation Types}). The other rank-reducing operations are simple variations of the generic weighted mean described above. The total value of~$\xxx$ (@code{-y ttl}) is $$ \bar \xxx_{\jjj} = \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} \xxx_{\idx} $$ @cindex @code{-N} @cindex @code{numerator} Note that the total is the same as the numerator of the mean of~$\xxx$, and may also be obtained in @command{ncwa} by using the @samp{-N} switch (@pxref{ncwa netCDF Weighted Averager}). The minimum value of~$\xxx$ (@code{-y min}) is $$ \bar \xxx_{\jjj} = \min [ \mssflg_{1} \mskflg_{1} \wgt_{1} \xxx_{1}, \mssflg_{2} \mskflg_{2} \wgt_{2} \xxx_{2}, \ldots, \mssflg_{\lmnnbr} \mskflg_{\lmnnbr} \wgt_{\lmnnbr} \xxx_{\lmnnbr} ] $$ Analogously, the maximum value of~$\xxx$ (@code{-y max}) is $$ \bar \xxx_{\jjj} = \max [ \mssflg_{1} \mskflg_{1} \wgt_{1} \xxx_{1}, \mssflg_{2} \mskflg_{2} \wgt_{2} \xxx_{2}, \ldots, \mssflg_{\lmnnbr} \mskflg_{\lmnnbr} \wgt_{\lmnnbr} \xxx_{\lmnnbr} ] $$ Thus the minima and maxima are determined after any weights are applied. The minimum absolute value of~$\xxx$ (@code{-y mibs}) is $$ \bar \xxx_{\jjj} = \min [ \mssflg_{1} \mskflg_{1} \wgt_{1} |\xxx_{1}|, \mssflg_{2} \mskflg_{2} \wgt_{2} |\xxx_{2}|, \ldots, \mssflg_{\lmnnbr} \mskflg_{\lmnnbr} \wgt_{\lmnnbr} |\xxx_{\lmnnbr}| ] $$ Analogously, the maximum absolute value of~$\xxx$ (@code{-y mabs}) is $$ \bar \xxx_{\jjj} = \max [ \mssflg_{1} \mskflg_{1} \wgt_{1} |\xxx_{1}|, \mssflg_{2} \mskflg_{2} \wgt_{2} |\xxx_{2}|, \ldots, \mssflg_{\lmnnbr} \mskflg_{\lmnnbr} \wgt_{\lmnnbr} |\xxx_{\lmnnbr}| ] $$ Thus the minimum and maximum absolute values are determined after any weights are applied. The mean absolute value of~$\xxx$ (@code{-y mebs}) is $$ \bar \xxx_{\jjj} = {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} |\xxx_{\idx}| \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}} $$ The square of the mean value of~$\xxx$ (@code{-y sqravg}) is $$ \bar \xxx_{\jjj} = \left( {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} \xxx_{\idx} \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}} \right)^{2} $$ The mean of the sum of squares of~$\xxx$ (@code{-y avgsqr}) is $$ \bar \xxx_{\jjj} = {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} \xxx^{2}_{\idx} \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}} $$ If $\xxx$ represents a deviation from the mean of another variable, $\xxx_{\idx} = \yyy_{\idx} - \bar{\yyy}$ (possibly created by @command{ncbo} in a previous step), then applying @code{avgsqr} to $\xxx$ computes the approximate variance of $\yyy$. Computing the true variance of~$\yyy$ requires subtracting~1 from the denominator, discussed below. For a large sample size however, the two results will be nearly indistinguishable. The root mean square of~$\xxx$ (@code{-y rms}) is $$ \bar \xxx_{\jjj} = \sqrt{ {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} x^{2}_{\idx} \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}}} $$ Thus @code{rms} simply computes the squareroot of the quantity computed by @code{avgsqr}. The root mean square of~$\xxx$ with standard-deviation-like normalization (@code{-y rmssdn}) is implemented as follows. When weights are not specified, this function is the same as the root mean square of~$\xxx$ except one is subtracted from the sum in the denominator $$ \bar \xxx_{\jjj} = \sqrt{ {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} x^{2}_{\idx} \over -1 + \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx}} } $$ If $\xxx$ represents the deviation from the mean of another variable, $\xxx_{\idx} = \yyy_{\idx} - \bar{\yyy}$, then applying @code{rmssdn} to $\xxx$ computes the standard deviation of~$\yyy$. In this case the $-1$ in the denominator compensates for the degree of freedom already used in computing $\bar{\yyy}$ in the numerator. Consult a statistics book for more details. When weights are specified it is unclear how to compensate for this extra degree of freedom. Weighting the numerator and denominator of the above by $\wgt_{\idx}$ and subtracting one from the denominator is only appropriate when all the weights are~1.0. When the weights are arbitrary (e.g., Gaussian weights), subtracting one from the sum in the denominator does not necessarily remove one degree of freedom. Therefore when @code{-y rmssdn} is requested and weights are specified, @command{ncwa} actually implements the @code{rms} procedure. @command{nces} and @command{ncra}, which do not allow weights to be specified, always implement the @code{rmssdn} procedure when asked. @ignore 20130827: Fedora Core 19 (FC19) broke here with "./nco.texi:6394: Missing dollarsign inserted." Ubuntu always built nco.texi fine Adding a dollarsign character right here breaks Ubuntu builds too Hence I must carefully spell-out the word dollarsign instead 20130829: Making many smaller TeX environments does not solve problem 20130910: Using latest texinfo.tex from GNU does not solve problem 20130910: Karl Berry solved problem by fixing bug in texinfo.tex Bug was triggered in Fedora by apostrophe in "User's Guide" (manual title) Bug not present in texinfo.tex version 2008-04-18.10 (used by Ubuntu 13.04) Bug present in texinfo.tex version 2013-02-01.11 (used by FC19) Bug just fixed in texinfo.tex version 2013-09-11 (committed by Karl) nco/autobld/texinfo.tex now contains fixed version Breakage always occurs near here @end ignore The square root of the mean of~$\xxx$ (@code{-y sqrt}) is $$ \bar \xxx_{\jjj} = \sqrt{ {\sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx} \xxx_{\idx} \over \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} \wgt_{\idx}}} $$ @end tex The definitions of some of these operations are not universally useful. Mostly they were chosen to facilitate standard statistical computations within the @acronym{NCO} framework. We are open to redefining and or adding to the above. If you are interested in having other statistical quantities defined in @acronym{NCO} please contact the @acronym{NCO} project (@pxref{Help Requests and Bug Reports}). @noindent EXAMPLES @html @end html @noindent Suppose you wish to examine the variable @code{prs_sfc(time,lat,lon)} which contains a time series of the surface pressure as a function of latitude and longitude. Find the minimum value of @code{prs_sfc} over all dimensions: @example ncwa -y min -v prs_sfc in.nc foo.nc @end example @noindent Find the maximum value of @code{prs_sfc} at each time interval for each latitude: @example ncwa -y max -v prs_sfc -a lon in.nc foo.nc @end example @noindent Find the root-mean-square value of the time-series of @code{prs_sfc} at every gridpoint: @example ncra -y rms -v prs_sfc in.nc foo.nc ncwa -y rms -v prs_sfc -a time in.nc foo.nc @end example @noindent The previous two commands give the same answer but @command{ncra} is preferred because it has a smaller memory footprint. @cindex degenerate dimension A dimension of size one is said to be @dfn{degenerate}. By default, @command{ncra} leaves the (degenerate) @code{time} dimension in the output file (which is usually useful) whereas @command{ncwa} removes the @code{time} dimension (unless @samp{-b} is given). @noindent These operations work as expected in multi-file operators. Suppose that @code{prs_sfc} is stored in multiple timesteps per file across multiple files, say @file{jan.nc}, @file{feb.nc}, @file{march.nc}. We can now find the three month maximum surface pressure at every point. @example nces -y max -v prs_sfc jan.nc feb.nc march.nc out.nc @end example @html @end html @noindent @cindex standard deviation It is possible to use a combination of these operations to compute the variance and standard deviation of a field stored in a single file or across multiple files. The procedure to compute the temporal standard deviation of the surface pressure at all points in a single file @file{in.nc} involves three steps. @example ncwa -O -v prs_sfc -a time in.nc out.nc ncbo -O -v prs_sfc in.nc out.nc out.nc ncra -O -y rmssdn out.nc out.nc @end example First construct the temporal mean of @code{prs_sfc} in the file @file{out.nc}. Next overwrite @file{out.nc} with the anomaly (deviation from the mean). Finally overwrite @file{out.nc} with the root-mean-square of itself. Note the use of @samp{-y rmssdn} (rather than @samp{-y rms}) in the final step. This ensures the standard deviation is correctly normalized by one fewer than the number of time samples. The procedure to compute the variance is identical except for the use of @samp{-y var} instead of @samp{-y rmssdn} in the final step. @command{ncap2} can also compute statistics like standard deviations. Brute-force implementation of formulae is one option, e.g., @example ncap2 -s 'prs_sfc_sdn=sqrt((prs_sfc-prs_sfc.avg($time)^2). \ total($time)/($time.size-1))' in.nc out.nc @end example The operation may, of course, be broken into multiple steps in order to archive intermediate quantities, such as the time-anomalies @example ncap2 -s 'prs_sfc_anm=prs_sfc-prs_sfc.avg($time)' \ -s 'prs_sfc_sdn=sqrt((prs_sfc_anm^2).total($time)/($time.size-1))' \ in.nc out.nc @end example @command{ncap2} supports intrinsic standard deviation functions (@pxref{Operation Types}) which simplify the above expression to @example ncap2 -s 'prs_sfc_sdn=(prs_sfc-prs_sfc.avg($time)).rmssdn($time)' in.nc out.nc @end example These instrinsic functions compute the answer quickly and concisely. The procedure to compute the spatial standard deviation of a field in a single file @file{in.nc} involves three steps. @example ncwa -O -v prs_sfc,gw -a lat,lon -w gw in.nc out.nc ncbo -O -v prs_sfc,gw in.nc out.nc out.nc ncwa -O -y rmssdn -v prs_sfc -a lat,lon -w gw out.nc out.nc @end example First the spatially weighted (by @samp{-w gw}) mean values are written to the output file, as are the mean weights. The initial output file is then overwritten with the gridpoint deviations from the spatial mean. It is important that the output file after the second line contain the original, non-averaged weights. This will be the case if the weights are named so that @acronym{NCO} treats them like a coordinate (@pxref{CF Conventions}). One such name is @code{gw}, and any variable whose name begins with @code{msk_} (for ``mask'') or @code{wgt_} (for ``weight'') will likewise be treated as a coordinate, and will be copied (not differenced) straight from @file{in.nc} to @file{out.nc} in the second step. When using weights to compute standard deviations one must remember to include the weights in the initial output files so that they may be used again in the final step. Finally the root-mean-square of the appropriately weighted spatial deviations is taken. No elegant @command{ncap2} solution exists to compute weighted standard deviations. Those brave of heart may try to formulate one. A general formula should allow weights to have fewer than and variables to have more than the minimal spatial dimensions (latitude and longitude). @ignore @c Until 20151229 ncap2 example was FUBAR, and did not handle weights in denominator @example ncap2 -s 'prs_sfc_sdn=((gw*(prs_sfc-((gw*prs_sfc).ttl($lat,$lon)/gw.ttl($lat,$lon)))^2).ttl($lat,$lon)/ \ gw.ttl()).sqrt()' in.nc out.nc @end example Note how the weight multiplies the variable prior to computing the the anomalies and the standard deviation. @end ignore The procedure to compute the standard deviation of a time-series across multiple files involves one extra step since all the input must first be collected into one file. @example ncrcat -O -v tpt in.nc in.nc foo1.nc ncwa -O -a time foo1.nc foo2.nc ncbo -O -v tpt foo1.nc foo2.nc foo3.nc ncra -O -y rmssdn foo3.nc out.nc @end example The first step assembles all the data into a single file. Though this may consume a lot of temporary disk space, it is more or less required by the @command{ncbo} operation in the third step. @html @end html @node Type Conversion, Batch Mode, Operation Types, Shared features @section Type Conversion @cindex type conversion @cartouche Availability (automatic type conversion): @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncflint}, @command{ncra}, @command{ncwa}@* Short options: None (it's @emph{automatic})@* Availability (manual type conversion): @command{nces}, @command{ncra}, @command{ncwa}@* Short options: None@* Long options: @samp{--dbl}, @samp{--flt}, @samp{--rth_dbl}, @samp{--rth_flt}@* @end cartouche @cindex promotion @cindex demotion @cindex automatic type conversion @cindex manual type conversion Type conversion refers to the casting or coercion of one fundamental or atomic data type to another, e.g., converting @code{NC_SHORT} (two bytes) to @code{NC_DOUBLE} (eight bytes). Type conversion always @dfn{promotes} or @dfn{demotes} the range and/or precision of the values a variable can hold. Type conversion is automatic when the language carries out this promotion according to an internal set of rules without explicit user intervention. In contrast, manual type conversion refers to explicit user commands to change the type of a variable or attribute. Most type conversion happens automatically, yet there are situations in which manual type conversion is advantageous. @menu * Automatic type conversion:: * Promoting Single-precision to Double:: * Manual type conversion:: @end menu @node Automatic type conversion, Promoting Single-precision to Double, Type Conversion, Type Conversion @subsection Automatic type conversion There are at least two reasons to avoid type conversions. First, type conversions are expensive since they require creating (temporary) buffers and casting each element of a variable from its storage type to some other type and then, often, converting it back. Second, a dataset's creator perhaps had a good reason for storing data as, say, @code{NC_FLOAT} rather than @code{NC_DOUBLE}. In a scientific framework there is no reason to store data with more precision than the observations merit. Normally this is single-precision, which guarantees 6--9 digits of precision. Reasons to engage in type conversion include avoiding rounding errors and out-of-range limitations of less-precise types. This is the case with most integers. Thus @acronym{NCO} defaults to automatically promote integer types to floating point when performing lengthy arithmetic, yet @acronym{NCO} defaults to not promoting single to double-precision floats. Before discussing the more subtle floating point issues, we first examine integer promotion. We will show how following parsimonious conversion rules dogmatically can cause problems, and what @acronym{NCO} does about that. That said, there are situations in which implicit conversion of single- to double-precision is also warranted. Understanding the narrowness of these situations takes time, and we hope the reader appreciates the following detailed discussion. Consider the average of the two @code{NC_SHORT}s @code{17000s} and @code{17000s}. A straightforward average without promotion results in garbage since the intermediate value which holds their sum is also of type @code{NC_SHORT} and thus overflows on (i.e., cannot represent) values greater than 32,767 @footnote{ @set flg @tex $32767 = 2^{15}-1$ @clear flg @end tex @ifinfo @math{32767 = 2^15-1} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} 32767 = 2^15@minus{}1 @clear flg @end ifset }. There are valid reasons for expecting this operation to succeed and the @acronym{NCO} philosophy is to make operators do what you want, not what is purest. Thus, unlike C and Fortran, but like many other higher level interpreted languages, @acronym{NCO} arithmetic operators will perform automatic type conversion on integers when all the following conditions are met @footnote{Operators began performing automatic type conversions before arithmetic in @acronym{NCO} @w{version 1.2}, August, 2000. Previous versions never performed unnecessary type conversion for arithmetic.}: @enumerate @item The requested operation is arithmetic. This is why type conversion is limited to the operators @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncflint}, @command{ncra}, and @command{ncwa}. @item The arithmetic operation could benefit from type conversion. Operations that could benefit include averaging, summation, or any ``hard'' arithmetic that could overflow or underflow. Larger representable sums help avoid overflow, and more precision helps to avoid underflow. Type conversion does not benefit searching for minima and maxima (@samp{-y min}, or @samp{-y max}). @item The variable on disk is of type @code{NC_BYTE}, @code{NC_CHAR}, @code{NC_SHORT}, or @code{NC_INT}. Type @code{NC_DOUBLE} is not promoted because there is no type of higher precision. Conversion of type @code{NC_FLOAT} is discussed in detail below. When it occurs, it follows the same procedure (promotion then arithmetic then demotion) as conversion of integer types. @end enumerate When these criteria are all met, the operator promotes the variable in question to type @code{NC_DOUBLE}, performs all the arithmetic operations, casts the @code{NC_DOUBLE} type back to the original type, and finally writes the result to disk. The result written to disk may not be what you expect, because of incommensurate ranges represented by different types, and because of (lack of) rounding. First, continuing the above example, the average (e.g., @samp{-y avg}) of @code{17000s} and @code{17000s} is written to disk as @code{17000s}. The type conversion feature of @acronym{NCO} makes this possible since the arithmetic and intermediate values are stored as @code{NC_DOUBLE}s, i.e., @code{34000.0d} and only the final result must be represented as an @code{NC_SHORT}. Without the type conversion feature of @acronym{NCO}, the average would have been garbage (albeit predictable garbage near @code{-15768s}). Similarly, the total (e.g., @samp{-y ttl}) of @code{17000s} and @code{17000s} written to disk is garbage (actually @code{-31536s}) since the final result (the true total) of @math{34000} is outside the range of type @code{NC_SHORT}. @cindex @code{trunc()} After arithmetic is computed in double-precision for promoted variables, the intermediate double-precision values must be demoted to the variables' original storage type (e.g., from @code{NC_DOUBLE} to @code{NC_SHORT}). @acronym{NCO} has handled this demotion in three ways in its history. Prior to October, 2011 (version 4.0.8), @acronym{NCO} employed the @w{C library} truncate function, @code{trunc()} @footnote{ @cindex C language The actual type conversions with trunction were handled by intrinsic type conversion, so the @code{trunc()} function was never explicitly called, although the results would be the same if it were.}. Truncation rounds @var{x} to the nearest integer not larger in absolute value. For example, truncation rounds @code{1.0d}, @code{1.5d}, and @code{1.8d} to the same value, @code{1s}. Clearly, truncation does not round floating point numbers to the nearest integer! Yet truncation is how the @w{C language} performs implicit conversion of real numbers to integers. @cindex Neil Davis @acronym{NCO} stopped using truncation for demotion when an alert user (Neil Davis) informed us that this caused a small bias in the packing algorithm employed by @command{ncpdq}. This led to @acronym{NCO} adopting rounding functions for demotion. Rounding functions eliminated the small bias in the packing algorithm. @findex @code{lround()}. From February, 2012 through March, 2013 (versions 4.0.9--4.2.6), @acronym{NCO} employed the @w{C library} family of rounding functions, @code{lround()}. These functions round @var{x} to the nearest integer, halfway cases away from zero. The problem with @code{lround()} is that it always rounds real values ending in @code{.5} away from zero. This rounds, for example, @code{1.5d} and @code{2.5d} to @code{2s} and @code{3s}, respectively. @findex @code{lrint()}. @cindex @acronym{IEEE} Since April, 2013 (version 4.3.0), @acronym{NCO} has employed the other @w{C library} family of rounding functions, @code{lrint()}. This algorithm rounds @var{x} to the nearest integer, using the current rounding direction. Halfway cases are rounded to the nearest even integer. This rounds, for example, both @code{1.5d} and @code{2.5d} to the same value, @code{2s}, as recommended by the @acronym{IEEE}. This rounding is symmetric: up half the time, down half the time. This is the current and hopefully final demotion algorithm employed by @acronym{NCO}. Hence because of automatic conversion, @acronym{NCO} will compute the average of @code{2s} and @code{3s} in double-precision arithmetic as @math{(@code{2.0d} + @code{3.0d})/@code{2.0d}) = @code{2.5d}}. It then demotes this intermediate result back to @code{NC_SHORT} and stores it on disk as @math{@code{trunc(2.5d)} = @code{2s}} (versions up to 4.0.8), @math{@code{lround(2.5d)} = @code{3s}} (versions 4.0.9--4.2.6), and @math{@code{lrint(2.5d)} = @code{2s}} (versions 4.3.0 and later). @html @end html @node Promoting Single-precision to Double, Manual type conversion, Automatic type conversion, Type Conversion @subsection Promoting Single-precision to Double @cindex promotion @cindex implicit conversion @cindex @code{--dbl} @cindex @code{--rth_dbl} @cindex @code{--flt} @cindex @code{--rth_flt} Promotion of real numbers from single- to double-precision is fundamental to scientific computing. When it should occur depends on the precision of the inputs and the number of operations. Single-precision (four-byte) numbers contain about seven significant figures, while double-precision contain about sixteen. More, err, precisely, the @acronym{IEEE} single-precision representation gives from @w{6 to 9} significant decimal digits precision @footnote{According to Wikipedia's summary of @acronym{IEEE} @w{standard 754}, ``If a decimal string with at most @w{6 significant} digits is converted to @w{@acronym{IEEE} 754} single-precision and then converted back to the same number of significant decimal, then the final string should match the original; and if an @w{@acronym{IEEE} 754} single-precision is converted to a decimal string with at @w{leastn 9} significant decimal and then converted back to single, then the final number must match the original''.}. And the @acronym{IEEE} double-precision representation gives from @w{15 to 17} significant decimal digits precision @footnote{According to Wikipedia's summary of @acronym{IEEE} @w{standard 754}, ``If a decimal string with at most @w{15 significant} digits is converted to @w{@acronym{IEEE} 754} double-precision representation and then converted back to a string with the same number of significant digits, then the final string should match the original; and if an @w{@acronym{IEEE} 754} double precision is converted to a decimal string with at least @w{17 significant} digits and then converted back to double, then the final number must match the original''.}. Hence double-precision numbers represent about nine digits more precision than single-precision numbers. Given these properties, there are at least two possible arithmetic conventions for the treatment of real numbers: @cindex C language @cindex Fortran @enumerate @item Conservative, aka Fortran Convention Automatic type conversion during arithmetic in the Fortran language is, by default, performed only when necessary. All operands in an operation are converted to the most precise type involved the operation before the arithmetic operation. Expressions which involve only single-precision numbers are computed entirely in single-precision. Expressions involving mixed precision types are computed in the type of higher precision. @acronym{NCO} by default employs the Fortan Convention for promotion. @item Aggressive, aka C Convention The @w{C language} is by default much more aggressive (and thus wasteful) than Fortran, and will always implicitly convert single- to double-precision numbers for no good reason. All real-number standard @w{C library} functions are double-precision, and @w{C programmers} must take extra steps to only utilize single precision arithmetic. The high level interpreted data analysis languages @acronym{IDL}, Matlab, and @acronym{NCL} all adopt the @w{C Convention}. @end enumerate @acronym{NCO} does not automatically promote @code{NC_FLOAT} because, in our judgement, the performance penalty of always doing so would outweigh the potential benefits. The now-classic text ``Numerical Recipes @w{in C}'' discusses this point under the section ``Implicit Conversion of Float to Double'' @footnote{See @w{page 21} in Section 1.2 of the First edition for this gem: @quotation One does not need much experience in scientific computing to recognize that the implicit conversion rules are, in fact, sheer madness! In effect, they make it impossible to write efficient numerical programs. @end quotation }. That said, such promotion is warranted in some circumstances. For example, rounding errors can accumulate to worrisome levels during arithmetic performed on large arrays of single-precision floats. This use-case occurs often in geoscientific studies of climate where thousands-to-millions of gridpoints may contribute to a single average. If the inputs are all single-precision, then so should be the output. However the intermediate results where running sums are accumulated may suffer from too much rounding or from underflow unless computed in double-precision. The order of operations matters to floating point math even when the analytic expressions are equal. Cautious users feel disquieted when results from equally valid analyses differ in the final bits instead of agreeing bit-for-bit. For example, averaging arrays in multiple stages produces different answers than averaging them in one step. This is easily seen in the computation of ensemble averages by two different methods. The @acronym{NCO} test file @file{in.nc} contains single- and double-precision representations of the same temperature timeseries as @code{tpt_flt} and @code{tpt_dbl}. Pretend each datapoint in this timeseries represents a monthly-mean temperature. We will mimic the derivation of a fifteen-year ensemble-mean January temperature by concatenating the input file five times, and then averaging the datapoints representing January two different ways. In @w{Method 1} we derive the 15-year ensemble January average in two steps, as the average of three five-year averages. This method is naturally used when each input file contains multiple years and multiple input files are needed @footnote{For example, the @acronym{CMIP5} archive tends to distribute monthly average timeseries in 50-year chunks.}. In @w{Method 2} we obtain 15-year ensemble January average in a single step, by averaging all 15 Januaries at one time: @example # tpt_flt and tpt_dbl are identical except for precision ncks --cdl -C -v tpt_flt,tpt_dbl ~/nco/data/in.nc # tpt_dbl = 273.1, 273.2, 273.3, 273.4, 273.5, 273.6, 273.7, 273.8, 273.9, 274 # tpt_flt = 273.1, 273.2, 273.3, 273.4, 273.5, 273.6, 273.7, 273.8, 273.9, 274 # Create file with five "ten-month years" (i.e., 50 timesteps) of temperature data ncrcat -O -v tpt_flt,tpt_dbl -p ~/nco/data in.nc in.nc in.nc in.nc in.nc ~/foo.nc # Average 1st five "Januaries" (elements 1, 11, 21, 31, 41) ncra --flt -O -F -d time,1,,10 ~/foo.nc ~/foo_avg1.nc # Average 2nd five "Januaries" (elements 2, 12, 22, 32, 42) ncra --flt -O -F -d time,2,,10 ~/foo.nc ~/foo_avg2.nc # Average 3rd five "Januaries" (elements 3, 13, 23, 33, 43) ncra --flt -O -F -d time,3,,10 ~/foo.nc ~/foo_avg3.nc # Method 1: Obtain ensemble January average by averaging the averages ncra --flt -O ~/foo_avg1.nc ~/foo_avg2.nc ~/foo_avg3.nc ~/foo_avg_mth1.nc # Method 2: Obtain ensemble January average by averaging the raw data # Employ ncra's "subcycle" feature (http://nco.sf.net/nco.html#ssc) ncra --flt -O -F -d time,1,,10,3 ~/foo.nc ~/foo_avg_mth2.nc # Difference the two methods ncbo -O ~/foo_avg_mth1.nc ~/foo_avg_mth2.nc ~/foo_avg_dff.nc ncks --cdl ~/foo_avg_dff.nc # tpt_dbl = 5.6843418860808e-14 ; # tpt_flt = -3.051758e-05 ; @end example Although the two methods are arithmetically equivalent, they produce slightly different answers due to the different order of operations. Moreover, it appears at first glance that the single-precision answers suffer from greater error than the double-precision answers. In fact both precisions suffer from non-zero rounding errors. The answers differ negligibly to machine precision, which is about seven significant figures for single precision floats (@code{tpt_flt}), and sixteen significant figures for double precision (@code{tpt_dbl}). The input precision determines the answer precision. @acronym{IEEE} arithmetic guarantees that two methods will produce bit-for-bit identical answers only if they compute the same operations in the same order. Bit-for-bit identical answers may also occur by happenstance when rounding errors exactly compensate one another. This is demonstrated by repeating the example above with the @samp{--dbl} (or @samp{--rth_dbl} for clarity) option which forces conversion of single-precision numbers to double-precision prior to arithmetic. Now @command{ncra} will treat the first value of @code{tpt_flt}, @code{273.1000f}, as @code{273.1000000000000d}. Arithmetic on @code{tpt_flt} then proceeds in double-precision until the final answer, which is converted back to single-precision for final storage. @example # Average 1st five "Januaries" (elements 1, 11, 21, 31, 41) ncra --dbl -O -F -d time,1,,10 ~/foo.nc ~/foo_avg1.nc # Average 2nd five "Januaries" (elements 2, 12, 22, 32, 42) ncra --dbl -O -F -d time,2,,10 ~/foo.nc ~/foo_avg2.nc # Average 3rd five "Januaries" (elements 3, 13, 23, 33, 43) ncra --dbl -O -F -d time,3,,10 ~/foo.nc ~/foo_avg3.nc # Method 1: Obtain ensemble January average by averaging the averages ncra --dbl -O ~/foo_avg1.nc ~/foo_avg2.nc ~/foo_avg3.nc ~/foo_avg_mth1.nc # Method 2: Obtain ensemble January average by averaging the raw data # Employ ncra's "subcycle" feature (http://nco.sf.net/nco.html#ssc) ncra --dbl -O -F -d time,1,,10,3 ~/foo.nc ~/foo_avg_mth2.nc # Difference the two methods ncbo -O ~/foo_avg_mth1.nc ~/foo_avg_mth2.nc ~/foo_avg_dff.nc # Show differences ncks --cdl ~/foo_avg_dff.nc # tpt_dbl = 5.6843418860808e-14 ; # tpt_flt = 0 ; @end example The @samp{--dbl} switch has no effect on the results computed from double-precision inputs. But now the two methods produce bit-for-bit identical results from the single-precision inputs! This is due to the happenstance of rounding along with the effects of the @samp{--dbl} switch. The @samp{--flt} and @samp{--rth_flt} switches are provided for symmetry. They enforce the traditional @acronym{NCO} and Fortran convention of keeping single-precision arithmetic in single-precision unless a double-precision number is explicitly involved. We have shown that forced promotion of single- to double-precision prior to arithmetic has advantages and disadvantages. The primary disadvantages are speed and size. Double-precision arithmetic is 10--60% slower than, and requires twice the memory of single-precision arithmetic. The primary advantage is that rounding errors in double-precision are much less likely to accumulate to values near the precision of the underlying geophysical variable. For example, if we know temperature to five significant digits, then a rounding error of 1-bit could affect the least precise digit of temperature after 1,000--10,000 consecutive one-sided rounding errors under the worst possible scenario. Many geophysical grids have tens-of-thousands to millions of points that must be summed prior to normalization to compute an average. It is possible for single-precision rouding errors to accumulate and degrade the precision in such situtations. Double-precision arithmetic mititgates this problem, so @samp{--dbl} would be warranted. @cindex @acronym{TREFHT} @cindex @acronym{CAM3} @cindex @acronym{GCM} This can be seen with another example, averaging a global surface temperature field with @command{ncwa}. The input contains a single-precision global temperature field (stored in @code{TREFHT}) produced by the @acronym{CAM3} general circulation model (@acronym{GCM}) run and stored at @w{1.9 by 2.5} degrees resolution. This requires @w{94 latitudes} and @w{144 longitudes}, or @math{13,824} total surface gridpoints, a typical GCM resolution in 2008--2013. These input characteristics are provided only to show the context to the interested reader, equivalent results would be found in statistics of any dataset of comparable size. Models often represent Earth on a spherical grid where global averages must be created by weighting each gridcell by its latitude-dependent weight (e.g., a Gaussian weight stored in @code{gw}), or by the surface area of each contributing gridpoint (stored in @code{area}). Like many geophysical models and most @acronym{GCM}s, @acronym{CAM3} runs completely in double-precision yet stores its archival output in single-precision to save space. In practice such models usually save multi-dimensional prognostic and diagnostic fields (like @code{TREFHT(lat,lon)}) as single-precision, while saving all one-dimensional coordinates and weights (here @code{lat}, @code{lon}, and @code{gw(lon)}) as double-precision. The gridcell area @code{area(lat,lon)} is an extensive grid property that should be, but often is not, stored as double-precision. To obtain pure double-precision arithmetic @emph{and} storage of the globla mean temperature, we first create and store double-precision versions of the single-precision fields: @example ncap2 -O -s 'TREFHT_dbl=double(TREFHT);area_dbl=double(area)' in.nc in.nc @end example The single- and double-precision temperatures may each be averaged globally using four permutations for the precision of the weight and of the intermediate arithmetic representation: @enumerate @item Single-precision weight (@code{area}), single-precision arithmetic @item Double-precision weight (@code{gw}), single-precision arithmetic @item Single-precision weight (@code{area}), double-precision arithmetic @item Double-precision weight (@code{gw}), double-precision arithmetic @end enumerate @example # NB: Values below are printed with C-format %5.6f using # ncks -H -C -s '%5.6f' -v TREFHT,TREFHT_dbl out.nc # Single-precision weight (area), single-precision arithmetic ncwa --flt -O -a lat,lon -w area in.nc out.nc # TREFHT = 289.246735 # TREFHT_dbl = 289.239964 # Double-precision weight (gw), single-precision arithmetic ncwa --flt -O -a lat,lon -w gw in.nc out.nc # TREFHT = 289.226135 # TREFHT_dbl = 289.239964 # Single-precision weight (area), double-precision arithmetic ncwa --dbl -O -a lat,lon -w area in.nc out.nc # TREFHT = 289.239960 # TREFHT_dbl = 289.239964 # Double-precision weight (gw), double-precision arithmetic ncwa --dbl -O -a lat,lon -w gw in.nc out.nc # TREFHT = 289.239960 # TREFHT_dbl = 289.239964 @end example First note that the @code{TREFHT_dbl} average never changes because @code{TREFHT_dbl(lat,lon)} is double-precision in the input file. As described above, @acronym{NCO} automatically converts all operands involving to the highest precision involved in the operation. So specifying @samp{--dbl} is redundant for double-precision inputs. Second, the single-precision arithmetic averages of the single-precision input @code{TREFHT} differ by @math{289.246735 - 289.226135 = 0.0206} from eachother, and, more importantly, by as much as @math{289.239964 - 289.226135 = 0.013829} from the correct (double-precision) answer. These averages differ in the fifth digit, i.e., they agree only to four significant figures! Given that climate scientists are concerned about global temperature variations of a tenth of a degree or less, this difference is large. Global mean temperature changes significant to climate scientists are comparable in size to the numerical artifacts produced by the averaging procedure. @cindex rounding @cindex random walk Why are the single-precision numerical artifacts so large? Each global average is the result of multiplying almost 15,000 elements each by its weight, summing those, and then dividing by the summed weights. Thus about 50,000 single-precision floating point operations caused the loss of two to three significant digits of precision. The net error of a series of independent rounding errors is a random walk phenomena @footnote{ @cindex Michael Prather Thanks to @w{Michael J.} Prather for explaining this to me.}. Successive rounding errors displace the answer further from the truth. An ensemble of such averages will, on average, have no net bias. In other words, the expectation value of a series of @acronym{IEEE} rounding errors is zero. And the error of any given sequence of rounding errors obeys, for large series, a Gaussian distribution centered on zero. @cindex mantissa @cindex exponent Single-precision numbers use three of their four eight-bit bytes to represent the mantissa so the smallest representable single-precision mantissa is @math{\epsilon \equiv 2^{-23} = 1.19209 \times 10^{-7}}. This @math{\epsilon} is the smallest @var{x} such that @math{1.0 + x \ne 1.0}. This is the rounding error for non-exact precision-numbers. Applying random walk theory to rounding, it can be shown that the expected rounding error after @var{n} inexact operations is @math{\sqrt{2n/\pi}} for @w{large @var{n}}. The expected (i.e., mean absolute) rounding error in our example with @math{13,824} additions is about @math{\sqrt{2 \times 13824 / \pi} = 91.96}. Hence, addition alone of about fifteen thousand single-precision floats is expected to consume about two significant digits of precision. This neglects the error due to the inner product (weights times values) and normalization (division by tally) aspects of a weighted average. The ratio of two numbers each containing a numerical bias can magnify the size of the bias. In summary, a global mean number computed from about 15,000 gridpoints each with weights can be expected to lose up to three significant digits. Since single-precision starts with about seven significant digits, we should not expect to retain more than four significant digits after computing weighted averages in single-precision. The above example with @code{TREFHT} shows the expected four digits of agreement. @c For example, 50,000 coin flips would lead to 25,500 or more ``heads'' @c only a small percentage of the time. @c P(k,n)= 50000_C_25500 p^k(1-p)^(n-k) @c P(25500,50000)= 50000_C_25500 (0.5)^(25500)(0.5)^(24500) @c P(>=25500,50000)= ? @c fxm: Use Gaussian distribution/Random Walk @cindex beer The @acronym{NCO} results have been independently validated to the extent possible in three other languages: @w{C}, Matlab, and @acronym{NCL}. C and @acronym{NCO} are the only languages that permit single-precision numbers to be treated with single precision arithmetic: @example # Double-precision weight (gw), single-precision arithmetic (C) ncwa_3528514.exe # TREFHT = 289.240112 # Double-precision weight (gw), double-precision arithmetic (C) # TREFHT = 289.239964 # Single-precision weight (area), double-precision arithmetic (Matlab) # TREFHT = 289.239964 # Double-precision weight (gw), double-precision arithmetic (Matlab) # TREFHT = 289.239964 # Single-precision weight (area), double-precision arithmetic (NCL) ncl < ncwa_3528514.ncl # TREFHT = 289.239960 # TREFHT_dbl = 289.239964 # Double-precision weight (gw), double-precision arithmetic (NCL) # TREFHT = 289.239960 # TREFHT_dbl = 289.239964 @end example All languages tested (C, Matlab, @acronym{NCL}, and @acronym{NCO}) agree to machine precision with double-precision arithmetic. Users are fortunate to have a variety of high quality software that liberates them from the drudgery of coding their own. Many packages are free (as in beer)! As shown above @acronym{NCO} permits one to shift to their float-promotion preferences as desired. No other language allows this with a simple switch. To summarize, until version 4.3.6 (September, 2013), the default arithmetic convention of @acronym{NCO} adhered to Fortran behavior, and automatically promoted single-precision to double-precision in all mixed-precision expressions, and left-alone pure single-precision expressions. This is faster and more memory efficient than other conventions. However, pure single-precision arithmetic can lose too much precision when used to condense (e.g., average) large arrays. Statistics involving about @math{n = 10,000} single-precision inputs will lose about @w{2--3} digits if not promoted to double-precision prior to arithmetic. The loss scales with the squareroot @w{of @var{n}}. For larger @var{n}, users should promote floats with the @samp{--dbl} option if they want to preserve more than four significant digits in their results. The @samp{--dbl} and @samp{--flt} switches are only available with the @acronym{NCO} arithmetic operators that could potentially perform more than a few single-precision floating point operations per result. These are @command{nces}, @command{ncra}, and @command{ncwa}. Each is capable of thousands to millions or more operations per result. By contrast, the arithmetic operators @command{ncbo} and @command{ncflint} perform at most one floating point operation per result. Providing the @samp{--dbl} option for such trivial operations makes little sense, so the option is not currently made available. We are interested in users' opinions on these matters. The default behavior was changed from @samp{--flt} to @samp{--dbl} with the release of @acronym{NCO} version 4.3.6 (October 2013). We will change the default back to @samp{--flt} if users prefer. Or we could set a threshold (e.g., @math{n \ge 10000}) after which single- to double-precision promotion is automatically invoked. Or we could make the default promotion convention settable via an environment variable (@acronym{GSL} does this a lot). Please let us know what you think of the selected defaults and options. @node Manual type conversion, , Promoting Single-precision to Double, Type Conversion @subsection Manual type conversion @cindex @command{ncap2} @command{ncap2} provides intrinsic functions for performing manual type conversions. This, for example, converts variable @code{tpt} to external type @code{NC_SHORT} (a C-type @code{short}), and variable @code{prs} to external type @code{NC_DOUBLE} (a C-type @code{double}). @example ncap2 -s 'tpt=short(tpt);prs=double(prs)' in.nc out.nc @end example @xref{ncap2 netCDF Arithmetic Processor}, for more details. @html @end html @node Batch Mode, Global Attribute Addition, Type Conversion, Shared features @section Batch Mode @cindex batch mode @cindex overwriting files @cindex appending to files @cindex force overwrite @cindex force append @cindex @code{-O} @cindex @code{-A} @cindex @code{--overwrite} @cindex @code{--ovr} @cindex @code{--apn} @cindex @code{--append} @cartouche Availability: All operators@* Short options: @samp{-O}, @samp{-A}@* Long options: @samp{--ovr}, @samp{--overwrite}, @samp{--apn}, @samp{--append}@* @end cartouche If the @var{output-file} specified for a command is a pre-existing file, then the operator will prompt the user whether to overwrite (erase) the existing @var{output-file}, attempt to append to it, or abort the operation. However, interactive questions reduce productivity when processing large amounts of data. Therefore @acronym{NCO} also implements two ways to override its own safety features, the @samp{-O} and @samp{-A} switches. Specifying @samp{-O} tells the operator to overwrite any existing @var{output-file} without prompting the user interactively. Specifying @samp{-A} tells the operator to attempt to append to any existing @var{output-file} without prompting the user interactively. These switches are useful in batch environments because they suppress interactive keyboard input. NB: As of 20120515, @command{ncap2} is unable to append to files that already contain the appended dimensions. @html @end html @node Global Attribute Addition, History Attribute, Batch Mode, Shared features @section Global Attribute Addition @cindex global attributes @cindex attributes, global @cindex @code{--gaa} @cindex @code{--glb @var{att_nm}=@var{att_val}} @cindex @code{--glb} @cindex @code{--glb_att_add} @cindex @command{ncatted} @cartouche Availability: All operators@* Short options: None@* Long options: @samp{--glb}, @samp{--gaa}, @samp{--glb_att_add}@* @samp{--glb @var{att_nm}=@var{att_val}} (multiple invocations allowed)@* @end cartouche All operators can add user-specified global attributes to output files. As of @acronym{NCO} version 4.5.2 (July, 2015), @acronym{NCO} supports multiple uses of the @samp{--glb} (or equivalent @samp{--gaa} or @samp{--glb_att_add}) switch. The switch takes mandatory arguments @samp{--glb @var{att_nm}=@var{att_val}} where @var{att_nm} is the desired name of the global attriute to add, and @var{att_val} is its value. Currently only text attributes are supported (recorded as type @code{NC_CHAR}), and regular expressions are not allowed (unlike @pxref{ncatted netCDF Attribute Editor}). @example @verbatim ncra --glb machine=${HOSTNAME} --glb created_by=${USER} in*.nc out.nc @end verbatim @end example Multiple invocations simplify the annotation of output file at creation (or modification) time. This feature helps to avoid the performance penalty incurred by having to use @command{ncatted} separately to annotate large files. Should users emit a loud hue and cry, we will consider ading the the functionality of @command{ncatted} to the front-end of all operators, i.e., accepting valid @command{ncatted} arguments to modify attributes of any type and to apply regular expressions. @html @end html @node History Attribute, File List Attributes, Global Attribute Addition, Shared features @section History Attribute @cindex @code{history} @cindex timestamp @cindex global attributes @cindex attributes, global @cindex @code{-h} @cindex @code{--hst} @cindex @code{--history} @cartouche Availability: All operators@* Short options: @samp{-h}@* Long options: @samp{--hst}, @samp{--history}@* @end cartouche All operators automatically append a @code{history} global attribute to any file they create or modify. The @code{history} attribute consists of a timestamp and the full string of the invocation command to the operator, e.g., @samp{Mon May 26 20:10:24 1997: ncks in.nc out.nc}. The full contents of an existing @code{history} attribute are copied from the first @var{input-file} to the @var{output-file}. The timestamps appear in reverse chronological order, with the most recent timestamp appearing first in the @code{history} attribute. Since @acronym{NCO} adheres to the @code{history} convention, the entire data processing path of a given netCDF file may often be deduced from examination of its @code{history} attribute. As of May, 2002, @acronym{NCO} is case-insensitive to the spelling of the @code{history} attribute name. Thus attributes named @code{History} or @code{HISTORY} (which are non-standard and not recommended) will be treated as valid history attributes. When more than one global attribute fits the case-insensitive search for ``history'', the first one found is used. @cindex @command{ncatted} To avoid information overkill, all operators have an optional switch (@samp{-h}, @samp{--hst}, or @samp{--history}) to override automatically appending the @code{history} attribute (@pxref{ncatted netCDF Attribute Editor}). Note that the @samp{-h} switch also turns off writing the @code{nco_input_file_list}-attribute for multi-file operators (@pxref{File List Attributes}). @cindex @code{history_of_appended_files} @cindex provenance As of @acronym{NCO} version 4.5.0 (June, 2015), @acronym{NCO} supports its own convention to retain the @code{history}-attribute contents of all files that were appended to a file @footnote{Note that before version 4.5.0, @acronym{NCO} could, in append (@samp{-A}) mode only, inadvertently overwrite the global metadata (including @code{history}) of the output file with that of the input file. This is opposite the behavior most would want.}. This convention stores those contents in the @code{history_of_appended_files} attribute, which complements the @code{history}-attribute to provide a more complete provenance. These attributes may appear something like this in output: @example @verbatim // global attributes: :history = "Thu Jun 4 14:19:04 2015: ncks -A /home/zender/foo3.nc /home/zender/tmp.nc\n", "Thu Jun 4 14:19:04 2015: ncks -A /home/zender/foo2.nc /home/zender/tmp.nc\n", "Thu Jun 4 14:19:04 2015: ncatted -O -a att1,global,o,c,global metadata only in foo1 /home/zender/foo1.nc\n", "original history from the ur-file serving as the basis for subsequent appends." ; :history_of_appended_files = "Thu Jun 4 14:19:04 2015: Appended file \ /home/zender/foo3.nc had following \"history\" attribute:\n", "Thu Jun 4 14:19:04 2015: ncatted -O -a att2,global,o,c,global metadata only in foo3 /home/zender/foo3.nc\n", "history from foo3 from which data was appended to foo1 after data from foo2 was appended\n", "Thu Jun 4 14:19:04 2015: Appended file /home/zender/foo2.nc had following \"history\" attribute:\n", "Thu Jun 4 14:19:04 2015: ncatted -O -a att2,global,o,c,global metadata only in foo2 /home/zender/foo2.nc\n", "history of some totally different file foo2 from which data was appended to foo1 before foo3 was appended\n", :att1 = "global metadata only in foo1" ; @end verbatim @end example Note that the @code{history_of_appended_files}-attribute is only created, and will only exist, in a file that is, or descends from a file that was, appended to. The optional switch @samp{-h} (or @samp{--hst} or @samp{--history}) also overrides automatically appending the @code{history_of_appended_files} attribute. @html @end html @node File List Attributes, CF Conventions, History Attribute, Shared features @section File List Attributes @cindex @code{nco_input_file_list} @cindex @code{nco_input_file_number} @cindex @code{stdin} @cindex global attributes @cindex attributes, global @cindex @code{-H} @cindex @code{--fl_lst_in} @cindex @code{--file_list} @cartouche Availability: @command{nces}, @command{ncecat}, @command{ncra}, @command{ncrcat}@* Short options: @samp{-H}@* Long options: @samp{--fl_lst_in}, @samp{--file_list}@* @end cartouche Many methods of specifying large numbers of input file names pass these names via pipes, encodings, or argument transfer programs (@pxref{Large Numbers of Files}). When these methods are used, the input file list is not explicitly passed on the command line. This results in a loss of information since the @code{history} attribute no longer contains the exact command by which the file was created. @acronym{NCO} solves this dilemma by archiving input file list attributes. When the input file list to a multi-file operator is specified via @code{stdin}, the operator, by default, attaches two global attributes to any file they create or modify. The @code{nco_input_file_number} global attribute contains the number of input files, and @code{nco_input_file_list} contains the file names, specified as standard input to the multi-file operator. This information helps to verify that all input files the user thinks were piped through @code{stdin} actually arrived. Without the @code{nco_input_file_list} attribute, the information is lost forever and the ``chain of evidence'' would be broken. The @samp{-H} switch overrides (turns off) the default behavior of writing the input file list global attributes when input is from @code{stdin}. The @samp{-h} switch does this too, and turns off the @code{history} attribute as well (@pxref{History Attribute}). Hence both switches allows space-conscious users to avoid storing what may amount to many thousands of filenames in a metadata attribute. @html @end html @node CF Conventions, ARM Conventions, File List Attributes, Shared features @section @acronym{CF} Conventions @cindex @acronym{ACME} conventions @cindex @acronym{CF} conventions @cindex @acronym{CCSM} conventions @cindex UDUnits @cindex @code{ORO} @cindex @code{area} @cindex @code{datesec} @cindex @code{date} @cindex @code{gw} @cindex @code{hyai} @cindex @code{hyam} @cindex @code{hybi} @cindex @code{hybm} @cindex @code{lat_bnds} @cindex @code{lon_bnds} @cindex @code{msk_*} @cartouche Availability: @command{ncbo}, @command{nces}, @command{ncecat}, @command{ncflint}, @command{ncpdq}, @command{ncra}, @command{ncwa}@* Short options: None@* @end cartouche @acronym{NCO} recognizes some Climate and Forecast (@acronym{CF}) metadata conventions, and applies special rules to such data. @acronym{NCO} was contemporaneous with @acronym{COARDS} and still contains some rules to handle older model datasets that pre-date @acronym{CF}, such as @acronym{NCAR} @acronym{CCM} and early @acronym{CCSM} datasets. Such datasets may not contain an explicit @code{Conventions} attribute (e.g., @samp{CF-1.0}). Nevertheless, we refer to all such metadata collectively as @acronym{CF} metadata. Skip this section if you never work with @acronym{CF} metadata. The latest @acronym{CF} netCDF conventions are described @uref{http://cfconventions.org/1.6.html, here}. Most @acronym{CF} netCDF conventions are transparent to @acronym{NCO}. There are no known pitfalls associated with using any @acronym{NCO} operator on files adhering to these conventions. To increase user friendliness, @acronym{NCO} applies special rules to certain variables in @acronym{CF} files. Rules not required by @acronym{CF} are because experience shows that they simplify data analysis. Here is a general sense of @acronym{NCO}'s @acronym{CF}-support: Understanding and implementing @acronym{NUG} recommendations such as the history attribute, packing conventions, and attention to units. Special handling of variables designated as coordinates, bounds, or ancillary variables, so that users subsetting a certain variable automatically obtain all related variables. Special handling and prevention of meaningless operations (e.g., the root-mean-square of latitude) so that coordinates and bounds preserve meaningful information even as normal fields are statistically transformed. Understanding units and certain calendars so that hyperslabs may be specified in physical units, and so that user needs not manually decode per-file time specifications. Understanding auxiliary coordinates so that irregular hyperslabs may be specified on complex geometric grids. Checking for CF-compliance on netCDF3 and netCDF4 and @acronym{HDF} files. Converting netCDF4 and @acronym{HDF} files to netCDF3 for strict @acronym{CF}-compliance. Finally, a main use of @acronym{NCO} is to ``produce @acronym{CF}'', i.e., to improve @acronym{CF}-compliance by annotating metadata, renaming objects (attributes, variables, and dimensions), permuting and inverting dimensions, recomputing values, and data compression. @html @end html Currently, @acronym{NCO} determines whether a datafile is a @acronym{CF} output datafile simply by checking (case-insensitively) whether the value of the global attribute @code{Conventions} (if any) equals @samp{CF-1.0} or @samp{NCAR-CSM} Should @code{Conventions} equal either of these in the (first) @var{input-file}, @acronym{NCO} will apply special rules to certain variables because of their usual meaning in @acronym{CF} files. @acronym{NCO} will not average the following variables often found in @acronym{CF} files: @code{ntrm}, @code{ntrn}, @code{ntrk}, @code{ndbase}, @code{nsbase}, @code{nbdate}, @code{nbsec}, @code{mdt}, @code{mhisf}. These variables contain scalar metadata such as the resolution of the host geophysical model and it makes no sense to change their values. @cindex non-coordinate grid properties Furthermore, the @dfn{size and rank-preserving arithmetic operators} try not to operate on certain grid properties. These operators are @command{ncap2}, @command{ncbo}, @command{nces}, @command{ncflint}, and @command{ncpdq} (when used for packing, not for permutation). These operators do not operate, by default, on (i.e., add, subtract, pack, etc.) the following variables: @code{ORO}, @code{area}, @code{datesec}, @code{date}, @code{gw}, @code{hyai}, @code{hyam}, @code{hybi}. @code{hybm}, @code{lat_bnds}, @code{lon_bnds}, @code{msk_*}, @code{wgt_*}. These variables represent Gaussian weights, land/sea masks, time fields, hybrid pressure coefficients, and latititude/longitude boundaries. We call these fields non-coordinate @dfn{grid properties}. Coordinate grid properties are easy to identify because they are coordinate variables such as @code{latitude} and @code{longitude}. Users usually want @emph{all} grid properties to remain unaltered in the output file. To be treated as a grid property, the variable name must @emph{exactly} match a name in the above list, or be a coordinate variable. Handling of @code{msk_*} and @code{wgt_*} is exceptional in that @emph{any} variable whose name starts with @code{msk_} or @code{wgt_} is considered to be a ``mask'' or a ``weight'' and is thus preserved (not operated on when arithmetic can be avoided). As of @acronym{NCO} version 4.5.0 (June, 2015), @acronym{NCO} began to support behavior required for the @acronym{DOE} @acronym{ACME} program, and we refer to these rules collectively as the @acronym{ACME} convention. @cindex @acronym{GMT} @cindex @code{date_written} @cindex @code{time_written} @cindex @code{gmtime()} The first @acronym{ACME} rule implemented is that the contents of @var{input-file} variables named @code{date_written} and @code{time_written}, if any, will be updated to the current system-supplied (with @code{gmtime()}) @acronym{GMT}-time as the variables are copied to the @var{output-file}. You must spoof @acronym{NCO} if you would like any grid properties or other special @acronym{CF} fields processed normally. For example rename the variables first with @command{ncrename}, or alter the @code{Conventions} attribute. @html @end html @cindex @code{bounds} attribute @cindex bounds convention As of @acronym{NCO} version 4.0.8 (April, 2011), @acronym{NCO} supports the @acronym{CF} @code{bounds} convention for cell boundaries described @uref{http://cfconventions.org/1.6.html#cell-boundaries, here}. This convention allows coordinate variables (including multidimensional coordinates) to describe the boundaries of their cells. This is done by naming the variable which contains the bounds in in the @code{bounds} attribute. Note that coordinates of rank @math{N} have bounds of rank @math{N+1}. NCO-generated subsets of @acronym{CF}-compliant files with @code{bounds} attributes will include the coordinates specified by the @code{bounds} attribute, if any. Hence the subsets will themselves be @acronym{CF}-compliant. Bounds are subject to the user-specified override switches (including @samp{-c} and @samp{-C}) described in @ref{Subsetting Coordinate Variables}. @html @end html @cindex @code{climatology} attribute @cindex climatology convention As of @acronym{NCO} version 4.4.9 (May, 2015), @acronym{NCO} supports the @acronym{CF} @code{climatology} convention for climatology statistics described @uref{http://cfconventions.org/Data/cf-conventions/cf-conventions-1.7/build/cf-conventions.html#climatological-statistics, here}. This convention allows coordinate variables (including multidimensional coordinates) to describe the (possibly nested) periods and statistical methods of their associated statistics. This is done by naming the variable which contains the periods and methods in the @code{climatology} attribute. Note that coordinates of rank @math{N} have climatology bounds of rank @math{N+1}. NCO-generated subsets of @acronym{CF}-compliant files with @code{climatology} attributes will include the variables specified by the @code{climatology} attribute, if any. Hence the subsets will themselves be @acronym{CF}-compliant. Climatology variables are subject to the user-specified override switches (including @samp{-c} and @samp{-C}) described in @ref{Subsetting Coordinate Variables}. @html @end html @cindex @code{ancillary_variables} attribute @cindex ancillary variables convention As of @acronym{NCO} version 4.4.5 (July, 2014), @acronym{NCO} supports the @acronym{CF} @code{ancillary_variables} convention for described @uref{http://cfconventions.org/1.6.html#ancillary-data, here}. This convention allows ancillary variables to be associated with one or more primary variables. @acronym{NCO} attaches any such variables to the extraction list along with the primary variable and its usual (one-dimensional) coordinates, if any. Ancillary variables are subject to the user-specified override switches (including @samp{-c} and @samp{-C}) described in @ref{Subsetting Coordinate Variables}. @html @end html @cindex @code{coordinates} @cindex coordinates convention @cindex coordinate variable @cindex auxiliary coordinates @cindex subsetting @cindex @code{-C} @cindex @code{-c} @cindex @code{--no-coords} @cindex @code{--no-crd} @cindex @code{--coords} @cindex @code{--crd} As of @acronym{NCO} version 3.9.6 (January, 2009), @acronym{NCO} supports the @acronym{CF} @code{coordinates} convention described @uref{http://cfconventions.org/1.6.html#coordinate-system, here}. This convention allows variables to specify additional coordinates (including mult-idimensional coordinates) in a space-separated string attribute named @code{coordinates}. @acronym{NCO} attaches any such coordinates to the extraction list along with the variable and its usual (one-dimensional) coordinates, if any. These auxiliary coordinates are subject to the user-specified override switches (including @samp{-c} and @samp{-C}) described in @ref{Subsetting Coordinate Variables}. Elimination of reduced dimensions from the @code{coordinates} attribute helps ensure that rank-reduced variables become completely independent from their former dimensions. As of @acronym{NCO} version 4.4.9 (May, 2015), @acronym{NCO} may modify the @code{coordinates} attribute to assist this. In particular, @command{ncwa} eliminates from the @code{coordinates} attribute any dimension that it collapses, e.g., by averaging. The former presence of this dimension will usually be indicated by the @acronym{CF} @code{cell_methods} convention described @uref{http://cfconventions.org/1.6.html#cell-methods, here}. Hence the @acronym{CF} @code{cell_methods} and @code{coordinates} conventions can be said to work in tandem to characterize the state and history of a variable's analysis. @html @end html @cindex @code{cell_methods} @cindex @code{--cll_mth} @cindex @code{--no_cll_mth} @cindex @code{--cell_methods} @cindex @code{--no_cell_methods} @cindex cell methods convention As of @acronym{NCO} version 4.4.2 (February, 2014), @acronym{NCO} supports some of the @acronym{CF} @code{cell_methods} @uref{http://cfconventions.org/1.6.html#cell-methods, convention} to describe the analysis procedures that have been applied to data. The convention creates (or appends to an existing) @code{cell_methods} attribute a space-separated list of couplets of the form @var{dmn: op} where @var{dmn} is a comma-separated list of dimensions previously contained in the variable that have been reduced by the arithmetic operation @var{op}. For example, the @code{cell_methods} value @code{time: mean} says that the variable in question was averaged over the @code{time} dimension. In such cases @code{time} will either be a scalar variable or a degenerate dimension or coordinate. This simply means that it has been averaged-over. The value @code{time, lon: mean lat: max} says that the variable in question is the maximum zonal mean of the time averaged original variable. Which is to say that the variable was first averaged over time and longitude, and then the residual latitudinal array was reduced by choosing the maximum value. Since the @code{cell methods} convention may alter metadata in an undesirable (or possibly incorrect) fashion, we provide switches to ensure it is always or never used. Use long-options @samp{--cll_mth} or @samp{--cell_methods} to invoke the algorithm (true by default), and options @samp{--no_cll_mth} or @samp{--no_cell_methods} to turn it off. These options are only available in the operators @command{ncwa} and @command{ncra}. @html @end html @node ARM Conventions, Operator Version, CF Conventions, Shared features @section @acronym{ARM} Conventions @cindex @acronym{ARM} conventions @cindex @code{time_offset} @cindex @code{base_time} @cindex @code{time} @cartouche Availability: @command{ncrcat}@* Short options: None@* @end cartouche @command{ncrcat} has been programmed to correctly handle data files which utilize the Atmospheric Radiation Measurement (@acronym{ARM}) Program @uref{http://www.arm.gov/data/time.stm,convention} for time and time offsets. If you do not work with @acronym{ARM} data then you may skip this section. @acronym{ARM} data files store time information in two variables, a scalar, @code{base_time}, and a record variable, @code{time_offset}. Subtle but serious problems can arise when these type of files are blindly concatenated without @acronym{CF} or @acronym{ARM} support. @command{NCO} implements rebasing (@pxref{Rebasing Time Coordinate}) as necessary on both @acronym{CF} and @acronym{ARM} files. Rebasing chains together consecutive @var{input-files} and produces an @var{output-file} which contains the correct time information. For @acronym{ARM} files this is expecially complex because the time coordinates are often stored as type @code{NC_CHAR}. Currently, @command{ncrcat} determines whether a datafile is an @acronym{ARM} datafile simply by testing for the existence of the variables @code{base_time}, @code{time_offset}, and the dimension @code{time}. If these are found in the @var{input-file} then @command{ncrcat} will automatically perform two non-standard, but hopefully useful, procedures. First, @command{ncrcat} will ensure that values of @code{time_offset} appearing in the @var{output-file} are relative to the @code{base_time} appearing in the first @var{input-file} (and presumably, though not necessarily, also appearing in the @var{output-file}). Second, if a coordinate variable named @code{time} is not found in the @var{input-files}, then @command{ncrcat} automatically creates the @code{time} coordinate in the @var{output-file}. The values of @code{time} are defined by the @acronym{ARM} conventions @math{@var{time} = @var{base_time} + @var{time_offset}}. Thus, if @var{output-file} contains the @code{time_offset} variable, it will also contain the @code{time} coordinate. @cindex @code{history} @cindex global attributes @cindex attributes, global @w{A short} message is added to the @code{history} global attribute whenever these @acronym{ARM}-specific procedures are executed. @html @end html @node Operator Version, , ARM Conventions, Shared features @section Operator Version @cindex version @cindex @acronym{RCS} @cindex @code{-r} @cindex @code{--revision} @cindex @code{--version} @cindex @code{--vrs} @cartouche Availability: All operators@* Short options: @samp{-r}@* Long options: @samp{--revision}, @samp{--version}, or @samp{--vrs}@* @end cartouche All operators can be told to print their version information, library version, copyright notice, and compile-time configuration with the @samp{-r} switch, or its long-option equivalent @samp{revision}. The @samp{--version} or @samp{--vrs} switches print the operator version information only. The internal version number varies between operators, and indicates the most recent change to a particular operator's source code. This is useful in making sure you are working with the most recent operators. The version of @acronym{NCO} you are using might be, e.g., @code{3.9.5}. Using @samp{-r} on, say, @command{ncks}, produces something like @samp{NCO netCDF Operators version "3.9.5" last modified 2008/05/11 built May 12 2008 on neige by zender Copyright (C) 1995--2008 Charlie Zender ncks version 20090918}. This tells you that @command{ncks} contains all patches up to version @code{3.9.5}, which dates from @w{May 11}, 2008. @html @end html @node Reference Manual, Contributing, Shared features, Top @chapter Reference Manual This chapter presents reference pages for each of the operators individually. The operators are presented in alphabetical order. @cindex command line switches All valid command line switches are included in the syntax statement. Recall that descriptions of many of these command line switches are provided only in @ref{Shared features}, to avoid redundancy. Only options specific to, or most useful with, a particular operator are described in any detail in the sections below. @menu * ncap2 netCDF Arithmetic Processor:: * ncatted netCDF Attribute Editor:: * ncbo netCDF Binary Operator:: * nces netCDF Ensemble Statistics:: * ncecat netCDF Ensemble Concatenator:: * ncflint netCDF File Interpolator:: * ncks netCDF Kitchen Sink:: * ncpdq netCDF Permute Dimensions Quickly:: * ncra netCDF Record Averager:: * ncrcat netCDF Record Concatenator:: * ncremap netCDF Remapper:: * ncrename netCDF Renamer:: * ncwa netCDF Weighted Averager:: @end menu @page @html @end html @node ncap2 netCDF Arithmetic Processor, ncatted netCDF Attribute Editor, Reference Manual, Reference Manual @section @command{ncap2} netCDF Arithmetic Processor @cindex parser @cindex lexer @cindex arithmetic processor @findex ncap @findex ncap2 @cartouche @command{ncap2} understands a relatively full-featured language of operations, including loops, conditionals, arrays, and math functions. @command{ncap2} is the most rapidly changing @acronym{NCO} operator and its documentation is incomplete. The distribution file @file{data/ncap2_tst.nco} contains an up-to-date overview of its syntax and capabilities. The @file{data/*.nco} distribution files (especially @file{bin_cnt.nco}, @file{psd_wrf.nco}, and @file{rgr.nco}) contain in-depth examples of @command{ncap2} solutions to complex problems. @end cartouche @c fxm: TODO nco549 hyper-link all switches to explanatory sections? @c Problem is that only works well in HTML mode @c TeXInfo has no native mode for concise hyperlinks in text mode @c Currently in TeX/PDF mode, TeXInfo opens browser to find link, @c rather than jumping to internal link within document @noindent SYNTAX @example ncap2 [-3] [-4] [-6] [-7] [@uref{http://nco.sf.net/nco.html#-A,,-A}] [-C] [-c] [-D @var{dbg}] [-F] [-f] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [--no_tmp_fl] [-O] [-o @var{output-file}] [-p @var{path}] [-R] [-r] [--ram_all] [-s @var{algebra}] [-S @var{fl.nco}] [-t @var{thr_nbr}] [-v] @var{input-file} [@var{output-file}] @end example @noindent DESCRIPTION @command{ncap2} arithmetically processes netCDF files @footnote{@command{ncap2} is the successor to @command{ncap} which was put into maintenance mode in November, 2006. This documentation refers to @command{ncap2}, which has a superset of the @command{ncap} functionality. Eventually @command{ncap} will be deprecated in favor @command{ncap2}. @command{ncap2} may be renamed @command{ncap} in 2013.}. @cindex script file @cindex @code{--script-file} @cindex @code{--fl_spt} @cindex @code{--script} @cindex @code{--spt} The processing instructions are contained either in the @acronym{NCO} script file @file{fl.nco} or in a sequence of command line arguments. The options @samp{-s} (or long options @samp{--spt} or @samp{--script}) are used for in-line scripts and @samp{-S} (or long options @samp{--fl_spt} or @samp{--script-file}) are used to provide the filename where (usually multiple) scripting commands are pre-stored. @command{ncap2} was written to perform arbitrary algebraic transformations of data and archive the results as easily as possible. @cindex derived fields @xref{Missing Values}, for treatment of missing values. The results of the algebraic manipulations are called @dfn{derived fields}. Unlike the other operators, @command{ncap2} does not accept a list of variables to be operated on as an argument to @samp{-v} (@pxref{Subsetting Files}). Rather, the @samp{-v} switch takes no arguments and indicates that @command{ncap2} should output @emph{only} user-defined variables. @command{ncap2} neither accepts nor understands the @var{-x} switch. @cindex appending variables NB: As of 20120515, @command{ncap2} is unable to append to files that already contain the appended dimensions. @c @subsection Scripting Mathematical Processing with @command{ncap2} @menu * Syntax of ncap2 statements:: * Expressions:: * Dimensions:: * Left hand casting:: * Arrays and hyperslabs:: * Attributes:: * Number literals:: * if statement:: * print statement:: * Missing values ncap2:: * Methods and functions:: * RAM variables:: * Where statement:: * Loops:: * Include files:: * Sort methods:: * Irregular grids:: * Bilinear interpolation:: * GSL special functions:: * GSL interpolation:: * GSL least-squares fitting:: * GSL statistics:: * GSL random number generation:: * Examples ncap2:: * Intrinsic mathematical methods:: * Operator precedence and associativity :: * ID Quoting:: @end menu @html @end html Defining new variables in terms of existing variables is a powerful feature of @command{ncap2}. @cindex derived fields Derived fields inherit the metadata (i.e., attributes) of their ancestors, if any, in the script or input file. When the derived field is completely new (no identically-named ancestors exist), then it inherits the metadata (if any) of the left-most variable on the right hand side of the defining expression. This metadata inheritance is called @dfn{attribute propagation}. Attribute propagation is intended to facilitate well-documented data analysis, and we welcome suggestions to improve this feature. The only exception to this rule of attribute propagation is in cases of left hand casting (@pxref{Left hand casting}). The user must manually define the proper metadata for variables defined using left hand casting. @html @end html @node Syntax of ncap2 statements, Expressions, ncap2 netCDF Arithmetic Processor, ncap2 netCDF Arithmetic Processor @subsection Syntax of @command{ncap2} statements @cindex statement @cindex syntax Mastering @command{ncap2} is relatively simple. Each valid statement @var{statement} consists of standard forward algebraic expression. The @file{fl.nco}, if present, is simply a list of such statements, whitespace, and comments. @cindex C language The syntax of statements is most like the computer @w{language C}. The following characteristics @w{of C} are preserved: @table @asis @item Array syntax @cindex array syntax @cindex @code{[]} (array delimiters) Arrays elements are placed within @code{[]} characters; @item Array indexing @cindex array indexing Arrays are 0-based; @item Array storage @cindex array storage Last dimension is most rapidly varying; @item Assignment statements @cindex assignment statement @cindex semi-colon @cindex @code{;} (end of statement) @w{A semi}-colon @samp{;} indicates the end of an assignment statement. @item Comments @cindex comments @cindex @code{/*...*/} (comment) @cindex @code{//} (comment) Multi-line comments are enclosed within @code{/* */} characters. Single line comments are preceded by @code{//} characters. @item Nesting @cindex including files @cindex nesting @cindex @code{#include} Files may be nested in scripts using @code{#include @var{script}}. Note that the @code{#include} command is not followed by a semi-colon because it is a pre-processor directive, not an assignment statement. The filename @file{script} is interpreted relative to the run directory. @item Attribute syntax @cindex attribute syntax @cindex @code{@@} (attribute) The at-sign @code{@@} is used to delineate an attribute name from a variable name. @end table @html @end html @node Expressions, Dimensions, Syntax of ncap2 statements, ncap2 netCDF Arithmetic Processor @cindex expressions @subsection Expressions Expressions are the fundamental building block of @command{ncap2}. Expressions are composed of variables, numbers, literals, and attributes. @cindex C language The following @w{C operators} are ``overloaded'' and work with scalars and multi-dimensional arrays: @example Arithmetic Operators: * / % + - ^ Binary Operators: > >= < <= == != == || && >> << Unary Operators: + - ++ -- ! Conditional Operator: exp1 ? exp2 : exp3 Assign Operators: = += -= /= *= @end example In the following section a @dfn{variable} also refers to a number literal which is read in as a scalar variable: @strong{Arithmetic and Binary Operators } Consider @emph{var1 'op' var2} @strong{Precision} @itemize @bullet @item When both operands are variables, the result has the precision of the higher precision operand. @item When one operand is a variable and the other an attribute, the result has the precision of the variable. @item When both operands are attributes, the result has the precision of the more precise attribute. @item The exponentiation operator ``^'' is an exception to the above rules. When both operands have type less than @code{NC_FLOAT}, the result is @code{NC_FLOAT}. When either type is @code{NC_DOUBLE}, the result is also @code{NC_DOUBLE}. @end itemize @c csz got to here editing @cindex broadcasting variables @cindex rank @strong{Rank} @itemize @bullet @item The Rank of the result is generally equal to Rank of the operand that has the greatest number of dimensions. @item If the dimensions in var2 are a subset of the dimensions in var1 then its possible to make var2 conform to var1 through broadcasting and or dimension reordering. @item Broadcasting a variable means creating data in non-existing dimensions by copying data in existing dimensions. @item More specifically: If the numbers of dimensions in var1 is greater than or equal to the number of dimensions in var2 then an attempt is made to make var2 conform to var1 ,else var1 is made to conform to var2. If conformance is not possible then an error message will be emitted and script execution will cease.@* @end itemize @noindent Even though the logical operators return True(1) or False(0) they are treated in the same way as the arithmetic operators with regard to precision and rank.@* Examples: @example @verbatim dimensions: time=10, lat=2, lon=4 Suppose we have the two variables: double P(time,lat,lon); float PZ0(lon,lat); // PZ0=1,2,3,4,5,6,7,8; Consider now the expression: PZ=P-PZ0 PZ0 is made to conform to P and the result is PZ0 = 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, 1,3,5,7,2,4,6,8, Once the expression is evaluated then PZ will be of type double; Consider now start=four-att_var@double_att; // start =-69 and is of type intger; four_pow=four^3.0f // four_pow=64 and is of type float three_nw=three_dmn_var_sht*1.0f; // type is now float start@n1=att_var@short_att*att_var@int_att; // start@n1=5329 and is type int @end verbatim @end example @noindent @strong{Binary Operators} @* @cindex binary Operators Unlike C the binary operators return an array of values. There is no such thing as short circuiting with the AND/OR operators. Missing values are carried into the result in the same way they are with the arithmetic operators. When an expression is evaluated in an if() the missing values are treated as true.@* The binary operators are, in order of precedence: @example ! Logical Not ---------------------------- << Less Than Selection >> Greater Than Selection ---------------------------- > Greater than >= Greater than or equal to < Less than <= Less than or equal to ---------------------------- == Equal to != Not equal to ---------------------------- && Logical AND ---------------------------- || Logical OR ---------------------------- @end example To see all operators: @pxref{Operator precedence and associativity} Examples: @example tm1=time>2 && time <7; // tm1=0, 0, 1, 1, 1, 1, 0, 0, 0, 0 double tm2=time==3 || time>=6; // tm2=0, 0, 1, 0, 0, 1, 1, 1, 1, 1 double tm3=int(!tm1); // tm3=1, 1, 0, 0, 0, 0, 1, 1, 1, 1 int tm4=tm1 && tm2; // tm4=0, 0, 1, 0, 0, 1, 0, 0, 0, 0 double tm5=!tm4; // tm5=1, 1, 0, 1, 1, 0, 1, 1, 1, 1 double @end example @noindent @strong{Regular Assign Operator}@* @noindent @emph{var1 '=' exp1} @* If var1 does not already exist in Output then var1 is written to Output with the values and dimensions from expr1. If var1 already exists in Output, then the only requirement on expr1 is that the number of elements must match the number already on disk. The type of expr1 is converted if necessary to the disk type. @noindent @strong{ Other Assign Operators +=,-=,*=./= }@* @noindent @emph{var1 'ass_op' exp1 }@* if exp1 is a variable and it doesn't conform to var1 then an attempt is made to make it conform to var1. If exp1 is an attribute it must have unity size or else have the same number of elements as var1. If expr1 has a different type to var1 the it is converted to the var1 type. @example z1=four+=one*=10 // z1=14 four=14 one=10; time-=2 // time= -1,0,1,2,3,4,5,6,7,8 @end example @noindent @strong{Increment/Decrement Operators @*} These work in a similar fashion to their regular C counterparts. If say the variable @code{four} is input only then the statement @code{++four} effectively means read @code{four} from input increment each element by one, then write the new values to Output; Example: @example n2=++four; n2=5, four=5 n3=one--+20; n3=21 one=0; n4=--time; n4=time=0.,1.,2.,3.,4.,5.,6.,7.,8.,9.; @end example @noindent @strong{Conditional Operator ?: } @* @cindex conditional Operator @noindent @emph{exp1 ? exp2 : exp3 } @* The conditional operator (or ternary Operator) is a succinct way of writing an if/then/else. If exp1 evaluates to true then exp2 is returned else exp3 is returned. Example: @example @verbatim weight_avg=weight.avg(); weight_avg@units= (weight_avg == 1 ? "kilo" : "kilos"); PS_nw=PS-(PS.min() > 100000 ? 100000 : 0); @end verbatim @end example @html @end html @noindent @strong{Clipping Operators} @cindex clipping operators @table @asis @item << Less-than Clipping@* For arrays, the less-than selection operator selects all values in the left operand that are less than the corresponding value in the right operand. If the value of the left side is greater than or equal to the corresponding value of the right side, then the right side value is placed in the result @item >> Greater-than Clipping@* For arrays, the greater-than selection operator selects all values in the left operand that are greater than the corresponding value in the right operand. If the value of the left side is less than or equal to the corresponding value of the right side, then the right side value is placed in the result. @end table Example: @example RDM2=RDM >> 100.0 // 100,100,100,100,126,126,100,100,100,100 double RDM2=RDM << 90s // 1, 9, 36, 84, 90, 90, 84, 36, 9, 1 int @end example @html @end html @node Dimensions, Left hand casting, Expressions, ncap2 netCDF Arithmetic Processor @subsection Dimensions @cindex defining dimensions in @command{ncap2} @cindex @code{defdim()} Dimensions are defined in Output using the @code{defdim()} function. @example defdim("cnt",10); # Dimension size is fixed by default defdim("cnt",10,NC_UNLIMITED); # Dimension is unlimited (record dimension) defdim("cnt",10,0); # Dimension is unlimited (record dimension) defdim("cnt",10,1); # Dimension size is fixed defdim("cnt",10,737); # All non-zero values indicate dimension size is fixed @end example This dimension name must then be prefixed with a dollar-sign @samp{$} when referred to in method arguments or left-hand-casting, e.g., @example new_var[$cnt]=time; temperature[$time,$lat,$lon]=35.5; temp_avg=temperature.avg($time); @end example The @code{size} method allows the dimension size to be used in an arithmetic expression: @example time_avg=time.total() / $time.size; @end example Increase the size of a new variable by one and set new member to zero: @example defdim("cnt_new",$cnt.size+1); new_var[$cnt_new]=0.0; new_var(0:($cnt_new.size-2))=old_var; @end example @noindent @strong{Dimension Abbreviations @*} It is possible to use dimension abbreviations as method arguments:@* @code{$0} is the first dimension of a variable@* @code{$1} is the second dimension of a variable@* @code{$n} is the n+1 dimension of a variable@* @example float four_dmn_rec_var(time,lat,lev,lon); double three_dmn_var_dbl(time,lat,lon); four_nw=four_dmn_rev_var.reverse($time,$lon) four_nw=four_dmn_rec_var.reverse($0,$3); four_avg=four_dmn_rec_var.avg($lat,$lev); four_avg=four_dmn_rec_var.avg($1,$2); three_mw=three_dmn_var_dbl.permute($time,$lon,$lat); three_mw=three_dmn_var_dbl.permute($0,$2,$1); @end example @noindent @strong{ID Quoting @*} If the dimension name contains non-regular characters use ID quoting. See @pxref{ID Quoting} @example defdim("a--list.A",10); A1['$a--list.A']=30.0; @end example @noindent @strong{GOTCHA @*} @noindent It is not possible to manually define in Output any dimensions that exist in Input. When a variable from Input appears in an expression or statement its dimensions in Input are automagically copied to Output (if they are not already present) @html @end html @node Left hand casting, Arrays and hyperslabs, Dimensions, ncap2 netCDF Arithmetic Processor @subsection Left hand casting @cindex hybrid coordinate system @cindex left hand casting @cindex @acronym{LHS} The following examples demonstrate the utility of the @dfn{left hand casting} ability of @command{ncap2}. Consider first this simple, artificial, example. If @var{lat} and @var{lon} are one dimensional coordinates of dimensions @var{lat} and @var{lon}, respectively, then addition of these two one-dimensional arrays is intrinsically ill-defined because whether @var{lat_lon} should be dimensioned @var{lat} by @var{lon} or @var{lon} by @var{lat} is ambiguous (assuming that addition is to remain a @dfn{commutative} procedure, i.e., one that does not depend on the order of its arguments). Differing dimensions are said to be @dfn{orthogonal} to one another, and sets of dimensions which are mutually exclusive are orthogonal as a set and any arithmetic operation between variables in orthogonal dimensional spaces is ambiguous without further information. The ambiguity may be resolved by enumerating the desired dimension ordering of the output expression inside square brackets on the left hand side (@acronym{LHS}) of the equals sign. This is called @dfn{left hand casting} because the user resolves the dimensional ordering of the @acronym{RHS} of the expression by specifying the desired ordering on the @acronym{LHS}. @example ncap2 -s 'lat_lon[lat,lon]=lat+lon' in.nc out.nc ncap2 -s 'lon_lat[lon,lat]=lat+lon' in.nc out.nc @end example The explicit list of dimensions on the @acronym{LHS}, @code{[lat,lon]} resolves the otherwise ambiguous ordering of dimensions in @var{lat_lon}. In effect, the @acronym{LHS} @dfn{casts} its rank properties onto the @acronym{RHS}. Without @acronym{LHS} casting, the dimensional ordering of @var{lat_lon} would be undefined and, hopefully, @command{ncap2} would print an error message. @html @end html Consider now a slightly more complex example. In geophysical models, a coordinate system based on a blend of terrain-following and density-following surfaces is called a @dfn{hybrid coordinate system}. In this coordinate system, four variables must be manipulated to obtain the pressure of the vertical coordinate: @var{PO} is the domain-mean surface pressure offset (a scalar), @var{PS} is the local (time-varying) surface pressure (usually two horizontal spatial dimensions, i.e. latitude by longitude), @var{hyam} is the weight given to surfaces of constant density (one spatial dimension, pressure, which is orthogonal to the horizontal dimensions), and @var{hybm} is the weight given to surfaces of constant elevation (also one spatial dimension). This command constructs a four-dimensional pressure @code{prs_mdp} from the four input variables of mixed rank and orthogonality: @example ncap2 -s 'prs_mdp[time,lat,lon,lev]=P0*hyam+PS*hybm' in.nc out.nc @end example Manipulating the four fields which define the pressure in a hybrid coordinate system is easy with left hand casting. @html @end html Finally, we show how to use interface quantities to define midpoint quantities. In particular, we will define interface pressures using the standard @acronym{CESM} output hybrid coordinate parameters, and then difference those interface pressures to obtain the pressure difference between the interfaces. The pressure difference is necessary obtain gridcell mass path and density (which are midpoint quantities). Definitions are as in the above example, with new variables @var{hyai} and @var{hybi} defined at grid cell vertical interfaces (rather than midpoints like @var{hyam} and @var{hybm}). The approach naturally fits into two lines: @example @verbatim cat > ~/pdel.nco << 'EOF' *prs_ntf[time,lat,lon,ilev]=P0*hyai+PS*hybi; // Requires NCO 4.5.4 and later: prs_dlt[time,lat,lon,lev]=prs_ntf(:,:,:,1:$ilev.size-1)-prs_ntf(:,:,:,0:$ilev.size-2); // Derived variable that require pressure thickness: // Divide by gravity to obtain total mass path in layer aka mpl [kg m-2] mpl=prs_dlt/grv_sfc; // Multiply by mass mixing ratio to obtain mass path of constituent // Everything up to here works fine. The following line (commented-out) breaks the script. // However, it breaks it silently, no error is printed. Please try to fix this. mpl_CO2=mpl*mmr_CO2; EOF ncap2 -O -v -S ~/pdel.nco ~/nco/data/in.nc ~/foo.nc ncks -O -C -v prs_dlt ~/foo.nc @end verbatim @end example The first line defines the four-dimensional interface pressures @code{prs_ntf} as a @acronym{RAM} variable because those are not desired in the output file. The second differences each pressure level from the pressure above it to obtain the pressure difference. This line employs both left-hand casting and array hyperslabbing. However, this syntax only works with @acronym{NCO} version 4.5.4 (November, 2015) and later because earlier versions require that @acronym{LHS} and @acronym{RHS} dimension names (not just sizes) match. From the pressure differences, one can obtain the mass path in each layer as shown. @html @end html @node Arrays and hyperslabs, Attributes, Left hand casting, ncap2 netCDF Arithmetic Processor @subsection Arrays and hyperslabs @findex array @cindex @code{array} function @cindex arrays @cindex findgen-equivalent @cindex indgen-equivalent Generating a regularly spaced one-dimensional array with @command{ncap2} is simple with the @code{array()} function. The syntax is @example var_out=array(val_srt,val_ncr,$dmn_nm); // One-dimensional output var_out=array(val_srt,val_ncr,var_tpl); // Multi-dimensional output @end example @noindent where the arguments are the starting value @var{val_srt}, incremental value @var{val_ncr}, and, for one-dimensional output, the single dimension @code{$dmn_nm}, or, for multi-dimensional output, a template variable @code{var_tpl}, i.e., a variable with the same shape as the desired output. The type of @code{var_out} will be the same as @code{val_srt}. Be sure to encode this type with the appropriate decimal point and floating point suffix when @code{val_srt} is a ``naked constant'' rather than a variable. For example, to produce an array of shorts (signed two-byte integers), integers (signed four-byte integers), unsigned 64-bit integers, floats, or doubles use @example var_out=array(1s,val_ncr,$dmn_nm); // NC_SHORT array var_out=array(1,val_ncr,$dmn_nm); // NC_INT array var_out=array(1ull,val_ncr,$dmn_nm); // NC_UINT64 array var_out=array(1f,val_ncr,$dmn_nm); // NC_FLOAT array var_out=array(1.,val_ncr,$dmn_nm); // NC_DOUBLE array @end example Once the associated dimensions have been defined, the start and increment arguments may be supplied as values, mathmatical expressions, or variables: @example var_out=array(1,1,$time); // 1,2,3,4,5,6,7,8,9,10 var_out=array(1+2-2,one,$time); // 1,2,3,4,5,6,7,8,9,10 var_out=array(1,2,three_dmn_rec_var); // 1,3,5,...155,157,159 @end example @cindex hyperslabs Hyperslabs in @command{ncap2} are more limited than hyperslabs with the other @acronym{NCO} operators. @command{ncap2} does not understand the shell command-line syntax used to specify multi-slabs, wrapped co-ordinates, negative stride or coordinate value limits. However with a bit of syntactic magic they are all are possible. @command{ncap2} accepts (in fact, it requires) @var{N}-hyperslab arguments for a variable of rank @var{N}: @example var1(arg1,arg2 ... argN); @end example where each hyperslab argument is of the form @example start:end:stride @end example and the arguments for different dimensions are separated by commas. @noindent If @var{start} is omitted, it defaults to zero. If @var{end} is omitted, it defaults to dimension size minus one. If @var{stride} is omitted, it defaults to one. @sp 1 @noindent If a single value is present then it is assumed that that dimension collapses to a single value (i.e., a cross-section). The number of hyperslab arguments MUST equal the variable's rank. @sp 1 @noindent @strong{Hyperslabs on the Right Hand Side of an assign@*} A simple 1D example: @example @verbatim ($time.size=10) od[$time]={20,22,24,26,28,30,32,34,36,38}; od(7); // 34 od(7:); // 34,36,38 od(:7); // 20,22,24,26,28,30,32,34 od(::4); // 20,28,36 od(1:6:2) // 22,26,30 od(:) // 20,22,24,26,28,30,32,34,36,38 @end verbatim @end example A more complex three dimensional example: @example @verbatim ($lat.size=2,$lon.size=4) th[$time,$lat,$lon]= {1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16, 17,18,19,20,21,22,23,24, -99,-99,-99,-99,-99,-99,-99,-99, 33,34,35,36,37,38,39,40, 41,42,43,44,45,46,47,48, 49,50,51,52,53,54,55,56, -99,58,59,60,61,62,63,64, 65,66,67,68,69,70,71,72, -99,74,75,76,77,78,79,-99 }; th(1,1,3); // 16 th(2,0,:); // 17, 18, 19, 20 th(:,1,3); // 8, 16, 24, -99, 40, 48, 56, 64, 72, -99 th(::5,:,0:3:2); // 1, 3, 5, 7, 41, 43, 45, 47 @end verbatim @end example If hyperslab arguments collapse to a single value (a cross-section has been specified), then that dimension is removed from the returned variable. If all the values collapse then a scalar variable is returned. So, for example, the following is valid: @example th_nw=th(0,:,:)+th(9,:,:); // th_nw has dimensions $lon,$lat // NB: the time dimension has become degenerate @end example The following is invalid: @example th_nw=th(0,:,0:1)+th(9,:,0:1); @end example because the @code{$lon} dimension now only has two elements. The above can be calculated by using a LHS cast with @code{$lon_nw} as replacement dim for @code{$lon}: @example defdim("lon_nw",2); th_nw[$lat,$lon_nw]=th(0,:,0:1) +th(9,:,0:1); @end example @noindent @strong{Hyperslabs on the Left Hand Side of an assign@*} @noindent When hyperslabing on the LHS, the expression on the RHS must evaluate to a scalar or a variable/attribute with the same number of elements as the LHS hyperslab. Set all elements of the last record to zero: @example th(9,:,:)=0.0; @end example Set first element of each lon element to 1.0: @example th(:,:,0)=1.0; @end example One may hyperslab on both sides of an assign. For example, this sets the last record to the first record: @example th(9,:,:)=th(0,:,:); @end example Say @var{th0} represents pressure at height=0 and @var{th1} represents pressure at height=1. Then it is possible to insert these hyperslabs into the records @example prs[$time,$height,$lat,$lon]=0.0; prs(:,0,:,:)=th0; prs(:,1,:,:)=th1 @end example @noindent @strong{Reverse method}@* @cindex reverse() Use the @code{reverse()} method to reverse a dimension's elements in a variable with at least one dimension. This is equivalent to a negative stride, e.g., @example @verbatim th_rv=th(1 ,:,:).reverse($lon); // {12,11,10,9 }, {16,15,14,13} od_rv=od.reverse($time); // {38,36,34,32,30,28,26,24,22,20} @end verbatim @end example @noindent @strong{Permute method}p@* @cindex permute() Use the @code{permute()} method to swap the dimensions of a variable. The number and names of dimension arguments must match the dimensions in the variable. If the first dimension in the variable is of record type then this must remain the first dimension. If you want to change the record dimension then consider using @command{ncpdq}. Consider the variable: @example float three_dmn_var(lat,lev,lon); three_dmn_var_prm=three_dmn_var.permute($lon,$lat,$lev); // The permuted values are three_dmn_var_prm= 0,4,8, 12,16,20, 1,5,9, 13,17,21, 2,6,10, 14,18,22, 3,7,11, 15,19,23; @end example @html @end html @node Attributes, Number literals, Arrays and hyperslabs, ncap2 netCDF Arithmetic Processor @subsection Attributes @cindex attributes@command{ncap2} @noindent Attributes are referred to by @emph{var_nm@@att_nm} @* All the following are valid statements: @example @verbatim global@text="Test Attributes"; /* Assign a global variable attribute */ a1[$time]=time*20; a1@long_name="Kelvin"; a1@min=a1.min(); a1@max=a1.max(); a1@min++; --a1@max; q a1(0)=a1@min; a1($time.size-1)=a1@max; @end verbatim @end example @html @end html @cindex instantiate @cindex instantiation A @emph{value list} can be used on the RHS of an assignment statement to @dfn{instantiate} a variable: @cindex value list @example @verbatim a1@trip1={1,2,3} ; a1@triplet={a1@min,(a1@min+a1@max)/2,a1@max}; @end verbatim @end example The netCDF specification allows all attribute types to have a size greater than one. The maximum is defined by @code{NC_MAX_ATTRS}. The following is an @command{ncdump} of the metadata for variable @var{a1} @example double a1(time) ; a1:long_name = "Kelvin" ; a1:max = 199. ; a1:min = 21. ; a1:trip1 = 1, 2, 3 ; a1:triplet = 21., 110., 199. ; @end example The @code{size()} method can be used with attributes. For example, to save an attribute text string in a variable, @example @verbatim defdim("sng_len", a1@long_name.size()); sng_arr[$sng_len]=a1@long_name; // sng_arr now contains "Kelvin" @end verbatim @end example Attributes defined in a script are stored in memory and are written to Output after script completion. To stop the attribute being written use the ram_delete() method or use a bogus variable name. @noindent @strong{Attribute Propagation and Inheritance} @cindex attribute propagation @cindex attribute inheritance @itemize @bullet @item Attribute propagation occurs in a regular assign statement. The variable being defined on the LHS gets copies of the attributes from the leftermost variable on the RHS. @item Attribute Inheritance: The LHS variable ``inherits'' attributes from an Input variable with the same name @item It is possible to have a regular assign statement for which both propagation and inheritance occur. @end itemize @example // prs_mdp inherits attributes from P0: prs_mdp[time,lat,lon,lev]=P0*hyam+hybm*PS; // th_min inherits attributes from three_dmn_var_dbl: th_min=1.0 + 2*three_dmn_var_dbl.min($time); @end example If the attribute name contains non-regular characters use ID quoting. See @pxref{ID Quoting} @example @verbatim 'b..m1@c--lost'=23; @end verbatim @end example @html @end html @node Number literals, if statement, Attributes, ncap2 netCDF Arithmetic Processor @subsection Number literals @cindex number literals @command{ncap2} The table below lists the postfix character(s) to add to a number literal (aka, a naked constant) for explicit type specification. The same type-specification rules are used for variables and attributes. A floating point number without a postfix defaults to @code{NC_DOUBLE}, while an integer without a postfix defaults to type @code{NC_INT}: @example @verbatim var[$rlev]=0.1; // Variable will be type @code{NC_DOUBLE} var[$lon_grd]=2.0; // Variable will be type @code{NC_DOUBLE} var[$gds_crd]=2e3; // Variable will be type @code{NC_DOUBLE} var[$gds_crd]=2.0f; // Variable will be type @code{NC_FLOAT} (note "f") var[$gds_crd]=2e3f; // Variable will be type @code{NC_FLOAT} (note "f") var[$gds_crd]=2; // Variable will be type @code{NC_INT} var[$gds_crd]=-3; // Variable will be type @code{NC_INT} var[$gds_crd]=2s; // Variable will be type @code{NC_SHORT} var[$gds_crd]=-3s; // Variable will be type @code{NC_SHORT} var@att=41.; // Attribute will be type @code{NC_DOUBLE} var@att=41.f; // Attribute will be type @code{NC_FLOAT} var@att=41; // Attribute will be type @code{NC_INT} var@att=-21s; // Attribute will be type @code{NC_SHORT} var@units="kelvin"; // Attribute will be type @code{NC_CHAR} @end verbatim @end example There is no postfix for characters, use a quoted string instead for @code{NC_CHAR}. @command{ncap2} interprets a standard double-quoted string as a value of type @code{NC_CHAR}. In this case, any receiving variable must be dimensioned as an array of @code{NC_CHAR} long enough to hold the value. To use the newer netCDF4 types @acronym{NCO} must be compiled/linked to the netCDF4 library and the output file must be of type @code{NETCDF4}: @example @verbatim var[$time]=1UL; // Variable will be type @code{NC_UINT} var[$lon]=4b; // Variable will be type @code{NC_BYTE} var[$lat]=5ull; // Variable will be type @code{NC_UINT64} var[$lat]=5ll; // Variable will be type @code{NC_INT64} var@att=6.0d; // Attribute will be type @code{NC_DOUBLE} var@att=-666L; // Attribute will be type @code{NC_INT} var@att="kelvin"s; // Attribute will be type @code{NC_STRING} (note the "s") @end verbatim @end example @cindex @code{NC_CHAR} @cindex @code{NC_STRING} Use a post-quote @samp{s} for @code{NC_STRING}. Place the letter @samp{s} immediately following the double-quoted string to indicate that the value is of type @code{NC_STRING}. In this case, the receiving variable need not have any memory allocated to hold the string because netCDF4 handles that memory allocation. Suppose one creates a file containing an ensemble of model results, and wishes to label the record coordinate with the name of each model. The @code{NC_STRING} type is well-suited to this because it facilitates storing arrays of strings of arbitrary length. This is sophisticated, though easy with @command{ncap2}: @example @verbatim % ncecat -O -u model cesm.nc ecmwf.nc giss.nc out.nc % ncap2 -4 -O -s 'model[$model]={"cesm"s,"ecmwf"s,"giss"s}' out.nc out.nc @end verbatim @end example The key here to place an @samp{s} character after each double-quoted string value to indicate an @code{NC_STRING} type. The @samp{-4} ensures the output filetype is netCDF4 in case the input filetype is not. @table @asis @item @strong{netCDF3/4 Types} @item b|B @code{NC_BYTE}, a signed 1-byte integer @item none @code{NC_CHAR}, an ISO/ASCII character @item s|S @code{NC_SHORT}, a signed 2-byte integer @item l|L @code{NC_INT}, a signed 4-byte integer @item f|F @code{NC_FLOAT}, a single-precision (4-byte) floating point number @item d|D @code{NC_DOUBLE}, a double-precision (8-byte) floating point number @item @strong{netCDF4 Types} @item ub|UB @code{NC_UBYTE}, an unsigned 1-byte integer @item us|US @code{NC_USHORT}, an unsigned 2-byte integer @item u|U|ul|UL @code{NC_UINT}, an unsigned 4-byte integer @item ll|LL @code{NC_INT64}, a signed 8-byte integer @item ull|ULL @code{NC_UINT64}, an unsigned 8-byte integer @item s @code{NC_STRING}, a string of arbitrary length @end table @html @end html @node if statement, print statement, Number literals, ncap2 netCDF Arithmetic Processor @subsection if statement @cindex if() The syntax of the if statement is similar to its C counterpart. The @emph{Conditional Operator (ternary operator)} has also been implemented. @example @verbatim if(exp1) stmt1; else if(exp2) stmt2; else stmt3; # Can use code blocks as well: if(exp1){ stmt1; stmt1a; stmt1b; }else if(exp2) stmt2; else{ stmt3; stmt3a; stmt3b; } @end verbatim @end example @comment Truth @noindent For a variable or attribute expression to be logically true all its non-missing value elements must be logically true, i.e., non-zero. The expression can be of any type. @w{Unlike C} there is no short-circuiting of an expression with the OR (@code{||}) and AND (@code{&&}) operators. The whole expression is evaluated regardless if one of the AND/OR operands are True/False. @example @verbatim # Simple example if(time>0) print("All values of time are greater than zero\n"); else if(time<0) print("All values of time are less than zero\n"); else { time_max=time.max(); time_min=time.min(); print("min value of time=");print(time_min,"%f"); print("max value of time=");print(time_max,"%f"); } # Example from ddra.nco if(fl_typ==fl_typ_gcm){ var_nbr_apx=32; lmn_nbr=1.0*var_nbr_apx*varsz_gcm_4D; /* [nbr] Variable size */ if(nco_op_typ==nco_op_typ_avg){ lmn_nbr_avg=1.0*var_nbr_apx*varsz_gcm_4D; // Block size lmn_nbr_wgt=dmnsz_gcm_lat; /* [nbr] Weight size */ } // !nco_op_typ_avg }else if(fl_typ==fl_typ_stl){ var_nbr_apx=8; lmn_nbr=1.0*var_nbr_apx*varsz_stl_2D; /* [nbr] Variable size */ if(nco_op_typ==nco_op_typ_avg){ lmn_nbr_avg=1.0*var_nbr_apx*varsz_stl_2D; // Block size lmn_nbr_wgt=dmnsz_stl_lat; /* [nbr] Weight size */ } // !nco_op_typ_avg } // !fl_typ @end verbatim @end example @noindent @strong{Conditional Operator @*} @example // netCDF4 needed for this example th_nw=(three_dmn_var_sht >= 0 ? three_dmn_var_sht.uint() : \ three_dmn_var_sht.int()); @end example @html @end html @node print statement, Missing values ncap2, if statement, ncap2 netCDF Arithmetic Processor @subsection print statement @cindex print() @command{ncap2} @example print(variable_name/attribute name/string, format string); @end example @noindent The print function takes a variable name or attribute name or a quoted string and prints the contents in a in a similar fashion to @code{ncks -H}. There is also an optional C-language style format string argument. Currently the print function cannot print @acronym{RAM} variables or expressions such as @code{'print(var_msk*3+4)'}. To print an expression, first evaluate it as a non-@acronym{RAM} variable (so it will be saved and can be printed), and then print the variable. @noindent examples @example @verbatim print(lon); lon[0]=0 lon[1]=90 lon[2]=180 lon[3]=270 print(lon_2D_rrg,"%3.2f,"); 0.00,0.00,180.00,0.00,180.00,0.00,180.00,0.00, print(mss_val_fst@_FillValue); mss_val_fst@_FillValue, size = 1 NC_FLOAT, value = -999 print("This function \t is monotonic\n"); This function is monotonic @end verbatim @end example @html @end html @node Missing values ncap2, Methods and functions, print statement, ncap2 netCDF Arithmetic Processor @subsection Missing values ncap2 @cindex missing values ncap2 Missing values operate slightly differently in @command{ncap2} Consider the expression where op is any of the following operators (excluding '=') @example Arithmetic operators ( * / % + - ^ ) Binary Operators ( >, >= <, <= ==, !=,==,||,&&, >>,<< ) Assign Operators ( +=,-=,/=, *= ) var1 'op' var2 @end example @noindent If var1 has a missing value then this is the value used in the operation, otherwise the missing value for var2 is used. If during the element-by-element operation an element from either operand is equal to the missing value then the missing value is carried through. In this way missing values 'percolate' or propagate through an expression.@* Missing values associated with Output variables are stored in memory and are written to disk after the script finishes. During script execution its possible (and legal) for the missing value of a variable to take on several different values. @example # Consider the variable: int rec_var_int_mss_val_int(time); =-999,2,3,4,5,6,7,8,-999,-999; rec_var_int_mss_val_int:_FillValue = -999; n2=rec_var_int_mss_val_int + rec_var_int_mss_val_int.reverse($time); n2=-999,-999,11,11,11,11,11,11,999,-999; @end example @html @end html The following methods manipulate missing value information associated with a variable. They only work on variables in Output. @table @code @item set_miss(expr) @cindex @code{set_miss()} The numeric argument @var{expr} becomes the new missing value, overwriting the old missing value, if any. The argument given is converted if necessary to the variable type. NB: This only changes the missing value attribute. Missing values in the original variable remain unchanged, and thus are no long considered missing values. They are ``orphaned''. Thus @code{set_miss()} is normally used only when creating new variables. The intrinsic function @code{change_miss()} (see below) is typically used to edit values of existing variables. @item change_miss(expr) @cindex @code{change_miss()} Sets or changes (any pre-existing) missing value attribute and missing data values to @var{expr}. NB: This is an expensive function since all values must be examined. Use this function when changing missing values for pre-existing variables. @item get_miss() @cindex @code{get_miss()} Returns the missing value of a variable. If the variable exists in Input and Output then the missing value of the variable in Output is returned. If the variable has no missing value then an error is returned. @item delete_miss() @cindex @code{delete_miss()} Delete the missing value associated with a variable. @item number_miss() @cindex @code{number_miss()} Count the number of missing values a variable contains. @end table @example @verbatim th=three_dmn_var_dbl; th.change_miss(-1e10d); /* Set values less than 0 or greater than 50 to missing value */ where(th < 0.0 || th > 50.0) th=th.get_miss(); # Another example: new[$time,$lat,$lon]=1.0; new.set_miss(-997.0); // Extract only elements divisible by 3 where (three_dmn_var_dbl%3 == 0) new=three_dmn_var_dbl; elsewhere new=new.get_miss(); // Print missing value and variable summary mss_val_nbr=three_dmn_var_dbl.number_miss(); print(three_dmn_var_dbl@_FillValue); print("Number of missing values in three_dmn_var_dbl: "); print(mss_val_nbr,"%d"); print(three_dmn_var_dbl); @end verbatim @end example @html @end html @node Methods and functions, RAM variables, Missing values ncap2, ncap2 netCDF Arithmetic Processor @subsection Methods and functions The convention within this document is that methods can be used as functions. However, functions are not and cannot be used as methods. Methods can be daisy-chained d and their syntax is cleaner than functions. Method names are reserved words and CANNOT be used as variable names. The command @code{ncap2 -f} shows the complete list of methods available on your build. @example n2=sin(theta) n2=theta.sin() n2=sin(theta)^2 + cos(theta)^2 n2=theta.sin().pow(2) + theta.cos()^2 @end example This statement chains together methods to convert three_dmn_var_sht to type double, average it, then convert this back to type short: @example three_avg=three_dmn_var_sht.double().avg().short(); @end example @sp 1 @noindent @strong{Aggregate Methods @*} @noindent These methods mirror the averaging types available in @command{ncwa}. The arguments to the methods are the dimensions to average over. Specifying no dimensions is equivalent to specifying all dimensions i.e., averaging over all dimensions. A masking variable and a weighting variable can be manually created and applied as needed. @table @code @item avg() @cindex avg() Mean value @item sqravg() @cindex sqravg() Square of the mean @item avgsqr() Mean of sum of squares @item max() @cindex max() Maximum value @item min() @cindex min() Minimum value @item mabs() @cindex mabs() Maximum absolute value @item mebs() @cindex mebs() Mean absolute value @item mibs() @cindex mibs() Minimum absolute value @item rms() Root-mean-square (normalize by @var{N}) @item rmssdn() @cindex rmssdn() Root-mean square (normalize by @var{N-1}) @item ttl() or total() @cindex ttl() Sum of values @end table @example // Average a variable over time four_time_avg=four_dmn_rec_var($time); @end example @sp 1 @noindent @strong{Packing Methods @*} For more information see @pxref{Packed data} and @pxref{ncpdq netCDF Permute Dimensions Quickly}@* @table @code @item pack() & pack_short() @cindex pack() The default packing algorithm is applied and variable is packed to @code{NC_SHORT} @item pack_byte() @cindex pack_byte() Variable is packed to @code{NC_BYTE} @item pack_short() @cindex pack_short() Variable is packed to @code{NC_SHORT} @item pack_int() @cindex pack_int() Variable is packed to @code{NC_INT} @item unpack() @cindex unpack() The standard unpacking algorithm is applied. @end table @acronym{NCO} automatically unpacks packed data before arithmetically modifying it. After modification @acronym{NCO} stores the unpacked data. To store it as packed data again, repack it with, e.g., the @code{pack()} function. To ensure that @code{temperature} is packed in the output file, regardless of whether it is packed in the input file, one uses, e.g., @example ncap2 -s 'temperature=pack(temperature-273.15)' in.nc out.nc @end example @noindent @strong{Basic Methods @*} These methods work with variables and attributes. They have no arguments @table @code @item size() @cindex size() Total number of elements @item ndims() @cindex ndims() Number of dimensions in variable @item type() @cindex type() Returns the netcdf type (see previous section) @end table @sp 1 @noindent @strong{Utility Methods @*} These functions are used to manipulate missing values and @acronym{RAM} variables. @pxref{Missing values ncap2} @table @code @item set_miss(expr) Takes one argument the missing value. Sets or overwrites the existing missing value. The argument given is converted if necessary to the variable type @item change_miss(expr) Changes the missing value elements of the variable to the new missing value (n.b. an expensive function). @item get_miss() Returns the missing value of a variable in Input or Output @item delete_miss() Deletes the missing value associated with a variable. @item ram_write() Writes a @acronym{RAM} variable to disk i.e., converts it to a regular disk type variable @item ram_delete() Deletes a @acronym{RAM} variable or an attribute @end table @sp 1 @noindent @strong{PDQ Methods @*} See @pxref{ncpdq netCDF Permute Dimensions Quickly} @table @code @item reverse(dim args) Reverses the dimension ordering of elements in a variable. @item permute(dim args) Re-shapes variables by re-ordering the dimensions. All the dims of the variable must be specified in the arguments. A limitation of this permute (unlike ncpdq) is that the record dimension cannot be re-assigned. @end table // Swap dimensions about and reorder along lon @example lat_2D_rrg_new=lat_2D_rrg.permute($lon,$lat).reverse($lon); lat_2D_rrg_new=0,90,-30,30,-30,30,-90,0 @end example @sp 1 @noindent @strong{Type Conversion Methods @*} @noindent These methods allow @command{ncap2} to convert variables and attributes to the different netcdf types. For more details on automatic and manual type conversion see (@pxref{Type Conversion}). You may only use the new netCDF4 types if you have compiled/links @acronym{NCO} with the netCDF4 library and the Output file is HDF5. @table @code @item @strong{netCDF3/4 Types} @item byte() @cindex byte() convert to @code{NC_BYTE}, a signed 1-byte integer @item char() @cindex char() convert to @code{NC_CHAR}, an ISO/ASCII character @item short() @cindex sshort() convert to @code{NC_SHORT}, a signed 2-byte integer @item int() @cindex int() convert to @code{NC_INT}, a signed 4-byte integer @item float() @cindex float() convert to @code{NC_FLOAT}, a single-precision (4-byte) floating point number @item double() @cindex double() convert to @code{NC_DOUBLE}, a double-precision (8-byte) floating point number @item @strong{netCDF4 Types} @item ubyte() @cindex ubyte() convert to @code{NC_UBYTE}, an unsigned 1-byte integer @item ushort() @cindex ushort() convert to @code{NC_USHORT}, an unsigned 2-byte integer @item uint() @cindex uint() convert to @code{NC_UINT}, an unsigned 4-byte integer @item int64() @cindex int64() convert to @code{NC_INT64}, a signed 8-byte integer @item uint64() @cindex unit64() convert to @code{NC_UINT64}, an unsigned 8-byte integer @end table @noindent @strong{Intrinsic Mathematical Methods @*} The list of mathematical methods is system dependant. For the full list @pxref{Intrinsic mathematical methods} All the mathematical methods take a single argument except @code{atan2()} and @code{pow()} which take two. If the operand type is less than @emph{float} then the result will be of type @emph{float}. Arguments of type @emph{double} yield results of type @emph{double}. Like the other methods, you are free to use the mathematical methods as functions. @example n1=pow(2,3.0f) // n1 type float n2=atan2(2,3.0) // n2 type double n3=1/(three_dmn_var_dbl.cos().pow(2))-tan(three_dmn_var_dbl)^2; // n3 type double @end example @html @end html @cindex @acronym{RAM} variables @node RAM variables, Where statement, Methods and functions, ncap2 netCDF Arithmetic Processor @subsection @acronym{RAM} variables Unlike regular variables, @acronym{RAM} variables are never written to disk. Hence using @acronym{RAM} variables in place of regular variables (especially within loops) significantly increases execution speed. Variables that are frequently accessed within @code{for} or @code{where} clauses provide the greatest opportunities for optimization. To declare and define a @acronym{RAM} variable simply prefix the variable name with an asterisk (@code{*}) when the variable is declared/initialized. To delete a @acronym{RAM} variables (and recover their memory) use the @code{ram_delete()} method. To write a @acronym{RAM} variable to disk (like a regular variable) use @code{ram_write()}. @cindex ram_write() @cindex ram_delete() @example *temp[$time,$lat,$lon]=10.0; // Cast *temp_avg=temp.avg($time); // Regular assign temp.ram_delete(); // Delete RAM variable temp_avg.ram_write(); // Write Variable to output // Create and increment a RAM variable from "one" in Input *one++; // Create RAM variables from the variables three and four in Input. // Multiply three by 10 and add it to four. *four+=*three*=10; // three=30, four=34 @end example @html @end html @node Where statement, Loops, RAM variables, ncap2 netCDF Arithmetic Processor @subsection Where statement @cindex where() A @code{where()} combines the definition and application of a mask all in one go and can lead to succinct code. The full syntax of a @code{where()} statement is as follows: @example @verbatim // Single assign (the 'elsewhere' block is optional) where(mask) var1=expr1; elsewhere var1=expr2; // Multiple assigns where(mask){ var1=expr1; var2=expr2; ... }elsewhere{ var1=expr3 var2=expr4 var3=expr5; ... } @end verbatim @end example @itemize @bullet @item The only expression allowed in the predicate of a where is assign, i.e., 'var=expr'. This assign differs from a regular @command{ncap2} assign. The LHS var must already exist in Input or Output. The RHS expression must evaluate to a scalar or a variable/attribute of the same size as the LHS variable. @item Consider when both the LHS and RHS are variables: For every element where mask condition is True, the corresponding LHS variable element is re-assigned to its partner element on the RHS. In the elsewhere part the mask is logically inverted and the assign process proceeds as before. @item If the mask dimensions are a subset of the LHS variable's dimensions, then it is made to conform; if it cannot be made to conform then script execution halts. @item Missing values in the mask evaluate to False in the where code/block statement and to True in the elsewhere block/statement. LHS variable elements set to missing value are not re-assigned. For these reasons, do not explicitly reference missing values in the masking condition, e.g., @code{where(foo=foo.get_missing()) foo=1;} will not work as expected. @end itemize Example: Consider the variables @code{float lon_2D_rct(lat,lon);} and @code{float var_msk(lat,lon);}. Suppose we wish to multiply by two the elements for which @code{var_msk} @w{equals 1}: @example where(var_msk==1) lon_2D_rct=2*lon_2D_rct; @end example Suppose that we have the variable @code{int RDM(time)} and that we want to set its values less than 8 or greater than 80 @w{to 0}: @example where(RDM < 8 || RDM > 80) RDM=0; @end example @html @end html @cindex Weather and Research Forecast (@acronym{WRF}) Model @cindex Swath-like Data (@acronym{SLD}) @cindex @acronym{WRF} (Weather and Research Forecast Model) @cindex @acronym{SLD} (Swath-like Data) Consider irregularly gridded data, described using @w{rank 2} coordinates: @code{double lat(south_north,east_west)}, @code{double lon(south_north,east_west)}, @code{double temperature(south_north,east_west)}. This type of structure is often found in regional weather/climate model (such as @acronym{WRF}) output, and in satellite swath data. For this reason we call it ``Swath-like Data'', or @acronym{SLD}. To find the average temperature in a region bounded by [@var{lat_min},@var{lat_max}] and [@var{lon_min},@var{lon_max}]: @example @verbatim temperature_msk[$south_north,$east_west]=0.0; where((lat >= lat_min && lat <= lat_max) && (lon >= lon_min && lon <= lon_max)) temperature_msk=temperature; elsewhere temperature_msk=temperature@_FillValue; temp_avg=temperature_msk.avg(); temp_max=temperature.max(); @end verbatim @end example @html @end html @cindex @acronym{NARR} (North American Regional Reanalysis)a @cindex North American Regional Reanalysis (@acronym{NARR}) For North American Regional Reanalysis (@acronym{NARR}) data (example @uref{http://dust.ess.uci.edu/diwg/narr_uwnd.199605.nc, dataset}) the procedure looks like this @example @verbatim ncap2 -O -v -S ~/narr.nco ${DATA}/hdf/narr_uwnd.199605.nc ~/foo.nc @end verbatim @end example where @file{narr.nco} is an @command{ncap2} script like this: @example @verbatim /* North American Regional Reanalysis (NARR) Statistics NARR stores grids with 2-D latitude and longitude, aka Swath-like Data (SLD) Here we work with three variables: lat(y,x), lon(y,x), and uwnd(time,level,y,x); To study sub-regions of SLD, we use masking techniques: 1. Define mask as zero times variable to be masked Then mask automatically inherits variable attributes And average below will inherit mask attributes 2. Optionally, create mask as RAM variable (as below with asterisk *) NCO does not write RAM variable to output Masks are often unwanted, and can be big, so this speeds execution 3. Example could be extended to preserve mean lat and lon of sub-region Follow uwnd example to do this: lat_msk=0.0*lat ... lat_avg=lat.avg($y,$x) */ *uwnd_msk=0.0*uwnd; where((lat >= 35.6 && lat <= 37.0) && (lon >= -100.5 && lon <= -99.0)) uwnd_msk=uwnd; elsewhere uwnd_msk=uwnd@_FillValue; // Average only over horizontal dimensions x and y (preserve level and time) uwnd_avg=uwnd_msk.avg($y,$x); @end verbatim @end example Stripped of comments and formatting, this example is a three-statement script executed by a one-line command. @acronym{NCO} needs only this meagre input to unpack and copy the input data and attributes, compute the statistics, and then define and write the output file. Unless the comments pointed out that wind variable (@code{uwnd}) was four-dimensional and the latitude/longitude grid variables were both two-dimensional, there would be no way to tell. This shows how @acronym{NCO} hides from the user the complexity of analyzing multi-dimensional @acronym{SLD}. We plan to extend such @acronym{SLD} features to more operators soon. @html @end html @node Loops, Include files, Where statement, ncap2 netCDF Arithmetic Processor @subsection Loops @cindex while() @cindex for() @command{ncap2} supplies @command{for()} loops and @command{while()} loops. They are completely unoptimized so use them only with @acronym{RAM} variables unless you want thrash your disk to death. To break out of a loop use the @command{break} command. To iterate to the next cycle use the @command{continue} command. @example @verbatim // Set elements in variable double temp(time,lat) // If element < 0 set to 0, if element > 100 set to 100 *sz_idx=$time.size; *sz_jdx=$lat.size; for(*idx=0;idx 100) temp(idx,jdx)=100.0; else if(temp(idx,jdx) < 0) temp(idx,jdx)=0.0; // Are values of co-ordinate variable double lat(lat) monotonic? *sz=$lat.size; for(*idx=1;idx @end html @node Include files, Sort methods, Loops, ncap2 netCDF Arithmetic Processor @subsection Include files @cindex @command{include} The syntax of an @var{include-file} is: @example #include "script.nco" @end example The script filename is searched relative to the run directory. It is possible to nest include files to an arbitrary depth. A handy use of inlcude files is to store often used constants. Use @acronym{RAM} variables if you do not want these constants written to @var{output-file}. @example // script.nco // Sample file to #include in ncap2 script *pi=3.1415926535; // RAM variable, not written to output *h=6.62607095e-34; // RAM variable, not written to output e=2.71828; // Regular (disk) variable, written to output @end example @html @end html @node Sort methods, Irregular grids, Include files, ncap2 netCDF Arithmetic Processor @subsection @command{sort} methods @cindex @command{sort} @cindex @command{asort} @cindex @command{dsort} @cindex @command{remap} @cindex @command{unmap} @cindex @command{invert_map} In @acronym{ncap2} there are multiple ways to sort data. Beginning with @acronym{NCO} 4.1.0 (March, 2012), @acronym{ncap2} support six sorting functions: @example var_out=sort(var_in,&srt_map); // Ascending sort var_out=asort(var_in,&srt_map); // Accending sort var_out=dsort(var_in,&srt_map); // Desending sort var_out=remap(var_in,srt_map); // Apply srt_map to var_in var_out=unmap(var_in,srt_map); // Reverse what srt_map did to var_in dsr_map=invert_map(srt_map); // Produce "de-sort" map that inverts srt_map @end example The first two functions, @command{sort()} and @command{asort()} sort, in ascending order, all the elements of @var{var_in} (which can be a variable or attribute) without regard to any dimensions. The third function, @command{dsort()} does the same but sorts in descending order. Remember that ascending and descending sorts are specified by @command{asort()} and @command{dsort()}, respectively. These three functions are overloaded to take a second, optional argument called the sort map @var{srt_map}, which should be supplied as a call-by-reference variable, i.e., preceded with an ampersand. If the sort map does not yet exist, then it will be created and returned as an integer type the same shape as the input variable. The output @var{var_out} of each sort function is a sorted version of the input, @var{var_in}. The output @var{var_out} of the two mapping functions the result of applying (with @command{remap()} or un-applying (with @command{unmap()}) the sort map @var{srt_map} to the input @var{var_in}. To apply the sort map with @command{remap()} the size of the variable must be exactly divisible by the size of the sort map. The final function @command{invert_map()} returns the so-called de-sorting map @var{dsr_map} which is inverse map of the input map @var{srt_map}. This gives the user access to both the forward and inverse sorting maps which can be useful in special situations. @example @verbatim a1[$time]={10,2,3,4,6,5,7,3,4,1}; a1_sort=sort(a1); print(a1_sort); // 1, 2, 3, 3, 4, 4, 5, 6, 7, 10; a2[$lon]={2,1,4,3}; a2_sort=sort(a2,&a2_map); print(a2); // 1, 2, 3, 4 print(a2_map); // 1, 0, 3, 2; @end verbatim @end example If the map variable does not exist prior to the @command{sort()} call, then it will be created with the same shape as the input variable and be of type @code{NC_INT}. If the map variable already exists, then the only restriction is that it be of at least the same size as the input variable. To apply a map use @code{remap(var_in,srt_map)}. @example @verbatim defdim("nlat",5); a3[$lon]={2,5,3,7}; a4[$nlat,$lon]={ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12, 13,14,15,16, 17,18,19,20}; a3_sort=sort(a3,&a3_map); print(a3_map); // 0, 2, 1, 3; a4_sort=remap(a4,a3_map); print(a4_sort); // 1, 3, 2, 4, // 5, 7, 6, 8, // 9,11,10,12, // 13,15,14,16, // 17,19,18,20; a3_map2[$nlat]={4,3,0,2,1}; a4_sort2=remap(a4,a3_map2); print(a4_sort2); // 3, 5, 4, 2, 1 // 8, 10, 9,7, 6, // 13,15,14,12,11, // 18,20,19,17,16 @end verbatim @end example As in the above example you may create your own sort map. To sort in descending order, apply the @code{reverse()} method after the @command{sort()}. Here is an extended example of how to use @command{ncap2} features to hyperslab an irregular region based on the values of a variable not a coordinate. The distinction is crucial: hyperslabbing based on dimensional indices or coordinate values is straightforward. Using the values of single or multi-dimensional variable to define a hyperslab is quite different. @example cat > ~/ncap2_foo.nco << 'EOF' // Purpose: Save irregular 1-D regions based on variable values // Included in NCO User Guide at http://nco.sf.net/nco.html#sort /* NB: Single quotes around EOF above turn off shell parameter expansion in "here documents". This in turn prevents the need for protecting dollarsign characters in NCO scripts with backslashes when the script is cut-and-pasted (aka "moused") from an editor or e-mail into a shell console window */ /* Copy coordinates and variable(s) of interest into RAM variable(s) Benefits: 1. ncap2 defines writes all variables on LHS of expression to disk Only exception is RAM variables, which are stored in RAM only Repeated operations on regular variables takes more time, because changes are written to disk copy after every change. RAM variables are only changed in RAM so script works faster RAM variables can be written to disk at end with ram_write() 2. Script permutes variables of interest during processing Safer to work with copies that have different names This discourages accidental, mistaken use of permuted versions 3. Makes this script a more generic template: var_in instead of specific variable names everywhere */ *var_in=one_dmn_rec_var; *crd_in=time; *dmn_in_sz=$time.size; // [nbr] Size of input arrays /* Create all other "intermediate" variables as RAM variables to prevent them from cluttering the output file. Mask flag and sort map are same size as variable of interest */ *msk_flg=var_in; *srt_map=var_in; /* In this example we mask for all values evenly divisible by 3 This is the key, problem-specific portion of the template Replace this where() condition by that for your problem Mask variable is Boolean: 1=Meets condition, 0=Fails condition */ where(var_in % 3 == 0) msk_flg=1; elsewhere msk_flg=0; // print("msk_flg = ");print(msk_flg); // For debugging... /* The sort() routine is overloaded, and takes one or two arguments The second argument (optional) is the "sort map" (srt_map below) Pass the sort map by reference, i.e., prefix with an ampersand If the sort map does not yet exist, then it will be created and returned as an integer type the same shape as the input variable. The output of sort(), on the LHS, is a sorted version of the input msk_flg is not needed in its original order after sort() Hence we use msk_flg as both input to and output from sort() Doing this prevents the need to define a new, unneeded variable */ msk_flg=sort(msk_flg,&srt_map); // Count number of valid points in mask by summing the one's *msk_nbr=msk_flg.total(); // Define output dimension equal in size to number of valid points defdim("crd_out",msk_nbr); /* Now sort the variable of interest using the sort map and remap() The output, on the LHS, is the input re-arranged so that all points meeting the mask condition are contiguous at the end of the array Use same srt_map to hyperslab multiple variables of the same shape Remember to apply srt_map to the coordinate variables */ crd_in=remap(crd_in,srt_map); var_in=remap(var_in,srt_map); /* Hyperslab last msk_nbr values of variable(s) of interest */ crd_out[crd_out]=crd_in((dmn_in_sz-msk_nbr):(dmn_in_sz-1)); var_out[crd_out]=var_in((dmn_in_sz-msk_nbr):(dmn_in_sz-1)); /* NB: Even though we created all variables possible as RAM variables, the original coordinate of interest, time, is written to the ouput. I'm not exactly sure why. For now, delete it from the output with: ncks -O -x -v time ~/foo.nc ~/foo.nc */ EOF ncap2 -O -v -S ~/ncap2_foo.nco ~/nco/data/in.nc ~/foo.nc ncks -O -x -v time ~/foo.nc ~/foo.nc ncks ~/foo.nc @end example Here is an extended example of how to use @command{ncap2} features to sort multi-dimensional arrays based on the coordinate values along a single dimension. @example cat > ~/ncap2_foo.nco << 'EOF' /* Purpose: Sort multi-dimensional array based on coordinate values This example sorts the variable three_dmn_rec_var(time,lat,lon) based on the values of the time coordinate. */ // Included in NCO User Guide at http://nco.sf.net/nco.html#sort // Randomize the time coordinate time=10.0*gsl_rng_uniform(time); //print("original randomized time =\n");print(time); /* The sort() routine is overloaded, and takes one or two arguments The first argument is a one dimensional array The second argument (optional) is the "sort map" (srt_map below) Pass the sort map by reference, i.e., prefix with an ampersand If the sort map does not yet exist, then it will be created and returned as an integer type the same shape as the input variable. The output of sort(), on the LHS, is a sorted version of the input */ time=sort(time,&srt_map); //print("sorted time (ascending order) and associated sort map =\n");print(time);print(srt_map); /* sort() always sorts in ascending order The associated sort map therefore re-arranges the original, randomized time array into ascending order. There are two methods to obtain the descending order the user wants 1) We could solve the problem in ascending order (the default) and then apply the reverse() method to re-arrange the results. 2) We could change the sort map to return things in descending order of time and solve the problem directly in descending order. */ // Following shows how to do method one: /* Expand the sort map to srt_map_3d, the size of the data array 1. Use data array to provide right shape for the expanded sort map 2. Coerce data array into an integer so srt_map_3d is an integer 3. Multiply data array by zero so 3-d map elements are all zero 4. Add the 1-d sort map to the 3-d sort map (NCO automatically resizes) 5. Add the spatial (lat,lon) offsets to each time index 6. de-sort using the srt_map_3d 7. Use reverse to obtain descending in time order Loops could accomplish the same thing (exercise left for reader) However, loops are slow for large datasets */ /* Following index manipulation requires understanding correspondence between 1-d (unrolled, memory order of storage) and access into that memory as a multidimensional (3-d, in this case) rectangular array. Key idea to understand is how dimensionality affects offsets */ // Copy 1-d sort map into 3-d sort map srt_map_3d=(0*int(three_dmn_rec_var))+srt_map; // Multiply base offset by factorial of lesser dimensions srt_map_3d*=$lat.size*$lon.size; lon_idx=array(0,1,$lon); lat_idx=array(0,1,$lat)*$lon.size; lat_lon_idx[$lat,$lon]=lat_idx+lon_idx; srt_map_3d+=lat_lon_idx; print("sort map 3d =\n");print(srt_map_3d); // Use remap() to re-map the data three_dmn_rec_var=remap(three_dmn_rec_var,srt_map_3d); // Finally, reverse data so time coordinate is descending time=time.reverse($time); //print("sorted time (descending order) =\n");print(time); three_dmn_rec_var=three_dmn_rec_var.reverse($time); // Method two: Key difference is srt_map=$time.size-srt_map-1; EOF ncap2 -O -v -S ~/ncap2_foo.nco ~/nco/data/in.nc ~/foo.nc @end example @html @end html @node Irregular grids, Bilinear interpolation, Sort methods, ncap2 netCDF Arithmetic Processor @subsection Irregular Grids @cindex irregular grids @cindex rectangular grids @cindex non-rectangular grids @cindex non-standard grids @cindex mask @c fxm need to edit rrg sxn beginning here @acronym{NCO} is capable of analyzing datasets for many different underlying coordinate grid types. netCDF was developed for and initially used with grids comprised of orthogonal dimensions forming a rectangular coordinate system. We call such grids @emph{standard} grids. It is increasingly common for datasets to use metadata to describe much more complex grids. Let us first define three important coordinate grid properties: rectangularity, regularity, and fxm. Grids are @emph{regular} if the spacing between adjacent is constant. For example, a 4-by-5 degree latitude-longitude grid is regular because the spacings between adjacent latitudes (@w{4 degrees}) are constant as are the (@w{5 degrees}) spacings between adjacent longitudes. Spacing in @emph{irregular} grids depends on the location along the coordinate. Grids such as Gaussian grids have uneven spacing in latitude (points cluster near the equator) and so are irregular. Grids are @emph{rectangular} if the number of elements in any dimension is not a function of any other dimension. For example, a T42 Gaussian latitude-longitude grid is rectangular because there are the same number of longitudes (128) for each of the (64) latitudes. Grids are @emph{non-rectangular} if the elements in any dimension depend on another dimension. Non-rectangular grids present many special challenges to analysis software like @acronym{NCO}. Wrapped coordinates (@pxref{Wrapped Coordinates}), such as longitude, are independent of these grid properties (regularity, rectangularity). @cindex wrapped coordinates The preferred @acronym{NCO} technique to analyze data on non-standard coordinate grids is to create a region mask with @command{ncap2}, and then to use the mask within @command{ncap2} for variable-specific processing, and/or with other operators (e.g., @command{ncwa}, @command{ncdiff}) for entire file processing. Before describing the construction of masks, let us review how irregularly gridded geoscience data are described. Say that latitude and longitude are stored as @var{R}-dimensional arrays and the product of the dimension sizes is the total number of elements N in the other variables. Geoscience applications tend to use @math{@var{R}=1}, @math{@var{R}=2}, and @math{@var{R}=3}. If the grid is has no simple representation (e.g., discontinuous) then it makes sense to store all coordinates as 1D arrays with the same size as the number of grid points. These gridpoints can be completely independent of all the other (own weight, area, etc.). @var{R}=1: lat(number_of_gridpoints) and lon(number_of_gridpoints) If the horizontal grid is time-invariant then @var{R}=2 is common: @var{R}=2: lat(south_north,east_west) and lon(south_north,east_west) The Weather and Research Forecast (@acronym{WRF}) model uses @var{R}=3: @var{R}=3: lat(time,south_north,east_west), lon(time,south_north,east_west) and so supports grids that change with time. Grids with @var{R} > 1 often use missing values to indicated empty points. For example, so-called ``staggered grids'' will use fewer east_west points near the poles and more near the equator. netCDF only accepts rectangular arrays so space must be allocated for the maximum number of east_west points at all latitudes. Then the application writes missing values into the unused points near the poles. We demonstrate the @command{ncap2} analysis technique for irregular regions by constructing a mask for an @var{R}=2 grid. We wish to find, say, the mean temperature within [@var{lat_min},@var{lat_max}] and [@var{lon_min},@var{lon_max}]: @example ncap2 -s 'mask_var= (lat >= lat_min && lat <= lat_max) && \ (lon >= lon_min && lon <= lon_max);' in.nc out.nc @end example Arbitrarily shaped regions can be defined by more complex conditional statements. Once defined, masks can be applied to specific variables, and to entire files: @example ncap2 -s 'temperature_avg=(temperature*mask_var).avg()' in.nc out.nc ncwa -a lat,lon -m mask_var -w area in.nc out.nc @end example Crafting such commands on the command line is possible though unwieldy. In such cases, a script is often cleaner and allows you to document the procedure: @example @verbatim cat > ncap2.in << 'EOF' mask_var = (lat >= lat_min && lat <= lat_max) && (lon >= lon_min && > lon <= lon_max); if(mask_var.total() > 0){ // Check that mask contains some valid values temperature_avg=(temperature*mask_var).avg(); // Average temperature temperature_max=(temperature*mask_var).max(); // Maximum temperature } EOF ncap2 -S ncap2.in in.nc out.nc @end verbatim @end example @ignore http://foehn.colorado.edu/wrfout_to_cf/wrfout_to_cf.ncl ncl 'file_in="wrfout.nc"' 'file_out="wrfpost.nc"' wrfout_to_cf.ncl ncl 'file_in="wrfout_d02_2013-10-04_20:00:00"' 'file_out="wrfout_d02_2013-10-04_20:00:00_cf.nc"' wrfout_to_cf.ncl ncl 'file_in="wrfout_v2_Lambert"' 'file_out="wrfout_v2_Lambert.nc"' wrfout_to_cf.ncl @end ignore @cindex @acronym{WRF} Grids like those produced by the @acronym{WRF} model are complex because one must use global metadata to determine the grid staggering and offsets to translate @code{XLAT} and @code{XLONG} into real latitudes, longitudes, and missing points. The @acronym{WRF} grid documentation should describe this. For @acronym{WRF} files creating regional masks looks, in general, like @example mask_var = (XLAT >= lat_min && XLAT <= lat_max) && (XLONG >= lon_min && XLONG <= lon_max); @end example A few notes: Irregular regions are the union of arrays lat/lon_min/max's. The mask procedure is identical for all @var{R}. @c fxm need to edit rrg sxn down to here @html @end html @node Bilinear interpolation, GSL special functions, Irregular grids, ncap2 netCDF Arithmetic Processor @subsection Bilinear interpolation @noindent As of version 4.0.0 @acronym{NCO} has internal routines to perform bilinear interpolation on gridded data sets. In mathematics, bilinear interpolation is an extension of linear interpolation for interpolating functions of two variables on a regular grid. The idea is to perform linear interpolation first in one direction, and then again in the other direction. Suppose we have an irregular grid of data @code{temperature[lat,lon]}, with co-ordinate vars @code{lat[lat], lon[lon]}. We wish to find the temperature at an arbitary point [@var{X},@var{Y}] within the grid. If we can locate lat_min,lat_max and lon_min,lon_max such that @code{lat_min <= X <= lat_max} and @code{lon_min <= Y <= lon_max} then we can interpolate in two dimensions the temperature at [@var{X},@var{Y}]. The general form of the @command{ncap2} interpolation function is @example var_out=bilinear_interp(grid_in,grid_out,grid_out_x,grid_out_y,grid_in_x,grid_in_y) @end example where @table @code @item grid_in Input function data. Usually a two dimensional variable. It must be of size @code{grid_in_x.size()*grid_in_y.size()} @item grid_out This variable is the shape of @code{var_out}. Usually a two dimensional variable. It must be of size @code{grid_out_x.size()*grid_out_y.size()} @item grid_out_x @var{X} output values @item grid_out_y @var{Y} output values @item grid_in_x @var{X} input values values. Must be monotonic (increasing or decreasing). @item grid_in_y @var{Y} input values values. Must be monotonic (increasing or decreasing). @end table @noindent Prior to calculations all arguments are converted to type @code{NC_DOUBLE}. After calculations @code{var_out} is converted to the input type of @code{grid_in}. Suppose the first part of an @command{ncap2} script is @example @verbatim defdim("X",4); defdim("Y",5); // Temperature T_in[$X,$Y]= {100, 200, 300, 400, 500, 101, 202, 303, 404, 505, 102, 204, 306, 408, 510, 103, 206, 309, 412, 515.0 }; // Coordinate variables x_in[$X]={0.0,1.0,2.0,3.01}; y_in[$Y]={1.0,2.0,3.0,4.0,5}; @end verbatim @end example Now we interpolate with the following variables: @example @verbatim defdim("Xn",3); defdim("Yn",4); T_out[$Xn,$Yn]=0.0; x_out[$Xn]={0.0,0.02,3.01}; y_out[$Yn]={1.1,2.0,3,4}; var_out=bilinear_interp(T_in,T_out,x_out,y_out,x_in,y_in); print(var_out); // 110, 200, 300, 400, // 110.022, 200.04, 300.06, 400.08, // 113.3, 206, 309, 412 ; @end verbatim @end example It is possible to interpolate a single point: @example var_out=bilinear_interp(T_in,0.0,3.0,4.99,x_in,y_in); print(var_out); // 513.920594059406 @end example @noindent @strong{Wrapping and Extrapolation} @* @noindent The function @code{bilinear_interp_wrap()} takes the same arguments as @code{bilinear_interp()} but performs wrapping (@var{Y}) and extrapolation (@var{X}) for points off the edge of the grid. If the given range of longitude is say (25-335) and we have a point at 20 degrees, then the endpoints of the range are used for the interpolation. This is what wrapping means. For wrapping to occur @var{Y} must be longitude and must be in the range (0,360) or (-180,180). There are no restrictions on the longitude (@var{X}) values, though typically these are in the range (-90,90). This @command{ncap2} script illustrates both wrapping and extrapolation of end points: @example @verbatim defdim("lat_in",6); defdim("lon_in",5); // Coordinate input vars lat_in[$lat_in]={-80,-40,0,30,60.0,85.0}; lon_in[$lon_in]={30, 110, 190, 270, 350.0}; T_in[$lat_in,$lon_in]= {10,40,50,30,15, 12,43,52,31,16, 14,46,54,32,17, 16,49,56,33,18, 18,52,58,34,19, 20,55,60,35,20.0 }; defdim("lat_out",4); defdim("lon_out",3); // Coordinate variables lat_out[$lat_out]={-90,0,70,88.0}; lon_out[$lon_out]={0,190,355.0}; T_out[$lat_out,$lon_out]=0.0; T_out=bilinear_interp_wrap(T_in,T_out,lat_out,lon_out,lat_in,lon_in); print(T_out); // 13.4375, 49.5, 14.09375, // 16.25, 54, 16.625, // 19.25, 58.8, 19.325, // 20.15, 60.24, 20.135 ; @end verbatim @end example @html @end html @node GSL special functions, GSL interpolation, Bilinear interpolation, ncap2 netCDF Arithmetic Processor @subsection GSL special functions @cindex @acronym{GSL} @noindent As of version 3.9.6 (released January, 2009), @acronym{NCO} can link to the @acronym{GNU} Scientific Library (@acronym{GSL}). @command{ncap2} can access most @acronym{GSL} special functions including Airy, Bessel, error, gamma, beta, hypergeometric, and Legendre functions and elliptical integrals. @acronym{GSL} must be @w{version 1.4} or later. To list the @acronym{GSL} functions available with your @acronym{NCO} build, use @command{ncap2 -f | grep ^gsl}. @noindent The function names used by @acronym{ncap2} mirror their @acronym{GSL} names. The @acronym{NCO} wrappers for @acronym{GSL} functions automatically call the error-handling version of the @acronym{GSL} function when available @footnote{ These are the @acronym{GSL} standard function names postfixed with @code{_e}. @acronym{NCO} calls these functions automatically, without the @acronym{NCO} command having to specifically indicate the @code{_e} function suffix. }. This allows @acronym{NCO} to return a missing value when the @acronym{GSL} library encounters a domain error or a floating point exception. The slow-down due to calling the error-handling version of the @acronym{GSL} numerical functions was found to be negligible (please let us know if you find otherwise). @cindex gamma function @cindex @var{gsl_sf_gamma} @noindent Consider the gamma function.@* @noindent The @acronym{GSL} function prototype is @* @code{int gsl_sf_gamma_e(const double x, gsl_sf_result * result)} The @command{ncap2} script would be: @example @verbatim lon_in[lon]={-1,0.1,0,2,0.3}; lon_out=gsl_sf_gamma(lon_in); lon_out= _, 9.5135, 4.5908, 2.9915 @end verbatim @end example @noindent The first value is set to @code{_FillValue} since the gamma function is undefined for negative integers. If the input variable has a missing value then this value is used. Otherwise, the default double fill value is used (defined in the netCDF header @file{netcdf.h} as @code{NC_FILL_DOUBLE = 9.969e+36}). @cindex Bessel function @cindex @var{gsl_sf_bessel_Jn} @noindent Consider a call to a Bessel function with @acronym{GSL} prototype@* @code{int gsl_sf_bessel_Jn_e(int n, double x, gsl_sf_result * result)} An @command{ncap2} script would be @example lon_out=gsl_sf_bessel_Jn(2,lon_in); lon_out=0.11490, 0.0012, 0.00498, 0.011165 @end example This computes the Bessel function of order @var{n=2} for every value in @code{lon_in}. The Bessel order argument, an integer, can also be a non-scalar variable, i.e., an array. @example @verbatim n_in[lon]={0,1,2,3}; lon_out=gsl_sf_bessel_Jn(n_in,0.5); lon_out= 0.93846, 0.24226, 0.03060, 0.00256 @end verbatim @end example @noindent Arguments to @acronym{GSL} wrapper functions in @command{ncap2} must conform to one another, i.e., they must share the same sub-set of dimensions. For example: @code{three_out=gsl_sf_bessel_Jn(n_in,three_dmn_var_dbl)} is valid because the variable @code{three_dmn_var_dbl} has a @var{lon} dimension, so @code{n_in} in can be broadcast to conform to @code{three_dmn_var_dbl}. However @code{time_out=gsl_sf_bessel_Jn(n_in,time)} is invalid. @cindex Elliptic integrals Consider the elliptical integral with prototype @code{int gsl_sf_ellint_RD_e(double x, double y, double z, gsl_mode_t mode, gsl_sf_result * result)} @example three_out=gsl_sf_ellint_RD(0.5,time,three_dmn_var_dbl); @end example @noindent The three arguments are all conformable so the above @command{ncap2} call is valid. The mode argument in the function prototype controls the convergence of the algorithm. It also appears in the Airy Function prototypes. It can be set by defining the environment variable @code{GSL_PREC_MODE}. If unset it defaults to the value @code{GSL_PREC_DOUBLE}. See the @acronym{GSL} manual for more details. @example export GSL_PREC_MODE=0 // GSL_PREC_DOUBLE export GSL_PREC_MODE=1 // GSL_PREC_SINGLE export GSL_PREC_MODE=2 // GSL_PREC_APPROX @end example @noindent The @command{ncap2} wrappers to the array functions are slightly different. Consider the following @acronym{GSL} prototype @* @code{int gsl_sf_bessel_Jn_array(int nmin, int nmax, double x, double *result_array)} @example b1=lon.double(); x=0.5; status=gsl_sf_bessel_Jn_array(1,4,x,&b1); print(status); b1=0.24226,0.0306,0.00256,0.00016; @end example @noindent This calculates the Bessel function of @var{x}=0.5 for @var{n}=1 to 4. The first three arguments are scalar values. If a non-scalar variable is supplied as an argument then only the first value is used. The final argument is the variable where the results are stored (NB: the @code{&} indicates this is a call by reference). This final argument must be of type @code{double} and must be of least size @var{nmax-nmin+1}. If either of these conditions is not met then then the function returns an error message. The function/wrapper returns a status flag. Zero indicates success. @noindent Consider another array function @* @code{int gsl_sf_legendre_Pl_array(int lmax, double x, double *result_array);} @cindex Legendre polynomial @findex gsl_sf_legendre_Pl @example a1=time.double(); x=0.3; status=gsl_sf_legendre_Pl_array(a1.size()-1, x,&a1); print(status); @end example @noindent This call calculates @var{P_l}(0.3) for @var{l}=0..9. Note that @var{|x|<=1}, otherwise there will be a domain error. See the @acronym{GSL} documentation for more details. @noindent The @acronym{GSL} functions implemented in @acronym{NCO} are listed in the table below. This table is correct for @acronym{GSL} version 1.10. To see what functions are available on your build run the command @command{ncap2 -f |grep ^gsl} . To see this table along with the @acronym{GSL} @w{C-function} prototypes look at the spreadsheet @strong{doc/nco_gsl.ods}. @* @* @multitable @columnfractions .35 .05 .60 @item @strong{GSL NAME} @tab @strong{I} @tab @strong{NCAP FUNCTION CALL} @item gsl_sf_airy_Ai_e @tab Y @tab gsl_sf_airy_Ai(dbl_expr) @item gsl_sf_airy_Bi_e @tab Y @tab gsl_sf_airy_Bi(dbl_expr) @item gsl_sf_airy_Ai_scaled_e @tab Y @tab gsl_sf_airy_Ai_scaled(dbl_expr) @item gsl_sf_airy_Bi_scaled_e @tab Y @tab gsl_sf_airy_Bi_scaled(dbl_expr) @item gsl_sf_airy_Ai_deriv_e @tab Y @tab gsl_sf_airy_Ai_deriv(dbl_expr) @item gsl_sf_airy_Bi_deriv_e @tab Y @tab gsl_sf_airy_Bi_deriv(dbl_expr) @item gsl_sf_airy_Ai_deriv_scaled_e @tab Y @tab gsl_sf_airy_Ai_deriv_scaled(dbl_expr) @item gsl_sf_airy_Bi_deriv_scaled_e @tab Y @tab gsl_sf_airy_Bi_deriv_scaled(dbl_expr) @item gsl_sf_airy_zero_Ai_e @tab Y @tab gsl_sf_airy_zero_Ai(uint_expr) @item gsl_sf_airy_zero_Bi_e @tab Y @tab gsl_sf_airy_zero_Bi(uint_expr) @item gsl_sf_airy_zero_Ai_deriv_e @tab Y @tab gsl_sf_airy_zero_Ai_deriv(uint_expr) @item gsl_sf_airy_zero_Bi_deriv_e @tab Y @tab gsl_sf_airy_zero_Bi_deriv(uint_expr) @item gsl_sf_bessel_J0_e @tab Y @tab gsl_sf_bessel_J0(dbl_expr) @item gsl_sf_bessel_J1_e @tab Y @tab gsl_sf_bessel_J1(dbl_expr) @item gsl_sf_bessel_Jn_e @tab Y @tab gsl_sf_bessel_Jn(int_expr,dbl_expr) @item gsl_sf_bessel_Jn_array @tab Y @tab status=gsl_sf_bessel_Jn_array(int,int,double,&var_out) @item gsl_sf_bessel_Y0_e @tab Y @tab gsl_sf_bessel_Y0(dbl_expr) @item gsl_sf_bessel_Y1_e @tab Y @tab gsl_sf_bessel_Y1(dbl_expr) @item gsl_sf_bessel_Yn_e @tab Y @tab gsl_sf_bessel_Yn(int_expr,dbl_expr) @item gsl_sf_bessel_Yn_array @tab Y @tab gsl_sf_bessel_Yn_array @item gsl_sf_bessel_I0_e @tab Y @tab gsl_sf_bessel_I0(dbl_expr) @item gsl_sf_bessel_I1_e @tab Y @tab gsl_sf_bessel_I1(dbl_expr) @item gsl_sf_bessel_In_e @tab Y @tab gsl_sf_bessel_In(int_expr,dbl_expr) @item gsl_sf_bessel_In_array @tab Y @tab status=gsl_sf_bessel_In_array(int,int,double,&var_out) @item gsl_sf_bessel_I0_scaled_e @tab Y @tab gsl_sf_bessel_I0_scaled(dbl_expr) @item gsl_sf_bessel_I1_scaled_e @tab Y @tab gsl_sf_bessel_I1_scaled(dbl_expr) @item gsl_sf_bessel_In_scaled_e @tab Y @tab gsl_sf_bessel_In_scaled(int_expr,dbl_expr) @item gsl_sf_bessel_In_scaled_array @tab Y @tab staus=gsl_sf_bessel_In_scaled_array(int,int,double,&var_out) @item gsl_sf_bessel_K0_e @tab Y @tab gsl_sf_bessel_K0(dbl_expr) @item gsl_sf_bessel_K1_e @tab Y @tab gsl_sf_bessel_K1(dbl_expr) @item gsl_sf_bessel_Kn_e @tab Y @tab gsl_sf_bessel_Kn(int_expr,dbl_expr) @item gsl_sf_bessel_Kn_array @tab Y @tab status=gsl_sf_bessel_Kn_array(int,int,double,&var_out) @item gsl_sf_bessel_K0_scaled_e @tab Y @tab gsl_sf_bessel_K0_scaled(dbl_expr) @item gsl_sf_bessel_K1_scaled_e @tab Y @tab gsl_sf_bessel_K1_scaled(dbl_expr) @item gsl_sf_bessel_Kn_scaled_e @tab Y @tab gsl_sf_bessel_Kn_scaled(int_expr,dbl_expr) @item gsl_sf_bessel_Kn_scaled_array @tab Y @tab status=gsl_sf_bessel_Kn_scaled_array(int,int,double,&var_out) @item gsl_sf_bessel_j0_e @tab Y @tab gsl_sf_bessel_J0(dbl_expr) @item gsl_sf_bessel_j1_e @tab Y @tab gsl_sf_bessel_J1(dbl_expr) @item gsl_sf_bessel_j2_e @tab Y @tab gsl_sf_bessel_j2(dbl_expr) @item gsl_sf_bessel_jl_e @tab Y @tab gsl_sf_bessel_jl(int_expr,dbl_expr) @item gsl_sf_bessel_jl_array @tab Y @tab status=gsl_sf_bessel_jl_array(int,double,&var_out) @item gsl_sf_bessel_jl_steed_array @tab Y @tab gsl_sf_bessel_jl_steed_array @item gsl_sf_bessel_y0_e @tab Y @tab gsl_sf_bessel_Y0(dbl_expr) @item gsl_sf_bessel_y1_e @tab Y @tab gsl_sf_bessel_Y1(dbl_expr) @item gsl_sf_bessel_y2_e @tab Y @tab gsl_sf_bessel_y2(dbl_expr) @item gsl_sf_bessel_yl_e @tab Y @tab gsl_sf_bessel_yl(int_expr,dbl_expr) @item gsl_sf_bessel_yl_array @tab Y @tab status=gsl_sf_bessel_yl_array(int,double,&var_out) @item gsl_sf_bessel_i0_scaled_e @tab Y @tab gsl_sf_bessel_I0_scaled(dbl_expr) @item gsl_sf_bessel_i1_scaled_e @tab Y @tab gsl_sf_bessel_I1_scaled(dbl_expr) @item gsl_sf_bessel_i2_scaled_e @tab Y @tab gsl_sf_bessel_i2_scaled(dbl_expr) @item gsl_sf_bessel_il_scaled_e @tab Y @tab gsl_sf_bessel_il_scaled(int_expr,dbl_expr) @item gsl_sf_bessel_il_scaled_array @tab Y @tab status=gsl_sf_bessel_il_scaled_array(int,double,&var_out) @item gsl_sf_bessel_k0_scaled_e @tab Y @tab gsl_sf_bessel_K0_scaled(dbl_expr) @item gsl_sf_bessel_k1_scaled_e @tab Y @tab gsl_sf_bessel_K1_scaled(dbl_expr) @item gsl_sf_bessel_k2_scaled_e @tab Y @tab gsl_sf_bessel_k2_scaled(dbl_expr) @item gsl_sf_bessel_kl_scaled_e @tab Y @tab gsl_sf_bessel_kl_scaled(int_expr,dbl_expr) @item gsl_sf_bessel_kl_scaled_array @tab Y @tab status=gsl_sf_bessel_kl_scaled_array(int,double,&var_out) @item gsl_sf_bessel_Jnu_e @tab Y @tab gsl_sf_bessel_Jnu(dbl_expr,dbl_expr) @item gsl_sf_bessel_Ynu_e @tab Y @tab gsl_sf_bessel_Ynu(dbl_expr,dbl_expr) @item gsl_sf_bessel_sequence_Jnu_e @tab N @tab gsl_sf_bessel_sequence_Jnu @item gsl_sf_bessel_Inu_scaled_e @tab Y @tab gsl_sf_bessel_Inu_scaled(dbl_expr,dbl_expr) @item gsl_sf_bessel_Inu_e @tab Y @tab gsl_sf_bessel_Inu(dbl_expr,dbl_expr) @item gsl_sf_bessel_Knu_scaled_e @tab Y @tab gsl_sf_bessel_Knu_scaled(dbl_expr,dbl_expr) @item gsl_sf_bessel_Knu_e @tab Y @tab gsl_sf_bessel_Knu(dbl_expr,dbl_expr) @item gsl_sf_bessel_lnKnu_e @tab Y @tab gsl_sf_bessel_lnKnu(dbl_expr,dbl_expr) @item gsl_sf_bessel_zero_J0_e @tab Y @tab gsl_sf_bessel_zero_J0(uint_expr) @item gsl_sf_bessel_zero_J1_e @tab Y @tab gsl_sf_bessel_zero_J1(uint_expr) @item gsl_sf_bessel_zero_Jnu_e @tab N @tab gsl_sf_bessel_zero_Jnu @item gsl_sf_clausen_e @tab Y @tab gsl_sf_clausen(dbl_expr) @item gsl_sf_hydrogenicR_1_e @tab N @tab gsl_sf_hydrogenicR_1 @item gsl_sf_hydrogenicR_e @tab N @tab gsl_sf_hydrogenicR @item gsl_sf_coulomb_wave_FG_e @tab N @tab gsl_sf_coulomb_wave_FG @item gsl_sf_coulomb_wave_F_array @tab N @tab gsl_sf_coulomb_wave_F_array @item gsl_sf_coulomb_wave_FG_array @tab N @tab gsl_sf_coulomb_wave_FG_array @item gsl_sf_coulomb_wave_FGp_array @tab N @tab gsl_sf_coulomb_wave_FGp_array @item gsl_sf_coulomb_wave_sphF_array @tab N @tab gsl_sf_coulomb_wave_sphF_array @item gsl_sf_coulomb_CL_e @tab N @tab gsl_sf_coulomb_CL @item gsl_sf_coulomb_CL_array @tab N @tab gsl_sf_coulomb_CL_array @item gsl_sf_coupling_3j_e @tab N @tab gsl_sf_coupling_3j @item gsl_sf_coupling_6j_e @tab N @tab gsl_sf_coupling_6j @item gsl_sf_coupling_RacahW_e @tab N @tab gsl_sf_coupling_RacahW @item gsl_sf_coupling_9j_e @tab N @tab gsl_sf_coupling_9j @item gsl_sf_coupling_6j_INCORRECT_e @tab N @tab gsl_sf_coupling_6j_INCORRECT @item gsl_sf_dawson_e @tab Y @tab gsl_sf_dawson(dbl_expr) @item gsl_sf_debye_1_e @tab Y @tab gsl_sf_debye_1(dbl_expr) @item gsl_sf_debye_2_e @tab Y @tab gsl_sf_debye_2(dbl_expr) @item gsl_sf_debye_3_e @tab Y @tab gsl_sf_debye_3(dbl_expr) @item gsl_sf_debye_4_e @tab Y @tab gsl_sf_debye_4(dbl_expr) @item gsl_sf_debye_5_e @tab Y @tab gsl_sf_debye_5(dbl_expr) @item gsl_sf_debye_6_e @tab Y @tab gsl_sf_debye_6(dbl_expr) @item gsl_sf_dilog_e @tab N @tab gsl_sf_dilog @item gsl_sf_complex_dilog_xy_e @tab N @tab gsl_sf_complex_dilog_xy_e @item gsl_sf_complex_dilog_e @tab N @tab gsl_sf_complex_dilog @item gsl_sf_complex_spence_xy_e @tab N @tab gsl_sf_complex_spence_xy_e @item gsl_sf_multiply_e @tab N @tab gsl_sf_multiply @item gsl_sf_multiply_err_e @tab N @tab gsl_sf_multiply_err @item gsl_sf_ellint_Kcomp_e @tab Y @tab gsl_sf_ellint_Kcomp(dbl_expr) @item gsl_sf_ellint_Ecomp_e @tab Y @tab gsl_sf_ellint_Ecomp(dbl_expr) @item gsl_sf_ellint_Pcomp_e @tab Y @tab gsl_sf_ellint_Pcomp(dbl_expr,dbl_expr) @item gsl_sf_ellint_Dcomp_e @tab Y @tab gsl_sf_ellint_Dcomp(dbl_expr) @item gsl_sf_ellint_F_e @tab Y @tab gsl_sf_ellint_F(dbl_expr,dbl_expr) @item gsl_sf_ellint_E_e @tab Y @tab gsl_sf_ellint_E(dbl_expr,dbl_expr) @item gsl_sf_ellint_P_e @tab Y @tab gsl_sf_ellint_P(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_ellint_D_e @tab Y @tab gsl_sf_ellint_D(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_ellint_RC_e @tab Y @tab gsl_sf_ellint_RC(dbl_expr,dbl_expr) @item gsl_sf_ellint_RD_e @tab Y @tab gsl_sf_ellint_RD(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_ellint_RF_e @tab Y @tab gsl_sf_ellint_RF(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_ellint_RJ_e @tab Y @tab gsl_sf_ellint_RJ(dbl_expr,dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_elljac_e @tab N @tab gsl_sf_elljac @item gsl_sf_erfc_e @tab Y @tab gsl_sf_erfc(dbl_expr) @item gsl_sf_log_erfc_e @tab Y @tab gsl_sf_log_erfc(dbl_expr) @item gsl_sf_erf_e @tab Y @tab gsl_sf_erf(dbl_expr) @item gsl_sf_erf_Z_e @tab Y @tab gsl_sf_erf_Z(dbl_expr) @item gsl_sf_erf_Q_e @tab Y @tab gsl_sf_erf_Q(dbl_expr) @item gsl_sf_hazard_e @tab Y @tab gsl_sf_hazard(dbl_expr) @item gsl_sf_exp_e @tab Y @tab gsl_sf_exp(dbl_expr) @item gsl_sf_exp_e10_e @tab N @tab gsl_sf_exp_e10 @item gsl_sf_exp_mult_e @tab Y @tab gsl_sf_exp_mult(dbl_expr,dbl_expr) @item gsl_sf_exp_mult_e10_e @tab N @tab gsl_sf_exp_mult_e10 @item gsl_sf_expm1_e @tab Y @tab gsl_sf_expm1(dbl_expr) @item gsl_sf_exprel_e @tab Y @tab gsl_sf_exprel(dbl_expr) @item gsl_sf_exprel_2_e @tab Y @tab gsl_sf_exprel_2(dbl_expr) @item gsl_sf_exprel_n_e @tab Y @tab gsl_sf_exprel_n(int_expr,dbl_expr) @item gsl_sf_exp_err_e @tab Y @tab gsl_sf_exp_err(dbl_expr,dbl_expr) @item gsl_sf_exp_err_e10_e @tab N @tab gsl_sf_exp_err_e10 @item gsl_sf_exp_mult_err_e @tab N @tab gsl_sf_exp_mult_err @item gsl_sf_exp_mult_err_e10_e @tab N @tab gsl_sf_exp_mult_err_e10 @item gsl_sf_expint_E1_e @tab Y @tab gsl_sf_expint_E1(dbl_expr) @item gsl_sf_expint_E2_e @tab Y @tab gsl_sf_expint_E2(dbl_expr) @item gsl_sf_expint_En_e @tab Y @tab gsl_sf_expint_En(int_expr,dbl_expr) @item gsl_sf_expint_E1_scaled_e @tab Y @tab gsl_sf_expint_E1_scaled(dbl_expr) @item gsl_sf_expint_E2_scaled_e @tab Y @tab gsl_sf_expint_E2_scaled(dbl_expr) @item gsl_sf_expint_En_scaled_e @tab Y @tab gsl_sf_expint_En_scaled(int_expr,dbl_expr) @item gsl_sf_expint_Ei_e @tab Y @tab gsl_sf_expint_Ei(dbl_expr) @item gsl_sf_expint_Ei_scaled_e @tab Y @tab gsl_sf_expint_Ei_scaled(dbl_expr) @item gsl_sf_Shi_e @tab Y @tab gsl_sf_Shi(dbl_expr) @item gsl_sf_Chi_e @tab Y @tab gsl_sf_Chi(dbl_expr) @item gsl_sf_expint_3_e @tab Y @tab gsl_sf_expint_3(dbl_expr) @item gsl_sf_Si_e @tab Y @tab gsl_sf_Si(dbl_expr) @item gsl_sf_Ci_e @tab Y @tab gsl_sf_Ci(dbl_expr) @item gsl_sf_atanint_e @tab Y @tab gsl_sf_atanint(dbl_expr) @item gsl_sf_fermi_dirac_m1_e @tab Y @tab gsl_sf_fermi_dirac_m1(dbl_expr) @item gsl_sf_fermi_dirac_0_e @tab Y @tab gsl_sf_fermi_dirac_0(dbl_expr) @item gsl_sf_fermi_dirac_1_e @tab Y @tab gsl_sf_fermi_dirac_1(dbl_expr) @item gsl_sf_fermi_dirac_2_e @tab Y @tab gsl_sf_fermi_dirac_2(dbl_expr) @item gsl_sf_fermi_dirac_int_e @tab Y @tab gsl_sf_fermi_dirac_int(int_expr,dbl_expr) @item gsl_sf_fermi_dirac_mhalf_e @tab Y @tab gsl_sf_fermi_dirac_mhalf(dbl_expr) @item gsl_sf_fermi_dirac_half_e @tab Y @tab gsl_sf_fermi_dirac_half(dbl_expr) @item gsl_sf_fermi_dirac_3half_e @tab Y @tab gsl_sf_fermi_dirac_3half(dbl_expr) @item gsl_sf_fermi_dirac_inc_0_e @tab Y @tab gsl_sf_fermi_dirac_inc_0(dbl_expr,dbl_expr) @item gsl_sf_lngamma_e @tab Y @tab gsl_sf_lngamma(dbl_expr) @item gsl_sf_lngamma_sgn_e @tab N @tab gsl_sf_lngamma_sgn @item gsl_sf_gamma_e @tab Y @tab gsl_sf_gamma(dbl_expr) @item gsl_sf_gammastar_e @tab Y @tab gsl_sf_gammastar(dbl_expr) @item gsl_sf_gammainv_e @tab Y @tab gsl_sf_gammainv(dbl_expr) @item gsl_sf_lngamma_complex_e @tab N @tab gsl_sf_lngamma_complex @item gsl_sf_taylorcoeff_e @tab Y @tab gsl_sf_taylorcoeff(int_expr,dbl_expr) @item gsl_sf_fact_e @tab Y @tab gsl_sf_fact(uint_expr) @item gsl_sf_doublefact_e @tab Y @tab gsl_sf_doublefact(uint_expr) @item gsl_sf_lnfact_e @tab Y @tab gsl_sf_lnfact(uint_expr) @item gsl_sf_lndoublefact_e @tab Y @tab gsl_sf_lndoublefact(uint_expr) @item gsl_sf_lnchoose_e @tab N @tab gsl_sf_lnchoose @item gsl_sf_choose_e @tab N @tab gsl_sf_choose @item gsl_sf_lnpoch_e @tab Y @tab gsl_sf_lnpoch(dbl_expr,dbl_expr) @item gsl_sf_lnpoch_sgn_e @tab N @tab gsl_sf_lnpoch_sgn @item gsl_sf_poch_e @tab Y @tab gsl_sf_poch(dbl_expr,dbl_expr) @item gsl_sf_pochrel_e @tab Y @tab gsl_sf_pochrel(dbl_expr,dbl_expr) @item gsl_sf_gamma_inc_Q_e @tab Y @tab gsl_sf_gamma_inc_Q(dbl_expr,dbl_expr) @item gsl_sf_gamma_inc_P_e @tab Y @tab gsl_sf_gamma_inc_P(dbl_expr,dbl_expr) @item gsl_sf_gamma_inc_e @tab Y @tab gsl_sf_gamma_inc(dbl_expr,dbl_expr) @item gsl_sf_lnbeta_e @tab Y @tab gsl_sf_lnbeta(dbl_expr,dbl_expr) @item gsl_sf_lnbeta_sgn_e @tab N @tab gsl_sf_lnbeta_sgn @item gsl_sf_beta_e @tab Y @tab gsl_sf_beta(dbl_expr,dbl_expr) @item gsl_sf_beta_inc_e @tab N @tab gsl_sf_beta_inc @item gsl_sf_gegenpoly_1_e @tab Y @tab gsl_sf_gegenpoly_1(dbl_expr,dbl_expr) @item gsl_sf_gegenpoly_2_e @tab Y @tab gsl_sf_gegenpoly_2(dbl_expr,dbl_expr) @item gsl_sf_gegenpoly_3_e @tab Y @tab gsl_sf_gegenpoly_3(dbl_expr,dbl_expr) @item gsl_sf_gegenpoly_n_e @tab N @tab gsl_sf_gegenpoly_n @item gsl_sf_gegenpoly_array @tab Y @tab gsl_sf_gegenpoly_array @item gsl_sf_hyperg_0F1_e @tab Y @tab gsl_sf_hyperg_0F1(dbl_expr,dbl_expr) @item gsl_sf_hyperg_1F1_int_e @tab Y @tab gsl_sf_hyperg_1F1_int(int_expr,int_expr,dbl_expr) @item gsl_sf_hyperg_1F1_e @tab Y @tab gsl_sf_hyperg_1F1(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_U_int_e @tab Y @tab gsl_sf_hyperg_U_int(int_expr,int_expr,dbl_expr) @item gsl_sf_hyperg_U_int_e10_e @tab N @tab gsl_sf_hyperg_U_int_e10 @item gsl_sf_hyperg_U_e @tab Y @tab gsl_sf_hyperg_U(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_U_e10_e @tab N @tab gsl_sf_hyperg_U_e10 @item gsl_sf_hyperg_2F1_e @tab Y @tab gsl_sf_hyperg_2F1(dbl_expr,dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_2F1_conj_e @tab Y @tab gsl_sf_hyperg_2F1_conj(dbl_expr,dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_2F1_renorm_e @tab Y @tab gsl_sf_hyperg_2F1_renorm(dbl_expr,dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_2F1_conj_renorm_e @tab Y @tab gsl_sf_hyperg_2F1_conj_renorm(dbl_expr,dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_hyperg_2F0_e @tab Y @tab gsl_sf_hyperg_2F0(dbl_expr,dbl_expr,dbl_expr) @item gsl_sf_laguerre_1_e @tab Y @tab gsl_sf_laguerre_1(dbl_expr,dbl_expr) @item gsl_sf_laguerre_2_e @tab Y @tab gsl_sf_laguerre_2(dbl_expr,dbl_expr) @item gsl_sf_laguerre_3_e @tab Y @tab gsl_sf_laguerre_3(dbl_expr,dbl_expr) @item gsl_sf_laguerre_n_e @tab Y @tab gsl_sf_laguerre_n(int_expr,dbl_expr,dbl_expr) @item gsl_sf_lambert_W0_e @tab Y @tab gsl_sf_lambert_W0(dbl_expr) @item gsl_sf_lambert_Wm1_e @tab Y @tab gsl_sf_lambert_Wm1(dbl_expr) @item gsl_sf_legendre_Pl_e @tab Y @tab gsl_sf_legendre_Pl(int_expr,dbl_expr) @item gsl_sf_legendre_Pl_array @tab Y @tab status=gsl_sf_legendre_Pl_array(int,double,&var_out) @item gsl_sf_legendre_Pl_deriv_array @tab N @tab gsl_sf_legendre_Pl_deriv_array @item gsl_sf_legendre_P1_e @tab Y @tab gsl_sf_legendre_P1(dbl_expr) @item gsl_sf_legendre_P2_e @tab Y @tab gsl_sf_legendre_P2(dbl_expr) @item gsl_sf_legendre_P3_e @tab Y @tab gsl_sf_legendre_P3(dbl_expr) @item gsl_sf_legendre_Q0_e @tab Y @tab gsl_sf_legendre_Q0(dbl_expr) @item gsl_sf_legendre_Q1_e @tab Y @tab gsl_sf_legendre_Q1(dbl_expr) @item gsl_sf_legendre_Ql_e @tab Y @tab gsl_sf_legendre_Ql(int_expr,dbl_expr) @item gsl_sf_legendre_Plm_e @tab Y @tab gsl_sf_legendre_Plm(int_expr,int_expr,dbl_expr) @item gsl_sf_legendre_Plm_array @tab Y @tab status=gsl_sf_legendre_Plm_array(int,int,double,&var_out) @item gsl_sf_legendre_Plm_deriv_array @tab N @tab gsl_sf_legendre_Plm_deriv_array @item gsl_sf_legendre_sphPlm_e @tab Y @tab gsl_sf_legendre_sphPlm(int_expr,int_expr,dbl_expr) @item gsl_sf_legendre_sphPlm_array @tab Y @tab status=gsl_sf_legendre_sphPlm_array(int,int,double,&var_out) @item gsl_sf_legendre_sphPlm_deriv_array @tab N @tab gsl_sf_legendre_sphPlm_deriv_array @item gsl_sf_legendre_array_size @tab N @tab gsl_sf_legendre_array_size @item gsl_sf_conicalP_half_e @tab Y @tab gsl_sf_conicalP_half(dbl_expr,dbl_expr) @item gsl_sf_conicalP_mhalf_e @tab Y @tab gsl_sf_conicalP_mhalf(dbl_expr,dbl_expr) @item gsl_sf_conicalP_0_e @tab Y @tab gsl_sf_conicalP_0(dbl_expr,dbl_expr) @item gsl_sf_conicalP_1_e @tab Y @tab gsl_sf_conicalP_1(dbl_expr,dbl_expr) @item gsl_sf_conicalP_sph_reg_e @tab Y @tab gsl_sf_conicalP_sph_reg(int_expr,dbl_expr,dbl_expr) @item gsl_sf_conicalP_cyl_reg_e @tab Y @tab gsl_sf_conicalP_cyl_reg(int_expr,dbl_expr,dbl_expr) @item gsl_sf_legendre_H3d_0_e @tab Y @tab gsl_sf_legendre_H3d_0(dbl_expr,dbl_expr) @item gsl_sf_legendre_H3d_1_e @tab Y @tab gsl_sf_legendre_H3d_1(dbl_expr,dbl_expr) @item gsl_sf_legendre_H3d_e @tab Y @tab gsl_sf_legendre_H3d(int_expr,dbl_expr,dbl_expr) @item gsl_sf_legendre_H3d_array @tab N @tab gsl_sf_legendre_H3d_array @item gsl_sf_legendre_array_size @tab N @tab gsl_sf_legendre_array_size @item gsl_sf_log_e @tab Y @tab gsl_sf_log(dbl_expr) @item gsl_sf_log_abs_e @tab Y @tab gsl_sf_log_abs(dbl_expr) @item gsl_sf_complex_log_e @tab N @tab gsl_sf_complex_log @item gsl_sf_log_1plusx_e @tab Y @tab gsl_sf_log_1plusx(dbl_expr) @item gsl_sf_log_1plusx_mx_e @tab Y @tab gsl_sf_log_1plusx_mx(dbl_expr) @item gsl_sf_mathieu_a_array @tab N @tab gsl_sf_mathieu_a_array @item gsl_sf_mathieu_b_array @tab N @tab gsl_sf_mathieu_b_array @item gsl_sf_mathieu_a @tab N @tab gsl_sf_mathieu_a @item gsl_sf_mathieu_b @tab N @tab gsl_sf_mathieu_b @item gsl_sf_mathieu_a_coeff @tab N @tab gsl_sf_mathieu_a_coeff @item gsl_sf_mathieu_b_coeff @tab N @tab gsl_sf_mathieu_b_coeff @item gsl_sf_mathieu_ce @tab N @tab gsl_sf_mathieu_ce @item gsl_sf_mathieu_se @tab N @tab gsl_sf_mathieu_se @item gsl_sf_mathieu_ce_array @tab N @tab gsl_sf_mathieu_ce_array @item gsl_sf_mathieu_se_array @tab N @tab gsl_sf_mathieu_se_array @item gsl_sf_mathieu_Mc @tab N @tab gsl_sf_mathieu_Mc @item gsl_sf_mathieu_Ms @tab N @tab gsl_sf_mathieu_Ms @item gsl_sf_mathieu_Mc_array @tab N @tab gsl_sf_mathieu_Mc_array @item gsl_sf_mathieu_Ms_array @tab N @tab gsl_sf_mathieu_Ms_array @item gsl_sf_pow_int_e @tab N @tab gsl_sf_pow_int @item gsl_sf_psi_int_e @tab Y @tab gsl_sf_psi_int(int_expr) @item gsl_sf_psi_e @tab Y @tab gsl_sf_psi(dbl_expr) @item gsl_sf_psi_1piy_e @tab Y @tab gsl_sf_psi_1piy(dbl_expr) @item gsl_sf_complex_psi_e @tab N @tab gsl_sf_complex_psi @item gsl_sf_psi_1_int_e @tab Y @tab gsl_sf_psi_1_int(int_expr) @item gsl_sf_psi_1_e @tab Y @tab gsl_sf_psi_1(dbl_expr) @item gsl_sf_psi_n_e @tab Y @tab gsl_sf_psi_n(int_expr,dbl_expr) @item gsl_sf_synchrotron_1_e @tab Y @tab gsl_sf_synchrotron_1(dbl_expr) @item gsl_sf_synchrotron_2_e @tab Y @tab gsl_sf_synchrotron_2(dbl_expr) @item gsl_sf_transport_2_e @tab Y @tab gsl_sf_transport_2(dbl_expr) @item gsl_sf_transport_3_e @tab Y @tab gsl_sf_transport_3(dbl_expr) @item gsl_sf_transport_4_e @tab Y @tab gsl_sf_transport_4(dbl_expr) @item gsl_sf_transport_5_e @tab Y @tab gsl_sf_transport_5(dbl_expr) @item gsl_sf_sin_e @tab N @tab gsl_sf_sin @item gsl_sf_cos_e @tab N @tab gsl_sf_cos @item gsl_sf_hypot_e @tab N @tab gsl_sf_hypot @item gsl_sf_complex_sin_e @tab N @tab gsl_sf_complex_sin @item gsl_sf_complex_cos_e @tab N @tab gsl_sf_complex_cos @item gsl_sf_complex_logsin_e @tab N @tab gsl_sf_complex_logsin @item gsl_sf_sinc_e @tab N @tab gsl_sf_sinc @item gsl_sf_lnsinh_e @tab N @tab gsl_sf_lnsinh @item gsl_sf_lncosh_e @tab N @tab gsl_sf_lncosh @item gsl_sf_polar_to_rect @tab N @tab gsl_sf_polar_to_rect @item gsl_sf_rect_to_polar @tab N @tab gsl_sf_rect_to_polar @item gsl_sf_sin_err_e @tab N @tab gsl_sf_sin_err @item gsl_sf_cos_err_e @tab N @tab gsl_sf_cos_err @item gsl_sf_angle_restrict_symm_e @tab N @tab gsl_sf_angle_restrict_symm @item gsl_sf_angle_restrict_pos_e @tab N @tab gsl_sf_angle_restrict_pos @item gsl_sf_angle_restrict_symm_err_e @tab N @tab gsl_sf_angle_restrict_symm_err @item gsl_sf_angle_restrict_pos_err_e @tab N @tab gsl_sf_angle_restrict_pos_err @item gsl_sf_zeta_int_e @tab Y @tab gsl_sf_zeta_int(int_expr) @item gsl_sf_zeta_e @tab Y @tab gsl_sf_zeta(dbl_expr) @item gsl_sf_zetam1_e @tab Y @tab gsl_sf_zetam1(dbl_expr) @item gsl_sf_zetam1_int_e @tab Y @tab gsl_sf_zetam1_int(int_expr) @item gsl_sf_hzeta_e @tab Y @tab gsl_sf_hzeta(dbl_expr,dbl_expr) @item gsl_sf_eta_int_e @tab Y @tab gsl_sf_eta_int(int_expr) @item gsl_sf_eta_e @tab Y @tab gsl_sf_eta(dbl_expr) @end multitable @html @end html @node GSL interpolation, GSL least-squares fitting, GSL special functions, ncap2 netCDF Arithmetic Processor @subsection GSL interpolation @cindex @acronym{GSL} @noindent As of version 3.9.9 (released July, 2009), @acronym{NCO} has wrappers to the @acronym{GSL} interpolation functions. @noindent Given a set of data points (x1,y1)...(xn, yn) the @acronym{GSL} functions computes a continuous interpolating function @acronym{Y(x)} such that @acronym{Y(xi) = yi}. The interpolation is piecewise smooth, and its behavior at the end-points is determined by the type of interpolation used. For more information consult the @acronym{GSL} manual. @noindent Interpolation with @command{ncap2} is a two stage process. In the first stage, a @acronym{RAM} variable is created from the chosen interpolating function and the data set. This @acronym{RAM} variable holds in memory a @acronym{GSL} interpolation object. In the second stage, points along the interpolating function are calculated. If you have a very large data set or are interpolating many sets then consider deleting the @acronym{RAM} variable when it is redundant. Use the command @command{ram_delete(var_nm)}. @noindent A simple example @example @verbatim x_in[$lon]={1.0,2.0,3.0,4.0}; y_in[$lon]={1.1,1.2,1.5,1.8}; // Ram variable is declared and defined here gsl_interp_cspline(&ram_sp,x_in,y_in); x_out[$lon_grd]={1.1,2.0,3.0,3.1,3.99}; y_out=gsl_spline_eval(ram_sp,x_out); y2=gsl_spline_eval(ram_sp,1.3); y3=gsl_spline_eval(ram_sp,0.0); ram_delete(ram_sp); print(y_out); // 1.10472, 1.2, 1.4, 1.42658, 1.69680002 print(y2); // 1.12454 print(y3); // '_' @end verbatim @end example @noindent Note in the above example y3 is set to 'missing value' because 0.0 isn't within the input X range. @strong{@acronym{GSL} Interpolation Types}@* @noindent All the interpolation functions have been implemented. These are:@* gsl_interp_linear() @* gsl_interp_polynomial() @* gsl_interp_cspline()@* gsl_interp_cspline_periodic()@* gsl_interp_akima() @* gsl_interp_akima_periodic() @* @* @* @strong{ Evaluation of Interpolating Types } @* @noindent @strong{Implemented} @* gsl_spline_eval() @* @noindent @strong{Unimplemented} @* gsl_spline_deriv()@* gsl_spline_deriv2()@* gsl_spline_integ()@* @html @end html @node GSL least-squares fitting, GSL statistics, GSL interpolation, ncap2 netCDF Arithmetic Processor @subsection GSL least-squares fitting @noindent Least Squares fitting is a method of calculating a straight line through a set of experimental data points in the XY plane. The data maybe weighted or unweighted. For more information please refer to the @acronym{GSL} manual. @noindent These @acronym{GSL} functions fall into three categories:@* @strong{A)} Fitting data to Y=c0+c1*X@* @strong{B)} Fitting data (through the origin) Y=c1*X@* @strong{C)} Multi-parameter fitting (not yet implemented)@* @strong{Section A} @* @* @code{status=@strong{gsl_fit_linear} (data_x,stride_x,data_y,stride_y,n,&co,&c1,&cov00,&cov01,&cov11,&sumsq) } @noindent @strong{Input variables}: data_x, stride_x, data_y, stride_y, n @* From the above variables an X and Y vector both of length 'n' are derived. If data_x or data_y is less than type double then it is converted to type @code{double}. It is up to you to do bounds checking on the input data. For example if stride_x=3 and n=8 then the size of data_x must be at least 24 @noindent @strong{Output variables}: c0, c1, cov00, cov01, cov11,sumsq @* The '&' prefix indicates that these are call-by-reference variables. If any of the output variables don't exist prior to the call then they are created on the fly as scalar variables of type @code{double}. If they already exist then their existing value is overwritten. If the function call is successful then @code{status=0}. @code{status= @strong{gsl_fit_wlinear}(data_x,stride_x,data_w,stride_w,data_y,stride_y,n,&co,&c1,&cov00,&cov01,&cov11,&chisq) } @noindent Similar to the above call except it creates an additional weighting vector from the variables data_w, stride_w, n @code{ data_y_out=@strong{gsl_fit_linear_est}(data_x,c0,c1,cov00,cov01,cov11) } @noindent This function calculates y values along the line Y=c0+c1*X @* @* @strong{Section B} @* @* @code{status=@strong{gsl_fit_mul}(data_x,stride_x,data_y,stride_y,n,&c1,&cov11,&sumsq) } @noindent @strong{Input variables}: data_x, stride_x, data_y, stride_y, n @* From the above variables an X and Y vector both of length 'n' are derived. If data_x or data_y is less than type @code{double} then it is converted to type @code{double}. @* @noindent @strong{Output variables}: c1,cov11,sumsq @* @code{status= @strong{gsl_fit_wmul}(data_x,stride_x,data_w,stride_w,data_y,stride_y,n,&c1,&cov11,&sumsq) } @noindent Similar to the above call except it creates an additional weighting vector from the variables data_w, stride_w, n @code{ data_y_out=@strong{gsl_fit_mul_est}(data_x,c0,c1,cov11) } @noindent This function calculates y values along the line Y=c1*X @* @* @noindent The below example shows @strong{gsl_fit_linear()} in action @example @verbatim defdim("d1",10); xin[d1]={1,2,3,4,5,6,7,8,9,10.0}; yin[d1]={3.1,6.2,9.1,12.2,15.1,18.2,21.3,24.0,27.0,30.0}; gsl_fit_linear(xin,1,yin,1,$d1.size,&c0,&c1,&cov00,&cov01,&cov11,&sumsq); print(c0); // 0.2 print(c1); // 2.98545454545 defdim("e1",4); xout[e1]={1.0,3.0,4.0,11}; yout[e1]=0.0; yout=gsl_fit_linear_est(xout, c0,c1, cov00,cov01, cov11, sumsq); print(yout); // 3.18545454545 ,9.15636363636, ,12.1418181818 ,33.04 @end verbatim @end example @* @* @html @end html @node GSL statistics, GSL random number generation, GSL least-squares fitting, ncap2 netCDF Arithmetic Processor @subsection GSL statistics @noindent Wrappers for most of the @acronym{GSL} Statistical functions have been implemented. The @acronym{GSL} function names include a type specifier (except for type double functions). To obtain the equivalent @acronym{NCO} name simply remove the type specifier; then depending on the data type the appropriate @acronym{GSL} function is called. The weighed statistical functions e.g., @code{ gsl_stats_wvariance()} are only defined in @acronym{GSL} for floating point types; so your data must of type @code{float} or @code{double} otherwise ncap2 will emit an error message. To view the implemented functions use the shell command @command{ncap2 -f|grep _stats} @noindent @acronym{GSL} Functions @example short gsl_stats_max (short data[], size_t stride, size_t n); double gsl_stats_int_mean (int data[], size_t stride, size_t n); double gsl_stats_short_sd_with_fixed_mean (short data[], size_t stride, size_t n, double mean); double gsl_stats_wmean (double w[], size_t wstride, double data[], size_t stride, size_t n); double gsl_stats_quantile_from_sorted_data (double sorted_data[], size_t stride, size_t n, double f) ; @end example @noindent Equivalent ncap2 wrapper functions @example short gsl_stats_max (var_data, data_stride, n); double gsl_stats_mean (var_data, data_stride, n); double gsl_stats_sd_with_fixed_mean (var_data, data_stride, n, var_mean); double gsl_stats_wmean (var_weight, weight_stride, var_data, data_stride, n, var_mean); double gsl_stats_quantile_from_sorted_data (var_sorted_data, data_stride, n, var_f) ; @end example @noindent @acronym{GSL} has no notion of missing values or dimensionality beyond one. If your data has missing values which you want ignored in the calculations then use the @command{ncap2} built in aggregate functions( @ref{Methods and functions} ). The @acronym{GSL} functions operate on a vector of values created from the var_data/stride/n arguments. The ncap wrappers check that there is no bounding error with regard to the size of the data and the final value in the vector. Some examples @example @verbatim a1[time]={1,2,3,4,5,6,7,8,9,10}; a1_avg=gsl_stats_mean(a1,1,10); print(a1_avg); // 5.5 a1_var=gsl_stats_variance(a1,4,3); print(a1_var); // 16.0 // bounding error, vector attempts to access element a1(10) a1_sd=gsl_stats_sd(a1,5,3); @end verbatim @end example @noindent For functions with the signature @strong{func_nm(var_data,data_stride,n)}, one may omit the second or third arguments. The default value for @var{stride} is @code{1}. The default value for @var{n} is @code{1+(data.size()-1)/stride}. @example // Following statements are equvalent n2=gsl_stats_max(a1,1,10) n2=gsl_stats_max(a1,1); n2=gsl_stats_max(a1); // Following statements are equvalent n3=gsl_stats_median_from_sorted_data(a1,2,5); n3=gsl_stats_median_from_sorted_data(a1,2); // Following statements are NOT equvalent n4=gsl_stats_kurtosis(a1,3,2); n4=gsl_stats_kurtosis(a1,3); //default n=4 @end example The following example illustrates some of the weighted functions. The data are randomly generated. In this case the value of the weight for each datum is either 0.0 or 1.0 @example defdim("r1",2000); data[r1]=1.0; // Fill with random numbers [0.0,10.0) data=10.0*gsl_rng_uniform(data); // Create a weighting variable weight=(data>4.0); wmean=gsl_stats_wmean(weight,1,data,1,$r1.size); print(wmean); wsd=gsl_stats_wsd(weight,1,data,1,$r1.size); print(wsd); // number of values in data that are greater than 4 weight_size=weight.total(); print(weight_size); // print min/max of data dmin=data.gsl_stats_min(); dmax=data.gsl_stats_max(); print(dmin);print(dmax); @end example @html @end html @node GSL random number generation, Examples ncap2, GSL statistics, ncap2 netCDF Arithmetic Processor @subsection GSL random number generation The @acronym{GSL} library has a large number of random number generators. In addition there are a large set of functions for turning uniform random numbers into discrete or continuous probabilty distributions. The random number generator algorithms vary in terms of quality numbers output, speed of execution and maximum number output. For more information see the @acronym{GSL} documentation. The algorithm and seed are set via environment variables, these are picked up by the @code{ncap2} code. @noindent @strong{Setup} @* The number algorithm is set by the environment variable @code{GSL_RNG_TYPE}. If this variable isn't set then the default rng algorithm is gsl_rng_19937. The seed is set with the environment variable @code{GSL_RNG_SEED}. The following wrapper functions in ncap2 provide information about the chosen algorithm. @* @table @code @item gsl_rng_min() the minimum value returned by the rng algorithm. @item gsl_rng_max() the maximum value returned by the rng algorithm. @end table @noindent @strong{Uniformly Distributed Random Numbers} @table @code @item gsl_rng_get(var_in) This function returns var_in with integers from the chosen rng algorithm. The min and max values depend uoon the chosen rng algorthm. @item gsl_rng_uniform_int(var_in) This function returns var_in with random integers from 0 to n-1. The value n must be less than or equal to the maximum value of the chosen rng algorithm. @item gsl_rng_uniform(var_in) This function returns var_in with double-precision numbers in the range [0.0,1). The range includes 0.0 and excludes 1.0. @item gsl_rng_uniform_pos(var_in) This function returns var_in with double-precision numbers in the range (0.0,1), excluding both 0.0 and 1.0. @end table @noindent Below are examples of @code{gsl_rng_get()} and @code{gsl_rng_uniform_int()} in action. @example export GSL_RNG_TYPE=ranlux export GSL_RNG_SEED=10 ncap2 -v -O -s 'a1[time]=0;a2=gsl_rng_get(a1);' in.nc foo.nc // 10 random numbers from the range 0 - 16777215 // a2=9056646, 12776696, 1011656, 13354708, 5139066, 1388751, 11163902, 7730127, 15531355, 10387694 ; ncap2 -v -O -s 'a1[time]=21;a2=gsl_rng_uniform_int(a1).sort();' in.nc foo.nc // 10 random numbers from the range 0 - 20 a2 = 1, 1, 6, 9, 11, 13, 13, 15, 16, 19 ; @end example @noindent The following example produces an @code{ncap2} runtime error. This is because the chose rng algorithm has a maximum value greater than @code{ NC_MAX_INT=2147483647 }; the wrapper functions to @code{gsl_rng_get()} and @code{gsl_rng_uniform_int()} return variable of type @code{NC_INT}. Please be aware of this when using random number distribution functions functions from the @acronym{GSL} library which return @code{unsigned int}. Examples of these are @code{gsl_ran_geometric()} and @code{gsl_ran_pascal()}. @example export GSL_RNG_TYPE=mt19937 ncap2 -v -O -s 'a1[time]=0;a2=gsl_rng_get(a1);' in.nc foo.nc @end example @noindent To find the maximum value of the chosen rng algorithm use the following code snippet. @example ncap2 -v -O -s 'rng_max=gsl_rng_max();print(rng_max)' in.nc foo.nc @end example @noindent @strong{Random Number Distributions} @* The @acronym{GSL} library has a rich set of random number disribution functions. The library also provides cumulative distribution functions and inverse cumulative distribution functions sometimes referred to a quantile functions. To see whats available on your build use the shell command @code{ncap2 -f|grep -e _ran -e _cdf}. @noindent The following examples all return variables of type @code{NC_INT} @* @example defdim("out",15); a1[$out]=0.5; a2=gsl_ran_binomial(a1,30).sort(); //a2 = 10, 11, 12, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 17, 22 ; a3=gsl_ran_geometric(a2).sort(); //a2 = 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 4, 5 ; a4=gsl_ran_pascal(a2,50); //a5 = 37, 40, 40, 42, 43, 45, 46, 49, 52, 58, 60, 62, 62, 65, 67 ; @end example @noindent The following all return variables of type @code{NC_DOUBLE}; @example defdim("b1",1000); b1[$b1]=0.8; b2=gsl_ran_exponential(b1); b2_avg=b2.avg(); print(b2_avg); // b2_avg = 0.756047976787 b3=gsl_ran_gaussian(b1); b3_avg=b3.avg(); b3_rms=b3.rms(); print(b3_avg); // b3_avg = -0.00903446534258; print(b3_rms); // b3_rms = 0.81162979889; b4[$b1]=10.0; b5[$b1]=20.0; b6=gsl_ran_flat(b4,b5); b6_avg=b6.avg(); print(b6_avg); // b6_avg=15.0588129413 @end example @html @end html @node Examples ncap2, Intrinsic mathematical methods, GSL random number generation, ncap2 netCDF Arithmetic Processor @subsection Examples ncap2 See the @file{ncap.in} and @file{ncap2.in} scripts released with @acronym{NCO} for more complete demonstrations of @command{ncap2} functionality (script available on-line at @url{http://nco.sf.net/ncap2.in}). Define new attribute @var{new} for existing variable @var{one} as twice the existing attribute @var{double_att} of variable @var{att_var}: @example @verbatim ncap2 -s 'one@new=2*att_var@double_att' in.nc out.nc @end verbatim @end example Average variables of mixed types (result is of type @code{double}): @example ncap2 -s 'average=(var_float+var_double+var_int)/3' in.nc out.nc @end example Multiple commands may be given to @command{ncap2} in three ways. First, the commands may be placed in a script which is executed, e.g., @file{tst.nco}. Second, the commands may be individually specified with multiple @samp{-s} arguments to the same @command{ncap2} invocation. Third, the commands may be chained into a single @samp{-s} argument to @command{ncap2}. Assuming the file @file{tst.nco} contains the commands @code{a=3;b=4;c=sqrt(a^2+b^2);}, then the following @command{ncap2} invocations produce identical results: @example ncap2 -v -S tst.nco in.nc out.nc ncap2 -v -s 'a=3' -s 'b=4' -s 'c=sqrt(a^2+b^2)' in.nc out.nc ncap2 -v -s 'a=3;b=4;c=sqrt(a^2+b^2)' in.nc out.nc @end example The second and third examples show that @command{ncap2} does not require that a trailing semi-colon @samp{;} be placed at the end of a @samp{-s} argument, although a trailing semi-colon @samp{;} is always allowed. However, semi-colons are required to separate individual assignment statements chained together as a single @samp{-s} argument. @html @end html @cindex growing dimensions @cindex dimensions, growing @command{ncap2} may be used to ``grow'' dimensions, i.e., to increase dimension sizes without altering existing data. Say @file{in.nc} has @code{ORO(lat,lon)} and the user wishes a new file with @code{new_ORO(new_lat,new_lon)} that contains zeros in the undefined portions of the new grid. @example defdim("new_lat",$lat.size+1); // Define new dimension sizes defdim("new_lon",$lon.size+1); new_ORO[$new_lat,$new_lon]=0.0f; // Initialize to zero new_ORO(0:$lat.size-1,0:$lon.size-1)=ORO; // Fill valid data @end example The commands to define new coordinate variables @code{new_lat} and @code{new_lon} in the output file follow a similar pattern. One would might store these commands in a script @file{grow.nco} and then execute the script with @example ncap2 -v -S grow.nco in.nc out.nc @end example @html @end html @cindex flags Imagine you wish to create a binary flag based on the value of an array. The flag should have @w{value 1.0} where the array @w{exceeds 1.0}, and @w{value 0.0} elsewhere. This example creates the binary flag @code{ORO_flg} in @file{out.nc} from the continuous array named @code{ORO} in @file{in.nc}. @example ncap2 -s 'ORO_flg=(ORO > 1.0)' in.nc out.nc @end example Suppose your task is to change all values of @code{ORO} which @w{equal 2.0} to the new @w{value 3.0}: @example ncap2 -s 'ORO_msk=(ORO==2.0);ORO=ORO_msk*3.0+!ORO_msk*ORO' in.nc out.nc @end example @cindex mask This creates and uses @code{ORO_msk} to mask the subsequent arithmetic operation. Values of @code{ORO} are only changed where @code{ORO_msk} is true, i.e., where @code{ORO} @w{equals 2.0} @* Using the @code{where} statement the above code simplifies to : @example ncap2 -s 'where(ORO==2.0) ORO=3.0;' in.nc foo.nc @end example @html @end html This example uses @command{ncap2} to compute the covariance of two variables. Let the variables @var{@wndznl{}} and @var{@wndmrd{}} be the horizontal wind components. @cindex covariance @c fxm 20030423: texi2html 1.64 has problems with this legal syntax but makeinfo --html does not The @dfn{covariance} of @var{@wndznl{}} and @var{@wndmrd{}} is defined as the time mean product of the deviations of @var{@wndznl{}} and @var{@wndmrd{}} from their respective time means. Symbolically, the covariance @set flg @tex $[\wndznl^{\prime} \wndmrd^{\prime}] = [\wndznl\wndmrd]-[\wndznl][\wndmrd]$ where $[\xxx]$ denotes the time-average of~$\xxx$, $[\xxx] \equiv {1 \over \tau} \int_{\tm=0}^{\tm=\tau} \xxx(\tm) \,\dfr\tm$ and $\xxx^{\prime}$ @clear flg @end tex @ifinfo @math{[@var{@wndznl{}'@wndmrd{}'}] = [@var{@wndznl{}@wndmrd{}}]-[@var{@wndznl{}}][@var{@wndmrd{}}]} where @math{[@var{@xxx{}}]} denotes the time-average of @math{@var{@xxx{}}} and @math{@var{@xxx{}'}} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} [@var{@wndznl{}'@wndmrd{}'}] = [@var{@wndznl{}@wndmrd{}}]-[@var{@wndznl{}}][@var{@wndmrd{}}] where [@xxx{}] denotes the time-average of @var{@xxx{}} and @var{@xxx{}'} @clear flg @end ifset denotes the deviation from the time-mean. The covariance tells us how much of the correlation of two signals arises from the signal fluctuations versus the mean signals. @cindex eddy covariance Sometimes this is called the @dfn{eddy covariance}. We will store the covariance in the variable @code{uprmvprm}. @example ncwa -O -a time -v u,v in.nc foo.nc # Compute time mean of u,v ncrename -O -v u,uavg -v v,vavg foo.nc # Rename to avoid conflict ncks -A -v uavg,vavg foo.nc in.nc # Place time means with originals ncap2 -O -s 'uprmvprm=u*v-uavg*vavg' in.nc in.nc # Covariance ncra -O -v uprmvprm in.nc foo.nc # Time-mean covariance @end example The mathematically inclined will note that the same covariance would be obtained by replacing the step involving @command{ncap2} with @example ncap2 -O -s 'uprmvprm=(u-uavg)*(v-vavg)' foo.nc foo.nc # Covariance @end example As of @acronym{NCO} version 3.1.8 (December, 2006), @command{ncap2} can compute averages, and thus covariances, by itself: @example ncap2 -s 'uavg=u.avg($time);vavg=v.avg($time);uprmvprm=u*v-uavg*vavg' \ -s 'uprmvrpmavg=uprmvprm.avg($time)' in.nc foo.nc @end example We have not seen a simpler method to script and execute powerful arithmetic than @command{ncap2}. @cindex globbing @cindex shell @cindex quotes @cindex extended regular expressions @cindex regular expressions @command{ncap2} utilizes many meta-characters (e.g., @samp{$}, @samp{?}, @samp{;}, @samp{()}, @samp{[]}) that can confuse the command-line shell if not quoted properly. The issues are the same as those which arise in utilizing extended regular expressions to subset variables (@pxref{Subsetting Files}). The example above will fail with no quotes and with double quotes. This is because shell globbing tries to @dfn{interpolate} the value of @code{$time} from the shell environment unless it is quoted: @example ncap2 -s 'uavg=u.avg($time)' in.nc foo.nc # Correct (recommended) ncap2 -s uavg=u.avg('$time') in.nc foo.nc # Correct (and dangerous) ncap2 -s uavg=u.avg($time) in.nc foo.nc # Wrong ($time = '') ncap2 -s "uavg=u.avg($time)" in.nc foo.nc # Wrong ($time = '') @end example Without the single quotes, the shell replaces @code{$time} with an empty string. The command @command{ncap2} receives from the shell is @code{uavg=u.avg()}. This causes @command{ncap2} to average over all dimensions rather than just the @var{time} dimension, and unintended consequence. We recommend using single quotes to protect @command{ncap2} command-line scripts from the shell, even when such protection is not strictly necessary. Expert users may violate this rule to exploit the ability to use shell variables in @command{ncap2} command-line scripts (@pxref{CCSM Example}). In such cases it may be necessary to use the shell backslash character @samp{\} to protect the @command{ncap2} meta-character. @cindex appending data @cindex time-averaging @findex ncks @findex ncwa @findex ncra @cindex degenerate dimension @cindex @samp{-b} A dimension of size one is said to be @emph{degenerate}. Whether a degenerate record dimension is desirable or not depends on the application. Often a degenerate @var{time} dimension is useful, e.g., for concatentating, but it may cause problems with arithmetic. Such is the case in the above example, where the first step employs @command{ncwa} rather than @command{ncra} for the time-averaging. Of course the numerical results are the same with both operators. The difference is that, unless @samp{-b} is specified, @command{ncwa} writes no @var{time} dimension to the output file, while @command{ncra} defaults to keeping @var{time} as a degenerate (@w{size 1}) dimension. Appending @code{u} and @code{v} to the output file would cause @command{ncks} to try to expand the degenerate time axis of @code{uavg} and @code{vavg} to the size of the non-degenerate @var{time} dimension in the input file. Thus the append (@command{ncks -A}) command would be undefined (and should fail) in this case. @cindex @code{-C} Equally important is the @samp{-C} argument (@pxref{Subsetting Coordinate Variables}) to @command{ncwa} to prevent any scalar @var{time} variable from being written to the output file. Knowing when to use @command{ncwa -a time} rather than the default @command{ncra} for time-averaging takes, well, time. @html @end html @node Intrinsic mathematical methods, Operator precedence and associativity , Examples ncap2, ncap2 netCDF Arithmetic Processor @subsection Intrinsic mathematical methods @command{ncap2} supports the standard mathematical functions supplied with most operating systems. @cindex addition @cindex subtraction @cindex multiplication @cindex division @cindex exponentiation @cindex power @cindex modulus @cindex @code{+} (addition) @cindex @code{-} (subtraction) @cindex @code{*} (multiplication) @cindex @code{/} (division) @cindex @code{^} (power) @cindex @code{%} (modulus) Standard calculator notation is used for addition @kbd{+}, subtraction @kbd{-}, multiplication @kbd{*}, division @kbd{/}, exponentiation @kbd{^}, and modulus @kbd{%}. The available elementary mathematical functions are: @cindex @var{abs} @cindex @var{acosh} @cindex @var{acos} @cindex @var{asinh} @cindex @var{asin} @cindex @var{atanh} @cindex @var{atan} @cindex @var{ceil} @cindex @var{cosh} @cindex @var{cos} @cindex @var{erfc} @cindex @var{erf} @cindex @var{exp} @cindex @var{floor} @cindex @var{gamma} @cindex @var{ln} @cindex @var{log10} @cindex @var{log} @cindex @var{nearbyint} @cindex @var{pow} @cindex @var{rint} @cindex @var{round} @cindex @var{sinh} @cindex @var{sin} @cindex @var{sqrt} @cindex @var{tanh} @cindex @var{tan} @cindex @var{trunc} @cindex mathematical functions @cindex nearest integer function (inexact) @cindex nearest integer function (exact) @cindex rounding functions @cindex truncation function @cindex absolute value @cindex arccosine function @cindex arcsine function @cindex arctangent function @cindex ceiling function @cindex complementary error function @cindex cosine function @cindex error function @cindex exponentiation function @cindex floor function @cindex gamma function @cindex hyperbolic arccosine function @cindex hyperbolic arcsine function @cindex hyperbolic arctangent function @cindex hyperbolic cosine function @cindex hyperbolic sine function @cindex hyperbolic tangent @cindex logarithm, base 10 @cindex logarithm, natural @cindex power function @cindex sine function @cindex square root function @table @code @item abs(x) @dfn{Absolute value} @tex Absolute value of $x$, $|x|$. @end tex @ifinfo Absolute value of @var{x}. @end ifinfo Example: @tex abs$(-1) = 1$ @end tex @ifinfo @math{abs(-1) = 1} @end ifinfo @item acos(x) @dfn{Arc-cosine} Arc-cosine of @var{x} where @var{x} is specified in radians. Example: @tex acos$(1.0) = 0.0$ @end tex @ifinfo @math{acos(1.0) = 0.0} @end ifinfo @item acosh(x) @dfn{Hyperbolic arc-cosine} Hyperbolic arc-cosine of @var{x} where @var{x} is specified in radians. Example: @tex acosh$(1.0) = 0.0$ @end tex @ifinfo @math{acosh(1.0) = 0.0} @end ifinfo @item asin(x) @dfn{Arc-sine} Arc-sine of @var{x} where @var{x} is specified in radians. Example: @tex asin$(1.0) = 1.57079632679489661922$ @end tex @ifinfo @math{asin(1.0) = 1.57079632679489661922} @end ifinfo @item asinh(x) @dfn{Hyperbolic arc-sine} Hyperbolic arc-sine of @var{x} where @var{x} is specified in radians. Example: @tex asinh$(1.0) = 0.88137358702$ @end tex @ifinfo @math{asinh(1.0) = 0.88137358702} @end ifinfo @item atan(x) @dfn{Arc-tangent} Arc-tangent of @var{x} where @var{x} is specified in radians between @tex $-\pi/2$ and $\pi/2$. @end tex @ifinfo @math{-pi/2} and @math{pi/2}. @end ifinfo Example: @tex atan$(1.0) = 0.78539816339744830961$ @end tex @ifinfo @math{atan(1.0) = 0.78539816339744830961} @end ifinfo @item atan2(y,x) @dfn{Arc-tangent2} Arc-tangent of @var{y/x} @ifinfo @math{:Example atan2(1,3) = 0.321689857} @end ifinfo @item atanh(x) @dfn{Hyperbolic arc-tangent} Hyperbolic arc-tangent of @var{x} where @var{x} is specified in radians between @tex $-\pi/2$ and $\pi/2$. @end tex @ifinfo @math{-pi/2} and @math{pi/2}. @end ifinfo Example: @tex atanh$(3.14159265358979323844) = 1.0$ @end tex @ifinfo @math{atanh(3.14159265358979323844) = 1.0} @end ifinfo @item ceil(x) @dfn{Ceil} Ceiling of @var{x}. Smallest integral value not less than argument. Example: @tex ceil$(0.1) = 1.0$ @end tex @ifinfo @math{ceil(0.1) = 1.0} @end ifinfo @item cos(x) @dfn{Cosine} Cosine of @var{x} where @var{x} is specified in radians. Example: @tex cos$(0.0) = 1.0$ @end tex @ifinfo @math{cos(0.0) = 1.0} @end ifinfo @item cosh(x) @dfn{Hyperbolic cosine} Hyperbolic cosine of @var{x} where @var{x} is specified in radians. Example: @tex cosh$(0.0) = 1.0$ @end tex @ifinfo @math{cosh(0.0) = 1.0} @end ifinfo @item erf(x) @dfn{Error function} Error function of @var{x} where @var{x} is specified between @tex $-1$ and $1$. @end tex @ifinfo @math{-1} and @math{1}. @end ifinfo Example: @tex erf$(1.0) = 0.842701$ @end tex @ifinfo @math{erf(1.0) = 0.842701} @end ifinfo @item erfc(x) @dfn{Complementary error function} Complementary error function of @var{x} where @var{x} is specified between @tex $-1$ and $1$. @end tex @ifinfo @math{-1} and @math{1}. @end ifinfo Example: @tex erfc$(1.0) = 0.15729920705$ @end tex @ifinfo @math{erfc(1.0) = 0.15729920705} @end ifinfo @item exp(x) @dfn{Exponential} Exponential of @var{x}, @tex $e^{x}$. @end tex @ifinfo @math{e^x}. @end ifinfo Example: @tex exp$(1.0) = 2.71828182845904523536$ @end tex @ifinfo @math{exp(1.0) = 2.71828182845904523536} @end ifinfo @item floor(x) @dfn{Floor} Floor of @var{x}. Largest integral value not greater than argument. Example: @tex floor$(1.9) = 1$ @end tex @ifinfo @math{floor(1.9) = 1} @end ifinfo @item gamma(x) @dfn{Gamma function} Gamma function of @var{x}, @tex $\Gamma(x)$. @end tex @ifinfo @math{Gamma(x)}. @end ifinfo The well-known and loved continuous factorial function. Example: @tex gamma$(0.5) = \sqrt{\pi}$ @end tex @ifinfo @math{gamma(0.5) = sqrt(pi)} @end ifinfo @item gamma_inc_P(x) @dfn{Incomplete Gamma function} Incomplete Gamma function of parameter @var{a} and variable @var{x}, @tex $P(a,x)$. @end tex @ifinfo @math{gamma_inc_P(a,x)}. @end ifinfo One of the four incomplete gamma functions. Example: @tex gamma\_inc\_P$(1,1) = 1-\me^{-1}$ @end tex @ifinfo @math{gamma_inc_P(1,1) = 1-1/e} @end ifinfo @item ln(x) @dfn{Natural Logarithm} Natural logarithm of @var{x}, @tex $\ln(x)$. @end tex @ifinfo @math{ln(x)}. @end ifinfo Example: @tex ln$(2.71828182845904523536) = 1.0$ @end tex @ifinfo @math{ln(2.71828182845904523536) = 1.0} @end ifinfo @item log(x) @dfn{Natural Logarithm} Exact synonym for @code{ln(x)}. @item log10(x) @dfn{Base 10 Logarithm} @w{Base 10} logarithm of @var{x}, @tex $\log_{10}(x)$. @end tex @ifinfo @math{log10(x)}. @end ifinfo Example: @tex log$(10.0) = 1.0$ @end tex @ifinfo @math{log(10.0) = 1.0} @end ifinfo @item nearbyint(x) @dfn{Round inexactly} Nearest integer to @var{x} is returned in floating point format. @cindex inexact conversion No exceptions are raised for @dfn{inexact conversions}. Example: @tex nearbyint$(0.1) = 0.0$ @end tex @ifinfo @math{nearbyint(0.1) = 0.0} @end ifinfo @item pow(x,y) @dfn{Power} @cindex promotion @cindex automatic type conversion Value of @var{x} is raised to the power of @var{y}. Exceptions are raised for @dfn{domain errors}. Due to type-limitations in the @w{C language} @code{pow} function, integer arguments are promoted (@pxref{Type Conversion}) to type @code{NC_FLOAT} before evaluation. Example: @tex pow$(2,3) = 8$ @end tex @ifinfo @math{pow(2,3) = 8} @end ifinfo @item rint(x) @dfn{Round exactly} Nearest integer to @var{x} is returned in floating point format. Exceptions are raised for @dfn{inexact conversions}. Example: @tex rint$(0.1) = 0$ @end tex @ifinfo @math{rint(0.1) = 0} @end ifinfo @item round(x) @dfn{Round} Nearest integer to @var{x} is returned in floating point format. Round halfway cases away from zero, regardless of current @acronym{IEEE} rounding direction. Example: @tex round$(0.5) = 1.0$ @end tex @ifinfo @math{round(0.5) = 1.0} @end ifinfo @item sin(x) @dfn{Sine} Sine of @var{x} where @var{x} is specified in radians. Example: @tex sin$(1.57079632679489661922) = 1.0$ @end tex @ifinfo @math{sin(1.57079632679489661922) = 1.0} @end ifinfo @item sinh(x) @dfn{Hyperbolic sine} Hyperbolic sine of @var{x} where @var{x} is specified in radians. Example: @tex sinh$(1.0) = 1.1752$ @end tex @ifinfo @math{sinh(1.0) = 1.1752} @end ifinfo @item sqrt(x) @dfn{Square Root} Square Root of @var{x}, @tex $\sqrt{x}$. @end tex @ifinfo @math{sqrt(x)}. @end ifinfo Example: @tex sqrt$(4.0) = 2.0$ @end tex @ifinfo @math{sqrt(4.0) = 2.0} @end ifinfo @item tan(x) @dfn{Tangent} Tangent of @var{x} where @var{x} is specified in radians. Example: @tex tan$(0.78539816339744830961) = 1.0$ @end tex @ifinfo @math{tan(0.78539816339744830961) = 1.0} @end ifinfo @item tanh(x) @dfn{Hyperbolic tangent} Hyperbolic tangent of @var{x} where @var{x} is specified in radians. Example: @tex tanh$(1.0) = 0.761594155956$ @end tex @ifinfo @math{tanh(1.0) = 0.761594155956} @end ifinfo @item trunc(x) @dfn{Truncate} Nearest integer to @var{x} is returned in floating point format. Round halfway cases toward zero, regardless of current @acronym{IEEE} rounding direction. Example: @tex trunc$(0.5) = 0.0$ @end tex @ifinfo @math{trunc(0.5) = 0.0} @end ifinfo @end table @noindent The complete list of mathematical functions supported is platform-specific. Functions mandated by @w{ANSI C} are @emph{guaranteed} to be present and are indicated with an asterisk @c fxm No they're not, not yet @cindex @code{ANSI C} @cindex @code{float} @cindex precision @cindex quadruple-precision @cindex single-precision @cindex double-precision @cindex @code{long double} @cindex @code{NC_DOUBLE} @footnote{ @w{ANSI C} compilers are guaranteed to support double-precision versions of these functions. These functions normally operate on netCDF variables of type @code{NC_DOUBLE} without having to perform intrinsic conversions. For example, @acronym{ANSI} compilers provide @code{sin} for the sine of C-type @code{double} variables. The @acronym{ANSI} standard does not require, but many compilers provide, an extended set of mathematical functions that apply to single (@code{float}) and quadruple (@code{long double}) precision variables. Using these functions (e.g., @code{sinf} for @code{float}, @code{sinl} for @code{long double}), when available, is (presumably) more efficient than casting variables to type @code{double}, performing the operation, and then re-casting. @acronym{NCO} uses the faster intrinsic functions when they are available, and uses the casting method when they are not. }. and are indicated with an asterisk. @cindex @code{-f} @cindex @code{--prn_fnc_tbl} @cindex @code{--fnc_tbl} Use the @samp{-f} (or @samp{fnc_tbl} or @samp{prn_fnc_tbl}) switch to print a complete list of functions supported on your platform. @cindex Linux @footnote{Linux supports more of these intrinsic functions than other OSs.} @noindent @html @end html @c Begin HMB documentation @html @end html @node Operator precedence and associativity , ID Quoting, Intrinsic mathematical methods, ncap2 netCDF Arithmetic Processor @subsection Operator precedence and associativity This page lists the @command{ncap2} operators in order of precedence (highest to lowest). Their associativity indicates in what order operators of equal precedence in an expression are applied. @multitable @columnfractions .18 .62 .20 @headitem Operator @tab Description @tab Associativity @item @code{++ --} @tab Postfix Increment/Decrement @tab Right to Left @item @code{()} @tab Parentheses (function call) @item @code{.} @tab Method call @item @item @code{++ --} @tab Prefix Increment/Decrement @tab Right to Left @item @code{+ -} @tab Unary Plus/Minus @item @code{!} @tab Logical Not @item @item @code{^} @tab Power of Operator @tab Right to Left @item @item @code{* / %} @tab Multiply/Divide/Modulus @tab Left To Right @item @item @code{+ -} @tab Addition/Subtraction @tab Left To Right @item @item @code{>> <<} @tab Fortran style array clipping @tab Left to Right @item @item @item @code{< <=} @tab Less than/Less than or equal to @tab Left to Right @item @code{> >=} @tab Greater than/Greater than or equal to @item @item @code{== !=} @tab Equal to/Not equal to @tab Left to Right @item @item @code{&&} @tab Logical AND @tab Left to Right @item @item @code{||} @tab Logical OR @tab Left to Right @item @item @code{?:} @tab Ternary Operator @tab Right to Left @item @item @code{=} @tab Assignment @tab Right to Left @item @code{+= -=} @tab Addition/subtraction assignment @item @code{*= /=} @tab Multiplication/division assignment @end multitable @html @end html @node ID Quoting, , Operator precedence and associativity , ncap2 netCDF Arithmetic Processor @subsection ID Quoting @cindex ID Quoting In this section when I refer to a name I mean a variable name, attribute name or a dimension name The allowed characters in a valid netCDF name vary from release to release. (See end section). If you want to use metacharacters in a name or use a method name as a variable name then the name has to be quoted wherever it occurs. @noindent The default @acronym{NCO} name is specified by the regular expressions: @example DGT: ('0'..'9'); LPH: ( 'a'..'z' | 'A'..'Z' | '_' ); name: (LPH)(LPH|DGT)+ @end example @noindent The first character of a valid name must be alphabetic or the underscore. Any subsequent characters must be alphanumeric or underscore. ( e.g., a1,_23, hell_is_666 ) @noindent The valid characters in a quoted name are specified by the regular expressions: @example LPHDGT: ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9'); name: (LPHDGT|'-'|'+'|'.'|'('|')'|':' )+ ; @end example @noindent Quote a variable:@* 'avg' , '10_+10','set_miss' '+-90field' , '--test'=10.0d@* @* Quote a attribute: @* 'three@@10', 'set_mss@@+10', '666@@hell', 't1@@+units'="kelvin" @* @* Quote a dimension: @* '$10', '$t1--', '$--odd', c1['$10','$t1--']=23.0d @* @sp 1 The following comments are from the netCDF library definitions and detail the naming conventions for each release. @noindent netcdf-3.5.1 @* netcdf-3.6.0-p1 @* netcdf-3.6.1 @* netcdf-3.6.2 @* @example @verbatim /* * ( [a-zA-Z]|[0-9]|'_'|'-'|'+'|'.'|'|':'|'@'|'('|')' )+ * Verify that name string is valid CDL syntax, i.e., all characters are * alphanumeric, '-', '_', '+', or '.'. * Also permit ':', '@', '(', or ')' in names for chemists currently making * use of these characters, but don't document until ncgen and ncdump can * also handle these characters in names. */ @end verbatim @end example @noindent netcdf-3.6.3@* netcdf-4.0 Final 2008/08/28@* @example @verbatim /* * Verify that a name string is valid syntax. The allowed name * syntax (in RE form) is: * * ([a-zA-Z_]|{UTF8})([^\x00-\x1F\x7F/]|{UTF8})* * * where UTF8 represents a multibyte UTF-8 encoding. Also, no * trailing spaces are permitted in names. This definition * must be consistent with the one in ncgen.l. We do not allow '/' * because HDF5 does not permit slashes in names as slash is used as a * group separator. If UTF-8 is supported, then a multi-byte UTF-8 * character can occur anywhere within an identifier. We later * normalize UTF-8 strings to NFC to facilitate matching and queries. */ @end verbatim @end example @c End HMB documentation @page @html @end html @node ncatted netCDF Attribute Editor, ncbo netCDF Binary Operator, ncap2 netCDF Arithmetic Processor, Reference Manual @section @command{ncatted} netCDF Attribute Editor @cindex attributes @cindex attribute names @cindex editing attributes @findex ncatted @noindent SYNTAX @example ncatted [-a @var{att_dsc}] [-a @dots{}] [-D @var{dbg}] [-h] [--hdr_pad @var{nbr}] [-l @var{path}] [-O] [-o @var{output-file}] [-p @var{path}] [-R] [-r] [--ram_all] @var{input-file} [[@var{output-file}]] @end example @noindent DESCRIPTION @cindex @command{ncattget} @command{ncatted} edits attributes in a netCDF file. If you are editing attributes then you are spending too much time in the world of metadata, and @command{ncatted} was written to get you back out as quickly and painlessly as possible. @command{ncatted} can @dfn{append}, @dfn{create}, @dfn{delete}, @dfn{modify}, and @dfn{overwrite} attributes (all explained below). @command{ncatted} allows each editing operation to be applied to every variable in a file. This saves time when changing attribute conventions throughout a file. @command{ncatted} is for @emph{writing} attributes. To @emph{read} attribute values in plain text, use @command{ncks -m -M}, or define something like @command{ncattget} as a shell command (@pxref{Filters for @command{ncks}}). @cindex @code{history} @cindex @code{-h} Because repeated use of @command{ncatted} can considerably increase the size of the @code{history} global attribute (@pxref{History Attribute}), the @samp{-h} switch is provided to override automatically appending the command to the @code{history} global attribute in the @var{output-file}. @cindex performance @cindex operator speed @cindex speed @cindex execution time According to the @cite{netCDF User Guide}, altering metadata in netCDF files does not incur the penalty of recopying the entire file when the new metadata occupies less space than the old metadata. Thus @command{ncatted} may run much faster (at least on netCDF3 files) if judicious use of header padding (@pxref{Metadata Optimization}) was made when producing the @var{input-file}. Similarly, using the @samp{--hdr_pad} option with @command{ncatted} helps ensure that future metadata changes to @var{output-file} occur as swiftly as possible. @cindex missing values @cindex data, missing @cindex @code{_FillValue} When @command{ncatted} is used to change the @code{_FillValue} attribute, it changes the associated missing data self-consistently. If the internal floating point representation of a missing value, e.g., 1.0e36, differs between two machines then netCDF files produced on those machines will have incompatible missing values. This allows @command{ncatted} to change the missing values in files from different machines to a single value so that the files may then be concatenated, e.g., by @command{ncrcat}, without losing information. @xref{Missing Values}, for more information. To master @command{ncatted} one must understand the meaning of the structure that describes the attribute modification, @var{att_dsc} specified by the required option @samp{-a} or @samp{--attribute}. This option is repeatable and may be used multiple time in a single @command{ncatted} invocation to increase the efficiency of altering multiple attributes. Each @var{att_dsc} contains five elements. This makes using @command{ncatted} somewhat complicated, though powerful. The @var{att_dsc} fields are in the following order:@* @var{att_dsc} = @var{att_nm}, @var{var_nm}, @var{mode}, @var{att_type}, @var{att_val}@* @table @var @item att_nm Attribute name. Example: @code{units} As of @acronym{NCO} 4.5.1 (July, 2015), @command{ncatted} accepts regular expressions (@pxref{Subsetting Files}) for attribute names (it has ``always'' accepted regular expressions for variable names). Regular expressions will select all matching attribute names. @item var_nm Variable name. Example: @code{pressure}, @code{'^H2O'}. @cindex extended regular expressions @cindex regular expressions @cindex pattern matching @cindex wildcards Regular expressions (@pxref{Subsetting Files}) are accepted and will select all matching variable (and/or group) names. The names @code{global} and @code{group} have special meaning. @item mode Edit mode abbreviation. Example: @code{a}. See below for complete listing of valid values of @var{mode}. @item att_type Attribute type abbreviation. Example: @code{c}. See below for complete listing of valid values of @var{att_type}. @item att_val Attribute value. Example: @code{pascal}. @end table @noindent There should be no empty space between these five consecutive arguments. The description of these arguments follows in their order of appearance. The value of @var{att_nm} is the name of the attribute to edit. This meaning of this should be clear to all @command{ncatted} users. Both @var{att_nm}) and @var{var_nm} may be specified as regular expressions. If @var{att_nm} is omitted (i.e., left blank) and @dfn{Delete} mode is selected, then all attributes associated with the specified variable will be deleted. @cindex global attributes @cindex attributes, global The value of @var{var_nm} is the name of the variable containing the attribute (named @var{att_nm}) that you want to edit. There are three very important and useful exceptions to this rule. The value of @var{var_nm} can also be used to direct @command{ncatted} to edit global attributes, or to repeat the editing operation for every group or variable in a file. @w{A value} of @var{var_nm} of @code{global} indicates that @var{att_nm} refers to a global (i.e., root-level) attribute, rather than to a particular variable's attribute. This is the method @command{ncatted} supports for editing global attributes. @w{A value} of @var{var_nm} of @code{group} indicates that @var{att_nm} refers to all groups, rather than to a particular variable's or group's attribute. The operation will proceed to edit group metadata for every group. Finally, if @var{var_nm} is left blank, then @command{ncatted} attempts to perform the editing operation on every variable in the file. This option may be convenient to use if you decide to change the conventions you use for describing the data. @html @end html The value of @var{mode} is a single character abbreviation (@code{a}, @code{c}, @code{d}, @code{m}, or @code{o}) standing for one of five editing modes:@* @cindex attributes, appending @cindex attributes, creating @cindex attributes, deleting @cindex attributes, modifying @cindex attributes, editing @cindex attributes, overwriting @table @code @item a @dfn{Append}. Append value @var{att_val} to current @var{var_nm} attribute @var{att_nm} value @var{att_val}, if any. If @var{var_nm} does not have an attribute @var{att_nm}, there is no effect. @item c @dfn{Create}. Create variable @var{var_nm} attribute @var{att_nm} with @var{att_val} if @var{att_nm} does not yet exist. If @var{var_nm} already has an attribute @var{att_nm}, there is no effect, so the existing attribute is preserved without change. @item d @dfn{Delete}. Delete current @var{var_nm} attribute @var{att_nm}. If @var{var_nm} does not have an attribute @var{att_nm}, there is no effect. If @var{att_nm} is omitted (left blank), then all attributes associated with the specified variable are automatically deleted. When @dfn{Delete} mode is selected, the @var{att_type} and @var{att_val} arguments are superfluous and may be left blank. @item m @dfn{Modify}. Change value of current @var{var_nm} attribute @var{att_nm} to value @var{att_val}. If @var{var_nm} does not have an attribute @var{att_nm}, there is no effect. @item o @dfn{Overwrite}. Write attribute @var{att_nm} with value @var{att_val} to variable @var{var_nm}, overwriting existing attribute @var{att_nm}, if any. This is the default mode. @end table @html @end html The value of @var{att_type} is a single character abbreviation (@code{f}, @code{d}, @code{l}, @code{i}, @code{s}, @code{c}, @code{b}, @code{u}) or a short string standing for one of the twelve primitive netCDF data types:@* @table @code @item f @dfn{Float}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_FLOAT}. @item d @dfn{Double}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_DOUBLE}. @item i, l @dfn{Integer} or @dfn{Long}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_INT}. @item s @dfn{Short}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_SHORT}. @item c @dfn{Char}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_CHAR}. @item b @dfn{Byte}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_BYTE}. @item ub @dfn{Unsigned Byte}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_UBYTE}. @item us @dfn{Unsigned Short}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_USHORT}. @item u, ui, ul @dfn{Unsigned Int}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_UINT}. @item ll, int64 @dfn{Int64}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_INT64}. @item ull, uint64 @dfn{Uint64}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_UINT64}. @item sng, string @dfn{String}. Value(s) specified in @var{att_val} will be stored as netCDF intrinsic type @code{NC_STRING}. Note that @command{ncatted} handles type @code{NC_STRING} attributes correctly beginning with version 4.3.3 released in July, 2013. Earlier versions fail when asked to handle @code{NC_STRING} attributes. @end table @noindent In @dfn{Delete} mode the specification of @var{att_type} is optional (and is ignored if supplied). The value of @var{att_val} is what you want to change attribute @var{att_nm} to contain. The specification of @var{att_val} is optional in @dfn{Delete} (and is ignored) mode. Attribute values for all types besides @code{NC_CHAR} must have an attribute length of at least one. Thus @var{att_val} may be a single value or one-dimensional array of elements of type @code{att_type}. If the @var{att_val} is not set or is set to empty space, and the @var{att_type} is @code{NC_CHAR}, e.g., @code{-a units,T,o,c,""} or @code{-a units,T,o,c,}, then the corresponding attribute is set to have zero length. When specifying an array of values, it is safest to enclose @var{att_val} in single or double quotes, e.g., @code{-a levels,T,o,s,"1,2,3,4"} or @code{-a levels,T,o,s,'1,2,3,4'}. The quotes are strictly unnecessary around @var{att_val} except when @var{att_val} contains characters which would confuse the calling shell, such as spaces, commas, and wildcard characters. @cindex Perl @cindex @acronym{ASCII} @acronym{NCO} processing of @code{NC_CHAR} attributes is a bit like Perl in that it attempts to do what you want by default (but this sometimes causes unexpected results if you want unusual data storage). @cindex @code{printf()} @cindex @code{\n} (@acronym{ASCII} LF, linefeed) @cindex characters, special @cindex @code{\t} (@acronym{ASCII} HT, horizontal tab) If the @var{att_type} is @code{NC_CHAR} then the argument is interpreted as a string and it may contain C-language escape sequences, e.g., @code{\n}, which @acronym{NCO} will interpret before writing anything to disk. @acronym{NCO} translates valid escape sequences and stores the appropriate @acronym{ASCII} code instead. Since two byte escape sequences, e.g., @code{\n}, represent one-byte @acronym{ASCII} codes, e.g., @acronym{ASCII} 10 (decimal), the stored string attribute is one byte shorter than the input string length for each embedded escape sequence. The most frequently used C-language escape sequences are @code{\n} (for linefeed) and @code{\t} (for horizontal tab). These sequences in particular allow convenient editing of formatted text attributes. @cindex @code{\a} (@acronym{ASCII} BEL, bell) @cindex @code{\b} (@acronym{ASCII} BS, backspace) @cindex @code{\f} (@acronym{ASCII} FF, formfeed) @cindex @code{\r} (@acronym{ASCII} CR, carriage return) @cindex @code{\v} (@acronym{ASCII} VT, vertical tab) @cindex @code{\\} (@acronym{ASCII} \, backslash) The other valid @acronym{ASCII} codes are @code{\a}, @code{\b}, @code{\f}, @code{\r}, @code{\v}, and @code{\\}. @xref{ncks netCDF Kitchen Sink}, for more examples of string formatting (with the @command{ncks} @samp{-s} option) with special characters. @cindex @code{\'} (protected end quote) @cindex @code{\"} (protected double quote) @cindex @code{\?} (protected question mark) @cindex @code{\\} (protected backslash) @cindex @code{'} (end quote) @cindex @code{"} (double quote) @cindex @code{?} (question mark) @cindex @code{\} (backslash) @cindex special characters @cindex @acronym{ASCII} Analogous to @code{printf}, other special characters are also allowed by @command{ncatted} if they are ``protected'' by a backslash. The characters @code{"}, @code{'}, @code{?}, and @code{\} may be input to the shell as @code{\"}, @code{\'}, @code{\?}, and @code{\\}. @acronym{NCO} simply strips away the leading backslash from these characters before editing the attribute. No other characters require protection by a backslash. Backslashes which precede any other character (e.g., @code{3}, @code{m}, @code{$}, @code{|}, @code{&}, @code{@@}, @code{%}, @code{@{}, and @code{@}}) will not be filtered and will be included in the attribute. @cindex strings @cindex NUL-termination @cindex NUL @cindex C language @cindex @code{0} (NUL) Note that the NUL character @code{\0} which terminates @w{C language} strings is assumed and need not be explicitly specified. @comment If @code{\0} is input, it will not be translated (because it would @comment terminate the string in an additional location). @comment 20101007 Before today, \0 was not translated to NUL @comment 20101007 As of today, \0 is translated to NUL If @code{\0} is input, it is translated to the NUL character. However, this will make the subsequent portion of the string, if any, invisible to @w{C standard} library string functions. And that may cause unintended consequences. Because of these context-sensitive rules, one must use @command{ncatted} with care in order to store data, rather than text strings, in an attribute of type @code{NC_CHAR}. Note that @command{ncatted} interprets character attributes (i.e., attributes of type @code{NC_CHAR}) as strings. @noindent @html @end html EXAMPLES Append the string @code{Data version 2.0.\n} to the global attribute @code{history}: @example ncatted -a history,global,a,c,'Data version 2.0\n' in.nc @end example Note the use of embedded @w{C language} @code{printf()}-style escape sequences. Change the value of the @code{long_name} attribute for variable @code{T} from whatever it currently is to ``temperature'': @example ncatted -a long_name,T,o,c,temperature in.nc @end example @html @end html @cindex NaN @cindex @acronym{IEEE} NaN @cindex Not-a-Number @acronym{NCO} arithmetic operators may not work as expected on @acronym{IEEE} NaN (short for Not-a-Number) and NaN-like numbers such as positive infinity and negative infinity @footnote{Arithmetic comparisons to NaN and NaN-like numbers always return False, contrary to the behavior of all other numbers. This is difficult to inuit, yet is the behavior defined for NaN by @w{@acronym{IEEE} 754}. Although using NaN for the missing value in datasets is legal, we strongly discourage it.}. One way to work-around this problem is to change @acronym{IEEE} NaNs to normal missing values. As of @acronym{NCO} 4.1.0 (March, 2012), @command{ncatted} works with NaNs. First set the missing value (i.e., the value of the @code{_FillValue} attribute) for the variable(s) in question to the @acronym{IEEE} NaN value. @example ncatted -a _FillValue,,o,f,NaN in.nc @end example Then change the missing value from the @acronym{IEEE} NaN value to a normal @acronym{IEEE} number, like 1.0e36 (or to whatever the original missing value was). @example ncatted -a _FillValue,,m,f,1.0e36 in.nc @end example Delete all existing @code{units} attributes: @example ncatted -a units,,d,, in.nc @end example @noindent The value of @var{var_nm} was left blank in order to select all variables in the file. The values of @var{att_type} and @var{att_val} were left blank because they are superfluous in @dfn{Delete} mode. @cindex @code{global} attribute @cindex global attributes @cindex attributes, global Delete all attributes associated with the @code{tpt} variable, and delete all global attributes @example ncatted -a ,tpt,d,, -a ,global,d,, in.nc @end example @noindent The value of @var{att_nm} was left blank in order to select all attributes associated with the variable. To delete all global attributes, simply replace @code{tpt} with @code{global} in the above. @cindex @code{units} Modify all existing @code{units} attributes to @code{meter second-1}: @example ncatted -a units,,m,c,'meter second-1' in.nc @end example @cindex @code{units} Add a @code{units} attribute of @code{kilogram kilogram-1} to all variables whose first three characters are @samp{H2O}: @example ncatted -a units,'^H2O',c,c,'kilogram kilogram-1' in.nc @end example Overwrite the @code{quanta} attribute of variable @code{energy} to an array of four integers. @example ncatted -a quanta,energy,o,s,'010,101,111,121' in.nc @end example @cindex extended regular expressions @cindex regular expressions @cindex pattern matching @cindex wildcards As of @acronym{NCO} 3.9.6 (January, 2009), @command{ncatted} accepts @dfn{extended regular expressions} as arguments for variable names, and, since @acronym{NCO} 4.5.1 (July, 2015), for attribute names. @example ncatted -a isotope,'^H2O*',c,s,'18' in.nc ncatted -a '.?_iso19115$','^H2O*',d,, in.nc @end example The first example creates @code{isotope} attributes for all variables whose names contain @samp{H2O}. The second deletes all attributes whose names end in @code{_iso19115} from all variables whose names contain @samp{H2O}. See @ref{Subsetting Files} for more details on using regular expressions. @cindex groups As of @acronym{NCO} 4.3.8 (November, 2013), @command{ncatted} accepts full and partial group paths in names of attributes, variables, dimensions, and groups. @c ncks -m -v lon ~/in_grp.nc @example # Overwrite units attribute of specific 'lon' variable ncatted -O -a units,/g1/lon,o,c,'degrees_west' in_grp.nc # Overwrite units attribute of all 'lon' variables ncatted -O -a units,lon,o,c,'degrees_west' in_grp.nc # Delete units attribute of all 'lon' variables ncatted -O -a units,lon,d,, in_grp.nc # Overwrite units attribute with new type for specific 'lon' variable ncatted -O -a units,/g1/lon,o,sng,'degrees_west' in_grp.nc # Add new_att attribute to all variables ncatted -O -a new_att,,c,sng,'new variable attribute' in_grp.nc # Add new_grp_att group attribute to all groups ncatted -O -a new_grp_att,group,c,sng,'new group attribute' in_grp.nc # Add new_grp_att group attribute to single group ncatted -O -a g1_grp_att,g1,c,sng,'new group attribute' in_grp.nc # Add new_glb_att global attribute to root group ncatted -O -a new_glb_att,global,c,sng,'new global attribute' in_grp.nc @end example Note that regular expressions work well in conjuction with group path support. In other words, the variable name (including group path component) and the attribute names may both be extended regular expressions. Demonstrate input of C-language escape sequences (e.g., @code{\n}) and other special characters (e.g., @code{\"}) @example ncatted -h -a special,global,o,c, '\nDouble quote: \"\nTwo consecutive double quotes: \"\"\n Single quote: Beyond my shell abilities!\nBackslash: \\\n Two consecutive backslashes: \\\\\nQuestion mark: \?\n' in.nc @end example Note that the entire attribute is protected from the shell by single quotes. These outer single quotes are necessary for interactive use, but may be omitted in batch scripts. @page @html @end html @node ncbo netCDF Binary Operator, nces netCDF Ensemble Statistics, ncatted netCDF Attribute Editor, Reference Manual @section @command{ncbo} netCDF Binary Operator @findex ncbo @findex ncdiff @findex ncadd @findex ncsub @findex ncsubtract @findex ncmult @findex ncmultiply @findex ncdivide @cindex binary operations @cindex addition @cindex subtraction @cindex multiplication @cindex adding data @cindex subtracting data @cindex multiplying data @cindex dividing data @noindent SYNTAX @example ncbo [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [--no_tmp_fl] [-O] [-o @var{file_3}] [-p @var{path}] [-R] [-r] [--ram_all] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-X ...] [-x] [-y @var{op_typ}] @var{file_1} @var{file_2} [@var{file_3}] @end example @noindent DESCRIPTION @command{ncbo} performs binary operations on variables in @var{file_1} and the corresponding variables (those with the same name) in @var{file_2} and stores the results in @var{file_3}. The binary operation operates on the entire files (modulo any excluded variables). @xref{Missing Values}, for treatment of missing values. One of the four standard arithmetic binary operations currently supported must be selected with the @samp{-y @var{op_typ}} switch (or long options @samp{--op_typ} or @samp{--operation}). @cindex @code{add} @cindex @code{subtract} @cindex @code{multiply} @cindex @code{divide} @cindex @code{+} @cindex @code{-} @cindex @code{*} @cindex @code{/} @cindex @code{-y @var{op_typ}} @cindex @code{--operation @var{op_typ}} @cindex @code{--op_typ @var{op_typ}} @cindex alternate invocations The valid binary operations for @command{ncbo}, their definitions, corresponding values of the @var{op_typ} key, and alternate invocations are: @table @dfn @item Addition @c Internal operation code: @{nco_op_add}@* Definition: @var{file_3} = @var{file_1} + @var{file_2}@* Alternate invocation: @command{ncadd}@* @var{op_typ} key values: @samp{add}, @samp{+}, @samp{addition}@* Examples: @samp{ncbo --op_typ=add 1.nc 2.nc 3.nc}, @samp{ncadd 1.nc 2.nc 3.nc}@* @item Subtraction Definition: @var{file_3} = @var{file_1} - @var{file_2}@* Alternate invocations: @command{ncdiff}, @command{ncsub}, @command{ncsubtract}@* @var{op_typ} key values: @samp{sbt}, @samp{-}, @samp{dff}, @samp{diff}, @samp{sub}, @samp{subtract}, @samp{subtraction}@* Examples: @samp{ncbo --op_typ=- 1.nc 2.nc 3.nc}, @samp{ncdiff 1.nc 2.nc 3.nc}@* @item Multiplication Definition: @var{file_3} = @var{file_1} * @var{file_2}@* Alternate invocations: @command{ncmult}, @command{ncmultiply}@* @var{op_typ} key values: @samp{mlt}, @samp{*}, @samp{mult}, @samp{multiply}, @samp{multiplication}@* Examples: @samp{ncbo --op_typ=mlt 1.nc 2.nc 3.nc}, @samp{ncmult 1.nc 2.nc 3.nc}@* @item Division Definition: @var{file_3} = @var{file_1} / @var{file_2}@* Alternate invocation: @command{ncdivide}@* @var{op_typ} key values: @samp{dvd}, @samp{/}, @samp{divide}, @samp{division}@* Examples: @samp{ncbo --op_typ=/ 1.nc 2.nc 3.nc}, @samp{ncdivide 1.nc 2.nc 3.nc}@* @end table @noindent Care should be taken when using the shortest form of key values, i.e., @samp{+}, @samp{-}, @samp{*}, @w{and @samp{/}}. Some of these single characters may have special meanings to the shell @cindex naked characters @footnote{@w{A naked} (i.e., unprotected or unquoted) @samp{*} is a wildcard character. @w{A naked} @samp{-} may confuse the command line parser. @w{A naked} @samp{+} and @samp{/} are relatively harmless.}. @cindex Bash shell Place these characters inside quotes to keep them from being interpreted (globbed) by the shell @footnote{The widely used shell Bash correctly interprets all these special characters even when they are not quoted. That is, Bash does not prevent @acronym{NCO} from correctly interpreting the intended arithmetic operation when the following arguments are given (without quotes) to @command{ncbo}: @samp{--op_typ=+}, @samp{--op_typ=-}, @samp{--op_typ=*}, and @samp{--op_typ=/}}. @cindex globbing @cindex shell @cindex quotes For example, the following commands are equivalent @example ncbo --op_typ=* 1.nc 2.nc 3.nc # Dangerous (shell may try to glob) ncbo --op_typ='*' 1.nc 2.nc 3.nc # Safe ('*' protected from shell) ncbo --op_typ="*" 1.nc 2.nc 3.nc # Safe ('*' protected from shell) ncbo --op_typ=mlt 1.nc 2.nc 3.nc ncbo --op_typ=mult 1.nc 2.nc 3.nc ncbo --op_typ=multiply 1.nc 2.nc 3.nc ncbo --op_typ=multiplication 1.nc 2.nc 3.nc ncmult 1.nc 2.nc 3.nc # First do 'ln -s ncbo ncmult' ncmultiply 1.nc 2.nc 3.nc # First do 'ln -s ncbo ncmultiply' @end example No particular argument or invocation form is preferred. Users are encouraged to use the forms which are most intuitive to them. @cindex @command{alias} @cindex @command{ln -s} @cindex symbolic links Normally, @command{ncbo} will fail unless an operation type is specified with @samp{-y} (equivalent to @samp{--op_typ}). You may create exceptions to this rule to suit your particular tastes, in conformance with your site's policy on @dfn{symbolic links} to executables (files of a different name point to the actual executable). For many years, @command{ncdiff} was the main binary file operator. As a result, many users prefer to continue invoking @command{ncdiff} rather than memorizing a new command (@samp{ncbo -y @var{sbt}}) which behaves identically to the original @command{ncdiff} command. However, from a software maintenance standpoint, maintaining a distinct executable for each binary operation (e.g., @command{ncadd}) is untenable, and a single executable, @command{ncbo}, is desirable. To maintain backward compatibility, therefore, @acronym{NCO} automatically creates a symbolic link from @command{ncbo} to @command{ncdiff}. Thus @command{ncdiff} is called an @dfn{alternate invocation} of @command{ncbo}. @command{ncbo} supports many additional alternate invocations which must be manually activated. Should users or system adminitrators decide to activate them, the procedure is simple. For example, to use @samp{ncadd} instead of @samp{ncbo --op_typ=add}, simply create a symbolic link from @command{ncbo} to @command{ncadd} @footnote{The command to do this is @samp{ln -s -f ncbo ncadd}}. The alternatate invocations supported for each operation type are listed above. Alternatively, users may always define @samp{ncadd} as an @dfn{alias} to @samp{ncbo --op_typ=add} @footnote{The command to do this is @samp{alias ncadd='ncbo --op_typ=add'}}. It is important to maintain portability in @acronym{NCO} scripts. Therefore we recommend that site-specfic invocations (e.g., @samp{ncadd}) be used only in interactive sessions from the command-line. For scripts, we recommend using the full invocation (e.g., @samp{ncbo --op_typ=add}). This ensures portability of scripts between users and sites. @html @end html @cindex broadcasting variables @cindex rank @command{ncbo} operates (e.g., adds) variables in @var{file_2} with the corresponding variables (those with the same name) in @var{file_1} and stores the results in @var{file_3}. @cindex broadcasting variables Variables in @var{file_1} or @var{file_2} are @dfn{broadcast} to conform to the corresponding variable in the other input file if necessary@footnote{ Prior to @acronym{NCO} version 4.3.1 (May, 2013), @command{ncbo} would only broadcast variables in @var{file_2} to conform to @var{file_1}. Variables in @var{file_1} were @emph{never} broadcast to conform to the dimensions in @var{file_2}.}. Now @command{ncbo} is completely symmetric with respect to @var{file_1} and @var{file_2}, i.e., @set flg @tex $\rm{file}_1 - \rm{file}_2 = -(\rm{file}_2-\rm{file}_1)$. @clear flg @end tex @ifinfo @math{@var{file_1} - @var{file_2} = - (@var{file_2} - @var{file_1}}. @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{file_1} - @var{file_2} = -(@var{file_2} - @var{file_1}. @clear flg @end ifset Broadcasting a variable means creating data in non-existing dimensions by copying data in existing dimensions. For example, a two dimensional variable in @var{file_2} can be subtracted from a four, three, or two (not one or zero) dimensional variable (of the same name) in @code{file_1}. @cindex anomalies This functionality allows the user to compute anomalies from the mean. In the future, we will broadcast variables in @var{file_1}, if necessary to conform to their counterparts in @var{file_2}. @c TODO #268 @cindex rank Thus, presently, the number of dimensions, or @dfn{rank}, of any processed variable in @var{file_1} must be greater than or equal to the rank of the same variable in @var{file_2}. Of course, the size of all dimensions common to both @var{file_1} and @var{file_2} must be equal. When computing anomalies from the mean it is often the case that @var{file_2} was created by applying an averaging operator to a file with initially the same dimensions as @var{file_1} (often @var{file_1} itself). In these cases, creating @var{file_2} with @command{ncra} rather than @command{ncwa} will cause the @command{ncbo} operation to fail. For concreteness say the record dimension in @code{file_1} is @code{time}. If @var{file_2} was created by averaging @var{file_1} over the @code{time} dimension with the @command{ncra} operator (rather than with the @command{ncwa} operator), then @var{file_2} will have a @code{time} dimension of @w{size 1} rather than having no @code{time} dimension at all @cindex degenerate dimension @cindex @samp{-b} @footnote{This is because @command{ncra} collapses the record dimension to a size @w{of 1} (making it a @dfn{degenerate} dimension), but does not remove it, while, unless @samp{-b} is given, @command{ncwa} removes all averaged dimensions. In other words, by default @command{ncra} changes variable size though not rank, while, @command{ncwa} changes both variable size and rank.}. In this case the input files to @command{ncbo}, @var{file_1} and @var{file_2}, will have unequally sized @code{time} dimensions which causes @command{ncbo} to fail. To prevent this from occuring, use @command{ncwa} to remove the @code{time} dimension from @var{file_2}. See the example below. @cindex coordinate variable @cindex @code{NC_CHAR} @command{ncbo} never operates on coordinate variables or variables of type @code{NC_CHAR} or @code{NC_STRING}. This ensures that coordinates like (e.g., latitude and longitude) are physically meaningful in the output file, @var{file_3}. This behavior is hardcoded. @cindex @acronym{CF} conventions @command{ncbo} applies special rules to some @acronym{CF}-defined (and/or @acronym{NCAR CCSM} or @acronym{NCAR CCM} fields) such as @code{ORO}. See @ref{CF Conventions} for a complete description. Finally, we note that @command{ncflint} (@pxref{ncflint netCDF File Interpolator}) is designed for file interpolation. As such, it also performs file subtraction, addition, multiplication, albeit in a more convoluted way than @command{ncbo}. @html @end html @cindex broadcasting groups Beginning with @acronym{NCO} version 4.3.1 (May, 2013), @command{ncbo} supports @dfn{group broadcasting}. Group broadcasting means processing data based on group patterns in the input file(s) and automatically transferring or transforming groups to the output file. Consider the case where @var{file_1} contains multiple groups each with the variable @var{v1}, while @var{file_2} contains @var{v1} only in its top-level (i.e., root) group. Then @command{ncbo} will replicate the group structure of @var{file_1} in the output file, @var{file_3}. Each group in @var{file_3} contains the output of the corresponding group in @var{file_1} operating on the data in the single group in @var{file_2}. An example is provided below. @noindent @html @end html EXAMPLES Say files @file{85_0112.nc} and @file{86_0112.nc} each contain 12 months of data. Compute the change in the monthly averages from 1985 to 1986: @example ncbo 86_0112.nc 85_0112.nc 86m85_0112.nc ncdiff 86_0112.nc 85_0112.nc 86m85_0112.nc ncbo --op_typ=sub 86_0112.nc 85_0112.nc 86m85_0112.nc ncbo --op_typ='-' 86_0112.nc 85_0112.nc 86m85_0112.nc @end example @noindent These commands are all different ways of expressing the same thing. @cindex broadcasting @cindex rank The following examples demonstrate the broadcasting feature of @command{ncbo}. Say we wish to compute the monthly anomalies of @code{T} from the yearly average of @code{T} for the year 1985. First we create the 1985 average from the monthly data, which is stored with the record dimension @code{time}. @example ncra 85_0112.nc 85.nc ncwa -O -a time 85.nc 85.nc @end example @noindent The second command, @command{ncwa}, gets rid of the @code{time} dimension of @w{size 1} that @command{ncra} left in @file{85.nc}. Now none of the variables in @file{85.nc} has a @code{time} dimension. @w{A quicker} way to accomplish this is to use @command{ncwa} from the beginning: @example ncwa -a time 85_0112.nc 85.nc @end example @noindent We are now ready to use @command{ncbo} to compute the anomalies for 1985: @example ncdiff -v T 85_0112.nc 85.nc t_anm_85_0112.nc @end example @noindent Each of the 12 records in @file{t_anm_85_0112.nc} now contains the monthly deviation of @code{T} from the annual mean of @code{T} for each gridpoint. Say we wish to compute the monthly gridpoint anomalies from the zonal annual mean. @w{A @dfn{zonal mean}} is a quantity that has been averaged over the longitudinal (or @var{x}) direction. First we use @command{ncwa} to average over longitudinal direction @code{lon}, creating @file{85_x.nc}, the zonal mean of @file{85.nc}. Then we use @command{ncbo} to subtract the zonal annual means from the monthly gridpoint data: @example ncwa -a lon 85.nc 85_x.nc ncdiff 85_0112.nc 85_x.nc tx_anm_85_0112.nc @end example @noindent This examples works assuming @file{85_0112.nc} has dimensions @code{time} and @code{lon}, and that @file{85_x.nc} has no @code{time} or @code{lon} dimension. @cindex broadcasting groups Group broadcasting simplifies evaluation of multiple models against observations. Consider the input file @file{cmip5.nc} which contains multiple top-level groups @code{cesm}, @code{ecmwf}, and @code{giss}, each of which contains the surface air temperature field @code{tas}. We wish to compare these models to observations stored in @file{obs.nc} which contains @code{tas} only in its top-level (i.e., root) group. It is often the case that many models and/or model simulations exist, whereas only one observational dataset does. We evaluate the models and obtain the bias (difference) between models and observations by subtracting @file{obs.nc} from @file{cmip5.nc}. Then @command{ncbo} ``broadcasts'' (i.e., replicates) the observational data to match the group structure of @file{cmip5.nc}, subtracts, and then stores the results in the output file, @file{bias.nc} which has the same group structure as @file{cmip5.nc}. @example % ncbo -O cmip5.nc obs.nc bias.nc % ncks -H -v tas -d time,3 bias.nc /cesm/tas time[3] tas[3]=-1 /ecmwf/tas time[3] tas[3]=0 /giss/tas time[3] tas[3]=1 @end example @noindent @html @end html As a final example, say we have five years of monthly data (i.e., @w{60 months}) stored in @file{8501_8912.nc} and we wish to create a file which contains the twelve month seasonal cycle of the average monthly anomaly from the five-year mean of this data. The following method is just one permutation of many which will accomplish the same result. First use @command{ncwa} to create the five-year mean: @example ncwa -a time 8501_8912.nc 8589.nc @end example @noindent Next use @command{ncbo} to create a file containing the difference of each month's data from the five-year mean: @example ncbo 8501_8912.nc 8589.nc t_anm_8501_8912.nc @end example @noindent Now use @command{ncks} to group together the five January anomalies in one file, and use @command{ncra} to create the average anomaly for all five Januarys. These commands are embedded in a shell loop so they are repeated for all twelve months: @cindex Bash Shell @cindex Bourne Shell @cindex C Shell @example @verbatim for idx in {1..12}; do # Bash Shell (version 3.0+) idx=`printf "%02d" ${idx}` # Zero-pad to preserve order ncks -F -d time,${idx},,12 t_anm_8501_8912.nc foo.${idx} ncra foo.${idx} t_anm_8589_${idx}.nc done for idx in 01 02 03 04 05 06 07 08 09 10 11 12; do # Bourne Shell ncks -F -d time,${idx},,12 t_anm_8501_8912.nc foo.${idx} ncra foo.${idx} t_anm_8589_${idx}.nc done foreach idx (01 02 03 04 05 06 07 08 09 10 11 12) # C Shell ncks -F -d time,${idx},,12 t_anm_8501_8912.nc foo.${idx} ncra foo.${idx} t_anm_8589_${idx}.nc end @end verbatim @end example @noindent Note that @command{ncra} understands the @code{stride} argument so the two commands inside the loop may be combined into the single command @example @verbatim ncra -F -d time,${idx},,12 t_anm_8501_8912.nc foo.${idx} @end verbatim @end example @noindent Finally, use @command{ncrcat} to concatenate the @w{12 average} monthly anomaly files into one twelve-record file which contains the entire seasonal cycle of the monthly anomalies: @example ncrcat t_anm_8589_??.nc t_anm_8589_0112.nc @end example @noindent @page @html @end html @node nces netCDF Ensemble Statistics, ncecat netCDF Ensemble Concatenator, ncbo netCDF Binary Operator, Reference Manual @section @command{nces} netCDF Ensemble Statistics @cindex averaging data @cindex ensemble average @findex nces @noindent SYNTAX @example nces [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [-n @var{loop}] [--no_tmp_fl] [--nsm_fl|grp] [--nsm_sfx sfx] [-O] [-o @var{output-file}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [--rth_dbl|flt] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-X ...] [-x] [-y @var{op_typ}] [@var{input-files}] [@var{output-file}] @end example @noindent DESCRIPTION @command{nces} performs gridpoint statistics on variables across an arbitrary number (an @dfn{ensemble}) of @var{input-files} and/or of input groups within each file. Each file (or group) receives an equal weight. @command{nces} was formerly (until @acronym{NCO} version 4.3.9, released December, 2013) known as @command{ncea} (netCDF Ensemble Averager)@footnote{ The old ncea command was deprecated in @acronym{NCO} version 4.3.9, released December, 2013. @acronym{NCO} will attempt to maintain back-compatibility and work as expected with invocations of @command{ncea} for as long as possible. Please replace @command{ncea} by @command{nces} in all future work.}. @cindex ensemble For example, @command{nces} will average a set of files or groups, weighting each file or group evenly. This is distinct from @command{ncra}, which performs statistics only over the record dimension(s) (e.g., @var{time}), and weights each record in each record dimension evenly. The file or group is the logical unit of organization for the results of many scientific studies. Often one wishes to generate a file or group which is the statistical product (e.g., average) of many separate files or groups. This may be to reduce statistical noise by combining the results of a large number of experiments, or it may simply be a step in a procedure whose goal is to compute anomalies from a mean state. In any case, when one desires to generate a file whose statistical properties are equally influenced by all the inputs, then @command{nces} is the operator to use. Variables in the @var{output-file} are the same size as the variable hyperslab in each input file or group, and each input file or group must be the same size after hyperslabbing @footnote{As of @acronym{NCO} version 4.4.2 (released February, 2014) @command{nces} allows hyperslabs in all dimensions so long as the hyperslabs resolve to the same size. The fixed (i.e., non-record) dimensions should be the same size in all ensemble members both before and after hyperslabbing, although the hyperslabs may (and usually do) change the size of the dimensions from the input to the output files. Prior to this, @command{nces} was only guaranteed to work on hyperslabs in the record dimension that resolved to the same size.} @cindex record dimension @cindex hyperslab @command{nces} does allow files to differ in the record dimension size if the requested record hyperslab (@pxref{Hyperslabs}) resolves to the same size for all files. @command{nces} recomputes the record dimension hyperslab limits for each input file so that coordinate limits may be used to select equal length timeseries from unequal length files. @cindex @acronym{IPCC} @cindex @acronym{AR4} @cindex @acronym{CMIP} This simplifies analysis of unequal length timeseries from simulation ensembles (e.g., the @acronym{CMIP3} @acronym{IPCC} @acronym{AR4} archive). @html @end html @cindex @code{--nsm_fl} @cindex @code{--nsm_grp} @cindex @code{--ensemble_file} @cindex @code{--ensemble_group} @cindex @code{--nsm_sfx} @cindex @code{--ensemble_suffix} @command{nces} works in one of two modes, file ensembles or group ensembles. File ensembles are the default (equivalent to the old @command{ncea}) and may also be explicitly specified by the @samp{--nsm_fl} or @samp{--ensemble_file} switches. To perform statistics on ensembles of groups, a newer feature, use @samp{--nsm_grp} or @samp{--ensemble_group}. Members of a group ensemble are groups that share the same structure, parent group, and nesting level. Members must be @dfn{leaf groups}, i.e., not contain any sub-groups. Their contents usually have different values because they are realizations of replicated experiments. In group ensemble mode @command{nces} computes the statistics across the ensemble, which may span multiple input files. Files may contain members of multiple, distinct ensembles. However, all ensembles must have at least one member in the first input file. Group ensembles behave as an unlimited dimension of datasets: they may contain an arbitrary and extensible number of realizations in each file, and may be composed from multiple files. Output statistics in group ensemble mode are stored in the parent group by default. If the ensemble members are @file{/cesm/cesm_01} and @file{/cesm/cesm_02}, then the computed statistic will be in @file{/cesm} in the output file. The @samp{--nsm_sfx} option instructs nces to instead store output in a new child group of the parent created by attaching the suffix to the parent group's name, e.g., @samp{--nsm_sfx='_avg'} would store results in the output group @file{/cesm/cesm_avg}: @example nces --nsm_grp mdl1.nc mdl2.nc mdl3.nc out.nc nces --nsm_grp --nsm_sfx='_avg' mdl1.nc mdl2.nc mdl3.nc out.nc @end example @xref{Statistics vs. Concatenation}, for a description of the distinctions between the statistics tools and concatenators. @cindex multi-file operators @cindex standard input @cindex @code{stdin} As a multi-file operator, @command{nces} will read the list of @var{input-files} from @code{stdin} if they are not specified as positional arguments on the command line (@pxref{Large Numbers of Files}). Like @command{ncra} and @command{ncwa}, @command{nces} treats coordinate variables as a special case. Coordinate variables are assumed to be the same in all ensemble members, so @command{nces} simply copies the coordinate variables that appear in ensemble members directly to the output file. This has the same effect as averaging the coordinate variable across the ensemble, yet does not incur the time- or precision- penalties of actually averaging them. @command{ncra} and @command{ncwa} allow coordinate variables to be processed only by the linear average operation, regardless of the arithmetic operation type performed on the non-coordinate variables (@pxref{Operation Types}). Thus it can be said that the three operators (@command{ncra}, @command{ncwa}, and @command{nces}) all average coordinate variables (even though @command{nces} simply copies them). All other requested arithmetic operations (e.g., maximization, square-root, RMS) are applied only to non-coordinate variables. In these cases the linear average of the coordinate variable will be returned. @noindent @html @end html EXAMPLES Consider a model experiment which generated five realizations of one year of data, say 1985. Imagine that the experimenter slightly perturbs the initial conditions of the problem before generating each new solution. Assume each file contains all twelve months (a seasonal cycle) of data and we want to produce a single file containing the ensemble average (mean) seasonal cycle. Here the numeric filename suffix denotes the realization number (@emph{not} the month): @example nces 85_01.nc 85_02.nc 85_03.nc 85_04.nc 85_05.nc 85.nc nces 85_0[1-5].nc 85.nc nces -n 5,2,1 85_01.nc 85.nc @end example @noindent These three commands produce identical answers. @xref{Specifying Input Files}, for an explanation of the distinctions between these methods. The output file, @file{85.nc}, is the same size as the inputs files. It contains 12 months of data (which might or might not be stored in the record dimension, depending on the input files), but each value in the output file is the average of the five values in the input files. In the previous example, the user could have obtained the ensemble average values in a particular spatio-temporal region by adding a hyperslab argument to the command, e.g., @example nces -d time,0,2 -d lat,-23.5,23.5 85_??.nc 85.nc @end example @noindent In this case the output file would contain only three slices of data in the @var{time} dimension. These three slices are the average of the first three slices from the input files. Additionally, only data inside the tropics is included. As of @acronym{NCO} version 4.3.9 (released December, 2013) @command{nces} also works with groups (rather than files) as the fundamental unit of the ensemble. Consider two ensembles, @code{/ecmwf} and @code{/cesm} stored across three input files @file{mdl1.nc}, @file{mdl2.nc}, and @file{mdl3.nc}. Ensemble members would be leaf groups with names like @code{/ecmwf/01}, @code{/ecmwf/02} etc. and @code{/cesm/01}, @code{/cesm/02}, etc. These commands average both ensembles: @example nces --nsm_grp mdl1.nc mdl2.nc mdl3.nc out.nc nces --nsm_grp --nsm_sfx='_min' --op_typ=min -n 3,1,1 mdl1.nc out.nc nces --nsm_grp -g cesm -v tas -d time,0,3 -n 3,1,1 mdl1.nc out.nc @end example The first command stores averages in the output groups @file{/cesm} and @file{/ecmwf}, while the second stores minima in the output groups @file{/cesm/cesm_min} and @file{/ecmwf/ecmwf_min}: The third command demonstrates that sub-setting and hyperslabbing work as expected. Note that each input file may contain different numbers of members of each ensemble, as long as all distinct ensembles contain at least one member in the first file. @page @html @end html @node ncecat netCDF Ensemble Concatenator, ncflint netCDF File Interpolator, nces netCDF Ensemble Statistics, Reference Manual @section @command{ncecat} netCDF Ensemble Concatenator @cindex concatenation @cindex ensemble concatenation @findex ncecat @noindent SYNTAX @example ncecat [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--gag] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [-M] [--md5_digest] [--mrd] [-n @var{loop}] [--no_tmp_fl] [-O] [-o @var{output-file}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [-t @var{thr_nbr}] [-u @var{ulm_nm}] [--unn] [-v @var{var}[,@dots{}]] [-X ...] [-x] [@var{input-files}] [@var{output-file}] @end example @noindent DESCRIPTION @command{ncecat} aggregates an arbitrary number of input files into a single output file using using one of two methods. @dfn{Record AGgregation} (@acronym{RAG}), the traditional method employed on (flat) netCDF3 files and still the default method, stores @var{input-files} as consecutive records in the @var{output-file}. @dfn{Group AGgregation} (@acronym{GAG}) stores @var{input-files} as top-level groups in the netCDF4 @var{output-file}. Record Aggregation (@acronym{RAG}) makes numerous assumptions about the structure of input files whereas Group Aggregation (@acronym{GAG}) makes none. Both methods are described in detail below. Since @command{ncecat} aggregates all the contents of the input files, it can easily produce large output files so it is often helpful to invoke subsetting simultaneously (@pxref{Subsetting Files}). @html @end html @cindex record aggregation @cindex @acronym{RAG} @acronym{RAG} makes each variable (except coordinate variables) in each input file into a single record of the same variable in the output file. Coordinate variables are not concatenated, they are instead simply copied from the first input file to the @var{output-file}. All @var{input-files} must contain all extracted variables (or else there would be ``gaps'' in the output file). A new record dimension is the glue which binds together the input file data. The new record dimension is defined in the root group of the output file so it is visible to all sub-groups. Its name is, by default, ``record''. @cindex unlimited dimension @cindex record dimension @cindex @samp{-u @var{ulm_nm}} @cindex @samp{--ulm_nm @var{ulm_nm}} @cindex @samp{--rcd_nm @var{ulm_nm}} This default name can be overridden with the @samp{-u @var{ulm_nm}} short option (or the @samp{--ulm_nm} or @samp{rcd_nm} long options). Each extracted variable must be constant in size and rank across all @var{input-files}. @cindex record dimension @cindex hyperslab The only exception is that @command{ncecat} allows files to differ in the record dimension size if the requested record hyperslab (@pxref{Hyperslabs}) resolves to the same size for all files. @cindex @acronym{CMIP} This allows easier gluing/averaging of unequal length timeseries from simulation ensembles (e.g., the @acronym{CMIP} rchive). @cindex fixed dimension @cindex fix record dimension Classic (i.e., all netCDF3 and @code{NETCDF4_CLASSIC}) output files can contain only one record dimension. @command{ncecat} makes room for the new glue record dimension by changing the pre-existing record dimension, if any, in the input files into a fixed dimension in the output file. netCDF4 output files may contain any number of record dimensions, so @command{ncecat} need not and does not alter the record dimensions, if any, of the input files as it copies them to the output file. @html @end html @cindex group aggregation @cindex @acronym{GAG} @dfn{Group AGgregation} (@acronym{GAG}) stores @var{input-files} as top-level groups in the @var{output-file}. No assumption is made about the size or shape or type of a given object (variable or dimension or group) in the input file. The entire contents of the extracted portion of each input file is placed in its own top-level group in @var{output-file}, which is automatically made as a netCDF4-format file. @cindex @option{--gag} @acronym{GAG} has two methods to specify group names for the @var{output-file}. The @samp{-G} option, or its long-option equivalent @samp{--gpe}, takes as argument a group path editing description @var{gpe_dsc} of where to place the results. Each input file needs a distinct output group name to avoid namespace conflicts in the @var{output-file}. Hence @command{ncecat} automatically creates unique output group names based on either the input filenames or the @var{gpe_dsc} arguments. When the user provides @var{gpe_dsc} (i.e., with @samp{-G}), then the output groups are formed by enumerating sequential two-digit numeric suffixes starting with zero, and appending them to the specified group path (@pxref{Group Path Editing}). When @var{gpe_dsc} is not provided (i.e., user requests @acronym{GAG} with @samp{--gag} instead of @samp{-G}), then @command{ncecat} forms the output groups by stripping the input file name of any type-suffix (e.g., @code{.nc}), and all but the final component of the full filename. @example ncecat --gag 85.nc 86.nc 87.nc 8587.nc # Output groups 85, 86, 87 ncecat -G 85_ a.nc b.nc c.nc 8589.nc # Output groups 85_00, 85_01, 85_02 ncecat -G 85/ a.nc b.nc c.nc 8589.nc # Output groups 85/00, 85/01, 85/02 @end example With both @acronym{RAG} and @acronym{GAG} the @var{output-file} size is the sum of the sizes of the extracted variables in the input files. @xref{Statistics vs. Concatenation}, for a description of the distinctions between the various statistics tools and concatenators. @cindex multi-file operators @cindex standard input @cindex @code{stdin} As a multi-file operator, @command{ncecat} will read the list of @var{input-files} from @code{stdin} if they are not specified as positional arguments on the command line (@pxref{Large Numbers of Files}). @cindex @code{-M} @cindex @code{--no_glb_mtd} @cindex @code{--suppress_global_metadata} @cindex @code{history} @cindex provenance @cindex metadata, global Suppress global metadata copying. By default @acronym{NCO}'s multi-file operators copy the global metadata from the first input file into @var{output-file}. This helps to preserve the provenance of the output data. However, the use of metadata is burgeoning and sometimes one encounters files with excessive amounts of extraneous metadata. Extracting small bits of data from such files leads to output files which are much larger than necessary due to the automatically copied metadata. @command{ncecat} supports turning off the default copying of global metadata via the @samp{-M} switch (or its long option equivalents, @samp{--no_glb_mtd} and @samp{--suppress_global_metadata}). @cindex climate model Consider five realizations, @file{85a.nc}, @file{85b.nc}, @w{@dots{} @file{85e.nc}} of 1985 predictions from the same climate model. Then @code{ncecat 85?.nc 85_ens.nc} glues together the individual realizations into the single file, @file{85_ens.nc}. If an input variable was dimensioned [@code{lat},@code{lon}], it will by default have dimensions [@code{record},@code{lat},@code{lon}] in the output file. @w{A restriction} of @command{ncecat} is that the hyperslabs of the processed variables must be the same from file to file. Normally this means all the input files are the same size, and contain data on different realizations of the same variables. @findex ncpdq @cindex packing @cindex unpacking @cindex @code{add_offset} @cindex @code{scale_factor} Concatenating a variable packed with different scales across multiple datasets is beyond the capabilities of @command{ncecat} (and @command{ncrcat}, the other concatenator (@ref{Concatenation}). @command{ncecat} does not unpack data, it simply @emph{copies} the data from the @var{input-files}, and the metadata from the @emph{first} @var{input-file}, to the @var{output-file}. This means that data compressed with a packing convention must use the identical packing parameters (e.g., @code{scale_factor} and @code{add_offset}) for a given variable across @emph{all} input files. Otherwise the concatenated dataset will not unpack correctly. The workaround for cases where the packing parameters differ across @var{input-files} requires three steps: First, unpack the data using @command{ncpdq}. Second, concatenate the unpacked data using @command{ncecat}, Third, re-pack the result with @command{ncpdq}. @noindent @html @end html EXAMPLES Consider a model experiment which generated five realizations of one year of data, say 1985. You can imagine that the experimenter slightly perturbs the initial conditions of the problem before generating each new solution. Assume each file contains all twelve months (a seasonal cycle) of data and we want to produce a single file containing all the seasonal cycles. Here the numeric filename suffix denotes the experiment number (@emph{not} the month): @example ncecat 85_01.nc 85_02.nc 85_03.nc 85_04.nc 85_05.nc 85.nc ncecat 85_0[1-5].nc 85.nc ncecat -n 5,2,1 85_01.nc 85.nc @end example @noindent These three commands produce identical answers. @xref{Specifying Input Files}, for an explanation of the distinctions between these methods. The output file, @file{85.nc}, is five times the size as a single @var{input-file}. It contains @w{60 months} of data. @html @end html One often prefers that the (new) record dimension have a more descriptive, context-based name than simply ``record''. This is easily accomplished with the @samp{-u @var{ulm_nm}} switch: @example ncecat -u realization 85_0[1-5].nc 85.nc @end example @noindent Users are more likely to understand the data processing history when such descriptive coordinates are used. @html @end html @cindex record dimension @cindex fixed dimension @cindex fix record dimension @cindex @code{--mk_rec_dmn @var{dim}} Consider a file with an existing record dimension named @code{time}. and suppose the user wishes to convert @code{time} from a record dimension to a non-record dimension. This may be useful, for example, when the user has another use for the record variable. The simplest method is to use @samp{ncks --fix_rec_dmn} but another possibility is to use @command{ncecat} followed by @command{ncwa}: @cindex degenerate dimension @example ncecat in.nc out.nc # Convert time to non-record dimension ncwa -a record in.nc out.nc # Remove new degenerate record dimension @end example @noindent The second step removes the degenerate record dimension. See @ref{ncpdq netCDF Permute Dimensions Quickly} and @ref{ncks netCDF Kitchen Sink} for other methods of of changing variable dimensionality, including the record dimension. @page @html @end html @node ncflint netCDF File Interpolator, ncks netCDF Kitchen Sink, ncecat netCDF Ensemble Concatenator, Reference Manual @section @command{ncflint} netCDF File Interpolator @cindex interpolation @cindex adding data @cindex multiplying data @cindex addition @findex ncflint @noindent SYNTAX @example ncflint [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [--fix_rec_crd] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}] [-i @var{var},@var{val3}] [-L @var{dfl_lvl}] [-l @var{path}] [--no_tmp_fl] [-O] [-o @var{file_3}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-w @var{wgt1}[,@var{wgt2}]] [-X ...] [-x] @var{file_1} @var{file_2} [@var{file_3}] @end example @noindent DESCRIPTION @command{ncflint} creates an output file that is a linear combination of the input files. This linear combination is a weighted average, a normalized weighted average, or an interpolation of the input files. Coordinate variables are not acted upon in any case, they are simply copied from @var{file_1}. There are two conceptually distinct methods of using @command{ncflint}. The first method is to specify the weight each input file contributes to the output file. In this method, the value @var{val3} of a variable in the output file @var{file_3} is determined from its values @var{val1} and @var{val2} in the two input files according to @set flg @tex $val3 = wgt1 \times val1 + wgt2 \times val2$ @clear flg @end tex @ifinfo @math{@var{val3} = @var{wgt1}*@var{val1} + @var{wgt2}*@var{val2}} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{val3} = @var{wgt1}*@var{val1} + @var{wgt2}*@var{val2} @clear flg @end ifset . Here at least @var{wgt1}, and, optionally, @var{wgt2}, are specified on the command line with the @samp{-w} (or @samp{--weight} or @samp{--wgt_var}) switch. @cindex @code{-w @var{wgt1}[,@var{wgt2}]} @cindex @code{--weight @var{wgt1}[,@var{wgt2}]} @cindex @code{--wgt_var @var{wgt1}[,@var{wgt2}]} If only @var{wgt1} is specified then @var{wgt2} is automatically computed as @math{@var{wgt2} = 1 @minus{} @var{wgt1}}. Note that weights larger @w{than 1} are allowed. Thus it is possible to specify @math{@var{wgt1} = 2} and @math{@var{wgt2} = -3}. One can use this functionality to multiply all the values in a given file by a constant. The second method of using @command{ncflint} is to specify the interpolation option @w{with @samp{-i}} (or with the @samp{--ntp} or @samp{--interpolate} long options). This is the inverse of the first method in the following sense: When the user specifies the weights directly, @command{ncflint} has no work to do besides multiplying the input values by their respective weights and adding together the results to produce the output values. It makes sense to use this when the weights are known @emph{@w{a priori}}. @cindex arrival value Another class of problems has the @dfn{arrival value} (i.e., @var{val3}) of a particular variable @var{var} known @emph{@w{a priori}}. In this case, the implied weights can always be inferred by examining the values of @var{var} in the input files. This results in one equation in two unknowns, @var{wgt1} and @var{wgt2}: @set flg @tex $val3 = wgt1 \times val1 + wgt2 \times val2$ @clear flg @end tex @ifinfo @math{@var{val3} = @var{wgt1}*@var{val1} + @var{wgt2}*@var{val2}} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{val3} = @var{wgt1}*@var{val1} + @var{wgt2}*@var{val2} @clear flg @end ifset . Unique determination of the weights requires imposing the additional constraint of normalization on the weights: @math{@var{wgt1} + @var{wgt2} = 1}. Thus, to use the interpolation option, the user specifies @var{var} and @var{val3} with the @samp{-i} option. @command{ncflint} then computes @var{wgt1} and @var{wgt2}, and uses these weights on all variables to generate the output file. Although @var{var} may have any number of dimensions in the input files, it must represent a single, scalar value. @cindex degenerate dimension Thus any dimensions associated with @var{var} must be @dfn{degenerate}, i.e., of size one. If neither @samp{-i} nor @samp{-w} is specified on the command line, @command{ncflint} defaults to weighting each input file equally in the output file. This is equivalent to specifying @samp{-w 0.5} or @samp{-w 0.5,0.5}. Attempting to specify both @samp{-i} and @samp{-w} methods in the same command is an error. @command{ncflint} does not interpolate variables of type @code{NC_CHAR} and @code{NC_STRING}. This behavior is hardcoded. By default @command{ncflint} interpolates or multiplies record coordinate variables (e.g., time is often stored as a record coordinate) not other coordinate variables (e.g., latitude and longitude). This is because @command{ncflint} is often used to time-interpolate between existing files, but is rarely used to spatially interpolate. Sometimes however, users wish to multiply entire files by a constant that does not multiply any coordinate variables. The @samp{--fix_rec_crd} switch was implemented for this purpose in @acronym{NCO} version 4.2.6 (March, 2013). It prevents @command{ncflint} from multiplying or interpolating any coordinate variables, including record coordinate variables. @cindex missing values @cindex @code{_FillValue} Depending on your intuition, @command{ncflint} may treat missing values unexpectedly. Consider a point where the value in one input file, say @var{val1}, equals the missing value @var{mss_val_1} and, at the same point, the corresponding value in the other input file @var{val2} is not misssing (i.e., does not equal @var{mss_val_2}). There are three plausible answers, and this creates ambiguity. @w{Option one} is to set @math{@var{val3} = @var{mss_val_1}}. The rationale is that @command{ncflint} is, at heart, an interpolator and interpolation involving a missing value is intrinsically undefined. @command{ncflint} currently implements this behavior since it is the most conservative and least likely to lead to misinterpretation. @w{Option two} is to output the weighted valid data point, i.e., @set flg @tex $val3 = wgt2 \times val2$ @clear flg @end tex @ifinfo @math{@var{val3} = @var{wgt2}*@var{val2}} @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{val3} = @var{wgt2}*@var{val2} @clear flg @end ifset . The rationale for this behavior is that interpolation is really a weighted average of known points, so @command{ncflint} should weight the valid point. @w{Option three} is to return the @emph{unweighted} valid point, i.e., @math{@var{val3} = @var{val2}}. This behavior would appeal to those who use @command{ncflint} to estimate data using the closest available data. When a point is not bracketed by valid data on both sides, it is better to return the known datum than no datum at all. The current implementation uses the first approach, @w{Option one}. If you have strong opinions on this matter, let us know, since we are willing to implement the other approaches as options if there is enough interest. @noindent @html @end html EXAMPLES Although it has other uses, the interpolation feature was designed to interpolate @var{file_3} to a time between existing files. Consider input files @file{85.nc} and @file{87.nc} containing variables describing the state of a physical system at times @math{@code{time} = 85} and @math{@code{time} = 87}. Assume each file contains its timestamp in the scalar variable @code{time}. Then, to linearly interpolate to a file @file{86.nc} which describes the state of the system at time at @code{time} = 86, we would use @example ncflint -i time,86 85.nc 87.nc 86.nc @end example Say you have observational data covering January and April 1985 in two files named @file{85_01.nc} and @file{85_04.nc}, respectively. Then you can estimate the values for February and March by interpolating the existing data as follows. Combine @file{85_01.nc} and @file{85_04.nc} in a 2:1 ratio to make @file{85_02.nc}: @example ncflint -w 0.667 85_01.nc 85_04.nc 85_02.nc ncflint -w 0.667,0.333 85_01.nc 85_04.nc 85_02.nc @end example Multiply @file{85.nc} @w{by 3} and @w{by @minus{}2} and add them together to make @file{tst.nc}: @example ncflint -w 3,-2 85.nc 85.nc tst.nc @end example @noindent @cindex null operation This is an example of a null operation, so @file{tst.nc} should be identical (within machine precision) to @file{85.nc}. @cindex multiplication @cindex file multiplication @cindex scaling Multiply all the variables except the coordinate variables in the file @file{emissions.nc} by @w{by 0.8}: @example ncflint --fix_rec_crd -w 0.8,0.0 emissions.nc emissions.nc scaled_emissions.nc @end example @noindent The use of @samp{--fix_rec_crd} ensures, e.g., that the @code{time} coordinate, if any, is not scaled (i.e., multiplied). Add @file{85.nc} to @file{86.nc} to obtain @file{85p86.nc}, then subtract @file{86.nc} from @file{85.nc} to obtain @file{85m86.nc} @example ncflint -w 1,1 85.nc 86.nc 85p86.nc ncflint -w 1,-1 85.nc 86.nc 85m86.nc ncdiff 85.nc 86.nc 85m86.nc @end example @noindent Thus @command{ncflint} can be used to mimic some @command{ncbo} operations. @cindex broadcasting variables However this is not a good idea in practice because @command{ncflint} does not broadcast (@pxref{ncbo netCDF Binary Operator}) conforming variables during arithmetic. Thus the final two commands would produce identical results except that @command{ncflint} would fail if any variables needed to be broadcast. @cindex @code{units} Rescale the dimensional units of the surface pressure @code{prs_sfc} from Pascals to hectopascals (millibars) @example ncflint -C -v prs_sfc -w 0.01,0.0 in.nc in.nc out.nc ncatted -a units,prs_sfc,o,c,millibar out.nc @end example @noindent @page @html @end html @node ncks netCDF Kitchen Sink, ncpdq netCDF Permute Dimensions Quickly, ncflint netCDF File Interpolator, Reference Manual @section @command{ncks} netCDF Kitchen Sink @cindex kitchen sink @cindex printing files contents @cindex printing variables @findex ncks @noindent SYNTAX @example ncks [-3] [-4] [-5] [-6] [-7] [-A] [-a] [-b @var{binary-file}] [-C] [-c] [--cdl] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [--fix_rec_dmn @var{dim}] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [--grp_xtr_var_xcl] [-H] [-h] [--hdn] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [-M] [-m] [--map @var{map-file}] [--md5] [--mk_rec_dmn @var{dim}] [--no_blank] [--no_tmp_fl] [-O] [-o @var{output-file}] [-P] [-p @var{path}] [--ppc ...] [-Q] [-q] [-R] [-r] [--rad] [--ram_all] [--rgr ...] [--rnr=wgt] [-s @var{format}] [-u] [--unn] [-V] [-v @var{var}[,@dots{}]] [-X ...] [-x] [--xml] @var{input-file} [[@var{output-file}]] @end example @noindent DESCRIPTION @cindex @command{ncextr} The nickname ``kitchen sink'' is a catch-all because @command{ncks} combines most features of @command{ncdump} and @command{nccopy} with extra features to extract, hyperslab, multi-slab, sub-set, and translate into one versatile utility. @command{ncks} extracts (a subset of the) data from @var{input-file}, regrids it according to @var{map-file} if specified, then writes in netCDF format to @var{output-file}, and optionally writes it in flat binary format to @file{binary-file}, and optionally prints it to screen. @command{ncks} prints netCDF input data in @acronym{ASCII}, @acronym{CDL}, or @acronym{NcML} text formats @code{stdout}, like (an extended version of) @command{ncdump}. By default @command{ncks} prints data in a tabular format intended to be easy to search for the data you want, one datum per screen line, with all dimension subscripts and coordinate values (if any) preceding the datum. Option @samp{-s} (or long options @samp{--sng_fmt} and @samp{--string}) permits the user to format data using C-style format strings, while option @samp{--cdl} outputs @acronym{CDL} and option @samp{--xml} outputs @acronym{NcML}. @command{ncks} exposes many flexible controls over printed output, including @acronym{CDL} and @acronym{NcML}. Options @samp{-5}, @samp{-a}, @samp{--cdl}, @samp{-F} , @samp{-H}, @samp{--hdn}, @samp{-M}, @samp{-m}, @samp{-P}, @samp{-Q}, @samp{-q}, @samp{-s}, @samp{-u}, @samp{-V}, and @samp{--xml} (and their long option counterparts) control the formatted appearance of the data. @cindex global attributes @cindex attributes, global @command{ncks} extracts (and optionally creates a new netCDF file comprised of) only selected variables from the input file (similar to the old @command{ncextr} specification). Only variables and coordinates may be specifically included or excluded---all global attributes and any attribute associated with an extracted variable are copied to the screen and/or output netCDF file. Options @samp{-c}, @samp{-C}, @samp{-v}, and @samp{-x} (and their long option synonyms) control which variables are extracted. @command{ncks} extracts hyperslabs from the specified variables (@command{ncks} implements the original @command{nccut} specification). Option @samp{-d} controls the hyperslab specification. Input dimensions that are not associated with any output variable do not appear in the output netCDF. This feature removes superfluous dimensions from netCDF files. @cindex appending data @cindex merging files @command{ncks} will append variables and attributes from the @var{input-file} to @var{output-file} if @var{output-file} is a pre-existing netCDF file whose relevant dimensions conform to dimension sizes of @var{input-file}. The append features of @command{ncks} are intended to provide a rudimentary means of adding data from one netCDF file to another, conforming, netCDF file. If naming conflicts exist between the two files, data in @var{output-file} is usually overwritten by the corresponding data from @var{input-file}. Thus, when appending, the user should backup @var{output-file} in case valuable data are inadvertantly overwritten. If @var{output-file} exists, the user will be queried whether to @dfn{overwrite}, @dfn{append}, or @dfn{exit} the @command{ncks} call completely. Choosing @dfn{overwrite} destroys the existing @var{output-file} and create an entirely new one from the output of the @command{ncks} call. Append has differing effects depending on the uniqueness of the variables and attributes output by @command{ncks}: If a variable or attribute extracted from @var{input-file} does not have a name conflict with the members of @var{output-file} then it will be added to @var{output-file} without overwriting any of the existing contents of @var{output-file}. In this case the relevant dimensions must agree (conform) between the two files; new dimensions are created in @var{output-file} as required. @cindex global attributes @cindex attributes, global When a name conflict occurs, a global attribute from @var{input-file} will overwrite the corresponding global attribute from @var{output-file}. If the name conflict occurs for a non-record variable, then the dimensions and type of the variable (and of its coordinate dimensions, if any) must agree (conform) in both files. Then the variable values (and any coordinate dimension values) from @var{input-file} will overwrite the corresponding variable values (and coordinate dimension values, if any) in @var{output-file} @footnote{ Those familiar with netCDF mechanics might wish to know what is happening here: @command{ncks} does not attempt to redefine the variable in @var{output-file} to match its definition in @var{input-file}, @command{ncks} merely copies the values of the variable and its coordinate dimensions, if any, from @var{input-file} to @var{output-file}. }. Since there can only be one record dimension in a file, the record dimension must have the same name (though not necessarily the same size) in both files if a record dimension variable is to be appended. If the record dimensions are of differing sizes, the record dimension of @var{output-file} will become the greater of the two record dimension sizes, the record variable from @var{input-file} will overwrite any counterpart in @var{output-file} and fill values will be written to any gaps left in the rest of the record variables (I think). In all cases variable attributes in @var{output-file} are superseded by attributes of the same name from @var{input-file}, and left alone if there is no name conflict. Some users may wish to avoid interactive @command{ncks} queries about whether to overwrite existing data. For example, batch scripts will fail if @command{ncks} does not receive responses to its queries. Options @samp{-O} and @samp{-A} are available to force overwriting existing files and variables, respectively. @unnumberedsubsec Options specific to @command{ncks} The following summarizes features unique to @command{ncks}. Features common to many operators are described in @ref{Shared features}. @table @samp @html @end html @cindex @code{-5} @item -5 Print data to screen alphabetically by group, and alphabetically by variable within each group. This ordering here is used by default in @acronym{CDL}-mode printing, and may be selected for traditional mode printing with @samp{-5} (The switch for invocation may change to something more descriptive in the future). @html @end html @cindex alphabetization @cindex sort alphabetically @cindex @code{-a} @cindex @code{--abc} @cindex @code{--alphabetize} @item -a Do not alphabetize extracted fields. By default, the specified output variables are extracted, printed, and written to disk in alphabetical order. This tends to make long output lists easier to search for particular variables. Specifying @code{-a} results in the variables being extracted, printed, and written to disk in the order in which they were saved in the input file. Thus @code{-a} retains the original ordering of the variables. Also @samp{--abc} and @samp{--alphabetize}. @html @end html @cindex binary format @cindex @code{-b} @cindex @code{--fl_bnr} @cindex @code{--bnr} @cindex @code{--binary} @item -b @file{file} Activate native machine binary output writing to binary file @file{file}. Also @samp{--fl_bnr} and @samp{--binary-file}. Writing packed variables in binary format is not supported. Metadata is never output to the binary file. Examine the netCDF output file to see the variables in the binary file. Use the @samp{-C} switch, if necessary, to avoid wanting unwanted coordinates to the binary file: @example % ncks -O -v one_dmn_rec_var -b ~/bnr.dat -p ~/nco/data in.nc ~/out.nc % ls -l ~/bnr.dat | cut -d ' ' -f 5 # 200 B contains time and one_dmn_rec_var 200 % ls -l ~/bnr.dat % ncks -C -O -v one_dmn_rec_var -b ~/bnr.dat -p ~/nco/data in.nc ~/out.nc % ls -l ~/bnr.dat | cut -d ' ' -f # 40 B contains one_dmn_rec_var only 40 @end example @html @end html @cindex record dimension @cindex fixed dimension @cindex @code{--fix_rec_dmn @var{dim}} @cindex @code{--no_rec_dmn @var{dim}} @item --fix_rec_dmn Change record dimension @var{dim} in the input file into a fixed dimension in the output file. Also @samp{--no_rec_dmn}. Before @acronym{NCO} version 4.2.5 (January, 2013), the syntax for @code{--fix_rec_dmn} did not permit or require the specification of the dimension name @var{dim}. This is because the feature only worked on netCDF3 files, which support only one record dimension, so specifying its name was not necessary. netCDF4 files allow an arbitrary number of record dimensions, so the user must specify which record dimension to fix. The decision was made that starting with @acronym{NCO} version 4.2.5 (January, 2013), it is always required to specify the dimension name to fix regardless of the netCDF file type. This keeps the code simple, and is symmetric with the syntax for @code{--mk_rec_dmn}, described next. As of @acronym{NCO} version 4.4.0 (January, 2014), the argument @code{all} may be given to @samp{--fix_rec_dmn} to convert @emph{all} record dimensions to fixed dimensions in the output file. Previously, @samp{--fix_rec_dmn} only allowed one option, the name of a single record dimension to be fixed. Now it is simple to simultaneously fix all record dimensions. This is useful (and nearly mandatory) when flattening netCDF4 files that have multiple record dimensions per group into netCDF3 files (which are limited to at most one record dimension) (@pxref{Group Path Editing}). @html @end html @cindex hidden attributes @cindex special attributes @cindex @code{--hdn} @cindex @code{--hidden} @cindex @code{_SOURCE_FORMAT} @cindex @code{_Format} @cindex @code{_DeflateLevel} @cindex @code{_Shuffle} @cindex @code{_Storage} @cindex @code{_ChunkSizes} @cindex @code{_Endianness} @cindex @code{_Fletcher32} @cindex @code{_NOFILL} As of @acronym{NCO} version 4.4.0 (January, 2014), the @samp{--hdn} or @samp{--hidden} options print hidden (aka special) attributes. This is equivalent to @samp{ncdump -s}. Hidden attributes include: @code{_Format}, @code{_DeflateLevel}, @code{_Shuffle}, @code{_Storage}, @code{_ChunkSizes}, @code{_Endianness}, @code{_Fletcher32}, and @code{_NOFILL}. Previously @command{ncks} ignored all these attributes in @acronym{CDL}/@acronym{XML} modes. Now it prints these attributes as appropriate. As of @acronym{NCO} version 4.4.6 (September, 2014), @samp{--hdn} also prints the extended file format (i.e., the format of the file or server supplying the data) as @code{_SOURCE_FORMAT}. Users are referred to the @uref{http://www.unidata.ucar.edu/software/netcdf/docs, Unidata netCDF Documentation}, or the man pages for @command{ncgen} or @command{ncdump}, for detailed descriptions of the meanings of these attributes. @html @end html @cindex @command{hdp} @cindex @command{ncgen} @cindex @command{ncgen-hdf} @cindex @command{hncgen} @cindex @command{ncdump} @cindex @code{--cdl} @cindex @acronym{CDL} @cindex @acronym{HDF} @cindex @acronym{HDF4} @item --cdl As of @acronym{NCO} version 4.3.3 (July, 2013), @command{ncks} can print extracted data and metadata to screen (i.e., @code{stdout}) as valid @acronym{CDL} (network Common data form Description Language). @acronym{CDL} is the human-readable ``lingua franca'' of netCDF ingested by @command{ncgen} and excreted by @command{ncdump}. Compare @command{ncks} ``traditional'' with @acronym{CDL} printing: @example @verbatim zender@roulee:~$ ncks -v one ~/nco/data/in.nc one: type NC_FLOAT, 0 dimensions, 1 attribute, chunked? no, compressed? no, packed? no one size (RAM) = 1*sizeof(NC_FLOAT) = 1*4 = 4 bytes one attribute 0: long_name, size = 3 NC_CHAR, value = one one = 1 zender@roulee:~$ ncks --cdl -v one ~/nco/data/in.nc netcdf in { variables: float one ; one:long_name = "one" ; data: one = 1 ; } // group / @end verbatim @end example @command{ncgen} converts @acronym{CDL}-mode output into a netCDF file: @example ncks --cdl -v one ~/nco/data/in.nc > ~/in.cdl ncgen -k netCDF-4 -b -o ~/in.nc ~/in.cdl ncks -v one ~/in.nc @end example The @acronym{HDF} version of @command{ncgen}, often named @command{hncgen} or @command{ncgen-hdf}, converts netCDF3 @acronym{CDL} into an @acronym{HDF} file: @example /usr/hdf4/bin/ncgen -b -o ~/in.hdf ~/in.cdl # HDF ncgen (local builds) /usr/bin/hncgen -b -o ~/in.hdf ~/in.cdl # Same as HDF ncgen (RPM packages?) /usr/bin/ncgen-hdf -b -o ~/in.hdf ~/in.cdl # Same as HDF ncgen (Debian packages?) hdp dumpsds ~/in.hdf # ncdump/h5dump-equivalent for HDF4 @end example Note that @acronym{HDF4} does not support netCDF-style groups, so the above commands fail when the input file contains groups. Only netCDF4 and @acronym{HDF5} support groups. In our experience the @acronym{HDF} @command{ncgen} command, by whatever name installed, is not robust and can fail on valid netCDF3 @acronym{CDL}. @html @end html @cindex record dimension @cindex fixed dimension @cindex fix record dimension @cindex @code{--mk_rec_dmn @var{dim}} @item --mk_rec_dmn @var{dim} Change existing dimension @var{dim} to a record dimension in the output file. This is the most straightforward way of changing a dimension to a/the record dimension, and works fine in most cases. See @ref{ncecat netCDF Ensemble Concatenator} and @ref{ncpdq netCDF Permute Dimensions Quickly} for other methods of changing variable dimensionality, including the record dimension. @html @end html @cindex @code{-H} @cindex @code{--data} @cindex @code{--hieronymus} @item -H Turn-on printing to screen or turn-off copying data (not metadata). Also activated using @samp{--print} or @samp{--prn}. By default @command{ncks} prints all metadata and data to screen if no netCDF output file is specified. Use @samp{-H} to print data to screen if a netCDF output is specified, or to restrict printing to data (no metadata) when no netCDF output is specified. Also use @samp{-H} to turn-off copying data (not metadata) to an output file. Unless otherwise specified (with @code{-s}), each element of the data hyperslab prints on a separate line containing the names, indices, and, values, if any, of all of the variables dimensions. The dimension and variable indices refer to the location of the corresponding data element with respect to the variable as stored on disk (i.e., not the hyperslab). @example % ncks -C -v three_dmn_var in.nc lat[0]=-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 lat[0]=-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 lat[0]=-90 lev[0]=100 lon[2]=180 three_dmn_var[2]=2 ... lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 @end example Printing the same variable with the @samp{-F} option shows the same variable indexed with Fortran conventions @example % ncks -F -C -v three_dmn_var in.nc lon(1)=0 lev(1)=100 lat(1)=-90 three_dmn_var(1)=0 lon(2)=90 lev(1)=100 lat(1)=-90 three_dmn_var(2)=1 lon(3)=180 lev(1)=100 lat(1)=-90 three_dmn_var(3)=2 ... @end example Printing a hyperslab does not affect the variable or dimension indices since these indices are relative to the full variable (as stored in the input file), and the input file has not changed. However, if the hyperslab is saved to an output file and those values are printed, the indices will change: @c fxm: replace with new MSA output style @example % ncks -H -d lat,90.0 -d lev,1000.0 -v three_dmn_var in.nc out.nc ... lat[1]=90 lev[2]=1000 lon[0]=0 three_dmn_var[20]=20 lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 % ncks -C -v three_dmn_var out.nc lat[0]=90 lev[0]=1000 lon[0]=0 three_dmn_var[0]=20 lat[0]=90 lev[0]=1000 lon[1]=90 three_dmn_var[1]=21 lat[0]=90 lev[0]=1000 lon[2]=180 three_dmn_var[2]=22 lat[0]=90 lev[0]=1000 lon[3]=270 three_dmn_var[3]=23 @end example @html @end html @cindex @code{-M} @cindex @code{--Mtd} @cindex @code{--Metadata} @cindex metadata, global @item -M Turn-on printing to screen or turn-off copying global and group metadata. This includes file summary information and global and group attributes. Also @samp{--Mtd} and @samp{--Metadata}. By default @command{ncks} prints global metadata to screen if no netCDF output file and no variable extraction list is specified (with @samp{-v}). Use @samp{-M} to print global metadata to screen if a netCDF output is specified, or if a variable extraction list is specified (with @samp{-v}). Use @samp{-M} to turn-off copying of global and group metadata when copying, subsetting, or appending to an output file. @html @end html The various combinations of printing switches can be confusing. In an attempt to anticipate what most users want to do, @command{ncks} uses context-sensitive defaults for printing. Our goal is to minimize the use of switches required to accomplish the common operations. We assume that users creating a new file or overwriting (e.g., with @samp{-O}) an existing file usually wish to copy all global and variable-specific attributes to the new file. In contrast, we assume that users appending (e.g., with @samp{-A} an explicit variable list from one file to another usually wish to copy only the variable-specific attributes to the output file. The switches @samp{-H}, @samp{-M}, and @samp{-m} switches are implemented as toggles which reverse the default behavior. The most confusing aspect of this is that @samp{-M} inhibits copying global metadata in overwrite mode and causes copying of global metadata in append mode. @example ncks in.nc # Print VAs and GAs ncks -v one in.nc # Print VAs not GAs ncks -M -v one in.nc # Print GAs only ncks -m -v one in.nc # Print VAs only ncks -M -m -v one in.nc # Print VAs and GAs ncks -O in.nc out.nc # Copy VAs and GAs ncks -O -v one in.nc out.nc # Copy VAs and GAs ncks -O -M -v one in.nc out.nc # Copy VAs not GAs ncks -O -m -v one in.nc out.nc # Copy GAs not VAs ncks -O -M -m -v one in.nc out.nc # Copy only data (no atts) ncks -A in.nc out.nc # Append VAs and GAs ncks -A -v one in.nc out.nc # Append VAs not GAs ncks -A -M -v one in.nc out.nc # Append VAs and GAs ncks -A -m -v one in.nc out.nc # Append only data (no atts) ncks -A -M -m -v one in.nc out.nc # Append GAs not VAs @end example where @code{VAs} and @code{GAs} denote variable and group/global attributes, respectively. @html @end html @cindex @command{ncdump} @cindex @code{-m} @cindex @code{--mtd} @cindex @code{--metadata} @cindex metadata @item -m Turn-on printing to screen or turn-off copying variable metadata. Using @samp{-m} will print variable metadata to screen (similar to @kbd{ncdump -h}). This displays all metadata pertaining to each variable, one variable at a time. @cindex chunking @cindex compression @cindex deflation This includes information on the storage properties of the variable, such as whether it employs chunking, compression, or packing. Also activated using @samp{--mtd} and @samp{--metadata}. The @command{ncks} default behavior is to print variable metadata to screen if no netCDF output file is specified. Use @samp{-m} to print variable metadata to screen if a netCDF output is specified. Also use @samp{-m} to turn-off copying of variable metadata to an output file. @html @end html @cindex @code{--no_blank} @cindex @code{--noblank} @cindex @code{--no-blank} @cindex blank @cindex missing values @item --no_blank Print numeric representation of missing values. As of @acronym{NCO} version 4.2.2 (October, 2012), @acronym{NCO} prints missing values as blanks (i.e., the underscore character @samp{_}) by default. To enable the old behavior of printing the numeric representation of missing values (e.g., @code{1.0e36}), use the @samp{--no_blank} switch. Also activated using @samp{--noblank} or @samp{--no-blank}. @html @end html @cindex @code{-P} @cindex @code{--print} @cindex @code{--prn} @item -P Print data, metadata, and units to screen. The @samp{-P} switch is a convenience abbreviation for @samp{-C -H -M -m -u}. Also activated using @samp{--print} or @samp{--prn}. This set of switches is useful for exploring file contents. @html @end html @cindex @code{-Q} @cindex @code{--quiet} @item -Q Print quietly, meaning omit dimension names, indices, and coordinate values when printing arrays. Variable (not dimension) indices are printed. Variable names appear flush left in the output: @example @verbatim zender@roulee:~$ ncks -Q -v three_dmn_rec_var -C -H ~/nco/data/in.nc three_dmn_rec_var[0]=1 ... @end verbatim @end example This helps locate specific variables in lists with many variables and different dimensions. See also the @samp{-V} option, which omits all names and indices and prints only variable values. @html @end html @cindex @code{-q} @cindex @code{--quench} @cindex quench @item -q Quench (turn-off) all printing to screen. This overrides the setting of all print-related switches, equivalent to @kbd{-H -M -m} when in single-file printing mode. When invoked with @code{-R} (@pxref{Retaining Retrieved Files}), @command{ncks} automatically sets @code{-q}. This allows @command{ncks} to retrieve remote files without automatically trying to print them. Also @samp{--quench}. @html @end html @cindex @code{--rad} @cindex orphan dimensions @cindex @code{--retain_all_dimensions} @cindex @code{--orphan_dimensions} @cindex @code{--rph_dmn} @item --rad Retain all dimensions. When invoked with @code{--rad} (Retain All Dimensions), @command{ncks} copies each dimension in the input file to the output file, regardless of whether the dimension is utilized by any variables. Normally @command{ncks} discards ``orphan dimensions'', i.e., dimensions not referenced by any variables. This switch allows users to keep non-referenced dimensions in the workflow. When invoked in printing mode, causes orphaned dimensions to be printed (they are not printed by default). Also @samp{--retain_all_dimensions}, @samp{--orphan_dimensions}, and @samp{--rph_dmn}. @html @end html @cindex @code{-s} @cindex @code{--string} @cindex @code{--sng_fmt} @cindex @code{printf()} @cindex C language @item -s @var{format} String format for text output. Accepts @w{C language} escape sequences and @code{printf()} formats. Also @samp{--string} and @samp{--sng_fmt}. @html @end html @cindex @code{--ssh} @cindex @code{--scr} @cindex @code{--secret} @cindex hidden features @item --secret Print summary of @command{ncks} hidden features. These hidden or secret features are used mainly by developers. They are not supported for general use and may change at any time. This demonstrates conclusively that I cannot keep a secret. Also @samp{--ssh} and @samp{--scr}. @html @end html @cindex @code{-u} @cindex @code{--units} @item -u Toggle the printing of a variable's @code{units} attribute, if any, with its values. Also @samp{--units}. @html @end html @cindex @code{-V} @cindex @code{--var_val} @cindex @code{--no_dmn_var_nm} @cindex @code{--no_nm_prn} @item -V Print variable values only. Do not print variable and dimension names, indices, and coordinate values when printing arrays. @example @verbatim zender@roulee:~$ ncks -V -v three_dmn_rec_var -C -H ~/nco/data/in.nc 1 ... @end verbatim @end example See also the @samp{-Q} option, which prints variable names and indices, but not dimension names, indices, or coordinate values when printing arrays. Using @samp{-V} is the same as specifying @samp{-Q --no_nm_prn}. @html @end html @cindex @code{--xml} @cindex @code{--ncml} @cindex @command{ncdump} @cindex @acronym{XML} @cindex @acronym{NcML} @item --xml, --ncml As of @acronym{NCO} version 4.3.3 (July, 2013), @command{ncks} can print extracted metadata to screen (i.e., @code{stdout}) as @acronym{XML} in @acronym{NcML}, the netCDF Markup Language. @command{ncks} supports for @acronym{XML} more completely than of @samp{ncdump -x}. With @command{ncks} one can translate entire netCDF3 and netCDF4 files into @acronym{NcML}, including metadata and data, using all @acronym{NCO}'s subsetting and hyperslabbing capabilities. Compare @command{ncks} ``traditional'' with @acronym{XML} printing: @example @verbatim zender@roulee:~$ ncks -v one ~/nco/data/in.nc one: type NC_FLOAT, 0 dimensions, 1 attribute, chunked? no, compressed? no, packed? no one size (RAM) = 1*sizeof(NC_FLOAT) = 1*4 = 4 bytes one attribute 0: long_name, size = 3 NC_CHAR, value = one one = 1 zender@roulee:~$ ncks --xml -v one ~/nco/data/in.nc 1. @end verbatim @end example @acronym{XML}-mode prints variable metadata and, as of @acronym{NCO} version 4.3.7 (October, 2013), variable data and, as of @acronym{NCO} version 4.4.0 (January, 2014), hidden attributes. That @acronym{ncks} produces correct @acronym{NcML} translations of @acronym{CDM} files for all supported datatypes is verified by comparison to output from Unidata's @command{toolsUI} Java program. Please let us know how to improve @acronym{XML}/@acronym{NcML} features. @cindex @code{--xml_no_location} @cindex @code{--xml_spr_chr} @cindex @code{--xml_spr_nmr} @cindex separator @command{ncks} provides additional options to configure @acronym{NcML} output: @samp{--xml_no_location}, @samp{--xml_spr_chr}, and @samp{--xml_spr_nmr}. Every @acronym{NcML} configuration option automatically triggers @acronym{NcML} printing, so that specifying @samp{--xml} in addition to a configuration option is redundant and unnecessary. The @samp{--xml_no_location} switch prevents output of the @acronym{NcML} @code{location} element. By default the location element is printed with a value equal to the location of the input dataset, e.g., @code{location="/home/zender/in.nc"}. The @samp{--xml_spr_chr} and @samp{--xml_spr_nmr} options customize the strings used as @acronym{NcML} separators for attributes and variables of character-type and numeric-type, respectively. Their default separators are @code{*} and ``@code{ }'' (a space): @example @verbatim zender@roulee:~$ ncks --xml -d time,0,3 -v two_dmn_rec_var_sng in.nc ... abc*bcd*cde*def ... zender@roulee:~$ ncks --xml_spr_chr=', ' -v two_dmn_rec_var_sng in.nc ... abc, bcd, cde, def, efg, fgh, ghi, hij, jkl, klm ... zender@roulee:~$ ncks --xml -v one_dmn_rec_var in.nc ... 1 2 3 4 5 6 7 8 9 10 ... zender@roulee:~$ ncks --xml_spr_nmr=', ' -v one_dmn_rec_var in.nc ... 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ... @end verbatim @end example Separator elements for strings are a thorny issue. One must be sure that the separator element is not mistaken as a portion of the string. @acronym{NCO} attempts to produce valid @acronym{NcML} and supplies the @samp{--xml_spr_chr} option to work around any difficulties. @acronym{NCO} performs precautionary checks with @code{strstr(@var{val},@var{spr})} to identify presence of the separator string (@var{spr}) in data (@var{val}) and, when it detects a match, automatically switches to a backup separator string (@code{*|*}). However limitations of @code{strstr()} may lead to false negatives when the separator string occurs in data beyond the first string in multi-dimensional @code{NC_CHAR} arrays. Hence, results may be ambiguous to NcML parsers. If problems arise, use @samp{--xml_spr_chr} to specify a multi-character separator that does not appear in the string array and that does not include an NcML formatting characters (e.g., commas, angles, quotes). @end table @html @end html @menu * Filters for @command{ncks}:: @end menu @node Filters for @command{ncks}, , ncks netCDF Kitchen Sink, ncks netCDF Kitchen Sink @subsection Filters for @command{ncks} @cindex @acronym{UNIX} @cindex @command{ncattget} @cindex @command{ncavg} @cindex @command{ncdmnlist} @cindex @command{ncdmnsz} @cindex @command{nclist} @cindex @command{ncmax} @cindex @command{ncmdn} @cindex @command{ncmin} @cindex @command{ncrecsz} @cindex @command{ncrng} @cindex @command{ncunits} @cindex @file{.bashrc} @cindex filters @cindex alias @cindex shell @cindex Bash shell @cindex Csh shell @cindex Sh shell @cindex @command{bash} We encourage the use of standard @acronym{UNIX} pipes and filters to narrow the verbose output of @command{ncks} into more precise targets. For example, to obtain an uncluttered listing of the variables in a file try @example ncks -m in.nc | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort @end example A Bash user could alias the previous filter to the shell command @command{nclist} as shown below. More complex examples could involve command line arguments. For example, a user may frequently be interested in obtaining the value of an attribute, e.g., for textual file examination or for passing to another shell command. Say the attribute is @code{purpose}, the variable is @code{z}, and the file is @code{in.nc}. In this example, @command{ncks -m -v z} is too verbose so a robust @command{grep} and @command{cut} filter is desirable, such as @example ncks -M -m in.nc | grep -E -i "^z attribute [0-9]+: purpose" | cut -f 11- -d ' ' | sort @end example The filters are clearly too complex to remember on-the-fly so the entire procedure could be implemented as a shell command or function called, say, @command{ncattget} @example @verbatim function ncattget { ncks -M -m ${3} | grep -E -i "^${2} attribute [0-9]+: ${1}" | cut -f 11- -d ' ' | sort ; } @end verbatim @end example The shell @command{ncattget} is invoked with three arugments that are, in order, the names of the attribute, variable, and file to examine. Global attributes are indicated by using a variable name of @code{global}. This definition yields the following results @example % ncattget purpose z in.nc Height stored with a monotonically increasing coordinate % ncattget Purpose Z in.nc Height stored with a monotonically increasing coordinate % ncattget history z in.nc % ncattget history global in.nc History global attribute. @end example Note that case sensitivity has been turned off for the variable and attribute names (and could be turned on by removing the @samp{-i} switch to @command{grep}). Furthermore, extended regular expressions may be used for both the variable and attribute names. The next two commands illustrate this by searching for the values of attribute @code{purpose} in all variables, and then for all attributes of the variable @code{z}: @example % ncattget purpose .+ in.nc 1-D latitude coordinate referred to by geodesic grid variables 1-D longitude coordinate referred to by geodesic grid variables ... % ncattget .+ Z in.nc Height Height stored with a monotonically increasing coordinate meter @end example Extended filters are best stored as shell commands if they are used frequently. Shell commands may be re-used when they are defined in shell configuration files. These files are usually named @file{.bashrc}, @file{.cshrc}, and @file{.profile} for the Bash, Csh, and Sh shells, respectively. @example @verbatim # NB: Untested on Csh, Ksh, Sh, Zsh! Send us feedback! # Bash shell (/bin/bash) users place these in .bashrc # ncattget $att_nm $var_nm $fl_nm : What attributes does variable have? function ncattget { ncks -M -m ${3} | grep -E -i "^${2} attribute [0-9]+: ${1}" | cut -f 11- -d ' ' | sort ; } # ncunits $att_val $fl_nm : Which variables have given units? function ncunits { ncks -M -m ${2} | grep -E -i " attribute [0-9]+: units.+ ${1}" | cut -f 1 -d ' ' | sort ; } # ncavg $var_nm $fl_nm : What is mean of variable? function ncavg { ncwa -y avg -O -C -v ${1} ${2} ~/foo.nc ; ncks -H -C -v ${1} ~/foo.nc | cut -f 3- -d ' ' ; } # ncavg $var_nm $fl_nm : What is mean of variable? function ncavg { ncap2 -O -C -v -s "foo=${1}.avg();print(foo)" ${2} ~/foo.nc | cut -f 3- -d ' ' ; } # ncdmnlist $fl_nm : What dimensions are in file? ncdmnlist { ncks --cdl -m ${1} | cut -d ':' -f 1 | cut -d '=' -s -f 1 ; } # ncdmnsz $dmn_nm $fl_nm : What is dimension size? function ncdmnsz { ncks -m -M ${2} | grep -E -i ": ${1}, size =" | cut -f 7 -d ' ' | uniq ; } # nclist $fl_nm : What variables are in file? function nclist { ncks -m ${1} | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort ; } # ncmax $var_nm $fl_nm : What is maximum of variable? function ncmax { ncwa -y max -O -C -v ${1} ${2} ~/foo.nc ; ncks -H -C -v ${1} ~/foo.nc | cut -f 3- -d ' ' ; } # ncmax $var_nm $fl_nm : What is maximum of variable? function ncmax { ncap2 -O -C -v -s "foo=${1}.max();print(foo)" ${2} ~/foo.nc | cut -f 3- -d ' ' ; } # ncmdn $var_nm $fl_nm : What is median of variable? function ncmdn { ncap2 -O -C -v -s "foo=gsl_stats_median_from_sorted_data(${1}.sort());print(foo)" ${2} ~/foo.nc | cut -f 3- -d ' ' ; } # ncrng $var_nm $fl_nm : What is range of variable? function ncrng { ncap2 -O -C -v -s "foo_min=${1}.min();foo_max=${1}.max();print(foo_min,\"%f\");print(\" to \");print(foo_max,\"%f\")" ${2} ~/foo.nc ; } # ncmode $var_nm $fl_nm : What is mode of variable? function ncmode { ncap2 -O -C -v -s "foo=gsl_stats_median_from_sorted_data(${1}.sort());print(foo)" ${2} ~/foo.nc | cut -f 3- -d ' ' ; } # ncrecsz $fl_nm : What is record dimension size? function ncrecsz { ncks -M ${1} | grep -E -i "^Record dimension:" | cut -f 8- -d ' ' ; } # Csh shell (/bin/csh) users place these in .cshrc ncattget() { ncks -M -m ${3} | grep -E -i "^${2} attribute [0-9]+: ${1}" | cut -f 11- -d ' ' | sort ; } ncdmnsz() { ncks -m -M ${2} | grep -E -i ": ${1}, size =" | cut -f 7 -d ' ' | uniq ; } nclist() { ncks -m ${1} | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort ; } ncrecsz() { ncks -M ${1} | grep -E -i "^Record dimension:" | cut -f 8- -d ' ' ; } # Sh shell (/bin/sh) users place these in .profile ncattget() { ncks -M -m ${3} | grep -E -i "^${2} attribute [0-9]+: ${1}" | cut -f 11- -d ' ' | sort ; } ncdmnsz() { ncks -m -M ${2} | grep -E -i ": ${1}, size =" | cut -f 7 -d ' ' | uniq ; } nclist() { ncks -m ${1} | grep -E ': type' | cut -f 1 -d ' ' | sed 's/://' | sort ; } ncrecsz() { ncks -M ${1} | grep -E -i "^Record dimension:" | cut -f 8- -d ' ' ; } @end verbatim @end example @noindent @html @end html EXAMPLES View all data in netCDF @file{in.nc}, printed with Fortran indexing conventions: @example ncks -F in.nc @end example Copy the netCDF file @file{in.nc} to file @file{out.nc}. @example ncks in.nc out.nc @end example Now the file @file{out.nc} contains all the data from @file{in.nc}. There are, however, two differences between @file{in.nc} and @file{out.nc}. @cindex @code{history} First, the @code{history} global attribute (@pxref{History Attribute}) will contain the command used to create @file{out.nc}. @cindex alphabetize output @cindex sort alphabetically @cindex @code{-a} Second, the variables in @file{out.nc} will be defined in alphabetical order. Of course the internal storage of variable in a netCDF file should be transparent to the user, but there are cases when alphabetizing a file is useful (see description of @code{-a} switch). @html @end html @cindex global attributes @cindex attributes, global @cindex subsetting @cindex exclusion @cindex extraction @cindex @code{-v @var{var}} @cindex @code{--variable @var{var}} @cindex @code{-x} @cindex @code{--exclude} @cindex @code{--xcl} Copy all global attributes (and no variables) from @file{in.nc} to @file{out.nc}: @example ncks -A -x ~/nco/data/in.nc ~/out.nc @end example The @samp{-x} switch tells @acronym{NCO} to use the complement of the extraction list (@pxref{Subsetting Files}). Since no extraction list is explicitly specified (with @samp{-v}), the default is to extract all variables. The complement of all variables is no variables. @cindex @code{-A} @cindex @code{--apn} @cindex @code{--append} @cindex appending to files Without any variables to extract, the append (@samp{-A}) command (@pxref{Appending Variables}) has only to extract and copy (i.e., append) global attributes to the output file. @html @end html Copy/append metadata (not data) from variables in one file to variables in a second file. When copying/subsetting/appending files (as opposed to printing them), the copying of data, variable metadata, and global/group metadata are now turned OFF by @samp{-H}, @samp{-m}, and @samp{-M}, respectively. This is the opposite sense in which these switches work when @emph{printing} a file. One can use these switches to easily replace data or metadata in one file with data or metadata from another: @example # Extract naked (data-only) copies of two variables ncks -h -M -m -O -C -v one,three_dmn_rec_var ~/nco/data/in.nc ~/out.nc # Change values to be sure original values are not copied in following step ncap2 -O -v -s 'one*=2;three_dmn_rec_var*=0' ~/nco/data/in.nc ~/in2.nc # Append in2.nc metadata (not data!) to out.nc ncks -A -C -H -v one,three_dmn_rec_var ~/in2.nc ~/out.nc @end example Variables in @file{out.nc} now contain data (not metadata) from @file{in.nc} and metadata (not data) from @file{in2.nc}. @cindex @code{-s} @cindex @code{--string} @cindex @code{--sng_fmt} @cindex @code{printf()} @cindex @code{\n} (linefeed) @cindex @code{\t} (horizontal tab) Print variable @code{three_dmn_var} from file @file{in.nc} with default notations. Next print @code{three_dmn_var} as an un-annotated text column. Then print @code{three_dmn_var} signed with very high precision. Finally, print @code{three_dmn_var} as a comma-separated list. @example % ncks -C -v three_dmn_var in.nc lat[0]=-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 lat[0]=-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 ... lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 % ncks -s '%f\n' -C -v three_dmn_var in.nc 0.000000 1.000000 ... 23.000000 % ncks -s '%+16.10f\n' -C -v three_dmn_var in.nc +0.0000000000 +1.0000000000 ... +23.0000000000 % ncks -s '%f, ' -C -v three_dmn_var in.nc 0.000000, 1.000000, ..., 23.000000, @end example @noindent Programmers will recognize these as the venerable @w{C language} @code{printf()} formatting strings. The second and third options are useful when pasting data into text files like reports or papers. @xref{ncatted netCDF Attribute Editor}, for more details on string formatting and special characters. @cindex @code{--no_blank} As of @acronym{NCO} version 4.2.2 (October, 2012), @acronym{NCO} prints missing values as blanks (i.e., the underscore character @samp{_}) by default: @example % ncks -C -H -v mss_val in.nc lon[0]=0 mss_val[0]=73 lon[1]=90 mss_val[1]=_ lon[2]=180 mss_val[2]=73 lon[3]=270 mss_val[3]=_ % ncks -s '%+5.1f, ' -H -C -v mss_val in.nc +73.0, _, +73.0, _, @end example To print the numeric value of the missing value instead of a blank, use the @samp{--no_blank} option. @cindex @code{-Q} @cindex @code{--quiet} @cindex @code{-V} @cindex @code{--var_val} @cindex @code{--no_dmn_var_nm} @cindex @code{--no_nm_prn} @command{ncks} prints in a verbose fashion by default and supplies a number of switches to pare-down (or even spruce-up) the output. The interplay of the @samp{-Q}, @samp{-V}, and (otherwise undocumented) @samp{--no_nm_prn} switches yields most desired verbosities: @example @verbatim % ncks -v three_dmn_rec_var -C -H ~/nco/data/in.nc time[0]=1 lat[0]=-90 lon[0]=0 three_dmn_rec_var[0]=1 % ncks -Q -v three_dmn_rec_var -C -H ~/nco/data/in.nc three_dmn_rec_var[0]=1 % ncks -V -v three_dmn_rec_var -C -H ~/nco/data/in.nc 1 % ncks -Q --no_nm_prn -v three_dmn_rec_var -C -H ~/nco/data/in.nc 1 % ncks --no_nm_prn -v three_dmn_rec_var -C -H ~/nco/data/in.nc 1 -90 0 1 @end verbatim @end example One dimensional arrays of characters stored as netCDF variables are automatically printed as strings, whether or not they are NUL-terminated, e.g., @example ncks -v fl_nm in.nc @end example @noindent The @code{%c} formatting code is useful for printing multidimensional arrays of characters representing fixed length strings @example ncks -s '%c' -v fl_nm_arr in.nc @end example @noindent @cindex @code{core dump} Using the @code{%s} format code on strings which are not NUL-terminated (and thus not technically strings) is likely to result in a core dump. @html @end html @cindex subsetting @cindex exclusion @cindex extraction @cindex @code{-x} @cindex @acronym{CF} conventions @cindex @code{coordinates} attribute @cindex @code{climatology} attribute @cindex @code{bounds} attribute @cindex @code{ancillary_variables} attribute Create netCDF @file{out.nc} containing all variables, and any associated coordinates, except variable @code{time}, from netCDF @file{in.nc}: @example ncks -x -v time in.nc out.nc @end example As a special case of this, consider how to remove a variable such as @code{time_bounds} that is identified in a @acronym{CF} Convention (@pxref{CF Conventions}) compliant @code{ancillary_variables}, @code{bounds}, @code{climatology}, or @code{coordinates} attribute. @acronym{NCO} subsetting assumes the user wants all ancillary variables, axes, bounds and coordinates associated with all extracted variables (@pxref{Subsetting Coordinate Variables}). Hence to exclude a @code{ancillary_variables}, @code{bounds}, @code{climatology}, or @code{coordinates} variable while retaining the ``parent'' variable (here @code{time}), one must use the @samp{-C} switch: @example ncks -C -x -v time_bounds in.nc out.nc @end example The @samp{-C} switch tells the operator @emph{NOT} to necessarily include all the @acronym{CF} ancillary variables, axes, bounds, and coordinates. Hence the output file will contain @code{time} and not @code{time_bounds}. Extract variables @code{time} and @code{pressure} from netCDF @file{in.nc}. If @file{out.nc} does not exist it will be created. Otherwise the you will be prompted whether to append to or to overwrite @file{out.nc}: @example ncks -v time,pressure in.nc out.nc ncks -C -v time,pressure in.nc out.nc @end example @noindent The first version of the command creates an @file{out.nc} which contains @code{time}, @code{pressure}, and any coordinate variables associated with @var{pressure}. The @file{out.nc} from the second version is guaranteed to contain only two variables @code{time} and @code{pressure}. Create netCDF @file{out.nc} containing all variables from file @file{in.nc}. Restrict the dimensions of these variables to a hyperslab. Print (with @code{-H}) the hyperslabs to the screen for good measure. The specified hyperslab is: the fifth value in dimension @code{time}; the half-open range @math{@var{lat} > 0.} in coordinate @code{lat}; the half-open range @math{@var{lon} < 330.} in coordinate @code{lon}; the closed interval @math{0.3 < @var{band} < 0.5} in coordinate @code{band}; and cross-section closest to 1000.@: in coordinate @code{lev}. Note that limits applied to coordinate values are specified with a decimal point, and limits applied to dimension indices do not have a decimal point @xref{Hyperslabs}. @example ncks -H -d time,5 -d lat,,0.0 -d lon,330.0, -d band,0.3,0.5 -d lev,1000.0 in.nc out.nc @end example @cindex wrapped coordinates Assume the domain of the monotonically increasing longitude coordinate @code{lon} is @math{0 < @var{lon} < 360}. Here, @code{lon} is an example of a wrapped coordinate. @command{ncks} will extract a hyperslab which crosses the Greenwich meridian simply by specifying the westernmost longitude as @var{min} and the easternmost longitude as @var{max}, as follows: @example ncks -d lon,260.0,45.0 in.nc out.nc @end example For more details @xref{Wrapped Coordinates}. @page @html @end html @node ncpdq netCDF Permute Dimensions Quickly, ncra netCDF Record Averager, ncks netCDF Kitchen Sink, Reference Manual @section @command{ncpdq} netCDF Permute Dimensions Quickly @findex ncpdq @findex ncpack @findex ncunpack @cindex reshape variables @cindex permute dimensions @cindex reverse dimensions @cindex re-order dimensions @cindex re-dimension @cindex packing @cindex unpacking @noindent SYNTAX @example ncpdq [-3] [-4] [-6] [-7] [-A] [-a [-]@var{dim}[,@dots{}]] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [-M @var{pck_map}] [--mrd] [--no_tmp_fl] [-O] [-o @var{output-file}] [-P @var{pck_plc}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [-t @var{thr_nbr}] [-U] [--unn] [-v @var{var}[,@dots{}]] [-X ...] [-x] @var{input-file} [@var{output-file}] @end example @noindent DESCRIPTION @command{ncpdq} performs one (not both) of two distinct functions: packing or dimension permutation. @command{ncpdq} is optimized to perform these actions in a parallel fashion with a minimum of time and memory. The @dfn{pdq} may stand for ``Permute Dimensions Quickly'', ``Pack Data Quietly'', ``Pillory Dan Quayle'', or other silly uses. @cindex @code{add_offset} @cindex @code{scale_factor} @cindex @command{ncap2} @cindex packing policy @unnumberedsubsec Packing and Unpacking Functions The @command{ncpdq} packing (and unpacking) algorithms are described in @ref{Methods and functions}, and are also implemented in @command{ncap2}. @command{ncpdq} extends the functionality of these algorithms by providing high level control of the @dfn{packing policy} so that users can consistently pack (and unpack) entire files with one command. @cindex @var{pck_plc} @cindex @code{-P @var{pck_plc}} @cindex @code{--pck_plc @var{pck_plc}} @cindex @code{--pack_policy @var{pck_plc}} The user specifies the desired packing policy with the @samp{-P} switch (or its long option equivalents, @samp{--pck_plc} and @samp{--pack_policy}) and its @var{pck_plc} argument. Four packing policies are currently implemented:@* @table @dfn @item Packing (and Re-Packing) Variables [@emph{default}] Definition: Pack unpacked variables, re-pack packed variables@* Alternate invocation: @code{ncpack}@* @var{pck_plc} key values: @samp{all_new}, @samp{pck_all_new_att}@* @item Packing (and not Re-Packing) Variables Definition: Pack unpacked variables, copy packed variables@* Alternate invocation: none@* @var{pck_plc} key values: @samp{all_xst}, @samp{pck_all_xst_att}@* @item Re-Packing Variables Definition: Re-pack packed variables, copy unpacked variables@* Alternate invocation: none@* @var{pck_plc} key values: @samp{xst_new}, @samp{pck_xst_new_att}@* @item Unpacking Definition: Unpack packed variables, copy unpacked variables@* Alternate invocation: @code{ncunpack}@* @var{pck_plc} key values: @samp{upk}, @samp{unpack}, @samp{pck_upk}@* @end table @noindent Equivalent key values are fully interchangeable. Multiple equivalent options are provided to satisfy disparate needs and tastes of @acronym{NCO} users working with scripts and from the command line. Regardless of the packing policy selected, @command{ncpdq} no longer (as of @acronym{NCO} version 4.0.4 in October, 2010) packs coordinate variables, or the special variables, weights, and other grid properties described in @ref{CF Conventions}. Prior @command{ncpdq} versions treated coordinate variables and grid properties no differently from other variables. However, coordinate variables are one-dimensional, so packing saves little space on large files, and the resulting files are difficult for humans to read. @command{ncpdq} will, of course, @emph{unpack} coordinate variables and weights, for example, in case some other, non-@acronym{NCO} software packed them in the first place. Concurrently, Gaussian and area weights and other grid properties are often used to derive fields in re-inflated (unpacked) files, so packing such grid properties causes a considerable loss of precision in downstream data processing. If users express strong wishes to pack grid properties, we will implement new packing policies. An immediate workaround for those needing to pack grid properties now, is to use the @command{ncap2} packing functions or to rename the grid properties prior to calling @command{ncpdq}. We welcome your feedback. To reduce required memorization of these complex policy switches, @command{ncpdq} may also be invoked via a synonym or with switches that imply a particular policy. @command{ncpack} is a synonym for @command{ncpdq} and behaves the same in all respects. Both @command{ncpdq} and @command{ncpack} assume a default packing policy request of @samp{all_new}. Hence @command{ncpack} may be invoked without any @samp{-P} switch, unlike @command{ncpdq}. Similarly, @command{ncunpack} is a synonym for @command{ncpdq} except that @command{ncpack} implicitly assumes a request to unpack, i.e., @samp{-P pck_upk}. @cindex @code{-U} @cindex @code{--upk} @cindex @code{--unpack} Finally, the @command{ncpdq} @samp{-U} switch (or its long option equivalents, @samp{--upk} and @samp{--unpack}) requires no argument. It simply requests unpacking. Given the menagerie of synonyms, equivalent options, and implied options, a short list of some equivalent commands is appropriate. The following commands are equivalent for packing: @code{ncpdq -P all_new}, @code{ncpdq --pck_plc=all_new}, and @code{ncpack}. The following commands are equivalent for unpacking: @code{ncpdq -P upk}, @code{ncpdq -U}, @code{ncpdq --pck_plc=unpack}, and @code{ncunpack}. Equivalent commands for other packing policies, e.g., @samp{all_xst}, follow by analogy. @cindex @command{alias} @cindex @command{ln -s} @cindex symbolic links Note that @command{ncpdq} synonyms are subject to the same constraints and recommendations discussed in the secion on @command{ncbo} synonyms (@pxref{ncbo netCDF Binary Operator}). That is, symbolic links must exist from the synonym to @command{ncpdq}, or else the user must define an @command{alias}. @cindex packing map @cindex @var{pck_map} @cindex @code{-M @var{pck_map}} @cindex @code{--pck_map @var{pck_map}} @cindex @code{--map @var{pck_map}} The @command{ncpdq} packing algorithms must know to which type particular types of input variables are to be packed. The correspondence between the input variable type and the output, packed type, is called the @dfn{packing map}. The user specifies the desired packing map with the @samp{-M} switch (or its long option equivalents, @samp{--pck_map} and @samp{--map}) and its @var{pck_map} argument. Five packing maps are currently implemented:@* @cindex @samp{hgh_sht} @cindex @samp{hgh_byt} @cindex @samp{flt_sht} @cindex @samp{flt_byt} @cindex @samp{nxt_lsr} @cindex @code{NC_DOUBLE} @cindex @code{NC_FLOAT} @cindex @code{NC_INT64} @cindex @code{NC_UINT64} @cindex @code{NC_INT} @cindex @code{NC_UINT} @cindex @code{NC_SHORT} @cindex @code{NC_USHORT} @cindex @code{NC_CHAR} @cindex @code{NC_BYTE} @cindex @code{NC_UBYTE} @table @dfn @item Pack Floating Precisions to @code{NC_SHORT} [@emph{default}] Definition: Pack floating precision types to @code{NC_SHORT}@* Map: Pack [@code{NC_DOUBLE},@code{NC_FLOAT}] to @code{NC_SHORT}@* Types copied instead of packed: [@code{NC_INT64},@code{NC_UINT64},@code{NC_INT},@code{NC_UINT},@code{NC_SHORT},@code{NC_USHORT},@code{NC_CHAR},@code{NC_BYTE},@code{NC_UBYTE}]@* @var{pck_map} key values: @samp{flt_sht}, @samp{pck_map_flt_sht}@* @item Pack Floating Precisions to @code{NC_BYTE} Definition: Pack floating precision types to @code{NC_BYTE}@* Map: Pack [@code{NC_DOUBLE},@code{NC_FLOAT}] to @code{NC_BYTE}@* Types copied instead of packed: [@code{NC_INT64},@code{NC_UINT64},@code{NC_INT},@code{NC_UINT},@code{NC_SHORT},@code{NC_USHORT},@code{NC_CHAR},@code{NC_BYTE},@code{NC_UBYTE}]@* @var{pck_map} key values: @samp{flt_byt}, @samp{pck_map_flt_byt}@* @item Pack Higher Precisions to @code{NC_SHORT} Definition: Pack higher precision types to @code{NC_SHORT}@* Map: Pack [@code{NC_DOUBLE},@code{NC_FLOAT},@code{NC_INT64},@code{NC_UINT64},@code{NC_INT},@code{NC_UINT}] to @code{NC_SHORT}@* Types copied instead of packed: [@code{NC_SHORT},@code{NC_USHORT},@code{NC_CHAR},@code{NC_BYTE},@code{NC_UBYTE}]@* @var{pck_map} key values: @samp{hgh_sht}, @samp{pck_map_hgh_sht}@* @item Pack Higher Precisions to @code{NC_BYTE} Definition: Pack higher precision types to @code{NC_BYTE}@* Map: Pack [@code{NC_DOUBLE},@code{NC_FLOAT},@code{NC_INT64},@code{NC_UINT64},@code{NC_INT},@code{NC_UINT},@code{NC_SHORT},@code{NC_USHORT}] to @code{NC_BYTE}@* Types copied instead of packed: [@code{NC_CHAR},@code{NC_BYTE},@code{NC_UBYTE}]@* @var{pck_map} key values: @samp{hgh_byt}, @samp{pck_map_hgh_byt}@* @item Pack to Next Lesser Precision Definition: Pack each type to type of next lesser size@* Map: Pack [@code{NC_DOUBLE},@code{NC_INT64},@code{NC_UINT64}], to @code{NC_INT}. Pack [@code{NC_FLOAT},@code{NC_INT},@code{NC_UINT}] to @code{NC_SHORT}. Pack [@code{NC_SHORT},@code{NC_USHORT}] to @code{NC_BYTE}.@* Types copied instead of packed: [@code{NC_CHAR},@code{NC_BYTE},@code{NC_UBYTE}]@* @var{pck_map} key values: @samp{nxt_lsr}, @samp{pck_map_nxt_lsr}@* @end table @noindent The default @samp{all_new} packing policy with the default @samp{flt_sht} packing map reduces the typical @code{NC_FLOAT}-dominated file size by @w{about 50%.} @samp{flt_byt} packing reduces an @code{NC_DOUBLE}-dominated file by @w{about 87%.} @cindex @var{_FillValue} @cindex @code{_FillValue} @cindex @code{NUL} The netCDF packing algorithm (@pxref{Methods and functions}) is lossy---once packed, the exact original data cannot be recovered without a full backup. Hence users should be aware of some packing caveats: First, the interaction of packing and data equal to the @var{_FillValue} is complex. Test the @code{_FillValue} behavior by performing a pack/unpack cycle to ensure data that are missing @emph{stay} missing and data that are not misssing do not join the Air National Guard and go missing. This may lead you to elect a new @var{_FillValue}. Second, @code{ncpdq} actually allows packing into @code{NC_CHAR} (with, e.g., @samp{flt_chr}). However, the intrinsic conversion of @code{signed char} to higher precision types is tricky for values equal to zero, i.e., for @code{NUL}. Hence packing to @code{NC_CHAR} is not documented or advertised. Pack into @code{NC_BYTE} (with, e.g., @samp{flt_byt}) instead. @html @end html @unnumberedsubsec Dimension Permutation @command{ncpdq} re-shapes variables in @var{input-file} by re-ordering and/or reversing dimensions specified in the dimension list. The dimension list is a whitespace-free, comma separated list of dimension names, optionally prefixed by negative signs, that follows the @samp{-a} (or long options @samp{--arrange}, @samp{--permute}, @samp{--re-order}, or @samp{--rdr}) switch. To re-order variables by a subset of their dimensions, specify these dimensions in a comma-separated list following @samp{-a}, e.g., @samp{-a lon,lat}. To reverse a dimension, prefix its name with a negative sign in the dimension list, e.g., @samp{-a -lat}. Re-ordering and reversal may be performed simultaneously, e.g., @samp{-a lon,-lat,time,-lev}. @cindex record dimension Users may specify any permutation of dimensions, including permutations which change the record dimension identity. The record dimension is re-ordered like any other dimension. @cindex concatenation @cindex record dimension This unique @command{ncpdq} capability makes it possible to concatenate files along any dimension. See @ref{Concatenation} for a detailed example. @cindex record variable The record dimension is always the most slowly varying dimension in a record variable (@pxref{C and Fortran Index Conventions}). The specified re-ordering fails if it requires creating more than one record dimension amongst all the output variables @footnote{This limitation, imposed by the netCDF storage layer, may be relaxed in the future with netCDF4.}. Two special cases of dimension re-ordering and reversal deserve special mention. First, it may be desirable to completely reverse the storage order of a variable. To do this, include all the variable's dimensions in the dimension re-order list in their original order, and prefix each dimension name with the negative sign. @cindex transpose Second, it may useful to transpose a variable's storage order, e.g., @w{from C} to Fortran data storage order (@pxref{C and Fortran Index Conventions}). To do this, include all the variable's dimensions in the dimension re-order list in reversed order. Explicit examples of these two techniques appear below. @tex NB: fxm ncpdq documentation will evolve through Fall 2004. I will upload updates to documentation linked to by the NCO homepage. ncpdq is a powerful operator, and I am unfamiliar with the terminology needed to describe what ncpdq does. Sequences, sets, sheesh! I just know that it does ``The right thing'' according to my gut feelings. Now do you feel more comfortable using it? Let $\dmnvct(\xxx)$ represent the dimensionality of the variable $\xxx$. Dimensionality describes the order and sizes of dimensions. If $\xxx$ has rank $\dmnnbr$, then we may write $\dmnvct(\xxx)$ as the $\dmnnbr$-element vector $$ \dmnvct(\xxx) = [ \dmn_{1}, \dmn_{2}, \dmn_{3}, \ldots, \dmn_{\dmnidx-1}, \dmn_{\dmnidx}, \dmn_{\dmnidx+1}, \ldots, \dmn_{\dmnnbr-2}, \dmn_{\dmnnbr-1}, \dmn_{\dmnnbr} ] $$ where $\dmn_{\dmnidx}$ is the size of the $\dmnidx$'th dimension. The dimension re-order list specified with @samp{-a} is the $\rdrnbr$-element vector $$ \rdrvct = [ \rdr_{1}, \rdr_{2}, \rdr_{3}, \ldots, \rdr_{\rdridx-1}, \rdr_{\rdridx}, \rdr_{\rdridx+1}, \ldots, \rdr_{\rdrnbr-2}, \rdr_{\rdrnbr-1}, \rdr_{\rdrnbr} ] $$ There need be no relation between $\dmnnbr$ and $\rdrnbr$. Let the $\shrnbr$-element vector $\shrvct$ be the intersection (i.e., the ordered set of unique shared dimensions) of $\dmnvct$ and $\rdrvct$ Then $$ \eqalign{{\shrvct} &= \rdrvct \cap \dmnvct \cr &= [ \shr_{1}, \shr_{2}, \shr_{3}, \ldots, \shr_{\shridx-1}, \shr_{\shridx}, \shr_{\shridx+1}, \ldots, \shr_{\shrnbr-2}, \shr_{\shrnbr-1}, \shr_{\shrnbr} ]} $$ $\shrvct$ is empty if $\rdrvct \notin \dmnvct$. Re-ordering (or re-shaping) a variable means mapping the input state with dimensionality $\dmnvct(\xxx)$ to the output state with dimensionality $\dmnvctprm(\xxxprm)$. In practice, mapping occurs in three logically distinct steps. First, we tranlate the user input to a one-to-one mapping $\mpp$ between input and output dimensions, $\dmnvct \mapsto \dmnvctprm$. This tentative map is final unless external constraints (typically netCDF restrictions) impose themselves. Second, we check and, if necessary, refine the tentative mapping so that the re-shaped variables will co-exist in the same file without violating netCDF-imposed storage restrictions. This refined map specifies the final (output) dimensionality. Third, we translate the output dimensionality into one-dimensional memory offsets for each datum according to the @w{C language} convention for multi-dimensional array storage. Dimension reversal changes the ordering of data, though not the rank or dimensionality, and so is part of the third step. Dimensions $\rdr$ disjoint from $\dmnvct$ play no role in re-ordering. The first step taken to re-order a variable is to determine $\shrvct$. $\rdrvct$ is constant for all variables, whereas $\dmnvct$, and hence $\shrvct$, is variable-specific. $\shrvct$ is empty if $\rdrvct \notin \dmnvct$. This may be the case for some extracted variables. The user may explicitly specify the one-to-one mapping of input to output dimension order by supplying (with @samp{-a}) a re-order list $\rdrvct$ such that $\shrnbr = \dmnnbr$. In this case $\dmnsubnnnprm = \shrsubnnn$. The degenerate case occurs when $\dmnvct = \shrvct$. This produces the identity mapping $\dmnsubnnnprm = \dmnsubnnn$. The mapping of input to output dimension order is more complex when $\shrnbr \ne \dmnnbr$. In this case $\dmnsubnnnprm = \dmnsubnnn$ for the $\dmnnbr-\shrnbr$ dimensions $\dmnsubnnnprm \notin \shrvct$. For the $\shrnbr$ dimensions $\dmnsubnnnprm \in \shrvct$, $\dmnsubnnnprm = \shrsubsss$. @end tex @c fxm: discuss netCDF-imposed constraints here @noindent @html @end html EXAMPLES Pack and unpack all variables in file @file{in.nc} and store the results in @file{out.nc}: @example ncpdq in.nc out.nc # Same as ncpack in.nc out.nc ncpdq -P all_new -M flt_sht in.nc out.nc # Defaults ncpdq -P all_xst in.nc out.nc ncpdq -P upk in.nc out.nc # Same as ncunpack in.nc out.nc ncpdq -U in.nc out.nc # Same as ncunpack in.nc out.nc @end example The first two commands pack any unpacked variable in the input file. They also unpack and then re-pack every packed variable. The third command only packs unpacked variables in the input file. If a variable is already packed, the third command copies it unchanged to the output file. The fourth and fifth commands unpack any packed variables. If a variable is not packed, the third command copies it unchanged. The previous examples all utilized the default packing map. Suppose you wish to archive all data that are currently unpacked into a form which only preserves 256 distinct values. Then you could specify the packing map @var{pck_map} as @samp{hgh_byt} and the packing policy @var{pck_plc} as @samp{all_xst}: @example ncpdq -P all_xst -M hgh_byt in.nc out.nc @end example @cindex appending variables @cindex @samp{-A} @cindex @samp{-v} Many different packing maps may be used to construct a given file by performing the packing on subsets of variables (e.g., with @samp{-v}) and using the append feature with @samp{-A} (@pxref{Appending Variables}). Users may wish to unpack data packed with the @acronym{HDF} convention, and then re-pack it with the netCDF convention so that all their datasets use the same packing convention prior to intercomparison. @cindex @command{ncl_convert2nc} @cindex @acronym{NCL} @example # One-step procedure: For NCO 4.4.0+, netCDF 4.3.1+ # 1. Convert, unpack, and repack HDF file into netCDF file ncpdq --hdf_upk -P xst_new modis.hdf modis.nc # HDF4 files ncpdq --hdf_upk -P xst_new modis.h5 modis.nc # HDF5 files # One-step procedure: For NCO 4.3.7--4.3.9 # 1. Convert, unpack, and repack HDF file into netCDF file ncpdq --hdf4 --hdf_upk -P xst_new modis.hdf modis.nc # HDF4 ncpdq --hdf_upk -P xst_new modis.h5 modis.nc # HDF5 # Two-step procedure: For NCO 4.3.6 and earlier # 1. Convert HDF file to netCDF file ncl_convert2nc modis.hdf # 2. Unpack using HDF convention and repack using netCDF convention ncpdq --hdf_upk -P xst_new modis.nc modis.nc @end example @acronym{NCO} now @footnote{ Prior to @acronym{NCO} 4.4.0 and netCDF 4.3.1 (January, 2014), @acronym{NCO} requires the @samp{--hdf4} switch to correctly read HDF4 input files. For example, @samp{ncpdq --hdf4 --hdf_upk -P xst_new modis.hdf modis.nc}. That switch is now obsolete, though harmless for backwards compatibility. Prior to version 4.3.7 (October, 2013), @acronym{NCO} lacked the software necessary to workaround netCDF library flaws handling @acronym{HDF4} files, and thus @acronym{NCO} failed to convert @acronym{HDF4} files to netCDF files. In those cases, use the @command{ncl_convert2nc} command distributed with @acronym{NCL} to convert @acronym{HDF4} files to netCDF.} automatically detects @acronym{HDF4} files. In this case it produces an output file @file{modis.nc} which preserves the @acronym{HDF} packing used in the input file. The @command{ncpdq} command first unpacks all packed variables using the @acronym{HDF} unpacking algorithm (as specified by @samp{--hdf_upk}), and then repacks those same variables using the netCDF algorithm (because that is the only algorithm @acronym{NCO} packs with). As described above the @samp{--P xst_new} packing policy only repacks variables that are already packed. Not-packed variables are copied directly without loss of precision @footnote{@command{ncpdq} does not support packing data using the @acronym{HDF} convention. Although it is now straightforward to support this, we think it might sow more confusion than it reaps. Let us know if you disagree and would like @acronym{NCO} to support packing data with @acronym{HDF} algorithm.}. Re-order file @file{in.nc} so that the dimension @code{lon} always precedes the dimension @code{lat} and store the results in @file{out.nc}: @example ncpdq -a lon,lat in.nc out.nc ncpdq -v three_dmn_var -a lon,lat in.nc out.nc @end example The first command re-orders every variable in the input file. The second command extracts and re-orders only the variable @code{three_dmn_var}. @cindex reverse dimensions Suppose the dimension @code{lat} represents latitude and monotonically increases increases from south to north. Reversing the @code{lat} dimension means re-ordering the data so that latitude values decrease monotonically from north to south. Accomplish this with @example % ncpdq -a -lat in.nc out.nc % ncks -C -v lat in.nc lat[0]=-90 lat[1]=90 % ncks -C -v lat out.nc lat[0]=90 lat[1]=-90 @end example This operation reversed the latitude dimension of all variables. Whitespace immediately preceding the negative sign that specifies dimension reversal may be dangerous. @cindex long options @cindex quotes Quotes and long options can help protect negative signs that should indicate dimension reversal from being interpreted by the shell as dashes that indicate new command line switches. @example ncpdq -a -lat in.nc out.nc # Dangerous? Whitespace before "-lat" ncpdq -a '-lat' in.nc out.nc # OK. Quotes protect "-" in "-lat" ncpdq -a lon,-lat in.nc out.nc # OK. No whitespace before "-" ncpdq --rdr=-lat in.nc out.nc # Preferred. Uses "=" not whitespace @end example @cindex reverse dimensions To create the mathematical transpose of a variable, place all its dimensions in the dimension re-order list in reversed order. This example creates the transpose of @code{three_dmn_var}: @example % ncpdq -a lon,lev,lat -v three_dmn_var in.nc out.nc % ncks -C -v three_dmn_var in.nc lat[0]=-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 lat[0]=-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 lat[0]=-90 lev[0]=100 lon[2]=180 three_dmn_var[2]=2 ... lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 % ncks -C -v three_dmn_var out.nc lon[0]=0 lev[0]=100 lat[0]=-90 three_dmn_var[0]=0 lon[0]=0 lev[0]=100 lat[1]=90 three_dmn_var[1]=12 lon[0]=0 lev[1]=500 lat[0]=-90 three_dmn_var[2]=4 ... lon[3]=270 lev[1]=500 lat[1]=90 three_dmn_var[21]=19 lon[3]=270 lev[2]=1000 lat[0]=-90 three_dmn_var[22]=11 lon[3]=270 lev[2]=1000 lat[1]=90 three_dmn_var[23]=23 @end example @cindex reverse data To completely reverse the storage order of a variable, include all its dimensions in the re-order list, each prefixed by a negative sign. This example reverses the storage order of @code{three_dmn_var}: @example % ncpdq -a -lat,-lev,-lon -v three_dmn_var in.nc out.nc % ncks -C -v three_dmn_var in.nc lat[0]=-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 lat[0]=-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 lat[0]=-90 lev[0]=100 lon[2]=180 three_dmn_var[2]=2 ... lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 % ncks -C -v three_dmn_var out.nc lat[0]=90 lev[0]=1000 lon[0]=270 three_dmn_var[0]=23 lat[0]=90 lev[0]=1000 lon[1]=180 three_dmn_var[1]=22 lat[0]=90 lev[0]=1000 lon[2]=90 three_dmn_var[2]=21 ... lat[1]=-90 lev[2]=100 lon[1]=180 three_dmn_var[21]=2 lat[1]=-90 lev[2]=100 lon[2]=90 three_dmn_var[22]=1 lat[1]=-90 lev[2]=100 lon[3]=0 three_dmn_var[23]=0 @end example @html @end html Creating a record dimension named, e.g., @code{time}, in a file which has no existing record dimension is simple with @command{ncecat}: @example ncecat -O -u time in.nc out.nc # Create degenerate record dimension named "time" @end example @cindex record dimension Now consider a file with all dimensions, including @code{time}, fixed (non-record). Suppose the user wishes to convert @code{time} from a fixed dimension to a record dimension. This may be useful, for example, when the user wishes to append additional time slices to the data. As of @acronym{NCO} version 4.0.1 (April, 2010) the preferred method for doing this is with @command{ncks}: @example ncks -O --mk_rec_dmn time in.nc out.nc # Change "time" to record dimension @end example Prior to 4.0.1, the procedure to change an existing fixed dimension into a record dimension required three separate commands, @command{ncecat} followed by @command{ncpdq}, and then @command{ncwa}. The recommended method is now to use @samp{ncks --fix_rec_dmn}, yet it is still instructive to present the original procedure, as it shows how multiple operators can achieve the same ends by different means: @cindex degenerate dimension @example ncecat -O in.nc out.nc # Add degenerate record dimension named "record" ncpdq -O -a time,record out.nc out.nc # Switch "record" and "time" ncwa -O -a record out.nc out.nc # Remove (degenerate) "record" @end example @noindent The first step creates a degenerate (size equals one) record dimension named (by default) @code{record}. The second step swaps the ordering of the dimensions named @code{time} and @code{record}. Since @code{time} now occupies the position of the first (least rapidly varying) dimension, it becomes the record dimension. The dimension named @code{record} is no longer a record dimension. The third step averages over this degenerate @code{record} dimension. Averaging over a degenerate dimension does not alter the data. The ordering of other dimensions in the file (@code{lat}, @code{lon}, etc.) is immaterial to this procedure. See @ref{ncecat netCDF Ensemble Concatenator} and @ref{ncks netCDF Kitchen Sink} for other methods of changing variable dimensionality, including the record dimension. @page @html @end html @node ncra netCDF Record Averager, ncrcat netCDF Record Concatenator, ncpdq netCDF Permute Dimensions Quickly, Reference Manual @section @command{ncra} netCDF Record Averager @cindex averaging data @cindex record average @cindex record dimension @cindex running average @findex ncra @noindent SYNTAX @example ncra [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [--mro] [-N] [-n @var{loop}] [--no_tmp_fl] [-O] [-o @var{output-file}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [--rth_dbl|flt] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-w wgt] [-X ...] [-x] [-y @var{op_typ}] [@var{input-files}] [@var{output-file}] @end example @noindent DESCRIPTION @command{ncra} averages record variables across an arbitrary number of @var{input-files}. @cindex degenerate dimension @cindex record dimension The record dimension is, by default, retained as a degenerate @w{(size 1)} dimension in the output variables. @xref{Statistics vs. Concatenation}, for a description of the distinctions between the various statistics tools and concatenators. @cindex multi-file operators @cindex standard input @cindex @code{stdin} As a multi-file operator, @command{ncra} will read the list of @var{input-files} from @code{stdin} if they are not specified as positional arguments on the command line (@pxref{Large Numbers of Files}). Input files may vary in size, but each must have a record dimension. The record coordinate, if any, should be monotonic (or else non-fatal warnings may be generated). @cindex hyperslab Hyperslabs of the record dimension which include more than one file work correctly. @cindex stride @command{ncra} supports the @var{stride} argument to the @samp{-d} hyperslab option (@pxref{Hyperslabs}) for the record dimension only, @var{stride} is not supported for non-record dimensions. @cindex operation types @command{ncra} @emph{always averages} coordinate variables (e.g., @code{time}) regardless of the arithmetic operation type performed on non-coordinate variables (@pxref{Operation Types}). As of @acronym{NCO} @w{version 4.4.9}, released in May, 2015, @command{ncra} accepts user-specified weights with the @samp{-w} (or long-option equivalent @samp{--wgt}, @samp{--wgt_var}, or @samp{--weight}) switch. When no weight is specified, @command{ncra} weights each record (e.g., time slice) in the @var{input-files} equally. @command{ncra} does not attempt to see if, say, the @code{time} coordinate is irregularly spaced and thus would require a weighted average in order to be a true time average. Weights specified with @samp{-w wgt} may take one of two forms. In the first form, the @samp{wgt} argument is a comma-separated list of values by which to weight each @emph{file}. Thus the number of values must equal the number of files specified in the input file list, or else the program will exit. In the second form, the @samp{wgt} argument is the name of a weighting variable present in every input file. The variable may be a scalar or a one-dimensional record variable. Scalar weights are applied uniformly to the entire file (i.e., a per-file weight). One-dimensional weights apply to each corresponding record (i.e., per-record weights), and are suitable for dynamically changing timesteps. By default, any weights specified (whether by value or by variable name) are normalized to unity by dividing each specified weight by the sum of all the weights. This means, for example, that, @samp{-w 0.25,0.75} is equivalent to @samp{-w 2.0,6.0} since both are equal when normalized. This behavior simplifies specifying weights based on countable items. For example, time-weighting monthly averages for March, April, and May to obtain a spring seasonal average can be done with @samp{-w 31,30,31} instead of @samp{-w 0.33695652173913043478,0.32608695652173913043,0.33695652173913043478}. However, sometimes one wishes to use weights in ``dot-product mode'', i.e., multiply by the (non-normalized) weights. As of @acronym{NCO} @w{version 4.5.2}, released in July, 2015, @command{ncra} accepts the @samp{-N} (or long-option equivalent @samp{--no_nrm_by_wgt}) switch that prevents automatic weight normalization. When this switch is used, the weights will not be normalized (unless the user provides them as normalized), and the numerator of the weighted average will not be divided by the sum of the weights (which is one for normalized weights). Bear these two exceptions in mind when weighting input: First, @command{ncra} only applies weights if the arithmetic operation type is averaging (@pxref{Operation Types}), i.e., for timeseries mean and for timeseries mean absolute value. Second, weights are never applied for minimization, square-roots, etc. @command{ncra} @emph{never weights} coordinate variables (e.g., @code{time}) regardless of the weighting performed on non-coordinate variables. @noindent @html @end html EXAMPLES Average files @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}} along the record dimension, and store the results in @file{8589.nc}: @cindex globbing @cindex @code{NINTAP} @cindex Processor @cindex @acronym{CCM} Processor @example ncra 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc ncra 8[56789].nc 8589.nc ncra -n 5,2,1 85.nc 8589.nc @end example These three methods produce identical answers. @xref{Specifying Input Files}, for an explanation of the distinctions between these methods. @cindex Fortran Assume the files @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}} each contain a record coordinate @var{time} of length 12 defined such that the third record in @file{86.nc} contains data from March 1986, etc. @acronym{NCO} knows how to hyperslab the record dimension across files. Thus, to average data from December, 1985 through February, 1986: @example ncra -d time,11,13 85.nc 86.nc 87.nc 8512_8602.nc ncra -F -d time,12,14 85.nc 86.nc 87.nc 8512_8602.nc @end example @noindent The file @file{87.nc} is superfluous, but does not cause an error. The @samp{-F} turns on the Fortran (1-based) indexing convention. @cindex stride The following uses the @var{stride} option to average all the March temperature data from multiple input files into a single output file @example ncra -F -d time,3,,12 -v temperature 85.nc 86.nc 87.nc 858687_03.nc @end example @xref{Stride}, for a description of the @var{stride} argument. Assume the @var{time} coordinate is incrementally numbered such that January, @w{@math{1985 = 1}} and December, @w{@math{1989 = 60}}. Assuming @samp{??} only expands to the five desired files, the following averages June, 1985--June, 1989: @example ncra -d time,6.,54. ??.nc 8506_8906.nc @end example The @samp{-w wgt} option weights input data @emph{per-file} or @emph{per-timestep}: @example ncra -w 31,31,28 dec.nc jan.nc feb.nc out.nc ncra -w delta_t in1.nc in2.nc in3.nc out.nc @end example The first example weights the input differently per-file to produce correctly weighted winter season mean statistics. The second example weights the input per-timestep to produce correctly weighted mean statistics. @page @html @end html @node ncrcat netCDF Record Concatenator, ncremap netCDF Remapper, ncra netCDF Record Averager, Reference Manual @section @command{ncrcat} netCDF Record Concatenator @cindex concatenation @cindex record concatenation @findex ncrcat @noindent SYNTAX @example ncrcat [-3] [-4] [-6] [-7] [-A] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}][,[@var{subcycle}]]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}] [-L @var{dfl_lvl}] [-l @var{path}] [--md5_digest] [-n @var{loop}] [--no_tmp_fl] [-O] [-o @var{output-file}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-X ...] [-x] [@var{input-files}] [@var{output-file}] @end example @noindent DESCRIPTION @command{ncrcat} concatenates record variables across an arbitrary number of @var{input-files}. @cindex record dimension The final record dimension is by default the sum of the lengths of the record dimensions in the input files. @xref{Statistics vs. Concatenation}, for a description of the distinctions between the various statistics tools and concatenators. @cindex multi-file operators @cindex standard input @cindex @code{stdin} As a multi-file operator, @command{ncrcat} will read the list of @var{input-files} from @code{stdin} if they are not specified as positional arguments on the command line (@pxref{Large Numbers of Files}). Input files may vary in size, but each must have a record dimension. The record coordinate, if any, should be monotonic (or else non-fatal warnings may be generated). @cindex hyperslab Hyperslabs along the record dimension that span more than one file are handled correctly. @cindex stride @command{ncra} supports the @var{stride} argument to the @samp{-d} hyperslab option for the record dimension only, @var{stride} is not supported for non-record dimensions. @findex ncpdq @cindex packing @cindex unpacking @cindex @code{add_offset} @cindex @code{scale_factor} Concatenating a variable packed with different scales multiple datasets is beyond the capabilities of @command{ncrcat} (and @command{ncecat}, the other concatenator (@ref{Concatenation}). @command{ncrcat} does not unpack data, it simply @emph{copies} the data from the @var{input-files}, and the metadata from the @emph{first} @var{input-file}, to the @var{output-file}. This means that data compressed with a packing convention must use the identical packing parameters (e.g., @code{scale_factor} and @code{add_offset}) for a given variable across @emph{all} input files. Otherwise the concatenated dataset will not unpack correctly. The workaround for cases where the packing parameters differ across @var{input-files} requires three steps: First, unpack the data using @command{ncpdq}. Second, concatenate the unpacked data using @command{ncrcat}, Third, re-pack the result with @command{ncpdq}. @cindex ARM conventions @command{ncrcat} applies special rules to @acronym{ARM} convention time fields (e.g., @code{time_offset}). See @ref{ARM Conventions} for a complete description. @noindent @html @end html EXAMPLES Concatenate files @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}} along the record dimension, and store the results in @file{8589.nc}: @cindex globbing @cindex @code{NINTAP} @cindex Processor @cindex @acronym{CCM} Processor @example ncrcat 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc ncrcat 8[56789].nc 8589.nc ncrcat -n 5,2,1 85.nc 8589.nc @end example @noindent These three methods produce identical answers. @xref{Specifying Input Files}, for an explanation of the distinctions between these methods. @cindex Fortran Assume the files @file{85.nc}, @file{86.nc}, @w{@dots{} @file{89.nc}} each contain a record coordinate @var{time} of @w{length 12} defined such that the third record in @file{86.nc} contains data from March 1986, etc. @acronym{NCO} knows how to hyperslab the record dimension across files. Thus, to concatenate data from December, 1985--February, 1986: @example ncrcat -d time,11,13 85.nc 86.nc 87.nc 8512_8602.nc ncrcat -F -d time,12,14 85.nc 86.nc 87.nc 8512_8602.nc @end example @noindent The file @file{87.nc} is superfluous, but does not cause an error. When @command{ncra} and @command{ncrcat} encounter a file which does contain any records that meet the specified hyperslab criteria, they disregard the file and proceed to the next file without failing. The @samp{-F} turns on the Fortran (1-based) indexing convention. @cindex stride The following uses the @var{stride} option to concatenate all the March temperature data from multiple input files into a single output file @example ncrcat -F -d time,3,,12 -v temperature 85.nc 86.nc 87.nc 858687_03.nc @end example @xref{Stride}, for a description of the @var{stride} argument. Assume the @var{time} coordinate is incrementally numbered such that January, @w{1985 = 1} and December, @w{1989 = 60.} Assuming @code{??} only expands to the five desired files, the following concatenates June, 1985--June, 1989: @example ncrcat -d time,6.,54. ??.nc 8506_8906.nc @end example @page @html @end html @node ncremap netCDF Remapper, ncrename netCDF Renamer, ncrcat netCDF Record Concatenator, Reference Manual @section @command{ncremap} netCDF Remapper @cindex remap @cindex regrid @findex ncremap @noindent SYNTAX @example ncremap [-a @var{alg_typ}] [-D @var{dbg_lvl}] [-d @var{dst_fl}] [-E @var{esmf_opt}] [-G @var{grd_sng}] [-g @var{grd_dst}] [-I @var{drc_in}] [-i @var{input-file}] [-M] [-m @var{map_fl}] [-n @var{nco_opt}] [-O @var{drc_out}] [-o @var{output-file}] [-p @var{par_typ}] [-R @var{rgr_opt}] [-s @var{grd_src}] [-T @var{tempest_opt}] [-t @var{thr_nbr}] [-v @var{var_lst}[,@dots{}]] [-w @var{wgt_gnr}] [-x @var{xtn_lst}[,@dots{}]] @end example @noindent DESCRIPTION @command{ncremap} remaps the data file(s) in @var{input-file}, in @var{drc_in}, or piped through standard input, to the grid specified by (in descending order of precedence) @var{map_fl}, @var{grd_dst}, or @var{dst_fl} and stores the result in @var{output-file}(s). @command{ncremap} was introduced to @acronym{NCO} in version 4.5.4 (December, 2015). As the newest operator, its interface is still evolving to respond to user needs, feedback, and new features. @command{ncremap} orchestrates the regridding features of several different programs. Under the hood, @acronym{NCO} generates and infers grids, and calls external programs to generate the remapping weights that @acronym{NCO} then applies. @cindex @command{ncremap} @cindex @command{ESMF_RegridWeightGen} @cindex @command{GenerateOfflineMap} @cindex @command{GenerateOverlapMesh} @cindex @acronym{ERWG} @cindex TempestRemap @cindex @acronym{NCL} Unlike the rest of @acronym{NCO}, @command{ncremap} is a shell script, not a compiled binary. @command{ncremap} wraps the underlying regridder (@command{ncks}) and external executables to produce a friendly interface to regridding. Without any external dependencies, @command{ncremap} applies weights from a pre-exisiting mapfile to a source data file to produce a regridded dataset. Source and destination datasets may be on any Curvilinear, Rectangular, or Unstructured Data (@acronym{CRUD}) grid. @command{ncremap} will also, when necessary, use external programs @acronym{ESMF}'s @command{ESMF_RegridWeightGen} (@acronym{ERWG}) or TempestRemap's @command{GenerateOverlapMesh}/@command{GenerateOfflineMap}) to generate weights and mapfiles. @acronym{ERWG} is distributed in binary format with @acronym{NCL}, which many (most?) @acronym{NCO} users already have on their system(s). @acronym{ERWG} may also be installed from source: @url{https://earthsystemcog.org/projects/esmf/download_last_public}. @command{ncremap} can also generate and utilize mapfiles created by TempestRemap, @url{https://github.com/ClimateGlobalChange/tempestremap}. Please contact those projects for support on building and installing their software, which makes @command{ncremap} more functional and user-friendly. @unnumberedsubsec Options specific to @command{ncremap} The following summarizes features unique to @command{ncremap}. Features common to many operators are described in @ref{Shared features}. @table @samp @html @end html @cindex @code{-a @var{alg_typ}} @cindex @var{alg_typ} @item -a @var{alg_typ} Specifies the interpolation algorithm for weight-generation for use by @command{ESMF_RegridWeightGen} (@acronym{ERWG}). @command{ncremap} unbundles this algorithm choice from the rest of the @acronym{ERWG} invocation syntax because interpolation algorithms are more frequently change by users than other @acronym{ERWG} options (that can be changed with @samp{-E @var{esmf_opt}}). The @var{alg_typ} argument must be one of @acronym{ERWG}'s five interpolation algorithms: @code{bilinear} (default, acceptable abbreviations are @code{bln}), @code{conserve} (or @code{conservative} or @code{cns}), @code{nearestdtos} (or @code{nds} or @code{dtos}), @code{neareststod} (or @code{nds} or @code{stod}), and @code{patch} (or @code{pch} or @code{ptc}). See @acronym{ERWG} documentation @uref{http://www.earthsystemmodeling.org/esmf_releases/public/ESMF_6_3_0rp1/ESMF_refdoc/node3.html#SECTION03020000000000000000, here} for detailed descriptions of each algorithm. This option currently has no effect on TempestRemap weight-generation. @html @end html @cindex @code{-D @var{dbg_lvl}} @cindex @var{dbg_lvl} @item -D @var{dbg_lvl} Specifies a debugging level similar to the rest of @acronym{NCO}. If @math{@var{dbg_lvl} = 1}, @command{ncremap} prints more extensive diagnostics of its behavior. If @math{@var{dbg_lvl} = 2}, @command{ncremap} prints the commands it would execute at any higher or lower debugging level, but does not execute these commands. If @math{@var{dbg_lvl} > 2}, @command{ncremap} prints the diagnostic information, executes all commands, and passes-through the debugging level to the regridder (@command{ncks}) for additional diagnostics. @html @end html @cindex @code{-d @var{dst_fl}} @cindex @var{dst_fl} @item -d @var{dst_fl} Specifies a data file on the destination grid. Currently @var{dst_fl} must be a data file (not a gridfile, @acronym{SCRIP} or otherwise) from which @acronym{NCO} can infer the destination grid. The more coordinate and boundary information and metadata the better @acronym{NCO} will do at inferring the grid. If @var{dst_fl} has only cell-center coordinates (and no edges), then @acronym{NCO} will guess-at or interpolate the edges. If @var{dst_fl} has cell boundaries then @acronym{NCO} will use those. @acronym{NCO} only reads coordinate and grid data and metadata from @var{dst_fl}. @var{dst_fl} is not modified, and may have read-only permissions. @html @end html @cindex @code{-E @var{esmf_opt}} @cindex @var{esmf_opt} @item -E @var{esmf_opt} @command{ncremap} passes @var{esmf_opt} directly through to @acronym{ERWG}. The user-specified contents of @var{esmf_opt} supercede its default contents (@samp{--ignore_unmapped}). Sometimes users may wish @acronym{ERWG} to assume regional grids, in which case @var{esmf_opt} could be @samp{-r --ignore_upmapped}. @html @end html @cindex @code{-g @var{grd_dst}} @cindex @var{grd_dst} @item -g @var{grd_dst} Specifies the destination gridfile in @acronym{SCRIP} format. @acronym{NCO} will use @acronym{ERWG} to combine @var{grd_dst} with a source gridfile (either inferred from @var{input-file}, supplied with @samp{-s @var{grd_src}}, or generated from @samp{-G @var{grd_sng}}) to produce the remapping weights. @var{grd_dst} is not modified, and may have read-only permissions. @html @end html @cindex @code{-G @var{grd_sng}} @item -G @var{grd_sng} Specifies, with @acronym{NCO} options (@pxref{Grid Generation}), a source gridfile to create. (Warning: @acronym{NCO}'s syntax for gridfile generations is ugly and needs streamlining. It does, however, work well and produces finer rectangular grids than any other software we know of.) @acronym{NCO} creates the gridfile in @acronym{SCRIP} format, and then uses @acronym{ERWG} to combine that with the destination grid (either inferred from @var{input-file} or supplied with @samp{-g @var{grd_dst}} and generate mapping weights. This option is seldom used since @acronym{NCO} can infer the input grid directly from @var{input-file}. However, there may be no easier way to visually tune the choice of destination grid than by rapidly generating candidates with this option and inspecting the results. @html @end html @cindex @code{-I @var{in_drc}} @cindex @var{in_drc} @item -I @var{in_drc} Specifies the input directory, i.e., the directory which contains the input file(s). If @var{in_fl} is also specified, then the input filepath is constructed by appending a slash and the filename to the directory: @samp{@var{in_drc}/@var{in_fl}}. Specifying @var{in_drc} without @var{in_fl} causes @command{ncremap} to attempt to remap every file in @var{in_drc} that ends with one of these suffixes: @code{.nc}, @code{.nc3}, @code{.nc4}, @code{.cdf}, @code{.hdf}, @code{.he5}, or @code{.h5}. When multiple files are regridded, each output file takes the name of the corresponding input file. There is no namespace conflict because the input and output files are in separate directories. Note that @command{ncremap} could instead take the list of multiple input piped through standard input, e.g., @samp{ls *.nc | ncremap ...}. @html @end html @cindex @code{-i @var{in_fl}} @cindex @var{in_fl} @item -i @var{in_fl} Specifies the file containing data on the source grid to be remapped to the destination grid. Currently @var{in_fl} must be a data file (not a gridfile, @acronym{SCRIP} or otherwise). When provided with the optional @var{map_fl}, @command{ncremap} only reads data from @var{in_fl} in order to regrid it. Without the optional @var{map_fl}, @command{ncremap} must infer the source grid from @var{in_fl}, and so must read coordinate and metatdata information from @var{in_fl}. In this case the more coordinate and boundary information and metadata, the better @acronym{NCO} will do at inferring the source grid. If @var{in_fl} has only cell-center coordinates (and no edges), then @acronym{NCO} guess at or interpolate the edges. If @var{in_fl} has cell boundaries then @acronym{NCO} will use those. @var{in_fl} is not modified, and may have read-only permissions. @html @end html @cindex @code{-m @var{map_fl}} @cindex @var{map_fl} @item -m @var{map_fl} Specifies a pre-computed mapfile to remap the source to destination grid. The @var{map_fl} must be in @acronym{SCRIP} format, although it may have been produced by any application (usually @acronym{ERWG} or TempestRemap). If @var{map_fl} has only cell-center coordinates (and no edges), then @acronym{NCO} will guess-at or interpolate the edges. If @var{map_fl} has cell boundaries then @acronym{NCO} will use those. @var{map_fl} is not modified, and may have read-only permissions. @html @end html @cindex @code{-M} @item -M @command{ncremap} assumes that every input file is on a unique grid unless a source gridfile is specified (with @samp{-s @var{grd_src}}) or multiple-mapfile generation is explicitly turned-off (with @samp{-M}). The @samp{-M} switch is toggled, it requires and accepts no argument. Toggling @samp{-M} tells @command{ncremap} to generate at most one mapfile regardless of the number of input files. If @samp{-M} is not toggled (and neither @samp{-m @var{map_fl}} nor @samp{-s @var{grd_src}} is invoked) then @command{ncremap} will use @acronym{ERWG} to generate a new mapfile for each input file. Generating new mapfiles for each input file is necessary for processing batches of data on different grids (e.g., swath-like data), and slow, tedious, and unnecessary when batch processing data on the same grids. @html @end html @cindex @code{-n @var{nco_opt}} @cindex @var{nco_opt} @item -n @var{nco_opt} Specifies a string of options to pass-through unaltered to @command{ncks}. @var{nco_opt} defaults to @samp{-O --no_tmp_fl}. @html @end html @cindex @code{-O @var{out_drc}} @cindex @var{out_drc} @item -O @var{out_drc} Specifies the output directory, i.e., the directory name to contain the output file(s). If @var{out_fl} is also specified, then the output filepath is constructed by appending a slash and the filename to the directory: @samp{@var{out_drc}/@var{out_fl}}. Specifying @var{out_drc} without @var{out_fl} causes @command{ncremap} to name each output file the same as the corresponding input file. There is no namespace conflict because the input and output files will be in separate directories. @html @end html @cindex @code{-o @var{out_fl}} @item -o @var{out_fl} Specifies the output filename, i.e., the name of the file to contain the data from @var{in_fl} remapped to the destination grid. If @var{out_fl} already exists it will be overwritten. Specifying @var{out_fl} when there are multiple input files (i.e., from using @samp{-I @var{in_drc}} or standard input) generates an error (output files will be named the same as input files). @html @end html @cindex @code{-p @var{par_typ}} @cindex @var{par_typ} @item -p @var{par_typ} Specifies the parallelism mode desired. Parallelism accelerate throughput when regridding multiple files in one @command{ncremap} invocation. Valid types are @samp{bck} (for Background mode), @samp{mpi} (for @acronym{MPI} mode), and @samp{nil} (for none). The default @var{par_typ} is @samp{nil}, which means @command{ncremap} will run in serial mode, and process one file at a time. Background and @acronym{MPI} parallelism modes both issue all regridding commands at one time. In Background mode these commands are spawned as @acronym{UNIX} background processes on the local node. Nodes with mutiple cores will take advantage of this and simultaneously execute regridding commands. In @acronym{MPI} mode these commands are issued round-robin fashion to all the compute nodes available to the job. Typically both parallel modes scale well with sufficent @acronym{CPU}s until I/O contention becomes the bottleneck. Currently there is no way to limit the number of regridding commands spawned in parallel mode, so be sure not to overwhelm your system. Furthermore, a naming conflict among intermediate files still exists (see Limitations, below) so parallel mode is currently only supported when all source files share the same grid. @html @end html @cindex @code{-R @var{rgr_opt}} @cindex @var{rgr_opt} @item -R @var{rgr_opt} @command{ncremap} passes @var{rgr_opt} directly through to the regridder. This is useful to customize output grids and metadata. The default value is @samp{--rgr lat_nm_out=lat --rgr lon_nm_out=lon}, i.e., by default @command{ncremap} always names latitude and longitude ``lat'' and ``lon'', respectively, regardless of their input names. @html @end html @cindex @code{-s @var{grd_src}} @cindex @var{grd_src} @item -s @var{grd_src} Specifies the source gridfile in @acronym{SCRIP} format. @acronym{NCO} will use @acronym{ERWG} to combine this with a destination gridfile (either inferred from @var{dst_fl}, or generated by supplying a @samp{-G @var{grd_sng}} option) to generate remapping weights. @var{grd_src} is not modified, and may have read-only permissions. One appropriate circumstance to specify @var{grd_src} is when the @var{input-file}(s) do not contain sufficient information for @acronym{NCO} to infer an accurate or complete source grid. (Unfortunately many dataset producers do not record information like cell edges/vertices in their datasets. This is problematic for non-rectangular grids.) @acronym{NCO} assumes that @var{grd_src}, when supplied, applies to every @var{input-file}. Thus @acronym{NCO} will call @acronym{ERWG} only once, and will use that @var{map_fl} to regrid every @var{input-file}. @html @end html @cindex @code{-T @var{tempest_opt}} @cindex @var{tempest_opt} @item -T @var{tempest_opt} @command{ncremap} passes @var{tempest_opt} directly through to @command{GenerateOfflineMap} (not to @command{GenerateOverlapMesh}). The user-specified contents of @var{tempest_opt} supercede its default contents, which are currently empty. For example, to cause @command{GenerateOfflineMap} to use a @code{_FillValue} of @math{-1}, pass @samp{-T "--fillvalue -1.0"} to @command{ncremap}. @html @end html @cindex @code{-t @var{thr_nbr}} @cindex @var{thr_nbr} @item -t @var{thr_nbr} Specifies the number of threads used per regridding process (@pxref{OpenMP Threading}). The @acronym{NCO} regridder scales well up to 8--16 threads. @html @end html @cindex @code{-v @var{var_lst}} @cindex @var{var_lst} @item -v @var{var_lst} The @samp{-v} option causes @command{ncremap} to regrid only the variables in @var{var_lst}. It behaves like subsetting (@pxref{Subsetting Files}) in the rest of @acronym{NCO}. @html @end html @cindex @code{-w @var{wgt_gnr}} @cindex @var{wgt_gnr} @item -w @var{wgt_gnr} Specifies the weight-generator to use when a map-file is not provided. The @var{wgt_gnr} argument must be @code{esmf} for @acronym{ESMF}'s @command{ESMF_RegridWeightGen} (@acronym{ERWG}), or @code{tempest} for TempestRemaps's @command{GenerateOverlapMesh} and @command{GenerateOfflineMap}. Specifying @var{wgt_gnr} and supplying (with @samp{-m}) a map-file is not permitted (since the weight-generator would not be used). @html @end html @cindex @code{-v @var{xtn_lst}} @cindex @var{xtn_lst} @item -x @var{xtn_lst} The @samp{-x} option causes @command{ncremap} to treat the variables in @var{xtn_lst} as @dfn{extensive}, meaning that their value depends on the gridcell boundaries. Support for extensive variables during regridding is nascent. Currently variables marked as extensive are summed, not regridded. @end table @unnumberedsubsec Limitatations to @command{ncremap} There are three significant limitations to @command{ncremap} that we hope to remove in the coming year. First, the fields to be regridded must have latitude and longitude as the final two dimension in @var{in_fl}. Fields with other dimension orders (e.g., @samp{lat,lev,lon}) will not regrid properly. To workaround this limitation for the time-being, please employ @command{ncpdq} (@pxref{ncpdq netCDF Permute Dimensions Quickly}) to permute the dimensions before (and un-permute them after) regridding. For example @example # AIRS Level2 vertical profiles ncpdq -a StdPressureLev,GeoTrack,GeoXTrack AIRS_L2.hdf AIRS_L2.ncpdq.nc ncremap -i AIRS_L2.ncpdq.nc -d dst_1x1.nc -O ~/rgr # MPAS-O fields ncpdq -a Time,nVertLevels,maxEdges,MaxEdges2,nEdges,nCells mpas.nc mpas_ncpdq.nc ncremap -R "--rgr col_nm=nCells" -i mpas_ncpdq.nc -m mpas120_to_t62.nc -O ~/rgr @end example @noindent The second limitation is that @command{ncremap} does not yet follow @acronym{CF} conventions to identify coordinate variables. Instead, @command{ncremap} uses an internal database of ``usual suspects'' to identify latitude and longitude coordinate variables. Hence even if the @var{input-file} is completely @acronym{CF}-compliant, @command{ncremap} may not automatically identify the spatial dimensions. To workaround this limitation, supply @command{ncremap} with the names of the horizontal spatial dimensions @example ncremap -R "--rgr lat_nm=xq --rgr lon_nm=zj" -i in.nc -d dst.nc -O ~/rgr @end example @noindent The third limitation is that @command{ncremap} currently must read weights from a mapfile, it cannot compute weights itself in memory. This makes @command{ncremap} an ``offline regridder'' and unnecessarily slow compared to a program an ``integrated regridder'' that computes weights and immediately applies them in @acronym{RAM} without any map-file. In practice, the difference is most noticeable when the weights are easily computable ``on the fly'', e.g., rectangular-to-rectangular mappings. Otherwise the weight-generation takes much more time than the weight-application, at which @command{ncremap} is quite fast. To workaround this limitation, build @command{ESMF_RegridWeightGen} with parallel capabilities and ask me to enhance @command{ncremap} to call @acronym{ERWG} with the options to exploit those capabilities. A side-effect of @command{ncremap} being an offline regridder is that, when necessary, it generates intermediate files to store grids and maps. (No intermediate files are generated when the map-file is provided). These files are named, by default, @file{ncremap_tmp_grd_dst.nc}, @file{ncremap_tmp_grd_src.nc}, @file{ncremap_tmp_gnr_out.nc}, @file{ncremap_tmp_map_*.nc}, and @file{ncremap_tmp_msh_ovr_*.nc}. They are placed in @var{drc_out}, which is the current working directory unless otherwise specified. Should they proliferate and/or annoy you, locate and/or remove all intermediate files under the current directory with @example find . -name 'ncremap_tmp*' rm `find . -name 'ncremap_tmp*'` @end example @noindent When @command{ncremap} is run in parallel mode, the intermediate files can interfere with one-another, and must be uniquely named. We have not yet addressed this issue, so parallel mode is supported when all input files are on the same grid, and unsupported otherwise. If this limitation affects your workflow, please let us know and we will increase the priority of addressing it. @noindent @html @end html EXAMPLES Regrid input file @file{in.nc} to the spatial grid in file @file{dst.nc} and write the output to @file{out.nc}: @example ncremap -i in.nc -d dst.nc -o out.nc ncremap -i in.nc -d dst.nc -O regrid ncremap -i in.nc -d dst.nc -O regrid -o out.nc ncremap -i in.nc -d dst.nc -o regrid/out.nc @end example @noindent @acronym{NCO} infers the destination spatial grid from @file{dst.nc} by reading its coordinate variables and @acronym{CF} attributes. In the first example, @command{ncremap} places the output in @file{out.nc}. In the second example, @command{ncremap} places the output in the specified output directory. Since no output filename is provided, the output file will be named @file{regrid/in.nc}. In the third and fourth examples, the output file is @file{regrid/out.nc}. To save time generating weights, use a pre-computed mapfile instead @example ncremap -i in.nc -m map.nc -o out.nc ncremap -I drc_in -m map.nc -O regrid @end example Supplying the mapfile @var{map_fl} considerably reduces wallclock time. The mapfile file may have been generated by a previous @command{ncremap} invocation. To test the remapping workflow, limit regridding to one or a few variables instad of remapping the entire file: @example ncremap -v T,Q,FSNT -i in.nc -m map.nc -o out.nc @end example Regridding generally scales linearly with the size of data to be regridded, so eliminating unnecessary variables produces a snappier response. Regrid multiple input files with a single mapfile @file{map.nc} and write the output to the @file{regrid} directory: @example ncremap -I drc_in -m map.nc -O regrid ls drc_in/*.nc | ncremap -m map.nc -O regrid @end example @noindent The three ways @acronym{NCO} obtains the destination spatial grid are, in decreasing order of precedence, from @var{map_fl} (specified with @samp{-m}), from @var{grd_dst} (specified with @samp{-g}), and (inferred) from @var{dst_fl} (specified with @samp{-d}). In the first example all likely data files from @var{drc_in} are regridded using the same specified mapfile, @var{map_fl} = @file{map.nc}. Each output file is written to @var{drc_out} = @file{regrid} with the same name as the corresponding input file. The second example obtains the input file list from standard input, and uses the mapfile and output directory as before. If multiple input files are on the same grid, yet the mapfile does not exist in advance, one can still regrid all the input without suffering the time-penalty of generating multiple mapfiles. To do so, one must provide the (known-in-advance) source gridfile or toggle the @samp{-M} switch: @example ncremap -M -I drc_in -d dst.nc -O regrid ls drc_in/*.nc | ncremap -M -d dst.nc -O regrid ncremap -I drc_in -s grd_src.nc -d dst.nc -O regrid ls drc_in/*.nc | ncremap -s grd_src.nc -d dst.nc -O regrid ncremap -I drc_in -s grd_src.nc -g grd_dst.nc -O regrid ls drc_in/*.nc | ncremap -s grd_src.nc -g grd_dst.nc -O regrid @end example @noindent The first two examples explicitly toggle the multi-map-generation switch (with @samp{-M}), so that @command{ncremap} refrains from generating multiple mapfiles. In this case the source grid is inferred from the first input file, the destination grid is inferred from @file{dst.nc}, and @command{ncremap} uses @acronym{ERWG} to generate a single mapfile and uses that to regrid every input file. The next four examples are variants on this theme. In these cases, the user provides (with @samp{-s grd_src.nc}) the source gridfile, which will be used directly instead of being inferred. Any of these styles works well when each input file is known in advance to be on the same grid, e.g., model data for successive time periods in a simulation. The most powerful, time-consuming (yet simultaneously time-saving!) feature of @command{ncremap} is its ability to regrid multiple input files on unique grids. Both the input and output can be on any @acronym{CRUD} grid. @example ncremap -I drc_in -d dst.nc -O regrid ls drc_in/*.nc | ncremap -d dst.nc -O regrid ncremap -I drc_in -g grd_dst.nc -O regrid ls drc_in/*.nc | ncremap -g grd_dst.nc -O regrid @end example @noindent There is no pre-supplied @var{map_fl} or @var{grd_src} in these examples, so @command{ncremap} first infers the output grid from @file{dst.nc} (first two examples), or directly uses the supplied gridfile @file{grd_dst} (second two examples), and calls @acronym{ERWG} to generate a new mapfile for each input file, whose grid it infers. This is necessary when each input file is on a unique grid, e.g., swath-like data from satellite observations or models with time-varying grids. These examples require remarkably little input, since @command{ncremap} automates most of the work. @page @html @end html @node ncrename netCDF Renamer, ncwa netCDF Weighted Averager, ncremap netCDF Remapper, Reference Manual @section @command{ncrename} netCDF Renamer @cindex renaming variables @cindex renaming groups @cindex renaming dimensions @cindex renaming attributes @cindex variable names @cindex dimension names @cindex attribute names @cindex group names @findex ncrename @noindent SYNTAX @example ncrename [-a @var{old_name},@var{new_name}] [-a @dots{}] [-D @var{dbg}] [-d @var{old_name},@var{new_name}] [-d @dots{}] [-g @var{old_name},@var{new_name}] [-g @dots{}] [--glb ...] [-h] [--hdf] [--hdr_pad @var{nbr}] [-l @var{path}] [-O] [-o @var{output-file}] [-p @var{path}] [-R] [-r] [-v @var{old_name},@var{new_name}] [-v @dots{}] @var{input-file} [[@var{output-file}]] @end example @noindent DESCRIPTION @cindex @kbd{.} @command{ncrename} renames netCDF dimensions, variables, attributes, and groups. Each object that has a name in the list of old names is renamed using the corresponding name in the list of new names. All the new names must be unique. Every old name must exist in the input file, unless the old name is preceded by the period (or ``dot'') character @samp{.}. The validity of @var{old_name} is not checked prior to the renaming. Thus, if @var{old_name} is specified without the @samp{.} prefix that indicates the presence of @var{old_name} is optional, and @var{old_name} is not present in @var{input-file}, then @command{ncrename} will abort. The @var{new_name} should never be prefixed by a @samp{.} (or else the period will be included as part of the new name). As of @acronym{NCO} version 4.4.6 (released October, 2014), the @var{old_name} and @var{new_name} arguments may include (or be, for groups) partial or full group paths. The OPTIONS and EXAMPLES show how to select specific variables whose attributes are to be renamed. @html @end html @cartouche Caveat lector: Unforunately from 2007--present (January, 2016) the netCDF library (versions 4.0.0--4.4.0-rc5) contained bugs or limitations that sometimes prevent @acronym{NCO} from correctly renaming coordinate variables, dimensions, and groups in netCDF4 files. (To our knowledge the netCDF library calls for renaming always work well on netCDF3 files so one workaround to some netCDF4 issues is convert to netCDF3, rename, then convert back). To understand the renaming limitations associated with particular netCDF versions, read the @command{ncrename} documentation below in its entirety. @end cartouche Although @command{ncrename} supports full pathnames for both @var{old_name} and @var{new_name}, this is really ``window dressing''. The full-path to @var{new_name} must be identical to the full-path to @var{old_name} in all classes of objects (attributes, variables, dimensions, or groups). In other words, @command{ncrename} can change only the local names of objects, it cannot change the location of the object in the group hierarchy within the file. Hence using a full-path in @var{new_name} is redundant. The object name is the terminal path component of @var{new_name} and this object must already exist in the group specified by the @var{old_name} path. @cindex data safety @cindex safeguards @cindex temporary output files @command{ncrename} is an exception to the normal @acronym{NCO} rule that the user will be interactively prompted before an existing file is changed, and that a temporary copy of an output file is constructed during the operation. If only @var{input-file} is specified, then @command{ncrename} changes object names in the @var{input-file} in place without prompting and without creating a temporary copy of @code{input-file}. This is because the renaming operation is considered reversible if the user makes a mistake. The @var{new_name} can easily be changed back to @var{old_name} by using @command{ncrename} one more time. Note that renaming a dimension to the name of a dependent variable can be used to invert the relationship between an independent coordinate variable and a dependent variable. In this case, the named dependent variable must be one-dimensional and should have no missing values. Such a variable will become a coordinate variable. @cindex performance @cindex operator speed @cindex speed @cindex execution time According to the @cite{netCDF User Guide}, renaming objects in netCDF files does not incur the penalty of recopying the entire file when the @var{new_name} is shorter than the @var{old_name}. Thus @command{ncrename} may run much faster (at least on netCDF3 files) if judicious use of header padding (@pxref{Metadata Optimization}) was made when producing the @var{input-file}. Similarly, using the @samp{--hdr_pad} option with @command{ncrename} helps ensure that future metadata changes to @var{output-file} occur as swifly as possible. @noindent OPTIONS @table @samp @item -a @var{old_name},@var{new_name} Attribute renaming. The old and new names of the attribute are specified with @samp{-a} (or @samp{--attribute}) by the associated @var{old_name} and @var{new_name} values. @cindex @code{global} attribute @cindex global attributes @cindex attributes, global Global attributes are treated no differently than variable attributes. This option may be specified more than once. As mentioned above, all occurrences of the attribute of a given name will be renamed unless the @samp{.} form is used, with one exception. To change the attribute name for a particular variable, specify the @var{old_name} in the format @var{old_var_name@@old_att_name}. The @samp{@@} symbol delimits the variable from the attribute name. If the attribute is uniquely named (no other variables contain the attribute) then the @var{old_var_name@@old_att_name} syntax is redundant. The @var{old_var_name} variable names @code{global} and @code{group} have special significance. They indicate that @var{old_att_nm} should only be renamed where it occurs as a global (i.e., root group) metadata attribute (for @code{global}), or (for @code{group}) as @emph{any} group attribute, and not where it occurs as a variable attribute. The @var{var_name@@att_name} syntax is accepted, though not required, for the @var{new_name}. @item -d @var{old_name},@var{new_name} Dimension renaming. The old and new names of the dimension are specified with @samp{-d} (or @samp{--dmn}, @samp{--dimension}) by the associated @var{old_name} and @var{new_name} values. This option may be specified more than once. @item -g @var{old_name},@var{new_name} Group renaming. The old and new names of the group are specified with @samp{-g} (or @samp{--grp}, @samp{--group}) by the associated @var{old_name} and @var{new_name} values. This option may be specified more than once. This functionality is only available in @acronym{NCO} version 4.3.7 (October, 2013) or later, and only when built on netCDF library version 4.3.1-rc1 (August, 2013) or later. @item -v @var{old_name},@var{new_name} Variable renaming. The old and new names of the variable are specified with @samp{-v} (or @samp{--variable}) by the associated @var{old_name} and @var{new_name} values. This option may be specified more than once. @end table @noindent @html @end html EXAMPLES Rename the variable @code{p} to @code{pressure} and @code{t} to @code{temperature} in netCDF @file{in.nc}. In this case @code{p} must exist in the input file (or @command{ncrename} will abort), but the presence of @code{t} is optional: @example ncrename -v p,pressure -v .t,temperature in.nc @end example Rename the attribute @code{long_name} to @code{largo_nombre} in the variable @code{u}, and no other variables in netCDF @file{in.nc}. @example @verbatim ncrename -a u@long_name,largo_nombre in.nc @end verbatim @end example Rename the group @code{g8} to @code{g20} in netCDF4 file @file{in_grp.nc}: @example ncrename -g g8,g20 in_grp.nc @end example Rename the variable @code{/g1/lon} to @code{longitude} in netCDF4 @file{in_grp.nc}: @example ncrename -v /g1/lon,longitude in_grp.nc ncrename -v /g1/lon,/g1/longitude in_grp.nc # Alternate @end example @html @end html @cindex coordinate variables @command{ncrename} does not automatically attach dimensions to variables of the same name. This is done to make renaming an easy way to change whether a variable is a coordinate. If you want to rename a coordinate variable so that it remains a coordinate variable, you must separately rename both the dimension and the variable: @example ncrename -d lon,longitude -v lon,longitude in.nc @end example Unfortunately, the netCDF4 library had a longstanding bug (all versions until 4.3.1-rc5 released in December, 2013) that crashed @acronym{NCO} when performing this operation. Simultaneously renaming variables and dimensions in netCDF4 files with earlier versions of netCDF is impossible; it must instead be done in two separate @command{ncrename} invocations (e.g., first rename the variable, then rename the dimension) to avoid triggering the libary bug. A related bug causes unintended side-effects with @command{ncrename} also built with all versions of the netCDF4 library until 4.3.1-rc5 released in December, 2013): This bug caused renaming @emph{either} a dimension @emph{or} its associated coordinate variable (not both, which would fail as above) in a netCDF4 file to inadvertently rename both: @example # Demonstate bug in netCDF4/HDF5 library prior to netCDF-4.3.1-rc5 ncks -O -h -m -M -4 -v lat_T42 ~/nco/data/in.nc ~/foo.nc ncrename -O -v lat_T42,lat ~/foo.nc ~/foo2.nc # Also renames dimension ncrename -O -d lat_T42,lat ~/foo.nc ~/foo2.nc # Also renames variable @end example To avoid this faulty behavior, either build @acronym{NCO} with netCDF version 4.3.1-rc5 or later, or convert the file to netCDF3 first, then rename as intended, then convert back. Unforunately while this bug and the related coordinate renaming bug were fixed in 4.3.1-rc5 (released in December, 2013), a new and related bug was discovered in October 2014. Another netCDF4 bug that causes unintended side-effects with @command{ncrename} affects (at least) versions 4.3.1--4.3.2 and all snapshots of the netCDF4 library until January, 2015. This bug (fixed in 4.3.3 in February, 2015) corrupts values or renamed netCDF4 coordinate variables (i.e., variables with underlying dimensions of the same name) and other (non-coordinate) variables that include an underlying dimension that was renamed. In other words, @emph{renaming} coordinate variables and dimensions succeeds yet it corrupts the values contained by the affected array variables. This bug corrupts affected variables by replacing their values with the default @code{_FillValue} for that variable's type: @example # Demonstate bug in netCDF4/HDF5 library prior to netCDF-4.3.3 ncks -O -4 -C -M -v lat ~/nco/data/in.nc ~/bug.nc ncrename -O -v lat,tal ~/bug.nc ~/foo.nc # Broken until netCDF-4.3.3 ncrename -O -d lat,tal ~/bug.nc ~/foo.nc # Broken until netCDF-4.3.3 ncrename -O -d lat,tal -v lat,tal ~/bug.nc ~/foo.nc # Broken too ncks --cdl ~/foo.nc @end example To avoid this faulty behavior, either build @acronym{NCO} with netCDF version 4.3.3 or later, or convert the file to netCDF3 first, then rename as intended, then convert back. This bug does not affect renaming of groups or of attributes. Yet another netCDF4 bug that causes unintended side-effects with @command{ncrename} affects only snapshots from January--February, 2015, and released version 4.3.3 (February, 2015). It was fixed in (and was the reason for releasing) netCDF version 4.3.3.1 (March, 2015). This bug causes renamed attributes of coordinate variables in netCDF4 to files to disappear: @example @verbatim # Demonstate bug in netCDF4/HDF5 library netCDF-4.3.3 ncrename -O -h -a /g1/lon@units,new_units ~/nco/data/in_grp.nc ~/foo.nc ncks -v /g1/lon ~/foo.nc # Shows units and new_units are both gone @end verbatim @end example Clearly, renaming dimensions in netCDF4 files is non-trivial. The latest chapter in this saga is a netCDF4 bug discovered in September, 2015, and present in version 4.3.3.1 (and possibly earlier versions too). This bug causes @command{ncrename} to create corrupted output files when attempting to rename two dimensions simultaneously. The workaround is to rename the dimensions sequentially, in two separate @command{ncrename} calls. @example @verbatim # Demonstate bug in netCDF4/HDF5 library netCDF-4.3.3.1 ncrename -d y,rlat -d x,rlon dayclim_withoutpr.nc dayclim2.nc ncdump dayclim2.nc # File is unreadable @end verbatim @end example @cindex global attributes @cindex group attributes @cindex attributes, global @cindex @code{_FillValue} @cindex @code{missing_value} Create netCDF @file{out.nc} identical to @file{in.nc} except the attribute @code{_FillValue} is changed to @code{missing_value}, the attribute @code{units} is changed to @code{CGS_units} (but only in those variables which possess it), the attribute @code{hieght} is changed to @code{height} in the variable @code{tpt}, and in the variable @code{prs_sfc}, if it exists. @example @verbatim ncrename -a _FillValue,missing_value -a .units,CGS_units \ -a tpt@hieght,height -a prs_sfc@.hieght,height in.nc out.nc @end verbatim @end example The presence and absence of the @samp{.} and @samp{@@} features cause this command to execute successfully only if a number of conditions are met. All variables @emph{must} have a @code{_FillValue} attribute @emph{and} @code{_FillValue} must also be a global attribute. The @code{units} attribute, on the other hand, will be renamed to @code{CGS_units} wherever it is found but need not be present in the file at all (either as a global or a variable attribute). The variable @code{tpt} must contain the @code{hieght} attribute. The variable @code{prs_sfc} need not exist, and need not contain the @code{hieght} attribute. Rename the global or group attribute @code{Convention} to @code{Conventions} @example @verbatim ncrename -a Convention,Conventions in.nc # Variable and group atts. ncrename -a .Convention,Conventions in.nc # Variable and group atts. ncrename -a @Convention,Conventions in.nc # Group atts. only ncrename -a @.Convention,Conventions in.nc # Group atts. only ncrename -a global@Convention,Conventions in.nc # Group atts. only ncrename -a .global@.Convention,Conventions in.nc # Group atts. only ncrename -a global@Convention,Conventions in.nc # Global atts. only ncrename -a .global@.Convention,Conventions in.nc # Global atts. only @end verbatim @end example The examples without the @code{@@} character attempt to change the attribute name in both Global or Group and variable attributes. The examples with the @code{@@} character attempt to change only global and group @code{Convention} attributes, and leave unchanged any @code{Convention} attributes attached directly to variables. Attributes prefixed with a period (@code{.Convention}) need not be present. Attributes not prefixed with a period (@code{Convention}) must be present. Variables prefixed with a period (@code{.} or @code{.global}) need not be present. Variables not prefixed with a period (@code{global}) must be present. @page @html @end html @node ncwa netCDF Weighted Averager, , ncrename netCDF Renamer, Reference Manual @section @command{ncwa} netCDF Weighted Averager @cindex averaging data @cindex weighted average @cindex masked average @cindex broadcasting variables @findex ncwa @noindent SYNTAX @example ncwa [-3] [-4] [-6] [-7] [-A] [-a @var{dim}[,@dots{}]] [-B @var{mask_cond}] [-b] [-C] [-c] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min sz] [--cnk_plc plc] [--cnk_scl sz] [-D @var{dbg}] [-d @var{dim},[@var{min}][,[@var{max}][,[@var{stride}]]] [-F] [-G @var{gpe_dsc}] [-g @var{grp}[,@dots{}]] [--glb ...] [-h] [--hdr_pad @var{nbr}] [-I] [-L @var{dfl_lvl}] [-l @var{path}] [-M @var{mask_val}] [-m @var{mask_var}] [-N] [--no_tmp_fl] [-O] [-o @var{output-file}] [-p @var{path}] [--ppc ...] [-R] [-r] [--ram_all] [--rth_dbl|flt] [-T @var{mask_comp}] [-t @var{thr_nbr}] [--unn] [-v @var{var}[,@dots{}]] [-w @var{weight}] [-X ...] [-x] [-y @var{op_typ}] @var{input-file} [@var{output-file}] @end example @noindent DESCRIPTION @command{ncwa} averages variables in a single file over arbitrary dimensions, with options to specify weights, masks, and normalization. @xref{Statistics vs. Concatenation}, for a description of the distinctions between the various statistics tools and concatenators. The default behavior of @command{ncwa} is to arithmetically average every numerical variable over all dimensions and to produce a scalar result for each. @cindex degenerate dimension Averaged dimensions are, by default, eliminated as dimensions. Their corresponding coordinates, if any, are output as scalar variables. The @samp{-b} switch (and its long option equivalents @samp{--rdd} and @samp{--retain-degenerate-dimensions}) causes @command{ncwa} to retain averaged dimensions as degenerate (@w{size 1}) dimensions. This maintains the association between a dimension (or coordinate) and variables after averaging and simplifies, for instance, later concatenation along the degenerate dimension. To average variables over only a subset of their dimensions, specify these dimensions in a comma-separated list following @samp{-a}, e.g., @samp{-a time,lat,lon}. @cindex arithmetic operators @cindex hyperslab @cindex @code{-d @var{dim},[@var{min}][,[@var{max}]]} As with all arithmetic operators, the operation may be restricted to an arbitrary hyperslab by employing the @samp{-d} option (@pxref{Hyperslabs}). @command{ncwa} also handles values matching the variable's @code{_FillValue} attribute correctly. Moreover, @command{ncwa} understands how to manipulate user-specified weights, masks, and normalization options. With these options, @command{ncwa} can compute sophisticated averages (and integrals) from the command line. @html @end html @cindex @code{-w @var{weight}} @cindex @code{--weight @var{weight}} @cindex @code{--wgt_var @var{weight}} @cindex @code{-m @var{mask_var}} @cindex @code{--mask-variable @var{mask_var}} @cindex @code{--mask_variable @var{mask_var}} @cindex @code{--msk_nm @var{mask_var}} @cindex @code{--msk_var @var{mask_var}} @cindex @code{-B @var{mask_cond}} @cindex @code{--msk_cnd @var{mask_cond}} @cindex @code{--mask_condition @var{mask_cond}} @var{mask_var} and @var{weight}, if specified, are broadcast to conform to the variables being averaged. @cindex rank The rank of variables is reduced by the number of dimensions which they are averaged over. Thus arrays which are one dimensional in the @var{input-file} and are averaged by @command{ncwa} appear in the @var{output-file} as scalars. This allows the user to infer which dimensions may have been averaged. Note that that it is impossible for @command{ncwa} to make make a @var{weight} or @var{mask_var} of rank @var{W} conform to a @var{var} of rank @var{V} if @var{W > V}. This situation often arises when coordinate variables (which, by definition, are one dimensional) are weighted and averaged. @command{ncwa} assumes you know this is impossible and so @command{ncwa} does not attempt to broadcast @var{weight} or @var{mask_var} to conform to @var{var} in this case, nor does @command{ncwa} print a warning message telling you this, because it is so common. Specifying @var{dbg > 2} does cause @command{ncwa} to emit warnings in these situations, however. Non-coordinate variables are always masked and weighted if specified. Coordinate variables, however, may be treated specially. By default, an averaged coordinate variable, e.g., @code{latitude}, appears in @var{output-file} averaged the same way as any other variable containing an averaged dimension. In other words, by default @command{ncwa} weights and masks coordinate variables like all other variables. This design decision was intended to be helpful but for some applications it may be preferable not to weight or mask coordinate variables just like all other variables. Consider the following arguments to @command{ncwa}: @code{-a latitude -w lat_wgt -d latitude,0.,90.} where @code{lat_wgt} is a weight in the @code{latitude} dimension. Since, by default @command{ncwa} weights coordinate variables, the value of @code{latitude} in the @var{output-file} depends on the weights in @var{lat_wgt} and is not likely to @w{be 45.0}, the midpoint latitude of the hyperslab. @cindex coordinate variable @cindex @code{-I} Option @samp{-I} overrides this default behavior and causes @command{ncwa} not to weight or mask coordinate variables @footnote{The default behavior of (@samp{-I}) changed on 19981201---before this date the default was not to weight or mask coordinate variables.}. In the above case, this causes the value of @code{latitude} in the @var{output-file} to @w{be 45.0}, an appealing result. Thus, @samp{-I} specifies simple arithmetic averages for the coordinate variables. In the case of latitude, @samp{-I} specifies that you prefer to archive the arithmetic mean latitude of the averaged hyperslabs rather than the area-weighted mean latitude. @footnote{If @code{lat_wgt} contains Gaussian weights then the value of @code{latitude} in the @var{output-file} will be the area-weighted centroid of the hyperslab. For the example given, this is about @w{30 degrees.}}. @cindex average @cindex operation types As explained in @xref{Operation Types}, @command{ncwa} @emph{always averages} coordinate variables regardless of the arithmetic operation type performed on the non-coordinate variables. This is independent of the setting of the @samp{-I} option. The mathematical definition of operations involving rank reduction is given above (@pxref{Operation Types}). @menu * Mask condition:: * Normalization and Integration:: @end menu @html @end html @node Mask condition, Normalization and Integration, ncwa netCDF Weighted Averager, ncwa netCDF Weighted Averager @subsection Mask condition @cindex mask condition @cindex truth condition @tex Each $\xxx_{\idx}$ also has an associated masking weight~$\mskflg_{\idx}$ whose value is~0 or~1 (false or true). The value of~$\mskflg_{\idx}$ is always~1 unless a @var{mask\_var} is specified (with @samp{-m}). As noted above, @var{mask\_var} is broadcast, if possible, to conform to the variable being averaged. In this case, the value of~$\mskflg_{\idx}$ depends on the @dfn{mask condition} also known as the @dfn{truth condition}. As expected, $\mskflg_{\idx} = 1$ when the mask condition is @dfn{true} and $\mskflg_{\idx} = 0$ otherwise. @end tex @cindex @code{--op_rlt @var{mask_comp}} @cindex @code{--mask_comparator @var{mask_comp}} @cindex @code{--msk_cmp_typ @var{mask_comp}} @cindex @code{--msk_cnd_sng @var{mask_cond}} @cindex @code{--mask_condition @var{mask_cond}} @cindex @code{-B @var{mask_cond}} The mask condition has the syntax @math{@var{mask_var}} @math{@var{mask_comp}} @math{@var{mask_val}}. The preferred method to specify the mask condition is in one string with the @samp{-B} or @samp{--mask_condition} switches. The older method is to use the three switches @samp{-m}, @samp{-T}, and @samp{-M} to specify the @var{mask_var}, @var{mask_comp}, and @var{mask_val}, respectively. @footnote{The three switches @samp{-m}, @samp{-T}, and @samp{-M} are maintained for backward compatibility and may be deprecated in the future. It is safest to write scripts using @samp{--mask_condition}.}. The @var{mask_condition} string is automatically parsed into its three constituents @var{mask_var}, @var{mask_comp}, and @var{mask_val}. @cindex comparator Here @var{mask_var} is the name of the masking variable (specified with @samp{-m}, @samp{--mask-variable}, @samp{--mask_variable}, @samp{--msk_nm}, or @samp{--msk_var}). The truth @var{mask_comp} argument (specified with @samp{-T}, @samp{--mask_comparator}, @samp{--msk_cmp_typ}, or @samp{--op_rlt} may be any one of the six arithmetic comparators: @kbd{eq}, @kbd{ne}, @kbd{gt}, @kbd{lt}, @kbd{ge}, @kbd{le}. @set flg @tex These are the Fortran-style character abbreviations for the logical comparisons $=$, $\neq$, $>$, $<$, $\ge$, $\le$. @clear flg @end tex @ifinfo These are the Fortran-style character abbreviations for the logical comparisons @math{==}, @math{!=}, @math{>}, @math{<}, @math{>=}, @math{<=}. @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} These are the Fortran-style character abbreviations for the logical comparisons @kbd{==}, @kbd{!=}, @kbd{>}, @kbd{<}, @kbd{>=}, @clear flg @end ifset The mask comparator defaults to @kbd{eq} (equality). @cindex @code{--mask-value @var{mask_val}} @cindex @code{--mask_value @var{mask_val}} @cindex @code{--msk_val @var{mask_val}} The @var{mask_val} argument to @samp{-M} (or @samp{--mask-value}, or @samp{--msk_val}) is the right hand side of the @dfn{mask condition}. Thus for the @var{i}'th element of the hyperslab to be averaged, the mask condition is @set flg @tex {\it mask$_{\idx}$ mask\_comp mask\_val}. @clear flg @end tex @ifinfo @math{mask(i)} @var{mask_comp} @var{mask_val}. @clear flg @end ifinfo @ifset flg @c texi2html does not like @math{} @var{mask}(@var{i}) @var{mask_comp} @var{mask_val}. @clear flg @end ifset @tex Each~$\xxx_{\idx}$ is also associated with an additional weight~$\wgt_{\idx}$ whose value may be user-specified. The value of~$\wgt_{\idx}$ is identically~1 unless the user specifies a weighting variable @var{weight} (with @samp{-w}, @samp{--weight}, or @samp{--wgt\_var}). In this case, the value of~$\wgt_{\idx}$ is determined by the @var{weight} variable in the @var{input-file}. As noted above, @var{weight} is broadcast, if possible, to conform to the variable being averaged. $\tllnbr$ is the number of input elements $\xxx_{\idx}$ which actually contribute to output element $\xxx_{\jjj}$. $\tllnbr$ is also known as the @dfn{tally} and is defined as $$ \tllnbr = \sum_{\idx=1}^{\idx=\lmnnbr} \mssflg_{\idx} \mskflg_{\idx} $$ $\tllnbr$ is identical to the denominator of the generic averaging expression except for the omission of the weight $\wgt_{\idx}$. Thus $\tllnbr = \lmnnbr$ whenever no input points are missing values or are masked. Whether an element contributes to the output, and thus increments $\tllnbr$ by one, has more to do with the above two criteria (missing value and masking) than with the numeric value of the element per se. For example, $\xxx_{\idx}=0.0$ does contribute to $\xxx_{\jjj}$ (assuming the @code{_FillValue} attribute is not~0.0 and location $\idx$ is not masked). The value $\xxx_{\idx}=0.0$ will not change the numerator of the generic averaging expression, but it will change the denominator (unless its weight $\wgt_{\idx}=0.0$ as well). @end tex @html @end html @node Normalization and Integration, , Mask condition, ncwa netCDF Weighted Averager @subsection Normalization and Integration @cindex normalization @cindex @code{-N} @cindex @code{numerator} @cindex integration @cindex dot product @command{ncwa} has one switch which controls the normalization of the averages appearing in the @var{output-file}. Short option @samp{-N} (or long options @samp{--nmr} or @samp{--numerator}) prevents @command{ncwa} from dividing the weighted sum of the variable (the numerator in the averaging expression) by the weighted sum of the weights (the denominator in the averaging expression). Thus @samp{-N} tells @command{ncwa} to return just the numerator of the arithmetic expression defining the operation (@pxref{Operation Types}). With this normalization option, @command{ncwa} can integrate variables. Averages are first computed as sums, and then normalized to obtain the average. The original sum (i.e., the numerator of the expression in @ref{Operation Types}) is output if default normalization is turned off (@w{with @samp{-N}}). This sum is the integral (not the average) over the specified (@w{with @samp{-a}}, or all, if none are specified) dimensions. The weighting variable, if specified (@w{with @samp{-w}}), plays the role of the differential increment and thus permits more sophisticated integrals (i.e., weighted sums) to be output. For example, consider the variable @code{lev} where @math{@var{lev} = [100,500,1000]} weighted by the weight @code{lev_wgt} where @math{@var{lev_wgt} = [10,2,1]}. @cindex dot product The vertical integral of @code{lev}, weighted by @code{lev_wgt}, is the dot product of @var{lev} and @var{lev_wgt}. That this is @w{is 3000.0} can be seen by inspection and verified with the integration command @example ncwa -N -a lev -v lev -w lev_wgt in.nc foo.nc;ncks foo.nc @end example @ignore fxm TODO nco702 As explained in @xref{Operation Types}, @command{ncwa} @emph{always averages} coordinate variables regardless of the arithmetic operation type performed on the non-coordinate variables. The single exception is shown in the above example. The @samp{-N} switch turns off normalization so variables which are to be averaged, including coordinate variables, are not normalized. This is equivalent to summation or integration. @end ignore @ignore @c NB: these masking features are deprecated The second normalization option tells @command{ncwa} to multiply the weighted average the variable (given by the averaging expression) by the @w{tally, @var{M}}. Thus this option is similar to integration---multiplying the mean value of a quantity by the number of gridpoints to which it applies. The third normalization option is equivalent to specifying the first two options simultaneously. In other words this option causes @command{ncwa} to return @w{@var{M} times} the numerator of the generic averaging expression. With these normalization options, @command{ncwa} can compute sophisticated averages (and integrals) from the command line. @end ignore @noindent @html @end html EXAMPLES Given file @file{85_0112.nc}: @example @verbatim netcdf 85_0112 { dimensions: lat = 64 ; lev = 18 ; lon = 128 ; time = UNLIMITED ; // (12 currently) variables: float lat(lat) ; float lev(lev) ; float lon(lon) ; float time(time) ; float scalar_var ; float three_dmn_var(lat, lev, lon) ; float two_dmn_var(lat, lev) ; float mask(lat, lon) ; float gw(lat) ; } @end verbatim @end example Average all variables in @file{in.nc} over all dimensions and store results in @file{out.nc}: @example ncwa in.nc out.nc @end example @noindent All variables in @file{in.nc} are reduced to scalars in @file{out.nc} since @command{ncwa} averages over all dimensions unless otherwise specified (with @samp{-a}). Store the zonal (longitudinal) mean of @file{in.nc} in @file{out.nc}: @example ncwa -a lon in.nc out1.nc ncwa -a lon -b in.nc out2.nc @end example @noindent @cindex degenerate dimension The first command turns @code{lon} into a scalar and the second retains @code{lon} as a degenerate dimension in all variables. @example % ncks -C -H -v lon out1.nc lon = 135 % ncks -C -H -v lon out2.nc lon[0] = 135 @end example In either case the tally is simply the size of @code{lon}, i.e., 180 for the @file{85_0112.nc} file described by the sample header above. @cindex @code{gw} @cindex Gaussian weights @cindex climate model Compute the meridional (latitudinal) mean, with values weighted by the corresponding element of @var{gw} @footnote{@code{gw} stands for @dfn{Gaussian weight} in many climate models.}: @example ncwa -w gw -a lat in.nc out.nc @end example @noindent Here the tally is simply the size of @code{lat}, @w{or 64.} The sum of the Gaussian weights @w{is 2.0.} Compute the area mean over the tropical Pacific: @example ncwa -w gw -a lat,lon -d lat,-20.,20. -d lon,120.,270. in.nc out.nc @end example @noindent Here the tally is @set flg @tex $64 \times 128 = 8192$. @clear flg @end tex @ifset flg 64 times 128 = 8192. @clear flg @end ifset @cindex @code{ORO} @cindex climate model Compute the area-mean over the globe using only points for which @set flg @tex $ORO < 0.5$ @clear flg @end tex @ifset flg @var{ORO} < 0.5 @clear flg @end ifset @footnote{@code{ORO} stands for @dfn{Orography} in some climate models and in those models @math{@var{ORO} < 0.5} selects ocean gridpoints.}: @example ncwa -B 'ORO < 0.5' -w gw -a lat,lon in.nc out.nc ncwa -m ORO -M 0.5 -T lt -w gw -a lat,lon in.nc out.nc @end example @noindent It is considerably simpler to specify the complete @var{mask_cond} with the single string argument to @samp{-B} than with the three separate switches @samp{-m}, @samp{-T}, and @samp{-M} @footnote{Unfortunately the @samp{-B} and @samp{--mask_condition} options are unsupported on Windows (with the @acronym{MVS} compiler), which lacks a free, standard parser and lexer.}. If in doubt, enclose the @var{mask_cond} within quotes since some of the comparators have special meanings to the shell. Assuming 70% of the gridpoints are maritime, then here the tally is @set flg @tex $0.70 \times 8192 \approx 5734$. @clear flg @end tex @ifset flg 0.70 times 8192 = 5734. @clear flg @end ifset Compute the global annual mean over the maritime tropical Pacific: @example ncwa -B 'ORO < 0.5' -w gw -a lat,lon,time \ -d lat,-20.0,20.0 -d lon,120.0,270.0 in.nc out.nc ncwa -m ORO -M 0.5 -T lt -w gw -a lat,lon,time \ -d lat,-20.0,20.0 -d lon,120.0,270.0 in.nc out.nc @end example Further examples will use the one-switch specification of @var{mask_cond}. Determine the total area of the maritime tropical Pacific, assuming the variable @var{area} contains the area of each gridcell @example ncwa -N -v area -B 'ORO < 0.5' -a lat,lon \ -d lat,-20.0,20.0 -d lon,120.0,270.0 in.nc out.nc @end example Weighting @var{area} (e.g., by @var{gw}) is not appropriate because @var{area} is @emph{already} area-weighted by definition. Thus the @samp{-N} switch, or, equivalently, the @samp{-y ttl} switch, correctly integrate the cell areas into a total regional area. @cindex mask condition @cindex truth condition Mask a file to contain @var{_FillValue} everywhere except where @math{@var{thr_min} <= @var{msk_var} <= @var{thr_max}}: @example @verbatim # Set masking variable and its scalar thresholds export msk_var='three_dmn_var_dbl' # Masking variable export thr_max='20' # Maximum allowed value export thr_min='10' # Minimum allowed value ncecat -O in.nc out.nc # Wrap out.nc in degenerate "record" dimension ncwa -O -a record -B "${msk_var} <= ${thr_max}" out.nc out.nc ncecat -O out.nc out.nc # Wrap out.nc in degenerate "record" dimension ncwa -O -a record -B "${msk_var} >= ${thr_min}" out.nc out.nc @end verbatim @end example After the first use of @command{ncwa}, @file{out.nc} contains @var{_FillValue} where @code{$@{msk_var@} >= $@{thr_max@}}. The process is then repeated on the remaining data to filter out points where @code{$@{msk_var@} <= $@{thr_min@}}. The resulting @file{out.nc} contains valid data only where @math{@var{thr_min} <= @var{msk_var} <= @var{thr_max}}. @html @end html @node Contributing, Quick Start, Reference Manual, Top @chapter Contributing @cindex contributing We welcome contributions from anyone. The project homepage at @uref{https://sf.net/projects/nco} contains more information on how to contribute. @cindex PayPal Financial contributions to @acronym{NCO} development may be made through @uref{https://www.paypal.com/xclick/business=zender%40uci.edu&item_name=NCO+development&item_number=nco_dnt_dvl&no_note=1&tax=0¤cy_code=USD, PayPal}. @acronym{NCO} has been shared for over @w{10 years} yet only two users have contributed any money to the developers @footnote{ @cindex chocolate Happy users have sent me a few gifts, though. This includes a box of imported chocolate. Mmm. Appreciation and gifts are definitely better than money. Naturally, I'm too lazy to split and send gifts to the other developers. However, unlike some @acronym{NCO} developers, I have a steady "real job". My intent is to split monetary donations among the active developers and to send them their shares via PayPal.}. So you could be the third! @html @end html @menu * Contributors:: * Citation:: * Proposals for Institutional Funding:: @end menu @node Contributors, Citation, Contributing, Contributing @section Contributors @acronym{NCO} would not exist without the dedicated efforts of the remarkable software engineers who conceive, develop, and maintain netCDF, UDUnits, and OPeNDAP. @cindex Russ Rew @cindex John Caron @cindex Glenn Davis @cindex Steve Emmerson @cindex James Gallagher @cindex Ed Hartnett @cindex Dennis Heimbigner Since 1995 @acronym{NCO} has received support from, I believe, the entire staff of all these projects, including Russ Rew, John Caron, Glenn Davis, Steve Emmerson, James Gallagher, Ed Hartnett, and Dennis Heimbigner. In addition to their roles in maintaining the software stack on which @acronym{NCO} perches, Yertl-like, some of these gentlemen have advised or contributed to @acronym{NCO} specifically. That support is acknowledged separately below. @cindex contributors The primary contributors to @acronym{NCO} development have been: @table @asis @cindex Charlie Zender @item Charlie Zender All concept, design and implementation from 1995--2000. Since then autotools, bug-squashing, @acronym{CDL}, chunking, documentation, anchoring, recursion, @acronym{GPE}, packing, @acronym{NCO} library redesign, @command{ncap2} features, @command{ncbo}, @command{ncpdq}, @acronym{SMP} threading and @acronym{MPI} parallelization, netCDF4 integration, external funding, project management, science research, releases. @cindex Henry Butowsky @item Henry Butowsky Non-linear operations and @code{min()}, @code{max()}, @code{total()} support in @command{ncra} and @command{ncwa}. Type conversion for arithmetic. Migration to netCDF3 @acronym{API}. @command{ncap2} parser, lexer, @acronym{GSL}-support, @w{and I/O}. Multislabbing algorithm. Variable wildcarding. Numerous hacks. @command{ncap2} language. @cindex Rorik Peterson @item Rorik Peterson Original autotools build support. Long command-line options. Original UDUnits support. Debianization. Numerous bug-fixes. @cindex Joe Hamman @item Joe Hamman Python bindings (NCOpy). @cindex Daniel Wang @item Daniel Wang Script Workflow Analysis for MultiProcessing (@acronym{SWAMP}). @acronym{RPM} support. @cindex Harry Mangalam @item Harry Mangalam Benchmarking. OPeNDAP configuration. @cindex Pedro Vicente @item Pedro Vicente Windows Visual Studio support. netCDF4 groups. @cindex Russ Rew @item Russ Rew Advice on @acronym{NCO} structural algorithms @cindex Brian Mays @item Brian Mays Original packaging for Debian @acronym{GNU}/Linux, @command{nroff} man pages. @cindex George Shapovalov @item George Shapovalov Packaging for Gentoo @acronym{GNU}/Linux. @cindex Bill Kocik @item Bill Kocik Memory management. @cindex Len Makin @item Len Makin NEC SX architecture support. @cindex Jim Edwards @item Jim Edwards AIX architecture support. @cindex Juliana Rew @item Juliana Rew Compatibility with large @acronym{PID}s. @cindex Karen Schuchardt @item Karen Schuchardt Auxiliary coordinate support. @cindex Gayathri Venkitachalam @item Gayathri Venkitachalam @acronym{MPI} implementation. @cindex Scott Capps @item Scott Capps Large work-load testing @cindex Peter Campbell @cindex Martin Dix @cindex Mark Flanner @cindex Markus Liebig @cindex Keith Lindsay @cindex Stu Muller @cindex Mike Page @cindex Martin Schmidt @cindex Lori Sentman @cindex Michael Schulz @cindex Rich Signell @cindex Gary Strand @cindex Andrew Wittenberg @cindex George White @cindex Remik Ziemlinski @item Peter Campbell, Martin Dix, Mark Flanner, Markus Liebig, Keith Lindsay, Mike Page, Martin Schmidt, Michael Schulz, Lori Sentman, Rich Signell, Gary Strand, George White Andrew Wittenberg, Remik Ziemlinski Excellent bug reports and feature requests. @cindex Daniel Baumann @cindex Nick Bower @cindex Luk Claes @cindex Barry deFreese @cindex Aleksandar Jelenak @cindex Francesco Lovergine @cindex Bas Couwenberg @cindex Matej Vela @item Daniel Baumann, Nick Bower, Luk Claebs, Bas Couwenberg, Barry deFreese, Aleksandar Jelenak, Francesco Lovergine, Matej Vela Debian packaging @cindex Patrice Dumas @cindex Ed Hill @cindex Orion Powlawski @item Patrice Dumas, Ed Hill, Orion Poplawski RedHat packaging @cindex George Shapavalov @cindex Patrick Kursawe @item George Shapavalov, Patrick Kursawe Gentoo packaging @cindex Filipe Fernandes @item Filipe Fernandes OpenSuse packaging @cindex Takeshi Enomoto @cindex Alexander Hansen @cindex Ian Lancaster @cindex Alejandro Soto @item Takeshi Enomoto, Alexander Hansen, Ian Lancaster, Alejandro Soto Mac OS packaging @cindex Eric Blake @item Eric Blake Autoconf/M4 help @cindex Gavin Burris @cindex Kyle Wilcox @item Gavin Burris, Kyle Wilcox RHEL and CentOS build scripts and bug reports. @cindex Andrea Cimatoribus @item Andrea Cimatoribus @acronym{NCO} Spiral Logo @cindex Martin Otte @cindex Etienne Tourigny @item Martin Otte, Etienne Tourigny Single bug reports and fixes @cindex Wenshan Wang @item Wenshan Wang @acronym{CMIP5} and @acronym{MODIS} processing documentation. @end table Please let me know if your name was omitted! @html @end html @node Citation, Proposals for Institutional Funding, Contributors, Contributing @section Citation @cindex citation The recommended citations for @acronym{NCO} software are @example @verbatim Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. Zender, C. S. (2014), netCDF Operator (NCO) User Guide, Version 4.4.3, http://nco.sf.net/nco.pdf. @end verbatim @end example Use the former when referring to overall design, purpose, and optimization of @acronym{NCO}, and use the latter when referring to specific features and/or the User Guide itself. Additional information on citing @acronym{NCO} is in the User Guide at @url{http://nco.sf.net#ctt}. A complete list of @acronym{NCO} publications and presentations is at @url{http://nco.sf.net#pub}. This list links to the full papers and seminars themselves. @html @end html @menu * Proposals for Institutional Funding:: @end menu @node Proposals for Institutional Funding, , Citation, Contributing @section Proposals for Institutional Funding @cindex funding @cindex proposals @cindex @acronym{NSF} @cindex server-side processing @cindex Distributed Data Reduction & Analysis @cindex Scientific Data Operators @cindex @acronym{DDRA} @cindex Server-Side Distributed Data Reduction & Analysis @cindex @acronym{SSDDRA} @cindex @acronym{CCSM} @cindex @acronym{IPCC} @cindex @acronym{NSF} @cindex @acronym{SDO} @cindex @acronym{SEIII} @cindex OptIPuter @acronym{NSF} has funded a @uref{http://nco.sf.net#prp_sei, project} to improve Distributed Data Reduction & Analysis (@acronym{DDRA}) by evolving @acronym{NCO} into a suite of Scientific Data Operators called @acronym{SDO}. @cindex parallelism The two main components of this project are @acronym{NCO} parallelism (OpenMP, @acronym{MPI}) and Server-Side @acronym{DDRA} (@acronym{SSDDRA}) implemented through extensions to @acronym{OPeNDAP} and netCDF4. This project will dramatically reduce bandwidth usage for @acronym{NCO} @acronym{DDRA}. @cindex @acronym{NASA} @cindex @acronym{NRA} @cindex @acronym{HDF} With this first @acronym{NCO} proposal funded, the content of the next @acronym{NCO} proposal is clear. We are interested in obtaining @acronym{NASA} support for @acronym{HDF}-specific enhancements to @acronym{NCO}. We plan to submit a proposal to the next suitable @acronym{NASA} @acronym{NRA} or @acronym{NSF} opportunity. We are considering other interesting ideas for still more proposals. Please contact us if you wish to be involved with any future @acronym{NCO}-related proposals. Comments on the proposals and letters of support are also very welcome. @html @end html @node Quick Start, CMIP5 Example, Contributing, Top @chapter Quick Start @cindex Quick Start Simple examples in Bash shell scripts showing how to average data with different file structures. Here we include monthly, seasonal and annual average with daily or monthly data in either one file or multiple files. @menu * Daily data in one file:: * Monthly data in one file:: * One time point one file:: * Multiple files with multiple time points:: @end menu @node Daily data in one file, Monthly data in one file, Quick Start, Quick Start @section Daily data in one file @cindex daily data Suppose we have daily data from Jan 1st, 1990 to Dec. 31, 2005 in the file of @file{in.nc} with the record dimension as @code{time}. @noindent @strong{Monthly average:} @cindex monthly average @cindex average @cindex time-averaging @example @verbatim for yyyy in {1990..2005}; do # Loop over years for moy in {1..12}; do # Loop over months mm=$( printf "%02d" ${moy} ) # Change to 2-digit format # Average specific month yyyy-mm ncra -O -d time,"${yyyy}-${mm}-01","${yyyy}-${mm}-31" \ in.nc in_${yyyy}${mm}.nc done done # Concatenate monthly files together ncrcat -O in_??????.nc out.nc @end verbatim @end example @noindent @strong{Annual average:} @cindex annual average from daily data @cindex average @cindex time-averaging @example @verbatim for yyyy in {1990..2005}; do # Loop over years ncra -O -d time,"${yyyy}-01-01","${yyyy}-12-31" in.nc in_${yyyy}.nc done # Concatenate annual files together ncrcat -O in_????.nc out.nc @end verbatim @end example The @option{-O} switch means to overwrite the pre-existing files (@pxref{Batch Mode}). The @option{-d} option is to specify the range of hyperslabs (@pxref{Hyperslabs}). There are detailed instructions on @command{ncra} (@pxref{ncra netCDF Record Averager} and @command{ncrcat} (@pxref{ncrcat netCDF Record Concatenator}). @acronym{NCO} supports UDUnits so that we can use readable dates as time dimension (@pxref{UDUnits Support}). @node Monthly data in one file, One time point one file, Daily data in one file, Quick Start @section Monthly data in one file @cindex monthly data Inside the input file @file{in.nc}, the record dimension @code{time} is from Jan 1990 to Dec 2005. @noindent @strong{Seasonal average (e.g., DJF):} @cindex seasonal average @cindex average @cindex time-averaging @example ncra -O --mro -d time,"1990-12-01",,12,3 in.nc out.nc @end example @noindent @strong{Annual average:} @cindex annual average from monthly data @cindex average @cindex time-averaging @example ncra -O --mro -d time,,,12,12 in.nc out.nc @end example Here we use the subcycle feature (i.e., the number after the fourth comma: @samp{3} in the seasonal example and the second @samp{12} in the annual example) to retrieve groups of records separated by regular intervals (@pxref{Subcycle}). The option @option{--mro} switches @command{ncra} to produce a Multi-Record Output instead of a single-record output. For example, assume @var{snd} is a 3D array with dimensions @code{time} * @code{latitude} * @code{longitude} and @code{time} includes every month from Jan. 1990 to Dec. 2005, 192 months as total, which are 16 years. Let's look at the following two command lines. @example ncra --mro -v snd -d time,"1990-12-01",,12,3 in.nc out_mro.nc ncra -v snd -d time,"1990-12-01",,12,3 in.nc out_sro.nc @end example In the first output file, @file{out_mro.nc}, @var{snd} is still a 3D array with dimensions @code{time} * @code{latitude} * @code{longitude}, but the length of @code{time} now is 16, meaning 16 winters. In the second output file, @file{out_sro.nc}, the length of @code{time} is @w{only 1}. It is now the average of all the 16 winters. when using @samp{-d @var{dim},min[,max]} to specify the hyperslabs, you can leave it blank if you want to include the minimum or the maximum of the data, like we did above. @node One time point one file, Multiple files with multiple time points, Monthly data in one file, Quick Start @section One time point one file @cindex daily data @cindex monthly data @cindex average @cindex time-averaging This means if you have daily data of 30 days, there will be 30 data files. Or if you have monthly data of 12 months, there will be 12 data files. Dealing with this kind of files, you need to specify the file names in shell scripts and pass them to NCO operators. For example, your daily data files may look like @file{snd_19900101.nc}, @file{snd_19900102.nc}, @file{snd_19900103.nc} ... If you want to know the monthly average of Jan 1990, you can write like, @example ncra -O snd_199001??.nc out.nc @end example You might want to use loop if you need the average of each month. @example @verbatim for moy in {1..12}; do # Loop over months mm=$( printf "%02d" ${moy} ) # Change to 2-digit format ncra -O snd_????${mm}??.nc out_${mm}.nc done @end verbatim @end example @node Multiple files with multiple time points, , One time point one file, Quick Start @section Multiple files with multiple time points @cindex daily data @cindex monthly data Similar as the last one, it's more about shell scripts. Suppose you have daily data with one month of them in one data file. The monthly average is simply to apply @command{ncra} on the specific data file. And for seasonal averages, you can specify the three months by shell scripts. @html @end html @node CMIP5 Example, Parallel, Quick Start, Top @chapter @acronym{CMIP5} Example @cindex @acronym{CMIP5} @cindex @acronym{GODAD} @ignore This @uref{http://nco.sf.net/xmp_cesm.html,Wonderful CMIP5 Documentation} shows complete processing of the @acronym{CMIP5} dataset. @end ignore The fifth phase of the Coupled Model Intercomparison Project (@uref{http://cmip-pcmdi.llnl.gov/cmip5/index.html?submenuheader=0, @acronym{CMIP5}}) provides a multi-model framework for comparing the mechanisms and responses of climate models from around the world. However, it is a tremendous workload to retrieve a single climate statistic from all these models, each of which includes several ensemble members. Not only that, it is too often a tedious process that impedes new research and hypothesis testing. Our @acronym{NASA} @acronym{ACCESS} 2011 project simplified and accelerated this process. Traditional geoscience data analysis requires users to work with numerous flat (data in one level or namespace) files. In that paradigm instruments or models produce, and then repositories archive and distribute, and then researchers request and analyze, collections of flat files. @acronym{NCO} works well with that paradigm, yet it also embodies the necessary algorithms to transition geoscience data analysis from relying solely on traditional (or ``flat'') datasets to allowing newer hierarchical (or ``nested'') datasets. Hierarchical datasets support and enable combining all datastreams that meet user-specified criteria into a single or small number of files that hold @emph{all} the science-relevant data. @acronym{NCO} (and no other software to our knowledge) exploits this capability now. Data and metadata may be aggregated into and analyzed in hierarchical structures. We call the resulting data storage, distribution, and analysis paradigm Group-Oriented Data Analysis and Distribution (@acronym{GODAD}). @acronym{GODAD} lets the scientific question organize the data, not the @emph{ad hoc} granularity of all relevant datasets. This chapter illustrates @acronym{GODAD} techniques applied to analysis of the @acronym{CMIP5} dataset. To begin, we document below a prototypical example of @acronym{CMIP5} analysis and evaluation using traditional @acronym{NCO} commands on netCDF3-format model and @acronym{HDF-EOS} format observational (@acronym{NASA} @acronym{MODIS} satellite instrument) datasets. These examples complement the @acronym{NCO} User Guide by detailing in-depth data analysis in a frequently encountered ``real world'' context. Graphical representations of the results (@acronym{NCL} scripts available upon request) are provided to illustrate physical meaning of the analysis. @ignore In 2013 we added scripts which make use of new @acronym{NCO} features that combine all the loops in the analysis into single commands by exploiting @acronym{NCO}'s new group aggregation and arithmetic features. @end ignore Since @acronym{NCO} can process hierarchical datasets, i.e., datasets stored with netCDF4 groups, we present sample scripts illustrating group-based processing as well. @menu * Combine Files:: * Global Distribution of Long-term Average:: * Annual Average over Regions:: * Monthly Cycle:: * Regrid MODIS Data:: * Add Coordinates to MODIS Data:: * Permute MODIS Coordinates:: @end menu @node Combine Files, Global Distribution of Long-term Average, CMIP5 Example, CMIP5 Example @section Combine Files @cindex file combination Sometimes, the data of one ensemble member will be stored in several files to reduce single file size. It is more convenient to concatenate these files into a single timeseries, and the following script illustrates how. Key steps include: @enumerate @item Obtain number and names (or partial names) of files in a directory @item Concatenate files along the record dimension (usually time) using @command{ncrcat} (@pxref{ncrcat netCDF Record Concatenator}). @end enumerate @example @verbatiminclude xmp/cmb_fl.sh @end example @acronym{CMIP5} model data downloaded from the Earth System Grid Federation (@uref{http://pcmdi9.llnl.gov/esgf-web-fe/, @acronym{ESGF}}) does not contain group features yet. Therefore users must aggregate flat files into hierarchical ones themselves. The following script shows how. Each dataset becomes a group in the output file. There can be several levels of groups. In this example, we employ two experiments (``scenarios'') as the top-level. The second-level comprises different models (e.g., CCSM4, CESM1-BGC). Many models are run multiple times with slight perturbed initial conditions to produce an ensemble of realizations. These ensemble members comprise the third level of the hierarchy. The script selects two variables, @var{snc} and @var{snd} (snow cover and snow depth). @cindex @option{--gag} @cindex aggregation @cindex group aggregation @cindex groups, creating @example @verbatiminclude xmp/cmb_fl_grp.sh @end example @node Global Distribution of Long-term Average, Annual Average over Regions, Combine Files, CMIP5 Example @section Global Distribution of Long-term Average @cindex spatial distribution @cindex long-term average @cindex average @cindex time-averaging @float Figure,fgr:glb @image{xmp/fgr1,3.5in} @caption{Global Distribution of Long-term Average.} @end float @noindent This section illustrates how to calculate the global distribution of long-term average (@pxref{fgr:glb}) with either flat files or @uref{http://nco.sourceforge.net/nco.html#index-groups, group file}. Key steps include: @enumerate @item Average ensemble members of each model using @command{nces} (@pxref{nces netCDF Ensemble Statistics}) @item Average the record dimension using @command{ncra} (@pxref{ncra netCDF Record Averager}) @item Store results of each model as a distinct group in a single output file using @command{ncecat} (@pxref{ncrcat netCDF Record Concatenator}) with the @option{--gag} option @end enumerate The first example shows how to process flat files. @example @verbatiminclude xmp/glb_avg.sh @end example With the use of @key{group}, the above script will be shortened to @w{ONE LINE}. @cindex groups, averaging @example # Data from cmb_fl_grp.sh # ensemble averaging nces -O --nsm_grp --nsm_sfx='_avg' \ sn_LImon_all-mdl_all-xpt_all-nsm_200001-200512.nc \ sn_LImon_all-mdl_all-xpt_nsm-avg.nc @end example The input file, @file{sn_LImon_all-mdl_all-xpt_all-nsm_200001-200512.nc}, produced by @file{cmb_fl_grp.sh}, includes all the ensemble members as groups. The option @samp{--nsm_grp} denotes that we are using @uref{http://nco.sf.net/nco.html#nsm_grp, group ensembles mode} of @command{nces}, instead of @uref{http://nco.sf.net/nco.html#nsm_fl, file ensembles mode}, @samp{--nsm_fl}. The option @samp{--nsm_sfx='_avg'} instructs @command{nces} to store the output as a new child group @file{/[model]/[model name]_avg/var}; otherwise, the output will be stored directly in the parent group @file{/[model]/var}. In the final output file, @file{sn_LImon_all-mdl_all-xpt_nsm-avg_tm-avg.nc}, sub-groups with a suffix of `avg' are the long-term averages of each model. One thing to notice is that for now, ensembles with only one ensemble member will be left untouched. @node Annual Average over Regions, Monthly Cycle, Global Distribution of Long-term Average, CMIP5 Example @section Annual Average over Regions @cindex annual average @cindex average @cindex time-averaging @cindex area-averaging @cindex dimension order @cindex anomalies @cindex standard deviation @cindex renaming variables @cindex attributes, editing @cindex attributes, modifying @cindex attributes, overwriting @cindex regression @cindex nco script file @cindex variables, appending @float Figure,fgr:anl @image{xmp/fgr2,4in} @caption{Annual Average over Regions.} @end float @noindent This section illustrates how to calculate the annual average over specific regions (@pxref{fgr:anl}). Key steps include: @enumerate @item Spatial average using @command{ncap2} (@pxref{ncap2 netCDF Arithmetic Processor}) and @command{ncwa} (@pxref{ncwa netCDF Weighted Averager}); @item Change dimension order using @command{ncpdq} (@pxref{ncpdq netCDF Permute Dimensions Quickly}); @item Annual average using @command{ncra} (@pxref{ncra netCDF Record Averager}); @item Anomaly from long-term average using @command{ncbo} (@pxref{ncbo netCDF Binary Operator}); @item Standard deviation using @command{ncbo} (@pxref{ncbo netCDF Binary Operator}) and @command{nces} (@pxref{nces netCDF Ensemble Statistics}); @item Rename variables using @command{ncrename} (@pxref{ncrename netCDF Renamer}); @item Edit attributions using @command{ncatted} (@pxref{ncatted netCDF Attribute Editor}); @item Linear regression using @command{ncap2} (@pxref{ncap2 netCDF Arithmetic Processor}); @item Use @command{ncap2} (@pxref{ncap2 netCDF Arithmetic Processor}) with nco script file (i.e., @file{.nco} file); @item Move variables around using @command{ncks} (@pxref{ncks netCDF Kitchen Sink}). @end enumerate @strong{Flat files example} @example @verbatiminclude xmp/ann_avg.sh @end example @strong{gsl_rgr.nco} @example @verbatiminclude xmp/gsl_rgr.nco @end example With the @key{group} feature, all the loops over experiments, models and ensemble members can be omitted. As we are working on implementing @key{group} feature in all @acronym{NCO} operators, some functions (e.g., regression and standard deviation over ensemble members) may have to wait until the new versions. @cindex group, spatial averaging @cindex group, temporal averaging @cindex group, anomaly @cindex group, standard deviation @cindex group, aggregation @cindex group, dimension permutation @example @verbatiminclude xmp/ann_avg_grp.sh @end example @node Monthly Cycle, Regrid MODIS Data, Annual Average over Regions, CMIP5 Example @section Monthly Cycle @cindex monthly average @cindex average @cindex time-averaging @cindex anomalies @cindex geographical weight @cindex weighted average @float Figure,fgr:mon @image{xmp/fgr3,4in} @caption{Monthly Cycle.} @end float @noindent This script illustrates how to calculate the monthly anomaly from the annual average (@pxref{fgr:mon}). In order to keep only the monthly cycle, we will subtract the annual average of each year from the monthly data, instead of subtracting the long-term average. This is a little more complicated in coding since we need to loop over years. @strong{Flat files example} @example @verbatiminclude xmp/mcc.sh @end example Using @key{group} feature and @uref{http://nco.sourceforge.net/nco.html#Hyperslabs, hyperslabs} of @command{ncbo}, the script will be shortened. @example @verbatiminclude xmp/mcc_grp.sh @end example @node Regrid MODIS Data, Add Coordinates to MODIS Data, Monthly Cycle, CMIP5 Example @section Regrid @acronym{MODIS} Data @cindex regrid @cindex MODIS @cindex bilinear interpolation @cindex interpolation @cindex renaming variables @cindex renaming attributes @cindex renaming dimensions @cindex attributes, editing @cindex attributes, modifying @cindex attributes, overwriting In order to compare the results between @acronym{MODIS} and @acronym{CMIP5} models, one usually regrids one or both datasets so that the spatial resolutions match. Here, the script illustrates how to regrid @acronym{MODIS} data. Key steps include: @enumerate @item Regrid using bilinear interpolation (@pxref{Bilinear interpolation}) @item Rename variables, dimensions and attributions using @command{ncrename} (@pxref{ncrename netCDF Renamer}). @end enumerate @strong{Main Script} @example @verbatiminclude xmp/rgr.sh @end example @strong{bi_interp.nco} @example @verbatiminclude xmp/bi_interp.nco @end example @node Add Coordinates to MODIS Data, Permute MODIS Coordinates, Regrid MODIS Data, CMIP5 Example @section Add Coordinates to @acronym{MODIS} Data @cindex MODIS @cindex coordinates @strong{Main Script} @example @verbatiminclude xmp/add_crd.sh @end example @strong{crd.nco} @example @verbatiminclude xmp/crd.nco @end example @node Permute MODIS Coordinates, , Add Coordinates to MODIS Data, CMIP5 Example @section Permute @acronym{MODIS} Coordinates @cindex coordinates, modifying @c NB: 20140130: @textdegree is in TeXInfo 4.12 but Mac OS X 10.8 ships with 4.8 @acronym{MODIS} orders latitude data from 90@textdegree{}N to -90@textdegree{}N, and longitude from -180@textdegree{}E to 180@textdegree{}E. However, @acronym{CMIP5} orders latitude from -90@textdegree{}N to 90@textdegree{}N, and longitude from 0@textdegree{}E to 360@textdegree{}E. This script changes the @acronym{MODIS} coordinates to follow the @acronym{CMIP5} convention. @example @verbatiminclude xmp/pmt_crd.sh @end example @ignore @node Hierarchical Data Files, Parallel, CMIP5 Example, Top section Hierarchical Data Files @cindex hierarchical data @cindex groups Hierarchical Data Files support arbitrarily nested groups. The following @acronym{NCO} operators now can work recursively through all groups: @itemize @bullet @item @command{ncbo} (@pxref{ncbo netCDF Binary Operator}) @item @command{ncecat} (@pxref{ncecat netCDF Ensemble Concatenator}) @item @command{ncks} (@pxref{ncks netCDF Kitchen Sink}) @item @command{ncpdq} (@pxref{ncpdq netCDF Permute Dimensions Quickly}) @item @command{ncwa} (@pxref{ncwa netCDF Weighted Averager}) @end itemize Here is an example showing: @enumerate @item How to create a hierarchical data file from multiple files using @command{ncecat} (@pxref{ncecat netCDF Ensemble Concatenator}) or @command{ncks} (@pxref{ncks netCDF Kitchen Sink}); @item Hyperslabs using @command{ncks} (@pxref{ncks netCDF Kitchen Sink}); @item Spatial average and time average using @command{ncwa} (@pxref{ncwa netCDF Weighted Averager}); @item Anomaly from average using @command{ncbo} (@pxref{ncbo netCDF Binary Operator}). @end enumerate @example @verbatiminclude xmp/grp.sh @end example @end ignore @html @end html @node Parallel, CCSM Example, CMIP5 Example, Top @chapter Parallel @cindex Parallel @cindex Swift @cindex @command{parallel} This section will describe @acronym{NCO} scripting strategies. Many techniques can be used to exploit script-level parallelism, including @acronym{GNU} Parallel and Swift. @example @verbatim ls *historical*.nc | parallel ncks -O -d time,"1950-01-01","2000-01-01" {} 50y/{} @end verbatim @end example @html @end html @node CCSM Example, mybibnode, Parallel, Top @chapter CCSM Example @cindex CCSM This chapter illustrates how to use @acronym{NCO} to process and analyze the results of a @acronym{CCSM} climate simulation. @example @verbatim ************************************************************************ Task 0: Finding input files x************************************************************************ The CCSM model outputs files to a local directory like: /ptmp/zender/archive/T42x1_40 Each component model has its own subdirectory, e.g., /ptmp/zender/archive/T42x1_40/atm /ptmp/zender/archive/T42x1_40/cpl /ptmp/zender/archive/T42x1_40/ice /ptmp/zender/archive/T42x1_40/lnd /ptmp/zender/archive/T42x1_40/ocn within which model output is tagged with the particular model name /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0001-01.nc /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0001-02.nc /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0001-03.nc ... /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0001-12.nc /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0002-01.nc /ptmp/zender/archive/T42x1_40/atm/T42x1_40.cam2.h0.0002-02.nc ... or /ptmp/zender/archive/T42x1_40/lnd/T42x1_40.clm2.h0.0001-01.nc /ptmp/zender/archive/T42x1_40/lnd/T42x1_40.clm2.h0.0001-02.nc /ptmp/zender/archive/T42x1_40/lnd/T42x1_40.clm2.h0.0001-03.nc ... ************************************************************************ Task 1: Regional processing ************************************************************************ The first task in data processing is often creating seasonal cycles. Imagine a 100-year simulation with its 1200 monthly mean files. Our goal is to create a single file containing 12 months of data. Each month in the output file is the mean of 100 input files. Normally, we store the "reduced" data in a smaller, local directory. caseid='T42x1_40' #drc_in="${DATA}/archive/${caseid}/atm" drc_in="${DATA}/${caseid}" drc_out="${DATA}/${caseid}" mkdir -p ${drc_out} cd ${drc_out} Method 1: Assume all data in directory applies for mth in {1..12}; do mm=`printf "%02d" $mth` ncra -O -D 1 -o ${drc_out}/${caseid}_clm${mm}.nc \ ${drc_in}/${caseid}.cam2.h0.*-${mm}.nc done # end loop over mth Method 2: Use shell 'globbing' to construct input filenames for mth in {1..12}; do mm=`printf "%02d" $mth` ncra -O -D 1 -o ${drc_out}/${caseid}_clm${mm}.nc \ ${drc_in}/${caseid}.cam2.h0.00??-${mm}.nc \ ${drc_in}/${caseid}.cam2.h0.0100-${mm}.nc done # end loop over mth Method 3: Construct input filename list explicitly for mth in {1..12}; do mm=`printf "%02d" $mth` fl_lst_in='' for yr in {1..100}; do yyyy=`printf "%04d" $yr` fl_in=${caseid}.cam2.h0.${yyyy}-${mm}.nc fl_lst_in="${fl_lst_in} ${caseid}.cam2.h0.${yyyy}-${mm}.nc" done # end loop over yr ncra -O -D 1 -o ${drc_out}/${caseid}_clm${mm}.nc -p ${drc_in} \ ${fl_lst_in} done # end loop over mth Make sure the output file averages correct input files! ncks -M prints global metadata: ncks -M ${drc_out}/${caseid}_clm01.nc The input files ncra used to create the climatological monthly mean will appear in the global attribute named 'history'. Use ncrcat to aggregate the climatological monthly means ncrcat -O -D 1 \ ${drc_out}/${caseid}_clm??.nc ${drc_out}/${caseid}_clm_0112.nc Finally, create climatological means for reference. The climatological time-mean: ncra -O -D 1 \ ${drc_out}/${caseid}_clm_0112.nc ${drc_out}/${caseid}_clm.nc The climatological zonal-mean: ncwa -O -D 1 -a lon \ ${drc_out}/${caseid}_clm.nc ${drc_out}/${caseid}_clm_x.nc The climatological time- and spatial-mean: ncwa -O -D 1 -a lon,lat,time -w gw \ ${drc_out}/${caseid}_clm.nc ${drc_out}/${caseid}_clm_xyt.nc This file contains only scalars, e.g., "global mean temperature", used for summarizing global results of a climate experiment. Climatological monthly anomalies = Annual Cycle: Subtract climatological mean from climatological monthly means. Result is annual cycle, i.e., climate-mean has been removed. ncbo -O -D 1 -o ${drc_out}/${caseid}_clm_0112_anm.nc \ ${drc_out}/${caseid}_clm_0112.nc ${drc_out}/${caseid}_clm_xyt.nc ************************************************************************ Task 2: Correcting monthly averages ************************************************************************ The previous step appoximates all months as being equal, so, e.g., February weighs slightly too much in the climatological mean. This approximation can be removed by weighting months appropriately. We must add the number of days per month to the monthly mean files. First, create a shell variable dpm: unset dpm # Days per month declare -a dpm dpm=(0 31 28.25 31 30 31 30 31 31 30 31 30 31) # Allows 1-based indexing Method 1: Create dpm directly in climatological monthly means for mth in {1..12}; do mm=`printf "%02d" ${mth}` ncap2 -O -s "dpm=0.0*date+${dpm[${mth}]}" \ ${drc_out}/${caseid}_clm${mm}.nc ${drc_out}/${caseid}_clm${mm}.nc done # end loop over mth Method 2: Create dpm by aggregating small files for mth in {1..12}; do mm=`printf "%02d" ${mth}` ncap2 -O -v -s "dpm=${dpm[${mth}]}" ~/nco/data/in.nc \ ${drc_out}/foo_${mm}.nc done # end loop over mth ncecat -O -D 1 -p ${drc_out} -n 12,2,2 foo_${mm}.nc foo.nc ncrename -O -D 1 -d record,time ${drc_out}/foo.nc ncatted -O -h \ -a long_name,dpm,o,c,"Days per month" \ -a units,dpm,o,c,"days" \ ${drc_out}/${caseid}_clm_0112.nc ncks -A -v dpm ${drc_out}/foo.nc ${drc_out}/${caseid}_clm_0112.nc Method 3: Create small netCDF file using ncgen cat > foo.cdl << 'EOF' netcdf foo { dimensions: time=unlimited; variables: float dpm(time); dpm:long_name="Days per month"; dpm:units="days"; data: dpm=31,28.25,31,30,31,30,31,31,30,31,30,31; } EOF ncgen -b -o foo.nc foo.cdl ncks -A -v dpm ${drc_out}/foo.nc ${drc_out}/${caseid}_clm_0112.nc Another way to get correct monthly weighting is to average daily output files, if available. ************************************************************************ Task 3: Regional processing ************************************************************************ Let's say you are interested in examining the California region. Hyperslab your dataset to isolate the appropriate latitude/longitudes. ncks -O -D 1 -d lat,30.0,37.0 -d lon,240.0,270.0 \ ${drc_out}/${caseid}_clm_0112.nc \ ${drc_out}/${caseid}_clm_0112_Cal.nc The dataset is now much smaller! To examine particular metrics. ************************************************************************ Task 4: Accessing data stored remotely ************************************************************************ OPeNDAP server examples: UCI DAP servers: ncks -M -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc ncrcat -O -C -D 3 \ -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata \ -l /tmp in.nc in.nc ~/foo.nc Unidata DAP servers: ncks -M -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc ncrcat -O -C -D 3 \ -p http://thredds-test.ucar.edu/thredds/dodsC/testdods \ -l /tmp in.nc in.nc ~/foo.nc NOAA DAP servers: ncwa -O -C -a lat,lon,time -d lon,-10.,10. -d lat,-10.,10. -l /tmp -p \ http://www.esrl.noaa.gov/psd/thredds/dodsC/Datasets/ncep.reanalysis.dailyavgs/surface \ pres.sfc.1969.nc ~/foo.nc LLNL PCMDI IPCC OPeNDAP Data Portal: ncks -M -p http://username:password@esgcet.llnl.gov/cgi-bin/dap-cgi.py/ipcc4/sresa1b/ncar_ccsm3_0 pcmdi.ipcc4.ncar_ccsm3_0.sresa1b.run1.atm.mo.xml Earth System Grid (ESG): http://www.earthsystemgrid.org caseid='b30.025.ES01' CCSM3.0 1% increasing CO2 run, T42_gx1v3, 200 years starting in year 400 Atmospheric post-processed data, monthly averages, e.g., /data/zender/tmp/b30.025.ES01.cam2.h0.TREFHT.0400-01_cat_0449-12.nc /data/zender/tmp/b30.025.ES01.cam2.h0.TREFHT.0400-01_cat_0599-12.nc ESG supports password-protected FTP access by registered users NCO uses the .netrc file, if present, for password-protected FTP access Syntax for accessing single file is, e.g., ncks -O -D 3 \ -p ftp://climate.llnl.gov/sresa1b/atm/mo/tas/ncar_ccsm3_0/run1 \ -l /tmp tas_A1.SRESA1B_1.CCSM.atmm.2000-01_cat_2099-12.nc ~/foo.nc # Average surface air temperature tas for SRESA1B scenario # This loop is illustrative and will not work until NCO correctly # translates '*' to FTP 'mget' all remote files for var in 'tas'; do for scn in 'sresa1b'; do for mdl in 'cccma_cgcm3_1 cccma_cgcm3_1_t63 cnrm_cm3 csiro_mk3_0 \ gfdl_cm2_0 gfdl_cm2_1 giss_aom giss_model_e_h giss_model_e_r \ iap_fgoals1_0_g inmcm3_0 ipsl_cm4 miroc3_2_hires miroc3_2_medres \ miub_echo_g mpi_echam5 mri_cgcm2_3_2a ncar_ccsm3_0 ncar_pcm1 \ ukmo_hadcm3 ukmo_hadgem1'; do for run in '1'; do ncks -R -O -D 3 -p ftp://climate.llnl.gov/${scn}/atm/mo/${var}/${mdl}/run${run} -l ${DATA}/${scn}/atm/mo/${var}/${mdl}/run${run} '*' ${scn}_${mdl}_${run}_${var}_${yyyymm}_${yyyymm}.nc done # end loop over run done # end loop over mdl done # end loop over scn done # end loop over var cd sresa1b/atm/mo/tas/ukmo_hadcm3/run1/ ncks -H -m -v lat,lon,lat_bnds,lon_bnds -M tas_A1.nc | m bds -x 096 -y 073 -m 33 -o ${DATA}/data/dst_3.75x2.5.nc # ukmo_hadcm3 ncview ${DATA}/data/dst_3.75x2.5.nc # msk_rgn is California mask on ukmo_hadcm3 grid # area is correct area weight on ukmo_hadcm3 grid ncks -A -v area,msk_rgn ${DATA}/data/dst_3.75x2.5.nc \ ${DATA}/sresa1b/atm/mo/tas/ukmo_hadcm3/run1/area_msk_ukmo_hadcm3.nc Template for standardized data: ${scn}_${mdl}_${run}_${var}_${yyyymm}_${yyyymm}.nc e.g., raw data ${DATA}/sresa1b/atm/mo/tas/ukmo_hadcm3/run1/tas_A1.nc becomes standardized data Level 0: raw from IPCC site--no changes except for name Make symbolic link name match raw data Template: ${scn}_${mdl}_${run}_${var}_${yyyymm}_${yyyymm}.nc ln -s -f tas_A1.nc sresa1b_ukmo_hadcm3_run1_tas_200101_209911.nc area_msk_ukmo_hadcm3.nc Level I: Add all variables (not standardized in time) to file containing msk_rgn and area Template: ${scn}_${mdl}_${run}_${yyyymm}_${yyyymm}.nc /bin/cp area_msk_ukmo_hadcm3.nc sresa1b_ukmo_hadcm3_run1_200101_209911.nc ncks -A -v tas sresa1b_ukmo_hadcm3_run1_tas_200101_209911.nc \ sresa1b_ukmo_hadcm3_run1_200101_209911.nc ncks -A -v pr sresa1b_ukmo_hadcm3_run1_pr_200101_209911.nc \ sresa1b_ukmo_hadcm3_run1_200101_209911.nc If already have file then: mv sresa1b_ukmo_hadcm3_run1_200101_209911.nc foo.nc /bin/cp area_msk_ukmo_hadcm3.nc sresa1b_ukmo_hadcm3_run1_200101_209911.nc ncks -A -v tas,pr foo.nc sresa1b_ukmo_hadcm3_run1_200101_209911.nc Level II: Correct # years, months Template: ${scn}_${mdl}_${run}_${var}_${yyyymm}_${yyyymm}.nc ncks -d time,....... file1.nc file2.nc ncrcat file2.nc file3.nc sresa1b_ukmo_hadcm3_run1_200001_209912.nc Level III: Many derived products from level II, e.g., A. Global mean timeseries ncwa -w area -a lat,lon \ sresa1b_ukmo_hadcm3_run1_200001_209912.nc \ sresa1b_ukmo_hadcm3_run1_200001_209912_xy.nc B. Califoria average timeseries ncwa -m msk_rgn -w area -a lat,lon \ sresa1b_ukmo_hadcm3_run1_200001_209912.nc \ sresa1b_ukmo_hadcm3_run1_200001_209912_xy_Cal.nc @end verbatim @end example @html @end html @node mybibnode, General Index, CCSM Example, Top @chapter References @itemize @mybibitem{ZeM07} Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. @mybibitem{Zen08} Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. @mybibitem{WZJ07} Wang, D. L., C. S. Zender, and S. F. Jenks (2007), DAP-enabled Server-side Data Reduction and Analysis, Proceedings of the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, Paper 3B.2, January 14-18, San Antonio, TX. American Meteorological Society, AMS Press, Boston, MA. @mybibitem{ZMW06} Zender, C. S., H. Mangalam, and D. L. Wang (2006), Improving Scaling Properties of Common Statistical Operators for Gridded Geoscience Datasets, Eos Trans. AGU, 87(52), Fall Meet. Suppl., Abstract IN53B-0827. @mybibitem{ZeW07} Zender, C. S., and D. L. Wang (2007), High performance distributed data reduction and analysis with the netCDF Operators (NCO), Proceedings of the 23rd AMS Conference on Interactive Information and Processing Systems (IIPS) for Meteorology, Oceanography, and Hydrology, Paper 3B.4, January 14-18, San Antonio, TX. American Meteorological Society, AMS Press, Boston, MA. @mybibitem{WZJ06} Wang, D. L., C. S. Zender, and S. F. Jenks (2006), Server-side netCDF Data Reduction and Analysis, Eos Trans. AGU, 87(52), Fall Meet. Suppl., Abstract IN53B-0826. @mybibitem{WZJ073} Wang, D. L., C. S. Zender, and S. F. Jenks (2007), Server-side parallel data reduction and analysis, in Advances in Grid and Pervasive Computing, Second International Conference, GPC 2007, Paris, France, May 2-4, 2007, Proceedings. IEEE Lecture Notes in Computer Science, vol. 4459, edited by C. Cerin and K.-C. Li, pp. 744-750, Springer-Verlag, Berlin/Heidelberg, doi:10.1007/978-3-540-72360-8_67. @mybibitem{WZJ074} Wang, D. L., C. S. Zender and S. F. Jenks (2007), A System for Scripted Data Analysis at Remote Data Centers, Eos Trans. AGU, 88(52), Fall Meet. Suppl., Abstract IN11B-0469. @mybibitem{WZJ081} Wang, D. L., C. S. Zender and S. F. Jenks (2008), Cluster Workflow Execution of Retargeted Data Analysis Scripts, Proceedings of the 8th IEEE Int'l Symposium on Cluster Computing and the Grid (IEEE CCGRID '08), pp. 449-458, Lyon, France, May 2008. @mybibitem{WZJ091} Wang, D. L., C. S. Zender, and S. F. Jenks (2009), Efficient Clustered Server-side Data Analysis Workflows using SWAMP, Earth Sci. Inform., 2(3), 141-155, doi:10.1007/s12145-009-0021-z. @mybibitem{PFT88} Press, Flannery, Teukolsky, and Vetterling (1988), Numerical Recipes in C, Cambridge Univ. Press, New York, NY. @end itemize @c @node Name Index, General Index, Operators, Top @c @unnumbered Function and Variable Index @c @printindex fn @html @end html @node General Index, , mybibnode, Top @unnumbered General Index @syncodeindex fn cp @printindex cp @c TTFN (Ta ta for now) @bye nco-4.5.4/doc/nco.xcf000066400000000000000000001714211264355130400143420ustar00rootroot00000000000000gimp xcf fileÃAB´B´½Unnamed™BÂ@ÀBÂ@ÀA`B¼A`B¼A`B¼A`C‰€A`C‰€A`C‰€BœC“€BœC“€BœC“€BàC“€BàC“€BàC“€C-C‰€C-C‰€C-C‰€C,B°C,B°C,B°@jpeg-settings U            gimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) Ô /˜ÎC#NCOÿ     = ¬Fgimp-text-layer*(text "NCO") (font "Sans Uralic Bold") (font-size 30.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgb 0.843137 0.698039 0.533333)) (justify left) (box-mode fixed) (box-width 67.000000) (box-height 35.000000) (box-unit pixels) ÂC#Ú #C#î ïÀ×À²Àˆ‚ÿýÝþÿÿõx¼æùùæ¼x ôU£×ôýó×¥Xÿþyþÿÿü‡ùÿÿüû• ýMàÿÿýßOÿýóþÿÿý Áÿ ÿýÔþ€ÿ ÿþ‚ÿþ¡þ+ÿÿý²ÿ ÿýÅþrÿ ÿürÿÿýþ6þ8ÿÿþcÿÿ÷äl" 0‹úÿÿþ^ý3ûÿÿöý£DD£þÿÿüùÿÿú­ÿÿÇþDÿÿýãÿÿýÍýIþÿÿþÃþÂÿÿýòDýFôÿÿÿú!÷ÿÿ\þPÿÿþMÿÿýø!þ©ÿÿúú2ÿÿþTþWÿÿÿù…ÿÿä þ\ÿÿþ—ÿÿþ›þ5ŒŒû‡ÿÿþ¾ úÁÿÿÿÿù åÿÿ„þiÿÿþËÿÿþKþÃÿÿþ\ ú_ÿÿÿÿ÷^ÿÿ÷ uÿÿþìÿÿþþèÿÿþ" ú$ÿÿÿÿ÷Èÿÿ¬ÿÿþüÿÿþþûÿÿþ ú ÿÿÿÿø7þÿÿ@ÿÿþýÿÿþþûÿÿþ úÿÿÿÿù¢ÿÿКÿÿþðÿÿþþêÿÿþ! ú ÿÿÿÿùóÿÿg¦ÿÿþÓÿÿþCþÃÿÿþ\ úYÿÿÿÿúzÿÿêÂÿÿþ¤ÿÿþŽþeÿÿû0‡ÿÿþ¾ ú¼ÿÿÿÿýÞÿÿþ_ÿÿýñþ¸ÿÿúþ 2ÿÿþSþTÿÿÿþRÿÿýòÿÿý» þaÿÿþÉþÇÿÿýòCýEóÿÿÿþ½ÿÿþÿÿ÷Ø_ <ŸþÿÿþcþBÿÿöý¢CC£þÿÿüþÿÿý-üÿÿýÐÿ ÿýÉþ“ÿ ÿüÿÿþ–ÿÿýÛÿ ÿý×ý¦ÿ ÿû¡ÿÿýîÿÿü¤þÿÿüý—ýjíÿÿýëgÿþnÿÿõ)†Åëû÷å»} ô `ªÚòüòÙ©^ Âh×h²hˆ×,µÿ'ÿzÿ·ÿáÿôÿûÿëÿÅÿ‰ÿ5Æ@!!»8 Backgroundÿ      Ö»8 ö˜ª˜¶˜Â»8 >e%+g6ªCøQU a‰pBx„ôŒ¡‘× ?þ×<×<×;×:þÇ××9þ{××8þŠ××7þŠ××6þp××5þg××4þj××3þ\× ×2þL× ×1þ/× ×0þ× ×/þ× ×.þ××-þ××,þ××+þ××*þ××)þ!××(þ!××(×'×þ¯%×ý0$×ü–##×ûÖ… ?þ²<²<²;²:þ¥²²9þf²²8þr²²7þr²²6þ]²²5þV²²4þW²²3þL² ²2þ=² ²1þ'² ²0þ ² ²/þ ² ².þ ²²-þ²²,þ²²+þ²²*þ²²)þ²²(þ²²(²'²þ%²ý‚($²ü|#²û±n ?þˆ<ˆ<ˆ;ˆ:þ~ˆˆ9þNˆˆ8þWˆˆ7þWˆˆ6þGˆˆ5þAˆˆ4þBˆˆ3þ:ˆ ˆ2þ/ˆ ˆ1þˆ ˆ0þ ˆ ˆ/þ ˆ ˆ.þ ˆˆ-þˆˆ,þˆˆ+þˆˆ*þˆˆ)þˆˆ(þˆˆ(ˆ'ˆþn%ˆýc$ˆü_#ˆû‡T¿þ<üy:ûhÿ 9úmÿÿ8ýsÿÿ9ýmÿÿ9þgÿÿ8þTÿÿ7ýMþÿÿ6ýQüÿÿ5ýIûÿÿ4ýKûÿÿ3ýFüÿÿ2ý8ýÿ ÿ1ý5þÿ ÿ0ý%üÿ ÿ/ýëÿ ÿ.ý!Üÿ ÿ-ýÍÿÿ,ýÍÿÿ+ýßÿÿ*ýåÿÿ)ýÚÿÿ(ý Âÿÿ'ý¨ÿÿ&ý ¤ÿÿ%ý «ÿÿ$ý «ÿÿ#ý °ÿÿ"ýžÿÿÜöHip€oU+4óI~§¸Ï××Ͻ­O0û/s¬Í××þV.ûM˜ÇÕ× ×ý½Y,üX¤Ð× ×þq*üa«Ó××ýÉ6(üT£Ñ××þ·'üO˜Ê××ý®$üFÒ××ýÀ "ý6p××þÁ!ýH{××ý³ ýNš××ý²ýLÓ××üÖ´6þN××üÕ¼QþT×!×üÖ¿OþV×$×ý»AþT×&×ýÈ=þH×(×ýÈ$þ×*×ý»Hþ×,×ý¿P þ!×.×ýÄN þ!×/×üÖÅXþ/×2×ýÄXþ6×4×ýÁTþF×6×ýË[þF×8×úËTF××üÖÎÕ××üÁX××õʯ”yVZ“¯Ê××þÄ××ú¼c$ û $c¼×1×ü¯?ü;¯×/×ü¯+ü&¯×-×ü¼0 ý$¼×+×üÊH ý1Ê×*×ýlýCÒ×(×ý‰üVÍ×&×ýyü YÇ×$×ýl üOÇ×"×ýnüPÍ××üÒ[ü:É××üÍUü3Ä××üÇ\ü?»××üºNü/¯××ü´C ü)¬××üª@"û*šÒ××ü¦1$û„Í××ý©&(üvÇ××ý–*ü [Â× ×ý‰ ,üPÄ× ×ýy.üPÂ××ýl 0üIÇ××ýn3ýCÍ××üÊPûý½××ü¼?ùDjlZù¬××@üƒÔ××ý¨*û#–×ûÔ××ü©#ý‡û„Õ××ü§%þü#–××ü¬0Üö5ü~àÿÿúôçÛ=/ü|Ùÿ ÿý?,ü9ïÿ ÿýP*üCßÿÿýh(üBÏÿÿýu &üLÊÿÿýu$üOÕÿÿýh"üXÝÿÿþF!ü_ìÿÿý0ü>óÿÿý0ü4éÿÿýKüCßÿÿýz üBÏÿ ÿýœüLÊÿ"ÿýœüOÕÿ$ÿý™ ýRÝÿ&ÿý‰ ýPìÿ(ÿýý'óÿ*ÿý£ ý!éÿ,ÿý¬ ý8ßÿ.ÿý¸!ü:Ïÿ0ÿýªü?Âÿ2ÿýœü?Ãÿ4ÿý™ ý5Âÿ6ÿý… ý%Æÿ7ÿùùx Ìÿ9ÿûóx²ÿ;ÿýì–ÿ~ÿÖþX8ýÅN7ü×ÅX6×ýÄX5×ýÁT4×ýÌ^3×ýÍ]2×ýÆd1×ýÌd0×ýÎV/×ýË^. ×ýÈf- ×ýÊk, ×ýÏ~+ ×ýÐ~* ×ýÌ|)×ýÑv(×ýÒi'×ýÏ|&×ýÏ‚%×ýÐ{$×ýÔ…#×ýÒ‡"×ýχ!×ýÓ‰ ×ýÔ‡×ýÔœ×ýÔœþ‰××ýÕ‡ü nÊ××ýÕÖþI8ý£@7ü²£I6²ý£I5²ý F4²ý©N3²ýªM2²ý¤S1²ý©S0²ýªG/²ý¨M. ²ý¥T- ²ý§Y, ²ý¬h+ ²ý¬h* ²ý©g)²ý­b(²ý®W'²ý¬g&²ý¬k%²ý¬f$²ý¯n#²ý®p"²ý«p!²ý¯r ²ý°p²ý¯²ý¯þr²²ý±pü [§²²ý±uÖþ78ý}17üˆ}76ˆý|75ˆýz54ˆý<3ˆý‚;2ˆý}?1ˆý?0ˆý‚6/ˆý;. ˆý~A- ˆýD, ˆýƒO+ ˆý„O* ˆýN)ˆý„K(ˆý…C'ˆýƒN&ˆýƒR%ˆý„N$ˆý†T#ˆý…U"ˆýƒU!ˆý…W ˆý†Uˆý†cˆý†cþWˆˆý‡Uü Eˆˆý‡YÚþ9ûIF6ûbŽ 6ûZS6ü. 7ý8þ8ýg7üìj 6ûÿól5ÿüù{ 4ÿý™3ÿýœ2ÿýª!1ÿý¸0ÿý°/ÿý®!. ÿü¡, ÿüž + ÿü²** ÿüº3) ÿüÆ9(ÿüÌ,'ÿüÇ.&ÿüË>%ÿüË.$ÿüÇ,#ÿüÌ9"ÿüÆ@!ÿüÏT ÿüßZÿüïhÿýgÿýó1ÿýáÿýÐÿýÊÿýÕ*#×ûÔ#×üÔƒ$þ××üÔy $þ××üÔz $þ××üÖs$þf××ýf$þE××ý`$þH××üÊ<$þI××ü¼0$þN××ü¯8$þJ××ü.$þ(××ü–#%×ûÖ…%×ûÔ$þ ××üÔƒ&×üÔn &×üÔb&×üÍB&×üÄ5&×ü»?&×ü¯/&×ü¬)&×ü§0þ& þ¾××ü™'ü0¦ ýKÉ××ýû@ª× ýyÏ××üÒl úC´××ýŠÓ××üÍ[üNº××ýÓ××üÇY ü\Ç××ý~Ï××üÇOüUÍ××ý^Á××üÍPü cÒ××þ”××üÒ@ý „××ý=¯××üÊ?ý”××ý^Í××ü¼Hý*¨××þv××ü¯Lü#©× ×þ„× ×ü¯Qü%§× ×ýˆÕ× ×ü¼^ ü0¬× ×ý‰Ö× ×üÊyü6§× ×þŠ× ×ý¯CüG¯× ×þ‹× ×ý”(üL¼××ý†Õ× ×ýy ücÊ× ×ýÖ¼þŠ× ×þlý ××üÔ©8þ‰× ×þlý„××üÔœ*þŠ× ×ýy ý××üÊrý†Ô× ×ý”(ý›××üÂSþ‹× ×ý¯Cý¥× ×ûÒŸ.þŠ× ×üÊy ý0¬× ×ûÍ~ ý‰Ö× ×ü¼^ ü9ª× ×üÇm ýˆÕ× ×ü¯Q ü I¦× ×ü¾M þ‰××ü¯^ü^¯× ×ý¹6þ‰××ó¼rC( (Cy¼× ×üΈý„Õ××õʯ”ylly”¯Ê× ×üÄ]ý„Õ×%×ûÒŸ0þ‰×%×ûÍ~þ‰×$×üÇmýˆÕ×"×üÇRý‰Ö×!×ýÍCþŠ×!×ý¸þ‹× ×ý¡ý†Ô××üÍyþŠ××üÂRþ‰××ý¸@þŠ××ý“ý†Õ××ýtþŽ××ü¼=#²û°i#²ü¯l$þw²²ü¯d $þ‚²²ü°e$þ‚²²ü±_$þS²²ýT$þ8²²ýP$þ;²²ü§2$þ=²²üœ($þ@²²ü/$þ=²²ü‚&$þ!²²ü|%²û±n%²û°i$þ ²²ü¯l&²ü¯[&²ü°Q&²üª6&²ü£,&²ü›4&²ü‘'&²üŽ"&²üŠ(þ þ²²ü~ ü(Š ý>¦²²ýuû5² ýe¬²²ü®Y ú7•²²ýs¯²²üªKüAš²²ýw¯²²ü¥J üL¥²²ýi¬²²ü¥BüGª²²ýN ²²üªBü R®²²þz²²ü®5ýn²²ý3²²ü§5ý{²²ýM©²²üœ;ý#‹²²þb²²ü>üŒ² ²þm² ²üCüв ²ýp°² ²üœN ü(޲ ²ýr±² ²ü§dü-в ²þs² ²ý8ü;² ²þs² ²ýz"ü?œ²²ýo°² ²ýe üR§² ²ý±œþr² ²þYý k²²ü°Œ.þq² ²þYým²²ü¯#þr² ²ýe ýw²²ü¨^ ýo°² ²ýz"ý€²²ü¡Dþs² ²ý8ý‰² ²û®ƒ&þr² ²ü§d ý(޲ ²ûªi ýr±² ²üœN ü/² ²ü¥Z ýp±² ²üC ü =‰² ²ü@ þq²²üNüN² ²ý™-þq²²óœ^7" "8dœ² ²üªpým±²²õ§zeYYez§² ²ü£Mým±²%²û®„(þq²%²ûªiþq²$²ü¥Zýp±²"²ü¥Dýr±²!²ýª8þr²!²ý˜þs² ²ý…ýo°²²üªeþr²²ü¡Dþq²²ý˜5þr²²ýyýo±²²ý`þv²²üœ2#ˆû†Q#ˆü†S$þ[ˆˆü†L$þdˆˆü†M$þdˆˆü‡I $þ@ˆˆýA$þ+ˆˆý=$þ.ˆˆü&$þ/ˆˆüw$þ1ˆˆün$$þ.ˆˆüc$þˆˆü_%ˆû‡T%ˆû†Q$þˆˆü†S&ˆü†F&ˆü†>&ˆü‚*&ˆü|"&ˆüv(&ˆüo&ˆüm&ˆüjþ þxˆˆüaüi ý0~ˆˆýYû)lˆ ýMƒˆˆü…Dú*rˆˆýX†ˆˆü‚:ü2vˆˆý[…ˆˆü~9ü:~ˆˆýPƒˆˆü~2ü6‚ˆˆýˆ ˆý‡wþWˆ ˆþDý Rˆˆü†k#þVˆ ˆþDý Sˆˆü†cþWˆ ˆýM ý[ˆˆü€H ýU†ˆ ˆý]ý bˆˆü{4þXˆ ˆýn+ýiˆ ˆû…dþWˆ ˆüL ýmˆ ˆû‚P ýW‡ˆ ˆüw< ü$lˆ ˆü~E ýV‡ˆ ˆün3 ü.iˆ ˆüx1 þVˆˆün< ü#ûcÄ××ûÍ„#&üU»××üÇv)ü#–× ×ü®C,ýu× ×ý™/ü?Á××üÒp 1ü&¬××üÍ[3ûp¼××ýP 6ü 8¡××þ9û%yÍ×;ü RÂø  þ@õ>ylly”A3ý’××üÇ€0ü [Æ××ûÍ–7,ü-™× ×ûÒ¸_*ü<¯× ×ûÍ~'üL¼××ûÒŸ0%üyÊ××üÄ]#ý%ª××üΈ üGÁ××ý¹6ý }××ü¾Pý„××üÇw ü/–××ûÍ‘/ü3¬×!×ûÒ·bü TÁ×%×ü¡ ý†×(×ü¼= ü)ž×+×ýt üU»×-×ý“ ücÄ×/×ý¸@û#ˆÎ×1×üÂR ü&¬×4×üÌy%ý?Á×7×ü¡8 ü&‚² ²üŠ.+ü/² ²ü?)ü(œ²²üœF 'ü2§²²ü§Z %ýP²²ýr#ýT²²ýp!ü_±²²ý|üe°²²ýŽü i¯²²ýœüw¯²²ýª8û z°²²ü¥<û/…±²!²ü¡Bü7•²$²ü¢BüAš²&²ü¡KüL¥²(²ü¥b üGª²*²ûªm üK®²,²û®€#ý[²0²üŽ"ýZ²²õ§z[FWez§²²ü‘'ýe²²óœd7 "8dœ²²ü›4ý r²²û®…EüI²²ø£+}²²ûªl"ü;²²ú¦0Œ²²ü¥b ü:˜²²üªB²²ü”> ü=Ÿ²²ý¥B²²ü‡%üP¥²²þ¥²²û§bü7²#²üœF ý²!²ü?üL ²²ü~&ü*޲²ýuû` ²²ü§Uü 8޲²üœ?!û(qª²²û®†4#ûR£²²ûªm&üG›²²ü¥b)ü|² ²ü7,ýa² ²ý/ü4 ²²ü®] 1ü޲²üªK3û]œ²²ýB6ü/…²²þ9ûeª²;üD¡ù þ5õ 3eYYezu53ýz²²ü¥j0ü K¤²²ûª|--ý%~² ²û®˜O*ü1² ²ûªi'ü?œ²²û®„(%ü e§²²ü£M#ý²²üªp ü: ²²ý™-ýg²²üBým²²ü¥bü'|²²ûªx'ü*޲!²û®—QüF ²%²ü…ýo²(²üœ2 ü"ƒ²+²ý` üG›²-²ýy üR£²/²ý˜5ûpª²1²ü¡Dü޲4²ü©eý4 ²7²ü…/ücˆ ˆüj#+ü$nˆ ˆün0)üwˆˆüw5'ü&ˆˆüE %ý=ˆˆýW #ýAˆˆýU!ü I‡ˆˆý_üM†ˆˆýmü P†ˆˆýwü[†ˆˆý‚+û]†ˆˆü~.û$f‡ˆ!ˆü{3ü*rˆ$ˆü|3ü2vˆ&ˆü{:ü:~ˆ(ˆü~K ü6‚ˆ*ˆû‚S ü:…ˆ,ˆû…býEˆ0ˆümýEˆˆõn]F6CM]nˆˆüoýMˆˆówL*+Lwˆˆüv(ý Wˆˆû…f5 ü8nˆˆø|! _ˆˆû‚Sü-nˆˆú%kˆˆü~K ü-tˆˆü‚3ˆˆüq/ ü/zˆˆý~2ˆˆügü=~ˆˆþ~ˆˆüKü*nˆ#ˆüw5ýaˆ!ˆün0ü:zˆˆüaü mˆˆýYûJzˆˆüAü+mˆˆüw0!ûV‚ˆˆû…f'#û >|ˆˆû‚S&ü6vˆˆü~K )ü_ˆ ˆün*,ýJˆ ˆýa/ü(zˆˆü…G 1ümˆˆü‚:3ûGwˆˆý36ü$fˆˆþ9ûM‚ˆ;ü4{ù þ)õ 'MDDM]Y)3ý \ˆˆü~Q0ü9}ˆˆû‚_#-ýaˆ ˆû…t< *ü&nˆ ˆû‚P'ü0wˆˆû…e%ü Mˆˆü|;#ýlˆˆü‚V ü,zˆˆýu"ýOˆˆüx3ýSˆˆü~Kü_ˆˆû‚\ü mˆ!ˆû…t> ü5zˆ%ˆüfý Uˆ(ˆüw& üdˆ+ˆýI ü6vˆ-ˆý] ü >|ˆ/ˆýt)üV‚ˆ1ˆü{4ümˆ4ˆüMý(zˆ7ˆüf$ÿû T¼××ýÔ”üL¯××ýÒ—ü7§××ýÔŸü0¬××ýÕŸü%§××ýÔ«ü#©××ýÕ©ý*¨××ýÖ˜ýŸ××ýÖ¨ý›××ýÕ®ý××üÔ§ý„××üÖ©ý ××ýÖ§ücÊ××ýÔ®üL¼××ýÕ§üG¯××ýÕœü2¦××üÕ™ý&©××ýÑý–××ýËyý ‰××ý¼^ýy××þ”ý l××ý¯=ýn××ýÍ^ ü[Ò××þvþüUÍ××þ„ýY ü\Ç××ýÕˆüÍ[üZÇ××ýÖ‰û×Òk ühÍ××þŠ×ýüvÒ××þ‹×ü™(ý•× ×ýÕ†×ü¯8üE¼× ×þŠ×ü¼0üyÊ× ×þ‰×üÊ=ýC¯× ×þŠ×ý`ý(”× ×ýÔ† ×ýfý y× ×þ‹ ×üÖsþl× ×þŠ ×üÔz þl× ×ýÖ‰ ×üÔy ý y× ×ýÕˆ ×üÔƒý(”× ×þŒ ×üÔgýC¯× ×þ”×üÈP üyÊ× ×ýÖš×ü¼L ü ^¼× ×ýÖ«×ü¯I üQ¯××þ¹þ¸××ü¯^üL¯××þ¾ý“××ò¼yC( (Cy»Ö××þ»ýt××õʯ”ylly”¯Ê××þ¾ ü=¼×*×þ¿ ü ¡×)×þÀ ûb·Ò×&×þ¹ û/‘Í×%×þÀü wÇ×$×þ¿üP¾×#×þÀý6¹×!×ýÖ¹üˆÎ× ×þÀü]Ä××þ¿û0ŸÒ××þ¾û~Í××þ»û_¸Ò××þ¿û7–Í××þÁü€Ç××þ¿üE®××þÊý™×× ü \Á××!ü3¬××þÏ!ûyÊ××þÓû Fœ²²ý¯{ü?²²ý®}ü-в²ý¯„ü(޲²ý±ƒüв²ý°ŽüŒ²²ý±Œý#‹²²ý±~ýƒ²²ý±‹ý€²²ý±ýw²²ü°Šým²²ü±Œý k²²ý±ŠüR§²²ý°ü?œ²²ý±Šü;²²ý°ü)в²ü°ýŒ²²ý­uý|²²ý¨dý r²²ýœNýe²²þzýY²²ý3ý[²²ý©M üK®²²þbþüGª²²þmýJ üL¥²²ý°püªKüK¥²²ý±rû²®Y üVª²²þs²ýuüa®²²þs²ü~"ý{² ²ý°o²ü/ü9œ² ²þr²üœ(ü d§² ²þq²ü§2ý8² ²þr²ýPý"z² ²ý°o ²ýTý e² ²þs ²ü±_þY² ²þr ²ü°eþY² ²ý±r ²ü¯e ý e² ²ý±p ²ü¯l ý"z² ²þt ²ü°Uý8² ²þz²ü¦B üd§² ²ý±€²üœ> ü Nœ² ²ý±Ž²ü<üC²²þšþ˜²²üNü?²²þýy²²òœd8" "8d›±²²þ›ý`²²õ§zeYYez§²²þ ü2œ²*²þž ü…²)²þŸ ûQ—®²&²þ™ û'xª²%²þŸüb¥²$²þžüB²#²þŸý-™²!²ý±™üpª² ²þŸüM£²²þžû(„®²²þûiª²²þ›ûO˜®²²þžû-|ª²²þ üj¥²²þžü9²²þ§ý²² üL ²²!ü*޲²þ«!ûe§²²þ¯û5wˆˆý†^ü0nˆˆý…_ü#jˆˆý†eümˆˆý‡düjˆˆý†lükˆˆý‡kýjˆˆý‡`ýdˆˆý‡jý bˆˆý‡ný[ˆˆü†jý Sˆˆü‡ký Rˆˆý‡jü>ˆˆý†nü0wˆˆý‡jü-nˆˆý‡büiˆˆü†`ýkˆˆý„Yý _ˆˆýLý Wˆˆýw<ýMˆˆþ]ýDˆˆýn'ýEˆˆý; ü:…ˆˆþKþü6‚ˆˆþSý9ü:~ˆˆý‡Vü‚:ü9~ˆˆþWûˆ…DüB‚ˆˆþXˆýYü K…ˆˆþXˆüaý^ˆ ˆý‡Uˆün$ü+wˆ ˆþWˆüwü Lˆ ˆþVˆü&ý+nˆ ˆþWˆý=ý]ˆ ˆý†U ˆýAý Mˆ ˆþX ˆü‡I þDˆ ˆþW ˆü†MþDˆ ˆý‡W ˆü†Mý Mˆ ˆý‡V ˆü†S ý]ˆ ˆþY ˆü†Bý+nˆ ˆþ]ˆü2 üLˆ ˆý‡bˆüw0 üt…ˆ&ˆþu û\‚ˆ%ˆþzüK~ˆ$ˆþyü3xˆ#ˆþzý"uˆ!ˆý‡uü V‚ˆ ˆþzü;|ˆˆþyûe…ˆˆþxûP‚ˆˆþvû |ˆˆþwˆˆý]üV‚ˆˆþtˆˆýIýmˆˆþtˆˆü)ýzˆˆþxˆˆüwþ3ˆˆþyˆ ˆün$ý@ˆˆþvˆ ˆün)ýUˆ ˆþxˆ ˆüw<üfˆ ˆþyˆ ˆüLü&wˆ ˆþzˆ ˆýn+ýIˆ ˆþuˆ ˆý]ý]ˆˆþzˆ ˆýM ý)tˆˆþyˆ ˆþDü4{ˆˆþzˆ ˆþDüMˆˆýu‡ˆ ˆýM üfˆˆþzˆ ˆý]ü&wˆˆþyˆ ˆýn+ýIˆˆþxˆ ˆüL ý Wˆˆþvˆ ˆüw< ýeˆˆþ‡þyˆ ˆün3 üdˆˆý‚Oþyˆ ˆün<ü6iˆˆýy)þtˆˆówL +Lwˆˆü†`þtˆˆõMZMDDM]nˆˆý~0þxˆˆþ‡ˆˆü‡g þyˆ.ˆü‚: þvˆ-ˆüx( þxˆ+ˆû†[ þyˆ*ˆüGþzˆ(ˆû‡n*þuˆ'ˆü„Sþzˆ&ˆüv. þzˆ$ˆü‡Qþ|ˆ#ˆü€3þ}ˆ"ˆýe "ˆüƒA!ˆýe þ…ˆˆü…Fþƒˆˆýrˆü‡hˆüN þ‚ˆˆýy/!þ‚ˆˆü…^"ˆý/$ˆýu%þƒˆˆý‡S'þ…ˆˆý€;(ˆýk)ˆûZ('þˆˆý) 'ˆüW!&ˆûrA $ˆû„j=#þˆˆûb3!ˆû‡zV ˆú‡{T!þ…ˆˆû…{C þƒˆˆû‡v>"ˆûq1 #ˆû…f6 þ‚ˆ$ˆûg4þ‚ˆ%ˆû‚_, þmÿ8ÿþcÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþ^ÿ8ÿþhÿ8ÿþvÿ8ÿþ‰ÿ8ÿþ”ÿ8ÿþ•ÿ8ÿþ‘ÿ8ÿþ~ÿ8ÿþjÿ8ÿþaÿ8ÿþ^ÿ8ÿþ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþcÿ8ÿþcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿþ^ÿ8ÿ×ýÖÕ××û¼p××ûÅ[uÄ××ý¬&××÷Õ¥-6·Ô××þÁ××üÎpü—Î×2×ûÖ½[ üWÇÔ×/×ûÑ“5ü+”Î×,×ûÖ¿o üD·Ô×)×ûÒ’5 ü"ƒÏ×'×üÇ^ ý>¹×$×ûÕ§8ü)’Ñ×!×üÒoüW¿××ü¿4 û AŸÒ××þ€ûfÁ××ýËUû AžÑ××ý!ûn½××üÏt$û F¨Ò××ü¨. &û u¿× ×üÏ{+ü6¤Ñ× ×ü°8 -ürÀ××üÓ“1ü6­Ò××üÁ[ 3ûƒÈÖ××ý«+7ùD·Ô××9û"Ï×<ý6µ=þ ¿²ý±°²²ûœ]²²û£Ka¢²²ý޲²÷±‰%-—°²²þ ²²ü«\ ü}ª²2²û±œLüH¥°²/²û­y,ü$zª²-²üž\ ü9—°²)²û®y, ül¬²'²ü¤Ný3š²$²û±Š.ü"y­²!²ü®\ü Hž²²üž+û6„®²²þjûT ²²ý¨Fû6ƒ­²²ý!û[œ²²ü«`$û:‹®²²ü‹& &ûaž² ²ü¬f+ü-ˆ­² ²ü’/-ü^Ÿ²²ü¯y1ü-®²²üŸL 3ûl¥±²²ýŽ#7ù9—°²²9ûk«²<ý-–=þ ¿ˆ‡ˆûwGˆˆû|:J|ˆˆýmˆˆ÷‡h"t†ˆˆþzˆˆüƒF ü_‚ˆ2ˆû‡x:ü7~†ˆ/ˆû„\"ü]‚ˆ-ˆüyF ü+t†ˆ)ˆû…]" üSƒˆ'ˆü~;ý'uˆ$ˆû‡i#ü\„ˆ!ˆü…F ü 7yˆˆüy!û)e…ˆˆþQûAzˆˆý5û)d„ˆˆýc!ûFwˆˆüƒJ $û,j…ˆˆüj&ûJyˆ ˆüƒN +ü"h„ˆ ˆüo$-üHzˆˆü†]1ü"m…ˆˆüz: 3ûS~‡ˆˆýl7ù+t†ˆˆ9ûRƒˆ<ý"s=þ ¿ÿü T¼××þû4ŽÊ××ý?ûb¼× ×þÌü×uü S¯× ××ü–#üL¯× ××ü»Uü ^¼× ××üÄcüyÊ× ×þÌ×ûΈ/ýC¯× ××ü¬C ý(”× ××ûÁtý y× ×þÓ ×ü¬3þl× ×þÏ ×üÁ\ þl× × ×ý™ý y× × ×ü®Cý(”× ×þÏ×üÇvýC¯× ×þÏ×ûÍ„% üyÊ× ×þ ×ûÒ¢I ü ^¼× ×þ×û¼bü Q¯× ×ýÒ+×ûÊŽAü^¯× ×ýÔ+×ó¼yC( (Cy¼××þ+×õʯ”ylly”¯Ê××þ/0×ýÐ!1×þ(1×þ(ý„Ð×.×þ(ý>¹×,×ýÑ!ü)’Ð×+×þE üW¼×*×þR û AžÑ×'×ýÕ_ ûn½×&×ýÔn û F¨Ò×%×þ{û u¿×$×þ„ü6¤Ñ×!×ýÔ„ürÀ× ×ýÕ„ü6­Ò××þ‰ûƒÈÖ××þ‰üD·Ô××ýÕˆü"Ï××ýÖ‰ý6µ××þŠü„Ð××þ‹ý>¹××ýÔ†ü)’Ð××þŠüW¼××þ‰ û AžÐ××þŠ!ûn´××ýÔ†#ü F¼××þ‹$ý•××þŠ%ý‰Ö××ýÖ‰%ýˆÕ××ýÕˆ%þ‰××þ‰%þŒ××þ‰%ýÖ××ýÕ„$ý­××ýÕ„"û I–Ò××þ‰!ûu¾Õ××þ‰ûP¡Ñ××ýÕˆû+‰ÂÖ××ýÖ‰ûg±Ô××þŠü6ŸÌ××þ‹û ^³××ýÔ†û!‹Ï××þŠûH­××þ‰û 8‰Î××þŠûb¼××ýÕ†ü Fœ²²þû+u§²²ý4ûQœ² ²þ©ü²aü E² ²²ü|ü?² ²²ü›Gü Nœ² ²²ü£Rüd§² ²þ©²ûªp'ý8² ²²üŽ8 ý"z² ²²û `ý e² ²þ¯ ²üŽ*þY² ²þ« ²ü LþY² ² ²ýý e² ² ²ü7ý"z² ²þ«²ü¥bý8² ²þ¬²ûªm  üd§² ²þ²û®†; ü Nœ² ²þ²ûœQü C² ²ý®$²û§u6 üN² ²ý°$²óœd8" "8dœ²²þ$²õ§zeYYez§²²þ'0²ý¬1²þ!1²þ!ýn¬².²þ!ý3š²,²ý­ü"y¬²+²þ9 ü Hœ²*²þD û6ƒ­²'²ý±O û[œ²&²ý°[ û:‹®²%²þfûaž²$²þmü-ˆ­²!²ý°mü^Ÿ² ²ý±mü-®²²þqûl¥±²²þqü9—°²²ý±pük«²²ý±rý-–²²þrün¬²²þsý3š²²ý°oü"y¬²²þrü Hœ²²þq û6ƒ¬²²þr!û[•²²ý°o#ü:œ²²þs$ý|²²þr%ýr±²²ý±r%ýp±²²ý±p%þq²²þq%þt²²þq%ýv±²²ý±m$ý²²ý±m"û =|®²²þq!ûa°²²þqûB…­²²ý±pû$q¡±²²ý±rûU“°²²þrü-ƒ©²²þsû M”²²ý°oûs«²²þrû;²²þqû.rª²²þrûQœ²²ý±oü 5wˆˆþû!Yˆˆý(û>wˆ ˆþüˆJü4nˆ ˆˆü_ü0nˆ ˆˆüv6ü üLˆ ˆþˆû‚Vý+nˆ ˆˆüm+ý]ˆ ˆˆûzJý Mˆ ˆþ… ˆüm þDˆ ˆþƒ ˆüz:þDˆ ˆ ˆýaý Mˆ ˆ ˆün*ý]ˆ ˆþƒˆü~K ý+nˆ ˆþƒˆû‚S üLˆ ˆþˆû…f- ü ü 3nˆ ˆý…ˆûY) üwˆˆý‡U2ÿþ2ÿ2ÿ2ÿþ 2ÿ2ÿ2ÿ2ÿþ 2ÿ2ÿ2ÿþ2ÿþ 2ÿ2ÿ2ÿþ 2ÿþ 2ÿ2ÿ2ÿþ2ÿþ2ÿþ2ÿþ2ÿý$2ÿþ2ÿþ2ÿþ2ÿý$2ÿþ2ÿþ2ÿþ&2ÿþ72ÿþF2ÿþN2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^)×ûÁ…5 *×ûÓ´hþÏ×*×ûÔ´o+ þÓ×+×ûÖϾW 0×ûÔ·Q 3×ûªIþÎ×2×ûÏ”5 6×üʃBþ ××õʯ”ylly”¯Ê××ýÕºþ$××ó¼q66q¼××ý!Ð××ü¯Rû"pµ××þ+××ü¯B ü*“××þ/××ü¼L û3—Í××ý+Ô× ×üÊj û1…¯Ê××ý+Ò× ×ý¤&û9y¼××þ(× ×ýx û ;ƒ¼× ×þ+× ×ýSûB¡× ×ý!Ñ× ×þ=ûC–Á× ×ý!Ñ× ×þ6ù A”ÄÎ××þ+× ×þ=û CŽÄ××þ+× ×ýTú@ˆ·Ò××ý+Ò× ×ýxúA‘Í××ý+Ô× ×ý¤"úR¢Ê×þ+× ×üÊU"û#o¼þ/××ü°+$þý!Ð××ý™*þ(××þ*þ(××üÈ(þ(××ùÕ¥a%ý!Ð××û¸v: $þ+××û¾{A!þ/××øÕ˯p4ý+Ô××úÒµƒ9ý+Ò××ûÒªD þ(× ×û¦Rþ+×!×úÔ¶t*ý!Ñ×"×úÒÅ–5ý!Ò×%×ûΠD þG×)×ûªJþT×*×ûÁ‡: ýcÔ×+×û¼yC ýtÖ×,×ûʯ”< þ€×1×ü¡K þˆ×3×û¬J ý†Ô×3×ûÁ‹; þŠ×6×ýÍ‘þ‰×7×þÒþŠ××õʯ”ylly”¯Ê××ý†Ô× ×ó¼yC (Cy¼××þ‹× ×ü¯^üW¡××þŠ× ×ü¯Q û=”¯Ê××ý‰Ö× ×ü¼^ ù6a¡ÂÍ××ýˆÕ× ×üÊyûF‚Â××þ‰× ×ý¯Cû\–Á××þ‰× ×ý”(ù (l¡¼× ×ý„Õ× ×ýy û&Q¡× ×ý„Õ× ×þlûC–Á××þ‰× ×þlø(gœ·Ò××þ‰× ×ýy ú"K‘Í××ýˆÕ× ×ý”(#û-|¼××ý‰Ö× ×ý¯C&ûaœ·þŠ× ×üÊy&ü=þ‹× ×ü¼^ -ý†Ô× ×ü¯Q ')²û n, *²û¯•Vþ«²*²û¯•\$ þ¯²+²û±¬H 0²û°—C 3²û= þª²2²û«z,6²ü§l6þ ²²õ§zeYYez§²²ý±šþ²²óœ^--^œ²²ý¬²²üD û\–²²þ$²²ü6 ü"y²²þ'²²üœ? û*}ª²²ý$°² ²ü§W û(n§²²ý$®² ²ý‡û/dœ²²þ!² ²ýc û 1lœ² ²þ$² ²ýEû6…² ²ý­² ²þ2û 8| ² ²ý­² ²þ-ù 6z¢ª²²þ$² ²þ3û 7u£²²þ$² ²ýEú5p—®²²ý$®² ²ýcú 6xª²²ý$°² ²ýˆ"úD†§²þ$² ²ü§G"û\œþ'²²ü’#$þý¬²²ý~*þ!²²þi*þ!²²ü¦(þ!²²ù°‰P%ý¬²²û˜a0 $þ$²²ûf6!þ'²²ø±¨]+ý$°²²ú®–m/ý$®²²û®8þ!² ²û‰Dþ$²!²ú°—`#ý­²"²ú®¤|,ý®²%²ûª„8 þ;²)²ûŒ= þF²*²û p0 ýR¯²+²ûœd8 ý`±²,²û§z2 þj²1²ü…> þp²3²ûŽ= ýo°²3²û s1 þr²6²ýªxþq²7²þ®þr²²õ§zeYYez§²²ýo°² ²óœd8 "8dœ²²þs² ²üNüH…²²þr² ²üC û2z§²²ýr±² ²üœN ù-P…¡ª²²ýp±² ²ü§dû:l¡²²þq² ²ý8ûL| ²²þq² ²ýz"ù "Y…œ² ²ým±² ²ýe ûC…² ²ým±² ²þYû 8| ²²þq² ²þYø"U—®²²þq² ²ýe ú>xª²²ýp±² ²ýz"#û%gœ²²ýr±² ²ý8&ûP—þr² ²ü§d&ü2þs² ²üœN -ýo°² ²üC ')ˆûzT" *ˆû…rBþƒˆ*ˆû†rF þ…ˆ+ˆû‡ƒx7 0ˆû†t3 3ˆûl. þ‚ˆ2ˆûƒ]"6ˆüS*þˆˆõn]MDDM]nˆˆý‡vþˆˆówG##Gwˆˆý„ˆˆün4 ûFsˆˆþˆˆün) ü]ˆˆþˆˆüw1 û _‚ˆˆý†ˆ ˆüBûTnˆˆý…ˆ ˆýgû$Lwˆˆþˆ ˆýKû%Swˆ ˆþˆ ˆý5û *fˆ ˆý„ˆ ˆþ&û +_zˆ ˆý„ˆ ˆþ"ù)]|‚ˆˆþˆ ˆþ'û*Z|ˆˆþˆ ˆý5ú)Vt…ˆˆý…ˆ ˆýKú )\‚ˆˆý†ˆ ˆýg"ú4fˆþˆ ˆü6"ûFwþˆˆýp%þý„ˆˆý`*þˆˆþP*þˆˆü(þˆˆù‡i=%ý„ˆˆûtK%$þˆˆûxN) !þˆˆø‡nG ý†ˆˆú…sS$ý…ˆˆû…l+þˆ ˆûi4þˆ!ˆú†sJý„ˆ"ˆú…}_"ý…ˆ%ˆû‚e+þ-ˆ)ˆük. þ5ˆ*ˆûzU% ý?†ˆ+ˆûwL+ ýI‡ˆ,ˆûn]& þQˆ1ˆüf/þVˆ3ˆûm/ ýU†ˆ3ˆûzX%þWˆ6ˆý‚\þVˆ7ˆþ…þWˆˆõn]MDDM]nˆˆýU†ˆ ˆówL+ +LwˆˆþXˆ ˆün<ü7fˆˆþWˆ ˆün3 û&]nˆˆýW‡ˆ ˆüw< ù"=f{‚ˆˆýV‡ˆ ˆüLû ,R{ˆˆþVˆ ˆýn+û:_zˆˆþVˆ ˆý]ùDfwˆ ˆýS‡ˆ ˆýM û3fˆ ˆýS‡ˆ ˆþDû +_zˆˆþVˆ ˆþDøAct…ˆˆþVˆ ˆýM ú/\‚ˆˆýV‡ˆ ˆý]#ûNwˆˆýW‡ˆ ˆýn+&û=ctþWˆ ˆüL&ü&þXˆ ˆüw< -ýU†ˆ ˆün3 'þ\ÿ8ÿþ[ÿ8ÿþZÿ8ÿþ`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿþ`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ\ÿ8ÿþ^ÿ8ÿþaÿ8ÿþjÿ8ÿþ~ÿ8ÿþŠÿ8ÿþÿ8ÿþ–ÿ8ÿþ‘ÿ8ÿþŠÿ8ÿþƒÿ8ÿþƒÿ8ÿþƒÿ8ÿþÿ8ÿþƒÿ8ÿþ‚ÿ8ÿþ…ÿ8ÿþƒÿ8ÿþÿ8ÿþ–ÿ8ÿþœÿ8ÿþ¦ÿ8ÿý­ÿ8ÿý¶ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¹ÿ8ÿþ·ÿ8ÿþ·ÿ8ÿþ·ÿ8ÿý¹ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¶ÿ8ÿýµÿ8ÿþ·ÿ8ÿþµÿ8ÿý¹ÿ8ÿý¹ÿ8ÿþ¶ÿ8ÿþ¶ÿ8ÿýµÿ8ÿý¶ÿ8ÿþµÿ8ÿþ´ÿ8ÿý¹ÿ8ÿþ´ÿ8ÿþ¥ÿ8ÿþ”ÿ8ÿýƒÿ8ÿþlÿ8ÿþcÿ8ÿý\ÿ8ÿý^ÿ8ÿÀþ=ýŒ6;ù3׺z( 6ö+ŽÑ××Ó°^1ú (C–Ò××ûÓ®h".û^”Í××üÑ­D+ü6‚Ã× ×üÒª@%û (C›××û‰ ûcšÏ××ûÊk5 ð .DYiŸ®º¿ÄÒ××çÀ> .DYi|„‰ˆ”¢³Ð××Ï××þÔ××þÖ××÷Õʺ­·ÃÇÈ××úÓ××ÖÖ×_×þÁ×<×û¬\W¡×7×ôÒ·\Y½ÇÒ×1×úʧdûl¢Í×/×ü¤FûX™Á×*×ûÍ‘8 ûY¬×&×ûʯ…%úS£Î× ×ùÍ—O ûmÄ××û‚= ût¼××ûµz? ûi¦Á××ú¼¡^!ä%?NMLQMNMQLMNONNSSNNO:!&þó—û A7÷ `×·ˆ@4û[¬××ûÄŽ<0û!a±××ûÎÊ(.ûp¬Ê× ×û¼|-(ú@y¶Ô× ×úÍ‘K' õ=h‚§ÁËÕ××ðÒ·œq="é &I¡¼××Þʯ”yaSONMLQMNMQLMNONNSSNNONXeœ·Ò××ý¼¡×;×û¡Q&Ò×7×õÁ–Cx´ÇÒ×1×ú¼¡i"ú$c¢Í×/×û‘>úQ·Ò×(×úÒ®v!Àþ=ýt-;ù*²še" 6ö$v¬²²¯‘N1ú "8|®²²û¯V.ûNz©²²ü­9+ü-l¡² ²ü®Œ5%û "8€²²ûr  ûS¬²²û§Y,ð&9JWiwƒšž¢®²²çŸi3&9JWgmrp{†”¬²²«²²þ¯²²þ±²²÷°§š—¡¥¥²²ú¯²²±±²_²þ ²<²ûŽLH…²7²ô®—LIœ¥®²1²ú§‰Rû Y†ª²/²üˆ: ûI ²*²ûªx. ûJ޲&²û§núD‡ª² ²ùª¡}AûZ£²²û¡l3 û`œ²²û–e4 ûWŠ ²²úœ…N!ä4@@?C@A@C?@@BAAEEAAB0 *þó—û6 7÷O²—p54ûK޲²û£u20ûP’²²ûª¡r".û]ާ² ²ûœg%(ú 5d—°² ²úªx> õ2VlŠ ¨±²²ð®—^2é ¯××&ý™××þÏ#üH××þÓ"ü'××"ü5–×× ûP¬××þÌú\–Á××úYŽÄ××ù ;v°ÃÎ××ú Mœ·Ò××þÏû m¬× ×úK‘Í×"×þ ù&gœ·Ò×"×ýÔ+ û F‘Á×&×ýÒ+úa¶Ô×)×þ(ù/{­ËÕ×*×þ+ü\™Ê×-×ýÑ!1×ýÑ!2×þ+2×þ+×õʯ”ylly”¯Ê××ýÒ+×ó¼y?! .b±××ýÔ+×ü¡Wü5™××þ+×ûʯ”= ü#Ž××þ/ ×ùÍ¡a6 ü$™× ×ýÐ! ×û‚Fü5°× ×þ/×ûʯ~1übÊ× ×þL×ùÍ¡a.ý.¯× ×þZ×û‚Fý”× ×ýÔiú×Á–\ýy× ×þ|ûl( þl× ×þ„þ"þl× ×ýÖ‰)ýy× ×ýÕˆ)ý”× ×þ‰)ý!¯× ×þ‰(üOÊ× ×ýÕ„ û6ƒ­²!²þvûW¢²#²þ|ûFН²$²þƒ ü^ª²%²ý± ü>–±²'²þš þa²*²þœü5¢²+²þ—ü /²-²þ—ý}®².²þ1²þž1²þ›1²þ²ó§sQ=32=Rr§²²þž²úœd1ú1dœ²²þŸ²û–\"üN²²þ™ ²ù±¨ g ü C²²þŸ ²ú°—d"ü Nœ² ²þŸ²û§Ž]üd§² ²þ£²ûœb(ý8² ²þ£²ûŽVý"z² ²²üjý e² ²²ûœoþY² ²þ¯ü†PþY² ²þ«ýý e² ²)ý"z² ²)ý8² ²þª'üd§² ²þª&üNœ²²'ý4²²&ý²²þ«#ü ;²²þ¯"ü t²²"ü,|²² ûB޲²þ©úL| ²²úIu£²²ù 1b’¡ª²²ú@—®²²þ«ûZ޲ ²ú>xª²"²þ ùU—®²"²ý°$ û :w ²&²ý®$úP—°²)²þ!ù'f¨±²*²þ$üL~§²-²ý­1²ý­2²þ$2²þ$²õ§zeYYez§²²ý®$²óœd4&Q’²²ý°$²ü…Hü,²²þ$²û§z2 üu²²þ' ²ùª¡…P- ü~² ²ý¬ ²û¡l:ü,’² ²þ'²û§i(üQ§² ²þ?²ùª¡…P&ý&² ²þK²û¡l:ýz² ²ý¯Wú² |Lýe² ²þgûY" þY² ²þmþ"þY² ²ý±r)ýe² ²ý±p)ýz² ²þq)ý² ²þq(üA§² ²ý±m û)d„ˆ!ˆþZûB|ˆ#ˆþ^û 5i†ˆ$ˆþd üH‚ˆ%ˆý‡n ü/s‡ˆ'ˆþu þJˆ*ˆþwü)|ˆ+ˆþtü $cˆ-ˆþtý_…ˆ.ˆþx1ˆþy1ˆþv1ˆþxˆónW>/'&/?WnˆˆþyˆúwL%ú&LwˆˆþzˆûsFüoˆˆý†ˆüf7ü!aˆˆþˆûn]& üYˆˆþ ˆù‚{f=" ü`ˆ ˆý„ ˆû{R, ü"pˆ ˆþˆûnPü>ˆ ˆþ0ˆù‚{f=ýnˆ ˆþ9ˆû{R, ý]ˆ ˆý†Búˆz_:ýMˆ ˆþNûDþDˆ ˆþSþ"þDˆ ˆý‡W)ýMˆ ˆý‡V)ý ]ˆ ˆþV)ýnˆ ˆþV(ü2ˆ ˆý‡S2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýc2ÿþ]2ÿþ]2ÿý^2ÿý\2ÿþ[2ÿþZ2ÿý`2ÿþ[2ÿþ]2ÿþ[2ÿý`2ÿþZ2ÿþ[2ÿý\2ÿý^2ÿþ]2ÿþ]2ÿýc2ÿýb2ÿþb2ÿþl2ÿýz2ÿþ‰2ÿþš2ÿý«2ÿýµ2ÿþ¶2ÿþ¶2ÿý¹2ÿý¹2ÿþµ2ÿþ·2ÿýµ2ÿý¶2ÿþ´2ÿþµ2ÿý¹2ÿþ¸2ÿþÂ2ÿþÌ2ÿýÚ 2ÿþæ2ÿþó3ÿþ3ÿþ 3ÿ3ÿ3ÿþ þŠ× ×ü¯^)ü‰××û¼yC (ýŠ××ûʯ”<'ü&†Ô××ü¡W$ý)‹××ú¼yC ý(Š××øÊ¯”Hü‰Ö××û¬w5üƒÖ××úÍ¢l(ý ‚××øÒǽ…<ý x×!×û¼•Týh×#×úÍ¢l.þ]×$×øÒǽŽNþR×(×ûÁ¦iþH×+×û¼†8 ý/Ê×-×û¬`) þ³×.×ùÁ¦p*þš×1×úÁ–Kþ6×4×ü¬`3þ£×4×ýÁ¦þZ×6×ý¼×5×ýoÊ×4×ý$¢×4×üRÍ×3×ü‘Ò×2× ýEµ×2× û b¶Ï×0× û^”ÇÖ×-×ú=ÇÐÖ×*×üW—Ì×)×üQÊ×&×ûI~ºÕ×"×ûaš¸Ï××ù!f›µÏÖ×× ú=ŽÇÐÖ××#üW—Ì××&üQÊ××)ûI~ºÕ××,ûaš¼Ó× ×.ú!p¯ÊÔ× ×1ü6l·× ×4ütµ××7ûk©Ð××:úI‰«ÉÖ;üR‹¿þr² ²üN)üq²²ûœd8 (ýr²²û§z2'ü&o°²²ü…H$ý)s²²úœd8  ý(r²²ø§z; ür±²²ûŽb,ýl²²úª†Y"ý k²²ø®¥œn2ý d²!²ûœ|FýV²#²úª†Y&þN²$²ø®¥œv@þE²(²û ŠWþ>²+²ûœo/ ý*§²-²ûŽP" þ™².²ù Š]#þ‡²1²ú |>þ2²4²üŽP+þ‰²4²ý ŠþN²6²ýœ²5²ý\§²4²ý†²4²üDª²3²üx®²2² ý9—²2² û Q—¬²0² ûNz¥±²-²ú3v¥¬±²*²üH}©²)²üCw§²&²û=iš±²"²ûP€˜«²²ùT€–«±²² ú3v¥¬±²²#üH}©²²&üCw§²²)û=iš±²²,ûP€œ¯² ².ú]‘¨°² ²1ü-Y—² ²4ü`–²²7û YŒ¬²²:úsƒˆ0ˆ û<]~‡ˆ-ˆú'Z~„‡ˆ*ˆü7_ˆ)ˆü3[ˆ&ˆû.Pv‡ˆ"ˆû=btƒˆˆùAbsƒ‡ˆˆ ú'Z~„‡ˆˆ#ü7_ˆˆ&ü3[ˆˆ)û.Pv‡ˆˆ,û=bw…ˆ ˆ.úGo€†ˆ ˆ1ü"Dtˆ ˆ4ü Isˆˆ7û Dk„ˆˆ:ú.Wl‡;ü4X¿þ]ÿ8ÿþ]ÿ8ÿýcÿ8ÿýcÿ8ÿþ]ÿ8ÿþ]ÿ8ÿý^ÿ8ÿý\ÿ8ÿþ[ÿ8ÿþZÿ8ÿý`ÿ8ÿþ[ÿ8ÿþ]ÿ8ÿþ[ÿ8ÿý`ÿ8ÿþZÿ8ÿþ[ÿ8ÿþ.ÿ8ÿþ¿ÿ7ÿþgÿ7ÿýßÿ6ÿýtïÿ5ÿý¨ÿ5ÿüMßÿ4ÿü ïÿ3ÿý4Ïÿ3ÿû.µôÿ1ÿ û cØùÿ/ÿ ù^§Ïïÿ,ÿû<†ßÿ+ÿû&n³óÿ'ÿúR¹Úæóÿ#ÿû'fšæÿ"ÿýHÐÿ!ÿû =†ßÿÿùI„Áôÿÿ!÷;†¹Ùùÿÿ%ø$HŒÑèôÿÿ(ú!i¨éÿÿ,ûd³óÿ ÿ/ü=»óÿ ÿ0ú%Áôÿÿ2ø=v®åÿÿ6û[Ìÿÿ8ødÎåñþ:û -ø8v°ÄÎ×"×úÒ·•IÔ'7HMS[n|‰˜œ›¤¯¹ÂÎ××Ô××ÖÕ××ÕÕ××ÕÖ××Ô××Ík#þþã !&-23/,#úB 6ôZœ·Ò€91ûV–Á××ðΣwB þû@|Á× ×áʯ”yaSONF=3 ïAl¢Í×$׿Îù¯¤œœ˜‹|n[SNNQYjz¢²½ÇÒ×G×üÔ¦c×8×üÈ™^ü²ÄÑ×2×ûÏ¡võ!fšµÂÐ××ÖÖ×)×ýš= ò=^vŒš«»ÁÄÓ××Ï××÷Ô××ÖÖ××Ö××ü¯lñAYi|„‰ˆ‘™¢´½ÄÄ××ñÏ××ÕÔ××ÒÒ×׿†Q1÷K_ovp^=Òø.b’¢ª²"²ú®—{< Ô -<@EK[gr~€‡™ ª²²°²²±±²²±±²²±±²²°²²ªYþã  %)*'$ú7 6ôJ—®j/ 1û G| ²²ðª‡b7 þû5g ² ²á§zePEB@:2+ ï6Y†ª²$²æª¡™ˆ~sg[KD@ABJXet†“œ¥®²G²ü¯ŠR²8²ü¥~Nü“¢­²2²û«…bõT€– ¬²²±±²)²ý€3 ò3Mbt€Ž› ¢¯²²«²²÷¯²²±±²²±²²ü‘Yñ7JWgnrpx~†•œ¢¢²²ñ¬²²±¯²²®®²²žoC1÷ >O\b]N3Òø #Ko|‚ˆ"ˆú…t^. Ô #.14:FNW`cbgnuz‚ˆˆ†ˆˆ‡‡ˆˆ‡‡ˆˆ‡‡ˆˆ†ˆˆ‚Cþã  ú*6ô9ct…Q$ 1û 6_zˆˆð‚gK*þû )Ozˆ ˆán]M=521,&! ï )Df‚ˆ$ˆæ‚{unhcc`XNF:41238CMXfqw~…ˆGˆü†i>ˆ8ˆü~a<üq|„ˆ2ˆûƒfKõ@bs{ƒˆˆ‡‡ˆ)ˆýb' ò';KYblvz|…ˆˆƒˆˆ÷†ˆˆ‡‡ˆˆ‡ˆˆünD ñ)9BNTWV\afrw||ˆˆñƒˆˆ‡†ˆˆ……ˆˆyU31÷ /ünŠ ²-²ý0²ý­b0²þ‰0²þH0² /² .²þC ,²ý©W +²ý¤X *²ý‘E '²û®Y $²û­™|D!²ú°¨Y²û¯—e-²û±ši=²û°¡€P²ú±ªi²ü¡k@ ²ü¢q*#²û±¥zN& ²ú±¬¥w3( ²ü©}H+²ü«ƒC.²û±¦Šb1ø²±¬–~M2ü©v3q"ý\ˆ ˆý‡S'ü2zˆ ˆþV&ü$mˆ ˆþV%ü_ˆ ˆý‡V$ü _ˆˆý‡W"û3mˆˆþW!ûD_zˆˆþXü?fˆˆý†UúDf‚ˆˆþW÷ 1Zw~…ˆˆþWø 0TizˆˆþWø Act…ˆˆý†UûD_zˆ#ˆþU ü?fˆ'ˆþLúDf‚ˆ(ˆý†Aø-Xw~…ˆ)ˆýt/üTizˆ-ˆýc0ˆý„K0ˆþh0ˆþ70ˆ /ˆ .ˆþ3 ,ˆýB +ˆý~C *ˆýo5 'ˆû…nD $ˆû„u_4!ˆú†nD ˆû†tM"ˆû‡vP.ˆû†{b=ˆú‡‚xQˆü{R1 ˆü|V #ˆû‡~]<& ˆú‡„~['( ˆü_7+ˆüƒd3.ˆû‡jK1øˆ‡ƒs`;2üZ'q3ÿþ 3ÿ3ÿ3ÿþ 3ÿþ3ÿ3ÿ3ÿþ 3ÿ2ÿþþ2ÿþñ2ÿýå2ÿýØ2ÿþÍ2ÿþÍ2ÿýÏ2ÿý¤1ÿýß91ÿþ0ÿýüI/ÿüþØ/ÿýñF/ÿý€.ÿý·-ÿýÎ *ÿûß¿€ )ÿû¿`- &ÿûߟ<"ÿúùÙ¹s !ÿúó¬Y$ÿûß“5ÿúùÙ¹sÿøùìÕŽHÿøùÙ°s;ÿøôèÌw0ÿúä›X"ÿúôÁu!% ÿú̘X(ÿøïϯM*ÿùß¿ŒH(.÷ÿùìàžM* 1úóÀ€04ý? 7þý]œ.N'ÃA Drop ShadowÌ     ¼™~ÃA™žòíòùóÃAš œ¾¦N¬ ¬¿¶6¶o½ü¾¤ÆpÆ€Ì ÌÚÔ¦Ô¶Ú5Ûä‡é(òòœò¦òÕòå?þ<<;þ:ý9ü8û/ø +ø  )ø  '÷  &ö %õ %#ô %/"ó %.9!ò %.9E ñ $.8DR ð $-8DQ_ ï $-8DQ_n í $-7CQ_m| ë #-7CP^m|‹ì #,7CP^m|‹š(ë #,6BO]l{Š™¨'ì "+6BO]k{Š™§µ&ë "+5AN\kz‰˜§µÁ%ê "+5AN\jy‰˜¦´ÁÌ$é !*5@M[jyˆ—¦´ÀÌÖ#ç !*4@MZixˆ—¥³ÀÌÖß"æ !*4?LZix‡–¥³ÀËÕÞæ!å  )3?LYhw†–¤²¿ËÕÞåë ä  )3>KYgw†•¤²¾ÊÕÝåëðä  )3>KXgv…”£±¾ÊÔÝåëðô¤ 1+'#úø õ  ô ò ð Ý  Ü  #%&''&%"  ð $(,/244ì31/+'# Ö %*05:>ACDDC@=94.(" Ô #)07>DJORUVVTRMHB;4-&  Ò &-5=FNU\aehjihd`ZRKB:1)" Ñ  (09CLV_gnty|~}{xrld[QG=4+#  Ð "*3KYhw†–¤²¿ËÕÞåëðô÷úûýýþþÿÿþÔýüûùöóîéâÚÑÆ (2>JXgv†•¤²¿ÊÔÝåëðô÷úûýýþþÿÿþÖýüûùöóîéâÚÑ '1=JWfu…”£±¾ÊÔÝåëðô÷úûýýþþÿÿþØýüûùöóîéâÚ'13)! ÜüúøõòíèáÙÐÆº­ ‘ƒteWJ>3)! ÛýüúøöòîèâÚÑÆ»® ’ƒufXK?3*! ÚþýüúøöòîèâÚÑÇ»®¡’„ufXK?4*! þÛýüúùöòîéâÛÑǼ¯¡“„ugYK?4*! ØÿþþýüûùöóîéâÛÒǼ¯¡“„vgYL?4*" ÿþÛýüûùöóîéãÛÒȼ¯¢“…vgYL@4*" ÿþÛýüûùöóïéãÛÒȼ°¢”…vhZL@5+" ÿþÛýüûùöóïêãÛÓȽ°£”†whZM@5+" ÿþÛýüûùöóïêãÜÓɽ±£•†wiZMA5+" ÿþÛýüûùöóïêäÜÓɾ±£•‡xi[MA6+# ÿþÛýüûùöóïêäÜÓɾ±¤–‡xi[NA6,# ÿþÛýüûù÷óïêäÜÔɾ²¤–‡xj\NB6,# ÿþÛýüûù÷óïêäÝÔʾ²¤–ˆyj\NB6,#  ÿþÛýüûù÷ôïêäÝÔÊ¿²¥—ˆyk\OB7,#  ÿþÛýüûù÷ôðëäÝÔÊ¿²¥—ˆzk]OB7,#  ÿþÛýüûù÷ôðëåÝÕË¿³¦˜‰zk]OB7,#  ÀÀÀJòfâ  (2>JXfv…”£±¾ÉÔÝäëðô÷á  (2=JXfu„“¢°½ÉÓÜäêðô÷ùà (2=IWet„“¢°½ÉÓÜäêðô÷ùûß (1=IWetƒ’¡¯¼ÈÓÜäêïô÷ùûüÞ (1N^p“£²ÀÌ×ßçíñõøúüýýþþÿÿÝ )6EVhzŒ®¼ÊÕÞæìñõøúüýýþþÿÿá ".OcwŒ ³ÄÒÞèïôøûýþþÿ"ÿå #0@Rez£¶ÆÕàéðõùûýþþÿ"ÿæ $2BTg|‘¥¸ÈÖâëñöúüýþÿ#ÿæ %3CUi~“§ºÊØãìò÷úüýþÿ#ÿæ &3DVj”¨»ËÙäìó÷úüþþÿ#ÿæ &4DWk€•©¼ÌÙäíó÷úüþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûüþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FXl‚—«½ÍÚåíóøûýþþÿ#ÿæ '5EXl‚—«½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿùùûüýþþÿ8ÿúûüýþþÿ9ÿûüýþþÿ:ÿüýþþÿ;ÿþ=ÿþþÿ¾ÿ ÿþÛýüûù÷ôðëåÝÕËÀ³¦˜‰zl]OC7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,#  ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OB7,# ÿþÛýüûù÷ôðëåÞÕËÀ´¦˜‰zk]OC7-$ ÿþýÝûú÷ôðìæÞÖÌÀ´¦˜‰zl]PC8-$ ÿþýÝûú÷ôðëåÞÕËÀ´¦˜‰{l^PC8-$ ÿþýÝûú÷ôðìåÞÕËÀ´¦˜Š{l^PD8.$ ÿþýÝûú÷ôðìåÞÖÌÀ´§™Š|m_QD8.$ ÿþýÝûú÷ôñìæÞÖÌÁ´§™‹|m_QD8-$ ÿþýÝûú÷ôðìæÞÖÌÁµ¨š‹|m_QD8-$ ÿþýÛûú÷ôðìæÞÖÌÁµ¨š‹|m^PC7-# ÿÿþýÜûú÷ôñìæßÖ͵¨š‹|m^PC7,# ÿÿþýÝûú÷õñìæß×͵¨š‹{l]OB6+" ÿÿþýÞûúøõñìæß×͵¨™Š{k\NA5+" ÿÿþýßûúøõñìæßÖÌÁµ§˜‰zj[M@5*! ÿÿþýàüúøõñìæßÖÌÁ´¦—ˆyi[M@4*! ÿÿþýáüúøõñìæßÖÌÀ³¥—‡xiZL?4*! ÿÿþáýüúøõñìæÞÕË¿²¤–†whYK>3)  ÿÿþýãûúøõñìåÞÕÊ¿²¤•†vgXJ>2( ÿÿþãýûú÷ôðëåÝÔʾ±£”…ufWI<1& ÿ ÿþäýûú÷ôðëåÝÔɽ°¢“„tdVG:/$ ÿ!ÿþýæûú÷ôðëäÜÓȼ¯¡’‚rbSE8," ÿ"ÿþåýüûù÷ôïêäÜÒÇ»­Ÿo_OA3(ÿ#ÿþæýüûù÷ôïêãÛÑÆº«œŒ{jZJ.ÿ,ÿíþýüúöñêáÕÆµ¢xcP>.ÿ,ÿíþýüúöñêáÕǵ¢ŽydP>/ÿ,ÿíþýüúöñêáÕǶ£ŽydP>/ÿ,ÿíþýüúöñëáÖǶ£ydQ?/ÿ,ÿíþýüúöòëâÖǶ£zeQ?0ÿ,ÿíþýüú÷òëâÖÈ·¤zeQ?0ÿ,ÿíþýüú÷òëâÖÈ·¤{fR@0ÿ,ÿþïüú÷òëâ×ȸ¥{fR@0ÿ,ÿþïüú÷òëâ×ɸ¥‘{gSA1ÿ,ÿþïüú÷òëâ×ɸ¥‘|gSA1ÿ,ÿþïüú÷òëã×ɸ¦‘|gSA1ÿ,ÿþïüú÷òìã×ɸ¦‘|gSA1ÿ,ÿþïüú÷òìã×ɹ¦’|gSA1ÿ,ÿþïüú÷òìã×ɹ¦’}hTA2ÿ,ÿþïüú÷òìã×ɹ¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþðüú÷òìãØÉ¹¦’}hTB2ÀÀÀ€À                          !!!!!!!!""""####$$$$$$$$$$$$$$$$$$$$$$æ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹É×ãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}’§¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}“§ºÊØãìò÷úüþþÿ#ÿæ %2BUi~“§ºÊØãìó÷úüþþÿ#ÿæ %3CUi~“§ºÊØãìó÷úüþþÿ#ÿæ %3CUi~“¨ºËØäìó÷úüþþÿ#ÿæ %3CVj”¨ºËÙäìó÷úüþþÿ#ÿæ &3CVj”¨»ËÙäìó÷úüþþÿ#ÿæ &3DVj”¨»ËÙäíó÷úüþþÿ#ÿæ &4DVj€•©»ËÙäíó÷úüþþÿ#ÿæ &4DVk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©»ÌÙäíó÷úüþþÿ#ÿæ &4DWk€•©¼ÌÙäíó÷ûüþþÿ#ÿæ &4DWk€•©¼ÌÙäíóøûüþþÿ#ÿæ &4DWk€•©¼ÌÚäíóøûüþþÿ#ÿæ &4EWk€•©¼ÌÚäíóøûüþþÿ#ÿæ '4EWl–ª¼ÌÚåíóøûüþþÿ#ÿæ '4EWl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5FXm‚—«½ÍÚåíóøûýþþÿ#ÿæ '5FYm‚—«½ÍÛåíôøûýþþÿ#ÿæ (6FYm‚—«½ÍÛåîôøûýþþÿ#ÿæ (6FYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZn„˜¬¾ÎÛæîôøûýþþÿ#ÿæ (7GZo„™¬¿ÎÛæîôøûýþþÿ#ÿæ (7GZo„™­¿ÎÜæîôøûýþþÿ#ÿæ )7HZo„™­¿ÏÜæîôøûýþþÿ#ÿæ )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿæ )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿä )7H[o„™­¿ÏÜæîôøûýþþÿ#ÿæ (7GZo„™­¿ÎÜæîôøûýþþÿ#ÿæ (7GZo„™¬¿ÎÛæîôøûýþþÿ#ÿæ (6GZn„˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GZnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6GYnƒ˜¬¾ÎÛæîôøûýþþÿ#ÿæ (6FYm‚—«¾ÍÛåîôøûýþþÿ#ÿÿ-ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÉ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹¦’}hTB2ÿ,ÿþïüú÷òìãØÊ¹§’}hTB2ÿ,ÿþïüú÷òìãØÊ¹§“}hTB2ÿ,ÿþïüú÷óìãØÊº§“~iUB2ÿ,ÿþïüú÷óìäØÊº§“~iUC3ÿ,ÿþïüú÷óìäÙ˺¨”~iUC3ÿ,ÿþïüú÷óìäÙË»¨”jVC3ÿ,ÿþïüû÷óíäÙË»©”jVD4ÿ,ÿþïýûøóíäÙ̼©•€kWD4ÿ,ÿþïýûøóíåÚ̼ª–lWE4ÿ,ÿþïýûøóíåÚͽª–lXE5ÿ,ÿþïýûøôíåÚͽ«—‚mXF5ÿ,ÿþïýûøôîåÛͽ«—‚mYF6ÿ,ÿþïýûøôîæÛξ¬˜ƒnYG6ÿ,ÿþïýûøôîæÛξ¬˜ƒnZG6ÿ-ÿîþýûøôîæÛξ¬˜„nZG6ÿ-ÿîþýûøôîæÜο­™„oZG7ÿ-ÿîþýûøôîæÜÏ¿­™„o[H7ÿ-ÿîþýûøôîæÜÏ¿­™„o[H7ÿ-ÿîþýûøôîæÜÏ¿­™…o[H7ÿ-ÿîþýûøôîçÜÏ¿­š…p[H7ÿ-ÿîþýûøôïçÜÏÀ®š…p[H8ÿ-ÿîþýûøôïçÜÐÀ®š…p\I8ÿ-ÿîþýûùõïçÝÐÀ®›†p\I8ÿ-ÿîþýûùõïçÝÐÀ¯›†q\I8ÿ-ÿîþýûùõïçÝÐÁ¯›†q]J9ÿ-ÿïþýûùõïèÝÑÁ¯œ‡r]J9ÀÀÀ€À$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$%%%%%%&&&'''((((())))))****æ '5FYm‚—«½ÍÚåíôøûýþþÿ#ÿæ '5EXl–ª½ÍÚåíóøûýþþÿ#ÿæ '5EXl–ª¼ÌÚåíóøûýþþÿ#ÿæ &4DWk€•©¼ÌÙäíóøûüþþÿ#ÿæ &4DVk€•©»ËÙäíó÷úüþþÿ#ÿæ &3DVj”¨»ËÙäìó÷úüþþÿ#ÿæ %3CUj”¨ºËÙäìó÷úüþþÿ#ÿæ %3CUi~“§ºÊØãìó÷úüþþÿ#ÿæ %2BUi~“§ºÊØãìò÷úüþþÿ#ÿæ %2BTh}“§¹ÊØãìò÷úüþþÿ#ÿæ %2BTh}’§¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÊØãìò÷úüþþÿ#ÿæ $2BTh}’¦¹ÉØãìò÷úüþþÿ#ÿæ $2ATh}’¦¹É×ãìò÷úüýþÿ#ÿæ $1ATg|’¦¹É×ãìò÷úüýþÿ#ÿæ $1ASg|‘¦¸É×ãëò÷úüýþÿ#ÿæ $1ASg|‘¥¸É×âëò÷úüýþÿ#ÿä #1@Rf{¤·ÈÖâëòöúüýþÿ#ÿä #0@Rez¤¶ÇÖáêñöúüýþÿ#ÿä "/?QdyŽ¢µÆÕàêñöùüýþÿ#ÿã ".=ObwŒ ³ÄÓßéðõùûýþþÿ"ÿã !-M]n~Žž¬¸ÃÌÔÛàåèìîñóõöøùúûüüýýþÿÖ  *6DRbržª¶¿ÈÏÖÛàäçêíïòôõ÷øùúûûüýýþ ÿÒ $.:GUdsŽ›¦±ºÂÉÏÔÙÞâåèëîðòôö÷øùúûûüüýýþþ ÿÏ '1=IVdq~Š– ª²ºÁÇÍÒ×Ûßãæéìîñòôö÷øùúûûüüýýþþÿÍ (2=IUamy„Ž˜¡©°·¾ÄÊÏÔØÜàäçêìîðòôõöøùúúûüüýýþþÿÍ  )2FOW_hpx‡Ž–¤«±·½ÃÈÌÑÕÙÜàãæèëíðòóõ÷øùúûüüýýÇ #*18?FNU]dls{‚‰‘˜Ÿ¥¬²¸½ÂÇËÐÔ×Ûßâåèëíðòôõ÷øùúûüÈ %+17>DKRY`gnv}„‹’™Ÿ¦¬±·¼ÁÆÊÏÓ×Ûßâæéìîðòôö÷øùÉ  %*/5;AGNT[bipw~…Œ’™Ÿ¥ª°µ»ÀÅÊÏÓØÜàãçêìïñóõöÊ #(-28=CIPV]djqx~…‹‘—£©¯µ»ÀÆËÐÕÙÝáåèëíðòÍ !%*/49?EKQW]djpv}ƒ‰–œ£©¯µ»ÁÇÌÑÖÚÞâæéë Í #'+05;@FKQW]ciou{‚ˆ–£ª±·½ÃÉÎÓ×Ûßã Ð  $(,16;@EJPU[agnt{‚‰—ž¥¬³¹¿ÅÊÏÔØ Ò !%(-15:?DIOTZagnu|„‹’™ §®´»ÀÆËÖ !$(,049>CINU[bipw†•œ£©°¶¼×  #'+/38>CIOV]dkryˆ–¤«Û #'+/49?DKQX_fmt{‚‰‘˜Þ #'+05:@FLSZ`gnv}„ß  $(,17CIOV]ç "&*/49?EK ê #'+05:#í  $(,&ð !)ó ,õ /ø 1û4ü7; @ÿþþÿ=ÿþ;ÿüüýýþþ8ÿùúûüüýýþþ3ÿþùøùúûûüýýþ.ÿþõýóõ÷øùúûüüýýþ(ÿþýòüîðòôö÷øùúûüüýýþÿþýíüûûúæéìîðòôö÷øùúûûüüýþýüûêúùøöÜàäçêìïñóôö÷øùùúúûûüýüûçúùø÷õôòÐÕÙÝáäçêìïðòóõöö÷øøùúûúáùøø÷õôòðîìÂÇÌÑÖÚÞáäçêìîïðñòóôôõõ ö÷ø÷ßöõôóòðîìêçã±·½ÃÈÍÒÖÚÝáãæèêëìíîïïðð ñòóôóÜòñðïíìéçäáÝÙž¥¬²¸¾ÃÈÍÑÕØÛÞàâãåæççèèééêëìíîíÙìëêéçåãàÝÚÖÑÌ‹’™ ¦­³¸¾ÃÇËÎÑÔÖØÚÛÜÝÞÞßßààáâãäåØäãâáßÝÛØÕÑÍÈýw~…Œ“𠧬²·»¿ÂÅÈÊÌÎÏÐÑÒÓÓÔÔÕÖ×úØÙÙÚÚÛÛ×ÚÙØ×ÕÓÑÎÊǽ¸²¬cjqx†“™Ÿ¤©®±µ¸º¼¾ÀÁÂÃÄÄÅÅÆÇÈúÉÊËÌÌÍÍÔÌËÊÉÇÄÁ¾»¶²¬¦ ™QW^elry…‹‘–šž¢¥¨ª¬­¯°±²³³´´µµ¶Ê·¸¹¹º»¼½½¾¾½¼»º¸¶³°¬¨¤Ÿ™“Œ†@FLRX_ekqw|†ŠŽ‘”–˜š›žŸŸ ¡¡¢£ø¤¥¦§¨©ª««Ôª©§¥£ ™•‹…yr16;AGLRX]chmquy|ƒ…†ˆ‰Š‹‹ŒŒŽÇ‘‘“”•–——˜——–•“‘Œˆ…€|vqke^$)-27CFJMQSVXZ[]^_`aabbccd÷effgijklmmÕlkigeb_\XTOKFA<!%(,/369:62-  #&(+-0235689::;<<==>÷?@@ABCDEFFØEDCB@>;863/,(%! !#$&'()*+,,--./01ú2345566×54320.,*(%#   !!"#$%ü&''((Ú'&%$#"  üó ñ   õ .ÿîþýûùõïèÞѰœ‡r^J9ÿ-ÿîþýûùõðèÞѰˆs^K:ÿ-ÿîþýüùõðèÞÒ±ˆs_K:ÿ-ÿîþýüùõðèßÒñž‰t_L:ÿ-ÿîþýüùõðéßÒòž‰t_L:ÿ-ÿîþýüùõðéßÒòžŠt_L;ÿ-ÿîþýüùöðéßÓIJŸŠt`L;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`M;ÿ-ÿîþýüùöðéßÓIJŸŠu`L;ÿ-ÿîþýüùõðéßÒòžŠt`L;ÿ-ÿîþýüùõðèßÒñž‰t_L:ÿ-ÿîþýûùõðèÞÒ±ˆs^K:ÿ-ÿîþýûùõïçÝÑÁ°œ‡r]J9ÿ-ÿîþýûøôïçÝÐÀ®›†q\I8ÿ,ÿþïýûøôîæÛξ­™„o[H7ÿ,ÿþïüú÷óíäÚ̼ª–‚mYF6ÿ,ÿíþýüúöñëâ×ʹ§“jVD4ÿ*ÿþíýüûøõïéßÔÆ¶£{gSA2ÿ)ÿþíýûù÷òíåÜбž‹vbO>/ÿ'ÿþýíûú÷ôðêâ×˼«™…q^K;,ÿ$ÿþýëüûù÷õñìåÜÑĵ¤’~kXF7)ÿ"ÿþýéüûúù÷ôñìæßÖʽ­œŠwdRA2%ÿ ÿþýüèûúù÷õóðìæà×ÍÁ³¤“n\K;-"ÿÿþýäüûûúø÷õóñíêåß×ÎÄ·©™ˆweTD5(ÿÿþýüãûúùøöõóðíêæáÜÕÍø«|l[K71,&! ýüûûúø÷öôòðîëéæãßÜØÔÏËÆÀ»µ¯¨¢›”†xqjc\UNHA;5/*%  ûúùøöõóñîìéæãßÜØÔÏÊÆÀ»µ¯©£œ•އ€yrkd^WQJD>82-(# Ãø÷öôòïíêçäàÜØÔÏËÆÀ»µ°ª£–ˆzsle_XRLF@:5/*&! ÆõóñîìéåâÞÙÕÐËÆÁ»µ¯©£–‰‚{tng`YSMGA;61,(# ÈðíêçãàÛ×ÒÍǼ¶°©£–‰‚|unhaZTNHB<72-)%! ÊéåâÞÙÔÏÊľ·±«¤–‰‚|unha[UNHC=82.)%! ÌàÜ×ÒÍÇÁº´­¦Ÿ˜‘Šƒ|unha[UOIC>83/*&" ÏÔÏÊľ·°©¢š“Œ„}voha[UOIC>94/+&"  ÑÇÁ»´­¦ž–‡xpib[UOIC>94/+'#  Ô·°©¢š“‹ƒ{sld]VPJD>94/+'#  Ù¥ž—‡woh`YRKE?94/+'# Ù’‹ƒ{tld\UNGA;50,'# Ü~woh`YRKD=82-($  ßkd\UNGA;5/*%! âXQKD>82-(# åF@:5/*&!  è61,(# #í)%! &ð )ð ,ó /õ 1ú4ÀÀÀŒ*+++,,, , , , , , , , ,+++*)(&%#        ýE???>???       ø ???ý6a 0P(nco-4.5.4/doc/nco_authors.txt000066400000000000000000000013711264355130400161420ustar00rootroot00000000000000zender = Charlie Zender woodllan = Wenshan Wang karkn = Karen Schuchardt wangd = Daniel Wang rorik = Rorik Peterson edhill = Ed Hill mangalam = Harry Mangalam scapps = Scott Capps tlroche = Tom Roche hmb = Henry Butowsky pvicente = Pedro Vicente dywei2 = Dingying Wei jedwards = Jim Edwards gayathri_aiyar = Gayathri Venkitachalam uid24006 = SourceForge uid24006 (no author) = Charlie Zender root = Charlie Zender nco-4.5.4/doc/nco_gsl.ods000066400000000000000000000525151264355130400152160ustar00rootroot00000000000000PKk„ˆ:…l9Š..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKk„ˆ: content.xmlíûsÛ8’Ç¿¿Bå«ÚònE±%ÙÎc&Ùš<Ïã$k'“ÛË\]© ’ó5$e[þëà|Ф)z«vbñÙýÕF ýçi n°ëé¶õê`ôôø`€-ÍžëÖòÕÁ÷?> Ÿüóõüj/º†_ÎmmmbËj¶å“älË{î}u°v­—6òt聾Lì½ôµ—¶ƒ­ø¬—ìÑ/ƒ{…[<c4>=8˜=ÛÇw~Ó“é±™sѬùƒƒÙ³ç.ºmz2=–ˆÊž¾°›ž|çÃ…MT7äë9+î ݺ~u°ò}çåÑÑíííÓÛÉSÛ]^¼xqìM ֒㜵kG͵#l`z3ïhôttkb5µËšd­ÍvKƒ|TøV{äâ.³Ù…Øs2|Ý,Óu³¬Y[!·1gÁÁYT&óæ¨Læì¹&òWßïó£ÏdgðŸÏŸR®\³é½è±©4Ww»ÍžoÛvb*=!lì¹ããã“£ð3sômíá·®îc—9\«=\C†–(n›e¢‘ãFGäˆ!¾¡È'ˆ áUœ0> w'{óÊKÿÏçOß´6Qz°¾ýà¡ny>²Re:6b`G£ïß9ØÕé×€ ¢ uÆž/È%ˆT¶ó’¹@øÍD'3Q~tð:éáWè%$´HÃÃ9Ö ïõ¯aÓL6ÂÏÔ”W_ts¶ö_mYƒ/ö‹4¡øhS76¯þ†Ûû¥xh¸ýÉ ü÷â‘7ø‚oÃCÂGõ÷‡¢ÿ^¾!Ë|¶-{Tyûü‘Ñõ™«Ó†Kly h¦=Ç®µÍ„%·¬½¬KÝÛvÕß\eÞ;j¯ïÝêž×V¸ñ„cqt_#Al¡ßáy[Ûú4-§«e±ø]¿”’ûÞ r.éj¶Ý:j>¯[YxÔCähjó4ùšš˜´ñ|ln³é¨*ZEÛÑÚ'ÍÌ×µap$ŒÿÍx A#¼Ydvè‘4ÀX›ÖA|&»qè@‹]_'ka¿œ¹]g˜tä‚ôÖñ£Ãoõ9íŸ=}v2ÑÌÀ~Æœ:ÛÆû²müôù‹³v¶MöeÛèäéóÑi;ãNöeÜÉÙÓãѨq§ûûVÇgÏÚØæVµ×¾ÍF¶°V…»èÆÖ—+’C?==>!7¯7xíá¡íøº‰Œ!{¶ï®qs»}Tnw¼Ñ$# ì´ÄÃðŒKòç7ºozº˜~[aìr2Î…C¿¹î9ÚD¶EW¦)*Ø i§÷êÀp‡þ¬Ùå ¼Ùcf—·ý6fOöo¶†«B=6’îÛA.­p†q'·@kÃÏ7LrR¾YÚ.É|†3Û÷éèãø);hæÀ³ }>øÏãàñ}æ:ZÚ~f }2V¶l öùdwn-a ‘¡/­¡g¯]Zw!¹K¼×ÅFI}†ìB†‡Û ¼ð+-KsÃFÞ8ÝìÛNÕÉI¢@DK9«œ8©á¤“÷Éø8=%ØUˆ%42ÜêdÌy; ºyÚl7‹Cp¢½ö ݉³Ì.º}è¯\{½\…_iVÌຕC btp€§ß“FÇŽÏl‹/æš4õ‹ýóVhNÇ´…olmýs2fÄ—»¢ÞÌ6æã轇d ެØvgi´76…Ù^5> pmêxPí0ð]ùX*gGrl…%Éþj[’CkZ4ݪLš.4]!šn ó=6Þ’¸6ßè ¸j¸ ¸E6B{…öºûöZ5‚voNÝØoêsÕÀ¼×µµ±V6QYË5ݽ:ÀV°A³×–ïí>¾ÙsÎŽ)?ºµ¶×^µUG¦Í6jÕeeóòðqöôyð­Ž^?›œ=; Œ|q:9{v2)±19[y#“]ß¿õ›Ø¯›Î …¤Tp±¡ãEÚ6mÜg"$ ]³­Ç•¤G Ž@é=Ž<Ûyb´46$¯±]=žÍ2¼¡û5d@p úhç–deAIßàÒÏ_l–‹µð†ïVŽ"KìH$mâÇÅa:Èžä­\ݺ&Qs¸ÐËÆj5å’è ñW_=ùɱ]Žªa+˜âB6›È]êV¬–üš-zÓªºØ1J§b•NŸCÀ‚€K´€¨ú°õ–"a‹=¢D©Ç¥FǼÃÔ.¢Hyxè=ˆÑäÕ»œ>_5ïè^WµlCÉ£ž©²Ïé&ÐÉBíbkkzÔÓF 5AÊ*`ʺ˩«M‰ÿƒ)4!!›Ð.g =¸e@_™×Ã3¯]ΗÄ!– Ëw9¡CØtH– eЦ„lS»œsð¸;˜I/]9¦¼1ÁHá¦@ŽvùÛ<Ì¥†H‘D‘H2îéçsšg¼f—ZUŒd¥²æŸå¥‹£Êµž¢3{¾Iºs\Œæ]zäõ¯á #t¹ÀµþŽíaŸþ\/>¢!‚އ-O÷õ›Œp'ÅÊÅKrª;ÄwtÕIº°žÇ<¢ü7:'D$Zg&ÚÆ,`nv\=ýÝžY—Ï5iß蚌à [[{ÌOüt§ã›á{tz@DËÌŠÖ*±$X+Z‚%lea9Ÿ´¸Þ¸ÁõFÇ-.8ÙzÁ8>4¿æÉ®y_3\5:Ô†S4ðüÕÁøt»8÷uíÛ’›Òœrö‘ë•YGÉ—†DÆšD¹ƒé3³¿%½]+×yýñÛ§Á—ß>¿ÿõ(Ú@þÈ]½áýž5ºßùçËOï?¿ÿòÇûw¿%‹Ñàž_Þþv9øðýËÛ?Îÿõeðö·OŸz¸õicy“;ÿöõãwêú·‡ßžö« Ø;ÊÝ@Õ3e;¥gL½Åéîfú›>Åày£ûþèዞtððp>3¦´ïø{œu’øäÖž?˜ÛkÚKÝ=„Ÿéa´Û˜úúÏ“AtéåHücþñ÷_ºΙÅößÔ›^X|±7O:xØ+‹Í‚|^â‹@a®¹z$YÅsÙaLåÌ$#8 ¹­õªæAÐ|h6oÄsìê7²“ûÉ?fFr—ÛZ°\¾ƒË7ÀeˬF‡žsW”è {»V­¬o„‚µ >ÀZ«×=vížÊš"C¹y¸Ö-Ÿ#‰Ú‡k‹þ †çbÐÀmꙑ›B@ø ¬h›J €2Î $3F,KZ«:X¾ Ë7€e^œöò×Þ«rw)OèÿCžü ™Î/7ÈÚkŸ#Ÿ‰mËÔ ¦á_èŽ6ú+&5*Vu2Ÿ dN?°T‡7ðŽ^_Oé¾Eˆ?”lrŠÛJÎüè0¿«“”†Þ9óù£jMc¿“=9·>ë–ÙpÈÐ,ûOÉ¿¦t²-§dbçB ¯Àlú@³sÛ–‚]%|{óöa!¾€—uL3?ª º£é½¹û Ô°¾Ðœ-ü¢mÅã Q°ß笢Þtoï„ãÛ,zuø #µcgiŒô¯‘‹}ûI±éÛO¼x¥òÆ~ÊB©zi„H£FJÑŸ£ÌËOÛ#å?š¡‰ŽAvL'?傱—L{öoíéOÒü=cþ֞ĚÌ!&sˆ©)7C1Ï” õŒ­g-iý9g6cæïÐ:ýŠ4´ú· Ćžr£6Èí‰ÜJÄÙüâ싆qvÐ×äï%ó÷Šù[¤iÏvþåí¿¾~}ÿö=ÂÝG¹¨k‘:Ì3Ÿ`T‡øü0˜çèÖ³ežö:ÈoÖc,0LzœÎñlƒ÷9Ýqÿ°…r¤-–ÖëË("óKÂ"yC/Ë+2‘º oè&]N‘é¡;á Ý @—SäTzèNyCw Ðå9“º3ÞÐt©"ºa/%®aþí³PT€,©ršŽï"]î6S,ólÈøÚ¶¨œ7¡@bæó¦ŠLò¹r—n*1’URÞ(™ñ“/®9VÝ«þªfbä6^UÁÕs‚Å|Ãàâ–Ê ïŽ¼î3cL‡à‹È†’§Eu-ÉxâßcBÚ$žëޱ‘8øÆ.îÕTÚŽéü5•Èu ºÉB*q=‰ó4³(Ì*¹]î‚ö@×X7ù’²bdz ®KÞ— 8ŽïÕÀñ½8¾·(t©Ž—ù­¥œUá2^«ÍkõN Bß 0ßAÀÜ¢ÐùQü N ü²è¬ô$L—ÅTG~.ß‹Ãå{à²iª#?——E.¹zY (dš•Éü¨¾Õw€jk;¾•ŸÕ¯oÅéï©ÞÌ£]Ù‚LF(‚èW£è×w„FÝ«ÉË-Ìógõ°ÚV²ß`õ÷VùCûûVhã,ðeÅû‰4‰§Š„r`252}ǶɬGèYìâ„쇹¥zîbàí?h÷8þ^ˆ «]Lƒ)Úr“»È¶Td Ž !1lÄ;®Q ‹tøSnȦòÅìO-RâJrЮø‚v ‡Wè¹s‰I ä‡Z,0°Fõ—4âÇ€F¥…eX5FÇ2W×B¹`F…­G£nfà¶ÌÁ-pQ„™‰Úð4êV‰¤‚±›ü(, ‡µ$ªM™W=üãšú™°âqFróFä \ 0—DæE¶c¹S7†JJ*†Ì/®ˆ]¤o8á?âˆÔŽB}sŠ•KòÔ¦q¿ëÞpþý6\Gy¥üF^rcpûзÀ¡zcߨL õº`¬›ü*1°.X¬JòGÞ³VÔDò:P装 Xo¨Õ÷ž† ,ó¼Â¼«ü#c*:ÈB§¡ caxÕˆ2<Æ® Õ}çÀ„^¼T']ë.Ò¦R?O—u”‚yÁÄaö8K+ˆÇbp¸uéE1T% !–ë"óÀŒŸb`sËu‘{l’óT€‰í™y?a^AiB½B†ÌËõ|#bF²CÔ,ÑF!"Åx¬”f¢qˆœ’5É:ŸÀWV|(Ñ¿þaÑ™º¬Ö™&’˜ÐÈCޝ‰%†e˜-¼åŸÀÛûÃòŒ—^´ o%nj,Ówy‘Sä'PöpÇ9ØÅ¡rAFÏG2¯õ•øÈ»Pf@ÕD·nd'¸È¼@dà.—h¶éøNéÙãCp·µi:¶¶’ºë¥ 0&V:[žFP|É $ûŒ„ØINü…Óº1˜ÎP(1EAòÐ(H`„°¸U¹ß y(Š%/sÓŠèdÞ+‰‰d¼€ÊŒæ@æV•.• óR(2/Ì*)À¥PT“Õ£Áöež~:(±Òõ(*ýäS ìuŸØINü•Ô}JÞÌuê¾ä¡QÀaq»<{M÷c¹× ?œA¾˜äÔx‰-Ç66R¯WÇx)@€Ìh?R` s6GOIF™×®c¼ É1 Y'Ì/©`¼ É Y'ÌÃkÆK~üÑv4½ 0¬T ¹.Ú({ò³+ŒÁíCMtWCdRÚ‰" N”ÈÙé.§ÇdϤN ÐQ³ŠÇý´±1fD„‘{ù㬣é#ÑüŸÎÌãÑf\‚g¥«$SØb‚V¨`¶í»1ö» ö;Ä×N‚ö¸víÞGïyWù²9:îÎ'=[EFå§öÿß¡÷ï ™‘”ge#hG2ÕŒ£cÆRãÚ±÷ :fËSi¡4¬¡µD8"ÉO%<ãðÛÈâ¯9pÑ9Ý@K[¶kªÁvè«ètÇßH»D讌*!Î8,:ç™ï‚ùÃq—ù-P©“Ö+é¡bÑô¹´\c×ÅRO¸N`‚«8<8ºM$™']§NŠ„eáá€eQ$™'^§NŠ„å°Ü.Ò'_óÃÒ*¾åB>­iÝÛ.VF1j«?ý·Ì#¤ÔIŽ/"e„†w‘¦r˜ru/ ÏzTú¼Äœt—2/°Èx)À{¨2š3=³=q™D’>/åùÈ_{¯ª¦œ> Axò7d:¿Ü wj¯}®´†–1ÄOVå¡Uô*V¨9võ›ý’»ÿvåow>3ºQZÜÌ\R%„¥NDS/9&¢¬Ôˆ2zH]WO½½1 —ÑCêÚyê¥èM=V+©KŽ©— wU˜„U”Èø®DÈø® Ó+@¢ŠÈ+¡ WP€Ü^UyF0ë¦HËgå/C4ód2ðš,¨V 䃶²dn25óªºyz<€áºšdÊeôN~I~HÝ+¯ðCj$ˆ-óŸxÇñÁ+{ \eÔ@3Onب‡| $è’²šéøn¿Qnïý*ãåþë–ŒÀYìîÝ\šw¯A4,·¸Ñ_‘ŒP~8©f#ÇX{w’ÅÐI¾q1BcQS ‰ŸB0h†©.&òW:^O‘䥚Þýl‡_îö´Ô9°Ý9v§¦n…nDQ:ãý¯¿.ãóom÷Ús†ÿ &‡²E›ÿý?u°)‚mo~vÃvÖÛð:ÞQþBÀo.HOnv µ)­e5îéUëègÒ׃‡£$Wžóh6^,¤ç®7?»¦–Áí+Œßú’þÒ­R_;S„ÃÞüìš+‡µiòVÂût±}®ïþ^ùþØ“Ÿ¿>\ìÆŸümo¢Šmús´k,dÊ6VR±±òÅš"šP®©jÝŠ ÛŸ£]Ã( Û/ºŸ5é¡íÃÅn¸~ÖP¯ukÎTÅ¡ÿ/Ë“ŸÄ\ìH¢$¶h¶Štçý9Ú5>2ÝyÊ&t콄SU îÍÑ®¡ îbǾýIKoäᾡM„eÞ¶0ªîT7ÇÓ÷ËÚÞçZF&Òî}–e"1óP—âÄIM¿ù¼´0‹—Qcäè¹i \ä‹\(r–»ºÜÅí5Ðq{¾‹x¹oæ2¦Ójó¯äså.]‡­ƒ¬@8⟎ Ì "9sœ;fÈ3zX’ãf ð>ÕHçlŒC‡½¥­\ÛwmKêØ—ñ“_ ÌÉ ±°D—±"ŽÅÀp &ºø.²<Çv}©!d¼ä‡`Fj° ÊD '"8KT9QÀ<KT9UÀS<ÓÜXßcQfï?’ïö>Ø ‚Xš½Çe=9üú¶÷ÉÔ Ötµql™çæþí®HÔB·s ²?yËÝ]2^òšSvŸí׌õîKÖŒõîuuД½ÃM¼ä…fØ·GS+CSS MÃ^ª8CGyËÜeÉíÒøi(@‰fšÄlR÷8 ‚5¬‡ ‹H±’˜®ÐÁ}óË e¼D’ÈÍupÿœ…²gÉ|r§¾M<×z(R [Ï^¶}H’¹y¼|&¼¥c Ÿ ¼4ÊEe ô“Íž½l‡fææík…ʾÔ'•¹®ÄÝsä!—Û¨°õ0Îª•ÔìErù=Ø«“YKS·ÉnÒsxÓ”˜Ão÷Íd©àqF™î6§‚#õ#Eg9Cç°óTe.lyRw» òŠÝrÅPYўؑ>),wX„ÐlæDº'ÞK¾þAì"¿åR‘aõƒD¹ã7Õ>7ä<µY3e~ÜL®ýˆÝ%õmg×(óa é‘€Ã%™ÉÜæÃE©•îý%t:ÓŸ…-Ëuá}ë;&k­ #"§0ýYØ…‘-É‹BŒž¶ôjd§h²5aQÁS•^ìV¶&)JÀ‚ïÛ–¯#Cè<¥o;Û!“¹{}dªFÈ™Kßvv§fK£5‚ç2;0õgk^£>‚g7;0õ¡gk¦£ >Ž}+z’Ó—‰­q n ÏšT(#x’Ó—‰¨'” ÊøsÝó…5ýYØŽ™è¾PÓ‹”9°ôgaF î›´±“Ý^ìM îË4›Ç —1Qzk¨ûNÂg(ýYØ“E³ eTØ2V‘“–þ,ì‚ÍÖ¤EelÏcz5²SÌiǨÌà©M¯Fv > R5ù™Ñ…×ENvz3°7ám¡~Wª‹ÈYNovàê½íHìî©O»DXŽª²A=p¸¤5Éa-ªBÆg ÁË7}Ø2n =T©."g4½ØÈh*Ú‘ØSŸ6v‰2ÑT6¨GŸBM|gÈh kaØKËvMÁŸCè×Ê–«…¤÷®ï°èËT}â6ÕHäd§_+»R´%íŠÄN¡wC;G¤­Éà$þs ½Ú94mM‘ÆiI5FBçI}ÚØrûøÎ0¨¯’FäÔ¨O»Õ ê6%v÷Õ³™ã”…ê×㠈ϻW˜›C}¨\ñ#Èzú±± ;cÈzª¥?ëéÇÆnà@ÖSݦCŸÕ›™ãd=uëqÄ1ëCÖSªÎ-ÖgkCìßÄú´±;É¡óª’F䬧O»YOu›»ÏêÙÌŽq²žºÆõ8â’õ°7‡¬'¯Žƒ\ìÛB'==šØŽœøÆÐsU(#rÆÓ£‰¨|§²=‰ÝYõke·ˆÉNMÃzøpIu˜{C¦S2åI÷|]:×éÕÈÖS¢[Ã;X-DÎpz5²#+ð¾^¦ÝˆÝ1õmg×è¯ìÍ4 G ¯YÊéÝá­½3ݲMÑ_Ó«‘-1Hn±²¶<}iáù@·üÁuŽ'þœ9ÊR‰#‘³›^ìÈÑpT;Ü´uϳ-¡ÃQŸ6¶ŒÇwn‘ï‰9ìôic7^%xYbÛÄdŸØ%›~­l9£+½w£®J)hD3ýZÙšfùÐXx‰|ý?Ž!Ön¬mQ‰ ­’åxQ\%á92íÆÚ‡ÂÕn$¦\ò4ÁÃU&¶ý94¼1Œâ¨$rLêÑÄNA¨V¥Ùë>ŽÁÚLmGTÞ€Z²²$Ê7K7ûêq'rÛ©â®>¢ÉÃ]öòä8öÚg§£³³j4kl:ÛI[hCvKæ²ñƒ›~[aìJÌñQ²Ù!Üø¯ÈðpÞÄÀ 2 íÓøô9^ µáî ÙcÞ…;òíª<u}RîúD×¢(à9.Fs:œnœÙóMúinkk[ÄTÛòÉ¿¯ÿPKWrh°"¶ïPKk„ˆ:Basic/Standard/gsl_out.xml…T]SÛ0|F¿âêv28éKÀ@óÕf&%™`†ö‰1öÙcK®%Óôß÷$98¤tš‡Ä^ÝííÝžrqµ)rxÆJq)oÐë{€"– YàÝ…Óî©wuÉ.Þ£ðÇr*®x©Ï ™Ô9Âòn8ŸÀëúþ¢D±HScOV™ïÃ1¸÷±Œë…b÷ýÉžKï%:ñˆü5' êÌa·Öº<ó}Iì²eÿØï÷}âm%‰¨ÀÀËTþ ëÍ#‘ÕQF'·:ª†‘â1•dì¶~„ûÕ,œ<ÜŒáäûŒ±„À“ D ¸Ð˜ae¡'͈MØ×H$$ös‹ÛìÅ~º q£ x«+šªË—#Ìs“½x|ÂX;ìvh#_˜Ó3¹³°¢ÎptŦFM¨¦àjò ¾sº=“)ÄuUOTYa”(S™½$®¹É¢”‚‚zê»Õü¨ÃWXÕ"Ž4R¨Ò†Í$1“ÌQ½ðtOaŽ©þÐb'Ÿ:ÀáÏZês#ˆÌu/ ×(´-OvOOÌS‡¡H€§¤å­‚Ná ùŒmÃi% (#½fSYëT(a@M` Ý#NØ«H'ƒNàôíʄɆk .ƹ»3¹|¯[¢è8MQ’€Æ ·ªÜÄڴַè(Ï›ùÐE| …î™4‡0V¨l(7MÀ}Å5Y ‹Z—µ-y£ÔQµÔ ØÎ:½aòÈ-ÅK cŠÖÆmZ wàíú0­MMfnèN­”æLª–µ]è&žÜYÒJjxß'NéuQçšëè1Çm›©ó‰*ôM[NƒÑ¸’¿”Õ*k"êG{É£®¹ÆbËs`ˆžÞ"ɼ.Ä×%ÓEìÒUþ^JÅMóGDf]í5×˦ÐîôÝv8l«Ê~o=q?Ƕˆ‹Ã\¡Ë?Ìôùÿ)®iPoòØ{A™v%ØÁÞ¬- áöø_N’¿Ýˆs©ð%–’M˜ª™ù\ø¯þÀ/ÿPK‰Tí íTPKk„ˆ:Basic/Standard/script-lb.xml]OMkÃ0 ½÷Wxº7Êv*¥IaM…Ò–v^¬dG ¶»?³¥ ëI<éé}¬Ö_½Uä|'œÁ}’‚"®ÅtÜfpªžæ Xç³Õ]Qnª—ãVÙîÍi÷½§:ž÷»‚9b9—MÓÕ”ˆk‹ªP¸úÜõ·P0þ'&ˆú·²1û Êà=„a‰(ÑA&‡‡4MqäÀ5ëž2xšvfÚ;ÒFØFµF[OÓaÐÞŠ3ƒ“@u saä3u F–~üwi½}•sŒð¦CþPK¿´òy×\PKk„ˆ:Basic/script-lc.xmleAoÂ0 …ïûžïÔe»¬ˆ‚4ʤIhE¢8fM ­ƒÒ°Ò¿UAp²žl¿ï½ñôT•ð§l­ Ç8 BŹ‘š·1®³¯ÁN'/ã×$e›åJýk…mGשU Ëõçâ{8 JŠÓ¢Ð¹ ŒÝ%YW˜üX)và Dóìé$zƳµÏÆu§ÛwÎFDÆSÌò†!u7ؽœJÍûþ¡iš y¿£(¢ËÖáÙöíXT*Æ•,…•x×úl[ˆ²VH>2=ežüPKú‚lÓRPKk„ˆ: styles.xmlí\[oÛ8~ß_!¨˜Á 0Š.NšØ;X`Pìö´}0%sG"ŠŠyÜß³¿jÉò&YwË·Äî$šŠ<çð\¾sx(Ó½X'±ñi†ž›î•cû$@8š›¿}ý`Ý™‹¿Ý“0D>œÄψ™•±çfgÆÙLMÎÍœâÊf$0›1FRˆ ¦Y•z&—R#RØXvI\åfpÍÆ2 Ú/x¿²$®r¬Æ2 ZîÓ*{HÆ2¯³Ø ‰å“$ 5´XÇÿ17—Œ¥3Û^­VW«É¡‘íN§S[Ζ û%]šÓXR¾ c(Ël÷ʵ Ú20V?A[U çÉ#¤£]hE5¥0ã$Ü\Ëq‚ª<5|=E£Ñõõ¸Ù_:g’¸•I0*“ Ê›¶ì‰ïý‘OÊ¿>þsƒ+šŒ]KÐÖ\åS”Ž6SQWù !¥ª‚A%»T×sœk[=W¨Wƒä+Фrܱ_zœ$]Nãt®Í),ø$ oºUJ k.Šz^ëBàC+€~œ-îNËaC= ÍÍO(yÌ3ã3I6>‘©Á#ÂñTP'(~ž›ßƒ”d?·IÕøO†úýq§ŸàJ‘¨AÓ^ÿøoð¯Üøpf|$˜¸½Ë7)µ|£&]0XÄ"îõ„âm*|èXrP,æm“úwŠ@Üeœ”Ÿ­P–íê8’¤ˆù<£C´†Á®ºS5åœ}5+œ¿oP:Ö}œ—×ÝmKëô‘¶nM2Euˆ;ƪU Á˜0Qé9c0Ù¦“ÝW­ô¸jÖ Ý‚<Ö-\!Yë([ˇqlä›!+¥¼èR†xi*Dù(|"æ‹fsÓÛx(D¤Ë6—È'© Œ,:G÷Ê»ñ“ ·èÓڌҾøB2‹Žrñ1ˆå€OrÌ(7æ·/f“Ñâ[ÀÍHIšBNAòçz]Li‰Å &¶%‹®!†ëaÙ%Q‡ôrNÊaíˆ×â^õVºÅªQç†c6ˆ ý” l!Ì`Äù!Æ#æÊ…:d–2üœR~"xîZÊunu ;žHÌ»&ÑN3šÃ>%ÚV¯˜(ÉSy(‘ÒíR¼€ÊÂ(mmÝŸ“G²6 i¹@ ›ŸÍÅÿþóßRbCÈ¢cb‡™}—Ð o›ß…¡ÃšFZÝF~sþUîI@Z&:<8‡?üø}Ä~ž—Àiko[5`Ú[cÅxŸÕ§» €¹ãrƤõi5&8jºiÖí¦ úØ-]F¨7-ýÊÃ…}À E°ExÆ¢§AœUrpIršSö ­u— F_¹[ï¯Å®ënTÏ|ĈoÉÖpκƒ9;©ÍÂuÊ· ¾ ¯è@K‡²7®óÞŸÃqÏ#¢ÑS¼¾.ÊLâîÔ#àZ1xcÛsoÏËÜýŒ¸ÛÈp{_6ßT‹×xORÁz¶5Xi²_­ºÅêL¬Û«>Ç=ýpuÝ“åœ="çvgHßßW2°ûÇj8ØÙ׿%ñLz›öÝC3¼“9Çé>¦w÷·aÛ÷°qÿîûTö¡EÖ8ØÖ, :óú/ ¤ë]l|ÉßycîúP̽1Ìéè|DÌíÓž¿ú«ƒéý¡@êuõíi§ƒÏ¾®:ænÅÜôÒ6ÌꋺCA·Ï±ïÕ·Á¶Ž¥éPòœ¿0”¼ÎØØ|u4¡Î»´Mó˜¨ó.±ý:”¼C¡ôro!ÎJ;½†¸ÀìT¨|e¡ÛÿE}‚^~f¿ßeJÔÍB Ä(›黣£—jÜXpî h‚Íÿ[¬ú ³a£ôL hycת;dZRAý¾1n²_È“Ä9 †MFbô¬P n0‚œ‘ d¹¨ü·Yê°‚(Z²¹ùHâ`Wçx{y§îXq;µõáò&îí¥ÿ¸=}œÀ àQºPbÑÊHNÅ5š•·J(L!ÎäŒYñððõîòйésFHû!^¢ý)®ð¼O™Ù‡œÃ‚©=êîåÒ"»¥8Ž„úS§­¤Ý¸T¥¸Îì[ÅD¡Q­<“œÕlJ×ì é(!ˆf|X¨jÇÃ]‰p^^B·d¹‰–¸j87cj±ÇMÔ–Üþf‰Ôc!!<Àв¿Ôar®no\?‘ñKøT C1Q¤š¼>úH—pòr—ݯ’ÖåÔd$íб®Ý Ôöøzãâ{Á3„~Εswç'†,ùÆ;GþHŠê‹#œÄ½+Ø€ÿ‡èpP”ùw¾#þ”þ©Pð^$‚-¤´l½(«Çöd°yµ²Ä× “}£æ ¼¥´E›ïv¤„2 k9ÒëF¤×¯3[‚@\m­Û:í)ŠfW_È«è$V/îÍ+ª“²M/oÕ·˜•Ü‚Îtkù’ GÊÅû>š$½§‚ö1@O$ +Yô æÐ ‹jlŸTž-îåw[Sý;[B¨ˆ÷vsP¤¬nä®ÈÃ⌲”«Ð:HªL+WÿU˜¢6¥páëUÆZ*¢j)<¨‚Ýrã6Ï~†b7r¬×r¬>ÂHœ …>;úÚøAÑ1Äâ*‰zþ±å‡ÚJµ!Y«‹Ë_½¯*<Ó(‰,ùšïYŽ3µœkK\qwîlçZ|'rªµ„‹ŸŒBa®½{;›ÜÌ<·Tº =uý^ R†]%”/QÓi•P½ ô„_Äóï7áï_<ÊZ¥Å[MÂ:UZ'[Ê@ °B@_EñØ¥L1—Œ—W­–B TmSB¡®ºÆ(­G½n­wDáØ¢#pŒdñF%‹7”,×oÉò–,çkË“e2*Y&oÉò–,ß^²ØÝG.»ûÿ0ZüPK'òϸûIPKk„ˆ:›#ƒe’’meta.xml OpenOffice.org/2.4$Unix OpenOffice.org_project/680m12$Build-92862009-01-09T03:40:372009-04-08T16:37:2350P1DT0H40M25SPKk„ˆ:Thumbnails/thumbnail.pngWy<Ôí»ž%D–”,KYÊö6¯„AÆ„¦ñ†lÙ—(šIMv&[¡hÈ4Œ}R"Ù*kTã•JQ²…d(["ûzúýÎ9¿³|Ιæûù>Ûý\÷u]÷ý½A0à ðíçƒ@ ¸SF–à¿Bvrƒ§vjIDä"Îc”9•uá¼TãjSν ×ç' “ÅØ»ÔrŹ⹼÷É1´¢f,ÝæMÛ¨=àõù(’p÷è°³{§Q˜[g/¢®Ñà #äÆ'ËÅ©¶7æÁ9ÌÔÆBZøâZÕ•…€¯o«‘†m=OêÖ¦ |ú‹}4>®ùÄ ÿ2"¿¼9”è!uÇD¡)fãõ*-6Ò¿r¯ÀÒßXò8×ÿÌn¾ËåCøæ:6::z®Û#±}ày¨ŠJSV°¶©×HHï§ÁÁœÐ5îËoÞàٛτŽ/}‰ÎÕ?ÒA»ÙŽþ¹ñÙeáȽ˜îgË£*”ÃEÒB5Tæôs}•E6S¿EÕ¹ŽaooÿýÆ¡l¦õ#›ë =&ÅNµ)!¡¡c½Jóu‹Êϲ÷|Ë ¸KW±µ Ð\û¹†v¨º˜7?Ñï8Õ«²>Ó$Óf•R¾¥õªmC€–ʵR0?Ž„ÍnÎ}0[ûõ.±¨5ô‹óàê*ÑΣþëׯrÊj€°Vmà´ é/Ö‹õû§^·âð%Ó`ÇüÖ?jÒÓÓ3W§_¢Ëai%µÔ•ÕÕÆP-íÆwYº ©Ž6ÁÖÖžQmÎ$9ÅI2|µ¯(??VÓwawò…xóïóÄÉi†BÇËËCæ}¾ÅH^ŒSµå-;m†º0ÙkI]]òë#UÑ5‰Ý²¹/=Ry²½øùŠšC%¾.|uªªñÍLçáW4ÈMç>a ×ßI«ñ/K«¡¢A¶ .¤Üñ/žú’1ޝŸ'ë”>_ØŸ6˾=¢ ]˜|úîfkÿ-­S$‰þA™k÷›(®êxÿžË´{æçí=üúVe±ëB™§ÛŒå¥žÔ„Õs×é'-(yt^ĵ"7ô3Êù]®™¡×ýöKIÝ"º(°Út§ë:)bÏ¢çâúê###“W U7‡be—6¥¡\ æÕÝ Z„^OÜ Ú*ñs%-ªir6ngÙ}óÐÍy-Â@ ‰rç»\{âSñ•ìðà•ÅÁðÓëCöÓ.Qj/í˜b7àªD#]ª˜sPäUƒ•ç¸ðN½W,tllì ²Ñ²¤ftÿ9v²ÂÚµ:¿¦Z(½# ؼuƒÝŸŠ²@Œ§ùU_.}?a¼o¶ç\NûŸM¹ðåom].–jõ¾‹üÁm—KáiX˜êËÚ§b§?”ýž£­R–²Ø6ç6Ã5ÃÏ·u¼Ìµ¾2QêŽ*©±=œ÷îÝ»nž¹v€ùGõõÿ(AX”WVÚTv ˜Q(¿¡ëbOˆA,çðuÿj¡ÓËlýêz=LY9{úò¼òîs9ÍMý¬u4]–€-[ni(5޽¡"ÑÐ&j/=ÑUš¿×L;D›Sxóï£úðŒËNꥄ8ÏËr+ªgþPUÝ)¦Æ/Xh®¿lT÷­’_@ÀøÓò›£ïÞwÚº˜†.L%‰ÃÆcv"§S¨¥'T[#¥&Û±2j5¥¬›_/£ FAXS¡Íû•Ùs6UÚçsÛNY—„-¾Õ¼Vl34ÛzäHMi÷|D'øï¢`„êÔæåΉÍ-±åM4n¼q“ µþø–sÊkso¹âãÚ&\SÊw‹¢•üK ˆôºª.@:tòñWö7 ÞzO$J]U7«ÑßÛk¿üΖ€ÒäähÑC:AáÒW—ܤF³ÝlOüèT€Ê¤ö!¤G²-]Ég]ÉA#Ë« ‰Å{yšožHGÓò³C”‰ÖP<ÕN“ãB¢"p3çIùo ÷vYñÀp¾dâ¸ï _a7òŽ.6š&vDM¡Z+Ñð‚'ͨö‰¼8^ДLn&…¯Œå7ÚõM¿Üt¦S{mÂ¥0šq’ŸÛœû÷¥ë ¸q•,Î{ùC±ŸÚÚ̾>̰)²³ ëƒ‰hŒæN™.!ô!ÓÑ9d,¯pêoY¶(‘Îá$õµÙ¾¸Oš§â’öX%ʈË÷Ài†Ñ™rŸ¹î”†0뇚»ç:³r%‘×|]¾O6,oäŒþò'ÝâòùIŠØÞL†Äaݸ 2ŒV|"ðÄ­;Ûôn°’äÐà–TUÄòá5Q®IÝäGÍ7#©5ýÿuøöÂuMR¯üÀ¯´£`lŒa¶ÆNùØ5“žÏ׋G_¢0$,NÑäHfTÙáƒÍeq2BC%$H­ÙmhÔQ®! „DT d‹ Ç»¶üÔ€®S=é$bI·¤ÏÅ`.í²R2M0 ++ò4p!pëB†½C~LÀêáW˜µIô}-Bž ˜o’1Ç]hõ8R™+°dÉ{‘ïË=j_³·öí>‹4rûp9‚ ½ãÞÊÒÃSuHƱ¸IÒX"ˆ5Zɲ#Ã>ñù‹S¦:fúY‡i2,1¼èpåÊQcÓÛ"hcÅXOœï×8>iur_wUBúA¥‚5n¶ÖäW¦4½¿àìAaš,¾÷vë}üï÷šÆ{öjš&‡îB Œ-Óסó€E±%8ß(êõðôûeJÉ †w²àùÚ„)°ˆ*RXËܪT(úþ¤éwÁ<…Ř<öD"±Y•4¸ˆúÞyÊ•ü‘°Å®ÿö bØz(KÜR§„ÓÖs3¡Á¾;€9ÔMü˹¯Ý³Öíû§lÕÈm|\«ý±6Œ6Ìl°êL®rvжâ—Ìa ¸3Qm-_šº‰†È -_ÅÅTá# ë!>§öíHvýH›*71ðÇgÜ·Ì+fEôö÷ï¿Ô­þ¨uïásdAE«½¯Pº}ßax*?žZ5Ò:töÚ¾’x†ÝèP[ËÎgϸokvžå¾þ‹Sð”]/ýŽn´å/á~ΔùN»øHß]gøFÐWeNö:Ê  á©ÏCmÔŸªÞ‹eûZ]ÛÚbj{‹S˜ãxª¶_¥aÄAYñzy·$¯[)D»g¶uai !mŽÐC¢øÏTx;\ÑÅ•,îEFz“)`­“†Xí2Íœ€+b7Xd3çg/]£ HB‹NÎ@€Ë·a†âÎx„¤•K~$˜jü¼âãæ£)&«¤9_õª*‰ŠÂõ~ÒX=Û±‘Ÿ×¼:z¨B™‹6¼I¸M3ü¶®Å»}˜÷²|Z…ñ:xsØ‹©¶G/Ø€§–£PÉm½{4=víÕº°‹xûÒv˜÷ß²oû}J)“p`TŸqp7‚Ód·ÕhïEº½˜sÎçFzWe܋Ü$om¬p1<­`kê«-Ó®Ì@ O¾ž[u¶ ¼ 4øá¦1÷µ~÷<@£» ,eù ,•ô¹“]ëZ–1-k“Ÿý!äñŸÎchà|™&#@¿ V×'Í€v•Ù&÷M‚§LÒXE"”{ÀŠ<Bž%Äš¯ðÎu%7aÜÊS…qÞ˜Ñ=jÿ›²ÏD!yj?U¾å(ÁàÞ<î5ŽAÌ”ùY¸ØÕ $Ê_˜;_2ROta4Ã÷fdß0è> Qá-þ-}C‹éüš³Wœø…$›ÍG]ñŒØyEž/î—A_3¼ç²ƒ½¬³fJž>cðëQ?š=zt€Ñe1B¦‚è° ¯¼¤—ùêcKN´}mŒ‡›ÆT†TÏ[[–>®ÒÖÖ> +ª©©ñqßëå^Á®ÿÙÑ©øÂXoæÕ^¡²=uþk 7O¥æ³q>*èë¶ÎÁyKuž­¢ÂeÛÌb@*’±…çœ2éIåx+‡èñ±ÉIÕšÒ÷ónxÆ. •öžHcþ%E¬h_[iÚJ/Oe+…œ´ð¦ìð>‡Ya .cxi z®ä$}E,¨/oàŠ±‰u¦TmW2c«Ôà©Õkû‘(5 Ž÷më}l·ÃÀv€Z¾x:Ôí§çôÁâÄ)Ahð‹#»ÃÝ"’ a ÖÆ§¦ö%~EíNQs(‹¥‘¨S24ùñN÷ÉÉ¢§m{6ûUáÛ,5à\ª2T±-™X_f‘©ö „Œf§ ¤ºPI‡ð‚[öêóž>gbF“3t%GèáÖΠyh}DûôÄi‡H˜ÿé<È©›¦ëj3jÁ!¦Éu8 zççBÞãÇüj~þþ7žHIIYý‘ªâÏÎY÷Œ‰}X[›1::zžLN~ðàÁîn -úÍŸ¨: ´­½½½Ú¬Wd­/ÞDbÑ“ðwä´öv‹ýâ⻡šÇ;ÖÅÁ%Þ÷s¾¨L--UW[®x“Hj×))­åUU§]\r´ÓÊËË¿Œçª  ”ïj¤ýº• ß«UófmMOMU•`nnž;Ë s%Ôiîî¹O2óö¶ª©—KSsDfu2zù¶RÌæ\ò5¶Kõß̲öÏæa;Ï»ož%ï¸õôÄîÌôX¾¥È›¡7[4£Wà´èÙ?QQ'—Þió[ˆ5$vŽ¢5o§å° MîüµðwÙÇÍÂÃÑoß¼ òðá‰ÈDŒBi ±>4Cé!_ŸÜúzŒ°+ø\°ž;›ŒŽÍIrÛL‚§Dgæ¹Hp8 ×bö®Îžž3d—»ÅÖ€I»³ð‚® ™·âŽn:ÒýqIþÍIÈ– P?ßÛJRŸ²'ý˜ÈY>+¥,ý+\fßBÞx¡ÈØ=“Fz¤²§4!/ŒSlÒµnÁ3M¼sM‚«bÝl ,™¢L…óß6Htu‘K ˜5×ÜÏŸs,Ý¥5€¤.dåúaæ° À›àÂÉÀÇò…¯&×YËv#×mêS6×ýÖfšt->ˆÕsB ÄýXv=zøÁ‘¨m„Â8D²öåí1Àýt Pn+¶Ü\B (‡K^ƒýï©Ë"2¨€°LâO.pã$¨‹/^ðå9‚×TÐ×e¿¤dãû¶¶©Ý/©TAåÔVú:½ÚÊ/$tú_¾ÈjKó ­"uu'Ê+*.GܹÈúÐÝmç¹¹–3¢~ïÞ= $RF Ñ©Ìúò%‚=dH‹.-þj2–_QQ!²pæ¿¿x¾žíèèˆz” uÀüsð¶£Ø»« ·<¶¼logÇÌÎÎ~VÎû´&^d<o•ò ц™hGýØ÷iˆvÂùÜi‡Höí:iˆjG`­êHŠEV d÷ŽG`-¾Txa €‡Z=Üb"rc:x\3ùÓà˜Ð¾ŸpÞÅ;“|OÀ¥F<ÈK}ߦ$§Ñ]?=ü—Ùòd2È–&ÎΨ¦ö•ÕUo/¯×’§u!œítè[e Ô$ÿôÐñPÎv.PiˆY¢ò¤ ™ENz:§ºt¦hÑ1'DGW÷¯*~0 Td‰\ mìv°ÿ쉷“t@¤Ÿc@ÝÊy"[XìζòŒy_AÿáN}œ8à€òï_q’Э Û¹—Ãè.ú‚÷w·XÎ@ÈšƒVë!?ˆ°…D=èÇ"ÙÂ'ÚM©“\V@~sHÔÒ9_ß#ÆoK`ÿn¼Ÿ'•ÿÃz«{¬›¯ž*?€ô ñß#ÿ°ÿ,úâQ#ÈÖ<´À"ÏS(r`w»mv ýþÀìÈÿ0»ùÿÕì¬o¾±Èû›Ódù½ýëÿev èXn›ÝSêÿhv@¸Žúþiq¦íŠ6O±JxJkµ­]¬9_p–)‰«Ð*æû}“šªºª­ìÛ•Ôº“¿.ô”˜ŽFòu²ã‘Ü; Ö„ˆ*§„ ~Éý€€ÎØÌ¨ä„kÔ¿PKc¹»8.§PKk„ˆ:'Configurations2/accelerator/current.xmlPKPKk„ˆ:Configurations2/progressbar/PKk„ˆ:Configurations2/floater/PKk„ˆ:Configurations2/popupmenu/PKk„ˆ:Configurations2/menubar/PKk„ˆ:Configurations2/toolbar/PKk„ˆ:Configurations2/images/Bitmaps/PKk„ˆ:Configurations2/statusbar/PKk„ˆ: settings.xmlíšms›8Çßß§ððÞÁØI3±;ŽozI¯ÛIÞɰ¶5ZF&î§?¦—PH†N{Ç+‘ôÛeµú/œ¿¾÷Xg BRä#Ã:êດ¯GÆÍâM÷Ìx=þãW+ê€í¢xÀUW‚Rº‹ìèá\ÚIóÈ·‘H*mN<¶rlô§Ã쇽íØXråžQ~726Jù¶i†axŽP¬Mk8šqkÚÕA¾¢ë²¦’ÞM!âwCрęØX¿×;6“ÿFgïäƒÐXÆ8Czûãó½ä§KxQl:ûË‘k#C›´·ÂïQ3òÆ=sK%]2˜ ô´Qí|ÝH¹2ƽsóGÈ‹Àï`¥š!¢®Úä¡_YÖðì`ü%Ðõ&×uëìäøä¸¬®Gü.å.܃›5aþ4Åct‚‰]—!¼r3~J%tã¨Ñz‘§4ãç‚è<çèã!ó €²J¤à4Å5Jªô ø\c¦<&É#÷ÏÕØ—(è7䊰¹Ï¨z.d'`ƒâ€,¡¨Ó=ã}¢:WéCÿàOE·Óg„¯ ÂÓ¯Oý­Y¹Rì¬HVäÖ«à)õ•B/wñ KKàcôWDo¡9µæt½%,ÈRÁîUYC$¡OÒO+Âç ÿ4+ÝKD„c%È'ç\|ºb<)Óý_]¦ë‘¹V¤[‘þ߉ôjÚJô¯#уV¢[‰n%º•èV¢šD5Ç$e—V|tRp6“œ‘,=Ž@Æ–D‡ zÃÚû7Å"Èݵ€è˜µ(ÝV„É‚|+cæ+Œý—/Ïç2ü¨šBW[„Ï‘#êŠ ša´„¬þé ß?9­a^ˆÊ%‘ÚõÀã3 /¸ š1 ‰VšèWòc å0ßyKdrÙ’[‹‘9'þgD*ÈNt++_Éýé~cf õ|>~ku«¨@Y|î3ø¡øy°té–ÊB÷k‚ç;_5uüäžÊùŽ;œ~ƒŸ÷4°±“ßA‚*ÿò.¹MðKÞâµuã?V7ÞQ~wã»DAñ–µê‹«¶$µ%©-I¿GIzÎÒ$P8%Ì ˜–Šúñ×z›ªïãƒþ“¿ƒ5K3ô ²§*K"áôø‚r"vePßg» âO¢Hýw;ÝAíë=_€ŒÒ¢öÍï•üŸHJøuÀœ½Zö’d ·ÉWEù”¡lBa’õF ·Ïo& 'ŒébeÑ[\N w€5Pp‘¸3] ‘³]…8>ú™?|Ée}ã6þPK4†RjÊ%'PKk„ˆ:META-INF/manifest.xmlµ–ËjÃ0E÷ý £½­¶«bâRè4]—‰`# £ðSn][\Õ¥¢¢ZÚ ²8CºdL€7BÞädܱ‚ÿOSÞñ¨ ¦ä.‡•)ùÎàZˆ­ìÉ|ú”]C*êÀ¥Yß!ºJ!ü1³š8ó¤Q‰÷iò×g‘a²e¯6É®hC’Ã*¸~jø$¼Wï:ݧxèô,A)48L}”*Åxß™¼Ý•E¢ï#­!“ 3s¥÷!…¡§<ø‘œmcØ{“ ®-ôHr©ÙBÈt¾YØÄÀéžò÷o›’g•t¥.×ض1#ópÍ9µæ™üsË™PKñÅcåi PKk„ˆ:…l9Š..mimetypePKk„ˆ:Wrh°"¶ï Tcontent.xmlPKk„ˆ:‰Tí íT#Basic/Standard/gsl_out.xmlPKk„ˆ:¿´òy×\R&Basic/Standard/script-lb.xmlPKk„ˆ:ú‚lÓRs'Basic/script-lc.xmlPKk„ˆ:'òϸûI ‡(styles.xmlPKk„ˆ:›#ƒe’’º1meta.xmlPKk„ˆ:c¹»8.§r5Thumbnails/thumbnail.pngPKk„ˆ:'æHConfigurations2/accelerator/current.xmlPKk„ˆ:=IConfigurations2/progressbar/PKk„ˆ:wIConfigurations2/floater/PKk„ˆ:­IConfigurations2/popupmenu/PKk„ˆ:åIConfigurations2/menubar/PKk„ˆ:JConfigurations2/toolbar/PKk„ˆ:QJConfigurations2/images/Bitmaps/PKk„ˆ:ŽJConfigurations2/statusbar/PKk„ˆ:4†RjÊ%' ÆJsettings.xmlPKk„ˆ:ñÅcåi ÊNMETA-INF/manifest.xmlPKÁvPnco-4.5.4/doc/nco_ltr_spp.txt000066400000000000000000000117311264355130400161410ustar00rootroot00000000000000$Header$ -*-Text-*- # Purpose: Collection of endorsements for institutional NCO funding ************************************************************************ ************************************************************************ Subject: NSF SEI(GEO) NCO/SDO Proposal Endorsement From: Maxwell Kelley Date: Fri, 30 Apr 2004 11:52:45 +0200 (CEST) To: zender@uci.edu I find the NCO operators to be indispensable in my work, and many of my colleagues would say the same. Their usefulness is perhaps best captured by the surprise of some people to whom I have introduced NCO when they learned that it is a separate entity from the NETCDF library. The developers of NCO have always replied promptly to my help requests and have on occasion even added new functionality that I had requested. In my opinion, the advantages of NCO compared to mathematically more comprehensive packages reading NETCDF files are that it is fast, very concise, free of charge, runs on almost any platform, and can be easily integrated into shell or other kinds of scripts. And with the evolution of the ncap utility, the capabilities of NCO are becoming sufficient for tasks of greater numerical complexity. ------------------------------------------------------------ Dr. Maxwell Kelley Laboratoire des Sciences du Climat et de l'Environnement L'Orme des Merisiers CEA Saclay 91191 Gif sur Yvette cedex mkelley@lsce.saclay.cea.fr France +33 1 69 08 27 02 ------------------------------------------------------------ ************************************************************************ ************************************************************************ Subject: NSF SEI(GEO) NCO/SDO Proposal Endorsement From: Date: Fri, 11 Jun 2004 15:49:46 +0800 To: zender@uci.edu The best netCDF processing software I have ever used. NCO is indispensible in my work. Good luck! Haijun -------------------------------------------- Haijun Yang, Associate Professor Department of Atmospheric Science School of Physics, Peking University 209 Chengfu Road, Beijing, China 100871 Tel: 86-10-62767436 Fax: 86-10-62751094 Email: hjyang@pku.edu.cn -------------------------------------------- ************************************************************************ ************************************************************************ Subject: NSF SEI(GEO) NCO/SDO Proposal Endorsement From: "Remik Ziemlinski" Date: Thu, 05 Aug 2004 17:33:45 -0400 To: zender@uci.edu Remik Ziemlinski Software Engineer NOAA/GFDL -- Remik Ziemlinski Raytheon Company NOAA/Geophysical Fluid Dynamics Lab. Remik.Ziemlinski at noaa d0t gov P.O. Box 308 1.609.452.6500 ext. 6977 Princeton, NJ 08542 USA 1.609.987.5063 fax ************************************************************************ ************************************************************************ Subject: NSF SEI(GEO) NCO/SDO Proposal Endorsement From: Ed Hill To: zender@uci.edu Date: Mon, 09 Aug 2004 10:44:11 -0400 Prof Zender, I'm writing in support of the recent NSF proposal [1] to improve the "NCO" suite of NetCDF/HDF data analysis tools. Our group: http://paoc.mit.edu/cmi/ http://mitgcm.org/ and many of our collaborators are steadily moving toward the use of both hierarchical data formats (such as NetCDF and HDF) and multi-terabyte data sets. Under these circumstances, tools such as NCO become increasingly useful and important for our work. I am impressed with the capabilities offered by current NCO releases and would very much like to see it extended (per the above proposal) to take fuller advantage of parallel systems. I believe that such a free, open, and extensible set of parallel analysis tools would be an important resource for the GFD community. While nearly all ocean and atmospheric models have evolved to take advantage of parallel execution, it seems that many of the data analysis tools have lagged. Thus, for many researchers, it is the pre- and post-processing steps that consume the most time and can be the greatest barrier to experimental progress. Thus, I look forward to parallel versions of the NCO tools that will take better advantage of both our SMP (threaded) and cluster (MPI-based) computing resources. Best regards, Ed Hill [1] SEI(GEO): Scientific Data Operators Optimized for Distributed Interactive and Batch Analysis of Tera-Scale Geophysical Data, Dr. Charles S. Zender, Department of Earth System Science, University of California at Irvine -- Edward H. Hill III, PhD office: MIT Dept. of EAPS; Rm 54-1424; 77 Massachusetts Ave. Cambridge, MA 02139-4307 emails: eh3@mit.edu ed@eh3.com URLs: http://web.mit.edu/eh3/ http://eh3.com/ phone: 617-253-0098 fax: 617-253-4464 ************************************************************************ ************************************************************************ nco-4.5.4/doc/nco_news.shtml000066400000000000000000000466341264355130400157540ustar00rootroot00000000000000 NCO Homepage

    NCO News and Announcements from 20030624 (version 2.8.3) and earlier

    2003/06/24: A potpurri of old news which is no longer needed on the homepage

    • As of version 2.8.3, ncap consumes significantly less memory than before.
    • New “binary” operator ncbo does file addition, subtraction, multiplication, and division
    • ncap adds user-invokable type conversion functions char(), short(), int(), float(), double().
    • libnco_c++ reads into and writes from type long double
    • Developer code has fully integrated autoconf/libtool build procedure
    • NCO allows ncap to unpack variables stored with scale_factor and add_offset convention
    • NCO includes ncap, a scriptable operator capable of performing arbitrary arithmetic operations
    • NCO code includes libnco_c++, a new C++ interface to netCDF
    • NCO now supports multithreading with OpenMP-compliant compilers
    • NCO code contains working packing and unpacking primitives

    2002/02/03: NCO version 2.2 is released. Differences with version 2.0

    • ncap, the netCDF Arithmetic Processor
    • libnco_c++, a C++ API for libnetcdf
    • Various minor bugfixes introduced in 2.X releases

    2001/05/07: NCO version 2.0 is released. Differences with version 1.2.2 are completely internal and oriented toward enhancing I/O performance and modernizing the NCO API:

    • NCO 2.x is now completely based on the netCDF 3.x API. NCO 1.2.x will continue to be maintained for its ability to work with HDF4 files, but no new features will be added.

    2001/02/11: NCO version 1.2.2 is released. Differences with version 1.2.1 include three new features and one bugfix:

    • Weights are allowed with ncwa in min/max/ttl operations. New "var:att" syntax allows ncrename to rename attributes for specific variables rather than whole file, e.g.,
      ncrename -a os_name:eunuchs,unix in.nc out.nc
      Previously, ncrename would rename the same attribute for all variables in a file.
    • ncks has new -q option to allow for printing arrays without printing associated dimensions
    • The build system has been modified so that make HDF4=Y will build NCO with HDF4 compatibility (previously this had to be done by hand).
    • The internal representations of NC_CHAR and NC_BYTE data have been swapped in order to agree with the netCDF standard. The effects of this last change should not be visible to the user.

    2000/08/28: NCO version 1.2.1 is released. Differences with version 1.2 include one new feature and one bugfix.

    1. Operators now perform automatic type conversion of integers to doubles before arithmetic. This feature allows ncwa, ncra, and ncea to handle averaging of longs, shorts, bytes, and chars in a more satisfactory manner. One immediate benefit is that ncwa no longer complains when user's try to apply weights (e.g., gaussian weights) all less than one to the averaging of an integer (e.g., nlons). Formerly ncwa would issue a warning, a workaround, and then dump core (because weights converted to integers were all zeros). Now that arithmetic is performed in double precision (rather than in the precision of the variable), ncwa handles this situation correctly.

    2. A bug introduced in NCO 1.2 which broke the -x switch has been fixed

    3. Thanks to Henry Butowsky for implementing the type conversion feature
    Thanks to Ethan Davis for improving the build procedure

    2000/07/30: nco-1.2 is released. Summary of new features and user-visible changes:

    • The names of three of the operators have been made somewhat obsolete because they are no longer just arithmetic averagers. ncra, ncea, and ncwa have all been given brain transplants so that the type of operation they perform may be specified on the command line. The following operations are now supported by the new -y switch: average (default), total, minimum, maximum, root-mean-square, square of the mean, mean of the squares, square root. For example,
      ncra -O -y rms -n 12,4,1 h0001.nc 2000_rms.nc # Root-mean-square
      ncea -O -y min -n 12,4,1 h0001.nc 2000_min.nc # Minimum
      ncwa -O -y max -a lon,lat h0001.nc 200001_max_x.nc # Maxima
      
      Averaging is still the default so no existing usage needs to be modified. It is also possible to compute spatial and temporal variances and standard deviations using a combination of three or four NCO commands.
    • All operators may now be DODS clients. DODS enables network transparent data access to any DODS server. Thus DODS-enabled NCO can operate on remote files accessible through any DODS server without transferring the files. Only the required data (e.g., the variable or hyperslab specified) are transferred. See the User's Guide for complete details.
    • Fortran compatibility has been dropped. If a volunteer wants to continue to maintain the option to perform arithmetic in Fortran for reasons of speed, contact the project.
    Summary of administrative changes:
    • NCO is now an Open Source project licensed under the GPL. These new capabilities are the result of contributions from Henry Butowski, Bill Kocik, and Roland Schweitzer. For more information on how to contribute to NCO, visit the NCO administration homepage.
    • New NCO releases and important announcements will be made on the netCDF list and on the new nco-announce mailing list.
    • Questions, suggestions, ideas, and pleas for help should be posted to the appropriate discussion forum at the NCO administration site. NCO developers monitor these open forums, and your message will get a quicker response if it is posted on one of these forums:
      • Open Discussion Forum: General discussion, discussion of tips, tricks, future directions for NCO.
      • Help Forum: Installation problems, user's questions (e.g., "How do I average x and y...?")
      • Developers forum: Discussion of patches, technical questions related to modifying NCO, and discussion of specific items on the TODO list and how best to address them
    Note: You must first register in order to post to these forums. Once registered you may choose to "monitor" the forums and to receive email when there are any postings.

    2000/05/15: nco-1.1.48 fixes a bug introduced in nco-1.1.15 (November 1998) with ncdiff version 1.5. That bug could cause incorrect answers when the broadcast feature was used and dimensions were defined in a certain order (that appears to be favored by oceanographers). All NCO users are urged to upgrade NCO in order to avoid the potential ncdiff bug as well as to take advantage of the new features in ncra and ncrcat.

    2000/05/10: nco-1.1.47 adds capability of ncra, and ncrcat to handle superfluous initial files. These multifile operators used to require that hyperslabs along the record dimension contain valid points in the first input file, although superfluous trailing files were allowed. Now superfluous files are also allowed anywhere in the file argument list for coordinate value hyperslabs (e.g., -d time,2.0,3.0), and at the beginning and end of the file argument list for dimension index hyperslabs (e.g., -d time,2,3). This can dramatically simplify analysis of file collections when the location of certain record coordinates or indices is not known a priori, or is tedious to compute. Users may now operate on specific segments of a timeseries (e.g., February values) without knowing which files contain February. Simply input the entire timeseries of files to the operators and they will automagically find and operate on only the February values. For example,

    ncra -O -d time,2.0,3.0 -n 1000,4,1 h0001.nc feb.nc

    ncrcat -O -F -d time,2,,12 -n 1000,4,1 h0037.nc feb.nc

    Sylvia Murphy of the NCAR Community Climate System Model Support Network organized a workshop in February, 2000 which devoted some time to NCO. Here are links to the very useful pamphlet and slide presentation she developed to introduce and to summarize the NCO operators. The pamphlet is an excellent primer on NCO's capabilities, though not as definitive as the User's Guide.

    2000/03/05: Source and prebuilt binary executable RPMs for NCO are now available for download.

    2000/01/26: Fixed longstanding NCO bug which caused infrequent but unpredictable core dumps on machines with PIDs longer than 6 digits, e.g., all recent SGI machines. A core dump could occur on these machines when the PID was seven digits long and the filename length was one less than a multiple of eight. Kudos to Juliana Rew and Brian Eaton for identifying this bug. It is recommended that all users upgrade to the the new version. NCO is now distributed under the terms of the GNU General Public License (GPL).

    1999/12/26: Added support for printing character arrays as strings in ncks. Added documentation and examples of stride capability to ncks, ncra, and ncrcat portions of User's Guide.

    1999/12/14: Added feature to ncatted so that C-language escape sequences may be used in editing character attributes. Text formatting of attributes now supports \n, \t, and most other printf-style sequences. See the User's Guide for details.

    1999/12/06: Fixed bug in ncatted so that character-valued attributes (strings) may contain commas, and be of zero length. Formerly ncatted would drop all text after the first comma.

    1999/10/04: The build configuration has been simplified and made more robust. Now typing make test will invoke a self-test where NCO attempts to download a small (~65 kb) file on which to perform a battery of NCO tests. If the equations output by the make test command are numerically accurate, then you can have high confidence that NCO is installed and working correctly.

    1999/08/31: A bug involving ncwa, weights, and missing values has been identified and fixed. When ncwa was used to average variables with user-specified weights (i.e., -w wgt was used) and every value in a target hyperslab was the missing value (i.e., missing_value), then ncwa would erroneously set the average value of the target hyperslab to 0.0 rather than to missing_value. Thus some values which should have been missing_value in the output file were, instead, set to 0.0. No operators besides ncwa were affected by this bug. This bug is fixed in nco-1.1.38. A new feature has been implemented in ncwa. ncwa used to exit with an error whenever it was called without any user-specified dimensions to average, i.e., when the -a was not invoked. Now when ncwa is invoked without any user-specified dimensions, it averages over all dimensions. Thus the behavior of -a is now analogous to that of -d and of -v. See the User's Guide for details.

    1999/08/29: NCO now builds completely with pure C source files by default. In the past, NCO used Fortran routines to perform floating point arithmetic and pure C builds could be manually enabled by specifying -DC_ONLY in the build environment. The interface between Fortran and C, however, was very difficult to maintain on the wide variety of platforms supported by NCO. Now pure C builds are the default and Fortran arithmetic must be manually enabled by specifying -DUSE_FORTRAN_ARITHMETIC in the build environment. See the User's Guide for details. The Fortran code is no longer supported and will probably be deprecated in future releases.

    1999/08/05: NCAR users will be pleased to know that NCO now takes advantage of the local msrcp command, if it exists in a standard location on the local network. This allows all operators to retrieve files from the NCAR mass storage unit when msrcp is available on the local system. This change is transparent to the user, so that commands should still specify the paths to the files on the mass store with, e.g., ncks -O -R -l ./ /ZENDER/nc/in.nc foo.nc. See the User's Guide for more details.

    1999/07/03: ncatted now replaces missing values of variables whose missing_value attribute is changed. When the internal floating point representation of a missing value, e.g., 1.0e36, differs between machines then netCDF files produced on those machines will have incompatible missing values. ncatted now changes the missing_value attribute and the missing data self-consistently. This allows the user to change the missing values in files from different machines to a single value so that the files may then be concatenated together, e.g., by ncrcat, without losing any information.

    1999/05/09: ncks now alphabetizes output by default. To turn off alphabetization and return to the previous behavior (variables reported in the order they were written to disk) simply specify `-a' on the command line. Yes, that means the behavior of `-a' has been toggled.

    ncrcat and ncra now support a stride in the record dimension (and only the record dimension!), e.g., ncra -d time,1,100,12 in1.nc in2.nc ... out.nc should now work correctly. Strides in any dimension remain available with ncks, of course.

    ncrcat and ncra now support index-based hyperslabbing in the record dimension across files, e.g., ncra -d time,1,100 in1.nc in2.nc ... out.nc The User's Guide claimed this feature had already been implemented, but, due to an oversight, that was not true. Attempting to use this new feature in older versions of NCO resulted in an "index out of range" error. Thanks to John Truesdale for pointing this out.

    1999/04/20: Fixed bug where ncrcat and ncra omitted the last slice of the record dimension when `-F' (Fortran indexing) was user-specified AND user-specified hyperslab information was provided for some dimensions BUT not for the record dimension. This bug only affected ncrcat and ncra and only under these conditions. Thanks to John Sheldon for pointing this out.

    1999/04/04: By default, extracted variables appear in the same order in which they were written to the source netCDF file. However, this order is often essentially random, making it hard to locate a particular variable in a dump of many variables. To help address this, ncks will now alphabetize variables. Simply specify `-a' on the command line.

    1999/01/21: An optional token has been added to NCO which eliminates all netCDF 3.x calls and thus restores compatibility of NCO with HDF files.

    1998/12/02: ncwa has been updated again since a user discovered a bug which occurred when a weight (`-w') and a mask (`-m') were both given to ncwa. Unfortunately, ncwa sometimes produced incorrect answers in this scenario so if you ever used weights and masks at the same time you are strongly urged to upgrade your NCO and rerun the commands. This bug only affected variables averaged with both the weight and mask options enabled at the same time, no other variables would have been affected.

    The `-n' and `-W' normalization options to ncwa have been removed, possibly permanently, but at least until their implementation is simplified and redesigned. The `-N' option to ncwa remains the same. All the new behavior is fully documented in the rewritten and expanded ncwa section in the NCO User's Guide.

    1998/11/24: Choose whether to weight your coordinates in ncwa A `-I' switch has been added to ncwa. Henforth, by default, ncwa applies weights or masks to coordinate variables just like any other variable. Previously, ncwa did not weight coordinate variables at all, and always produced simple arithmetic averages of coordinate variables. Use `ncwa -I' to recover the old behavior (i.e., arithmetic rather than masked, weighted averages of coordinate variables). A problem where ncwa would refuse to average variables which did not contain any of the averaged dimensions has also been fixed.

    1998/07/07: Reduce bloating! The `-h' switch has been enabled on all operators. Using this switch suppresses the automatic history feature in NCO. Now you can decide whether each change to a file warrants an additional line in the history attribute. The functionality of the old `ncks -h' switch is now invoked with `ncks -m' (the mnemonic is `metadata').


    nco-4.5.4/doc/nco_qt_msvc.shtml000066400000000000000000000056201264355130400164420ustar00rootroot00000000000000 NCO Qt/MSVC build

    NCO Qt/MSVC build

    This page contains instructions regarding building NCO with the Qt system and with Microsoft Windows Visual Studio 2013 (MSVC). This page is mostly important for developers that want to build NCO from source using Qt or MSVC.

    Build NCO with Qt

    Qt is a cross platform build system. As of NCO 4.2.1, it is possible to build NCO with Qt, in a Linux, Mac OSX or Windows enviroment. NCO can be built either from the Qt IDE, QtCreator, or from the command line. To build NCO with QtCreator, just open the file /qt/nco.pro. To build NCO from the command line, do:

    $ cd qt
    $ qmake
    $ make

    Build NCO with MSVC

    As of NCO 4.2.0, it is possible to build NCO with Visual Studio 2013. To build NCO with MSVC, open the file /qt/nco.sln with Visual Studio. NCO depends on several pre-installed libraries, namely: HDF5 (including HDF5 High-Level), netCDF, zlib, szip, Antlr, GSL, Curl, UDUnits, Expat. The NCO supplied Visual Studio projects assume static builds of these libraries. These are specified by means of the following Windows environment variables in the projects:

    LIB_NETCDF
    LIB_HDF5
    LIB_HDF5_HL
    LIB_ZLIB
    LIB_SZIP
    LIB_ANTLR
    LIB_GSL
    LIB_CURL
    LIB_UDUNITS
    LIB_EXPAT

    Additionnaly, the following environment variable must also be defined for the location of the netCDF, UDUnits, GSL and Antlr header files:
    HEADER_NETCDF
    HEADER_UDUNITS
    HEADER_GSL
    HEADER_ANTLR

    Homepage
    nco-4.5.4/doc/nco_src_frg.txt000066400000000000000000000236741264355130400161140ustar00rootroot00000000000000# $Header$ -*-text-*- # Purpose: Potpurri of Sourceforge information for NCO netCDF Operators project Project Full Name: NCO netCDF Operators Project Unix Name: nco CVS Server: nco.cvs.sf.net Shell/Web Server: nco.sf.net:/home/users/z/ze/zender nco.sf.net:/home/project-web/nco Project Websites: http://nco.sf.net http://sf.net/projects/nco http://sf.net/project/?group_id=3331 http://freshmeat.net/projects/nco Project FTP: ftp://nco.sf.net/pub/nco nco.sf.net:/home/groups/ftp/pub/nco CVS: Anonymous check out: cvs -d:pserver:anonymous@nco.cvs.sf.net:/cvsroot/nco login cvs -z3 -d:pserver:anonymous@nco.cvs.sf.net:/cvsroot/nco co -kk nco Developer check out (note absence of pserver protocol allows ssh to be used) export CVS_RSH=ssh export CVSROOT=zender@nco.cvs.sf.net:/cvsroot/nco cvs -z3 -dzender@nco.cvs.sf.net:/cvsroot/nco co -kk nco cvs -z3 -dzender@nco.cvs.sf.net:/cvsroot/nco co -kk -r netcdf3 -d nco-1_3 nco Checkouts inside sourceforge firewall: cvs -dzender@cvs1:/cvsroot/nco co -kk nco Daily tarballs of entire CVS tree for mirroring: http://nco.cvs.sf.net/cvstarballs/nco-cvsroot.tar.gz Compile Farm: ssh cf.sf.net cf.sf.net HP Testdrive: telnet 192.233.54.169 # Create tarballs for uploading to sourceforge cd /data/zender/tmp mkdir sf cp /data/zender/tmp/netcdf-3.5.1-beta10.tar.Z /usr/local/lib/libnetcdf* /usr/local/include/netcdf* sf tar cvzf sf.tar.gz ./sf mv sf.tar.gz /var/www/html/nco /bin/rm -r sf ncftpput upload.sf.net /incoming /var/www/html/nco/sf.tar.gz scp upload.sf.net:/incoming/sf.tar.gz . # Copy docs from compile farm to NCO websites cd ~/nco/doc;scp -C nco.dvi nco.html nco.info* nco.pdf nco.ps* zender@nco.sf.net:/home/project-web/nco/htdocs cd ~/nco/doc;scp -C nco.dvi nco.html nco.info* nco.pdf nco.ps* zender@dust.ess.uci.edu:/var/www/html/nco # Copy netCDF library to HP account ncftpput spe141.testdrive.compaq.com /house/zender /data/zender/tmp/netcdf-3.5.1-beta5.tar.Z mkdir ${HOME}/bin/${GNU_TRP} mkdir ${HOME}/lib/${GNU_TRP} cd ~/netcdf-3.5.1-beta5/src make distclean CPPFLAGS='-Df2cFortran' FC='g77' ./configure --prefix=${HOME} --bindir=${HOME}/bin/${GNU_TRP} --libdir=${HOME}/lib/${GNU_TRP} CC='/bin/c89' CPPFLAGS='-D_HPUX_SOURCE' CXX='aCC' FC='/opt/fortran/bin/fort77' FFLAGS='-w' FLIBS='-lU77' ./configure --prefix=${HOME} --bindir=${HOME}/bin/${GNU_TRP} --libdir=${HOME}/lib/${GNU_TRP} make;make install # Copy netCDF library to NCO group account scp -C /data/zender/tmp/netcdf-3.5.1-beta10.tar.Z zender@nco.sf.net:/home/project-web/nco # Copy netCDF library from NCO group account to compile farm scp -C nco.sf.net:/home/project-web/nco/netcdf-3.5.1-beta10.tar.Z ~ # Build netCDF library on compile farm mkdir -f -p ${HOME}/bin/${GNU_TRP} mkdir -f -p ${HOME}/lib/${GNU_TRP} cd ~;tar xvzf netcdf-3.5.1-beta10.tar.Z cd ~/netcdf-3.5.1-beta10/src make distclean CPPFLAGS='-Df2cFortran' CFLAGS='-fPIC' FC='g77' ./configure --prefix=${HOME} --bindir=${HOME}/bin/${GNU_TRP} --libdir=${HOME}/lib/${GNU_TRP} make;make install cd ~/lib;mv -f libnetcdf_c++.a libnetcdf.a ${GNU_TRP} # Compile Farm startup alias bsrc="source ${HOME}/.bashrc" alias cp='cp -i' # -i = inquire alias cvc='cvs commit -m ""' alias cvu='cvs update -kk' alias env='env | sort | more' alias h='history' alias ls='ls -F' # -F = mark directories with /, links with @, etc. alias m="less" alias mv='mv -i' # -i = inquire alias rm='rm -i' # -i = inquire alias scp='scp -C' # -p = preserve mode, time, -C = enable compression export CVS_RSH='ssh' export GNU_TRP=`~/nco/autobld/config.guess` export HOST=`/bin/hostname` export MY_BIN_DIR="${HOME}/bin/${GNU_TRP}" export MY_LIB_DIR="${HOME}/lib/${GNU_TRP}" export NETCDF_INC="${HOME}/include" export NETCDF_LIB="${HOME}/lib/${GNU_TRP}" export PATH=${MY_BIN_DIR}\:${PATH} export PS1='\u@\h:\w\$ ' # Prompt user@host:cwd$ NeR98 p. 71 NB: single quotes cd ~/nco;cvs update -kk # Build NCO on Compile Farm, old method: cd ~/nco/bld NETCDF_INC=${HOME}/include NETCDF_LIB=${HOME}/lib/${GNU_TRP} make # Build nco_c++ on Compile Farm cd ${HOME}/nco/src/nco_c++ NETCDF_INC=${HOME}/include NETCDF_LIB=${HOME}/lib/${GNU_TRP} MY_INC_DIR=. gmake Building group NCO: export MY_BIN_DIR='/home/project-web/nco/nco/bin' export MY_LIB_DIR='/home/project-web/nco/nco/lib' export MY_OBJ_DIR='/home/project-web/nco/nco/obj' export NETCDF_INC='/home/project-web/nco/include' export NETCDF_LIB='/home/project-web/nco/lib/LINUX' cd /home/project-web/nco/nco/bld;make;cd - export PATH="${PATH}\:/home/project-web/nco/nco/bin" The purpose of this project is to create and improve tools for data analysis by using Open Source development strategy. The starting point for this project is the NCO software suite. NCO is a relatively mature package which requires new ideas, features, and contributors in order to remain a useful and vital application. The netCDF Operators, or NCO, are a suite of programs known as operators. The operators facilitate manipulation and analysis of self-describing data stored in the netCDF or HDF4 formats, which are freely available (http://www.unidata.ucar.edu/packages/netcdf and http://hdf.ncsa.uiuc.edu, respectively). Each NCO operator (e.g., ncks) takes netCDF or HDF input file(s), performs an operation (e.g., averaging, hyperslabbing, or renaming), and outputs a processed netCDF file. Although most users of netCDF and HDF data are involved in scientific research, these data formats, and thus NCO, are generic and are equally useful in fields like finance. The NCO User's Guide illustrates NCO use with examples from the field of climate modeling and analysis. The NCO homepage is currently http://nco.sf.net To build NCO on SourceForge, make NETCDF_LIB=/home/project-web/nco/lib/LINUX NETCDF_INC=/home/project-web/nco/include To make a new release of NCO on SourceForge: ncftpput upload.sf.net /incoming /var/www/html/nco/nco-2.7.1.tar.gz ncftpput upload.sf.net /incoming /usr/src/redhat/SRPMS/nco-2.2.0-*.src.rpm /usr/src/redhat/RPMS/i386/nco-2.2.0-*.i386.rpm /usr/src/redhat/SOURCES/nco-2.2.0.tar.gz To upload to RedHat for inclusion in, e.g., rpmfind.net: ncftpput incoming.redhat.com /libc6 /usr/src/redhat/SRPMS/nco-2.2.0-*.src.rpm /usr/src/redhat/RPMS/i386/nco-2.2.0-*.i386.rpm Mailing lists nco-announce: Web page for users: http://lists.sf.net/mailman/listinfo/nco-announce Address for posting: nco-announce@lists.sf.net Subscriber info, Send message with "help" in it to nco-announce-request@lists.sf.net Subscription page for changing password, options, etc: http://lists.sf.net/mailman/options/nco-announce/zender@uci.edu List administration: http://lists.sf.net/mailman/admin/nco-announce Contributors with active projects: Name, E-mail, Sourceforge name, Project Henry Butowsky ncap, multislabbing Rorik Peterson autoconf, getopt Jim Edwards Brian Mays Debian packaging George Shapovalov Gentoo How to help develop NCO: The best way to start contributing is to checkout the software from the CVS repository on Sourceforge. The CVS repository contains the latest, up-to-the-minute software. If you have never used CVS before, you may just want to download the numbered tar.gz or RPM release, whichever method you prefer. These will not contain any code changes since they were released. Eventually, therefore, you must learn to use CVS so that you can make serious code changes and keep up with the development branch. NCO-specific instructions on how to check out the code with CVS are posted to the Developer's forum on Sourceforge http://sf.net/p/nco/discussion/9831 in the message dated June 21, 2000. Once you have NCO, build it! If you must make non-trivial modifications to the Makefile in order to build on your platform, then please submit those modifications as your first patch. Once you have built NCO, peruse the user's guide and try a few examples. Read the contents of the Developer's forum! Subscribe to all the NCO forums so that you are automatically CC'd when new messages arrive. Post your questions and progress and ideas to the developer's forum (frequently!) so that others may learn about your work. The Developer's forum will help prevent duplication of effort and is the key communication point for everyone involved in the project. Once you have done all this, you are ready to choose an item on the TODO list to tackle. For C hackers, dive in to the source code. If hacking 500 line files of C functions is too intimidating, then there are plenty of non-C ways to contribute. Consider contributing improvements to the documentation (man pages need work), web pages, or regression testing script (written in Perl). In an open source project, YOU decide what needs to be done. Perhaps HTML, Make, RPM, Debian packaging, autoconf are more your bag. The important thing is to start learning NCO so you can decide for yourself how best you can contribute. Then, as mentioned above, post your questions and progress to the developer's forum where different implementation strategies and technical details are to be discussed. Thanks, Charlie ************************************************************************ PayPal sites: Put this HTML on webpage
    PayPal email: Put this URL in email https://www.paypal.com/xclick/business=zender%40uci.edu&item_name=NCO+development&item_number=nco_dnt_dvl&no_note=1&tax=0¤cy_code=USD nco-4.5.4/doc/netcdf.h.3.6.3000066400000000000000000000722441264355130400151460ustar00rootroot00000000000000/* * Copyright 1993-2005 University Corporation for Atmospheric Research/Unidata * * Portions of this software were developed by the Unidata Program at the * University Corporation for Atmospheric Research. * * Access and use of this software shall impose the following obligations * and understandings on the user. The user is granted the right, without * any fee or cost, to use, copy, modify, alter, enhance and distribute * this software, and any derivative works thereof, and its supporting * documentation for any purpose whatsoever, provided that this entire * notice appears in all copies of the software, derivative works and * supporting documentation. Further, UCAR requests that the user credit * UCAR/Unidata in any publications that result from the use of this * software or in any product that includes this software. The names UCAR * and/or Unidata, however, may not be used in any advertising or publicity * to endorse or promote any products or commercial entity unless specific * written permission is obtained from UCAR/Unidata. The user also * understands that UCAR/Unidata is not obligated to provide the user with * any support, consulting, training or assistance of any kind with regard * to the use, operation and performance of this software nor to provide * the user with any updates, revisions, new versions or "bug fixes." * * THIS SOFTWARE IS PROVIDED BY UCAR/UNIDATA "AS IS" AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL UCAR/UNIDATA BE LIABLE FOR ANY SPECIAL, * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION * WITH THE ACCESS, USE OR PERFORMANCE OF THIS SOFTWARE. */ /* "$Id$" */ #ifndef _NETCDF_ #define _NETCDF_ #include /* size_t, ptrdiff_t */ #include /* netcdf functions sometimes return system errors */ #if defined(__cplusplus) extern "C" { #endif /* * The netcdf external data types */ typedef enum { NC_NAT = 0, /* NAT = 'Not A Type' (c.f. NaN) */ NC_BYTE = 1, /* signed 1 byte integer */ NC_CHAR = 2, /* ISO/ASCII character */ NC_SHORT = 3, /* signed 2 byte integer */ NC_INT = 4, /* signed 4 byte integer */ NC_FLOAT = 5, /* single precision floating point number */ NC_DOUBLE = 6 /* double precision floating point number */ } nc_type; /* * Default fill values, used unless _FillValue attribute is set. * These values are stuffed into newly allocated space as appropriate. * The hope is that one might use these to notice that a particular datum * has not been set. */ #define NC_FILL_BYTE ((signed char)-127) #define NC_FILL_CHAR ((char)0) #define NC_FILL_SHORT ((short)-32767) #define NC_FILL_INT (-2147483647L) #define NC_FILL_FLOAT (9.9692099683868690e+36f) /* near 15 * 2^119 */ #define NC_FILL_DOUBLE (9.9692099683868690e+36) /* * The above values are defaults. * If you wish a variable to use a different value than the above * defaults, create an attribute with the same type as the variable * and the following reserved name. The value you give the attribute * will be used as the fill value for that variable. */ #define _FillValue "_FillValue" #define NC_FILL 0 /* argument to ncsetfill to clear NC_NOFILL */ #define NC_NOFILL 0x100 /* Don't fill data section an records */ /* * 'mode' flags for ncopen */ #define NC_NOWRITE 0 /* default is read only */ #define NC_WRITE 0x1 /* read & write */ /* * 'mode' flags for nccreate */ #define NC_CLOBBER 0 #define NC_NOCLOBBER 0x4 /* Don't destroy existing file on create */ #define NC_64BIT_OFFSET 0x0200 /* Use large (64-bit) file offsets */ /* * 'mode' flags for nccreate and ncopen */ #define NC_SHARE 0x0800 /* Share updates, limit cacheing */ #define NC_STRICT_NC3 (0x8) /* The following flag currently is ignored, but use in * nc_open() or nc_create() may someday support use of advisory * locking to prevent multiple writers from clobbering a file */ #define NC_LOCK 0x0400 /* Use locking if available */ /* * Starting with version 3.6, there were two different format netCDF * files. netCDF-4 introduces the third one. */ #define NC_FORMAT_CLASSIC (1) #define NC_FORMAT_64BIT (2) #define NC_FORMAT_NETCDF4 (3) #define NC_FORMAT_NETCDF4_CLASSIC (4) /* create netcdf-4 files, with NC_STRICT_NC3. */ /* * Let nc__create() or nc__open() figure out * as suitable chunk size. */ #define NC_SIZEHINT_DEFAULT 0 /* * In nc__enddef(), align to the chunk size. */ #define NC_ALIGN_CHUNK ((size_t)(-1)) /* * 'size' argument to ncdimdef for an unlimited dimension */ #define NC_UNLIMITED 0L /* * attribute id to put/get a global attribute */ #define NC_GLOBAL -1 /* These are in support of the coordinate axis stuff. */ #define NC_NOAXISTYPE 0 #define NC_LATITUDE 1 #define NC_LONGITUDE 2 #define NC_GEOX 3 #define NC_GEOY 4 #define NC_GEOZ 5 #define NC_HEIGHT_UP 6 #define NC_HEIGHT_DOWN 7 #define NC_PRESSURE 8 #define NC_TIME 9 #define NC_RADAZ 10 #define NC_RADEL 11 #define NC_RADDIST 12 /* * These maximums are enforced by the interface, to facilitate writing * applications and utilities. However, nothing is statically allocated to * these sizes internally. */ #define NC_MAX_DIMS 1024 /* max dimensions per file */ #define NC_MAX_ATTRS 8192 /* max global or per variable attributes */ #define NC_MAX_VARS 8192 /* max variables per file */ #define NC_MAX_NAME 256 /* max length of a name */ #define NC_MAX_VAR_DIMS NC_MAX_DIMS /* max per variable dimensions */ /* * The netcdf version 3 functions all return integer error status. * These are the possible values, in addition to certain * values from the system errno.h. */ #define NC_ISSYSERR(err) ((err) > 0) #define NC_NOERR 0 /* No Error */ #define NC2_ERR (-1) /* Returned for all errors in the v2 API. */ #define NC_EBADID (-33) /* Not a netcdf id */ #define NC_ENFILE (-34) /* Too many netcdfs open */ #define NC_EEXIST (-35) /* netcdf file exists && NC_NOCLOBBER */ #define NC_EINVAL (-36) /* Invalid Argument */ #define NC_EPERM (-37) /* Write to read only */ #define NC_ENOTINDEFINE (-38) /* Operation not allowed in data mode */ #define NC_EINDEFINE (-39) /* Operation not allowed in define mode */ #define NC_EINVALCOORDS (-40) /* Index exceeds dimension bound */ #define NC_EMAXDIMS (-41) /* NC_MAX_DIMS exceeded */ #define NC_ENAMEINUSE (-42) /* String match to name in use */ #define NC_ENOTATT (-43) /* Attribute not found */ #define NC_EMAXATTS (-44) /* NC_MAX_ATTRS exceeded */ #define NC_EBADTYPE (-45) /* Not a netcdf data type */ #define NC_EBADDIM (-46) /* Invalid dimension id or name */ #define NC_EUNLIMPOS (-47) /* NC_UNLIMITED in the wrong index */ #define NC_EMAXVARS (-48) /* NC_MAX_VARS exceeded */ #define NC_ENOTVAR (-49) /* Variable not found */ #define NC_EGLOBAL (-50) /* Action prohibited on NC_GLOBAL varid */ #define NC_ENOTNC (-51) /* Not a netcdf file */ #define NC_ESTS (-52) /* In Fortran, string too short */ #define NC_EMAXNAME (-53) /* NC_MAX_NAME exceeded */ #define NC_EUNLIMIT (-54) /* NC_UNLIMITED size already in use */ #define NC_ENORECVARS (-55) /* nc_rec op when there are no record vars */ #define NC_ECHAR (-56) /* Attempt to convert between text & numbers */ #define NC_EEDGE (-57) /* Start+count exceeds dimension bound */ #define NC_ESTRIDE (-58) /* Illegal stride */ #define NC_EBADNAME (-59) /* Attribute or variable name contains illegal characters */ /* N.B. following must match value in ncx.h */ #define NC_ERANGE (-60) /* Math result not representable */ #define NC_ENOMEM (-61) /* Memory allocation (malloc) failure */ #define NC_EVARSIZE (-62) /* One or more variable sizes violate format constraints */ #define NC_EDIMSIZE (-63) /* Invalid dimension size */ #define NC_ETRUNC (-64) /* File likely truncated or possibly corrupted */ /* * The Interface */ /* Declaration modifiers for DLL support (MSC et al) */ #if defined(DLL_NETCDF) /* define when library is a DLL */ # if defined(NC_DLL_EXPORT) /* define when building the library */ # define MSC_EXTRA __declspec(dllexport) # else # define MSC_EXTRA __declspec(dllimport) # endif #include #define lseek _lseeki64 #define off_t __int64 #define stat __stat64 #define fstat _fstat64 #else #define MSC_EXTRA #endif /* defined(DLL_NETCDF) */ # define EXTERNL extern MSC_EXTRA /* When netCDF is built as a DLL, this will export ncerr and * ncopts. When it is used as a DLL, it will import them. */ #if defined(DLL_NETCDF) MSC_EXTRA int ncerr; MSC_EXTRA int ncopts; #endif EXTERNL const char * nc_inq_libvers(void); EXTERNL const char * nc_strerror(int ncerr); EXTERNL int nc__create(const char *path, int cmode, size_t initialsz, size_t *chunksizehintp, int *ncidp); EXTERNL int nc_create(const char *path, int cmode, int *ncidp); EXTERNL int nc__open(const char *path, int mode, size_t *chunksizehintp, int *ncidp); EXTERNL int nc_open(const char *path, int mode, int *ncidp); EXTERNL int nc_set_fill(int ncid, int fillmode, int *old_modep); EXTERNL int nc_redef(int ncid); EXTERNL int nc__enddef(int ncid, size_t h_minfree, size_t v_align, size_t v_minfree, size_t r_align); EXTERNL int nc_enddef(int ncid); EXTERNL int nc_sync(int ncid); EXTERNL int nc_abort(int ncid); EXTERNL int nc_close(int ncid); EXTERNL int nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp); EXTERNL int nc_inq_ndims(int ncid, int *ndimsp); EXTERNL int nc_inq_nvars(int ncid, int *nvarsp); EXTERNL int nc_inq_natts(int ncid, int *nattsp); EXTERNL int nc_inq_unlimdim(int ncid, int *unlimdimidp); EXTERNL int nc_set_default_format(int format, int *old_formatp); EXTERNL int nc_inq_format(int ncid, int *formatp); /* Begin _dim */ EXTERNL int nc_def_dim(int ncid, const char *name, size_t len, int *idp); EXTERNL int nc_inq_dimid(int ncid, const char *name, int *idp); EXTERNL int nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp); EXTERNL int nc_inq_dimname(int ncid, int dimid, char *name); EXTERNL int nc_inq_dimlen(int ncid, int dimid, size_t *lenp); EXTERNL int nc_rename_dim(int ncid, int dimid, const char *name); /* End _dim */ /* Begin _att */ EXTERNL int nc_inq_att(int ncid, int varid, const char *name, nc_type *xtypep, size_t *lenp); EXTERNL int nc_inq_attid(int ncid, int varid, const char *name, int *idp); EXTERNL int nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep); EXTERNL int nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp); EXTERNL int nc_inq_attname(int ncid, int varid, int attnum, char *name); EXTERNL int nc_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); EXTERNL int nc_rename_att(int ncid, int varid, const char *name, const char *newname); EXTERNL int nc_del_att(int ncid, int varid, const char *name); /* End _att */ /* Begin {put,get}_att */ EXTERNL int nc_put_att(int ncid, int varid, const char *name, nc_type datatype, size_t len, const void *value); EXTERNL int nc_get_att(int ncid, int varid, const char *name, void *value); EXTERNL int nc_put_att_text(int ncid, int varid, const char *name, size_t len, const char *op); EXTERNL int nc_get_att_text(int ncid, int varid, const char *name, char *ip); EXTERNL int nc_put_att_uchar(int ncid, int varid, const char *name, nc_type xtype, size_t len, const unsigned char *op); EXTERNL int nc_get_att_uchar(int ncid, int varid, const char *name, unsigned char *ip); EXTERNL int nc_put_att_schar(int ncid, int varid, const char *name, nc_type xtype, size_t len, const signed char *op); EXTERNL int nc_get_att_schar(int ncid, int varid, const char *name, signed char *ip); EXTERNL int nc_put_att_short(int ncid, int varid, const char *name, nc_type xtype, size_t len, const short *op); EXTERNL int nc_get_att_short(int ncid, int varid, const char *name, short *ip); EXTERNL int nc_put_att_int(int ncid, int varid, const char *name, nc_type xtype, size_t len, const int *op); EXTERNL int nc_get_att_int(int ncid, int varid, const char *name, int *ip); EXTERNL int nc_put_att_long(int ncid, int varid, const char *name, nc_type xtype, size_t len, const long *op); EXTERNL int nc_get_att_long(int ncid, int varid, const char *name, long *ip); EXTERNL int nc_put_att_float(int ncid, int varid, const char *name, nc_type xtype, size_t len, const float *op); EXTERNL int nc_get_att_float(int ncid, int varid, const char *name, float *ip); EXTERNL int nc_put_att_double(int ncid, int varid, const char *name, nc_type xtype, size_t len, const double *op); EXTERNL int nc_get_att_double(int ncid, int varid, const char *name, double *ip); /* End {put,get}_att */ /* Begin _var */ EXTERNL int nc_def_var(int ncid, const char *name, nc_type xtype, int ndims, const int *dimidsp, int *varidp); EXTERNL int nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp); EXTERNL int nc_inq_varid(int ncid, const char *name, int *varidp); EXTERNL int nc_inq_varname(int ncid, int varid, char *name); EXTERNL int nc_inq_vartype(int ncid, int varid, nc_type *xtypep); EXTERNL int nc_inq_varndims(int ncid, int varid, int *ndimsp); EXTERNL int nc_inq_vardimid(int ncid, int varid, int *dimidsp); EXTERNL int nc_inq_varnatts(int ncid, int varid, int *nattsp); EXTERNL int nc_rename_var(int ncid, int varid, const char *name); EXTERNL int nc_copy_var(int ncid_in, int varid, int ncid_out); #ifndef ncvarcpy /* support the old name for now */ #define ncvarcpy(ncid_in, varid, ncid_out) ncvarcopy((ncid_in), (varid), (ncid_out)) #endif /* End _var */ /* Begin {put,get}_var1 */ EXTERNL int nc_put_var1(int ncid, int varid, const size_t *indexp, const void *value); EXTERNL int nc_get_var1(int ncid, int varid, const size_t *indexp, void *value); EXTERNL int nc_put_var1_text(int ncid, int varid, const size_t *indexp, const char *op); EXTERNL int nc_get_var1_text(int ncid, int varid, const size_t *indexp, char *ip); EXTERNL int nc_put_var1_uchar(int ncid, int varid, const size_t *indexp, const unsigned char *op); EXTERNL int nc_get_var1_uchar(int ncid, int varid, const size_t *indexp, unsigned char *ip); EXTERNL int nc_put_var1_schar(int ncid, int varid, const size_t *indexp, const signed char *op); EXTERNL int nc_get_var1_schar(int ncid, int varid, const size_t *indexp, signed char *ip); EXTERNL int nc_put_var1_short(int ncid, int varid, const size_t *indexp, const short *op); EXTERNL int nc_get_var1_short(int ncid, int varid, const size_t *indexp, short *ip); EXTERNL int nc_put_var1_int(int ncid, int varid, const size_t *indexp, const int *op); EXTERNL int nc_get_var1_int(int ncid, int varid, const size_t *indexp, int *ip); EXTERNL int nc_put_var1_long(int ncid, int varid, const size_t *indexp, const long *op); EXTERNL int nc_get_var1_long(int ncid, int varid, const size_t *indexp, long *ip); EXTERNL int nc_put_var1_float(int ncid, int varid, const size_t *indexp, const float *op); EXTERNL int nc_get_var1_float(int ncid, int varid, const size_t *indexp, float *ip); EXTERNL int nc_put_var1_double(int ncid, int varid, const size_t *indexp, const double *op); EXTERNL int nc_get_var1_double(int ncid, int varid, const size_t *indexp, double *ip); /* End {put,get}_var1 */ /* Begin {put,get}_vara */ EXTERNL int nc_put_vara(int ncid, int varid, const size_t *start, const size_t *count, const void *value); EXTERNL int nc_get_vara(int ncid, int varid, const size_t *start, const size_t *count, void *value); EXTERNL int nc_put_vara_text(int ncid, int varid, const size_t *startp, const size_t *countp, const char *op); EXTERNL int nc_get_vara_text(int ncid, int varid, const size_t *startp, const size_t *countp, char *ip); EXTERNL int nc_put_vara_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, const unsigned char *op); EXTERNL int nc_get_vara_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, unsigned char *ip); EXTERNL int nc_put_vara_schar(int ncid, int varid, const size_t *startp, const size_t *countp, const signed char *op); EXTERNL int nc_get_vara_schar(int ncid, int varid, const size_t *startp, const size_t *countp, signed char *ip); EXTERNL int nc_put_vara_short(int ncid, int varid, const size_t *startp, const size_t *countp, const short *op); EXTERNL int nc_get_vara_short(int ncid, int varid, const size_t *startp, const size_t *countp, short *ip); EXTERNL int nc_put_vara_int(int ncid, int varid, const size_t *startp, const size_t *countp, const int *op); EXTERNL int nc_get_vara_int(int ncid, int varid, const size_t *startp, const size_t *countp, int *ip); EXTERNL int nc_put_vara_long(int ncid, int varid, const size_t *startp, const size_t *countp, const long *op); EXTERNL int nc_get_vara_long(int ncid, int varid, const size_t *startp, const size_t *countp, long *ip); EXTERNL int nc_put_vara_float(int ncid, int varid, const size_t *startp, const size_t *countp, const float *op); EXTERNL int nc_get_vara_float(int ncid, int varid, const size_t *startp, const size_t *countp, float *ip); EXTERNL int nc_put_vara_double(int ncid, int varid, const size_t *startp, const size_t *countp, const double *op); EXTERNL int nc_get_vara_double(int ncid, int varid, const size_t *startp, const size_t *countp, double *ip); /* End {put,get}_vara */ /* Begin {put,get}_vars */ EXTERNL int nc_put_vars(int ncid, int varid, const size_t *start, const size_t *count, const ptrdiff_t *stride, const void * value); EXTERNL int nc_get_vars(int ncid, int varid, const size_t *start, const size_t *count, const ptrdiff_t *stride, void * value); EXTERNL int nc_put_vars_text(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const char *op); EXTERNL int nc_get_vars_text(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, char *ip); EXTERNL int nc_put_vars_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const unsigned char *op); EXTERNL int nc_get_vars_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, unsigned char *ip); EXTERNL int nc_put_vars_schar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const signed char *op); EXTERNL int nc_get_vars_schar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, signed char *ip); EXTERNL int nc_put_vars_short(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const short *op); EXTERNL int nc_get_vars_short(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, short *ip); EXTERNL int nc_put_vars_int(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const int *op); EXTERNL int nc_get_vars_int(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, int *ip); EXTERNL int nc_put_vars_long(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const long *op); EXTERNL int nc_get_vars_long(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, long *ip); EXTERNL int nc_put_vars_float(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const float *op); EXTERNL int nc_get_vars_float(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, float *ip); EXTERNL int nc_put_vars_double(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const double *op); EXTERNL int nc_get_vars_double(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, double *ip); /* End {put,get}_vars */ /* Begin {put,get}_varm */ EXTERNL int nc_put_varm(int ncid, int varid, const size_t *start, const size_t *count, const ptrdiff_t *stride, const ptrdiff_t *imapp, const void *value); EXTERNL int nc_get_varm(int ncid, int varid, const size_t *start, const size_t *count, const ptrdiff_t *stride, const ptrdiff_t *imapp, void *value); EXTERNL int nc_put_varm_text(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const char *op); EXTERNL int nc_get_varm_text(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, char *ip); EXTERNL int nc_put_varm_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const unsigned char *op); EXTERNL int nc_get_varm_uchar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, unsigned char *ip); EXTERNL int nc_put_varm_schar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const signed char *op); EXTERNL int nc_get_varm_schar(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, signed char *ip); EXTERNL int nc_put_varm_short(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const short *op); EXTERNL int nc_get_varm_short(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, short *ip); EXTERNL int nc_put_varm_int(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const int *op); EXTERNL int nc_get_varm_int(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, int *ip); EXTERNL int nc_put_varm_long(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const long *op); EXTERNL int nc_get_varm_long(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, long *ip); EXTERNL int nc_put_varm_float(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const float *op); EXTERNL int nc_get_varm_float(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, float *ip); EXTERNL int nc_put_varm_double(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t *imapp, const double *op); EXTERNL int nc_get_varm_double(int ncid, int varid, const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, const ptrdiff_t * imapp, double *ip); /* End {put,get}_varm */ /* Begin {put,get}_var */ EXTERNL int nc_put_var_text(int ncid, int varid, const char *op); EXTERNL int nc_get_var_text(int ncid, int varid, char *ip); EXTERNL int nc_put_var_uchar(int ncid, int varid, const unsigned char *op); EXTERNL int nc_get_var_uchar(int ncid, int varid, unsigned char *ip); EXTERNL int nc_put_var_schar(int ncid, int varid, const signed char *op); EXTERNL int nc_get_var_schar(int ncid, int varid, signed char *ip); EXTERNL int nc_put_var_short(int ncid, int varid, const short *op); EXTERNL int nc_get_var_short(int ncid, int varid, short *ip); EXTERNL int nc_put_var_int(int ncid, int varid, const int *op); EXTERNL int nc_get_var_int(int ncid, int varid, int *ip); EXTERNL int nc_put_var_long(int ncid, int varid, const long *op); EXTERNL int nc_get_var_long(int ncid, int varid, long *ip); EXTERNL int nc_put_var_float(int ncid, int varid, const float *op); EXTERNL int nc_get_var_float(int ncid, int varid, float *ip); EXTERNL int nc_put_var_double(int ncid, int varid, const double *op); EXTERNL int nc_get_var_double(int ncid, int varid, double *ip); #ifdef LOGGING #ifdef DEBUG EXTERNL void nc_exit(void); #endif /* This is only defined for netcdf-4 apparently */ #ifdef USE_NETCDF4 EXTERNL void nc_set_log_level(int new_level); /* Use this to turn off logging by calling nc_log_level(NC_TURN_OFF_LOGGING) */ #endif #define NC_TURN_OFF_LOGGING (-1) #else /* not LOGGING */ #define nc_set_log_level(e) #endif /* End {put,get}_var */ /* #ifdef _CRAYMPP */ /* * Public interfaces to better support * CRAY multi-processor systems like T3E. * A tip of the hat to NERSC. */ /* * It turns out we need to declare and define * these public interfaces on all platforms * or things get ugly working out the * FORTRAN interface. On !_CRAYMPP platforms, * these functions work as advertised, but you * can only use "processor element" 0. */ EXTERNL int nc__create_mp(const char *path, int cmode, size_t initialsz, int basepe, size_t *chunksizehintp, int *ncidp); EXTERNL int nc__open_mp(const char *path, int mode, int basepe, size_t *chunksizehintp, int *ncidp); EXTERNL int nc_delete(const char * path); EXTERNL int nc_delete_mp(const char * path, int basepe); EXTERNL int nc_set_base_pe(int ncid, int pe); EXTERNL int nc_inq_base_pe(int ncid, int *pe); /* #endif _CRAYMPP */ /* Begin v2.4 backward compatiblity */ /* * defining NO_NETCDF_2 to the preprocessor * turns off backward compatiblity declarations. */ #ifndef NO_NETCDF_2 /* * Backward compatible aliases */ #define FILL_BYTE NC_FILL_BYTE #define FILL_CHAR NC_FILL_CHAR #define FILL_SHORT NC_FILL_SHORT #define FILL_LONG NC_FILL_INT #define FILL_FLOAT NC_FILL_FLOAT #define FILL_DOUBLE NC_FILL_DOUBLE #define MAX_NC_DIMS NC_MAX_DIMS #define MAX_NC_ATTRS NC_MAX_ATTRS #define MAX_NC_VARS NC_MAX_VARS #define MAX_NC_NAME NC_MAX_NAME #define MAX_VAR_DIMS NC_MAX_VAR_DIMS /* * If and when 64 integer types become ubiquitous, * we would like to use NC_LONG for that. * For now, define for backward compatibility. */ #define NC_LONG NC_INT /* * Global error status */ EXTERNL int ncerr; #define NC_ENTOOL NC_EMAXNAME /* Backward compatibility */ #define NC_EXDR (-32) /* */ #define NC_SYSERR (-31) /* * Avoid use of this meaningless macro * Use sysconf(_SC_OPEN_MAX). */ #ifndef MAX_NC_OPEN #define MAX_NC_OPEN 32 #endif /* * Global options variable. * Used to determine behavior of error handler. */ #define NC_FATAL 1 #define NC_VERBOSE 2 EXTERNL int ncopts; /* default is (NC_FATAL | NC_VERBOSE) */ EXTERNL void nc_advise(const char *cdf_routine_name, int err, const char *fmt,...); /* * C data type corresponding to a netCDF NC_LONG argument, * a signed 32 bit object. * * This is the only thing in this file which architecture dependent. */ typedef int nclong; EXTERNL int nctypelen(nc_type datatype); EXTERNL int nccreate(const char* path, int cmode); EXTERNL int ncopen(const char* path, int mode); EXTERNL int ncsetfill(int ncid, int fillmode); EXTERNL int ncredef(int ncid); EXTERNL int ncendef(int ncid); EXTERNL int ncsync(int ncid); EXTERNL int ncabort(int ncid); EXTERNL int ncclose(int ncid); EXTERNL int ncinquire(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimp); EXTERNL int ncdimdef(int ncid, const char *name, long len); EXTERNL int ncdimid(int ncid, const char *name); EXTERNL int ncdiminq(int ncid, int dimid, char *name, long *lenp); EXTERNL int ncdimrename(int ncid, int dimid, const char *name); EXTERNL int ncattput(int ncid, int varid, const char *name, nc_type xtype, int len, const void *op); EXTERNL int ncattinq(int ncid, int varid, const char *name, nc_type *xtypep, int *lenp); EXTERNL int ncattget(int ncid, int varid, const char *name, void *ip); EXTERNL int ncattcopy(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); EXTERNL int ncattname(int ncid, int varid, int attnum, char *name); EXTERNL int ncattrename(int ncid, int varid, const char *name, const char *newname); EXTERNL int ncattdel(int ncid, int varid, const char *name); EXTERNL int ncvardef(int ncid, const char *name, nc_type xtype, int ndims, const int *dimidsp); EXTERNL int ncvarid(int ncid, const char *name); EXTERNL int ncvarinq(int ncid, int varid, char *name, nc_type *xtypep, int *ndimsp, int *dimidsp, int *nattsp); EXTERNL int ncvarput1(int ncid, int varid, const long *indexp, const void *op); EXTERNL int ncvarget1(int ncid, int varid, const long *indexp, void *ip); EXTERNL int ncvarput(int ncid, int varid, const long *startp, const long *countp, const void *op); EXTERNL int ncvarget(int ncid, int varid, const long *startp, const long *countp, void *ip); EXTERNL int ncvarputs(int ncid, int varid, const long *startp, const long *countp, const long *stridep, const void *op); EXTERNL int ncvargets(int ncid, int varid, const long *startp, const long *countp, const long *stridep, void *ip); EXTERNL int ncvarputg(int ncid, int varid, const long *startp, const long *countp, const long *stridep, const long *imapp, const void *op); EXTERNL int ncvargetg(int ncid, int varid, const long *startp, const long *countp, const long *stridep, const long *imapp, void *ip); EXTERNL int ncvarrename(int ncid, int varid, const char *name); EXTERNL int ncrecinq(int ncid, int *nrecvarsp, int *recvaridsp, long *recsizesp); EXTERNL int ncrecget(int ncid, long recnum, void **datap); EXTERNL int ncrecput(int ncid, long recnum, void *const *datap); /* End v2.4 backward compatiblity */ #endif /*!NO_NETCDF_2*/ #if defined(__cplusplus) } #endif #endif /* _NETCDF_ */ nco-4.5.4/doc/netcdf4.sh000077500000000000000000000055431264355130400147500ustar00rootroot00000000000000#!/bin/sh # Purpose: Install HDF5 and netCDF4 for use by NCO # Source: Updated from latest working stanza of ~zender/linux/sw/netcdf.txt #*********************************************************************** # 20060924: ashes.ess.uci.edu Debian Ubuntu 6.05 Dapper Drake gcc/g95 netcdf-4.0-alpha16 #*********************************************************************** cd ${DATA}/tmp wget -c ftp://ftp.ncsa.uiuc.edu/HDF/pub/outgoing/hdf5/snapshots/hdf5-1.7.51.tar.bz2 wget -c ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4/netcdf-4.0-alpha16.tar.gz sudo /bin/rm -r ${DATA}/tmp/hdf5-1.7.51 tar xvjf hdf5-1.7.51.tar.bz2 # Build HDF5 first ('make install' installs locally) cd ${DATA}/tmp/hdf5-1.7.51 make distclean bash # New shell level keeps environment variables sandboxed export GNU_TRP=`~/nco/autobld/config.guess` export CC='gcc' export CXX='g++' export CPPFLAGS='-DNDEBUG -DpgiFortran' export CFLAGS='-O -g' export FC='g95' export F90='g95' export FFLAGS='-O -g -fno-second-underscore' export F90FLAGS='-O -g -fno-second-underscore' # Install HDF5 and netCDF4 in same directory for easier paths export NETCDF4_ROOT=/usr/local/netcdf4 export HDF5_ROOT=${NETCDF4_ROOT} # HDF5 builds here unless otherwise specified # HDF5_ROOT=${DATA}/tmp/hdf5-1.7.51/hdf5 # Do not attempt to build Fortran interface because g95 not understood ./configure --prefix=${HDF5_ROOT} --disable-fortran make make check sudo make install # Do same for netcdf4 cd ${DATA}/tmp /bin/rm -r ${DATA}/tmp/netcdf-4.0-alpha16 sudo /bin/rm -r ${NETCDF4_ROOT}/include/netcdf.* ${NETCDF4_ROOT}/lib/libnetcdf.* tar -xzvf netcdf-4.0-alpha16.tar.gz cd ${DATA}/tmp/netcdf-4.0-alpha16 make distclean # Build parallel netCDF with LAM MPI CPPFLAGS='-I/usr/include/lam' ./configure --prefix=${NETCDF4_ROOT} --enable-netcdf-4 --disable-parallel --disable-shared --with-hdf5=${HDF5_ROOT} --disable-cxx --disable-f90 --disable-f77 > netcdf.configure.${GNU_TRP}.foo 2>&1 # Build parallel netCDF with MPICH2 MPI ./configure --prefix=${NETCDF4_ROOT} --enable-netcdf-4 --disable-parallel --disable-shared --with-hdf5=${HDF5_ROOT} --disable-cxx --disable-f90 --disable-f77 > netcdf.configure.${GNU_TRP}.foo 2>&1 make make check sudo make install exit # Return to previous shell level # NB: Fortran symbols do get munged into libnetcdf.a somehow sudo cp ${DATA}/tmp/netcdf-4.0-alpha16/libsrc4/.libs/libnetcdf.a /usr/local/netcdf4/lib/libnetcdf.a.gcc-g95 # netCDF4 Fortran90 interfaces not yet available #sudo cp ${DATA}/tmp/netcdf-4.0-alpha16/f90/typesizes.mod /usr/local/netcdf4/include/typesizes.mod.g95 #sudo cp ${DATA}/tmp/netcdf-4.0-alpha16/f90/netcdf.mod /usr/local/netcdf4/include/netcdf.mod.g95 make clean #*********************************************************************** # 20060924: ashes.ess.uci.edu Debian Ubuntu 6.05 Dapper Drake gcc/g95 netcdf-4.0-alpha16 #*********************************************************************** nco-4.5.4/doc/nsf.png000066400000000000000000001236761264355130400143660ustar00rootroot00000000000000‰PNG  IHDR¦¦ßêc IDATxœÜ½Y°mÇq%¶2«jg>wxó€‡ ‚ ¡&[)µZînµFw8ü!‡ýa‡v„ÿ¶¿ºÅþõ‡þs„á‡Ý²%‡Új·$k–HÑ' À{xó|§3í±ª2ý±Ï½ï>­  ÆS„+Î;ïÜ}÷Ù»veeVæÊ•uIUñ$š¬ÿW t·U¬$" ðxQ=¼t÷’ë R¨ Ä€Zn¾÷ÿ‹Ó÷ˆglÓFÏ?ýÿp¡!D Á †Pÿèý‰@XÀ@ XW¡:>ÒtøN?âµÿ5ûDî"pŒ~èó‡ø#ù¾ÿ: À" ‘YÁ|8)<ª‡ÎÖžYE•‰ºîÑZ8æØÕþzÊp4¹ zøáðWÇzûÄÛ¹9ƒàGO{¤â* @?Ê0ðÑ]:¥<kX<')óá Ëû×ÿ_ï¯3=…¨ý€¾ÑИ<<”ŽuÛüU÷þ+Ú1ywsŠÒÃË>šåŠüiO@äÝ#ɱA”Ã㎞ÒÐŽÛÔõ˜˜ÓŒ,€ˆ„À¶Y,nö³:'"بÎr'dØh÷ ÊÀGÑrèèét-rBÇMÝú‘ŸÌ’úþöñϯNÐÚ ^½â1Ù³‚V?â\Ï'ET mÓ] "d ¤!4Æ*ŒeHl°¸P ÂP†8¨ûC$Ñ ®-A ˆB bÀB-`ÿ&ŒûÇ,ò÷ÏããÖFXyaòÃßø‘¾h}%‚*xí9AE˜™ˆ!KuÚe˪Y³Û×Þ€ß[Ï¿#KtÔÓ! Ä@ ?ì¾ÃtÏÛa¬OÖªãIöÇ\•NÇR)âz(äÃÎÂÃIdŽn¥P@Èpç0ï5 6±\ŽÆÍòž±}¥Ö±‘`Åmdd­;ü×r¤*kF‡K ìú’‡Ö¾³rÓGw>bû˜Eþ~WüPœúþÓx=/ó¢÷ºëp7Ä–€¶)vîß}Û!VU•õˆ˜lb-Åz± ,Á´±ës8ìù‡t¯ôÐ÷'°ÝÓ*ÐxøÄD*Ž'â+µH½Æ£ˆ¼­À¨é–PAÛÆö#Þd}Y>šÄ1( ÐVÐV@™¦Ë¦¾Ý4»“QòЦnAŠÁ@¾ÿõß…¬ëC÷¢u¤F?d7X|ŒmD€ê:t}2Ô£Ý=݃ܪ þÀöãl·a˜Hf{I‡µ‚Jðt%UÅù˜R†MMö‘g¡>nK¬a ;G`¦áNjg+‚D! eD•A”°-±œ)±p™eã œ¤bŒ “f@ô€/-ÍVßþf~öþ2BÒ†a?;ýÖ²¿f£} ÙÎ6šà­u¬€Äwæ7‹¢HÓ“Ãѧ“ÞE`¬5þðíèäÈ‹“õRj`èêÍýÙwf{ïäRÙØBZÕ¡&R¿ÕνðÌóùÓ 4H«Æ6Ê1è(¡½K ´Æ ¬Ú4M Ã(BÕº´Ý÷Ïþ×[ï}íÔéi4};xêùÏý"'g)ÙÒôб}ìóK"u±rŒÊ@ wn\ÿ‹UõF—g¯/fïK  þCÒ÷ÝëØçØ  <ÃâÊÃ{¯ÍöÞá83µPËb²w(ªÕMÄ PX-!%äɇžÆ@€,O ƒ€ºn\AK×QßøÌó£I>åíåÞÕo}ýÉFüÿΰ³Iz¾&Ž„ØÎf×] {•faU@å!ÚûHœµ ÿP½ú`¥ ªA¡“÷lÿûm}Ëa™%Œš, Dª†"PôÜþüáwGmCýsèMC‡QÛ€’ç½—•wÎ9 BSåY–8¸|íµßõ«Û¥Ÿ×u½9}jíîj~ÂÞ:ð¤0vˆ­ $“ZKÖæñsÒ¶—¦"‹ùìÝÁÄ›ä<`ÿ:½âÎS¦Àiöeõ΃‡¯†êë>#¨H@ª DÖ@T¶uyïv¹¿÷`´ñÔ`r6œEv!I† Æ0Ì]÷A¥IM*€Ùw¾úÛC~ ÍB¥=}âôýÆ ²ŸýÅ_ùÁÙ?v‘ÇØ¢¤l(€”ÝÖxòìþ½÷bHˆÄ%¢²Xù«Ñ.ÆÓÆP§è®=2Žk­Ú>”xcïà»EùƒD  -”IŒWŽ¢-¢aqf¨ÙÞHf‹û±­æ;÷wºéÖ3'/þmä“@ÿG퇂bçó¢¶fˆúY%ËùSgέöw{P™$é ÐêŽb÷'Ö>v‘cP "DÉVˆã4=eÍPÃ[ü¢AÓé Z`õî~Ç%»Þß =à”È+³MÓ¼ …P)¤ÌB^}‘¤i’®¤jʃúÎ|ow–¼üsÿ!08+8h ê@â£ü(ãiäÙÕõïÿåÿã⢜ßR¹\•.Ëæ”m>õôßúpS }Âî:>výPçr Z`ܼùÞBonNm[·¾I–¶!÷tv{ûå$} ˜@Ç1$ÄLB ¡m\b¬±Ðîê @éå®ãXÜyï»ÕÁýÄ–Æ-¼."¼1ÁI£N)u6ˆW( 2šá@¤QI]21ÔØé@0Ø«µ³±uâÒË?wa ÞF´ê’Jƒ!n¥M9Ó(i׫6ÂÔ »h®\yõ7cõ Ù_m²ºØKrS=¨FgŸùwÎæçO½Gý'¶¼v퉮‡(# aXBlŒ¦—Úf%ºP´†½Ñ˜Z)—Wwï7yv7IÏôò &Ý:ÒugÄå²NšQD¬ÁD„»7¿S×÷­.¥Ú¥<»ÅjÔrQ {½4%ÁSdRX€„U ‚  ;ÛK™†bý|«—­ê¦Þ½uõë×ëfl“3ŸxéKØ8CQÁ–É ‡aø l@*ûw®^ùË­ÕþÛÛ#›%B¡5,Ê–R7èŸÞ>÷<Ò“€Q29.ýÈíã9  Î 0€ û§gíµ¢Ú³¤6e@HÚÌŠ¯o¬$ɵ8¾>b0¦7dåg÷öönUõÌpýÊ¥"¡¤ÔO9X•¶ÞÛY²É£d°©Š÷¾I³hŒ´uÅÜ0:4†$BÞÚÔãIÔh™T !„„›mZâÌV ´³«o½$V¡p.ј¤Éð™gv>ÜÛ¿›ç©*Cdµ|0¢ï8á$hl[—K$å$KÆÙæh&jŸ´´|üû#€±^éXƒèÅ課öáœóÞkô½ÄDö-×A–«ùƒ¦|͈´W¬ZV8KÆ4ÁÏ}»Ÿr›8RãqlxQû8á±½¦qmdg2fò,“ Ì,ëå¾B$‘ŠÊ‹é˜(åô—-ʽv¾ÊÓ¶N÷¬iúX%jBkM“•wvµX$Í~®¨|ÖëO2¤Æ…Ø”K Á%ÖuKÛ¥”@­÷J =ù(í h¹e5…zKn2èo6M_°ò!„K&4-CS爗elæÊkú¹¡‚zOˆ© &-H‹,P¯ñÓ”M¿b³d4Þn]@zbÁfó;ßÜ¿ÿFÕîg.ETV‘õ\ìòo,p ~Õr2<7œ0Ξ9u”ï,öîU‘ I„ \ÚBwã¾f ­Ëzñðz’ØÍ±i†# RT-bí,gɬªˆ6l´¬kh„ùoDÉŸ„ã@fI}ÍB# Êz“M˜ÖUY7-‘K\¦McKÙ¡gmˆ"±„´Ö1¨…*[CJ؇´õyбq§Ï\xƒS€ÀGÐ)Ä4K‡²{¿.‹4U Ѻ¢C³ Ãó?5¹ð¤›h#’>ÔúÄS§ªˆBõàÆÛ_ÙðÖb^M{ÈØ‚(„&ÏSÀWEiPk‘3±Kr"£!Ʋͳ<4€UÀ;›¶óÄsi;úÖ3‡­K3ØŽr$DÊJ)Q*’ØÌúŠB &K좨hyÃ^­(l«6´½¦™X3tÉæùOþ406€T Ä¬B‘’*,mdà ƒÉùýêné—9@* @jVe¡¬¬²‹g>‹äYè EƒþY­ö)³pÙ:9Ûß¾øÒé‹?V½ñç¿IY½\>´\é —Ü–E$ r—‘’‡kÚ¶E+!8ÎV&>8KÔ  `Ó“N—üZ®‡\—#ÃNÝ?hWËÕ~Y®ˆMâ,$mš:! º&X‘ÀÎ$Í’Ø“©N¡'zùöÖô’™\±ML2m"û’Ô2ÄGµ !(`àˆFÛÛç›Õ›ìW€Ö4NêP$Y>F :Xͨ?é ¡m;Pï¤h ˜(d ý&˜4ÑOÿÿõ+ßýÓùüºcªUêH[ãP´Ñá Ly6襦ºªò´×¶-$JhVz©á'šPéÚÇ/òC2oã%uG‡R#1­/½o†ÃÔû³~Û‚-Y¤*L䌱‘ʲm’¼Wµ´,“Ñð♋_N9Bq ”k,†XQ(ijîMgû§¦„¨ Lëüz—u•¦i ê`Òï’ö®VbBÔq-¬¡.ØLò.vè#>ûcCØý·ÿü7çÅíÔPY-[#Ù°H5Pc SËiQK6È0ßÇö¹Ør9¼÷Î9ª8„ªªòüCC?bûxWÅ#§µ|è¸ 0Z¨4ƲªŠU‰Žh-Ôiûš·ÊU æÉÆÆ ››/ç“¢`Í!®»Œv7TÀІNû ‡ý<Б±fÞu,4 IÊ€Â@ ÝKˆ1²tø4ªPuÐM¸sÀö'æWýib “ £æ¬ÝC&e€I ÀÌ&Ïóº)n^{ÍÒ¸u^Ö#"Ç1±OÞøøÑ>|'6×¹AnE¯µÚ) AE@­hÝ +!0¦Æ 1H !ÍÍéíég’ìyèvy §Kéˆi³fºZDƒ(ÓÙF]º$ •ÇkUI…]„Õ:ª¤®‡žÖ\ºØÑ˜$ëô¢©™ˆýP+$8’ŽÜÄ êÞu²‹¦-Õ4^êÅò(ÒÖ€™™@Œ­ÜñØ>^‘w0ØÝŒÎGm€Õ²¼ÃÂpl9€#‚"Á„¡FlB}ƒ>Ì@mqHM¤Çn 0Ž˜ ±…6—/¿ÙúR9¢$JPÐÚQdxu\ìB=Dàõ…àHÿ(b!qв€Êå¯}¥©+‰^¤«‡2¤Ì îÞ@­P¤V´ÎzÆJ‹{Ð2MÄ·u§ßDÄÌ!UýXQð'"DDE¤µ­VP mnåMÕ9SC1lÀ (±ÐšSN ìšV‹U7-Òµ" ÖRäÃB#ƒà`-'b8ˆºë¸£Ê…¢@¦¢lŽöV¹¼nm™%IŒ %¨…hÇœPj¢–.‰£Ô†¦xpãí¯Ç‡¯{Ψˆ¬'=³1}&·nO@äl` H *Ýp7Úîå-²­5K¢€(AHtMeZ›I!Vß_®î"ìƒ}§ÍUlQ#໘!^pð1x å&a¢¨¬¢tÈ~^ËÛyÕr¶ õP1@GyS=äÛ¯iÈF`¥[£Ú°@}íÝoüÖ©mX-R›&„Cwq@€ •bÆ&²JëÕÎÛ7ßú#ÌÞ‚i:1wR'ú¸©i»È™Ô1:V´:˜ß,ê;̳$©  )˜’4Æ(…cd‰„HFa &©`÷WÍå²|˜B„Œ ‚¬S™Pˆvr…åÔ(€€bgÀH§bIêÓdM£–Ñ8烟ƒï°³.žcÀDØî¥p¬â@ÍþÞµ¿Ü½û-îZÒE.•+5ŠGÀ#!ÕJ㜷CGɲÞÿλßþ—añ3ÙsUõÞŒ"ù¡#‡>êQ1ð£ƒ𥥖qf¡Ð;EqÙ‡‡lvVÔt‘Lð&ËjH»r= sÜY"K’[ë‚÷÷Êò ôaÏi“› ÇxÒ‡] °AµØ¹s9Ô{hCV‰"ú­n·rÒc(˜z)[4ਠ±Ó4A×ls9¤Ü¬Ø´D{gçþ›çÎöwz½^Ó4B9DŽB”C$xÊ+ž¬tÓ»S¦Ê#©V••²o–aõÞßþ½fqÚ¨÷Q6ƺ÷ã3Ç+»ý|\dñWIŠ;u}öZKÖÊñƒpéÇfCŒÚýJ1v_ ± 1xoL ½9ßý ãàa–;Õ¾/."ÍÒm SÓ G y¯¾±Nµ”¨i›Æ¢ÔúÖÎÍ?®Yª¨ ¢>Z'廸NB—?aFn‹ëlçÆµ61I6PÚ:÷™ÿàÂçÿó¿8k&I¶%Ú&&¡EœAç ÐQ1—EEw«ºÀt :À·®ÿ|\® ?˜\ MØÚsh!6qû³½þ0 Ö-°Y¥Ÿxþçÿ ¿ùÙ=ž¬xÐRž¸ÜÁg²gÊï¥ÃȪ–ìá@‹v–^»Z4!¶ˆ«PÉñá_’®ÞMÛˆØ}{-Á>@äæË¿öåõ¬yTY¢ëÙ€Ã#ëÀ†ÖUʸé‘ÇL!ĆŽ}±«&Õ”aLc¶ûÚjõ–K cœI] ÜÜ|n´ù\/=áÃQ›zÅ$D‘ɰ1- UUcYBÚîïÝ51$2 t‚¡„É0u›(!*,Èøh–l÷ЇßÌì<úºiãÁRŸêo}Ø ûe9kVw­zÇI]iôI>9$O’@pÎ­Š•I,5tÉí9ÊËïüůS¼³9M›zZ%(qh|aóÔkÈ“”Ô¬J?¯’áÖ+/~þ!êÄÉK§žº´Z.îݾÍS§Æª Ü¿òÞ‰g^Dpd{LhBËÆtÕ6×A6 (33Ìc1ÊÚÏ%€É0ˆÁª*DÜy?ì¢oX |LöëzYÿÌóaíê±jYZO(æõ¹ªPa"PàÄ˜Åæj±|£¨®ƒ1£ºvY~f49kÍVšo$vzb·xø—^v)„4Í4ê 4Jp–™Eb#‘Y±¼"!Ÿ²§Ñs¤#ÖÎ,±¥bÀ2LbÁ’ xCÖ¦#ŸN7N¿ˆh`ŒëoÙlc¹—÷}ËI{pp}#ý’i<)@¡56É}¼¢…©Q߸ñ½ß&sƒ¥’RaX›Æ[CY>xŠmÛÚ¼7|öÌgƧùsв `øìË.Ñ<·–ÍMÇM•¯o~ýÿoâWÿKD Îó^¿{”#i1ÚµVol7Âæ°ø­›ð!f@Yɪ(bþ–ùŸ¬Ëâ©&iÇC¦ãØøa©H%(¢åØt˵¬±)éB[˜ÉÚ\ÙÝ}µ¨ßuií’´m{Yri:y)|Ú¦!Ð h “X®WÕ¾J:£*"‘ ªš%=VcL,Cjc¤©Eµ'°9¤F½YQ`‰pou÷Û¤K%†ä£—úÛŸUÞzN#”mµ*—%éôÔ3”œzÙ Sv(¤Llâê­7ÿààÞwGiIq©Ò&1ŠD°1Þ×–Gél?õù_qÓ§ lµl“´—OŸ™nnU»·¿·µ‘íÞ»9o\_ 0P£D­´ÊÄÜéœÈr7ûß/s~Ì’Ó‘ÂR6ÕnU`¹ƒºv Å»T€Ö@:­o®ö^]­ÞÍÒ"M„4±gOz|Ø€æë™Ô)ê€QtIÍF㨒Š!dŒ>ñ¸¬ÒUé$æ‰Ë“$@wv÷_ß?x=¶×¸A„k"50-h6_ÞjQ°ùôäÓè&™¢@n» ¹Pâ}ËZ/önU?·Ýà ³H]âêíWÿïjÿû'§Þ™zãÄ©:ögõ0^JGç*I¢hbÓÜ BÃU#Êùæ™ç =À*u€P;•[nãÓ/ýä¿;Ü|q¶bÑVÞÓ{¯þúÞö¡ cjCmð-ˆ¨Ã®9ÂF8…ZhGêò)·)JƒÊÂû¶ìÊéÛðÁžùò¯ýÓCÛбE;'Ï®ÞÓm« ÔYòcºÒM7C° p9ÕR]/ö¿¹\½It`SghšeOO&Ÿ¥äYÄ8×ÃäIÔH$DÀìx5¿ß¶³ÔF•5J=6›ÏD —$ 4D©Á¡ ulCʉIF@˜¨† VÀõƒ×ÙÍ=ÅÖlÿÔßCÜõ@¤‰5h+øåêá{Œ]HéØäéxÜ?Cù†A°ÕZ ½zóÍß;¸ýµ­~1Ìt¾{òþ"Ͷ^|îó?7¼øüjg'4³Ô«šXE Ýzæ³?ìDݬø‚1Öf›7­é³ëo>{ïÆíšÑÀíÝ¿5蹫ïl?}«=dŽ 38" „öP6‡ö(Gå’hÙ,î"¬\b›0 @døýjn¾üO¾ÜQíx@†:‘ˆB , PB·Ã<'(wgÁRçé@ xš‡úöbõƒªx#IWI’´måôÖæ+Hž uή×%ª:Ç’‰¯Ðc@óÙͶÞÏS/R«0q¿ ÃáÙWz“g{ùÆ|Ö”•$Í’^?©ËU±˜Ä~žÂe„Ü2ƒ ²{ðð[;_ŸŒ\ä|N<ý“Àœ·¾5ư297=¸ýb-Q²l|ï^±yáYˆcRЊ+—_ÿíÙ½WÏnIjýlVp²=Éæ —^ú{¦w7/¿cdžhã›`“ŒÒ~%ÃSŸúY`ÔãÞ±#‰ma|#6Ÿ<YZ’H&uÛ.½œ…l ÃuN€c¥:pyoÚú‡i‚È‘­©ZrèÔ<(NjBR­®¯V»‚¥³Ú47î_ù“S'­=⸸›½~FŽÍÖxsûÜsHœb¡HÐY2"6 PáÌ /iØ[•ûl|ÎauðÞ÷þU³xw<ŽÉ ­Cº³OŸÿô ŸÿyжÇ@0|Ú?uéùÏ]Ÿ½q×8.Û¦ C ôUL¶ñaH†D°p¼ ­.½ð3}cgÞ–Øö2d½tïöko­ÃÉ¥ó/ÿF›„€6ÂNm ÄüÁÛßøêìÁ,ÚòN? ‰kî]y-xóò/G6P¶aœ¼Ÿs¤å ¸G„Dõ&ÂýÙì5ŵÉFe1/W³æÞƒÞɧo}ÀR˜®j°…/¤Ú¯êûE}¯÷…ÆT.‘»™ Nq~2í¼Å(jŒP·éÃ:Åa*1p£ñÉÝoÚ$*; mLDªèÁ¹ÑóÓl2åO>¸ñÝÙòúx(‰ Uyç`ïkÓtŽ|zÿÆW«ý#–E>ÂîW lá€p ´Àâ.’Úº¸Z,óž)«÷\ÁæÖÞÕËW´¸5黲¨ÊÖln~êÄSOœûqà9Àµ­º„cÝ"úã,ë·+¤™mKe³ ߇é« C £'íÖabˆ+˜t‚S/ŸX\OÍ¥P,P½sóÌ Ÿc¹³9qÓa¾8Xó½âí¯ÌKɲÄGi½‰b©eMlm©IM˜ïßíe4dºØYîý V_̆¦rà’ͧÏâ§1ú4p6”–{&±`À0Cöúº!Z±ÊùÖö3À二Êc°Žt  FX‚é³gž?¸3S] T=ÃKë\ˆ¥i[ÑF€s“Ó³Ù¬©ŽìtlxHâ‹ùlo8™ÌVmí{›ƒM°Hã ›}@å±Y ÇÐ@ÛX”RL hÅRL’õ 1BXŠ˜àÕÓÀû~ŒAd7*k@¢ &xÇf”ç'ÙM« ‚1]@ÉXc…݈BÖÕ~q{*É7E ‘;îwBvDH Z7þäÓÙxwg\Ì¿Cá!ô nÎnµµßg4²à$6`f’±qÉX¡$H‚¨M(‚¶I¯o©ar‹ƒ½èFÈøÓ£rVKšn^<ý·8‡ØR›¢m$€ÐÕõ·¿-~ɬI::wá3àñÑ <ˆ wÕtëH¸ó­Zß MÑ&È6ξð…jq¥Zî³¾†¦©–DÖ¨é;ÒØˆªïRɧyðÅjq¦©KòEÓÛ«’KŸüâÓŸûY¤SPÒËòV> þ鸖uELÉ(˶«â”h¢²YQb¥­ ÅÔ1,×$m•°¡~¯aÓa €Ä%†ŒAßËV/»L‡C‘€Ç¶#A×¢$†SªéèÂlöR†¤éâ ‡üÔp¨‘¦Ó®^¨w©Ûßßœ²I±ùà„r~PÔJàØVµd%¦¤âLÍ ×W²Ž}¿?¡Pû«¦^öz½¶ðE³BRÃ4 17"ç•]×óùqÒ&† ¬uØ<Íe퟈j7× ]Ýx 4Ð(§6Ãö6’¤1ÕvœgL`v³ùª¹3iÚ›­VQ%Mû"3›4o4›GGÙùáäüÓ_ø%L/B][7I¯GQ‰qLù§ï9¤0^oô‰ÞhñÖÎÝoÌçïXKy?kª•–ˆÈh«±e²‰KÚ¶UU ˜aÁÖqiâÛ“Î^&ˆ  ˆí£yFPxX»Šµ5Ô7l\œ¼©bC£;ØÇ3ZÀ‘(@-è>–ïìì_.VïjsÕHb‹ìfÖ;Y «9¶>·'oÞi¾õúݽExçên«±ñEãkCÙæ$?*;¹áÆ=»5žL‡½ gGývO«‡£Þæbµ;H¿;»µøöï÷&.>ÿSÀºaì)€˜»= <'­Ja2oHj_®÷j^7áGÅÈ*c{(ؤPØ4ŠÕýÛ‹¶pήñ4_Tù0…ëcJß.õhc»(Še! ãÒU°•Eÿ©/ýêrˆÞ)ïÉ%.éPgp˜õý@ÃŽ9ëÎ0DŒ`‚¥íSm„Va÷`çÎö(‰¾V1Ìœ™TH£*C@ƒVÚˆÊ- БȎ12 ù‡|8÷µ³FÁÂÔ0R9€xg[ "I4Á¼íÝ}û#íùXE—_’U3)êA&oß¼}ýá­ƒe”prw/ïZ]…ñ*>§Î©m¼6ÒúÕ<‚ûK±XMǺš_ÝH¹¼²Ñ‹ÿþ¿ý‹ãÑôAý O{.1MSÌ®¿V-v“ôÄÓ/ÿ  í#é#zX“¬Ê:ÉŒ1£få ûÿ3„ CA„ˆõLU²¶,ŒÖÀ1¨Í`v¾û/ÿ·òàÚÖOeeáuÛôòTÚ2%Òè…‚’&†BYöò¼,½nœõÉð§~á?…;L.Ö¬…7˜L¦Öã" ŠyÔb¯Ñ÷ho@¡œ¿JíJš2K¢h AˆQ‚UtXvÄx Ò(Åòrh÷‹,†Üfâ]¯" Xêü8BÇ9¥Ž–œ0”àÃã(,Zw®cûô\Bvn}Ó‡÷… Åmmœzéþ•ê7þ¯ï¾}£($Yµƒ±=‘¦¡û¾iGyj“i8D´Q™Ù8vB*‘ÊÒû6*/'“ÞÖæ@°ôHêj1¾\­¾¿ûõo½û̉É/üô+ÏyQýNQÝN]H¬ì¿ûÇ'>“ç¡õd˜ÓkÛÄË&hbÄ­SÖ ©j ©l˜Žà+”÷¾ÿí?@yÃÖ÷žÝ´M¹¿Z¬†ÃAŒ^i]`±Nu)M'c4IìƒzúôNh.Ç5Å¿nKóå_ûòãR_#ë8ʶRÇ… Ôdy/kŠ*6^¤$.‰Z%”¢ˆjTŠQQ‘¨QER›Ç6ÔÕ·3èÒ™’LM¨‰ºŒ×±*bcÖ[æƒ@Hd°%uuE±Ð&:âþÉéÎͯ=Øùêþü­ÓçNµÚ¿µ›¬ÂÖŸ~ã¯~û]îŸX´råÖÍÞ¨#ƒñ Ÿe.Iý©ˆÛÙÝß;X˜´¯ ÀÎ-RRG0†yv0kJ¯bä¶ŽˆälšY»{ÿÁÆøDݤü•ׯÝZ·ž:yþ«ªö¡<8¸YÌ®¸åÕÔì/ûæ »úŸ6Sãê† 0Jä‰4ªÉÌ àŠ·o¾ñ¾õíßh—·Üü¾ñ»I\ RcA¢œå½Z¼©²€H¹£›”Ø0¹ùA™ŽNÛg?÷“¿Œþ9ÄdˆAYú€°ðý"?3p Œ_'Œ™àY?@IuÁ\2‘£UµeUV!U(C»¤;2cI£J£Z©,ëjgypo¶{k´9V¨EP@ÄDOÌðÆ6À|÷Áw£ßŸz¾)¸]ìÜR[S’Ù˜7“o¾µû­7ïÞÞ­5™Po¼yúÂÉsZqÉ™Ógƒ Ä…è–Kß6fºyÒ¦}¢DĨF XkØ9;ŽÛ¦ŽQ‡Ù0K2V¨•ðÔù »»«&fÂÃ*dñ­7¥ß>}¦Ÿ§ãa ¿¸wûí,.Ô긱ž;qîæ”#&j„]$s„;~ï+¯ÿѵ×ÿhÿÆwV_£æ^³Úe85qÚ”¡jMÀÆ«DxÅšUFjH ÄdšZêš›—žûñ_ÆöóÐ (ëRG=FszŸaÌ ^@‡ÛH+@0@ dœN†#+qÇ·K¢VÕ ZgSQŠŒÀ°‡)„º© Ô9" Mlvƒ8‰ööå«©1yÖßΦý  t€v`ÑPÑQÖÙôGƒ­ÅþõQrûÖeuÛ'μ4Ø|î·ï;ß¿|»TWQ¶yö,çÃYÓË{§Æ§g+]­Vïõûã´·Y–í¢Úi£oœD^*|*•$F(tY”Uá5šºOɸ×ïÙ¶=X,VWç·ýÑp´}óö}²hO|ïzýú[öó_zñ¹Óù³§.™àó"cI˜š¯|ñç@'¡tì€ <¸üö›_«Š»Y†4éU{® “A’¤=ÎlÚªZ”s“«0uÝ®Ú:É™¯³ã‡^ E±®ß >{ò9`ÒÖ”dë›Id½ið¡Éþ!©÷Øùør£ª3˜»™ÀkPVaÜy6Û1ÞJ 5ê 1‘‚"Q$UR«°Lª¤ %C†™Ak"²©acêp ‘|Hüâ^YÜ jìÅ6¿ô—(IlÝÁâÃ~9çŒK\:Ý<ý9oÏ_½ÛûÆó½ÒeÓñäÄV!ºÜY%ý©ËÆm›0÷÷÷æÎ.«íl0„.‹ÕîÁ|ÞÌ•cQÕAˆLjØD‚2‘Šª Æ=ŠþîÝ»ûûráÜd0èùl€$«Ú¦ÜŸS’‰K[ŸÝ›7ièÿOÿüOŸ?;üÕ_üâgž}fùðrÛΧ}ªò úÀß¾òÞ¾ë«ÔUƒA‹âF ª…$Oвa‹~¬Š Kbäј$m³qÎù$e<#2œ*¬Äë@Z™lÚ4æÁ¬ù´TÒ$ï‘îé÷‹ǽ;fñ"î( ¢ $‚“ͼw¦.®“´Ì^ÙÝŸèÊϺi²þ‹œU±*Pa 0Zb±.˜„…0ÂÖ¨£›ï¾Ñ¶ “õz'NŸÿ4às /Ùdûé{›¼ÿ">ûöÕÕïüùׯϛ^ùÜþl±;¯{ƒa¿ñ½+ŸÎŸ~ú3m½7ÈÏ,—¼*iÚ(ÙU‘ˆÙl#·Í¼õ"ÆZËD,j…!Ÿ}éÅÐ,ŠÅÞšï-–{D9`]6Œ¨›¦Þçu]sÆ¡5éèäÞºÚ´mþç׫]Ø:1L­fEŸŠ·~÷Ÿ½q:¢ùœ|Q‡U®¹ +g¬&&)9cØÆº 5–~8™H41˜24“Á ¯5PUˆe( ¡£"a߆UÎ>õ8õ»} ÍÚdz|´=Æ¿FðöñCH­eíB¨Âpg³MÖßJS´KCeTQø+1jb·$hTˆBK¢JˆØ1„ "Mä¤u"N¢mc€ÔÐVшzçL ¶˜Ý»_í„›zgº=½uÿ`8ýÔ©‹_üõÝ¿üþµÒ&Ÿxå•klNNžºpêÞ½{7oÝ žÜÙ)?ðµ{›uPA Ñ€8Ës›š}Þ³uS¶UT…úЪ¶–šªÅÃA.Ï¿p¶šåû{M[9›6m`ãDV–ɨŒ²ÙA[¶þÒ ŸËû³×ÞPË}æ÷+º‘1ÿÀÝf£ xQƒ®¯b5ªŸ÷ݲª\6¨›µªê›ÊXŸåDb°µ—XcLÛ4kM¿¨ ql“ iÓÕj5§.k®¥™c®êªœöò¨ Ú›£^¿Ii¾n¾dG/ü7ÿÃo]¾;Û¸t.–ˇó‡ùpœ¶®Ýܹsëîx´ñÊg?UñÖ½^Ò— Ž`\ÊÖ¶N̪¬UÙpjœ>ˆMœ’S¡E9ÛÞì=x/H zY­–úƸ»;Ãa?KMhÊX³ÕÁxkº³{`{ýeÓn=õ‰Û˽ÿñÿø“¿û…Kç O'fáëE¢ñÙ0ßÝ-zÓSMÈ—Z{Œæm1n¾ü?…ñ)Ô<…î¾ó›ÿØá޵‰"¦ûPÂ"ªµÙø`¿õuÐßnÛV°öúE±“ÂXcˆ„;uÈ}÷§=:b €5ƒæýiñÇDŽŽÙ;Á{g´Iäà}ë‹Z„lï`Žày2vÎWm(›¶¾m¡>„*„¨HY&ÆlŸ~îKÀÐG¨a)î®VÔ4 bÙ™zyÇQ -ïÞ{Ø›œIçLÿÙù‡¯]¾?O6¦÷ç÷7OŸ:}úù?úÃo¤YiŒÛ:qò©‹çΞ:[î¹ìι¨Ë„Ø&!ªø†IÉQLY´}•÷JUTCÓè`86´ê=ÑÆ&ÿ[ïn[VÕ‰þÆ +îxò97×­L%²`+‚ ¨(¢–ÁDƒ¡õéó Ýò”~mx­ò >L(`‹¶¢ðè$(hQTAUYܺ9œ´ó^a®ÆûcŸ[u«à|ëýío}ßÙßškŒ9Ç¿@ŠEeª´vÖÚ,jE:+˺®l’µ )âŽÒùhïü§>¿%Ýgݾ¦„\S¢Ñw|ß–P)ÈI Š2Z´šYä™Ê‚°Æ•µµ¤”ˆR¨ö#—æ‡ß‡•[¾öyÐtêÃï­ë‡8h’‚á½3¸rGoAbF ˆƒUçƒMö«´bYýj!›5{Á‘@šd&8©úäVWW¯ï¯^ÆpûÁÙìœÀLEóÉd®¨‰"§„ȳTªåVûftî!t@ dÕ¢µvìÖ‰ ºŒãg‹sŸ.9qÛÜ-¯ÿÚ·ÿùÇ?ûà•™ç•L$”xvÎ]ÍËÙÒJoóÈÚ¡£Ë™¶Q'åÛDQIå< nyEé%D’XXXAäÙ)C ¢œWµ„ÌdT“«IIvÙ'©fjÒM#„îªÖJ¡1“éÌN;qJ¼¼=œ|öþIá9·GíXéÈó9L ZE~”À•ˆ$X1ÒÚiAˆ¥EµÇ¡¬Ê„QÉH—A–µ¨)Y¿éé7Þñ|Ñ» – êëŸÿ½~èw „à½+ΜyðÄÑç0‚àkt®ÎJTÐWôØ8v\Mü×®=]3Í~[I&ÍôLƒ4ªZTMïÄÍßš&'¡C,§Õ^«ïA“É,–ˆ5G1‚·¦¶óŒéåË7+ð¹CÄBBn!tຈŅ/}¨áqa\Ãýléiù{îyh‡²nÜI„¦4•ñ®Q·ÞzG´¹µtäÈRžQðESžµ´’eÙ˜Ú(‹“$R‘”Z )µ‡DÌ‹Qž`!€ÓXcfÓQ¤U¥¶i‚gdJˬg3™”„Hë´¨Üh8¯Ë0ŸÖãý¹­›N·›æÙ¼š_¹ram5ßÜ\®ê!í^š¯Ýò,`Ù6J&‰÷EˆÊÊf“½xïGÿ¬+÷t˜ Å2J,ÇEZù‰'¿èû)9±^•Ð:3Û§`W ²$œõ—8rÇs='DŠá ¡ ‹¾}àƒnŠzBH«Ç¿Ox#®…Fœìˆ%¨@)É7F9×KZ'-z¾êıeH[=Êœ•Myº±N*âÀ‘Ö‚ïjT¤+P1åÙS‘ÔRzwqR_Ì’°zì®8{Ò§ï)ÿþ£¬œ86šl÷×Û­Då<Ž“¥5•wª²¥v·ÕnCÊ2M£Nž¤ñÒêòá<ß>sfg^¸4‹BàbVzë4 -a!¼  à‰ˆB3·ö3g\h´ÞÈã˜-Ï켪 oêf4jLÕÒ4ëÉhZiÖë¶c y'jÓ”6„|ìÔ±£/ì©’PshPmê$†7RF€´MÝË"`wÁŽ˜7»i"ž–äUíè­[7<k·²ï¹¼;,×ú9B€^ºýÛ_{Ï{« EDV+Àkð°Ók[)Ô‘áñI[|EºÃôÑäÁÅ‚‹É¥3÷Ùf¸šNgJ/mnÝn³è©D1š,4™HŽ®~ ©Y‘†4»²0ìÍtvù™{`÷’<‚c4*N}ä#›ÇV§%ŸÙñçGêßû!ÙY/­wž›ªfë fª+³ßÊ|§E‘t±Kín¬RS»pèÈᕵ弓©TÊH©Hê(I’D+hÉZBÁ$˜ˆ‰¤T¹R=ÝÁûŽdGë¼2M§Ó±Ö+EÝ^ÖjÇ *x«“§©Î[je-];ÔMÛdlé¢lå¡Kö}ÿðù+CxèÀæ ŸüØ= bÛ€…­j­ <åÝ/]øÌ_÷İ•…8ÏOl¦º7lÝü¬=b½2C--ež0›—ÐmèÕ‚[ž$ §$kb„«s©GE"¯AÝ„íÔ¯²—?º´á‰§÷Çú´âÚ{(WÝÉ€ýÌ…¬“®A/)”Xh×é˜-€º«kO!N"5¨Šs"ŒÓ ŽÒ£¾ô'oùÆ(n)Hy@ °—Où½Y2ÙÞvP[ýä#žp.8Ï‘Èý­¦(íÜ%mí’ñêúš1µ¦:¦8Ui„Ü›hog¾?Ü×I·4 E‘€DKvˆµ³¡YÍÁk¡yƒ÷އ@Y­»j0h¤¨ÓØI-Ûí¨= ý¥ ì•Rê¥e!uìœfX! ÙH­ÀÇ­ÖZ÷ï>þé0M^ýÒgfISÙÐ>(£¸ ”ЀE}éþÏ} lÿÓz·±¾Ìl-7VŽÝvì¦aùÉàjd©öºýeQ7,šìë^þº{ÞóÓD¬€TÀMI\Ã>®*xœâÞ5A|•vø±Ýú+¨ä|͇Ú^GÁ‡Rt—6ú[7]¨ ^ HÀ:ë)ÄjÔºiuó+›ÏÌÓë+“•¡<8·=^=²Qú¢lfÓb ÝY"h°P:º²»&Bɪ$•-RÁYmä¥Ë£‹;ÜuZq"%X2B]—ãq,(‘R ÒBFRx)½Þ†¦j*É(/*\¼2Oæy+mšyšby9…¨æå@(ÓnÉ(rI²THåŠr4›MHpÇÎë|åð _*|²R;_Õ»÷}æýÀ.ØÀ3I‰ÙÞg?òžÉÞý›yU¬Úeh·–n¾á)/Ž6ï‚ïy£©Ðp¯·ì­qM}œQªc©í9á€H 45Ø<ÞMòÑõ~ÒöKî¯aŽ3 ÎÂã_‘›<Ä1 mð*ɧ%¦¹´…ˆA •D)(¥R‡°ª³›ݼ´ùìîò]Ó"r!¤zŽê¡‹÷¿æ\¤ ,œÄ¥‡Ï~(4&RËÞ÷ßõ®¨›¨×[M†i&=ÙÂHdémí9Šs%…–¬b¨H#¨zæ2íî /m‚ÎJ“^¿¬kIB9ÙSI›C.³A6>‘qp^Û‰upõt6hwÕ¬Úíöcš™±åiÖªŠyp6Š´16Ò „¦Dˆ¥$BeÛº%œHd¬¥LóñðbQÖUºùü÷%Eµ™äêòçþömÀ õÁC¹ØœÙè™:¸BvÎìÉõãÏ9ùԻѺ¾ !d &ˆHBÉTë G0¤ÏüÞŸb³¨ 34C çà ñ`J ˆ'´`K®žÅ ¾&ÏÎrð×D¹dA±GD‚â8^nwz¯KƒE«`ðB*µ9Â2âKËw®¬Ü!åÊd\¬-E*loŸù¸)҅¸v§áÇLZê¥/ŸÚˆ”™ˆII©”Xç¥V*Ž€@Ä~6/˜uu/^}ñ‹§†Ã2ÎúŽ•uBùÆûÆÎ&S×jeB¨ªlªÚ¥y+Š¢ÙlÖ¸°¹uxwoymõâö¥´Ê4=wéÒÚÚZ]×qyï˲lœã8k·´ÖMÓP`ffÄ Š,[†éuÒ¥õÕ¯]É_úõ?»áæ'_9÷H/1°ÛHçp—?õÞ·µä$Øé¼&«¶®»ãE+ÇþÚ7= ¼ð nïÕ8 ö@ ±T˜4I»Õlò…þÂŒà‚¿Ê=ãƒx_À)¿j”+‡Á«Çä1!\ÓwsB ! hpþÜçM=•„H.mº r)•pÍW‹E XæÀ$‚{¢uó²ÌDÐýûœ7BUûãûj4ÇÛ ’Êý³¡®…lïŒü§?wÿþˆóu%¥¬¬-çeÇJHâ@Ä8HïÉ«H'³N¾(¹¸39wf{dºë‡9¨$ÞZ¥”sAeɼž6ì¬CH3éDUU³é, t†Zíª$[µÞ{Ò³ªa%–WWªÆD‰† Ï¡q–„RH­¼÷MðZIp )„’R+f„ÀAÄòüÅËíV?I+Ú®g§}°–ó´wó“¿áåèÞÑaRu€]x«FòÑÐ /&™>[?r³ ¬”]ëEo£©ˆÃ ôø ü«ß]‡?þŽÀ°$=_’:’ ì Úí¶´Ú5œÔÕµª„rjë äMð@,‰î-K‡Ÿµoj¨CJJ5›ïÞ‹úŠ$ÇQÿ“ÿzf{T'fEå½·¥™ì[:‹H’ pMí‚5MS ûd·úÂÏìîBv¥¶6™\Ψª\9oÊb6›9•mŒ³½Vó(ÌØ IDATÒ£Ý §šrpŠ!Õ³NLÒW™ð;OS&„Hȵå-#oƒ$©H ÅwU¬L‹o´P±Šbi¡”P±Šç“jcuso”¦ÝÓçwã|e05½^o¹%;QUŽ/vò Ô§ôø­Ïû>tndN|€õ@@$¤„’HÉg2hò AƒcB¼à24T÷¦§?§ÛïI_íüëþ\°Ïžè¤_5Œ'HK\Ý9*œv¾ñ., !,0Û;ûO¹B¡Ò2Š£6(I²–”W»²Ð£Øø¦3,>’ެ ‡˜±Œøº#7~=E[uCàÀ~d«m¸™º¨“!‚h×yžçQ’©(T®eš%Ž…vÄ¢1Ë^pÙ`× ‡õtR7EåÊi(ÆÊ–Ído¼½M.Pàv–WEQÏÆãí3-QöŽ]©ý,—& “f|1 Óbÿô­GVO¬õÌtœ)ÅÖG$ÉWWT¡2Ò³ ë]Y“l·Ž}`ëCã¸qd=—v6m¬,BÑ4­•õ?ü“÷\Ü4Mm›:Ïó’šWïøŽ-L×S‹¡PZÑrá¼õ8 ±(§ÐBÿ0‹Hˠ´ž†(áçx4º€=BúêGvE¢¯Æw@ø…”$m—"@X  æâtr®sðu‰Xìþ.€ ™ƒÿt•êöh­HWåp Ðè+qtiãN„ªžŸå`°h¼zÏû?2®â4é 'ó#G–»{ÝN+Uz¾;bÎRG ]NÊÎ’ëôsõΜ˜2ÝZC:Ž'¾(¦ƒt½§d˜;t’ÖéÓÛZëÙhÿ†cëq[|÷Ý/í¬l|ÑÕ´ù’ïúÑ£ë¿ö«o°¯û‰_©ÌX°÷ )bÁ!¡b(!¸òà°x "&öyÛàÜ}¨WÛ¨¡ÖíÏ{Š~Ò?1iÐÕXdÆÓ>0Iék‚ð±©vcU$’átÞ×” ¯³Å%ä-P>6c\ULzÂ’’®Bª¯Æ·ÀŠ„ŠH lêóãý‡W\k¬)™,œ 8l€ð€\T|ð(Å£7 4DÐÆù8YÙ±7¹¼Þ[ÿò…Ñ’Î-Ui”Üú¢—"Ý-—¥Í2ͼ`è1ÀžýBŸ[ÈÇ€ ªÎ$b 1¨Ê‘îï~úË~h Ä‚¡&¸wµÛú¸U`õèLîR"µÂ‡ 0alïï?¤È-Š#­ec (B¬Q›ƒ€‚i¼¤‡$H磭BK…Q¬`ò®.“$1³:ãhsVÆI²RTιàmh‰bÒ1{ß,éþÿÀºº#JŒ¶Ç;ÛôÕÙŽ~óm¨<$CЊ0-`·ýöG._¹˜h¼áûŸ××h'‡¢×¾öòçw½ìM(£ÕŽŠ±G‡¦zÃø)‡fRŒ5"g½‚ Æ+H‚ O–}D ƒtla÷§—O}ìoQ àFí´’M¡È‘uc|B$R¦Ž£€hÑv6N8¸ƒ8Isë‘§1Á’Ÿ LŠ}s5½jbˆ¯è®Àõë 1Ê6J1‘¬…ÜÎ_ºòÉjüåÈòÈ7¾z͸#GïúnðuÖ¶EDWùF^ØÔ8öwû€qÓ}ÕM€~øà>ÝŽ«i`³?³I醴þáGÿÛG‡7Þù|o§Lo­.¿éûÉÃË‹ÓsN*5(æYÞÙ«§üèÿ¼0˜ÿóW&µª*Ž¡N,¯ô”ù_üAX‰ÿû·Þ½SÆwÇ'ŽúÙýæ­nò–¸4i~êß9môx0Nb˜ÍÞßûv ¤ ëñœ¿®µÜr¸tÇm×MvG?ÿÆ7­/¯¦2€óRÐw¿â{ʺžó,Ë´TÞ4ïï_¶³LÂø»žñÔþê†ñ‘3U;·ÆÝ}ÛF^*¶»»Uwõé*?vÓŸ…ÞF5œ¦+›@Œà èÔ7NÄ àþŽG>ük—¿ô>ìþ#ªМ†Ý…JáÉZ*+a¬fJ¤Š‰0ÜÍcY‚çš eä‚ @ý<®ÆW°{\*3(† ÊÙ@_m/‡"Š"%ÁXXç•XH[h P]œî¹™o«¸‰´Z è[ïæ¨v¬‚$œ ÐPdAöªì¾êù™‡þ5ø4*à÷ ç]žõXæ®pRÅÅx–ôâv·qÞÈ|)ÔÚzèáGžzçÍv6¾ÿKÿö›¿ý;¿ñKÿ…à‹ù,Ïû`˜Â¦-èøe/}‰úاOïÍ(î/u—&÷ÊýËZ öÖ““±#5™M@ÒTàMoþ™W¼á×çÖ:¶ãѸ×ÉL3Î(6èGL1w6hÕî÷/]–2‰TêÆd:VB™`ðg.œ¿é¶[ï»ÿ~­õ‘ͭи½+ÛÏÿ–ýýßýC$Uš¶œ slºº\ñ`Ò“Ajv®È•__Žïø_;«‡NÍÏϧ6p¾ºrã‘Ûž…öâ64‘T´>°LÁQ P 6˜œ„‹ãÄ»ÆZ/¢f­«ïû̇îxv Ý,Ér_{RRJH}E^‡Z°R£2bøÀJ2 2ÀÊ º¸sæŸæ³G"¸LkgY(!I²p¶Mwê,EKÈ»€j “½Ý½K“ñžóe;M´(ïÌgÛÝ6åído<ÍE0ñr{½×¦ñø²õMPTÙ0+í¤0þæxxéìùË7=ì­ûòé3h\•µ2 ”…ëä‘mÐøúH·ûª—|ó¾é—ŽÜòÔ ÕdZt³N¯oYT;ÃË^šˆ´ðνTiÑèPÅR÷ÚÑd2éäñht÷«æïùµ¼‡ÝI‘´âù—VûýÁþ¤òUG¦yœ/RHã›­­­{ï½wóÈaïýŸý¿~þò™ÿã§~ÚGR5CkÛ½VÓ”ÆÛƆvgY–£Ú̲ÖFœ-Ÿ}øt¿'Nž<Ö”•6»U= bûì…Ù¿Ž o¼r2^;|üÄwˆÍë 3…Æ#4]8÷ùºbä#+UÜÊ’Ál¤‚í úŒ¼ùéË×Ë4óF¤ ¢ø+pê­~ É¸Ph´@ 1¶QîO÷¿<Ÿ=’è:’‘·÷ž% ˜ïí?ÔTIQ /¤“pÌu[7ûñpØï§:6ìC§~V·VÖoF8´vÝÍ(÷2gÅY×_:ì},Ul<çÝå‡O»îØu,tÖÑN)e‚‘LiQ@]™N7)]Ó¢HåÇ?ø!/{ýöÚ¸(*¶Db­[º3. ¥jZc57M7OKàOÿà/{Í›¹ž£¢×YL¦qÖϧ``ëøõÅ|¸»wáðêj{)Îeº`ý„à… "“ÉéS=qtouuUǶŽÖE™$µ3K+Ëç/ŸÏ½1FxÛÍzã‰]Û³y±uèÈÆÏÝ-[u¹3(ÕhhGd49o&E³ «—ºË¥ ³K{_¸òÅ@ sêøÀ>$*ZÈBÔM­@çN–Iôçôn+B¨æEG_÷¼g®¬,?}fye=M[ó¾¬|H~ïúþÔË)rgvÂæÊw|û¿C¹ÿ¿þá¯ZQ 1nd£c›DNCË9RHÀ{_:7‡ ’Áìý˜–’°ÔŽªÂÓf6EÒGÂHU2«á•Ï>ðy{kö"¬œD“Ȥÿ˜1Ý5‰}¼ Šê¨¨l½½{éþùìŒÓXΓ¤ÉTÄÎ:¶K+ýš›ÆT¶ ’C¬”Bh¥MhfXiI‚]¨‰(’äë£tÉ ‘N+‘êë®»ékº ÆÃIyh+»nÉÏ£Ÿø“ãée¥Ã¥q"…ËC©Ep¦^c 'lÈ4•QˆµŒ…wðAf6‹$À2,´ÊUÌ,M`@;‘ ¦¨µ|v볟lÁÅ@ Ä Ä@”çm3;“«Íš&Ù­Y™©Í¢.ÁìƳñ<Äöþà‡~üuoÛ;ÅY®ñÎ9N¥Æ_üþì?¼Eó~'$yT`xyoûÈ‘µaƒ‰âL˪®Ò$g š×"J>õáw;àkŸÿêÙlê)Z]]wbÖ€%ÀÄž¯Î îùìgêÚuøY9ͳ|w°ë¼O’Ø9HAoj[̓ 2¢Ñpì«c'½E@`bHç•hšvœFhÅ'ïx^iêiy%VQ5 ×ÐC™‰…¥Øĉ|B²0µÉu’GȨ̂ªiºŠ”t•3Šƒ\P‹™BG§ãäbžµ˜;ôf,¼I•ðMš*4†¼‹¥JdBîàòLŽÉ³°,,“¹…÷(~a Ö'o{ø¨µÀKI1ópÐ:¢ƒPtüAóÝy8¨qä‚g8ñ!c×f Qêìééƒì|òS_¼ûU¯Ï[í(éÌ* "„ €r^$åt4‹ fítu5Ò“N¬®¦Rš—|×Ë«Ö"Ñ9X|ì"F¯•äŒ~ðOº‰H„›ìo³mRD"R€dH ¨Ð )m/ëMf“^Üê·r‚mš¹w¥‚Îx×hˆH茢–Jµ'a=bZ)k8‡á!‘‡Ÿt×K_s× ¾£µzÔˆØ ÙY"ÇÊqÎ9dÌ1X.ºk*@yA,ºÝîÜÌ÷¦{A5:'IM5ÙrFìðøKÈØHeµ–R(AZÉ„™ÀÌ=Ø9[šrâëR2 vÂÏS!xø€‚ W½Ÿ(ˆ½÷hl ã°Ð&‡ÅäUƒõõãiذ3ƘÚ_¥g.d ÀzSŒ·†£Gî½ïô™s ^9È1[æ€,ŽÀÄ$˜d2ÁT§8jE3Æùตt¼eïµ—²¡í+á½Fà8‰Hk*6ŽÀ)‚³SÛ@!aФŠ±´à7 € ° ™) ÔçïÿÄ‘ëê­m÷Á °b€‘'©£Ô²ö>4<ÓÂ;B`@)LçåÒÚúÎþ¸½º5˜u ‚b L£^¿_UæðêrYÍušMݬ×ÍÎììXç’¼UÌæÏúš§œúÒÃßõ²×ÎÆÅ‡>ô>'ÐM,"öÁ™Æb0G«­ÍõÝÝÝNt`9ð(«oQåEñ/xáþö•3§ï«¬ÓZ öw×·6ËÂÆBP°,”L’Ô‘'-âð:‘ª ¡*묖̦i§R 7äSÝó¿æûg×z‰pcÅ•ì™u`‚"z<ÇD,dµ½÷ZË ¹4Ýí­–s8ÏZ)IˆBX¬”'¤„@¢#Af^]á`9¶u‹4V‚‚oìBŒ™gB–9¨ÑÕ8_}(É9âé|ö¥îßN[«×Ýô ¨Ãð9”’QV »P‹_0H‚2Ä6À3˜=±Á ªºH£¸v>4Ì*ê׿ò_>ñîT¢.ír¿BžÄÄ@`ªx¼¿'¬I”Ê´Œ’ø¾{?ý±ª¹qü¯øáªªþî¯ÿL§` ¬Li œÄ²öè¶påÊ¥¬·Ñ_ZjŠ‘Äbl@DL€´ÝyøÌùång4çVK5ðQ–‡ãVÚNÝo­’IÂZW“,'2QZ·\ˆÁLìãH&‰ lùÞýŸüÿªé9Ô{ýÔ…fÁ/ðuÄì™%`IhÁž­LXŠ…­*…V–ïM¶¥#gu-Ì”ªR:|b0ä)æ…›ºùkÞpW€ Ó‹æÜšz¿•GƒýóÁÌtDB9Á^kšÊ0Áx8æÇ˜Ì‹`Xà$,¨yI&V£vo>/Î>xÏ¿åùGoÿzÈsB¾r ‘!²$¬P¥àbáYËÌà@¿Vðu]åY§0Nǹ©Ís¿éµÿòáwÅY|0úµyÞ®C£E´}iûбãŽÃ[Þøfra%ÉöMošÔû²%ˆsÝ~ùë^OÞ½ó·Þº”e³ù¤Ój(Š2édIšOËŠˆ!àé*P|!_D¸¼¿¿uüÄ`ô´¯{ÞýŸÿC–ý^ÛÌÊ(ŠÀÖs Bé|ã\–'ÎÏm]Yxï-‚M"óm¸í?ü—ÎŒÙͶ:jZîDàF2BP.¨öL Á"`ö ½4yp‚Q–%X¤­uöæFÅëÝÃ×|ηœÜ8GÕþKî°.X й1¤=:KÇnÙ€r0cãî™ N—Öhø` „gšXx"å‘1ÇÖ…äÅÂbÌdÈ X-*ávc"¥šrT_¾wà­n||òÙß´­h¨D%E‰™âÊx0g&† ` S£Ûîn VYÓXO2MòýË/{Íÿñ;ÞšGŠ-ëH€DÝi{xcëÜé3½^oI¥RÁZ¿¿»ÛZÊJ×4œî7MÓŽÓŸË›ÿëùÏy+¸nªn'Ûžr¯·4Úv:4³ÒáQ`AVV7¶‡³8éŒëzX#O ’VÙØ¦šçˆÃsÃG$—;=1»[)å™xˆ`1Ýþì‡ÿrUO÷ÎÞ{øðŠi¦åÌ)¸<ï¥Sé ,ÓÂÿ•Ir "³@§ˆ‰B€`©óöZi¢ÁÐu×ï|ÆK_‹h¢ ÙÅWƒ20@{‚€\¸©P€˜\ªÆ—þÔÎåÏuZe"+6U0œeYˆCeUQõ’|‹ddŒEh‚óðB Š'uã‚ ®®ÌcÉðÁ ÈÜ6ì«t¢eëÃVÒÌÃz‘¿ðÛ^ý+!>>­T§Ó‹P×2¸œpÿçÿ– w<å¥Ng ËŠIÇQ–%®<íö­~Êÿùçß¼Þ뚲̲lnŠ(N¸—~ÏwomžNæñ®?Yä±×¼îßì¾Uœ·ºMãbøº©ÆÃôßÿâ}!8%R1nðô¯ûö†­u=Ù~ä¾h@º«û½@\wÛóÅRÅE9ëõÓÀUÞVí\t";ŠÂv–û2Ž&£a&ã¼Ùý¯?þÂUÚ–õ•ºAµ‘Fd[öÀ¹œÇ£„DV[e¬Q{VûÎÒÒÓ^òˆõ'ÞýN5?¿ÔvÖŽëzÜIó¦²M¢¸e­Óç‡o|úí/z%Z×: ¤@ÑBßëQ¢©: ±<Æ1-P !€ª»~¨ñÁ˜â‘²¾ËX%*5¯+/òÕCO^=tò•«HY€5à@%F—.]>7\î(Ñøª©Æë´¥Ul•°$K\žÄÖͽ+4‰æÊ•hæ¶ß]uÛçÎ;~ uX굦H â@Þ !WW–v÷öL=ïwÔ`:œLËÿçwëgê'{Yî`‡aqâøÑÙ´È%€ù´XjçïzÇÛ¿÷ ¯˜Íö³,‡yÚR <Ïw/\d ªL¤dœE‘Q<ì®v"œd04ˆ1ŸŽ{k‡‹ÂRÃÁ4ɨՎ£(žŒG!©Sg…ñ ËH3Gl4±tQÌ•š¦ vWÆÚQ6·BÉ8Ž[³¹«kqòúÛ=íß¡·Ž@)H¢qHR_ÿ?†dò‰·¿¥›'KÝþ|8è·z3–õ©‹ãŸò¼žùbtNk°‚£ˆ®ª_«¤ ÔµŒE €)°”ìÞpD†ÝKj¼o *EJ(ŒF´±¼ùTä79 ‡À°1$C–è?ÔÆ!o!$fûÛgï Ïy_K*¡àI) ¢H¸D:r^³5í(žxÔENœ¼Î™’Bõ7ý7Ý_¨H5ÁŸ~xgus A†;‡Žš7æÓ÷~¶¦Æ#a¸Hdž ‘;;W¶Ö·Œ/º|:)¥©ˆWòž›å¼-(r½²½˵iÚyoVE˜—È“x:Yj¥Åø’d$1fã™neDká€~7妬‹bymÕ1×f:›šn¾ÔD*ŽtÄs§Á˜z62ÕÐEÓ`æuL” ­‘–aiFñá­ëoyæsÑÚ§ð *„d„L6õÒ¼ Yv®›ÏÐÎu"Q0•CžoÝpÛ Ïz1–žôòÁ%‚ '„Ë©G¿dƒÙXÏV´÷WnŠòMcã¢jŒ³–…G,Z[À’µíy=Ð2¸Å¶ ¿ ^¶ ŽÂAë¶Û¾í–oøþ¿öåÇo}¾îÜ4m–dvôʾß{Ç™ÖÝXE’m"}éX'ÖšÑx@ÂVÍ´·„Yá@øä§ÿ‡ŽƒÒ|ó×™rŠàûÝÞ•½ý¼Óo/-ÿÜüO%š™) )+¥•¾CS™Š:,Ë’ßüµ·Æˆa¼+šÙhVÌê§Üùôñ¨Lâö¥a–¥Rãù/ü–ñx¬ ÞšÍÕÉd€v· )!¬…M°å¡å½+CSiâ,VÁ;IffïAIÇÜ”cøy¿ç-„ž9U‹’#6:9õ›_óÊŸ}Áüü-Ï}5Ò›áÃo‚×áW úlj Ê#QQè@¬~íݯKó•Ép¬›MæIÖw¢÷äoyVn€èÕ6òAÀÏ /Ík/E×Z]ÀÂG)°*Öì!·tëP»}dw²+ÖÊIxãë)-#-d´øN1DXLjGD18õd{õèí7ÌŸ÷ ¹\ûê±”0娘]¹Rµzý,O¬­?û¹¿‹´ZÊrh·ÅÿüØ_,Îuw IDAT;Â3¾æ;ó$‰ãxo4м›Ìê~oï¾ûe¯ø»÷üÕp>ê·úÁfAecò¬kÐÔ%çyÚM:¿ÿ»¿ï^ùÊW­õ—|ÀîÍoýÕ_—¼²¾2­‘$¸²;8|äÄ?ôž4Ætjz¸h¼RJT¥ÑI¬5øÒ?»€ºÁsžûmWv.ª„²4wÖWºf^5Ö '/çÆšéîõ‡ÛE±çíPÊî w<½û¤£{|ÁO°ã™î®CŰ‘¯!# ¬u:–J/˜Ÿ¥ŽóH÷,]µ$TÚï/eTÏ Ü-\í£@Ï"±f x‰¯´+¾–£ødÚ8-åbw¯,o\?Š|¥È¦Z8ãœ(4A xV!€˜îñ¼˜³$SÎH2À”oÞüä-øóWøèäÂŽR¾·žrçqsªUxÓxEª ˆÆE“&ª(Š~§­@ŒÁ`°±¶ÞJ³Ñ|Ø4êÒltdcÅÿƒ¯Ã;÷÷•鼈2]‡àçC'Ïf¥É²8 üÕ{ÿrçU€dJ ðÔgCJw#£at:± ËÅHi ¼AÁ{„Ûx¥"°÷Žœ ¦¶Ì ʳ(ACt’Í×¾ìºùY3´ˆ£îæIt«h$¢T÷<@p’%ÉÖÁŽ[D±rÁK±h‰AÐmØ¡³a>+[míU!îk~è§Å‚^ä "­þ+®Ê.ªrq•-kOÚ¸2>p‡ƒpé­eE‘™¾ª9M#% ·o#@R()ò 8–Þ)M`&,4å­—J!¨Ê½qYL𳕾í+¾éS¿ð‘Ê÷â$óïºë›‡;—Ÿvç“v/_h·»ûñL:ª67>ôàý+k«àèÒ…a+Ÿ9󅛎ž.½êû~à]ïz—Ž„TYÙTY»3vóžêoÇÿñgn8üá»þ ›w\Ün®/ ’O~ú7ÏŠºÕêPÔ΋¢xÖ×½j2Å$oe‘ˆcœs±’q$‹ù\ò>¬­¹xa°±µj¹njÙi­›ªŠd¬kJ.máfûe=oã9Íx \i«Ù• lôï¤þ2Gmˆ«XD|@¤@”.ªî‘Z´,ÁÖ“ ˆ•"Ha½˜ÔìeÑ 37옂 /èÍOˆòÇ>^Ýå5_ª²G“½B!Ú{ûa=é²k(Há%ð,%Œõi$˜E`0±€‚æ*•AB –`aPì_|èSWÎ~ùÆÃét:©f—޹±™Ò4Öêºy­myäìEÉbV”ykÕšÌg‡úò¿=¼µux4öû=ãš½ÝÁÊò¡³ö¯-]ÞÏ+^ åG³ÁæÑSgN¿îõÿ¾—¥UQèD¾èÛ_¼µyl4)²¬÷ÙÏ}~ãðñÁhf_^]¦:IMY*­wv÷…:i×µ7ì8¨$JŒk*k…ˆêƧiëô™ó+«keašP‘PÝ^6ŸFiä…”:ÎõÿÏÜ›Yž]åß¹Ëo{û˽*këênu·zÓÒ­ÝhAB HI쌋›ö L`Bö€<lcABH 0B’EKZ­V«÷ªêZ³ryû{¿ångþøeVU·Úži,EÌŒŠÈÊŒ—ïÝïwï=÷œï|_·,ça2L”¥¢Xê´Gsûè÷îU[_Ò¢öq@ζÑHë ×¶Å88ç"QÍë%Q3—H (û|>YiµööÆË›·_ÿ­?j‚#"%HHØ{®eYŸÞ™&juÖý½€}ï3è}“‚J$D l>ïõ?û$P¬È§Å~S‚G Iû ’&  e5<ˆYH·ßÄd à'ÿÂÝì¡#«j>›$YêÂBÉék_~ƒ²»±ÐíÖÒx<ªB™´ÒÜ:™.•¡á8j6º‹É´ÕHóBéx>Ÿ…àZÍ^¾ð$Úã‚9J|DqÖŽÇ£½Ãk+l­’\˜©S¶„í^Ÿù0ZØ=›´Öfó Uªu<Oy[-¤`ö^JIDI©4TB’­#N±U!UÚmV΀B#“$ve¹Òï(É>Å(T;ãò¥ë­8ui¤¤ØÄ¾Xˆ^ʠĵ~ãõ—xJãÒÁ7WV%]=é5кqc}a!• (ö@Rã k+Ä öÛ!²´µÈ󠂇„MŸzø3´‹'º ‹`æ¹/*].ç³oãËÛbêæ£ÙtÚ[ZBL&“^o‰¡jæƒ÷+˜ B"° @*@[G…uû¢Ê¼Uy1›L˲ …¸W¹±³¢œUaØ:a Lu•-DêBâÁ¤0q݈ˆÔE&)YÔšqÌÞyëLQ.‹`ƒórøÙaô 0B¨ˆárëè@»ƒžb5”nɲDéFá5Ë`’ôU—±ÿJã鳆<º}t«‘¤±@eLÉת@^Ùa¬3J•ÀÖÙÇþzgëÞe%Œkt×_°yó€£àŸ­îLF³Ñ©µÖü¦cI9>“*?Ü«4M™J¦9SQX†¯A ¡f1Fàà¼)mQ”J%!PÝÝCDÎ9S¹ U&H)‚KçBUUeYS=ëÃâZ¼ë=¾NI{fO(I†ð ¶‚ƒ$$@2 ò2Õqs:ØÍäæÃz9-ªù¤4 :7€?ïíÿp†¾GoûÂN˜m¯gÓ|û³~öw°û¨=„2Ž´ áëSùéɳR…y¾XIsVÃÕú­uçïÁN¾.‡¯øÙ¯ò2j´[ƒ`lªª=ÀDÑ>5ºÆûÌ&€!Z»Xç®8uú‹™\í%-QË•õã/Eç` é‘›ïzMÚè*á2½ø©øÎ¥VÕŽL(çÌ`Þ‹2ˆœQ2 à¸Þä½@M`f@„€²0ZE­F»Õjk­köN%¬½³3fóYi­!"©õAÅö*Þ™X° –¨­@~Gì¸n­òˆ ”Q£¹´˜Î2±hËÑOüÈ;Ö—ãñdö¢ïy¨ãM´öòwýãQÙ!"nÜÄÞôÒ}O|áÏ0xb–(#÷ýãíq5þbÈ"L7Wq¬»Këw½êˆÛˆš•uØïU¾:è™zøöWAw‹E)ÐŒô¡½ò;+×*%7úéÿΖ »;ؽ¨”ò¤Â~®08‚«M‚óD$@õLD€ð.,…÷`&gƒ¢Ùläp8K)¢(J”Rœ3ÆçöÍ௠ÔDM„a‰ì«?ªIª!€ÃÞzï8PCIe&~vîý¿øƒIª3û¢·¼!öˆF¥qÔDzjýæ×}—O/\"Y+S5U9¸ð•û?ùGŸÑÚÚÙXñÓÖ¨ð`+Ý´×T̼;šCÄ^$ ÁO½yƒžIìïù~ƒsU”FÆvÊfïÁ{þ˜Á•2@°{ –!ãܹ­?ªnV4ß‹Iv{G-ú7¾ò-  Þ¥‰¦x·†êð /ûNmäóA*Fÿã»^ã‹3ý–IÚž/‚ †B̉’äƒ3F’`Ø[O)Ô›, <‹"Mýþ²µ¾¨ªª4Þs°ÁÏÞ †5sÌø@‰!3|`ï¨|ìÙ1<Ãi­­w–e-Ǹ5[‘dm§ëMÿÏæ»»i¨Œã«ÐK'IÉ(¡æ!?CrJf2ƒwK½òÝ¿ø_³ÅP ŸÅÉîÎi  (Þ?ý]_óŸ>äûÞ÷¾g9ÂÑôÉPí7S1Í«j6¯ºë7@¤¨È•S™Ì„ž£¼øÄç>Ja«ÓàVÌÁYˆ$÷MjÝxò…o<Æè+€=ˆÁ`(¹²Ú “Ç,÷;«këçw¦g/ì6ZËÅÜ®õw§ÎÚ奕í4Kàƒ3ÕØƒ8(Iq$:ݦÒÊ9_äåbQEQ#8u`9z…#ÀûÁ&tÍU˜öMAˆƒûï–Á:IHª¢t.°«¬ ¾×Ë"»sãZþ¿üO¯oËQ¤ä]ïøÄžcçE"I‚õ~š² ø´½ÚYY9uÿ_6Å1:(¸Ù¥K›é…G¼÷ØõG!…ÒùªB~~ç±O'aK²YT2ê9rÇ«' ŽâTÊ}â ׺-ûÙ˜ú£=}U?[ÈëÁi´(†gç³-[Tå"/×ßR¤H&ŠSßûÑ‹|Ž«moÁσ«¬qTšh[:þB ¼B‘…ÈA„U0%¿õð_“.æ£å•µ£'n|äÑS—/m7³¶/C%!øy1ëtZUQ Q»DƒêâöÛ¦½7ÎWFB‚1¦rÓi.D Öœ ¾f•óE7àš„ ƒ™,Sý,„ºéXƒŒáÕå¥X„ñå'[¢lÒÎ/ÿÌÛ6šÓ~‹¬ k«7 µ,,G±BµU@%à bª4„­¶¾4Ü=g«àle«Y«©¤*Êbĸÿž¿9ýÅû®îuˆ v¾rÿÿý¡ñö½Äbu_ðî÷B¯Åq¿>ô tdºBuzÊ™þ,!g””âbtîËÅb'I¥Œ £‹—û›kP¦§}ðcåôÔrì¤'M]ÙJ+ yÇí•ÕÃ7FCpZˆˆ`9xaj1W(/Î~n}9ÍóY¾¿ºœÄtù“³ñ¨Èm«×òªh$‰¨‰ºuΉ¯æ vΤ™Š"­”B–Æï·ñ3~Õ ^ý—B¨ù†, tð#Rj)u%ÃK븭òÔíü«ŸýÁÍæŽ´[‚ìx:c¦Îò2"€ ˆ0FÀHˆ0ðfÜ_Ëò­ ’â^»O`ï*Ie–Šb>X]jÚ|°õ•¿}èoþp¼u›SÍ$×0Ìš)Y½óåP+DPëBû×È+)Uòx?ò§™fý¿!NµªCE‹ 2n*í ˜çùÙ/â· GínäýE;½hTÚL3¦°ðUÐmïxšOSJ²übsöš žƒóÏÝ·½{Æùy$£VºáágÓq¥ˆIVÓñ£¯}Ù¡£ëoøÕßü³ÇÎîííÝ-¶¶;íæåŠ(NŒ­ŒqsÇZ%•³iUy\--]9¹÷3\ôÕ ¸ú'’¶¾E™dRˆÐÉ";Û“³Ï9ž,Å“ùö©“Ǻg.]bЧƒGÿîOÏèhiwwºÔo;6¥/<;%3E‘ð vÑo”ÓñDxÞh%(ÀW^°éè¨m‰"´{Ëíe.ªKÎŽÒfêm`Žò<¿çƒ¿÷âïû¹Y>ÎZ+û û §ñ¿9žäH! @é}3jø0+«9 ™JÑZÊfåtº)o.§ËXG6:˜Di‚#;œýÛ饋…Š£v¤“ kF-.tÌqÔ·ãH,÷›{»“$í‘Beö"Ø—=ÿ¸|ïkùŸ~|kêeº;*––zãÁ8Mcì÷LÔrZû[‘—n4*6Î)"¥”13f]«nÂ~Öªž-Þ—+«ó9¨:(Ô· ÅĪVgk5›!„ÅtÜM‚›íÜq²ÿÞw¾¼'çë›Çüò½Gn½ÑIwéâW6V6Q,Ò–¨ì^à"â´mi(FÁp£ËóÕå~™‹ù$Kb-ã†^±¥Í˪Ók7:b0ØÉ²,•1%«Ål&…”R¦iãÒx¢V«áë¼<¨‹‹körÆ3ÜËåû~ö1öËq-G¦£qÍsüXŠáÖã÷¤º [“ÇQÄ ï«¼š¥ š1ÁXeÉ{«" Ny¡$§1|5!?ogD~âªmð8IL3Ø™ÊTB56Ê}3JWãéÊr6›ìN‡»7ßtÓá#›|åÁËÛƒf³[.L·ÓuÎ1k/$"¦ú0 ¡µÁ©8"’*[ù¼ ¦pM½˜®~¸zœ×²…ž4Õá!X€™áñÕ|£§‹áC·Ÿˆ诼~•4ªËÃjíøm—&ÕÂp£Ù,òœ—ÄÞçJT‰v©¢$°ða¤D‘%;ïL±ÔïÄQTU6ŠšìQ»kÁ‹ù¸ÕÌŠ¢R“ÔQ¢­ó¦¢öÒ±õë_€¨ª T\{eXÔeé«6vbg!˜ÉÔ*¢€”¨Å™ëU3`=˜jñíÀ Cž~òüÃΓÓ0sò*ÉÚe "ÁL*8Åž)„XÍ ÓH:¬•³&MfóF¶%±ájQ•ÌH8´™:“Ü'.>ü‚—¼ ÂÀœäÓ¿«Üˆ+Šiêÿc?õÁ½EßëeO™©*g^EÍN÷â勽N+Ÿæ‰ŽR•S9”>” ÛJ3Åb:ÉuÚ4Á{vP zžX(JJÀMǃ8ޕЭ“qÔÎó¹B‘Db¶¨’´‘eÍáÞ°Ñh‘sÂWÍx.ý©_ýçï‰í“]¹è ÌLvûwÿ<Êà§ù‡¿‹ª!\5Ým ±eLJzoÀ ­„¢lo{o¹ßS‚òEÕl÷+ϳÙLip’=!0„'éH{Áe˜¶š]›g–×^ø?…æ ½}Á^v€gA$#„ýì›xZÐþÈ="‚ÖûO…EÚ83€à½“Û~þfrïZ\ør¦ÐžÌ‹¨Õ¸R¶“VP(8Š‹fÖZ̧ÁU@èõz6ð|n,‹Š}ÖîjÝÙÙ«–z7]÷ò׃4Эü2Éf„1pþá¿ú•Ôn÷Ý‹/ú8t×o~øtòþ_ÿ“3»v°­¥c¥×ã‚+ï[K]Sæš)‘±+"Í$q)Áš”ó¤’qŽ™„Ì ‚·‘BðFkIPÖ %Öx[ÍHvƒÁÎJ¿L)CÙUʃñ³ß}|µòóÇ›ªšnUÿ–ç¾éŸ ó„¶°SÄf®îÿ¿gfƒXBjW¸Y’„D™Åt‰$xÛJ¼1B/` 'ÙOÊ“t–™B¡/·Öî¾í­?Æ‹&5Wö`ÉÖËò`z:Þ¸Æn% ¡€ëkr gU* P´9 \¨f í…•UÕéªÊJë€ `Að fpEEe]•‡àãF3°˜¹3˜öV6H6˹ÏÒ“Ç^ø?Ãæ|¢„íÒ]SªÂ›iî¼¢ÐNÃKg6ÛÿôGÿ¢Î/üËÞþ±™_ntKŸdqc¶µ×X]*gy#j P€K†tÎx_’Ž [)™‚É„À±ˆme”Þ‚, ï½QB“¤(N¡– D³QžÄq¯·œ%‹óçxÑË~°÷þŸûQÌ/«‡ÒTœ¯¯/oÍFŸý‹?|é›®¨Ùä:$ßù–¡<¤Ãlûžÿþåᓇ–µÌ²"Ÿô:mk*0ƒ¨Èç*Š[Y+ÏËãÂr•d±N!Û¢ nwôò'©÷J_+î×'zkUü¯Î³Ë÷ýìÏíû-A\aÂ@uâBXç%‘f¨.Ì·î~“õU©U*¥®{D @DB˜$A–U)”HÓ† "·É,Odv¤Ñ»~nÏ}Å·~Îkú‡ï†Û‚î1B•zÈHH)fæ—ÿŽüÔ–Ül­LæL"‰"j¦ 7ºë·}ñþ‚sfQjHS"¹ÜëL§%D€3¶2®`Ô1yHȧRAز>DJ+!‚7ìØGq“„V*RZ³°ÞXP¾“¤:)†a~úîÛ?ôßøæ×ÜÙK¨%7½æµfgo±XD) ÏMzôŽW@¶!šÆG†éÄ…DÆí`RŠ:H:›·=ÿäÝ/_]9vñ°tÂ#Ž+©Ó,MB°š¸,Š´`"Þ‡°7²,œ"É>ŸÍÆ^© wÞö¢ª€Š’@`‡ó44Aïߨž ùÿò³…ƒPÍ;HyíËÖ-äSÌœý¬­ÎÁL‚TY³?9‘Žã€²ûäv–„“ɬ²E9W¥m¦çtº››ÇîÔÇ Ð@|F2®‹UáÒX!haQ.žøâÌ|AŽÛÝÃ;qû¾Yúð'>Tä{ÝVC©ò7~þí£Yãÿå?vö”S‡–—=õDoe©ò¥Œ¥n€œòŽ%'à,pÙïR– ”^åÞø Y1AIRIl]¨Xx‚X Xçå¡*7úë£áéåfÑïÌßóo>ºgI{w{þÊ·½Q¼ù+Ãü»ÝÑãY;‰IÂz˜dLub¯ ¥ ²H0|•Jæ8ícíðó¿ù¤[güügƒ³ó½ÓšC½T…Ò“dÄ8VR*’®šÄÒ 1l?„Ù™¸y#8R;ÀBÓñ«†BÕ1bÝý'ÀxŠ”f®V¹›}âþ™É#ÍØ‰˜ˆ„”©E#É|ð,®¤´˜AE`MªÐRÑJ¿yróä«‘‡êà*ã!3)…³€„ ¨TyIÎRdñd¸ÕT”vg•¦tñI@Ýü†ïè/?|y÷ÂR'ܤѴ¿òÏÞ=·KïùG¿Påã+iI;ó²*K6šJjë¬!–ša¢B!…–ΰ³U`¼- •W ­c¥IÂô»$ÙÇÈu£2{_¸®§~úþ¾$*ÖÅ»ƒ½ÑT¾îû~¦ ãш½îÇÜ* •H AΆš°Ê¡lhià Ò8Ø’t"ÉccùÖ7ÞŠÁ™­/lëÔgK7L„‚ tUz7psÆV¹ð¦ÕJ/ì]^]íÞÿg¼óµï„XFgSÉX"®ÓÂu5ó«ýU̬ Wž &'û«ŸCI˜! úÒ_å;µ£y,c©WykÊ8MT¤«Ò"ƒ°\g¿'»CyÝ-/]»þÅÀ ä&ЩZ^DFû‘„ÒõãXW&èD¦`€…¤²ª ŽT…쎗¾òH57qË7¾XÜû§¿“VÅJ‹/^~`ieýÃÿþû<½õ¾÷˜ n>zÛ£OŒª"dýU‚0Yš[TÁƒµRª)c ç)™Êq¯×™ÍfYª]5/&Û›ÍDØAʳýáwYZ5y¬ñq IDATÞîd[»ói.^ùÝ? ôA=FL é÷vˆ£ ³sŒ1:…•Õ(É`ë#6Ð2aå…t@ÁÁS€€’Q#/òV²°Ò\91Oƒ3ŸëF>D½k΋d ˆ8&gŠD4´“mD™­¹ÿS±YçØáîV'_@$”Œ=iÿ4æU~@e©i`ãAÞ…f fÀ´WYiˆTÆ“á Ic²Æ5z0¹¬u xöLÙ’ŽÛ×uWî„>*…ìÈ<êè"¶Î†(ŠÁdSIlAZ£²ˆId줄lZOè®ÍÇU³»ÂÜ*ØÑ]oü!„íÇ>þûiÛ³ûpù¶ãÍßzÿ;TvìôþOÿùÓgÏíuz\¹PY/•™UyŽ…"j&‘Nb[©Ê¤TZ.f»]YÚêR+вŒV×Ó·¼î¥Ç–šÕdk½¦£Ç¢¤}yoöŠïýap¢ŸA´‘*[Îôêò¢¬º" Å´ ;|î¯oÿ†Ðî™q,4ŠœÒ{çHj!êRR=Ïqš•‰H6Õu·ßÜ—lÛ/8–‚™…gá@PµCy0¹ÀFÃéÑ£'vF‹[Ž./>üäƒ÷ëPêwн耔Ïä¡tŲþªÆ{½òb ïBšVà!Š3_ùÌs©ÅÓÈÁ•6–*øJFˆ›(Ý)ĉ®ŠÒ§µ$!½·Z€•\ UÍ  ÙðL&@« P¼é(€µƒƒ$`c¶K<•l³82^¶ÙÒÌ©àØ Ù„mßø¦ŸA~ñ‰Oý‘(.&…m–¹Í¿r$ŠþÑ;¯[T+QšMf¹Œ—ÿÍ>¼ÚmçÛÍL»ù"Ÿ SȦ·2Õº±ì«üÜÑCô­ßüº;ž{óÖÙÇ»bJ³KëI:ÛÛ Aßö½ïw ×7¤´Î¤ŠuT ®æ.,𩬬^:fìŠ"NZÎBɘÙ«}aäÚEtÿÞ!ˆ â(7’VU,„RëFÖÝÙ‘NÊÙ(†<¶œ\zä“ãÑö-ßü=h•ºÒžuÑ©”³Ïì­r͸¶ã øñbtf£ë¢ üœˆ…Ž›§sCEI¤QÒ×q쌗sA‹4%/J*Ö±lóªš}ø ÇÐißvt%‘2fqŲXt`½ä¬+b•€*­Lk+¥BÖ­Tª¾( '©ªF.Ýÿø?±ÞñãÜt»kOn—‡7o9üÒoœäM5¬ÊiÒèfI÷Öoû.@ßÿ‘ß´VìÍ=¡¹tøèÍ/y²pÿeQ WH’îÊ‘ë^ý­š ïÁüÉÑx»Ól[¹¸÷þm¾èõo“v9#é9V!笹zaw´šqžO˜/=ð…OÞuô¶`’Ì„àœË"ýôõvð= ®àFÿå~ÓÏ/¬d›gYvîâNkéH1 g.˨çKÞþ#ˆš`á…û>þç³­Q“bº”µV9» Áí•¥¼ÊÞôï9h2£¯.­ìSDžÒ£T#¡t¥Ê²ã <5AÝàZyH^!j-­8vôy´zhqßÇ~;J½1ãÒŒƒ>N¢¥–æJÐb‹Kè¶ÅNz)¥5 ÙD7b½yâÕ7|úC¿´Ñ[™înõ:è¸||ùÒCŸÝòºï5ãÆËð†YXôÖùÅ#qj·§€IÖX‚GëˆøšÂ9Þ¿Féù84¼&‘ÛVb g!'9¹>vëeÔ~Õ;ÞƒÖ„6D ³ÀÚÒóßu²ÀdçËýç{gOíîî®÷Í«ùÞ¥B¯m"^Îç6kùL…RUãòàªv¥òæòBÅ5ûƒñަ(M{л{áÅßñý` - ŽÏý!*ìî“çÏ<²Ø»¸7½û²ßA'‰/œû ûôøótc¡;Æz!#F ±Ï®?˜ïœT„°xäËŸ3‹IÚÑŽ+¬ÐA)J@&®¸P·/>ò)š=~÷s ö& ÕQÞ}ù›~Ñóô’;£G»™eš‘Î`¦Èú#¦„Ø Š4”S˜ÀÇ£a¹2¢·yÔå©ÊÖv_ñ½ÿôñÿ»É…­Íf<ߺ|¸·\§?÷{¿ÔZ½á–W|›^z¾B#ij„ÀÞ›|Þïk ‚5Ø>‹µ>àA"ÐA¼Ä€Œº $Ðlkø“Ó÷üɯ©jnauTp»}×:üâwü(Ò PÔ€Œƒõ"J <*@vÐ[¹í›6P~âW±Õ;ÖPúÕßú. Ÿ5{`°¿êZweÈö¾÷T×\€`&ÁÅ¡‘a{0˜:)[ÇŸ{÷·o>ïMàMˆe¨(eÊ<‘H RP[6Žö–nX[=©eT”cPžˆÊVËl§I_fËR6À¨\¯)íÕ)úP×1§þã©ÙmÂÉÜ£ ×\»ùeàeÀ„á½O>ø±ùÙûOÞ·Þ×ÓébZ¦ÙêMÏ{ë{ Yô¥*‰6õËíÇ*B(KW F“µ£'|È”lSˆÅž” `†ÅÅÙCÓE"tœ®ÝñÊ·‰Öq gm,Ewiõ›ÅÙ'é/¥‚JWŽ›q_>SNöú×÷£‘2ò‹;÷}¢§+”%WdÊd1ÇÒñ[+KF&ŽIɃ¬È¾Ön-}l&0çúäï/Þ·¹ííí4WNìW¼÷—=ÿ[]Ç¡G*ƒPÓ|/NcH ˆÊ% †}ÄKMpzýK_wäù¯>vÝ‹Dÿ9U•(Õ€·ä ”~úÆ~MiœŒÍÀ@Bˆ¬±zë‹_· vµ ´ÓR# fx ÁµY;ÈVI7‚÷"n#êu-mí]M]Uítû=CöÌ#Ÿ™Lì-/oS¼ŒQä!Aè©íkXÁå„Ò*‘US‰j1Š I™Q5Dfã3÷âô#Ÿ:±ÔÝ\ŠË²\øF{ã¶^ö`Ù‡F‘‡÷AËÆÊdÁ±µ¦ÿÈ ±…„9Â'¾Ÿ Á3ø­{þð_ûùÙ~GßÞ]>~ë“Cõº÷þ<Â:hµ¨T”Áy(…F£U¸BIÍ:Ó`RhAšD 6pFöŽ8GQ\»ÙhuÓ«ï§Ö!ˆkØò$k@©ºÛ\ªZ9uÿ.'®¼ZkÔ’@K¯ßvûúõÀößýÉ¿ f§¡ÌÍGÚ.~æô'G×½ìQvœ¡*¨€ ೦Sš Øâ|1ÞÞìÄór. [ ÿįΠU¶j&þºå‰Fî[õ›¯¿ý[ÐxL*e$EpÞH•ü½rrr~…\Û‹Sø ¤ñ@$`æÛQô«K¼]L.éVwfÓ*:ôÊwþ8Ò£ ._É…ƒêª¼ §Îü•Òø5Pìãù4ÄÿÝ*Ïjp|òŽ×ÿÄ$_nõOìMv­»ì«‡¾ü7¿¥¢Ë»I(Ci$!$â̛ǧ;gRâHx$D T¦ÐʧÊ3rn"çS?öeФ+€^,òý'Q‚”r@‚´;›ûáhZE;‹&;§a·“xÎóÝÄ-–:œ“Ÿ .µ"cm@”:ŽÁ’Ù‹}¡òž X:zãK߸rý]—æ"‡ðŠ“Hp±(9¨(n¡eœyØYYÌxrÅ6x„r7vgw+VŽ0¶0þÊÃÿ-ž?iÉF+‡÷ŠÄè×~ÏO‚V€  DÀ~¶5ôA~ ðúûñØÿ?–àN¹ó¹—ÿ ƒ‹v+î\*Ã~«ƒ¬£e*yã ©í}þ/~WTç[QQM,õA3Iãªf#A(7:n. æ^w6n¾õ5ïD´jGQ€})@,DLÎÁ̪ ³Ý' yœhÒjçÜÖúæQ5%yðì¯~çë©a"s%줜WÝñ*ˆ.‰Xˆ}b+<¤&!Ñj¯ll w‡Óñ RÔÈ"v¶È !Tœ4‚wJ‚Ø7“ŒÅ”’'Ãáðü¹n,Fç08å§…Ÿ2É2díµ;WO¾¾q ‘ÅD0µ¤Žp^K™!én>>ÙÙ.ó¹/±B¬#%ȳ16ÌÞ ÈW£½Ùd²¼Ò”Gqé“úµí/~TެÄ{£A®{Utø5ßû“0m$‡A±'ÁRðAm“®=Rÿÿ9@³Õoyì ÷·²ˆ\¥ÉÍ'»tzù\7!ÑQ ÌÖýûí$ì ·žð©Nf³"JZ!xcöiœÎ+9Zdë×½øÆ»ÞŒÎp-õBˆ\€–pUU&H IÎB»³÷ýM§I•FšáCEË'NBø?ò¡PnÏ­­væUÉÆÍ/|“èg¨›N½…‡ˆ$3,Š<+á"JkýÞb¸·»u^7©€ó¶’Bhväs§™(¶w/ ¶.lÜyûÇ>ð+ÃÇ?¦g2¿Kn²;Ø]Þ¼Éd'^ù·X®×·¶÷&­f*è)'tÍ`ý€Bü ª_³Áp•e«)UpSðàKòody¡¡æ‘†q²DLñ’夬œD%íÎF?ì^H"ÕHº“éL'© Æ…Y’$J4Æyµo»ñ%oEï&öI@$•ðïÉxoJ5 „”_ lýÕ¿ýé~º«Q3‡( í|w©¿ñäö»RòŽq¥‹ú&:þ¼·½Ø7@‚¤Ñ¢ :‹h9ÚÅ…/œþâŸM¶Liž¨ ÁÂq"(Šuº˜Œ}5±.YëöôR‘Wn~¹ÛàH–76Îõ7½ë§Ñ¹h‰‡ÚÞ¬®tŒ ©t¥iW‚8ü÷ç_çð °$å +4X,C®Ýñ†wÜ, ›Ã#YÛs*"±:rÔÑåpûüR¯Ã¦ÓY»Ý ÖDšÒ4.m¸<©š+'o|ÉÑ=ɾé)‘Jø€²¨y¸v¿zÅ@aC¦ýõã‹J(ݤ‚)}9î$þÔ£÷.wE¨&±RQÜ„ÌF€´Í«ýÅÄDU4bÀ±†ocóÎë^ñ-ÙòñI|"¨rn|i†ÃÑ|QAÆ:I;íF3£btn¶ý8VR+ÍÄW¦rúÂX}Ó{ë.”Æ:VW:Ö†øZ¼÷!¿Ò>÷Lä¦g3¾¾„@,¢dTÐ@*•.ñQ)‘’—\ì´õb=3˜_ÖlYR–¥Ð*J¢ÊäZ{ UUUY{ib£íB¡» ™BíwhH,ª»M¤–ºî_ŒÀP`õ¼·¼½Ù[wNyGB(-i±Ø]îGÄ‹(‚ñÞq4™ñòú ž–ºÙºæö£@2†`H-‚ŒQ«šIôON¸cDKÆÝàÒVÜ“µíZfÏK9Ë çÊF*z- #ƒ±¥mtÖ·'âµ?ôsÀ&¸N‘D:’à-äUFÙþ<Ð˾ãë½Ê¼¬‚bÑݼõÅߤҵá R7Ûí¶‚÷åÌ—Ó†–<æ@Ììá™­'ºyy{~ÓíÿàE¯ü6„´*™ˆyQÿ™}€ê…~M)Ö{$žU`Ťä,£d¶¤Q«»þœ[^@&„8çƒgDºŽ—E°Þž«ÜVóq÷0Dûîo~Òþ`VmïN Qý^×x Oðà¼õÁ:HVÍóÛÅ ·¾b¾ŽjKLðü”ý¼†ˆÜÁ§üÜÓ¾Þ÷rÔŽVuêŽ\@íën~Ý»ƒ1Ï ˆ¨‘fmi@äƒA8ž]†ƒcØÉÅLh±røÄ‹Ð:µ'- $ÉWÇ3O™”ÔÜqÄA‚徊p-HÍ>„à9/­U´q ,Œ5û•m%© „!x%…&Ä:ŽRLó´à£¸µ4)Ýͷݱ7žj ˆ˜u É*’I IÙÚœ—O¼üÍ >dRÏø©›öU¼È^)n>{¾g_÷³¼õó pPp)¸2Ó#¹}È€d8Í $£àe-ÔtÍ`vÒhf+èm"Äpõ4±’j?¨©ø®ÇyêŠP38qå¿×2!! xšÎ‹ú.TdzÞï“CI×'”®_Y"˜9ZÀ{¤ÙÝßþö¥¥å‡Ÿx¤Ñi0q 9‚ÀPL*@c¬³2L*Õ;|3š›@jíÁìì7R Ô½Ð|ù§Þ_‹ýYwž>»AðÞ!ˆdm—©$ØI² 4Ž\×kË|ËúËq¬ËÉ\Ií*GAÔûS A„ T«ÙO¦¨ˆ+”sd1H²s¤ÅA>W'EBøzþ‚‰öe(PM·Sm×´xÄQb*ë´€s™…¢Xk0 kÈGÿO{W#Ùu•¿sî½o©WU]½÷ôŒg<ŒÍØF‰c²Ø±Y&IJ–@0Ù²ˆàO@æüþEB‚€‚ˆÀHA(È`ÄŸ‡D„ÄÙ`lj=3=ÓÓëÔöê-÷ÞÃ÷jgF2Êtó#>*µªnW½íÜåÜs¾ó–f@rÈýí/|úÚÜ‹›Êr&¾Jt[×¢ Ì@i‘pdCäŽûÞj”1¨yp«Ž4颵7uR@j<Áõå^„˜ Ê €@˜[wÔÚ¸Ôïö² ˆ´áŠ»M¼BEôã”xUQvãÊ|çìWþÛß@#†€“ðU ¶Uêh=Ü ¾Å×dq²Z)*¿y‚0 ˜$4 e¢*f¤Œ®–ãYCªPEQ”ÌÎ »ðÛè¾öÍÏ?i»» ­X+k%÷uNk rž¢I4 \–Ú¬›†Ã4Ãêq¤V…˜fzœ,V¥’ù™õ›ÆÞÖë#;ÊP:t5”³Œ ø´4Qãöûîÿö¿¦ƒíoF,£ÁnÄb À\—scPŒFççâ—_üÇÔîÞòc ²9DG9Zé€òÕDŒéG!¨jžTâÙ—LÖ[K¢I SU‰„áÄ—0‹@i8HMŸà§a}m~„ý³húúã¯ÏIwnœoíž;»¼÷ûè ºŠš‰‚IȈ©(„œN2e@Œ$bVãL¡É®{€ƒFÆéD0ôß•úVåä…¶ÖAy®ñ­,€‰ð%âù,•~?]>Öt‡J‹s2ÚÊ éAÞ£N§¹:oŠýW¿ö7ŸÐÍï|ð#I¤ˆÆ‰UÕܨ`‚@JÈ’²¤ußð‚š°U¦NLA` ðâsËA€,5Cä#Ä%P„*ƒd¸|öëŸ{Âu7V’2ÛÙK.‹îñ£k;—7t¨+4ÀW㢪ª e™:!Á(ESåÞ×y€SüÙX¤_Ÿõ{Vx-¢€!`V(+okA6£Q¹¾¾¾½÷?X®0ÊØÒ ¬°¼Ò,®´‘ifÝ2–Ðyоÿó¯sAsoÿàCÐMPÁÌ\£+dê!ßh4ЬëúiÞ8"O4%!Åv.bu=+S¨À+ˆ@FÈ·²‹Oÿý_ì]úÖrSÅ(´8]‚#@±é*Œ…K”ÖÓí¦I#j†ÍË;ƒÅ¥ÅÝí^”Ä%ùB颦žr´#Ü3éíßýZ|À*Ÿï¨1!¨'.­ál„8ÏóV+Â{ö…a*œ3J›Pgeáà’V§Y€IXÁ1м²û/ÿÝõR2ͅݼ ¹ùw¿çýáÜ:Є÷þìK/>󽺽ñÂúZ³Ñ\µýû#ŸPîl½ö­ÿøÒÍ?´ÒHÖàzN‘öaøÙÏ>~qã…Åî®·Sr9œ„¥‘PˆàE¼Xve+ælØ?z䦭½Rò@áì+/]_Lm—™QÕ¤H¡îš ¼jóõYÎÜb¿ò½à¡ ¬\n{]ÝBi‹~Úm-r‘; §½ÓZ»¢H{NÇMGìœQòD¾Ú]y!OR& ›Úz•ï´mŠ4xù_^ÚÚé—Y¸ÜZjUlo´v9aíÝþ^·eZT4Ž [Ñ&1p|)Ù|ñ+ûg_‚jEš2\öy…êôZ8Ìúy–rx::y„^BA01Mµäy·Ûi,œÛ¸² 5 ¾ïxçÕ×^LÚ±è†ÈP(/‘õUÝÒÎÈÚ‘Õ4ȳÝ(`Ÿ;Wú(ˆœs¬Ui½ÓóbÞ“.«Ù ±… ÀY–5Zíaš‰Ñ™Uy™„ÍÅ~F•ã·ÝûX9 At R€ž2ú CJȶ‡bﹿýËÿ>¾JÙ-†»J, ¡šCßRËo¹ã>>–&ŠeÔÍÈÁ«|&$µ¹Î Û…»øüS6Üz¦cºÊõ#¢w •rûäé;ßv7 \E4¨Ò©¨R9ìy˜œÇÎ…ç>÷dÚßX™§2Û”gòÍ(ûY–™0 ˆ'Wñ›Ô½Õ„Ì ¤­F2æ…˜‘:GNll ÃæúÝ?ùs˜?ŠÂ@·¡[ Ð;m&DÈ•F|9TF0ØEdá/=ûןìn½4Ÿ AEÁ 4çñ™G~Kow€ëãrð*Ÿ¤8’—* êxyIIDATPb!ûù¹§Ÿûòã-Þ2~'Ö°¥ê—Aók§ÞqêÖwcåf` h–Î8Ò̼ª%`ÔYŒ2€+@¼‡Ï!F¾úäã‘Îúû监$;Ô,y–’ø(˜ðáT1V®üv¾´ž8jÌ_º\¨æÑ sâö3?…æ ¼G(¦2y&lˆÍÄ$µ;w Z€(²´D°Cð;/í©Ï{¯¶¤§F[-c‡…í£³|ÛÞ|ÿ¯A­@…WI/8H9`•OýS•+#;÷üß?ûÏÇ–\Ú½Ðn·{¸ŽONßuæCX¸eÕÕÊ}ÍJ†þ-WzÐ-—s p#9¨‡tóÙ/>¹sþ…¥&°íJÖ]˜OF£!å5@ä5 ªZia5.0ó'ÞõàÃŽ XñVC•q–«Hp%…ƒÒX®‹UŽèÊG!(ÊKŸÿówì¶œ_нa6œ;vú¿.Øûó“0GA-СšpVOìÓľ—ÝÍ×—ÙáÐ;½Ûs{YXªõ»~æ1´ß w ê E‚ F4´ª™éªçï(UÈRE뢪^Dëä¾ï¡3þΈ—JI¬Sæ´·+¾†A mQ”£AHpéPò²/\ÜÎ’•[ÞõÀÃHNÀ¬ ©9Xi({¾Å‡ªÔRhX†ã:B$ÄVÃëÚyjÀM‹?þðǼj;oDT3ŠŠÑåfè>û©?DÙ;VO%’&~ZmeÒ2ꇊ;íyg5‡‹öÉæÒ­÷|ø×Aóà6(¬`Bð žå±‘ô21<`+Ç•7?±6Ft´vσêäGmÒ°‘Xë£ Þ¿¼[Ú\+ÞÛßÊóœMüʹÝ[îø‘·½çgÑ:ê8«Äƒèu®ØIù±qìKÃkxªSµ!¾ò:(ÇPÉ=Ò\9¹±—YÄ™E£Ý@0Nö>D9`•“—à‘ÉfÐ £ÆÏ ŒÙ}_!¦S†5 à¨Fr`Ø9$GÚGhÀ pä`æº`]Þ¸4¨¹R‚e”•—-Ö¼ƒf0y[¥ MÒ-¯Ô7f+‹0°ºþ7×öKÕKFi¯Ýˆm–2kÄÞûÞ¨ßJZi𙓠À†! x£f¦ï싘1.hl¾LZ$+ŽÈK‰A‘åøU#RÜûö:•MZ¦1©ËzNÛåjߞȿîÈ0!®œm½â %¤ÎÿÛŸ~tN.…XÏ*Ùó«w}ôOÀë˜|Æ @Íh¾®\í¬¯?Ñô‚Ç·6óß«^ÚáË›‹ßyo3-W<ºÚ7¦ï_¸ÆS»j+0 Ÿ\Ó$ºNê øÊžç©R¿ÂtÕë¹–ÐUní þôpä°7…oÊÿ»¼©òï9ySåßsò¦Ê¿çäññÌîQÍ‹IEND®B`‚nco-4.5.4/doc/opendap.sh000077500000000000000000000105411264355130400150410ustar00rootroot00000000000000#!/bin/sh # $Header$ # Purpose: Install OPeNDAP prior to building NCO as DAP-enabled clients # NB: OPeNDAP/DODS netCDF client library versions 3.4.X are obsolete # NCO versions > 3.0.1 support OPeNDAP client library versions > 3.5.1 # This file contains up-to-date instructions # See file dods.sh for supporting older NCO with older DODS libraries # Terminology: # Protocol is DAP, its free implementation is OPeNDAP (analogous to SSH/OpenSSH) # DODS-terminology is being obsoleted in favor of DAP-terminology # Transition is not complete yet, so hybrid is necessary, e.g., DAP_ROOT # Testing: # NCO/SDO server/repositories are accessible via DAP at # http://esmf.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/ # http://soot.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/ # http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata/ # Physical locations of these repositories is # soot.ess.uci.edu:/var/www/html/dodsdata # dust.ess.uci.edu:/var/www/html/dodsdata # esmf.ess.uci.edu:/data/dodsdata # WWW of repositories is # http://dust.ess.uci.edu/dodsdata/ # http://esmf.ess.uci.edu/dodsdata/ # Example DAP-enabled commands: # ncks -M http://dust.ess.uci.edu/nco/in.nc # wget # ncks -M -p http://dust.ess.uci.edu/nco in.nc # wget # ncks -M -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc # DAP (borken server) # ncks -M -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc # DAP # ncks -M -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in_4.nc # DAP # ncks -M -p http://thredds.ucar.edu/thredds/catalog/grib/NCEP/GFS/Global_2p5deg/files/GFS_Global_2p5deg_20140304_0000 # DAP # ncra -O -C -D 3 -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc in.nc ~/foo.nc # ncwa -O -C -D 3 -a lat,lon,time -d lon,-10.,10. -d lat,-10.,10. -l /tmp -p http://www.cdc.noaa.gov/cgi-bin/nph-nc/Datasets/ncep.reanalysis.dailyavgs/surface pres.sfc.1969.nc ~/foo.nc # ncks -D 3 http://eclipse.ncdc.noaa.gov:9090/thredds/dodsC/isccp-d1/2001/ISCCP.D1.1.GLOBAL.2001.01.01.0000.GPC -d lat,1,2 -d lon,1,2 ~/test.nc # ncks -M -p http://username:password@esgcet.llnl.gov/cgi-bin/dap-cgi.py/ipcc4/sresa1b/ncar_ccsm3_0 pcmdi.ipcc4.ncar_ccsm3_0.sresa1b.run1.atm.mo.xml # Usage: # Set installation directory below ${DAP_ROOT} # ~/nco/doc/opendap.sh # Default invocation retrieves, builds, and installs DAP in ${DATA}/tmp # ${DATA}/tmp exists on most machines, and equals /tmp when ${DATA} is not defined cd ${DATA}/tmp # Remove debris from last DAP install /bin/rm -r -f DODS* libnc-dap* libdap* wget ftp://ftp.unidata.ucar.edu/pub/opendap/source/libdap-3.7.3.tar.gz wget ftp://ftp.unidata.ucar.edu/pub/opendap/source/libnc-dap-3.7.0.tar.gz # Resolve DAP dependencies on external libraries apt-file search libcurl.a sudo aptitude install libcurl3-dev apt-file search libxml2.a sudo aptitude install libxml2-dev # Assume tar is GNU tar, otherwise must gunzip tarballs first # NCO only needs these packages pre-installed to enable NCO as DAP clients... tar xvzf libdap-3.7.3.tar.gz # Provides libdap++.a tar xvzf libnc-dap-3.7.0.tar.gz # Provides libnc-dap.a # Set permanent installation directory (/tmp is not permanent!) export DAP_ROOT='/usr/local' # For server (rather than private) installs #export DAP_ROOT=`pwd` sudo /bin/rm -r ${DAP_ROOT}/include/libdap ${DAP_ROOT}/include/libnc-dap sudo /bin/rm ${DAP_ROOT}/lib/libdap* ${DAP_ROOT}/lib/libnc-dap* # Go to common source directory shared by all DAP packages cd ${DATA}/tmp/libdap-3.7.3 # Set compiler environment variables CC and CXX before building # export OBJECT_MODE='64' # AIX-specific hack # AIX: # CC='xlc_r' CFLAGS='-qsmp=omp' CXX='xlC_r' LDFLAGS='-brtl' FC='g95' ./configure --prefix=${DAP_ROOT} # LINUX: FC='gfortran' ./configure --prefix=${DAP_ROOT} #FC='g95' ./configure --prefix=${DAP_ROOT} # CC='icc -std=c99' CFLAGS='-O3 -g -mp -w1' CPPFLAGS='' CXX='icpc' CXXFLAGS='-O3 -g -mp -w1' FC='ifort' FFLAGS='-O3 -g -axW -mp -vec_report1' F90FLAGS='-O3 -g -axW -mp -vec_report1' ./configure --prefix=${DAP_ROOT} # LINUXAMD64: Explicitly set 64-bit? # CFLAGS='-m64' CXXFLAGS='-m64' ./configure --prefix=${DAP_ROOT} # Build necessary libraries make sudo make install cd ${DATA}/tmp/libnc-dap-3.7.0 FC='gfortran' ./configure --prefix=${DAP_ROOT} #FC='g95' ./configure --prefix=${DAP_ROOT} make sudo make install # Keep DAP libraries in ${DAP_ROOT} so NCO finds them and in the darkness binds them printf "OPeNDAP installed. DAP-enabled NCO may now be built.\n" nco-4.5.4/doc/problems_old.shtml000066400000000000000000000463221264355130400166140ustar00rootroot00000000000000 NCO Homepage

    Known Problems through 2012 (version 4.2.3)

      Older Generic Run-time Problems:
    • MM3 slowdown: A longstanding “feature” of netCDF3 was identified in March, 2012, and is now known by the tag MM3. The MM3 issue can lead to unusually slow performance. The problem is triggered by an aggregate pattern of file access so the workaround must be implemented in the application software (e.g., NCO) rather than in the netCDF library itself. The name MM3 fits because the problem is normally encountered on Multi-record Multi-variable netCDF3 files. And we call our “solution” the MM3-workaround. If you encounter unusually slow NCO performance while using NCO to analyze MM3 files on a large blocksize filesystem, chances are you are encountering an MM3-induced slowdown. NCO release 4.1.0 implements the MM3-workaround for ncks. It speeds-up common ncks sub-setting on NCAR's GLADE by 10-50x. MM3-induced slowdowns are present in other NCO operators and we are prioritizing our MM3-patches to those encountered most often. Thanks to Gary Strand for reporting this problem, and to Russ Rew for creating the workaround algorithm, which is also now in nccopy.
    • NOFILL bug: All netCDF versions prior to 4.1.3 may create corrupt netCDF3 files when linked to any version of NCO except 4.0.8. The solution is to install netCDF version 4.1.3 or later. The corruption occurs silently (without warning or error messages). The problem has been seen "in the wild" only on filesystems with large block sizes (e.g., Lustre), although it may be more widespread. It is caused by a netCDF bug that NCO triggers by invoking NOFILL mode for faster writes. Hence it is called the NOFILL bug. The bug is hard to trigger, it depends on a rare interaction of filesystem block-size, hyperslab size, and order-of-variable writing. The bug exists in all versions of netCDF through 4.1.2. If you have a large block filesystem and cannot upgrade your netCDF library, then use NCO version 4.0.8, which disables NOFILL mode (and thus writes files more slowly). NCO 4.0.8 and will workaround the NOFILL bug on all versions of netCDF (i.e., 4.1.2 and earlier). Hence NCO 4.0.8 will always correctly write netCDF3 files. Other temporary workarounds include creating only netCDF4 files (e.g., ncks -4 ...) instead of netCDF3 files. The NOFILL patch included in NCO 4.0.8 was subsequently removed in NCO 4.0.9, which assumes that netCDF 4.1.3 or later is installed.
    • Degenerate hyperslabbing bug: Versions ???—4.0.6 could return incorrect hyperslabs when user-specified hyperslabs did not include at least one point. In such cases, instead of returning no data, hyperslabs could return all data. To determine whether your NCO is affected by this bug, run these commands: ncks -O -v lat -d lat,20.,20.001 ~/nco/data/in.nc ~/foo.nc;ncks -H ~/foo.nc If the returned hyperslab contains any data, then your NCO is buggy (because that hyperslab should be empty). This can lead to incorrect answers for hyperslabs that should be empty. Analogous problems would occur with empty auxiliary coordinate bounding boxes. Although most users do not specify empty hyperslabs, we urge all users to upgrade to NCO 4.0.7+ just to be safe.
    • Threading problems with MSA: NCO version 3.9.5 has a nasty bug that causes threaded arithmetic operators, e.g., nces to produce incorrect results under some conditions. The problem may occur whenever OpenMP is enabled and the operators run on a multi-core CPU with more than one thread. These incorrect answers, if generated, are relatively easy to notice. The number of threads used to generate a file is, by default, recorded in the global attribute nco_openmp_thread_number which may be examined with ncks -M foo.nc | grep nco_openmp_thread_number. The only action that will correct a file that you think (or know) contains corrupted data because of this NCO bug is to re-process the file with a non-buggy NCO version. Version 3.9.5 is buggy and should be upgraded ASAP. Be careful with data processed using this NCO version on multi-core CPUs. The (one-line!) patch to fix this bug in 3.9.5 is here.
    • Index-based hyperslab problems: NCO versions 2.7.3—2.8.3 have a nasty bug that causes index-based hyperslabs, e.g., -d lat,1, to behave like value-based hyperslabs, e.g., -d lat,1.0 under some conditions. Unfortunately, the incorrect answers generated may be hard to notice! This problem was most often enountered by users trying to assemble monthly averages using the stride feature of ncrcat. One common symptom is that the time-offset of the output file is incorrect. Versions 2.7.3—2.8.3 are buggy and should be upgraded ASAP. Re-do any data-processing that used index-based hyperslabbing with these versions of NCO.
      Older Operator-specific Run-time Problems:
    • ncks bug with auxiliary coordinates: Versions 4.2.x–4.3.1 of ncks did not correctly support auxiliary coordinates (specified with -X). Auxiliary coordinates continued to work with the other hyperslabbing NCO operators. Auxiliary coordinates once again work in all hyperslabbing operators, including on netCDF4 group files in operators that support them. Fixed in version 4.3.2.
    • ncatted bug on implicit attribute names: Versions 4.2.x–4.3.0 of ncatted could segfault when processing attributes specified implicitly (i.e., by leaving the attribute field blank in the -a specification. Fixed in version 4.3.1.
    • ncbo bug handling certain special variables: Version 4.3.0 of ncbo inadvertently always turns off certain exceptions to variable list processing. This may cause some grid-related variables (e.g., ntrm and nbdate) and some non-grid variables (e.g., ORO and gw) to be arithmetically processed (e.g., subtracted) even when that makes no sense in most climate model datasets. Fixed in version 4.3.1.
    • ncks bug copying metadata: Version 4.2.6 of ncks does not copy variable metadata by default. Thus output files appear stripped of metadata. One can work around this problem in 4.2.6 by specifying the -m option. Otherwise an upgrade is recommended. Fixed in version 4.3.0.
    • ncks bug subsetting variables: Version 4.2.4 of ncks sometimes dumps core when subsetting variables with -v var. Fixed in version 4.2.5.
    • ncks bug with altering record dimensions: Version 4.2.4 of ncks ignored both the --mk_rec_dmn and the --fix_rec_dmn switches. It exited successfully without altering the record variable. Fixed in version 4.2.5.
    • nces bug with non-record files: Versions 4.2.1—4.2.3 of nces incorrectly referenced the record variable on files which do not contain it. This caused a segmentation violation and core dump.
    • ncra bug when last file(s) is/are superfluous: Versions 4.2.1—4.2.3 of ncra incorrectly skipped writing the results of the final normalization when trailing files were superfluous (not used). In the most common case, all values are zeros in the output file. Upgrade if you call ncra with trailing superfluous files.
    • ncecat bug when files generated with -n: Version 4.2.2 of ncecat could incorrectly skip the first input file in the default mode (RECORD_AGGREGATE) when the -n NINTAP switch is used to automate filename generation. Upgrade if you use ncecat -n.
    • ncra bug handling CF coordinates attributes that contain the name of the record coordinate: Versions 4.0.3—4.0.4 of ncra incorrectly treat the record variable (usually time) as a fixed variable if it is specified in the coordinates attribute of any variable in a file processed with CCM/CCSM/CF metadata conventions. This bug caused core dumps, and even weirder behavior like creating imaginary time slices in the ouput. Upgrade recommended if you work with NCAR CCSM/CESM model output. One workaround that does not require NCO upgrades is to remove the record coordinate name (usually time) from the coordinates attribute of all variables in CF-compliant files before processing the file with ncra.
    • ncra bug averaging YYYYMMDD-format date variables in CCSM/CF-compliant files: Versions ???—4.0.5 of ncra contain a bug which produces an incorrect average (usually zero) of the date variable which many CCSM/CF-compliant files use to track model dates in the human-readable YYYYMMDD-format. Averaging YYYYMMDD-format integers is intrinsically difficult, since such dates have calendar assumptions built-in. NCO attempts this in CCSM/CF-compliant files by using the nbdate (beginning date) and time (days since nbdate) variables to find the average date, converting that to YYYYMMDD, and writing that as the average value of date.
    • ncks bug hyperslabbinging fixed netCDF4 dimensions: Versions 4.0.3—4.0.4 of ncks contain a bug which triggers a core-dump when hyperslabbing (along a non-record dimension) a netCDF4-format input file into a netCDF4-format output file, e.g., ncks -d 0,1,lat in4.nc out4.nc. Three workarounds that do not require NCO upgrades (or downgrades) are to explicitly specify chunking with, e.g., ncks --cnk_plc=all -d 0,1,lat in4.nc out4.nc, or, to use nces instead of ncks for hyperslabbing, e.g., nces -d 0,1,lat in4.nc out4.nc (nces does a no-op when there is only one input file), or to write to a netCDF3 file, ncks -3 -d 0,1,lat in4.nc out3.nc.
    • Core dump with ncks: Printing variables to screen with ncks can trigger a segfault in NCO 3.9.9—4.0.3. Users may upgrade, downgrade, or apply this one-line patch to 3.9.9 sources: Remove this line “*cnk_sz=(size_t)NULL;” —near line 751 of nco/src/nco/nco_netcdf.c— should fix the problem. The problem in later NCO versions is due to a different bug and this patch will not work.
    • ncrename erroneous error exit: Versions 4.0.1—4.0.3 of ncrename contain a bug where commands like ncrename -a .old_nm,new_nm in.nc out.nc would, if old_nm did not exist, write the correct file and then exit with an error message although no error had occurred. The files written were fine, and the error message can be safely ignored. This was due to not clearing an extraneous return code.
    • ncbo segmentation fault: ncbo versions 4.0.0—4.0.2 incorrectly refreshed internal metadata, leading to segmentation faults and core dumps with some exacting compilers, notably xlC on AIX.
    • ncra segmentation fault: ncra versions 4.0.0—4.0.1 mishandled some CF-compliant dates, leading to segmentation faults and core dumps.
    • Arithmetic problems with ncap division, modulo, and exponentiation: ncap versions < 3.0.1 incorrectly exponentiate variables to variable powers (V^V). We recommend that all ncap users upgrade.
      ncap versions up to 2.9.1 incorrectly handle division, modulo, and exponentiation operations of the form S/V, S%V, and S^V where first operand (S) is scalar (i.e., either typed directly in the ncap script or converted from an attribute) and the second operand (V) is a full variable (i.e., stored in a file or computed by ncap). Instead of the requested quantity, ncap returned V/S, V%S, and V^S. In other words ncap treated some non-commutative operations as commutative. This is now fixed. The V/V, V%V, V^V, V/S, V%S, V^S, S/S, S%S, and S^S operations were never affected. We recommend that all ncap users upgrade.
    • Incorrect ncbo output for packed input: ncbo versions ???—3.2.0 incorrectly write differences of packed input. This only affects packed variables.
    • Problems with ncflint and missing_values: The algorithm ncflint used to perform interpolation in versions up to 2.9.4 was not commutative. It returned the weighted valid datum when the other datum was missing_value, or it returned missing_value, depending on the order the input files were specified. As of version 2.9.5, ncflint always returns missing_value when either input datum is missing_value. Possible future implementations are discussed here.
    • Problems with ncra and nces when missing_value = 0.0: The algorithm ncra and nces used to perform arithmetic in versions up to 2.9.2 breaks if missing_value is 0.0. Why, you ask? Running average (or total, etc.) algorithms must initialize the answer to 0.0. This is done since the sum accumulates in place as ncra and nces proceeds across records and files. (Normalizing this accumulation by the total number of records is the last step). The old algorithm compared both the current running average and the new record to the missing_value. If either comparison matched, then nothing accumulated for that record. This zero-initialization led to a state where it was impossible to ever recognize valid data. As a result nothing accumulated and the answer was always zero. The record and ensemble averages would also fail (in a non-obvious) way whenever an intermediate sum equalled missing_value. The chances of the latter event ever happening are exceedingly remote. The new algorithm compares only the new record to the missing_value. This fixes both problems and is faster, too.
    • Packing problems with ncwa: NCO versions ???—2.9.0 have a bug that causes ncwa to fail (produce garbage answers) when processing packed NC_FLOAT data. Version 2.9.1 fixes this problem. This problem may have been noticed most by OPeNDAP users since many netCDF climate datasets served by OPeNDAP are packed NC_FLOATs. Upgrade to 2.9.1 if you use ncwa on packed data.
    • Packing problems with ncap: NCO versions 2.8.4—2.8.6 have a bug that causes the ncap intrinsic packing function pack() to fail. Version 2.8.7 fixes this problem.
      Older Platform-specific Run-time Problems:
    • Float-valued intrinsic arithmetic functions in ncap on AIX: ncap versions through 4.0.4 have a bug that causes all float-valued intrinsic math functions to fail under AIX. Float-valued math functions are the ISO C99 functions, e.g., cosf(), fabsf(), logf(). The user does not invoke these functions directly— the user always specifies the generic function name, e.g., cos(), abs(), log(). NCO automatically calls the native single precision (i.e., float-valued) math functions when the generic function argument is a native float (e.g., naked constants like 1.0f or variables stored as NC_FLOAT). Double precision arguments cause NCO to invoke the standard (double-valued) form of the generic function, e.g., cos(), fabs(), log().

    nco-4.5.4/doc/rtfm.txt000066400000000000000000000032011264355130400145600ustar00rootroot00000000000000Dear NCO user, This form letter response is being sent for one or more of the following reasons. Please read it, decide which apply, and respond accordingly: 1. You have mailed me a question or a bug report rather than posted it to http://sourceforge.net/projects/nco NCO is administered at this location. By posting your question/bug here you will simplify life for me, and make it possible for others to learn from your experience. Anonymous postings are accepted, but you can also decide register, and thus receive automatic notices when your questions are responded to, by visiting http://sourceforge.net/account/register.php SourceForge is not commercial--they are not trying to sell you anything. To get a response to your NCO question, post to the NCO Help Forum at http://sourceforge.net/forum/forum.php?forum_id=9830 or post your bug report to the NCO bug tracker at http://sourceforge.net/bugs/?group_id=3331 2. You have mailed me a question which shows that you are probably using an older version of NCO. Read the News and ChangeLog section on the homepage http://nco.sourceforge.net and you will find the feature you need exists in the latest version of NCO. Announcements of new versions and features are made on the very low volume mailing list nco-announce, which you can register for at http://lists.sourceforge.net/mailman/listinfo/nco-announce 3. You have not read and understood the manual. After reading the manual you should post your question to the Help Forum listed above. The most answerable questions are accompanied with the exact commands which are problematic, NCO version information, and file metadata. Thanks, Charlie nco-4.5.4/doc/soc_2006.txt000066400000000000000000000030331264355130400150460ustar00rootroot00000000000000Summer of Code 2006 Project: _CF Metadata Conventions for NCO Software_ The netCDF Operators (NCO, http://nco.sf.net) are a GPL'd scientific data analysis toolkit widely used in the geosciences. The Climate and Forecast (CF) metdata conventions provide a framework for indicating complex data attributes such as geophysical grids and processing history in netCDF datasets (http://www.cgd.ucar.edu/cms/eaton/cf-metadata). However, it is difficult to exploit the utility of CF-compliant datasets since the full CF standard is not implemented in generic data processing toolkits since doing so would be very complex. We propose a Summer of Code project to implement key CF parts in NCO. Specifically, the interested student will implement and propagate CF metadata conventions for 1. Missing data (CF convention Section 2.5.1) http://www.cgd.ucar.edu/cms/eaton/cf-metadata/CF-1.0.html#miss 2. Cell methods (Section 7.1) http://www.cgd.ucar.edu/cms/eaton/cf-metadata/CF-1.0.html#bnds 3. Compression by Gathering (Section 8.2) (time permitting) http://www.cgd.ucar.edu/cms/eaton/cf-metadata/CF-1.0.html#gath Tasks 1 and 2 can be accomplished within the eight week SOC period by a motivated student proficient in C and the GNU/GCC toolchain. The student will modify state-of-the-art scientific software which runs in cross-platform high performance computing environments. The advisor for this project is: Professor Charlie Zender Department of Earth System Science University of California at Irvine http://www.ess.uci.edu/~zender nco-4.5.4/doc/surfit.txt000066400000000000000000000036631264355130400151400ustar00rootroot00000000000000# Purpose: Project description for 2005 UCI Calit2 Surf-IT program # (Summer Undergraduate Research Fellowships in Information Technologies) Distributed Data Reduction Techniques Applied to California Climate Change Simulations PI: Charlie Zender, Department of Earth System Science Description: Climate simulations prepared for the Fourth Assessment Report (AR4) of the Intergovernmental Panel on Climate Change (IPCC) reside on a distributed network of storage archives known as the Earth System Grid (ESG). This project will use new Distributed Data Reduction and Analysis (DDRA) techniques to characterize the envelop of future Californian climate contained within these datasets. Our goals are two-fold: 1. To quantify the Californian climate expected under a variety of IPCC forcing scenarios. 2. To benchmark, characterize, and reduce bottlenecks encountered in DDRA of geophysical datasets. Recent Californian climate assessments are based on data from incomplete ranges of climate scenarios, and on simulations from out-of-date models because the storage to hold all the relevent simulations from state-of-the-art models does not exist at any one facility. Hence the DDRA techniques being developed as part of our NCO/SCO project will improve our understanding California's climate pathways. These DDRA techniques have never been applied to terascale ESG data. During this novel application, we will identify, characterize, and try to reduce DDRA bottlenecks encountered. We seek an upper division undergraduate to use the computer resources of the Earth System Modeling Facility (ESMF) to perform this research. The student will gain skills and understanding of high-performance computing, data analysis, and climate change. The student will work in a UNIX/Linux research environment and should have prior experience with data analysis, and environmental science. Further information about this project is available at http://nco.sf.net#prp_sei nco-4.5.4/doc/surfit_2013.txt000066400000000000000000000110271264355130400155760ustar00rootroot00000000000000# Purpose: Project description for 2013 UCI Calit2 Surf-IT program # (Summer Undergraduate Research Fellowships in Information Technologies) # Submitted to Stu Ross 20130228 (20130520: Notes on future SURF-IT ads: 1. Make first affiliation CS not ESS to get more CS applicants 2. Format ads so Windows line-breaking won't create widows/orphans 3. Prerequisites: Good programming skills at the level of third year computer science. Proficiency with C and a scripting language.) Optimized Storage Shapes for Multi-dimensional Gridded Datasets PI: Prof. Charlie Zender Departments of Earth System Science and Computer Science Description: Many if not most geophysical datasets such as climate simulations are stored in a self-describing data format called netCDF. Data access speeds vary by factors of thousands, and depends primarily upon how well their storage layout matches the hyperslab request. This project will improve understanding and parameterization of the optimal layout (i.e., the "chunking") to maximize fast access and minimize slow access to netCDF datasets. Our netCDF Operators (NCO) are a widely used, opensource toolkit for manipulating and analyzing (statistics, trends, comparison with observations) netCDF data. NCO supports a range of chunking policies, but has no heuristic for guiding the user on optimal chunking. The student will first conduct sensitivity tests to benchmark access times for common hyperslab requests. Then the student will construct and implement new, optimal chunking policies. The first few weeks would be devoted to literature review and to scripting benchmark tests to assess the dependence of wallclock time on data layout. The next few weeks would be analysis and hypothesis testing of generic chunking policies motivated by the benchmarking results. The last few weeks would be implementation and analysis of optimized chunking policies in NCO. Prerequisites: Proficiency with C and multi-dimensional data Outcomes: Skills and understanding of scientific data analysis, benchmarking, interpretation of results. Recommended Web sites and publications: 1. Chunking Data: Why it Matters http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_why_it_matters 2. Efficient Organization of Large Multidimensional Arrays http://cs.brown.edu/courses/cs227/archives/2008/Papers/FileSystems/sarawagi94efficient.pdf 3. Optimal Chunking of Large Multidimensional Arrays for Data Warehousing http://www.escholarship.org/uc/item/35201092 4. netCDF Operators http://nco.sf.net 5. Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. 6. Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. ************************************************************************ NB: Following project not "researchy" enough, maybe next year ************************************************************************ Next Generation Parser for Structured Data Analysis PI: Prof. Charlie Zender Departments of Earth System Science and Computer Science Description: Many if not most geophysical datasets such as climate simulations are stored in a self-describing data format called netCDF. Our netCDF Operators (NCO) are a widely used, opensource toolkit for manipulating and analyzing (statistics, trends, comparison with observations) netCDF data. This project will utilize ANTLR (ANother Tool for Language Recognition) to generate the NCO language parser in C++. Our goals are two-fold: 1. To create and efficient, extensible parser for structured data analysis. 2. To enhance parallelism in geophysical data analysis involving structured data with storage constraints. Prerequisites: Familiarity with C/C++ and data Outcomes: Skills and understanding of scientific language construction, data analysis, open source software development and climate change. Recommended Web sites and publications: 1. ANother Tool for Language Recognition http://www.antlr.org 2. netCDF Operators http://nco.sf.net 3. Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. 4. Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. nco-4.5.4/doc/surfit_2014.txt000066400000000000000000000114201264355130400155740ustar00rootroot00000000000000# Purpose: Project description for 2014 UCI Calit2 Surf-IT program # (Summer Undergraduate Research Fellowships in Information Technologies) # 20140416: Submitted to Brittany Gray cat > ${HOME}/sdn_ugr_03_adv.txt << 'EOF' Optimized Storage Shapes for Multi-dimensional Gridded Datasets PI: Prof. Charlie Zender Departments of Computer Science and of Earth System Science Description: Many if not most geophysical datasets such as climate simulations are stored in a self-describing data format called netCDF. Data access speeds vary by factors of thousands, and depends primarily upon how well their storage layout matches the hyperslab request. This project will improve understanding and parameterization of the optimal layout (i.e., the "chunking") to maximize fast access and minimize slow access to netCDF datasets. Our netCDF Operators (NCO) are a widely used, opensource toolkit for manipulating and analyzing (statistics, trends, comparison with observations) netCDF data. NCO supports a range of chunking policies, yet has no heuristic for guiding the user on optimal chunking. The student will first conduct sensitivity tests to benchmark access times for common hyperslab requests. Then the student will construct and implement new, optimal chunking policies. The goal is for the student to systematically "discover" the optimal chunking algorithm for a given multi-dimensional array shape. The first few weeks would be devoted to literature review and to scripting benchmark tests to assess the dependence of wallclock time on data layout. The next few weeks would be analysis and hypothesis testing of generic chunking policies motivated by the benchmarking results. The last few weeks would be implementation and analysis of optimized chunking policies in NCO. Prerequisites: Good programming skills at the level of third year computer science. Proficiency with C and a scripting language. Outcomes: Skills and understanding of scientific data analysis, benchmarking, interpretation of results. Recommended Web sites and publications: 1. Chunking Data: Why it Matters http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_why_it_matters 2. Efficient Organization of Large Multidimensional Arrays http://cs.brown.edu/courses/cs227/archives/2008/Papers/FileSystems/sarawagi94efficient.pdf 3. Optimal Chunking of Large Multidimensional Arrays for Data Warehousing http://www.escholarship.org/uc/item/35201092 4. netCDF Operators http://nco.sf.net 5. Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. 6. Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. EOF scp ${HOME}/sdn_ugr_03_adv.txt dust.ess.uci.edu:/var/www/html/hire URL: http://dust.ess.uci.edu/hire/sdn_ugr_03_adv.txt ************************************************************************ NB: Following project not "researchy" enough, maybe next year ************************************************************************ cat > ${HOME}/sdn_ugr_02_adv.txt << 'EOF' Next Generation Parser for Structured Data Analysis PI: Prof. Charlie Zender Departments of Earth System Science and Computer Science Description: Many if not most geophysical datasets such as climate simulations are stored in a self-describing data format called netCDF. Our netCDF Operators (NCO) are a widely used, opensource toolkit for manipulating and analyzing (statistics, trends, comparison with observations) netCDF data. This project will utilize ANTLR (ANother Tool for Language Recognition) to generate the NCO language parser in C++. Our goals are two-fold: 1. To create and efficient, extensible parser for structured data analysis. 2. To enhance parallelism in geophysical data analysis involving structured data with storage constraints. Prerequisites: Familiarity with C/C++ and data Outcomes: Skills and understanding of scientific language construction, data analysis, open source software development and climate change. Recommended Web sites and publications: 1. ANother Tool for Language Recognition http://www.antlr.org 2. netCDF Operators http://nco.sf.net 3. Zender, C. S., and H. J. Mangalam (2007), Scaling Properties of Common Statistical Operators for Gridded Datasets, Int. J. High Perform. Comput. Appl., 21(4), 485-498, doi:10.1177/1094342007083802. 4. Zender, C. S. (2008), Analysis of Self-describing Gridded Geoscience Data with netCDF Operators (NCO), Environ. Modell. Softw., 23(10), 1338-1342, doi:10.1016/j.envsoft.2008.03.004. EOF scp ${HOME}/sdn_ugr_02_adv.txt dust.ess.uci.edu:/var/www/html/hire URL: http://dust.ess.uci.edu/hire/sdn_ugr_02_adv.txt nco-4.5.4/doc/tags_doc.sh000077500000000000000000000012501264355130400151730ustar00rootroot00000000000000etags --langdef=doc --regex-doc='/[0-9]+\.[0-9]+\.[0-9]+/' ../acinclude.m4 ../configure.in ../configure.eg ../Makefile.am ../doc/nco.texi ../doc/ANNOUNCE ../doc/MANIFEST ../doc/NEWS ../doc/README ../doc/TODO ../doc/VERSION ../doc/debian.txt ../doc/dods.sh ../doc/index.shtml ../doc/ncap.txt ../doc/nco_news.shtml ../doc/nco_src_frg.txt ../debian/changelog ../debian/compat ../debian/control ../debian/convert ../debian/copyright ../debian/docs ../debian/files ../debian/info ../debian/postinst ../debian/postrm ../debian/prerm ../debian/rules ../debian/nco.doc-base ../bld/libnco_tst.c ../bld/libnco_c++_tst.cc ../bld/Makefile ../bld/nco.spec ../bld/nco_dst.pl ../bld/nco_tst.pl nco-4.5.4/doc/valgrind.txt000066400000000000000000000477641264355130400154440ustar00rootroot00000000000000# $Header$ # Purpose: Suppression file for valgrind # Default suppressed warnings in /usr/local/lib/valgrind/default.supp # Usage: # Use existing suppressions file on program: # valgrind --suppressions=${HOME}/c++/valgrind.txt ccc > ~/foo 2>&1 # More verbose output for leak checks # valgrind --leak-check=yes --suppressions=${HOME}/c++/valgrind.txt # ccc > ~/foo 2>&1 # Show reachable blocks during leak detection # valgrind --leak-check=yes --show-reachable=yes --suppressions=${HOME}/c++/valgrind.txt ccc > ~/foo 2>&1 # Ask valgrind to help by generating more suppresions: # valgrind --gen-suppressions=yes --suppressions=${HOME}/c++/valgrind.txt ccc > ~/foo 2>&1 # valgrind --gen-suppressions=yes --suppressions=${HOME}/c++/valgrind.txt --suppressions=/usr/lib/valgrind/default.supp ccc > ~/foo 2>&1 # File Format is: # { # name_of_suppression # tool_name:supp_kind # "For memcheck, supp_kinds are # Param Value1 Value2 Value4 Value8 Value16 # Free Addr1 Addr2 Addr4 Addr8 Addr16 # Cond (previously known as Value0) # (if Param: name of system call param, if Free: name of free-ing fn)" # caller0 name, or /name/of/so/file.so # caller1 name, or ditto # (optionally: caller2 name) # (optionally: caller3 name) # } # Valid example from /usr/lib/valgrind/default.supp { Debian_dlopen4 Memcheck:Addr1 obj:/lib/ld-2.3.2.so fun:_dl_check_map_versions fun:dl_open_worker fun:_dl_catch_error } # First, error suppressions on my personal code # Suppress warnings associated with touching system memory by # accessing command line arguments # ==2904== Invalid read of size 4 # ==2904== at 0x807B1A1: cmd_ln_sng(int, char const* const*) (utl.cc:435) # ==2904== Address 0x4FC2CC20 is on thread 1's stack { Questionable_read4_warning_from_libcsz_c++_utl_cc_cmd_ln_sng Memcheck:Addr4 fun:_Z10cmd_ln_sngiPKPKc } # Suppress common problem found with ccc 20040707: # ==22906== Invalid write of size 4 # ==22906== at 0x804E20C: main (ccc.cc:118) # ==22906== by 0x4044A507: __libc_start_main (../sysdeps/generic/libc-start.c:129) # ==22906== by 0x804E0E1: strcpy@@GLIBC_2.0 (in /home/zender/bin/LINUX/ccc) # ==22906== by ??? # ==22906== Address 0xBFC2DF34 is on thread 1's stack # { # strcpy/*libc_start_main*(Addr4) # Memcheck:Addr4 # fun:*main* # fun:*libc_start_main* # fun:strcpy* # } # Suppress common problem found with ccc 20040707: # ==7359== Invalid write of size 4 # ==7359== at 0x804BBBF: main (stl_alloc.h:652) # ==7359== Address 0x4FC2CBA0 is on thread 1's stack { Questionable_write4_warning_from_ccc_main Memcheck:Addr4 fun:main } # Suppress common problem found with ccc 20040707: # ==7359== Invalid read of size 4 # ==7359== at 0x3C4630C7: getenv (in /lib/tls/libc-2.3.2.so) # ==7359== Address 0x4FC2CBA0 is on thread 1's stack { Questionable_read4_warning_from_ccc_main_getenv Memcheck:Addr4 fun:getenv } # Suppress common problem found with ccc 20040707: # ==7359== Invalid read of size 4 # ==7359== at 0x3C3CE60E: std::string::string(char const*, std::allocator const&) (in /usr/lib/libstdc++.so.5.0.6) # ==7359== Address 0x4FC2CBA4 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_string Memcheck:Addr4 fun:_ZNSsC1EPKcRKSaIcE } # Suppress common problem found with ccc 20040707: # ==7440== Invalid write of size 4 # ==7440== at 0x3C3CDFB9: std::string::_Alloc_hider::_Alloc_hider(char*, std::allocator const&) (in /usr/lib/libstdc++.so.5.0.6) # ==7440== Address 0x4FFFDE10 is on thread 1's stack { Questionable_write4_warning_from_ccc_libstdc++_alloc_hider Memcheck:Addr4 fun:_ZNSs12_Alloc_hiderC1EPcRKSaIcE } # Suppress common problem found with ccc 20040707: # ==7445== Invalid read of size 4 # ==7445== at 0x3C4CD8D2: time (in /lib/tls/libc-2.3.2.so) # ==7445== Address 0x4FC2CBA0 is on thread 1's stack { Questionable_read4_warning_from_ccc_libc_time Memcheck:Addr4 fun:time } # Suppress common problem found with ccc 20040707: # ==7445== Invalid read of size 4 # ==7445== at 0x3C4CCF33: ctime (in /lib/tls/libc-2.3.2.so) # ==7445== Address 0x4FC2CBA0 is on thread 1's stack { Questionable_read4_warning_from_ccc_libc_ctime Memcheck:Addr4 fun:ctime } # Suppress common problem found with ccc 20040707: # ==7445== Invalid read of size 4 # ==7445== at 0x3C4CE7EF: (within /lib/tls/libc-2.3.2.so) # ==7445== Address 0x4FC2CFBC is on thread 1's stack { Questionable_read4_warning_from_ccc_libc Memcheck:Addr4 obj:/lib/tls/libc-2.3.2.so } # Suppress common problem found with ccc 20040707: # ==7451== Invalid read of size 4 # ==7451== at 0x3C3C327C: std::basic_ostream >& std::operator<< >(std::basic_ostream >&, char const*) (in /usr/lib/libstdc++.so.5.0.6) # ==7451== Address 0x4FC2CB60 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_ostream1 Memcheck:Addr4 fun:_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc } # Suppress common problem found with ccc 20040707: # ==7472== Invalid read of size 4 # ==7472== at 0x3C3C090C: std::basic_ostream >& std::operator<< , std::allocator >(std::basic_ostream >&, std::basic_string, std::allocator > const&) (in /usr/lib/libstdc++.so.5.0.6) # ==7472== Address 0x4FC2CB60 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_ostream2 Memcheck:Addr4 fun:_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E } # Suppress common problem found with ccc 20040707: # ==7472== Invalid read of size 4 # ==7472== at 0x3C020A33: strrchr (mac_replace_strmem.c:119) # ==7472== Address 0x4FC2CB60 is on thread 1's stack { Questionable_read4_warning_from_ccc_strrchr Memcheck:Addr4 fun:strrchr } # Suppress common problem found with ccc 20040707: # ==7477== Invalid read of size 1 # ==7477== at 0x3C020A36: strrchr (mac_replace_strmem.c:118) # ==7477== Address 0x4FC2CB64 is on thread 1's stack { Questionable_read1_warning_from_ccc_strrchr Memcheck:Addr1 fun:strrchr } # Suppress common problem found with ccc 20040707: # ==7472== Invalid read of size 4 # ==7472== at 0x3C3D0F59: std::string::compare(char const*) const (in /usr/lib/libstdc++.so.5.0.6) # ==7472== Address 0x4FC2CB60 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_compare Memcheck:Addr4 fun:_ZNKSs7compareEPKc } # Suppress common problem found with ccc 20040707: # ==7472== Invalid read of size 4 # ==7472== at 0x3C3C1676: std::ostream::operator<<(std::ostream& (*)(std::ostream&)) (in /usr/lib/libstdc++.so.5.0.6) # ==7472== Address 0x4FC2CB60 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_ostream3 Memcheck:Addr4 fun:_ZNSolsEPFRSoS_E } # Suppress common problem found with ccc 20050417: # ==9911== Invalid read of size 4 # ==9911== at 0x1BB7A326: std::string::length() const (in /usr/lib/libstdc++.so.6.0.3) # ==9911== Address 0x52BFDE00 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_length Memcheck:Addr4 fun:_ZNKSs6lengthEv } # Suppress common problem found with ccc 20050417: # ==9911== Invalid read of size 4 # ==9911== at 0x1BB7B893: std::string::assign(char const*, unsigned) (in /usr/lib/libstdc++.so.6.0.3) #==9911== Address 0x52BFDD30 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_assign Memcheck:Addr4 fun:_ZNSs6assignEPKcj } # Suppress common problem found with ccc 20050417: # ==9911== Invalid read of size 4 # ==9911== at 0x1BB7B56C: std::string::_M_mutate(unsigned, unsigned, unsigned) (in /usr/lib/libstdc++.so.6.0.3) # ==9911== Address 0x52BFDD30 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_M_mutate Memcheck:Addr4 fun:_ZNSs9_M_mutateEjjj } # Suppress common problem found with ccc 20050417: # ==11077== Invalid read of size 4 # ==11077== at 0x1BB7B2AF: std::string::assign(std::string const&) (in /usr/lib/libstdc++.so.6.0.3) # ==11077== Address 0x52BFDD20 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_assign Memcheck:Addr4 fun:_ZNSs6assignERKSs } # Suppress common problem found with ccc 20050417: # ==11577== Invalid read of size 4 # ==11577== at 0x1BB7A46B: std::string::find(char const*, unsigned, unsigned) const (in /usr/lib/libstdc++.so.6.0.3) # ==11577== Address 0x52BFDD20 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_find Memcheck:Addr4 fun:_ZNKSs4findEPKcjj } # Suppress common problem found with ccc 20050417: # ==11577== Invalid read of size 4 # ==11577== at 0x1BB7A702: std::string::find_first_of(char const*, unsigned, unsigned) const (in /usr/lib/libstdc++.so.6.0.3) # ==11577== Address 0x52BFDD20 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_find_first_of Memcheck:Addr4 fun:_ZNKSs13find_first_ofEPKcjj } # Suppress common problem found with ccc 20050417: # ==11577== Invalid read of size 4 # ==11577== at 0x1BB7D712: std::string::substr(unsigned, unsigned) const (in /usr/lib/libstdc++.so.6.0.3) # ==11577== Address 0x52BFDD20 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_substr Memcheck:Addr4 fun:_ZNKSs6substrEjj } # Suppress common problem found with ccc 20050417: # ==12886== Invalid read of size 4 # ==12886== at 0x1BB7D67C: std::string::string(std::string const&, unsigned, unsigned) (in /usr/lib/libstdc++.so.6.0.3) # ==12886== Address 0x52BFDD20 is on thread 1's stack { Questionable_read4_warning_from_ccc_libstdc++_string_string Memcheck:Addr4 fun:_ZNSsC1ERKSsjj } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-2.2 gcc-4.0.0 20050914: # ==1151== Syscall param writev(vector[...]) contains uninitialised or unaddressable byte(s) # ==1151== at 0x1B8E4C02: (within /lib/ld-2.3.2.so) # ==1151== Address 0x1BB0A718 is 32 bytes inside a block of size 72 alloc'd { Questionable_writev_warning_from_nco_mpich2-1.0.2_valgrind-2.2_gcc-4.0.0_problem1 Memcheck:Param writev(vector[...]) obj:/lib/ld-2.3.2.so fun:MPIDU_Socki_handle_write fun:MPIDU_Sock_wait fun:MPIDI_CH3_Progress_wait } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-2.2 gcc-4.0.0 20050914: # ==1164== Syscall param writev(vector[...]) contains uninitialised or unaddressable byte(s) # ==1164== at 0x1B8E4C02: (within /lib/ld-2.3.2.so) # ==1164== Address 0x52BFCFB4 is on thread 1's stack { Questionable_writev_warning_from_nco_mpich2-1.0.2_valgrind-2.2_gcc-4.0.0_problem2 Memcheck:Param writev(vector[...]) obj:/lib/ld-2.3.2.so fun:MPIDU_Sock_writev fun:MPIDI_CH3_iStartMsgv fun:MPID_Send } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-2.2 gcc-4.0.0 20050914: # ==1164== Syscall param write(buf) contains uninitialised or unaddressable byte(s) # ==1164== at 0x1B8E4C02: (within /lib/ld-2.3.2.so) # ==1164== Address 0x52BFD108 is on thread 1's stack { Questionable_writev_warning_from_nco_mpich2-1.0.2_valgrind-2.2_gcc-4.0.0_problem3 Memcheck:Param write(buf) obj:/lib/ld-2.3.2.so fun:MPIDU_Sock_write fun:MPIDI_CH3_iStartMsg fun:MPID_VCRT_Release } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-2.2 gcc-4.0.0 20050914: # ==1185== Syscall param write(buf) contains uninitialised or unaddressable byte(s) # ==1185== at 0x1B8E4C02: (within /lib/ld-2.3.2.so) # ==1185== Address 0x52BFCEA8 is on thread 1's stack { Questionable_writev_warning_from_nco_mpich2-1.0.2_valgrind-2.2_gcc-4.0.0_problem4 Memcheck:Param write(buf) obj:/lib/ld-2.3.2.so fun:MPIDU_Sock_write fun:MPIDI_CH3_iStartMsg fun:MPIDI_CH3U_Handle_recv_pkt } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==18618== Conditional jump or move depends on uninitialised value(s) # ==18618== at 0x1B8EC7D3: (within /lib/ld-2.3.5.so) { Questionable_cond_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_problem1 Memcheck:Cond obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==20985== Invalid read of size 8 # ==20985== at 0x80E5D88: (within /data/zender/bin/LINUX/mpncbo) # ==20985== Address 0x1BB06278 is 176 bytes inside a block of size 180 alloc'd # ==20985== at 0x1B8FF8A6: malloc (vg_replace_malloc.c:149) # ==20985== by 0x807F52E: new_x_NC_attr (attr.c:73) { Questionable_read8_warning_from_libnetcdf_new_x_NC_attr Memcheck:Addr8 obj:/data/zender/bin/LINUX/mpncbo } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==4864== Invalid read of size 4 # ==4864== at 0x1B8F4FA0: (within /lib/ld-2.3.5.so) # ==4864== by 0x1BA4EA1F: __nss_hosts_lookup (in /lib/tls/libc-2.3.5.so) # ==4864== Address 0x1BB0A1B0 is 24 bytes inside a block of size 27 { Questionable_read4_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1 Memcheck:Addr4 obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/libc-2.3.5.so fun:__nss_hosts_lookup } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==4864== Conditional jump or move depends on uninitialised value(s) # ==4864== at 0x1B8ECB13: (within /lib/ld-2.3.5.so) # ==4864== by 0x1BA510AA: gethostbyname (in /lib/tls/libc-2.3.5.so) { Questionable_cond_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_gethostbyname Memcheck:Cond obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/libc-2.3.5.so fun:__nss_hosts_lookup fun:gethostbyname_r fun:gethostbyname } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==4864== Syscall param writev(vector[...]) points to uninitialised byte(s) # ==4864== at 0x1BA339F3: writev (in /lib/tls/libc-2.3.5.so) # ==4864== by 0x80DB2F6: MPIDU_Socki_handle_write (in /data/zender/bin/LINUX/mpncbo) { Questionable_param_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_problem1 Memcheck:Param writev(vector[...]) fun:writev fun:MPIDU_Socki_handle_write fun:MPIDU_Sock_wait fun:MPIDI_CH3_Progress_wait fun:MPIC_Wait fun:MPIC_Send fun:MPIR_Bcast fun:MPI_Bcast fun:main.J fun:__libc_start_main obj:/data/zender/bin/LINUX/mpncbo } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==7001== Syscall param writev(vector[...]) points to uninitialised byte(s) # ==7001== at 0x1BA339F3: writev (in /lib/tls/libc-2.3.5.so) # ==7001== by 0x80D9373: MPIDU_Sock_writev (in /data/zender/bin/LINUX/mpncbo) { Questionable_param_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_problem2 Memcheck:Param writev(vector[...]) fun:writev fun:MPIDU_Sock_writev fun:MPIDI_CH3_iStartMsgv fun:MPID_Send fun:MPIC_Send fun:MPIR_Bcast fun:MPI_Bcast fun:main.J fun:__libc_start_main obj:/data/zender/bin/LINUX/mpncbo } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==7380== Syscall param write(buf) points to uninitialised byte(s) # ==7380== at 0x1B94F35E: __write_nocancel (in /lib/tls/libpthread-2.3.5.so) # ==7380== by 0x80D8DF2: MPIDU_Sock_write (in /data/zender/bin/LINUX/mpncbo) { Questionable_param_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_problem3 Memcheck:Param write(buf) fun:__write_nocancel fun:MPIDU_Sock_write fun:MPIDI_CH3_iStartMsg fun:MPID_VCRT_Release fun:MPID_Finalize fun:MPI_Finalize fun:main.J fun:__libc_start_main obj:/data/zender/bin/LINUX/mpncbo } # Suppress common problem found in NCO mpncbo with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==7876== Syscall param write(buf) points to uninitialised byte(s) # ==7876== at 0x1B94F35E: __write_nocancel (in /lib/tls/libpthread-2.3.5.so) # ==7876== by 0x80D8DF2: MPIDU_Sock_write (in /data/zender/bin/LINUX/mpncbo) { Questionable_param_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_problem4 Memcheck:Param write(buf) fun:__write_nocancel fun:MPIDU_Sock_write fun:MPIDI_CH3_iStartMsg fun:MPIDI_CH3U_Handle_recv_pkt fun:MPIDI_CH3I_Progress_handle_sock_event fun:MPIDI_CH3_Progress_wait fun:MPID_Finalize fun:MPI_Finalize fun:main.J fun:__libc_start_main obj:/data/zender/bin/LINUX/mpncbo } # Suppress common problem found in NCO mpncra with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==8563== Conditional jump or move depends on uninitialised value(s) # ==8563== at 0x1B8F4DEE: (within /lib/ld-2.3.5.so) # ==8563== by 0x1B9C9CA1: getpwuid (in /lib/tls/libc-2.3.5.so) { Questionable_cond_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_getpwuid Memcheck:Cond obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/libc-2.3.5.so fun:__nss_passwd_lookup fun:getpwuid_r fun:getpwuid } # Suppress common problem found in NCO mpncra with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==8563== Conditional jump or move depends on uninitialised value(s) # ==8563== at 0x1B8F4F7C: (within /lib/ld-2.3.5.so) # ==8563== by 0x1BA1DBCF: __nss_passwd_lookup (in /lib/tls/libc-2.3.5.so) { Questionable_cond_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_passwd_lookup Memcheck:Cond obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/libc-2.3.5.so fun:__nss_passwd_lookup } # Suppress common problem found in NCO mpncra with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # =9343== Invalid read of size 4 # ==9343== at 0x1B8F4F89: (within /lib/ld-2.3.5.so) # ==9343== by 0x1BA411DD: __libc_dlopen_mode (in /lib/tls/libc-2.3.5.so) { Questionable_read4_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_dlopen_mode Memcheck:Addr4 obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode } # Suppress common problem found in NCO mpncra with mpich2-1.0.2 valgrind-3.0.1 icc-8.1 20050914: # ==9343== Invalid read of size 4 # ==9343== at 0x1B8F4FA0: (within /lib/ld-2.3.5.so) # ==9343== by 0x1B906DFC: _nss_compat_getpwuid_r (in /lib/tls/libnss_compat-2.3.5.so) { Questionable_read4_warning_from_nco_mpich2-1.0.2_valgrind-3.0.1_icc-8.1_getpwuid_r Memcheck:Addr4 obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:_dl_open obj:/lib/tls/libc-2.3.5.so obj:/lib/ld-2.3.5.so fun:__libc_dlopen_mode fun:__nss_lookup_function obj:/lib/tls/libnss_compat-2.3.5.so fun:_nss_compat_getpwuid_r } # Suppress common problem found in NCO Ubuntu 5.10 valgrind-3.0.1 gcc-4.0.2 20051022: # ==18629== Conditional jump or move depends on uninitialised value(s) # ==18629== at 0x1B8EC82D: (within /lib/ld-2.3.5.so) { Conditional_jump_or_move_nco_ubuntu-5.10_valgrind-3.0.1_gcc-4.0.2 Memcheck:Cond obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so obj:/lib/ld-2.3.5.so } nco-4.5.4/doc/xmp/000077500000000000000000000000001264355130400136575ustar00rootroot00000000000000nco-4.5.4/doc/xmp/add_crd.sh000077500000000000000000000025021264355130400155750ustar00rootroot00000000000000#!/bin/bash #============================================================ # Example for # - regrid (using bi_interp.nco): the spatial resolution of MODIS data # is much finer than those of CMIP5 models. In order to compare # the two, we can regrid MODIS data to comform to CMIP5. # - add coordinates (using coor.nco): there is no coordinate information # in MODIS data. We have to add it manually now. # # Input files: # /modis/mcd43c3/cesm-grid/MCD43C3.2000049.regrid.nc # # Output files: # /modis/mcd43c3/cesm-grid/MCD43C3.2000049.regrid.nc # # Online: http://nco.sourceforge.net/nco.html#Add-Coordinates-to-MODIS-Data # # Execute this script: bash add_crd.sh #============================================================ var=( 'MOD10CM' ) # Variable fld_in=( 'snc/nc/' ) # Folder of input files drc_in='/media/grele_data/wenshan/modis/' # directory of input files for fn in $( ls ${drc_in}${fld_in}${var}*.nc ); do # Loop over files sfx=$( echo ${fn} | cut -d '/' -f 8 | cut -d '.' -f 2-4 ) # Part of file names echo ${sfx} # Rename dimension names ncrename -d YDim_MOD_CMG_Snow_5km,lat -d XDim_MOD_CMG_Snow_5km,lon -O \ ${drc_in}${fld_in}${var}.${sfx}.nc ${drc_in}${fld_in}${var}.${sfx}.nc # Add coordinates ncap2 -O -S crd.nco ${drc_in}${fld_in}${var}.${sfx}.nc \ ${drc_in}${fld_in}${var}.${sfx}.nc done nco-4.5.4/doc/xmp/ann_avg.sh000077500000000000000000000146151264355130400156360ustar00rootroot00000000000000#!/bin/bash # Includes gsl_rgr.nco #=========================================================================== # After cmb_fl.sh # Example: Annual trend of each model over Greenland and Tibet # ( time- and spatial-average, standard deviation, # anomaly and linear regression) # # Input files: # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_185001-200512.nc # # Output files: # /data/cmip5/outout/snc/snc_LImon_all-mdl_historical_all-nsm_annual.nc # # Online: http://nco.sourceforge.net/nco.html#Annual-Average-over-Regions # # Execute this script: bash ann_avg.sh #=========================================================================== #--------------------------------------------------------------------------- # Parameters drc_in='/home/wenshanw/data/cmip5/' # Directory of input files drc_out='/home/wenshanw/data/cmip5/output/' # Directory of output files var=( 'snc' 'snd' ) # Variables rlm='LImon' # Realm xpt=( 'historical' ) # Experiment ( could be more ) fld_out=( 'snc/' 'snd/' ) # Folders of output files # ------------------------------------------------------------ for var_id in {0..1}; do # Loop over two variables # Names of all models # (ls [get file names]; cut [get the part for model names]; # sort; uniq [remove duplicates]; awk [print]) mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | \ cut -d '_' -f 3 | sort | uniq -c | awk '{print $2}' ) for mdl in ${mdl_set}; do # Loop over models # Loop over ensemble members for fn in $( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc ); do pfx=$( echo ${fn} | cut -d'/' -f6 | cut -d'_' -f1-5 ) # Two regions # Geographical weight ncap2 -O -s 'gw = cos(lat*3.1415926/180.); gw@long_name="geographical weight"\ ;gw@units="ratio"' ${fn} ${drc_out}${fld_out[var_id]}${pfx}_gw.nc # Greenland ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon \ ${drc_out}${fld_out[var_id]}${pfx}_gw.nc \ ${drc_out}${fld_out[var_id]}${pfx}_gw_1.nc # Tibet ncwa -O -w gw -d lat,30.0,40.0 -d lon,80.0,100.0 -a lat,lon \ ${drc_out}${fld_out[var_id]}${pfx}_gw.nc \ ${drc_out}${fld_out[var_id]}${pfx}_gw_2.nc # Aggregate 2 regions together ncecat -O -u rgn ${drc_out}${fld_out[var_id]}${pfx}_gw_?.nc \ ${drc_out}${fld_out[var_id]}${pfx}_gw_rgn4.nc # Change dimensions order ncpdq -O -a time,rgn ${drc_out}${fld_out[var_id]}${pfx}_gw_rgn4.nc \ ${drc_out}${fld_out[var_id]}${pfx}_gw_rgn4.nc # Remove temporary files (optional) rm ${drc_out}${fld_out[var_id]}${pfx}_gw_?.nc \ ${drc_out}${fld_out[var_id]}${pfx}_gw.nc # Annual average (use the feature of 'Duration') ncra -O --mro -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9",12,12 \ ${drc_out}${fld_out[var_id]}${pfx}_gw_rgn4.nc \ ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc # Anomaly # Long-term average ncwa -O -a time ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc \ ${drc_out}${fld_out[var_id]}${pfx}_clm.nc # Subtract long-term average ncbo -O --op_typ=- ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc \ ${drc_out}${fld_out[var_id]}${pfx}_clm.nc \ ${drc_out}${fld_out[var_id]}${pfx}_anm.nc done rm ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*_yrly.nc # Average over all the ensemble members ncea -O -4 ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_${mdl}_${xpt[0]}_*_anm.nc ${drc_out}${fld_out[var_id]}\ ${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm.nc # Standard deviation ------------------------------ for fn in $( ls ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_*_anm.nc ); do pfx=$( echo ${fn} | cut -d'/' -f8 | cut -d'_' -f1-5 ) # Difference between each ensemble member and the average of all members ncbo -O --op_typ=- ${fn} \ ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_${mdl}_${xpt[0]}_all-nsm_anm.nc \ ${drc_out}${fld_out[var_id]}${pfx}_dlt.nc done # RMS ncea -O -y rmssdn ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_*_dlt.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_sdv.nc # Rename variables ncrename -v ${var[var_id]},sdv \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_sdv.nc # Edit attributions ncatted -a standard_name,sdv,a,c,"_standard_deviation_over_ensemble" \ -a long_name,sdv,a,c," Standard Deviation over Ensemble" \ -a original_name,sdv,a,c," sdv" \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_sdv.nc #------------------------------------------------------------ # Linear regression ----------------------------------------- #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Have to change the name of variable in the commands file # of gsl_rgr.nco manually (gsl_rgr.nco is listed below) ncap2 -O -S gsl_rgr.nco \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_anm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}\ _${rlm}_${mdl}_${xpt[0]}_all-nsm_anm_rgr.nc #!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # Get rid of temporary variables ncks -O -v c0,c1,pval,${var[var_id]},gw \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_all-nsm_anm_rgr.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc #------------------------------------------------------------ # Move the variable 'sdv' into the anomaly files (i.e., *anm.nc files) ncks -A -v sdv \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_sdv.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc rm ${drc_out}${fld_out[var_id]}${var[var_id]}_*historical* echo Model ${mdl} done! done # Store models as groups in the output file ncecat -O --gag ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_all-mdl_${xpt[0]}_all-nsm_annual.nc echo Var ${var[var_id]} done! done nco-4.5.4/doc/xmp/ann_avg_grp.sh000066400000000000000000000035071264355130400165010ustar00rootroot00000000000000#!/bin/bash # #============================================================ # Group data output by cmb_fl_grp.sh # Annual trend of each model over Greenland and Tibet # Time- and spatial-average, standard deviation and anomaly # No regression yet (needs ncap2) # # Input files: # sn_LImon_all-mdl_all-xpt_all-nsm_200001-200512.nc # # Online: http://nco.sourceforge.net/nco.html#Annual-Average-over-Regions # # Execute this script: bash ann_avg_grp.sh #=========================================================================== # Input and output directory drc='../data/grp/' # Constants pfx='sn_LImon_all-mdl_all-xpt_all-nsm' tms='200001-200512' # Time series # Greenland ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon \ ${drc}${pfx}_${tms}.nc \ ${drc}${pfx}_${tms}_grl.nc # Tibet ncwa -O -w gw -d lat,30.0,40.0 -d lon,80.0,100.0 -a lat,lon \ ${drc}${pfx}_${tms}.nc \ ${drc}${pfx}_${tms}_tbt.nc # Aggregate 2 regions together ncecat -O -u rgn ${drc}${pfx}_${tms}_???.nc \ ${drc}${pfx}_${tms}_rgn2.nc # Change dimensions order ncpdq -O -a time,rgn ${drc}${pfx}_${tms}_rgn2.nc \ ${drc}${pfx}_${tms}_rgn2.nc # Remove temporary files (optional) rm ${drc}${pfx}_${tms}_???.nc #Annual average ncra -O --mro -d time,,,12,12 ${drc}${pfx}_${tms}_rgn2.nc \ ${drc}${pfx}_${tms}_rgn2_ann.nc # Anomaly #------------------------------------------------------------ # Long-term average ncwa -O -a time ${drc}${pfx}_${tms}_rgn2_ann.nc \ ${drc}${pfx}_${tms}_rgn2_clm.nc # Subtract ncbo -O --op_typ=- ${drc}${pfx}_${tms}_rgn2_ann.nc \ ${drc}${pfx}_${tms}_rgn2_clm.nc \ ${drc}${pfx}_${tms}_rgn2_anm.nc #------------------------------------------------------------ # Standard Deviation: inter-annual variability # RMS of the above anomaly ncra -O -y rmssdn ${drc}${pfx}_${tms}_rgn2_anm.nc \ ${drc}${pfx}_${tms}_rgn2_stddev.nc nco-4.5.4/doc/xmp/bi_interp.nco000077500000000000000000000111371264355130400163410ustar00rootroot00000000000000// Bilinear interpolation // Included by rgr.sh // Online: http://nco.sourceforge.net/nco.html#Regrid-MODIS-Data defdim("latn",192); // Define new dimension: latitude defdim("lonn",288); // Define new dimension: longitude latn[$latn] = {90,89.0576 ,88.1152 ,87.1728 ,86.2304 ,85.288 ,\ 84.3456 ,83.4031 ,82.4607 ,81.5183 ,80.5759 ,79.6335 ,78.6911 ,\ 77.7487 ,76.8063 ,75.8639 ,74.9215 ,73.9791 ,73.0367 ,72.0942 ,\ 71.1518 ,70.2094 ,69.267 ,68.3246 ,67.3822 ,66.4398 ,65.4974 ,\ 64.555 ,63.6126 ,62.6702 ,61.7277 ,60.7853 ,59.8429 ,58.9005 ,\ 57.9581 ,57.0157 ,56.0733 ,55.1309 ,54.1885 ,53.2461 ,52.3037 ,\ 51.3613 ,50.4188 ,49.4764 ,48.534 ,47.5916 ,46.6492 ,45.7068 ,\ 44.7644 ,43.822 ,42.8796 ,41.9372 ,40.9948 ,40.0524 ,39.11 ,\ 38.1675 ,37.2251 ,36.2827 ,35.3403 ,34.3979 ,33.4555 ,32.5131 ,\ 31.5707 ,30.6283 ,29.6859 ,28.7435 ,27.8011 ,26.8586 ,25.9162 ,\ 24.9738 ,24.0314 ,23.089 ,22.1466 ,21.2042 ,20.2618 ,19.3194 ,\ 18.377 ,17.4346 ,16.4921 ,15.5497 ,14.6073 ,13.6649 ,12.7225 ,\ 11.7801 ,10.8377 ,9.89529 ,8.95288 ,8.01047 ,7.06806 ,6.12565 ,\ 5.18325 ,4.24084 ,3.29843 ,2.35602 ,1.41361 ,0.471204,-0.471204,\ -1.41361,-2.35602,-3.29843,-4.24084,-5.18325,-6.12565,-7.06806,\ -8.01047,-8.95288,-9.89529,-10.8377,-11.7801,-12.7225,-13.6649,\ -14.6073,-15.5497,-16.4921,-17.4346,-18.377 ,-19.3194,-20.2618,\ -21.2042,-22.1466,-23.089 ,-24.0314,-24.9738,-25.9162,-26.8586,\ -27.8011,-28.7435,-29.6859,-30.6283,-31.5707,-32.5131,-33.4555,\ -34.3979,-35.3403,-36.2827,-37.2251,-38.1675,-39.11 ,-40.0524,\ -40.9948,-41.9372,-42.8796,-43.822 ,-44.7644,-45.7068,-46.6492,\ -47.5916,-48.534 ,-49.4764,-50.4188,-51.3613,-52.3037,-53.2461,\ -54.1885,-55.1309,-56.0733,-57.0157,-57.9581,-58.9005,-59.8429,\ -60.7853,-61.7277,-62.6702,-63.6126,-64.555 ,-65.4974,-66.4398,\ -67.3822,-68.3246,-69.267 ,-70.2094,-71.1518,-72.0942,-73.0367,\ -73.9791,-74.9215,-75.8639,-76.8063,-77.7487,-78.6911,-79.6335,\ -80.5759,-81.5183,-82.4607,-83.4031,-84.3456,-85.288,-86.2304,\ -87.1728,-88.1152,-89.0576,-90}; // Copy of CCSM4 latitude lonn[$lonn] = {-178.75,-177.5,-176.25,-175,-173.75,-172.5,-171.25,\ -170,-168.75,-167.5,-166.25,-165,-163.75,-162.5,-161.25,-160,\ -158.75,-157.5,-156.25,-155,-153.75,-152.5,-151.25,-150,-148.75,\ -147.5,-146.25,-145,-143.75,-142.5,-141.25,-140,-138.75,-137.5,\ -136.25,-135,-133.75,-132.5,-131.25,-130,-128.75,-127.5,-126.25,\ -125,-123.75,-122.5,-121.25,-120,-118.75,-117.5,-116.25,-115,\ -113.75,-112.5,-111.25,-110,-108.75,-107.5,-106.25,-105,-103.75,\ -102.5,-101.25,-100,-98.75,-97.5,-96.25,-95,-93.75,-92.5,-91.25,\ -90,-88.75,-87.5,-86.25,-85,-83.75,-82.5,-81.25,-80,-78.75,-77.5,\ -76.25,-75,-73.75,-72.5,-71.25,-70,-68.75,-67.5,-66.25,-65,-63.75,\ -62.5,-61.25,-60,-58.75,-57.5,-56.25,-55,-53.75,-52.5,-51.25,-50,\ -48.75,-47.5,-46.25,-45,-43.75,-42.5,-41.25,-40,-38.75,-37.5,\ -36.25,-35,-33.75,-32.5,-31.25,-30,-28.75,-27.5,-26.25,-25,-23.75,\ -22.5,-21.25,-20,-18.75,-17.5,-16.25,-15,-13.75,-12.5,-11.25,-10,\ -8.75,-7.5,-6.25,-5,-3.75,-2.5,-1.25,0,1.25,2.5,3.75,5,6.25,7.5,\ 8.75,10,11.25,12.5,13.75,15,16.25,17.5,18.75,20,21.25,22.5,23.75,\ 25,26.25,27.5,28.75,30,31.25,32.5,33.75,35,36.25,37.5,38.75,40,\ 41.25,42.5,43.75,45,46.25,47.5,48.75,50,51.25,52.5,53.75,55,56.25,\ 57.5,58.75,60,61.25,62.5,63.75,65,66.25,67.5,68.75,70,71.25,72.5,\ 73.75,75,76.25,77.5,78.75,80,81.25,82.5,83.75,85,86.25,87.5,88.75,\ 90,91.25,92.5,93.75,95,96.25,97.5,98.75,100,101.25,102.5,103.75,\ 105,106.25,107.5,108.75,110,111.25,112.5,113.75,115,116.25,117.5,\ 118.75,120,121.25,122.5,123.75,125,126.25,127.5,128.75,130,131.25,\ 132.5,133.75,135,136.25,137.5,138.75,140,141.25,142.5,143.75,145,\ 146.25,147.5,148.75,150,151.25,152.5,153.75,155,156.25,157.5,\ 158.75,160,161.25,162.5,163.75,165,166.25,167.5,168.75,170,171.25,\ 172.5,173.75,175,176.25,177.5,178.75,180}; // Copy of CCSM4 longitude *out[$time,$latn,$lonn]=0.0; // Output structure // Bi-linear interpolation bsa_sw_less=bilinear_interp_wrap(bsa_sw,out,latn,lonn,lat,lon); wsa_sw_less=bilinear_interp_wrap(wsa_sw,out,latn,lonn,lat,lon); // Add attributions latn@units = "degree_north"; lonn@units = "degree_east"; latn@long_name = "latitude"; lonn@long_name = "longitude"; bsa_sw_less@hdf_name = "Albedo_BSA_shortwave"; bsa_sw_less@calibrated_nt = 5; bsa_sw_less@missing_value = 32767.0; bsa_sw_less@units = "albedo, no units"; bsa_sw_less@long_name = "Global_Albedo_BSA_shortwave"; wsa_sw_less@hdf_name = "Albedo_WSA_shortwave"; wsa_sw_less@calibrated_nt = 5; wsa_sw_less@missing_value = 32767.0; wsa_sw_less@units = "albedo, no units"; wsa_sw_less@long_name = "Global_Albedo_WSA_shortwave"; nco-4.5.4/doc/xmp/cmb_fl.sh000077500000000000000000000067611264355130400154520ustar00rootroot00000000000000#!/bin/bash # shell type shopt -s extglob # enable extended globbing #=========================================================================== # Some of the models cut one ensemble member into several files, # which include data of different time periods. # We'd better concatenate them into one at the beginning so that # we won't have to think about which files we need if we want # to retrieve a specific time period later. # # Method: # - Make sure 'time' is the record dimension (i.e., left-most) # - ncrcat # # Input files like: # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_185001-190012.nc # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_190101-200512.nc # # Output files like: # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_185001-200512.nc # # Online: http://nco.sourceforge.net/nco.html#Combine-Files # # Execute this script: bash cmb_fl.sh #=========================================================================== drc_in='/home/wenshanw/data/cmip5/' # Directory of input files var=( 'snc' 'snd' ) # Variables rlm='LImon' # Realm xpt=( 'historical' ) # Experiment ( could be more ) for var_id in {0..1}; do # Loop over two variables # Names of all the models (ls [get file names]; # cut [get model names]; # sort; uniq [remove duplicates]; awk [print]) mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | \ cut -d '_' -f 3 | sort | uniq -c | awk '{print $2}' ) # Number of models (echo [print contents]; wc [count]) mdl_nbr=$( echo ${mdl_set} | wc -w ) echo "==============================" echo "There are" ${mdl_nbr} "models for" ${var[var_id]}. for mdl in ${mdl_set}; do # Loop over models # Names of all the ensemble members nsm_set=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc | \ cut -d '_' -f 5 | sort | uniq -c | awk '{print $2}' ) # Number of ensemble members in each model nsm_nbr=$( echo ${nsm_set} | wc -w ) echo "------------------------------" echo "Model" ${mdl} "includes" ${nsm_nbr} "ensemble member(s):" echo ${nsm_set}"." for nsm in ${nsm_set}; do # Loop over ensemble members # Number of files in this ensemble member fl_nbr=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc \ | wc -w ) # If there is only 1 file, continue to next loop if [ ${fl_nbr} -le 1 ] then echo "There is only 1 file in" ${nsm}. continue fi echo "There are" ${fl_nbr} "files in" ${nsm}. # Starting date of data # (sed [the name of the first file includes the starting date]) yyyymm_str=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc\ | sed -n '1p' | cut -d '_' -f 6 | cut -d '-' -f 1 ) # Ending date of data # (sed [the name of the last file includes the ending date]) yyyymm_end=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc\ | sed -n "${fl_nbr}p" | cut -d '_' -f 6 | cut -d '-' -f 2 ) # Concatenate one ensemble member files # into one along the record dimension (now is time) ncrcat -O ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc \ ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_\ ${nsm}_${yyyymm_str}-${yyyymm_end} # Remove useless files rm ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_\ !(${yyyymm_str}-${yyyymm_end}) done done done nco-4.5.4/doc/xmp/cmb_fl_grp.sh000066400000000000000000000066231264355130400163140ustar00rootroot00000000000000#!/bin/bash # #============================================================ # Aggregate models to one group file # # Method: # - Create files with groups by ncecat --gag # - Append groups level by level using ncks # # Input files like: # snc_LImon_CCSM4_historical_r1i1p1_199001-200512.nc # snd_LImon_CESM1-BGC_esmHistorical_r1i1p1_199001-200512.nc # # Output files like: # sn_LImon_199001-200512.nc # # Online: http://nco.sourceforge.net/nco.html#Combine-Files # # Execute this script: bash cmb_fl_grp.sh #============================================================ # Directories drc_in='../data/' drc_out='../data/grp/' # Constants rlm='LImon' # Realm: LandIce; Time frequency: monthly tms='200001-200512' # Timeseries flt='nc' # File Type # Geographical weights # Can be skipped when ncap2 works on group data # Loop over all snc files for fn in $( ls ${drc_in}snc_${rlm}_*_${tms}.${flt} ); do ncap2 -O -s \ 'gw = float(cos(lat*3.1416/180.)); gw@long_name="geographical weight";'\ ${fn} ${fn} done var=( 'snc' 'snd' ) xpt=( 'esmHistorical' 'historical' ) mdl=( 'CCSM4' 'CESM1-BGC' 'CESM1-CAM5' ) for i in {0..1}; do # Loop over variables for j in {0..1}; do # Loop over experiments for k in {0..2}; do # Loop over models ncecat -O --glb_mtd_spp -G ${xpt[j]}/${mdl[k]}/${mdl[k]}_ \ ${drc_in}${var[i]}_${rlm}_${mdl[k]}_${xpt[j]}_*_${tms}.${flt} \ ${drc_out}${var[i]}_${rlm}_${mdl[k]}_${xpt[j]}_all-nsm_${tms}.${flt} ncks -A \ ${drc_out}${var[i]}_${rlm}_${mdl[k]}_${xpt[j]}_all-nsm_${tms}.${flt} \ ${drc_out}${var[i]}_${rlm}_${mdl[0]}_${xpt[j]}_all-nsm_${tms}.${flt} done # Loop done: models ncks -A \ ${drc_out}${var[i]}_${rlm}_${mdl[0]}_${xpt[j]}_all-nsm_${tms}.${flt} \ ${drc_out}${var[i]}_${rlm}_${mdl[0]}_${xpt[0]}_all-nsm_${tms}.${flt} done # Loop done: experiments ncks -A \ ${drc_out}${var[i]}_${rlm}_${mdl[0]}_${xpt[0]}_all-nsm_${tms}.${flt} \ ${drc_out}${var[0]}_${rlm}_${mdl[0]}_${xpt[0]}_all-nsm_${tms}.${flt} done # Loop done: variables # Rename output file mv ${drc_out}${var[0]}_${rlm}_${mdl[0]}_${xpt[0]}_all-nsm_${tms}.${flt} \ ${drc_out}sn_${rlm}_all-mdl_all-xpt_all-nsm_${tms}.${flt} # Remove temporary files rm ${drc_out}sn?_${rlm}*.nc #- Rename Group: # E.g., file snc_LImon_CESM1-CAM5_historical_r1i1p1_199001-200512.nc # is now group /historical/CESM1-CAM5/CESM1-CAM5_00. # You can rename it to /historical/CESM1-CAM5/r1i1p1 to make more sense. # Note: You don't need to write the full path of the new name. ncrename -g ${xpt}/${mdl}/${mdl}_00,r1i1p1 \ ${drc_out}${var}_${rlm}_${mdl}_all-nsm_${tms}.${flt} #------------------------------------------------------------ # Output file structure #------------------------------------------------------------ # esmHistorical # { # CESM1-BGC # { # CESM1-BGC_00 # { # snc(time, lat, lon) # snd(time, lat, lon) # } # } # } # historical # { # CCSM4 # { # CCSM4_00 # { # snc(time, lat, lon) # snd(time, lat, lon) # } # CCSM4_01 # { # snc(time, lat, lon) # snd(time, lat, lon) # } # CCSM4_02 { ... } # CCSM4_03 { ... } # CCSM4_04 { ... } # } # CESM1-BGC # { # CESM1-BGC_00 { ... } # } # CESM1-CAM5 # { # r1i1p1 { ... } # CESM1-CAM5_01 { ... } # CESM1-CAM5_02 { ... } # } # } nco-4.5.4/doc/xmp/crd.nco000077500000000000000000000003251264355130400151330ustar00rootroot00000000000000// Add coordinates to MODIS HDF data // Included by add_crd.sh // Online: http://nco.sourceforge.net/nco.html#Add-Coordinates-to-MODIS-Data lon = array(0.f, 0.05, $lon) - 180; lat = 90.f- array(0.f, 0.05, $lat); nco-4.5.4/doc/xmp/fgr1.eps000077500000000000000000062230141264355130400152420ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 0 12 613 757 %%HiResBoundingBox: 0.000000 12.960000 612.000023 756.000029 %....................................... %%Creator: GPL Ghostscript 871 (epswrite) %%CreationDate: 2013/04/07 15:37:02 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2010 Artifex Software, Inc. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 1.001 0 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<¾Ô}öÛì?Q.VžW>yÀë@W§¢¸âÝÁoVWÖ¢Ê:$¬ò¬ê©V­ÞW½\_3Zk_ÛQ'W·§nñpôá‘#¶GÚëåëKê?M8ú°Á¥¡«Q½±òáXö±MAM?qji–i.iþ|<õ¸ð„߉þ³––V¹Ö²6´-«mödøÉ»?;þÜÓ®ÛÞÐÁî(9§²N½ü%â—§=N÷áži?«v¶®“ÙYÜ…tmêšïŽïö„ö Ÿs?××kÙÛù«Þ¯ÇÏ+¯½ q¡ì"åbáÅ•Ky—.§_ž»we²ocß“«!Wï÷ûö]ó¸vãºóõ«v—nXÝ8Óâæ¹[Ü[Ý·Mow š vþfò[çéP׳;=wÍïö¯¾8b3råžã½ë÷Ýîß];:ü ðÁñð1áÃè‡3’½yœýxéÉöqüxñSѧ•Ïäž5þ®õ{‡ÐTxaÂqbð¹ÿó'“¼ÉWdþ±"¼çVD\ÆYXŽÆä}Ä8¦äVDâ¸7fY7{”óQ"÷Q"ä}A”yA%BÞGD‰÷Q"ä}A”yA%BÞGD‰÷Q"ä}A”yA%BÞGD‰÷Q"ä}A”yA%BÞGD‰÷Q"ä}A”yA%BÞGD‰ü%vR!úkFíÀ/¨&òÅôúyi±º®íKºüIØ¡¸/ ,ïú«ª*ë7õ‚ J„¼ ˆ!ï#¢DÈû‚(šÛ<3HiŽQ±ŠâBÞ×öñj6N"^0áÎuP‰.šÛl$ÊLQ 2%Ê %¹@Þ'”hèi.ù’ιKJÒIAÞ’Rµ$^<‚“ø™J¼x3Sº÷åõÐGÒnšdw^ò’} õ¾ìÄ*AÚM„¬ODîWÁDŠó¾¬Å*±¤cÉŽ%Uþ’ŽÅ‚¼o©'x©Ç•,K­ð¥—‰"¼¯„“ZÂ1F§„J.áË÷¾¢Þê]Žpg¦´Š-áªYò–¦WN±‚b+sñ¾Lï[üis¡„¦;4T‡ ¾”xjI¯œ 74Tu˜E^S‹:$G½–&ëE 7(Ž5VTÅ.ïªYÎÉsbèó—ìdÑå 7îÍç *r)ÉÌ,Éîr$ŽÆâ`3ŠR(CÊDl>IEó“ýaôj1h,–²+ðlôÖL8×·Ùˆ§riDÞWBvz•¶ %ô!ûSqR ¶Âi†Sœ»2.}¬ªÇzuÑ®I;‡küóÞå÷êá°oBæ2Úm/Ī ¾_~~í'ÚÖX¾@‹]ÓKÜŸ4ɵèQ*]ÕßêÓ­“Ï¡1 «åÚÍ»¯×àÁƱv㽺÷{¼dUEªr@§"¾|}¯ýû&@uM¿ñùÓ |í/ËrÇ5>¯a#Ã"F_ªÛºµwìêv\Ò‘|…;ØyƒôeóçœÎøøòßAýB〤"wò+t\ÉÀÎáÚÞåcPâ8Éûˈ7bÊVÐ6…að1èÈT¸‰?PÀìì.ÿR¿p}Q÷í×èóM€Ÿ›Ì í*RTZ®Š2+qRm5èìOZ…c/5ߎe Úüh9 w Ñ›OÉøà>@õ]ó—ME8¼)nÝà€vu[.OE97bªÛu'oÊ XlK÷M³<°àQÚ”6‰^}º¬{ iL“ovÂMDã» ÷_¼ÛDmÌøî‹Ë|'ŸD\Z!^“Lðgqg7»t˜«…å+Xc†^šRT”MYg®Ö®‰FƒhªñIÝ4Ž›å=†Zû㟱2ûcH&(”¶áŽcþc䧦1¾ÇÐ ©5>mÄ×»MµP  qŸ vØMï­ck)#åñnòy*TÎ/Ì®7ÔòºmŠ-íîë5Õþ8Ü"]Á߯>Ýú¸±wúãU^-¼mŸRQæÓ¤ƒcö7}/B·,s¨›Ð¥¸?wÿe®7BEÍŽÔè零ð ùÎÎáÚ££+ Éþ>nìÀéWa[3±†¢?•æôhrRîGmg\«¨I}µò”Àûí~%ûãê=P¾iÅÆtõqcït}Óc‘…ŠRûfh«y*‡`­P$KšxRÕ©Ñph´<ÎõW’ýÀÊ­—§P3ûãecÑßôr.p"Ìå<@NÇøY³ü”ÂàæSîœÁqŸÒx3´MìÊÑÇ4"‹è/iï z +sV:ã3Å_¦iÉîh{—áöÇ‚>³?\QSv™¨v(AHÅjÂB¼ƒÖŒ6¡ª ¾ p`œ–<ˆZ¼!9¬’ö6%ia# $ØþðÑ-ÕþÒõ¾ŒoõéÖõWì­ßq³Û9ìFÇ&Ìïþx`_¸)ŠGKUí  ÷:ýllÂîë5x {›Ç€çîýÜ kL—·~]Éøº"Á î]>†×¯]šÒ£ÜýÇ>O©À”…”pÉ‚ÝÇÊÀÆJÈ~b~‡OÂÓ¬([OŸýãÃlËß"UëN  ÷–àóØu¡@uMËŠ@¹ï­§½Â7¬´/üªnðt]È–©¢•ØÐã·Êª€š…H|ÊÈ££+ì_øäÆs>‰„Eð¹{~O"ï˜Ýd;gw ¿Ôè_³—qÅ›˜;§€wãCBX}ºU×°wrÌø¸±g¶’†Ý×çAwãÑ8ƹRU5wøºŒö‚aÐCÚ<þca ìP|xsÊök€íFH>Ùl\ouíÑ/ÂIag–»L7ƒï^7¯eºÎ;!]„êMßÒ›²ë1]9{´ šdB3åP’U`reòØV7cVn½1bâ=gwY¬'%Âà6¾á^ZU@¦U]æ»°Y~ÂoÛÀ$+̘@šªuÁWɱë­ÜzÉ*|åÖËoß~Æš«s¿tÓÎ﬿jgA@ë5h*Ÿ…A¥•„T_oòe8d¾2¶;.´¬d~a9»¾×¯µ?µH££ÔÔDÒ‹¯T÷V/]—ânœ40ñÝ­÷õgP;ÚyË£%û“Æ=ý±Ãb»â½~ì@$ûS‹´¥•ó2>­ëb|*{—~ªïüÐ$<‘J› X… ¼œÜxŽïrsßÝÐUòÅ“ñÕ°ß%¹wÞ¾‚¶Û‚ÖøÊä>‰Ûâ=½î—_Œ'¤Ýj?´Ôù.Í*l_ìó1<|§™;ÅìO*Òb&$TšŒO ‘د<Ûe_òÐëxhG‡é(LÁŸ ¦¢†~<è8¹ñ|åèôq˜B?UÏ©©Öޝ­1>ÔF2m`ãÃAŸí‚ð‚CÎ+1REÒM¾¦´·[«§>óNè<ýñjýuw'Òò¢¿´â¾é¨©.Ck|ìw=f‚] w(=U…·“Ý„ÒÁ§R¾€ßµ'X’¬‹,Æç€fœÏÚD‚¶ ŸÆ‡8{¸ûáóç°ûzi 7« n"¸±df„ï_ðéð; !áÐïøé{øò Üu9cjo÷xbóÎá«Çp¸¶wùøÛ·Ÿáù.+·^V?\¨ÙNÐÝH¥F*Þç±?U Ó„\€ªª´=}R¢ñ=| ßÀO½¥²7ã û¯úDh;§;¶5EF»ÊÿRƒïcÆÇ~bí%¾/»ª„»-5ˆïáËoà§'íêêbÚ;Ý­á@—§(A߇ϟŸûekïäx¯†3ï~}øÎíÂ|€MÊ€[Ó)ûÓa¢óûFÓh`¿ûæôÇ«§?^…mÑÄ9Àªñ±vÏbÍ57>æƒ w–™J$8æž¹³‡»8¼µRãÖ{()OÔâ„úØø}ðÛ{ž=ðÞq]7qUUÅ‚>{!¿‡/ÙØ…$$Ký7±Ø ¨ªªº&N¢ÞÔ<€Á"Yøó“Mï•l®ºšxy,åÏ…$¼/Pž8Üc î›Õ§[–á.VÞ'µçR™ñqûÃV´Ç–H0wÖ_±ìÏÞɉҞ—!Ü@¨*â}|'ìüí<ˆƒ˜Õ§[ø¬IAŽëë{P_”Å 5>Í,e‹ŠäFú4ÿÝÔD|8èS;XþüdS{‡ö bö7BéH(¾÷ù—,@“áJy®8fÇ¿þðù3¼)æDÒf¥=h%û¤{ÿ‚€éè´ß«¨ºÞýž«öõë´=5éhã¿iV/]€‡~=ùã™4/Ê¥<Ð&¡P}ÕIQúj||ñ.è´a9:¡gF±¼^Îý²…§gƒtŒÛ–µ‹:‘ˆŠ"{_:ŸüdHîÃÇvkëÃQ˜ñ;{ÄgúÞè€N¡ß˜Ù CWÉ‹ö»š9ùãYÓÁ·-Ç>¦~È×uóð<8†;þ@ׂºg»ê~ëZÎQxd'E|ê7öμ;À÷#7l£ÿZ÷î^NH&‡Heœw¨úÜä²]nœ UíT8ñYÎ|îól—ãh|ƒN¶ÖÚ´·kîlÅuò1èVf{ÅÅ_ê lÄpÙóQŽGíMÒt(!ø’ráú"|õÆ)Û5Uý^ð>ækö;#﬿‚øpþ9|² »o×xjßܽ‡UdÈ|rÍòö¾ݳ„÷è€Mm‘F9ÔÛxA¹¢Ø Ý÷â2¦ly½|’»áŽ'ãSüZxÇ]»RçÃPü•Üi#øFWÜ‚î®í¾>¿wmîÈÏìÃã\H–A i]å›naö¨!;ø)ðàÑ/mq¡™ÖwºÎž† «—®øüù¹_vàã­=€[Ðü*–”Ÿ—sÁÑè DÆqŸ1O1ÑJvåèÚÌÑñ®Xô!½å¢ì=‘6Žù.s@ûÀ…ÉøÀx+›0¤Ãá Äg"NU¢«Ö#bÖë¯<L=¶›úé~ð¸þ‡Z.*jü´jvºsبÈn|1ñŽ”N$ÛO»@’/p²ÿÌ÷ Ç%ÚXÇÄ‹gpØŒ${º¾©O[Ô ¯®ë/àw6+U+ÙÞI^xãàa¬ô×! ã;{¸ký7¬§Fú°,\û‹ºÇº0ÔÀí<¾g¼_­~õ½>m‹©‹»ð0LLìr`›ÓÚÏ{~{òÇ3> û6GrìàFtDù½ŽË4ܯÃZ’옙s˜䪪XtÉ?%=&Z»ÖÇ=KÐ ŸôA¿ë5e—Ž‚SZÖIAµ¸0³¶ LEmͳÄϦKw[]×Õwæùž×ÀôkSÔÍn/l¬Ÿ‰J+?õ™äMÛ¿|m@7–Ý̨·N$æjH¤ùŒ“óÆÉ˜pÎÛŽ™âçØ›Pû+ÓOÜø]èlŽ[žštkcR}§Œ0‚ßcÏoH0•MÛ™10IÃò|3DŠb¬ÍTÄ­ç¬"Û-áöïÕSÀF3XRRU{©.ûiõéÖ£#c‘µoøk:‹×7a¿x¹ó·óŽ®àgÜYµ÷µæ\¯^º~ÏÔïUÜ»ÿ¢¸a¤½»‰­w¥æÿûõÊ­—Ú¡†¯j©ªjå耙»k˜{ÿžÑåaøSª”HV2>À/ŸfóÔ”j/9Ë rï" M"*€ÓõÍÕ§[jïQElx÷Ì»<ØÂ`m¹vòÿlšÐlm¿fÙîƒ÷]á_TÒ³yò[ýP+Z’'EtÛ1‡±î#$!ÈÕûFItó?Ðói}uÄâ‘/–%­‰ªm/›ë&½eã¸ïÎú+Ö÷ÄŸVdñ>8t#ZÔî¿xÞ'¨¨L_ß”æ¯y™uȶÖLÏj"ýn½wgª4ã¹Hf<Û=¹ÑtuÝÈ ó¾ó÷ùë8ૌ‹ýÅõ¾9o˜Cužä¼]©2%ŸšTÍ vˆs#“‚L–gSÛîžQˆoÔãÆè-Ô½eÆgOå³gú¹ç¿Šñ¹«¨[þ#<ÒKGdÝÞÉÛYê~T¤¢}‘é)t½%+G/á°})«²º ŸM€3ït3]dìòP'ÏÎoYÎqQ%‹"K3^á.Ý[c©qKØìeí´ÍU[Œ~NNv°ñÆ2ó^õÄh ‹ÿÛÀ…ƒrP€î ÷Ò$Ø6«ÉbìÙË]Ñh³œíîO¼úñÖ¼ýL~CÃ0¦üqcïÌ;ÐOñ³ÏО,þe¬F4?ï3þF'\MS¬þ9ñ´«G¸\·/ߨìa1YU”}­Bг‚šzDÆj·«È ½­rs´0žßíæF]ú¼ ò܆S¸º÷_ÇpÐ幺‡uXwdž¡j¾½„«ÈýÅ3ïÛwOŸééðªï™Ïq-F£\m´ô±^®CñДWÐIoÌa=5æÎ>¾ ý £”»µX,&îÓ ¾,¤–[ûS7iNWÃÜu-ò|ËÝFVŽ^þÙ¾kàçæ©÷»«ÝÓí˜Ù²]YHR¡ «cögí}–&´•ÕûÐgý7ŠWZ¥JQŸÊå<È+ìK«ZÝ0Hªõ<Êa­ÄWtOÜ©sÁºâ?Gl {_­¼Ñ¡aVn‰öÇÿ÷ð¯=}ýyÚšŸ¿] ÷A¤ RÚ{ËÐ2¨½ïVE£½¦-:_³/“•Àä}¨ÈèYæµÙzüO1÷ÔÑÊQóð‚æÅLÜ7Ô±]ÛÞ-ަ#Úhï¬û›±¹Ž<÷¢ýè^‹]:D þ´fˆÛâ—Â֌ŰT©R¼xª-ÀûpzŒo_wF –m¡­R5°úôºœôç%Ƃ۫T,ž¥ÍjGÙz_ê’ña»T­sJ ©Ý‘i#¶ÐO,ƒ0½<ïKTE¸UÓ­$̆öܶÆÑtýÎíf›®׫p½,ÞžN«;ùóJÄ*ÒbÏ5)FÒbæßÈ}O£0«_»´þÖ]yÅ™í/оR’ª¢•£—ÐŒ´ÚNŸ8Âþ¬Ø¼h¸ ÛµQÛp Žù¬Z<'!éêÖÆ)ä÷îÅÐ6,±míÉfh³ZPüÎeÝaåRÆÚäîE5ÖSC‰¶qZl_ûR†2ºP:ðéû:£ }ÖLuLvÃx›ÏúJ ´¡œ^Hø 5´¦qâ¾ùžãâëÀêºëüÂʨ*aºÐü’­m Bÿxƒ\éÂ:¶ÿ'aú~$¬¨0=¥6’M*P×O#*~úÌÁ{ø2 Bâ¢pŽø‰“Î@{ ÔÀ9³_óWk°‡_xÞ¹‹8ê¥:sç×\ó­i9Q¼O Ö´ek© ~þëzã>íðnŽq SÆ'‚ȱÉü]™¦€t"W¤e-­õÙÝC0Í\ÑÔ›_›‚>¾ð|BÊQ²`î¨æW©÷ãêݦ6=QÂìƒÂŠZf{¿¾]µMA ³Us’Ú‚¢ïCå¼ömZZPPÎClœ¸•CÈ5£ÔìÕ]E0¯rv©†@a³Õ¹\ ƒÏ·óãÔxnpI,Ê“~ÂΖ­„¹6fífXWrÊ`ç‹ýÚÖLÅ’æ¶éõ]zm•ÃÑÕgrÝ#Ù{ŸIFAЪnÅ7µ±ªÝwø²Vs¬Ä> þÀµ«{+"­YÌݵ×w¢VR·/‰VÝPTÈUg>®~¡Ïò}q« ©›/b—qîs\„XºÒ GÎX1Œ×uÄÈ¢QcÉÞè§6jÁ>úŒ<]¯Á^6ƾš3ÿêÊ¡À%ªRû+ÜÚÑZü¬öx¨KË Èšíæ(2J=ÃlqŸ÷Ãk[lÍŽ<îe4­û8 « ©~‰v ²3Ö®usŠ u(_ ê‡Ì±u½Ï^‰ÚQH’ÜJ.„xªŠF_³.{×.3gì’{Ü'0®KÎ.Ñ–n0AKmnl…EªÛl®ZQJç ‡äè œ{Š߯Ã2=‚·žÁn„‡Ehí©$¹¬‘B¿ÜûûŒg æ5A7qÔ¼s•MmØ{ã5œ)ôÄ£O,ë.)ç5f{ŒQÚQ{õv:ABÒªzË/éÐí’éY¬WuÚÖz~r÷>=<\O g¨*6ù€ël´m±-ôïÑÑþP7ûÕ¢ù3;,×!ïL˜í‡ÇÚöî”^ûëïi–snDqŸÛøo4\¦÷1¦tXô‚‡ÛƦ‡6Õ::ÑÐ=Ú/céW©c±gÓá="Dfä²Á '½gÙªwˆÕI9²®Rh2—ì}A ?¨êÍþ=Ú#2¶ØÑ“”pD¼ƒ ‰V;ö5ukXH¦k—QÃI¡Ò²…ÙÈØû¤¡IˆIªelap´¿þhÈEµí÷·?žjõ]»~‘T¤]¸ãE³B }Eh:±ñh]«R1yš•Œ½ƒGÇLf§¡C!.YÓ¹)²?ýe J³Ö}‰öšFwµgŸ50™ME}ÑŸS‚sèx¢‚ÔYÁÅ·ùÌÛûÄD¬9+–‘_Ì"Ù†¶Ù´ý:dSFÁIÝCÒ–èaDIÔer¥nîüUБêÒû!ÕgšU—·÷!xúÙŒ~Îý…Ç’³ ëû穇ÛZÝüAœÿºï.C¤£›côf®TžŠK1fsN*ÒL PöMQ9yß!ª ²FÛñ×Í$ðxŒ­¦õyMˆ‘Ö™q««.l±ô#O'ÀP¾moü(pÚÃs\…¤vꥠ¢Y½/„€z[ÎjÙ ¢påûüîK;/ÁÔÔÏߺ̻Çp£³öœ@—ó ȵr/°ß=²ÿó?Ó™0Ó=mãªl¡ ´ê©Øõ‚ê@Gô’ˆH"öv>¹ñ…÷L{†ô„4«÷y?x‡f³9»©ÕûXØP~ML@áÚygè3á÷lJû¦}’ŠFî¬GEÑÈ©¿Obæ|Áë®'Mâ<¬LJ«Ì¤T§ {ßôðrS„HD‰’R¸xÆ3¤KME•û‡:⟸¸qt!Þ|Ø×϶¦Ï%ÒÞŽFc|)™ÂP†Íð}¤Í+c!á»~ÛoæSQ9Þç™yg'Aj~ÑIðQŠÅôc#WïÛãæ³ÑŽmÉI6ty¢ß‚Ø*ŠC3d©Ü IDATÄÎzN®ÞGDayÖS<ɵ ³‘«÷%ÒZöcbo´…ˆ’-ôR G«"Ëã*B©(À6³!§¹Í>hn¬ñh5zãúS³×nê I‹zì›IüNüFÓŒBò­¢nËe2“÷ñ›i¼os š»#¼ ×áèø]D S[Ì÷‚ÆÆ³ªíBïE›¾Óh-¨ý²­T¹æ¼Ó¨ùýÞ¶h=acocÔ&;ô¥Ÿ¥äÙ÷]„4|«¤" ez#‹½H)ÙÆæB0½ï8è³^ˆ@”ì}Œ³UõŒòŽeÚͲ¨ù¿Lì/ÑtæÚËÛûüöΑœz»e¢’eÌS¶äûSË$ø ˆI´ fÑ»Éc¼Ýn¯Ût. W–šír¼N™ ^Q‰LðÊù¼/ù{¦5nq*°w§tZ‚Ÿ©!ö—ÊÙqiAçŒþ²û²k œÔq™¹œáB¯BJ§Z)FŠÏÐÌÞûÀ§jS;=ÍlDˉÄ\sÖ[¸‹f«‰!(ˆÓ\ä œ§2 ©v,ÁûÀjS3¾~fÑëÂ{ú$¼ÌwIRH ‰§Æfõ¾ ]~ÓT;kíûíYO$ô# áÔ(’Dš·ùÛŒ…Ä}y1Ü­äåÛ$¥NøbË•ìzݰL©+T?ä}±pœirVtÉV!nÓvæ ÀÛâ ã7´Õø›@¤é°s{_ÂiïLŒÕA¥“¬vãÞHS²Ä*››·]‰Ö‚–ö «L1)£û~‘ïÒ%NZû„ÑDk®I¦½I»†t²L oŒ—hÇ!‚÷¥§ÚY 311Ÿ­†BRzΈ˜-hÉq_÷t<2•d›ëØ>5ÏYEžz·ËmA‹íï‹yÊG?'­ׯ#'¼ŒÊwhËYôÜø8Þ—†jÓGïqToÄ@4×Z*ŠÜ‚.-çu¿É1±>G=i¼QAó¸óDš®ôúŽ i©¥yŸ3I\º9–^gíŸõ§\H<.—` ÍûGh ™„d•2P›‘ !E?_ÍlêØÅÐPfÜ]½D/¡í€D^Fái¯õDDÉA7íTêEIA?1ÇygzÓºB £½ÑÇpÁ\€$$›Ò®ø'KM°Ú£· EÍqIö©')§PÈÈû3œN~/×”°Õ«á܆û·áþôô–-_ÉN$—èo„x$!Aàë%kãƒ4ïë01ó¦ªG8®·á>×߸pC©´Íì$;y$Çö2EE =»êbØþB )GåWb˜¥¢%ý¹LÜ7™:òîªJˆg“ä(/¢"õKR#ËBCøêÖ& ¦=N ñ,àÆüqýð}Ô™JÖ#óÛX­Ç£¾Ÿ¾‡/µ?±fÕË^ gåZn˜W¸L‘ZÑ2>¾„›¯dý’ˆŠ`^!±xpúg­¢œúû$æéµÁrd½xAwgG›Â %\PŽðŽ… ⢢9[P(Þø kïƒ`ö'5Ô˜™*1}Œ2w½† ÜšédÅU‘ ¤ì‚2ŒÂôu0@¸)ä,S’”…éu6¼O'ÂFÒã[dó¹Ì cæƒ /ú&½F$\?²»ŠÀŸ¨ù”XæQAøÎm¸ÏÅ*Ýå#-6hGäz‰:f'Ú¤"˜–y˜¶9¨œKÒb½ôä±öKÓrã8ߘiß”c©Æ­K˜T«\Ÿ.w¿5 _„¯ÞôɋЦ¬žE\'qO$Ö·ÖþpŽC“’%zõâ¶V©h(Ex#âIµÏœð2ÃÞËvˆ^RhGµŠ†R÷1v‚v8¹°°j_Øá8Rœ÷12:ÙRbè§Zîðs‘ÅYJ‹3è,ÊïB½‘²vC§É„GRvj;Mí}œ¤´K®—)©5¥A;y_‡Ël•yö®B§)#âš Éò>=Žò8í«÷Îy:;YãØš’Š¢@Þ׃½dP²ìøŒ:#‹Äîƒîöçþ¤’ò¾a˜”çRSÖ%–D9®NpÈûü@11RÑœ÷Q"Kxn3AÄPÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ Jä/±  é=Ðu]«o†îý’½ÝXû§úâcuêO– jËC¯WŽ‹EEÚ“¥•“ik¦Ø—ï-¡éËÒ(4îSE£~3bSUU¹o‡/9z×D\ì*ŠrZ¥jËàQüYSnܨ¹ëmµ­å L¡œãZ*e¶Õé P0Ÿ,Sì6èäjcF÷ðð2ÓU5E{G»¬GkÚä\UU9šš)³&æÄÅ>FÄYX½§ØÝ¼´}2ÅJˆ¼¯‡‰m£»ÊÝ·Vxs–¶J=M|á¡©±¥QÝ©ÚrZÈûF!ìvÓ«H¼5ûx‘ öa PN1ûÓ±õ²Œƒ™ÆÛ×¢v.Å¢½Ï1“µ,Ù‹*bí¦´òåW”tiQÄ—C^éK­ÍYÖ²ó‚ÎÅL}|… ©Ðq^Óh†Ë’.?¹,?bŠº…A üb¯­ÆÂ2í–wW¦\{Ö ‚ –D¡qA…CÞGD‰÷Q"ä}A”yA%BÞGD‰=·y4'…Ò£b!Å…æ÷9èyg.Ï_#C¸§æÑóøF@ÞgÄtãÑòvJ„ƒT”,ä}I‰†È‘/霻¤$ä}))UKâÅ#8)Ÿ)2A‰Ò½/¯ø¤|i•L^ç%¯Ò†£PïËýôçeÙ &ë‘uá§Sœ÷-é|/éX²c1•Ÿ{0š‚¼o1b•Xêq%ËR+|©Çe¢ï+ᤖpŒÑ)¡’K8FÆò½ÏýÍg  áÎLi[ÂU³ä#,M¯œb<ÅVæâ|™Þ·øÓæB Mwh¨|)-ðÔ’^9 nh¨ê0‹¼¦uHŽz-MÖ‹nPk¬¨Š]ÞU³œ“ç"ÄÐç/Ù©RUU¥W¨qo>ƒª¿š9Ð^F`‘¦°ïs4¾›KŒ°0ᆠbó™‹Š)ƒ²? -†»ì³ÓAvžÞš çzìÃÐ-G<•ËhGó¾âêuÊf-Ïì }FÈþT\„¨í„0BšAE3ì%(_±®aé¬;ú¯J}àfûÇ&T•¬$Þï+Ã*„(µ¡z‡½ê“™QÀps«¨·Ì‰“kÑ#êU‹Ú9ÝI“{Ü&ÀT׌[°ï×ïñ. ÝžN”JÀC¬$’¶›B¾hÿ«"&¤LU”å{ÚâßÎáZ]7ÿU­ZØŸõ €›?@Û8c·Ø§®k~UXüwl›¾¶–#LE±R‡Ã5&!¦%þ=;#v×`šfõÂOºÇ󞯊òó츩.°8î.ÿ²[@HCî™7tSókƵÇÅÛj)^ðU ù¶ÛSˆ?Ppà&ì®®ÀÞåc“{4BÒiF³e³Š@R·ý‚U”Y‰c÷ñ)?@—€¨ /GèÝÃüÜ~¸+wÖØ›SSÀrîâ7Ÿ/6a÷uîí]>Þ}½ö`ã¸ùU§º†ªjc½M´Ñ!ѲU”SqcöI_x HvLm̹nBuM#Yž¨òï…<åg¸  Ø(÷\)À­½N.ÌH Sˆh|Š6Îý²>..c2>9¯Ô'¼ÈU!í®=Ø8ÆZÒ¦«å¨(›²Î\­\ÿ‚Oÿ~ñwøøó}h,áX¶.ß‘PBB©3[ì[”÷è%ÎK¸ã˜ÿ»SsÎÀÙÃÝ;ë¯Ø—,âô SýØ}½¶wùGü'ln¼cñá…_¿}û™´S/¹pF*Ê£ óT¨2À°Ü}€ê;¶ÌàRUUU¿Ð},À<`e÷5‹àäÆsÐ9 ÙŸ‰yFuÕa\–áÊž¡·dØŽ$û;i²æsï·;,4Ae³øîëµGGWتNœ“‹Š2(å U)¶xè‡vÚZ’/6¦Hòx3AÉø¤Þéd 8àÄË{Á_f84}çÆ¦vÙI}µüŠìïÜ/[wÖ_íï®6ÖÆãJ@1&ãÑѼ͓Ï5Ó³m©q6ÉvDAî<¾65°âŸ›ÖÕn¢÷±æš/õqcN×7=æ¿Y¨v¡K ;8÷~‹¹ÿØ7ê äq»Ã°í1wcöǾç–Ç¢?ÖpÞY¥zxM#ÒÒ_bÀFhãcÛ_}º%t9ëj¥nš)Ð× ¾'¦ÀØÍ.ÌY9:ÀÛœ8ßjb¾“&AH;€9ÝÞåãs¿l}øüù¹_¶NnéJfSF˜vW×^ø•7Hmô„×m>Ô/4'‡§ø–5(I˜C?œLœþx¶«ht!“UQŠqŸÇ¶‚5_¬)ƒýæ¬>Ýjš¾MÁGÄP«¾§1¾ÑEåj}4›µƒÛmv±5®÷ãÕÓ¯Tí?€äÛÞÐx¼g«ªªÕ§[­jÖA¶wr pîýÖ££+ß¾ýŒ…{wÖ_ñ™tíêmyîõÜy6´T|³›Êp™GGWxzŽ¿?ýñ*lWØøF“¬S´d_ EUU°_3_€Ó¯®Üz‰g–rË»³þJ÷ »mÃŘÜK«žÓÞù+Å}¸Hmè‡곇»]¸-ÜR2}<1A…¸àSE+GMwÞÇ=Yïžgëéã¢Ò Éa lPi幨öÛ~Ñ<@m'ûóá…_ù¥ñqcå%¨(¹2y7¾Óõ«+G/¿}ûþzÒІ!ÞÇ9=õ"À×ºß ö×F ýqïœÿnë³Ýqu›¦píøÊv[‹©a`åÖËoß~ÆgkUÄîkp6>Πv´ó&î}Òø˜n~(t·éóžÆ—®¢´r^¿ÆÛMç×·o?ã¾öèèÊà ¿ª«hÏÂm¸»¹µ ø‡¡Ôu]½Aÿðƒu…MÀó$øÔÞW mþ«­ÆÔÄOÆW3ã[¹õ’ßÞåc6zË>¬{—Gì–ié6ܯ/èEáX×uõÒH+ãc⺰s¸Æw…Îî®^ºÎûˆäs”—+†#-3öâ}d÷¶aåè%ð éj²]6UªÛàÀþ8Ó!˜‚‘J{“¯4ËO„=öƒÍL<óNÖ¸¥Ñ†Q•œ`£mÁ›Šxñ¥ëÐFvx‚Ro¶ÛlpàäБ*ªÅý¦IñÏLElŽ¡†;Ö»Õ¦G©©(¡Òx6¾–¿þ˜ ßÞ³~ ö“zÃ#‡9v½ú"° O}R#¾'pW{ò”ft°zïMÚË3nÙZûk»lšÍw‡0mT:©XðÚÍ×D|§ëWa¿’ÔÏÀ° é…ÜsR·ORáBÒª ç IýÌÇXº™. Ñû„Ië›l܆ųº¡^Væ¥=/#•œ×Ÿñ@{Ùo7z(ýö/|rã9b°ÛŒ8jñï7Ÿ‚˜hôÁ6ë¸0Ü4ô÷µW×Þåãú¬>Ýú¸±Çó6ƇöÜþ 5Ùmy´Ù.°–rçð<7¾“?ž2¾“ÏùÔe:a!@uMÉþ àæ îBâKîý¿cVNa~¨áV%–1»ü¸±§ÎvX¹õ’…ÌcÙ¿)*J*óMÅûüÑÉbç°Ñëà ¿2ããA×+Ãt:L††æš¯…3l9dn{Ó–í2ãûp¾)ü‡ÏŸ³ÃQç9~Y¹¦7)Õšð™:À~S±¬wÅD|Ú(*Ú}½†ŸÀÁ*ªïAõ¦ßø˜´pf`ŸlÌ–d“ðlŸÜxnêìc©Ïßÿüd“õ`‚Øk,´ ²Òˆ&á}ž% m—?Ó« 1ɲ&ð/%ÃâøD¼/àwmÆê\6¼º°ks¯P×M³ÙýWzø%l‹ÿ4d`aÁÆÇmŽ[’ÔÒHSù´Ûìõü“Ú‚>®ïšzN$¤Ì·™`}Ó»³þ ?âåÛ·Ÿ}ûö3~h+·^ 9„` iD“ð¾éÈÆ×NjÁÆÇ¥¼út ëU½Å‡Ñ´¥÷Ú„í ¾ªþ©®¢J¶Ùˆ9xdÔ÷ ~¡¨V7ÄÁþ²Â??Ùìúh”&ÚÄPýUæ·‹%‚—ihͧýæâ€Ÿ?g Q:„æsïòñƒcmÐõ ¨ëf*;nAµ©ƒZÇqû«Ð]½½°#ztt…ßʹwùØt!ùΣt$ÿ9.>%ËØ6 ëägðÀö`G`wáÍ~¿ãÅêºV½ï ƒ‘ˆéèp£Íó\ÓsßðØïòãò; »,S¯OížÙNÕ|^–”Nw5'D©V/]gaõ™w§tw :–˜XU+á¼É¾Ÿžè4c9:AHÀîU×5ê\E8ó}xá×ÕUÖAØâyÞ`¼|jæºCk>-$î“xðÛû“?ž™ò>éöi@:#üùÌ5z¹ŸÉøFŒúË{Ü”;§y ‡¿a>nìüñ wÓ83fnêÐUò¢=À®f؃ ªêÞ…·C] _7-¨48f™$ðžþßÇõ]ܵ2¨ðl›Æçµ`7d³\÷NŽÿüÏæêÓë~{ÿð¯]‡&¾pô'ÂÞÝË9hù Dv߉ö*m„5Sø„µ“òù|%žªà¡^hmOAKû¾º6`F‚¡´öõ´O—áb>ÝLh±q[­×î° OqH¡ÑÆøKÚè"f ÒX™VHMYš÷ ÈÕUUÕ¿àÓïáKiûOöÿï$ë+ªízüùüOü+´ê™¿h">ŽzM¡õ–¹[”wMú~ÌÄâç¼>kP:CHÇ+Gxºf·¾î¨’½ ÷¿“Sž«ß~ÁàÛ°OA؃çl;gÞÀ€ØÅftsNáªNµÃ,Œë5‘FÛ#š#2KH z½$Úìµfãj%KÆ×¨h[hAµ+v*bl²/å]c¤GÕsØ,ÑÝ×k{›âèØWŽ^ʾ:ûª¢D$Óûæ´Æ·s¸ F/lϦÇ~çÞÜaãç~çpm÷µ¤°^gI¯ÒÜ«î•è[¦ËýfÞ{¤ÒõW.]ùx´‡žme(aJ¡\ ‡¯Ÿ4µ…# ‰Ýb¡>°§º\H–A i]å´/òóÙ~{ím*Ц½ß\U;‡ç÷þs|îÒþòž©%åâ׃츼w2îïS;hô´-7>6‹Ñ<Ès ½÷»‘,Ooñ¤­ÞéW?w/ dwSâq§žÚÁ§yÄ–ˆÚ!ÅdÍŸùíÛÏtÁ‹0nÛÛ㮫DšnðÙmâ6>~Ù€o'¤ƒæŸ½¡¢æv#ö ÔÍžÞÐÎa؆“ÏXO1ûÂÔ(>:º²»ºvòÇ3ö|ߦ—¼/v¬ÏÚhqßÌ’å÷·“¯eNÖfsþÎÒCQµw¤õÜöÛŽäVUÿŒ0ŽÅõºi¨ëWWŸ^Ô&?øí=‹÷j,ýóླྀ1þ•‚j`>¨¶ó”ß%mê9é°¾eåñÅ»¦éÍõ=€ú. qϵøÞz†é 䦙Àf€U§ëÍîVŽ^r+<¹ñìTP×ÿUímÃëW.]×…~¼0u;ÔÓß÷ÍÇc)*㸆Wîw ÷FRúY&X™¯ªªÃ5ô­>ÝâŒe°Å‘{§ë›§ë›š'×ßz¹zéúêÓëu-_R? ®=㘮ÿ¹^ö»Ð?‡’?€ÁK¤Æ}SÊɲ!ö¦.¶w0$àêCâ8Ìû`¿f÷™²ÇO²ìžÍëV“s¿l5ó~Äjohë|ì;ðä}[à¹J ø#À4Ü1AHêPŸ„ÀžÃ5¾SK&¡}Ú J6?ûC”G}±€¿ùôïõïÂÓ_~{/.9^Eê‘ÎF®qß”Ê:]on„PÞHßüó {¢Ûc]×,^ƒ6ˆ°¬ˆÃC¾i6_·@«Åoß~ÆŸáïùðùsþd–û´ Ç ý¦_3Vï&úv«°ñèèʃcî><›Ø‚ÊÆ×ïî®±jw1>Pf³rý´·¬Õ•vôvõéõÝÿ½væàà¿ý/žÂïïý¿ceŽwíâwÑó†\ç¸TâMlNì× NÍçï$ezœv„/Ë3=8­6aÿ*ìw‘\Ozª  7>öçéW›Çñ££+pA\½€éÑÑ•Ÿ?o†ÿ»fš‚ä x.Ëè‰fËFm±VŸn=:€çm‡—·}ugaªŠg Ïùi²G|Ò7ê½íÀâ¾ÕK×﬿Â=ÂÌ4¿}ûÙà ¿ž{¿ïáÎú+Ã#adÁH3¢T!Eo8!JÎë%ÄU¼O7ÉYB˜î+Ô;OâVŸniÅ1°`Â6Û½×x§–ˆ¿|CE.Ó+°g+Ýhz WŸ^g/Ãf~ÜØûöíg{ÿóþgÞ(ƒzBiMG!ý=[ñµ÷a*‡8Û·â=¼ôêàªf˜Dùb;‡k<«å°oðÃøØ› ±©…Vp¿¹¯ªº2¯>½Ž“eÜ<+'SU¤]&4YzŸ*YÑhL—ýN Ô«ªb=Ù“½¯Æ«îE@µüùÉÕª‚º†3ïÐe¶_óy|øÕKüé„õ×´ù<†¿WúhšÒñ‚áC0…ÀZgÏ´ËD!Õµpà5f¡o5Õûõ>Ð ÉÒYÌ@ïj'*oëŽ5™ØûVŽº§üjhŠ «±µ$ÂøèÈû¬®5>êZݾSýN< Ú“­æÔ¸Ït&ÈôZݬ^×uõhT»+·^þùŸMžäòwÅò§l2™®>½ÎC©ÈÚƒ5©Vrö¬½Ok|è'04¢N8`ZµØ…Äá£v²UA+ž&ù¨„‹håè域l²N½sï·Xˆ§n¤yX†ùIõ(´(W û[¾÷ùúô5®¨v¦KTR§.(œË‚`|ÍA’l“ªœo3ØR½Ý>‘Éx_‡>¾SU‹!~ÚTHèðe!Í¥¢Z ɹå ß þÐÀ‚>8€_ûônÂîjóŽ¡§Åø\WPó1Ѭ½Ï³têƇ÷îÖÉ0t£èû…÷›·&ª/g`aàƒßÞ×_W†Ù-rñµ¿.UI@µž^‹æVBö.LFA˜ò†]¬'lÏ‹boéúà1ˆ ô?ÐEu@í™JEEÙ©¶W²©*¥½·ôŸÒu2 ªÝÎê¥ëµCLýøIDAT,C‘fö±gxT?ÔªK4§+F!Þ—ˆŠÚ§I;!wTNñ~÷R>x"už¸aK ”Ž©hÓEgÝ_ ’ÍÙ5 xŸÔèé€gÆ×uÄô?½ÊVöÞî?5OŒ ZŸBÊ­µØß¶Î.Ûíñ«Fù  ½[#¨Š@PM%Ï_Û¹ÎïK½ñæÍó•ð¹ç[X¹Å©†Ç£å´eåÖËæ®L¾å¾ÜV.›ù@¸Å1ñ.ˆˆ;Ç%(Ñ[ÐAE,.š:Qß¡µmµ¿ÏÊ$ ½%Ž"©gŸñ—¯÷%tgFí™æsNn<ä²­Yoáìá.»o wÈâ`¯Žun™±½:ÙhD)¯¨í G }%($q|£ûØÜˆÆ‘ϾØènW+G§pU±?á`Åw:*Þ°v4²Ïy c‘QmÁ\ä[AÕRU:Ç<èZøn]ó¸‡[¹ÄŠR¯Í™ç­qÇvŽÞ§ eÔ tbF¿h;!uÁ¥GEœ4‹Mî3­> \Ò§ÈR?uÙКƙ钟÷h\²RµF˜.¤íœ_€N+í¼åÖ+Y‚Ó Ñîle4`€Úù¥*UlíãÌtñª"@ €|5¦!$UEư«]¬@Ї€‡Fvö2j£ ^:ïÓ.Ëô>¿f&çD’¬´S}ÙZjÅ`b7³£÷i/u‹R#ªÖã¾ÄS¦ ú m!¡î %ÔªÈöÚae4Ì\ÑÔ›TBSÐÇžOH9J̃tü*õ~\½ÛT$«w ³ +NKIŒe´Œ»¨V ù’9 É4g hÎkߦŸ@9S-8õ‘„è¤Ø¼ÄcTÜ@I&ðFfR®Ï°²h´Èê\ öS×µ8¸Q¡sƒK2NyÚq˜„¹6fMµÖ•ÜÓÊõÝùÂcîÑ„„ëPWŸ1»Mµdï}Z…»/’ªn1>Ò^½xaëÞÁªiIôý5€kihÍŸ z§5‹¹gWôU¾½„VØ éW¶#Õ™ŽËQEZµLWîW‘ØäÇ$ß9. áìòŒlf)7EÑ t¿«®‡K‹]ÒT~”râ.ðç×íêA„%Yù‚_6fj¥‚—C€)u¾‘ú+J.ôuT¤.i,3 =Û“z©Qêf‹û¼ž©MÓv"ÌOë>øŸLj/.¦6ÍÞ¤-°¬Í>^²û`h6ä‹Aý9Æ®¨PRQmÊi†öWˆ 2T4—z›9cSÉ=îÀmæüI/ô,ú¦UÂRrÍ ÚˆÒ±ØxfÙJt¹xäA3T·sOñãûµ/à0zÖíH*ªYÃgR‘»$¹¬‘B¿Üûûô}gÍo36Úíù¶/Õ4Ýbx%7ìmöÑ#ht‘Ø‚Ê}ÞKÊyMUÔc”¸Ï^½µNHZ³Š€oÐ¥xöÅzU'E±ÈÝûôðè=œE ×Ù°>oi .M±£ý¡nÜi02sÉËuÈ»#f;Æá±¶].öçSE v›¸ôTš¾œezchÈPøi›ö¨6@ÔÖsK¿j `Ú "3rÙ`hÁÔ&dŠý e±é5ª‰³±G5"Kö¾yÔ/V×µˆMٔˠG«{5^® |C—ˆ—â\£ó•¯ùà.ûÒ…“ò dtûËØû¤¡ÉªEZÌ0vé­ôZUîö× áØ'Ðð ¼Þ°ëÙç^d ÎÔLB ¹k§ÜsƇ Þrë‹¡2këÔ(‘ï2ö> “„.Z =Êíý¥]fàÁuc—ºMIÏ5h¾4”-‰îj/`gÇçtž«q–½ô¨ˆýäœþ÷4¢h˜¨«IÕ7ëxSqy{Ÿ˜ˆñ³bùõHhãôͦ¾ŽG‡Ú^£ÚÚú”Ó¾/ç"g†¨"郺ŒÿýÛ2Ú‡xrEt¤ºô~Hõ™f™·÷!äô3n“â œùêgXß?·?ËZ8ô“Ò@HUÄþŽnŽÑ›¹ZP|ã‡tPcŽÑ­ÿWز!·¦¨œ¼ÏqòQû_iT®0ÅòÎ8œ:H=ž^¢iã!FZgfˆŠ€K(d—ñlú4Zyˆ aXH¸Sï1.³z_õ¶œ)Ô²¤±W|\af~}|²[_Áæ`Þ=†…˜µç¤Ñ³ )Ä•‚Æ»½$rIætOÛ¸*[@¨|¢Î=ƒæ¡x˜e؈}ÇC>­³ôf¤Øa2«÷y?x‡fsΜbXÚ+<8>àάƒ¼3t‡™ð+$U4|ïò¼® ‘…4§ŠŠð¾Ì;;ÊPûðÛˆNÚ€R,¦s¹zߨ7Ÿ6ÙŸDèKÈËM©©Q¦ŠfŸÜ£!Wï#¢4×˳žâ)4èƒ|½/‘Ö²¯{£-”+ÙD@ô É3…+(Wï‹ÿ§åH³äñ?e »¯ýÆ5¾E]1é4¢Bò?U«ät¦¹Íuíjh=æ}:š»#|•Ä´5ÜKU×°¸¬ÑϳárÄûîBòÑE3>ûe;[©rº§Íz´?—_‡›µzËAÑmu2“{üÚ_ï¯Ã[R‘†Òr^Œÿ‡ øF5ʘ’Mal.ÓÓÉ Ïz!Q²÷~ÔÕ ;åË´›eQÏ,¤É$Ú‚Î\{y{Ÿ¿àÔnW‚ÖõRÉSyVXò}‹© ‰g»I´ fÑ»Éc¼Ýv˜Ê(KÍv9^GQƒWT"cÓ¹3Ÿ÷…m±÷öCmÛ#Ó·DCž4Kµl†Ø_*gÇ¥3úË>îkD° ÙŸ‹SiÛ­’]ÎpáBƒ©TÎN‚ döÞ’ýM"µ+¹™‹cY"IÍYoሼìoH# bg‹\sõQ&uqÍ{µG>ýy¢³UÅÀ¢â…õï9õZ:qß=E­BÌZï…„Ôìi!Bêžž¿Øœ7h—ß´F{ÖÖÞoÏz"¡é¥£HÈš¿]BÎë…T%Ëз•l²[®ä•ù:c™RW¨~Èû"0PpšÉYiH6N Ìò›ƒ±7³oh«ñ7HC®2‹ò¾,Zì±:¨t’ÕnÜiJ– “O¯ÍÍÛ®DK\æö>j±G¡>«û¾ù4Ç[V‰¼q Ò£òQvº¨¸o¡8ÉbvéDKxI6¢‰÷½ªc»š„×û!$›=÷A^ƒ¼³õÑDxb¶ ¼/™»{ <™ˆJ²Íõ lŸ*Ü;žz·ËmAË|v)Ä=壞8-­ׯ#'¼ŒʹwARnAãä¼ÁŸk°ôÑ„a܃ Lh„T·Ä*Sôtiý}u]Ãvå`‰äÝ=¤ñF©¢²Žt %S–Ö·4ïs†.`GôzM Ù(þ¹n…LáDêc+ãë'š÷…U­SèÕ&!Y¥ ñ%›é×F %4ÍNÜ‚.6î[¹õÒüc ‚°½„¶ËD‚>F2Óâ`mD£¿äxÙ¤^”ôsœwöžÎ´®óho|e ¿`iÐ)íÚˆ²ìˆÞ‚ÆÞ}˜ã¯ª ökPh_þ,üez%œG—¬–€BJæÝ:&Änµ†tŠÇP;R¢ )þ) Q=f=ºì$(Y-%{$7wš-è2ûû )¾#-º,¨ýh)HVËŒ½~‰ª(Íó‚HîFÌøÞ7g_uIä$;'ÚF”T4ˆd[ÐøÞˆNµÍd—äÚêÄIV²&B6¢VQÉÃÊcI±MÂûª˜ý%TéùVMº£& 'åþâ$¼ÂØ_SÅÛÔJ&Ó'elD;eS ’ŽñA:Þˆt*:O’k«{ ؈ ý¨)u%ñ4!ï ×h¯^ºÎúk¨§Æ…”Ÿ;úíSÍ %Ñ4!ïƒ`öÉç«—®¯À~Ñ÷?¹r#áB¿öFIRQ?Ò;TTQZÞŽ;ë¯ÎîÆ.Eªª p)¦+YÙßéúæÊ­—‰?&c4…”ÅË£S,\ ;=êº>óîåéú&ßxâ³áçG•l¦Þ¡o—Ü–ßû“i-‚U¯–4ë'ÅgÖ‡˜QÑûåN×pc ÆÁž”щTd& ãƒ4ã>{{f‡Ë.ʉ ¥#MV²ƒ˜AH¤"‰\„”h± d• n!à OV¯#HÄþ !ピ½Ò®¸e³¤š_Ò±äEâ5Ÿô8ïœ9(–ìîÛ ©h¤JN_EI{Äî⯙ŃTI6Y¨(ƒ"¼U™Åió‚Ú¿ìcŸYEPL?`ŽÆéÇ}Œ™Ÿñf¶pZ”f|#ú[¼Š [ãƒ\¼oNâ¶ØUKè½@aÆÇ(§ïožö;kÙdã}³©–OÈœ²¶z5œÛpÿ6Ü÷s$Ö²h|Œy„4½>±y©:Ñ~) žªlòRŠ÷u˜˜ù š#@.µÛpŸëolõ¡{w$k½zaN!MQQ·úEø÷›O¿‡/ñ÷X]Oà®*¶Ûpÿø‰„d"³âÂ\9©Ô`öîŽ-ï+dû~ú~W#”@·9ûÝf.ÌpìãTÿÁéFðøÞ]øª7šŸB¨(ÄfC“SÜLjr“ ýìN ñ0/Þe¾zsÿ6|©nÖïQ—l|0Kô'µ^.ÁÎø÷c÷ø ü¿ø;üÿ~ó)Àï 4ɤ"F®å†yÛíÛpÿ ÜpY1¾ªþ9q_ßÀO.Mý¸ëå¨ó•¬_fV˜Ï —ôñÅ»ðà+øêmS&1%ke\t_õª™h$BNH{/\²Þ™AE Š$®ŠÀS š»Šò.=¾S}N9:2Qµ™vÍ„&PµH_:L÷¾Üà}P’p§ßNw8BÔWîù~úûÅߥ¡Û٠擱œ‹!¨pS°?2¾X|1±ÛdI*Êfns/ ž²ÿ¸þÇãc“]#Ù ½£QÛÍ7'd|˜åx.?ÓOànDáNÑ[wI’ «®¸ö÷ üÄþy/À8%,²ù\Úñ0Âå¿ö´+ÛK‚3¥¡^L¿L,Âõ#smàìÃ7ðÓßëßçݯwþv~ïäø«kã5QH‹TÑ2 Â+’Íøã3¶Ø—ÒM²xÝ¡VHéI"„îGf'š`˜„T×°ûzíl\v$Ñ*sh9—*¤…_!áNž6'²Üønö7Q¬°t½F!´Šo^$ùeáÞLj{"¥hQ]ÀÔàÛQ '4 Ñ«·jßýõEùÎ RÑPŠð>F:(áe†½—í½ŠC~Ï2 D:ÁA“&ï[&´ŠCAq&¯“ï )÷ÉäI^§€T$Q¨÷1R>ñjçwègùã<%5ÄabRQGÑÞÇHM»öYµ‰’P!!åy_GtííÉ&f#®Èò!ïÓ ¥ óìH ¬q4Á‰Ó§]n¿#!©÷õ`ïÔcè~‹(”…ÑÛË6Èþ…D*²CÞ7ŒA·s¸¬;h Ä20)ÁE¤"_÷y€: $¤9!ï#¢Dõü>‚ GÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(‘¿Ä.@)TU»D®Ôu» „¼oN†*¸‚ý«lW+G÷§ë›«O·­rrãùÎáÚ Ul¸„« êW¹õ½«|õÅa«@õþŸZå øý6ܴʸ;hyÂÊy ‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢D*š2>t_1ºHC@ÞGD‰PÎKD‰÷Q"ô,ƒ„¨ª® ÷†è—P·ß»G¶€ZBïÅT6©#UZ~bÙF—D]XZ^*!>õÄ‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆ!ï#¢DÈû‚(ò>‚ J„¼ ˆùÿN¨O¶L“„IEND®B`‚nco-4.5.4/doc/xmp/fgr1.txt000066400000000000000000000000521264355130400152540ustar00rootroot00000000000000Global Distribution of Long-term Average. nco-4.5.4/doc/xmp/fgr2.eps000077500000000000000000012200531264355130400152360ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 22 118 589 685 %%HiResBoundingBox: 22.860001 118.980005 588.060022 684.000026 %................................... %%Creator: GPL Ghostscript 871 (epswrite) %%CreationDate: 2013/04/07 15:38:19 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2010 Artifex Software, Inc. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 1.001 0 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<Áô6 zÓo0@oz=›ÁAº Ú4EþˆIéûPèvdY)é|üÏ9ìú¾°¼B`>ó˜À|P5^£ ÚB×uòC£A¹­_?K0¤0@m†&î`ë×ïjKCïs0÷¨žû%/2×5Ä͵Þ«f¼mÓ^¸ÁÂõÏß4 þ{§ÓU7îõ‚ogK0•êUìºzµ;£š¸~<]+¹5$ÕÙm'{£ï{I–xŒ¡ù€¹MUsWÛ¢™ÀÀ‘‚O§yò±Ä}‡æªæ9õJïjÈûL^ðÊ Y70Ï“ô_1ݨï;U£zØéÛ‡åÏžÐXòjùÆNÄöz/#üMx†Ç´Zýо¶À#CöAós¨þ ïÎÆ~&ƒ±bÙéܾþ´)–À_…o¿B.)Ë|y®n_Þ>·ÑŒ§ Ù!v{ë 0Ð ù¹lÃ+!Ü9’c2¾öƼ #CÃg\.¬XzH“°!;'Ü…ÀC•œ¶Èµ[øíKîÀØGÜæf)鼨»n¼<Ä3ƒ¤ Ãa(9mÃ'0¼¦ŽÉ9ü.„[ÿ²ª=°E!»å}ŒCn¥Wz¦ JÌd ?׋šl [Yv„›PÉ%UòÇ#ªŠÓI”§®òy%! ÏxºÀƒÀÛÙ:0Ï×ùñïvB"šË Øqäy_ro°Ò-ágœ´¦WvÍá5ýÞ›­¤Vøs•·á"µðM¸Ç"걄ɂæò+¿,oÚ˜9¼ØÄaf†ü*‹[uÒü¹²Æ.¤±UÍöåÍ€—Ó2a–Qr¸ÜeÜ<Vgør—kXÛ¢NÐ| ó_»êó”¡(¼€ùÖ(û øÀ|«}5Tx¢ïnÍ`>ó˜ªêvN‚ðp/oË ¯¹†Ã@óÕ…Àå+½«ÖÐ|KÓ…¶R%á¡“À|U˜ –5qXx}[å-4܆üâ|ä·Æ¡¼àÚÍ>IÞuÞÎQœÇ¯†þ בùóz¯*äšCšæZ2´˜oùЉ*Êî',×x^’>]¿Mnšý­®á­Ì·XÚK£1Rfé 9Æv0Ú~HûòÒÈæ›Æ|›«O¦æùÆr^HçÀŸ—ù6|©kø-óÜ#¬X’@Uå€óóA¤ð’,ù_å’˜U‘1@.`žo*ÚãyˆùUÇØËDZÚ³†€@ó•A`VYà ±á zª»ºB~;¦{šF&¬”ù¼õºš£@R´F‘¤ƒNoÌÐa<ë$4Moh€JíölLÔfvÅâ7Ä|º÷Ò®™{¨þY#&­ic® `Ì[¬K,Åÿ ÓPæóvFeOÃQ´­ùÖ ò øš@ᬆ¥V:.XµrÍrmGÃÑv væ³Õn$°pͧhŽA`iÌçª$,Yóéü§;9,ùÈòÇúƶh/¹¦×Ô?™¡-‹i{µ AÛÑv®I1kõ2=WO‰<è<`™šOç?ÛÏ Ô|v…eCÿá~ËÑ|䪭ÐÀ̘{­£,§öÒŠòIÄ¢ ÿºTã›^™¨Ñ €`Eòù&ö€50Šs5 L>Ô°pÍgç3„ïóã|~A'4_òóÒ8Xó©`NƒØŒ$‡(]|À"á*úaDÅÛÿtIã ü¹/¦i[=k„‹ÝGvö:*yà? iÆUjgõ­k7ò+ãŒúº:®Ÿ@ó9ïeàX£æÀtv†Y²[ ’äK¥±F;»-eù_¼ÁM§®ƒ!õ€ÁçÑ®ueLIþ#=µ@Öqˆ'Nýz5û¯ñ€T;Ô&½ÂZЛ ¤°éÍ :ý€äœ”í/e&ÛÖ˜TKŽ¡ëÖ ù6›;ô 0¿yÑ)ÊØB~0xÎf;›ã_ÆË¸zÌæ+µö²gæ+¼•’ŸýO›iHî ÜÍ>rH°ýÜ]4bC ø ʾ™eT °6ÆÕ±Ôf–Ñ|Shó`Ù$`Ö@{Å9ï|~Áô°l„É1Óf+_0çUÙ[›kv;*×{XHÏFio:)yTE{B àì4ØÛŰ*ˆë3y|à 3Ÿk€æ‹VÓ‚ Õ?Qºä!…hïͯ¾¿ÿZŠó`=jwSy­Yˆ%”Â1Ð$.F#Ó|¤y¶Ñøo¤Ú{óë‡â´7#‚z]ÚŸm'uóh«´Ø:œbÕÂG¸Øÿ\†æ+œÕà’$Ô×ÁÊ·ó@qÞÔÎÏóùÅK99 ôÔ, µà²x¼þ³M«áAõÚçÅh¾×eïev–ËqZ9‰J3=O”Ç‚³÷`:ô"5öDø™L/Ýig!½—†vôúN£‘%`²ÕÙ˜µ@F½73-è(p­ c 4&2ªàð‡(‘÷s†Ÿ(63Jei¯÷ŒÉgA$*0ÞHz CŸ®Sÿa+éÖÌÅ|L˜VÌ¦Žºæùô¯Æ8ÚsYlt.Ç]Þé½é܉5;*áDƘGýé‚ÐâûŒE\©èöomËL|y~¯JÝÔéÆJvì¯Ë^Ãý{úö$ÿj³¤œ±×“]PÙè®ÂžË^c¶1ÍÇÈùj1ì¤A?±–È ãPLÊ|ÔôžÛâºÈÙr0æ4ßöÁeô#8ccÜÇ9­hAã?7ó5=ôÈ•€1µóÐE~ò¼Q%cÔ¯ÈÎX˜Eö¹Z7'G*¶›-ÕXð FÁÌŸÉV—æC¹ìo N ^zЫ¦ϲo©l—·u3Ë><–ÉC^Ujl=-S·Ó%ጞš‡l¹ÉŸŽ|¼ÕP[ –#û2ª½²–ÜiP dŸMBvña—ŸÙÁµqå´WLóÙ³¯k›ƒõ:<Ç¿{¼Ïsì‘»ËÍJ{Ùœ‘,ˆ~©>!ÏR\Nrê.uUvMð¡›!Š‚¬ÝÈÛd0ÐN'ÿ;E~†àK¦ua†ì 1: ']vRü‚Ùw†ž ™ê®íÙ é2ÎXl(|-õµ)É|¥ÖjXöè[ç’cÈ/YÚ®Î>¤ÏÖµË:MDŠN]Qhæ•F¦:]–Tö¡ÙÔÿi»ÊŒl¿pB]á44_1Ì“>òò¸¾®µVi¤•LŸÍ­ŠgL€­y›îhrãñAÐ|€‚çt2‹Žá$‚c®bñãÛ·I5¥o×ÑÙ£ûÛ_äôžËl\8É—`GÚÍÍöžçÝæeßñx¦X-jX2é{ŸžÅöbsm¡#-f¯­7ÛûóéÙ6ÇrcYÒÔ®¿¼lîi1Âôv^ÃVªô¾3tZDðé—qÏj£êv}=ÃËmä®»kÃúͲmw›ÍË9v01xfÔðÂ÷Ž2Tjx)ŒÌ–Q´§6ƒk¦`‹7¿~ GoõÌðÉV×–²væ»Ike©Å“Ÿ‡/Ôrá°®§3a4¥aU{Ñu–©é!ÄùÎÉ^ƒ” ŠÕÔY‚æ~®lz:?o‡gùòí¶j[Lhjȵ^táÝ•8üº^jÔù4 ?B±'‰ÂÛ‰D¶R&áÍxTx¸|×§ó³NœÔÏ9膯äK{iY†yoÙl‡Z9æffíD}=ªJ;k¨V£/U²»esyõæŠ|¹X¢žJ9.Ÿ‹oH=›öH’8XÀ½ÒTΛ_?¨DýJú`··nÐÃ32føŒý]Ävs²×gæŸh}Õ‹.Šø†ðæOY|½9çÓ3)ûW™‚Ì é´“däWúayæ³oSò*Tœ„ÝíiO¶+,óGʾÇ_~B<ýô/ø’éŠlEèݯ#Ë_¦ækTØ‘ËGÑÞ`lº½Bì®ï˜Î({Ñï5‡¤ãj,¾¹º¤> ñépBˆÃÁ´D[Zù ·sÕ¾æ@æÛû ‡2©ªÓm?¸H’n #ø 6µ{ ]'z/-ëIã—ª`ì/3öwYüÍö^¡gÊdÐX·(Ï»Ô"ç¿Ìå¸4¶¿ ¾¶ óëu¿üp®ƒeêŸ ¬Äøð.’ÚŽÑ‚Õê¿ØKýÌ•»á ›¤·@|: ¬€×ú˜*a{/y¢Ýgc> ’ŸÝô³ï;©óTÜ.ûh•ÙsBjór6´l׺eç.‡få^Û?œ ¼8ŸIÚ ”}úÕ"¿§oOªWéÌü\ÏÉ|ö§ósˆûW¶ÚÕ®ì²/œöBî)CêBΘ¦Àœãêhöεɾz泊1ŸÎsÍÑÞÔÌ7)öÖ’Ï kµ·ˆ™0^WIDÒó^Lê£>»¦¶pnØ—³24ò‡.ÒÝYîÜ‹+Kô{ÇP#ÔD:¼aÆ>7’¸öaóÅrÓM›N{:󙬑ŸÍ|.Ú3/ïz ™[Y3ó‘œw²PÊ~0pü6;óñîân½Ö Mð‹‚ù ´¿f!<Ñ-T¦n ½šÉ#é®G0fq>?ì’¥_ÏÞÁ‘ö¯tg`߉óé™qþí¿Or‚„˜‰Ô&ÔôÏz¥i q½ê”¶ÙÞóÚÔ(w›‹¢(6â‚”ÇL`¾Ÿ¨8CíÑðpŽI¾æ³ýêÃkàé-#ùyià­®ÃpÓ¥ƒ'¿‰˜O’_”4óc>—økY˜OwÁqH?ôXÁ©ë£XpGÇ÷Ï]&#,×hã^dÁÐæº"_ìƒËƒÈk %M“;+`‡q24½]7šÚ…Ús~<“ è'† ì:læ#øO£+[Üï|2¨NÇvåb¾hµ×WE¶‘¡ºx´)˜O‘\æ«‘ùšÆæs½ê."q¾x,qr¯Õ.!‰DŸ*ÛS¢ÐvgqŒ† }úé!Ä?ÿ”%—ݰº€áÂ~¾hÏ’VÒ4sÌ„ëP.è|É0ŸšRñ>Rå?4¦rÕ¹ éúUB*Å|"&²Ô¼§}IäÅèeâ‰ÖõAÊ/ЇrŪTE~˜çsXŒÑÒ³Yz æ#]^½æÏìÊáh0)¤v§ÝîÜ,«[ÏÁa‘„ÝîAćêˆ%§+?Rzîu‰¦±šA~—@˜sFH@Ç,“…¢B[]Ì'"ó]‚!?Þu¼£$‘k9IžÑCô®‹±ÈE…™Íܳ/``†L8ù-ùâ×wóåg¾d»± y³3_Ô˜/ÒAFñ´ÊX@eûHÅ`¨ÝŸÆŸ4žOÿ½E~òt(cd¾|ûòøË!…BŒ‹arõSß&ü®ûH Ϥ|(ÉËMûQçbô¨}›ÂÉÏÏ|ÃøX}|°¿V$pù‡õ«Ò£jwîhá(æ#ËxV³õ½vì ÈGfÑ$ æ[-óMÆ©’%\§Ð·ÏšÉ|bÆP7žü쳸LÞà,dPƒi¼Ìw<<ýô‡Jx`õê'âšÁLoØäg_rBQ'?›¥vŽDþÃ_­K4»wèþ‘´§“Ÿ©‰¯´ç%Œ@èzØì‰I~@F23‹½þ]ä;èe"¿Œiy`¾Š˜o:Úc΢oOÀ1ߘeZs1Ÿa2 £Sàa¾‡á˜&ûòí‹m7/g9MhTâ&A&’_òÐ-ÁgئA1‹1A–#4¸üO ò“æõ.2Ÿú´w{/©Yù;Ç„e óÙŽDáN"4ÚK^ó^«ÒÂb˜ÄÎy '¿ÍË9„-ò&¤ëä÷ÛÏâÝß3Ñží2ßÜ5\¤Þ*Þ~]Ö‰ì´6vñ?¿™ƒ‡—ìÓ“t%gØÄïï¿>i;xÉOÍéSe¼Ÿ“ä¡}×ïÃâÚusiŒlÛº×,»Ô[·¹IJh:×]îPØaϪON|ÜÞµ»kãÑŠÿ4†v{Û»½ãøÆÞlïûëRÅÂõVˆßÂè.[Ä냘ÀçÜ&?£(.1Lá—Üí¦°'¿ýl~ä?õÃ<|Y JÎóeüt•}F8¾j+]#¿SX3¯ä\õÎŠÏ µ;Gb‰7]„ÌωzO½U@cñ—Ó·ƒ'3,ÍýyÇk>¯&Y>óelöDÌ7©·S8ò·¦c¾‡§÷2s‡1:ùiÕ Ÿ½Žü_Ÿÿó‹w%?Ã@IÃæ–£ŒÍ‘g~NN ÙjFZ|#w~@~}§KÐðyCïã~ȸzMR`ÙYÿÙ“»Ó‹^‹‡  ýWÚ…¹ò(ôŸsÏÞý3³h3b2ùM±Þ…‹üHþ³9ÏÜó­ÔÛ ˜ÄzßJ­ZR7k¬OÕâB›ó$í]ÞÕ§Ç=>Eô§åh:/¯ãb5—A$çAI©G¼ÿ¢'ƒNMÚî»›Û³ë?Col²á˹¹.lïh éTü,úázŒb³½?œþ½ýÐ;ªzIùZwÚz‡·…ºwMÝ_W†C2í w“¾ñ¨÷ívð[åó´×w¬ÆÌŸM{¿ÿùEçÎß~ï~lÞö`¾é8?|@QÛŠH¹ÊØÿöŸâÝÇ(Þɾù÷|7LªsÏöåLPähûµa£ÂåcÛ"Œ 6möQ‘¢ºÙGáÉ q6Ü|Ng ÏϢ߉{ÅGÃ[»âUÙ總»]öÖz8Õéºþ̬\qz6JÓ%w~È ‡¤FûŒ^ž5IÏm,ù‘ÐßëÁçëšÑ*jÑ|#©HXác8+lIÇn§ßßþ³ $?’cÏûNˆßÏÒp(ød¸æ<ä'â§ÄBŒcç1”éù½^g<&A"v:ÐŽT4¯P/Ü|½¶ƒh")gñüiÛªÒãöîtzÙG‡§Ó I'úÌ1æPÇ!+¶;}a²[_‰_Ñ~ƒ¾ûñ(‡Åÿz|’>ô@vY(ìu͘Z.VÈX)4Ë<_FÁGdíP!d® —À Ølî‡u,~=ØÍªIÍ3ŸýZòOW,€1ù4ÝÀ9ÐÃi÷9™hÈüÊk|?¹Þ¹"Ô©=㌲ cZš²ëE<èφ«–‚ÊC¸ ÜK‚|rTzs÷½õô pwO-3CCW ÿÀf"´R‚.ò‹å¼ØdÁµÏó‘Âk|ØG0¶”íôÍæŽIÓÉL{’–,òÛ¼œuò‹ªŒ|9‹:¬6¹Í7ͦ½`ûßH«A&–%ûÇâFBÒÆmC÷ßo“UgÖ{ÚDzã,¼³q®ò`ß q0¶«Ÿ =¥]¿ÓÄßÞZQÙf‚A{n°~IZÕ“a>‹þ“–ôãÊ7°ÛÈ'ÂÛÅ`™2è¤ë{oŒXÅi¯´,–.I ?ChÊ/ö ù¢9Ïv?®Ú(¤2;çl£Kq¦á¯‘ž.ýÁ‹ñâ/Ù–þZÙ‚béQ`Óø A\£ºÞ»ÊO×üx+/×I„î;ùmð0xÇ‚]“ÄøJ&QHò”AЮV—}rS\ÚÓanŒñ~{5ç·*µ7«æsM°Õc9Ãàe æ y]]”Éà=‹<òm7óE ¾ñ²¡:q]ÒúéÛÓœÊ/9˜6™,Éj¥ä–¨µ^]¥˜I‰ã]Ù€/ #†µÖ쩸ÁRDakJÐWË®²¤˶SJöÙ§çÃèêS¯é#´”Méï%ݱ-²eßÈg¾]ÍW€ùlÍ曃ùF_@4ó9ÈÏÅ|’„h²ü6 ógœ“ÿx’ˆ Œ×”_KÖ^vŽ ¾\#„È•s'?ãRu¶`–I"ÒÉ-W§™›ÁH^jMyá[qBצ{K[ó>`5_ktõsåÅ‹‡B ‚qG0ß|lA{\ÖÄ|S_ìó—pá5æÓ˜¡=/ù%¼ººà#O45ùåe¾ðéŒvèvDé×ïï¿>þòƒ‚'?ÞAÆ|v!•N+Ø}Ó¬EÙekø®ØSß5ÐÕ¥†äxÜèê¼ê©‹=Ìn ÁÎW¹žÜó|Ap%Õµ¢üÖ6+9O—Æ ×^üŸïŸfžö›ˆüô8W¨¡Ï(îDðuhˆòá „èƒÅ§¢[tõdªI/#Æ•”w7stІe/â|·Q ‹Ûíp¯ å-sJ.Á!ÅY`Ùd ÝiP:€ Ø1R\ÂsO™ü}û«M|#òf²%ãU‘³ö}o7¸~^é54D6%1MáyRÀåÝÿñíãfs7]ß*†˜¡X~ {†/¼(ÙƒƒÇ·¥?Œë ‰HŠZ-ø–Òµ›—³ÚN.ˆx:½ÜÎÛõ—¿+êJt»¹ß÷Ý­SÇ IDATîô•ñ"÷ß^ö}'ÿ>‰î“è\ä°³ÙÞ·w†“SÓ9nï6Û{½»Â/;-Ÿ§bš/P®AÍáY7¼®N¹?Û—ýŒSß,—ùŽ%ò(d˾“½ìpäØ%Šðž~úãâð´¯xi‘&û$tT-´¸×383’nø­®ö%æ“ñ‚ʵ“HO¯«›í½8= kA%IÑò'(íKTt{âpø$ŽjuF¹ÏNЕ‰ôâvݾ£Ÿú&mNÕËZœç[Ug9ÎD®ÎÇ·gj|x¥ÔHeªD =™ ëE oé ²çŸ~úC_v1ªÈœA~ןkÆ„òIˆÍª« s?©¥øèü `¯M"ÞÊs;óíêvMm-¼Å¬/Ã/[q¾Û.YWvÿY<I˜D¬X'±ãFOÕæ2¦i´uö±Ì—º¦‰i%)Í'Õ[xs˜Ø–ÙnY8Cäe>bõŸ®ç4u¿²0Ÿ”}úHÈXv1PüÙÑ.Õå! Yðš]ç)¤B­/ÆÇ|ÚשçcÄ^0Ã=6Aês~vžäŠ6Çí]¬à«'Âå•€FFW¹hOT>¥&’ôÐõõtBZ^¶œ{“•¬üÑwvóá!öœƒ‰ØÈæ^^ªjEøÁÉù?EHd)ÑKöáÝÆÈQ1Ž3õ<_%óÓCJ‡ ¢]‡ÍÆI3“_ö9?O¦Oðe„íúVì•È‚Ã_éËØAâp¸ýeêFÞÏ9¡(Pþ™ýpz±9ø|z>Ÿž;ÑËÜACžwßwú 7ÛÁ‰lÛQìKð¥K› ÑÀÊ´ÅÐJœKµB'MºŽ“Þ¸)Â[B-x¾‚s ´''5GVä"W¤2¥žÁvú?¥æ £Ã´E…#s‘kºñúõešP‘–ʦß_‰¶Ó¢Uå£]ÏVÆÚìí²®Ú‡Óužo淀׵ݺ-F+Æ7a¼CKg¯ùÔlŸÁaÞæŒtuf¿wÌ÷øö1û¹È©©Ë¶âÈÒüÍæÎš›qRS·ìJé]þûV°T§„´n7.˜(gãÍ «LkWb#ëMw¸‘#màzW)B2x,«!ÿ¡*Á7µò3’72^p¨^™ÌÉ™7/Å««¤O£½DÑ©GBçN™·?1‰R+e>]üÙ€ù¶Í (Ðæ%Ȫ+úß÷÷_å_ºU—‘@xzó ð\>Åm’ñ )w6·:Œˆ j/vÖÐ&?ã¤ÆÄ^/:£ íÚlÄv&²u)íR•jËÔN$¡È.J«|¦~2©Ú›ÿÙ(ò%sÞl²á6£ÎøI‹^Ï—.ò³OjHCùCR&kž1_ïFíþ“ .Õ0 .3 VkH£Oѱ¼c|Ò£sʾioS”Œ›f¾Ó  ’¨øu<Æ/hL’ŸqRÛj #dC a%6š¯ÉA4kj§6¸¥è'Ë“²ì'v†zå<“…W¿Mõɵ4¢Kù†ëåÖ¯ž[b>Cí®|žO¾`Þ#0e‹:cNÕ¾Ù7s:ãÌ‚!?#sN°Éò¼ì wE*>Sy½è ÷æò8¯ó!’%Í26ª'€)n‡K_ÂçÙí)Šrñ_ìDZ² ”!¶¥ržD±.Òë²Ú•øCÚCCd Txkf® ä=ëjä·™$‡5-Vs†ÎŒª£¯6e²ãpÞðÞOÏrE§Þ½/4ßT‚„W„\íÍïuÿnMÉfÎ%ø >cþéÕy<ÃE…ƒ.ؽY‹æ ö€R:,ï힨ØP¶%h/ŠíĈz¡AâÏæE«Â'˜/ʱ¨9Í8ÏIƇ'WYڙ⠽ +Ëë>Ïw:¹M†}4cKßlý²Â5\ô>OH=`A74—Órüqü“|åÔÞü&“–œÞ ¬R4Zöö¢†ó¹ìZÞ£Ué°•ùØ^õÑ^Ͳ/„·ˆpí+¯à#–Ø4¿PQÍ×bˆ ¹[%¬fá½×¾Ú$¼gš‡ã¹ít~–ðvÆäfóÖë)® ®ð¨Œmæn7)íMÝó’ð¼‹ö=Kî–õÖí4º ¡· h”V’ Ao''ù"9/m§©{Þ;9çõ‚’»~μ…uÖ[·Óh-–( ÀÀõwoòÚ3w»RiÛÍývs/*”Ÿõ?'¿’´WKU¹Ö5Iø ?˜“ÿÖë3Our&W¬°«IòÓ7žÎÏ:á-Œü ¯Õ·! "ëtM#\ãæöšX×b09'Oïz–¢ÙßNôé5hoyäW~Mv><·ÚËh±iüZ‰õßåÏ^óa´¢œŸúôž‹äC~Åb; 凰²‘“+u½t0gÁÙÖAþßùYt½Áô¶ ò+éíÌNx!:ZVM~Ó\ŸÕ"¸¥#”U„Ku”ŒpÉ.%YIîë+"¿¬‚ÏX.q 8N§ê?§âñí£ü[ù[Ïvxf9š±ìŸkr‡Ø3Â= $CUÃBQ‚©p<š[&puÊû˜v笈&]öªîÆ, ‹ör­$\Ù,£ùl½•ÅÒ§r X>¦™á3o7ÿ ‡_ÞhjÚ« e"\ nÏd*B€ 3Ó^â,xö´õÀ|ÙôYFÞʽұ€1Ú5yÀšŸ„‰¶mË®¾š¿Ù"G;ÙYúçñ§èYà¾VȯyW‰]}5³EŽ 6»³ '*Þwã}ž„‘‚o‘“|¢l CÀe‘’œ—KzþkqÕ¹T”\«ÁvWŽÏm0¼ úg%71K@ðöðH¬Å2Ùí-3+0>ÖC~ S}Kuuв±'6]“¥Æñ¢”P ¶Óžáƒû`6ò[s&ßÜÌÇ3ø ˆò[[xË|Ìç cã`ò“R/Pð-x’O”Êçsm„옚ü€Y™‘wP~3 Ê®LÛP·€&ÈoüÊïÓ¹:+1¤¯ñT¥ VÀHCº ÍÇÇvâ™)ûbÕÞ ;çc>>†ÅXQ(…eGuÐ|ŠçHW/h`Œ˜Ó÷AhLÌǧîö€ej>,ô 0…ìƒÈ«—ù€j±†I>0Àd_šà[g`'˜`u4 €ùÀgB¬ÆÕ æBóMFK_¢n' ºeÒW•tAý7 i4Ç‚µqd%†ôu‘– «Œ™ü' ðÎç—‘Gâq½Wl­¬F 0©àêb>°hoEÌgÓœœÀl(ŸÕÚ€4\¸æëû^—}úg° °@æ3s~‚Ëg>pP µÔpAz8Þò5ŸÀİæk”íà›ÈkHKÑÁëJÚ_?#—" Qt~Vbç‹ÍóATka>üŠÝ ?€…é<0ßÛ Í‹P`Éš<¬…ùÈÅùüœÀ²5ŸÐâ\ô€—,Z_佡Uà2BNõa¯ óMZ´“? «R6°”¬X=ó* òt.w+æ›UüÍ øŒSKŸ'bmÖ†¦Ÿá§1£$®í\šÏþgÂéÀš-šÍ׋éÐ&Ž °ròc¾_—jöȺæÕöñƒ þçàE€¼vuášo|ãáiÚ`¾‰BKlÙgÄp’+-dÔ˜ÏO3ë6Eº¥”kB“ëü ‚¶£!h{Uæ½æ%–èS‘ŸþRh¾Å@§4›Þ@x`¾’ÌëÒ|íú.¸Ú6Æ^ØbÆ.ÕÞÄβ˜§±Ú¶/ÉD,¯!ó1ŸMrvýhÈA¼ h;n"n"nâÔ(¹Jˆ X,ó1^;ïIÍk>&Ò~N`Ì^ íh;޶å™^M`Ìg¹ÆLŠb«‘!Þ€…h>†Ò ö€ej>¯žƒàf@¾Vd5`>óÀ2ð]кΜ—Õ#c]ù‘äöææwCÚNÆ ÛUaÙv¾‹l{ÈßhÛs½×Hƒæ[íñ[Ô?C¶·•LÞö#,µí®6.µí޾Ѷ¾×QíEò˜¯IÎcL€¾Ø…¡uøQa/CTÛû!ZùFµ]­p©¶Ë-úöe´Ýn£q÷[o»«9Æ}·KbÙmoî}ó¡¯ù|ëÛ nXŒëƒo…½Ö±ÞöÖ­@Ú\FÛóŠÈe´Èõ<,é}Ï Ìóµdæ˜÷Öè1ÓËkûR \Qõ}oè¤Ü÷Œ÷QöOsÃãÖG´¤, ùVA‡Ý«ç¶}ÁC]c ³BÝæò….©OŸæ¢¹¡Ñé)Îkpðs`Ënûò¦²ô!ho À۹㮠ßJt³ÄÕâ{`ÍË{E…ø/Iê)÷¦>¬YÏûÍÐC×ËCn_€iH˜ä0âý–wÓ{`ym×·óO~Cm¼T^߯Ù+Í·|þ3Þòq···k]m̵ým—;K …o»Šil·í±]ã½^ÒûÍp£B;ÃÙÞúkàj£kh¿Ô¶»núRï{Ô¿’g>¤½ =s € ùÌ`>ó˜À|æ0€ùÌ`>°€µ ^0…ö[_r ùHaDÀ|°(«²aÅ5 x; vò Qx®õZùo•˾Sš€êÀ,±mP£!™o][Ì@aÙgPI{}ß“ÞÑØoÌ@KìHXà·°`žÚ 6>°…ôaò:À|4C~áá˜Ë‹;€ ó|°4Øñœ =óÀÙÎËm =óÀ ë9WLHV¬h¤ˆ€fX˜ìãË[£ø€ù€uÞNÌ`>XÉžfa~ÍoX±j V€æ"èñëÐ|“CŠ6Y2˜ü6\ `¾µp':` ŸoDßQ^D{ÉPo“»‘©Çü‰lÑ *°y¾9èpÒa ðvfÀl…ðíÙ•¨ä5ňIDh¾©Ø¨à‰ô¯@rÐ|ËžÐ|Í·hð¡ž4_6Ìcx"Ð@šÏeÎЛ3i˜¼=>{ÏUMÌW†ðŒÚµÑEâ<‘´GF³YÉa4›xš­½ !€•j¾@`Šu@cšo]Ý ÁP+ ÇvvC,¦[û¾/E{kVÌh;޶ 0n$03Jf².Aа(ÍbV§ù˜%X`išO÷jºB— ™Àñu æiھΆ¬¹íx€È|bñ¨ÈODzi mAÃäê˜Ï%þ`6ÌÛ©û9õRËHúÈ|Æ:;à?`~¨X­Ö Sm…üৈE%þu‘fKòÓk±V5*@‹‚áUUí—Kc>=ž<, OߞРæãôhX¾æk4id€ùnˆJZG†;0fŠíTÁœêŸ$áá~+ÑKe‚ÙV”´«†9eÜlúž®Ý\yhízïÊÌóuô=áž@FÚó~v}KÓ6¶^ù¡ïÏ|€æ "?²¿ÀvÞ%»ìgïž®z·Û;ØJTOËóEè¿GaÀ˾Ƿ臕ãóhƒá²9ÆvfIÿŠ¡7Þ¸ÙõFŒ-cUŠ ^ãMck! S:˜Ó ‘³€^ÍÇL¦1qÂlßJ«—¬ŸR-ü¾6«L£Ç êzŽñ|ê,èU?´´õÉ©Wx@*¨MØ‘Ñ(Æ|³§¢(ã«Øœ1ûŒä54h>€ÉÜX ‹9Bà‘Í}}@{p%›- ¯‹ôìD£†ð”L$ €…·HÓ|ÙÇ®H_×Fg&ã|~A'@öó/r‹­ÌìíÏÌñCް$-X€ùì0¡Œ]ÉÔ1fhôÔ/¿Œœ<Ý|yM#Œ ¿@ ¼˜%^•º£v÷á?Ãê½7-.Ù-é6Ñ%þ Óø’›ü!Q-±)}Ë0›…#\È¢cøoñ³Lh °R*ÕŒ›ž·˜´àµdú +­Ì—á.Šô˜å ùúÚ¸"}ÚŸË”é®2¥öHÅî5f ]ºPÿ0ÒÕY‰]-À|ä8"Ë¢µy}Ð=‹Õ¾Ïðs‚Úi)Ó‘Ÿn‡´ˆ°€vÒ<ºì°—/GòS%võUÙŒxP ŒhcT]Z†™ Ϭíg“ߌöë²75m‡,ºS ¥€ÈOR1Œ¯ÌœüœÅϹFæ ™M~J\i+º¾Ä]UX€žLó"y]ÞÉËsðpÀÌRÁ§$·ëÙŽqŠ.‹ªÛiÏ”’¹Ÿ˜\ ÊiÏ^K6d‹Mœðr•d¾> ¸€°Kü³-§!ïlaÇ,ËÔ®ù0 ·ZIcÌæt‰ÑKE±µŒd–a ùÀ=V¬_,b!õej>9ØÚp<êÿ‚oXäƒ]eš™ì|n;cH ÜùbÌg‡V¶â¤Fõ2k¦CÝIûñíÇo?î áÀÎ¥³£"¢·J é«‚÷µ­ˆÛ•ãL3: |ǵÅ0Gú[íÕc²*1¤¯æo¶ÀT°PËÅË>OP J®ÕÀü€ihèÚ@xxª§³sžb=vøuUws°ÕBŸÏÛnï„§^`“è-ÈâÚ!|u½µišôMƒöZ&KÚs‘bFMò]/¦Ú™Bè¿vñôí)çs•#•]1>Û¤åÚ$HÒ,ƒù p!^¼•ÂvªÊ6Óá*¿M®ØõÙH{°Ãaô.»Ú`õ2̇…Î[ü͉Ç_~Ðùo~k¥Î‘×Üä|·±‰0Q¡>uUv·ÙÔ?Ûl§6Š˜åqÖ)<ʬÉÚXä`yåö÷Ë·/àÂVžá ù¹©®8—Û9ìºl µ„@ Èj™Ï¨2ŽŠÕ-š b=O>{—’€@c‚/FÖÏ ;3ÏØ.ÜëÇ’kÉ.W+ÖlQ2“hã=œ³Y“™ùO ¾Õ¢êÑ5fRÈ\yÁF¹Š¶"¡Ú¼u0ßàv¶¨Ç›Ÿ’œÀcYÉT_A h86½Ïå‰Ñ&gø4_…÷úy^„w¡QCúº`ûÛÒ‚dM–èñíã ´· Mô°0Œ~øÕ;E>Eô„Òµh>`ûn¾ŸãÞ|{^¤LûdDÓ*¦•&mÖoQ½ùõÃøçʯ9”d>D¸ÌMS*¿c͈‚æ#£Û*yÂï|~Q ºIÑàØÌ—zÞ%zr“”FuŽ_é³zÅJ—=<\þ„aS}Ñüw<^þƱ]HnClטâT÷‹¼e÷1DöyŸ4È>0ŸGç ¤ôͯö&CÙ —ì8_ŽÉÛó²])úyÞPˆ[ı +ø6Û{ùK~˜/›øË{À¡׋ÑN^1´üå¢Ó’ÎË;<Ÿ¾=Õ/ªÆû®Ë«À||0 ûÀ|“pU^6òÖ#_°îä^ÑH[Þâ2—Rßd¶ ùž4çå) ÃåÅò×»Ÿt@£RSŒc`{5§ú”ùÎ`Y®l7­Î‹´Îá!-o~ýÐW-™wã¬ÿ óm°(î:™¯wcÎkXªì‹’/YÂ+\S}m…)†›*iÙc'ùÒ8o|Fåò—©B7#èÓ{ÆT_È= ,žào;ȯ4J®L«ÏHÚS?_™…'ÉÊ÷-äÍ$­›Ü¸ÙÜÝÞɇ!ÄFˆóé9—½~óë‡ïᅥd³¹›ÎLÄy8G±Û…sÛI¿ˆ»ÍæåìÚÁëጠòšŸ~úÃ`zî8‡ƒáö|üåu„æl„¤›“íB¶¿èÁÇd#¶ ä—ðjßÌ̽"jhâ}تºŒ°«³Q@áUв;93°g1Ùzóë‡ùçÌÏw&m§Ðvs/M.†pñЀÿòMò%Ò5`Ÿ¡Põlc?y7(Yì_g½»òyVS…º”óñVu‹ÛÕbÌgSÔx_åòÎçù¾ùõƒwÂìéÛÓxÁÇ@ŸÉÓ9o¢|öP[Æ…9Õ˜Ãj§PJ"y”Õcäí°j‚jd*óÛ‰²=†£Ÿö)î×ȦÁMÚ:󹼚±½+_¢Bçª×ô3Ñ(Ùi/ÐFÔNEúe«ÏFstò¤É6hæµgÓrÞÕÔo×®eyõÃ~|ûÑîD_EVÏ?ù}'úNœÎÏêO}¥šCv]`Þz 6Þ–Ò|é3>/Ð^ݸNÎóÚzsŸI«qºÃ[²ƒ ÊáþÛiüËÎðéO‚ýä¨öJ¢R¹x÷ñ—òæ±Ë]߉Þ%Óëb Õ˜ÏåØÉF†X_ÔØ»q=¬¥ow–Ã^²bS,N§—\l÷æ×¤ý%Yä|·Ižä›‚–™#£%e"r®Ó¦À´Žêv¶Nª„9 Á'~›í\·,[srñV–ã€DËj>C¢)ÚŸÛà&-¾.„^¤XY®´yšóù%êå)ûHâ,SºÚ¡üffÁ/ß¾sŠ©#Ïfã%`ÚƒTcA“>b„Í_èè'†i~ûYüös1®ZÛ*»Å2Ù9¸*ŒŒM˜táÉyö^$ˆ'¶tµ}å)maµàD~H]è|l¸í‘æ2Í œÒùì8AñÏ)u¥>æ^õêµCTsøvÍ#—Á|“óçË`/¹^œ^m qxºö!ÃÁ§nE¸ÔK1ßÚ‚G5ˆÈQ"oâÎ7öÑ) MZ4Çëê$ÉoBÚs°øíŸ•$B€ù²šÀýÈe¹šX„3ð" &îvÝî¡ë &NÔ‹j¸ºÝÞñºªåtÚ›!Â3MÐéü¬¼ô®qžºq.ÙÇO£Ž¯^vŸHç‘÷k‘•Ó ÔpÃ…ZÀ«¢ ±žgGí•‘Q-š…ënÿÏ=Äçià u½âÁ0ÁÒîÇ<³j¦¦´ÎÓ?Ûs¨•Ø uæT{¼ûñ8òYRBð$^¼í½<þC¯ƒ.úU‘ Xßû¿ýgGn‡ \óÝliSÎú [™õŒ‚ýá Ìßéô’¼>mñí’×j‹ ÷ð55ŽaȲ‰~åÍŠ¥½[)/]sÈþèó(éÃ÷]ÿùrÙƒvÚÐ$ª&í(Ýæ«ñ¦zìÝßCÊHóìƒ-Öb2™ì¢Áx–‚³’áÓi®ÂcçÓsláéÀýõks™oé¾s.éÆÓúõôÇC<ÈLd’ÿ<ÇáÞÌÞb÷ÌøpÙ.•NãØq’«ùqâÏígV°t÷MîÑ ?žÎÏ{·Wý¸½“ŠüÒ¦~my+øTwé=æé=‡ó“ìùŒüWIxG±|> Elå@ŠÿóÊ07ÕL#¢_-9è» ¦ýp¸É­E—©Ä‰c8IÎÓioºg@5-¹.ýJfp&øÚíú í|·Iðõ¹(ÜõÀ«±ÓÏGí«}ß}r¥¾ÛÔSì:ÉyÇÞу½Ã¿ŸÛ4^  NÚëÇ:WuÁ7-/Ó9w•mPu¼8`»Ý7 §Îvµ=<ãû‰"“—ù¢\3šöÈCvï¥HBÀYþõø$~~|÷£óŽØèùnó—|27<ª“¡=ùa7¼SjŸãöN}Þ3Ðø–œäéíÝÇ[°÷õ¢ˆ-Á‰Z3Še5 ¶3Íè”57Cnݾ« £ŸPY&hÉá #Eù`Q]F]ƒ¾³WçMD„.:'ͽîÁó>†ƒ=£â÷?.ó@ì»^þ©6*‡§=Ñ{@I=û щÐè´¨n™4žå÷?¿è~aú-PŸC´&˜È HKÁ†-ø¶›ûØ©¾Ë•h®N}KŠRuñ$í_©‹ô’ßùô¬[^×iJ–¹ÌôíDWþ&½š—yÄd'j>©7Cä‹ÞWºí>:NM²þùnÃ÷•mÙ¹ç(ò»íÊy®Gh³½ÿ,ú½{ê[ùÉý6í¹-†üŠã÷?¿0Ùʽ9ÐèKG±.eg*Eiú_ˆ¥;ŸÕ8S½r:aD-¼)ÃsäPöÙ‡%i·òdC\­{óë‡óÝ&6“Ì <™ÝeÖdÁd­yë m°@J½¼ ‡öQ‘™ÊŽG%Øx*^õYùŠ?ãç’À>S~NÃc)yQ6V§®ÝéEÑßðŒä"þBö ï·u¢¢y¾®ë–M~¤ô¡Ý€C¹õ^êA IDAT½ðQé‚d;û'þ‹¶ûŒÚSùä„_ÈUé—q¾Ûl¨Í»®ù|z6æ`®4ðp1ͧJÉ’–0k¥SfRS›5Löîô¢O_ !B¦É’}žçÓ³>˜#Ÿßÿüò—Q$ê"¹g?ŒÒ’\eìiÐ3Ž´Ÿ£ÓäÏ£f[&ðÚóÞ,ï…Ù1î4ßXÂ[É$Ÿ±ô³FåsQ“}ʃeÒòÚ´ÇOeƒî6¼‰w5„´Œµ0Íc¸uéëŸy¬)hÏ53šÇïr<èüÁ{ð„2²ºE|¼Ï€1¤”Q?ÿ,zƒÌö×?—V#Ã5IÚó67zLƒìõåk¾ƳðoN Ó“ôÁr/ºnÛë; H®»¥ñ^âܶÑFy0H<ÄÃCßÝÎbä³»ŽF¦½ë ñZ@f «”/ûœ‡é|zî»{Ù^Ù§zLrŒ-ætÂ3¶:îR3sŠÿïuv“ðv—«‘< +RzCZÊø—ñvºVf¯ÆJ¸rÒÑâ!¾8Ý^´GRŽ´6»8×­–? éæ5%ì 鳕íR=ÛÍ=1aD:hŸÅPê‚ït~Â1ˆ¾’_‡¾Êq:?MSÒÉo ÿ…ß,¾óÉ–KP‰æ•èÔp™{Ï“;Xº9°:RÞ)™‹"}Ô|õQáù¯Ç§wâ±QS<óõ}¯‹$”kVðÞɲ BˆÍæ.¤V¬í U/¤.J¶aæ’„¬C)º¿ÛÙån¥àâþ‡Ùw–¸”¼îË‘'5–WŸég×/ÒpxJÍL:Î,øÆ¬ƒ¢¥Žî:éÎÁ#éÇ•ÇçÆÉ°L¢òÙéy³½WO—=q®Ë>—Û€ÜxÜÞE¯‡ƒêsŸdWÈÏ›—3Cxú³GfGðÄ)ùÏÛÿy ¶Žù4ãá\|&ùð©7v 5ýýýW¡ ©zÑušBºq[°ÔËg6+fŸTrÛÅÂj—‚§€üŠ3n§$Ë¥K5•Ò?¤.?é˜G,Oõ1õZ™Ù®Kº›.ûÜñM®d8Ýøv»äbNYù¨7Ä(›éº5çÓ³+ Vh¨So(ºÝPíº|ØÞúißw»kÿ¨ÝÈaV`Ð&O~f,æ8Mˆ&×éCU|Àšd£õ:/¼’ä þ“ÿ\<ÿÙyKjËÅ`õCûu8ˆ»k°f«(!„÷vzÃhJF`lz²1Ä I4ÇbtyaQ—q:?oûNßyTDʵG—ŽôÎ Ž|Y¤’q1§+ðωºï ëx=œþ»>ÃÊá¨çvÖ:éöu^$”C©kü^›¯sÃ@$mϽ¼§[{ƒÆ +ÁQLÀ¡ÿ÷·P—ùWïƒýøËgßhdÕaŠÍóMäâ]üO?Wq–5XçúÏËCùôß/BˆÇ_«!û »>hÍÞãq•ƒBüö^üýҦ߲÷›’½lÇZìL˜þ&Û?dó.;eÈè«•®³“eRc)_7Á.©”àðÔk¥öŽûèå°ÝõòŒY^áKã³ùOÆÂìûNΤÞâò·÷Bdn…‹ó¼i 2þ :…ë;üï?Äïñ/)ùhcÇ/áJ¡“_Åí€ÆžäEæË’­›z•¥µ3_v 4æ½ÄV³‹õt~þþþ«œR ÚÌÎ^QrjŸ{^ƒºØôûû¯}ºVgÿG/T½‰¡·Ó¬Ù¿{šÏÓÅÓQðÎjðna£»nÂÎHé»­>«ª¥÷]¤Œ{ˆ° ž^&ÖGʬ’º"©Oy0üwbwú Úx¤nç^«™yëë\Úf{/Hîa#Çõ\4&“xxÙ䚆|.ñg´W²é»¿‹  Bþìj¼"ÖŠb;Çð¡öd942ôµVýUáÊ^XciÊÃõªÛ;ÈðÚTßvsÒì”1Û!I”™…Ò£1õë$¤¦—Ø1‡*“[÷ä™Ñ½êrˤúÿfõT¶âuãq{gÔ±ó䤟-<æÞ¦½Nô½–Ç­Ÿôx%•ˆç°ë…oŠ‘7²ŒCu?ü`ž" ì yËD¹ºËz…Û]…ËÓ5b$(ˆ Ö´}¤;*NÕ`ný!¹ŽWüß›_?pfÌW'wÊXÓjeŸáÑÙâ$®Q!ì “w*6¯ý¯OføòoÿÙ–TËc[eî÷êš{š}uw™Ó/öÜfµóéÙÕ¶_×EŠúz–X/:e õâ[†X=ŸL–eg¥ ì©àˆKú£$!ùm×ÛµâŒ:¨‘#ç~&½1“sbâ±ïz†íl/.ᜦæÉÛ=Q2 yXºülêZÁL,-í“=ûë½Ñ§úœÖ)ÌCØ]FY—!Ócå5²S…·wƒ–öâS7Ø_·Vûî4/UòŽz%§^t]ßmu^é»­ýõÚ Ö‘gÜ;fbµ ®9&*èci uEkGÈaO*þ L,ñø¢¢NŒäwæ¼ÌåÅ&Ϋ…÷ƒ=F¹y¶¯ãE»ü ùœð!3o~ý šó¹}Š…<¢®b’zOcÂIKa >ÆíØ›Ï;fîn/Äq{w¦œó ‘ ¼•³±Î•À— YyÚ\7 ï\&õoÿ}’•‚¥UÒ‹W]vÖÅew74tý¾ïº^Ñí‡KË«3kô¸¬sH]ÊÀŤ¶›û}ߩۧ“Š]±/jŒ’Œï￾{{éd9cm;–G&Pê«:sLbLržw&ã!‘KV1üGû rÛÕÙœp`¾Ä{ƒS*aÎ ¿(’ctY*ìûû¯âé1­Jð‘é·v ðåsHHIFè´Õ]!†ÏÛÛ.÷&ÙóßßU´§ Æk¯û„ θÓ0X2b“—,ÞÀ(nr­<7¨K{‰‡³\ÛE,Ø;+.& ÖOˆð½ûûÿè\ôÊ£ž@Qz¨v׋¾ËH™À z‰jŸdûë•(Ë@¾˜ä³}Œ_®a¥Õ˼‰ËÖsaO“cgïûßiQûi®ÎÛTåðdhÏ(È»;½l·w{5¥ÂÌ\ÓZ—jÚn÷r¬yUE®j)$íé¹nú<Š òùAï+{©9ýó‰ZBOß“/ éJúT·ž¬'p™z¼þ¤»$P^ã²ôŽUnþ ¡éÖ+pzøÆ¦L:AV™®}ÿîïâ÷sâ]&ËÌ ·ô2Oìžê³Çd¹ª®¨b7úƒrpµÛg±´Lë!%­«ÃêäÊMûs¾™¹›Þ·ÁN9¸(áÄ.*­Ùu.´™_”D¹k¿IÚ38ï2ƒu]ÜðêägûUÈvém—Áx†Ü[G#K„ÛœÇûQ Cà#Û~!Õóv¥ Íë-gÌc,L¥’Î["8SÐNðj!-ƒG <ÜßV‡$Á¸Z¡V”ßSäçà3ùka&°Qg¯q8‚|,½é¶Qb”œ4^y#ûVï ãçêQÒ|õc¾ìÊ\üÂÎvÈ¥»SnaÇùÌ‘´ç}â 7qº|Ì' £f¯šøòïÝÝ+Ôö¾1¬WÛ¨*Ãä0™ŽgqÓž1¾Ñë›I,²s¢ê{í"uàμhs9U$*/ø˜;b/³løWS¸®f¾áÔÇïáì /.ä®±©>bó&T4ÌÆ9¬_žƒh0Ÿëöm6w“›Íex;Cè* †ª#Hî3[SÇüšÏgO./¢Ç±»2“ží]*-Q>¿¿ÿj†'+Üï¯Ôb¬}¼ÒÅp2Ê3Rgpa[é·¹*~Éò]˜vw%·*¿ðybÃLsìÕ_/®ó¤Ç¹4*¯Ž ̬¥|í2‘üÖQY½vdFEQ÷ÂN9ô×Ù¨2jÌ 3v2IÀÆF²Vb× ƒÚ³±Ÿ•cuù|ÅF×¥iÉij:äDŶÆ+6ÚÅ‹„õ—ûN|6íùÛB.ÄjS`J¦šDcçÃñdŽK{î€,kÉÐ?Üah/<@1p7=Å;éáïĸ‰uò­!&¶õA9¬ë¯£Pˆ67šVúF¥ˆðÁp÷#SùÅ,àY…Ž™:u³Q+ñ6Ïz r ]¢ÙJËÅ*V¯dZw”]µ?>?ì>ë4 :!TgLbÉÈá.ü¿»Ú\¯¶û$:Æص ÷9uçâ­Ç/cÇÕÞÈ'!y=÷ñÏÛŔǖKpp-£W­^±³?Ÿ~úC¹:ûþÆtzÑC]ß(ÊÜj¹äÕø–[ DÑÉÃÃ&€Õ yðÂëÑpe?|–†“…Ð|ñοœñ&m`¸¦ÏtüdY†öi®NEfä2Ó*zxÐužÎ úD×…ç®¶lgÅžø³ˆ’íÈ áØ±a/Bñ*ÐGÂëçÌ>`’æ¯g‡Ä‡ë'ÚŠ!ù]Öñ¾w§ó³\TÙ勹„žmiÑ|2t$q%={¡®“¿U/šQݲº„eø>$·ázñ¡5Øô^n ]t ÏÌçÊ(XÏ*}:è3@ƒð–HWgÈ‚¤I")A®û¬–Da”œ9±ß–d¥â5 L ü@ª#ò/çu ݾ{p•,§½pÙ'‚ƒ‚r;âÅï/ù±²ÏazªÃ}0ç»Mˆ¨bÎ5 {uyÆþ²Ü€âK«ëmí¯Ýë>øÝq Òž"Á®Yæ‹wŽijO~Xù `2oñ ìût0þóOÌ›$÷1J·œgã¦êØuk™•ÛB|Y œÇˆ¿pžó ú¡ÆÍb”™ÑºW{ÅÖ{óÓ|dQ1Ý» ¦ÍÈÈ&æúu H{ꤛ—³gÕÝNœ_ŒiŒ»ØBuŽU*ÉñÂí‡÷^ê²}6Y"S˜•~Á|q‚‰º¬—¢Æ_a }´DÒoÿÙÅÐ[?í­7®?”_èŸzügÌÑœí‚×C†4”ÊtÈU7­ q2\¹˜³‘_tÿlïû¡U— ägÛñŒjoª{4ìp²j’ž8(®9zDåå·ƒ(ž ý_†SÞ¦6¯*íòsmÑf×j-’ò Ph=œKöeŒçoOó5*ìôË»š`/ì0å3ü$ÿ)zk"]Œ/5dãŸz”’Έ¶0ö 9”ô ïº ã4Ði¹ã“i/Jæ’ÅÛF®)ýîhë¸ÚYü²oê§büŒ© 5õòÙº&3„·æßpùx¦ŒÚz¨Îm-ÇðtÔ«ÖŸë¶š”Ì%ûVšÏWùò@ÓJFI3Žv÷ǃ¸*§Ï=I3.o§+óZ}–É Ê]ùÏ?=>Z*MM;é´§¸ ð ¾0AÏ 8LÅï4ÄF‹K%ÓCÂ* :>¾ý(É/MöEÑžQ1€¹¶W9¡zuGE²£Õ¨¶ãRü—ú«×½o„®®A—}òì›­jöª —P_@!MŸ—¦c^N=ØÁU¼êÿþ‡Nn³+fÉ?F¢¹Îòùa7íñÆHÛg|ù÷üÛ¼œå_™Åð ?<¨a¸áçŒeå:+ƒÃà!ÿøö£ü²º)¹¶C”8Žê-yù̘€djãÛÃïKÂPÃUíO}k¦·ýÉÎk® æ‹P»*ª¥6!qÏUß¼Å.Y±Úï+(ÝéŠÛdÖñ™ƒ*š ögB]›ÁçJO”±ï~ ô¥7 |9 jÏ„’ªÉŒÅ׎Qæ54½áÚ.]}ùöEqžÌsHNr˜ŒÃ3.÷`s/“â§Ü"jë+WëøÚ²ÃmÚì’šom“|vz¸ôm2ëøŒ ˜œm2,×WÒÆw/¡üf)uíÅÓOŒ÷^zɧemå7Òç©/yŸÐŠØ›>]êu„ê§&"tºAmOÝÕ2×@ØÌ0KÏ®i×x—¬ÛÙœ“sÌî(¥õ e0þúôø¯Ç'ï>cÈ©ç2ÞªÚ´ôNÜσn’,¶K¤±€¬önw­YàØG ¾þx8Ï;Œ ‘}ãùÃV~yY\~JæÛíÄñèbˆì+_zy%Mâû—qNkZûçu6¬·zÉM(¿1ÕË>õâéÛ“p-É6ÍÊ ¥:ÊS̬´™"9·¬¹V¼Š•\ºÃ3ù¤&ù½ÿ’æóÔ_öÏy§ÓËÖ·VS܇,þ©—ý#BŸÂ[g–í¢u_%¦þUñ+X[VÃxÑ“‘ÒÔÅL—ÍÄoîFJ‰èiÙg kìNŽáÎ¥á»Ó9ó?¥Q­k(à%}öè;•¢¾ÝÜw»ö”Ì"3·Û;Y #Jí…5_C"oãèph´*JšfÊÝ¢ü"ªXE5!dgrÞ‹õ…^^wé3Ýbçøߟô²vñ\®+?Ó#wžÏ¦'ûxsdd{í>oþ{È)l•9ôÄÞ‹–Q¦z™Þ¹ž”†9«¢tu åN´êbÌ ,ù’›ó >›ó†´§œ^Æ`߯íÈ-ZW'+?ó‡»Ð—̵8ŸžíÒ3Qwßå¥Ôµ‘ë·“º:gc5²Æ“Š£Ñ…àéôÒ_Jgš~΄²/!H['Ì7ÌÓøÖÃùÕÑKlò£½‘zk$ÿåòûZ¹›½3ys)z°ÉÏ+ø‚ßlîrõ@x¸J–¨×/ß¾È?CLdÖg&?ýO²S×ÐÕ L©ÏI9OÝšóé¹ÝàÎZ"\ÄèÙCB†j¨ŽýקǧÇ'"Î%ÆÕ™œÇFŽÄ‹qiS"¨Ò*2[œˆu"Ûï÷ýý×êõ6!-”–N1\·{´}&Ç8. ÁüøöQÆaMGøþþ«N~ºñ•ŸÉoÇ ¾¦Âš„£¼u ¾L#¿9=Ï Ô|ÂQ·3YùÙK½{UPešÔâvñäçriz]Æðn(^áEȦÝÜÓ–#>ÒÁ: I§³ KðEqL¸w×è«ËaWËL³”G  #†pâY E-„ù\|“EɃ¸¥WÊnâÞ(ʱÿ þcXpüäd†I”Ɇ“^Òú' >/gçàƒü˜i?ÂPº/@¶wüÔ&oç\ËÐà¿IÈ/kˆìttH¶=»23޳$6}-V‰ú—†ç)‡þöç»yÎÞŠ¶D’ŸÁyÉ«ÙåeÆ8)ç¹¼µzÌ¡N.Wçl³Ëe± ¼XÍÇ ²1‡•GVÁ2• ;OÆB’’`4b”z›„öZ4ÑX;á#¯ßÞ8NTç…õN¶ÝÛ±þ(†‹¢½¼a½ËiãÕvÕMÔ9 sŸ›çë†ày‘ÿùTJ^¤÷¤•cìŒ]UTTü¤ÓÌ)á"?p„sᣊÀŽšÇÃɈuÃóYy2_ˆQÓ®–Éç‹Úž&þr]ª M¿'5$L…é‚2¦÷<'Ãú+¢üÝΠºÙ&ö¼¼8áUU2“=,ÿrMô,®ùÆ·Ùøaìx¡jѶk¹tK•B° Áç’wôöø È%û*¡=]íµ(øÆt£áð´[¾¿ÿ:ž¨ì#Ô?_^5óËòe$!ûP¶ˆ®!¥H "¿ážaÄPhP2ií› F¼Ê¾d{ýøö‘üK°¿Ë³Âcxq"?çâ»}VæsñÜxþ³Ë¡Ù¬6>k0/Ê–å\IÀÛ$ä·ËÌ’JÀ:ñùoU´—6Ö±ýœÉ½Ä?'Y劘oêÔråùÔ}§†+ÕØ^°ßkˆ4Y&-­ÃÌM«ðfï[[꺰aOzR¤ èjf>o$-6¼uò›)ŸÏ½iè°ñ vÞŸ÷pzo•“|ú[—q©òúñ˜÷ ™‰T‚¯yŒÿsIx|ûx/B®À–¨çáûû¯B´ê:š5“a™Z¾ì§"Ïx·U‰È5»^Cß­rÐ^ÓÃ‹Íæîé[ÜcVÉe‡V¿Å:í¨ڭíF´&à•ÊŽâ+c#Ü“Úh«a”[yJ劷u3Bz/¦‡ÕjxÀ|À2ÑØh´z—µìÏæÆøê‚×0DK¸;¤8Ð9L—,óeãÏ\Ïú´M[LHÌÅôR»´7ÛÃ3wÕ!©¡ù 0bå v­W/ñT…Æ\x€'å’Ñ´çŠ-bE Ò™˜ÏÈ·kt5öIªì¬;˜¼|¬þ ÷wEŽ."R!/×̼XIÈWs6Øf~f¼뤽:^Z &+»à˯K ¾©i¯é1k¬[䡊ŒH=cÒl ÁF±ÃÕÙÄs;yK{cÎnt 2e‹i>—Úí°ä¨B"øÆ)ù!Eë“Èj¨ìeV€@Á‡ÐQÄEòDaÌò€YžU<Ø%z¦ÂÀ0P * ç壽4WçHÚ[€ÝóÀ¼ƒú0«‡AI%ˆ"‰™…T,íÁáY’ù“ ñ7ƒ­Á» €wyÚ‹†à3g5ü'? ¶Ö¥z¡Ëb1”,¦ùH Ø„\Xõ2 Z2¨}X¸•Òøþþë )¡ös8þÉ\Wõ2ífò!˜aT@Ìyi¯ÝÎ\]õ2’üñRPxËäE¸:g¡=j†ù\:B é^~tØ´$_Eáy>ø‹cQK½àv€Å×ô(BðµÊ|µ] çAðµO~®ÇržÇµìK±°Éé’.6f!QæPÎ0ÍOÄ‹¤½¥Fc•Ô|Sx8õ%pmÚÓ÷ùà`<ÿÍÀIú)*šŽ¥–Ç%#\2r<”¤4žP1¡ÔÀSdJ+Ñ@ÛšOQQÆ I¨Þ£Aö5aVÐ MÊYÈÜea‘c²bÕ˦Ð^ŠÉt •2¬Gó)A6ÆíéúmމΠ<:ÆÔ@=L+OQÇbášÏ~2’´²‹<æ€ ?€âVºæÓ9#y¾md÷·¾I€I> ‹pÑÝ’L*BÊŸë±E´Í»€ç0~óM.ølÊÉEB̲¿‚ö€âÖ  ÕA±y¾yæäŒ`;€€¹5ŸË±‰‰7`™Ìg°1MÐy@àùlƒù\)w = ¼°¨.P)ó¹fõ*§CLFd´¢¥lþëâ-oúM PÍù<+‘7Ýü×±Œx–)3–-ø*1›e2Ùæù€B˜ÛÛÙ÷ýbü„px€ùÖ…XÙš ôëü ‚¶£!h{ÞŸ¬…ùHÁ(05^¡ €U¡€æƒ° ù`&Ì:i,ŒWI2ÿÒîèŠ Ñv4mêÒ|Þ$ Ëa>;]ßâr´Ô5IDATRаæ”?SmfÈ|°RæƒWsNa¶£íh8ÚÔ¨ùÀ…À™OÒ–kJj­ÙèÇVuòÔúvp!°Íg°ç KÐ|°.Í`>ó˜rá5º !‹’¸–yŠÝ¾˜¶“õȯ–×öÀíÍ5ܸ整=¶9äv,Í×<áIߪÅ.ì}Fßn»ké~ .²íÛ[)–D>ðëi;ßc7¬{ æ[’uÈö¶ z[øþYOÛùí¤e\UÛ—ÑLW‹ì»¼¤gÌ·:0"Æxèõ‡[š›ô…´}Ù÷=a<ĸÜö"i×úÇŽt0ßò•ã YðXi×âÍ« XA]\þy^ÀÓ®ÏS¸ždÈ80ßz… ¡í¦57ÔöÞw×äÐzîû°˜ðaÍ ,ÞûÁ4pñ‚i?÷¹Ô¶/o§cȹ:89GY m¿ àOÔöÖ; m·ÛÒ' QEÔ¥ö}/Å.XšoE‚ÏŽhßÞî«âjcÈþËÐÄ®¶óÛ×Óv#ʱEÊï†iÎRßw0àqŒDm_dÛù—|ádÛ··èØvòÉoÝô»šc ìü¾ç4Ð|æ0€ùÌ`>ó˜À|æ0€ù !ð…ùQŒÀ|°XþónÌK¿Ú*Z0¬T÷aØ­P¾©±ì8#™où¥\š€2àiŒ”€j#ÿ-¬¯ÑШø Tró…ÍMË>žöìí 6€æ€%ËA}‹>/44,û’ú ù`¼h‚ðš–†@—&<ŸÍKP{’ÏVcfš€&ÉÏµÅø l5\h>ó˜À|怚ðÿO!‹ ôÑIEND®B`‚nco-4.5.4/doc/xmp/fgr2.txt000066400000000000000000000000351264355130400152560ustar00rootroot00000000000000Annual Average over Regions. nco-4.5.4/doc/xmp/fgr3.eps000077500000000000000000002703371264355130400152500ustar00rootroot00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%BoundingBox: 20 0 771 613 %%HiResBoundingBox: 20.880001 0.000000 770.040029 612.000023 %....................................... %%Creator: GPL Ghostscript 871 (epswrite) %%CreationDate: 2013/04/07 15:38:35 %%DocumentData: Clean7Bit %%LanguageLevel: 2 %%EndComments %%BeginProlog % This copyright applies to everything between here and the %%EndProlog: % Copyright (C) 2010 Artifex Software, Inc. All rights reserved. %%BeginResource: procset GS_epswrite_2_0_1001 1.001 0 /GS_epswrite_2_0_1001 80 dict dup begin /PageSize 2 array def/setpagesize{ PageSize aload pop 3 index eq exch 4 index eq and{ pop pop pop}{ PageSize dup 1 5 -1 roll put 0 4 -1 roll put dup null eq {false} {dup where} ifelse{ exch get exec} { pop/setpagedevice where { pop 1 dict dup /PageSize PageSize put setpagedevice} { /setpage where{ pop PageSize aload pop pageparams 3 {exch pop} repeat setpage}if}ifelse}ifelse}ifelse} bind def /!{bind def}bind def/#{load def}!/N/counttomark # /rG{3{3 -1 roll 255 div}repeat setrgbcolor}!/G{255 div setgray}!/K{0 G}! /r6{dup 3 -1 roll rG}!/r5{dup 3 1 roll rG}!/r3{dup rG}! /w/setlinewidth #/J/setlinecap # /j/setlinejoin #/M/setmiterlimit #/d/setdash #/i/setflat # /m/moveto #/l/lineto #/c/rcurveto # /p{N 2 idiv{N -2 roll rlineto}repeat}! /P{N 0 gt{N -2 roll moveto p}if}! /h{p closepath}!/H{P closepath}! /lx{0 rlineto}!/ly{0 exch rlineto}!/v{0 0 6 2 roll c}!/y{2 copy c}! /re{4 -2 roll m exch dup lx exch ly neg lx h}! /^{3 index neg 3 index neg}! /f{P fill}!/f*{P eofill}!/s{H stroke}!/S{P stroke}! /q/gsave #/Q/grestore #/rf{re fill}! /Y{P clip newpath}!/Y*{P eoclip newpath}!/rY{re Y}! /|={pop exch 4 1 roll 1 array astore cvx 3 array astore cvx exch 1 index def exec}! /|{exch string readstring |=}! /+{dup type/nametype eq{2 index 7 add -3 bitshift 2 index mul}if}! /@/currentfile #/${+ @ |}! /B{{2 copy string{readstring pop}aload pop 4 array astore cvx 3 1 roll}repeat pop pop true}! /Ix{[1 0 0 1 11 -2 roll exch neg exch neg]exch}! /,{true exch Ix imagemask}!/If{false exch Ix imagemask}!/I{exch Ix image}! /Ic{exch Ix false 3 colorimage}! /F{/Columns counttomark 3 add -2 roll/Rows exch/K -1/BlackIs1 true>> /CCITTFaxDecode filter}!/FX{<‡DӻȈ .‰³Ë˶~è¯Ä_mókÂ0´º—¯èªç9ÜK:£ÌñΫßòE®­†Ä„s¯ö¡"·WësÕôúNÎ3Õo9Ðfbî"¦H΂ÀõËÇ «IjÿÕÙ¨œW‹üÝÁß/ûî’~(¾?„˜Ô³;ˆ7…%_2‚ɳ(ᥧkü#ë-£̸åÈ~Ù¾ñŒ§?w®_ý‰g¯È~èÕß—v R2üI€7F‘yv%>¼Îç{PEv"ën’F?%ëÚWoÁé[6~½…ô˜ºŠl$1ùî¨ÝûUë­¯¸&|dÁ„Œ€Ch‘¤q|‡A‰6*/@ŒžHõÖÎÏsï¢ÍæøêÖ k•'¾®bM-ÉÞÿýÊø‰$G& # Ç¨±°;Ø©®ï}bBª– eÜ&¨EFá½×wø¹>íÄFÌéKÄ'áµ L¯fwjññðMx à [ñb7f;]:¨"; &ã.j½¶Š¿ZõãQˆ\ R> x# ·Iÿm=ØJZ¤0²(ùéŠóÖ‡š®ÞüfËŸÝæ)áSÖóta»P‘¡”[É©˜Üh˜Ù7ûê:lJ›&5¦µšÎyHkŸ»f¦~3Þ«}zɯ·xF‘†Áiв½Ij¯Û³èö lå¥otå æé0ĸ¼$Ï£+’V4ÞyׯÕÏfoqÙt|Ù®Afˆì쟮• ¤âÍîú½Ž\_­!6žtsúcksÕnl”méɰ7¬í>Ĥ»¶Wö÷i3›/jí#R9œìÐìÌ%ïWWD¸ÉµÞ ðFàœ(:­î«8æÄv@öõ+ ¤yäµ™@ZÆn5ÐöžïWÆ{·÷1=ZC¼TMóFìâ=_ÍW+¹žï:ë78Ï6ríJ»IU4ý¹Mn'ð£[Ucü&ì‘ÅFClkc`Æf'`Ô÷«ÛëI?€7 ¨ï€Á¨##è­éûPüô­a¥л@òûU¸jë–¡x#`N‚ þéô¾bvó¢è¤©hÈo #È@F #È@F2È@F2È@F@:˲PªˆVÍ#£Šèˆ¼*´jà©2È@F2€Œ@F2€Œd2z±œN§}”]ìP¢F”>ŰŰ mîó½È"¼ÝÌn$ÄF2€Œd2€ŒdгX’°`[³K2lÈ4»‘0©ÈèKÔ¤†œPXk`#o€C±î%¾€ŒHÓ§ÓIù!Pȱ,K’&`FñSèn†xõ€Càè2" Zj.ød^àPlœÅ¯FÍÊ|!Nߨhe‹mÁÆ2"Þ1šàX^!2Û²<íl±MÍI \ ·ƒoc‰ ” Àô,«DÏa×úά¥QƉ½PÓyó[Ù×ξ“Ñ6Pݼ>¯þó ´TR`Gcî¢& )°pHø¢“ÜN¡7BoêŠ#y#0MõÀôCСzÅͼ§ÓIJ‡cîÎ¥ÁæºÒ.@F‘šª"çÅÑpØ‘ÕL‰Ò!~7 1ˆ7Âùì7l#”§¢A[ÀÄNˆ1»»c#H95`ë쯬Ã"&~¿¡sžÉ!ñœ'½;³½;xa²µEƽ³r6·óuAË^Ü C-ø“󻳯¯FVß´ZàW°¡t¨Ç6 yÑ6ûÒX UÔó»3!ÄæfÛÐ#(‰m_׌7 µË¡–Wu@›‹7¢hÜ?ˆÙÖ‹1·’¨%/PÐZ:ìæîæóF .# ;ÝÔlKŸ‡ÐÜêˆ:¨‘Ç7b;‡M¼¶@RÀ¡t2b?„a¼#m¼ÏðÇœf´¿žT<ßÁº5BĆšÑ@RÀ†Òa´ q±ù‚O°=IÈÆd+‰øïÚ_Œ¹TÀºgHãRúÅ7÷ŽèÁzÒ°Õ~I08È^)V·mB¼N ãÈn«öx“"­–ÇÐÂÙ”¼ïö¯«˜ ]x)fÕÆ‚ó g+´UÌ+2bEÙa¥F^ Fª{£zùS¤‘“¹"¶Ò Îs(%ŒØÌl‹Áæ·FÓ4ö+T(A ï.ã‘!)fÕ}^^g·6™Œ 6"“§µn._ŠÓ(%9¿=»¹|)„xsûÅYW¾ÀŽuÐ%€YžóÛ„÷vuâCDOŒ¯!ºybÌÄ4áx#fà~¹B¼:}VlU’·ËßGŸÞ¾™%žŒ›Ë—²Zî— Ÿ²Ù×("_Ï©çò¼§c†X2©±±åÞ¶-ÌvayÞ‰Ovµ¼]>4-OaLÆV’‚”šDù9t‰¿ >›ßÒ.†þƒˆ §y6ä…,§^Tu$€~áƒWvµÜ/B\¹®ÿºq¦^ÕúññòiçñøbŸßývùçcˆBˆßÄã?ÿ¹ýË×A$Ž_]AŠ’h¤!Dný˜>!;¤}̉ §Ù%v×ÑÉPÛgPÃvT¼WïÄ'û»×âJ)¬®ÅU¸xòúµNS¥2jÒyY:Æ<óíòáŸÛ¿d`„<(ûˆß.ÿ”…ñ*J¼Ž1±™öR4(ÝŒjuôoL›†½˜Sn5@ˆå6£ÝŒ]ÿj×µ‚N Yß+§PöØ>óñüÇãnýἋx›}íŸdQ¥rJ.[ÈÓÞ.œå—òÈn._¾¹ýòbywöõõÃýrqý£noÄË7·_œ=K¶û126%P×ak#!8'à98ÚFEȈq¹WÊŠVß¶£ö™¯NŸWít¤Õÿûô^ˆ÷1†_^ó:Ú cÇFÜ/êîjEHtz‰T™¯ÅÕ××ïÏo½š@ù*„÷âB!n½C–Ôn%,) ·-@@8„p¥Óu~ä“-pŽ*‘Çyƒiû:ŸÞ¿³å1n’€Ô%§‰§ FÔ×–"þwc*g•·Ë‡¯§%8Þ­I.µ²#Lj\…/‡@¶†p¾;a‡â&n†ûåÂbM $#­©2–«ÆÕ8AÎH[x¿|Zut@)§ë'”VQÌ9aÁñC1\é²Ï³i”Qœöô‡¯ÿ tOJ4œßý÷ûJ ¢"À†ss(dD§Ö ›½øA|‰·œÖ¹É*Óð¯kÑæ$Ž’ò„˜j”ÝÐýr±:÷ØõõõÃùG”@C1Bž9±ëP]‰ýË dDŽÍ¾_.Þiÿl!bô?–9§ß"à ‡ÄA¯NŸ›µêG¤h~ˆE!~EI¤hˆÀ;â” ý5„³ÇУڕtx»ˆWx#Ž©$ýïˆÀ2Ý·O¾ú4ž¸/¨B-ý4’_?>z)Î?þ\B†O \@ØNˆ"5jÒšH½Úû3BFT³I0²û¡–sÂî Âëb”°Pù*Ä=Gôîïæòå›[”€W@$i§ž¨î`(9ÒÐO3S†G~ `E)&¹|Œ„¡Î‘ŠÚÕÝîìV³^ 2 ¾¸¢Á7–°sÇŒ<åÇæsâUÌ+ɰ¢TE䫾ÚUÝ/7âɨ²ï“c™ Ÿ !â=__?8]†?ÀŸ!5ôÓ_ ¸®GsK”$ÃQF8‹Ž¶€nf:R¾ÎBO¬){À7·_ÄÝ™âôí%‘;‹á FH“ORØÇÃ&?)È}Øh6’a´N=QØÈ^éf¹JÂX;z~w†’D€ø´o¹‰°bÈaÑ0ÂäE«ÇGl@ zÇ¡»+2º½ÿÒ»9•ÛŠ8 8¬†ˆ\Ì^Ùô⋵LwÞ  <öŒ(U"= Ó—=S…JØ=,JŽ, "Ý…6{ÕÍP8„˜Ò¼2©ƒs"^OÄìåqNœF@TQÉÆŠ µ"¬’:„=x#Z¹%²{£´_Ⓚà ˆpjy{YµÚlȘ=¼öçz²g+Ž£˜ÔQL”÷Aúz6f7`> ¹˜3^‚+®âÕG×Ád‘÷. #FÔUæPõAJâ„GBĤy0œ l<ÔÔ¼Pß.£áÍø®ê(¿ž~ö¡ìàÓ ƒ@JÊUõà|³&^u¹!d±èí«K £ßÔC%ä¶^RL $`XÝ Zfü,†ÐÖpFªm“Ìq×RîÈ!a$‹%À(Ήԭ¿K9|ý5À8";”‘ Âù¬.¾@@Ô2»;öFL)&Œ./ì_5úJÙ·þXʾ0´’ÈÓ"P©b'¯=‹«²s¿'Nˆ%@O|+ÊRgmÏï~†J $`Ârƒ:CFËy=b$G6¯l³šnhjæ‘0Œð ›Ý¢/«J†•Ië9íÜ‚ ‡Èˆg…¿­‡,¾PËQÖªó•A—Î ÀVâôÍ!ahŒ~ðy äTø8TŽÀgP×W¡:VÕáJ7ï××jùk7`âáÍåK½…+Ýð ßþd¶Õ7æ2ZOm Pà8._§éK¼Cf*ÇáTRòJÝðæö‹Îä’ˆ†Þo«Ø©ô¯7UÈ8”ÂHU²›–n ”l%#þýnÆHêSaõ€†8–Œp*d@]_…³Ku* c+/”ôÔ|÷úØþ¹ýËx &“ägº*;NÂÙ³£$ §â¿¼?}{Ì%ÿ¿\HÅðÛåŸ?šî{!Äõ!wÑœ˜š2ât:¥.Ö`q€SLÄ+ ‰ÊOž° RCÜ\¾¼âVJá'é0¸C"ÞЛ߭8©!\o’I 8&©Û„./~î¾’€®ˆ?¾øçö¯¯¯Èô°S AlÀä"ÜKÏ„q©;*i)#Øû°2â502FÂìÀ™¾Ý¼ÈLMÑ—têíV®„™UHõŸä¨Nx«@¡·åЦ3äïħ7·_”ëKÆI\‹+¼x#¢Ä„ X —OÂV¯NŸë5¾¾~â×gÆ` PCüñýƒ¾ÎóÍí©î— ¹RÃÙ&o„[C(Ú9 ðFˆ¸P »ÓW[o'uaª†ù¼¥¶ÙPȀ͕„½Û2—ÐH@ȹ šÖ‘eD餯é)<€ÖÄP³‚ˆK¨¤!Þ‰OïÄ'%UÑÇU!{±ýx#{LÐ¥. ~ýxF¿y2⿼ÿ÷û¡óè€m'5ƒtîñJ‚P ÈhZúþ[¯NŸÕL­èà2âÙ˜·dÓXíôu·³>XT’ÂXöÉò ˆiKâ©+K×0’È6»x#¦8n‰pJ †’hH’wâ“âÿ~ù¬+QÚÞdÀÑ•„_*…´ Ú. l ASAF #a ”˜°—€êJ•¹ƒ¨LZŽl6JCr¡"#\°§À<ø’]Ê4—vh½*±¼__?0ó}ä&ä[Q,·§mÞ€ .c’L†Ÿ-ägÇût拈9u@™y}N L9¦Ô †o-¨òO¨­7þûýaÁw} ac4 #Sœ0©pËá4Òl|}ý Ã#ô}¼0‡Õ6º¬¤a€“²¾ K¹}—’Œ#ˆðr{!L«X©I&Äž_^<ÐÇQ‡Â5!-ŒÀ–¸ ÉòBüûýÑ–ÈÕ}8$f}ôŒéµýŠ..i ȈÝÈ_Nd@ ‹âÛóoöÞ´|ÄÎÍÛD\^24ÄAdD‰ÍÅpt%a˜ç?¬È°QçïÓû€ï!IC #ðFD‚O€caXšûåâÕé³2*÷ËÅ釒fÇ|޶¶,ÄðÐ =à€´q­â¿¼ÄIŒúÔŒÔ «"CwBØùL Á|Þ¼<ºÕÝ×âJ©òïH†DÈ–X!GˆôSðh®Å•=N•»l`Qv!óÇ£Útª’ÀOÄÄ;ÿ§ RyFÙÂ7¡8}çwÔ1 # q«Œ“šÎø÷û…L#¡ÇZ Â-§Î1D¤¸ ’ÒÊÒ(Ó‚ß»¿€H]…q¿\Èÿ§ÙYC˜Ã‚$ðFÀ%¡›«Ó·ŸfæÑ ÝRO½„ý˜|ªÂÞ3%ž_?žßá„dT§oÿß/Ÿÿý~™ÙV@8ñ¥–²QQ-ë˜AFøs@ ÑH‰¨ÿóï®ÅÕ+í—µÝ*¾=2Ðav#“IŒ(#œEG[lk¢ô!ò;ñI™(".«»ô'ŸÐ:IC8á9vø€Æ/à ñÇwÓiñÏí_˜Ÿº"^ØÉ,æ>Ió@í +y»Ù(ú( !ÜbQK@DʈZBNgðø$ÀæÈUr£ ]LÜ\¾¼.tD†€“ô‰€:*oľ†Ow€TqâG’ <y"U=øÜ†—"ðu Á#Ã7z §‘PÆï~ù¤Žüvùç[ñ¡pH}(*ÖU¼†ÐACÞèû2ZÑy÷Ë…žò²ºœÉýP^-å®Ad%Ô3¯È(•ʶ!&¢°Bt• k;{: #`8%¡ŒYÉR ˆìzPîC($-Ð0B"PP˼EzBWÒ˜ý}z~wöÛåŸx j '©«cXš- 6$cÄZ:‘É©t1!ëôž‰*³¶€(YRk<,\cvI† =”„á0ÐÓfJL " Ðmvc±PhŸœ2BnÜusùRYÁýÆL„w/k´ £\@Ä<&B,`P%aÈ=`¾]Ü™0Z܈/š²äV MÍëóÈßqs Xz€Ãê Ÿ’n q+n._Þ/Ÿ>6xÓ5„±z³bZñÕø€rÖeD (x€ƒk©xsûE* !„-&z¿EÝ0ª‡AØàŠ€ÍdĪDP'H„ü'S‡U>‡Ä×׉§ôÕé³[öLäE#} ê,R‰¬ /æÄóx#Vz¢át:áœ'JI¼:}VæS%^´qê4‡oŠaUyDžæüb¡¬QUÑbsT¥!þûýÈJh+XW†×!õ`µ‚âç¹+IYXPËð'&‚k1!–Ù;s¶ÞW]¹˜Ë€Öæ•,–PYO„•ÄùÝ™ ·Ô«2«å£|§Ï`ÕÞ·Žºh=…a<‚_?Ò¡5eó‡%)ÖRñæöË××>ãêó%(coõ«èƒeÓ!ŽÒÒ¸"`Ÿ2"§Å#;¦S«‰Hƒj(€¦!–-„HgÐÁÛÓÏE½Üš þ·sà\¸ñÔè^íý·RÆV íl± ±P¯3ŠsH¬:Û·r<´ ›BNgü÷;Е̕•ڒ• GH¬Ž‰ú ^·¾z 掼ËÌê ØÄ¼–Êñ4ý”h–°;%/# %aàÁ•D·•œhͼ>«RÀvB¬®Ý°mžá„Pÿ‰¾k&ó4Ä&êáü•°!ù±Îå8 àÉ0cmÕ†/â2Ò`KÙá› i§œ¿ÒCFBȈ_?žáŠ€ ÞñrÃßz:Cý `_ÂpNÄl[øpžùõx«oL©l>…!5Ä×ת’Ѱ•y­°Rë% Ý4 !nÄKÛH·ˆðéõCN!2ÂÜŠÔçwg*[å¿?œ£$` Xð MHÍk©xsûåÆý‡5ÄêC†í7¾2Zd†>$EœßÑè`‹qÂ^| LjìÔ¡TE¼i4òdw›;ðM^85ʶ‹GT]ýи"`ó:¢mö­û@FìWF$) iõ¿·Å©úË]f©dSRC¹¶²¹x#` ‡„n2•˜Ø\IØŠ¡³†0³¨T•r.Y?ñ1(“{#WFZªA”„þÏ­üÊá>"#Œ8¸ŒPËFSñ%¦Ì^I м>£ 5ñy-uépäó¥ä"a% §BðF@W8qË.=ÊRæoô Éì)Ñ ¨¡äFSªcqŠO0¡!` ‚7ú½Èéi$tSjÓ爙𹲫 ›yEF@ׇ(â×"ONºÔø xw·ÓGFT±¾sȦ3`XóJ2lè¤&S?>yõRßýÙ {®–}È{wnb·zÂd¨ ÙÕ“Là–ˆ)?†ëáñF@7 aÜ;?Múg†?#Fø¤Ìjƒ4î=P¾ævHÔõI(‰Ôe¾Ušñ÷ÕJ˜Û!ÑÍX:Mx#1Q>…aÔÀÐ=< >AwEøB,³Wj8¢sݦîQpf•ç]°›G­VáDy÷nÜø1e„1ìîi/Ûå­ªre¦3`Gæotj¦"bA£½–Ò™YÁþtupïüªÊ½ûnÜy³ÐÁ9¡›üêa˜åoÞˆýy#|•ä놑±šÝ!i‘pÀ¢G¦±ÊË@åü•’åÚ8$ñ"Tœa…'ìμ"#`ŸDáÉûòü¯ÊŽƒ¯þÄvÚ ;Á¶q¤úäÓ€Œ¨Ùç|ˆ€CbC|»‰êJ¢®Œ@CÀmîˆy#N.xÒ0æëçƒÊI{ë·H#‘ª*lõ ÖbTÔû2»LjÀX‰1}vò‰ºKb(ûZWCx#`Zj…éFT_Ddg¡¬5 7F Ä8"‹šwÍø¯ÀÈ6µ…†Ø5Èð¹*¢ÇïÜ6ºy’9Éxç5µ6ȉ¯$¦7·¸"jQcI[aŽgç¦7,b¬u¤ÔÈž±ÏÁ3qd˜Î€y3ɰg•ú?íý }ºÁ—xÇ™-X?í¿Ëÿ—mt‘¾°áÙs<>6"cïoã+1…a#® C;Ÿ¹ECÀL6—dØàðC„5DçÆ`â·ÇWü]šôª¡=}›sjƒ˜Ìì²RV”DIhºoˆÓGZñðp?Æa\-¾¨aÇIda’\ ‡•Sº%pEÀdæ•Øùª,o+Ìß`èå Õ²ª¾[øU4„mnw=šGCÀ„/lÒ¼u8´­i‰7¢¿O¢¢†pÆ¢“m( 5IDAT4¬z#VÓ?8c|—]µëá¢V)ŒÓ#BÃöÙÚ!ømÇ÷…Œ€i¼K8âÌ9† œÓ®CDFl¢$j ÊUóð™X_KÓwX+8³±ë6УåY,ë&*f±\oˆ,̪‡¦LgÀAe„Ó÷ào‰ÆZdìTI !`bñ,cø>HRhÍŽ–ƒ²Âæ&a¥†®Ð 0‚˜Ð­õàWHFä%}bÒ¶µÍ£) ¦3`z–’´?"¸/êçs÷LˆÌ6«3`ïN™!^ì<ÿ%vt}¡ŒHºOdìEI !`G2¢Ä¼>OrBTT4pdµ»™Ø‚KÄ-ã$³Ó‘ÖZÙoùÇæ& sóLX{rÄhzgÈÖö‘ð «_OR´ìÐ}1ásQtvE !à2"ôBÆíb€Â˜ÐöWê|õù/§N Ÿ°úõHa‘tL $6\Ê O@F<éâmè QÂ)4WOˆù4µ0p@·Ä&ËAqEÞˆG….5pEL& *ö€NY°ª¡¾‘[c !PýLgÀáìExgÅU«ÀŸ³:êð=gSÍÕÖh´@ß~z›ñí± Ç|#ÙxVgÀ.ߎɰOA|gò0 É€Òµ #É»€t€n 4à˜Y.ARohL*g÷‰I»bF~{‹8_îçGu¸%ª\ x# Q¹fŸ`;"·ˆèé–@CÀay>¦2âÁ Õífk §3Àˆ§‰I Q"–»%Z…})‰ŠYªXá 8$²‡g#ʈŒ¨O¨ëèÐFÃy*Õ JgÄ7$Äëc½Ù—;pEÀ^_‡‚n“ØØ@êFjˆ˜œË1mots†`:&蟑u”D’ `u #±€£“w‰†x#|",˜Î€Iš=Þ€*Ä»%ÐïÞŸJX•ÈØ}kÇPŸnè³7ÀžTÞhúÔÄÞVWF¶4Ž¥ ?u<à‡€);j¼PŸûåâ~¹8¦îpj²U8ºÍ‡S쥴¹€B¼:}6þÎ~”»xp‘[ÞÇlðv”/Bò`ÊáSdÿƤ˜Â ΃٭ÓH:8hǾ-=WúʃŒ€$%Œ€™dDIWöœ„ô¯±©·¾•†/¡µï ï»MÃS5‡`úã( ¼3;VÏQýdçÁðŒ3u¿…nÚ…k 5÷aoŠ!üûkÄx5Â×´¯? CˆåÑ\öÚ dàÀ]Æp?¨áЧz 7ƒ:Íáï&yM W«ÚoÞÜõc#ìá¾Ï*‡Ý«RÀéílûãðoàÀ™Â¢O;ŽT¶¥¯¸€PÀiºAÿg‰†pÆF¡”"16B¸âl«¸f’7"|k´I8¸7mŸšo|˜€Xõ$}€Œ@FL"&âÃDtþ†ð’ @F #†3¯ÏǼ%ž+À†f7R[Œ(#"×ò@#³ ;|2€Œd2€Œd ’a’a@M³ “€Œd #`fžï¨¬DYŒešKâ3]qËpU7Z‘¨"ÊCQE”gE*I @F2€Œ@F2€Œd2€Œ€I`‡OÈo #È@F #È@F2È@FÀ$<§ Â,Ë"„ØdTùÓ>"‹T±üzyœT'l¸mìVeˆ¯œ­Ê6æ^¾©ek}/›·aû­ðÁm[ÈÀ3Úäñ:êƒl 7fÓ|1" U¸wøug|Ç«ÿPa!»•a_-ê·‰7bìBÒb¶õª8È(„‡Øú}êµrzÔÔÁþ56Ú‹fæ8]"Þ@4P]0¨)²­õPBþ½a!G~³Æyvx#v`bFfs“tq7þiãÓ’RéÓ¢òoc°²úhÔ¼{·ÖÀ³sT)˜}eã²1m¸Q‹Z-[øxIýØí'£lv{nÌ‘ôNœys~ÅYiηۘyìÿŠÙUQ« Uy|b'ñ1x#æQÄ%sœŠQeµsV)^ÌE²ÏÙ¼Oü±–ÔOɄªͶ1«#þÕªõtVëÖ)íZHÌXó†õÜ£ëoDæx%uŒÛÚß`üœ-ó«{Øœ?±¹·&æ:«UÑzìS9veöï_ÂÊ.yϹêºõÓÂÂU‘øúL}åå $«]¥QÈ*eðù#ë*ЄUΪûjµÞðFˆÎÜ׹ǟ°íÝ•_Ð79v¶xL¾köÔIMh4I uU8'’wß:açP5é•ߪ’[¿k£¾nM(µZ¡'x#æ6;gëß|¡Ú85–÷CºØ¯õÞ¦ŽÂ×ÐÕ9¦÷µðñ٣Þýx`Z² `öÓHµ'×cªb“ˆ¨q¥x#ztÓ„ÝÖm Œ¥ZרÈO$£‘Qu#'³—0©z®Ý–Qv|«ë…Z/(JÚà£ÛK8ZhUÏK»6\1¶¼lÕƒs+¾ŒÙa:#«Ûµ´{å>³˜õÞ›¯3ê¬ôùÊÀðfuõß.¦ZðFä#WǸ¸ÃЪdйº"óP5ªœpº_§\î2Yܬþޤî°U·l-Ùá{µ2‚L­„r1•œTiF»¹G'ÜULsW2ˆ©@ç ¤ŸÚá¥S>Ëìµ^îe“÷ÁË9B“h´â7»ÕPÿy…÷åi¨^†*¯J=²é®‘Ê;ò)Ò>FÝDƒÃAŠq¦bw®1ö†Ú-Êæk‘9Ý ÛUä­­nêMÞ&5`÷Œ`jÍFÕºåÈõAM+¼çÐàÉÁŽê‡§GƒØ†ÚÔO«bðì`~AO+€<ðF2€Œd2jñÿFòÐá0,`IEND®B`‚nco-4.5.4/doc/xmp/fgr3.txt000066400000000000000000000000171264355130400152570ustar00rootroot00000000000000Monthly Cycle. nco-4.5.4/doc/xmp/glb_avg.sh000077500000000000000000000047541264355130400156310ustar00rootroot00000000000000#!/bin/bash #=========================================================================== # After cmb_fl.sh # Example: Long-term average of each model globally # # Input files like: # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_185001-200512.nc # # Output files like: # /data/cmip5/output/snc/snc_LImon_all-mdl_historical_all-nsm_clm.nc # # Online: # http://nco.sourceforge.net/nco.html#Global-Distribution-of-Long_002dterm-Average # # Execute this script: bash glb_avg.sh #=========================================================================== #--------------------------------------------------------------------------- # Parameters drc_in='/home/wenshanw/data/cmip5/' # Directory of input files drc_out='/home/wenshanw/data/cmip5/output/' # Directory of output files var=( 'snc' 'snd' ) # Variables rlm='LImon' # Realm xpt=( 'historical' ) # Experiment ( could be more ) fld_out=( 'snc/' 'snd/' ) # Folders of output files #--------------------------------------------------------------------------- for var_id in {0..1}; do # Loop over two variables # Names of all models # (ls [get file names]; cut [get the part for model names]; # sort; uniq [remove duplicates]; awk [print]) mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | \ cut -d '_' -f 3 | sort | uniq -c | awk '{print $2}' ) # Number of models (echo [print contents]; wc [count]) mdl_num=$( echo ${mdl_set} | wc -w ) for mdl in ${mdl_set}; do # Loop over models # Average all the ensemble members of each model # Use nces file ensembles mode: --nsm_fl nces --nsm_fl -O -4 -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9" \ ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}\ _all-nsm_195601-200512.nc # Average along time ncra -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}\ _all-nsm_195601-200512.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc echo Model ${mdl} done! done # Remove temporary files rm ${drc_out}${fld_out[var_id]}${var[var_id]}*historical*.nc # Store models as groups in the output file ncecat -O --gag ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ all-mdl_${xpt[0]}_all-nsm_clm.nc echo Var ${var[var_id]} done! done nco-4.5.4/doc/xmp/grp.sh000066400000000000000000000102021264355130400147760ustar00rootroot00000000000000#!/bin/bash # #============================================================ # Process netCDF-4 files with nested groups # - Create groups # - Input files as top level groups # - And/Or append variables or groups from other files # - Hyperslab # - Spatial average # - Time average # - Anomaly #============================================================ #- Directory of input files drc_in='/media/grele_data/wenshan/cesm/historical-exp/nco_grp/' #------------------------------------------------------------ # Create groups #------------------------------------------------------------ # Input files as top level groups; group name = file name # - The input files are: # CCSM4_his.nc # CESM1-BGC_esmHis.nc # CESM1-BGC_his.nc # CESM1-CAM5_his.nc # CESM1-FASTCHEM_his.nc # CESM1-WACCM_his.nc # - One file looks like: # dimensions: # lat = 192 # lon = 288 # time = 192 // unlimited # variables: # double lat ( lat ) # units : degrees_north # axis : Y # long_name : latitude # double lon ( lon ) # units : degrees_east # axis : X # long_name : longitude # float snc ( time, lat, lon ) # long_name : Snow Area Cover # units : % # _FillValue : 1e+20 # ... #------------------------------------------------------------ ncecat --gag ${drc_in}C*.nc ${drc_in}snc_LImon_r1i1p1_199001-200512.nc # Same for snow depth data (ie, snd) # Pay attention to the files you list using *; here I changed the files manually ncecat --gag ${drc_in}C*.nc ${drc_in}snd_LImon_r1i1p1_199001-200512.nc # Append variables # - Append variable snc in each group in file snc_LImon_r1i1p1_199001-200512.nc # to the coresponding group in file snd_LImon_r1i1p1_199001-200512.nc sfx='_LImon_r1i1p1_199001-200512' ncks -A -v snc ${drc_in}snc${sfx}.nc ${drc_in}snd${sfx}.nc # - Rename output file mv ${drc_in}snd${sfx}.nc ${drc_in}snow${sfx}.nc # Append groups # - Multiple group levels # - Input files as top level ncecat --gag ${drc_in}r?i1p1.nc ${drc_in} \ snc_LImon_CCSM4_historical_all-nsm_199001-200512.nc # - /r?i1p1 --> /CCSM4_his/r?i1p1 ncks -G CCSM4_his -O \ ${drc_in}snc_LImon_CCSM4_historical_all-nsm_199001-200512.nc \ ${drc_in}snc_LImon_CCSM4_historical_all-nsm_199001-200512.nc # - Append group ncks -A -g CCSM4_his \ ${drc_in}snc_LImon_CCSM4_historical_all-nsm_199001-200512.nc \ ${drc_in}snc_LImon_CESM1-CAM5_historical_all-nsm_199001-200512.nc # Rename output file mv ${drc_in}snc_LImon_CESM1-CAM5_historical_all-nsm_199001-200512.nc \ ${drc_in}snc_LImon_all-mdl_historical_all-nsm_199001-200512.nc #------------------------------------------------------------ # Hyperslab #------------------------------------------------------------ # Greenland ncks -O -d lat,60.0,75.0 -d lon,300.0,340.0 ${drc_in}snow${sfx}.nc \ ${drc_in}snow${sfx}_GrIS.nc #------------------------------------------------------------ # Spatial Average #------------------------------------------------------------ ncwa -O -a lat,lon ${drc_in}snow${sfx}_GrIS.nc \ ${drc_in}snow${sfx}_GrIS-avg.nc #------------------------------------------------------------ # Hyperslab and spatial average in one step #------------------------------------------------------------ ncwa -O -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon \ ${drc_in}snow${sfx}.nc ${drc_in}${sfx}_GrIS-avg.nc #------------------------------------------------------------ # Time Average (eg, monthly) #------------------------------------------------------------ for moy in {1..12}; do # Loop over months mm=$( printf "%02d" ${moy} ) # Change to 2-digit format ncwa -O -d time,"1990-${mm}-01 00:00:0.0","2005-${mm}-21 23:59:9.9",12 \ -a time ${drc_in}snow${sfx}_GrIS.nc ${drc_in}snow${sfx}_GrIS_${mm}.nc done ncecat -O -u mon ${drc_in}snow${sfx}_GrIS_??.nc \ ${drc_in}snow${sfx}_GrIS_mon-avg.nc #------------------------------------------------------------ # Anomaly #------------------------------------------------------------ ncbo -O --op_typ=- ${drc_in}snow${sfx}_GrIS.nc ${drc_in}snow${sfx}_GrIS-avg.nc \ ${drc_in}snow${sfx}_GrIS-anomaly.nc nco-4.5.4/doc/xmp/gsl_rgr.nco000077500000000000000000000031021264355130400160160ustar00rootroot00000000000000// Linear Regression // Called by ann_avg.sh // Caution: make sure the variable name is // in agreement with the main script (now is 'snd') // Online: http://nco.sourceforge.net/nco.html#Annual-Average-over-Regions // Declare variables *c0[$rgn]=0.; // Intercept *c1[$rgn]=0.; // Slope *sdv[$rgn]=0.; // Standard deviation *covxy[$rgn]=0.; // Covariance *x = double(time); for (*rgn_id=0;rgn_id<$rgn.size;rgn_id++) // Loop over regions { gsl_fit_linear(time,1,snd(:,rgn_id),1,$time.size, \ &tc0, &tc1, &cov00, &cov01,&cov11,&sumsq); // Linear regression function c0(rgn_id) = tc0; // Output results c1(rgn_id) = tc1; covxy(rgn_id) = gsl_stats_covariance(time,1,\ $time.size,double(snd(:,rgn_id)),1,$time.size); // Covariance function sdv(rgn_id) = gsl_stats_sd(snd(:,rgn_id), \ 1, $time.size); // Standard deviation function } // P value------------------------------------------------------------ *time_sdv = gsl_stats_sd(time, 1, $time.size); *r_value = covxy/(time_sdv*sdv); *t_value = r_value/sqrt((1-r_value^2)/($time.size-2)); pval = abs(gsl_cdf_tdist_P(t_value, $time.size-2) - \ gsl_cdf_tdist_P(-t_value, $time.size-2)); //---------------------------------------------------------------- // Write RAM variables to disk //------------------------------------------------------------ // Usually NCO writes the outputs directly to disk // Using RAM variables, declared by *, will shorten running time // Output the final results using ram_write() //------------------------------------------------------------ ram_write(c0); ram_write(c1); nco-4.5.4/doc/xmp/mcc.sh000077500000000000000000000105121264355130400147570ustar00rootroot00000000000000#!/bin/bash #============================================================ # After cmb_fl.sh # Example: Monthly cycle of each model in Greenland # # Input files: # /data/cmip5/snc_LImon_bcc-csm1-1_historical_r1i1p1_185001-200512.nc # # Output files: # /data/cmip5/snc/snc_LImon__all-mdl_historical_all-nsm_GN_mthly-anm.nc # # Online: http://nco.sourceforge.net/nco.html#Monthly-Cycle # # Execute this script: bash mcc.sh #============================================================ #------------------------------------------------------------ # Parameters drc_in='/home/wenshanw/data/cmip5/' # Directory of input files drc_out='/home/wenshanw/data/cmip5/output/' # Directory of output files var=( 'snc' 'snd' ) # Variables rlm='LImon' # Realm xpt=( 'historical' ) # Experiment ( could be more ) fld_out=( 'snc/' 'snd/' ) # Folders of output files #------------------------------------------------------------ for var_id in {0..1}; do # Loop over two variables # names of all models # (ls [get file names]; cut [get the part for model names]; # sort; uniq [remove duplicates]; awk [print]) mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | \ cut -d '_' -f 3 | sort | uniq -c | awk '{print $2}' ) for mdl in ${mdl_set}; do ## Loop over models # Average all the ensemble members of each model ncea -O -4 -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9" \ ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc # Greenland # Geographical weight ncap2 -O -s \ 'gw = cos(lat*3.1415926/180.); \ gw@long_name="geographical weight";gw@units="ratio"' \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN.nc # Anomaly---------------------------------------- for moy in {1..12}; do # Loop over months mm=$( printf "%02d" ${moy} ) # Change to 2-digit format for yr in {1956..2005}; do # Loop over years # If January, calculate the annual average if [ ${moy} -eq 1 ]; then ncra -O -d time,"${yr}-01-01 00:00:0.0","${yr}-12-31 23:59:9.9" \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_all-nsm_GN.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}.nc fi # The specific month ncks -O -d time,"${yr}-${mm}-01 00:00:0.0","${yr}-${mm}-31 23:59:9.9" \ ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_${mdl}_${xpt[0]}_all-nsm_GN.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_\ all-nsm_GN_${yr}${mm}.nc # Subtract the annual average from the monthly data ncbo -O --op_typ=- ${drc_out}${fld_out[var_id]}${var[var_id]}_\ ${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}${mm}.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_\ all-nsm_GN_${yr}.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_\ ${mdl}_${xpt[0]}_all-nsm_GN_${yr}${mm}_anm.nc done # Average over years ncra -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_all-nsm_GN_????${mm}_anm.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_all-nsm_GN_${mm}_anm.nc done #-------------------------------------------------- # Concatenate months together ncrcat -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_\ ${xpt[0]}_all-nsm_GN_??_anm.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc echo Model ${mdl} done! done rm -f ${drc_out}${fld_out[var_id]}${var[var_id]}*historical* # Store models as groups in the output file ncecat -O --gag -v ${var[var_id]} \ ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc \ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_all-mdl_\ ${xpt[0]}_all-nsm_GN_mthly-anm.nc echo Var ${var[var_id]} done! done nco-4.5.4/doc/xmp/mcc_grp.sh000066400000000000000000000024271264355130400156320ustar00rootroot00000000000000#!/bin/bash #============================================================ # Monthly cycle of each ensemble member in Greenland # # Input file from cmb_fl_grpsh # sn_LImon_all-mdl_all-xpt_all-nsm_199001-200512.nc # Online: http://nco.sourceforge.net/nco.html#Monthly-Cycle # # Execute this script in command line: bash mcc_grp.sh #============================================================ # Input and output directory drc='../data/grp/' # Constants pfx='sn_LImon_all-mdl_all-xpt_all-nsm_200001-200512' # Greenland ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon \ ${drc}${pfx}.nc ${drc}${pfx}_grl.nc # Anomaly from annual average of each year for yyyy in {2000..2005}; do # Annual average ncwa -O -d time,"${yyyy}-01-01","${yyyy}-12-31" \ ${drc}${pfx}_grl.nc ${drc}${pfx}_grl_${yyyy}.nc # Anomaly ncbo -O --op_typ=- -d time,"${yyyy}-01-01","${yyyy}-12-31" \ ${drc}${pfx}_grl.nc ${drc}${pfx}_grl_${yyyy}.nc \ ${drc}${pfx}_grl_${yyyy}_anm.nc done # Monthly cycle for moy in {1..12}; do mm=$( printf "%02d" ${moy} ) # Change to 2-digit format ncra -O -d time,"2000-${mm}-01",,12 \ ${drc}${pfx}_grl_????_anm.nc ${drc}${pfx}_grl_${mm}_anm.nc done # Concatenate 12 months together ncrcat -O ${drc}${pfx}_grl_??_anm.nc \ ${drc}${pfx}_grl_mth_anm.nc nco-4.5.4/doc/xmp/pmt_crd.sh000077500000000000000000000024561264355130400156550ustar00rootroot00000000000000#!/bin/bash ##=========================================================================== ## Example for ## - permute coordinates: the grid of MODIS is ## from (-180 degE, 90 degN), the left-up corner, to ## (180 degE, -90 degN), the right-low corner. However, CMIP5 is ## from (0 degE, -90 degN) to (360 degE, 90 degN). The script ## here changes the MODIS grid to CMIP5 grid. ## ## Input files: ## /modis/mcd43c3/cesm-grid/MCD43C3.2000049.regrid.nc ## ## Output files: ## /modis/mcd43c3/cesm-grid/MCD43C3.2000049.regrid.nc ## ## Online: http://nco.sourceforge.net/nco.html#Permute-MODIS-Coordinates ## ## Execute this script: bash pmt_crd.sh ##=========================================================================== ##--------------------------------------------------------------------------- ## Permute coordinates ## - Inverse lat from (90,-90) to (-90,90) ## - Permute lon from (-180,180) to (0,360) for fn in $( ls MCD43C3.*.nc ); do # Loop over files sfx=$( echo ${fn} | cut -d '.' -f 1-3 ) # Part of file names echo ${sfx} ## Lat ncpdq -O -a -lat ${fn} ${fn} # Inverse latitude (NB: there is '-' before 'lat') ## Lon ncks -O --msa -d lon,0.0,180.0 -d lon,-180.0,-1.25 ${fn} ${fn} ## Add new longitude coordinates ncap2 -O -s 'lon=array(0.0,1.25,$lon)' ${fn} ${fn} done nco-4.5.4/doc/xmp/rgr.sh000077500000000000000000000031241264355130400150100ustar00rootroot00000000000000#!/bin/bash # include bi_interp.nco #=========================================================================== # Example for # - regrid (using bi_interp.nco): the spatial resolution of MODIS data # is much finer than those of CMIP5 models. In order to compare # the two, we can regrid MODIS data to comform to CMIP5. # # Input files (Note: the .hdf files downloaded have to be converted to .nc at # the present): # /modis/mcd43c3/MCD43C3.A2000049.005.2006271205532.nc # # Output files: # /modis/mcd43c3/cesm-grid/MCD43C3.2000049.regrid.nc # # Online: http://nco.sourceforge.net/nco.html#Regrid-MODIS-Data # # Execute this script: bash rgr.sh #=========================================================================== var=( 'MCD43C3' ) # Variable fld_in=( 'monthly/' ) # Folder of input files fld_out=( 'cesm-grid/' ) # Folder of output files drc_in='/media/grele_data/wenshan/modis/mcd43c3/' # Directory of input files for fn in $( ls ${drc_in}${fld_in}${var}.*.nc ); do # Loop over files sfx=$( echo $fn | cut -d '/' -f 8 | cut -d '.' -f 2 ) # Part of file names # Regrid ncap2 -O -S bi_interp.nco ${fn} ${drc_in}${fld_out}${var}.${sfx}.regrid.nc # Keep only the new variables ncks -O -v wsa_sw_less,bsa_sw_less ${drc_in}${fld_out}${var}.${sfx}.regrid.nc \ ${drc_in}${fld_out}${var}.${sfx}.regrid.nc # Rename the new variables, dimensions and attributions ncrename -O -d latn,lat -d lonn,lon -v latn,lat -v lonn,lon \ -v wsa_sw_less,wsa_sw -v bsa_sw_less,bsa_sw -a missing_value,_FillValue \ ${drc_in}${fld_out}${var}.${sfx}.regrid.nc echo $sfx done. done nco-4.5.4/doc/xmp_cesm.html000066400000000000000000001756301264355130400155700ustar00rootroot00000000000000

    Pre-ACCESS CMIP5/MODIS analysis scripts

    The fifth phase of the Coupled Model Intercomparison Project (CMIP5) provides a multi-model framework for comparing the mechanisms and responses of climate models from around the world. However, the workload of retrieving a certain climate statistic from all these models, each of which includes several ensemble members, is tremendous. Not only that, it is too often a repetitive process which impedes new research and hypothesis testing. Our NASA ACCESS project is designed to simplify and accelerate this process. To begin, we have documented below a prototypical example of CMIP5 analysis and evaluation using traditional NCO commands on netCDF3-format model and HDF-EOS format observational (NASA MODIS satellite instrument) datasets. These examples complement the NCO User's Guide by detailing in-depth data analysis in a frequently encountered “real world” context. Graphical representations of the results (NCL scripts available upon request) are provided to illustrate physical meaning of the analysis. Over the summer of 2013, we will add scripts which make use of new NCO features that combine all the loops in the analysis into single commands by exploiting NCO's new group aggregation and arithmetic features.

    Sample Scripts

    1. Combine Files
      Sometimes, the data of one ensemble member will be stored in several files to reduce single file size. This script illustrates how to concatenate these files into one, including:
      1. Obtain the number and names (or partial names) of files in directory;
      2. Concatenate files along record dimension (the left-most dimension) using ncrcat.
    2. Global Distribution of Long-term Average (see Fig. 1)
      1. Average the ensemble members of each model using nces;
      2. Average along the record dimension (the left-most) using ncra;
      3. Store the results of one model as a group in the output file using ncecat with the option of –gag;
    3. Annual Average over Regions (see Fig. 2)
      1. Spatial average using ncap2 and ncwa;
      2. Change the order of dimensions using ncpdq;
      3. Annual average using ncra;
      4. Anomaly from long-term average using ncbo;
      5. Standard deviation using ncbo and nces;
      6. Rename variables using ncrename;
      7. Edit attributions using ncatted;
      8. Linear regression using ncap2;
      9. Use ncap2 with commands file (i.e., .nco file);
      10. Move variables around using ncks.
    4. Monthly Cycle (see Fig. 3)
      1. Anomaly from annual-average
    5. Regrid MODIS Data
      1. Regrid using bilinear interpolation;
      2. Rename variables, dimensions and attributions using ncrename.
    6. Add Coordinates to MODIS Data
    7. Permute MODIS Coordinates
      The latitude of MODIS data is from 90oN to -90oN, and the longitude is from -180oE to 180oE. However, CMIP5 is from -90oN to 90oN, and from 0oE to 360oE. So this script illustrates how to change MODIS coordinate to that of CMIP5.


    PIC PIC
     

     
    PIC
     

     

     
    Fig. 1 Global Distribution of Long-term Average. Fig. 2 Annual Average over Regions. Fig. 3 Monthly Cycle.

     

    1 Combine Files

    #!/bin/bash         ## shell type  
    shopt -s extglob ## enable extended globbing  
     
    ##===========================================================================  
    ## Some of the models cut one ensemble member into several files, which include data of different time periods.  
    ## We’d better concatenate them into one at the beginning so that we won’t have to think about which files we need if we want to retrieve a specific time period later.  
    ##  
    ## Method:  
    ## - Make sure ’time’ is the record dimension (i.e., left-most)  
    ## - ncrcat  
    ##===========================================================================  
     
    drc_in=’/home/wenshanw/data/cmip5/’## directory of input files  
     
    var=( ’snc’ ’snd’ ) ## variables  
    rlm=’LImon’## realm  
    xpt=( ’historical’ ) ## experiment ( could be more )  
     
    for var_id in {0..1}; do ## loop over two variables  
      ## names of all the models (ls [get file names]; cut [get the part for model names]; sort; uniq [remove duplicates]; awk [print])  
      mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | cut -d ’_’ -f 3 | sort | uniq -c | awk ’{print $2}’ )  
      ## number of models (echo [print contents]; wc [count])  
      mdl_nbr=$( echo ${mdl_set} | wc -w )  
      echo "=============================="  
      echo "There are" ${mdl_nbr} "models for" ${var[var_id]}.  
     
      for mdl in ${mdl_set}; do ## loop over models  
        ## names of all the ensemble members  
        nsm_set=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc | cut -d ’_’ -f 5 | sort | uniq -c | awk ’{print $2}’ )  
        nsm_nbr=$( echo ${nsm_set} | wc -w ) ## number of ensemble members in each model  
        echo "------------------------------"  
        echo "Model" ${mdl} "includes" ${nsm_nbr} "ensemble member(s):"  
        echo ${nsm_set}"."  
     
        for nsm in ${nsm_set}; do ## loop over ensemble members  
          fl_nbr=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc | wc -w ) ## number of files in this ensemble member  
     
          if [ ${fl_nbr} -le 1 ] ## if there is only 1 file, continue to next loop  
          then  
           echo "There is only 1 file in" ${nsm}.  
           continue  
          fi  
     
          echo "There are" ${fl_nbr} "files in" ${nsm}.  
     
          ## starting date of data (sed [the name of the first file includes the starting date])  
          yyyymm_str=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc | sed -n ’1p’ | cut -d ’_’ -f 6 | cut -d ’-’ -f 1 )  
          ## ending date of data (sed [the name of the last file includes the ending date])  
          yyyymm_end=$( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc | sed -n "${fl_nbr}p" | cut -d ’_’ -f 6 | cut -d ’-’ -f 2 )  
     
          ## concatenate the files of one ensemble member into one along the record dimension (now is time)  
          ncrcat -O ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_*.nc ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_${yyyymm_str}-${yyyymm_end}  
     
          ## remove useless files  
          rm ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_${nsm}_!(${yyyymm_str}-${yyyymm_end})  
        done  
      done  
    done

    2 Global Distribution of Long-term Average

    #!/bin/bash  
     
    ##===========================================================================  
    ## After one-ensemble-one-file.sh  
    ## Example: Long-term average of each model globally  
    ##===========================================================================  
     
    ##---------------------------------------------------------------------------  
    ## parameters  
    drc_in=’/home/wenshanw/data/cmip5/’## directory of input files  
    drc_out=’/home/wenshanw/data/cmip5/output/’## directory of output files  
     
    var=( ’snc’ ’snd’ ) ## variables  
    rlm=’LImon’## realm  
    xpt=( ’historical’ ) ## experiment ( could be more )  
     
    fld_out=( ’snc/’ ’snd/’ ) ## folders of output files  
    ##---------------------------------------------------------------------------  
     
    for var_id in {0..1}; do ## loop over two variables  
    ## names of all models (ls [get file names]; cut [get the part for model names]; sort; uniq [remove duplicates]; awk [print])  
      mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | cut -d ’_’ -f 3 | sort | uniq -c | awk ’{print $2}’ )  
      mdl_num=$( echo ${mdl_set} | wc -w ) ## number of models (echo [print contents]; wc [count])  
     
      for mdl in ${mdl_set}; do ## loop over models  
       ## average all the ensemble members of each model  
       nces -O -4 -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9" ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_195601-200512.nc  
     
       ## average along time  
       ncra -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_195601-200512.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc  
     
       echo Model ${mdl} done!  
      done  
     
    ## Remove temporary files to avoid file name confliction  
    rm ${drc_out}${fld_out[var_id]}${var[var_id]}*historical*.nc  
     
      ## Store models as groups in the output file  
      ncecat -O --gag ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_all-mdl_${xpt[0]}_all-nsm_clm.nc  
     
    echo Var ${var[var_id]} done!  
    done

    3 Annual Average over Regions

    Main Script

    #!/bin/bash  
    # includes gsl_rgr.nco  
     
    ##===========================================================================  
    ## After one-ensemble-one-file.sh  
    ## Example: Annual trend of each model over Greenland and Tibet ( time- and spatial-average, standard deviation, anomaly and linear regression)  
    ##===========================================================================  
     
    ##---------------------------------------------------------------------------  
    ## parameters  
    drc_in=’/home/wenshanw/data/cmip5/’## directory of input files  
    drc_out=’/home/wenshanw/data/cmip5/output/’## directory of output files  
     
    var=( ’snc’ ’snd’ ) ## variables  
    rlm=’LImon’## realm  
    xpt=( ’historical’ ) ## experiment ( could be more )  
     
    fld_out=( ’snc/’ ’snd/’ ) ## folders of output files  
    ##------------------------------------------------------------  
     
    for var_id in {0..1}; do ## loop over two variables  
    ## names of all models (ls [get file names]; cut [get the part for model names]; sort; uniq [remove duplicates]; awk [print])  
      mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | cut -d ’_’ -f 3 | sort | uniq -c | awk ’{print $2}’ )  
     
      for mdl in ${mdl_set}; do ## loop over models  
        for fn in $( ls ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc ); do ## loop over ensemble members  
          pfx=$( echo ${fn} | cut -d’/’ -f6 | cut -d’_’ -f1-5 ) ## part of the file name  
     
          ## retrieve the 2 zones  
          ## calculate the geographical weight first  
          ncap2 -O -s ’gw = cos(lat*3.1415926/180.); gw@long_name="geographical weight";gw@units="ratio"’ ${fn} ${drc_out}${fld_out[var_id]}${pfx}_gw.nc  
          ## Greenland  
          ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon ${drc_out}${fld_out[var_id]}${pfx}_gw.nc ${drc_out}${fld_out[var_id]}${pfx}_gw_1.nc  
          ## Tibet  
          ncwa -O -w gw -d lat,30.0,40.0 -d lon,80.0,100.0 -a lat,lon ${drc_out}${fld_out[var_id]}${pfx}_gw.nc ${drc_out}${fld_out[var_id]}${pfx}_gw_2.nc  
     
          ## concatenate 2 zones together  
          ncecat -O -u zone ${drc_out}${fld_out[var_id]}${pfx}_gw_?.nc ${drc_out}${fld_out[var_id]}${pfx}_gw_zone4.nc  
     
          ## change the order of the dimension so that the record dimension is ’time’  
          ncpdq -O -a time,zone ${drc_out}${fld_out[var_id]}${pfx}_gw_zone4.nc ${drc_out}${fld_out[var_id]}${pfx}_gw_zone4.nc  
     
          ## remove the temporary files (optional)  
          rm ${drc_out}${fld_out[var_id]}${pfx}_gw_?.nc ${drc_out}${fld_out[var_id]}${pfx}_gw.nc  
     
          ## annual average (use the feature of ’Duration’)  
          ncra -O --mro -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9",12,12 ${drc_out}${fld_out[var_id]}${pfx}_gw_zone4.nc ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc  
     
          ## anomaly  
          ## long-term average  
          ncwa -O -a time ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc ${drc_out}${fld_out[var_id]}${pfx}_clm.nc  
          ## subtract long-term average  
          ncbo -O --op_typ=- ${drc_out}${fld_out[var_id]}${pfx}_yrly.nc ${drc_out}${fld_out[var_id]}${pfx}_clm.nc ${drc_out}${fld_out[var_id]}${pfx}_anm.nc  
        done  
     
        rm ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*_yrly.nc  
     
        ## average over all the ensemble members  
        nces -O -4 ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*_anm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm.nc  
     
        ## standard deviation ------------------------------  
        for fn in $( ls ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*_anm.nc ); do  
          pfx=$( echo ${fn} | cut -d’/’ -f8 | cut -d’_’ -f1-5 )  
     
          ## difference between each ensemble member and the average of all members  
          ncbo -O --op_typ=- ${fn} ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm.nc ${drc_out}${fld_out[var_id]}${pfx}_dlt.nc  
        done  
     
        ## RMS  
        nces -O -y rmssdn ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*_dlt.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_sdv.nc  
        ## rename variables  
        ncrename -v ${var[var_id]},sdv ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_sdv.nc  
        ## edit attributions  
        ncatted -a standard_name,sdv,a,c,"_standard_deviation_over_ensemble" -a long_name,sdv,a,c," Standard Deviation over Ensemble" -a original_name,sdv,a,c," sdv" ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_sdv.nc  
        ##------------------------------------------------------------  
     
        ## linear regression -----------------------------------------  
        ##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
        ## have to change the name of variable in the commands file of gsl_rgr.nco manually (gsl_rgr.nco is listed below)  
        ncap2 -O -S gsl_rgr.nco ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm_rgr.nc  
        ##!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  
     
        ## get rid of temporary variables  
        ncks -O -v c0,c1,pval,${var[var_id]},gw ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_anm_rgr.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc  
        ##------------------------------------------------------------  
     
        ## move the variable ’sdv’ into the anomaly files (i.e., *anm.nc files)  
        ncks -A -v sdv ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_sdv.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc  
        rm ${drc_out}${fld_out[var_id]}${var[var_id]}_*historical*  
     
        echo Model ${mdl} done!  
      done  
     
      ## Store models as groups in the output file  
      ncecat -O --gag ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_all-mdl_${xpt[0]}_all-nsm_annual.nc  
     
      echo Var ${var[var_id]} done!  
    done

    gsl_rgr.nco

    //linear regression  
    //Caution: make sure the variable name is in agreement with the main script (now is ’snd’)  
     
    //declare variables  
    *c0[$zone]=0.;        //intercept  
    *c1[$zone]=0.;        //slope  
    *sdv[$zone]=0.;       //standard deviation  
    *covxy[$zone]=0.;     //covariance  
    *x = double(time);  
     
    for (*zone_id=0;zone_id<$zone.size;zone_id++)   //loop over zones  
    {  
    gsl_fit_linear(time,1,snd(:,zone_id),1,$time.size, &tc0, &tc1, &cov00, &cov01,&cov11,&sumsq); //linear regression function  
    c0(zone_id) = tc0;    //store the results  
    c1(zone_id) = tc1;  
    covxy(zone_id) = gsl_stats_covariance(time,1,$time.size,double(snd(:,zone_id)),1,$time.size); //covariance function  
    sdv(zone_id) = gsl_stats_sd(snd(:,zone_id), 1, $time.size);   //standard deviation function  
    }  
     
    //pval------------------------------------------------------------  
    *time_sdv = gsl_stats_sd(time, 1, $time.size);  
    *r_value = covxy/(time_sdv*sdv);  
    *t_value = r_value/sqrt((1-r_value^2)/($time.size-2));  
    pval = abs(gsl_cdf_tdist_P(t_value, $time.size-2) - gsl_cdf_tdist_P(-t_value, $time.size-2));  
    //----------------------------------------------------------------  
     
    //write RAM variables to disk  
    //------------------------------------------------------------  
    //usually NCO writes the outputs directly to disk  
    //inside .nco files, using RAM variables, declared by *, will shorten running time  
    //write the final outputs using ram_write()  
    //------------------------------------------------------------  
    ram_write(c0);  
    ram_write(c1);

    4 Monthly Cycle

    #!/bin/bash  
     
    ##============================================================  
    ## After one-ensemble-one-file.sh  
    ## Example: Monthly cycle of each model in Greenland  
    ##============================================================  
     
    ##------------------------------------------------------------  
    ## parameters  
    drc_in=’/home/wenshanw/data/cmip5/’## directory of input files  
    drc_out=’/home/wenshanw/data/cmip5/output/’## directory of output files  
     
    var=( ’snc’ ’snd’ ) ## variables  
    rlm=’LImon’## realm  
    xpt=( ’historical’ ) ## experiment ( could be more )  
     
    fld_out=( ’snc/’ ’snd/’ ) ## folders of output files  
    ##------------------------------------------------------------  
     
    for var_id in {0..1}; do ## loop over two variables  
      ## names of all models (ls [get file names]; cut [get the part for model names]; sort; uniq [remove duplicates]; awk [print])  
      mdl_set=$( ls ${drc_in}${var[var_id]}_${rlm}_*_${xpt[0]}_*.nc | cut -d ’_’ -f 3 | sort | uniq -c | awk ’{print $2}’ )  
     
      for mdl in ${mdl_set}; do ## loop over models  
        ## average all the ensemble members in each model  
        nces -O -4 -d time,"1956-01-01 00:00:0.0","2005-12-31 23:59:9.9" ${drc_in}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc  
     
        ## retrieve Greenland  
        ## calculate the geographical weight first  
        ncap2 -O -s ’gw = cos(lat*3.1415926/180.); gw@long_name="geographical weight";gw@units="ratio"’ ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc  
        ## Greenland  
        ncwa -O -w gw -d lat,60.0,75.0 -d lon,300.0,340.0 -a lat,lon ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN.nc  
     
        ## anomaly----------------------------------------  
        for moy in {1..12}; do ## loop over months  
          mm=$( printf "%02d" ${moy} ) ## change the format of month into 2-digit  
     
          for yr in {1956..2005}; do ## loop over years  
            if [ ${moy} -eq 1 ]; then ## if January, calculate the annual average of this year  
             ncra -O -d time,"${yr}-01-01 00:00:0.0","${yr}-12-31 23:59:9.9" ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}.nc  
            fi  
     
            ## retrieve this month  
            ncks -O -d time,"${yr}-${mm}-01 00:00:0.0","${yr}-${mm}-31 23:59:9.9" ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}${mm}.nc  
            ## subtract the annual average from the month data  
            ncbo -O --op_typ=- ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}${mm}.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${yr}${mm}_anm.nc  
          done  
     
          ## average over years  
          ncra -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_????${mm}_anm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_${mm}_anm.nc  
        done  
        ##--------------------------------------------------  
     
        ## concatenate the months data together  
        ncrcat -O ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_${mdl}_${xpt[0]}_all-nsm_GN_??_anm.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${mdl}.nc  
     
        echo Model ${mdl} done!  
      done  
     
      rm -f ${drc_out}${fld_out[var_id]}${var[var_id]}*historical*  
     
      ## Store models as groups in the output file  
      ncecat -O --gag -v ${var[var_id]} ${drc_out}${fld_out[var_id]}${var[var_id]}_*.nc ${drc_out}${fld_out[var_id]}${var[var_id]}_${rlm}_all-mdl_${xpt[0]}_all-nsm_GN_mthly-anm.nc  
     
      echo Var ${var[var_id]} done!  
    done

    5 Regrid MODIS Data

    Main Script

    #!/bin/bash  
    ## include bi_interp.nco  
     
    ##===========================================================================  
    ## Example for  
    ## - regrid (using bi_interp.nco): the spatial resolution of MODIS data  
    ## is much finer than those of CMIP5 models. In order to compare  
    ## the two, we can regrid MODIS data to comform to CMIP5.  
    ##===========================================================================  
     
    var=( ’MCD43C3’ ) ## variable  
    fld_in=( ’monthly/’ ) ## folder of input files  
    fld_out=( ’cesm-grid/’ ) ## folder of output files  
    drc_in=’/media/grele_data/wenshan/modis/mcd43c3/’## directory of input files  
     
    for fn in $( ls ${drc_in}${fld_in}${var}.*.nc ); do ## loop over files  
      sfx=$( echo $fn | cut -d ’/’ -f 8 | cut -d ’.’ -f 2 ) ## part of file names  
     
      ## regrid  
      ncap2 -O -S bi_interp.nco ${fn} ${drc_in}${fld_out}${var}.${sfx}.regrid.nc  
      ## retrieve only the new variables  
      ncks -O -v wsa_sw_less,bsa_sw_less ${drc_in}${fld_out}${var}.${sfx}.regrid.nc ${drc_in}${fld_out}${var}.${sfx}.regrid.nc  
      ## rename the new variables, dimensions and attributions  
      ncrename -O -d latn,lat -d lonn,lon -v latn,lat -v lonn,lon -v wsa_sw_less,wsa_sw -v bsa_sw_less,bsa_sw -a missing_value,_FillValue ${drc_in}${fld_out}${var}.${sfx}.regrid.nc  
     
      echo $sfx done.  
    done

    bi_interp.nco

    // bilinear interpolation  
     
    defdim("latn",192); // define new dimension: latitude  
    defdim("lonn",288); // define new dimension: longitude  
    latn[$latn] = {90,89.0576 ,88.1152 ,87.1728 ,86.2304 ,85.288  ,84.3456 ,83.4031 ,82.4607 ,81.5183 ,80.5759 ,79.6335 ,78.6911 ,77.7487 ,76.8063 ,75.8639 ,74.9215 ,73.9791 ,73.0367 ,72.0942 ,71.1518 ,70.2094 ,69.267  ,68.3246 ,67.3822 ,66.4398 ,65.4974 ,64.555  ,63.6126 ,62.6702 ,61.7277 ,60.7853 ,59.8429 ,58.9005 ,57.9581 ,57.0157 ,56.0733 ,55.1309 ,54.1885 ,53.2461 ,52.3037 ,51.3613 ,50.4188 ,49.4764 ,48.534  ,47.5916 ,46.6492 ,45.7068 ,44.7644 ,43.822  ,42.8796 ,41.9372 ,40.9948 ,40.0524 ,39.11   ,38.1675 ,37.2251 ,36.2827 ,35.3403 ,34.3979 ,33.4555 ,32.5131 ,31.5707 ,30.6283 ,29.6859 ,28.7435 ,27.8011 ,26.8586 ,25.9162 ,24.9738 ,24.0314 ,23.089  ,22.1466 ,21.2042 ,20.2618 ,19.3194 ,18.377  ,17.4346 ,16.4921 ,15.5497 ,14.6073 ,13.6649 ,12.7225 ,11.7801 ,10.8377 ,9.89529 ,8.95288 ,8.01047 ,7.06806 ,6.12565 ,5.18325 ,4.24084 ,3.29843 ,2.35602 ,1.41361 ,0.471204,-0.471204,-1.41361,-2.35602,-3.29843,-4.24084,-5.18325,-6.12565,-7.06806,-8.01047,-8.95288,-9.89529,-10.8377,-11.7801,-12.7225,-13.6649,-14.6073,-15.5497,-16.4921,-17.4346,-18.377 ,-19.3194,-20.2618,-21.2042,-22.1466,-23.089 ,-24.0314,-24.9738,-25.9162,-26.8586,-27.8011,-28.7435,-29.6859,-30.6283,-31.5707,-32.5131,-33.4555,-34.3979,-35.3403,-36.2827,-37.2251,-38.1675,-39.11  ,-40.0524,-40.9948,-41.9372,-42.8796,-43.822 ,-44.7644,-45.7068,-46.6492,-47.5916,-48.534 ,-49.4764,-50.4188,-51.3613,-52.3037,-53.2461,-54.1885,-55.1309,-56.0733,-57.0157,-57.9581,-58.9005,-59.8429,-60.7853,-61.7277,-62.6702,-63.6126,-64.555 ,-65.4974,-66.4398,-67.3822,-68.3246,-69.267 ,-70.2094,-71.1518,-72.0942,-73.0367,-73.9791,-74.9215,-75.8639,-76.8063,-77.7487,-78.6911,-79.6335,-80.5759,-81.5183,-82.4607,-83.4031,-84.3456,-85.288,-86.2304,-87.1728,-88.1152,-89.0576,-90}; // the copy of CCSM4 latitude  
    lonn[$lonn] = {-178.75,-177.5,-176.25,-175,-173.75,-172.5,-171.25,-170,-168.75,-167.5,-166.25,-165,-163.75,-162.5,-161.25,-160,-158.75,-157.5,-156.25,-155,-153.75,-152.5,-151.25,-150,-148.75,-147.5,-146.25,-145,-143.75,-142.5,-141.25,-140,-138.75,-137.5,-136.25,-135,-133.75,-132.5,-131.25,-130,-128.75,-127.5,-126.25,-125,-123.75,-122.5,-121.25,-120,-118.75,-117.5,-116.25,-115,-113.75,-112.5,-111.25,-110,-108.75,-107.5,-106.25,-105,-103.75,-102.5,-101.25,-100,-98.75,-97.5,-96.25,-95,-93.75,-92.5,-91.25,-90,-88.75,-87.5,-86.25,-85,-83.75,-82.5,-81.25,-80,-78.75,-77.5,-76.25,-75,-73.75,-72.5,-71.25,-70,-68.75,-67.5,-66.25,-65,-63.75,-62.5,-61.25,-60,-58.75,-57.5,-56.25,-55,-53.75,-52.5,-51.25,-50,-48.75,-47.5,-46.25,-45,-43.75,-42.5,-41.25,-40,-38.75,-37.5,-36.25,-35,-33.75,-32.5,-31.25,-30,-28.75,-27.5,-26.25,-25,-23.75,-22.5,-21.25,-20,-18.75,-17.5,-16.25,-15,-13.75,-12.5,-11.25,-10,-8.75,-7.5,-6.25,-5,-3.75,-2.5,-1.25,0,1.25,2.5,3.75,5,6.25,7.5,8.75,10,11.25,12.5,13.75,15,16.25,17.5,18.75,20,21.25,22.5,23.75,25,26.25,27.5,28.75,30,31.25,32.5,33.75,35,36.25,37.5,38.75,40,41.25,42.5,43.75,45,46.25,47.5,48.75,50,51.25,52.5,53.75,55,56.25,57.5,58.75,60,61.25,62.5,63.75,65,66.25,67.5,68.75,70,71.25,72.5,73.75,75,76.25,77.5,78.75,80,81.25,82.5,83.75,85,86.25,87.5,88.75,90,91.25,92.5,93.75,95,96.25,97.5,98.75,100,101.25,102.5,103.75,105,106.25,107.5,108.75,110,111.25,112.5,113.75,115,116.25,117.5,118.75,120,121.25,122.5,123.75,125,126.25,127.5,128.75,130,131.25,132.5,133.75,135,136.25,137.5,138.75,140,141.25,142.5,143.75,145,146.25,147.5,148.75,150,151.25,152.5,153.75,155,156.25,157.5,158.75,160,161.25,162.5,163.75,165,166.25,167.5,168.75,170,171.25,172.5,173.75,175,176.25,177.5,178.75,180}; // the copy of CCSM4 longitude  
     
    *out[$time,$latn,$lonn]=0.0; // output structure  
     
    // bi-linear interpolation  
    bsa_sw_less=bilinear_interp_wrap(bsa_sw,out,latn,lonn,lat,lon);  
    wsa_sw_less=bilinear_interp_wrap(wsa_sw,out,latn,lonn,lat,lon);  
     
    // add attributions  
    latn@units = "degree_north";  
    lonn@units = "degree_east";  
    latn@long_name = "latitude";  
    lonn@long_name = "longitude";  
    bsa_sw_less@hdf_name = "Albedo_BSA_shortwave";  
    bsa_sw_less@calibrated_nt = 5;  
    bsa_sw_less@missing_value = 32767.0;  
    bsa_sw_less@units = "albedo, no units";  
    bsa_sw_less@long_name = "Global_Albedo_BSA_shortwave";  
    wsa_sw_less@hdf_name = "Albedo_WSA_shortwave";  
    wsa_sw_less@calibrated_nt = 5;  
    wsa_sw_less@missing_value = 32767.0;  
    wsa_sw_less@units = "albedo, no units";  
    wsa_sw_less@long_name = "Global_Albedo_WSA_shortwave";

    6 Add Coordinates to MODIS Data

    Main Script

    #!/bin/bash  
     
    ##============================================================  
    ## Example for  
    ## - regrid (using bi_interp.nco): the spatial resolution of MODIS data  
    ## is much finer than those of CMIP5 models. In order to compare  
    ## the two, we can regrid MODIS data to comform to CMIP5.  
    ## - add coordinates (using coor.nco): there is no coordinate information  
    ## in MODIS data. We have to add it manually now.  
    ##============================================================  
     
    var=( ’MOD10CM’ ) ## variable  
    fld_in=( ’snc/nc/’ ) ## folder of input files  
    drc_in=’/media/grele_data/wenshan/modis/’## directory of input files  
     
    for fn in $( ls ${drc_in}${fld_in}${var}*.nc ); do ## loop over files  
      sfx=$( echo ${fn} | cut -d ’/’ -f 8 | cut -d ’.’ -f 2-4 ) ## part of file names  
      echo ${sfx}  
     
      ## rename dimension names since they are too long  
      ncrename -d YDim_MOD_CMG_Snow_5km,lat -d XDim_MOD_CMG_Snow_5km,lon -O ${drc_in}${fld_in}${var}.${sfx}.nc ${drc_in}${fld_in}${var}.${sfx}.nc  
      ## add coordinates  
      ncap2 -O -S coor.nco ${drc_in}${fld_in}${var}.${sfx}.nc ${drc_in}${fld_in}${var}.${sfx}.nc  
    done

    coor.nco

    // add coordinate to MODIS HDF data  
    lon = array(0.f, 0.05, $lon) - 180;  
    lat = 90.f- array(0.f, 0.05, $lat);

    7 Permute MODIS Coordinates

    Main Script

    #!/bin/bash  
     
    ##===========================================================================  
    ## Example for  
    ## - permute coordinates (using inverse-lat.nco): the grid of MODIS is  
    ## from (-180 degE, 90 degN), the left-up corner, to  
    ## (180 degE, -90 degN), the right-low corner. However, CMIP5 is  
    ## from (0 degE, -90 degN) to (360 degE, 90 degN). The script  
    ## here changes the MODIS grid to CMIP5 grid.  
    ##===========================================================================  
     
    ##---------------------------------------------------------------------------  
    ## permute coordinates  
    ## - inverse lat from (90,-90) to (-90,90)  
    ## - permute lon from (-180,180) to (0,360)  
    for fn in $( ls MCD43C3.*.nc ); do ## loop over files  
      sfx=$( echo ${fn} | cut -d ’.’ -f 1-3 ) ## part of file names  
      echo ${sfx}  
     
      ## lat  
      ncap2 -O -S inverse-lat.nco ${fn} ${fn} ## inverse latitude  
     
      ## lon  
      ## break into east and west hemispheres in order to switch the two  
      ncks -O -d lon,0.0,180.0 ${fn} ${sfx}.part1.nc  
      ncks -O -d lon,-180.0,-1.25 ${fn} ${sfx}.part2.nc  
      ## make longitude the record dimension  
      ncpdq -O -a lon,lat,time ${sfx}.part1.nc ${sfx}.part1.nc  
      ncpdq -O -a lon,lat,time ${sfx}.part2.nc ${sfx}.part2.nc  
      ## concatenate the two hemispheres along longitude  
      ncrcat -O ${sfx}.part?.nc ${fn}  
      ## reorder dimensions  
      ncpdq -O -a time,lat,lon ${fn} ${fn}  
      ## add new longitude coordinates  
      ncap2 -O -s ’lon=array(0.0,1.25,$lon)’ ${fn} ${fn}  
    done

    inverse-lat.nco

    // inverse lat from (90,-90) to (-90,90)  
    bsa_sw=bsa_sw.reverse($lat);  
    wsa_sw=wsa_sw.reverse($lat);  
    lat=lat.reverse($lat);

    nco-4.5.4/m4/000077500000000000000000000000001264355130400126265ustar00rootroot00000000000000nco-4.5.4/m4/libtool.m4000066400000000000000000010604341264355130400145440ustar00rootroot00000000000000# 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 nco-4.5.4/m4/ltoptions.m4000066400000000000000000000300731264355130400151260ustar00rootroot00000000000000# 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])]) nco-4.5.4/m4/ltsugar.m4000066400000000000000000000104241264355130400145520ustar00rootroot00000000000000# 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 ]) nco-4.5.4/m4/ltversion.m4000066400000000000000000000012621264355130400151160ustar00rootroot00000000000000# 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) ]) nco-4.5.4/m4/lt~obsolete.m4000066400000000000000000000137561264355130400154560ustar00rootroot00000000000000# 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])]) nco-4.5.4/man/000077500000000000000000000000001264355130400130615ustar00rootroot00000000000000nco-4.5.4/man/.gitignore000066400000000000000000000000651264355130400150520ustar00rootroot00000000000000# Git-ignore patterns for ~/nco/man /Makefile /man1 nco-4.5.4/man/Makefile.am000066400000000000000000000002721264355130400151160ustar00rootroot00000000000000# $Header$ -*-makefile-*- man_MANS = ncap.1 ncap2.1 ncatted.1 ncbo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncra.1 ncremap.1 ncrename.1 ncpdq.1 ncrcat.1 ncwa.1 EXTRA_DIST = $(man_MANS) nco-4.5.4/man/Makefile.in000066400000000000000000000373051264355130400151360ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = man ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/autobld/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = ncap.1 ncap2.1 ncatted.1 ncbo.1 nces.1 ncecat.1 ncflint.1 ncks.1 nco.1 ncra.1 ncremap.1 ncrename.1 ncpdq.1 ncrcat.1 ncwa.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 man/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign man/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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-man1: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man1dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.1[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ done; } uninstall-man1: @$(NORMAL_UNINSTALL) @list=''; 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) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; 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 dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man1 install-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-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic clean-libtool \ cscopelist-am ctags-am 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-man1 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 tags-am uninstall uninstall-am uninstall-man \ uninstall-man1 .PRECIOUS: Makefile # 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: nco-4.5.4/man/ncap.1000066400000000000000000000065621264355130400140750ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncap .\" Usage: .\" nroff -man ~/nco/man/ncap.1 | less .TH NCAP 1 .SH NAME ncap \- netCDF Arithmetic Processor .SH SYNTAX ncap [\-3] [\-4] [\-6] [\-7] [\-A] [\-C] [\-c] [\-D .IR dbg_lvl ] [\-F] [\-f] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-no_tmp_fl] [\-O] [\-o .IR output-file ] [\-p .IR path ] [\-R] [\-r] [\-\-ram_all] [\-S .IR script-file ] [\-s .IR script ] [\-v .IR var [,\ .\|.\|.\ ]] .I input-file [ .I output-file ] .SH DESCRIPTION .PP .B ncap arithmetically processes a netCDF file. However, in about 2008 .B ncap was deprecated in favor of .B ncap2 which far surpasses its capabilities. .B ncap will eventually be completely removed from .B NCO. It is currently retained only because it provides an easier-to-build arithmetic operator than .B ncap2. The processing instructions are contained either in the .B NCO script file .B fl.nco or in a sequence of command line arguments. The options .B \-s (or long options .B \-\-spt or .B \-\-script) are used for in-line scripts and .B \-S (or long options .B \-\-fl_spt or .B \-\-script-file) are used to provide the filename where (usually multiple) scripting commands are pre-stored. .B ncap was written to perform arbitrary albebraic transformations of data and archive the results as easily as possible. Missing values are treated correctly. The results of the algebraic manipulations are called .I derived fields. Unlike the other operators, .B ncap does not accept a list of variables to be operated on as an argument to .B \-v. Rather, the .B \-v switch takes no arguments and indicates that .B ncap should output .I only user-defined variables. .B ncap does not accept or understand the .B \-x switch. .PP .SH EXAMPLES .PP Compute the square of variable .BR T .RS ncap \-s "T2=T*T" in.nc out.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncap2.1000066400000000000000000000066611264355130400141570ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncap2 .\" Usage: .\" nroff -man ~/nco/man/ncap2.1 | less .TH NCAP2 1 .SH NAME ncap2 \- netCDF Arithmetic Processor, Next Generation .SH SYNTAX ncap2 [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-F] [\-f] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-l .IR path ] [\-\-no_tmp_fl] [\-O] [\-o .IR output-file ] [\-p .IR path ] [\-R] [\-r] [\-\-ram_all] [\-S .IR script-file ] [\-s .IR script ] [\-t .IR thr_nbr ] [\-v .IR var [,...]] .I input-file [ .I output-file ] .SH DESCRIPTION .PP .B ncap2 supercedes and is backwards-compatible with .B ncap which is now deprecated. Both operators arithmetically process netCDF files. The primary .B ncap2 documentation is currently the sample script The remainder of this manpage is identical to the .B ncap manpage. The processing instructions are contained either in the .B NCO script file .B fl.nco or in a sequence of command line arguments. The options .B \-s (or long options .B \-\-spt or .B \-\-script) are used for in-line scripts and .B \-S (or long options .B \-\-fl_spt or .B \-\-script-file) are used to provide the filename where (usually multiple) scripting commands are pre-stored. .B ncap2 was written to perform arbitrary albebraic transformations of data and archive the results as easily as possible. Missing values are treated correctly. The results of the algebraic manipulations are called .I derived fields. Unlike the other operators, .B ncap2 does not accept a list of variables to be operated on as an argument to .B \-v. Rather, the .B \-v switch takes no arguments and indicates that .B ncap2 should output .I only user-defined variables. .B ncap2 does not accept or understand the .B \-x switch. .PP .SH EXAMPLES .PP Compute the square of variable .BR T .RS ncap2 \-s "T2=T*T" in.nc out.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncatted.1000066400000000000000000000257651264355130400146040ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncatted .\" Usage: .\" nroff -man ~/nco/man/ncatted.1 | less .TH NCATTED 1 .SH NAME ncatted \- netCDF Attribute Editor .SH SYNTAX ncatted [\-a .IR att_dsc ] [\-a ...] [\-\-bfr .IR sz ] [\-D .IR dbg_lvl] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdr_pad .IR sz ] [\-l path] [\-O] [\-p path] [\-R] [\-r] [\-\-ram_all] .I input-file [ .IR output-file ] .SH DESCRIPTION .PP .B ncatted edits attributes in a netCDF file. If you are editing attributes then you are spending too much time in the world of metadata, and .B ncatted was written to get you back out as quickly and painlessly as possible. .B ncatted can .IR append , .IR create , .IR delete , .IR modify , and .I overwrite attributes (all explained below). Furthermore, .B ncatted allows each editing operation to be applied to every variable in a file, thus saving you time when you want to change attribute conventions throughout a file. .B ncatted interprets character attributes as strings. .PP Because repeated use of .B ncatted can considerably increase the size of the .B history global attribute, the .B -h switch is provided to override automatically appending the command to the .B history global attribute in the .IR output-file . .PP When .B ncatted is used to change the .B _FillValue attribute, it changes the associated missing data self-consistently. If the internal floating point representation of a missing value, e.g., 1.0e36, differs between two machines then netCDF files produced on those machines will have incompatible missing values. This allows .B ncatted to change the missing values in files from different machines to a single value so that the files may then be concatenated together, e.g., by .BR ncrcat , without losing any information. .PP The key to mastering .B ncatted is understanding the meaning of the structure describing the attribute modification, .IR att_dsc . Each .I att_dsc contains five elements, which makes using .B ncatted somewhat complicated, but powerful. The .I att_dsc argument structure contains five arguments in the following order: .PP .I att_dsc = .IR att_nm , .IR var_nm , .IR mode , .IR att_type , .IR att_val .PP .TP .B att_nm Attribute name. Example: .B units .TP .B var_nm Variable name. Example: .B pressure .TP .B mode Edit mode abbreviation. Example: .BR a . See below for complete listing of valid values of .IR mode . .TP .B att_type Attribute type abbreviation. Example: .BR c . See below for complete listing of valid values of .IR att_type . .TP .B att_val Attribute value. Example: .BR pascal . There should be no empty space between these five consecutive arguments. The description of these arguments follows in their order of appearance. .PP The value of .I att_nm is the name of the attribute you want to edit. This meaning of this should be clear to all users of the .B ncatted operator. .PP The value of .I var_nm is the name of the variable containing the attribute (named .IR att_nm ) that you want to edit. There are two very important and useful exceptions to this rule. The value of .I var_nm can also be used to direct .B ncatted to edit global attributes, or to repeat the editing operation for every variable in a file. A value of .I var_nm of global\(rq indicates that .I att_nm refers to a global attribute, rather than a particular variable's attribute. This is the method .B ncatted supports for editing global attributes. If .I var_nm is left blank, on the other hand, then .B ncatted attempts to perform the editing operation on every variable in the file. This option may be convenient to use if you decide to change the conventions you use for describing the data. .PP The value of .I mode is a single character abbreviation ( .BR a , .BR c , .BR d , .BR m , or .BR o ) standing for one of five editing modes: .TP .B a .IR Append . Append value .I att_val to current .I var_nm attribute .I att_nm value .IR att_val , if any. If .I var_nm does not have an attribute .IR att_nm , there is no effect. .TP .B c .IR Create . Create variable .I var_nm attribute .I att_nm with .I "att_val" if .I att_nm does not yet exist. If .I var_nm already has an attribute .IR att_nm , there is no effect. .TP .B d .IR Delete . Delete current .I var_nm attribute .IR att_nm . If .I var_nm does not have an attribute .IR att_nm , there is no effect. When .I Delete mode is selected, the .I att_type and .I "att_val" arguments are superfluous and may be left blank. .TP .B m .IR Modify . Change value of current .I var_nm attribute .I att_nm to value .IR att_val . If .I var_nm does not have an attribute .IR att_nm , there is no effect. .TP .B o .IR Overwrite . Write attribute .I att_nm with value .I att_val to variable .IR var_nm , overwriting existing attribute .IR att_nm , if any. This is the default mode. .PP The value of .I att_type is a single character abbreviation ( .BR f , .BR d , .BR l , .BR s , .BR c , or .BR b ) standing for one of the six primitive netCDF data types: .TP .B f .IR Float . Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_FLOAT. .TP .B d .IR Double . Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_DOUBLE. .TP .B l .IR Long . Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_LONG. .TP .B s .IR Short . Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_SHORT. .TP .B c .I Char. Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_CHAR. .TP .B b .IR Byte . Value(s) specified in .I att_val will be stored as netCDF intrinsic type NC_BYTE. The specification of .I att_type is optional in .I Delete mode. .PP The value of .I att_val is what you want to change attribute .I att_nm to contain. The specification of .I att_val is optional in .I Delete mode. Attribute values for all types besides NC_CHAR must have an attribute length of at least one. Thus .I att_val may be a single value or one-dimensional array of elements of type .BR att_type . If the .I att_val is not set or is set to empty space, and the .I att_type is NC_CHAR, e.g., .B "-a units,T,o,c,""""" or .BR "-a units,T,o,c," , then the corresponding attribute is set to have zero length. When specifying an array of values, it is safest to enclose .I att_val in double or single quotes, e.g., .B "-a levels,T,o,s,""1,2,3,4""" or .BR "-a levels,T,o,s,'1,2,3,4'" . The quotes are strictly unnecessary around .I att_val except when .I att_val contains characters which would confuse the calling shell, such as spaces, commas, and wildcard characters. .PP NCO processing of NC_CHAR attributes is a bit like Perl in that it attempts to do what you want by default (but this sometimes causes unexpected results if you want unusual data storage). If the .I att_type is NC_CHAR then the argument is interpreted as a string and it may contain C-language escape sequences, which NCO will interpret before writing anything to disk. NCO translates valid escape sequences and stores the appropriate ASCII code instead. Since two byte escape sequences represent one byte ASCII codes, e.g., ASCII 10 (decimal), the stored string attribute is one byte shorter than the input string length for each embedded escape sequence. These sequences in particular allow convenient editing of formatted text attributes. See ncks netCDF Kitchen Sink, for more examples of string formatting (with the .B ncks .B -s option) with special characters. .PP Analogous to .BR printf , other special characters are also allowed by .B ncatted if they are "protected" by a backslash. NCO simply strips away the leading backslash from these characters before editing the attribute. No other characters require protection by a backslash. Backslashes which precede any other character will not be filtered and will be included in the attribute. .PP Note that the NUL character which terminates C language strings is assumed and need not be explicitly specified. If NUL is input, it will not be translated (because it would terminate the string in an additional location). Because of these context-sensitive rules, if wish to use an attribute of type NC_CHAR to store data, rather than text strings, you should use .B ncatted with care. .PP .SH EXAMPLES .PP Append the string "Data version 2.0.\\n" to the global attribute .BR history : .RS ncatted \-O \-a history,global,a,c,"Data version 2.0\\n" in.nc .RE Note the use of embedded C language .BR printf() \-style escape sequences. .PP Change the value of the .B long_name attribute for variable .B T from whatever it currently is to "temperature": .RS ncatted \-O \-a long_name,T,o,c,temperature in.nc .RE .PP Delete all existing .B units attributes: .RS ncatted \-O \-a units,,d,, in.nc .RE The value of .I var_nm was left blank in order to select all variables in the file. The values of .I att_type and .I att_val were left blank because they are superfluous in .I Delete mode. .PP Modify all existing .B units attributes to "meter second-1" .RS ncatted \-O \-a units,,m,c,"meter second-1" in.nc .RE .PP Overwrite the .B quanta attribute of variable .B energy to an array of four integers. .RS ncatted \-O \-a quanta,energy,o,s,"010,101,111,121" in.nc .RE .PP See the manual for more complex examples, including how to input C-language escape sequences and other special characters like backslashes and question marks. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncbo.1000066400000000000000000000174051264355130400140730ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncbo .\" Usage: .\" nroff -man ~/nco/man/ncbo.1 | less .TH NCBO 1 .SH NAME ncbo \- netCDF Binary Operator .SH SYNTAX ncbo [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-msa] [\-\-no_tmp_fl] [\-O] [\-p .IR path ] [\-R] [\-r] [\-\-ram_all] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-X .IR box ] [\-x] .I file_1 .I file_2 .I file_3 .SH DESCRIPTION .PP .B ncbo subtracts variables in .I file_2 from the corresponding variables (those with the same name) in .I file_1 and stores the results in .IR file_3 . Variables in .I file_2 are .I broadcast to conform to the corresponding variable in .I file_1 if necessary. Broadcasting a variable means creating data in non-existing dimensions from the data in existing dimensions. For example, a two dimensional variable in .I file_2 can be subtracted from a four, three, or two (but not one or zero) dimensional variable (of the same name) in .BR file_1 . This functionality allows the user to compute anomalies from the mean. Note that variables in .I file_1 are .I not broadcast to conform to the dimensions in .IR file_2 . Thus, .BR ncbo , the number of dimensions, or .IR rank , of any processed variable in .I file_1 must be greater than or equal to the rank of the same variable in .IR file_2 . Furthermore, the size of all dimensions common to both .I file_1 and .I file_2 must be equal. .PP When computing anomalies from the mean it is often the case that .I file_2 was created by applying an averaging operator to a file with the same dimensions as .IR file_1 , if not .I file_1 itself. In these cases, creating .I file_2 with .B ncra rather than .B ncwa will cause the .B ncbo operation to fail. For concreteness say the record dimension in .B file_1 is .BR time . If .I file_2 were created by averaging .I file_1 over the .B time dimension with the .B ncra operator rather than with the .B ncwa operator, then .I file_2 will have a .B time dimension of size 1 rather than having no .B time dimension at all In this case the input files to .BR ncbo , .I file_1 and .IR file_2 , will have unequally sized .B time dimensions which causes .B ncbo to fail. To prevent this from occuring, use .B ncwa to remove the .B time dimension from .IR file_2 . An example is given below. .PP .B ncbo will never difference coordinate variables or variables of type .B NC_CHAR or .BR NC_BYTE . This ensures that coordinates like (e.g., latitude and longitude) are physically meaningful in the output file, .IR file_3 . This behavior is hardcoded. .B ncbo applies special rules to some NCAR CSM fields (e.g., .BR ORO ). See .I "NCAR CSM Conventions for a complete description. Finally, we note that .B ncflint (ncflint netCDF File Interpolator) can be also perform file subtraction (as well as addition, multiplication and interpolation). .PP .SH EXAMPLES .PP Say files .B 85_0112.nc and .B 86_0112.nc each contain 12 months of data. Compute the change in the monthly averages from 1985 to 1986: .RS ncbo 86_0112.nc 85_0112.nc 86m85_0112.nc .RE .PP The following examples demonstrate the broadcasting feature of .BR ncbo . Say we wish to compute the monthly anomalies of .B T from the yearly average of .B T for the year 1985. First we create the 1985 average from the monthly data, which is stored with the record dimension .BR time . .RS ncra 85_0112.nc 85.nc .br ncwa \-O \-a time 85.nc 85.nc .RE The second command, .BR ncwa , gets rid of the .B time dimension of size 1 that .B ncra left in .BR 85.nc . Now none of the variables in .B 85.nc has a .B time dimension. A quicker way to accomplish this is to use .B ncwa from the beginning: .RS ncwa \-a time 85_0112.nc 85.nc .RE We are now ready to use .B ncbo to compute the anomalies for 1985: .RS ncbo \-v T 85_0112.nc 85.nc t_anm_85_0112.nc .RE Each of the 12 records in .B t_anm_85_0112.nc now contains the monthly deviation of .B T from the annual mean of .B T for each gridpoint. .PP Say we wish to compute the monthly gridpoint anomalies from the zonal annual mean. A .I "zonal mean" is a quantity that has been averaged over the longitudinal (or .IR x ) direction. First we use .B ncwa to average over longitudinal direction .BR lon , creating .BR xavg_85.nc , the zonal mean of .BR 85.nc . Then we use .B ncbo to subtract the zonal annual means from the monthly gridpoint data: .RS ncwa \-a lon 85.nc xavg_85.nc .br ncbo 85_0112.nc xavg_85.nc tx_anm_85_0112.nc .RE Assuming .B 85_0112.nc has dimensions .B time and .BR lon , this example only works if .B xavg_85.nc has no .B time or .B lon dimension. .PP As a final example, say we have five years of monthly data (i.e., 60 months) stored in .B 8501_8912.nc and we wish to create a file which contains the twelve month seasonal cycle of the average monthly anomaly from the five-year mean of this data. The following method is just one permutation of many which will accomplish the same result. First use .B ncwa to create the file containing the five-year mean: .RS ncwa \-a time 8501_8912.nc 8589.nc .RE Next use .B ncbo to create a file containing the difference of each month's data from the five-year mean: .RS ncbo 8501_8912.nc 8589.nc t_anm_8501_8912.nc .RE Now use .B ncks to group the five January anomalies together in one file, and use .B ncra to create the average anomaly for all five Januarys. These commands are embedded in a shell loop so they are repeated for all twelve months: .RS foreach idx (01 02 03 04 05 06 07 08 09 10 11 12) .br ncks \-F \-d time,,,12 t_anm_8501_8912.nc foo. .br ncra foo. t_anm_8589_.nc .br end .RE Note that .B ncra understands the .B stride argument so the two commands inside the loop may be combined into the single command .RS ncra \-F \-d time,,,12 t_anm_8501_8912.nc foo. .RE Finally, use .B ncrcat to concatenate the 12 average monthly anomaly files into one twelve-record file which contains the entire seasonal cycle of the monthly anomalies: .RS ncrcat t_anm_8589_??.nc t_anm_8589_0112.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncecat.1000066400000000000000000000112241264355130400144000ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncecat .\" Usage: .\" nroff -man ~/nco/man/ncecat.1 | less .TH NCECAT 1 .SH NAME ncecat \- netCDF Ensemble Concatenator .SH SYNTAX ncecat [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\--gag] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-M] [\-\-mrd] [\-\-msa] [\-n .IR loop ] [\-\-no_tmp_fl] [\-O] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-t .IR thr_nbr ] [\-u .IR ulm_nm ] [\--unn] [\-v .IR var [,...]] [\-X .IR box ] [\-x] .I input-files .I output-file .SH DESCRIPTION .PP .B ncecat concatenates an arbitrary number of input files into a single output file. Input files are glued together by creating a record dimension in the output file. Input files must be the same size. Each input file is stored consecutively as a single record in the output file. Each variable (except coordinate variables) in each input file becomes one record in the same variable in the output file. Coordinate variables are not concatenated, they are instead simply copied from the first input file to the output-file. Thus, the size of the output file is the sum of the sizes of the input files. .PP Consider five realizations, .BR 85a.nc , .BR 85b.nc , \... .B 85e.nc of 1985 predictions from the same climate model. Then .B "ncecat 85?.nc 85_ens.nc" glues the individual realizations together into the single file, .BR 85_ens.nc . If an input variable was dimensioned [ .BR lat , .BR "lon" ], it will have dimensions [ .BR record , .BR "lat" , .BR lon ] in the output file. A restriction of .B ncecat is that the hyperslabs of the processed variables must be the same from file to file. Normally this means all the input files are the same size, and contain data on different realizations of the same variables. .SH EXAMPLES .PP Consider a model experiment which generated five realizations of one year of data, say 1985. You can imagine that the experimenter slightly perturbs the initial conditions of the problem before generating each new solution. Assume each file contains all twelve months (a seasonal cycle) of data and we want to produce a single file containing all the seasonal cycles. Here the numeric filename suffix denotes the experiment number (\c .I not the month): .RS ncecat 85_01.nc 85_02.nc 85_03.nc 85_04.nc 85_05.nc 85.nc .br ncecat 85_0[1-5].nc 85.nc .br ncecat \-n 5,2,1 85_01.nc 85.nc .RE These three commands produce identical answers. The output file, .BR 85.nc , is five times the size as a single .IR input-file . It contains 60 months of data (which might or might not be stored in the record dimension, depending on the input files). .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/nces.1000066400000000000000000000121721264355130400140760ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for nces .\" Usage: .\" nroff -man ~/nco/man/nces.1 | less .TH NCES 1 .SH NAME nces \- netCDF Ensemble Statistics .SH SYNTAX nces [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-\-dbl|flt] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-msa] [\-N] [\-n .IR loop ] [\-\-no_tmp_fl] [\-\-nsm_sfx .IR grp_sfx ] [\-O] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-X .IR box ] [\-x] [\-y .IR op_typ ] .I input-files .I output-file .SH DESCRIPTION .PP .B nces performs gridpoint averages of variables across an arbitrary number (an .IR ensemble ) of input files, with each file receiving an equal weight in the average. Each variable in the .I output-file will be the same size as the same variable in any one of the in the .IR input-files , and all .I input-files must be the same size. Whereas .B ncra only performs averages over the record dimension (e.g., time), and weights each record in the record dimension evenly, .B nces averages entire files, and weights each file evenly. All dimensions, including the record dimension, are treated identically and preserved in the .IR output-file . .PP The file is the logical unit of organization for the results of many scientific studies. Often one wishes to generate a file which is the gridpoint average of many separate files. This may be to reduce statistical noise by combining the results of a large number of experiments, or it may simply be a step in a procedure whose goal is to compute anomalies from a mean state. In any case, when one desires to generate a file whose properties are the mean of all the input files, then .B nces is the operator to use. .B nces assumes coordinate variable are properties common to all of the experiments and so does not average them across files. Instead, .B nces copies the values of the coordinate variables from the first input file to the output file. .SH EXAMPLES .PP Consider a model experiment which generated five realizations of one year of data, say 1985. You can imagine that the experimenter slightly perturbs the initial conditions of the problem before generating each new solution. Assume each file contains all twelve months (a seasonal cycle) of data and we want to produce a single file containing the ensemble average (mean) seasonal cycle. Here the numeric filename suffix denotes the experiment number (\c .I not the month): .RS nces 85_01.nc 85_02.nc 85_03.nc 85_04.nc 85_05.nc 85.nc .br nces 85_0[1-5].nc 85.nc .br nces \-n 5,2,1 85_01.nc 85.nc .RE These three commands produce identical answers. The output file, .BR 85.nc , is the same size as the inputs files. It contains 12 months of data (which might or might not be stored in the record dimension, depending on the input files), but each value in the output file is the average of the five values in the input files. .PP In the previous example, the user could have obtained the ensemble average values in a particular spatio-temporal region by adding a hyperslab argument to the command, e.g., .RS nces \-d time,0,2 \-d lat,\-23.5,23.5 85_??.nc 85.nc .RE In this case the output file would contain only three slices of data in the .I time dimension. These three slices are the average of the first three slices from the input files. Additionally, only data inside the tropics is included. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncflint.1000066400000000000000000000124311264355130400146010ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncflint .\" Usage: .\" nroff -man ~/nco/man/ncflint.1 .TH NCFLINT 1 .SH NAME ncflint \- netCDF File Interpolator .SH SYNTAX ncflint [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-F] [\-\-fix_rec_crd] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-i .IR var, val3 ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-msa] [\-\-no_tmp_fl] [\-O] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-w .IR wgt[, .IR wgt2 ]] [\-X .IR box ] [\-x] .I file1 file2 file3 .SH DESCRIPTION .PP .B ncflint creates an output file that is a linear combination of the input files. This linear combination can be a weighted average, a normalized weighted average, or an interpolation of the input files. Coordinate variables are not acted upon in any case, they are simply copied from .I file_1. There are two conceptually distinct methods of using .B ncflint. The first method is to specify the weight each input file is to have in the output file. In this method, the value .IR val3 of a variable in the output file .IR file_3 is determined from its values .IR val1 and .IR val2 in the two input files according to .IR wgt1*val1 + wgt2*val2 Here at least .IR wgt1, and, optionally, .IR wgt2, are specified on the command line with the .BR \-w (or .BR \-\-weight or .BR \-\-wgt_var ) switch. If only .IR wgt1 is specified then .IR wgt2 is automatically computed as .IR wgt2 = 1 \- wgt1. Note that weights larger than 1 are allowed. Thus it is possible to specify .IR wgt1 = 2 and .IR wgt2 = \-3. One can use this functionality to multiply all the values in a given file by a constant. .PP The second method of using .B ncflint is to specify the interpolation option with .BR \-i (or with the .BR \-\-ntp or .BR \-\-interpolate long options). This is really the inverse of the first method in the following sense. When the user specifies the weights directly, .B ncflint has no work to do besides multiplying the input values by their respective weights and adding the results together to produce the output values. This assumes it is the weights that are known a priori. In another class of cases it is the "arrival value" (i.e., .IR val3 ) of a particular variable .IR var that is known a priori. In this case, the implied weights can always be inferred by examining the values of .IR var in the input files. This results in one equation in two unknowns, .IR wgt1 and .IR wgt2: .IR val3 = wgt1*val1 + wgt2*val2. .PP Unique determination of the weights requires imposing the additional constraint of normalization on the weights: .IR wgt1 + wgt2 = 1. Thus, to use the interpolation option, the user specifies .IR var and .IR val3 with the .BR \-i option. .B ncflint will compute .IR wgt1 and .IR wgt2, and use these weights on all variables to generate the output file. Although .IR var may have any number of dimensions in the input files, it must represent a single, scalar value. Thus any dimensions associated with .IR var must be "degenerate", i.e., of size one. .PP If neither .BR \-i nor .BR \-w is specified on the command line, .B ncflint defaults to weighting each input file equally in the output file. This is equivalent to specifying .IR \-w 0.5 or .IR \-w 0.5,0.5. Attempting to specify both .BR \-i and .BR \-w methods in the same command is an error. .PP .B ncflint is programmed not to interpolate variables of type .BR NC_CHAR and .BR NC_BYTE. This behavior is hardcoded. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncks.1000066400000000000000000000357321264355130400141130ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncks .\" Usage: .\" nroff -man ~/nco/man/ncks.1 | less .TH NCKS 1 .SH NAME ncks \- netCDF Kitchen Sink .SH SYNTAX ncks [\-3] [\-4] [\-5] [\-6] [\-7] [\-A] [\-a] [\-b .IR bnr_fl] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cdl] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D dbg_lvl] [\-d .IR dim ,[ .IR min ][,[ .IR max ]][,[ .IR stride ]]] [\-F] [\-\-fix_rec_dmn .IR dim ] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-\-grp_xtr_var_xcl] [\-H] [\-h] [\-\-hdn] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-M] [\-m] [\-\-map .IR map-file ] [\-\-md5] [\-\-mk_rec_dmn .IR dim ] [\-\-msa] [\-\-no_blank] [\-\-no_tmp_fl] [\-O] [\-o .IR output-file ] [\-P] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-Q] [\-q] [\-R] [\-r] [\-\-rad] [\-\-ram_all] [\-\-rgr .IR key= .IR val ]] [\--rnr .IR wgt ] [\-s .IR format ] [\-t .IR thr_nbr ] [\-u] [\--unn] [\-V] [\-v .IR var [,...]] [\-X .IR box ] [\-x] [\-\-xml] .I input-file [ .IR output-file ] .SH DESCRIPTION .PP .B ncks combines every feature we could think of, except the kitchen sink, into one versatile utility to manipulate netCDF files. .B ncks extracts a subset of the data from .I input-file and either prints it as ASCII text to stdout, or writes (or pastes) it to .IR output-file , or both. .PP .B ncks will print netCDF data in ASCII format to .BR stdout , like .BR ncdump , but with these differences: .B ncks prints data in a tabular format intended to be easy to search for the data you want, one datum per screen line, with all dimension subscripts and coordinate values (if any) preceding the datum. Option .B \-s allows the user the format the data using C-style format strings. .PP Options .BR \-a , .BR \-F , .BR \-H , .BR \-M , .BR \-m , .BR \-Q , .BR \-q , .BR \-s , .BR \-u , and .B \-V control the formatted appearance of the data. .PP .B ncks will extract (and optionally create a new netCDF file comprised of) only selected variable from the input file, like .B ncextr but with these differences: Only variables and coordinates may be specifically included or excluded---all global attributes and any attribute associated with an extracted variable will be copied to the screen and/or output netCDF file. Options .BR \-c , .BR \-C , .BR \-v , and .BR \-x control which variables are extracted. .PP .B ncks will extract hyperslabs from the specified variables. In fact .B ncks implements the nccut specification exactly. Option .B \-d controls the hyperslab specification. .PP Input dimensions that are not associated with any output variable will not appear in the output netCDF. This feature removes superfluous dimensions from a netCDF file. .PP .B ncks will append variables and attributes from the .I input-file to .I output-file if .I output-file is a pre-existing netCDF file whose relevant dimensions conform to dimension sizes of .IR input-file . The append features of .B ncks are intended to provide a rudimentary means of adding data from one netCDF file to another, conforming, netCDF file. When naming conflicts exists between the two files, data in .I output-file is usually overwritten by the corresponding data from .IR input-file . Thus it is recommended that the user backup .I output-file in case valuable data is accidentally overwritten. .PP If .I output-file exists, the user will be queried whether to .IR overwrite , .IR append , or .I exit the .B ncks call completely. Choosing .I overwrite destroys the existing .I output-file and create an entirely new one from the output of the .B ncks call. Append has differing effects depending on the uniqueness of the variables and attributes output by .BR ncks : If a variable or attribute extracted from .I input-file does not have a name conflict with the members of .I output-file then it will be added to .I "output-file" without overwriting any of the existing contents of .IR output-file . In this case the relevant dimensions must agree (conform) between the two files; new dimensions are created in .I output-file as required. When a name conflict occurs, a global attribute from .I "input-file" will overwrite the corresponding global attribute from .IR output-file . If the name conflict occurs for a non-record variable, then the dimensions and type of the variable (and of its coordinate dimensions, if any) must agree (conform) in both files. Then the variable values (and any coordinate dimension values) from .I input-file will overwrite the corresponding variable values (and coordinate dimension values, if any) in .I output-file .PP Since there can only be one record dimension in a file, the record dimension must have the same name (but not necessarily the same size) in both files if a record dimension variable is to be appended. If the record dimensions are of differing sizes, the record dimension of .I output-file will become the greater of the two record dimension sizes, the record variable from .I input-file will overwrite any counterpart in .I output-file and fill values will be written to any gaps left in the rest of the record variables (I think). In all cases variable attributes in .I output-file are superseded by attributes of the same name from .IR input-file , and left alone if there is no name conflict. .PP Some users may wish to avoid interactive .B ncks queries about whether to overwrite existing data. For example, batch scripts will fail if .B ncks does not receive responses to its queries. Options .B \-O and .B \-A are available to force overwriting existing files and variables, respectively. .PP Options specific to .B ncks .PP The following list provides a short summary of the features unique to .BR ncks . .PP .PP .TP .B \-a Do not alphabetize extracted fields. By default, the specified output variables are extracted, printed, and written to disk in alphabetical order. This tends to make long output lists easier to search for particular variables. Specifying .B \-a results in the variables being extracted, printed, and written to disk in the order in which they were saved in the input file. Thus .B \-a retains the original ordering of the variables. .PP .TP .B \-d .IR dim ,[ .IR min ][,[ .IR max ]][,[ .IR stride ]] Add .I stride argument to hyperslabber. .PP .TP .B \-H Print data to screen. The default behavior is to print data to screen if no netCDF output file is specified. Use .B \-H to print data to screen if a netCDF output is specified (the same behavior applies to .B \-m ). Unless otherwise specified (with .BR \-s ), each element of the data hyperslab is printed on a separate line containing the names, indices, and, values, if any, of all of the variables dimensions. The dimension and variable indices refer to the location of the corresponding data element with respect to the variable as stored on disk (i.e., not the hyperslab). .RS % ncks \-H \-C \-v three_dmn_var in.nc .br lat[0]=\-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 .br lat[0]=\-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 .br lat[0]=\-90 lev[0]=100 lon[2]=180 three_dmn_var[2]=2 .br \ .\|.\|.\ .br lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 .br lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 .br lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 .RE Printing the same variable with the .B \-F option shows the same variable indexed with Fortran conventions .RS % ncks \-F \-H \-C \-v three_dmn_var in.nc .br lon(1)=0 lev(1)=100 lat(1)=\-90 three_dmn_var(1)=0 .br lon(2)=90 lev(1)=100 lat(1)=\-90 three_dmn_var(2)=1 .br lon(3)=180 lev(1)=100 lat(1)=\-90 three_dmn_var(3)=2 .br \ .\|.\|.\ .RE Printing a hyperslab does not affect the variable or dimension indices since these indices are relative to the full variable (as stored in the input file), and the input file has not changed. However, if the hyperslab is saved to an output file and those values are printed, the indices will change: .RS % ncks \-H \-d lat,90.0 \-d lev,1000.0 \-v three_dmn_var in.nc out.nc .br lat[1]=90 lev[2]=1000 lon[0]=0 three_dmn_var[20]=20 .br lat[1]=90 lev[2]=1000 lon[1]=90 three_dmn_var[21]=21 .br lat[1]=90 lev[2]=1000 lon[2]=180 three_dmn_var[22]=22 .br lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 .br % ncks \-H out.nc .br lat[0]=90 lev[0]=1000 lon[0]=0 three_dmn_var[0]=20 .br lat[0]=90 lev[0]=1000 lon[1]=90 three_dmn_var[1]=21 .br lat[0]=90 lev[0]=1000 lon[2]=180 three_dmn_var[2]=22 .br lat[0]=90 lev[0]=1000 lon[3]=270 three_dmn_var[3]=23 .RE .PP .TP .B \-M Print to screen the global metadata describing the file. This includes file summary information and global attributes. .PP .TP .B \-m Print variable metadata to screen (similar to .BR "ncdump \-h" ). This displays all metadata pertaining to each variable, one variable at a time. .PP .TP .B \-Q Toggle printing of dimension indices and coordinate values when printing arrays. The name of each variable will appear flush left in the output. This is useful when trying to locate specific variables when displaying many variables with different dimensions. The mnemonic for this option is "quiet". .PP .TP .B \-s .I "format" String format for text output. Accepts C language escape sequences and .B printf() formats. .PP .TP .B \-u Accompany the printing of a variable's values with its units attribute, if it exists. .SH EXAMPLES .PP View all data in netCDF .BR in.nc , printed with Fortran indexing conventions: .RS ncks \-H \-F in.nc .RE .PP Copy the netCDF file .B in.nc to file .BR out.nc . .RS ncks \-O in.nc out.nc .RE Now the file .B out.nc contains all the data from .BR in.nc . There are, however, two differences between .B in.nc and .BR out.nc . First, the .B history global attribute will contain the command used to create .BR out.nc . Second, the variables in .B out.nc will be defined in alphabetical order. Of course the internal storage of variable in a netCDF file should be transparent to the user, but there are cases when alphabetizing a file is useful (see description of .B \-a switch). .PP Print variable .B three_dmn_var from file .B in.nc with default notations. Next print .B three_dmn_var as an un-annotated text column. Then print .B three_dmn_var signed with very high precision. Finally, print .B three_dmn_var as a comma-separated list. .RS % ncks \-H \-C \-v three_dmn_var in.nc .br lat[0]=\-90 lev[0]=100 lon[0]=0 three_dmn_var[0]=0 .br lat[0]=\-90 lev[0]=100 lon[1]=90 three_dmn_var[1]=1 .br \ .\|.\|.\ .br lat[1]=90 lev[2]=1000 lon[3]=270 three_dmn_var[23]=23 .br % ncks \-s "%f\\n" \-H \-C \-v three_dmn_var in.nc .br 0.000000 .br 1.000000 .br \ .\|.\|.\ .br 23.000000 .br % ncks \-s "%+16.10f\\n" \-H \-C \-v three_dmn_var in.nc .br +0.0000000000 .br +1.0000000000 .br \ .\|.\|.\ .br +23.0000000000 .br % ncks \-s "%f, " \-H \-C \-v three_dmn_var in.nc .br 0.000000, 1.000000, \ .\|.\|.\ , 23.000000, .RE The second and third options are useful when pasting data into text files like reports or papers. .PP One dimensional arrays of characters stored as netCDF variables are automatically printed as strings, whether or not they are NUL-terminated, e.g., .RS ncks \-v fl_nm in.nc .RE The .B %c formatting code is useful for printing multidimensional arrays of characters representing fixed length strings .RS ncks \-H \-s "%c" \-v fl_nm_arr in.nc .RE Using the .B %s format code on strings which are not NUL-terminated (and thus not technically strings) is likely to result in a core dump. .PP Create netCDF .B out.nc containing all variables, and any associated coordinates, except variable .BR time , from netCDF .BR in.nc : .RS ncks \-x \-v time in.nc out.nc .RE .PP Extract variables .B time and .B pressure from netCDF .BR in.nc . If .B out.nc does not exist it will be created. Otherwise the you will be prompted whether to append to or to overwrite .BR out.nc : .RS ncks \-v time,pressure in.nc out.nc .br ncks \-C \-v time,pressure in.nc out.nc .RE The first version of the command creates an .B out.nc which contains .BR time , .BR pressure , and any coordinate variables associated with .IR pressure . The .B out.nc from the second version is guaranteed to contain only two variables .B time and .BR pressure . .PP Create netCDF .B out.nc containing all variables from file .BR in.nc . Restrict the dimensions of these variables to a hyperslab. Print (with .BR \-H ) the hyperslabs to the screen for good measure. The specified hyperslab is: the sixth value in dimension .BR time ; the half-open range .I lat <= 0.0 in coordinate .BR lat ; the half-open range .I lon >= 330.0 in coordinate .BR lon ; the closed interval 0.3 <= .I band <= 0.5 in coordinate .BR band ; and cross-section closest to 1000.0 in coordinate .BR lev . Note that limits applied to coordinate values are specified with a decimal point, and limits applied to dimension indices do not have a decimal point. .RS ncks \-H \-d time,5 \-d lat,,0. \-d lon,330., \-d band,.3,.5 \-d lev,1000. in.nc out.nc .RE .PP Assume the domain of the monotonically increasing longitude coordinate .B lon is 0 < .I lon < 360. Here, .B lon is an example of a wrapped coordinate. .B ncks will extract a hyperslab which crosses the Greenwich meridian simply by specifying the westernmost longitude as .I min and the easternmost longitude as .IR max , as follows: .RS ncks \-d lon,260.,45. in.nc out.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/nco.1000066400000000000000000000101531264355130400137220ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for nco .\" Usage: .\" nroff -man ~/nco/man/nco.1 .TH NCO 1 .SH NAME NCO \- netCDF Operators .SH SYNTAX operator [ .IR options ] .I input-files .I output-file .SH DESCRIPTION .PP The netCDF Operators, or .B NCO are a suite of programs known as .IR operators . Each operator is a standalone, command line program which is executed at the UNIX shell-level like, e.g., .B ls or .BR mkdir . The operators take netCDF () files as input, then perform a set of operations (e.g., deriving new data, averaging, hyperslabbing, or metadata manipulation) and produce a netCDF file as output. The operators are primarily designed to aid manipulation and analysis of gridded scientific data. The single command style of .B NCO allows users to manipulate and analyze files interactively and with simple scripts, avoiding the overhead (and some of the power) of a higher level programming environment. The .B NCO User's Guide illustrates their use with examples from the field of climate modeling and analysis. .PP The available .I operators are: .PP .RS .BR ncap2 , netCDF Arithmetic Processor .RE .RS .BR ncatted , netCDF Attribute Editor .RE .RS .BR ncbo , netCDF Binary Operator (includes .BR ncadd , .BR ncsubtract , .BR ncmultiply , .BR ncdivide ) .RE .RS .BR nces , netCDF Ensemble Averager .RE .RS .BR ncecat , netCDF Ensemble Concatenator .RE .RS .BR ncflint , netCDF File Interpolator .RE .RS .BR ncks , netCDF Kitchen Sink .RE .RS .BR ncpdq , netCDF Permute Dimensions Quickly, Pack Data Quietly .RE .RS .BR ncra , netCDF Record Averager .RE .RS .BR ncrcat , netCDF Record Concatenator .RE .RS .BR ncrename , netCDF Renamer .RE .RS .BR ncwa , netCDF Weighted Averager. .RE (Note that the "averagers" are misnamed because they perform many non-linear operations as well, e.g., total, minimum, maximum, RMS). .PP The operators are as general as netCDF itself: there are no restrictions on the contents of the netCDF file(s) used as input. .BR NCO 's internal routines are completely dynamic and impose no limit on the number or sizes of dimensions, variables, and files. .B NCO is designed to be used both interactively and with large batch jobs. The default operator behavior is often sufficient for everyday needs, and there are numerous command line (i.e., run-time) options, for special cases. .B NCO works well on all modern operating systems. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncpdq.1000066400000000000000000000077671264355130400142710ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncpdq .\" Usage: .\" nroff -man ~/nco/man/ncpdq.1 | less .TH NCPDQ 1 .SH NAME ncpdq \- netCDF Permute Dimensions Quickly, Pack Data Quietly... .SH SYNTAX ncpdq [\-3] [\-4] [\-6] [\-7] [\-A] [\-a .IR dim [,...]] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-M .IR pck_map ] [\-\-mrd] [\-\-msa] [\-\-no_tmp_fl] [\-O] [\-o .IR output-file ] [\-P .IR pck_plc ] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-t .IR thr_nbr ] [\-U] [\--unn] [\-v .IR var [,...]] [\-X .IR box ] [\-x] .IR input-file [ .IR output-file ] .SH DESCRIPTION .PP .B ncpdq packs or re-shapes variables in .I input-file and stores them in .I output-file. Which variables to pack/unpack are determined by the packing policy encoded in the .IR pck_plc argument to the .BR \-P switch. Valid .IR pck_plc options are .IR all_new, .IR all_xst, .IR xst_new, and .IR upk. The numeric type of variable to pack or re-pack a variable to is determined by the packing map encoded in the .IR pck_map argument to the .BR \-M switch. Valid .IR pck_map options are .IR flt_byt, .IR flt_sht, .IR hgh_byt, .IR hgh_sht, and .IR nxt_lsr. .B ncpdq re-shapes variables in .I input-file by re-ordering and/or reversing dimensions specified in the dimension list. The dimension list is a comma separated list of dimension names, optionally prefixed by negative signs, that follow the .BR \-a switch. To re-order variables by a subset of their dimensions, specify these dimensions in a comma-separated list following .BR \-a , e.g., .BR "\-a lon,lat". To reverse a dimension, prefix its name with a negative sign in the dimension list, e.g., .BR "\-a \-lat". Re\-ordering and reversal may be performed simultaneously, e.g., .BR "\-a lon,\-lat,time,\-lev". Users may specify any permutation of dimensions, including permutations which change the record dimension identity. The record dimension is re-ordered like any other dimension. The record dimension is always the most slowly varying dimension in a record variable. The specified re-ordering will fail if it requires creating more than one record dimension amongst all the output variables. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncra.1000066400000000000000000000115401264355130400140670ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncra .\" Usage: .\" nroff -man ~/nco/man/ncra.1 | less .TH NCRA 1 .SH NAME ncra \- netCDF Record Averager .SH SYNTAX ncra [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]][, .IR stride [[,[ .IR subcycle ]]]]] [\-\-dbl|flt] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-mro] [\-\-msa] [\-N] [\-n .IR loop ] [\-\-no_cll_mth] [\-\-no_tmp_fl] [\-O] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-\-rec_apn] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-w .IR wgt ] [\-X .IR box ] [\-x] [\-y .IR op_typ ] .I input-files .I output-file .SH DESCRIPTION .PP .B ncra averages record variables across an arbitrary number of input files. The record dimension is retained as a degenerate (size 1) dimension in the output variables. .PP Input files may vary in size, but each must have a record dimension. The record coordinate, if any, should be monotonic for (or else non-fatal warnings may be generated). Hyperslabs of the record dimension which include more than one file are handled correctly. .B ncra supports the .I stride argument to the .B \-d hyperslab option for the record dimension only, .I stride is not supported for non-record dimensions. .PP .B ncra weights each record (e.g., time slice) in the .I input-files equally. .B ncra does not attempt to see if, say, the .B time coordinate is irregularly spaced and thus would require a weighted average in order to be a true time average. .SH EXAMPLES .PP Average files .BR 85.nc , .BR 86.nc , \ .\|.\|.\ .B 89.nc along the record dimension, and store the results in .BR 8589.nc : .RS ncra 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc .br ncra 8[56789].nc 8589.nc .br ncra \-n 5,2,1 85.nc 8589.nc .RE These three methods produce identical answers. .PP Assume the files .BR 85.nc , .BR 86.nc , \ .\|.\|.\ .B 89.nc each contain a record coordinate .I time of length 12 defined such that the third record in .B 86.nc contains data from March 1986, etc. NCO knows how to hyperslab the record dimension across files. Thus, to average data from December, 1985 through February, 1986: .RS ncra \-d time,11,13 85.nc 86.nc 87.nc 8512_8602.nc .br ncra \-F \-d time,12,14 85.nc 86.nc 87.nc 8512_8602.nc .RE The file .B 87.nc is superfluous, but does not cause an error. The .B \-F turns on the Fortran (1-based) indexing convention. The following uses the .I stride option to average all the March temperature data from multiple input files into a single output file .RS ncra \-F \-d time,3,,12 \-v temperature 85.nc 86.nc 87.nc 858687_03.nc .RE .PP Assume the .I time coordinate is incrementally numbered such that January, 1985 = 1 and December, 1989 = 60. Assuming .B ?? only expands to the five desired files, the following averages June, 1985--June, 1989: .RS ncra \-d time,6.,54. ??.nc 8506_8906.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncrcat.1000066400000000000000000000122351264355130400144200ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncrcat .\" Usage: .\" nroff -man ~/nco/man/ncrcat.1 | less .TH NCRCAT 1 .SH NAME ncrcat \- netCDF Record Concatenator .SH SYNTAX ncrcat [\-3] [\-4] [\-6] [\-7] [\-A] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]][,[ .IR stride [[,[ .IR subcycle ]]]]] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdr_pad .IR sz ] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-\-mro] [\-\-msa] [\-n .IR loop] [\-\-no_tmp_fl] [\-O] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-\-rec_apn] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-X .IR box ] [\-x] .I input-files .I output-file .SH DESCRIPTION .PP .B ncrcat concatenates record variables across an arbitrary number of input files. The final record dimension is by default the sum of the lengths of the record dimensions in the input files. .PP Input files may vary in size, but each must have a record dimension. The record coordinate, if any, should be monotonic (or else non-fatal warnings may be generated). Hyperslabs of the record dimension which include more than one file are handled correctly. .B ncra supports the .I stride argument to the .B \-d hyperslab option for the record dimension only, .I stride is not supported for non-record dimensions. .PP .B ncrcat applies special rules to ARM convention time fields (e.g., .BR time_offset ). .SH EXAMPLES .PP Concatenate files .BR 85.nc , .BR 86.nc , \ .\|.\|.\ .B 89.nc along the record dimension, and store the results in .BR 8589.nc : .RS ncrcat 85.nc 86.nc 87.nc 88.nc 89.nc 8589.nc .br ncrcat 8[56789].nc 8589.nc .br ncrcat \-n 5,2,1 85.nc 8589.nc .RE These three methods produce identical answers. .PP Assume the files .BR 85.nc , .BR 86.nc , \ .\|.\|.\ .B 89.nc each contain a record coordinate .I time of length 12 defined such that the third record in .B 86.nc contains data from March 1986, etc. NCO knows how to hyperslab the record dimension across files. Thus, to concatenate data from December, 1985--February, 1986: .RS ncrcat \-d time,11,13 85.nc 86.nc 87.nc 8512_8602.nc .br ncrcat \-F \-d time,12,14 85.nc 86.nc 87.nc 8512_8602.nc .RE The file .B 87.nc is superfluous, but does not cause an error. The .B \-F turns on the Fortran (1-based) indexing convention. .PP The following uses the .I stride option to concatenate all the March temperature data from multiple input files into a single output file .RS ncrcat \-F \-d time,3,,12 \-v temperature 85.nc 86.nc 87.nc 858687_03.nc .RE .PP Assume the .I time coordinate is incrementally numbered such that January, 1985 = 1 and December, 1989 = 60. Assuming .B ?? only expands to the five desired files, the following concatenates June, 1985--June, 1989: .RS ncrcat \-d time,6.,54. ??.nc 8506_8906.nc .RE .SH CAVEAT .B ncrcat does not re-scale packed data (i.e., data stored using the .B scale_factor and .B add_offset attributes recommended by the Unidat and CF conventions. .B ncrcat just copies the data directly from the input files. It copies the relevant metadata (i.e., .B scale_factor and .B add_offset attributes) from the first file. Concatenating multiple datasets packed with different scales is beyond its capabilities (concatenating data packed with the same scales in multiple files works fine). The workaround for cases where the scales change among files is to first unpack the data in all the file using .B ncpdq, then to concatenate the unpacked data using .B ncrcat, and finally to repack the result using .B ncpdq. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncremap.1000066400000000000000000000050361264355130400145740ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncremap .\" Usage: .\" nroff -man ~/nco/man/ncremap.1 | less .TH NCREMAP 1 .SH NAME ncremap \- netCDF Renamer .SH SYNTAX ncremap [\-a .IR alg_typ ] [\-D .IR dbg_lvl ] [\-d .IR dst_fl ] [\-E .IR esmf_opt ] [\-G .IR grd_sng ] [\-g .IR grd_fl ] [\-I .IR in_drc ] [\-i .IR in_fl ] [\-M] [\-m .IR map_fl ] [\-n .IR nco_usr ] [\-O .IR out_drc ] [\-o .IR output-file ] [\-p .IR par_typ ] [\-R .IR rgr_opt ] [\-s .IR grd_src ] [\-T .IR tempest_opt ] [\-t .IR thr_nbr ] [\-v .IR var_lst ] [\-w .IR wgt_gnr ] [\-x .IR xtn_var ] .SH DESCRIPTION .PP .B ncremap remaps the data in the .I input-file file(s) to the grid specified by (in descending order of precedence) .I map_fl , .I dst_fl, .I grd_dst, or .I grd_sng, and stores the result(s) in the .I output-file file(s). .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncrename.1000066400000000000000000000137561264355130400147470ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncrename .\" Usage: .\" nroff -man ~/nco/man/ncrename.1 | less .TH NCRENAME 1 .SH NAME ncrename \- netCDF Renamer .SH SYNTAX ncrename [\-a .IR old_name,new_name ] [\-a \ .\|.\|.\ ] [\-D] [\-d .IR old_name,new_name ] [\-d \ .\|.\|.\ ] [\-g .IR old_name,new_name ] [\-g \ .\|.\|.\ ] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdr_pad .IR sz ] [\-l path] [\-O] [\-p path] [\-R] [\-r] [\-\-ram_all] [\-v .IR old_name,new_name ] [\-v \ .\|.\|.\ ] .I input-file [ .IR output-file ] .SH DESCRIPTION .PP .B ncrename renames dimensions, variables, and attributes in a netCDF file. Each object that has a name in the list of old names is renamed using the corresponding name in the list of new names. All the new names must be unique. Every old name must exist in the input file, unless the name is preceded by the character .BR . . The validity of the old names is not checked prior to the renaming. Thus, if an old name is specified without the the .B . prefix and is not present in .IR input-file , .B ncrename will abort. .PP .B ncrename is the exception to the normal rules that the user will be interactively prompted before an existing file is changed, and that a temporary copy of an output file is constructed during the operation. If only .I input-file is specified, then .B ncrename will change the names of the .I input-file in place without prompting and without creating a temporary copy of .BR input-file . This is because the renaming operation is considered reversible if the user makes a mistake. The .I new_name can easily be changed back to .I old_name by using .B ncrename one more time. .PP Note that renaming a dimension to the name of a dependent variable can be used to invert the relationship between an independent coordinate variable and a dependent variable. In this case, the named dependent variable must be one-dimensional and should have no missing values. Such a variable will become a coordinate variable. .PP According to the netCDF User's Guide, renaming properties in netCDF files does not incur the penalty of recopying the entire file when the .I new_name is shorter than the .IR old_name . .SH OPTIONS .PP .TP .B \-a .IR old_name , .I "new_name" Attribute renaming. The old and new names of the attribute are specified by the associated .I old_name and .I new_name values. Global attributes are treated no differently than variable attributes. This option may be specified more than once. You cannot change the attribute name for one particular variable (unless it is uniquely named); all occurrences of the attribute of a given name will be renamed. This is considered an oversight and will be addressed in a future version of NCO. .PP .TP .B \-d .IR old_name , .I "new_name" Dimension renaming. The old and new names of the dimension are specified by the associated .I old_name and .I new_name values. This option may be specified more than once. .TP .B \-g .IR old_name , .I "new_name" Group renaming. The old and new names of the group are specified by the associated .I old_name and .I new_name values. This option may be specified more than once. .TP .B \-v .IR old_name , .I "new_name" Variable renaming. The old and new names of the variable are specified by the associated .I old_name and .I new_name values. This option may be specified more than once. .TP .B \-i Interactive. .B ncrename will prompt for confirmation before overwriting an existing file. .SH EXAMPLES .PP Rename the variable .B p to .B pressure and .B t to .B temperature in netCDF .BR in.nc . In this case .B p must exist in the input file (or .B ncrename will abort), but the presence of .B t is optional: .RS ncrename \-v p,pressure \-v .t,temperature in.nc .RE .B ncrename does not automatically attach dimensions to variables of the same name. If you want to rename a coordinate variable so that it remains a coordinate variable, you must separately rename both the dimension and the variable: .RS ncrename \-d lon,longitude \-v lon,longitude in.nc .RE .PP Create netCDF .B out.nc identical to .B in.nc except the attribute .B _FillValue is changed to .B missing_value (in all variables which possess it) and the global attribute .B Zaire is changed to .BR Congo : .RS ncrename \-a _FillValue,missing_value \-a Zaire,Congo in.nc out.nc .RE .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/man/ncwa.1000066400000000000000000000143151264355130400140770ustar00rootroot00000000000000.\" $Header$ -*-nroff-*- .\" Purpose: ROFF man page for ncwa .\" Usage: .\" nroff -man ~/nco/man/ncwa.1 | less .TH NCWA 1 .SH NAME ncwa \- netCDF Weighted Averager .SH SYNTAX ncwa [\-3] [\-4] [\-6] [\-7] [\-A] [\-a .IR dim [,...]] [\-B .IR mask_cond] [\-b] [\-\-bfr .IR sz ] [\-C] [\-c] [\-\-cnk_byt .IR sz ] [\-\-cnk_dmn .IR nm,sz ] [\-\-cnk_map .IR map ] [\-\-cnk_min .IR sz ] [\-\-cnk_plc .IR plc ] [\-\-cnk_scl .IR sz ] [\-D .IR dbg_lvl ] [\-d .IR dim ,[ .IR min ][,[ .IR max ]]] [\-\-dbl|flt] [\-F] [\-G .IR gpe_dsc ] [\-g .IR grp [,...]] [\-\-glb .IR att_name= .IR att_val ]] [\-h] [\-\-hdf] [\-\-hdr_pad .IR sz ] [\-I] [\-L .IR dfl_lvl ] [\-l .IR path ] [\-M .IR val ] [\-m .IR mask ] [\-N] [\-\-no_cll_mth] [\-\-no_tmp_fl] [\-O] [\-o .IR output-file ] [\-p .IR path ] [\-\-ppc .IR var1 [, .IR var2 [,...]]= .IR prc ]] [\-R] [\-r] [\-\-ram_all] [\-T .IR mask_comp ] [\-t .IR thr_nbr ] [\--unn] [\-v .IR var [,...]] [\-w .IR weight ] [\-x] [\-y .IR op_typ ] .I input-file .I output-file .SH DESCRIPTION .PP .B ncwa averages variables in a single file over arbitrary dimensions, with options to specify weights, masks, and normalization. The default behavior of .B ncwa is to arithmetically average every numerical variable over all dimensions and produce a scalar result. To average variables over only a subset of their dimensions, specify these dimensions in a comma-separated list following .BR \-a , e.g., .BR "\-a time,lat,lon" . As with all arithmetic operators, the operation may be restricted to an arbitrary hypserslab by employing the .B \-d option .B ncwa also handles values matching the variable's .B _FillValue attribute correctly. Moreover, .B ncwa understands how to manipulate user-specified weights, masks, and normalization options. With these options, .B ncwa can compute sophisticated averages (and integrals) from the command line. .PP .I mask and .IR weight , if specified, are broadcast to conform to the variables being averaged. The rank of variables is reduced by the number of dimensions which they are averaged over. Thus arrays which are one dimensional in the .I input-file and are averaged by .B ncwa appear in the .I output-file as scalars. This allows the user to infer which dimensions may have been averaged. Note that that it is impossible for .B ncwa to make make a .I weight or .I mask of rank .I W conform to a .I var of rank .I V if .IR "W > V" . This situation often arises when coordinate variables (which, by definition, are one dimensional) are weighted and averaged. .B ncwa assumes you know this is impossible and so .B ncwa does not attempt to broadcast .I weight or .I mask to conform to .I var in this case, nor does .B ncwa print a warning message telling you this, because it is so common. Specifying .I "dbg > 2" does cause .B ncwa to emit warnings in these situations, however. .PP Non-coordinate variables are always masked and weighted if specified. Coordinate variables, however, may be treated specially. By default, an averaged coordinate variable, e.g., .BR latitude , appears in .I output-file averaged the same way as any other variable containing an averaged dimension. In other words, by default .B ncwa weights and masks coordinate variables like all other variables. This design decision was intended to be helpful but for some applications it may be preferable not to weight or mask coordinate variables just like all other variables. Consider the following arguments to .BR ncwa : \(lq\-a latitude \-w lat_wgt \-d latitude,0.,90.\(rq where .B lat_wgt is a weight in the .B latitude dimension. Since, by default .B ncwa weights coordinate variables, the value of .B latitude in the .I output-file depends on the weights in .I lat_wgt and is not likely to be 45.---the midpoint latitude of the hyperslab. Option .B \-I overrides this default behavior and causes .B ncwa not to weight or mask coordinate variables. In the above case, this causes the value of .B latitude in the .I output-file to be 45.---which is a somewhat appealing result. Thus, .B \-I specifies simple arithmetic averages for the coordinate variables. In the case of latitude, .B \-I specifies that you prefer to archive the central latitude of the hyperslab over which variables were averaged rather than the area weighted centroid of the hyperslab. Note that the default behavior of ( .BR \-I ) changed on 1998/12/01---before this date the default was not to weight or mask coordinate variables. The mathematical definition of operations involving rank reduction is given above. .\" NB: Append man_end.txt here .\" $Header$ -*-nroff-*- .\" Purpose: Trailer file for common ending to NCO man pages .\" Usage: .\" Append this file to end of NCO man pages immediately after marker .\" that says "Append man_end.txt here" .SH AUTHOR .B NCO manual pages written by Charlie Zender and originally formatted by Brian Mays. .SH "REPORTING BUGS" Report bugs to . .SH COPYRIGHT Copyright \(co 1995-2016 Charlie Zender .br This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. .SH "SEE ALSO" The full documentation for .B NCO is maintained as a Texinfo manual called the .B NCO User's Guide. Because .B NCO is mathematical in nature, the documentation includes TeX-intensive portions not viewable on character-based displays. Hence the only complete and authoritative versions of the .B NCO User's Guide are the PDF (recommended), DVI, and Postscript versions at , , and , respectively. HTML and XML versions are available at and , respectively. If the .B info and .B NCO programs are properly installed at your site, the command .IP .B info nco .PP should give you access to the complete manual, except for the TeX-intensive portions. .BR ncap (1), .BR ncap2 (1), .BR ncatted (1), .BR ncbo (1), .BR nces (1), .BR ncecat (1), .BR ncflint (1), .BR ncks (1), .BR nco (1), .BR ncpdq (1), .BR ncra (1), .BR ncrcat (1), .BR ncremap (1), .BR ncrename (1), .BR ncwa (1) .SH HOMEPAGE The .B NCO homepage at contains more information. nco-4.5.4/po/000077500000000000000000000000001264355130400127245ustar00rootroot00000000000000nco-4.5.4/po/es/000077500000000000000000000000001264355130400133335ustar00rootroot00000000000000nco-4.5.4/po/es/nco.po000066400000000000000000000023341264355130400144540ustar00rootroot00000000000000# Portable Object Spanish translations for NCO, the netCDF Operators # Copyright (C) 1995-2014 Charlie Zender # This file is distributed under the same license as the NCO package #, fuzzy msgid "" msgstr "" "Project-Id-Version: NCO 4.4.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-06-17 13:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Charlie Zender \n" "Language-Team: Spanish \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/nco/ncra.c:539 #, c-format msgid "%s: ERROR Incorrect abbreviation for file list\n" msgstr "%s: ERREUR Abreviatura incorrecta para lista de archivos\n" #: ../src/nco/ncra.c:616 #, c-format msgid "%s: I18N Current charset = %s\n" msgstr "%s: I18N Corriente charset = %s\n" #: ../src/nco/ncra.c:796 #, c-format msgid "%s: INFO Input file %d is %s" msgstr "%s: INFO archivo de entrada %d es %s" #: ../src/nco/ncra.c:799 #, c-format msgid ", local file is %s" msgstr ", archivo local es %s" #: ../src/nco/ncks.c:717 #, c-format msgid "%s: I18N This text may appear in a foreign language\n" msgstr "%s: I18N Este texto puede aparecer en un idioma extranjero\n" nco-4.5.4/po/fr/000077500000000000000000000000001264355130400133335ustar00rootroot00000000000000nco-4.5.4/po/fr/nco.po000066400000000000000000000023341264355130400144540ustar00rootroot00000000000000# Portable Object French translations for NCO, the netCDF Operators # Copyright (C) 1995-2014 Charlie Zender # This file is distributed under the same license as the NCO package #, fuzzy msgid "" msgstr "" "Project-Id-Version: NCO 4.4.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-06-17 13:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Charlie Zender \n" "Language-Team: French \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/nco/ncra.c:539 #, c-format msgid "%s: ERROR Incorrect abbreviation for file list\n" msgstr "%s: ERREUR abréviation incorrecte pour la liste de fichiers\n" #: ../src/nco/ncra.c:616 #, c-format msgid "%s: I18N Current charset = %s\n" msgstr "%s: I18N Courant charset = %s\n" #: ../src/nco/ncra.c:796 #, c-format msgid "%s: INFO Input file %d is %s" msgstr "%s: INFO Fichier d'entrée %d est %s" #: ../src/nco/ncra.c:799 #, c-format msgid ", local file is %s" msgstr ", fichier local est %s" #: ../src/nco/ncks.c:717 #, c-format msgid "%s: I18N This text may appear in a foreign language\n" msgstr "%s: I18N Ce texte peut apparaître dans une langue étrangère\n" nco-4.5.4/po/nco.pot000066400000000000000000000016231264355130400142310ustar00rootroot00000000000000# Portable Object Template file for NCO, the netCDF Operators # Copyright (C) 1995-2014 Charlie Zender # This file is distributed under the same license as the NCO package #, fuzzy msgid "" msgstr "" "Project-Id-Version: NCO 4.4.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-06-17 13:16-0700\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Charlie Zender \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/nco/ncra.c:539 #, c-format msgid "%s: ERROR Incorrect abbreviation for file list\n" msgstr "" #: ../src/nco/ncra.c:616 #, c-format msgid "%s: I18N Current charset = %s\n" msgstr "" #: ../src/nco/ncra.c:796 #, c-format msgid "%s: INFO Input file %d is %s" msgstr "" #: ../src/nco/ncra.c:799 #, c-format msgid ", local file is %s" msgstr "" nco-4.5.4/qt/000077500000000000000000000000001264355130400127325ustar00rootroot00000000000000nco-4.5.4/qt/libnco/000077500000000000000000000000001264355130400142005ustar00rootroot00000000000000nco-4.5.4/qt/libnco/libnco.pro000066400000000000000000000056221264355130400161750ustar00rootroot00000000000000TEMPLATE = lib TARGET = libnco CONFIG += staticlib CONFIG -= qt CONFIG += debug_and_release unix:CONFIG( debug, debug|release ) { DESTDIR = ./debug } else { DESTDIR = ./release } unix { DEFINES += HAVE_CONFIG_H INCLUDEPATH += ../../ INCLUDEPATH += /usr/local/include INCLUDEPATH += /usr/local DEFINES += _BSD_SOURCE DEFINES += _POSIX_SOURCE LIBS += QMAKE_CFLAGS += -std=c99 } include (../nco.pri) SOURCES += ../../src/nco/nco_getopt.c HEADERS += ../../src/nco/nco_getopt.h HEADERS += ../../src/nco/libnco.h \ ../../src/nco/ncap.h \ ../../src/nco/nco.h \ ../../src/nco/nco_att_utl.h \ ../../src/nco/nco_aux.h \ ../../src/nco/nco_bnr.h \ ../../src/nco/nco_cln_utl.h \ ../../src/nco/nco_cnf_dmn.h \ ../../src/nco/nco_cnf_typ.h \ ../../src/nco/nco_cnk.h \ ../../src/nco/nco_cnv_arm.h \ ../../src/nco/nco_cnv_csm.h \ ../../src/nco/nco_ctl.h \ ../../src/nco/nco_dbg.h \ ../../src/nco/nco_dmn_utl.h \ ../../src/nco/nco_fl_utl.h \ ../../src/nco/nco_grp_trv.h \ ../../src/nco/nco_grp_utl.h \ ../../src/nco/nco_lmt.h \ ../../src/nco/nco_lst_utl.h \ ../../src/nco/nco_md5.h \ ../../src/nco/nco_mmr.h \ ../../src/nco/nco_mpi.h \ ../../src/nco/nco_msa.h \ ../../src/nco/nco_mss_val.h \ ../../src/nco/nco_netcdf.h \ ../../src/nco/nco_omp.h \ ../../src/nco/nco_pck.h \ ../../src/nco/nco_ppc.h \ ../../src/nco/nco_prn.h \ ../../src/nco/nco_rec_var.h \ ../../src/nco/nco_rgr.h \ ../../src/nco/nco_rth_flt.h \ ../../src/nco/nco_rth_utl.h \ ../../src/nco/nco_scl_utl.h \ ../../src/nco/nco_scm.h \ ../../src/nco/nco_sld.h \ ../../src/nco/nco_sng_utl.h \ ../../src/nco/nco_srm.h \ ../../src/nco/nco_typ.h \ ../../src/nco/nco_uthash.h \ ../../src/nco/nco_var_avg.h \ ../../src/nco/nco_var_lst.h \ ../../src/nco/nco_var_rth.h \ ../../src/nco/nco_var_scv.h \ ../../src/nco/nco_var_utl.h SOURCES += ../../src/nco/nco_att_utl.c \ ../../src/nco/nco_att_utl.c \ ../../src/nco/nco_aux.c \ ../../src/nco/nco_bnr.c \ ../../src/nco/nco_cln_utl.c \ ../../src/nco/nco_cnf_dmn.c \ ../../src/nco/nco_cnf_typ.c \ ../../src/nco/nco_cnk.c \ ../../src/nco/nco_cnv_arm.c \ ../../src/nco/nco_cnv_csm.c \ ../../src/nco/nco_ctl.c \ ../../src/nco/nco_dbg.c \ ../../src/nco/nco_dmn_utl.c \ ../../src/nco/nco_fl_utl.c \ ../../src/nco/nco_grp_trv.c \ ../../src/nco/nco_grp_utl.c \ ../../src/nco/nco_lmt.c \ ../../src/nco/nco_lst_utl.c \ ../../src/nco/nco_md5.c \ ../../src/nco/nco_mmr.c \ ../../src/nco/nco_msa.c \ ../../src/nco/nco_mss_val.c \ ../../src/nco/nco_netcdf.c \ ../../src/nco/nco_omp.c \ ../../src/nco/nco_pck.c \ ../../src/nco/nco_ppc.c \ ../../src/nco/nco_prn.c \ ../../src/nco/nco_rec_var.c \ ../../src/nco/nco_rgr.c \ ../../src/nco/nco_rth_flt.c \ ../../src/nco/nco_rth_utl.c \ ../../src/nco/nco_scl_utl.c \ ../../src/nco/nco_sld.c \ ../../src/nco/nco_scm.c \ ../../src/nco/nco_sng_utl.c \ ../../src/nco/nco_srm.c \ ../../src/nco/nco_var_avg.c \ ../../src/nco/nco_var_lst.c \ ../../src/nco/nco_var_rth.c \ ../../src/nco/nco_var_scv.c \ ../../src/nco/nco_var_utl.c nco-4.5.4/qt/libnco/libnco.vcxproj000066400000000000000000000306561264355130400170750ustar00rootroot00000000000000 Release Win32 Debug Win32 {E8AACE7E-513A-3A65-B16B-0661B6089A03} libnco Qt4VSv1.0 v120 release\ false NotSet StaticLibrary release\ libnco v120 debug\ false NotSet StaticLibrary debug\ libnco release\ $(Platform)\$(Configuration)\ libnco true debug\ $(Platform)\$(Configuration)\ libnco true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 $(OutDir)\libnco.lib true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb $(OutDir)\libnco.lib true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/libnco_c++/000077500000000000000000000000001264355130400146305ustar00rootroot00000000000000nco-4.5.4/qt/libnco_c++/libnco_c++.pro000066400000000000000000000021711264355130400172510ustar00rootroot00000000000000TEMPLATE = lib TARGET = libnco_c++ CONFIG += console CONFIG += static CONFIG -= qt CONFIG += debug_and_release INCLUDEPATH += ../../src/nco_c++ unix:CONFIG( debug, debug|release ) { DESTDIR = ./debug } else { DESTDIR = ./release } unix { INCLUDEPATH += /usr/local/include INCLUDEPATH += /usr/local } win32 { QMAKE_CFLAGS_RELEASE += /MT QMAKE_CXXFLAGS_RELEASE += /MT QMAKE_CFLAGS_DEBUG += /MTd QMAKE_CXXFLAGS_DEBUG += /MTd DEFINES += _CRT_SECURE_NO_WARNINGS DEFINES += _CRT_NONSTDC_NO_DEPRECATE DEFINES += ENABLE_NETCDF4 DEFINES += HAVE_NETCDF4_H DEFINES += ENABLE_GSL DEFINES += ENABLE_UDUNITS DEFINES += HAVE_UDUNITS2_H INCLUDEPATH += $(HEADER_NETCDF) INCLUDEPATH += $(HEADER_GSL) } HEADERS += ../../src/nco_c++/libnco_c++.hh \ ../../src/nco_c++/nco_dmn.hh \ ../../src/nco_c++/nco_hgh.hh \ ../../src/nco_c++/nco_var.hh \ ../../src/nco_c++/nco_att.hh \ ../../src/nco_c++/nco_fl.hh \ ../../src/nco_c++/nco_utl.hh SOURCES += ../../src/nco_c++/nco_att.cc \ ../../src/nco_c++/nco_dmn.cc \ ../../src/nco_c++/nco_fl.cc \ ../../src/nco_c++/nco_hgh.cc \ ../../src/nco_c++/nco_utl.cc \ ../../src/nco_c++/nco_var.cc nco-4.5.4/qt/libnco_c++/libnco_c++.vcxproj000066400000000000000000000205161264355130400201470ustar00rootroot00000000000000 Release Win32 Debug Win32 {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4} libnco_c++ Qt4VSv1.0 v120 release\ false NotSet StaticLibrary release\ libnco_c++ v120 debug\ false NotSet StaticLibrary debug\ libnco_c++ release\ $(Platform)\$(Configuration)\ libnco_c++ true debug\ $(Platform)\$(Configuration)\ libnco_c++ true .;..\..\src\nco_c++;$(HEADER_NETCDF);$(HEADER_GSL);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;ENABLE_GSL;ENABLE_UDUNITS;HAVE_UDUNITS2_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 $(OutDir)\libnco_c++.lib true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;ENABLE_GSL;ENABLE_UDUNITS;HAVE_UDUNITS2_H;%(PreprocessorDefinitions) .;..\..\src\nco_c++;$(HEADER_NETCDF);$(HEADER_GSL);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;ENABLE_GSL;ENABLE_UDUNITS;HAVE_UDUNITS2_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb $(OutDir)\libnco_c++.lib true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;ENABLE_GSL;ENABLE_UDUNITS;HAVE_UDUNITS2_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncap2/000077500000000000000000000000001264355130400137355ustar00rootroot00000000000000nco-4.5.4/qt/ncap2/ncap2.pro000066400000000000000000000035131264355130400154640ustar00rootroot00000000000000TEMPLATE = app TARGET = ncap2 CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a win32:LIBS += $(LIB_ANTLR) } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a win32:LIBS += $(LIB_ANTLR_REL) } unix { LIBS += -lhdf5_hl -lhdf5 -lgsl -lgslcblas -lnetcdf -lm LIBS += -L/usr/lib/x86_64-linux-gnu/ -L/usr/lib/i386-linux-gnu/ -lz -ludunits2 -lexpat LIBS += -lantlr } include (../nco.pri) win32 { INCLUDEPATH += $(HEADER_ANTLR) } INCLUDEPATH += ../../src/nco INCLUDEPATH += ../../src/nco++ HEADERS = ../../src/nco++/fmc_all_cls.hh \ ../../src/nco++/fmc_cls.hh \ ../../src/nco++/Invoke.hh \ ../../src/nco++/fmc_cls.hh \ ../../src/nco++/libnco++.hh \ ../../src/nco++/fmc_cls.hh \ ../../src/nco++/map_srt_tmp.hh \ ../../src/nco++/ncap2.hh \ ../../src/nco++/ncap2_utl.hh \ ../../src/nco++/ncap2_utl.hh \ ../../src/nco++/NcapVar.hh \ ../../src/nco++/NcapVarVector.hh \ ../../src/nco++/NcapVector.hh \ ../../src/nco++/ncoEnumTokenTypes.hpp \ ../../src/nco++/ncoTree.hpp \ ../../src/nco++/prs_cls.hh \ ../../src/nco++/sdo_utl.hh \ ../../src/nco++/sym_cls.hh \ ../../src/nco++/sdo_utl.hh \ ../../src/nco++/VarOp.hh \ ../../src/nco++/vtl_cls.hh \ ../../src/nco++/fmc_gsl_cls.hh \ ../../src/nco++/nco_gsl.h SOURCES = ../../src/nco++/Invoke.cc \ ../../src/nco++/ncap2.cc \ ../../src/nco++/ncap2_utl.cc \ ../../src/nco++/sdo_utl.cc \ ../../src/nco++/sym_cls.cc \ ../../src/nco++/fmc_cls.cc \ ../../src/nco++/fmc_all_cls.cc \ ../../src/nco++/fmc_gsl_cls.cc \ ../../src/nco++/NcapVar.cc \ ../../src/nco++/NcapVarVector.cc \ ../../src/nco++/ncoLexer.cpp \ ../../src/nco++/ncoParser.cpp \ ../../src/nco++/ncoTree.cpp \ ../../src/nco++/prs_cls.cc \ ../../src/nco++/nco_gsl.c nco-4.5.4/qt/ncap2/ncap2.vcxproj000066400000000000000000000270311264355130400163600ustar00rootroot00000000000000 Release Win32 Debug Win32 {DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F} ncap2 Qt4VSv1.0 v120 release\ false NotSet Application release\ ncap2 v120 debug\ false NotSet Application debug\ ncap2 release\ $(Platform)\$(Configuration)\ ncap2 true false debug\ $(Platform)\$(Configuration)\ ncap2 true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);$(HEADER_ANTLR);..\..\src\nco;..\..\src\nco++;C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_ANTLR_REL);$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncap2.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);$(HEADER_ANTLR);..\..\src\nco;..\..\src\nco++;C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_ANTLR);$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncap2.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncatted/000077500000000000000000000000001264355130400143545ustar00rootroot00000000000000nco-4.5.4/qt/ncatted/ncatted.pro000066400000000000000000000006111264355130400165160ustar00rootroot00000000000000TARGET = ncatted TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncatted.c nco-4.5.4/qt/ncatted/ncatted.vcxproj000066400000000000000000000230431264355130400174150ustar00rootroot00000000000000 Release Win32 Debug Win32 {662B7468-C1B2-3EA3-98DE-D2B8A870CAAE} ncatted Qt4VSv1.0 v120 release\ false NotSet Application release\ ncatted v120 debug\ false NotSet Application debug\ ncatted release\ $(Platform)\$(Configuration)\ ncatted true false debug\ $(Platform)\$(Configuration)\ ncatted true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncatted.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncatted.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncbo/000077500000000000000000000000001264355130400136535ustar00rootroot00000000000000nco-4.5.4/qt/ncbo/ncbo.pro000066400000000000000000000006021264355130400153140ustar00rootroot00000000000000TARGET = ncbo TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncbo.c nco-4.5.4/qt/ncbo/ncbo.vcxproj000066400000000000000000000230131264355130400162100ustar00rootroot00000000000000 Release Win32 Debug Win32 {05AA5FAF-8D8D-32F1-8215-3712F8CC38E0} ncbo Qt4VSv1.0 v120 release\ false NotSet Application release\ ncbo v120 debug\ false NotSet Application debug\ ncbo release\ $(Platform)\$(Configuration)\ ncbo true false debug\ $(Platform)\$(Configuration)\ ncbo true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncbo.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncbo.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncea/000077500000000000000000000000001264355130400136405ustar00rootroot00000000000000nco-4.5.4/qt/ncea/ncea.pro000066400000000000000000000006001264355130400152640ustar00rootroot00000000000000TARGET = ncea TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncra.cnco-4.5.4/qt/ncea/ncea.vcxproj000066400000000000000000000230131264355130400161620ustar00rootroot00000000000000 Release Win32 Debug Win32 {ED83DCD6-3659-3227-8BAE-CAE51E45E95D} ncea Qt4VSv1.0 v120 release\ false NotSet Application release\ ncea v120 debug\ false NotSet Application debug\ ncea release\ $(Platform)\$(Configuration)\ ncea true false debug\ $(Platform)\$(Configuration)\ ncea true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncea.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncea.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncecat/000077500000000000000000000000001264355130400141675ustar00rootroot00000000000000nco-4.5.4/qt/ncecat/ncecat.pro000066400000000000000000000006071264355130400161510ustar00rootroot00000000000000TARGET = ncecat TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncecat.c nco-4.5.4/qt/ncecat/ncecat.vcxproj000066400000000000000000000230331264355130400170420ustar00rootroot00000000000000 Release Win32 Debug Win32 {62931E91-8CDE-3A32-BE30-3CED418E09CF} ncecat Qt4VSv1.0 v120 release\ false NotSet Application release\ ncecat v120 debug\ false NotSet Application debug\ ncecat release\ $(Platform)\$(Configuration)\ ncecat true false debug\ $(Platform)\$(Configuration)\ ncecat true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncecat.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncecat.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncflint/000077500000000000000000000000001264355130400143675ustar00rootroot00000000000000nco-4.5.4/qt/ncflint/ncflint.pro000066400000000000000000000006101264355130400165430ustar00rootroot00000000000000TARGET = ncflint TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncflint.c nco-4.5.4/qt/ncflint/ncflint.vcxproj000066400000000000000000000230431264355130400174430ustar00rootroot00000000000000 Release Win32 Debug Win32 {4F01E3BE-0797-3130-88FA-F5C1CD8A0651} ncflint Qt4VSv1.0 v120 release\ false NotSet Application release\ ncflint v120 debug\ false NotSet Application debug\ ncflint release\ $(Platform)\$(Configuration)\ ncflint true false debug\ $(Platform)\$(Configuration)\ ncflint true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncflint.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncflint.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncks/000077500000000000000000000000001264355130400136705ustar00rootroot00000000000000nco-4.5.4/qt/ncks/ncks.pro000066400000000000000000000006011264355130400153450ustar00rootroot00000000000000TARGET = ncks TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncks.c nco-4.5.4/qt/ncks/ncks.vcxproj000066400000000000000000000230131264355130400162420ustar00rootroot00000000000000 Release Win32 Debug Win32 {D6E82FA7-5C29-3C68-B0B7-1B352E18E98E} ncks Qt4VSv1.0 v120 release\ false NotSet Application release\ ncks v120 debug\ false NotSet Application debug\ ncks release\ $(Platform)\$(Configuration)\ ncks true false debug\ $(Platform)\$(Configuration)\ ncks true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncks.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncks.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/nco.pri000066400000000000000000000021671264355130400142330ustar00rootroot00000000000000CONFIG += console CONFIG += static CONFIG -= qt unix { CONFIG += largefile DEFINES += HAVE_CONFIG_H INCLUDEPATH += ../../ DEFINES += _BSD_SOURCE DEFINES += _POSIX_SOURCE QMAKE_CFLAGS += -std=c99 LIBS += -L/usr/local/lib/ LIBS += -lhdf5_hl -lhdf5 -lgsl -lgslcblas -lnetcdf -lm LIBS += -L/usr/lib/x86_64-linux-gnu/ -L/usr/lib/i386-linux-gnu/ -lz -ludunits2 -lexpat } win32{ QMAKE_CFLAGS_RELEASE += /MT QMAKE_CXXFLAGS_RELEASE += /MT QMAKE_CFLAGS_DEBUG += /MTd QMAKE_CXXFLAGS_DEBUG += /MTd QMAKE_CXXFLAGS += /TP DEFINES += _CRT_SECURE_NO_WARNINGS DEFINES += _CRT_NONSTDC_NO_DEPRECATE DEFINES += ENABLE_UDUNITS DEFINES += HAVE_UDUNITS2_H DEFINES += ENABLE_GSL DEFINES += ENABLE_DAP } win32{ netcdf3 { INCLUDEPATH += $(HEADER_NETCDF3) LIBS += $(LIB_NETCDF3) } else { INCLUDEPATH += $(HEADER_NETCDF) LIBS += $(LIB_NETCDF) LIBS += $(LIB_HDF5) LIBS += $(LIB_HDF5_HL) LIBS += $(LIB_ZLIB) LIBS += $(LIB_SZIP) DEFINES += ENABLE_NETCDF4 DEFINES += HAVE_NETCDF4_H } INCLUDEPATH += $(HEADER_GSL) INCLUDEPATH += $(HEADER_UDUNITS) LIBS += $(LIB_GSL) LIBS += $(LIB_UDUNITS) LIBS += $(LIB_EXPAT) LIBS += $(LIB_CURL) } nco-4.5.4/qt/nco.pro000066400000000000000000000004641264355130400142370ustar00rootroot00000000000000TEMPLATE = subdirs CONFIG += ordered SUBDIRS += libnco SUBDIRS += ncatted SUBDIRS += ncbo SUBDIRS += ncecat SUBDIRS += ncflint SUBDIRS += ncks SUBDIRS += ncpdq SUBDIRS += ncra SUBDIRS += ncrename SUBDIRS += ncwa SUBDIRS += ncrcat SUBDIRS += ncea SUBDIRS += libnco_c++ SUBDIRS += tst_nco_c++ SUBDIRS += ncap2 nco-4.5.4/qt/nco.sln000066400000000000000000000231011264355130400142240ustar00rootroot00000000000000Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.30723.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnco", "libnco\libnco.vcxproj", "{E8AACE7E-513A-3A65-B16B-0661B6089A03}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncatted", "ncatted\ncatted.vcxproj", "{662B7468-C1B2-3EA3-98DE-D2B8A870CAAE}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncbo", "ncbo\ncbo.vcxproj", "{05AA5FAF-8D8D-32F1-8215-3712F8CC38E0}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncecat", "ncecat\ncecat.vcxproj", "{62931E91-8CDE-3A32-BE30-3CED418E09CF}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncflint", "ncflint\ncflint.vcxproj", "{4F01E3BE-0797-3130-88FA-F5C1CD8A0651}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncks", "ncks\ncks.vcxproj", "{D6E82FA7-5C29-3C68-B0B7-1B352E18E98E}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncpdq", "ncpdq\ncpdq.vcxproj", "{0FD04465-7DAA-322F-9F66-241608F4423F}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncra", "ncra\ncra.vcxproj", "{D6FDCE37-425F-33B0-87F4-92A8CBC20C8A}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncrename", "ncrename\ncrename.vcxproj", "{B5D4FE11-143A-3C0A-8540-C2B86CF3898A}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncwa", "ncwa\ncwa.vcxproj", "{24FE043D-0522-3D7C-A57A-FE178EF42806}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncrcat", "ncrcat\ncrcat.vcxproj", "{D9A7EC37-F172-3427-AD47-6B0A1B89B67F}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncea", "ncea\ncea.vcxproj", "{ED83DCD6-3659-3227-8BAE-CAE51E45E95D}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnco_c++", "libnco_c++\libnco_c++.vcxproj", "{BF383AEF-8F0C-39FD-96F6-393FDA23EAB4}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "tst_nco_c++", "tst_nco_c++\tst_nco_c++.vcxproj", "{0F656B77-3E08-343A-96F8-2875D7A0B3D0}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4} = {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4} EndProjectSection EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ncap2", "ncap2\ncap2.vcxproj", "{DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F}" ProjectSection(ProjectDependencies) = postProject {E8AACE7E-513A-3A65-B16B-0661B6089A03} = {E8AACE7E-513A-3A65-B16B-0661B6089A03} {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4} = {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Win32 = Debug|Win32 Release|Win32 = Release|Win32 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {E8AACE7E-513A-3A65-B16B-0661B6089A03}.Debug|Win32.ActiveCfg = Debug|Win32 {E8AACE7E-513A-3A65-B16B-0661B6089A03}.Debug|Win32.Build.0 = Debug|Win32 {E8AACE7E-513A-3A65-B16B-0661B6089A03}.Release|Win32.ActiveCfg = Release|Win32 {E8AACE7E-513A-3A65-B16B-0661B6089A03}.Release|Win32.Build.0 = Release|Win32 {662B7468-C1B2-3EA3-98DE-D2B8A870CAAE}.Debug|Win32.ActiveCfg = Debug|Win32 {662B7468-C1B2-3EA3-98DE-D2B8A870CAAE}.Debug|Win32.Build.0 = Debug|Win32 {662B7468-C1B2-3EA3-98DE-D2B8A870CAAE}.Release|Win32.ActiveCfg = Release|Win32 {662B7468-C1B2-3EA3-98DE-D2B8A870CAAE}.Release|Win32.Build.0 = Release|Win32 {05AA5FAF-8D8D-32F1-8215-3712F8CC38E0}.Debug|Win32.ActiveCfg = Debug|Win32 {05AA5FAF-8D8D-32F1-8215-3712F8CC38E0}.Debug|Win32.Build.0 = Debug|Win32 {05AA5FAF-8D8D-32F1-8215-3712F8CC38E0}.Release|Win32.ActiveCfg = Release|Win32 {05AA5FAF-8D8D-32F1-8215-3712F8CC38E0}.Release|Win32.Build.0 = Release|Win32 {62931E91-8CDE-3A32-BE30-3CED418E09CF}.Debug|Win32.ActiveCfg = Debug|Win32 {62931E91-8CDE-3A32-BE30-3CED418E09CF}.Debug|Win32.Build.0 = Debug|Win32 {62931E91-8CDE-3A32-BE30-3CED418E09CF}.Release|Win32.ActiveCfg = Release|Win32 {62931E91-8CDE-3A32-BE30-3CED418E09CF}.Release|Win32.Build.0 = Release|Win32 {4F01E3BE-0797-3130-88FA-F5C1CD8A0651}.Debug|Win32.ActiveCfg = Debug|Win32 {4F01E3BE-0797-3130-88FA-F5C1CD8A0651}.Debug|Win32.Build.0 = Debug|Win32 {4F01E3BE-0797-3130-88FA-F5C1CD8A0651}.Release|Win32.ActiveCfg = Release|Win32 {4F01E3BE-0797-3130-88FA-F5C1CD8A0651}.Release|Win32.Build.0 = Release|Win32 {D6E82FA7-5C29-3C68-B0B7-1B352E18E98E}.Debug|Win32.ActiveCfg = Debug|Win32 {D6E82FA7-5C29-3C68-B0B7-1B352E18E98E}.Debug|Win32.Build.0 = Debug|Win32 {D6E82FA7-5C29-3C68-B0B7-1B352E18E98E}.Release|Win32.ActiveCfg = Release|Win32 {D6E82FA7-5C29-3C68-B0B7-1B352E18E98E}.Release|Win32.Build.0 = Release|Win32 {0FD04465-7DAA-322F-9F66-241608F4423F}.Debug|Win32.ActiveCfg = Debug|Win32 {0FD04465-7DAA-322F-9F66-241608F4423F}.Debug|Win32.Build.0 = Debug|Win32 {0FD04465-7DAA-322F-9F66-241608F4423F}.Release|Win32.ActiveCfg = Release|Win32 {0FD04465-7DAA-322F-9F66-241608F4423F}.Release|Win32.Build.0 = Release|Win32 {D6FDCE37-425F-33B0-87F4-92A8CBC20C8A}.Debug|Win32.ActiveCfg = Debug|Win32 {D6FDCE37-425F-33B0-87F4-92A8CBC20C8A}.Debug|Win32.Build.0 = Debug|Win32 {D6FDCE37-425F-33B0-87F4-92A8CBC20C8A}.Release|Win32.ActiveCfg = Release|Win32 {D6FDCE37-425F-33B0-87F4-92A8CBC20C8A}.Release|Win32.Build.0 = Release|Win32 {B5D4FE11-143A-3C0A-8540-C2B86CF3898A}.Debug|Win32.ActiveCfg = Debug|Win32 {B5D4FE11-143A-3C0A-8540-C2B86CF3898A}.Debug|Win32.Build.0 = Debug|Win32 {B5D4FE11-143A-3C0A-8540-C2B86CF3898A}.Release|Win32.ActiveCfg = Release|Win32 {B5D4FE11-143A-3C0A-8540-C2B86CF3898A}.Release|Win32.Build.0 = Release|Win32 {24FE043D-0522-3D7C-A57A-FE178EF42806}.Debug|Win32.ActiveCfg = Debug|Win32 {24FE043D-0522-3D7C-A57A-FE178EF42806}.Debug|Win32.Build.0 = Debug|Win32 {24FE043D-0522-3D7C-A57A-FE178EF42806}.Release|Win32.ActiveCfg = Release|Win32 {24FE043D-0522-3D7C-A57A-FE178EF42806}.Release|Win32.Build.0 = Release|Win32 {D9A7EC37-F172-3427-AD47-6B0A1B89B67F}.Debug|Win32.ActiveCfg = Debug|Win32 {D9A7EC37-F172-3427-AD47-6B0A1B89B67F}.Debug|Win32.Build.0 = Debug|Win32 {D9A7EC37-F172-3427-AD47-6B0A1B89B67F}.Release|Win32.ActiveCfg = Release|Win32 {D9A7EC37-F172-3427-AD47-6B0A1B89B67F}.Release|Win32.Build.0 = Release|Win32 {ED83DCD6-3659-3227-8BAE-CAE51E45E95D}.Debug|Win32.ActiveCfg = Debug|Win32 {ED83DCD6-3659-3227-8BAE-CAE51E45E95D}.Debug|Win32.Build.0 = Debug|Win32 {ED83DCD6-3659-3227-8BAE-CAE51E45E95D}.Release|Win32.ActiveCfg = Release|Win32 {ED83DCD6-3659-3227-8BAE-CAE51E45E95D}.Release|Win32.Build.0 = Release|Win32 {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4}.Debug|Win32.ActiveCfg = Debug|Win32 {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4}.Debug|Win32.Build.0 = Debug|Win32 {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4}.Release|Win32.ActiveCfg = Release|Win32 {BF383AEF-8F0C-39FD-96F6-393FDA23EAB4}.Release|Win32.Build.0 = Release|Win32 {0F656B77-3E08-343A-96F8-2875D7A0B3D0}.Debug|Win32.ActiveCfg = Debug|Win32 {0F656B77-3E08-343A-96F8-2875D7A0B3D0}.Debug|Win32.Build.0 = Debug|Win32 {0F656B77-3E08-343A-96F8-2875D7A0B3D0}.Release|Win32.ActiveCfg = Release|Win32 {0F656B77-3E08-343A-96F8-2875D7A0B3D0}.Release|Win32.Build.0 = Release|Win32 {DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F}.Debug|Win32.ActiveCfg = Debug|Win32 {DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F}.Debug|Win32.Build.0 = Debug|Win32 {DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F}.Release|Win32.ActiveCfg = Release|Win32 {DEBDE623-1A7F-3850-AFE7-37FDF3D6EC7F}.Release|Win32.Build.0 = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution Qt5Version = msvc2013 EndGlobalSection EndGlobal nco-4.5.4/qt/ncpdq/000077500000000000000000000000001264355130400140375ustar00rootroot00000000000000nco-4.5.4/qt/ncpdq/ncpdq.pro000066400000000000000000000006041264355130400156660ustar00rootroot00000000000000TARGET = ncpdq TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncpdq.c nco-4.5.4/qt/ncpdq/ncpdq.vcxproj000066400000000000000000000230231264355130400165610ustar00rootroot00000000000000 Release Win32 Debug Win32 {0FD04465-7DAA-322F-9F66-241608F4423F} ncpdq Qt4VSv1.0 v120 release\ false NotSet Application release\ ncpdq v120 debug\ false NotSet Application debug\ ncpdq release\ $(Platform)\$(Configuration)\ ncpdq true false debug\ $(Platform)\$(Configuration)\ ncpdq true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncpdq.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncpdq.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncra/000077500000000000000000000000001264355130400136555ustar00rootroot00000000000000nco-4.5.4/qt/ncra/ncra.pro000066400000000000000000000006021264355130400153200ustar00rootroot00000000000000TARGET = ncra TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncra.c nco-4.5.4/qt/ncra/ncra.vcxproj000066400000000000000000000230131264355130400162140ustar00rootroot00000000000000 Release Win32 Debug Win32 {D6FDCE37-425F-33B0-87F4-92A8CBC20C8A} ncra Qt4VSv1.0 v120 release\ false NotSet Application release\ ncra v120 debug\ false NotSet Application debug\ ncra release\ $(Platform)\$(Configuration)\ ncra true false debug\ $(Platform)\$(Configuration)\ ncra true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncra.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncra.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncrcat/000077500000000000000000000000001264355130400142045ustar00rootroot00000000000000nco-4.5.4/qt/ncrcat/ncrcat.pro000066400000000000000000000006021264355130400161760ustar00rootroot00000000000000TARGET = ncrcat TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncra.cnco-4.5.4/qt/ncrcat/ncrcat.vcxproj000066400000000000000000000230311264355130400170720ustar00rootroot00000000000000 Release Win32 Debug Win32 {D9A7EC37-F172-3427-AD47-6B0A1B89B67F} ncrcat Qt4VSv1.0 v120 release\ false NotSet Application release\ ncrcat v120 debug\ false NotSet Application debug\ ncrcat release\ $(Platform)\$(Configuration)\ ncrcat true false debug\ $(Platform)\$(Configuration)\ ncrcat true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncrcat.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncrcat.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncrename/000077500000000000000000000000001264355130400145225ustar00rootroot00000000000000nco-4.5.4/qt/ncrename/ncrename.pro000066400000000000000000000006121264355130400170330ustar00rootroot00000000000000TARGET = ncrename TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) HEADERS = SOURCES = ../../src/nco/ncrename.c nco-4.5.4/qt/ncrename/ncrename.vcxproj000066400000000000000000000230531264355130400177320ustar00rootroot00000000000000 Release Win32 Debug Win32 {B5D4FE11-143A-3C0A-8540-C2B86CF3898A} ncrename Qt4VSv1.0 v120 release\ false NotSet Application release\ ncrename v120 debug\ false NotSet Application debug\ ncrename release\ $(Platform)\$(Configuration)\ ncrename true false debug\ $(Platform)\$(Configuration)\ ncrename true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncrename.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncrename.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/ncwa/000077500000000000000000000000001264355130400136625ustar00rootroot00000000000000nco-4.5.4/qt/ncwa/ncwa.pro000066400000000000000000000031061264355130400153340ustar00rootroot00000000000000TARGET = ncwa TEMPLATE = app CONFIG -= qt CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco/debug/libnco.lib unix:LIBS += ../libnco/debug/liblibnco.a } else { win32:LIBS += ../libnco/release/libnco.lib unix:LIBS += ../libnco/release/liblibnco.a } include (../nco.pri) unix { HEADERS = ../../src/nco/ncap_yacc.h SOURCES = ../../src/nco/ncwa.c \ ../../src/nco/ncap_utl.c } win32 { SOURCES = ../../src/nco/ncwa.c } unix { FLEXSOURCES = ../../src/nco/ncap_lex.l BISONSOURCES = ../../src/nco/ncap_yacc.y flex.name = flex ${QMAKE_FILE_IN} flex.input = FLEXSOURCES flex.output = ../../src/nco/ncap_lex.c flex.commands = flex -Pnco_yy -o ../../src/nco/ncap_lex.c ${QMAKE_FILE_IN} flex.variable_out = SOURCES silent:flex.commands = @echo Lex ${QMAKE_FILE_IN} && $$flex.commands QMAKE_EXTRA_COMPILERS += flex bison.name = bison ${QMAKE_FILE_IN} bison.input = BISONSOURCES bison.commands = bison -d -p nco_yy -o ../../src/nco/ncap_yacc.c ${QMAKE_FILE_IN} bison.output = ../../src/nco/ncap_yacc.c bison.variable_out = SOURCES bison.CONFIG += target_predeps silent:bison.commands = @echo Bison ${QMAKE_FILE_IN} && $$bison.commands QMAKE_EXTRA_COMPILERS += bison bisonheader.commands = bison -d -p nco_yy -o ../../src/nco/ncap_yacc.c ${QMAKE_FILE_IN} bisonheader.input = BISONSOURCES bisonheader.output = ../../src/nco/ncap_yacc.c bisonheader.variable_out = HEADERS bisonheader.name = bisonheader ${QMAKE_FILE_IN} silent:bisonheader.commands = @echo Bison ${QMAKE_FILE_IN} && $$bison.commands QMAKE_EXTRA_COMPILERS += bisonheader } nco-4.5.4/qt/ncwa/ncwa.vcxproj000066400000000000000000000230131264355130400162260ustar00rootroot00000000000000 Release Win32 Debug Win32 {24FE043D-0522-3D7C-A57A-FE178EF42806} ncwa Qt4VSv1.0 v120 release\ false NotSet Application release\ ncwa v120 debug\ false NotSet Application debug\ ncwa release\ $(Platform)\$(Configuration)\ ncwa true false debug\ $(Platform)\$(Configuration)\ ncwa true .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false CompileAsCpp None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco/release/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\ncwa.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) .;$(HEADER_NETCDF);$(HEADER_GSL);$(HEADER_UDUNITS);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false CompileAsCpp ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco/debug/libnco.lib;$(LIB_NETCDF);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_GSL);$(LIB_UDUNITS);$(LIB_EXPAT);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\ncwa.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_UDUNITS;HAVE_UDUNITS2_H;ENABLE_GSL;ENABLE_DAP;ENABLE_NETCDF4;HAVE_NETCDF4_H;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/qt/tst_nco_c++/000077500000000000000000000000001264355130400150335ustar00rootroot00000000000000nco-4.5.4/qt/tst_nco_c++/tst_nco_c++.pro000066400000000000000000000022131264355130400176540ustar00rootroot00000000000000TEMPLATE = app TARGET = tst_nco_c++ CONFIG -= qt CONFIG += console CONFIG += debug_and_release CONFIG( debug, debug|release ) { win32:LIBS += ../libnco_c++/debug/libnco_c++.lib unix:LIBS += ../libnco_c++/debug/liblibnco_c++.a } else { win32:LIBS += ../libnco_c++/release/libnco_c++.lib unix:LIBS += ../libnco_c++/release/liblibnco_c++.a } INCLUDEPATH += ../../src/nco_c++ HEADERS = SOURCES = ../../src/nco_c++/tst.cc unix { INCLUDEPATH += /usr/local/include INCLUDEPATH += /usr/local LIBS += -L/usr/lib/ -lnetcdf -lhdf5_hl -lhdf5 LIBS += -L/usr/lib/x86_64-linux-gnu/ -L/usr/lib/i386-linux-gnu/ -lz -ludunits2 -lexpat } win32 { QMAKE_CFLAGS_RELEASE += /MT QMAKE_CXXFLAGS_RELEASE += /MT QMAKE_CFLAGS_DEBUG += /MTd QMAKE_CXXFLAGS_DEBUG += /MTd INCLUDEPATH += $(HEADER_NETCDF) LIBS += $(LIB_NETCDF) LIBS += $(LIB_DISPATCH) LIBS += $(LIB_NETCDF4) LIBS += $(LIB_HDF5) LIBS += $(LIB_HDF5_HL) LIBS += $(LIB_ZLIB) LIBS += $(LIB_SZIP) LIBS += $(LIB_CURL) DEFINES += _CRT_SECURE_NO_WARNINGS DEFINES += _CRT_NONSTDC_NO_DEPRECATE DEFINES += ENABLE_NETCDF4 DEFINES += HAVE_NETCDF4_H DEFINES += NEED_STRCASECMP DEFINES += NEED_STRCASESTR } nco-4.5.4/qt/tst_nco_c++/tst_nco_c++.vcxproj000066400000000000000000000225721264355130400205610ustar00rootroot00000000000000 Release Win32 Debug Win32 {0F656B77-3E08-343A-96F8-2875D7A0B3D0} tst_nco_c++ Qt4VSv1.0 v120 release\ false NotSet Application release\ tst_nco_c++ v120 debug\ false NotSet Application debug\ tst_nco_c++ release\ $(Platform)\$(Configuration)\ tst_nco_c++ true false debug\ $(Platform)\$(Configuration)\ tst_nco_c++ true .;..\..\src\nco_c++;$(HEADER_NETCDF);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -Zc:strictStrings -w34100 -w34189 -w44996 %(AdditionalOptions) release\ false None Sync $(IntDir) MaxSpeed _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;NEED_STRCASECMP;NEED_STRCASESTR;NDEBUG;%(PreprocessorDefinitions) false $(IntDir)vc$(PlatformToolsetVersion).pdb MultiThreaded true true true Level3 ../libnco_c++/release/libnco_c++.lib;$(LIB_NETCDF);$(LIB_DISPATCH);$(LIB_NETCDF4);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true false true false $(OutDir)\tst_nco_c++.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;NEED_STRCASECMP;NEED_STRCASESTR;%(PreprocessorDefinitions) .;..\..\src\nco_c++;$(HEADER_NETCDF);C:\qt\qt5.5.1\5.5\msvc2013\mkspecs\win32-msvc2013;%(AdditionalIncludeDirectories) -w34100 -w34189 -w44996 %(AdditionalOptions) debug\ false ProgramDatabase Sync $(IntDir) Disabled _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;NEED_STRCASECMP;NEED_STRCASESTR;%(PreprocessorDefinitions) false MultiThreadedDebug true true true Level3 $(IntDir)vc$(PlatformToolsetVersion).pdb ../libnco_c++/debug/libnco_c++.lib;$(LIB_NETCDF);$(LIB_DISPATCH);$(LIB_NETCDF4);$(LIB_HDF5);$(LIB_HDF5_HL);$(LIB_ZLIB);$(LIB_SZIP);$(LIB_CURL);%(AdditionalDependencies) $(QTDIR)\lib;%(AdditionalLibraryDirectories) "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" %(AdditionalOptions) true true true $(OutDir)\tst_nco_c++.exe true Console true Unsigned None 0 _CONSOLE;UNICODE;WIN32;_CRT_SECURE_NO_WARNINGS;_CRT_NONSTDC_NO_DEPRECATE;ENABLE_NETCDF4;HAVE_NETCDF4_H;NEED_STRCASECMP;NEED_STRCASESTR;_DEBUG;%(PreprocessorDefinitions) nco-4.5.4/src/000077500000000000000000000000001264355130400130755ustar00rootroot00000000000000nco-4.5.4/src/.gitignore000066400000000000000000000001761264355130400150710ustar00rootroot00000000000000# Git-ignore patterns for ~/nco/src /Makefile # Created in all source sub-directories by configure->make test test-suite.log nco-4.5.4/src/Makefile.am000066400000000000000000000000731264355130400151310ustar00rootroot00000000000000# $Header$ -*-makefile-*- SUBDIRS = nco @NCO_CXX@ @NCOXX@ nco-4.5.4/src/Makefile.in000066400000000000000000000454121264355130400151500ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ ctags-recursive dvi-recursive html-recursive info-recursive \ install-data-recursive install-dvi-recursive \ install-exec-recursive install-html-recursive \ install-info-recursive install-pdf-recursive \ install-ps-recursive install-recursive installcheck-recursive \ installdirs-recursive pdf-recursive ps-recursive \ tags-recursive uninstall-recursive am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive am__recursive_targets = \ $(RECURSIVE_TARGETS) \ $(RECURSIVE_CLEAN_TARGETS) \ $(am__extra_recursive_targets) AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ distdir am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) am__DIST_COMMON = $(srcdir)/Makefile.in \ $(top_srcdir)/autobld/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) am__relativize = \ dir0=`pwd`; \ sed_first='s,^\([^/]*\)/.*$$,\1,'; \ sed_rest='s,^[^/]*/*,,'; \ sed_last='s,^.*/\([^/]*\)$$,\1,'; \ sed_butlast='s,/*[^/]*$$,,'; \ while test -n "$$dir1"; do \ first=`echo "$$dir1" | sed -e "$$sed_first"`; \ if test "$$first" != "."; then \ if test "$$first" = ".."; then \ dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \ dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \ else \ first2=`echo "$$dir2" | sed -e "$$sed_first"`; \ if test "$$first2" = "$$first"; then \ dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \ else \ dir2="../$$dir2"; \ fi; \ dir0="$$dir0"/"$$first"; \ fi; \ fi; \ dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \ done; \ reldir="$$dir2" ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = nco @NCO_CXX@ @NCOXX@ all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(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 # This directory's subdirectories are mostly independent; you can cd # into them and run 'make' without going through this Makefile. # To change the values of 'make' variables: instead of editing Makefiles, # (1) if the variable is set in 'config.status', edit 'config.status' # (which will cause the Makefiles to be regenerated when you run 'make'); # (2) otherwise, pass the desired values on the 'make' command line. $(am__recursive_targets): @fail=; \ if $(am__make_keepgoing); then \ failcom='fail=yes'; \ else \ failcom='exit 1'; \ fi; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-recursive TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-recursive CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-recursive cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done @list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ $(am__make_dryrun) \ || test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ dir1=$$subdir; dir2="$(distdir)/$$subdir"; \ $(am__relativize); \ new_distdir=$$reldir; \ dir1=$$subdir; dir2="$(top_distdir)"; \ $(am__relativize); \ new_top_distdir=$$reldir; \ echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \ echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \ ($(am__cd) $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$new_top_distdir" \ distdir="$$new_distdir" \ am__remove_distdir=: \ am__skip_length_check=: \ am__skip_mode_fix=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic clean-libtool mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive html-am: info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-dvi-am: install-exec-am: install-html: install-html-recursive install-html-am: install-info: install-info-recursive install-info-am: install-man: install-pdf: install-pdf-recursive install-pdf-am: install-ps: install-ps-recursive install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic mostlyclean-libtool pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(am__recursive_targets) install-am install-strip .PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \ check-am clean clean-generic clean-libtool cscopelist-am ctags \ ctags-am distclean 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-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \ ps ps-am tags tags-am uninstall uninstall-am .PRECIOUS: Makefile # 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: nco-4.5.4/src/cuda/000077500000000000000000000000001264355130400140115ustar00rootroot00000000000000nco-4.5.4/src/cuda/simpleTemplates.cu000066400000000000000000000061401264355130400175130ustar00rootroot00000000000000/* * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. * * NOTICE TO USER: * * This source code is subject to NVIDIA ownership rights under U.S. and * international Copyright laws. * * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE * OR PERFORMANCE OF THIS SOURCE CODE. * * U.S. Government End Users. This source code is a "commercial item" as * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of * "commercial computer software" and "commercial computer software * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) * and is provided to the U.S. Government only as a commercial end item. * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the * source code with only those rights set forth herein. */ /* This sample is a templatized version of the template project. * It also shows how to correctly templatize dynamically allocated shared * memory arrays. * Host code. */ // includes, system #include #include #include #include // includes, kernels #include "simpleTemplates_kernel.cu" #define BLOCKSIZE 256 template T* nco_cuda_var_add /* [fnc] Add first operand to second operand */ ( /* I [enm] netCDF type of operands */ const long size, /* I [nbr] Size (in elements) of operands */ const int has_mss_val, /* I [flg] Flag for missing values */ T mss_val, /* I [flg] Value of missing value */ T* op1, /* I [val] Values of first operand */ T* op2) /* I/O [val] Values of second operand on input, values of sum on output */ { /* Purpose: Add value of first operand to value of second operand and store result in second operand. Assume operands conform, are same type, and are in memory nco_var_add() does _not_ increment tally counter nco_var_add_tll_ncra() does increment tally counter */ /* Addition is currently defined as op2:=op1+op2 */ T* op_in_D, *op_out_D;GA cudaMalloc((void**)&op_in_D, sizeof(T)*size); cudaMalloc((void**)&op_out_D,sizeof(T)*size); cudaMemcpy(op_in_D, op1, sizeof(T)*size,cudaMemcpyHostToDevice); cudaMemcpy(op_out_D, op2, sizeof(T)*size,cudaMemcpyHostToDevice); uint gridsize=size%BLOCKSIZE ==0?size/BLOCKSIZE :size/BLOCKSIZE +1; uint blocksize=BLOCKSIZE; dim3 dimBlock(blocksize); dim3 dimGrid(gridsize); testKernel<<>>(op_in_D, op_out_D, size, mss_val, has_mss_val); cudaMemcpy(op2, op_out_D, sizeof(T)*size,cudaMemcpyDeviceToHost); return op2; } /* end nco_var_add() */ nco-4.5.4/src/cuda/simpleTemplates_kernel.cu000066400000000000000000000015331264355130400210540ustar00rootroot00000000000000 #ifndef _TEMPLATE_KERNEL_H_ #define _TEMPLATE_KERNEL_H_ #include //////////////////////////////////////////////////////////////////////////////// //! Simple test kernel for device functionality //! @param g_idata input data in global memory //! @param g_odata output data in global memory //////////////////////////////////////////////////////////////////////////////// template __global__ void testKernel( T* g_idata, T* g_odata,long size,T mss_val,int has_mss_val) { // access thread id const unsigned int tid = threadIdx.x+ blockDim.x*blockIdx.x; if(tidmake all /ncap2 nco-4.5.4/src/nco++/Invoke.cc000066400000000000000000000141621264355130400155500ustar00rootroot00000000000000/* Different version of calculator which parses command line arguments. To do this argv[] strings are first written to an ostringstream then an istringstream is constructed with string from the ostringstream and fed to lexer. */ // Define an anonymous enum containing parser tokens #include #include #include #include #include #include "ncoEnumTokenTypes.hpp" #include "libnco++.hh" #include "ncoLexer.hpp" #include "ncoParser.hpp" #include "ncoTree.hpp" #include #include #include "antlr/TokenStreamSelector.hpp" #include "Invoke.hh" #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() TokenStreamSelector selector; ncoLexer *lexer=NULL; ncoParser *parser=NULL; // Forward declaration int /* Evaluate expressions -execute nb - contains static members*/ ncap_omp_exe( std::vector< std::vector > &all_ast_vtr, ncoTree** wlk_ptr_in, int wlk_nbr_in) { int idx; int jdx; int kdx; int mdx; int lcl_sz; int nbr_sz; var_sct *var; RefAST tr; static int wlk_nbr; // Same as number of threads static ncoTree** wlk_ptr; ncoTree* wlk_lcl; std::vector inn_vtr; // Initialize statics then exit if( wlk_nbr_in > 0) { wlk_nbr=wlk_nbr_in; wlk_ptr=wlk_ptr_in; return 2; } // Set all symbol table refs to ntl_scn=false; for(idx=0;idxprs_arg->ntl_scn=False; // Each block has two lists // The first list is of the expressions that contain Lvalues which // are NOT defined in Output (nb this also applies to RAM vars) // The second list if of expressions that have all Lvalues defined in // output. for(idx=0 ; idx<(int)all_ast_vtr.size();idx+=2){ // even block for(jdx=0 ; jdx< (int)all_ast_vtr[idx].size();jdx++) (void)wlk_ptr[0]->statements(all_ast_vtr[idx][jdx]); nbr_sz=(int)all_ast_vtr[idx+1].size(); // odd block if(nbr_sz==0) continue; if(nbr_sz==1) { (void)wlk_ptr[0]->statements(all_ast_vtr[idx+1][0]); continue; } // do nc_sync() for all output threads (void)nco_sync(wlk_ptr[0]->prs_arg->out_id); for(mdx=0; mdxprs_arg->out_id_readonly); inn_vtr=all_ast_vtr[idx+1]; /* for(mdx=0; mdxnco_dupList(inn_vtr[mdx]); inn_vtr[mdx]=tr; } */ #ifdef _OPENMP #pragma omp parallel for default(none) private(kdx,wlk_lcl,var,tr) shared(wlk_ptr,idx,nbr_sz,inn_vtr ) #endif for(kdx=0 ;kdx< nbr_sz; kdx++) { wlk_lcl= wlk_ptr[omp_get_thread_num()]; tr=inn_vtr[kdx]; wlk_lcl->statements(tr); } //end OPENMP parallel loop // Copy all atts defined in thread in to var_vtr for(kdx=0; kdxprs_arg->thr_vtr; if(lcl_vtr.empty()) continue; lcl_sz=(int)lcl_vtr.size(); for(mdx=0 ; mdxprs_arg->var_vtr.push_ow(lcl_vtr[mdx]); lcl_vtr.clear(); } // do an nc_sync for all output threads (void)nco_sync(wlk_ptr[0]->prs_arg->out_id); for(mdx=0; mdxprs_arg->out_id_readonly); } // end for idx return 1; } /* end ncap_omp_exe() */ int parse_antlr(std::vector &prs_vtr,char *fl_spt_usr,char *cmd_ln_sng) { ANTLR_USING_NAMESPACE(std); ANTLR_USING_NAMESPACE(antlr); const std::string fnc_nm("parse_antlr"); // [sng] Function name int idx; int thd_nbr=(int)prs_vtr.size(); std::string filename(fl_spt_usr); prs_cls *prs_arg; istringstream *sin=NULL; ifstream *in=NULL; // ncoLexer *lexer=NULL; // ncoParser *parser=NULL; RefAST t,a; ASTFactory ast_factory; prs_arg=&prs_vtr[0]; std::vector wlk_vtr; // filename=strdup(fl_spt_usr); std::vector< std::vector > all_ast_vtr(0); try { if( cmd_ln_sng ){ sin= new istringstream(cmd_ln_sng); lexer= new ncoLexer( *sin, prs_arg); selector.addInputStream(lexer,cmd_ln_sng); selector.select(cmd_ln_sng); }else { in=new ifstream(filename.c_str()); lexer= new ncoLexer( *in, prs_arg); selector.addInputStream(lexer,filename); selector.select(filename); } lexer->setFilename(filename); parser= new ncoParser(selector); parser->setFilename(filename); parser->inc_vtr.push_back(filename); parser->initializeASTFactory(ast_factory); parser->setASTFactory(&ast_factory); // Parse the input expressions parser->program(); a = parser->getAST(); t=a; // Print parser tree if(nco_dbg_lvl_get() >= nco_dbg_scl){ dbg_prn(fnc_nm,"Printing parser tree..."); while( t ) { cout << t->toStringTree() << endl; t=t->getNextSibling(); } dbg_prn(fnc_nm,"Parser tree printed"); } // endif dbg } catch (RecognitionException& pe) { parser->reportError(pe); // bomb out nco_exit(EXIT_FAILURE); } catch (TokenStreamException& te) { cerr << te.getMessage(); // bomb out nco_exit(EXIT_FAILURE); } catch (CharStreamException& ce) { cerr << ce.getMessage(); // bomb out nco_exit(EXIT_FAILURE); } t=a; try { ncoTree* wlk_obj; for(idx=0 ; idx< thd_nbr; idx++){ wlk_obj=new ncoTree(&prs_vtr[idx]); wlk_obj->initializeASTFactory(ast_factory); wlk_obj->setASTFactory(&ast_factory); wlk_vtr.push_back(wlk_obj); } // initialize static members (void)ncap_omp_exe(all_ast_vtr,&wlk_vtr[0],thd_nbr); if(nco_dbg_lvl_get() >= nco_dbg_fl) dbg_prn(fnc_nm,"Walkers initialized"); wlk_vtr[0]->run_exe(t,0); } catch(std::exception& e) { cerr << "exception: " << e.what() << endl; } if(nco_dbg_lvl_get() >= nco_dbg_fl) dbg_prn(fnc_nm,"Walkers completed"); // delete walker pointers for(idx=0 ; idx<(int)wlk_vtr.size() ; idx++) delete wlk_vtr[idx]; delete lexer; delete parser; if(sin) delete sin; if(in) delete in; //(void)nco_free(filename); return 1; } /* end parse_antlr() */ nco-4.5.4/src/nco++/Invoke.hh000066400000000000000000000005171264355130400155610ustar00rootroot00000000000000#ifndef NCAP_INVOKE_HH #define NCAP_INVOKE_HH class ncoLexer; class ncoParser; // Define selector that handles nested include files // These variables are public so the parser/lexer can see them extern ANTLR_USE_NAMESPACE(antlr)TokenStreamSelector selector; extern ncoParser *parser; extern ncoLexer *lexer; #endif // NCAP_INVOKE_HH nco-4.5.4/src/nco++/Makefile.am000066400000000000000000000044731264355130400160460ustar00rootroot00000000000000# $Header$ -*-makefile-*- # Purpose: Template builds for nco++ directory # Process this file with automake to produce Makefile.in # ncap2 is only executable in this directory bin_PROGRAMS = ncap2 ANTLR = runantlr # ncolib_SOURCES includes all ../nco C-sources except for operator main() files # These are all built before nco++ # Invoke 'runantlr' on ncoGrammer.g to generate required hpp files #Invoke.cc : ncoGrammer.g #Invoke.o : ncoGrammer.g # ${ANTLR} ncoGrammer.g # fxm: Split off all sources except front-end into nco++ library ncap2_SOURCES = Invoke.cc \ ncap2.cc \ ncap2_utl.cc \ sdo_utl.cc \ sym_cls.cc \ fmc_cls.cc \ fmc_all_cls.cc \ fmc_gsl_cls.cc \ prs_cls.cc \ NcapVar.cc \ NcapVarVector.cc \ ncoLexer.cpp \ ncoParser.cpp \ ncoTree.cpp \ nco_gsl.c # 20150108 Be sure that netCDF in /usr/local takes precedence over GSL libraries in /usr # AKA be sure GSL in /usr does not cause ncap2 linker to search /usr before /usr/local NCO_AND_ANTLR_STUFF = -L../nco -lnco -lantlr #ncap2_LDADD = -lnco -lantlr # fxm: 20080515 Takeshi Enomoto reports that MACOSX needs # ncap2_LDADD = ../nco/.libs/libnco.dylib -lantlr # fxm: 20140730 Ed Anderson reports that PGI- and GCC-compiled ncap2 need # -Xcompiler -shared added to ncap2_LINK which, apparently, would be done with # ncap2_LDFLAGS = -Xcompiler -shared if ENABLE_GSL GSL_LIB_ARG = $(shell gsl-config --libs) GSL_INC_ARG = $(shell gsl-config --cflags) #ncap2_LDFLAGS = -L../nco ${GSL_LIB_ARG} ncap2_LDFLAGS = ${NCO_AND_ANTLR_STUFF} ${GSL_LIB_ARG} #AM_CPPFLAGS = -I./ -I../nco ${GSL_INC_ARG} AM_CPPFLAGS = -I./ -I../nco else #ncap2_LDFLAGS = -L../nco ncap2_LDFLAGS = ${NCO_AND_ANTLR_STUFF} AM_CPPFLAGS = -I./ -I../nco endif # 20060824: *.hpp and *.cpp files are now part of source tree # DISTCLEANFILES=ncoLexer.hpp ncoParser.hpp ncoParserTokenTypes.hpp ncoParserTokenTypes.txt ncoTree.hpp # CLEANFILES=ncap2 ncoLexer.hpp ncoParser.hpp ncoParserTokenTypes.hpp ncoParserTokenTypes.txt ncoTree.hpp DISTCLEANFILES=ncoParserTokenTypes.txt CLEANFILES=ncap2 ncoParserTokenTypes.txt # Configure automatigically includes following libraries as requested: # Keep list here as reminder: # ncap2: # -lnco++ -lnco -lnco_c++ -lantlr # OPeNDAP: # -lnc-dap -ldap -lxml2 -lcurl (Linux) # -lnc-dap -ldap -lxml2 -lcurl -lcrypto -liconv -lssl -lz (AIX) # netCDF4: # -lnetcdf -lhdf5 -lhdf5_hl # UDUnits: # -ludunits nco-4.5.4/src/nco++/Makefile.in000066400000000000000000000655431264355130400160640ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- # Purpose: Template builds for nco++ directory # Process this file with automake to produce Makefile.in VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = ncap2$(EXEEXT) subdir = src/nco++ ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" PROGRAMS = $(bin_PROGRAMS) am_ncap2_OBJECTS = Invoke.$(OBJEXT) ncap2.$(OBJEXT) \ ncap2_utl.$(OBJEXT) sdo_utl.$(OBJEXT) sym_cls.$(OBJEXT) \ fmc_cls.$(OBJEXT) fmc_all_cls.$(OBJEXT) fmc_gsl_cls.$(OBJEXT) \ prs_cls.$(OBJEXT) NcapVar.$(OBJEXT) NcapVarVector.$(OBJEXT) \ ncoLexer.$(OBJEXT) ncoParser.$(OBJEXT) ncoTree.$(OBJEXT) \ nco_gsl.$(OBJEXT) ncap2_OBJECTS = $(am_ncap2_OBJECTS) ncap2_LDADD = $(LDADD) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = ncap2_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(ncap2_LDFLAGS) $(LDFLAGS) -o $@ AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/autobld/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = $(ncap2_SOURCES) DIST_SOURCES = $(ncap2_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/autobld/depcomp \ $(top_srcdir)/autobld/mkinstalldirs DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ ANTLR = runantlr # ncolib_SOURCES includes all ../nco C-sources except for operator main() files # These are all built before nco++ # Invoke 'runantlr' on ncoGrammer.g to generate required hpp files #Invoke.cc : ncoGrammer.g #Invoke.o : ncoGrammer.g # ${ANTLR} ncoGrammer.g # fxm: Split off all sources except front-end into nco++ library ncap2_SOURCES = Invoke.cc \ ncap2.cc \ ncap2_utl.cc \ sdo_utl.cc \ sym_cls.cc \ fmc_cls.cc \ fmc_all_cls.cc \ fmc_gsl_cls.cc \ prs_cls.cc \ NcapVar.cc \ NcapVarVector.cc \ ncoLexer.cpp \ ncoParser.cpp \ ncoTree.cpp \ nco_gsl.c # 20150108 Be sure that netCDF in /usr/local takes precedence over GSL libraries in /usr # AKA be sure GSL in /usr does not cause ncap2 linker to search /usr before /usr/local NCO_AND_ANTLR_STUFF = -L../nco -lnco -lantlr #ncap2_LDADD = -lnco -lantlr # fxm: 20080515 Takeshi Enomoto reports that MACOSX needs # ncap2_LDADD = ../nco/.libs/libnco.dylib -lantlr # fxm: 20140730 Ed Anderson reports that PGI- and GCC-compiled ncap2 need # -Xcompiler -shared added to ncap2_LINK which, apparently, would be done with # ncap2_LDFLAGS = -Xcompiler -shared @ENABLE_GSL_TRUE@GSL_LIB_ARG = $(shell gsl-config --libs) @ENABLE_GSL_TRUE@GSL_INC_ARG = $(shell gsl-config --cflags) #ncap2_LDFLAGS = -L../nco @ENABLE_GSL_FALSE@ncap2_LDFLAGS = ${NCO_AND_ANTLR_STUFF} #ncap2_LDFLAGS = -L../nco ${GSL_LIB_ARG} @ENABLE_GSL_TRUE@ncap2_LDFLAGS = ${NCO_AND_ANTLR_STUFF} ${GSL_LIB_ARG} @ENABLE_GSL_FALSE@AM_CPPFLAGS = -I./ -I../nco #AM_CPPFLAGS = -I./ -I../nco ${GSL_INC_ARG} @ENABLE_GSL_TRUE@AM_CPPFLAGS = -I./ -I../nco # 20060824: *.hpp and *.cpp files are now part of source tree # DISTCLEANFILES=ncoLexer.hpp ncoParser.hpp ncoParserTokenTypes.hpp ncoParserTokenTypes.txt ncoTree.hpp # CLEANFILES=ncap2 ncoLexer.hpp ncoParser.hpp ncoParserTokenTypes.hpp ncoParserTokenTypes.txt ncoTree.hpp DISTCLEANFILES = ncoParserTokenTypes.txt CLEANFILES = ncap2 ncoParserTokenTypes.txt all: all-am .SUFFIXES: .SUFFIXES: .c .cc .cpp .lo .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 src/nco++/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/nco++/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || 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 ncap2$(EXEEXT): $(ncap2_OBJECTS) $(ncap2_DEPENDENCIES) $(EXTRA_ncap2_DEPENDENCIES) @rm -f ncap2$(EXEEXT) $(AM_V_CXXLD)$(ncap2_LINK) $(ncap2_OBJECTS) $(ncap2_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/Invoke.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NcapVar.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/NcapVarVector.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmc_all_cls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmc_cls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fmc_gsl_cls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap2_utl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncoLexer.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncoParser.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncoTree.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_gsl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/prs_cls.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sdo_utl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sym_cls.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cc.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cc.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cc.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(CXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCXX_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) 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-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 .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libtool cscopelist-am \ ctags ctags-am 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-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 tags-am uninstall uninstall-am uninstall-binPROGRAMS .PRECIOUS: Makefile # Configure automatigically includes following libraries as requested: # Keep list here as reminder: # ncap2: # -lnco++ -lnco -lnco_c++ -lantlr # OPeNDAP: # -lnc-dap -ldap -lxml2 -lcurl (Linux) # -lnc-dap -ldap -lxml2 -lcurl -lcrypto -liconv -lssl -lz (AIX) # netCDF4: # -lnetcdf -lhdf5 -lhdf5_hl # UDUnits: # -ludunits # 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: nco-4.5.4/src/nco++/Makefile.old000066400000000000000000001346371264355130400162350ustar00rootroot00000000000000# $Header$ -*-makefile-*- # Purpose: Makefile for NCO C++ directory nco++ # Requires GNU Make---AT&T Make chokes on GNU syntax # Copyright (C) 1994--2016 Charlie Zender # License: GNU General Public License (GPL) Version 3 # See http://www.gnu.org/copyleft/gpl.html for full license text # Quickie test copies: # scp ~/nco/src/nco++/Makefile.old dust.ess.uci.edu:nco/src/nco++ # scp ~/nco/src/nco++/Makefile.old esmf.ess.uci.edu:nco/src/nco++ # scp ~/nco/src/nco++/Makefile.old soot.ess.uci.edu:nco/src/nco++ # scp ~/nco/src/nco++/Makefile.old goldhill.cgd.ucar.edu:nco/src/nco++ # Usage: # cd ~/nco/src/nco++;make -f Makefile.old dpn_cln cln all # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=Y OMP=Y OPTS=D UDUNITS=Y all # givre, neige # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=Y OMP=Y OPTS=D UDUNITS=Y lib_cln cln ncap2 # givre, neige # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=N OMP=Y OPTS=D UDUNITS=Y all # virga # cd ~/nco/src/nco++;SZ_LIB=/sopt/lib make -f Makefile.old NETCDF4=Y OMP=Y OPTS=D SZ=Y UDUNITS=N all # greenplanet intel # cd ~/nco/src/nco++;ANTLR_ROOT=/sopt/gfortran_g++ NETCDF_ROOT=/sopt/gfortran_g++ SZ_LIB=/sopt/lib make -f Makefile.old NETCDF4=Y OMP=Y OPTS=D SZ=Y UDUNITS=N all # greenplanet gcc # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=Y OMP=N OPTS=D UDUNITS=Y all # ashes, elnino # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=N OMP=Y OPTS=D UDUNITS=N all # esmf # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=N OMP=Y OPTS=D UDUNITS=N all # silt # cd ~/nco/src/nco++;make -f Makefile.old NETCDF4=N OMP=N OPTS=D UDUNITS=N all # sand, clay, tephra # 64-bit ABI on UCI MPC systems: # cd ${HOME}/nco/src/nco++;env ANTLR='/software/antlr/bin/antlr' ANTLR_ROOT='/software/antlr' UDUNITS_INC='/software/udunits/include' UDUNITS_LIB='/software/udunits/lib' make -f Makefile.old --jobs=1 ABI=64 all;cd - # cd ${HOME}/nco/src/nco++;env ANTLR='/usr/local/pgi/bin/antlr' ANTLR_ROOT='/usr/local/pgi' make -f Makefile.old --jobs=1 ABI=64 all;cd - # 64-bit ABI netCDF3 on NCAR AIX systems (bluefire): # cd ${HOME}/nco/src/nco++;ANTLR='/contrib/antlr-2.7.7/bin/antlr' ANTLR_ROOT='/contrib/antlr-2.7.7' NETCDF_LIB='/usr/local/lib64/r4i4' UDUNITS_INC='/contrib/udunits-1.12.9/include' UDUNITS_LIB='/contrib/udunits-1.12.9/lib' make -f Makefile.old --jobs=1 ABI=64 OPTS=D NETCDF4=N UDUNITS=N all;cd - # 64-bit ABI netCDF4 on NCAR AIX systems (bluefire): # cd ${HOME}/nco/src/nco++;ANTLR='/contrib/antlr-2.7.7/bin/antlr' ANTLR_ROOT='/contrib/antlr-2.7.7' CURL_LIB='/contrib/curl/7.21.2/lib' GSL_INC='/contrib/gsl-1.12/include' GSL_LIB='/contrib/gsl-1.12/lib' GSL_MINOR_VERSION='12' HDF5_ROOT='/contrib/hdf5-1.8.7_seq' LDFLAGS='-lnetcdf -lhdf5_hl -lhdf5 -lz' NETCDF_ROOT='/contrib/netcdf/4.1.3_seq' SZ_LIB='/contrib/szip/lib' UDUNITS_LIB='/contrib/zlib/lib' make -f Makefile.old --jobs=1 ABI=64 OPTS=D SZ=Y all;cd - # # Cygwin on Windows Vista systems: # cd ~/nco/src/nco++;ANTLR='antlr' make -f Makefile.old GSL=Y OPTS=D NETCDF4=Y UDUNITS=Y all;cd - # NB: ncap2 requires ANTLR 2.7.7 headers and library # http://www.antlr.org # sudo apt-get install antlr libantlr-dev # sudo dnf install antlr-2.7.5-1.i586.rpm # In rule # foobar.o : foo.c bar.c # $@ is target = foobar.o # $< is first dependency = foo.c # $^ is name of all dependencies = foo.c bar.c # $* is stem of match, and so much more # Recursively expanded variables are defined with `=': # Values are installed verbatim and expanded when substitution occurs # Variable may be used before it is defined and expansion will be correct # However variable may not be modified (e.g., appended) after definition # Simply expanded variables are defined with `:=': # Values are immediately expanded at the time variable is defined # Variables must be defined before being used # Variables may be modified without causing infinite recursion # Top-level tokens defining directory structure # These tokens may be over-ridden by environment variables or when invoking make, e.g. make DODS=Y MY_BLD_DIR := ../../bld ifndef PVM_ARCH PVM_ARCH := $(shell ${MY_BLD_DIR}/pvmgetarch) endif ifndef MY_BIN_DIR MY_BIN_DIR := ../../bin endif ifndef MY_LIB_DIR MY_LIB_DIR := ../../lib endif ifndef MY_OBJ_DIR MY_OBJ_DIR := ../../obj endif ifndef MY_DAT_DIR MY_DAT_DIR := ../../data endif ifndef MY_INC_DIR MY_INC_DIR := ${HOME}/include endif ifndef MY_BLD_DIR MY_BLD_DIR := . endif ifndef MY_DOC_DIR MY_DOC_DIR := . endif ifndef MY_DPN_DIR MY_DPN_DIR := ${MY_OBJ_DIR} endif # Primary tokens which determine build options # Specify non-default when invoking make, e.g. make DODS=Y ifndef ${ABI} # 32- vs. 64-bit ABI: 32=32-bit mode (default), 64=64-bit mode if available ABI := 64 endif # endif ABI ifndef ANTLR ANTLR_WHICH := $(notdir $(shell which antlr)) ifeq (${ANTLR_WHICH},antlr) ANTLR := antlr else ANTLR := runantlr endif endif # endif ANTLR ifndef ANTLR_ROOT ANTLR_ROOT := /usr/local endif ifdef ANTLR_INC # Directory containing AST.hpp ANTLR_INC := -I${ANTLR_INC} else ANTLR_INC := -I${ANTLR_ROOT}/include endif ifdef ANTLR_LIB # Directory containing libantlr.a ANTLR_LIB := -L${ANTLR_LIB} -lantlr else ANTLR_LIB := -L${ANTLR_ROOT}/lib -lantlr endif ifndef ${CCACHE} CCACHE := N endif # CCACHE ifndef CNK # Use newer netCDF4.1 chunking API CNK := Y endif # endif CNK ifndef DAP DAP := Y endif # DAP ifndef ${DBG} # Debugging token N=No (default) Y=Yes DBG := N endif # endif DBG ifndef GCC_RCH_ARG GCC_RCH_ARG := endif # endif GCC_RCH_ARG ifndef GSL # Use GSL functionality GSL := Y endif # endif GSL ifndef I18N I18N := Y MY_SHR_DIR := ${HOME}/share MY_ES_DIR := ${MY_SHR_DIR}/locale/es/LC_MESSAGES MY_FR_DIR := ${MY_SHR_DIR}/locale/fr/LC_MESSAGES endif # endif I18N ifndef ICC_RCH_ARG ICC_RCH_ARG := endif # endif ICC_RCH_ARG ifndef MK_DPN MK_DPN = ${CPP} -M # NB: Recursive expansion required MK_DPN_CXX = ${CXX} -M # NB: Recursive expansion required endif # endif MK_DPN ifndef ${MPI} # MPI MPI := N endif # endif MPI ifndef ${MPI_FAKE} # MPI MPI_FAKE := N endif # endif MPI_FAKE ifndef ${NETCDF4} # netCDF4 support NETCDF4 := Y endif # endif NETCDF4 ifndef NETCDF_ROOT NETCDF_ROOT := /usr/local endif ifndef NETCDF4_ROOT NETCDF4_ROOT := ${NETCDF_ROOT} endif ifndef NETCDF_INC ifdef INC_NCAR NETCDF_INC := ${INC_NCAR} # NCAR module path else # endelse INC_NCAR NETCDF_INC := ${NETCDF_ROOT}/include # Directory containing netcdf.h endif # endif INC_NCAR endif # endif NETCDF_INC ifndef NETCDF_LIB ifdef LIB_NCAR NETCDF_LIB := ${LIB_NCAR} # NCAR module path else # endelse LIB_NCAR NETCDF_LIB := ${NETCDF_ROOT}/lib # Directory containing libnetcdf.a endif # endif LIB_NCAR endif # endif NETCDF_LIB ifndef ${OMP} # OpenMP OMP := N endif # endif OMP ifndef OPTS OPTS := D endif # endif OPTS ifndef ${PNETCDF} # pnetCDF support PNETCDF := N endif # endif PNETCDF ifndef ${PRC} # Precision token D=Double (default) S=Single PRC := S endif # endif PRC ifndef PVM_ARCH PVM_ARCH := $(shell ${HOME}/sh/pvmgetarch) endif ifndef STC # Created statically linked executable STC := N endif ifndef SZ # Link to Szip library SZ := N endif ifndef UDUNITS # Use UDUnits functionality UDUNITS := Y endif ifndef UNAMES UNAMES := $(shell uname -s) endif ifndef USR_TKN USR_TKN := -DABORT_ON_ERROR endif # endif USR_TKN ifndef VRS_SNG VRS_SNG := $(shell date +%Y%m%d) endif # endif VRS_SNG # Derived-tokens based on primary tokens # These tokens should not be altered by hand ifeq (${PRC},D) USR_TKN := -DPRC_DBL ${USR_TKN} else USR_TKN := -DPRC_FLT ${USR_TKN} endif # endif PRC # NB: CPP_TKN is recursively expanded variable, define only when components are ready CPP_TKN = ${USR_TKN} -D${PVM_ARCH} -DNO_NETCDF_2 -DVERSION='${VRS_SNG}' -DHOSTNAME='${HOST}' -DUSER='${USER}' -DNCO_ABORT_ON_ERROR ifndef LFLAGS # Flags for Flex (Lex) LFLAGS := -P${NCO_YY_PFX} endif ifndef YFLAGS # Flags for Bison (Yacc) YFLAGS := -d --name-prefix=${NCO_YY_PFX} endif # Internationalize NCO with i18n features ifeq (${I18N},Y) MY_SHR_DIR := ${HOME}/share MY_ES_DIR := ${MY_SHR_DIR}/locale/es/LC_MESSAGES MY_FR_DIR := ${MY_SHR_DIR}/locale/fr/LC_MESSAGES endif # Message Passing Interface (MPI) ifeq (${MPI_FAKE},Y) # MPI_FAKE instructs make to compile mpnc*.c operators without defining ENABLE_MPI # Resulting executables use UP or SMP code not MPI code # This tests compile, link, execution of MPI mpnc*.c code without using any MPI calls MPI := Y endif # !MPI_FAKE ifdef MPI_PRC # MPI_PRC tells test scripts how many MPI processes to spawn # Pass this MPI argument to nco_bm.pl MPI_PRC_SNG := "--mpi_prc=${MPI_PRC}" # MPI_PRC implies MPI MPI := Y else # !MPI_PRC MPI_PRC_SNG := endif # !MPI_PRC # PnetCDF implies MPI ifeq (${PNETCDF},Y) MPI := Y endif # !PNETCDF ifneq (${null},$(findstring LINUX,${PVM_ARCH})) # Decide among the plethora of Linux compilers ifndef LINUX_CXX # C++ compiler for Linux LINUX_CXX := g++ #LINUX_CXX := clang #LINUX_CXX := como #LINUX_CXX := icpc #LINUX_CXX := insure #LINUX_CXX := pathCC #LINUX_CXX := pgCC endif # endif LINUX_CXX ifndef LINUX_CC # C compiler for Linux LINUX_CC := gcc -std=c99 -pedantic -D_DEFAULT_SOURCE #LINUX_CC := clang #LINUX_CC := como --c99 #LINUX_CC := icc -std=c99 -D_DEFAULT_SOURCE #LINUX_CC := insure #LINUX_CC := nvcc #LINUX_CC := pathcc -std=c99 #LINUX_CC := pgcc -c9x endif # endif LINUX_CC ifndef LINUX_FC # Fortran compiler for Linux #LINUX_FC := g95 LINUX_FC := gfortran #LINUX_FC := ifort #LINUX_FC := lf95 #LINUX_FC := pathf95 #LINUX_FC := pgf90 endif # endif LINUX_CC endif # endif LINUX # OpenMP ifeq (${OMP},Y) ifdef THR_NBR # Pass this OpenMP argument to nco_bm.pl THR_NBR_SNG := "--thr_nbr=${THR_NBR}" else # endif THR_NBR THR_NBR_SNG := endif # endif THR_NBR endif # endif OMP ifeq (${RPM},Y) # rpm command, and thus RPM variables only guaranteed in RedHat Linux # Use recursive expansion so rpm command is not executed on non-RPM systems MDL_RPM_NST_NM = $(shell rpm -qa | grep nco-) # Name of installed package # MDL_RPM_PRV_NM = $(shell rpm -qp foo) # Name of package provided by specified RPM endif # endif RPM ifeq (${PVM_ARCH},WIN32) BNR_SFX := .exe else BNR_SFX := ${null} endif ifeq (${GSL},Y) # Build GSL-enabled NCO # Place GSL block after DAP blocks for both to work together ifdef GSL_INC GSL_INC_FLG := -I${GSL_INC} else GSL_INC_FLG := $(shell gsl-config --cflags) endif # endif GSL_INC ifdef GSL_LIB GSL_LIB_FLG := -L${GSL_LIB} -lgsl else GSL_LIB_FLG := $(shell gsl-config --libs) endif # endif GSL_LIB ifndef GSL_MINOR_VERSION GSL_MINOR_VERSION := $(shell gsl-config --version | sed s/^[1-9]\.// ) ifeq (${GSL_MINOR_VERSION},${null}) GSL_MINOR_VERSION := 4 endif # end if GSL_MINOR_VERSION endif # endif GSL_MINOR_VERSION endif # end if GSL ifeq (${SZ},Y) # 20150515: -lsz needed (at least by icc) on rhea ifdef SZ_LIB SZ_LIB_FLG := -L${SZ_LIB} -lsz else SZ_LIB_FLG := -lsz endif # end if SZ_LIB endif # end if SZ ifeq (${UDUNITS},Y) # 20130607: -lexpat needed on .deb systems, not on RPM systems ifdef UDUNITS_INC UDUNITS_INC_FLG := -I${UDUNITS_INC} else UDUNITS_INC_FLG := -I/usr/include/udunits2 endif # endif UDUNITS_INC ifdef UDUNITS_LIB UDUNITS_LIB_FLG := -L${UDUNITS_LIB} -ludunits2 else UDUNITS_LIB_FLG := -ludunits2 endif # end if UDUNITS_LIB endif # end if UDUNITS # At this point we change NETCDF_INC from a directory to a flag NC_CFLAGS := $(shell ${NETCDF_ROOT}/bin/nc-config --cflags) NC_LDFLAGS := $(shell ${NETCDF_ROOT}/bin/nc-config --libs) NCO_LDFLAGS := -L${MY_LIB_DIR} -lnco -lnco++ ifeq (${PNETCDF},Y) # Enable pnetCDF functionality NC_CFLAGS := $(shell /usr/local/parallel/bin/nc-config --cflags) NC_LDFLAGS := $(shell /usr/local/parallel/bin/nc-config --libs) MPI_CFLAGS := -I/usr/include/openmpi-x86_64 MPI_LDFLAGS := -L/usr/lib64/openmpi/lib -lmpi endif # endif PNETCDF ifdef LIB_NCAR NC_LDFLAGS := ${LIB_NCAR} ${NC_LDFLAGS} endif OTHER_CFLAGS := ${NC_CFLAGS} ${MPI_CFLAGS} ${GSL_INC_FLG} ${UDUNITS_INC_FLG} ${ANTLR_INC} OTHER_LDFLAGS := ${NCO_LDFLAGS} ${NC_LDFLAGS} ${MPI_LDFLAGS} ${GSL_LIB_FLG} ${SZ_LIB_FLG} ${UDUNITS_LIB_FLG} ${ANTLR_LIB} # NB: Do NOT add comment lines, e.g., # This is a comma, to character definitions null := space := ${null} ${null} comma := , newline := \n # We replace `/' by `cszzsc', call perl, then replace `cszzxc' by `/' # Unique character(s) to substitute for ${slash} before passing to perl regex slash_rx := cszzsc # Unique character(s) to replace by ${slash_rx} before passing to perl regex slash := / MY_OBJ_DIR_RX := $(subst ${slash},${slash_rx},${MY_OBJ_DIR}) MY_DPN_DIR_RX := $(subst ${slash},${slash_rx},${MY_DPN_DIR}) # Automagically generated grammar NCAP2_ANTLR_GENERATED_CC_STB := ncoLexer ncoParser ncoTree NCAP2_ANTLR_GENERATED_HH_STB := ${NCAP2_ANTLR_GENERATED_CC_STB} ncoParserTokenTypes NCAP2_ANTLR_GENERATED_CC := $(addsuffix .cc, $(basename ${NCAP2_ANTLR_GENERATED_CC_STB})) NCAP2_ANTLR_GENERATED_CPP := $(addsuffix .cpp, $(basename ${NCAP2_ANTLR_GENERATED_CC_STB})) NCAP2_ANTLR_GENERATED_HH := $(addsuffix .hh, $(basename ${NCAP2_ANTLR_GENERATED_HH_STB})) NCAP2_ANTLR_GENERATED_HPP := $(addsuffix .hpp, $(basename ${NCAP2_ANTLR_GENERATED_HH_STB})) NCAP2_ANTLR_GENERATED_OBJ := $(addprefix ${MY_OBJ_DIR}/,$(addsuffix .o, $(basename ${NCAP2_ANTLR_GENERATED_CC_STB}))) NCAP2_ANTLR_GENERATED_TXT := # Directories to search for source files MDL_PTH := ./ ${MY_SRC_DIR} # Find all C and C++ files in given directory FIND_FNC = $(wildcard ${dir}/*.cc ${dir}/*.c) # Assemble source files from all directories SRC_LST = $(foreach dir, ${MDL_PTH},$(FIND_FNC)) # Source file names with directories removed MDL_SRC := $(notdir $(SRC_LST)) ${NCAP2_ANTLR_GENERATED_CPP} # Directories to search for source files MDL_PTH := . ../nco # Dependency list for executable MDL_OBJ := $(addprefix ${MY_OBJ_DIR}/,$(addsuffix .o, $(basename ${MDL_SRC}))) # Dependency (make) file for each object file MDL_DPN := $(addprefix ${MY_DPN_DIR}/,$(addsuffix .d, $(basename ${MDL_SRC}))) # VPATH helps make find dependencies (which are not pathname qualified) in *.d file VPATH := $(subst ${space},:,${MDL_PTH}) # Prepend -I to use for compiler argument CPP_PTH := $(foreach dir,${MDL_PTH},-I${dir}) # Variables having to do with binary executables created by module MDL_BIN_TRG := ncap2 # Binary targets MDL_BIN_SYM_LNK := # Symbolic links MDL_BIN_STB := ${MDL_BIN_TRG} ${MDL_BIN_SYM_LNK} # All C++ files in MY_BIN_DIR MDL_BIN := $(addprefix ${MY_BIN_DIR}/,${MDL_BIN_STB}) # dst_cln removes these files # Variables having to do with header files created by module # List header targets alphabetically by "category": MDL_INC_TRG := # Raw (no functions) MDL_INC_TRG += # libnco++ MDL_INC_SYM_LNK := # Symbolic links MDL_INC_STB = ${MDL_INC_TRG} ${MDL_INC_SYM_LNK} # All header files in ${MY_INC_DIR} MDL_INC = $(addprefix ${MY_INC_DIR}/,${MDL_INC_STB}) # dst_cln removes these files # Redefine default C and C++ pattern rules ${MY_OBJ_DIR}/%.o : %.c ${CC} ${CPPFLAGS} ${CFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/%.o : %.cc ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/%.o : %.cpp ${CXX} ${CPPFLAGS} ${CXXFLAGS} -c $< -o ${MY_OBJ_DIR}/$(notdir $@) # Default Fortran pattern rules: CRAY and RS6K must override these rules ${MY_OBJ_DIR}/%.o : %.F ${FC} -c ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< # Rules for installing header files ${MY_INC_DIR}/%.h : %.h cp -f -p $(notdir $@) $@ ${MY_INC_DIR}/%.hh : %.hh cp -f -p $(notdir $@) $@ # Rules for installing i18n files %.po : %.cc xgettext --default-domain=$* --join-existing $< ${MY_ES_DIR}/%.mo : %.po # Linux version accepts more arguments than Solaris version # msgfmt --output-file=$@ --statistics $< msgfmt -o $@ $< # Automatically generate a dependency file for each source file # $* is the stem, e.g., f # $@ is the filename of the target, e.g., f.d # Linux gcc may return an extra `.F' on Fortran names, e.g., `hello.F.o: hello.F' # (.F)? gets rid of this extran `.F' ${MY_DPN_DIR}/%.d : %.F # Following command makes, e.g., f.d begin "f.o f.d : f.F ..." # Since f.o is not preceded by ${MY_OBJ_DIR}, objects are not recompiled when sources are touched. # ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.F\.o/$*.o $@/g;' > $@ # Following command makes, e.g., f.d begin "/home/zender/obj/LINUX/f.o f.d : f.F ..." # This works fairly well, but is a hack # First pattern substitutes MY_OBJ_DIR_RX, which has placeholders for slashes # Second pattern substitutes slashes for the placeholders ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*(\.F)?\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ # Following command makes, e.g., f.d begin "${MY_OBJ_DIR}/f.o f.d : f.F ..." # This would be the ideal command but I cannot get dollar sign to cooperate # ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.F\.o/\${dollar}MY_OBJ_DIR\/$*.o $@/g;' > $@ ${MY_DPN_DIR}/%.d : %.f ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ ${MY_DPN_DIR}/%.d : %.c # ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/$*.o $@/g;' > $@ ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ ${MY_DPN_DIR}/%.d : %.cc # NB: Use ${CXX} rather than ${CPP} on C++ files for now because, e.g., SUNMP cpp does not # preprocess .cc files quite correctly # ${CPP} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/$*.o $@/g;' > $@ ${CXX} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ ${MY_DPN_DIR}/%.d : %.cpp ${CXX} -M ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ # First LDFLAGS is for typical C programs with netCDF, math, and networking # Second LDFLAGS enables C/Fortran linking # Manually define autotools tokens normally defined in HAVE_CONFIG_H # Initialize OS-specific tokens to empty CPP_TKN_OS := CPP_TKN_OS := -DHAVE_REGEX_H -DNCO_HAVE_REGEX_FUNCTIONALITY ifneq (${PVM_ARCH},CRAY) CPP_TKN_OS += -DHAVE_MKSTEMP endif # CRAY ifneq (${null},$(findstring ${PVM_ARCH},FREEBSDLINUXALPHALINUXAMD64LINUXARMMACOSXWIN32)) CPP_TKN_OS += -DHAVE_GETOPT_H -DHAVE_GETOPT_LONG endif # !LINUX ifneq (${null},$(findstring ${PVM_ARCH},AIXSGIMP64)) CPP_TKN_OS += -DNEED_GETOPT_LONG endif # !(AIX || SGI) ifneq (${null},$(findstring AIX,${PVM_ARCH})) # Visual age compiler headers must occur before g++ headers CPP_TKN_OS += -I/usr/vacpp/include endif # AIX ifeq (${CNK},Y) CPP_TKN_OS += -DHAVE_NEW_CHUNKING_API endif # !CNK ifeq (${DAP},Y) CPP_TKN_OS += -DENABLE_DAP endif # !DAP ifeq (${GSL},Y) CPP_TKN_OS += -DENABLE_GSL -DHAVE_GSL_H -DNCO_GSL_MINOR_VERSION='${GSL_MINOR_VERSION}' endif # !GSL ifeq (${MPI},Y) ifneq (${MPI_FAKE},Y) CPP_TKN_OS += -DENABLE_MPI endif # MPI_FAKE endif # !MPI ifeq (${UDUNITS},Y) CPP_TKN_OS += -DENABLE_UDUNITS -DHAVE_UDUNITS_H -DHAVE_UDUNITS2_H endif # !UDUNITS ifeq (${null},$(findstring SGI,${PVM_ARCH})) CPP_TKN_OS += -DHAVE_CSTDLIB endif # SGI ifeq (${NETCDF4},Y) CPP_TKN_OS += -DENABLE_NETCDF4 -DHAVE_NETCDF4_H endif # endif NETCDF4 ifeq (${PNETCDF},Y) CPP_TKN_OS += -DENABLE_PNETCDF endif # !PNETCDF # endif PNETCDF # Works on AIX and AIX46K ifneq (${null},$(findstring AIX,${PVM_ARCH})) # 20030804: Always use re-entrant (_r) compilers---Jim Edwards NCAR/IBM CC := xlc_r -qlanglvl=extc99 #CC := gcc -std=c99 -pedantic -D_BSD_SOURCE -D_POSIX_SOURCE CXX := xlC_r # CXX := g++ # fxm: 20040311 should this be cpp? gcc -M? CPP := xlc -c -qlanglvl=extc99 ifneq (${null},$(findstring xl,${CC})) # Visual Age compiler headers must occur before g++ headers CPP_TKN_OS += -I/usr/vacpp/include endif # xlC compilers # Add /usr/local/include for libintl.h explicitly until netCDF is moved there CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} -I/usr/local/include FC := xlf95_r LD := ld LDFLAGS += ${OTHER_LDFLAGS} LEX := flex LINT := lint YACC := bison # AIX VA Compiler Collection ifneq (${null},$(findstring xl,${CC})) # Visual Age compiler defaults specified in /etc/vac.cfg # Additional switch to fix compiler warnings on csz.c # -qarch=auto : Automatically detect architecture of compiling machine and assume execution on same machine # -qlonglong allow long long integers (and strtoll(), strtoull()) (default off in C++) # -qmaxmem=num Limit memory used by space intensive optimizations to kilobytes # -qspill=size Size in B of register allocation spill area, mie needs > 1040 B # -qsrcmsg prints transgressing source line with finger # -qsuppress=1501-245 : Suppress RLIM_INFINITY memory message due to ulimits # -qtune=auto : Optimize executable for architecture detected during compilation CFLAGS := -qlonglong -qmaxmem=8192 -qspill=2048 -qsrcmsg -qsuppress=1501-245 FFLAGS := -NS2000 -qfixed=132 # -bh:5 suppresses annoying messages from xlC linker WARNING: Duplicate symbol: ... LDFLAGS += -bh:5 #LDFLAGS += -lxlf90 # Required for linking Fortran objects ifeq (${OMP},Y) # -qsmp=noauto : Turn on SMP/OMP code generation but do no automatic parallelization # -qsmp=omp : Use industry standard OMP without IBM extensions OMP_FLG_C := -qsmp=omp OMP_FLG_F := -qsmp=omp else CPP_DFN += -U_OPENMP FC := xlf95 endif # endif OMP ifeq (${OPTS},O) # -O : -O3 is safe, -O5 is dangerous # -qstrict: Ensure that -O3 optimizations do not alter program semantics # -Q : Inline all appropriate subprograms CFLAGS += -O3 -qstrict -Q FFLAGS += -O3 -qstrict -Q endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS += -g endif ifeq (${OPTS},X) # -qflttrap generates instructions for floating point exceptions # -qidirfirst uses headers found in -I directories first # -qmakedep creates .d file # -qwarn64 check for possible long-to-integer or pointer-to-integer truncation # -qhalt=e stop compiler if error severity equals or exceeds i, w, e, s, u CFLAGS += -g -qflttrap -qidirfirst -qwarn64 -qcheck=all -qhalt=s FFLAGS += -g endif ifeq (${ABI},64) AR := ar -X 64 CFLAGS += -q64 FFLAGS += -q64 LDFLAGS += -q64 else CPPFLAGS += -D_LARGE_FILES endif # endif ABI # Additional flags for AIX: # -M Generate information to be included in a "make" description file; output goes to .u file # -c Do not send object files to the linkage editor # -P Preprocess but do not compile; output goes to .i file # Using -P causes additional warning messages about lm # Not using -P causes *.o files to be created twice ${MY_DPN_DIR}/%.d : %.c ${MK_DPN} ${CPPFLAGS} $< ;perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' $*.u > $@ ; \ rm -f $*.i $*.o $*.u; ${MY_DPN_DIR}/%.d : %.cc ${MK_DPN} ${CPPFLAGS} $< ;perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' $*.u > $@ ; \ rm -f $*.i $*.o $*.u; endif # endif AIX VA Compiler Collection # GNU Compiler Collection ifeq (${CXX},g++) CFLAGS := -Wall -Wunused ifeq (${OPTS},O) CFLAGS += -O -g ${GCC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -O LDFLAGS += /usr/local/lib/ccmalloc-g++.o -L/usr/local/lib -lccmalloc -ldl endif ifeq (${ABI},64) CC += -maix64 CXX += -maix64 endif # endif ABI CXXFLAGS := ${CFLAGS} endif # endif GNU Compiler Collection # -q64: Select 64-bit compiler mode (required for accessing large files) # -qwarn64: Warn on possible long-to-integer or pointer-to-integer truncation CXXFLAGS := ${CFLAGS} ifeq (${OMP},Y) CFLAGS += ${OMP_FLG_C} CXXFLAGS += ${OMP_FLG_C} FFLAGS += ${OMP_FLG_F} # LD behavior assumes C source code LDFLAGS := ${OMP_FLG_C} ${LDFLAGS} endif # endif OMP endif # endif AIX ifeq (${PVM_ARCH},ALPHA) ifeq (${OMP},Y) OMP_FLG := -omp endif # endif OMP CXX := cxx -std strict_ansi #CXX := cxx -std ansi -D__NO_USE_STD_IOSTREAM CC := cc CFLAGS := ${OMP_FLG} # OSF1 is for CCM compatibility CPPFLAGS += ${CPP_TKN} ${CPP_TKN_OS} -DOSF1 ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 FFLAGS := -c ${OMP_FLG} -automatic -fpe3 FIXEDFLAGS := -extend_source FREEFLAGS := -DHIDE_SHR_MSG -free LD := ld LDFLAGS += ${OMP_FLG} ${OTHER_LDFLAGS} LEX := flex LINT := lint YACC := bison ifeq (${PRC},D) FFLAGS += -r8 -i4 endif ifeq (${OPTS},O) CFLAGS += -O2 -ansi_alias FFLAGS += -O3 -inline speed endif ifeq (${OPTS},D) CFLAGS += -g -check_bounds -check -check_omp FFLAGS += -g3 -C endif ifeq (${OPTS},X) CFLAGS := -g -N 132 FFLAGS := -g -check bounds -check omp_bindings -check overflow -check underflow endif CXXFLAGS := ${CFLAGS} ${MY_OBJ_DIR}/%.o : %.F90 ${FC} -c ${FREEFLAGS} ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< ${MY_OBJ_DIR}/%.o : %.F ${FC} -c ${FIXEDFLAGS} ${FFLAGS} ${CPPFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< endif # endif ALPHA ifeq (${PVM_ARCH},CRAY) CXX := g++ CC := cc CPP := cpp CPPFLAGS += ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 LD := ld LDFLAGS += ${OTHER_LDFLAGS} LDFLAGS += -L/lib -lf LEX := lex LINT := lint YACC := yacc ifeq (${OPTS},O) CFLAGS += -O FFLAGS := -N 132 endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS := -g -N 132 endif ifeq (${OPTS},X) CFLAGS += -g -N 132 FFLAGS := -g -N 132 -e i endif # 1997/10/21 Added -P to suppress #line # directives on Fortran files ${MY_OBJ_DIR}/%.o : %.F ${CPP} -P ${CPPFLAGS} $< > $(patsubst %.F,%.f,$(notdir $<)) ${FC} -c ${FFLAGS} $(patsubst %.F,%.f,$(notdir $<)) -mv -f $(notdir $@) ${MY_OBJ_DIR} rm -f $(patsubst %.F,%.f,$(notdir $<)) ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} $< mv -f $(notdir $@) ${MY_OBJ_DIR} endif # endif CRAY # Works on LINUX, LINUXALPHA, LINUXAMD64, LINUXARM, and FREEBSD and MACOSX ifneq (${null},$(findstring ${PVM_ARCH},LINUXALPHALINUXAMD64LINUXARMFREEBSDMACOSX)) CXX := ${LINUX_CXX} CC := ${LINUX_CC} CPP := ${CXX} # HAVE_INLINE is GNU standard to activate inline functions (used by GSL) CPPFLAGS += ${CPP_TKN} ${CPP_TKN_OS} -DHAVE_INLINE ${CPP_PTH} ${OTHER_CFLAGS} FC := ${LINUX_FC} LD := ld LDFLAGS += ${OTHER_LDFLAGS} ifeq (${PVM_ARCH},MACOSX) LDFLAGS += -lresolv endif # endif MACOSX LEX := flex LINT := lint YACC := bison # Comeau C Compiler ifeq (${CXX},como) CFLAGS := LDFLAGS := ${COMOROOT}/libcomo/libcomo.a ${LDFLAGS} ifeq (${OPTS},O) CFLAGS += -O endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g endif CXXFLAGS := ${CFLAGS} endif # endif Comeau C Compiler # GNU Compiler Collection or LLVM # 20140204: gcc and clang should receive identical options ifeq (g++,$(firstword ${CXX})) GCC_OR_CLANG := Y endif ifeq (clang,$(firstword ${CXX})) GCC_OR_CLANG := Y endif ifeq (${GCC_OR_CLANG},Y) CPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE CFLAGS := -Wno-unused-variable # Compilation flags for numerical routines recommended by GSL 1.3 manual, p. 397 CFLAGS += -Wall -W -Wshadow -Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -fno-common -g -O4 # Compilation flags recommended by GSL that I like and use: # -D_BSD_SOURCE: Support 4.3 BSD Unix extensions to ANSI C (prevents nameser.h warnings) # -D_POSIX_SOURCE: Support POSIX.1 standard additions to ANSI C (prevents fileno warnings) # -pedantic: Disallow non-ISO constructs (including type long long) (sometimes useful) # -W: Extra warnings, including missing return values, comparison of signed with unsigned # -Wall: Warn about common programming problems # -Wcast-align: Warn if casting pointer to type of different size # -Wcast-qual: Warn if const qualifier removed from pointer # -Werror: Consider warnings as errors # -Wmissing-prototypes: Warn if missing prototypes # -Wpointer-arith: Warn if pointer arithmetic on types without size, e.g., void # -Wshadow: Warn if local variable has same name as other local variable # -Wunused: Warn on unused functions, labels, parameters, values, and variables # -Wwrite-strings: Apply const-qualifier to string constants, die if overwritten # -fno-common: Prevent global variables from being simultaneously defined in different files # -g: Put debugging symbols in executable # -O4: Turn on optimization so uninitialized variables are flagged # Compilation flags recommended by GSL that I do not like and do not use: # -ansi: Support only strict ANSI C. Equivalent to -std=c89, conflicts with -std=c99 # --no-alias? -fstrict-aliasing # -Waggregate-return: Warn if functions return aggregates like structures or unions # -Wconversion: Warn if converting signed to unsigned. Intended for obsolete, non-prototyped code. Triggers fabsf(), sqrtf(), warnings. # -Wnested-externs: Warn if extern is encountered within function. C only? # -Wstrict-prototypes: Warn if inconsistent prototypes. C only? # -Wtraditional: Warn if constructs differ between traditional and ANSI C. C only? # -Dinline=: inline is not an ANSI keyword, must undefine inline to work with -ansi # -fshort-enums: Make enums as short as possible, ususally non-int. Do not ever invoke this! This breaks ABI and causes subtle problems ifeq (${OMP},Y) ifneq (clang,$(firstword ${CXX})) # 20140526 clang does not recognize/utilize -fopenmp OMP_FLG_C := -fopenmp OMP_FLG_F := -fopenmp LDFLAGS += -lgomp -lpthread endif # endif clang endif # endif OMP ifeq (clang,$(firstword ${CXX})) # 20140531 avoid clang error that -O4 is ame as -O3 CFLAGS := $(subst -O4,-O3,${CFLAGS}) LDFLAGS += -lstdc++ endif # endif clang ifeq (${OPTS},O) CFLAGS += -O -g ${GCC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -O endif ifneq (${null},$(findstring AMD64,${PVM_ARCH})) ifeq (${ABI},64) CFLAGS += -m64 FFLAGS += -m64 LDFLAGS += -m64 endif # endif ABI endif # endif LINUXAMD64 CXXFLAGS := ${CFLAGS} endif # endif GNU Compiler Collection or LLVM # Intel (Kai) C++ Compiler ifeq (icpc,$(firstword ${CXX})) # -cxxlib-gcc: link using C++ run-time libraries provided with GCC (default) (generated code is binary compatible with g++) # -lcprts : Eliminates most undefined references when linking with -cxxlib-gcc # -cxxlib-icc: link using C++ run-time libraries provided by Intel (generated code is not binary compatible with g++) # -fast: enable -xP -O3 -ipo -static # -ipo[n]: enable multi-file IP optimizations (between files) # -no-gcc: do not define __GNUC__, __GNUC_MINOR__, and __GNUC_PATCHLEVEL__ macros # -static: prevents linking with shared libraries # -std=c99: Enable C99 support for C programs # -aX: generate generic IA32 code and code specialized for processors specified by where codes are one or more of following: # B: Intel Pentium M and compatible Intel processors # K: Intel Pentium III and compatible Intel processors # N: Intel Pentium 4 and compatible Intel processors # P: Intel Pentium 4 processors with SSE3 extensions # W: Intel Pentium 4 and compatible Intel processors # -x: same as -aX only no generic code, run exclusively on # -Wall: enable all warnings # -Werror:force warnings to be reported as errors # -w0: display errors (same as -w) # -w1: display warnings and errors (DEFAULT) # -w2: display remarks, warnings, and errors # -wd[,,...] disable diagnostics L1 through LN # remark #981: operands are evaluated in unspecified order # remark #810: conversion from "double" to "float" may lose significant bits # remark #1572: floating-point equality and inequality comparisons are unreliable CFLAGS := -w1 CPPFLAGS += -I${IA32ROOT}/include -I${IA32ROOT}/include/c++ LDFLAGS := -L${IA32ROOT}/lib ${LDFLAGS} -lsvml OMP_FLG_C := -openmp -openmp_report0 ifeq (${OPTS},O) CFLAGS += -O3 -g ${ICC_RCH_ARG} endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -Wall -wd810,981,1572 -inline_debug_info endif CXXFLAGS := ${CFLAGS} endif # endif Intel (Kai) C++ Compiler # Intel (Kai) Fortran Compiler ifeq (${FC},ifort) # -132: specify 132 column lines for fixed form sources (same as -extend_source) # -axW: generate generic IA32 code and specialized code exclusively for Pentium 4 processors (requires linking to libsvml.a) # -fast: enable -xP -O3 -ipo -static # -fpconstant: extend precision of single precision constants assigned to double precision variables to double precision # -fpp2: necessary, but not sufficient, for OpenMP # -ftz: enable/disable flush denormal results to zero # -ip: enable single-file IP optimizations # -ipo: enable multi-file IP optimizations # -module: specifies path to place .mod files # -mp: maintain floating point precision (disables some optimizations) (deprecated 20090129) # -nus: do not append an underscore to external subroutine names # -vec_report1: indicate vectorized loops (DEFAULT) # -tune pn4: optimize for Pentium(R) 4 processor (DEFAULT) # -us: append an underscore to external subroutine names # -vms: enable VMS and DEC statement extensions # -w95: supress warnings for non-standard fortran (which includes OpenMP) FFLAGS := -extend_source -fpconstant -fpp2 -implicitnone -w95 # -lsvml needed with -[a]xW LDFLAGS_F += -lsvml OMP_FLG_F := -openmp ifeq (${PRC},D) FFLAGS += -i4 -r8 else FFLAGS += -i4 endif ifeq (${OPTS},O) FFLAGS += -O3 -g -vec_report1 -ftz ${ICC_RCH_ARG} endif ifeq (${OPTS},D) FFLAGS += -g endif ifeq (${OPTS},R) FFLAGS += endif ifeq (${OPTS},X) # -C: extensive runtime diagnostics # -e95 issues warnings for non-standard fortran (which includes OpenMP) FFLAGS += -g -C -e95 endif endif # end Intel (Kai) Fortran Compiler # Portland Group C++ Compiler ifeq (${CXX},pgCC) # Enable Large File Support (LFS) by default CFLAGS := -Mlfs LDFLAGS += -Mlfs # 20061127: pgCC does not support exception handling with codes compiled with OpenMP (-mp) switch so ncap2/antlr files must be built serially OMP_FLG_C := -mp # OMP_FLG_C := ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},O) CFLAGS += -fast endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -Mbounds endif CXXFLAGS := ${CFLAGS} endif # endif Portland Group C++ Compiler # Portland Group Fortran Compiler ifeq (${FC},pgf90) FFLAGS := -Mextend -Mnosecond_underscore -byteswapio -Mrecursive -Mdalign -Ktrap=fp -Mlfs OMP_FLG_F := -mp ifeq (${PRC},D) FFLAGS += -Mr8 -Mi4 endif ifeq (${OPTS},O) FFLAGS += -fast endif ifeq (${OPTS},D) FFLAGS += -g endif ifeq (${OPTS},R) FFLAGS += endif ifeq (${OPTS},X) FFLAGS += -g -Mbounds endif endif # endif Portland Group Fortran Compiler # G77 Fortran compiler ifeq (${FC},g77) FFLAGS := -ffixed-line-length-132 -fno-second-underscore ifeq (${OPTS},O) FFLAGS += -O endif ifeq (${OPTS},D) FFLAGS += -g -fdebug-kludge endif ifeq (${OPTS},R) FFLAGS += -fdebug-kludge endif ifeq (${OPTS},X) FFLAGS := -g -O -fdebug-kludge -fbounds-check endif endif # endif G77 Fortran compiler ifeq (${OMP},Y) CFLAGS += ${OMP_FLG_C} CXXFLAGS += ${OMP_FLG_C} FFLAGS += ${OMP_FLG_F} # LD behavior assumes C source code LDFLAGS := ${OMP_FLG_C} ${LDFLAGS} endif # endif OMP endif # endif LINUX, LINUXALPHA, LINUXAMD64, LINUXARM, and FREEBSD and MACOSX ifeq (${PVM_ARCH},MACOSXOLD) CXX := c++ CC := cc CFLAGS := -Wall CPP := ${CC} CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lresolv -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},X) CFLAGS += -g -O LDFLAGS += /usr/local/lib/ccmalloc-gcc.o -L/usr/local/lib -lccmalloc -ldl endif CXXFLAGS := ${CFLAGS} ifeq (${OMP},Y) CFLAGS += ${OMP_FLG} FFLAGS += ${OMP_FLG} LDFLAGS := ${OMP_FLG} ${LDFLAGS} endif # endif OMP endif # endif MACOSXOLD ifeq (${PVM_ARCH},NECSX) ifeq (${OMP},Y) OMP_FLG := -Popenmp endif # endif OMP CXX := c++ #CC := c++ -Xa CC := cc CPP := c++ -E #CPP := /usr/lib/cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${OTHER_CFLAGS} FC := f90 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm ifeq ($(USE_FORTRAN_ARITHMETIC),Y) # LDFLAGS += -L/lib -lf endif LEX := lex LINT := lint YACC := yacc ifeq (${OPTS},O) CFLAGS += -h2 -hmath vector -hxint # CFLAGS += -Cvopt -math vector -xint FFLAGS = -Cvopt -f3 endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS = -g -f3 endif ifeq (${OPTS},X) CFLAGS += -h0 -g -hstack=nan # CFLAGS += -Cdebug -init stack=nan FFLAGS = -Cdebug -eR -f3 -Wf"-init stack=nan heap=nan" endif MK_DPN = /usr/local/bin/mkdep.perl /usr/lib/cpp # NECSX try this ${MY_DPN_DIR}/%.d : %.c ${MK_DPN} ${CPPFLAGS} $< | perl -p -e 's/$*\.o/${MY_OBJ_DIR_RX}\/$*.o ${MY_DPN_DIR_RX}\/$(notdir $@)/g;s/${slash_rx}/\${slash}/g' > $@ endif # endif NECSX ifeq (${PVM_ARCH},RS6K) CXX := g++ CC := gcc -ansi CPP := /lib/cpp -P CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${OTHER_CFLAGS} FC := xlf LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm ifeq ($(USE_FORTRAN_ARITHMETIC),Y) LDFLAGS += -lxlf90 -lxlf endif LEX := lex LINT := lint YACC := yacc ifeq (${OPTS},O) CFLAGS += -O2 CPP := ${CPP} ${CPPFLAGS} PREPROCESS.F := ${CPP} ${CPPFLAGS} FFLAGS := -O -NS2000 -qfixed=132 endif ifeq (${OPTS},D) CFLAGS += -g CPP := ${CPP} ${CPPFLAGS} PREPROCESS.F := ${CPP} ${CPPFLAGS} FFLAGS := -g -NS2000 -qfixed=132 endif ${MY_OBJ_DIR}/%.o : %.F ${CPP} ${CPPFLAGS} $< ${MY_OBJ_DIR}/$(basename $<).f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) ${MY_OBJ_DIR}/$(basename $<).f ${MY_OBJ_DIR}/%.o : %.f ${FC} -c ${FFLAGS} -o ${MY_OBJ_DIR}/$(notdir $@) $< endif # endif RS6K # SGI6, SGI64, SGIMP64 ifneq (,$(findstring SGI,${PVM_ARCH})) CXX := CC -LANG:std CC := cc -c99 # 20000302: -w suppresses warnings which will swamp linker #CXX := g++ -w #CC := gcc CPPFLAGS += ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 -cpp LD := ld LDFLAGS += ${OTHER_LDFLAGS} LEX := flex LINT := lint YACC := bison ifeq (${PVM_ARCH},SGI6) GCC_ABI_FLG := -mabi=32 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips3 SGI_ABI_FLG := -n32 -mips3 ${OMP_FLG} else # SGI64, SGIMP64 ifeq (${ABI},64) GCC_ABI_FLG := -mabi=64 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips4 -L/usr/local/lib/mabi=64 SGI_ABI_FLG := -64 -mips4 ${OMP_FLG} else # ABI=32 GCC_ABI_FLG := -mabi=32 GCC_LDFLAGS_SZ_SPC := ${GCC_ABI_FLG} -mips4 SGI_ABI_FLG := -n32 -mips4 ${OMP_FLG} endif # endif ABI endif # endif SGI64, SGIMP64 ifeq (gcc,$(firstword ${CC})) LDFLAGS := $(GCC_LDFLAGS_SZ_SPC) ${OTHER_LDFLAGS} -lm CFLAGS := ${GCC_ABI_FLG} -Wall ifeq (${OPTS},O) CFLAGS += -O2 endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g -O endif CXXFLAGS := ${CFLAGS} endif # endif CC=gcc ifeq (CC,$(firstword ${CXX})) # SGI Native C++ headers are in /usr/include/CC LDFLAGS := ${SGI_ABI_FLG} ${OTHER_LDFLAGS} -lm CFLAGS := ${SGI_ABI_FLG} ifeq (${OPTS},O) CFLAGS += -O2 endif ifeq (${OPTS},R) CFLAGS += endif ifeq (${OPTS},D) CFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g -trapuv endif CXXFLAGS := ${CFLAGS} endif # endif CC=cc # Fortran flags FFLAGS := ${SGI_ABI_FLG} -extend_source ifeq (${OPTS},O) FFLAGS += -O2 endif ifeq (${OPTS},R) FFLAGS += endif ifeq (${OPTS},D) FFLAGS += -g endif ifeq (${OPTS},X) FFLAGS += -g -check_bounds -trapuv endif # end fortran flags endif # endif SGI6, SGI64, SGIMP64 ifeq (${UNAMES},SunOS) #CXX := CC #CC := cc CXX := g++ CC := gcc CFLAGS := -Wall CPP := cpp CPPFLAGS := ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := f90 -DHIDE_SHR_MSG #FFLAGS := -xs -stackvar -e -Qoption f90comp -r8const FFLAGS := -xs -stackvar -e LD := ld LDFLAGS := ${OTHER_LDFLAGS} -lsunmath -lsocket -lnsl #LDFLAGS += -lF77 -lM77 -lresolv LEX := lex LINT := lint YACC := yacc ifeq (${ABI},64) # Sun compiler ifeq (${CC},cc) CFLAGS := -xarch=v9 FFLAGS := -xarch=v9 LDFLAGS += -xarch=v9 endif # endif Sun compiler # GNU Compiler Collection ifeq (gcc,$(firstword ${CC})) CFLAGS += -mabi=64 FFLAGS += -mabi=64 LDFLAGS += -mabi=64 endif # endif GNU Compiler Collection endif # endif ABI ifeq (${OPTS},O) CFLAGS += -O2 FFLAGS += -fast endif ifeq (${OPTS},D) CFLAGS += -g FFLAGS += -g endif ifeq (${OPTS},X) CFLAGS += -g FFLAGS += -g # NB: 19980601 -C (range-checking) is not supported by Sun f90 ifeq (${FC},f77) FFLAGS += -C endif endif CXXFLAGS := ${CFLAGS} endif # endif SunOS=SUN4SOL2,SUNMP ifeq (${PVM_ARCH},WIN32) CXX := g++ CC := gcc -ansi CPP := cpp # NB: nameser.h needs -Di386, but gcc sends -Di586 (on pentiums) CPP_TKN_OS += -Di386 -DNEED_STRCASECMP -DNEED_STRDUP -I/usr/include CPPFLAGS += ${CPP_TKN} ${CPP_TKN_OS} ${CPP_PTH} ${OTHER_CFLAGS} FC := g77 LD := ld LDFLAGS += ${OTHER_LDFLAGS} -lm LEX := flex LINT := lint YACC := bison ifeq (${OPTS},O) CFLAGS += -O endif ifeq (${OPTS},D) CFLAGS += -g endif endif # endif WIN32 ifneq (${null},$(findstring LINUX,${PVM_ARCH})) ifeq (${CCACHE},Y) # Prefix CC and CXX with ccache CC := ccache ${CC} CXX := ccache ${CXX} endif # !CCACHE endif # !LINUX ifeq ($(STC),Y) # Created statically linked executable LDFLAGS := -static ${LDFLAGS} endif # endif STC # Remove accidental empty paths CPPFLAGS := $(subst -I-I,-I,${CPPFLAGS}) LDFLAGS := $(subst -L-L,-L,${LDFLAGS}) # Define any remaining variables libnco_c++ := ${MY_LIB_DIR}/libnco_c++ libnco++ := ${MY_LIB_DIR}/libnco++ # Default targets all: ant ${MDL_BIN_TRG} inc lib # .PHONY tells make to remake the following non-file targets .PHONY: all cln dst_cln debug ${MDL_BIN_TRG} # Delete default suffixes---this should increase speed .SUFFIXES: # Define suffixes that matter .SUFFIXES: .cpp .cc .c .o .F .d # Delete targets that were not successfully made .DELETE_ON_ERROR: lib_dir : - if ! test -d ${MY_LIB_DIR}; then mkdir ${MY_LIB_DIR}; fi bin_dir : - if ! test -d ${MY_BIN_DIR}; then mkdir ${MY_BIN_DIR}; fi obj_dir : - if ! test -d ${MY_OBJ_DIR}; then mkdir ${MY_OBJ_DIR}; fi # Targets in bin NCAP2_OBJ := ${MY_OBJ_DIR}/ncap2.o ncap2: ${MY_BIN_DIR}/ncap2 ${MY_BIN_DIR}/ncap2: ${NCAP2_OBJ} lib ${CXX} -o $@${BNR_SFX} ${NCAP2_OBJ} ${LDFLAGS} chmod 755 $@${BNR_SFX} bin : ${MDL_BIN_TRG} bin_cln: rm -f ${MDL_BIN} ${NCAP2_ANTLR_GENERATED_CPP} ${NCAP2_ANTLR_GENERATED_HPP} # Targets in bld bld_cln : cd ${MY_BLD_DIR}; rm -f TAGS # Targets in bm test: tst tst: ncap2 -O -v -S ~/nco/data/ncap2.in ~/nco/data/in.nc ~/foo.nc # Targets in dat data: dat dat: ${MY_DAT_DIR}/in.nc ${MY_DAT_DIR}/in.nc: ${MY_DAT_DIR}/in.cdl -cd ../../bld; ${MAKE} $@ dat_cln : -cd ${MY_DAT_DIR}; rm -f in.nc foo.nc # Targets in dpn dpn : ${MDL_DPN} dpn_cln : rm -f ${MDL_DPN} # Targets in dpn dst : cd ..; tar cvzf /var/ftp/pub/zender/nco++/nco++.tar.gz ./nco++; # Targets in inc inc : ${MDL_INC} inc_cln : rm -f ${MDL_INC} # Targets in lib lib : inc $(libnco++).a -cd ../../bld; ${MAKE} $@ # Rebuild libnco if necessary $(libnco++).a : inc $(libnco++).a(${MY_OBJ_DIR}/sym_cls.o) \ $(libnco++).a(${MY_OBJ_DIR}/fmc_cls.o) \ $(libnco++).a(${MY_OBJ_DIR}/fmc_gsl_cls.o) \ $(libnco++).a(${MY_OBJ_DIR}/fmc_all_cls.o) \ $(libnco++).a(${MY_OBJ_DIR}/Invoke.o) \ $(libnco++).a(${MY_OBJ_DIR}/NcapVar.o) \ $(libnco++).a(${MY_OBJ_DIR}/NcapVarVector.o) \ $(libnco++).a(${MY_OBJ_DIR}/ncap2_utl.o) \ $(libnco++).a(${MY_OBJ_DIR}/ncoLexer.o) \ $(libnco++).a(${MY_OBJ_DIR}/ncoParser.o) \ $(libnco++).a(${MY_OBJ_DIR}/ncoTree.o) \ $(libnco++).a(${MY_OBJ_DIR}/prs_cls.o) \ $(libnco++).a(${MY_OBJ_DIR}/sdo_utl.o) \ $(libnco++).a(${MY_OBJ_DIR}/nco_gsl.o) # NB: Do not place comments in the middle of a rule, or have \ at the end lib_cln : rm -f $(libnco++).a $(libnco++).la $(libnco++).so* # Targets in obj obj : ${MDL_OBJ} obj_cln : rm -f ${MDL_OBJ} # Targets in src %.hh : %.hpp mv $< $(basename $<).hh %.cc : %.cpp mv $< $(basename $<).cc # fxm: change to common dependency rule ant : ncoGrammer.g - ${ANTLR} ncoGrammer.g ; ./nco_antlr_pst_prc.pl < ncoParserTokenTypes.hpp > ncoEnumTokenTypes.hpp src_cln : rm -f ${NCAP2_ANTLR_GENERATED_CPP} ${NCAP2_ANTLR_GENERATED_HPP} ${NCAP2_ANTLR_GENERATED_TXT} # Targets in /usr/local sys: ${MDL_BIN_TRG} cd ${MY_BIN_DIR};sudo /bin/cp -f ${MDL_BIN_TRG} /usr/local/bin sys_cln: - cd /usr/local/bin;rm -f ${MDL_BIN_TRG} # Housekeeping clean : cln cln : dat_cln dpn_cln obj_cln debug: dbg dbg: @printf "ABI = ${ABI}\n" @printf "ANTLR = ${ANTLR}\n" @printf "AR = ${AR}\n" @printf "BNR_SFX = ${BNR_SFX}\n" @printf "CC = ${CC}\n" @printf "CCACHE = ${CCACHE}\n" @printf "CFLAGS = ${CFLAGS}\n" @printf "CNK = ${CNK}\n" @printf "CPP = ${CPP}\n" @printf "CPPFLAGS = ${CPPFLAGS}\n" @printf "CPP_PTH = ${CPP_PTH}\n" @printf "CPP_TKN = ${CPP_TKN}\n" @printf "CURL_LIB = ${CURL_LIB}\n" @printf "CXX = ${CXX}\n" @printf "CXXFLAGS = ${CXXFLAGS}\n" @printf "DAP = ${DAP}\n" @printf "DAP_ROOT = ${DAP_ROOT}\n" @printf "DBG = ${DBG}\n" @printf "FC = ${FC}\n" @printf "FFLAGS = ${FFLAGS}\n" @printf "FL_FMT = ${FL_FMT}\n" @printf "GCC_RCH_ARG = ${GCC_RCH_ARG}\n" @printf "GSL = $(GSL)\n" @printf "HOST = ${HOST}\n" @printf "HOSTNAME = ${HOSTNAME}\n" @printf "ICC_RCH_ARG = ${ICC_RCH_ARG}\n" @printf "LAMMPICC = ${LAMMPICC}\n" @printf "LAMMPICXX = ${LAMMPICXX}\n" @printf "LDFLAGS = ${LDFLAGS}\n" @printf "LEX = $(LEX)\n" @printf "LINUX_CC = $(LINUX_CC)\n" @printf "LINUX_CXX = $(LINUX_CXX)\n" @printf "MDL_BIN_TRG = ${MDL_BIN_TRG}\n" @printf "MDL_DPN = ${MDL_DPN}\n" @printf "MDL_MPI_TRG = ${MDL_MPI_TRG}\n" @printf "MDL_OBJ = ${MDL_OBJ}\n" @printf "MDL_PTH = ${MDL_PTH}\n" @printf "MDL_RPM_NST_NM = ${MDL_RPM_NST_NM}\n" @printf "MDL_SRC = ${MDL_SRC}\n" @printf "MPICC = ${MPICC}\n" @printf "MPICH_CC = ${MPICH_CC}\n" @printf "MPICH_CXX = ${MPICH_CXX}\n" @printf "MPICXX = ${MPICXX}\n" @printf "MPI_PRC = ${MPI_PRC}\n" @printf "MPI_PRC_SNG = ${MPI_PRC_SNG}\n" @printf "MPI_ROOT = ${MPI_ROOT}\n" @printf "MY_BIN_DIR = ${MY_BIN_DIR}\n" @printf "MY_BLD_DIR = ${MY_BLD_DIR}\n" @printf "MY_BLD_DIR = ${MY_BLD_DIR}\n" @printf "MY_DAT_DIR = ${MY_DAT_DIR}\n" @printf "MY_DOC_DIR = ${MY_DOC_DIR}\n" @printf "MY_DPN_DIR = ${MY_DPN_DIR}\n" @printf "MY_INC_DIR = ${MY_INC_DIR}\n" @printf "MY_LIB_DIR = ${MY_LIB_DIR}\n" @printf "MY_SHR_DIR = ${MY_SHR_DIR}\n" @printf "MY_OBJ_DIR = ${MY_OBJ_DIR}\n" @printf "NCO_LDFLAGS = $(NCO_LDFLAGS)\n" @printf "NCO_LIBS = $(NCO_LIBS)\n" @printf "NCO_VRS = ${NCO_VRS}\n" @printf "NC_LDFLAGS = $(NC_LDFLAGS)\n" @printf "NC_LIBS = $(NC_LIBS)\n" @printf "NETCDF4 = ${NETCDF4}\n" @printf "NETCDF4_ROOT = ${NETCDF4_ROOT}\n" @printf "NETCDF_INC = ${NETCDF_INC}\n" @printf "NETCDF_LIB = ${NETCDF_LIB}\n" @printf "NETCDF_ROOT = ${NETCDF_ROOT}\n" @printf "OMP = ${OMP}\n" @printf "OPTS = ${OPTS}\n" @printf "PNETCDF = ${PNETCDF}\n" @printf "PRC = ${PRC}\n" @printf "PVM_ARCH = ${PVM_ARCH}\n" @printf "RPM = ${RPM}\n" @printf "SRC_LST = $(SRC_LST)\n" @printf "STC = ${STC}\n" @printf "THR_NBR = ${THR_NBR}\n" @printf "THR_NBR_SNG = ${THR_NBR_SNG}\n" @printf "TMP_LDFLAGS = ${TMP_LDFLAGS}\n" @printf "TMP_LIBS = ${TMP_LIBS}\n" @printf "UDUNITS = $(UDUNITS)\n" @printf "UDUNITS_INC = $(UDUNITS_INC)\n" @printf "UDUNITS_LIB = $(UDUNITS_LIB)\n" @printf "UNAMES = ${UNAMES}\n" @printf "VPATH = ${VPATH}\n" @printf "VRS_SNG = ${VRS_SNG}\n" @printf "YACC = ${YACC}\n" distclean : dst_cln dst_cln : cln bld_cln lib_cln src_cln install : inc tags : etags *.cpp *.cc *.c *.com *.F *.F90 *.h *.hh *.hpp *.pl Makefile uninstall : dst_cln bin_cln inc_cln lib_cln # Create dependency files only if they will not be immediately deleted INCLUDE_DPN := TRUE GOALS_THAT_DELETE_DEPENDENCY_FILES := cln clean dir distclean dst_cln dpn_cln tags uninstall ifeq (,$(findstring $(MAKECMDGOALS),${GOALS_THAT_DELETE_DEPENDENCY_FILES})) INCLUDE_DPN := TRUE else INCLUDE_DPN := FALSE endif ifeq (${INCLUDE_DPN},TRUE) -include ${MDL_DPN} endif nco-4.5.4/src/nco++/NcapVar.cc000066400000000000000000000016341264355130400156470ustar00rootroot00000000000000#include "NcapVar.hh" NcapVar::NcapVar(var_sct *var_in, std::string sin) { size_t att_char_posn; if(sin=="") sin=std::string(var_in->nm); var=var_in; fll_nm=sin; //flg_mem=_flg_mem; rfr_ast=ANTLR_USE_NAMESPACE(antlr)nullAST; if(var !=(var_sct*)NULL) flg_udf=(var_in->undefined==True); else flg_udf=False; flg_mem=false; flg_stt=0; flg_spl=false; xpr_typ_rfr=ncap_xpr_null; if( (att_char_posn =sin.find("@")) ==std::string::npos ){ xpr_typ=ncap_var; var_nm=sin; att_nm=""; }else{ xpr_typ=ncap_att; var_nm=sin.substr(0,att_char_posn); att_nm=sin.substr(att_char_posn+1); } //make sure var->nm is the same as var_nm@att_nm if( var!=(var_sct*)NULL && fll_nm != std::string(var->nm) ){ var->nm=(char*)nco_free(var->nm); var->nm=strdup(fll_nm.c_str()); } } nco-4.5.4/src/nco++/NcapVar.hh000066400000000000000000000051701264355130400156600ustar00rootroot00000000000000#ifndef NCAPVAR_HH #define NCAPVAR_HH #include #include #include "nco.h" #include "ncap2.hh" #include "nco_var_utl.h" // nco_var_free() #include #include #ifdef ENABLE_GSL #include #endif ANTLR_USING_NAMESPACE(antlr); class NcapVar{ private: std::string var_nm; std::string att_nm; std::string fll_nm; // full name i.e var_nm@att_nm; RefAST rfr_ast; ncap_type xpr_typ_rfr; public: var_sct *var; ncap_type xpr_typ; bool flg_udf; // matches var->undefined bool flg_mem; // true -- then var data is written to memory // rather than disk -- At the moment all meta-data // is cached ? -- int flg_stt; // status flag // 0 -- var is defined in memory // 1 -- var is defined in output - but no data written // 2 -- var is defined & data written bool flg_spl; // true then var->val.vp is spline data // e.g., var->val.vp is gsl_spline* // this needs to be freed up using // the gsl spline library call public: //constructors n.b var->nm should match var_nm@att_nm NcapVar(var_sct *var_in, std::string sin=""); // NcapVar(var_sct *var_in); //Copy Constructor NcapVar(NcapVar &Nvar){ var_nm=Nvar.var_nm;; att_nm=Nvar.att_nm; fll_nm=Nvar.fll_nm; rfr_ast=Nvar.rfr_ast;; xpr_typ_rfr=Nvar.xpr_typ_rfr; var=nco_var_dpl(Nvar.var); xpr_typ=Nvar.xpr_typ; flg_udf=Nvar.flg_udf; flg_mem=Nvar.flg_mem; flg_stt=Nvar.flg_stt; flg_spl=Nvar.flg_spl; } //Copy variable type var_sct * cpyVar(){ return nco_var_dpl(var); } //Copy variable no data var_sct *cpyVarNoData(){ void *vp; var_sct *var_ret; vp=var->val.vp; var->val.vp=(void*)NULL; var_ret=nco_var_dpl(var); // Restore Original Value var->val.vp=vp; return var_ret; } //Methods void setAST(RefAST &rAST) { rfr_ast=rAST;} void setAST(RefAST &rAST,ncap_type xpr_rtyp) { rfr_ast=rAST; xpr_typ_rfr=xpr_rtyp; } RefAST getAst(){ return rfr_ast;} ncap_type getAst_typ() { return xpr_typ_rfr;} std::string getVar() {return var_nm; } std::string getAtt() {return att_nm; } std::string getFll() {return fll_nm; } //Destructor ~NcapVar() { #ifdef ENABLE_GSL if(flg_spl && var->val.vp !=(void*)NULL ){ gsl_spline_free( (gsl_spline*)var->val.vp); var->val.vp=(void*)NULL; } #endif if(var !=(var_sct*)NULL) var=nco_var_free(var); } }; #endif // NCAPVAR_HH nco-4.5.4/src/nco++/NcapVarVector.cc000066400000000000000000000061501264355130400170300ustar00rootroot00000000000000#include "NcapVarVector.hh" long NcapVarVector::size(){ return (long)std::vector::size(); } NcapVar* NcapVarVector::find(std::string s_fnm){ long lret; lret=findi(s_fnm); if(lret >=0) return (*this)[lret]; return NULL; } NcapVar* NcapVarVector::find(const char*nm){ long lret; lret=findi( std::string(nm)); if(lret >=0) return (*this)[lret]; return NULL; } long NcapVarVector::findi(std::string s_fnm){ long lret; NcapVar* Ntmp; std::vector::iterator we; if(size()==0) return -1; Ntmp=new NcapVar( (var_sct*)NULL ,s_fnm); we=std::lower_bound(begin(),end(),Ntmp,less_mag()); // Item already in vector if( we !=end() && (*we)->getFll()==s_fnm ) lret=we-begin(); else lret=-1; // nb var_in also freed here delete Ntmp; return lret; } // used in attribute propagation long NcapVarVector::find_lwr(std::string s_fnm){ bool bmth; long lret; std::string s_fl; NcapVar* Ntmp; std::vector::iterator we; if(size()==0) return -1; Ntmp=new NcapVar( (var_sct*)NULL ,s_fnm); we=std::lower_bound(begin(),end(),Ntmp,less_mag()); // Return a partial match lret=-1; if( we!=end()){ s_fl=(*we)->getFll(); if(s_fl.find(s_fnm,0) !=std::string::npos) lret=we-begin(); } // nb var_in also freed here delete Ntmp; return lret; } void NcapVarVector::push_ow(NcapVar *Nvar){ push(Nvar); } // add to vector void NcapVarVector::push(NcapVar *Nvar){ std::vector::iterator we; if(size()==0){ push_back(Nvar); return; } we=std::lower_bound(begin(),end(),Nvar,less_mag()); // Item already in vector if( we !=end() && (*we)->getFll()== Nvar->getFll()){ delete *we; *we=Nvar; // Insert Item } else{ (void)std::vector::insert(we,Nvar); } } // Delete an item void NcapVarVector::erase(std::string s_fnm){ long idx; idx=findi(s_fnm); if(idx >=0) erase(idx); } // Delete an item void NcapVarVector::erase(long idx){ std::vector::iterator we=begin(); we=begin(); we+=idx; delete (*this)[idx]; std::vector::erase(we); } void NcapVarVector::sort(){ std::sort(begin(),end(),less_mag()); } /* NcapVar* NcapVarVector::find(const char*nm){ long idx; long sz=this->size(); for(idx=0; idxgetFll().c_str())) return (*this)[idx]; return NULL; } */ /* NcapVar* NcapVarVector::find(std::string s_fnm){ NcapVar* Nvar; Nvar=find(s_fnm.c_str()); return Nvar; } */ /* long NcapVarVector::findi(std::string s_fnm){ long idx; long sz=this->size(); for(idx=0; idxgetFll()) return idx; return -1; } */ /* void NcapVarVector::push_ow(NcapVar *Nvar){ long lret; NcapVar *Ntmp; lret=findi(Nvar->getFll()); if(lret >= 0 ) { // delete current value Ntmp= (*this)[lret]; // re-assign (*this)[lret]=Nvar; delete Ntmp; }else push_back(Nvar); } */ nco-4.5.4/src/nco++/NcapVarVector.hh000066400000000000000000000012771264355130400170470ustar00rootroot00000000000000#ifndef NCAPVARVECTOR_H #define NCAPVARVECTOR_H #include #include #include #include "ncap2.hh" #include "NcapVar.hh" class NcapVarVector : public std::vector { public: long size(); NcapVar* find(const char*nm); NcapVar* find(std::string s_fnm); long findi(std::string s_fnm); long find_lwr(std::string s_fnm); void push_ow(NcapVar *Nvar); void push(NcapVar *Nvar); void erase(std::string s_fnm); void erase(long idx); void sort(); //Use for sorting struct less_mag { bool operator()( NcapVar* v1, NcapVar* v2) { return ( v1->getFll() < v2->getFll()) ; } }; }; #endif nco-4.5.4/src/nco++/NcapVector.hh000066400000000000000000000040451264355130400163720ustar00rootroot00000000000000#ifndef INC_NcapVector_hh_ #define INC_NcapVector_hh_ #include #include #include #include #include #include template class NcapVector : public std::vector { public: // stop compiler warnings int size(){ // Call base class version return (int)(std::vector::size()); } struct less_mag : public std::binary_function< T, T, bool> { bool operator()( T t1, T t2) { return ( strcmp(t1->nm,t2->nm)<0) ; } }; T find(const char *nm) { int idx; int sz=this->size(); for(idx=0 ; idx < sz; idx++) if(!strcmp(nm, (*this)[idx]->nm)) break; if(idx < sz) return (*this)[idx]; else return NULL; } T find(std::string snm) { return find(snm.c_str()); } int findi(const char *nm){ int idx; int sz=this->size(); for(idx=0 ; idx < sz; idx++) if(!strcmp(nm, (*this)[idx]->nm)) break; if(idx < sz) return idx; else return -1; } int findi(std::string snm){ int idx; int sz=this->size(); const char *nm=snm.c_str(); for(idx=0 ; idx < sz; idx++) if(!strcmp(nm, (*this)[idx]->nm)) break; if(idx < sz) return idx; else return -1; } // returns index -- nb vector must be sorted int findis( const char *nm){ int idx; T t2; t2=(T)malloc(sizeof(*t2)); t2->nm=strdup(nm); idx=lower_bound( this->begin(), this->end(), t2, less_mag() )-this->begin(); if(idx ==size() || strcmp(t2->nm, (*this)[idx]->nm)) idx=-1; free(t2->nm); free(t2); return idx; } int findis(std::string snm){ return findis(snm.c_str()); } bool Cmp(T t1,T t2) { if( strcmp(t1->nm,t2->nm)<0 ) return true; return false; } void sort(){ std::sort(this->begin(), this->end(),less_mag() ); } // search -- only on a sorted vector bool bsearch(T t1){ bool bret; bret= std::binary_search( this->begin(),this->end(),t1,less_mag()); return bret; } }; #endif nco-4.5.4/src/nco++/VarOp.hh000066400000000000000000000160201264355130400153510ustar00rootroot00000000000000#ifndef INC_VAR_OP_hh_ #define INC_VAR_OP_hh_ #include #include "nco.h" #include "ncoParserTokenTypes.hpp" template class VarOp : public ncoParserTokenTypes { public: VarOp() {;} // binary Operations public: var_sct* var_var_op(var_sct* var1 , var_sct* var2, int op); // Unary Operations public: var_sct* var_op(var_sct* var1 , int op); }; template var_sct* VarOp::var_var_op(var_sct* var1, var_sct* var2, int op) { bool bmss=false; long idx; long sz; T tmss=T(0); T* tp1; T* tp2; sz=var1->sz; tp1=(T*)(var1->val.vp); tp2=(T*)(var2->val.vp); if(var1->has_mss_val) { tmss=((T*)(var1->mss_val.vp))[0]; bmss=true; }else if(var2->has_mss_val) { tmss=((T*)(var2->mss_val.vp))[0]; bmss=true; // Now copy missing value to var1 as on return var2 will be freed (void)nco_mss_val_cnf(var2,var1); } switch(op) { case PLUS_ASSIGN: case PLUS: if(!bmss) { for(idx=0 ; idx tp2[idx]; }else{ for(idx=0 ; idx tp2[idx]; else tp1[idx]=tmss; } } break; case GEQ: if(!bmss) { for(idx=0 ; idx= tp2[idx]; }else{ for(idx=0 ; idx= tp2[idx]; else tp1[idx]=tmss; } } break; case LEQ: if(!bmss) { for(idx=0 ; idx= tp2[idx]) tp1[idx]=tp2[idx]; }else{ for(idx=0 ; idx= tp2[idx] ) tp1[idx]=tp2[idx]; } } break; case FGTHAN: if(!bmss) { for(idx=0 ; idx var_sct* VarOp::var_op(var_sct* var1, int op) { bool bmss=false; long idx; long sz; T tmss=T(0); T* tp1; sz=var1->sz; tp1=(T*)(var1->val.vp); if(var1->has_mss_val) { bmss=true; tmss=((T*)(var1->mss_val.vp))[0]; } switch(op) { case PLUS: // Do nothing break; case MINUS: if(!bmss) { for(idx=0 ; idx() ); break; // return absolute value case VABS: if(!bmss) { for(idx=0 ; idxgetNumberOfChildren(); // no arguments - bomb out if(!expr && nbr_fargs==0){ std::string serr; serr="Function has been called without an argument"; err_prn(sfnm,serr); } if(expr) var1=walker.out(expr); else var1=walker.out(fargs->getFirstChild()); //do conversion var1=nco_var_cnf_typ( (nc_type)fdx, var1); return var1; } //Aggregate Functions /************************************************/ agg_cls::agg_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("avg",this,(int)PAVG)); fmc_vtr.push_back( fmc_cls("avgsqr",this,(int)PAVGSQR)); fmc_vtr.push_back( fmc_cls("max",this,(int)PMAX)); fmc_vtr.push_back( fmc_cls("mibs",this,(int)PMIBS)); fmc_vtr.push_back( fmc_cls("mabs",this,(int)PMABS)); fmc_vtr.push_back( fmc_cls("mebs",this,(int)PMEBS)); fmc_vtr.push_back( fmc_cls("min",this,(int)PMIN)); fmc_vtr.push_back( fmc_cls("rms",this,(int)PRMS)); fmc_vtr.push_back( fmc_cls("rmssdn",this,(int)PRMSSDN)); fmc_vtr.push_back( fmc_cls("sqravg",this,(int)PSQRAVG)); fmc_vtr.push_back( fmc_cls("total",this,(int)PTTL)); fmc_vtr.push_back( fmc_cls("ttl",this,(int)PTTL)); fmc_vtr.push_back( fmc_cls("sum",this,(int)PTTL)); } } var_sct *agg_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("agg_cls::fnd"); int fdx; int nbr_args; int idx; int nbr_dim; int avg_nbr_dim; dmn_sct **dim; dmn_sct **dim_nw=NULL_CEWI; var_sct *var=NULL_CEWI; var_sct *var1=NULL_CEWI; std::string susg; std::string sfnm=fmc_obj.fnm(); RefAST aRef; RefAST tr; std::vector str_vtr; std::vector vtr_args; NcapVector dmn_vtr; // de-reference ddra_info_sct ddra_info; prs_cls *prs_arg=walker.prs_arg; fdx=fmc_obj.fdx(); // Put args into vector if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); susg="usage: var_out="+sfnm+"(var_in,$dim1,$dim2...$dimn)"; if(nbr_args==0) err_prn(sfnm, " Function has been called with no arguments\n"+susg); var1=walker.out(vtr_args[0]); nbr_dim=var1->nbr_dim; // Process function arguments if any exist !! for(idx=1; idxgetType()){ case DIM_ID: case DIM_MTD_ID: str_vtr.push_back(aRef->getText()); break; // This is garanteed to contain at least one DIM_ID or DIM_MTD // and NOTHING else --no need to type check!! case DMN_ARG_LIST: { RefAST bRef=aRef->getFirstChild(); while(bRef){ str_vtr.push_back(bRef->getText()); bRef=bRef->getNextSibling(); } break; } // ignore expr type argument default: std::string serr; serr="Argument "+nbr2sng(idx)+ " is not a dimension"; wrn_prn(sfnm,serr); break; } // end switch } // end for // Important to note that dmn_vtr contains dim pointers // picked up from var1->dim so there is no need to free them if(vtr_args.size() >1) dmn_vtr=ncap_dmn_mtd(var1, str_vtr); // Initial scan if(prs_arg->ntl_scn){ if(var1->undefined) var=ncap_var_udf("~dot_methods"); // deal with average over all dims or scalar var else if( nbr_dim==0 || dmn_vtr.size()== 0 || dmn_vtr.size()==nbr_dim) var=ncap_sclr_var_mk(SCS("~dot_methods"),var1->type,false); else { // cast a variable with the correct dims in the correct order dim=var1->dim; std::vector cst_vtr; for(idx=0 ; idx < nbr_dim ; idx++){ std::string sdm(dim[idx]->nm); if( dmn_vtr.findi(sdm) == -1) cst_vtr.push_back(sdm); } var=ncap_cst_mk(cst_vtr,prs_arg); var=nco_var_cnf_typ(var1->type,var); } var1=nco_var_free(var1); return var; } // end Initial scan // from here on dealing with a final scan // deal with a hyperslab // Code only reaches here on a final scan as // as an irregular hyperslab is flagged as var1->undefined==True on // initial scan if(var1->has_dpl_dmn){ // can only process an irregular hyperslab if avergaing over all dimensions // else bomb out if(dmn_vtr.size() !=0 && dmn_vtr.size() != nbr_dim ) err_prn(sfnm, "This method can only work with a hyperslab if it being applied to all dimensions\nIf you wish to apply it over some of the dimensions then cast the variable first\n"); // create local copy of dims - The dim list created by var_lmt only // contains the regular dims from output. The srt/cnt/srd/end has been // lost. So this hack recreates the dims with this information. // since var1->dim isn't freed up when the var is freed up // these dims are freed up seperatly. The new dims are not propagated // into var as var is always scalar --see code above dim_nw=(dmn_sct**)nco_malloc(nbr_dim*sizeof(dmn_sct*)); for(idx=0 ; idxdim[idx]); dim_nw[idx]->srt=var1->srt[idx]; dim_nw[idx]->end=var1->end[idx]; dim_nw[idx]->cnt=var1->cnt[idx]; dim_nw[idx]->srd=var1->srd[idx]; var1->dim[idx]=dim_nw[idx]; } } if(dmn_vtr.size() >0 && dmn_vtr.size()dim; avg_nbr_dim=nbr_dim; } // do the heavy lifting switch(fdx){ case PAVG: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_avg,False,&ddra_info); // Use tally to normalize (void)nco_var_nrm(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val); break; case PAVGSQR: var1=ncap_var_var_op(var1, NULL_CEWI,VSQR2); var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_avgsqr,False,&ddra_info); // Normalize (void)nco_var_nrm(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val); break; case PMIBS: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_mibs,False,&ddra_info); break; case PMABS: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_mabs,False,&ddra_info); break; case PMEBS: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_mebs,False,&ddra_info); break; case PMAX: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_max,False,&ddra_info); break; case PMIN: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_min,False,&ddra_info); break; case PRMS: var1=ncap_var_var_op(var1, NULL_CEWI,VSQR2); var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_rms,False,&ddra_info); // Normalize (void)nco_var_nrm(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val); // Take root (void)nco_var_sqrt(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val,var->val); break; case PRMSSDN: var1=ncap_var_var_op(var1, NULL_CEWI,VSQR2); var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_rmssdn,False,&ddra_info); // Normalize (void)nco_var_nrm_sdn(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val); // Take root (void)nco_var_sqrt(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val,var->val); break; case PSQRAVG: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_sqravg,False,&ddra_info); // Normalize (void)nco_var_nrm(var->type,var->sz,var->has_mss_val,var->mss_val,var->tally,var->val); // Square mean (void)nco_var_mlt(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,var->val); break; case PTTL: var=nco_var_avg(var1,dim,avg_nbr_dim,nco_op_ttl,False,&ddra_info); break; } // end switch // var1 is freed/destroyed in nco_var_avg() // free local dim list if necessary if(dim_nw){ for(idx=0; idx vtr_args; sfnm =fmc_obj.fnm(); //method name is_mtd=(expr ? true: false); styp= (expr? "method":"function"); nbr_args=0; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); if(nbr_args ==0) err_prn(fnc_nm,styp+" \""+sfnm+"\" has been called with no arguments"); // deal with is_miss in a seperate function if(fdx==NUM_MISS) return is_fnd(is_mtd, vtr_args,fmc_obj,walker); if( fdx==SET_MISS || fdx==CH_MISS) { if( nbr_args==1) { serr=sfnm+ " is missing an argument"; err_prn(fnc_nm,serr); } var=walker.out(vtr_args[1] ); } lcl_typ=expr_typ(vtr_args[0]); /* allow att identifier for RAM_DELETE */ if(lcl_typ !=VVAR && !(fdx == RAM_DELETE && lcl_typ==VATT)) { serr="The first operand of the " + sfnm+ " must be a variable identifier only."; err_prn(fnc_nm,serr); } va_nm=vtr_args[0]->getText(); Nvar=prs_arg->var_vtr.find(va_nm); /* Deal with GET_MISS as its different from other methods */ if(fdx==GET_MISS){ var_sct *var_tmp=NULL_CEWI; var_sct *var_ret=NULL_CEWI; var_tmp=prs_arg->ncap_var_init(va_nm,false); // Initial scan if(prs_arg->ntl_scn) if(var_tmp) var_ret= ncap_sclr_var_mk(SCS ("~utility_function"),var_tmp->type,false); else var_ret=ncap_var_udf("~utility_function"); // Final scan if(!prs_arg->ntl_scn){ if(var_tmp){ // nb ncap_sclr_var_mk() calls nco_mss_val_mk() and fills var_ret with the default fill value // for that type. So if the var has no missing value then this is the value returned // Default fill values are defined in netcdf.h . var_ret=ncap_sclr_var_mk(SCS("~utility_function"),var_tmp->type,true); if(var_tmp->has_mss_val) (void)memcpy(var_ret->val.vp, var_tmp->mss_val.vp,nco_typ_lng(var_tmp->type)); }else{ /* Cant find variable blow out */ serr=sfnm+ " Unable to locate missing value for "+ va_nm; err_prn(fnc_nm,serr); } } // end else if(var_tmp) var_tmp=nco_var_free(var_tmp); return var_ret; } // end GET_MISS if(prs_arg->ntl_scn) { if(var) var=nco_var_free(var); return ncap_sclr_var_mk(SCS("~utility_function"),(nc_type)NC_INT,false); } if(!Nvar ){ wrn_prn(fnc_nm,sfnm+" unable to find variable: "+va_nm); if(var) var=nco_var_free(var); return ncap_sclr_var_mk(SCS("~utility_function"),(nco_int)rval); } //De-reference var_in=Nvar->var; switch(fdx){ case SET_MISS: { var=nco_var_cnf_typ(var_in->type,var); var->has_mss_val=True; var->mss_val=nco_mss_val_mk(var->type); (void)memcpy(var->mss_val.vp, var->val.vp,nco_typ_lng(var->type)); nco_mss_val_cp(var,var_in); var=(var_sct*)nco_var_free(var); rval=1; break; } case CH_MISS: { char *cp_out; long slb_sz; var=nco_var_cnf_typ(var_in->type,var); var->has_mss_val=True; var->mss_val=nco_mss_val_mk(var->type); (void)memcpy(var->mss_val.vp, var->val.vp,nco_typ_lng(var->type)); // if no missing add one then exit if(!var_in->has_mss_val){ nco_mss_val_cp(var,var_in); var=(var_sct*)nco_var_free(var); break; } //get variable var_in=prs_arg->ncap_var_init(va_nm,true); cp_out=(char*)var_in->val.vp; slb_sz=nco_typ_lng(var_in->type); for(long idx=0 ;idxsz;idx++){ if( !memcmp(cp_out,var_in->mss_val.vp,slb_sz)) (void)memcpy(cp_out,var->mss_val.vp,slb_sz); cp_out+=(ptrdiff_t)slb_sz; } // Copy new missing value nco_mss_val_cp(var,var_in); //write variable (void)prs_arg->ncap_var_write(var_in,false); (void)nco_var_free(var); rval=1; break; } case DEL_MISS: { // Dereference rval=0; var_in=Nvar->var; if(var_in->has_mss_val){ var_in->has_mss_val=False; var_in->mss_val.vp=(void*)nco_free(var_in->mss_val.vp); rval=1; } break; } case RAM_WRITE: { if(Nvar->flg_mem==false){ wrn_prn(fnc_nm,sfnm+" called with:"+va_nm+ " .This variable is already on disk"); rval=0; }else{ var_sct *var_nw; var_nw=nco_var_dpl(Nvar->var); prs_arg->var_vtr.erase(va_nm); prs_arg->ncap_var_write(var_nw,false); rval=1; } } break; case RAM_DELETE: { // deal with var if(vtr_args[0]->getType()==VAR_ID){ if(Nvar->flg_mem==false){ wrn_prn(fnc_nm,sfnm+" cannot remove disk variable:\""+va_nm+ "\". Delete can only remove RAM variables."); rval=0; }else{ prs_arg->var_vtr.erase(va_nm); prs_arg->int_vtr.erase(va_nm); rval=1; } } if(vtr_args[0]->getType()==ATT_ID){ prs_arg->var_vtr.erase(va_nm); rval=1; } } break; }// end switch return ncap_sclr_var_mk(SCS("~utility_function"),(nco_int)rval); }// end function var_sct * utl_cls::is_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("srt_cls::imap_fnd"); int nbr_args; int fdx=fmc_obj.fdx(); long icnt; var_sct *var=NULL_CEWI; nc_type styp=NC_INT; // used to hold the mapping type either NC_INT or NC_UINT64 std::string sfnm =fmc_obj.fnm(); //method name std::string var_nm; std::string susg; prs_cls *prs_arg=walker.prs_arg; #ifdef ENABLE_NETCDF4 { /* scope for fl_fmt temporary */ int fl_fmt; (void)nco_inq_format(walker.prs_arg->out_id,&fl_fmt); if(fl_fmt==NC_FORMAT_NETCDF4 || fl_fmt==NC_FORMAT_NETCDF4_CLASSIC) styp=NC_UINT64; else styp=NC_INT; } /* end scope */ #endif nbr_args=args_vtr.size(); var=walker.out(args_vtr[0] ); if(prs_arg->ntl_scn){ nco_var_free(var); return ncap_sclr_var_mk(SCS("~utility_function"),styp,false); } // from now on dealing with a final scan !! if(var->has_mss_val){ char *cp_out=(char*)var->val.vp; long idx; size_t slb_sz; icnt=0; slb_sz=nco_typ_lng(var->type); for(idx=0 ;idxsz;idx++){ if( !memcmp(cp_out,var->mss_val.vp,slb_sz)) icnt++; cp_out+=(ptrdiff_t)slb_sz; } }else{ icnt=0; } nco_var_free(var); if(styp==NC_UINT64) return ncap_sclr_var_mk(SCS("~utility_function"),(nco_uint64)icnt); else return ncap_sclr_var_mk(SCS("~utility_function"),(nco_int)icnt); } //Basic Functions /******************************************/ bsc_cls::bsc_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("size",this,(int)PSIZE)); fmc_vtr.push_back( fmc_cls("type",this,(int)PTYPE)); fmc_vtr.push_back( fmc_cls("ndims",this,(int)PNDIMS)); fmc_vtr.push_back( fmc_cls("exists",this,(int)PEXISTS)); } } var_sct *bsc_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("bsc_cls::fnd"); int fdx=fmc_obj.fdx(); //index int nbr_args; std::string va_nm; std::string susg; std::string sfnm =fmc_obj.fnm(); //method name nc_type mp_typ=NC_INT; var_sct *var=NULL_CEWI; var_sct *var1=NULL_CEWI; prs_cls* prs_arg=walker.prs_arg; RefAST tr; vtl_typ lcl_typ; std::vector vtr_args; #ifdef ENABLE_NETCDF4 { /* scope for fl_fmt temporary */ int fl_fmt; (void)nco_inq_format(walker.prs_arg->out_id,&fl_fmt); if(fl_fmt==NC_FORMAT_NETCDF4 || fl_fmt==NC_FORMAT_NETCDF4_CLASSIC) mp_typ=NC_UINT64; else mp_typ=NC_INT; } /* end scope */ #endif susg="usage: property="+sfnm+"( var_nm | att_nm | var_exp )"; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); // no arguments - bomb out if(nbr_args==0){ std::string serr; serr="Function has been called with no argument\n"+susg; err_prn(sfnm,serr); // more than one arg -- only print message once } else if(nbr_args >1 && !prs_arg->ntl_scn) wrn_prn(sfnm,"Function has been called with more than one argument"); tr=vtr_args[0]; lcl_typ=expr_typ(tr); // If initial scan if(prs_arg->ntl_scn){ // Evaluate argument on first scan for side-effects eg var1++ or var1+=10 etc if( lcl_typ!=VVAR && lcl_typ !=VATT){ var1=walker.out(tr) ; var1=nco_var_free(var1); } return ncap_sclr_var_mk(SCS("~basic_function"),(nc_type)NC_INT,false); } // from here on dealing with final scan va_nm=tr->getText(); // deal with PEXISTS here if(fdx==PEXISTS){ int iret=0; switch(lcl_typ){ case VVAR: if(prs_arg->ncap_var_init_chk(va_nm)) iret=1; break; case VATT: if( prs_arg->var_vtr.find(va_nm) !=NULL) iret=1; else if( (var1=ncap_att_init(va_nm,prs_arg))!=NULL) iret=1; break; default: var1=walker.out(tr); iret=1; break; } if(var1) nco_var_free(var1); return ncap_sclr_var_mk(SCS("~basic_function"),(nco_int)iret); } if(lcl_typ==VVAR) var1=prs_arg->ncap_var_init(va_nm,false); else var1=walker.out(tr); switch(fdx){ case PSIZE: if(mp_typ==NC_UINT64) var=ncap_sclr_var_mk(SCS("~basic_function"),(nco_uint64)var1->sz); else var=ncap_sclr_var_mk(SCS("~basic_function"),(nco_int)var1->sz); break; case PTYPE: var=ncap_sclr_var_mk(SCS("~basic_function"),(nco_int)var1->type); break; case PNDIMS: var=ncap_sclr_var_mk(SCS("~basic_function"),(nco_int)var1->nbr_dim); } // end switch var1=nco_var_free(var1); return var; } //Math Functions /******************************************/ mth_cls::mth_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ /* Basic math: acos, asin, atan, cos, exp, log, log10, rnd_nbr, sin, sqrt, tan */ //sym_vtr.push_back(sym_cls("rnd_nbr",rnd_nbr,rnd_nbrf)); sym_vtr.push_back(sym_cls("acos",acos,acosf)); sym_vtr.push_back(sym_cls("asin",asin,asinf)); sym_vtr.push_back(sym_cls("atan",atan,atanf)); sym_vtr.push_back(sym_cls("cos",cos,cosf)); sym_vtr.push_back(sym_cls("exp",exp,expf)); sym_vtr.push_back(sym_cls("fabs",fabs,fabsf)); sym_vtr.push_back(sym_cls("log",log,logf)); sym_vtr.push_back(sym_cls("log10",log10,log10f)); sym_vtr.push_back(sym_cls("sin",sin,sinf)); sym_vtr.push_back(sym_cls("sqrt",sqrt,sqrtf)); sym_vtr.push_back(sym_cls("tan",tan,tanf)); /* Basic math synonyms: ln */ sym_vtr.push_back(sym_cls("ln",log,logf)); /* ln() is synonym for log() */ /* Basic Rounding: ceil, fl vtr_args; // de-reference prs_cls* prs_arg=walker.prs_arg; susg="usage: var_out="+sfnm+"(var_exp)"; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); // no arguments - bomb out if(nbr_args==0){ std::string serr; serr="Function has been called with no argument\n"+susg; err_prn(sfnm,serr); // more than one arg -- only print message once } else if(nbr_args >1 && !prs_arg->ntl_scn) wrn_prn(sfnm,"Function has been called with more than one argument"); var1=walker.out(vtr_args[0]); var=ncap_var_fnc(var1, sym_vtr[fdx]._fnc_dbl,sym_vtr[fdx]._fnc_flt); return var; } //Maths2 - Maths functions that take 2 args /*********/ mth2_cls::mth2_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("pow",this,(int)PPOW)); fmc_vtr.push_back( fmc_cls("atan2",this,(int)PATAN2)); fmc_vtr.push_back( fmc_cls("convert",this,(int)PCONVERT)); } } var_sct *mth2_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("mth2_cls::fnd"); int fdx=fmc_obj.fdx(); //index int nbr_args=0; var_sct *var=NULL_CEWI; var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; std::string susg; std::string sfnm =fmc_obj.fnm(); //method name RefAST tr; std::vector vtr_args; prs_cls* prs_arg=walker.prs_arg; susg="usage: var_out="+sfnm+"(var_exp,var_exp)"; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); // no arguments - bomb out if(nbr_args<2){ std::string serr; serr="Function has been called with less than two argument\n"+susg; err_prn(sfnm,serr); // more than one arg -- only print message once } else if(nbr_args >2 && !prs_arg->ntl_scn) wrn_prn(sfnm,"Function has been called with more than two arguments"); var1=walker.out(vtr_args[0]); // var2=walker.out(vtr_args[1]); // check for undefined if( var1->undefined || var2->undefined ) { var1=nco_var_free(var1); var2=nco_var_free(var2); var=ncap_var_udf("~mth2_cls"); return var; } switch(fdx){ case PPOW: var=ncap_var_var_op(var1,var2,CARET); break; case PATAN2: var=ncap_var_var_op(var1,var2,ATAN2); break; case PCONVERT: if(prs_arg->ntl_scn){ var=ncap_var_udf("~mth2_cls"); }else{ /* Change type to int */ int c_typ; var2=nco_var_cnf_typ(NC_INT,var2); (void)cast_void_nctype(NC_INT,&var2->val); c_typ=var2->val.ip[0]; (void)cast_nctype_void(NC_INT,&var2->val); var2=nco_var_free(var2); var=nco_var_cnf_typ( (nc_type)c_typ, var1); } break; } return var; } //PDQ Functions /******************************************/ pdq_cls::pdq_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("reverse",this,(int)PREVERSE)); fmc_vtr.push_back( fmc_cls("permute",this,(int)PPERMUTE)); } } var_sct *pdq_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("pdq_cls::fnd"); int idx; int jdx; int fdx; int nbr_args; int nbr_dim; var_sct *var_in=NULL_CEWI; var_sct *var_out=NULL_CEWI; std::string sfnm; std::string styp; std::string serr; RefAST tr; std::vector str_vtr; std::vector vtr_args; NcapVector dmn_vtr; // de-reference prs_cls *prs_arg=walker.prs_arg; fdx=fmc_obj.fdx(); sfnm =fmc_obj.fnm(); //method name if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); if(nbr_args==0) err_prn(sfnm,"Function has been called with no arguments"); var_in=walker.out(vtr_args[0]); nbr_dim=var_in->nbr_dim; for(idx=1; idxgetType() ){ case DIM_ID: case DIM_MTD_ID: str_vtr.push_back(vtr_args[idx]->getText()); break; // ignore expr type arguments default: // warn only on final scan if(!prs_arg->ntl_scn) wrn_prn(sfnm,"Argument "+nbr2sng(idx) +" is not a dimension"); break; } // end switch } // end for if(prs_arg->ntl_scn) dmn_vtr=ncap_dmn_mtd(var_in,str_vtr); else{ var_out=nco_var_dpl(var_in); dmn_vtr=ncap_dmn_mtd(var_out,str_vtr); } if(fdx==PPERMUTE){ if((size_t)dmn_vtr.size() < str_vtr.size()) wrn_prn(sfnm, "Unrecognized dimension arguments"); if(dmn_vtr.size() < nbr_dim ) { ostringstream os; os<<"You have only specified "<< dmn_vtr.size()<< " dimension args. You need to specify "<< nbr_dim<<". All of the variable's dimensions must be arguments"; err_prn(sfnm,os.str()); } // Check location of record dimension if not a netcdf4 file if( walker.prs_arg->fl_out_fmt != NC_FORMAT_NETCDF4){ for(idx=0 ; idx0 && dmn_vtr[idx]->is_rec_dmn){ ostringstream os; os<<"The record dimension \""<< dmn_vtr[idx]->nm <<"\" must be the first dimension in the list."; err_prn(fnc_nm,os.str()); } } } } //Initial scan if(prs_arg->ntl_scn ) { if(fdx==PREVERSE || var_in->undefined ) return var_in; // deal with PPERMUTE if(fdx==PPERMUTE){ std::vector cst_vtr; for(idx=0 ; idxnm))); var_out=ncap_cst_mk(cst_vtr,prs_arg); var_out=nco_var_cnf_typ(var_in->type,var_out); var_in=nco_var_free(var_in); return var_out; } } std::vector bool_vtr(nbr_dim,False); std::vector dmn_idx_in_out(nbr_dim,0); std::vector dmn_idx_out_in(nbr_dim,0); switch(fdx) { case PREVERSE: for(idx=0 ; idx < nbr_dim ; idx++){ std::string sdm(var_out->dim[idx]->nm); bool_vtr[idx]= (dmn_vtr.findi(sdm) >=0 ? True:False); //straight mapping !! dmn_idx_out_in[idx]=idx; } break; case PPERMUTE:{ for(idx=0 ; idxdim[idx]->nm); dmn_idx_in_out[idx]=dmn_vtr.findi(sdm); var_out->dim[idx]=dmn_vtr[idx]; var_out->dmn_id[idx]=dmn_vtr[idx]->id; } // create "out_in" mapping from "in_out" mapping for(idx=0 ; idx vtr_args; NcapVector dmn_vtr; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); if(nbr_args<2) err_prn(sfnm, "Function has been called with less than two arguments"); if(nbr_args >2 && !prs_arg->ntl_scn) wrn_prn(sfnm," Function has been called with more than two arguments"); var=walker.out(vtr_args[0]); var_msk=walker.out(vtr_args[1]); // Deal with initial scan if(prs_arg->ntl_scn) { switch(fdx) { case PMASK1: var_msk=nco_var_cnf_typ(var->type,var_msk); var=nco_var_free(var); return var_msk; break; case PMASK_CLIP: var_msk=nco_var_free(var_msk); return var; break; }// end switch } // end if if( fdx==PMASK_CLIP && var->sz%var_msk->sz !=0 ) { std::ostringstream os; os<< " Function cannot clip var "; os<< var->nm <<" as size(" <sz<<") is not divisible by mask var "<nm <<" size("<< var_msk->sz <<")"; err_prn(sfnm,os.str()); } switch(fdx) { case PMASK_CLIP: { char *cp_in; char *cp_out; short *sp; long idx; long jdx; long cnt; long msk_sz=var_msk->sz; size_t slb_sz; var_msk=nco_var_cnf_typ(NC_SHORT,var_msk); slb_sz=nco_typ_lng(var->type); cnt=var->sz/var_msk->sz; (void)cast_void_nctype(NC_SHORT,&var_msk->val); //Dereference sp=var_msk->val.sp; for(idx=0; idx val.vp)+(size_t)(idx*msk_sz*slb_sz); cp_in=cp_out; for(jdx=0 ;jdxval); var_msk=nco_var_free(var_msk); return var; } break; case PMASK1: { //convert to ints char *cp_in; char *cp_out; long idx; nco_int *ip; long var_sz; long msk_sz; size_t slb_sz; var_sct *var_out; var_msk=nco_var_cnf_typ(NC_INT,var_msk); var_out=nco_var_dpl(var_msk); var_out=nco_var_cnf_typ(var->type,var_out); // De-Reference (void)cast_void_nctype(NC_INT,&var_msk->val); ip=var_msk->val.ip; msk_sz=var_msk->sz; var_sz=var->sz; slb_sz=nco_typ_lng(var->type); cp_out=(char*)(var_out->val.vp); for(idx=0 ; idxFORTRAN_IDX_CNV) { if( ip[idx]<1L || ip[idx] > var_sz){ std::ostringstream os; os<<" Function reporting that fortran index "<nm<<" is out of bounds 1"<<"-"<= var_sz){ std::ostringstream os; os<<"Function reporting that index "<nm<<" is out of bounds 0"<<"-"<val.vp)+ (size_t)ip[idx]*slb_sz; (void)memcpy(cp_out,cp_in ,slb_sz); cp_out+=slb_sz; } // end for (void)cast_nctype_void(NC_INT,&var_msk->val); var_msk=nco_var_free(var_msk); var=nco_var_free(var); return var_out; } break; } // end switch return NULL; // fxm csz correct? 20090228 } // end function //Pack Function /******************************************/ pck_cls::pck_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("pack",this,(int)PPACK)); fmc_vtr.push_back( fmc_cls("pack_byte",this,(int)PPACK_BYTE)); fmc_vtr.push_back( fmc_cls("pack_char",this,(int)PPACK_CHAR)); fmc_vtr.push_back( fmc_cls("pack_short",this,(int)PPACK_SHORT)); fmc_vtr.push_back( fmc_cls("pack_int",this,(int)PPACK_INT)); fmc_vtr.push_back( fmc_cls("unpack",this,(int)PUNPACK)); } } var_sct *pck_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("pck_cls::fnd"); int nbr_args; int fdx=fmc_obj.fdx(); //index prs_cls *prs_arg=walker.prs_arg; var_sct *var_in=NULL_CEWI; var_sct *var_out=NULL_CEWI; nc_type typ; nco_bool PCK_VAR_WITH_NEW_PCK_ATT; std::string susg; std::string serr; std::string sfnm=fmc_obj.fnm(); RefAST tr; std::vector vtr_args; susg="usage: var_out="+sfnm+"(var_in)"; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); if(nbr_args==0) err_prn(sfnm,"Function has been called with no argument\n"+susg); if(nbr_args>1 && !prs_arg->ntl_scn) wrn_prn(sfnm,"Function has been called with more than one argument"); var_in=walker.out(vtr_args[0]); switch(fdx) { case PPACK: case PPACK_SHORT: typ=NC_SHORT; break; case PPACK_BYTE: typ=NC_BYTE; break; case PPACK_CHAR: typ=NC_CHAR; break; case PPACK_INT: typ=NC_INT; break; case PUNPACK: break; } /* deal with initial scan */ if(prs_arg->ntl_scn ){ switch(fdx) { case PPACK: case PPACK_SHORT: case PPACK_BYTE: case PPACK_CHAR: case PPACK_INT: var_out=nco_var_cnf_typ(typ, var_in); break; case PUNPACK: var_sct *var_att; var_att=ncap_att_get(var_in->id,var_in->nm,"scale_factor",1,prs_arg); if(var_att == (var_sct*)NULL) var_att=ncap_att_get(var_in->id,var_in->nm,"add_offset",1,prs_arg); if(var_att==(var_sct*)NULL){ var_in=nco_var_free(var_in); var_out=ncap_var_udf("~dot_methods"); }else{ var_out=nco_var_cnf_typ(var_att->type, var_in); var_att=nco_var_free(var_att); } break; } /* end switch */ return var_out; } /* if initial scan */ /* Deal with final scan */ switch(fdx) { case PPACK: case PPACK_SHORT: case PPACK_BYTE: case PPACK_CHAR: case PPACK_INT: var_out=nco_var_pck(var_in,typ,&PCK_VAR_WITH_NEW_PCK_ATT); //var_in=nco_var_free(var_in); break; case PUNPACK: // Unpacking variable does not create duplicate so DO NOT free var var_out=nco_var_upk(var_in); break; } return var_out; } //Sort Functions /***********************************/ srt_cls::srt_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("sort" , this,PASORT)); fmc_vtr.push_back( fmc_cls("asort" , this,PASORT)); fmc_vtr.push_back( fmc_cls("dsort" , this,PDSORT)); fmc_vtr.push_back( fmc_cls("remap" , this,PREMAP)); fmc_vtr.push_back( fmc_cls("unmap" , this,PUNMAP)); fmc_vtr.push_back( fmc_cls("invert_map" , this,PIMAP)); } } var_sct *srt_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_fit_cls::fnd"); bool is_mtd; int fdx=fmc_obj.fdx(); //index RefAST tr; std::vector vtr_args; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } is_mtd=(expr ? true: false); switch(fdx){ case PASORT: case PDSORT: return srt_fnd(is_mtd,vtr_args,fmc_obj,walker); break; case PREMAP: case PUNMAP: return mst_fnd(is_mtd,vtr_args,fmc_obj,walker); case PIMAP: return imap_fnd(is_mtd,vtr_args,fmc_obj,walker); break; } } // end gsl_fit_cls::fnd var_sct * srt_cls::imap_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("srt_cls::imap_fnd"); int nbr_args; int fdx=fmc_obj.fdx(); var_sct *var1=NULL_CEWI; var_sct *var_ret=NULL_CEWI; nc_type styp; // used to hold the mapping type either NC_INT or NC_UINT64 std::string sfnm =fmc_obj.fnm(); //method name std::string var_nm; std::string susg; prs_cls *prs_arg=walker.prs_arg; nbr_args=args_vtr.size(); if(nbr_args==0) err_prn(sfnm,"Function has been called with no arguments"); var1=walker.out(args_vtr[0]); if(prs_arg->ntl_scn) return var1; // remember original type styp=var1->type; var1=nco_var_cnf_typ((nc_type)NC_UINT64, var1); // var2 contains the mapping (void)cast_void_nctype((nc_type)NC_UINT64,&var1->val); { long idx; long sz; nco_uint64 *lp_mp; nco_uint64 *lp_mp_out; sz=var1->sz; lp_mp=var1->val.ui64p; lp_mp_out=(nco_uint64*)nco_calloc(sz,sizeof( nco_uint64)); for(idx=0;idxval.ui64p); var1->val.ui64p=lp_mp_out; } (void)cast_nctype_void((nc_type)NC_UINT64,&var1->val); // convert back to original type var1=nco_var_cnf_typ(styp, var1); return var1; } var_sct * srt_cls::srt_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("srt_cls::srt_fnd"); int nbr_args; int fdx=fmc_obj.fdx(); var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; nc_type mp_typ; // used to hold the mapping type either NC_INT or NC_UINT64 std::string sfnm =fmc_obj.fnm(); //method name std::string styp; std::string var_nm; std::string susg; bool bdirection; // ascending or desending sort prs_cls *prs_arg=walker.prs_arg; nbr_args=args_vtr.size(); susg="usage: var_out="+sfnm+"(var_exp,&var_map)\n"; mp_typ=NC_INT; #ifdef ENABLE_NETCDF4 { /* scope for fl_fmt temporary */ int fl_fmt; (void)nco_inq_format(walker.prs_arg->out_id,&fl_fmt); if(fl_fmt==NC_FORMAT_NETCDF4 || fl_fmt==NC_FORMAT_NETCDF4_CLASSIC) mp_typ=NC_UINT64; else mp_typ=NC_INT; } /* end scope */ #endif if(nbr_args==0) err_prn(sfnm,"Function has been called with no arguments"); var1=walker.out(args_vtr[0]); if(nbr_args>1){ bool bdef; NcapVar *Nvar; if(args_vtr[1]->getType() != CALL_REF ) err_prn(sfnm," second argument must be a call by reference variable\n"+susg); var_nm=args_vtr[1]->getFirstChild()->getText(); bdef=prs_arg->ncap_var_init_chk(var_nm); Nvar=prs_arg->var_vtr.find(var_nm); /*This horrible line below: Initial scan -- prs_arg->ntl_scn=True If variable has been already been defined: Then read it. Final scan -- prs_arg->ntl_scn=False We have the situation where call by-ref variable has been defined in the first pass, but not populated i.e Nvar->flg_stt==1. So we create the variable from var1. Also covered is the situation where the call_by_ref variable has been defined and populated earlier in the script i.e Nvar->flg_stt==2. So we simly read in this variable */ if(bdef && prs_arg->ntl_scn || bdef && !prs_arg->ntl_scn && Nvar->flg_stt==2 ){ var2=prs_arg->ncap_var_init(var_nm,true); }else{ var2=nco_var_dpl(var1); if(!var2->undefined) var2=nco_var_cnf_typ(mp_typ,var2); nco_free(var2->nm); var2->nm=strdup(var_nm.c_str()); } if(prs_arg->ntl_scn) prs_arg->ncap_var_write(var2,false); } if(prs_arg->ntl_scn) return var1; if(fdx==PASORT) bdirection=true; if(fdx==PDSORT) bdirection=false; if(var2==NULL){ if(bdirection) var1=ncap_var_var_op(var1,(var_sct*)NULL,VSORT); else var1=ncap_var_var_op(var1,(var_sct*)NULL,VRSORT); }else{ // convert map var2=nco_var_cnf_typ(mp_typ, var2); // check if map is large enough if( var2->sz < var1->sz) { ostringstream os; os<<"Size of map "<sz<<") is less than size of var(" << var1->sz<<")"; err_prn(sfnm,os.str()); } switch (var1->type) { case NC_DOUBLE: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_FLOAT: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_INT: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_SHORT: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_USHORT: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_UINT: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_INT64: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_UINT64: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_BYTE: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_UBYTE: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_CHAR: (void)ncap_sort_and_map(var1,var2,bdirection); break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } // end big switch // Write out mapping (void)prs_arg->ncap_var_write(var2,false); } return var1; } // end srt_cls::srt_fnd() var_sct * srt_cls::mst_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("srt_cls::mst_fnd"); int nbr_args; int fdx=fmc_obj.fdx(); var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; prs_cls *prs_arg=walker.prs_arg; nbr_args=args_vtr.size(); susg="usage: var_out="+sfnm+"(var_exp,var_map)\n"; if(nbr_args<2 ) err_prn(sfnm,"Function requires two arguments\n"+susg); // only warn on final scan if(nbr_args>2 && !prs_arg->ntl_scn) err_prn(sfnm,"Function has more than two arguments"); var1=walker.out(args_vtr[0]); var2=walker.out(args_vtr[1]); var2=nco_var_cnf_typ((nc_type)NC_UINT64, var2); if(prs_arg->ntl_scn){ var2=nco_var_free(var2); return var1; } // here usage PREMAP, PUNMAP { char *cp_in; char *cp_out; long idx; long jdx; long sz; long sz_idx; long slb_sz; nco_uint64 *lp_mp; var_sct *var_out; var_out=nco_var_dpl(var1); sz=var2->sz; sz_idx=var_out->sz/var2->sz; // var size must be exactly divisble by map size if( var_out->sz % var2->sz != 0 ) { ostringstream os; os<<"Size of input var("<< var_out->sz<<") must be exactly divisble by map size(" << var2->sz<<")"; err_prn(sfnm,os.str()); } slb_sz=nco_typ_lng(var_out->type); cp_in=(char*)var1->val.vp; cp_out=(char*)var_out->val.vp; // var2 contains the mapping (void)cast_void_nctype((nc_type)NC_UINT64,&var2->val); lp_mp=var2->val.ui64p; switch(fdx){ case PREMAP: for(idx=0; idxval.vp+ (ptrdiff_t)idx*sz*slb_sz; for(jdx=0 ;jdx=0 && lp_mp[jdx]< sz ) // copy element from var1 to var_out (void)memcpy(cp_out+(ptrdiff_t)(lp_mp[jdx]*slb_sz),cp_in,slb_sz); cp_in+=(ptrdiff_t)slb_sz; } // end jdx } //end idx; break; // reverse map case PUNMAP: for(idx=0; idxval.vp+ (ptrdiff_t)idx*sz*slb_sz; for(jdx=0 ;jdx=0 && lp_mp[jdx]< sz ) // copy element from var1 to var_out (void)memcpy(cp_out,cp_in+(ptrdiff_t)(lp_mp[jdx]*slb_sz),slb_sz); cp_out+=(ptrdiff_t)slb_sz; } // end jdx } //end idx; break; } // end switch var1=nco_var_free(var1); (void)cast_nctype_void((nc_type)NC_UINT64,&var2->val); var2=nco_var_free(var2); var1=var_out; } return var1; } // end srt_cls::mst_fnd() // MIN & MAX INDEX Functions /***********************************/ agg_idx_cls::agg_idx_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("min_index" , this,PMIN)); fmc_vtr.push_back( fmc_cls("max_index" , this,PMAX)); } } var_sct *agg_idx_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("agg__idx_cls::fnd"); int fdx; int nbr_args; int idx; int nbr_dim; long sz_dim=1L; long my_index=0L; dmn_sct **dim; dmn_sct **dim_nw=NULL_CEWI; var_sct *var=NULL_CEWI; var_sct *var_out=NULL_CEWI; std::string susg; std::string sfnm=fmc_obj.fnm(); RefAST aRef; RefAST tr; std::vector vtr_args; nc_type mp_typ=NC_INT; // de-reference prs_cls *prs_arg=walker.prs_arg; fdx=fmc_obj.fdx(); // Put args into vector if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); susg="usage: var_out="+sfnm+"(var_in)"; if(nbr_args==0) err_prn(sfnm, " Function has been called with no arguments\n"+susg); var=walker.out(vtr_args[0]); #ifdef ENABLE_NETCDF4 { /* scope for fl_fmt temporary */ int fl_fmt; (void)nco_inq_format(walker.prs_arg->out_id,&fl_fmt); if(fl_fmt==NC_FORMAT_NETCDF4 || fl_fmt==NC_FORMAT_NETCDF4_CLASSIC) mp_typ=NC_UINT64; else mp_typ=NC_INT; } /* end scope */ #endif if(prs_arg->ntl_scn) { if(var->undefined ) { var_out=ncap_var_udf("~dot_methods"); } else { // create empty var to return var_out=ncap_sclr_var_mk(SCS("~zz@value_list"),mp_typ,false); var_out->sz=var->nbr_dim; } nco_var_free(var); return var_out; } nbr_dim=var->nbr_dim; // create return attribute/var var_out=ncap_sclr_var_mk(SCS("~zz@value_list"),NC_UINT64,true); var_out->has_dpl_dmn=-1; ncap_att_stretch(var_out, nbr_dim); cast_void_nctype(NC_UINT64,&var_out->val); cast_void_nctype(var->type,&var->val); // now do heavy lifting if(fdx==PMIN) { switch (var->type) { case NC_DOUBLE: my_index=ncap_min_index(var); break; case NC_FLOAT: my_index=ncap_min_index(var); break; case NC_INT: my_index=ncap_min_index(var); break; case NC_SHORT: my_index=ncap_min_index(var); break; case NC_USHORT: my_index=ncap_min_index(var); break; case NC_UINT: my_index=ncap_min_index(var); break; case NC_INT64: my_index=ncap_min_index(var); break; case NC_UINT64: my_index=ncap_min_index(var); break; case NC_BYTE: my_index=ncap_min_index(var); break; case NC_UBYTE: my_index=ncap_min_index(var); break; case NC_CHAR: my_index=ncap_min_index(var); break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } // end big switch } if(fdx==PMAX) { switch (var->type) { case NC_DOUBLE: my_index=ncap_max_index(var); break; case NC_FLOAT: my_index=ncap_max_index(var); break; case NC_INT: my_index=ncap_max_index(var); break; case NC_SHORT: my_index=ncap_max_index(var); break; case NC_USHORT: my_index=ncap_max_index(var); break; case NC_UINT: my_index=ncap_max_index(var); break; case NC_INT64: my_index=ncap_max_index(var); break; case NC_UINT64: my_index=ncap_max_index(var); break; case NC_BYTE: my_index=ncap_max_index(var); break; case NC_UBYTE: my_index=ncap_max_index(var); break; case NC_CHAR: my_index=ncap_max_index(var); break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } // end big switch } sz_dim=1L; // convert my_index into multiple indices for(idx=0;idxcnt[idx]; for(idx=0; idxcnt[idx]; var_out->val.ui64p[idx]=my_index/sz_dim; my_index-=var_out->val.ui64p[idx]*sz_dim; } cast_nctype_void(NC_UINT64,&var_out->val); if(var_out->type != mp_typ) nco_var_cnf_typ(mp_typ,var_out); nco_var_free(var); return var_out; } //Unary Functions /***********************************/ unr_cls::unr_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("abs",this,PABS)); fmc_vtr.push_back( fmc_cls("sqr",this,PSQR)); } } var_sct * unr_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("unr_cls::fnd"); int fdx; int nbr_args; var_sct *var1; var_sct *var; fdx=fmc_obj.fdx(); std::string susg; std::string sfnm =fmc_obj.fnm(); RefAST tr; std::vector args_vtr; // de-reference prs_cls* prs_arg=walker.prs_arg; susg="usage: var_out="+sfnm+"(var_exp)"; if(expr) args_vtr.push_back(expr); if(tr=fargs->getFirstChild()) { do args_vtr.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=args_vtr.size(); // no arguments - bomb out if(nbr_args==0){ std::string serr; serr="Function has been called with no argument\n"+susg; err_prn(sfnm,serr); // more than one arg -- only print message once } else if(nbr_args >1 && !prs_arg->ntl_scn) wrn_prn(sfnm,"Function has been called with more than one argument"); var1=walker.out(args_vtr[0]); if(prs_arg->ntl_scn) return var1; // do the deed switch(fdx){ case PABS: var1=ncap_var_var_op(var1,NULL_CEWI,VABS); break; case PSQR: var1=ncap_var_var_op(var1,NULL_CEWI,VSQR2); break; } return var1; } //Array Functions /***********************************/ arr_cls::arr_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("array",this,PARRAY)); } } var_sct * arr_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("arr_cls::fnd"); int fdx; int nbr_args; int idx; int nbr_dim; dmn_sct **dim; var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; var_sct *var_ret; std::string susg; std::string sfnm=fmc_obj.fnm(); RefAST tr; std::vector args_vtr; std::vector cst_vtr; // de-reference prs_cls *prs_arg=walker.prs_arg; vtl_typ lcl_typ; fdx=fmc_obj.fdx(); if(expr) args_vtr.push_back(expr); if(tr=fargs->getFirstChild()) { do args_vtr.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=args_vtr.size(); susg="usage: var_out="+sfnm+"(start_exp,inc_exp,$dim|var)"; if(nbr_args<3) err_prn(sfnm,"Function has been called with less than three arguments\n"+susg); if(nbr_args >3 &&!prs_arg->ntl_scn) wrn_prn(sfnm,"Function been called with more than three arguments"); var1=walker.out(args_vtr[0]); var2=walker.out(args_vtr[1]); if(prs_arg->ntl_scn && var1->undefined ){ var2=nco_var_free(var2); return var1; } /* third argument must be a single dimension */ //if(args_vtr[2]->getType() != DIM_ID ) // err_prn(sfnm,"Third argument must be a dimension\n"+susg); // cast a var from using the dim arg if(args_vtr[2]->getType() == DIM_ID ) { cst_vtr.push_back(args_vtr[2]->getText()); var_ret=ncap_cst_mk(cst_vtr,prs_arg); // convert to type of first arg var_ret=nco_var_cnf_typ(var1->type,var_ret); }else{ // assume third argument is var - interested in only using its shape !! var_ret=walker.out(args_vtr[2]); for(idx=0; idxnbr_dim;idx++) cst_vtr.push_back(var_ret->dim[idx]->nm); var_ret=ncap_cst_mk(cst_vtr,prs_arg); // convert to type of first arg var_ret=nco_var_cnf_typ(var1->type,var_ret); } if(prs_arg->ntl_scn){ var1=nco_var_free(var1); var2=nco_var_free(var2); return var_ret; } // do the deed switch(fdx){ // This array method returns an array of numbers of type var1->type // The array starts at the first value in var1 and the increment is // is the first value in var2. When necessary the var2 type is converted // to the var one type. The size of array is equal to the dimension size // arguments // e.g., var_out=array(1,-3, $time); // var_out={1,-2,-5,-8,-11,-14,-17,-20,-23,-26 }; case PARRAY: { var2=nco_var_cnf_typ(var1->type,var2); // malloc space var_ret->val.vp= (void*)nco_malloc(var_ret->sz*nco_typ_lng(var1->type)); switch (var1->type) { case NC_DOUBLE: (void)ncap_array(var1,var2,var_ret); break; case NC_FLOAT: (void)ncap_array(var1,var2,var_ret); break; case NC_INT: (void)ncap_array(var1,var2,var_ret); break; case NC_SHORT: (void)ncap_array(var1,var2,var_ret); break; case NC_USHORT: (void)ncap_array(var1,var2,var_ret); break; case NC_UINT: (void)ncap_array(var1,var2,var_ret); break; case NC_INT64: (void)ncap_array(var1,var2,var_ret); break; case NC_UINT64: (void)ncap_array(var1,var2,var_ret); break; case NC_BYTE: (void)ncap_array(var1,var2,var_ret); break; case NC_UBYTE: (void)ncap_array(var1,var2,var_ret); break; case NC_CHAR: (void)ncap_array(var1,var2,var_ret); break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } // end big switch var1=nco_var_free(var1); var2=nco_var_free(var2); } break; } // end switch return var_ret; } //Bilinear Interpolation Functions /****************************************/ bil_cls::bil_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("bilinear_interp",this,PBIL_ALL)); fmc_vtr.push_back( fmc_cls("bilinear_interp_wrap",this,PBIL_ALL_WRP)); } } var_sct * bil_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("bil_cls::fnd"); bool bwrp; //if tue then wrap X and Y coo-ordinates in grid bool b_rev_y; bool b_rev_x; int fdx; int nbr_args; int in_nbr_args; int idx; int nbr_dim; var_sct *var_arr[6]; nc_type in_typ; std::string susg; std::string sfnm=fmc_obj.fnm(); std::string serr; RefAST tr; std::vector vtr_args; // de-reference prs_cls *prs_arg=walker.prs_arg; vtl_typ lcl_typ; fdx=fmc_obj.fdx(); if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); switch(fdx){ case PBIL_ALL: in_nbr_args=nbr_args; susg="usage: var_out="+sfnm+"(Data_in, Data_out, X_out?, Y_out?, X_in?, Y_in?)"; bwrp=false; break; case PBIL_ALL_WRP: in_nbr_args=nbr_args; susg="usage: var_out="+sfnm+"(Data_in, Data_out, X_out?, Y_out?, X_in?, Y_in?)"; bwrp=true; break; } // end switch if(in_nbr_args <2 ){ serr="function requires at least two arguments. You have only supplied "+nbr2sng(in_nbr_args)+ " arguments\n"; err_prn(sfnm,serr+susg); } if(in_nbr_args >6 &&!prs_arg->ntl_scn) wrn_prn(sfnm,"Function been called with more than "+ nbr2sng(in_nbr_args)+ "arguments"); // process input args for(idx=0 ; idxtype; // initial scan if(prs_arg->ntl_scn){ var_arr[1]=nco_var_cnf_typ(in_typ,var_arr[1]); for(idx=0 ; idxnbr_dim <2 ) err_prn(sfnm,"Output data variable "+std::string(var_arr[1]->nm) + " must have at least two dimensions "); // get output co-ordinate vars if(in_nbr_args <3) var_arr[2]=prs_arg->ncap_var_init(std::string(var_arr[1]->dim[0]->nm),true); var_arr[3]=prs_arg->ncap_var_init(std::string(var_arr[1]->dim[1]->nm),true); } if(in_nbr_args<6){ if(var_arr[0]->nbr_dim <2 ) err_prn(sfnm,"Input data variable "+std::string(var_arr[0]->nm) + " must have at least two dimensions "); // get input co-ordinate vars if(in_nbr_args <5) var_arr[4]=prs_arg->ncap_var_init(std::string(var_arr[0]->dim[0]->nm),true); var_arr[5]=prs_arg->ncap_var_init(std::string(var_arr[0]->dim[1]->nm),true); } // convert all args to type double and then cast for(idx=0 ; idx<6; idx++){ var_arr[idx]=nco_var_cnf_typ(NC_DOUBLE,var_arr[idx]); (void)cast_void_nctype(NC_DOUBLE,&var_arr[idx]->val); } // call generic function (void)clc_bil_fnc(var_arr[4],var_arr[5],var_arr[0],var_arr[2],var_arr[3],var_arr[1],bwrp,sfnm); // cast back to void and free for(idx=0 ; idx<6; idx++){ (void)cast_nctype_void(NC_DOUBLE,&var_arr[idx]->val); if(idx !=1) (void)nco_var_free(var_arr[idx]); } // convert to input type var_arr[1]=nco_var_cnf_typ(in_typ,var_arr[1]); return var_arr[1]; } } // end fnc // Generic function for bilinear interpolation // function assumes all arguments are of type double and that // v_xin & v_yin are monotonic(increasing or decreasing with respect to var->sz void bil_cls::clc_bil_fnc(var_sct *v_xin,var_sct *v_yin, var_sct *v_din, var_sct *v_xout,var_sct *v_yout, var_sct *v_dout,bool bwrp,std::string sfnm){ bool b_rev_x; // flg v_xin monotonic( increasing - false dcreasing true ) bool b_rev_y; // flg v_yin monotonic( increasing - false dcreasing true ) long x_sz; // size of X dim in OUTPUT long y_sz; // size of Y dim in OUTPUT long jdx; long kdx; // Sanity check for input/ooooutput data if( v_xin->sz *v_yin->sz != v_din->sz) err_prn(sfnm,"Dimension size mismatch with input variables\n"); if( v_xout->sz *v_yout->sz != v_dout->sz) err_prn(sfnm,"Dimension size mismatch with output variables\n"); b_rev_x=false; // assume X input monotnic - if decreasing, reverse and set flag if( v_xin->sz >1 && v_xin->val.dp[0]> v_xin->val.dp[1] ){ reverse(v_xin->val.dp,v_xin->val.dp+v_xin->sz); b_rev_x=true; } b_rev_y=false; // assume Y input monotnic - if decreasing, reverse and set flag if( v_yin->sz >1 && v_yin->val.dp[0]> v_yin->val.dp[1] ){ reverse(v_yin->val.dp,v_yin->val.dp+v_yin->sz); b_rev_y=true; } x_sz=v_xout->sz; y_sz=v_yout->sz; // deal with regular unwrapped grid if(!bwrp){ for(jdx=0 ; jdxval.dp, v_yin->val.dp+v_yin->sz, v_yout->val.dp[jdx])-v_yin->val.dp); // do some bounds checking if(y_min==v_yin->sz || y_min==0L && v_yout->val.dp[jdx]< v_yin->val.dp[0] ) err_prn(sfnm, "Bounding error with \""+string(v_yout->nm)+"\" output co-ordinate variable"); // not an exact match if(v_yout->val.dp[jdx]< v_yin->val.dp[y_min]) y_max=y_min--; else // exact match y_max=y_min; // Y co-ordinate reversed ? if(b_rev_y){ y_min_org=v_yin->sz-y_min-1; y_max_org=v_yin->sz-y_max-1; }else{ y_min_org=y_min; y_max_org=y_max; } for(kdx=0;kdxval.dp, v_xin->val.dp+v_xin->sz, v_xout->val.dp[kdx])-v_xin->val.dp); // do some bounds checking if(x_min==v_xin->sz || x_min==0L && v_xout->val.dp[kdx]< v_xin->val.dp[0] ) err_prn(sfnm, "Bounding error with \""+string(v_xout->nm)+"\" output co-ordinate variable"); // not an exact match if( v_xout->val.dp[kdx] < v_xin->val.dp[x_min]) x_max=x_min--; // an exact match else x_max=x_min; // X co-ordinate reversed if(b_rev_x){ Q[0][0]=v_din->val.dp[(v_xin->sz-x_min-1)*v_yin->sz+y_min_org]; Q[1][0]=v_din->val.dp[(v_xin->sz-x_max-1)*v_yin->sz+y_min_org]; Q[0][1]=v_din->val.dp[(v_xin->sz-x_min-1)*v_yin->sz+y_max_org]; Q[1][1]=v_din->val.dp[(v_xin->sz-x_max-1)*v_yin->sz+y_max_org]; }else{ Q[0][0]=v_din->val.dp[x_min*v_yin->sz+y_min_org]; Q[1][0]=v_din->val.dp[x_max*v_yin->sz+y_min_org]; Q[0][1]=v_din->val.dp[x_min*v_yin->sz+y_max_org]; Q[1][1]=v_din->val.dp[x_max*v_yin->sz+y_max_org]; } //deal with no missing values in v_din if( !v_din->has_mss_val ) { if(x_min==x_max && y_min==y_max) rslt=Q[0][0]; else if( y_min==y_max) rslt=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); else if( x_min==x_max) rslt=clc_lin_ipl(v_yin->val.dp[y_min],v_yin->val.dp[y_max],v_yout->val.dp[jdx],Q[0][0],Q[1][1]); else{ d_int1=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); d_int2=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][1],Q[1][1]); rslt=clc_lin_ipl(v_yin->val.dp[y_min],v_yin->val.dp[y_max],v_yout->val.dp[jdx],d_int1,d_int2); } // missing values }else{ cast_void_nctype(NC_DOUBLE,&v_din->mss_val); double mss_dbl=*v_din->mss_val.dp; cast_nctype_void(NC_DOUBLE,&v_din->mss_val); bool mQ00=Q[0][0]==mss_dbl ? true : false; bool mQ10=Q[1][0]==mss_dbl ? true : false; bool mQ01=Q[0][1]==mss_dbl ? true : false; bool mQ11=Q[1][1]==mss_dbl ? true : false; // nb its possible with below for d_int1 to be assigned missing value if(mQ00) d_int1=Q[1][0]; else if(mQ10) d_int1=Q[0][0]; else d_int1=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); // nb its possible with below for d_int2 to be assigned missing value if(mQ01) d_int2=Q[1][1]; else if(mQ11) d_int2=Q[0][1]; else d_int2=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][1],Q[1][1]); // nb its possible with below for rslt to be assigned missing value if(d_int1==mss_dbl) rslt=d_int2; else if(d_int2==mss_dbl) rslt=d_int1; else rslt=clc_lin_ipl(v_yin->val.dp[y_min],v_yin->val.dp[y_max],v_yout->val.dp[jdx],d_int1,d_int2); } v_dout->val.dp[kdx*v_yout->sz+jdx]=rslt; }//end for kdx }// end for jdx // deal with wrapped co-ordinates }else{ for(jdx=0 ; jdxval.dp, v_yin->val.dp+v_yin->sz, v_yout->val.dp[jdx])-v_yin->val.dp); // point off RHS of grid if(y_min==v_yin->sz){ y_min--; y_max=0; y_min_dbl=v_yin->val.dp[y_min]; y_max_dbl=v_yin->val.dp[y_max]+360.0; // exact match } else if(v_yout->val.dp[jdx]==v_yin->val.dp[y_min]){ y_max=y_min; y_min_dbl=y_max_dbl=v_yin->val.dp[y_min]; // point off LHS side of grid } else if( y_min==0){ y_min=v_yin->sz-1;y_max=0; y_min_dbl=v_yin->val.dp[y_min]-360.0; y_max_dbl=v_yin->val.dp[y_max]; // regular point in grid }else{ y_max=y_min--; y_min_dbl=v_yin->val.dp[y_min]; y_max_dbl=v_yin->val.dp[y_max]; } for(kdx=0;kdxval.dp, v_xin->val.dp+v_xin->sz, v_xout->val.dp[kdx])-v_xin->val.dp); // point off RHS of grid if(x_min==v_xin->sz){ x_min--; x_max=x_min-1; // exact match } else if(v_xout->val.dp[kdx]==v_xin->val.dp[x_min]){ x_max=x_min; // point off LHS side of grid } else if( x_min==0){ x_max=1; // regular point in grid }else{ x_max=x_min--; } // X co-ordinate reversed if(b_rev_x){ Q[0][0]=v_din->val.dp[(v_xin->sz-x_min-1)*v_yin->sz+y_min]; Q[1][0]=v_din->val.dp[(v_xin->sz-x_max-1)*v_yin->sz+y_min]; Q[0][1]=v_din->val.dp[(v_xin->sz-x_min-1)*v_yin->sz+y_max]; Q[1][1]=v_din->val.dp[(v_xin->sz-x_max-1)*v_yin->sz+y_max]; }else{ Q[0][0]=v_din->val.dp[x_min*v_yin->sz+y_min]; Q[1][0]=v_din->val.dp[x_max*v_yin->sz+y_min]; Q[0][1]=v_din->val.dp[x_min*v_yin->sz+y_max]; Q[1][1]=v_din->val.dp[x_max*v_yin->sz+y_max]; } // no missing value if(!v_din->has_mss_val) if(x_min==x_max && y_min==y_max) rslt=Q[0][0]; else if( y_min==y_max) rslt=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); else if( x_min==x_max) rslt=clc_lin_ipl(y_min_dbl,y_max_dbl,v_yout->val.dp[jdx],Q[0][0],Q[1][1]); else{ d_int1=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); d_int2=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][1],Q[1][1]); rslt=clc_lin_ipl(y_min_dbl,y_max_dbl,v_yout->val.dp[jdx],d_int1,d_int2); }else{ // missing value cast_void_nctype(NC_DOUBLE,&v_din->mss_val); double mss_dbl=*v_din->mss_val.dp; cast_nctype_void(NC_DOUBLE,&v_din->mss_val); bool mQ00=Q[0][0]==mss_dbl ? true : false; bool mQ10=Q[1][0]==mss_dbl ? true : false; bool mQ01=Q[0][1]==mss_dbl ? true : false; bool mQ11=Q[1][1]==mss_dbl ? true : false; // nb its possible with below for d_int1 to be assigned missing value if(mQ00) d_int1=Q[1][0]; else if(mQ10) d_int1=Q[0][0]; else d_int1=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][0],Q[1][0]); // nb its possible with below for d_int2 to be assigned missing value if(mQ01) d_int2=Q[1][1]; else if(mQ11) d_int2=Q[0][1]; else d_int2=clc_lin_ipl(v_xin->val.dp[x_min],v_xin->val.dp[x_max],v_xout->val.dp[kdx],Q[0][1],Q[1][1]); // nb its possible with below for rslt to be assigned missing value if(d_int1==mss_dbl) rslt=d_int2; else if(d_int2==mss_dbl) rslt=d_int1; else rslt=clc_lin_ipl(v_yin->val.dp[y_min],v_yin->val.dp[y_max],v_yout->val.dp[jdx],d_int1,d_int2); } v_dout->val.dp[kdx*v_yout->sz+jdx]=rslt; }//end for kdx }// end for jdx }// end else wrapped co-ordinates } // end clc_bil_fnc //Linear interpolation formula double bil_cls::clc_lin_ipl(double x1,double x2, double x, double Q0,double Q1){ const double _delta=1e-20; double n1,n2,d1; if( Q0==Q1 || fabs(d1=x2-x1)<_delta || fabs(n1=x-x1)<_delta ) return Q0; if( fabs(n2=x2-x) <_delta) return Q1; return (n2*Q0+n1*Q1)/d1; } //Coordinate Functions /***********************************/ cod_cls::cod_cls(bool flg_dbg){ //Populate only on constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("min_coords",this,PCOORD)); } } var_sct * cod_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("cod_cls::fnd"); int fdx; int nbr_args; int nbr_dim; long lret; dmn_sct **dim; var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; var_sct *var_ret; std::string susg; std::string sfnm=fmc_obj.fnm(); RefAST tr; std::vector args_vtr; std::vector cst_vtr; // de-reference prs_cls *prs_arg=walker.prs_arg; vtl_typ lcl_typ; fdx=fmc_obj.fdx(); if(expr) args_vtr.push_back(expr); if(tr=fargs->getFirstChild()) { do args_vtr.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=args_vtr.size(); // function takes a coordinate var and value and returns the index of the nearest // grid point. returns -1 if value not in range susg="usage: crd_idx="+sfnm+"(crd_var,crd_value)"; if(nbr_args<2) err_prn(sfnm,"Function has been called with less than two arguments\n"+susg); if(nbr_args >2 &&!prs_arg->ntl_scn) wrn_prn(sfnm,"Function been called with more than two arguments"); var1=walker.out(args_vtr[0]); var2=walker.out(args_vtr[1]); if(prs_arg->ntl_scn ){ nco_var_free(var1); nco_var_free(var2); return ncap_sclr_var_mk(SCS("~coord_function"),(nc_type)NC_INT,false); ; } { bool bInc; long idx; long sz; double dval; double dmin; double *dp_crd; var1=nco_var_cnf_typ(NC_DOUBLE,var1); var2=nco_var_cnf_typ(NC_DOUBLE,var2); // convert everything to type double (void)cast_void_nctype(NC_DOUBLE,&(var1->val)); (void)cast_void_nctype(NC_DOUBLE,&(var2->val)); dp_crd=var1->val.dp; dval=var2->val.dp[0]; sz=var1->sz; // determine if co-ord is montonic increasing or decreasing // true if increasing bInc= ( dp_crd[1] > dp_crd[0]); lret=-1; // set to not in range // check limits co-ord increasing if(bInc){ if(dval>=dp_crd[0] && dval<=dp_crd[sz-1] ) for(idx=0 ; idx= dp_crd[idx] && dval <= dp_crd[idx+1] ){ lret=(dval-dp_crd[idx]<= dp_crd[idx+1]-dval ? idx: idx+1 ); break; } } // check limits co-ord decreasing if(!bInc){ if(dval<=dp_crd[0] && dval>=dp_crd[sz-1] ) for(idx=0 ; idx= dp_crd[idx+1] ){ lret=(dp_crd[idx]-dval <= dval-dp_crd[idx+1] ? idx: idx+1 ); break; } } (void)cast_nctype_void(NC_DOUBLE,&var1->val); (void)cast_nctype_void(NC_DOUBLE,&var2->val); } nco_var_free(var1); nco_var_free(var2); return ncap_sclr_var_mk(SCS("~coord_function"),(nco_int)lret); } //misc Functions /******************************************/ // These fuctions are used to create and apply masks to 2D grid variables // mask_out=imask_make(var_in,lat,lon) // // var_in is a 2D var. mask_out is a 0/1 mask of grid points. // value is set to 1 if point in var_in is missing_value but has a neigbour with a non-missing value; // // var_out=imask_fill(var_in.mask_out,lat,lon) // // Points in var_in are filled if they are missing AND are specified in mask_out. // The fill value is an average from the nearest neigbours. nb if a neighbour has just been filled // in then this value is NOT used in the calculation of the average // Typically mask_out and var_in should be the same shape. // Howver its possible to specify multiple mask in mask_out - in this case each mask is iterativly applied to var_in // so the shape would be like mask_out(mask_size,lat,lon) // // // misc_cls::misc_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("imask",this,(int)PMISC1)); fmc_vtr.push_back( fmc_cls("imask_make",this,(int)PMISC2)); fmc_vtr.push_back( fmc_cls("imask_fill",this,(int)PMISC3)); } } var_sct *misc_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("misc_cls::fnd"); int idx; int fdx=fmc_obj.fdx(); //index int nbr_args; int in_nbr_args; prs_cls* prs_arg=walker.prs_arg; var_sct *var_arr[4]; var_sct *var_out; RefAST tr; nc_type in_typ; std::string susg; std::string serr; std::string sfnm =fmc_obj.fnm(); //method name std::vector vtr_args; NcapVector dmn_vtr; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); switch(fdx){ case PMISC1: in_nbr_args=nbr_args; susg="usage: var_out="+sfnm+"(Data_2D, X_in, Y_in)"; break; case PMISC2: in_nbr_args=nbr_args; susg="usage: var_out="+sfnm+"(data_2D, mask,X_in?, Y_in?)"; break; case PMISC3: in_nbr_args=nbr_args; susg="usage: var_out="+sfnm+"(data_2D,mask, X_in, Y_in)"; break; } // end switch if(in_nbr_args <3 ){ serr="function requires at least two arguments. You have only supplied "+nbr2sng(in_nbr_args)+ " arguments\n"; err_prn(sfnm,serr+susg); } // process input args for(idx=0 ; idxntl_scn){ for(idx=1 ; idxtype; // convert all args to type DOUBLE for(idx=0;idxval); for(idx=0;idxval); // grab missing value; if( var_arr[0]->has_mss_val ){ cast_void_nctype(NC_DOUBLE,&var_arr[0]->mss_val); mss_dbl=*var_arr[0]->mss_val.dp; cast_nctype_void(NC_DOUBLE,&var_arr[0]->mss_val); } dpi=var_arr[0]->val.dp; dpo=var_out->val.dp; v_sz=var_arr[0]->sz; x_sz=var_arr[1]->sz; y_sz=var_arr[2]->sz; // set all values to zero memset((void*)dpo,0, sizeof(double) *v_sz); for(idx=2;idxval); // cast all vars for(idx=0;idxval); v_sz=var_arr[0]->sz; x_sz=var_arr[1]->sz; y_sz=var_arr[2]->sz; dpo=var_out->val.dp; dpi=var_arr[0]->val.dp; dpm=var_arr[1]->val.dp; // grab missing value; if( var_arr[0]->has_mss_val ){ cast_void_nctype(NC_DOUBLE,&var_arr[0]->mss_val); mss_dbl=*var_arr[0]->mss_val.dp; cast_nctype_void(NC_DOUBLE,&var_arr[0]->mss_val); } for(ldx=0; ldx0 ) Q[0]=dpi[ldx-1]; if(iY+10 ) Q[2]=dpi[ldx-y_sz]; if(iX+1 < x_sz) Q[3]=dpi[ldx+y_sz]; for(jdx=0 ; jdx<4 ;jdx++) if(Q[jdx] !=mss_dbl) { sum+=Q[jdx]; cnt++; } if(cnt){ dpo[ldx]=1.0; vmcnt++; } } // end if } // end for if(nco_dbg_lvl_get() >= 2){ os<< sfnm<<": num missing="< vtr_args; prs_cls *prs_arg=walker.prs_arg; std::vector str_vtr; fdx=fmc_obj.fdx(); // Put args into vector if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); susg="usage: att_out="+sfnm+"(att_id, att_nm|var_nm|string)"; if(nbr_args!=2) err_prn(sfnm, " Function has been called with wrong number of arguments arguments\n"+susg); // inital scan just return udf if(prs_arg->ntl_scn) { var=ncap_var_udf("~zz@join_methods"); return var; } var_att=walker.out(vtr_args[0]); if(!var_att ) err_prn(sfnm, " first argument has evaluated to null\n"+susg); if( var_att->type != NC_STRING && var_att->type != NC_CHAR ) err_prn(sfnm, " first argument must be of character string type and NOT("+nbr2sng(var_att->type)+")\n"+susg); ncap_att_str(var_att, str_vtr); // deal with second argument aRef=vtr_args[1]; switch(aRef->getType()) { case VAR_ID: str_vtr.push_back(aRef->getText()); break; case ATT_ID: { var_sct *var_arg; var_arg=walker.out(aRef); ncap_att_str(var_arg, str_vtr); nco_var_free(var_arg); } break; case NSTRING: case N4STRING: str_vtr.push_back(aRef->getText()); break; default: err_prn(sfnm, " problem with second argument, must be a var_nm or a string or a string in an attribute "+susg); } // create output attribute var=ncap_sclr_var_mk("~zz@join_methods",(nc_type)NC_STRING,true); // stretch att if necessary if(str_vtr.size() >1 ) ncap_att_stretch(var, str_vtr.size()); (void)cast_void_nctype((nc_type)NC_STRING,&var->val); for(idx=0;idxval.sngp[idx]=cstr; } (void)cast_nctype_void((nc_type)NC_STRING,&var->val); nco_var_free(var_att); return var; } //Derived Aggregate Functions /************************************************/ aggd_cls::aggd_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("ncap_stats_wvariance",this,(int)PWVARIANCE)); } } var_sct *aggd_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("aggd_cls::fnd"); int fdx; int nbr_args; int idx; int nbr_dim; int avg_nbr_dim; std::string susg; std::string sfnm=fmc_obj.fnm(); std::vector vtr_args; RefAST aRef; RefAST tr; // de-reference ddra_info_sct ddra_info; prs_cls *prs_arg=walker.prs_arg; var_sct *var_weight; var_sct *var_weight_sum; var_sct *var_weight_avg; var_sct *var_in; var_sct *var_out; fdx=fmc_obj.fdx(); // Put args into vector if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); susg="usage var_out="+sfnm+"(var, weight)"; if(nbr_args!=2) err_prn(sfnm, " Function has been called with no arguments\n"+susg); var_in=walker.out(vtr_args[0]); var_weight=walker.out(vtr_args[1]); // deal with initial scan if(prs_arg->ntl_scn) { if(var_in->undefined) var_out=ncap_var_udf("~aggd_methods"); else var_out=ncap_sclr_var_mk(SCS("~aggd_methods"),var_in->type,false); nco_var_free(var_in); nco_var_free(var_weight); return var_out; } /* nco stript we are implementing (S1) sum_weights = weights2.ttl(); (S2) weighted_avg = (weights2*var).ttl()/sum_weights; (S3) anomaly = var - weighted_avg; (S3) numerator = (weights2*anomaly*anomaly).ttl(); (s4) variance = numerator/sum_weights; std = variance.sqrt(); */ // make weight same type as var_in var_weight=nco_var_cnf_typ(var_in->type,var_weight); // make vars conform or die if( !ncap_var_stretch(&var_in,&var_weight) ) err_prn(sfnm ,"unable to make weight var conform to input var"); // [S1] single value - duplicate is destroyed var_weight_sum=nco_var_avg(nco_var_dpl(var_weight),var_weight->dim,var_weight->nbr_dim ,nco_op_ttl,False,&ddra_info); // [S2] single value - duplicate is destroyed var_weight_avg = nco_var_avg( ncap_var_var_stc( nco_var_dpl(var_weight), var_in, TIMES), var_weight->dim, var_weight->nbr_dim, nco_op_ttl,False,&ddra_info); // [S2] single value var_weight_avg = ncap_var_var_stc ( var_weight_avg, var_weight_sum, DIVIDE); // [S2a] stretch var_weight_avg so it CONFORMS to var_in (void)ncap_att_stretch(var_weight_avg, var_in->sz); // [S3] var_weight destroyed in this operation var_out = nco_var_avg( ncap_var_var_stc( var_weight, ncap_var_var_stc( ncap_var_var_stc(var_in,var_weight_avg,MINUS), NULL_CEWI, VSQR2 ), TIMES ), var_weight->dim, var_weight->nbr_dim, nco_op_ttl,False,&ddra_info); // [S4] var_out= ncap_var_var_stc( var_out, var_weight_sum, DIVIDE); nco_var_free(var_weight_avg); nco_var_free(var_weight_sum); nco_var_free(var_in); return var_out; } /* ncap2 functions and methods */ /* To avoid confusion when I say FUNC (uppercase) I mean a custom ncap2 function. When I say METHOD (uppercase) I mean a custom ncap2 method When I say method (lowercase) I mean a C++ class method When I say function(lowercase) I mean a C/C++ function When I refer to an ncap2 FUNC. I also mean a METHOD most of the FUNCS can be called as METHODS e.g., sum=three_dmn_var_dbl.total($time) or sum=total(three_dmn_var_dbl,$time) So for a method the "first argument" is the evaluation of everything prefixing the DOT. The nice thing about METHODS is that you can daisy chain them together. e.g., promote to type double - find avg - then convert back to short() three_avg=three_dmn_var_sht.double().avg($time).short(); file: ncap2.cc The vector fmc_vtr in ncap2.cc contains all the method pointers that will deal with all the FUNC's Each element in this vector has the following properties string fnm() -- The name of the FUNC - as used in the script. It is defined in one place only - the constructor of the C++ class that will deal with the FUNC vtl_cls vfnc -- This points to the C++ method that will deal with the FUNC. As you look at all the classes in fmc_all_cls.cc you will see that all the methods thet deal with a FUNC share the same argument signature More on this later. int fdx() -- This is the index (with respect to a particular class) of the FUNC called. Some classes deal with a whole family of FUNCS others only one or two The index's are defined in an enum. so for (basic)- bsc_cls we have: enum {PSIZE, PTYPE, PNDIMS, PEXISTS }; and for(aggregate) agg_cls we have: enum {PAVG ,PAVGSQR ,PMIBS, PMABS, PMEBS, PMAX ,PMIN ,PRMS, PRMSSDN, PSQRAVG, PTTL} This vector 'fmc_vtr' is used by the lexer to identify FUNC names and to distingush them from var names so for example: total = three_dmn_var_dbl.total($lat,$lon); Is completely valid - The lexer sees that the lvalue total has no trailing '(' and so identifies it as a variable. If I subsequently said: total0= total(0); The lexer would get confused. It would recognize 'total' on the RHS as a FUNC call rather than a hyperslab. After being populated fmc_vtr is then passed by reference to the object prs_arg. This object provides the Parser with the necessary detail to enable IO to netcdf files. It also maintains a lookup table for vars/ atts and memory vars. The most important properties listed are below NcapVector &dmn_in_vtr; //Vector of dimensions in input file nb doesn't change NcapVector &dmn_out_vtr; //Vector of dimensions in output file file std::vector &fmc_vtr; //List of functions/methods nb doesn't change NcapVarVector &var_vtr; // list of attributes & variables NcapVarVector &int_vtr; // stores vars/atts in FIRST PARSE bool ntl_scn; // [flg] Initial scan of script The most important methods are the following: // initialize var_sct with the variable snm var_sct *ncap_var_init(const std::string &snm, bool bfll); // write var to disc int ncap_var_write (var_sct *var, bool bram); Perhaps the most important thing to grasp is that given a list of statements TWO PARSES of the script (syntax tree) are made. In the first parse the vars are defined on disc. In the second parse the vars are populated. This greatly increases peformance. The Grammer file ncoGrammer.g file is composed of three sections ncoLexer - returns tokens/ deals with include files ncoParser - The main grammer - creates a syntax tree ncoTree - Reads a syntax tree Hopefully the only thing you'll deal with here is the ncoTree methods */ /* Lets take a look at mth2_cls(). The enum in the include file is: enum {PPOW,PATAN2,PCONVERT}; The constructor associates the pointer(this) and FUNC script name with the enum index: fmc_vtr.push_back( fmc_cls("pow",this,(int)PPOW)); fmc_vtr.push_back( fmc_cls("atan2",this,(int)PATAN2)); fmc_vtr.push_back( fmc_cls("convert",this,(int)PCONVERT)); The method that does the heavy lifting is: var_sct *mth2_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker) It takes two fragments of the the parse tree ( expr, fargs) and returns a var_sct. If expr is null then it is A FUNC else its a METHOD */ nco-4.5.4/src/nco++/fmc_all_cls.hh000066400000000000000000000171401264355130400165640ustar00rootroot00000000000000/* Purpose: netCDF arithmetic processor class methods */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // Standard C++ headers #ifndef FMC_ALL_CLS_HH #define FMC_ALL_CLS_HH #include #include #include #include #include "ncoTree.hpp" #include "ncap2_utl.hh" #include "vtl_cls.hh" #include "nco_rth_flt.h" /* Float-precision arithmetic, MSVC macros */ #include "sym_cls.hh" // holder for float/double math function pointers #include "map_srt_tmp.hh" // template -used in srt_cls #include /* Math float prototypes required by AIX, Solaris, but not by Linux, IRIX */ /* Basic math: acos, asin, atan, cos, exp, fabs, log, log10, sin, sqrt, tan */ /* GNU g++ barfs at these float declartions -- remove if g++ used */ #ifndef __GNUG__ extern float acosf(float); extern float asinf(float); extern float atanf(float); extern float cosf(float); extern float expf(float); extern float fabsf(float); /* 20040629: Only AIX may need this */ extern float logf(float); extern float log10f(float); extern float rnd_nbrf(float); extern float sinf(float); extern float sqrtf(float); extern float tanf(float); /* Advanced math: erf, erfc, gamma */ extern float erff(float); extern float erfcf(float); extern float gammaf(float); /* Hyperbolic trigonometric: acosh, asinh, atanh, cosh, sinh, tanh */ extern float acoshf(float); extern float asinhf(float); extern float atanhf(float); extern float coshf(float); extern float sinhf(float); extern float tanhf(float); /* Basic Rounding: ceil, floor */ extern float ceilf(float); extern float floorf(float); /* Advanced Rounding: nearbyint, rint, round, trunc */ extern float nearbyintf(float); extern float rintf(float); extern float roundf(float); extern float truncf(float); #endif //Conversion Functions **************************************/ class cnv_cls: public vtl_cls { private: bool _flg_dbg; public: cnv_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Aggregate Functions /***************************************/ class agg_cls: public vtl_cls { private: enum{ PAVG ,PAVGSQR , PMIBS, PMABS, PMEBS, PMAX ,PMIN ,PRMS, PRMSSDN, PSQRAVG, PTTL}; bool _flg_dbg; public: agg_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Utility Functions /****************************************/ class utl_cls: public vtl_cls { private: enum {SET_MISS,CH_MISS,DEL_MISS,GET_MISS,NUM_MISS,HAS_MISS, RAM_WRITE,RAM_DELETE}; bool _flg_dbg; public: utl_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); var_sct *is_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); }; //Basic Functions /****************************************/ class bsc_cls: public vtl_cls { private: enum {PSIZE,PTYPE,PNDIMS,PEXISTS }; bool _flg_dbg; public: bsc_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Maths Functions /****************************************/ class mth_cls: public vtl_cls { private: bool _flg_dbg; std::vector sym_vtr; public: mth_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Maths2 - Maths functions that take 2 args /*********/ class mth2_cls: public vtl_cls { private: enum {PPOW,PATAN2,PCONVERT}; bool _flg_dbg; public: mth2_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //PDQ Functions /****************************************/ class pdq_cls: public vtl_cls { private: enum {PREVERSE,PPERMUTE }; bool _flg_dbg; public: pdq_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Mask Function /****************************************/ class msk_cls: public vtl_cls { private: enum {PMASK1, PMASK_CLIP }; bool _flg_dbg; public: msk_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Pack Function /****************************************/ class pck_cls: public vtl_cls { private: enum {PPACK, PPACK_BYTE, PPACK_CHAR, PPACK_SHORT, PPACK_INT, PUNPACK,}; bool _flg_dbg; public: pck_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Sort Function /****************************************/ class srt_cls: public vtl_cls { private: enum {PASORT,PDSORT,PREMAP,PUNMAP,PIMAP }; bool _flg_dbg; public: srt_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); var_sct *srt_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); var_sct *mst_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); var_sct *imap_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); }; // min/max index functions /****************************************/ // returns the hyperslab indices of the min or max class agg_idx_cls: public vtl_cls { private: enum { PMIN, PMAX}; bool _flg_dbg; public: agg_idx_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Unary Function /****************************************/ class unr_cls: public vtl_cls { private: enum {PABS,PSQR }; bool _flg_dbg; public: unr_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Array Function /****************************************/ class arr_cls: public vtl_cls { private: enum {PARRAY }; bool _flg_dbg; public: arr_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //Bilinear Interpolation Functions /****************************************/ class bil_cls: public vtl_cls { private: enum {PBIL_ALL,PBIL_ALL_WRP}; bool _flg_dbg; public: bil_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); void clc_bil_fnc(var_sct *v_xin, var_sct *v_yin, var_sct *v_din, var_sct *v_xout, var_sct *v_yout, var_sct *v_dout,bool bwrp,std::string sfnm); double clc_lin_ipl(double x1,double x2, double x, double Q0,double Q1); }; //Miscellaneous Function /****************************************/ class misc_cls: public vtl_cls { private: enum {PMISC1, PMISC2, PMISC3 }; bool _flg_dbg; public: misc_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; // Co-ord class /*********************************************************/ class cod_cls: public vtl_cls { private: enum {PCOORD }; bool _flg_dbg; public: cod_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; // var list class /*********************************************************/ class vlist_cls: public vtl_cls { private: enum {PJOIN }; bool _flg_dbg; public: vlist_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; // derived aggregate Functions /***************************************/ class aggd_cls: public vtl_cls { private: enum{ PWVARIANCE}; bool _flg_dbg; public: aggd_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; #endif // FMC_ALL_CLS_HH nco-4.5.4/src/nco++/fmc_cls.cc000066400000000000000000000007401264355130400157200ustar00rootroot00000000000000// function/method class /****************************************/ #include "fmc_cls.hh" //constructors fmc_cls::fmc_cls(std::string cfnm,vtl_cls *cvtl_ref,int cfdx){ _fnm=cfnm; _vtl_obj=cvtl_ref; _fdx=cfdx; } fmc_cls::fmc_cls(const char *const pfnm,vtl_cls *cvtl_ref,int cfdx){ _fnm=static_cast(pfnm); _vtl_obj=cvtl_ref; _fdx=cfdx; } fmc_cls::fmc_cls(std::string cfnm){ _fnm=cfnm; _vtl_obj=NULL; _fdx=0; } nco-4.5.4/src/nco++/fmc_cls.hh000066400000000000000000000020571264355130400157350ustar00rootroot00000000000000/* Purpose: netCDF arithmetic processor class methods */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // Standard C++ headers #ifndef FMC_CLS_HH #define FMC_CLS_HH #include #include "vtl_cls.hh" //forward declarations // class vtl_cls; // function/method class ****************************************/ class fmc_cls { public: std::string _fnm; vtl_cls *_vtl_obj; int _fdx; public: // Constructors fmc_cls(std::string cfnm,vtl_cls *cvtl_ref,int cfdx); fmc_cls(const char *const pfnm, vtl_cls *cvtl_ref,int cfdx); fmc_cls(std::string cfnm); //Return properties std::string fnm() {return _fnm;} vtl_cls *vfnc() {return _vtl_obj;} int fdx() {return _fdx;} //Use for sorting bool operator<(const fmc_cls &right)const { return ( _fnm < right._fnm); } }; #endif // FMC_CLS_HH nco-4.5.4/src/nco++/fmc_gsl_cls.cc000066400000000000000000005574101264355130400166000ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor class methods for GSL */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "fmc_gsl_cls.hh" #include "nco_gsl.h" // GSL Functions #ifdef ENABLE_GSL // dummy function -used to fill out arg list int ncap_void(void){ return 10; } gsl_cls::gsl_cls(bool flg_dbg){ // populate gpr_vtr gsl_ini_sf(); // Special Functions gsl_ini_cdf(); // Cumulative distribution Functions gsl_ini_ran(); // Random Number Generator functions gsl_ini_stats(); // Statistics // Copy into fmc_cls vector for(unsigned idx=0;idx= 108 gpr_vtr.push_back(gpr_cls("gsl_sf_debye_5",f_unn(gsl_sf_debye_5_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_debye_6",f_unn(gsl_sf_debye_6_e),hnd_fnc_x,NC_DOUBLE)); # endif // NCO_GSL_VERSION < 8 // Dilogarithm // not implemented as all involve complex numbers // Elementary Operations // Elliptic Integrals gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_Kcomp",f_unn(gsl_sf_ellint_Kcomp_e),hnd_fnc_nd,P1DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_Ecomp",f_unn(gsl_sf_ellint_Ecomp_e),hnd_fnc_nd,P1DBLMD)); # if NCO_GSL_VERSION >= 109 gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_Pcomp",f_unn(gsl_sf_ellint_Pcomp_e),hnd_fnc_nd,P2DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_Dcomp",f_unn(gsl_sf_ellint_Dcomp_e),hnd_fnc_nd,P1DBLMD)); # endif // NCO_GSL_VERSION < 9 gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_F",f_unn(gsl_sf_ellint_F_e),hnd_fnc_nd,P2DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_E",f_unn(gsl_sf_ellint_E_e),hnd_fnc_nd,P2DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_P",f_unn(gsl_sf_ellint_P_e),hnd_fnc_nd,P3DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_D",f_unn(gsl_sf_ellint_D_e),hnd_fnc_nd,P3DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_RC",f_unn(gsl_sf_ellint_RC_e), hnd_fnc_nd,P2DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_RD",f_unn(gsl_sf_ellint_RD_e),hnd_fnc_nd,P3DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_RF",f_unn(gsl_sf_ellint_RF_e),hnd_fnc_nd,P3DBLMD)); gpr_vtr.push_back(gpr_cls("gsl_sf_ellint_RJ",f_unn(gsl_sf_ellint_RJ_e),hnd_fnc_nd,P4DBLMD)); // Elliptic Function (Jacobi) // Error Functions gpr_vtr.push_back(gpr_cls("gsl_sf_erfc",f_unn(gsl_sf_erfc_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_log_erfc",f_unn(gsl_sf_log_erfc_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_erf",f_unn(gsl_sf_erf_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_erf_Z",f_unn(gsl_sf_erf_Z_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_erf_Q",f_unn(gsl_sf_erf_Q_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_hazard",f_unn(gsl_sf_hazard_e),hnd_fnc_x,NC_DOUBLE)); // Exponential Functions gpr_vtr.push_back(gpr_cls("gsl_sf_exp",f_unn(gsl_sf_exp_e),hnd_fnc_x,NC_DOUBLE)); //gpr_vtr.push_back(gpr_cls("gsl_sf_exp_e10",f_unn(gsl_sf_exp_10_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_exp_mult",f_unn(gsl_sf_exp_mult_e),hnd_fnc_nd,P2DBL)); //gpr_vtr.push_back(gpr_cls("gsl_sf_exp_mult_e10",f_unn(gsl_sf_exp_mult_e10_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_expm1",f_unn(gsl_sf_expm1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_exprel",f_unn(gsl_sf_exprel_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_exprel_2",f_unn(gsl_sf_exprel_2_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_exprel_n",f_unn(gsl_sf_exprel_n_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_exp_err",f_unn(gsl_sf_exp_err_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_exp_err_e10",f_unn(gsl_sf_exp_err_e10_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_exp_mult_err_e",f_unn(gsl_sf_exp_mult_err_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_exp_mult_err_e10_e",f_unn(gsl_sf_exp_mult_err_e10_e),hnd_fnc_nd,P2DBL)); // Exponential Integral Functions gpr_vtr.push_back(gpr_cls("gsl_sf_expint_E1",f_unn(gsl_sf_expint_E1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_E2",f_unn(gsl_sf_expint_E2_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_E1_scaled",f_unn(gsl_sf_expint_E1_scaled_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_E2_scaled",f_unn(gsl_sf_expint_E2_scaled_e),hnd_fnc_x,NC_DOUBLE)); # if NCO_GSL_VERSION >= 110 gpr_vtr.push_back(gpr_cls("gsl_sf_expint_En",f_unn(gsl_sf_expint_En_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_En_scaled",f_unn(gsl_sf_expint_En_scaled_e),hnd_fnc_xd,NC_INT)); # endif // NCO_GSL_VERSION < 10 gpr_vtr.push_back(gpr_cls("gsl_sf_expint_Ei",f_unn(gsl_sf_expint_Ei_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_Ei_scaled",f_unn(gsl_sf_expint_Ei_scaled_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_Shi",f_unn(gsl_sf_Shi_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_Chi",f_unn(gsl_sf_Chi_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_expint_3",f_unn(gsl_sf_expint_3_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_Si",f_unn(gsl_sf_Si_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_Ci",f_unn(gsl_sf_Ci_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_atanint",f_unn(gsl_sf_atanint_e),hnd_fnc_x,NC_DOUBLE)); // Fermi Dirac Functions gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_m1",f_unn(gsl_sf_fermi_dirac_m1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_0",f_unn(gsl_sf_fermi_dirac_0_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_1",f_unn(gsl_sf_fermi_dirac_1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_2",f_unn(gsl_sf_fermi_dirac_2_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_int",f_unn(gsl_sf_fermi_dirac_int_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_mhalf",f_unn(gsl_sf_fermi_dirac_mhalf_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_half",f_unn(gsl_sf_fermi_dirac_half_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_3half",f_unn(gsl_sf_fermi_dirac_3half_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_fermi_dirac_inc_0",f_unn(gsl_sf_fermi_dirac_inc_0_e),hnd_fnc_nd,P2DBL)); // Gamma & Beta Functions gpr_vtr.push_back(gpr_cls("gsl_sf_lngamma",f_unn(gsl_sf_lngamma_e),hnd_fnc_x,NC_DOUBLE)); // gpr_vtr.push_back(gpr_cls("gsl_sf_gammagsl_sf_lngamma_sgn",f_unn(gsl_sf_gammagsl_sf_lngamma_sgn_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_gamma",f_unn(gsl_sf_gamma_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_gammastar",f_unn(gsl_sf_gammastar_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_gammainv",f_unn(gsl_sf_gammainv_e),hnd_fnc_x,NC_DOUBLE)); // gpr_vtr.push_back(gpr_cls("gsl_sf_gammagsl_sf_lngamma_complex",f_unn(gsl_sf_gammagsl_sf_lngamma_complex_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_taylorcoeff",f_unn(gsl_sf_taylorcoeff_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_fact",f_unn(gsl_sf_fact_e),hnd_fnc_x,NC_UINT)); gpr_vtr.push_back(gpr_cls("gsl_sf_doublefact",f_unn(gsl_sf_doublefact_e),hnd_fnc_x,NC_UINT)); gpr_vtr.push_back(gpr_cls("gsl_sf_lnfact",f_unn(gsl_sf_lnfact_e),hnd_fnc_x,NC_UINT)); gpr_vtr.push_back(gpr_cls("gsl_sf_lndoublefact",f_unn(gsl_sf_lndoublefact_e),hnd_fnc_x,NC_UINT)); //gpr_vtr.push_back(gpr_cls("gsl_sf_lnchoose",f_unn(gsl_sf_lnchoose_e),)); //gpr_vtr.push_back(gpr_cls("gsl_sf_choose",f_unn(gsl_sf_choose_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_lnpoch",f_unn(gsl_sf_lnpoch_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_lnpoch_sgn",f_unn(gsl_sf_lnpoch_sign_e)),); gpr_vtr.push_back(gpr_cls("gsl_sf_poch",f_unn(gsl_sf_poch_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_pochrel",f_unn(gsl_sf_pochrel_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gamma_inc_Q",f_unn(gsl_sf_gamma_inc_Q_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gamma_inc_P",f_unn(gsl_sf_gamma_inc_P_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gamma_inc",f_unn(gsl_sf_gamma_inc_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_lnbeta",f_unn(gsl_sf_lnbeta_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_gammagsl_sf_lnbeta_sgn",f_unn(gsl_sf_gammagsl_sf_lnbeta_sgn_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_beta",f_unn(gsl_sf_beta_e),hnd_fnc_nd,P2DBL)); // gpr_vtr.push_back(gpr_cls("gsl_sf_beta_inc",f_unn(gsl_sf_beta_inc_e),)); // Gegenbauer Functions gpr_vtr.push_back(gpr_cls("gsl_sf_gegenpoly_1",f_unn(gsl_sf_gegenpoly_1_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gegenpoly_2",f_unn(gsl_sf_gegenpoly_2_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gegenpoly_3",f_unn(gsl_sf_gegenpoly_3_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_gegenpoly_n",f_unn(gsl_sf_gegenpoly_n_e),hnd_fnc_idd)); // gpr_vtr.push_back(gpr_cls("gsl_sf_gegenpoly_array",f_unn(gsl_sf_gegenpoly_array),)); // Hypergeometric Functions gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_0F1",f_unn(gsl_sf_hyperg_0F1_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_1F1_int",f_unn(gsl_sf_hyperg_1F1_int_e),hnd_fnc_iid)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_1F1",f_unn(gsl_sf_hyperg_1F1_e),hnd_fnc_nd,P3DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_U_int",f_unn(gsl_sf_hyperg_U_int_e),hnd_fnc_iid)); //gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_U_int_e10",f_unn(gsl_sf_hyperg_U_int_e10_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_U",f_unn(gsl_sf_hyperg_U_e),hnd_fnc_nd,P3DBL)); //gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_U_e10",f_unn(gsl_sf_hyperg_U_e10_e),)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_2F1",f_unn(gsl_sf_hyperg_2F1_e),hnd_fnc_nd,P4DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_2F1_conj",f_unn(gsl_sf_hyperg_2F1_conj_e),hnd_fnc_nd,P4DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_2F1_renorm",f_unn(gsl_sf_hyperg_2F1_renorm_e),hnd_fnc_nd,P4DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_2F1_conj_renorm",f_unn(gsl_sf_hyperg_2F1_conj_renorm_e),hnd_fnc_nd,P4DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_hyperg_2F0",f_unn(gsl_sf_hyperg_2F0_e),hnd_fnc_nd,P3DBL)); // Laguerre Functions gpr_vtr.push_back(gpr_cls("gsl_sf_laguerre_1",f_unn(gsl_sf_laguerre_1_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_laguerre_2",f_unn(gsl_sf_laguerre_2_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_laguerre_3",f_unn(gsl_sf_laguerre_3_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_laguerre_n",f_unn(gsl_sf_laguerre_n_e),hnd_fnc_idd)); // Lambert W Functions gpr_vtr.push_back(gpr_cls("gsl_sf_lambert_W0",f_unn(gsl_sf_lambert_W0_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_lambert_Wm1",f_unn(gsl_sf_lambert_Wm1_e),hnd_fnc_x,NC_DOUBLE)); // Legendre Functions gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Pl",f_unn(gsl_sf_legendre_Pl_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Pl_array",f_unn(gsl_sf_legendre_Pl_array),hnd_fnc_idpd)); //gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Pl_deriv_array",f_unn(gsl_sf_legendre_Pl_deriv_array), )); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_P1",f_unn(gsl_sf_legendre_P1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_P2",f_unn(gsl_sf_legendre_P2_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_P3",f_unn(gsl_sf_legendre_P3_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Q0",f_unn(gsl_sf_legendre_Q0_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Q1",f_unn(gsl_sf_legendre_Q1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Ql",f_unn(gsl_sf_legendre_Ql_e),hnd_fnc_xd,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Plm",f_unn(gsl_sf_legendre_Plm_e),hnd_fnc_iid)); #if NCO_GSL_VERSION < 200 gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Plm_array",f_unn(gsl_sf_legendre_Plm_array),hnd_fnc_iidpd,PLEGEND)); #endif // gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_Plm_deriv_array",f_unn(gsl_sf_legendre_Plm_deriv_array),)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_sphPlm",f_unn(gsl_sf_legendre_sphPlm_e),hnd_fnc_iid)); #if NCO_GSL_VERSION < 200 gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_sphPlm_array",f_unn(gsl_sf_legendre_sphPlm_array),hnd_fnc_iidpd,PLEGEND)); #endif // gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_sphPlm_deriv_array",f_unn(gsl_sf_legendre_sphPlm_deriv_array),)); // gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_array_size",f_unn(gsl_sf_legendre_array_size),)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_half",f_unn(gsl_sf_conicalP_half_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_mhalf",f_unn(gsl_sf_conicalP_mhalf_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_0",f_unn(gsl_sf_conicalP_0_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_1",f_unn(gsl_sf_conicalP_1_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_sph_reg",f_unn(gsl_sf_conicalP_sph_reg_e),hnd_fnc_idd)); gpr_vtr.push_back(gpr_cls("gsl_sf_conicalP_cyl_reg",f_unn(gsl_sf_conicalP_cyl_reg_e),hnd_fnc_idd)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_H3d_0",f_unn(gsl_sf_legendre_H3d_0_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_H3d_1",f_unn(gsl_sf_legendre_H3d_1_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_H3d",f_unn(gsl_sf_legendre_H3d_e),hnd_fnc_idd)); // gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_H3d_array",f_unn(gsl_sf_legendre_H3d_array),)); // gpr_vtr.push_back(gpr_cls("gsl_sf_legendre_array_size",f_unn(gsl_sf_legendre_array_size),)); // Logarithm and related Functions gpr_vtr.push_back(gpr_cls("gsl_sf_log",f_unn(gsl_sf_log_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_log_abs",f_unn(gsl_sf_log_abs_e),hnd_fnc_x,NC_DOUBLE)); // gpr_vtr.push_back(gpr_cls("gsl_sf_complex_log",f_unn(gsl_sf_complex_log_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_log_1plusx",f_unn(gsl_sf_log_1plusx_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_log_1plusx_mx",f_unn(gsl_sf_log_1plusx_mx_e),hnd_fnc_x,NC_DOUBLE)); // Mathieu Functions // None implemented // Power Functions //gpr_vtr.push_back(gpr_cls("gsl_sf_pow_int",f_unn(gsl_sf_pow_int_e),hnd_fnc_di,NC_DOUBLE)); // Psi Functions gpr_vtr.push_back(gpr_cls("gsl_sf_psi_int",f_unn(gsl_sf_psi_e),hnd_fnc_x,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_psi",f_unn(gsl_sf_psi_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_psi_1piy",f_unn(gsl_sf_psi_1piy_e),hnd_fnc_x,NC_DOUBLE)); // gpr_vtr.push_back(gpr_cls("gsl_sf_complex_psi",f_unn(gsl_sf_complex_psi_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_psi_1_int",f_unn(gsl_sf_psi_1_int_e),hnd_fnc_x,NC_INT)); # if NCO_GSL_VERSION >= 105 gpr_vtr.push_back(gpr_cls("gsl_sf_psi_1",f_unn(gsl_sf_psi_1_e),hnd_fnc_x,NC_DOUBLE)); # endif // NCO_GSL_VERSION < 105 gpr_vtr.push_back(gpr_cls("gsl_sf_psi_n",f_unn(gsl_sf_psi_n_e),hnd_fnc_xd,NC_INT)); // Synchrotron Functions gpr_vtr.push_back(gpr_cls("gsl_sf_synchrotron_1",f_unn(gsl_sf_synchrotron_1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_synchrotron_2",f_unn(gsl_sf_synchrotron_2_e),hnd_fnc_x,NC_DOUBLE)); // Transport Functions gpr_vtr.push_back(gpr_cls("gsl_sf_transport_2",f_unn(gsl_sf_transport_2_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_transport_3",f_unn(gsl_sf_transport_3_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_transport_4",f_unn(gsl_sf_transport_4_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_transport_5",f_unn(gsl_sf_transport_5_e),hnd_fnc_x,NC_DOUBLE)); // Trigonometric Functions // None implemented // Zeta Functions gpr_vtr.push_back(gpr_cls("gsl_sf_zeta_int",f_unn(gsl_sf_zeta_int_e),hnd_fnc_x,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_zeta",f_unn(gsl_sf_zeta_e),hnd_fnc_x,NC_DOUBLE)); # if NCO_GSL_VERSION >= 105 gpr_vtr.push_back(gpr_cls("gsl_sf_zetam1",f_unn(gsl_sf_zetam1_e),hnd_fnc_x,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_sf_zetam1_int",f_unn(gsl_sf_zetam1_int_e),hnd_fnc_x,NC_INT)); # endif // NCO_GSL_VERSION < 105 gpr_vtr.push_back(gpr_cls("gsl_sf_hzeta",f_unn(gsl_sf_hzeta_e),hnd_fnc_nd,P2DBL)); gpr_vtr.push_back(gpr_cls("gsl_sf_eta_int",f_unn(gsl_sf_eta_int_e),hnd_fnc_x,NC_INT)); gpr_vtr.push_back(gpr_cls("gsl_sf_eta",f_unn(gsl_sf_eta),hnd_fnc_x,NC_DOUBLE)); } // end gsl_ini_sf // Cumulative Distribution Functions void gsl_cls::gsl_ini_cdf(void){ gpr_vtr.push_back(gpr_cls("gsl_cdf_ugaussian_P",f_unn(gsl_cdf_ugaussian_P),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_ugaussian_Q",f_unn(gsl_cdf_ugaussian_Q),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_ugaussian_Pinv",f_unn(gsl_cdf_ugaussian_Pinv),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_ugaussian_Qinv",f_unn(gsl_cdf_ugaussian_Qinv),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gaussian_P",f_unn(gsl_cdf_gaussian_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gaussian_Q",f_unn(gsl_cdf_gaussian_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gaussian_Pinv",f_unn(gsl_cdf_gaussian_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gaussian_Qinv",f_unn(gsl_cdf_gaussian_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gamma_P",f_unn(gsl_cdf_gamma_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gamma_Q",f_unn(gsl_cdf_gamma_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gamma_Pinv",f_unn(gsl_cdf_gamma_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gamma_Qinv",f_unn(gsl_cdf_gamma_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_cauchy_P",f_unn(gsl_cdf_cauchy_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_cauchy_Q",f_unn(gsl_cdf_cauchy_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_cauchy_Pinv",f_unn(gsl_cdf_cauchy_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_cauchy_Qinv",f_unn(gsl_cdf_cauchy_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_laplace_P",f_unn(gsl_cdf_laplace_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_laplace_Q",f_unn(gsl_cdf_laplace_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_laplace_Pinv",f_unn(gsl_cdf_laplace_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_laplace_Qinv",f_unn(gsl_cdf_laplace_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_rayleigh_P",f_unn(gsl_cdf_rayleigh_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_rayleigh_Q",f_unn(gsl_cdf_rayleigh_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_rayleigh_Pinv",f_unn(gsl_cdf_rayleigh_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_rayleigh_Qinv",f_unn(gsl_cdf_rayleigh_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_chisq_P",f_unn(gsl_cdf_chisq_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_chisq_Q",f_unn(gsl_cdf_chisq_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_chisq_Pinv",f_unn(gsl_cdf_chisq_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_chisq_Qinv",f_unn(gsl_cdf_chisq_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_exponential_P",f_unn(gsl_cdf_exponential_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_exponential_Q",f_unn(gsl_cdf_exponential_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_exponential_Pinv",f_unn(gsl_cdf_exponential_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_exponential_Qinv",f_unn(gsl_cdf_exponential_Qinv),hnd_fnc_nd,P2DBLX)); # if NCO_GSL_VERSION >= 106 gpr_vtr.push_back(gpr_cls("gsl_cdf_exppow_P",f_unn(gsl_cdf_exppow_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_exppow_Q",f_unn(gsl_cdf_exppow_Q),hnd_fnc_nd,P3DBLX)); # endif gpr_vtr.push_back(gpr_cls("gsl_cdf_tdist_P",f_unn(gsl_cdf_tdist_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_tdist_Q",f_unn(gsl_cdf_tdist_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_tdist_Pinv",f_unn(gsl_cdf_tdist_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_tdist_Qinv",f_unn(gsl_cdf_tdist_Qinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_fdist_P",f_unn(gsl_cdf_fdist_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_fdist_Q",f_unn(gsl_cdf_fdist_Q),hnd_fnc_nd,P3DBLX)); # if NCO_GSL_VERSION >= 108 gpr_vtr.push_back(gpr_cls("gsl_cdf_fdist_Pinv",f_unn(gsl_cdf_fdist_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_fdist_Qinv",f_unn(gsl_cdf_fdist_Qinv),hnd_fnc_nd,P3DBLX)); # endif // NCO_GSL_VERSION < 8 gpr_vtr.push_back(gpr_cls("gsl_cdf_beta_P",f_unn(gsl_cdf_beta_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_beta_Q",f_unn(gsl_cdf_beta_Q),hnd_fnc_nd,P3DBLX)); # if NCO_GSL_MINOR_VERSION >= 8 gpr_vtr.push_back(gpr_cls("gsl_cdf_beta_Pinv",f_unn(gsl_cdf_beta_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_beta_Qinv",f_unn(gsl_cdf_beta_Qinv),hnd_fnc_nd,P3DBLX)); # endif // NCO_GSL_MINOR_VERSION < 8 gpr_vtr.push_back(gpr_cls("gsl_cdf_flat_P",f_unn(gsl_cdf_flat_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_flat_Q",f_unn(gsl_cdf_flat_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_flat_Pinv",f_unn(gsl_cdf_flat_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_flat_Qinv",f_unn(gsl_cdf_flat_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_lognormal_P",f_unn(gsl_cdf_lognormal_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_lognormal_Q",f_unn(gsl_cdf_lognormal_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_lognormal_Pinv",f_unn(gsl_cdf_lognormal_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_lognormal_Qinv",f_unn(gsl_cdf_lognormal_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel1_P",f_unn(gsl_cdf_gumbel1_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel1_Q",f_unn(gsl_cdf_gumbel1_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel1_Pinv",f_unn(gsl_cdf_gumbel1_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel1_Qinv",f_unn(gsl_cdf_gumbel1_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel2_P",f_unn(gsl_cdf_gumbel2_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel2_Q",f_unn(gsl_cdf_gumbel2_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel2_Pinv",f_unn(gsl_cdf_gumbel2_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_gumbel2_Qinv",f_unn(gsl_cdf_gumbel2_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_weibull_P",f_unn(gsl_cdf_weibull_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_weibull_Q",f_unn(gsl_cdf_weibull_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_weibull_Pinv",f_unn(gsl_cdf_weibull_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_weibull_Qinv",f_unn(gsl_cdf_weibull_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_pareto_P",f_unn(gsl_cdf_pareto_P),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_pareto_Q",f_unn(gsl_cdf_pareto_Q),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_pareto_Pinv",f_unn(gsl_cdf_pareto_Pinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_pareto_Qinv",f_unn(gsl_cdf_pareto_Qinv),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_logistic_P",f_unn(gsl_cdf_logistic_P),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_logistic_Q",f_unn(gsl_cdf_logistic_Q),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_logistic_Pinv",f_unn(gsl_cdf_logistic_Pinv),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_cdf_logistic_Qinv",f_unn(gsl_cdf_logistic_Qinv),hnd_fnc_nd,P2DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_binomial_P",f_unn(gsl_cdf_binomial_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_binomial_Q",f_unn(gsl_cdf_binomial_Q),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_poisson_P",f_unn(gsl_cdf_poisson_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_poisson_Q",f_unn(gsl_cdf_poisson_Q),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_geometric_P",f_unn(gsl_cdf_geometric_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_geometric_Q",f_unn(gsl_cdf_geometric_Q),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_negative_binomial_P",f_unn(gsl_cdf_negative_binomial_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_negative_binomial_Q",f_unn(gsl_cdf_negative_binomial_Q),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_pascal_P",f_unn(gsl_cdf_pascal_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_pascal_Q",f_unn(gsl_cdf_pascal_Q),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_hypergeometric_P",f_unn(gsl_cdf_hypergeometric_P),hnd_fnc_nd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_cdf_hypergeometric_Q",f_unn(gsl_cdf_hypergeometric_Q),hnd_fnc_nd,P1DBLX)); } // end gsl_ini_cdf() // Random Number Generators void gsl_cls::gsl_ini_ran(void){ gpr_vtr.push_back(gpr_cls("gsl_ran_bernoulli",f_unn(gsl_ran_bernoulli),hnd_fnc_udrx,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_ran_bernoulli_pdf",f_unn(gsl_ran_bernoulli_pdf),hnd_fnc_ud)); gpr_vtr.push_back(gpr_cls("gsl_ran_beta",f_unn(gsl_ran_beta),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_beta_pdf",f_unn(gsl_ran_beta_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_binomial",f_unn(gsl_ran_binomial),hnd_fnc_udrdu)); # if NCO_GSL_VERSION >= 107 gpr_vtr.push_back(gpr_cls("gsl_ran_binomial_knuth",f_unn(gsl_ran_binomial_knuth),hnd_fnc_udrdu)); # endif gpr_vtr.push_back(gpr_cls("gsl_ran_binomial_tpe",f_unn(gsl_ran_binomial_tpe),hnd_fnc_udrdu)); gpr_vtr.push_back(gpr_cls("gsl_ran_binomial_pdf",f_unn(gsl_ran_binomial_pdf),hnd_fnc_udu)); gpr_vtr.push_back(gpr_cls("gsl_ran_exponential",f_unn(gsl_ran_exponential),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_exponential_pdf",f_unn(gsl_ran_exponential_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_exppow",f_unn(gsl_ran_exppow),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_exppow_pdf",f_unn(gsl_ran_exppow_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_cauchy",f_unn(gsl_ran_cauchy),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_cauchy_pdf",f_unn(gsl_ran_cauchy_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_chisq",f_unn(gsl_ran_chisq),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_chisq_pdf",f_unn(gsl_ran_chisq_pdf),hnd_fnc_nd,P2DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_dirichlet",f_unn(gsl_ran_dirichlet),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_dirichlet_pdf",f_unn(gsl_ran_dirichlet_pdf),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_dirichlet_lnpdf",f_unn(gsl_ran_dirichlet_lnpdf),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_erlang",f_unn(gsl_ran_erlang),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_erlang_pdf",f_unn(gsl_ran_erlang_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_fdist",f_unn(gsl_ran_fdist),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_fdist_pdf",f_unn(gsl_ran_fdist_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_flat",f_unn(gsl_ran_flat),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_flat_pdf",f_unn(gsl_ran_flat_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gamma",f_unn(gsl_ran_gamma),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gamma_int",f_unn(gsl_ran_gamma_int),hnd_fnc_ru)); gpr_vtr.push_back(gpr_cls("gsl_ran_gamma_pdf",f_unn(gsl_ran_gamma_pdf),hnd_fnc_nd,P3DBLX)); # if NCO_GSL_VERSION >= 108 gpr_vtr.push_back(gpr_cls("gsl_ran_gamma_mt",f_unn(gsl_ran_gamma_mt),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gamma_knuth",f_unn(gsl_ran_gamma_knuth),hnd_fnc_rnd,P2DBLX)); # endif // NCO_GSL_VERSION < 108 gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian",f_unn(gsl_ran_gaussian),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian_ratio_method",f_unn(gsl_ran_gaussian_ratio_method),hnd_fnc_rnd,P1DBLX)); # if NCO_GSL_VERSION >= 108 gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian_ziggurat",f_unn(gsl_ran_gaussian_ziggurat),hnd_fnc_rnd,P1DBLX)); # endif // NCO_GSL_MINOR_VERSION < 8 gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian_pdf",f_unn(gsl_ran_gaussian_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_ugaussian",f_unn(gsl_ran_ugaussian),hnd_fnc_rnd,P0DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_ugaussian_ratio_method",f_unn(gsl_ran_ugaussian_ratio_method),hnd_fnc_rnd,P0DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_ugaussian_pdf",f_unn(gsl_ran_ugaussian_pdf),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian_tail",f_unn(gsl_ran_gaussian_tail),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gaussian_tail_pdf",f_unn(gsl_ran_gaussian_tail_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_ugaussian_tail",f_unn(gsl_ran_ugaussian_tail),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_ugaussian_tail_pdf",f_unn(gsl_ran_ugaussian_tail_pdf),hnd_fnc_nd,P2DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_bivariate_gaussian",f_unn(gsl_ran_bivariate_gaussian),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_bivariate_gaussian_pdf",f_unn(gsl_ran_bivariate_gaussian_pdf),hnd_fnc_nd,P5DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_landau",f_unn(gsl_ran_landau),hnd_fnc_rnd,P0DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_landau_pdf",f_unn(gsl_ran_landau_pdf),hnd_fnc_nd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_geometric",f_unn(gsl_ran_geometric),hnd_fnc_udrx,NC_DOUBLE)); gpr_vtr.push_back(gpr_cls("gsl_ran_geometric_pdf",f_unn(gsl_ran_geometric_pdf),hnd_fnc_ud)); //gpr_vtr.push_back(gpr_cls("gsl_ran_hypergeometric",f_unn(gsl_ran_hypergeometric),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_hypergeometric_pdf",f_unn(gsl_ran_hypergeometric_pdf),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gumbel1",f_unn(gsl_ran_gumbel1),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gumbel1_pdf",f_unn(gsl_ran_gumbel1_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gumbel2",f_unn(gsl_ran_gumbel2),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_gumbel2_pdf",f_unn(gsl_ran_gumbel2_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_logistic",f_unn(gsl_ran_logistic),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_logistic_pdf",f_unn(gsl_ran_logistic_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_lognormal",f_unn(gsl_ran_lognormal),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_lognormal_pdf",f_unn(gsl_ran_lognormal_pdf),hnd_fnc_nd,P3DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_logarithmic",f_unn(gsl_ran_logarithmic),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_logarithmic_pdf",f_unn(gsl_ran_logarithmic_pdf),hnd_fnc_nd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_multinomial",f_unn(gsl_ran_multinomial),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_multinomial_pdf",f_unn(gsl_ran_multinomial_pdf),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_multinomial_lnpdf",f_unn(gsl_ran_multinomial_lnpdf),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_negative_binomial",f_unn(gsl_ran_negative_binomial),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_negative_binomial_pdf",f_unn(gsl_ran_negative_binomial_pdf),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_pascal",f_unn(gsl_ran_pascal),hnd_fnc_udrdu)); gpr_vtr.push_back(gpr_cls("gsl_ran_pascal_pdf",f_unn(gsl_ran_pascal_pdf),hnd_fnc_udu)); gpr_vtr.push_back(gpr_cls("gsl_ran_pareto",f_unn(gsl_ran_pareto),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_pareto_pdf",f_unn(gsl_ran_pareto_pdf),hnd_fnc_nd,P3DBLX)); //gpr_vtr.pus h_back(gpr_cls("gsl_ran_poisson",f_unn(gsl_ran_poisson),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_poisson_array",f_unn(gsl_ran_poisson_array),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_poisson_pdf",f_unn(gsl_ran_poisson_pdf),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_rayleigh",f_unn(gsl_ran_rayleigh),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_rayleigh_pdf",f_unn(gsl_ran_rayleigh_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_rayleigh_tail",f_unn(gsl_ran_rayleigh_tail),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_rayleigh_tail_pdf",f_unn(gsl_ran_rayleigh_tail_pdf),hnd_fnc_nd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_tdist",f_unn(gsl_ran_tdist),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_tdist_pdf",f_unn(gsl_ran_tdist_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_laplace",f_unn(gsl_ran_laplace),hnd_fnc_rnd,P1DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_laplace_pdf",f_unn(gsl_ran_laplace_pdf),hnd_fnc_nd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_levy",f_unn(gsl_ran_levy),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_levy_skew",f_unn(gsl_ran_levy_skew),hnd_fnc_rnd,P3DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_weibull",f_unn(gsl_ran_weibull),hnd_fnc_rnd,P2DBLX)); gpr_vtr.push_back(gpr_cls("gsl_ran_weibull_pdf",f_unn(gsl_ran_weibull_pdf),hnd_fnc_nd,P3DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_ran_dir_2d",f_unn(gsl_ran_dir_2d),hnd_fnc_rnd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_ran_dir_2d_trig_method",f_unn(gsl_ran_dir_2d_trig_method),hnd_fnc_rnd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_ran_dir_3d",f_unn(gsl_ran_dir_3d),hnd_fnc_rnd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_ran_dir_nd",f_unn(gsl_ran_dir_nd),hnd_fnc_rnd,P1DBLX)); // gpr_vtr.push_back(gpr_cls("gsl_ran_shuffle",f_unn(gsl_ran_shuffle),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_choose",f_unn(gsl_ran_choose),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_sample",f_unn(gsl_ran_sample),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_discrete_t",f_unn(gsl_ran_discrete_t),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_discrete_free",f_unn(gsl_ran_discrete_free),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_discrete",f_unn(gsl_ran_discrete),hnd_fnc_rnd,P1DBLX)); //gpr_vtr.push_back(gpr_cls("gsl_ran_discrete_pdf",f_unn(gsl_ran_discrete_pdf),hnd_fnc_rnd,P1DBLX)); // functions from gsl_rng.h gpr_vtr.push_back(gpr_cls("gsl_rng_get",f_unn(gsl_rng_get),hnd_fnc_uerx,NC_NAT)); gpr_vtr.push_back(gpr_cls("gsl_rng_uniform",f_unn(gsl_rng_uniform),hnd_fnc_rnd,P0DBLX)); gpr_vtr.push_back(gpr_cls("gsl_rng_uniform_pos",f_unn(gsl_rng_uniform_pos),hnd_fnc_rnd,P0DBLX)); gpr_vtr.push_back(gpr_cls("gsl_rng_uniform_int",f_unn(gsl_rng_uniform_int),hnd_fnc_uerx,NC_UINT)); } // gsl_ini_ran() // GSL Statistical Functions void gsl_cls::gsl_ini_stats(void){ // order of gsl functions very important there are 10 types // The native gsl types in order are // char/short/int/float/double/uchar/ushort/uint/ulong/long { f_unn lcl_arr[]={ f_unn(gsl_stats_char_mean), f_unn(gsl_stats_short_mean), f_unn(gsl_stats_int_mean), f_unn(gsl_stats_float_mean), f_unn(gsl_stats_mean), f_unn(gsl_stats_uchar_mean), f_unn(gsl_stats_ushort_mean), f_unn(gsl_stats_uint_mean), f_unn(gsl_stats_long_mean),f_unn(gsl_stats_ulong_mean) }; gpr_vtr.push_back(gpr_cls("gsl_stats_mean",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_variance), f_unn(gsl_stats_short_variance), f_unn(gsl_stats_int_variance), f_unn(gsl_stats_float_variance), f_unn(gsl_stats_variance), f_unn(gsl_stats_uchar_variance), f_unn(gsl_stats_ushort_variance), f_unn(gsl_stats_uint_variance), f_unn(gsl_stats_long_variance),f_unn(gsl_stats_ulong_variance) }; gpr_vtr.push_back(gpr_cls("gsl_stats_variance",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_sd), f_unn(gsl_stats_short_sd), f_unn(gsl_stats_int_sd), f_unn(gsl_stats_float_sd), f_unn(gsl_stats_sd), f_unn(gsl_stats_uchar_sd), f_unn(gsl_stats_ushort_sd), f_unn(gsl_stats_uint_sd), f_unn(gsl_stats_long_sd),f_unn(gsl_stats_ulong_sd) }; gpr_vtr.push_back(gpr_cls("gsl_stats_sd",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_variance_with_fixed_mean), f_unn(gsl_stats_short_variance_with_fixed_mean), f_unn(gsl_stats_int_variance_with_fixed_mean), f_unn(gsl_stats_float_variance_with_fixed_mean), f_unn(gsl_stats_variance_with_fixed_mean), f_unn(gsl_stats_uchar_variance_with_fixed_mean), f_unn(gsl_stats_ushort_variance_with_fixed_mean), f_unn(gsl_stats_uint_variance_with_fixed_mean), f_unn(gsl_stats_long_variance_with_fixed_mean),f_unn(gsl_stats_ulong_variance_with_fixed_mean) }; gpr_vtr.push_back(gpr_cls("gsl_stats_variance_with_fixed_mean",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_sd_with_fixed_mean), f_unn(gsl_stats_short_sd_with_fixed_mean), f_unn(gsl_stats_int_sd_with_fixed_mean), f_unn(gsl_stats_float_sd_with_fixed_mean), f_unn(gsl_stats_sd_with_fixed_mean), f_unn(gsl_stats_uchar_sd_with_fixed_mean), f_unn(gsl_stats_ushort_sd_with_fixed_mean), f_unn(gsl_stats_uint_sd_with_fixed_mean), f_unn(gsl_stats_long_sd_with_fixed_mean),f_unn(gsl_stats_ulong_sd_with_fixed_mean) }; gpr_vtr.push_back(gpr_cls("gsl_stats_sd_with_fixed_mean",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_absdev), f_unn(gsl_stats_short_absdev), f_unn(gsl_stats_int_absdev), f_unn(gsl_stats_float_absdev), f_unn(gsl_stats_absdev), f_unn(gsl_stats_uchar_absdev), f_unn(gsl_stats_ushort_absdev), f_unn(gsl_stats_uint_absdev), f_unn(gsl_stats_long_absdev),f_unn(gsl_stats_ulong_absdev) }; gpr_vtr.push_back(gpr_cls("gsl_stats_absdev",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_skew), f_unn(gsl_stats_short_skew), f_unn(gsl_stats_int_skew), f_unn(gsl_stats_float_skew), f_unn(gsl_stats_skew), f_unn(gsl_stats_uchar_skew), f_unn(gsl_stats_ushort_skew), f_unn(gsl_stats_uint_skew), f_unn(gsl_stats_long_skew),f_unn(gsl_stats_ulong_skew) }; gpr_vtr.push_back(gpr_cls("gsl_stats_skew",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_kurtosis), f_unn(gsl_stats_short_kurtosis), f_unn(gsl_stats_int_kurtosis), f_unn(gsl_stats_float_kurtosis), f_unn(gsl_stats_kurtosis), f_unn(gsl_stats_uchar_kurtosis), f_unn(gsl_stats_ushort_kurtosis), f_unn(gsl_stats_uint_kurtosis), f_unn(gsl_stats_long_kurtosis),f_unn(gsl_stats_ulong_kurtosis) }; gpr_vtr.push_back(gpr_cls("gsl_stats_kurtosis",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_lag1_autocorrelation), f_unn(gsl_stats_short_lag1_autocorrelation), f_unn(gsl_stats_int_lag1_autocorrelation), f_unn(gsl_stats_float_lag1_autocorrelation), f_unn(gsl_stats_lag1_autocorrelation), f_unn(gsl_stats_uchar_lag1_autocorrelation), f_unn(gsl_stats_ushort_lag1_autocorrelation), f_unn(gsl_stats_uint_lag1_autocorrelation), f_unn(gsl_stats_long_lag1_autocorrelation),f_unn(gsl_stats_ulong_lag1_autocorrelation) }; gpr_vtr.push_back(gpr_cls("gsl_stats_lag1_autocorrelation",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_variance_m), f_unn(gsl_stats_short_variance_m), f_unn(gsl_stats_int_variance_m), f_unn(gsl_stats_float_variance_m), f_unn(gsl_stats_variance_m), f_unn(gsl_stats_uchar_variance_m), f_unn(gsl_stats_ushort_variance_m), f_unn(gsl_stats_uint_variance_m), f_unn(gsl_stats_long_variance_m),f_unn(gsl_stats_ulong_variance_m) }; gpr_vtr.push_back(gpr_cls("gsl_stats_variance_m",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_sd_m), f_unn(gsl_stats_short_sd_m), f_unn(gsl_stats_int_sd_m), f_unn(gsl_stats_float_sd_m), f_unn(gsl_stats_sd_m), f_unn(gsl_stats_uchar_sd_m), f_unn(gsl_stats_ushort_sd_m), f_unn(gsl_stats_uint_sd_m), f_unn(gsl_stats_long_sd_m),f_unn(gsl_stats_ulong_sd_m) }; gpr_vtr.push_back(gpr_cls("gsl_stats_sd_m",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_absdev_m), f_unn(gsl_stats_short_absdev_m), f_unn(gsl_stats_int_absdev_m), f_unn(gsl_stats_float_absdev_m), f_unn(gsl_stats_absdev_m), f_unn(gsl_stats_uchar_absdev_m), f_unn(gsl_stats_ushort_absdev_m), f_unn(gsl_stats_uint_absdev_m), f_unn(gsl_stats_long_absdev_m),f_unn(gsl_stats_ulong_absdev_m) }; gpr_vtr.push_back(gpr_cls("gsl_stats_absdev_m",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_lag1_autocorrelation_m), f_unn(gsl_stats_short_lag1_autocorrelation_m), f_unn(gsl_stats_int_lag1_autocorrelation_m), f_unn(gsl_stats_float_lag1_autocorrelation_m), f_unn(gsl_stats_lag1_autocorrelation_m), f_unn(gsl_stats_uchar_lag1_autocorrelation_m), f_unn(gsl_stats_ushort_lag1_autocorrelation_m), f_unn(gsl_stats_uint_lag1_autocorrelation_m), f_unn(gsl_stats_long_lag1_autocorrelation_m),f_unn(gsl_stats_ulong_lag1_autocorrelation_m) }; gpr_vtr.push_back(gpr_cls("gsl_stats_lag1_autocorrelation_m",ARR2VTR(lcl_arr),hnd_fnc_stat2)); } gpr_vtr.push_back(gpr_cls("gsl_stats_max",f_unn(ncap_void),hnd_fnc_stat3,PS_MAX)); gpr_vtr.push_back(gpr_cls("gsl_stats_min",f_unn(ncap_void),hnd_fnc_stat3,PS_MIN)); gpr_vtr.push_back(gpr_cls("gsl_stats_max_index",f_unn(ncap_void),hnd_fnc_stat3,PS_MAX_IDX)); gpr_vtr.push_back(gpr_cls("gsl_stats_min_index",f_unn(ncap_void),hnd_fnc_stat3,PS_MIN_IDX)); { f_unn lcl_arr[]={ f_unn(gsl_stats_char_median_from_sorted_data), f_unn(gsl_stats_short_median_from_sorted_data), f_unn(gsl_stats_int_median_from_sorted_data), f_unn(gsl_stats_float_median_from_sorted_data), f_unn(gsl_stats_median_from_sorted_data), f_unn(gsl_stats_uchar_median_from_sorted_data), f_unn(gsl_stats_ushort_median_from_sorted_data), f_unn(gsl_stats_uint_median_from_sorted_data), f_unn(gsl_stats_long_median_from_sorted_data),f_unn(gsl_stats_ulong_median_from_sorted_data) }; gpr_vtr.push_back(gpr_cls("gsl_stats_median_from_sorted_data",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } { f_unn lcl_arr[]={ f_unn(gsl_stats_char_quantile_from_sorted_data), f_unn(gsl_stats_short_quantile_from_sorted_data), f_unn(gsl_stats_int_quantile_from_sorted_data), f_unn(gsl_stats_float_quantile_from_sorted_data), f_unn(gsl_stats_quantile_from_sorted_data), f_unn(gsl_stats_uchar_quantile_from_sorted_data), f_unn(gsl_stats_ushort_quantile_from_sorted_data), f_unn(gsl_stats_uint_quantile_from_sorted_data), f_unn(gsl_stats_long_quantile_from_sorted_data),f_unn(gsl_stats_ulong_quantile_from_sorted_data) }; gpr_vtr.push_back(gpr_cls("gsl_stats_quantile_from_sorted_data",ARR2VTR(lcl_arr),hnd_fnc_stat1)); } gpr_vtr.push_back(gpr_cls("gsl_stats_covariance",f_unn(ncap_void),hnd_fnc_stat4,PS_COV)); # if NCO_GSLVERSION >= 110 gpr_vtr.push_back(gpr_cls("gsl_stats_correlation",f_unn(ncap_void),hnd_fnc_stat4,PS_COR)); # endif // NCO_GSL_VERSION < 110 gpr_vtr.push_back(gpr_cls("gsl_stats_pvariance",f_unn(ncap_void),hnd_fnc_stat4,PS_PVAR)); gpr_vtr.push_back(gpr_cls("gsl_stats_ttest",f_unn(ncap_void),hnd_fnc_stat4,PS_TTST)); } // end gsl_ini_stats var_sct * gsl_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_cls::fnd"); bool is_mtd; int fdx; var_sct *var_ret=NULL_CEWI; RefAST tr; std::vector args_vtr; // function pointer var_sct* (*hnd_fnc)(HANDLE_ARGS); // de-reference fdx=fmc_obj.fdx(); is_mtd=(expr ? true: false); // Put args into vector if(expr) args_vtr.push_back(expr); if(tr=fargs->getFirstChild()) { do args_vtr.push_back(tr); while(tr=tr->getNextSibling()); } hnd_fnc=gpr_vtr[fdx]._hnd_fnc; // gsl_set_error_handler_off(); /* dont abort when error */ var_ret=hnd_fnc(is_mtd,args_vtr,gpr_vtr[fdx],walker); return var_ret; } var_sct *gsl_cls::hnd_fnc_x(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_x"); int idx; int args_nbr; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); type=gpr_obj.type(); if(args_nbr==0) err_prn(fnc_nm,styp+" \""+sfnm+"\" has been called with no arguments"); var=walker.out(args_vtr[0]); if(prs_arg->ntl_scn){ if(!var->undefined) var=nco_var_cnf_typ(NC_DOUBLE,var); return var; } switch(type){ case NC_UINT: { bool has_mss_val; long sz=var->sz; double mss_val_dbl=0.0; nco_uint *uip; double *dp; var_sct *var_out; gsl_sf_result rslt; /* structure for result from gsl lib call */ int (*fnc_int)(unsigned int, gsl_sf_result*); fnc_int=gpr_obj.g_args().au; var_out=nco_var_dpl(var); var_out=nco_var_cnf_typ(NC_DOUBLE,var_out); (void)cast_void_nctype(NC_DOUBLE,&(var_out->val)); dp=var_out->val.dp; has_mss_val=false; if(var_out->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&(var_out->mss_val)); mss_val_dbl=var_out->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_out->mss_val)); } // convert to int var=nco_var_cnf_typ((nc_type)NC_UINT,var); (void)cast_void_nctype((nc_type)NC_UINT,&(var->val)); uip=var->val.uip; if(has_mss_val){ for(idx=0;idxval)); (void)cast_nctype_void((nc_type)NC_UINT,&(var->val)); nco_var_free(var); var=var_out; } break; case NC_INT: { bool has_mss_val; int sz=var->sz; double mss_val_dbl=0; nco_int *ip; double *dp; var_sct *var_out; gsl_sf_result rslt; /* structure for result from gsl lib call */ int (*fnc_int)(int, gsl_sf_result*); fnc_int=gpr_obj.g_args().ai; var_out=nco_var_dpl(var); var_out=nco_var_cnf_typ(NC_DOUBLE,var_out); (void)cast_void_nctype(NC_DOUBLE,&(var_out->val)); dp=var_out->val.dp; has_mss_val=false; if(var_out->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&(var_out->mss_val)); mss_val_dbl=var_out->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_out->mss_val)); } // convert to int var=nco_var_cnf_typ(NC_INT,var); (void)cast_void_nctype(NC_INT,&(var->val)); ip=var->val.ip; if(has_mss_val){ for(idx=0;idxval)); (void)cast_nctype_void(NC_INT,&(var->val)); nco_var_free(var); var=var_out; } break; case NC_DOUBLE: { bool has_mss_val; int sz=var->sz; double mss_val_dbl; double *dp; gsl_sf_result rslt; /* structure for result from gsl lib call */ int (*fnc_int)(double, gsl_sf_result*); fnc_int=gpr_obj.g_args().ad; // convert to double var=nco_var_cnf_typ(NC_DOUBLE,var); (void)cast_void_nctype(NC_DOUBLE,&(var->val)); dp=var->val.dp; has_mss_val=false; if(var->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&(var->mss_val)); mss_val_dbl=var->mss_val.dp[0]; } if(has_mss_val){ for(idx=0;idxval)); if(var->has_mss_val) (void)cast_nctype_void(NC_DOUBLE,&(var->mss_val)); } break; default: break; } // end big switch return var; } // end hnd_fnc_x var_sct *gsl_cls::hnd_fnc_xd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_dd"); int idx; int args_nbr; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; var_sct *var_ret=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); if(args_nbr <2){ if(is_mtd) err_prn(fnc_nm,styp+" \""+sfnm+"\" requires one argument. None given"); else err_prn(fnc_nm,styp+" \""+sfnm+"\" requires two arguments"); } var1=walker.out(args_vtr[0]); var2=walker.out(args_vtr[1]); // Deal with initial scan if(prs_arg->ntl_scn){ if(var1->undefined || var2->undefined){ var1=nco_var_free(var1); var2=nco_var_free(var2); var_ret=ncap_var_udf("~gsl_cls"); }else { var_ret=ncap_var_att_cnf_ntl(var2,var1); var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); } return var_ret; } switch(type){ // Unimplemented. Currently there are no gsl functions // with the signature (unsigned int, double,gsl_sf_result) case NC_UINT: break; case NC_DOUBLE: // This is handled in hnd_fnc_nd,P2DBL break; case NC_INT: { bool has_mss_val=false; int sz; nco_int mss_val_ntg; nco_int *ip1; double *dp2; double mss_val_dbl; gsl_sf_result rslt; /* structure for result from gsl lib call */ int (*fnc_int)(int,double, gsl_sf_result*); // convert to type double var1=nco_var_cnf_typ(NC_INT,var1); var2=nco_var_cnf_typ(NC_DOUBLE,var2); // make operands conform ncap_var_att_cnf(var2,var1); sz=var1->sz; fnc_int=gpr_obj.g_args().aid; (void)cast_void_nctype(NC_INT,&(var1->val)); ip1=var1->val.ip; (void)cast_void_nctype(NC_DOUBLE,&(var2->val)); dp2=var2->val.dp; // Ignore for now missing values from first operand if(var1->has_mss_val){ //has_mss_val=true; (void)cast_void_nctype(NC_INT,&var1->mss_val); mss_val_ntg=*var1->mss_val.ip; (void)cast_nctype_void(NC_INT,&(var1->mss_val)); } if(var2->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var2->mss_val); mss_val_dbl=*var2->mss_val.dp; (void)cast_nctype_void(NC_DOUBLE,&(var2->mss_val)); } if(!has_mss_val){ for(idx=0;idxval)); (void)cast_nctype_void(NC_DOUBLE,&(var2->val)); nco_var_free(var1); } break; default: break; } // end big switch return var2; } // end function hnd_fnc_xd // used for evaluating arrays of bessel & legendre functions // bessel functions have the arg signature (int min,int max,double x,double *results ) // legendre functions have the min & max reveresed (int lmax,int m,double x,double *results) var_sct *gsl_cls::hnd_fnc_iidpd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_iidpd"); int idx; int args_nbr; int fdx=gpr_obj.type(); // only two types at the moment std::string serr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); std::string susg; // usage string; std::string var_nm; var_sct *var_arr[3]; var_sct *var_out=NULL_CEWI; var_sct *var_tmp=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); if(fdx==PBESSEL) susg="usage: status="+sfnm+"(int nmin, int nmax, double x, &var_in)"; else{ if(fdx==PLEGEND) susg="usage: status="+sfnm+"(int lmax, int m, double x, &var_in)";} if(args_nbr <4){ if(is_mtd) err_prn(sfnm,styp+" requires three arguments\n"+susg); else err_prn(sfnm,styp+" requires four arguments\n"+susg); } args_nbr=4; // check fourth argument // fourth agument must be a call by reference VAR_ID or ATT_ID if(args_vtr[3]->getType() != CALL_REF ) err_prn(sfnm,styp+". fourth argument must be a call by reference variable\n"+susg); var_nm=args_vtr[3]->getFirstChild()->getText(); var_out=prs_arg->ncap_var_init(var_nm,true); if(!var_out->undefined && var_out->type !=NC_DOUBLE ) err_prn(sfnm,styp+". Reference variable var_in must be of type DOUBLE\n"+susg); // Deal with initial scan if(prs_arg->ntl_scn){ // evaluate first 3 args for side effect for(idx=0 ; idxundefined) var_out=nco_var_free(var_out); else (void)prs_arg->ncap_var_write(var_out,false); return ncap_sclr_var_mk(SCS("~gsl_function"),(nc_type)NC_INT,false); } // Do the real thing // nb the args are fnc_int(int nmin, int nmax, double x, double * result_array); // get the first three args for(idx=0;idx<3;idx++) var_arr[idx]=walker.out(args_vtr[idx]); // do heavy listing; { int nbr_min; int nbr_max; int status; int sz_out=0; double xin; double *dp_out; int (*fnc_int)(int,int,double, double*); fnc_int=gpr_obj.g_args().biidpd; var_arr[0]=nco_var_cnf_typ(NC_INT,var_arr[0]); (void)cast_void_nctype(NC_INT,&(var_arr[0]->val)); nbr_min=var_arr[0]->val.ip[0]; (void)cast_nctype_void(NC_INT,&(var_arr[0]->val)); var_arr[1]=nco_var_cnf_typ(NC_INT,var_arr[1]); (void)cast_void_nctype(NC_INT,&(var_arr[1]->val)); nbr_max=var_arr[1]->val.ip[0]; (void)cast_nctype_void(NC_INT,&(var_arr[1]->val)); var_arr[2]=nco_var_cnf_typ(NC_DOUBLE,var_arr[2]); (void)cast_void_nctype(NC_DOUBLE,&(var_arr[2]->val)); xin=var_arr[2]->val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[2]->val)); if(fdx==PBESSEL){ sz_out=nbr_max-nbr_min+1; if(sz_out<1 ) err_prn(sfnm,"nmax must be greater than or equal to nmin\n"+susg); } // nb Legendre array functions have min/max reversed if(fdx==PLEGEND){ sz_out=nbr_min-nbr_max+1; if(sz_out<1 ) err_prn(sfnm,"lmax must be greater than or equal to m\n"+susg); } (void)cast_void_nctype(NC_DOUBLE,&(var_out->val)); dp_out=var_out->val.dp; if(sz_out>var_out->sz ){ serr="Size("+nbr2sng(sz_out)+ ") of result greater than variable size("+nbr2sng(var_out->sz)+")\n"; err_prn(sfnm,serr+susg); } // Call the gsl function status=fnc_int(nbr_min,nbr_max,xin,dp_out); // write the results (void)cast_nctype_void(NC_DOUBLE,&(var_out->val)); (void)prs_arg->ncap_var_write(var_out,false); // Free args for(idx=0;idx<3;idx++) (void)nco_var_free(var_arr[idx]); var_tmp=ncap_sclr_var_mk(SCS("~gsl_function"),(nco_int)status); } // return status return var_tmp; } // end function hnd_fnc_iidpd var_sct *gsl_cls::hnd_fnc_idpd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_idpd"); int idx; int args_nbr; std::string serr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); std::string susg; // usage string; std::string var_nm; var_sct *var_arr[2]; var_sct *var_out=NULL_CEWI; var_sct *var_tmp=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); susg="usage: status="+sfnm+"(int lmax, double x, &var_in)"; if(args_nbr < 3){ if(is_mtd) err_prn(sfnm,styp+" requires two arguments\n"+susg); else err_prn(sfnm,styp+" requires three arguments\n"+susg); } args_nbr=3; // Ignore extra arguments // Check third argument // Third agument must be a call by reference VAR_ID or ATT_ID if(args_vtr[2]->getType() != CALL_REF ) err_prn(sfnm,styp+". third argument must be a call by reference variable\n"+susg); var_nm=args_vtr[2]->getFirstChild()->getText(); var_out=prs_arg->ncap_var_init(var_nm,true); if(!var_out->undefined && var_out->type !=NC_DOUBLE ) err_prn(sfnm,styp+". reference variable var_in must be of type DOUBLE\n"+susg); // Deal with initial scan // nb this method returns an int which is the gsl status flag; if(prs_arg->ntl_scn){ // evaluate args for side effect for(idx=0 ; idx<2 ; idx++){ var_tmp=walker.out(args_vtr[idx]); var_tmp=nco_var_free(var_tmp); } if(var_out->undefined) var_out=nco_var_free(var_out); else (void)prs_arg->ncap_var_write(var_out,false); return ncap_sclr_var_mk(SCS("~gsl_function"),(nc_type)NC_INT,false); } // Do the real thing // nb the args are fnc_int(int lmax, double x, double * result_array); // get the first two args for(idx=0;idx<2;idx++) var_arr[idx]=walker.out(args_vtr[idx]); // do heavy listing; { int nbr_max; int status; int sz_out; double xin; double *dp_out; int (*fnc_int)(int,double, double*); fnc_int=gpr_obj.g_args().bidpd; var_arr[0]=nco_var_cnf_typ(NC_INT,var_arr[0]); (void)cast_void_nctype(NC_INT,&(var_arr[0]->val)); nbr_max=var_arr[0]->val.ip[0]; (void)cast_nctype_void(NC_INT,&(var_arr[0]->val)); var_arr[1]=nco_var_cnf_typ(NC_DOUBLE,var_arr[1]); (void)cast_void_nctype(NC_DOUBLE,&(var_arr[1]->val)); xin=var_arr[1]->val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[1]->val)); sz_out=nbr_max+1; // check int argument if(sz_out<1 ) err_prn(sfnm,"lmax must be greater than or equal to zero\n"+susg); var_out=nco_var_cnf_typ(NC_DOUBLE,var_out); (void)cast_void_nctype(NC_DOUBLE,&(var_out->val)); dp_out=var_out->val.dp; if(sz_out>var_out->sz ){ serr="Size("+nbr2sng(sz_out)+ ") of result greater than variable size("+nbr2sng(var_out->sz)+")\n"; err_prn(sfnm,serr+susg); } // Call the gsl function status=fnc_int(nbr_max,xin,dp_out); (void)cast_nctype_void(NC_DOUBLE,&(var_out->val)); // write the result (void)prs_arg->ncap_var_write(var_out,false); // Free args (void)nco_var_free(var_arr[0]); (void)nco_var_free(var_arr[1]); var_tmp=ncap_sclr_var_mk(SCS("~gsl_function"),(nco_int)status); } return var_tmp; } // end function hnd_fnc_idpd var_sct *gsl_cls::hnd_fnc_nd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_nd"); int idx; int jdx; int fdx=gpr_obj.type(); // very important int args_nbr; int args_in_nbr(-1); // CEWI nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct **var_arr; var_sct ***var_arr_ptr; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); switch(fdx) { case P1DBLMD: case P1DBL: case P1DBLX: args_in_nbr=1; break; case P2DBLMD: case P2DBL: case P2DBLX: args_in_nbr=2; break; case P3DBLMD: case P3DBL: case P3DBLX: args_in_nbr=3; break; case P4DBLMD: case P4DBL: case P4DBLX: args_in_nbr=4; break; case P5DBLX: args_in_nbr=5; break; default: break; } if(args_nbr < args_in_nbr){ if(is_mtd) err_prn(sfnm,styp+" requires "+nbr2sng(args_in_nbr-1)+ " arguments"); else err_prn(sfnm,styp+" requires "+ nbr2sng(args_in_nbr) + " arguments."); } // init once we now num of args var_arr=(var_sct**)nco_malloc(sizeof(var_sct*)*args_in_nbr); var_arr_ptr=(var_sct***)nco_malloc(sizeof(var_sct**)*args_in_nbr); for(idx=0;idxntl_scn){ if(args_in_nbr >1 ) // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,args_in_nbr ); else var_ret=var_arr[0]; if(!var_ret->undefined) var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); return var_ret; } for(idx=0 ; idx1) // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,args_in_nbr ); // do heavy lifting { bool has_mss_val=false; int sz; double **dp; double mss_val_dbl=0.0; gsl_mode_t mde_t=ncap_gsl_mode_prec; // initialize local from global variable */ gsl_sf_result rslt; /* structure for result from gsl lib call */ dp=(double**)nco_malloc(sizeof(double*)*args_in_nbr); // assume from here on that args conform sz=var_arr[0]->sz; for(idx=0 ; idxval)); dp[idx]=var_arr[idx]->val.dp; } has_mss_val=false; for(idx=0 ; idxhas_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[idx]->mss_val); mss_val_dbl=var_arr[idx]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[idx]->mss_val)); break; } switch(fdx){ // one double argument case P1DBL: { int (*fnc_int)(double,gsl_sf_result*); fnc_int=gpr_obj.g_args().ad; if(!has_mss_val){ for(jdx=0;jdxval)); if(idx>0) nco_var_free(var_arr[idx]); } dp=(double**)nco_free(dp); } // end heavy lifting var_arr_ptr=(var_sct***)nco_free(var_arr_ptr); return var_arr[0]; } //end hnd_fnc_nd // handle regular arguments NC_INT,NC_INT,NC_DOUBLE var_sct *gsl_cls::hnd_fnc_iid(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_iid"); int idx; int jdx; //int fdx=gpr_obj.type(); // very important int args_nbr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct *var_arr[3]; var_sct **var_arr_ptr[3]; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); if(args_nbr <3){ if(is_mtd) err_prn(sfnm,styp+" requires two arguments"); else err_prn(sfnm,styp+" requires three arguments."); } for(idx=0; idx< 3 ;idx++){ var_arr[idx]=walker.out(args_vtr[idx]); var_arr_ptr[idx]=&var_arr[idx]; } // Deal with initial scan if(prs_arg->ntl_scn){ // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); if(!var_ret->undefined) var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); return var_ret; } var_arr[0]=nco_var_cnf_typ(NC_INT,var_arr[0]); var_arr[1]=nco_var_cnf_typ(NC_INT,var_arr[1]); var_arr[2]=nco_var_cnf_typ(NC_DOUBLE,var_arr[2]); // now make variables conform // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); // do heavy lifting { bool has_mss_val=false; int sz; double *dp; nco_int *ip[2]; double mss_val_dbl; gsl_sf_result rslt; /* structure for result from gsl lib call */ // assume from here on that args conform sz=var_arr[0]->sz; (void)cast_void_nctype(NC_INT,&(var_arr[0]->val)); ip[0]=var_arr[0]->val.ip; (void)cast_void_nctype(NC_INT,&(var_arr[1]->val)); ip[1]=var_arr[1]->val.ip; (void)cast_void_nctype(NC_DOUBLE,&(var_arr[2]->val)); dp=var_arr[2]->val.dp; has_mss_val=false; if(var_arr[2]->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[2]->mss_val); mss_val_dbl=var_arr[2]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[2]->mss_val)); } // do the deed !!! { int (*fnc_int)(int, int,double,gsl_sf_result*); fnc_int=gpr_obj.g_args().aiid; if(!has_mss_val){ for(jdx=0;jdxval)); (void)cast_nctype_void(NC_INT,&(var_arr[1]->val)); (void)cast_nctype_void(NC_DOUBLE,&(var_arr[2]->val)); (void)nco_var_free(var_arr[0]); (void)nco_var_free(var_arr[1]); } return var_arr[2]; } // handle regular arguments NC_INT,NC_DOUBLE,NC_DOUBLE var_sct *gsl_cls::hnd_fnc_idd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_idd"); int idx; int jdx; //int fdx=gpr_obj.type(); // very important int args_nbr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct *var_arr[3]; var_sct **var_arr_ptr[3]; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); if(args_nbr <3){ if(is_mtd) err_prn(sfnm,styp+" requires two arguments"); else err_prn(sfnm,styp+" requires three arguments.");} for(idx=0; idx< 3 ;idx++){ var_arr[idx]=walker.out(args_vtr[idx]); var_arr_ptr[idx]=&var_arr[idx]; } // Deal with initial scan if(prs_arg->ntl_scn){ // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); if(!var_ret->undefined) var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); return var_ret; } var_arr[0]=nco_var_cnf_typ(NC_INT,var_arr[0]); var_arr[1]=nco_var_cnf_typ(NC_DOUBLE,var_arr[1]); var_arr[2]=nco_var_cnf_typ(NC_DOUBLE,var_arr[2]); // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); // do heavy lifting { bool has_mss_val=false; int sz; double *dp[2]; nco_int *ip; double mss_val_dbl; gsl_sf_result rslt; /* structure for result from gsl lib call */ // assume from here on that args conform sz=var_arr[0]->sz; (void)cast_void_nctype(NC_INT,&(var_arr[0]->val)); ip=var_arr[0]->val.ip; (void)cast_void_nctype(NC_DOUBLE,&(var_arr[1]->val)); dp[0]=var_arr[1]->val.dp; (void)cast_void_nctype(NC_DOUBLE,&(var_arr[2]->val)); dp[1]=var_arr[2]->val.dp; // get missing value has_mss_val=false; for(idx=1 ; idx<3 ;idx++) if(var_arr[idx]->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[idx]->mss_val); mss_val_dbl=var_arr[idx]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[idx]->mss_val)); break; } // do the deed !!! { int (*fnc_int)(int,double,double,gsl_sf_result*); fnc_int=gpr_obj.g_args().aidd; if(!has_mss_val){ for(jdx=0;jdxval)); (void)cast_nctype_void(NC_DOUBLE,&(var_arr[1]->val)); (void)cast_nctype_void(NC_DOUBLE,&(var_arr[2]->val)); (void)nco_var_free(var_arr[0]); (void)nco_var_free(var_arr[2]); } return var_arr[1]; } // end function hnd_fnc_idd // handle regular arguments NC_UINT,NC_DOUBLE var_sct *gsl_cls::hnd_fnc_ud(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_ud"); long idx; int args_nbr; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var1=NULL_CEWI; var_sct *var2=NULL_CEWI; var_sct *var_ret=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); if(args_nbr <2){ if(is_mtd) err_prn(fnc_nm,styp+" \""+sfnm+"\" requires one argument. None given"); else err_prn(fnc_nm,styp+" \""+sfnm+"\" requires two arguments"); } var1=walker.out(args_vtr[0]); var2=walker.out(args_vtr[1]); // Deal with initial scan if(prs_arg->ntl_scn){ if(var1->undefined || var2->undefined){ var1=nco_var_free(var1); var2=nco_var_free(var2); var_ret=ncap_var_udf("~gsl_cls"); }else { var_ret=ncap_var_att_cnf_ntl(var2,var1); var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); } return var_ret; } { bool has_mss_val=false; long sz; nco_uint *uip; double *dp; double mss_val_dbl; double (*fnc_dbl)(unsigned,double); // convert to type double var1=nco_var_cnf_typ((nc_type)NC_UINT,var1); var2=nco_var_cnf_typ(NC_DOUBLE,var2); // make operands conform ncap_var_att_cnf(var2,var1); sz=var1->sz; fnc_dbl=gpr_obj.g_args().cud; (void)cast_void_nctype((nc_type)NC_UINT,&(var1->val)); uip=var1->val.uip; (void)cast_void_nctype(NC_DOUBLE,&(var2->val)); dp=var2->val.dp; if(var2->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var2->mss_val); mss_val_dbl=var2->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var2->mss_val)); } if(!has_mss_val){ for(idx=0;idxval)); (void)cast_nctype_void(NC_DOUBLE,&(var2->val)); nco_var_free(var1); } return var2; } // handle regular arguments NC_UINT,NC_DOUBLE,NC_UINT var_sct *gsl_cls::hnd_fnc_udu(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_udu"); int idx; int jdx; //int fdx=gpr_obj.type(); // very important int args_nbr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct *var_arr[3]; var_sct **var_arr_ptr[3]; // de-reference prs_cls *prs_arg=walker.prs_arg; args_nbr=args_vtr.size(); if(args_nbr <3){ if(is_mtd) err_prn(sfnm,styp+" requires two arguments"); else err_prn(sfnm,styp+" requires three arguments."); } for(idx=0; idx< 3 ;idx++){ var_arr[idx]=walker.out(args_vtr[idx]); var_arr_ptr[idx]=&var_arr[idx]; } // Deal with initial scan if(prs_arg->ntl_scn){ // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); if(!var_ret->undefined) var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); return var_ret; } var_arr[0]=nco_var_cnf_typ((nc_type)NC_UINT,var_arr[0]); var_arr[1]=nco_var_cnf_typ(NC_DOUBLE,var_arr[1]); var_arr[2]=nco_var_cnf_typ((nc_type)NC_UINT,var_arr[2]); // now make variables conform // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,3 ); // do heavy lifting { bool has_mss_val=false; int sz; double *dp; nco_uint *uip[2]; double mss_val_dbl; double (*fnc_dbl)(unsigned,double,unsigned); fnc_dbl=gpr_obj.g_args().cudu; // assume from here on that args conform sz=var_arr[0]->sz; (void)cast_void_nctype((nc_type)NC_UINT,&(var_arr[0]->val)); uip[0]=var_arr[0]->val.uip; (void)cast_void_nctype(NC_DOUBLE,&(var_arr[1]->val)); dp=var_arr[1]->val.dp; (void)cast_void_nctype((nc_type)NC_UINT,&(var_arr[2]->val)); uip[1]=var_arr[1]->val.uip; has_mss_val=false; if(var_arr[1]->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[1]->mss_val); mss_val_dbl=var_arr[1]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[1]->mss_val)); } if(!has_mss_val){ for(jdx=0;jdxval)); (void)cast_nctype_void(NC_DOUBLE,&(var_arr[1]->val)); (void)cast_nctype_void((nc_type)NC_UINT,&(var_arr[2]->val)); (void)nco_var_free(var_arr[0]); (void)nco_var_free(var_arr[2]); } return var_arr[1]; } //end hnd_fnc_udu var_sct *gsl_cls::hnd_fnc_rnd(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_rnd"); int idx; int jdx; int fdx=gpr_obj.type(); // very important int args_nbr; int args_in_nbr(-1); // CEWI nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct **var_arr; var_sct ***var_arr_ptr; // GSL random Number stuff gsl_rng *ncap_rng; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); switch(fdx) { case P0DBLX: case P1DBLX: args_in_nbr=1; break; case P2DBLX: args_in_nbr=2; break; case P3DBLX: args_in_nbr=3; break; default: break; } if(args_nbr < args_in_nbr){ if(is_mtd) err_prn(sfnm,styp+" requires "+nbr2sng(args_in_nbr-1)+ " arguments"); else err_prn(sfnm,styp+" requires "+ nbr2sng(args_in_nbr) + " arguments."); } // init once we now num of args var_arr=(var_sct**)nco_malloc(sizeof(var_sct*)*args_in_nbr); var_arr_ptr=(var_sct***)nco_malloc(sizeof(var_sct**)*args_in_nbr); for(idx=0;idxntl_scn){ if(args_in_nbr >1 ) // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,args_in_nbr ); else var_ret=var_arr[0]; if(!var_ret->undefined) var_ret=nco_var_cnf_typ(NC_DOUBLE,var_ret); return var_ret; } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); for(idx=0 ; idx1) // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,args_in_nbr ); // do heavy lifting { bool has_mss_val=false; int sz; double **dp; double mss_val_dbl=0.0; gsl_mode_t mde_t=ncap_gsl_mode_prec; // initialize local from global variable */ gsl_sf_result rslt; /* structure for result from gsl lib call */ dp=(double**)nco_malloc(sizeof(double*)*args_in_nbr); // assume from here on that args conform sz=var_arr[0]->sz; for(idx=0 ; idxval)); dp[idx]=var_arr[idx]->val.dp; } has_mss_val=false; for(idx=0 ; idxhas_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[idx]->mss_val); mss_val_dbl=var_arr[idx]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[idx]->mss_val)); break; } switch(fdx){ // no double argument case P0DBLX: { double (*fnc_dbl)(const gsl_rng*); fnc_dbl=gpr_obj.g_args().cr; // no need to worry about missing values here !! for(jdx=0;jdxval)); if(idx>0) nco_var_free(var_arr[idx]); } dp=(double**)nco_free(dp); } // end heavy lifting // free Random Number generator gsl_rng_free(ncap_rng); var_arr_ptr=(var_sct***)nco_free(var_arr_ptr); return var_arr[0]; } // hnd_fnc_rnd var_sct *gsl_cls::hnd_fnc_ru(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_ru"); int idx; int args_nbr; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var=NULL_CEWI; var_sct *var1=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; gsl_rng *ncap_rng; args_nbr=args_vtr.size(); type=gpr_obj.type(); if(args_nbr==0) err_prn(fnc_nm,styp+" \""+sfnm+"\" has been called with no arguments"); var=walker.out(args_vtr[0]); if(prs_arg->ntl_scn){ if(!var->undefined) var=nco_var_cnf_typ(NC_DOUBLE,var); return var; } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); { long sz=var->sz; nco_uint mss_val_ntg=0; nco_uint *uip; double *dp; double (*fnc_dbl)(const gsl_rng*,unsigned); fnc_dbl=gpr_obj.g_args().cru; var=nco_var_cnf_typ((nc_type)NC_UINT,var); var1=nco_var_dpl(var); var1=nco_var_cnf_typ(NC_DOUBLE,var1); (void)cast_void_nctype(NC_DOUBLE,&(var1->val)); dp=var1->val.dp; (void)cast_void_nctype((nc_type)NC_UINT,&(var->val)); uip=var->val.uip; if(var->has_mss_val){ (void)cast_void_nctype((nc_type)NC_UINT,&(var->mss_val)); mss_val_ntg=var->mss_val.uip[0]; (void)cast_nctype_void((nc_type)NC_UINT,&(var->mss_val)); } if(var->has_mss_val){ for(idx=0;idxval)); nco_var_free(var); (void)cast_nctype_void(NC_DOUBLE,&(var1->val)); } gsl_rng_free(ncap_rng); return var1; } // end hnd_fnc_ru var_sct *gsl_cls::hnd_fnc_udrx(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_udrx"); int idx; int args_nbr; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; gsl_rng *ncap_rng; args_nbr=args_vtr.size(); type=gpr_obj.type(); if(args_nbr==0) err_prn(fnc_nm,styp+" \""+sfnm+"\" has been called with no arguments"); var=walker.out(args_vtr[0]); if(prs_arg->ntl_scn){ if(!var->undefined) var=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var); return var; } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); switch(type){ case NC_UINT: { long sz=var->sz; nco_uint mss_val_uint=0; nco_uint *uip; unsigned (*fnc_int)(const gsl_rng*,unsigned); fnc_int=gpr_obj.g_args().dru; var=nco_var_cnf_typ((nc_type)NC_UINT,var); (void)cast_void_nctype((nc_type)NC_UINT,&(var->val)); uip=var->val.uip; if(var->has_mss_val) mss_val_uint=var->mss_val.uip[0]; if(var->has_mss_val){ for(idx=0;idxval)); } break; case NC_DOUBLE: { bool has_mss_val; int sz=var->sz; nco_uint *uip; double mss_val_dbl; double *dp; var_sct *var_out; unsigned (*fnc_int)(const gsl_rng*,double); fnc_int=gpr_obj.g_args().drd; // convert to double var=nco_var_cnf_typ(NC_DOUBLE,var); var_out=nco_var_dpl(var); var_out=nco_var_cnf_typ((nc_type)NC_UINT,var_out); (void)cast_void_nctype((nc_type)NC_UINT,&(var_out->val)); uip=var_out->val.uip; (void)cast_void_nctype(NC_DOUBLE,&(var->val)); dp=var->val.dp; has_mss_val=false; if(var->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&(var->mss_val)); mss_val_dbl=var->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var->mss_val)); } if(has_mss_val){ for(idx=0;idxval)); var=nco_var_free(var); (void)cast_nctype_void((nc_type)NC_UINT,&(var_out->val)); var=var_out; } break; default: break; } // end big switch // convert var if necessary var=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var); gsl_rng_free(ncap_rng); return var; } // end hnd_fnc_udrx var_sct *gsl_cls::hnd_fnc_udrdu(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_udrdu"); int idx; long jdx; int args_nbr; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var_ret; var_sct *var_arr[2]; var_sct **var_arr_ptr[2]; // de-reference prs_cls *prs_arg=walker.prs_arg; gsl_rng *ncap_rng; args_nbr=args_vtr.size(); if(args_nbr <2){ if(is_mtd) err_prn(sfnm,styp+" requires one argument"); else err_prn(sfnm,styp+" requires two arguments."); } for(idx=0; idx< 2 ;idx++){ var_arr[idx]=walker.out(args_vtr[idx]); var_arr_ptr[idx]=&var_arr[idx]; } // Deal with initial scan if(prs_arg->ntl_scn){ // nb ncap_var_att_arr_cnf() frees up sct's in var_att_ptr var_ret=ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,2 ); if(!var_ret->undefined) var_ret=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var_ret); return var_ret; } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); var_arr[0]=nco_var_cnf_typ(NC_DOUBLE,var_arr[0]); var_arr[1]=nco_var_cnf_typ((nc_type)NC_UINT,var_arr[1]); // now make variables conform // make variables conform (void)ncap_var_att_arr_cnf(prs_arg->ntl_scn,var_arr_ptr,2 ); // do heavy lifting { bool has_mss_val=false; long sz; double *dp; nco_uint mss_val_uint=0; nco_uint *uip; double mss_val_dbl; // assume from here on that args conform sz=var_arr[0]->sz; (void)cast_void_nctype(NC_DOUBLE,&(var_arr[0]->val)); dp=var_arr[0]->val.dp; (void)cast_void_nctype((nc_type)NC_UINT,&(var_arr[1]->val)); uip=var_arr[1]->val.uip; has_mss_val=false; if(var_arr[0]->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_arr[0]->mss_val); mss_val_dbl=var_arr[0]->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[0]->mss_val)); // use C imlicit conversion mss_val_uint=(nco_uint)mss_val_dbl; } // do the deed !!! { unsigned int (*fnc_int)(const gsl_rng* ,double,unsigned); fnc_int=gpr_obj.g_args().drdu; if(!has_mss_val){ for(jdx=0;jdxval)); (void)cast_nctype_void((nc_type)NC_UINT,&(var_arr[1]->val)); (void)nco_var_free(var_arr[0]); } gsl_rng_free(ncap_rng); // Convert if necessary var_arr[1]=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var_arr[1]); return var_arr[1]; } // end hnd_fnc_udrdu var_sct *gsl_cls::hnd_fnc_uerx(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_udrx"); int args_nbr; long idx; unsigned long rng_max_lng; const char *rng_nm_sng; nc_type type; std::string styp=(is_mtd ? "method":"function"); std::string sfnm=gpr_obj.fnm(); var_sct *var=NULL_CEWI; // de-reference prs_cls *prs_arg=walker.prs_arg; gsl_rng *ncap_rng; args_nbr=args_vtr.size(); type=gpr_obj.type(); if(args_nbr==0) err_prn(fnc_nm,styp+" \""+sfnm+"\" has been called with no arguments"); var=walker.out(args_vtr[0]); if(prs_arg->ntl_scn){ if(!var->undefined) var=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var); return var; } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); rng_max_lng=gsl_rng_max(ncap_rng); rng_nm_sng=gsl_rng_name(ncap_rng); switch(type){ // This case is a wrapper for the single function // gsl_rng_get(). It shouldn't be used for any other function case NC_NAT: { long sz=var->sz; nco_uint *uip; unsigned long int (*fnc_int)(const gsl_rng*); fnc_int=gpr_obj.g_args().er; /* bomb out if max value of number generator can't be held in regular int */ if( NCO_TYP_GSL_UINT==NC_INT && rng_max_lng > INT_MAX ){ ostringstream os; os<<"Possible integer overflow. You are using the random number generator \"" <val)); uip=var->val.uip; for(idx=0;idxval)); } break; // This case is a wrapper for the single function // gsl_rng_uniform_int(). It shouldn't be used for any other function case NC_UINT: { bool has_mss_val; long sz=var->sz; nco_uint64 *ui64p; nco_uint64 mss_val_uint64; double *dp; unsigned long int(*fnc_int)(const gsl_rng*,unsigned long int); fnc_int=gpr_obj.g_args().eru; var=nco_var_cnf_typ((nc_type)NC_UINT64,var); (void)cast_void_nctype((nc_type)NC_UINT64,&(var->val)); ui64p=var->val.ui64p; //check requested max values if( NCO_TYP_GSL_UINT==NC_INT && rng_max_lng > INT_MAX) for(idx=0 ; idxINT_MAX ) { // bomb out if necessary ostringstream os; os<<"Possible integer overflow. You have rquested the generation of integers up to the value of " <has_mss_val){ has_mss_val=true; (void)cast_void_nctype((nc_type)NC_UINT64,&(var->mss_val)); mss_val_uint64=var->mss_val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var->mss_val)); } if(has_mss_val){ for(idx=0;idxval)); } break; default: break; } // end big switch gsl_rng_free(ncap_rng); // convert if necessary var=nco_var_cnf_typ((nc_type)NCO_TYP_GSL_UINT,var); return var; } // end hnd_fnc_uerx var_sct *gsl_cls::hnd_fnc_stat1(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_stat1"); int idx; int nbr_args; int in_nbr_args; nc_type type; std::string susg; std::string sfnm=gpr_obj.fnm(); var_sct *var[3]; double r_val; var[0]=var[1]=var[2]=(var_sct*)NULL; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); nbr_args=args_vtr.size(); susg=susg="usage: double_val="+sfnm+"(var_data, data_stride?, n?)"; if(nbr_args <1){ err_prn(sfnm,"Function requires at least one argument.\n"+susg ); } if(nbr_args >3) in_nbr_args=3; else in_nbr_args=nbr_args; for(idx=0 ;idxntl_scn){ for(idx=0 ;idx("~hnd_fnc_stat1"),NC_DOUBLE,false); } // do the heavy lifting { size_t sz; size_t d_srd; // first arg the data (void)cast_void_nctype(var[0]->type,&(var[0]->val)); // 2nd arg data stride if(var[1] !=(var_sct*)NULL){ var[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var[1]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var[1]->val)); d_srd=var[1]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var[1]->val)); var[1]=nco_var_free(var[1]); }else{ d_srd=1L; } // 3rd arg size if(var[2] !=(var_sct*)NULL){ var[2]=nco_var_cnf_typ((nc_type)NC_UINT64,var[2]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var[2]->val)); sz=var[2]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var[2]->val)); var[2]=nco_var_free(var[2]); }else{ sz=1+ (var[0]->sz-1)/d_srd; } // Check hyperslab limits if( 1+ (sz-1)*d_srd >var[0]->sz){ err_prn(sfnm,"Requested hyperslab with stride="+nbr2sng(d_srd)+" and n="+ nbr2sng(sz)+" doesn't fit into variable \""+string(var[0]->nm)+"\" with size="+nbr2sng(var[0]->sz)); } // remember we are dealing with g_args() -- an array of function pointers here // the order of gsl function pointers is significant -it is // char/short/int/float/double/uchar/ushort/uint/ulong/long switch(var[0]->type){ case NC_FLOAT: r_val=gpr_obj.g_args(3).csfpss( var[0]->val.fp,d_srd,sz);break; case NC_DOUBLE: r_val=gpr_obj.g_args(4).csdpss( var[0]->val.dp,d_srd,sz);break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gpr_obj.g_args(2).csipss(var[0]->val.ip,d_srd,sz); // NC_INT rpresented as long in nco #else r_val=gpr_obj.g_args(8).cslpss(var[0]->val.ip,d_srd,sz); #endif break; case NC_SHORT: r_val=gpr_obj.g_args(1).csspss( var[0]->val.sp,d_srd,sz);break; case NC_CHAR: r_val=gpr_obj.g_args(0).cscpss((const char*)var[0]->val.cp,d_srd,sz);break; case NC_BYTE: r_val=gpr_obj.g_args(0).cscpss((const char*)var[0]->val.bp,d_srd,sz);break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gpr_obj.g_args(5).csucpss((const unsigned char*)var[0]->val.ubp,d_srd,sz);break; case NC_USHORT: r_val=gpr_obj.g_args(6).csuspss( var[0]->val.usp,d_srd,sz);break; case NC_UINT: r_val=gpr_obj.g_args(7).csuipss(var[0]->val.uip,d_srd,sz);break; case NC_INT64: if( sizeof(long)!=sizeof(long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_INT64"); r_val=gpr_obj.g_args(8).cslpss((const long*)var[0]->val.i64p,d_srd,sz); break; case NC_UINT64: if( sizeof(unsigned long)!=sizeof(unsigned long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_UINT64"); r_val=gpr_obj.g_args(9).csulpss((const unsigned long*)var[0]->val.ui64p,d_srd,sz); break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } // end switch (void)cast_nctype_void(var[0]->type,&(var[0]->val)); } // end heavy lifting var[0]=nco_var_free(var[0]); return ncap_sclr_var_mk(SCS("~gsl_stt2_function"),r_val); } var_sct *gsl_cls::hnd_fnc_stat2(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_stat2"); int idx; int args_nbr; nc_type type; std::string susg; std::string sfnm=gpr_obj.fnm(); var_sct *var_arr[4]; double r_val; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); susg=susg="usage: double_val="+sfnm+"(var_data, data_stride, n, double_val)"; if(args_nbr <4){ err_prn(sfnm,"Function requires four arguments.\n"+susg ); } for(idx=0;idx<4;idx++) var_arr[idx]=walker.out(args_vtr[idx]); // Deal with initial scan if(prs_arg->ntl_scn){ for(idx=0;idx<4;idx++) var_arr[idx]=nco_var_free(var_arr[idx]); return ncap_sclr_var_mk(static_cast< std::string>("~hnd_fnc_stat2"),(nc_type)NC_DOUBLE,false); } // do the heavy lifting { double dmean; size_t sz; size_t d_srd; // first arg the data (void)cast_void_nctype(var_arr[0]->type,&(var_arr[0]->val)); // 2nd arg data stride var_arr[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[1]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[1]->val)); d_srd=(size_t) var_arr[1]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[1]->val)); // 3nd arg n --number of elements to perform function over var_arr[2]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[2]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[2]->val)); sz=(size_t) var_arr[2]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[2]->val)); // 4th arg the mean var_arr[3]=nco_var_cnf_typ(NC_DOUBLE,var_arr[3]); (void)cast_void_nctype(NC_DOUBLE,&(var_arr[3]->val)); dmean=var_arr[3]->val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[3]->val)); // Check hyperslab limits if( 1+ (sz-1)*d_srd >var_arr[0]->sz){ err_prn(sfnm,"Requested hyperslab with stride="+nbr2sng(d_srd)+" and n="+ nbr2sng(sz)+" doesn't fit into variable \""+string(var_arr[0]->nm)+"\" with size="+nbr2sng(var_arr[0]->sz)); } // remember we are dealing with g_args() -- an array of function pointers here // the order of gsl function pointers is significant -it is // char/short/int/float/double/uchar/ushort/uint/ulong/long switch(var_arr[0]->type){ case NC_FLOAT: r_val=gpr_obj.g_args(3).csfpssd( var_arr[0]->val.fp,d_srd,sz,dmean);break; case NC_DOUBLE: r_val=gpr_obj.g_args(4).csdpssd( var_arr[0]->val.dp,d_srd,sz,dmean);break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gpr_obj.g_args(2).csipssd(var_arr[0]->val.ip,d_srd,sz,dmean); // NC_INT rpresented as long in nco #else r_val=gpr_obj.g_args(8).cslpssd(var_arr[0]->val.ip,d_srd,sz,dmean); #endif break; case NC_SHORT: r_val=gpr_obj.g_args(1).csspssd( var_arr[0]->val.sp,d_srd,sz,dmean);break; case NC_CHAR: r_val=gpr_obj.g_args(0).cscpssd((const char*)var_arr[0]->val.cp,d_srd,sz,dmean);break; case NC_BYTE: r_val=gpr_obj.g_args(0).cscpssd((const char*)var_arr[0]->val.bp,d_srd,sz,dmean);break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gpr_obj.g_args(5).csucpssd((const unsigned char*)var_arr[0]->val.ubp,d_srd,sz,dmean);break; case NC_USHORT: r_val=gpr_obj.g_args(6).csuspssd( var_arr[0]->val.usp,d_srd,sz,dmean);break; case NC_UINT: r_val=gpr_obj.g_args(7).csuipssd(var_arr[0]->val.uip,d_srd,sz,dmean);break; case NC_INT64: if( sizeof(long)!=sizeof(long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_INT64"); r_val=gpr_obj.g_args(8).cslpssd((const long*)var_arr[0]->val.i64p,d_srd,sz,dmean); break; case NC_UINT64: if( sizeof(unsigned long)!=sizeof(unsigned long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_UINT64"); r_val=gpr_obj.g_args(9).csulpssd((const unsigned long*)var_arr[0]->val.ui64p,d_srd,sz,dmean); break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } // end switch (void)cast_nctype_void(var_arr[0]->type,&(var_arr[0]->val)); } // end heavy lifting // free vars for(idx=0;idx<4;idx++) var_arr[idx]=nco_var_free(var_arr[idx]); return ncap_sclr_var_mk(SCS("~gsl_stt2_function"),r_val); } var_sct *gsl_cls::hnd_fnc_stat3(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_stat3"); int idx; int nbr_args; int in_nbr_args; int fdx=gpr_obj.type(); // very important nc_type type; std::string susg; std::string sfnm=gpr_obj.fnm(); var_sct *var[3]; var_sct *var_ret; double r_val; var[0]=var[1]=var[2]=(var_sct*)NULL; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); nbr_args=args_vtr.size(); susg=susg="usage: double_val="+sfnm+"(var_data, data_stride?, n?)"; if(nbr_args <1){ err_prn(sfnm,"Function requires at least one argument.\n"+susg ); } if(nbr_args >3) in_nbr_args=3; else in_nbr_args=nbr_args; for(idx=0 ;idxntl_scn){ if(var[0]->undefined) var_ret=ncap_var_udf("~rhs_undefined"); else if(fdx ==PS_MIN_IDX ||fdx==PS_MAX_IDX) var_ret=ncap_sclr_var_mk(static_cast< std::string>("~hnd_fnc_stat3"),NC_INT,false); else if(fdx==PS_MIN || fdx==PS_MAX) var_ret=ncap_sclr_var_mk(static_cast< std::string>("~hnd_fnc_stat3"),(nc_type)var[0]->type,false); for(idx=0 ;idxtype==(nc_type)NC_INT64 && sizeof(long)!=sizeof(long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_INT64"); if(var[0]->type==(nc_type)NC_UINT64 && sizeof(unsigned long)!=sizeof(unsigned long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_UINT64"); // do the heavy lifting { size_t sz; size_t d_srd; // first arg the data (void)cast_void_nctype(var[0]->type,&(var[0]->val)); // 2nd arg data stride if(var[1] !=(var_sct*)NULL){ var[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var[1]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var[1]->val)); d_srd=var[1]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var[1]->val)); var[1]=nco_var_free(var[1]); }else{ d_srd=1L; } // 3rd arg size if(var[2] !=(var_sct*)NULL){ var[2]=nco_var_cnf_typ((nc_type)NC_UINT64,var[2]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var[2]->val)); sz=var[2]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var[2]->val)); var[2]=nco_var_free(var[2]); }else{ sz=1+ (var[0]->sz-1)/d_srd; } // Check hyperslab limits if( 1+ (sz-1)*d_srd >var[0]->sz){ err_prn(sfnm,"Requested hyperslab with stride="+nbr2sng(d_srd)+" and n="+ nbr2sng(sz)+" doesn't fit into variable \""+string(var[0]->nm)+"\" with size="+nbr2sng(var[0]->sz)); } switch(fdx){ case PS_MAX_IDX:{ nco_int r_val; switch(var[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_max_index( var[0]->val.fp,d_srd,sz);break; case NC_DOUBLE: r_val=gsl_stats_max_index( var[0]->val.dp,d_srd,sz);break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_max_index(var[0]->val.ip,d_srd,sz); // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_max_index(var[0]->val.ip,d_srd,sz); #endif break; case NC_SHORT: r_val=gsl_stats_short_max_index( var[0]->val.sp,d_srd,sz);break; case NC_CHAR: r_val=gsl_stats_char_max_index((const char*)var[0]->val.cp,d_srd,sz);break; case NC_BYTE: r_val=gsl_stats_char_max_index((const char*)var[0]->val.bp,d_srd,sz);break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_max_index((const unsigned char*)var[0]->val.ubp,d_srd,sz);break; case NC_USHORT: r_val=gsl_stats_ushort_max_index( var[0]->val.usp,d_srd,sz);break; case NC_UINT: r_val=gsl_stats_uint_max_index(var[0]->val.uip,d_srd,sz);break; case NC_INT64: r_val=gsl_stats_long_max_index((const long*)var[0]->val.i64p,d_srd,sz); break; case NC_UINT64: r_val=gsl_stats_ulong_max_index((const unsigned long*)var[0]->val.ui64p,d_srd,sz); break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } var_ret=ncap_sclr_var_mk(SCS("~gsl_stt3_function"),r_val); } break; case PS_MIN_IDX:{ nco_int r_val; switch(var[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_min_index( var[0]->val.fp,d_srd,sz);break; case NC_DOUBLE: r_val=gsl_stats_min_index( var[0]->val.dp,d_srd,sz);break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_min_index(var[0]->val.ip,d_srd,sz); // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_min_index(var[0]->val.ip,d_srd,sz); #endif break; case NC_SHORT: r_val=gsl_stats_short_min_index( var[0]->val.sp,d_srd,sz);break; case NC_CHAR: r_val=gsl_stats_char_min_index((const char*)var[0]->val.cp,d_srd,sz);break; case NC_BYTE: r_val=gsl_stats_char_min_index((const char*)var[0]->val.bp,d_srd,sz);break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_min_index((const unsigned char*)var[0]->val.ubp,d_srd,sz);break; case NC_USHORT: r_val=gsl_stats_ushort_min_index( var[0]->val.usp,d_srd,sz);break; case NC_UINT: r_val=gsl_stats_uint_min_index(var[0]->val.uip,d_srd,sz);break; case NC_INT64: r_val=gsl_stats_long_min_index((const long*)var[0]->val.i64p,d_srd,sz); break; case NC_UINT64: r_val=gsl_stats_ulong_min_index((const unsigned long*)var[0]->val.ui64p,d_srd,sz); break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } var_ret=ncap_sclr_var_mk(SCS("~gsl_stt3_function"),r_val); } break; case PS_MIN:{ switch(var[0]->type){ case NC_FLOAT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(float)gsl_stats_float_min( var[0]->val.fp,d_srd,sz)); break; case NC_DOUBLE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(double)gsl_stats_min( var[0]->val.dp,d_srd,sz));break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int)gsl_stats_int_min(var[0]->val.ip,d_srd,sz)); // NC_INT rpresented as long in nco #else var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int)gsl_stats_long_min(var[0]->val.ip,d_srd,sz)); #endif break; case NC_SHORT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_short)gsl_stats_short_min( var[0]->val.sp,d_srd,sz));break; case NC_CHAR: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_char)gsl_stats_char_min((const char*)var[0]->val.cp,d_srd,sz));break; case NC_BYTE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_byte)gsl_stats_char_min((const char*)var[0]->val.bp,d_srd,sz));break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_ubyte)gsl_stats_uchar_min((const unsigned char*)var[0]->val.ubp,d_srd,sz));break; case NC_USHORT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_ushort)gsl_stats_ushort_min( var[0]->val.usp,d_srd,sz)); break; case NC_UINT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_uint)gsl_stats_uint_min(var[0]->val.uip,d_srd,sz)); break; case NC_INT64: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int64)gsl_stats_long_min((const long*)var[0]->val.i64p,d_srd,sz)); break; case NC_UINT64: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_uint64)gsl_stats_ulong_min((const unsigned long*)var[0]->val.ui64p,d_srd,sz)); break; case NC_STRING: break; #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } } break; case PS_MAX:{ switch(var[0]->type){ case NC_FLOAT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(float)gsl_stats_float_max( var[0]->val.fp,d_srd,sz)); break; case NC_DOUBLE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(double)gsl_stats_max( var[0]->val.dp,d_srd,sz));break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int)gsl_stats_int_max(var[0]->val.ip,d_srd,sz)); // NC_INT rpresented as long in nco #else var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int)gsl_stats_long_max(var[0]->val.ip,d_srd,sz)); #endif break; case NC_SHORT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_short)gsl_stats_short_max( var[0]->val.sp,d_srd,sz));break; case NC_CHAR: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_char)gsl_stats_char_max((const char*)var[0]->val.cp,d_srd,sz));break; case NC_BYTE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_byte)gsl_stats_char_max((const char*)var[0]->val.bp,d_srd,sz));break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_ubyte)gsl_stats_uchar_max((const unsigned char*)var[0]->val.ubp,d_srd,sz));break; case NC_USHORT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_ushort)gsl_stats_ushort_max( var[0]->val.usp,d_srd,sz)); break; case NC_UINT: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_uint)gsl_stats_uint_max(var[0]->val.uip,d_srd,sz)); break; case NC_INT64: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_int64)gsl_stats_long_max((const long*)var[0]->val.i64p,d_srd,sz)); break; case NC_UINT64: var_ret=ncap_sclr_var_mk("~gsl_stat3",(nco_uint64)gsl_stats_ulong_max((const unsigned long*)var[0]->val.ui64p,d_srd,sz)); break; case NC_STRING: break; #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } } break; } // end big switch } // end heavy lifting (void)cast_nctype_void(var[0]->type,&(var[0]->val)); var[0]=nco_var_free(var[0]); return var_ret; } // end hnd_fnc_stat3 var_sct *gsl_cls::hnd_fnc_stat4(bool& is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker ){ const std::string fnc_nm("hnd_fnc_stat4"); int idx; int fdx=gpr_obj.type(); // very important int args_nbr; nc_type type; std::string susg; std::string sfnm=gpr_obj.fnm(); var_sct *var_arr[6]; double r_val; // de-reference prs_cls *prs_arg=walker.prs_arg; type=gpr_obj.type(); args_nbr=args_vtr.size(); susg=susg="usage: double_val="+sfnm+"(var_data1, stride_data1, n1, var_data2, stride_data2, n2)"; if(args_nbr <6){ err_prn(sfnm,"Function requires six arguments.\n"+susg ); } for(idx=0;idx<6;idx++) var_arr[idx]=walker.out(args_vtr[idx]); // Deal with initial scan if(prs_arg->ntl_scn){ for(idx=0;idx<6;idx++) var_arr[idx]=nco_var_free(var_arr[idx]); return ncap_sclr_var_mk(static_cast< std::string>("~hnd_fnc_stat4"),(nc_type)NC_DOUBLE,false); } // check weight type and data type if(var_arr[0]->type != var_arr[3]->type ){ ostringstream os; os<<"The data1 type and the data2 type must be the same . In your arguments the data1 is type "<type)<< " and data2 is type "<type); err_prn(sfnm,os.str()); } if(var_arr[0]->type==(nc_type)NC_INT64 && sizeof(long)!=sizeof(long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_INT64"); if(var_arr[0]->type==(nc_type)NC_UINT64 && sizeof(unsigned long)!=sizeof(unsigned long long int) ) err_prn(sfnm,"This function from the GSL Library is not implemented for the type NC_UINT64"); // make weight and data conform only for _covariance and _correlation if(fdx==PS_COV || fdx==PS_COR) ncap_var_att_cnf(var_arr[3],var_arr[0]); // do heavy lifting { size_t sz1; size_t sz2; size_t d1_srd; // stride for data1 size_t d2_srd; // stride for data2 // 1st arg -- data1 (void)cast_void_nctype(var_arr[0]->type,&(var_arr[0]->val)); // 2nd arg data1 stride var_arr[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[1]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[1]->val)); d1_srd=(size_t) var_arr[1]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT,&(var_arr[1]->val)); // 3rd arg n1 var_arr[2]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[2]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[2]->val)); sz1=(size_t) var_arr[2]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[2]->val)); // 4rd arg -- data2 (void)cast_void_nctype(var_arr[3]->type,&(var_arr[3]->val)); // 5th arg data2 stride var_arr[4]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[4]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[4]->val)); d2_srd=(size_t) var_arr[4]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[4]->val)); // 6th arg n2 var_arr[5]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[5]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[5]->val)); sz2=(size_t) var_arr[5]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[5]->val)); switch(fdx){ case PS_COV: switch(var_arr[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_covariance( var_arr[0]->val.fp,d1_srd,var_arr[3]->val.fp,d2_srd,sz1 );break; case NC_DOUBLE: r_val=gsl_stats_covariance(var_arr[0]->val.dp,d1_srd,var_arr[3]->val.dp,d2_srd,sz1 );break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_covariance(var_arr[0]->val.ip,d1_srd,var_arr[3]->val.ip,d2_srd,sz1 );break; // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_covariance(var_arr[0]->val.ip,d1_srd,var_arr[3]->val.ip,d2_srd,sz1 );break; #endif break; case NC_SHORT: r_val=gsl_stats_short_covariance( var_arr[0]->val.sp,d1_srd,var_arr[3]->val.sp,d2_srd,sz1 );break; case NC_CHAR: r_val=gsl_stats_char_covariance((const char*)var_arr[0]->val.cp,d1_srd,(const char*)var_arr[3]->val.cp,d2_srd,sz1 );break; case NC_BYTE: r_val=gsl_stats_char_covariance((const char*)var_arr[0]->val.bp,d1_srd,(const char*)var_arr[3]->val.bp,d2_srd,sz1 );break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_covariance((const unsigned char*)var_arr[0]->val.ubp,d1_srd,(const unsigned char*)var_arr[3]->val.ubp,d2_srd,sz1 );break; case NC_USHORT: r_val=gsl_stats_ushort_covariance(var_arr[0]->val.usp,d1_srd,var_arr[3]->val.usp,d2_srd,sz1 );break; case NC_UINT: r_val=gsl_stats_uint_covariance(var_arr[0]->val.uip,d1_srd,var_arr[3]->val.uip,d2_srd,sz1 );break; case NC_INT64: r_val=gsl_stats_long_covariance((const long*)var_arr[0]->val.i64p,d1_srd,(const long*)var_arr[3]->val.i64p,d2_srd,sz1 );break; case NC_UINT64: r_val=gsl_stats_ulong_covariance((const unsigned long*)var_arr[0]->val.ui64p,d1_srd,(const unsigned long*)var_arr[3]->val.ui64p,d2_srd,sz1);break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } break; # if NCO_GSL_VERSION >= 110 case PS_COR: switch(var_arr[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_correlation( var_arr[0]->val.fp,d1_srd,var_arr[3]->val.fp,d2_srd,sz1 );break; case NC_DOUBLE: r_val=gsl_stats_correlation(var_arr[0]->val.dp,d1_srd,var_arr[3]->val.dp,d2_srd,sz1 );break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_correlation(var_arr[0]->val.ip,d1_srd,var_arr[3]->val.ip,d2_srd,sz1 );break; // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_correlation(var_arr[0]->val.ip,d1_srd,var_arr[3]->val.ip,d2_srd,sz1 );break; #endif break; case NC_SHORT: r_val=gsl_stats_short_correlation( var_arr[0]->val.sp,d1_srd,var_arr[3]->val.sp,d2_srd,sz1 );break; case NC_CHAR: r_val=gsl_stats_char_correlation((const char*)var_arr[0]->val.cp,d1_srd,(const char*)var_arr[3]->val.cp,d2_srd,sz1 );break; case NC_BYTE: r_val=gsl_stats_char_correlation((const char*)var_arr[0]->val.bp,d1_srd,(const char*)var_arr[3]->val.bp,d2_srd,sz1 );break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_correlation((const unsigned char*)var_arr[0]->val.ubp,d1_srd,(const unsigned char*)var_arr[3]->val.ubp,d2_srd,sz1 );break; case NC_USHORT: r_val=gsl_stats_ushort_correlation(var_arr[0]->val.usp,d1_srd,var_arr[3]->val.usp,d2_srd,sz1 );break; case NC_UINT: r_val=gsl_stats_uint_correlation(var_arr[0]->val.uip,d1_srd,var_arr[3]->val.uip,d2_srd,sz1 );break; case NC_INT64: r_val=gsl_stats_long_correlation((const long*)var_arr[0]->val.i64p,d1_srd,(const long*)var_arr[3]->val.i64p,d2_srd,sz1 );break; case NC_UINT64: r_val=gsl_stats_ulong_correlation((const unsigned long*)var_arr[0]->val.ui64p,d1_srd,(const unsigned long*)var_arr[3]->val.ui64p,d2_srd,sz1);break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } break; # endif // NCO_GSL_MINOR_VERSION < 10 case PS_PVAR: switch(var_arr[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_pvariance( var_arr[0]->val.fp,d1_srd,sz1,var_arr[3]->val.fp,d2_srd,sz2 );break; case NC_DOUBLE: r_val=gsl_stats_pvariance(var_arr[0]->val.dp,d1_srd,sz1,var_arr[3]->val.dp,d2_srd,sz2 );break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_pvariance(var_arr[0]->val.ip,d1_srd,sz1,var_arr[3]->val.ip,d2_srd,sz2 );break; // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_pvariance(var_arr[0]->val.ip,d1_srd,sz1,var_arr[3]->val.ip,d2_srd,sz2 );break; #endif break; case NC_SHORT: r_val=gsl_stats_short_pvariance( var_arr[0]->val.sp,d1_srd,sz1,var_arr[3]->val.sp,d2_srd,sz2 );break; case NC_CHAR: r_val=gsl_stats_char_pvariance((const char*)var_arr[0]->val.cp,d1_srd,sz1,(const char*)var_arr[3]->val.cp,d2_srd,sz2 );break; case NC_BYTE: r_val=gsl_stats_char_pvariance((const char*)var_arr[0]->val.bp,d1_srd,sz1,(const char*)var_arr[3]->val.bp,d2_srd,sz2 );break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_pvariance((const unsigned char*)var_arr[0]->val.ubp,d1_srd,sz1,(const unsigned char*)var_arr[3]->val.ubp,d2_srd,sz2 );break; case NC_USHORT: r_val=gsl_stats_ushort_pvariance(var_arr[0]->val.usp,d1_srd,sz1,var_arr[3]->val.usp,d2_srd,sz2 );break; case NC_UINT: r_val=gsl_stats_uint_pvariance(var_arr[0]->val.uip,d1_srd,sz1,var_arr[3]->val.uip,d2_srd,sz2 );break; case NC_INT64: r_val=gsl_stats_long_pvariance((const long*)var_arr[0]->val.i64p,d1_srd,sz1,(const long*)var_arr[3]->val.i64p,d2_srd,sz2 );break; case NC_UINT64: r_val=gsl_stats_ulong_pvariance((const unsigned long*)var_arr[0]->val.ui64p,d1_srd,sz1,(const unsigned long*)var_arr[3]->val.ui64p,d2_srd,sz2);break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } break; case PS_TTST: switch(var_arr[0]->type){ case NC_FLOAT: r_val=gsl_stats_float_ttest( var_arr[0]->val.fp,d1_srd,sz1,var_arr[3]->val.fp,d2_srd,sz2 );break; case NC_DOUBLE: r_val=gsl_stats_ttest(var_arr[0]->val.dp,d1_srd,sz1,var_arr[3]->val.dp,d2_srd,sz2 );break; case NC_INT: // NC_INT rpresented as int in nco #if NCO_INT==NCO_TYP_INT r_val=gsl_stats_int_ttest(var_arr[0]->val.ip,d1_srd,sz1,var_arr[3]->val.ip,d2_srd,sz2 );break; // NC_INT rpresented as long in nco #else r_val=gsl_stats_long_ttest(var_arr[0]->val.ip,d1_srd,sz1,var_arr[3]->val.ip,d2_srd,sz2 );break; #endif break; case NC_SHORT: r_val=gsl_stats_short_ttest( var_arr[0]->val.sp,d1_srd,sz1,var_arr[3]->val.sp,d2_srd,sz2 );break; case NC_CHAR: r_val=gsl_stats_char_ttest((const char*)var_arr[0]->val.cp,d1_srd,sz1,(const char*)var_arr[3]->val.cp,d2_srd,sz2 );break; case NC_BYTE: r_val=gsl_stats_char_ttest((const char*)var_arr[0]->val.bp,d1_srd,sz1,(const char*)var_arr[3]->val.bp,d2_srd,sz2 );break; #ifdef ENABLE_NETCDF4 case NC_UBYTE: r_val=gsl_stats_uchar_ttest((const unsigned char*)var_arr[0]->val.ubp,d1_srd,sz1,(const unsigned char*)var_arr[3]->val.ubp,d2_srd,sz2 );break; case NC_USHORT: r_val=gsl_stats_ushort_ttest(var_arr[0]->val.usp,d1_srd,sz1,var_arr[3]->val.usp,d2_srd,sz2 );break; case NC_UINT: r_val=gsl_stats_uint_ttest(var_arr[0]->val.uip,d1_srd,sz1,var_arr[3]->val.uip,d2_srd,sz2 );break; case NC_INT64: r_val=gsl_stats_long_ttest((const long*)var_arr[0]->val.i64p,d1_srd,sz1,(const long*)var_arr[3]->val.i64p,d2_srd,sz2 );break; case NC_UINT64: r_val=gsl_stats_ulong_ttest((const unsigned long*)var_arr[0]->val.ui64p,d1_srd,sz1,(const unsigned long*)var_arr[3]->val.ui64p,d2_srd,sz2);break; case NC_STRING: break; /* do nothing */ #endif /* !ENABLE_NETCDF4 */ default: nco_dfl_case_nc_type_err(); break; } break; }// end big switch // cast pointer back to void (void)cast_nctype_void(var_arr[0]->type,&(var_arr[0]->val)); (void)cast_nctype_void(var_arr[3]->type,&(var_arr[3]->val)); } // end heavy lifting // free vars for(idx=0 ; idx<6 ; idx++) var_arr[idx]=nco_var_free(var_arr[idx]); return ncap_sclr_var_mk(SCS("~gsl_stt2_function"),r_val); } //GSL2 Class /******************************************/ gsl2_cls::gsl2_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("gsl_rng_min",this,(int)PGSL_RNG_MIN)); fmc_vtr.push_back( fmc_cls("gsl_rng_max",this,(int)PGSL_RNG_MAX)); fmc_vtr.push_back( fmc_cls("gsl_rng_name",this,(int)PGSL_RNG_NAME)); } } var_sct *gsl2_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl2_cls::fnd"); int fdx=fmc_obj.fdx(); //index int nbr_args; unsigned long vlng; var_sct *var; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string styp; RefAST tr; std::vector vtr_args; gsl_rng *ncap_rng; styp=(expr ? "method":"function"); nbr_args=0; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); if(nbr_args >0) wrn_prn(fnc_nm,styp+" \""+sfnm+"\" requires no arguments"); // If initial scan if(prs_arg->ntl_scn){ switch(fdx) { case PGSL_RNG_MIN: case PGSL_RNG_MAX: return ncap_sclr_var_mk(SCS("~gsl2_functions"),(nc_type)NC_DOUBLE,false); break; case PGSL_RNG_NAME: return ncap_var_udf("~gsl2_functions"); break; }// end switch } // initialize ncap_rng=gsl_rng_alloc(gsl_rng_default); switch(fdx){ case PGSL_RNG_MIN: vlng= gsl_rng_min(ncap_rng); var=ncap_sclr_var_mk(SCS("~gsl2_function"),(double)(vlng)); break; case PGSL_RNG_MAX: vlng= gsl_rng_max(ncap_rng); var=ncap_sclr_var_mk(SCS("~gsl2_function"),(double)(vlng)); break; case PGSL_RNG_NAME: //var=ncap_sclr_var_mk(SCS("~gsl2_functions"),(nco_int)var1->nbr_dim); break; }// end switch // free Random Number generator gsl_rng_free(ncap_rng); return var; } //GSL STATISTICS 2 /****************************************/ // gsl statistic functions for floating points only gsl_stt2_cls::gsl_stt2_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("gsl_stats_wmean",this,(int)PWMEAN)); fmc_vtr.push_back( fmc_cls("gsl_stats_wvariance",this,(int)PWVAR)); fmc_vtr.push_back( fmc_cls("gsl_stats_wsd",this,(int)PWSD)); fmc_vtr.push_back( fmc_cls("gsl_stats_wvariance_with_fixed_mean",this,(int)PWVAR_MEAN)); fmc_vtr.push_back( fmc_cls("gsl_stats_wsd_with_fixed_mean",this,(int)PWSD_MEAN)); fmc_vtr.push_back( fmc_cls("gsl_stats_wabsdev",this,(int)PWABSDEV)); fmc_vtr.push_back( fmc_cls("gsl_stats_wskew",this,(int)PWSKEW)); fmc_vtr.push_back( fmc_cls("gsl_stats_wkurtosis",this,(int)PWKURTOSIS)); fmc_vtr.push_back( fmc_cls("gsl_stats_wvariance_m",this,(int)PWVAR_M)); fmc_vtr.push_back( fmc_cls("gsl_stats_wsd_m",this,(int)PWSD_M)); fmc_vtr.push_back( fmc_cls("gsl_stats_wabsdev_m",this,(int)PWABSDEV_M)); fmc_vtr.push_back( fmc_cls("gsl_stats_wskew_m_sd",this,(int)PWSKEW_M_SD)); fmc_vtr.push_back( fmc_cls("gsl_stats_wkurtosis_m_sd",this,(int)PWKURTOSIS_M_SD)); } } var_sct *gsl_stt2_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_stt2_cls::fnd"); int idx; int fdx=fmc_obj.fdx(); //index int nbr_args; int in_nbr_args; double r_val; var_sct *var; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; RefAST tr; std::vector vtr_args; var_sct **var_arr; var_sct ***var_arr_ptr; nbr_args=0; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } nbr_args=vtr_args.size(); switch(fdx){ case PWMEAN: case PWVAR: case PWSD: case PWABSDEV: case PWSKEW: case PWKURTOSIS: susg="usage: double_val="+sfnm+"(var_weight, weight_stride, var_data, data_stride, n)"; in_nbr_args=5; break; case PWVAR_MEAN: case PWSD_MEAN: case PWVAR_M: case PWSD_M: case PWABSDEV_M: susg="usage: double_val="+sfnm+"(var_weight, weight_stride, var_data, data_stride, n, double_mean)"; in_nbr_args=6; break; case PWSKEW_M_SD: case PWKURTOSIS_M_SD: susg="usage: double_val="+sfnm+"(var_weight, weight_stride, var_data, data_stride, n, double_mean, double_sd)"; in_nbr_args=7; break; } if(nbr_args < in_nbr_args) err_prn(sfnm,"Function requires "+nbr2sng(in_nbr_args)+" arguments . You have only supplied "+nbr2sng(nbr_args)+ ".\n"+susg); else nbr_args=in_nbr_args; // init once we now num of args var_arr=(var_sct**)nco_malloc(sizeof(var_sct*)*nbr_args); // evaluate args for side effects for(idx=0;idxntl_scn){ for(idx=0 ; idx("~gsl_stt2_function"),(nc_type)NC_DOUBLE,false); } //input args: (weight_var weight_stride data_var data_stride n wmean? wsd ? ) // check weight type and data type if(var_arr[0]->type != var_arr[2]->type || var_arr[2]->type != NC_FLOAT && var_arr[2]->type != NC_DOUBLE ){ ostringstream os; os<<"The data type and the weight type most both be NC_FLOAT or NC_DOUBLE. In your arguments the data is type "<type)<< " and the weight is type "<type); err_prn(sfnm,os.str()); } // make weight and data conform ncap_var_att_cnf(var_arr[2],var_arr[0]); { bool tflg; size_t w_srd; // weight stride size_t d_srd; // data stride size_t sz; // array size double dmean=0.0; double dsd=0.0; // de-reference -save typing type is double or float tflg=( var_arr[0]->type==NC_DOUBLE ? true:false); // 1st arg --the weight (void)cast_void_nctype(var_arr[0]->type,&(var_arr[0]->val)); // 2nd arg weight stride var_arr[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[1]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[1]->val)); w_srd=(size_t) var_arr[1]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[1]->val)); // 3rd arg the data (void)cast_void_nctype(var_arr[2]->type,&(var_arr[2]->val)); // 4th arg data stride var_arr[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[3]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[3]->val)); d_srd=(size_t) var_arr[3]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[3]->val)); // 5th arg n var_arr[4]=nco_var_cnf_typ((nc_type)NC_UINT64,var_arr[4]); (void)cast_void_nctype((nc_type)NC_UINT64,&(var_arr[4]->val)); sz=(size_t) var_arr[4]->val.ui64p[0]; (void)cast_nctype_void((nc_type)NC_UINT64,&(var_arr[4]->val)); // 5th arg the mean if needed if(nbr_args >5){ var_arr[5]=nco_var_cnf_typ(NC_DOUBLE,var_arr[5]); (void)cast_void_nctype(NC_DOUBLE,&(var_arr[5]->val)); dmean=var_arr[5]->val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[5]->val)); } // 6th arg the sd if needed if(nbr_args >6){ var_arr[6]=nco_var_cnf_typ(NC_DOUBLE,var_arr[6]); (void)cast_void_nctype(NC_DOUBLE,&(var_arr[6]->val)); dsd=var_arr[6]->val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&(var_arr[6]->val)); } // Check hyperslab limits if( 1+ (sz-1)*d_srd >var_arr[0]->sz){ err_prn(sfnm,"Requested hyperslab with stride="+nbr2sng(d_srd)+" and n="+ nbr2sng(sz)+" doesn't fit into variable \""+string(var_arr[0]->nm)+"\" with size="+nbr2sng(var_arr[0]->sz)); } // the big switch switch(fdx){ /********************** user args=5 ********************************************************/ case PWMEAN:{ if(tflg) r_val=gsl_stats_wmean(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wmean(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; case PWVAR:{ if(tflg) r_val=gsl_stats_wvariance(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wvariance(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; case PWSD: { if(tflg) r_val=gsl_stats_wsd(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wsd(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; case PWABSDEV: { if(tflg) r_val=gsl_stats_wabsdev(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wabsdev(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; case PWSKEW: { if(tflg) r_val=gsl_stats_wskew(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wskew(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; case PWKURTOSIS: { if(tflg) r_val=gsl_stats_wkurtosis(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz); else r_val=gsl_stats_float_wkurtosis(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz); } break; /********************** user args=6 ********************************************************/ case PWVAR_MEAN: { if(tflg) r_val=gsl_stats_wvariance_with_fixed_mean(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean); else r_val=gsl_stats_float_wvariance_with_fixed_mean(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean); } break; case PWSD_MEAN: { if(tflg) r_val=gsl_stats_wsd_with_fixed_mean(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean); else r_val=gsl_stats_float_wsd_with_fixed_mean(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean); } break; case PWVAR_M: { if(tflg) r_val=gsl_stats_wvariance_m(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean); else r_val=gsl_stats_float_wvariance_m(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean); } break; case PWSD_M: { if(tflg) r_val=gsl_stats_wsd_m(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean); else r_val=gsl_stats_float_wsd_m(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean); } break; case PWABSDEV_M:{ if(tflg) r_val=gsl_stats_wabsdev_m(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean); else r_val=gsl_stats_float_wabsdev_m(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean); } break; /********************** user args=7 ********************************************************/ case PWSKEW_M_SD:{ if(tflg) r_val=gsl_stats_wskew_m_sd(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean,dsd); else r_val=gsl_stats_float_wskew_m_sd(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean,dsd); } break; case PWKURTOSIS_M_SD:{ if(tflg) r_val=gsl_stats_wkurtosis_m_sd(var_arr[0]->val.dp,w_srd, var_arr[2]->val.dp,d_srd,sz,dmean,dsd); else r_val=gsl_stats_float_wkurtosis_m_sd(var_arr[0]->val.fp,w_srd, var_arr[2]->val.fp,d_srd,sz,dmean,dsd); } break; } // end switch // cast pointer back to void (void)cast_nctype_void(var_arr[0]->type,&(var_arr[0]->val)); (void)cast_nctype_void(var_arr[2]->type,&(var_arr[2]->val)); } // end inner block for(idx=0 ; idx vtr_args; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } is_mtd=(expr ? true: false); switch(fdx){ case PLINEAR: case PPOLY: case PCSPLINE: case PCSPLINE_PER: case PAKIMA: case PAKIMA_PER: return spl_fnd(is_mtd,vtr_args,fmc_obj,walker); break; case PEVAL: return eval_fnd(is_mtd,vtr_args,fmc_obj,walker); break; }// end switch } // nb this method is only call with fdx==PEVAL var_sct *gsl_spl_cls::eval_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_spl_cls::eval_fnd"); int fdx=fmc_obj.fdx(); //index int nbr_args; int in_nbr_args; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; std::string serr; std::string var_nm; var_sct *var_xvl; vtl_typ lcl_typ; NcapVar *Nvar; nbr_args=args_vtr.size(); in_nbr_args=2; susg="usage: var_y_out="+sfnm+"(ram_spline_handle,var_x_vals)"; if(nbr_argsntl_scn) return var_xvl; var_nm=args_vtr[0]->getText(); Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar==NULL) err_prn(sfnm,"Unable to find RAM variable "+var_nm); // check if spline flag not set if(!Nvar->flg_spl) err_prn(sfnm,"RAM variable "+var_nm+" is not holding a gsl spline interpolation object"); // do heavy lifting { bool us_mss_val=false; // true if missing value is used in output var bool has_mss_val; long idx; long sz; double yval; double mss_val_dbl; double *dp; gsl_interp_accel *acc; acc=gsl_interp_accel_alloc(); (void)cast_void_nctype(NC_DOUBLE,&var_xvl->val); dp=var_xvl->val.dp; sz=var_xvl->sz; if(var_xvl->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_xvl->mss_val); mss_val_dbl=var_xvl->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&var_xvl->mss_val); }else{ has_mss_val=false; mss_val_dbl=NC_FILL_DOUBLE; } for(idx=0 ; idxvar->val.vp), dp[idx],acc,&yval))? (us_mss_val=true,mss_val_dbl):yval) ; (void)cast_nctype_void(NC_DOUBLE,&var_xvl->val); // Create missing value for var_xvl if it doesn't have one // and missing value has been used in result; if(!has_mss_val && us_mss_val){ var_xvl->has_mss_val=true; var_xvl->mss_val=nco_mss_val_mk(NC_DOUBLE); (void)cast_void_nctype(NC_DOUBLE,&var_xvl->mss_val); var_xvl->mss_val.dp[0]=mss_val_dbl; (void)cast_nctype_void(NC_DOUBLE,&var_xvl->mss_val); } gsl_interp_accel_free(acc); } // end heavy lifting return var_xvl; } // end gsl_spl_cls::eval_fnd var_sct *gsl_spl_cls::spl_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_spl_cls::spl_fnd"); int fdx=fmc_obj.fdx(); //index int nbr_args; int in_nbr_args; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; std::string serr; std::string var_nm; var_sct *var_x; var_sct *var_y; var_sct *var_ram; std::vector vtr_x; std::vector vtr_y; NcapVar *Nvar; const gsl_interp_type *ts; gsl_spline *spline; nbr_args=args_vtr.size(); in_nbr_args=3; susg="usage: status="+sfnm+"(&ram_spline_handle,var_x_vals,var_y_vals)"; if(nbr_argsgetType() != CALL_REF ) err_prn(sfnm," first argument must be a call by reference ram variable\n"); var_nm=args_vtr[0]->getFirstChild()->getText(); var_x=walker.out(args_vtr[1]); var_y=walker.out(args_vtr[2]); // Initial scan if(prs_arg->ntl_scn){ nco_var_free(var_x); nco_var_free(var_y); var_ram=ncap_sclr_var_mk(var_nm,NC_CHAR,false); // below call frees up var_ram prs_arg->ncap_var_write(var_ram,true); return ncap_sclr_var_mk("~gsl_spl_cls",NC_INT,false); } var_x=nco_var_cnf_typ(NC_DOUBLE,var_x); var_y=nco_var_cnf_typ(NC_DOUBLE,var_y); // make variables conform (void)ncap_var_att_cnf(var_y,var_x); // missing values if(var_x->has_mss_val || var_y->has_mss_val){ long idx; long sz; // a lazy arsed hack - set defaults to double fill value double mss_dbl_y=NC_MIN_DOUBLE; double mss_dbl_x=NC_MIN_DOUBLE; if(var_x->has_mss_val){ cast_void_nctype(NC_DOUBLE,&var_x->mss_val); mss_dbl_x=var_x->mss_val.dp[0]; cast_nctype_void(NC_DOUBLE,&var_x->mss_val); } if(var_y->has_mss_val){ cast_void_nctype(NC_DOUBLE,&var_y->mss_val); mss_dbl_y=var_y->mss_val.dp[0]; cast_nctype_void(NC_DOUBLE,&var_y->mss_val); } // nb dont check first or last value for missing // so at the very least - vectors contain 2 points vtr_x.push_back(var_x->val.dp[0]); vtr_y.push_back(var_y->val.dp[0]); sz=var_y->sz-1; for(idx=1; idxval.dp[idx]!=mss_dbl_x && var_y->val.dp[idx]!=mss_dbl_y) { vtr_x.push_back(var_x->val.dp[idx]); vtr_y.push_back(var_y->val.dp[idx]); } vtr_x.push_back(var_x->val.dp[sz]); vtr_y.push_back(var_y->val.dp[sz]); }else{ vtr_x.insert( vtr_x.begin(), var_x->val.dp,var_x->val.dp+var_x->sz); vtr_y.insert( vtr_y.begin(), var_y->val.dp,var_y->val.dp+var_y->sz); } // done with var_x & var_y (void)cast_nctype_void(NC_DOUBLE,&var_x->val); (void)cast_nctype_void(NC_DOUBLE,&var_y->val); nco_var_free(var_x); nco_var_free(var_y); Nvar=prs_arg->var_vtr.find(var_nm); if(!Nvar){ var_ram=ncap_sclr_var_mk(var_nm,NC_CHAR,false); Nvar= new NcapVar(var_ram); Nvar->flg_mem=true; prs_arg->var_vtr.push_ow(Nvar); } // a bit of a hack ? Nvar->flg_mem=true; Nvar->flg_spl=true; Nvar->flg_stt=2; spline=gsl_spline_alloc(ts,vtr_x.size()); //gsl_spline_init(spline,var_x->val.dp,var_y->val.dp,var_x->sz); gsl_spline_init(spline,&vtr_x[0],&vtr_y[0],vtr_x.size() ); (void)cast_void_nctype(NC_CHAR,&Nvar->var->val); Nvar->var->val.cp=(char*)spline; (void)cast_nctype_void(NC_CHAR,&Nvar->var->val); // return true return ncap_sclr_var_mk("~gsl_spl_cls",(nco_int)1); } // end gsl_spl_cls::spl_fnd //GSL /****************************************/ // gsl Least Squares Fitting gsl_fit_cls::gsl_fit_cls(bool flg_dbg){ //Populate only on first constructor call if(fmc_vtr.empty()){ fmc_vtr.push_back( fmc_cls("gsl_fit_linear",this,(int)PLIN)); fmc_vtr.push_back( fmc_cls("gsl_fit_wlinear",this,(int)PWLIN)); fmc_vtr.push_back( fmc_cls("gsl_fit_linear_est",this,(int)PLIN_EST)); fmc_vtr.push_back( fmc_cls("gsl_fit_mul",this,(int)PMUL)); fmc_vtr.push_back( fmc_cls("gsl_fit_wmul",this,(int)PWMUL)); fmc_vtr.push_back( fmc_cls("gsl_fit_mul_est",this,(int)PMUL_EST)); } } var_sct *gsl_fit_cls::fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_fit_cls::fnd"); bool is_mtd; int fdx=fmc_obj.fdx(); //index RefAST tr; std::vector vtr_args; if(expr) vtr_args.push_back(expr); if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } is_mtd=(expr ? true: false); switch(fdx){ case PLIN: case PWLIN: case PMUL: case PWMUL: return fit_fnd(is_mtd,vtr_args,fmc_obj,walker); break; case PLIN_EST: case PMUL_EST: return fit_est_fnd(is_mtd,vtr_args,fmc_obj,walker); break; } } // end gsl_fit_cls::fnd var_sct *gsl_fit_cls::fit_fnd(bool &is_mtd, std::vector &vtr_args, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_fit_cls::fit_fnd"); int idx; int fdx=fmc_obj.fdx(); //index int nbr_args; // actual nunber of args int in_nbr_args; // target number of args int in_val_nbr_args; // number of expressions int ret; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; std::string serr; vtl_typ lcl_typ; var_sct *var_in[13]; nbr_args=vtr_args.size(); switch(fdx){ case PLIN: in_nbr_args=11; in_val_nbr_args=5; susg="usage: status="+sfnm+"(data_x,stride_x,data_y,stride_y,n,&co,&c1,&cov00,&cov01,&cov11,&sumsq)"; break; case PWLIN: in_nbr_args=13; in_val_nbr_args=7; susg="usage: status="+sfnm+"(data_x,stride_x,data_w,stride_w,data_y,stride_y,n,&co,&c1,&cov00,&cov01,&cov11,&chisq)"; break; case PMUL: in_nbr_args=8; in_val_nbr_args=5; susg="usage: status="+sfnm+"(data_x,stride_x,data_y,stride_y,n,&c1,&cov11,&sumsq)"; break; case PWMUL: in_nbr_args=10; in_val_nbr_args=7; susg="usage: status="+sfnm+"(data_x,stride_x,data_w,stride_w,stride_y,data_y,n,&c1,&cov11,&sumsq)"; break; break; } if(nbr_argsgetFirstChild()->getText(); if(lcl_typ != VCALL_REF) { serr="function requires that " + nbr2sng(idx)+ " argument be a call by reference variable"; err_prn(sfnm,serr+susg); } // initial scan if(prs_arg->ntl_scn){ if(prs_arg->ncap_var_init_chk(var_nm)) var_tmp=prs_arg->ncap_var_init(var_nm,false); else var_tmp=ncap_sclr_var_mk(var_nm,NC_DOUBLE,false); // final scan }else{ // we have a problem here - its possible that in the inital scan // that some of the call-by-ref variables have been defined but // not populated. Cannot use ncap_var_init() as this will attempt // to read var from input as it is unpopulated Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_stt==1){ var_tmp=Nvar->cpyVarNoData(); // malloc space for var var_tmp->val.vp=nco_malloc(var_tmp->sz * nco_typ_lng(var_tmp->type)); } else if(prs_arg->ncap_var_init_chk(var_nm)) var_tmp=prs_arg->ncap_var_init(var_nm,true); else var_tmp=ncap_sclr_var_mk(var_nm,NC_DOUBLE,1.0); } //end final scan // convert to type double if(!var_tmp->undefined) var_tmp=nco_var_cnf_typ(NC_DOUBLE,var_tmp); var_in[idx]=var_tmp; } //end call-by-ref vars } // end for // inital scan --free up vars and return if(prs_arg->ntl_scn){ for(idx=0 ; idxncap_var_write(var_in[idx],false); return ncap_sclr_var_mk("~gsl_fit_cls",NC_INT,false); } // big switch switch(fdx){ case PLIN:{ // recall aguments in order in var_in /* 0 x_in 1 x stride 2 y_in 3 y stride 4 n 5 c0 6 c1 7 c00 8 c01 9 c11 10 sumsq */ // convert x,y to type double var_in[0]=nco_var_cnf_typ(NC_DOUBLE,var_in[0]); var_in[2]=nco_var_cnf_typ(NC_DOUBLE,var_in[2]); // make x,y conform (void)ncap_var_att_cnf(var_in[2],var_in[0]); // convert strides to NC_UINT64 var_in[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[1]); var_in[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[3]); var_in[4]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[4]); //cast pointers from void for(idx=0 ; idx< in_nbr_args ;idx++) (void)cast_void_nctype(var_in[idx]->type,&var_in[idx]->val); // make the call -- ret=gsl_fit_linear(var_in[0]->val.dp,var_in[1]->val.ui64p[0], var_in[2]->val.dp,var_in[3]->val.ui64p[0], var_in[4]->val.ui64p[0], var_in[5]->val.dp, var_in[6]->val.dp, var_in[7]->val.dp, var_in[8]->val.dp, var_in[9]->val.dp, var_in[10]->val.dp); // free up or save values } break; case PWLIN:{ // recall arguments in order in var_in /* 0 x_in 1 x stride 2 weight 3 weight stride 4 y_in 5 y stride 6 n 7 c0 8 c1 9 c00 10 c01 11 c11 12 chisq */ // convert x,w,y to type double var_in[0]=nco_var_cnf_typ(NC_DOUBLE,var_in[0]); var_in[2]=nco_var_cnf_typ(NC_DOUBLE,var_in[2]); var_in[4]=nco_var_cnf_typ(NC_DOUBLE,var_in[4]); // make x,w,y all conform { var_sct **var_arr[3]; var_arr[0]=&var_in[0]; var_arr[1]=&var_in[2]; var_arr[2]=&var_in[4]; (void)ncap_var_att_arr_cnf(false,var_arr,3); } // convert strides to NC_UINT64 var_in[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[1]); var_in[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[3]); var_in[5]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[5]); var_in[6]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[6]); //cast pointers from void for(idx=0 ; idx< in_nbr_args ;idx++) (void)cast_void_nctype(var_in[idx]->type,&var_in[idx]->val); // make the call -- ret=gsl_fit_wlinear(var_in[0]->val.dp,var_in[1]->val.ui64p[0], var_in[2]->val.dp,var_in[3]->val.ui64p[0], var_in[4]->val.dp,var_in[5]->val.ui64p[0], var_in[6]->val.ui64p[0], var_in[7]->val.dp, var_in[8]->val.dp, var_in[9]->val.dp, var_in[10]->val.dp, var_in[11]->val.dp,var_in[12]->val.dp); } break; case PMUL:{ // recall arguments in order in var_in /* 0 x_in 1 x stride 2 y_in 3 y stride 4 n 5 c1 6 cov11 7 sumsq */ // convert x,y to type double var_in[0]=nco_var_cnf_typ(NC_DOUBLE,var_in[0]); var_in[2]=nco_var_cnf_typ(NC_DOUBLE,var_in[2]); // make x,y conform (void)ncap_var_att_cnf(var_in[2],var_in[0]); // convert strides to NC_UINT64 var_in[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[1]); var_in[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[3]); var_in[4]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[4]); //cast pointers from void for(idx=0 ; idx< in_nbr_args ;idx++) (void)cast_void_nctype(var_in[idx]->type,&var_in[idx]->val); // make the call -- ret=gsl_fit_mul(var_in[0]->val.dp,var_in[1]->val.ui64p[0], var_in[2]->val.dp,var_in[3]->val.ui64p[0], var_in[4]->val.ui64p[0], var_in[5]->val.dp, var_in[6]->val.dp, var_in[7]->val.dp); } break; case PWMUL:{ // recall arguments in order in var_in /* 0 x_in 1 x stride 2 weight 3 weight stride 4 y_in 5 y stride 6 n 7 c1 8 cov11 9 sumsq */ // convert x,w,y to type double var_in[0]=nco_var_cnf_typ(NC_DOUBLE,var_in[0]); var_in[2]=nco_var_cnf_typ(NC_DOUBLE,var_in[2]); var_in[4]=nco_var_cnf_typ(NC_DOUBLE,var_in[4]); // make x,w,y all conform { var_sct **var_arr[3]; var_arr[0]=&var_in[0]; var_arr[1]=&var_in[2]; var_arr[2]=&var_in[4]; (void)ncap_var_att_arr_cnf(false,var_arr,3); } // convert strides to NC_UINT64 var_in[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[1]); var_in[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[3]); var_in[5]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[5]); var_in[6]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[6]); //cast pointers from void for(idx=0 ; idx< in_nbr_args ;idx++) (void)cast_void_nctype(var_in[idx]->type,&var_in[idx]->val); // make the call -- ret=gsl_fit_wmul(var_in[0]->val.dp,var_in[1]->val.ui64p[0], var_in[2]->val.dp,var_in[3]->val.ui64p[0], var_in[4]->val.dp,var_in[5]->val.ui64p[0], var_in[6]->val.ui64p[0], var_in[7]->val.dp, var_in[8]->val.dp, var_in[9]->val.dp); } break; } // end big switch for(idx=0 ; idx< in_nbr_args ;idx++){ //cast pointers to void (void)cast_nctype_void(var_in[idx]->type,&var_in[idx]->val); if(idxncap_var_write(var_in[idx],false); } // return status flag return ncap_sclr_var_mk("~gsl_fit_cls",(nco_int)ret); } // end gsl_fit_cls::fit_fnd var_sct *gsl_fit_cls::fit_est_fnd(bool &is_mtd, std::vector &vtr_args, fmc_cls &fmc_obj, ncoTree &walker){ const std::string fnc_nm("gsl_fit_cls::fit_est_fnd"); bool has_mss_val; int idx; int fdx=fmc_obj.fdx(); //index int nbr_args; // actual nunber of args int in_nbr_args; // target number of args int in_val_nbr_args; // number of expressions double mss_val_dbl; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; std::string serr; var_sct *var_in[12]; var_sct *var_out; nbr_args=vtr_args.size(); switch(fdx){ case PLIN_EST: in_nbr_args=6; in_val_nbr_args=4; susg="usage: data_y="+sfnm+"(data_x,c0,c1,cov00,cov01,cov11)"; break; case PMUL_EST: in_nbr_args=3; in_val_nbr_args=1; susg="usage: data_y="+sfnm+"(data_x,c1,cov11)"; break; } if(nbr_argsundefined) var_in[idx]=nco_var_cnf_typ(NC_DOUBLE,var_in[idx]); } if(prs_arg->ntl_scn){ for(idx=1; idxtype,&var_in[idx]->val); (void)cast_void_nctype(var_out->type,&var_out->val); has_mss_val=false; if(var_out->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var_out->mss_val); mss_val_dbl=var_out->mss_val.dp[0]; (void)cast_nctype_void(NC_DOUBLE,&var_out->mss_val); } switch(fdx){ case PLIN_EST: { long jdx; long sz; double y_err; sz=var_out->sz; if(has_mss_val){ for(jdx=0 ; jdxval.dp[jdx] != mss_val_dbl) gsl_fit_linear_est(var_in[0]->val.dp[jdx], var_in[1]->val.dp[0], var_in[2]->val.dp[0], var_in[3]->val.dp[0], var_in[4]->val.dp[0], var_in[5]->val.dp[0], &var_out->val.dp[jdx], &y_err); }else{ for(jdx=0 ; jdxval.dp[jdx], var_in[1]->val.dp[0], var_in[2]->val.dp[0], var_in[3]->val.dp[0], var_in[4]->val.dp[0], var_in[5]->val.dp[0], &var_out->val.dp[jdx], &y_err); } } break; case PMUL_EST: { long jdx; long sz; double y_err; sz=var_out->sz; if(has_mss_val){ for(jdx=0 ; jdxval.dp[jdx] != mss_val_dbl) gsl_fit_mul_est(var_in[0]->val.dp[jdx], var_in[1]->val.dp[0], var_in[2]->val.dp[0], &var_out->val.dp[jdx], &y_err); }else{ for(jdx=0 ; jdxval.dp[jdx], var_in[1]->val.dp[0], var_in[2]->val.dp[0], &var_out->val.dp[jdx], &y_err); } } break; } // end big switch // free up args for(idx=0 ; idxtype,&var_in[idx]->val); nco_var_free(var_in[idx]); } (void)cast_nctype_void(var_out->type,&var_out->val); return var_out; } // end gsl_fit_cls::fit_est_fnd int gsl_fit_cls::rm_miss_arr( double *x_in, long long x_stride, double *y_in, long long y_stride, double *w_in, long long w_stride, long long n) { return 0; } #else // !ENABLE_GSL /* Dummy stub function so fmc_gsl_cls.o is not empty when GSL unavailable Function should never be called */ int gsl_dmm_stb(void); int gsl_dmm_stb(void){return 1;} #endif // !ENABLE_GSL #ifdef ENABLE_GSL // nco_gsl nco_gsl_cls::nco_gsl_cls(bool flg_dbg) { //Populate only on first constructor call if(fmc_vtr.empty()) { fmc_vtr.push_back( fmc_cls("nco_gsl_fit_linear",this,(int)NCO_GSL_FUNC1)); } } var_sct *nco_gsl_cls::fnd(RefAST expr,RefAST fargs,fmc_cls &fmc_obj,ncoTree &walker) { const std::string fnc_nm("nco_gsl_cls::fnd"); bool is_mtd; int fdx=fmc_obj.fdx(); //index RefAST tr; std::vector vtr_args; // Put args into vector if(expr) { vtr_args.push_back(expr); } if(tr=fargs->getFirstChild()) { do vtr_args.push_back(tr); while(tr=tr->getNextSibling()); } is_mtd=(expr ? true: false); switch(fdx) { case NCO_GSL_FUNC1: return fit_fnd(is_mtd,vtr_args,fmc_obj,walker); break; case NCO_GSL_FUNC2: { // function pointer var_sct* (*hnd_fnc)(HANDLE_ARGS); hnd_fnc=gpr_vtr[fdx]._hnd_fnc; return hnd_fnc(is_mtd,vtr_args,gpr_vtr[fdx],walker); } break; default: assert(0); break; } } // end nco_gsl_cls::fnd var_sct *nco_gsl_cls::fit_fnd(bool &is_mtd,std::vector &vtr_args,fmc_cls &fmc_obj,ncoTree &walker) { const std::string fnc_nm("nco_gsl_cls::fit_fnd"); int idx; int fdx=fmc_obj.fdx(); //index int nbr_args; // actual nunber of args int in_nbr_args; // target number of args int in_val_nbr_args; // number of expressions int ret; prs_cls* prs_arg=walker.prs_arg; std::string sfnm =fmc_obj.fnm(); //method name std::string susg; std::string serr; vtl_typ lcl_typ; var_sct *var_in[13]; nbr_args=vtr_args.size(); switch(fdx) { case NCO_GSL_FUNC1: in_nbr_args=11; in_val_nbr_args=5; susg="usage: status="+sfnm+"(data_x,stride_x,data_y,stride_y,n,&co,&c1,&cov00,&cov01,&cov11,&sumsq)"; break; default: assert(0); break; } if(nbr_argsgetFirstChild()->getText(); if(lcl_typ != VCALL_REF) { serr="function requires that " + nbr2sng(idx)+ " argument be a call by reference variable"; err_prn(sfnm,serr+susg); } // initial scan if(prs_arg->ntl_scn) { if(prs_arg->ncap_var_init_chk(var_nm)) var_tmp=prs_arg->ncap_var_init(var_nm,false); else var_tmp=ncap_sclr_var_mk(var_nm,NC_DOUBLE,false); } else // final scan { // we have a problem here - its possible that in the inital scan // that some of the call-by-ref variables have been defined but // not populated. Cannot use ncap_var_init() as this will attempt // to read var from input as it is unpopulated Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_stt==1) { var_tmp=Nvar->cpyVarNoData(); // malloc space for var var_tmp->val.vp=nco_malloc(var_tmp->sz * nco_typ_lng(var_tmp->type)); } else if(prs_arg->ncap_var_init_chk(var_nm)) { var_tmp=prs_arg->ncap_var_init(var_nm,true); } else { var_tmp=ncap_sclr_var_mk(var_nm,NC_DOUBLE,1.0); } //end if/else } //end final scan // convert to type double if(!var_tmp->undefined) { var_tmp=nco_var_cnf_typ(NC_DOUBLE,var_tmp); } var_in[idx]=var_tmp; } //end call-by-ref vars } // end for // inital scan --free up vars and return if(prs_arg->ntl_scn) { for(idx=0;idxncap_var_write(var_in[idx],false); } }//end for return ncap_sclr_var_mk("~nco_gsl_cls",NC_INT,false); }//end if/inital scan // big switch switch(fdx) { case NCO_GSL_FUNC1: // recall aguments in order in var_in /* 0 x_in 1 x stride 2 y_in 3 y stride 4 n 5 c0 6 c1 7 c00 8 c01 9 c11 10 sumsq */ // convert x,y to type double var_in[0]=nco_var_cnf_typ(NC_DOUBLE,var_in[0]); var_in[2]=nco_var_cnf_typ(NC_DOUBLE,var_in[2]); // make x,y conform (void)ncap_var_att_cnf(var_in[2],var_in[0]); // convert strides to NC_UINT64 var_in[1]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[1]); var_in[3]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[3]); var_in[4]=nco_var_cnf_typ((nc_type)NC_UINT64,var_in[4]); //cast pointers from void for(idx=0 ;idxtype,&var_in[idx]->val); } //get fill value from "y_in" only: assumes type convertion to "double" if(nco_dbg_lvl_get() == nco_dbg_old) { if(var_in[2]->mss_val.dp) (void)fprintf(stdout,"fill value for %s=%f\n",var_in[2]->nm,var_in[2]->mss_val.dp[0]); } // make the call -- ret=nco_gsl_fit_linear(var_in[0]->val.dp, var_in[1]->val.ui64p[0], var_in[2]->val.dp, var_in[3]->val.ui64p[0], var_in[4]->val.ui64p[0], var_in[5]->val.dp, var_in[6]->val.dp, var_in[7]->val.dp, var_in[8]->val.dp, var_in[9]->val.dp, var_in[10]->val.dp, var_in[2]->mss_val.dp); //fill value "double" for variable "y_in" (var_in[2]); can be NULL assert(ret==NCO_GSL_SUCCESS); break; //NCO_GSL_FUNC1 default: assert(0); } // end big switch for(idx=0 ; idx< in_nbr_args ;idx++) { //cast pointers to void (void)cast_nctype_void(var_in[idx]->type,&var_in[idx]->val); if(idxncap_var_write(var_in[idx],false); } // return status flag return ncap_sclr_var_mk("~nco_gsl_cls",(nco_int)ret); } // end nco_gsl_cls::fit_fnd #endif // !ENABLE_GSL nco-4.5.4/src/nco++/fmc_gsl_cls.hh000066400000000000000000000416751264355130400166130ustar00rootroot00000000000000/* Purpose: netCDF arithmetic processor class methods */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #ifndef FMC_GSL_CLS_HH // Contents have not yet been inserted in current source file #define FMC_GSL_CLS_HH #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ // Only use when GSL is present and enabled #ifdef ENABLE_GSL /* Used in some _ran handles, need it for INT_MAX */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ncoTree.hpp" #include "ncap2_utl.hh" #include "vtl_cls.hh" #ifndef NCO_GSL_VERSION #ifdef _MSC_VER # define NCO_GSL_VERSION 107 #else # define NCO_GSL_VERSION 112 #endif // _MSC_VER #endif // NCO_GSL_MINOR_VERSION // Some of the gsl_ran_* functions return an unsigned int (NC_UINT) // netcdf3 has no NC_UINT type So we converte the returned values to an NC_INT // For some of the _ran functions may cause an overflow. In this // case we recomend that users switch ntecdf4 and use the NC_UINT return type #define NCO_TYP_GSL_UINT NC_INT //#define NCO_TYP_GSL_UINT NC_UINT #define HANDLE_ARGS bool&is_mtd,std::vector&args_vtr,gpr_cls&gpr_obj,ncoTree&walker // macro to a function that converts an array of f_unn to a vector of f_unn // used in constructor args to gpr_cls #define ARR2VTR(arr_nm) gpr_cls::hlp_arr2vtr((arr_nm), sizeof((arr_nm))/sizeof(f_unn)) // Global variable initialized in ncap2.cc extern int ncap_gsl_mode_prec; /* Precision for GSL functions with mode_t argument (Airy, hypergeometric) */ // Classify double-type arguments in handler function hnd_fnc_nd(),hnd_fnc_rnd() enum { P1DBL, P2DBL, P3DBL, P4DBL, P1DBLMD, P2DBLMD, P3DBLMD, P4DBLMD, P0DBLX, P1DBLX, P2DBLX, P3DBLX, P4DBLX, P5DBLX}; // Classify Bessel/Legendre methods in array function function hnd_fnc_iidpd() enum { PBESSEL, PLEGEND }; // Classify some of the stats methods --fxm: all type args need to be included enum { PS_COV,PS_COR, PS_PVAR, PS_TTST, PS_MAX, PS_MIN, PS_MAX_IDX , PS_MIN_IDX }; // Union class to hold GSL function pointers union f_unn{ public: int (*av)(void); int (*ai)(int, gsl_sf_result*); int (*au)(unsigned int, gsl_sf_result*); int (*ad)(double, gsl_sf_result*); int (*add)(double, double,gsl_sf_result*); int (*addd)(double, double,double,gsl_sf_result*); int (*adddd)(double,double,double, double,gsl_sf_result*); int (*aid) (int,double,gsl_sf_result*); int (*aiid)( int,int,double,gsl_sf_result*); int (*aidd)( int,double,double,gsl_sf_result*); int (*adm)( double, gsl_mode_t,gsl_sf_result*); int (*addm)( double, double, gsl_mode_t,gsl_sf_result*); int (*adddm)( double,double, double, gsl_mode_t,gsl_sf_result*); int (*addddm)( double,double,double, double, gsl_mode_t,gsl_sf_result*); int (*bidpd)(int, double, double*); int (*biidpd)(int, int, double, double*); int (*biddpd)(int, double, double, double*); double (*cd)( double); double (*cdd)(double, double); double (*cddd)(double, double,double); double (*cdddd)(double,double,double,double); double (*cddddd)(double, double,double,double,double); double (*cu)(unsigned); double (*cud)(unsigned,double); double (*cudd)(unsigned,double,double); double (*cuu)(unsigned,unsigned); double (*cuuu)(unsigned,unsigned,unsigned); double (*cuuuu)(unsigned,unsigned,unsigned,unsigned); double (*cudu)(unsigned,double,unsigned); double (*cr)(const gsl_rng*); double (*crd)(const gsl_rng*,double); double (*crdd)(const gsl_rng*,double, double); double (*crddd)(const gsl_rng*,double, double,double); double (*crdddd)(const gsl_rng*,double,double,double,double); double (*crddddd)(const gsl_rng*,double, double,double,double,double); double (*cru)(const gsl_rng*,unsigned); double (*cruu)(const gsl_rng*,unsigned,unsigned); double (*cruuu)(const gsl_rng*,unsigned,unsigned,unsigned); //gsl_statistics function prototypes double (*cscpss)(const char *,size_t,size_t); double (*csspss)(const short* ,size_t,size_t); double (*csipss)(const int* ,size_t,size_t); double (*csfpss)(const float* ,size_t,size_t); double (*csdpss)(const double*,size_t,size_t); double (*csucpss)(const unsigned char *,size_t,size_t); double (*csuspss)(const unsigned short* ,size_t,size_t); double (*csuipss)(const unsigned int* ,size_t,size_t); double (*cslpss)(const long* ,size_t,size_t); double (*csulpss)(const unsigned long* ,size_t,size_t); double (*cscpssd)(const char *,size_t,size_t,double); double (*csspssd)(const short* ,size_t,size_t,double); double (*csipssd)(const int* ,size_t,size_t,double); double (*csfpssd)(const float* ,size_t,size_t,double); double (*csdpssd)(const double*,size_t,size_t,double); double (*csucpssd)(const unsigned char *,size_t,size_t,double); double (*csuspssd)(const unsigned short* ,size_t,size_t,double); double (*csuipssd)(const unsigned int* ,size_t,size_t,double); double (*cslpssd)(const long* ,size_t,size_t,double); double (*csulpssd)(const unsigned long* ,size_t,size_t,double); unsigned int (*dru)(const gsl_rng*,unsigned); unsigned int (*druu)(const gsl_rng*,unsigned,unsigned); unsigned int (*druuu)(const gsl_rng*,unsigned,unsigned,unsigned); unsigned int (*drd)(const gsl_rng*,double); unsigned int (*drdd)(const gsl_rng*,double,double); unsigned int (*drdu)(const gsl_rng*,double,unsigned); unsigned long int (*er)(const gsl_rng*); unsigned long int (*eru)(const gsl_rng*,unsigned long int); double (*cid)(int,double); //Return type int f_unn( int (*a)(void) ) { av=a; } f_unn( int (*a)( int,gsl_sf_result*) ) { ai=a; } f_unn( int (*a)( unsigned int,gsl_sf_result*) ) { au=a; } f_unn( int (*a)( int,int,double,gsl_sf_result*) ) { aiid=a; } f_unn( int (*a)( int,double,double,gsl_sf_result*) ) { aidd=a; } f_unn( int (*a)( double,gsl_sf_result*) ) { ad=a; } f_unn( int (*a)( double,double, gsl_sf_result*) ) { add=a; } f_unn( int (*a)( double,double,double, gsl_sf_result*) ) { addd=a; } f_unn( int (*a)( double,double,double,double, gsl_sf_result*) ) { adddd=a; } f_unn( int (*a)(int, double,gsl_sf_result*) ) { aid=a; } f_unn( int (*a)(double,gsl_mode_t,gsl_sf_result*)){adm=a; } f_unn( int (*a)(double,double,gsl_mode_t,gsl_sf_result*)){addm=a; } f_unn( int (*a)(double,double,double,gsl_mode_t,gsl_sf_result*)){adddm=a; } f_unn( int (*a)(double,double,double,double,gsl_mode_t,gsl_sf_result*)){addddm=a; } f_unn( int (*b)(int, double, double*) ){ bidpd=b;} f_unn( int (*b)(int, int, double, double*) ){ biidpd=b;} f_unn( int (*b)(int, double, double, double*) ){ biddpd=b;} //Return type double f_unn( double (*c)(double) ) { cd=c; } f_unn( double (*c)( double,double) ) { cdd=c; } f_unn( double (*c)( double,double,double) ) { cddd=c; } f_unn( double (*c)( double,double,double,double) ) { cdddd=c; } f_unn( double (*c)( double,double,double,double,double) ) { cddddd=c; } f_unn( double (*c) (unsigned) ) {cu=c;} f_unn( double (*c) (unsigned,double) ) {cud=c;} f_unn( double (*c) (unsigned,double,double) ) {cudd=c;} f_unn( double (*c) (unsigned,unsigned) ) {cuu=c;} f_unn( double (*c) (unsigned,unsigned,unsigned) ) {cuuu=c;} f_unn( double (*c) (unsigned,unsigned,unsigned,unsigned)) {cuuuu=c;} f_unn( double (*c) (unsigned,double,unsigned) ) {cudu=c;} f_unn( double (*c)(const gsl_rng*) ) { cr=c; } f_unn( double (*c)(const gsl_rng*,double) ) { crd=c; } f_unn( double (*c)(const gsl_rng*, double,double) ) { crdd=c; } f_unn( double (*c)(const gsl_rng*, double,double,double) ) { crddd=c; } f_unn( double (*c)(const gsl_rng*, double,double,double,double) ) { crdddd=c; } f_unn( double (*c)(const gsl_rng*, double,double,double,double,double) ) { crddddd=c; } f_unn( double (*c)(const gsl_rng*,unsigned) ) { cru=c; } //gsl_statistics function prototypes f_unn(double (*c)(const unsigned char *,size_t,size_t)) {csucpss=c;} f_unn(double (*c)(const char *,size_t,size_t)) {cscpss=c;} f_unn(double (*c)(const short* ,size_t,size_t)) {csspss=c;} f_unn(double (*c)(const int* ,size_t,size_t)) {csipss=c;} f_unn(double (*c)(const float* , size_t,size_t) ) {csfpss=c;} f_unn(double (*c)(const double*, size_t,size_t) ) {csdpss=c;} f_unn(double (*c)(const unsigned short* ,size_t,size_t)) {csuspss=c;} f_unn(double (*c)(const unsigned int* ,size_t,size_t)) {csuipss=c;} f_unn(double (*c)(const long* ,size_t,size_t)) {cslpss=c;} f_unn(double (*c)(const unsigned long* ,size_t,size_t)) {csulpss=c;} f_unn(double (*c)(const unsigned char *,size_t,size_t,double)) {csucpssd=c;} f_unn(double (*c)(const char *,size_t,size_t,double)) {cscpssd=c;} f_unn(double (*c)(const short* ,size_t,size_t,double)) {csspssd=c;} f_unn(double (*c)(const int* ,size_t,size_t,double)) {csipssd=c;} f_unn(double (*c)(const float* , size_t,size_t,double) ) {csfpssd=c;} f_unn(double (*c)(const double*, size_t,size_t,double) ) {csdpssd=c;} f_unn(double (*c)(const unsigned short* ,size_t,size_t,double)) {csuspssd=c;} f_unn(double (*c)(const unsigned int* ,size_t,size_t,double)) {csuipssd=c;} f_unn(double (*c)(const long* ,size_t,size_t,double)) {cslpssd=c;} f_unn(double (*c)(const unsigned long* ,size_t,size_t,double)) {csulpssd=c;} // return type unsigned int f_unn(unsigned int (*d)(const gsl_rng*, unsigned) ) { dru=d; } f_unn(unsigned int (*d)(const gsl_rng*, unsigned,unsigned) ) { druu=d; } f_unn(unsigned int (*d)(const gsl_rng*, unsigned,unsigned,unsigned) ) { druuu=d; } f_unn(unsigned int (*d)(const gsl_rng*, double) ) { drd=d; } f_unn(unsigned int (*d)(const gsl_rng*, double,double) ) { drdd=d; } f_unn(unsigned int (*d)(const gsl_rng*, double,unsigned) ) { drdu=d; } f_unn(unsigned long int(*e)(const gsl_rng*)) {er=e;} f_unn(unsigned long int(*e)(const gsl_rng*,unsigned long int)) {eru=e;} }; // dummy function int ncap_void(void); // Class to hold GSL function name, function pointers, function handler class gpr_cls { private: std::string _fnm; // for regular constructors this holds only one gsl function pointer std::vector _in_f_unn_vtr; nc_type _type; public: var_sct* (*_hnd_fnc)(HANDLE_ARGS); gpr_cls(std::string ifnm, f_unn pfptr_e,var_sct* (*hnd_fnc)(HANDLE_ARGS) ){ _fnm=ifnm; _in_f_unn_vtr.push_back(pfptr_e); _hnd_fnc=hnd_fnc; _type=NC_NAT; } gpr_cls(const char *const pfnm, f_unn pfptr_e,var_sct* (*hnd_fnc)(HANDLE_ARGS) ) { _fnm= static_cast(pfnm); _in_f_unn_vtr.push_back(pfptr_e); _hnd_fnc=hnd_fnc; _type=NC_NAT; } gpr_cls(const char *const pfnm, f_unn pfptr_e,var_sct* (*hnd_fnc)(HANDLE_ARGS), int type_in){ _fnm= static_cast(pfnm); _in_f_unn_vtr.push_back(pfptr_e); _hnd_fnc=hnd_fnc; _type=(nc_type)type_in; } // Constructor with vector of gsl func args gpr_cls(const char *const pfnm, std::vector in_f_unn_vtr, var_sct* (*hnd_fnc)(HANDLE_ARGS) ) { _fnm= static_cast(pfnm); _in_f_unn_vtr=in_f_unn_vtr; _hnd_fnc=hnd_fnc; _type=NC_NAT; } // Constructor with vector of gsl func args gpr_cls(const char *const pfnm, std::vector in_f_unn_vtr, var_sct* (*hnd_fnc)(HANDLE_ARGS), int type_in ){ _fnm= static_cast(pfnm); _in_f_unn_vtr=in_f_unn_vtr; _hnd_fnc=hnd_fnc; _type=(nc_type)type_in; } // helper method used in constructor args to convert an array of f_unn to a vector // we can call it within constructor args as it is a static method static std::vector hlp_arr2vtr( f_unn *arr_nm,unsigned sz){ std::vector in_f_unn_vtr; for(unsigned idx=0 ; idx gpr_vtr; public: gsl_cls(bool flg_dbg); void gsl_ini_sf(void); void gsl_ini_cdf(void); void gsl_ini_ran(void); void gsl_ini_stats(void); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); static var_sct *hnd_fnc_x(HANDLE_ARGS); static var_sct *hnd_fnc_xd(HANDLE_ARGS); static var_sct *hnd_fnc_iidpd(HANDLE_ARGS); static var_sct *hnd_fnc_idpd(HANDLE_ARGS); static var_sct *hnd_fnc_nd(HANDLE_ARGS); static var_sct *hnd_fnc_idd(HANDLE_ARGS); static var_sct *hnd_fnc_iid(HANDLE_ARGS); static var_sct *hnd_fnc_ud(HANDLE_ARGS); static var_sct *hnd_fnc_udu(HANDLE_ARGS); // the following functions handle explicitly _ran & _rng functions static var_sct *hnd_fnc_rnd(HANDLE_ARGS); static var_sct *hnd_fnc_ru(HANDLE_ARGS); static var_sct *hnd_fnc_udrx(HANDLE_ARGS); static var_sct *hnd_fnc_uerx(HANDLE_ARGS); static var_sct *hnd_fnc_udrdu(HANDLE_ARGS); // explict handler // The following functions handle gsl_statistical functions static var_sct *hnd_fnc_stat1(HANDLE_ARGS); static var_sct *hnd_fnc_stat2(HANDLE_ARGS); static var_sct *hnd_fnc_stat3(HANDLE_ARGS); static var_sct *hnd_fnc_stat4(HANDLE_ARGS); }; //GSL2 /****************************************/ // nb For custom gsl functions that don't fit into gsl_cls class gsl2_cls: public vtl_cls { private: enum {PGSL_RNG_MIN,PGSL_RNG_MAX,PGSL_RNG_NAME }; bool _flg_dbg; public: gsl2_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //GSL STATISTICS 2 /****************************************/ // gsl statistic functions for floating points only class gsl_stt2_cls: public vtl_cls { private: enum { PWMEAN, PWVAR, PWSD, PWVAR_MEAN, PWSD_MEAN, PWABSDEV, PWSKEW, PWKURTOSIS, PWVAR_M, PWSD_M, PWABSDEV_M, PWSKEW_M_SD, PWKURTOSIS_M_SD }; bool _flg_dbg; public: gsl_stt2_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); }; //GSL /****************************************/ // gsl spline interpolation class gsl_spl_cls: public vtl_cls { private: enum {PLINEAR,PPOLY,PCSPLINE,PCSPLINE_PER,PAKIMA,PAKIMA_PER,PEVAL }; bool _flg_dbg; public: gsl_spl_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); var_sct *eval_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); var_sct *spl_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); }; //GSL /****************************************/ // gsl Least Square Fitting class gsl_fit_cls: public vtl_cls { private: enum { PLIN,PWLIN,PLIN_EST,PMUL,PWMUL,PMUL_EST }; bool _flg_dbg; public: gsl_fit_cls(bool flg_dbg); var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker); var_sct *fit_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); var_sct *fit_est_fnd(bool &is_mtd, std::vector &args_vtr, fmc_cls &fmc_obj, ncoTree &walker); int rm_miss_arr(double *x_in,long long x_stride,double *y_in, long long y_stride, double *w_in,long long w_stride,long long n); }; #endif // !ENABLE_GSL #ifdef ENABLE_GSL class nco_gsl_cls: public vtl_cls { private: enum {NCO_GSL_FUNC1,NCO_GSL_FUNC2}; bool _flg_dbg; std::vector gpr_vtr; public: nco_gsl_cls(bool flg_dbg); var_sct *fnd(RefAST expr,RefAST fargs,fmc_cls &fmc_obj,ncoTree &walker); var_sct *fit_fnd(bool &is_mtd,std::vector &args_vtr,fmc_cls &fmc_obj,ncoTree &walker); }; #endif // !ENABLE_GSL #endif // FMC_GSL_CLS_HH nco-4.5.4/src/nco++/libnco++.hh000066400000000000000000000023751264355130400157260ustar00rootroot00000000000000// $Header$ // Purpose: Prototypes, typedefs, and global variables for libnco++ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* libnco++.hh headers depend on system headers and libnco.a headers Thus libnco++.a requires libnco.a to function correctly User must also supply nco_prg_nm_get() and nco_dbg_lvl_get() */ // Usage: // #include // C++ interface to netCDF C library #ifndef LIBNCOXX_HH // Contents have not yet been inserted in current source file #define LIBNCOXX_HH // Personal headers #include "sym_cls.hh" #include "fmc_cls.hh" #include "fmc_all_cls.hh" #include "nco_gsl.h" #ifdef ENABLE_GSL # include "fmc_gsl_cls.hh" #endif // !ENABLE_GSL #include "NcapVar.hh" #include "NcapVarVector.hh" #include "ncap2_utl.hh" #include "prs_cls.hh" #include "sdo_utl.hh" #include "ncap2_utl.hh" //#include "ncoLexer.hpp" // //#include "ncoParser.hpp" // //#include "ncoTree.hpp" // //#include "NcapVarVector.hh" // //#include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #endif // LIBNCOXX_HH nco-4.5.4/src/nco++/map_srt_tmp.hh000066400000000000000000000061601264355130400166530ustar00rootroot00000000000000#ifndef MAP_SRT_TMP_hh_ #define MAP_SRT_TMP_hh_ #include template class map_srt{ public: long _imp; T _V; // Use for sorting ascending bool operator<(const map_srt &right)const { return ( _V < right._V); } // sort descending -a hack - function shouldn't be static - but hey it works inline static bool greater(const map_srt &x, const map_srt &y ) { return (x._V > y._V); } }; template void ncap_sort_and_map(var_sct *var, var_sct *var_mp, bool bd) { long idx; long sz=var->sz; T *tp; map_srt *mp; tp=(T*)var->val.vp; mp=new map_srt[sz]; // initialize array for(idx=0 ; idx::greater); // decreasing //The above line may not work with some compilers if so replace with the following // { std::sort(mp,mp+sz); std::reverse(mp,mp+sz);} // Currently only two types for the mapping if(var_mp->type==NC_INT){ // var_mp will hold the mapping (void)cast_void_nctype(NC_INT,&var_mp->val); for(idx=0 ; idxval.ip[ mp[idx]._imp] =idx; tp[idx]=mp[idx]._V; } (void)cast_nctype_void(NC_INT,&var_mp->val); }else if(var_mp->type==NC_UINT64){ // var_mp will hold the mapping (void)cast_void_nctype((nc_type)NC_UINT64,&var_mp->val); for(idx=0 ; idxval.ui64p[ mp[idx]._imp] =idx; tp[idx]=mp[idx]._V; } (void)cast_nctype_void((nc_type)NC_UINT64,&var_mp->val); } // delete array delete []mp; return ; } // end function template void ncap_array(var_sct *var1, var_sct *var2,var_sct *var_ret) { long idx; long sz=var_ret->sz; T *tp; T srt; T inc; srt=*( (T*)(var1->val.vp)); inc=*( (T*)(var2->val.vp)); tp=(T*)var_ret->val.vp; for(idx=0 ;idx long ncap_min_index(var_sct *var) { bool bmss=false; long idx; long min_idx=0L; long sz=var->sz; T* tp; T tmin; T tmss=T(0); tp=(T*)var->val.vp; tmin=tp[0]; if(var->has_mss_val) { bmss=true; tmss=((T*)(var->mss_val.vp))[0]; } if(bmss) for(idx=1;idx long ncap_max_index(var_sct *var) { bool bmss=false; long idx; long max_idx=0L; long sz=var->sz; T* tp; T tmax; T tmss=T(0); tp=(T*)var->val.vp; tmax=tp[0]; if(var->has_mss_val) { bmss=true; tmss=((T*)(var->mss_val.vp))[0]; } if(bmss) for(idx=1;idx tmax && tp[idx]!=tmss ) { max_idx=idx; tmax=tp[idx]; } if(!bmss) for(idx=1;idxtmax ) { max_idx=idx; tmax=tp[idx]; } return max_idx; } #endif nco-4.5.4/src/nco++/ncap2.cc000066400000000000000000001350071264355130400153220ustar00rootroot00000000000000/* $Header$ */ /* ncap2 -- netCDF arithmetic processor */ /* Purpose: Compute user-defined derived fields using forward algebraic notation applied to netCDF files */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncap2 -O -D 1 -S ~/nco/data/ncap2.in ~/nco/data/in.nc ~/foo.nc ncap2 -O -D 1 -v -S ~/nco/data/ncap2_tst.nco ~/nco/data/in.nc ~/foo.nc ncap2 -O -D 1 -v -s two=one+two ~/nco/data/in.nc ~/foo.nc ncap2 -O -v -s 'foo=exp(0.61)' ~/nco/data/in.nc ~/foo.nc;ncks -C ~/foo.nc ncap2 -O -v -s 'defdim("dmn_tmp")=5;foo[$dmn_tmp]={0,2,4,6,8};foo2=one_dmn_rec_var(foo);print(foo);print(foo2);' ~/nco/data/in.nc ~/foo.nc; ncap2 -O -v -s 'foo=0*three_dmn_var_dbl;where(three_dmn_var_dbl>30){foo=three_dmn_var_dbl;}elsewhere{foo=three_dmn_var_dbl@_FillValue;};foo_avg=foo.avg($time);print(foo_avg);' ~/nco/data/in.nc ~/foo.nc ncap2 -O -v -D 1 -s 'one_dmn_rec_var(0)=one_dmn_rec_var(0)+1' ~/nco/data/in.nc ~/foo.nc ncap2 -O -v -D 1 -s 'three_dmn_rec_var(0,,)=three_dmn_rec_var(0,,)+1' ~/nco/data/in.nc ~/foo.nc */ #ifdef HAVE_CONFIG_H # include "config.h" /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ // Standard C++ headers #include #include /* for inserter */ // Standard C headers #include /* assert() debugging macro */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif /* GNU getopt() is independent system header on FREEBSD, LINUX, LINUXALPHA, LINUXAMD, LINUXARM, WIN32 AT&T getopt() is in unistd.h or stdlib.h on AIX, CRAY, NECSX, SUNMP, SUN4SOL2 fxm: Unsure what ALPHA and SGI do */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #ifdef ENABLE_GSL # include # include #endif // !ENABLE_GSL /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco++.hh" /* netCDF Operator (NCO) C++ library */ #include "libnco.h" /* netCDF Operator (NCO) library */ /* Global variables */ size_t ncap_ncl_dpt_crr=0UL; /* [nbr] Depth of current #include file (incremented in ncap_lex.l) */ size_t *ncap_ln_nbr_crr; /* [cnt] Line number (incremented in ncap_lex.l) */ char **ncap_fl_spt_glb=NULL_CEWI; /* [fl] Script file */ #ifdef ENABLE_GSL int ncap_gsl_mode_prec=0; /* Precision for GSL functions with mode_t argument (Airy, hypergeometric) */ #endif // !ENABLE_GSL /* Forward Declaration */ void pop_fmc_vtr(std::vector &fmc_vtr, vtl_cls *vfnc); void ram_vars_add(prs_cls *prs_arg); int main(int argc,char **argv) { const char fnc_nm[]="main"; FILE *yyin; /* File handle used to check file existance */ int parse_antlr(std::vector &prs_vtr ,char*,char*); /* fxm TODO nco652 */ double rnd_nbr(double); aed_sct att_item; // Used to convert atts in vector to normal form char **fl_lst_abb=NULL_CEWI; /* Option n */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL_CEWI; char *fl_out=NULL_CEWI; /* Option o */ char *fl_out_tmp; char *fl_pth=NULL_CEWI; /* Option p */ char *fl_pth_lcl=NULL_CEWI; /* Option l */ char *fl_spt_usr=NULL_CEWI; /* Option s */ char *lmt_arg[NC_MAX_DIMS]; char *opt_crr=NULL_CEWI; /* [sng] String representation of current long-option name */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ #define NCAP_SPT_NBR_MAX 100 char *spt_arg[NCAP_SPT_NBR_MAX]; /* fxm: Arbitrary size, should be dynamic */ char *spt_arg_cat=NULL_CEWI; /* [sng] User-specified script */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const att_nm_tmp="eulaVlliF_"; /* For netCDF4 name hack */ const char * const opt_sht_lst="3467ACcD:FfhL:l:n:Oo:p:Rrs:S:t:vx-:"; /* [sng] Single letter command line options */ cnk_sct cnk; /* [sct] Chunking structure */ dmn_sct **dmn_in=NULL_CEWI; /* [lst] Dimensions in input file */ dmn_sct *dmn_new; dmn_sct *dmn_item; extern char *optarg; extern int optind; int abb_arg_nbr=0; int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int in_id; int idx; int jdx; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_ass=int_CEWI;/* Number of dimensions in temporary list */ int nbr_dmn_in=int_CEWI; /* Number of dimensions in dim_in */ int nbr_lst_a=0; /* size of xtr_lst_a */ int nbr_spt=0; /* Option s. NB: nbr_spt gets incremented */ int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl;/* number of vars in a file */ int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr will not otherwise be set for -c with no -v */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int var_id; int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ lmt_sct **lmt=NULL_CEWI; // Template lists NcapVector dmn_in_vtr; NcapVector dmn_out_vtr; // Holder for attributes and vectors NcapVarVector var_vtr; // Holder for attributes and vectors in first parse NcapVarVector int_vtr; // Method/function holder std::vector fmc_vtr; // Holder for prs_cls, NB: used for OpenMP std::vector prs_vtr; nco_bool ATT_INHERIT=True; nco_bool ATT_PROPAGATE=True; nco_bool CNV_CCM_CCSM_CF; nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool FL_OUT_NEW=False; nco_bool PRN_FNC_TBL=False; /* Option f */ nco_bool PROCESS_ALL_VARS=True; /* Option v */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */ nm_id_sct *dmn_lst=NULL_CEWI; nm_id_sct *xtr_lst=NULL_CEWI; /* Non-processed variables to copy to OUTPUT */ nm_id_sct *xtr_lst_a=NULL_CEWI; /* Initialize to ALL variables in OUTPUT file */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ size_t sng_lng; size_t spt_arg_lng=size_t_CEWI; var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc; var_sct **var_prc_out; static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"lbr",no_argument,0,0}, {"library",no_argument,0,0}, {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fnc_tbl",no_argument,0,'f'}, {"prn_fnc_tbl",no_argument,0,'f'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"nintap",required_argument,0,'n'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"file",required_argument,0,'S'}, {"script-file",required_argument,0,'S'}, {"signal",no_argument,0,'z'}, {"fl_spt",required_argument,0,'S'}, {"spt",required_argument,0,'s'}, {"script",required_argument,0,'s'}, {"thr_nbr",required_argument,0,'t'}, {"units",no_argument,0,'u'}, {"variable",no_argument,0,'v'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ /* Start clock and save command line */ cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk_dmn */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"hdf_upk") || !strcmp(opt_crr,"hdf_unpack")) nco_upk_cnv=nco_upk_HDF; /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ if(!strcmp(opt_crr,"lbr") || !strcmp(opt_crr,"library")){ (void)nco_lbr_vrs_prn(); nco_exit(EXIT_SUCCESS); } /* endif "lbr" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'f': /* Print function table */ PRN_FNC_TBL=True; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'n': /* NINTAP-style abbreviation of files to process */ /* Currently not used in ncap but should be to allow processing multiple input files by same script */ err_prn(fnc_nm,std::string(nco_prg_nm_get())+ " does not currently implement -n option\n"); fl_lst_abb=nco_lst_prs_2D(optarg,",",&abb_arg_nbr); if(abb_arg_nbr < 1 || abb_arg_nbr > 3) err_prn(fnc_nm, "Incorrect abbreviation for file list\n"); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case 's': /* Copy command script for later processing */ spt_arg[nbr_spt++]=(char *)strdup(optarg); if(nbr_spt == NCAP_SPT_NBR_MAX-1) wrn_prn(fnc_nm,"No more than " +nbr2sng(NCAP_SPT_NBR_MAX) + " allowed. TODO# 24."); break; case 'S': /* Read command script from file rather than from command line */ fl_spt_usr=(char *)strdup(optarg); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ PROCESS_ALL_VARS=False; xtr_nbr=0; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ err_prn(fnc_nm,"Long options are not available in this build. Use single letter options instead.\n"); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Append ";\n" to command-script arguments, then concatenate them */ for(idx=0;idx2) ncap_gsl_mode_prec=0; /* create generator chosen by environment variables GSL_RNG_TYPE, GSL_RNG_SEED */ gsl_rng_env_setup(); #endif // !ENABLE_GSL // Sort Vector std::sort(fmc_vtr.begin(),fmc_vtr.end()); if(PRN_FNC_TBL){ (void)fprintf(stdout,"Methods available in %s:\n",nco_prg_nm_get()); for(idx=0;idx<(signed int)fmc_vtr.size();idx++) std::cout<< fmc_vtr[idx].fnm()<<"()"< 0) lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); (void)nco_inq_format(in_id,&fl_in_fmt); /* Form list of all dimensions in file */ dmn_lst=nco_dmn_lst(in_id,&nbr_dmn_in); //dmn_in=(dmn_sct **)nco_malloc(nbr_dmn_in*sizeof(dmn_sct *)); for(idx=0;idx 0) (void)nco_dmn_lmt_mrg(dmn_in,nbr_dmn_in,lmt,lmt_nbr); /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt; /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ if(FL_OUT_NEW){ /* Normal case, like rest of NCO, where writes are made to temporary file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); }else{ /* Existing file */ /* ncap2, like ncrename and ncatted, directly modifies fl_in if fl_out is omitted If fl_out resolves to _same name_ as fl_in, method above is employed */ fl_out_tmp=(char *)strdup(fl_out); if(RAM_OPEN) md_open=NC_WRITE|NC_DISKLESS; else md_open=NC_WRITE; rcd+=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); (void)nco_redef(out_id); } /* Existing file */ /* Initialize chunking from user-specified inputs */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) rcd+=nco_cnk_ini(in_id,fl_out,cnk_arg,cnk_nbr,cnk_map,cnk_plc,cnk_min_byt,cnk_sz_byt,cnk_sz_scl,&cnk); /* Copy global attributes */ (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Set arguments for script execution NB: all these are used as references */ prs_cls prs_arg(dmn_in_vtr,dmn_out_vtr,fmc_vtr,var_vtr,int_vtr); prs_arg.fl_in=fl_in; /* [sng] Input data file */ prs_arg.in_id=in_id; /* [id] Input data file ID */ prs_arg.fl_out=fl_out; /* [sng] Output data file */ prs_arg.out_id=out_id; /* [id] Output data file ID */ prs_arg.fl_out_fmt=fl_out_fmt; /* [sng] Output data file format */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&prs_arg.out_id_readonly); prs_arg.FORTRAN_IDX_CNV=FORTRAN_IDX_CNV; prs_arg.ATT_PROPAGATE=ATT_PROPAGATE; prs_arg.ATT_INHERIT=ATT_INHERIT; prs_arg.NCAP_MPI_SORT=(thr_nbr > 1 ? true:false); prs_arg.dfl_lvl=dfl_lvl; /* [enm] Deflate level */ prs_arg.cnk_sz=(size_t*)NULL; /* Chunk sizes NULL for now */ #ifdef NCO_NETCDF4_AND_FILLVALUE prs_arg.NCAP4_FILL=(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC); #else prs_arg.NCAP4_FILL=false; #endif // !ENABLE_NETCDF4 prs_arg.ntl_scn=false; (void)ram_vars_add(&prs_arg); prs_vtr.push_back(prs_arg); for(idx=1;idxnm); if(!dmn_item) continue; (void)nco_dmn_xrf(dmn_item,dmn_out_vtr[idx]); if(dmn_item->sz != dmn_out_vtr[idx]->sz) (void)fprintf(stdout,"%s: WARNING: dimension miss-match. Dimension \"%s\" is size=%ld in input file and size=%ld in output file.\nHINT: Command may work if Append mode (-A) is not used.\n",nco_prg_nm_get(),dmn_item->nm,dmn_item->sz,dmn_out_vtr[idx]->sz); } /* end loop over dimensions */ /* Get number of variables in output file */ rcd=nco_inq(out_id,(int *)NULL,&nbr_var_fl,(int *)NULL,(int *)NULL); /* Make list of all new variables in output_file */ xtr_lst_a=nco_var_lst_mk(out_id,nbr_var_fl,(char**)NULL,False,False,&nbr_xtr); for(idx=0;idxflg_stt=2; prs_arg.var_vtr.push(Nvar); /* Copy output attributes into var_vtr */ ncap_att_gnrl(xtr_lst_a[idx].nm,xtr_lst_a[idx].nm,2,&prs_arg); } /* end loop over variables */ /* Free lists */ dmn_lst_out=nco_nm_id_lst_free(dmn_lst_out,nbr_dmn_out); xtr_lst_a=nco_nm_id_lst_free(xtr_lst_a,nbr_xtr); } /* !FORCE_APPEND */ // execute in ANTLR command-line script(s) if(nbr_spt >0){ char *fl_cmd_usr=(char *)strdup("Command-line script"); /* Print all command-line scripts */ if(nco_dbg_lvl_get() >= nco_dbg_std){ for(idx=0;idx 0) xtr_lst=nco_var_lst_sub(xtr_lst,&xtr_nbr,xtr_lst_a,nbr_lst_a); /* Put file in define mode to allow metadata writing */ (void)nco_redef(out_id); /* Free current list of all dimensions in input file */ dmn_lst=nco_nm_id_lst_free(dmn_lst,nbr_dmn_in); /* Make list of dimensions of variables in xtr_lst */ if(xtr_nbr > 0) dmn_lst=nco_dmn_lst_ass_var(in_id,xtr_lst,xtr_nbr,&nbr_dmn_ass); /* Find and add any new dimensions to output */ for(idx=0;idxxrf ) continue; (void)dmn_out_vtr.push_back(nco_dmn_dpl(dmn_in_vtr[jdx])); (void)nco_dmn_dfn(fl_out,out_id,&dmn_out_vtr.back(),1); (void)nco_dmn_xrf(dmn_out_vtr.back(),dmn_in_vtr[jdx]); } /* Free current list of all dimensions in input file */ dmn_lst=nco_nm_id_lst_free(dmn_lst,nbr_dmn_ass); /* Dimensions for manually specified extracted variables are now defined in output file Add coordinate variables to extraction list If EXTRACT_ALL_COORDINATES then write associated dimension to output */ if(EXTRACT_ASSOCIATED_COORDINATES){ for(idx=0;idxis_crd_dmn) continue; if(EXTRACT_ALL_COORDINATES && !dmn_item->xrf){ /* Add dimensions to output list dmn_out */ dmn_new=nco_dmn_dpl(dmn_item); (void)nco_dmn_xrf(dmn_new,dmn_item); /* Write dimension to output */ (void)nco_dmn_dfn(fl_out,out_id,&dmn_new,1); (void)dmn_out_vtr.push_back(dmn_new); } /* end if */ /* Add coordinate variable to extraction list, dimension has already been output */ if(dmn_item->xrf){ for(jdx=0;jdxnm)) break; if(jdx != xtr_nbr) continue; /* If coordinate is not on list then add it to extraction list */ xtr_lst=(nm_id_sct *)nco_realloc(xtr_lst,(xtr_nbr+1)*sizeof(nm_id_sct)); xtr_lst[xtr_nbr].nm=(char *)strdup(dmn_item->nm); xtr_lst[xtr_nbr].id=dmn_item->cid; /* Increment */ xtr_nbr++; } /* endif */ } /* end loop over idx */ } /* end if */ /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id); /* Add coordinates defined by CF convention */ if(CNV_CCM_CCSM_CF && (EXTRACT_ALL_COORDINATES || EXTRACT_ASSOCIATED_COORDINATES)) xtr_lst=nco_cnv_cf_crd_add(in_id,xtr_lst,&xtr_nbr); /* Subtract list A again (it may contain re-defined coordinates) */ if(xtr_nbr > 0) xtr_lst=nco_var_lst_sub(xtr_lst,&xtr_nbr,xtr_lst_a,nbr_lst_a); /* Sort extraction list for faster I/O */ if(xtr_nbr > 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* Write "fixed" variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idxxpr_typ == ncap_var){ int rcd_inq_att; var_sct *var_ref; var_ref=var_vtr[idx]->var; rcd=nco_inq_varid_flg(out_id,var_ref->nm,&var_id); /* Filter-out RAM vars */ if(rcd!=NC_NOERR || !var_ref->has_mss_val) continue; /* Is missing value already present? */ rcd_inq_att=nco_inq_att_flg(out_id,var_id,nco_mss_val_sng_get(),&att_item.type,&att_item.sz); /* Do not overwrite if type mismatch, e.g., packed variable are in output with -A switch */ if(rcd_inq_att == NC_NOERR && var_ref->type != att_item.type) continue; /* Fill-mode and attribute exists */ if(prs_arg.NCAP4_FILL && rcd_inq_att == NC_NOERR){ (void)nco_rename_att(out_id,var_id,nco_mss_val_sng_get(),att_nm_tmp); (void)nco_put_att(out_id,var_id,att_nm_tmp,var_ref->type,1,var_ref->mss_val.vp); (void)nco_rename_att(out_id,var_id,att_nm_tmp,nco_mss_val_sng_get()); continue; } /* end if */ /* Fill-mode and attribute does not exist */ if(prs_arg.NCAP4_FILL && rcd_inq_att != NC_NOERR){ (void)nco_put_att(out_id,var_id,att_nm_tmp,var_ref->type,1,var_ref->mss_val.vp); (void)nco_rename_att(out_id,var_id,att_nm_tmp,nco_mss_val_sng_get()); continue; } /* end if */ /* netCDF3 file so just put attribute */ (void)nco_put_att(out_id,var_id,nco_mss_val_sng_get(),var_ref->type,1,var_ref->mss_val.vp); continue; } /* endif */ /* Write misssing value contained inside variable */ /* If missing value type is same as disk type */ /* if(var_vtr[idx]->xpr_typ == ncap_var){ if(!var_vtr[idx]->var->has_mss_val) continue; att_item.att_nm=strdup(nco_mss_val_sng_get()); att_item.var_nm=strdup(var_vtr[idx]->getVar().c_str()); att_item.sz=1; att_item.type=var_vtr[idx]->var->type; att_item.val=var_vtr[idx]->var->mss_val; att_item.mode=aed_overwrite; //att_item.mode=aed_create; } */ if(var_vtr[idx]->xpr_typ == ncap_att){ /* Skip missing values (for now) */ if(var_vtr[idx]->getAtt() == nco_mss_val_sng_get()) continue; att_item.att_nm=strdup(var_vtr[idx]->getAtt().c_str()); att_item.var_nm=strdup(var_vtr[idx]->getVar().c_str()); att_item.sz=var_vtr[idx]->var->sz; att_item.type=var_vtr[idx]->var->type; att_item.val=var_vtr[idx]->var->val; att_item.mode=aed_overwrite; } /* endif ncap_att */ if(!strcmp(att_item.var_nm,"global")){ var_id=NC_GLOBAL; }else{ rcd=nco_inq_varid_flg(out_id,att_item.var_nm,&var_id); if(rcd != NC_NOERR) goto cln_up; } /* end else */ /* Check size */ if(att_item.sz > NC_MAX_ATTRS){ (void)fprintf(stdout,"%s: Attribute %s size %ld excceeds maximum %d\n",nco_prg_nm_get(),att_item.att_nm,att_item.sz, NC_MAX_ATTRS ); goto cln_up; } /* end if */ /* NB: Write these attributes prior to last data mode 20150616: ncap2.in fails here because time1 attribute bounds is passed with att_item.val=NULL */ (void)nco_aed_prc(out_id,var_id,att_item); cln_up: att_item.var_nm=(char*)nco_free(att_item.var_nm); att_item.att_nm=(char*)nco_free(att_item.att_nm); } /* end for */ /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,(lmt_msa_sct **)NULL_CEWI,(int)0,&cnk_map,&cnk_plc,cnk_sz_scl,cnk.cnk_dmn,cnk_nbr); /* Turn-off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ (void)nco_enddef(out_id); /* Copy non-processed vars */ (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix); /* Close input netCDF file */ rcd=nco_close(in_id); /* Close files in all threads except main thread */ for(idx=1;idx 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); /* Free limits */ for(idx=0;idx 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr); /* Free chunking information */ for(idx=0;idx 0) cnk.cnk_dmn=(cnk_dmn_sct **)nco_cnk_lst_free(cnk.cnk_dmn,cnk_nbr); /* Free dimension vectors */ if(dmn_in_vtr.size() > 0) for(idx=0;idx 0) for(idx=0;idx< dmn_out_vtr.size();idx++) (void)nco_dmn_free(dmn_out_vtr[idx]); /* Free var_vtr */ if(var_vtr.size() > 0) for(idx=0; idx < var_vtr.size(); idx++) delete var_vtr[idx]; /* Clear vectors */ /* fmc_vtr.clear(); cnv_obj.fmc_vtr.clear(); agg_obj.fmc_vtr.clear(); utl_obj.fmc_vtr.clear(); mth_obj.fmc_vtr.clear(); mth2_obj.fmc_vtr.clear(); bsc_obj.fmc_vtr.clear(); pdq_obj.fmc_vtr.clear(); msk_obj.fmc_vtr.clear(); pck_obj.fmc_vtr.clear(); */ /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); } /* !flg_cln */ nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ // Copy vector elements void pop_fmc_vtr (std::vector &fmc_vtr, vtl_cls *vfnc) { // De-reference std::vector &lcl_vtr=*vfnc->lst_vtr(); std::copy(lcl_vtr.begin(),lcl_vtr.end(),inserter(fmc_vtr,fmc_vtr.end()) ); } // Add some useful constants as RAM variables void ram_vars_add (prs_cls *prs_arg) { var_sct *var1; var1=ncap_sclr_var_mk(std::string("__BYTE"),nco_int(NC_BYTE)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__CHAR"),nco_int(NC_CHAR)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__SHORT"),nco_int(NC_SHORT)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__INT"),nco_int(NC_INT)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__FLOAT"),nco_int(NC_FLOAT)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__DOUBLE"),nco_int(NC_DOUBLE)); prs_arg->ncap_var_write(var1,true); #ifdef ENABLE_NETCDF4 var1=ncap_sclr_var_mk(std::string("__UBYTE"),nco_int(NC_UBYTE)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__USHORT"),nco_int(NC_USHORT)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__UINT"),nco_int(NC_UINT)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__INT64"),nco_int(NC_INT64)); prs_arg->ncap_var_write(var1,true); var1=ncap_sclr_var_mk(std::string("__UINT64"),nco_int(NC_UINT64)); prs_arg->ncap_var_write(var1,true); #endif // !ENABLE_NETCDF4 #ifdef INFINITY var1=ncap_sclr_var_mk(std::string("inff"),INFINITY); // float prs_arg->ncap_var_write(var1,true); #endif // !INFINITY #ifdef NAN var1=ncap_sclr_var_mk(std::string("nanf"),NAN); // float prs_arg->ncap_var_write(var1,true); #endif // !NAN #ifdef HUGE_VAL var1=ncap_sclr_var_mk(std::string("inf"),HUGE_VAL); // double prs_arg->ncap_var_write(var1,true); #endif // !HUGE_VAL char buff[20]; double dnan; #ifndef _MSC_VER if((dnan=nan(buff))){ var1=ncap_sclr_var_mk(std::string("nan"),dnan); // double prs_arg->ncap_var_write(var1,true); } // ! dnan #endif // !_MSC_VER } // end ram_vars_add() nco-4.5.4/src/nco++/ncap2.hh000066400000000000000000000003761264355130400153340ustar00rootroot00000000000000#ifndef NCAP2_HH #define NCAP2_HH typedef enum { ncap_var, ncap_att, ncap_xpr_var_hyp, ncap_xpr_att_hyp, ncap_xpr_var_cst, ncap_xpr_null } ncap_type; #endif // NCAP2_HH nco-4.5.4/src/nco++/ncap2_utl.cc000066400000000000000000002664231264355130400162150ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "ncap2_utl.hh" // check if var is really an attribute nco_bool ncap_var_is_att( var_sct *var) { if( strchr(var->nm,'@') !=NULL_CEWI ) return True; return False; } // initialize var to defaults & undefined to true; var_sct * ncap_var_udf(const char *var_nm) { var_sct *var_ret; var_ret=(var_sct *)nco_malloc(sizeof(var_sct)); // Set defaults (void)var_dfl_set(var_ret); var_ret->nm=strdup(var_nm); var_ret->undefined=True; // Try out code. var_dfl_set sets type=NC_NAT // This means its not possible to change the // type as nco_var_cnf_typ bombs out // Temporary solution -- set the type to NC_INT //var_ret->type=NC_INT; return var_ret; } var_sct* ncap_att_get (int var_id, const char *var_nm, const char *att_nm, int location, /* I [flg] 1 - att from INPUT file 2 - att from OUTPUT file */ prs_cls *prs_arg) { int rcd; int fl_id=int_CEWI; long sz; char *ln_nm; nc_type type; var_sct *var_ret; if(location == 1) fl_id=prs_arg->in_id; if(location == 2) fl_id=prs_arg->out_id; rcd=nco_inq_att_flg(fl_id,var_id,att_nm,&type,&sz); if(rcd == NC_ENOTATT) return NULL_CEWI; var_ret=(var_sct*)nco_malloc(sizeof(var_sct)); (void)var_dfl_set(var_ret); // Make name of the form var_nm@att_nm ln_nm=(char *)nco_malloc((strlen(var_nm)+strlen(att_nm)+2)*sizeof(char)); strcpy(ln_nm,var_nm);strcat(ln_nm,"@");strcat(ln_nm,att_nm); var_ret->nm=ln_nm; var_ret->id=var_id; var_ret->nc_id=prs_arg->in_id; var_ret->type=type; var_ret->sz=sz; // maybe needed ? var_ret->nbr_dim=0; // Fill with data if NOT an initial scan if(!prs_arg->ntl_scn){ var_ret->val.vp=(void *)nco_malloc(sz*nco_typ_lng(type)); rcd=nco_get_att(fl_id,var_id,att_nm,var_ret->val.vp,type); if (rcd != NC_NOERR) { var_ret=nco_var_free(var_ret); return NULL_CEWI; } } return var_ret; } var_sct * /* O [sct] variable containing attribute */ ncap_att_init /* [fnc] Grab an attribute from input file */ (const std::string s_va_nm, /* I [sng] att name of form var_nm&att_nm */ prs_cls *prs_arg) /* I/O vectors of atts & vars & file names */ { int rcd; int var_id; std::string var_nm; std::string att_nm; size_t att_char_posn; var_sct *var_ret; //check if we have an attribute if( (att_char_posn =s_va_nm.find("@")) ==std::string::npos ) return NULL_CEWI; var_nm=s_va_nm.substr(0,att_char_posn); att_nm=s_va_nm.substr(att_char_posn+1); if(var_nm == "global"){ var_id=NC_GLOBAL; }else{ rcd=nco_inq_varid_flg(prs_arg->in_id,var_nm.c_str(),&var_id); if(rcd != NC_NOERR) return NULL_CEWI; } var_ret=ncap_att_get(var_id,var_nm.c_str(),att_nm.c_str(),1,prs_arg); return var_ret; } nco_bool /* O [flg] true if var has been stretched */ ncap_att_stretch /* stretch a single valued attribute from 1 to sz */ (var_sct* var, /* I/O [sct] variable */ long nw_sz) /* I [nbr] new var size */ { long idx; long var_typ_sz; void* vp; char *cp; char **sng_cp; if(var->sz > 1L || nw_sz <1) return false; if(nw_sz==1) return true; var_typ_sz=nco_typ_lng(var->type); // handle NC_STRING -special case // nb var->val.sngp is a ragged array of chars if(var->type == (nc_type)NC_STRING){ sng_cp=(char**)nco_malloc(nw_sz*var_typ_sz); (void)cast_void_nctype((nc_type)NC_STRING,&var->val); for(idx=0;idxval.sngp[0]); (void)cast_nctype_void((nc_type)NC_STRING,&var->val); vp=(void*)sng_cp; }else{ vp=(void*)nco_malloc(nw_sz*var_typ_sz); for(idx=0;idxval.vp,var_typ_sz); } } var->val.vp=(void*)nco_free(var->val.vp); var->sz=nw_sz; var->val.vp=vp; return true; } /* end ncap_att_stretch */ int ncap_att_gnrl (const std::string s_dst, const std::string s_src, int location, /* I [flg] 1: attributes from INPUT file, 2: attributes from OUTPUT file */ prs_cls *prs_arg){ int idx; int srt_idx; int sz; int rcd; int var_id; int nbr_att; int fl_id=int_CEWI; char att_nm[NC_MAX_NAME]; const char *tmp_att_nm; const char scl_fct_sng[]="scale_factor"; /* [sng] Unidata standard string for scale factor */ const char add_fst_sng[]="add_offset"; /* [sng] Unidata standard string for add offset */ var_sct *var_att; std::string s_fll; NcapVar *Nvar; // De-reference NcapVarVector &var_vtr=prs_arg->var_vtr; NcapVarVector att_vtr; // hold new attributes. if(location == 1) fl_id=prs_arg->in_id; if(location == 2) fl_id=prs_arg->out_id; // get var_id rcd=nco_inq_varid_flg(fl_id,s_src.c_str(),&var_id); if(rcd == NC_NOERR){ (void)nco_inq_varnatts(fl_id,var_id,&nbr_att); // loop though attributes for(idx=0; idx getVar()) break; if((var_vtr)[idx]->xpr_typ != ncap_att) continue; tmp_att_nm=var_vtr[idx]->getAtt().c_str(); // skip missing value, scale_factor, add_offset if(!strcmp(tmp_att_nm,nco_mss_val_sng_get()) || !strcmp(tmp_att_nm,scl_fct_sng) || !strcmp(tmp_att_nm,add_fst_sng)) continue; // Create string for new attribute s_fll=s_dst+"@"+(var_vtr[idx]->getAtt()); var_att=nco_var_dpl(var_vtr[idx]->var); Nvar=new NcapVar(var_att,s_fll); att_vtr.push_back(Nvar); } } sz=att_vtr.size(); // add new att to list; for(idx=0;idx< sz;idx++){ #ifdef _OPENMP if(omp_in_parallel()) prs_arg->thr_vtr.push_back(att_vtr[idx]); else var_vtr.push_ow(att_vtr[idx]); #else var_vtr.push_ow(att_vtr[idx]); #endif } return sz; } /* end ncap_att_gnrl() */ int ncap_att_cpy_sct (var_sct *var1, var_sct *var2, prs_cls *prs_arg){ NcapVar *Nvar=prs_arg->var_vtr.find(var1->nm); // Do attribute propagation only if // var doesn't already exist if(!Nvar || Nvar->flg_stt==1) (void)ncap_att_cpy(var1->nm,var2->nm,prs_arg); return 0; } int ncap_att_cpy (const std::string s_dst, const std::string s_src, prs_cls *prs_arg) { int nbr_att=0; //Don't propagate if s_src is a tree-parser generated var if(prs_arg->ATT_PROPAGATE && s_dst != s_src && s_src[0]!='~' ) nbr_att=ncap_att_gnrl(s_dst,s_src,1,prs_arg); if(prs_arg->ATT_INHERIT) nbr_att=ncap_att_gnrl(s_dst,s_dst,1,prs_arg); return nbr_att; } void ncap_att_prn /* [fnc] Print a single attribute*/ (var_sct *var, /* I Variable containing att */ char *const att_in_sng) /* user defined format string */ { char dlm_sng[3]; char att_sng[NCO_MAX_LEN_FMT_SNG]; long att_lmn; long att_sz; /* Copy value to avoid indirection in loop over att_sz */ att_sz=var->sz; if(att_in_sng ==(char*)NULL) { (void)fprintf(stdout,"%s, size = %li %s, value = ",var->nm,att_sz,nco_typ_sng(var->type)); /* Typecast pointer to values before access */ (void)cast_void_nctype(var->type,&var->val); (void)strcpy(dlm_sng,", "); (void)sprintf(att_sng,"%s%%s",nco_typ_fmt_sng(var->type)); /* user defined format string */ } else { (void)strcpy(att_sng,att_in_sng); (void)strcpy(dlm_sng,""); } switch(var->type){ case NC_FLOAT: for(att_lmn=0;att_lmnval.fp[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_DOUBLE: for(att_lmn=0;att_lmnval.dp[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_SHORT: for(att_lmn=0;att_lmnval.sp[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_INT: for(att_lmn=0;att_lmnval.ip[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_CHAR: for(att_lmn=0;att_lmnval.cp[att_lmn]) != '\0') (void)fprintf(stdout,"%c",char_foo); } /* end loop over element */ break; case NC_BYTE: for(att_lmn=0;att_lmnval.bp[att_lmn]); break; case NC_UBYTE: for(att_lmn=0;att_lmnval.ubp[att_lmn]); break; case NC_USHORT: for(att_lmn=0;att_lmnval.usp[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_UINT: for(att_lmn=0;att_lmnval.uip[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_INT64: for(att_lmn=0;att_lmnval.i64p[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_UINT64: for(att_lmn=0;att_lmnval.ui64p[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; case NC_STRING: for(att_lmn=0;att_lmnval.sngp[att_lmn],(att_lmn != att_sz-1) ? dlm_sng : ""); break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ (void)fprintf(stdout,"\n"); (void)cast_nctype_void(var->type,&var->val); (void)fflush(stdout); } /* end ncap_att_prn() */ int /* number appended */ ncap_att_str /* extract string(s) from a NC_CHAR or NC_STRING type attribute */ (var_sct *var_att, std::vector &str_vtr) { int idx; int srt_size=str_vtr.size(); char *cstr; (void)cast_void_nctype((nc_type)var_att->type,&var_att->val); if(var_att->type==NC_STRING) { for(idx=0;idxsz;idx++) { cstr=var_att->val.sngp[idx]; str_vtr.push_back(cstr); } } if(var_att->type==NC_CHAR) { char buffer[NC_MAX_NAME+1]; strncpy(buffer, var_att->val.cp, var_att->sz); buffer[var_att->sz+1]='\0'; str_vtr.push_back(buffer); } (void)cast_nctype_void((nc_type)var_att->type,&var_att->val); return (str_vtr.size() - srt_size); } var_sct * /* O [sct] Remainder of modulo operation of input variables (var1%var2) */ ncap_var_var_mod /* [fnc] Remainder (modulo) operation of two variables */ (var_sct *var1, /* I [sc,t] Variable structure containing field */ var_sct *var2) /* I [sct] Variable structure containing divisor */ { ptr_unn op_swp; const char fnc_nm[]="ncap_var_var_mod"; if(nco_dbg_lvl_get() >= 4) dbg_prn(fnc_nm,"Entered function"); if(var1->has_mss_val){ (void)nco_var_mod(var1->type,var1->sz,var1->has_mss_val,var1->mss_val,var1->val,var2->val); }else{ (void)nco_var_mod(var1->type,var1->sz,var2->has_mss_val,var2->mss_val,var1->val,var2->val); (void)nco_mss_val_cnf(var2,var1); } /* end else */ // Swap values about op_swp=var1->val;var1->val=var2->val;var2->val=op_swp; var2=nco_var_free(var2); return var1; } /* end ncap_var_var_mod() */ var_sct * /* O [sct] Calculate atan2 for each element */ ncap_var_var_atan2 (var_sct *var1, /* I [sc,t] Variable structure containing field */ var_sct *var2) /* I [sct] Variable structure containing divisor */ { long idx; long sz; bool has_mss_val=false; double mss_val_dbl; ptr_unn op1,op2; const char fnc_nm[]="ncap_var_var_atan2"; if(nco_dbg_lvl_get() >= 4) dbg_prn(fnc_nm,"Entered function"); sz=var1->sz; //Dereference op1=var1->val; op2=var2->val; /* Typecast pointer to values before access */ (void)cast_void_nctype(NC_DOUBLE,&op1); (void)cast_void_nctype(NC_DOUBLE,&op2); if(var1->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var1->mss_val); mss_val_dbl=*var1->mss_val.dp; } else if(var2->has_mss_val){ has_mss_val=true; (void)cast_void_nctype(NC_DOUBLE,&var2->mss_val); mss_val_dbl=*var2->mss_val.dp; } if(!has_mss_val){ for(idx=0;idxhas_mss_val) (void)cast_nctype_void(NC_DOUBLE,&var1->mss_val); else if(var2->has_mss_val) (void)cast_nctype_void(NC_DOUBLE,&var2->mss_val); var2=nco_var_free(var2); return var1; } /* end ncap_var_var_atan2 */ var_sct * /* O [sct] Resultant variable (actually is var) */ ncap_var_abs /* Purpose: Find absolute value of each element of var */ (var_sct *var) /* I/O [sct] input variable */ { if(var->undefined) return var; /* deal with initial scan */ if(var->val.vp == NULL) return var; (void)nco_var_abs(var->type,var->sz,var->has_mss_val,var->mss_val,var->val); return var; } /* end ncap_var_abs */ var_sct * /* O [sct] Empowerment of input variables (var1^var_2) */ ncap_var_var_pwr_old /* [fnc] Empowerment of two variables */ (var_sct *var1, /* I [sct] Variable structure containing base */ var_sct *var2) /* I [sct] Variable structure containing exponent */ { char *swp_nm; /* Purpose: Empower two variables (var1^var2) */ /* Temporary fix */ /* Swap names about so attribute propagation works */ /* most operations unlike this one put results in left operand */ if(!ncap_var_is_att(var1) && isalpha(var1->nm[0])){ swp_nm=var1->nm; var1->nm=var2->nm; var2->nm=swp_nm; } if(var1->undefined){ var2->undefined=True; var1=nco_var_free(var1); return var2; } /* Make sure variables are at least float */ if(nco_rth_prc_rnk(var1->type) < nco_rth_prc_rnk_float && nco_rth_prc_rnk(var2->type) < nco_rth_prc_rnk_float) var1=nco_var_cnf_typ((nc_type)NC_FLOAT,var1); (void)ncap_var_retype(var1,var2); /* Handle initial scan */ if(var1->val.vp==(void*)NULL){ if(var1->nbr_dim > var2->nbr_dim){ var2=nco_var_free(var2); return var1; }else{ var1=nco_var_free(var1); return var2; } } (void)ncap_var_cnf_dmn(&var1,&var2); if(var1->has_mss_val){ (void)nco_var_pwr(var1->type,var1->sz,var1->has_mss_val,var1->mss_val,var1->val,var2->val); }else{ (void)nco_var_pwr(var1->type,var1->sz,var2->has_mss_val,var2->mss_val,var1->val,var2->val); } /* end else */ var1=nco_var_free(var1); return var2; } /* end ncap_var_var_pwr() */ var_sct * /* O [sct] Empowerment of input variables (var1^var_2) */ ncap_var_var_pwr /* [fnc] Empowerment of two variables */ (var_sct *var1, /* I [sct] Variable structure containing base */ var_sct *var2) /* I [sct] Variable structure containing exponent */ { ptr_unn op_swp; const char fnc_nm[]="ncap_var_var_pwr"; if(nco_dbg_lvl_get() >= 4) dbg_prn(fnc_nm,"Entered function"); if(var1->has_mss_val){ (void)nco_var_pwr(var1->type,var1->sz,var1->has_mss_val,var1->mss_val,var1->val,var2->val); }else{ (void)nco_var_pwr(var1->type,var1->sz,var2->has_mss_val,var2->mss_val,var1->val,var2->val); (void)nco_mss_val_cnf(var2,var1); } /* end else */ // Swap values about op_swp=var1->val; var1->val=var2->val; var2->val=op_swp; var2=nco_var_free(var2); return var1; } /* end ncap_var_var_pwr() */ var_sct * /* O [sct] Resultant variable (actually is var_in) */ ncap_var_fnc (var_sct *var_in, double(*fnc_dbl)(double), float(*fnc_flt)(float)) { /* Purpose: Evaluate fnc_dbl(var) or fnc_flt(var) for each value in variable Float and double functions are in app */ const char fnc_nm[]="ncap_var_fnc"; long idx; long sz; ptr_unn op1; if(nco_dbg_lvl_get() >= 4) dbg_prn(fnc_nm,"Entered function"); if(var_in->undefined) return var_in; /* Promote variable to NC_FLOAT */ if(nco_rth_prc_rnk(var_in->type) < nco_rth_prc_rnk_float) var_in=nco_var_cnf_typ(NC_FLOAT,var_in); /* Deal with initial scan */ if(var_in->val.vp == NULL) return var_in; op1=var_in->val; sz=var_in->sz; (void)cast_void_nctype(var_in->type,&op1); if(var_in->has_mss_val) (void)cast_void_nctype(var_in->type,&(var_in->mss_val)); switch(var_in->type){ case NC_DOUBLE: { if(!var_in->has_mss_val){ for(idx=0;idxmss_val.dp); /* Temporary variable reduces de-referencing */ for(idx=0;idxhas_mss_val){ for(idx=0;idxmss_val.fp); /* Temporary variable reduces de-referencing */ for(idx=0;idxhas_mss_val) (void)cast_nctype_void(var_in->type,&(var_in->mss_val)); return var_in; } /* end ncap_var_fnc() */ void ncap_lmt_evl (int nc_id, lmt_sct* lmt_ptr, prs_cls *prs_arg){ long cnt_dmn; long srt; long end; long cnt; long srd; dmn_sct *dmn_ptr; //Dereference NcapVector dmn_vtr; const char fnc_nm[]="ncap_lmt_evl"; dmn_vtr=(nc_id==prs_arg->in_id ? prs_arg->dmn_in_vtr: prs_arg->dmn_out_vtr); dmn_ptr=dmn_vtr.find(lmt_ptr->nm); if(dmn_ptr==NULL) err_prn(fnc_nm,"Dimension "+ std::string(lmt_ptr->nm)+" in limits not found"); cnt_dmn=dmn_ptr->sz; //fill out defaults srt=( lmt_ptr->is_usr_spc_min ? lmt_ptr->srt:0L); end=( lmt_ptr->is_usr_spc_max ? lmt_ptr->end:cnt_dmn-1); srd=( lmt_ptr->srd_sng!=NULL_CEWI ? lmt_ptr->srd:1L); // do error checking if(prs_arg->FORTRAN_IDX_CNV){ std::ostringstream os; if(lmt_ptr->is_usr_spc_min && (srt<1 || srt>cnt_dmn)) { os<<"Lower limit " <nm<<" is outside range "<<1L<<"-"<is_usr_spc_max && (end<1 || end>cnt_dmn)) { os<<"Upper limit " <nm<<" is outside range "<<1L<<"-"<end){ os<<"Lower limit " <nm<<" is greater than upper limit "<nm<<" is less than 1"<is_usr_spc_min) srt--; if(lmt_ptr->is_usr_spc_max) end--; } // do error checking if(!prs_arg->FORTRAN_IDX_CNV){ std::ostringstream os; if(srt<0) srt+=cnt_dmn-1; if(end<0) end+=cnt_dmn-1; if(lmt_ptr->is_usr_spc_min && (srt<0 || srt>cnt_dmn-1)) { os<<"Lower limit " <nm<<" is outside range "<<0L<<"-"<is_usr_spc_max && (end<0 || end>cnt_dmn-1)) { os<<"Upper limit " <nm<<" is outside range "<<0L<<"-"<end){ os<<"Lower limit " <nm<<" is greater than upper limit "<nm<<" is less than 1"<srt=srt; lmt_ptr->end=end; lmt_ptr->cnt=cnt; lmt_ptr->srd=srd; return; } /* end ncap_lmt_evl() */ nm_id_sct * /* O [sct] new copy of xtr_lst */ nco_var_lst_copy /* [fnc] Purpose: Copy xtr_lst and return new list */ (nm_id_sct *xtr_lst, /* I [sct] input list */ int lst_nbr) /* I [nbr] Number of elements in list */ { int idx; nm_id_sct *xtr_new_lst; if(lst_nbr == 0) return NULL; xtr_new_lst=(nm_id_sct *)nco_malloc(lst_nbr*sizeof(nm_id_sct)); for(idx=0;idx 0){ xtr_new_lst=(nm_id_sct*)nco_malloc((size_t)(*xtr_nbr)*sizeof(nm_id_sct)); for(idx=0;idxxpr_typ !=ncap_att) continue; (void)strcpy(var_nm, var_vtr[idx]->getVar().c_str()); rcd=nco_inq_varid_flg(out_id,var_nm,&var_id); if(rcd== NC_NOERR) continue; rcd=nco_inq_varid_flg(in_id,var_nm,&var_id); if(rcd == NC_NOERR){ /* eliminate any duplicates from list */ for(jdx=0;jdxnbr_dim >= (*var_2)->nbr_dim){ var_gtr=*var_1; var_lsr=*var_2; }else{ var_gtr=*var_2; var_lsr=*var_1; } /* endif */ /* var_gtr_out=var_gtr unless convolution is required */ var_gtr_out=var_gtr; /* Does lesser variable (var_lsr) conform to greater variable's dimensions? */ if(var_lsr_out == NULL_CEWI){ if(var_gtr->nbr_dim > 0){ /* Test that all dimensions in var_lsr appear in var_gtr */ for(idx=0;idxnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ if(!strcmp(var_lsr->dim[idx]->nm,var_gtr->dim[idx_dmn]->nm)){ var_lsr_var_gtr_dmn_shr_nbr++; /* var_lsr and var_gtr share this dimension */ break; } /* endif */ } /* end loop over var_gtr dimensions */ } /* end loop over var_lsr dimensions */ /* Decide whether var_lsr and var_gtr dimensions conform, are mutually exclusive, or are partially exclusive */ if(var_lsr_var_gtr_dmn_shr_nbr == var_lsr->nbr_dim){ /* var_lsr and var_gtr conform */ /* fxm: Variables do not conform when dimen<_cstsion list of one is subset of other if order of dimensions differs, i.e., a(lat,lev,lon) !~ b(lon,lev) */ CONFORMABLE=True; }else if(var_lsr_var_gtr_dmn_shr_nbr == 0){ /* Dimensions in var_lsr and var_gtr are mutually exclusive */ CONFORMABLE=False; if(MUST_CONFORM){ err_prn(fnc_nm,std::string(var_lsr->nm)+ " and " +std::string(var_gtr->nm) +" share no dimensions. "); //(void)fprintf(stdout,"%s: ERROR %s and template %s share no dimensions\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); //nco_exit(EXIT_FAILURE); }else{ wrn_prn(fnc_nm,std::string(var_lsr->nm)+ " and " +std::string(var_gtr->nm) +" share no dimensions. Attempting to convolve..."); //(void)fprintf(stdout,"\n%s: DEBUG %s and %s share no dimensions: Attempting to convolve...\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); CONVOLVE=True; } /* endif */ }else if(var_lsr_var_gtr_dmn_shr_nbr > 0 && var_lsr_var_gtr_dmn_shr_nbr < var_lsr->nbr_dim){ /* Some, but not all, of var_lsr dimensions are in var_gtr */ CONFORMABLE=False; if(MUST_CONFORM){ std::ostringstream os; os<nm << " belong to template "; os<nm <<" but " << (var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr) <<" do not."; err_prn(fnc_nm,os.str()); //(void)fprintf(stdout,"%s: ERROR %d dimensions of %s belong to template %s but %d dimensions do not\n",nco_prg_nm_get(),var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm,var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr); //nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= 1){ std::ostringstream os; os<nm << " belong to template "; os<nm << " but " << (var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr) <<" do not:"; os<<"Not broadcasting " << var_lsr->nm<< "to " <nm; os<<"could attempt stretching???"; wrn_prn(fnc_nm,os.str()); } //(void)fprintf(stdout,"\n%s: DEBUG %d dimensions of %s belong to template %s but %d dimensions do not: Not broadcasting %s to %s, could attempt stretching???\n",nco_prg_nm_get(),var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm,var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm); CONVOLVE=True; } /* endif */ } /* end if */ if(CONFORMABLE){ if(var_gtr->nbr_dim == var_lsr->nbr_dim){ /* var_gtr and var_lsr conform and are same rank */ /* Test whether all var_lsr and var_gtr dimensions match in sequence */ for(idx=0;idxnbr_dim;idx++){ if(strcmp(var_lsr->dim[idx]->nm,var_gtr->dim[idx]->nm)) break; } /* end loop over dimensions */ /* If so, take shortcut and copy var_lsr to var_lsr_out */ if(idx == var_gtr->nbr_dim) DO_CONFORM=True; }else{ /* var_gtr and var_lsr conform but are not same rank, set flag to proceed to generic conform routine */ DO_CONFORM=False; } /* end else */ } /* endif CONFORMABLE */ }else{ /* nbr_dmn == 0 */ /* var_gtr is scalar, if var_lsr is also then set flag to copy var_lsr to var_lsr_out else proceed to generic conform routine */ if(var_lsr->nbr_dim == 0) DO_CONFORM=True; else DO_CONFORM=False; } /* end else nbr_dmn == 0 */ if(CONFORMABLE && DO_CONFORM){ var_lsr_out=nco_var_dpl(var_lsr); (void)nco_xrf_var(var_lsr,var_lsr_out); } /* end if */ } /* endif var_lsr_out == NULL */ if(var_lsr_out == NULL_CEWI && CONVOLVE){ /* Convolve variables by returned stretched variables with minimum possible number of dimensions */ int dmn_nbr; /* Number of dimensions in convolution */ dbg_prn(fnc_nm,"Convolution not yet implemented, results of operation between " +std::string(var_lsr->nm) + " and "+std::string(var_gtr->nm) + "are unpredictable"); //(void)fprintf(stdout,"\n%s: WARNING Convolution not yet implemented, results of operation between %s and %s are unpredictable\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); /* Dimensions in convolution are union of dimensions in variables */ dmn_nbr=var_lsr->nbr_dim+var_gtr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr; /* Number of dimensions in convolution */ dmn_nbr+=0; /* CEWI */ /* fxm: these should go away soon */ var_lsr_out=nco_var_dpl(var_lsr); var_gtr_out=nco_var_dpl(var_gtr); /* for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){;} if(var_lsr_var_gtr_dmn_shr_nbr == 0); else; */ /* Free calling variables */ var_lsr=nco_var_free(var_lsr); var_gtr=nco_var_free(var_gtr); } /* endif STRETCH */ if(var_lsr_out == NULL_CEWI){ /* Expand lesser variable (var_lsr) to match size of greater variable */ char *var_lsr_cp; char *var_lsr_out_cp; int idx_var_lsr_var_gtr[NC_MAX_DIMS]; int var_lsr_nbr_dim; int var_gtr_nbr_dmn_m1; long *var_gtr_cnt; long dmn_ss[NC_MAX_DIMS]; long dmn_var_gtr_map[NC_MAX_DIMS]; long dmn_var_lsr_map[NC_MAX_DIMS]; long var_gtr_lmn; long var_lsr_lmn; long var_gtr_sz; size_t var_lsr_typ_sz; /* Copy main attributes of greater variable into lesser variable */ var_lsr_out=nco_var_dpl(var_gtr); (void)nco_xrf_var(var_lsr,var_lsr_out); /* Modify elements of lesser variable array */ var_lsr_out->nm=(char *)nco_free(var_lsr_out->nm); var_lsr_out->nm=(char *)strdup(var_lsr->nm); var_lsr_out->id=var_lsr->id; var_lsr_out->type=var_lsr->type; /* Added 20050323: Not quite sure why, but var->val.vp may already have values here when LHS-casting Perform safety free to guard against memory leaks */ var_lsr_out->val.vp=nco_free(var_lsr_out->val.vp); var_lsr_out->val.vp=(void *)nco_malloc_dbg(var_lsr_out->sz*nco_typ_lng(var_lsr_out->type),"Unable to malloc() value buffer in variable stretching",fnc_nm); var_lsr_cp=(char *)var_lsr->val.vp; var_lsr_out_cp=(char *)var_lsr_out->val.vp; var_lsr_typ_sz=nco_typ_lng(var_lsr_out->type); if(var_lsr_out->nbr_dim == 0){ /* Variables are scalars, not arrays */ (void)memcpy(var_lsr_out_cp,var_lsr_cp,var_lsr_typ_sz); }else if(var_lsr->nbr_dim == 0){ /* Lesser-ranked input variable is scalar Expansion in this degenerate case needs no index juggling (reverse-mapping) Code as special case to speed-up important applications of ncap for synthetic file creation */ var_gtr_sz=var_gtr->sz; for(var_gtr_lmn=0;var_gtr_lmnnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ if(!strcmp(var_gtr->dim[idx_dmn]->nm,var_lsr->dim[idx]->nm)){ idx_var_lsr_var_gtr[idx]=idx_dmn; /* idx_var_gtr_var_lsr[idx_dmn]=idx;*/ break; } /* end if */ /* Sanity check */ if(idx_dmn == var_gtr->nbr_dim-1){ err_prn(fnc_nm,"var_lsr " + std::string(var_lsr->nm)+ " has dimension "+ std::string(var_lsr->dim[idx]->nm)+" but var_gtr " + std::string(var_gtr->nm)+ " does not deep in ncap_var_stretch."); //(void)fprintf(stdout,"%s: ERROR var_lsr %s has dimension %s but var_gtr %s does not deep in ncap_var_stretch()\n",nco_prg_nm_get(),var_lsr->nm,var_lsr->dim[idx]->nm,var_gtr->nm); //nco_exit(EXIT_FAILURE); } /* end if err */ } /* end loop over greater variable dimensions */ } /* end loop over lesser variable dimensions */ /* Figure out map for each dimension of greater variable */ for(idx=0;idxnbr_dim;idx++) dmn_var_gtr_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_var_gtr_map[idx]*=var_gtr->cnt[idx_dmn]; /* Figure out map for each dimension of lesser variable */ for(idx=0;idxnbr_dim;idx++) dmn_var_lsr_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_var_lsr_map[idx]*=var_lsr->cnt[idx_dmn]; /* Define convenience variables to avoid repetitive indirect addressing */ var_lsr_nbr_dim=var_lsr->nbr_dim; var_gtr_sz=var_gtr->sz; var_gtr_cnt=var_gtr->cnt; var_gtr_nbr_dmn_m1=var_gtr->nbr_dim-1; /* var_gtr_lmn is offset into 1-D array corresponding to N-D indices dmn_ss */ for(var_gtr_lmn=0;var_gtr_lmnnbr_dim >= (*var_2)->nbr_dim){ *var_1=var_gtr_out; /* [ptr] First variable */ *var_2=var_lsr_out; /* [ptr] Second variable */ }else{ *var_1=var_lsr_out; /* [ptr] First variable */ *var_2=var_gtr_out; /* [ptr] Second variable */ } /* endif */ /* Variables now conform */ return DO_CONFORM; } /* end ncap_var_stretch() */ nco_bool ncap_def_dim (std::string dmn_nm, long sz, bool bunlimited, /* true unlimited, false limited */ prs_cls *prs_arg) { const char fnc_nm[]="ncap_def_dim"; int is_rec_dmn=False; dmn_sct *dmn_nw; dmn_sct *dmn_in_e; dmn_sct *dmn_out_e; // Check if dimension already exists dmn_in_e=prs_arg->dmn_in_vtr.find(dmn_nm); dmn_out_e=prs_arg->dmn_out_vtr.find(dmn_nm); if(dmn_in_e !=NULL_CEWI || dmn_out_e !=NULL_CEWI ){ wrn_prn(fnc_nm,"dim \""+ dmn_nm + "\" - already exists in input/output."); return False; } is_rec_dmn= ( bunlimited==true ? True : False); /** hidden feature if size negative then this indicates a record dimension */ if(sz < 0){ sz=-sz; is_rec_dmn=True; } /* if( sz < 0 ){ std::ostringstream os; os<<"dim " << dmn_nm << "(size=" <nm=(char *)strdup(dmn_nm.c_str()); //dmn_nw->id=dmn_id; dmn_nw->nc_id=prs_arg->out_id; dmn_nw->xrf=NULL_CEWI; dmn_nw->val.vp=NULL_CEWI; dmn_nw->is_crd_dmn=False; dmn_nw->is_rec_dmn=is_rec_dmn; dmn_nw->sz=sz; dmn_nw->cnt=sz; dmn_nw->srt=0L; dmn_nw->end=sz-1; dmn_nw->srd=1L; // finally define dimension in output (void)nco_redef(prs_arg->out_id); (void)nco_dmn_dfn(prs_arg->fl_out,prs_arg->out_id,&dmn_nw,1); (void)nco_enddef(prs_arg->out_id); // Add dim to list (void)prs_arg->dmn_out_vtr.push_back(dmn_nw); return True; } nco_bool /* Returns True if shape of vars match (using cnt vectors) */ nco_shp_chk (var_sct* var1, var_sct* var2) { long idx; long nbr_rdmn1; long nbr_rdmn2; long srt1=0; long srt2=0; long nbr_cmp; /* Check sizes */ if( var1->sz != var2->sz) return False; nbr_rdmn1=var1->nbr_dim; nbr_rdmn2=var2->nbr_dim; /* skip leading 1D dims */ for(idx=0 ; idx < (nbr_rdmn1-1) ; idx++) if(var1->cnt[idx] == 1){ srt1++; continue; } else break; /* skip leading 1D dims */ for(idx=0 ; idx < (nbr_rdmn2-1) ; idx++) if(var2->cnt[idx] == 1){ srt2++; continue; }else break; /* check sizes again */ if(nbr_rdmn1-srt1 != nbr_rdmn2-srt2) return False; nbr_cmp=nbr_rdmn1-srt1; /* Now compare values */ for(idx=0;idxcnt[srt1++] != var2->cnt[srt2++]) break; if(idx==nbr_cmp) return True; else return False; } /* This file is generated in makefile from ncoParserTokenTypes.hpp */ #include "ncoEnumTokenTypes.hpp" var_sct * ncap_var_var_stc (var_sct *var1, var_sct *var2, int op) { static VarOp Vd; static VarOp Vf; static VarOp Vi; static VarOp Vs; static VarOp Vus; static VarOp Vui; static VarOp Vi64; static VarOp Vui64; static VarOp Vb; static VarOp Vub; static VarOp Vc; var_sct *var_ret=NULL_CEWI; //If var2 is null then we are dealing with a unary function if( var2 == NULL_CEWI) { switch (var1->type) { case NC_DOUBLE: var_ret=Vd.var_op(var1,op); break; case NC_FLOAT: var_ret=Vf.var_op(var1,op); break; case NC_INT: var_ret=Vi.var_op(var1,op); break; case NC_SHORT: var_ret=Vs.var_op(var1,op); break; case NC_USHORT: var_ret=Vus.var_op(var1,op); break; case NC_UINT: var_ret=Vui.var_op(var1,op); break; case NC_INT64: var_ret=Vi64.var_op(var1,op); break; case NC_UINT64: var_ret=Vui64.var_op(var1,op); break; case NC_BYTE: var_ret=Vb.var_op(var1,op); break; case NC_UBYTE: var_ret=Vub.var_op(var1,op); break; case NC_CHAR: var_ret=Vs.var_op(var1,op); break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } return var_ret; } switch (var1->type) { case NC_DOUBLE: var_ret=Vd.var_var_op(var1,var2,op); break; case NC_FLOAT: var_ret=Vf.var_var_op(var1,var2,op); break; case NC_INT:var_ret=Vi.var_var_op(var1,var2,op); break; case NC_SHORT: var_ret=Vs.var_var_op(var1,var2,op); break; case NC_USHORT: var_ret=Vus.var_var_op(var1,var2,op); break; case NC_UINT: var_ret=Vui.var_var_op(var1,var2,op); break; case NC_INT64: var_ret=Vi64.var_var_op(var1,var2,op); break; case NC_UINT64: var_ret=Vui64.var_var_op(var1,var2,op); break; case NC_BYTE: var_ret=Vb.var_var_op(var1,var2,op); break; case NC_UBYTE: var_ret=Vub.var_var_op(var1,var2,op); break; case NC_CHAR: break; /* Do nothing */ case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } return var_ret; } int /* [flg] true they conform */ ncap_var_att_cnf /* [fnc] Make vars/atts conform */ (var_sct *&var1, /* I [sct] Input variable structure */ var_sct *&var2) /* I [sct] Input variable structure */ { const char fnc_nm[]="ncap_var_att_cnf"; nco_bool vb1; nco_bool vb2; vb1 = ncap_var_is_att(var1); vb2 = ncap_var_is_att(var2); // var & var if( !vb1 && !vb2 ) { char *swp_nm; // (void)ncap_var_retype(var1,var2); // if hyperslabs then check they conform if( (var1->has_dpl_dmn ==-1 || var2->has_dpl_dmn==-1) && var1->sz >1 && var2->sz>1){ if(var1->sz != var2->sz) { std::ostringstream os; os<<"Hyperslabbed variable:"<nm <<" and variable:"<nm <<" have different number of elements, so cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } if( nco_shp_chk(var1,var2)==False){ std::ostringstream os; os<<"Hyperslabbed variable:"<nm <<" and variable:"<nm <<" have same number of elements, but different shapes."; wrn_prn(fnc_nm,os.str()); } }else{ (void)ncap_var_cnf_dmn(&var1,&var2); } // Bare numbers have name prefixed with"_" // for attribute propagation to work we need // to swap names about if first operand is a bare number // and second operand is a var if( (var1->nm[0]=='~') && (var2->nm[0]!='~') ){ swp_nm=var1->nm; var1->nm=var2->nm; var2->nm=swp_nm; } // var & att }else if( !vb1 && vb2 ){ // var2=nco_var_cnf_typ(var1->type,var2); if(var1->sz > 1 && var2->sz==1) (void)ncap_var_cnf_dmn(&var1,&var2); if(var1->sz != var2->sz) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and attribute:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } // att & var }else if( vb1 && !vb2){ var_sct *var_tmp; if(var2->sz > 1 && var1->sz==1) (void)ncap_att_stretch(var1,var2->sz); if(var1->sz != var2->sz){ std::ostringstream os; os<<"Cannot make attribute:"<nm <<" and variable:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } // turn att var1 into a variable; var_tmp=nco_var_dpl(var2); var_tmp->val.vp=nco_free(var_tmp->val.vp); var_tmp=nco_var_cnf_typ(var1->type,var_tmp); var_tmp->val.vp=var1->val.vp; var1->val.vp=(void*)NULL; nco_var_free(var1); var1=var_tmp; // att && att } else if (vb1 && vb2) { (void)ncap_var_retype(var1,var2); if( var1->sz ==1 && var2->sz >1) (void)ncap_att_stretch(var1,var2->sz); else if(var1->sz >1 && var2->sz==1) (void)ncap_att_stretch(var2,var1->sz); // Crash out if atts not equal size if(var1->sz != var2->sz) { std::ostringstream os; os<<"Cannot make attribute:"<nm <<" and attribute:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } } return True; } /* end ncap_var_att_cnf */ var_sct * /* O [sct] Result if ntl_scn true otherwize null */ ncap_var_att_arr_cnf( /* I [fnc] Make all of vars in array conform to each other */ bool ntl_scn, /* [flg] reurb dim with correct shape as ig op had happened */ var_sct ***var_arr, /* I/O [sct] Array of variables */ int sz) /* size of array */ { bool undef=false; int idx; int max_idx=0; int nbr_max_dim=0; for(idx=0 ; idxnbr_dim >nbr_max_dim ){ nbr_max_dim=(*var_arr[idx])->nbr_dim; max_idx=idx; } if((*var_arr[idx])->undefined ) undef=true; } if(ntl_scn) { if(undef) max_idx=-1; // delete var_sct's for(idx=0; idxnm,(*var_arr[idx])->nm); (void)ncap_var_att_cnf( *var_arr[max_idx],*var_arr[idx]); } return NULL; // fxm correct? csz 20090226 } /* end ncap_var_att_arr_cnf */ var_sct * ncap_var_att_cnf_ntl /* [fnc] determine resultant struct */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2) /* I [sct] Input variable structure containing second operand */ { nco_bool vb1; nco_bool vb2; vb1 = ncap_var_is_att(var1); vb2 = ncap_var_is_att(var2); // var & var if( !vb1 && !vb2 ) { if(var1->undefined ||var2->undefined){ var1->undefined=True; var2=nco_var_free(var2); return var1; } // Do variable conformance with empty variables if(var1->nbr_dim > var2->nbr_dim) { var2=nco_var_free(var2); return var1; }else{ var1=nco_var_free(var1); return var2; } } // var & att else if( !vb1 && vb2 ){ var2=nco_var_free(var2); return var1; } // att & var else if( vb1 && !vb2){ var1=nco_var_free(var1); return var2; } // att && att else if (vb1 && vb2) { if(var1->sz >= var2->sz) { var2=nco_var_free(var2); return var1; } else { var1=nco_var_free(var1); return var2; } } /* Should not reach end of this function */ nco_exit(EXIT_FAILURE); return var1; } /* ncap_var_att_cnf_ntl */ var_sct * /* O [sct] Sum of input variables (var1+var2) */ ncap_var_var_op /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op) /* Operation +-% */ { const char fnc_nm[]="ncap_var_var_op"; nco_bool vb1; nco_bool vb2; var_sct *var_ret=NULL_CEWI; // If initial scan than call up "shadow" function if(var1->val.vp == (void*)NULL ){ var_ret=ncap_var_var_op_ntl(var1,var2,op); return var_ret; } // If var2 is null then we are dealing with a unary function if( var2 == NULL_CEWI){ var_ret=ncap_var_var_stc(var1,var2,op); return var_ret; } // Deal with pwr_in fuction if( (op == CARET ) && nco_rth_prc_rnk(var1->type) < nco_rth_prc_rnk_float && nco_rth_prc_rnk(var2->type) < nco_rth_prc_rnk_float) var1=nco_var_cnf_typ((nc_type)NC_FLOAT,var1); //Deal with atan2 function if(op==ATAN2 ){ var1=nco_var_cnf_typ((nc_type)NC_DOUBLE,var1); var2=nco_var_cnf_typ((nc_type)NC_DOUBLE,var2); } vb1 = ncap_var_is_att(var1); vb2 = ncap_var_is_att(var2); // var & var if( !vb1 && !vb2 ) { char *swp_nm; (void)ncap_var_retype(var1,var2); // if hyperslabs then check they conform if( (var1->has_dpl_dmn ==-1 || var2->has_dpl_dmn==-1) && var1->sz >1 && var2->sz>1){ if(var1->sz != var2->sz) { std::ostringstream os; os<<"Hyperslabbed variable:"<nm <<" and variable:"<nm <<" have differnet number of elements, so cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } if( nco_shp_chk(var1,var2)==False){ std::ostringstream os; os<<"Hyperslabbed variable:"<nm <<" and variable:"<nm <<" have same number of elements, but different shapes."; wrn_prn(fnc_nm,os.str()); } }else{ (void)ncap_var_cnf_dmn(&var1,&var2); } // Bare numbers have name prefixed with"_" // for attribute propagation to work we need // to swap names about if first operand is a bare number // and second operand is a var if( (var1->nm[0]=='~') && (var2->nm[0]!='~') ){ swp_nm=var1->nm; var1->nm=var2->nm; var2->nm=swp_nm; } // force var1 & var2 share the same missing value // nb this function is expensive nco_mss_val_cnf(var1,var2); // var & att }else if( !vb1 && vb2 ){ var2=nco_var_cnf_typ(var1->type,var2); if(var1->sz > 1 && var2->sz==1) (void)ncap_var_cnf_dmn(&var1,&var2); if(var1->sz != var2->sz) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and attribute:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } // att & var }else if( vb1 && !vb2){ var_sct *var_swp; ptr_unn val_swp; // Used to swap values around var1=nco_var_cnf_typ(var2->type,var1); if(var2->sz > 1 && var1->sz==1) (void)ncap_var_cnf_dmn(&var1,&var2); if(var1->sz != var2->sz){ std::ostringstream os; os<<"Cannot make attribute:"<nm <<" and variable:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } // Swap values around in var1 and var2; val_swp=var1->val; var1->val=var2->val; var2->val=val_swp;; // Swap names about var_swp=var1; var1=var2; var2=var_swp; // att && att } else if (vb1 && vb2) { (void)ncap_var_retype(var1,var2); if( var1->sz ==1 && var2->sz >1) (void)ncap_att_stretch(var1,var2->sz); else if(var1->sz >1 && var2->sz==1) (void)ncap_att_stretch(var2,var1->sz); // Crash out if atts not equal size if(var1->sz != var2->sz) { std::ostringstream os; os<<"Cannot make attribute:"<nm <<" and attribute:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } } // Deal with pwr fuction ( nb pwr function can't be templated ) if(op== CARET){ var_ret=ncap_var_var_pwr(var1,var2); return var_ret; } // deal with mod function if(op==MOD){ var_ret=ncap_var_var_mod(var1,var2); return var_ret; } if(op==ATAN2){ var_ret=ncap_var_var_atan2(var1,var2); return var_ret; } var_ret=ncap_var_var_stc(var1,var2,op); var2=nco_var_free(var2); return var_ret; } var_sct * /* O [sct] Sum of input variables (var1+var2) INITIAL SCAN ONLY */ ncap_var_var_op_ntl /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op) /* Operation +-% */ { nco_bool vb1; nco_bool vb2; // If var2 is null then we are dealing with a unary function if(var2 == NULL_CEWI) return var1; // deal with pwr fuction if( (op == CARET ) && nco_rth_prc_rnk(var1->type) < nco_rth_prc_rnk_float && nco_rth_prc_rnk(var2->type) < nco_rth_prc_rnk_float) var1=nco_var_cnf_typ((nc_type)NC_FLOAT,var1); //Deal with atan2 function if(op==ATAN2 ){ var1=nco_var_cnf_typ((nc_type)NC_DOUBLE,var1); var2=nco_var_cnf_typ((nc_type)NC_DOUBLE,var2); } vb1 = ncap_var_is_att(var1); vb2 = ncap_var_is_att(var2); // var & var if( !vb1 && !vb2 ) { if(var1->undefined ||var2->undefined){ var1->undefined=True; var2=nco_var_free(var2); return var1; } (void)ncap_var_retype(var1,var2); // Do variable conformance with empty variables if(var1->nbr_dim > var2->nbr_dim) { var2=nco_var_free(var2); return var1; }else{ var1=nco_var_free(var1); return var2; } } // var & att else if( !vb1 && vb2 ){ var2=nco_var_free(var2); return var1; } // att & var else if( vb1 && !vb2){ var1=nco_var_free(var1); return var2; } // att && att else if (vb1 && vb2) { (void)ncap_var_retype(var1,var2); if(var1->sz >= var2->sz) { var2=nco_var_free(var2); return var1; } else { var1=nco_var_free(var1); return var2; } } /* Should not reach end of this function */ nco_exit(EXIT_FAILURE); return var1; } var_sct * /* O [sct] Sum of input variables (var1+var2) */ ncap_var_var_inc /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op, /* Deal with incremental operators i.e +=,-=,*=,/= */ bool bram, /* I [bool] If true make a RAM variable */ prs_cls *prs_arg) { const char fnc_nm[]="ncap_var_var_inc"; const char *cvar1; const char *cvar2; nco_bool vb1; nco_bool vb2; var_sct *var_ret=NULL_CEWI; vb1 = ncap_var_is_att(var1); // If initial Scan if(prs_arg->ntl_scn){ // deal with variable if(!vb1){ var_ret=nco_var_dpl(var1); (void)prs_arg->ncap_var_write(var1,bram); // deal with attribute }else{ var_ret=var1; } if(var2) var2=(var_sct*)nco_var_free(var2); return var_ret; } //Deal with unary functions first if(var2==NULL_CEWI){ if(op==INC||op==DEC){ var1=ncap_var_var_stc(var1,var2,op); var_ret=nco_var_dpl(var1); } if(op==POST_INC||op==POST_DEC){ var_ret=nco_var_dpl(var1); var1=ncap_var_var_stc(var1,var2,op); } if(!vb1){ (void)prs_arg->ncap_var_write(var1,bram); }else{ std::string sa(var1->nm); NcapVar *Nvar=new NcapVar(var1,sa); prs_arg->var_vtr.push_ow(Nvar); } return var_ret; } vb2 = ncap_var_is_att(var2); cvar1= vb1? "attribute" : "variable"; cvar2= vb2? "attribute" : "variable"; // var2 to type of var1 var2=nco_var_cnf_typ(var1->type,var2); // var & var if(!vb1 && !vb2) { nco_bool DO_CONFORM=True;; var_sct *var_tmp=NULL_CEWI; var_tmp=nco_var_cnf_dmn(var1,var2,var_tmp,True,&DO_CONFORM); if(var2 != var_tmp){ var2=nco_var_free(var2); var2=var_tmp; } if(DO_CONFORM==False) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and variable:"<nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } // att & var ,att & att } else { if(var1->sz > 1 && var2->sz==1) (void)ncap_att_stretch(var2,var1->sz); } if(var1->sz != var2->sz) { std::ostringstream os; os<<"Cannot make " << cvar1<<":"<nm <<" and " <nm <<" conform. So cannot perform arithmetic operation."; err_prn(fnc_nm,os.str()); } var1=ncap_var_var_stc(var1,var2,op); var_ret=nco_var_dpl(var1); // if LHS is a variable then write to disk if(!vb1){ prs_arg->ncap_var_write(var1,bram); }else{ // deal with attribute std::string sa(var1->nm); NcapVar *Nvar=new NcapVar(var1,sa); prs_arg->var_vtr.push_ow(Nvar); } var2=nco_var_free(var2); return var_ret; } bool /* O [flg] true if all var elemenst are true */ ncap_var_lgcl1 /* [fnc] calculate a aggregate bool value from a variable */ (var_sct* var) /* I [sct] input variable */ { int idx; int sz; nc_type type; bool bret=true; ptr_unn op1; // Convert to type SHORT var=nco_var_cnf_typ((nc_type)NC_SHORT,var); type=NC_SHORT; sz = var->sz; op1=var->val; /* Typecast pointer to values before access */ (void)cast_void_nctype(type,&op1); if(var->has_mss_val) (void)cast_void_nctype(type,&var->mss_val); if(!var->has_mss_val){ for(idx=0;idxmss_val.sp); for(idx=0;idxhas_mss_val) (void)cast_nctype_void(type,&var->mss_val); return bret; } bool /* O [flg] true if all var elemenst are true */ ncap_var_lgcl /* [fnc] calculate a aggregate bool value from a variable */ (var_sct* var) /* I [sct] input variable */ { int idx=0;; int sz; nc_type type; bool bret=true; ptr_unn op1; type=var->type; sz = var->sz; op1=var->val; /* Typecast pointer to values before access */ (void)cast_void_nctype(type,&op1); if(var->has_mss_val) (void)cast_void_nctype(type,&var->mss_val); if(!var->has_mss_val){ switch(type){ case NC_FLOAT: for(idx=0;idxhas_mss_val){ switch(type){ case NC_FLOAT: { float mss=var->mss_val.fp[0]; for(idx=0;idxmss_val.dp[0]; for(idx=0;idxmss_val.ip[0]; for(idx=0;idxmss_val.sp[0]; for(idx=0;idxmss_val.usp[0]; for(idx=0;idxmss_val.uip[0]; for(idx=0;idxmss_val.i64p[0]; for(idx=0;idxmss_val.i64p[0]; for(idx=0;idxmss_val.bp[0]; for(idx=0;idxmss_val.ubp[0]; for(idx=0;idxhas_mss_val) (void)cast_nctype_void(type,&var->mss_val); (void)cast_void_nctype(type,&op1); return bret; } var_sct* /* O [sct] casting variable has its own private dims */ ncap_cst_mk /* [fnc] create casting var from a list of dims */ (std::vector &str_vtr, /* I [sng] list of dimension subscripts */ prs_cls *prs_arg) { const char fnc_nm[]="ncap_cst_mk"; static const char * const tpl_nm="Internally generated template"; bool bdef=false; // int dmn_nbr; /* [nbr] Number of dimensions */ int idx; /* [idx] Counter */ const char *lst_nm; /* for dereferencing */ double val=1.0; /* [frc] Value of template */ var_sct *var=NULL_CEWI; /* [sct] Variable */ dmn_sct **dmn; /* [dmn] Dimension structure list */ dmn_sct *dmn_item; dmn_sct *dmn_new; dmn_nbr = str_vtr.size(); // sbs_lst=nco_lst_prs_2D(sbs_sng,sbs_dlm,&dmn_nbr); dmn=(dmn_sct **)nco_malloc(dmn_nbr*sizeof(dmn_sct *)); for(idx=0;idxdmn_out_vtr.find(lst_nm); if(dmn_item){ dmn[idx]=dmn_item; continue; } // Search dmn_in_vtr for dimension dmn_item=prs_arg->dmn_in_vtr.find(lst_nm); // die if not in list if(dmn_item == NULL_CEWI) { err_prn(fnc_nm,"Unrecognized dimension \""+std::string(lst_nm)+ "\"in LHS subscripts"); } if(!bdef) { #ifdef _OPENMP if(omp_in_parallel()) err_prn(fnc_nm,"Attempt to go into netCDF define mode while in OpenMP parallel mode"); #endif bdef=true; (void)nco_redef(prs_arg->out_id); } dmn_new=nco_dmn_dpl(dmn_item); // Define in output file (void)nco_dmn_dfn(prs_arg->fl_out,prs_arg->out_id,&dmn_new,1); // add to out list (void)prs_arg->dmn_out_vtr.push_back(dmn_new); (void)nco_dmn_xrf(dmn_new,dmn_item); dmn[idx]=dmn_new; } if(bdef) (void)nco_enddef(prs_arg->out_id); /* Check that un-limited dimension is first dimension for netcdf3 files only */ if( prs_arg->fl_out_fmt != NC_FORMAT_NETCDF4 ){ for(idx=1;idxis_rec_dmn){ wrn_prn(fnc_nm,"\""+std::string(dmn[idx]->nm)+"\" is the record dimension. It must be the first dimension in a list***"); goto end_LHS_sbs; } /* endif */ } /* Create template variable to cast all RHS expressions */ var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* [fnc] Set defaults for each member of variable structure */ /* Overwrite with LHS information */ /* fxm mmr: memory leak with var->nm */ var->nm=(char *)strdup(tpl_nm); var->nm_fll=NULL; var->type=NC_DOUBLE; var->nbr_dim=dmn_nbr; var->dim=dmn; /* Allocate space for dimension structures */ if(var->nbr_dim > 0) var->dmn_id=(int *)nco_malloc(var->nbr_dim*sizeof(int)); else var->dmn_id=(int *)NULL; if(var->nbr_dim > 0) var->cnt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->cnt=(long *)NULL; if(var->nbr_dim > 0) var->srt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srt=(long *)NULL; if(var->nbr_dim > 0) var->end=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->end=(long *)NULL; if(var->nbr_dim > 0) var->srd=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srd=(long *)NULL; if(var->nbr_dim > 0) var->cnk_sz=(size_t *)nco_malloc(var->nbr_dim*sizeof(size_t)); else var->cnk_sz=(size_t *)NULL; /* Defensive programming */ var->sz=1L; /* Attach LHS dimensions to variable */ for(idx=0;idxcnk_sz[idx]=(size_t)0; var->dim[idx]=dmn[idx]; var->dmn_id[idx]=dmn[idx]->id; var->cnt[idx]=dmn[idx]->cnt; var->srt[idx]=dmn[idx]->srt; var->end[idx]=dmn[idx]->end; var->srd[idx]=dmn[idx]->srd; var->sz*=var->cnt[idx]; } /* end loop over dim */ /* NOTE VERY IMPORTANT 27-01-2009 */ /* var->val.vp is never used in an initial or final scan So we can safely set it to null here and get an immediate performance boost */ var->val.vp=(void*)NULL; goto end_var; /* Do not initialize val in initial scan */ if(prs_arg->ntl_scn) { var->val.vp=(void*)NULL; goto end_var; } /* Allocate space for variable values fxm: more efficient and safer to use nco_calloc() and not fill with values? */ var->val.vp=(void *)nco_malloc_flg(var->sz*nco_typ_lng(var->type)); /* Copy arbitrary value into variable Placing a uniform value in variable should be unnecessary since variable is intended for use solely as dimensional template for nco_var_cnf_dmn() Nevertheless, copy 1.0 into value for safety */ { /* Change scope to define convenience variables which reduce de-referencing */ long var_sz; /* [nbr] Number of elements in variable */ size_t var_typ_sz; /* [B] Size of single element of variable */ char *var_val_cp; /* [ptr] Pointer to values */ var_sz=var->sz; /* [nbr] Number of elements in variable */ var_typ_sz=nco_typ_lng(var->type); var_val_cp=(char *)var->val.vp; for(idx=0;idx= nco_dbg_scl) { std::ostringstream os; os<<"creating LHS cast template var->nm " <nm <<" var->nbr_dim " <nbr_dim <<" var->sz " <sz; wrn_prn(fnc_nm,os.str()); } /* Free dimension list memory */ end_LHS_sbs: /* Errors encountered during LHS processing jump to here */ /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ return var; } // end ncap_cst_mk var_sct* ncap_cst_do( var_sct* var, var_sct* var_cst, bool bntlscn) { const char fnc_nm[]="ncap_cst_do"; var_sct* var_tmp; if(bntlscn) { var_tmp=nco_var_dpl(var_cst); var_tmp->id=var->id; var_tmp->nm=(char*)nco_free(var_tmp->nm); var_tmp->nm=strdup(var->nm); var_tmp->type=var->type; var_tmp->typ_dsk=var->typ_dsk; var_tmp->undefined=False; var_tmp->val.vp=(void*)NULL; var=nco_var_free(var); var=var_tmp; }else{ /* User intends LHS to cast RHS to same dimensionality Stretch newly initialized variable to size of LHS template */ var_tmp=var; (void)ncap_var_stretch(&var_tmp,&var_cst); if(var_tmp != var) { var=nco_var_free(var); var=var_tmp; } if(nco_dbg_lvl_get() >= nco_dbg_scl){ std::ostringstream os; os<<"Stretching variable "<nm << "with LHS template var->nm "<nm <<"var->nbr_dim " <nbr_dim; os<<" var->sz " <sz; wrn_prn(fnc_nm,os.str()); } var->undefined=False; } return var; } // Return true if string is only made of 0..9 chars bool str_is_nbr (std::string snm) { unsigned idx; for(idx=0 ; idx < snm.size(); idx++) if(!isdigit(snm[idx])) break; return (idx==snm.size() ? true: false); } NcapVector /* O [sct] list of new dims to limit over */ ncap_dmn_mtd (var_sct *var, /* I [sct] var with list of dims */ std::vector &str_vtr) /* I [sng] list of dimension names */ { int idx; int jdx; int icnt; int nbr_dim=var->nbr_dim; int str_vtr_sz; NcapVector dmn_vtr; str_vtr_sz=str_vtr.size(); for(idx=0 ; idx dim[icnt]->nm)) dmn_vtr.push_back( var->dim[icnt]); }else{ // deal with regular dim names for(jdx=0 ; jdx < nbr_dim ; jdx++) if( str_vtr[idx]== std::string(var->dim[jdx]->nm)) break; if(jdx dim[jdx]); } } // end loop return dmn_vtr; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nc_type type, bool bfll) { /* Purpose: Create a scalar variable of type, if bfll then malloc ptr_unn */ var_sct *var; var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* Overwrite with variable expression information */ var->nm=strdup(var_nm.c_str()); var->nbr_dim=0; var->sz=1; var->type=type; var->typ_dsk=type; if(bfll) var->val=nco_mss_val_mk(type); return var; } // end ncap_sclr_var_mk() var_sct * ncap_sclr_var_mk (const std::string var_nm, float val_float) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_FLOAT,true); (void)cast_void_nctype((nc_type)NC_FLOAT,&var->val); *var->val.fp=val_float; (void)cast_nctype_void((nc_type)NC_FLOAT,&var->val); return var; } // end ncap_sclr_var_mk() var_sct * ncap_sclr_var_mk (const std::string var_nm, double val_double) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_DOUBLE,true); (void)cast_void_nctype((nc_type)NC_DOUBLE,&var->val); *var->val.dp=val_double; (void)cast_nctype_void((nc_type)NC_DOUBLE,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_int val_int) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_INT,true); (void)cast_void_nctype((nc_type)NC_INT,&var->val); *var->val.ip=val_int; (void)cast_nctype_void((nc_type)NC_INT,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_short val_short) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_SHORT,true); (void)cast_void_nctype((nc_type)NC_SHORT,&var->val); *var->val.sp=val_short; (void)cast_nctype_void((nc_type)NC_SHORT,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_char val_char) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_CHAR,true); (void)cast_void_nctype((nc_type)NC_CHAR,&var->val); *var->val.cp=val_char; (void)cast_nctype_void((nc_type)NC_CHAR,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_byte val_byte) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_BYTE,true); (void)cast_void_nctype((nc_type)NC_BYTE,&var->val); *var->val.bp=val_byte; (void)cast_nctype_void((nc_type)NC_BYTE,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_ubyte val_ubyte) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_UBYTE,true); (void)cast_void_nctype((nc_type)NC_UBYTE,&var->val); *var->val.ubp=val_ubyte; (void)cast_nctype_void((nc_type)NC_UBYTE,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_ushort val_ushort) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_USHORT,true); (void)cast_void_nctype((nc_type)NC_USHORT,&var->val); *var->val.usp=val_ushort; (void)cast_nctype_void((nc_type)NC_USHORT,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_uint val_uint) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_UINT,true); (void)cast_void_nctype((nc_type)NC_UINT,&var->val); *var->val.uip=val_uint; (void)cast_nctype_void((nc_type)NC_UINT,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_int64 val_int64) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_INT64,true); (void)cast_void_nctype((nc_type)NC_INT64,&var->val); *var->val.i64p=val_int64; (void)cast_nctype_void((nc_type)NC_INT64,&var->val); return var; } var_sct * ncap_sclr_var_mk (const std::string var_nm, nco_uint64 val_uint64) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_UINT64,true); (void)cast_void_nctype((nc_type)NC_UINT64,&var->val); *var->val.ui64p=val_uint64; (void)cast_nctype_void((nc_type)NC_UINT64,&var->val); return var; } /* fxm: Allow ncap2 to instantiate NC_STRINGs var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_string val_string) { var_sct *var; var=ncap_sclr_var_mk(var_nm,(nc_type)NC_STRING,true); (void)cast_void_nctype((nc_type)NC_STRING,&var->val); *var->val.sngp=val_string; (void)cast_nctype_void((nc_type)NC_STRING,&var->val); return var; } */ // Do an in-memory hyperslab !! void ncap_get_var_mem (int dpt, // Current depth int dpt_max, // Max depth ( same as number of dims) std::vector &shp_vtr, // shape of input var (in bytes) NcapVector &dmn_vtr, // New vectors var_sct* var_in, long nbr_lpp, char *cp_in, // Pointer to (char*)var_in->val.vp char *&cp_out){ // Reference pointer to space for new var values const std::string fnc_nm("ncap_get_var_mem"); long idx; long jdx; long srt=dmn_vtr[dpt]->srt; long end=dmn_vtr[dpt]->end; long cnt=dmn_vtr[dpt]->cnt; long srd=dmn_vtr[dpt]->srd; long slb_sz=shp_vtr[dpt]; long dpt_cnt=var_in->dim[dpt]->cnt;; char *cp_srt=cp_in+ptrdiff_t(srt*slb_sz); char *cp_lcl; if(nco_dbg_lvl_get() >= nco_dbg_scl){ std::ostringstream os; os<<"Depth=" << dpt<<" "<nm<<" "<1) { for(jdx=0 ; jdx 1 if(srd>1) { for(jdx=0; jdx &dmn_vtr){ int idx; int ncnt; int dmn_nbr; int dpt_max; void *vp_out; char *cp_out; char *cp_in; std::vector shp_vtr; dmn_nbr=var_in->nbr_dim; ncnt=nco_typ_lng(var_in->type); // Create shape vector for var_in shp_vtr.push_back(ncnt); for(idx=dmn_nbr-1 ; idx>0 ; idx--){ ncnt*=var_in->dim[idx]->cnt; shp_vtr.push_back(ncnt); } // Reverse vector std::reverse(shp_vtr.begin(),shp_vtr.end() ); // Find space for output data ncnt=1; for(idx=0 ;idx < dmn_nbr ; idx++) ncnt*=dmn_vtr[idx]->cnt; // Do nothing if whole slab is specified if(var_in->sz == ncnt) return; // Alloc space for output variables value vp_out=(void*)nco_malloc(ncnt*nco_typ_lng(var_in->type)); cp_out=(char*)vp_out; cp_in=(char*)var_in->val.vp; // Work out max depth we have to go to dpt_max=dmn_nbr; for(idx=dmn_nbr-1; idx>0 ; idx--) if( var_in->dim[idx]->cnt == dmn_vtr[idx]->cnt) dpt_max--; else break; // Call in-memory nco_get_var() (n.b is recursive of course!!) (void)ncap_get_var_mem(0,dpt_max-1,shp_vtr,dmn_vtr,var_in,1L,cp_in,cp_out); var_in->sz=ncnt; (void)nco_free(var_in->val.vp); var_in->val.vp=vp_out; } /* end nco_get_var_mem() */ void ncap_put_var_mem (int dpt, // Current int dpt_max, // Max depth ( same as number of dims) std::vector &shp_vtr, // shape of input var (in bytes) NcapVector &dmn_vtr, // New vectors var_sct* var_out, // needed long nbr_lpp, // number of iterations char *&cp_in, // Pointer to (char*)var_in->val.vp char *cp_out) // Slab to be "put" { const std::string fnc_nm("ncap_put_var_mem"); long idx; long jdx; long srt=dmn_vtr[dpt]->srt; long end=dmn_vtr[dpt]->end; long cnt=dmn_vtr[dpt]->cnt; long srd=dmn_vtr[dpt]->srd; long slb_sz=shp_vtr[dpt]; long dpt_out=var_out->dim[dpt]->cnt; //char *cp_end=cp_out+ptrdiff_t(srt*slb_sz);; char *cp_end; if(nco_dbg_lvl_get() >= nco_dbg_scl){ std::ostringstream os; os<<"Depth=" << dpt<<" "<nm<<" "<getFirstChild(); // examine all child nodes while(tr){ if( ncap_fnc_srh(tr) ) return true; tr=tr->getNextSibling(); } return false; } /*********************************************************************************/ /* Following - all MPI optimization routines */ /*********************************************************************************/ // See if any VAR_ID/ATT_ID match any in str_vtr // if so return true bool ncap_mpi_srh_str (RefAST ntr, std::vector &str_vtr) { RefAST tr=ntr->getFirstChild(); if(ntr->getType()== VAR_ID || ntr->getType() == ATT_ID ) // see if ID is in vector if(std::binary_search(str_vtr.begin(),str_vtr.end(),ntr->getText())) return true; /* if(ntr->getType()== VAR_ID || ntr->getType() == ATT_ID ){ for(int idx=0 ; idxgetText() == str_vtr[idx]) return true; } */ // examine all child nodes while(tr){ if(ncap_mpi_srh_str(tr,str_vtr)) return true; tr=tr->getNextSibling(); } return false; } // Subtract matching elements of // one list of strings from another bool ncap_sub_str_str (std::vector &in_vtr, std::vector &mb_vtr) { unsigned int idx; unsigned int jdx; unsigned int nbr_mb=mb_vtr.size(); std::vector out_vtr; if(mb_vtr.size()==0) return false; for(idx=0 ; idx < in_vtr.size() ; idx++){ for(jdx=0 ; jdx < nbr_mb; jdx++) if( in_vtr[idx]== mb_vtr[jdx]) break; if(jdx==nbr_mb) out_vtr.push_back(in_vtr[idx]); } // no change if(in_vtr.size()==out_vtr.size()) return false; // some elements subtracted in_vtr.swap(out_vtr); return true; /* in_vtr.clear(); for(idx=0 ; idx &str_vtr) { RefAST tr=ntr->getFirstChild(); if(ntr->getType()== VAR_ID || ntr->getType() == ATT_ID ) str_vtr.push_back(ntr->getText()); // examine all child nodes while(tr){ (void)ncap_mpi_get_id(tr,str_vtr); tr=tr->getNextSibling(); } } //Extract all LValues from Expression void ncap_mpi_get_lvl (RefAST ntr, std::vector &str_vtr) { RefAST tr=ntr->getFirstChild(); switch(ntr->getType()){ case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: str_vtr.push_back(tr->getText()); (void)ncap_mpi_get_lvl(tr->getNextSibling(),str_vtr); break; case ASSIGN: // Grab text from first element in assign ie. text for VAR_ID or ATT_ID str_vtr.push_back(tr->getText()); // Check child for LValues in LMT_LIST (void)ncap_mpi_get_lvl(tr,str_vtr); // Process RHS of equal sign (void)ncap_mpi_get_lvl(tr->getNextSibling(),str_vtr); break; // All these unary ops are Gauranteed to only // contain VAR_ID or ATT_ID !! no need to error // check case INC: case DEC: case POST_INC: case POST_DEC: case CALL_REF: str_vtr.push_back(tr->getText()); break; default: while(tr){ (void)ncap_mpi_get_lvl(tr,str_vtr); tr=tr->getNextSibling(); } break; } } // ncap_mpi_get_lvl bool ncap_evl_srp (std::vector &srp_vtr) //self reverential pointer { unsigned int idx; if(srp_vtr.empty()) return true; for(idx=0;idx > &all_ast_vtr, prs_cls *prs_arg) { const std::string fnc_nm("ncap_mpi_srt"); int idx; int jdx; RefAST tr; exp_sct *exp_ptr; std::vector exp_vtr; // populate exp_vtr; if(nco_dbg_lvl_get() >= nco_dbg_std) dbg_prn(fnc_nm,"Start"); idx=0; tr=ntr; while(idx++ cl_vtr; exp_ptr=new exp_sct(); // Initialise structure with AST and Lvalues //exp_ptr->etr=tr->getFirstChild(); exp_ptr->etr=tr; (void)ncap_mpi_get_lvl(tr->getFirstChild(),cl_vtr); //Sort Lvalues for speed std::sort(cl_vtr.begin(), cl_vtr.end()); // remove any duplicates cl_vtr.erase(std::unique(cl_vtr.begin(), cl_vtr.end()),cl_vtr.end()); exp_ptr->lvl_vtr=cl_vtr; exp_vtr.push_back(exp_ptr); tr=tr->getNextSibling(); } // Populate dependency vector for(idx=0 ; idx < nbr_lst ;idx++) { // initialize local vars exp_ptr=exp_vtr[idx]; // need a local copy of Lvalues // will subtract strings from this as we go through // the inner loop std::vector out_vtr=exp_ptr->lvl_vtr; // expression without Lvalues if(out_vtr.empty()) continue; //Inner loop for(jdx=(idx+1); jdx< nbr_lst ; jdx++){ // See if inner-loop exprssion depends // on outer-loop expression if( ncap_mpi_srh_str(exp_ptr->etr, exp_vtr[jdx]->lvl_vtr) || ncap_mpi_srh_str(exp_vtr[jdx]->etr,out_vtr)) { exp_vtr[jdx]->dpd_vtr.push_back(idx); exp_vtr[jdx]->srp_vtr.push_back( &exp_vtr[idx]); // Subtract strings from out_vtr that are are also in exp_vtr[jdx]->lvl_vtr out_vtr.erase( std::set_difference( out_vtr.begin(),out_vtr.end(), exp_vtr[jdx]->lvl_vtr.begin(),exp_vtr[jdx]->lvl_vtr.end(), out_vtr.begin() ), out_vtr.end() ); } // break out of inner loop if out_lvl_vtr empty if(out_vtr.empty()) break ; } // loop jdx } // loop idx // print out whole structure /* for(idx=0; idxetr->toStringTree(); std::cout <<"\n Lvalues "; for(int jdx=0 ; jdx < exp_ptr->lvl_vtr.size() ; jdx++) std::cout << exp_ptr->lvl_vtr[jdx] <<" "; std::cout <<"\n Dependency "; for(int jdx=0 ; jdx < exp_ptr->dpd_vtr.size() ; jdx++) std::cout << exp_ptr->dpd_vtr[jdx] <<" "; std::cout<<"\n"; } */ int icnt=0; while(icnt ast_vtr; // Expressions -all lvalues defined in O std::vector ast_no_vtr; // Expressions with an Lvalue(s) not defined in O std::vector grp_vtr; for(idx=0; idx srp_vtr)) grp_vtr.push_back(idx); }// end idx for(idx=0 ; idx <(int)grp_vtr.size(); idx++){ // Check for any Lvalues NOT in output std::vector out_lvl_vtr=exp_vtr[grp_vtr[idx]]->lvl_vtr; int nbr_lvl=(int)out_lvl_vtr.size(); for(jdx=0 ; jdx var_vtr.find(out_lvl_vtr[jdx]) == NULL ) break; if(jdx==nbr_lvl) ast_vtr.push_back( exp_vtr[grp_vtr[idx]]->etr); else ast_no_vtr.push_back( exp_vtr[grp_vtr[idx]]->etr); delete exp_vtr[grp_vtr[idx]]; exp_vtr[grp_vtr[idx]]=NULL; } //end idx // Save vectors in another vector !! all_ast_vtr.push_back(ast_no_vtr); all_ast_vtr.push_back(ast_vtr); icnt+=(int)grp_vtr.size(); } // end while //Print out vectors if(nco_dbg_lvl_get() >0) { for(idx=0 ; idx<(int)all_ast_vtr.size(); idx++){ for(jdx=0 ; jdx<(int)all_ast_vtr[idx].size(); jdx++) std::cout << all_ast_vtr[idx][jdx]->toStringTree()<= nco_dbg_std) dbg_prn(fnc_nm,"End"); return 0; } nco-4.5.4/src/nco++/ncap2_utl.hh000066400000000000000000000276721264355130400162300ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor definitions and function prototypes for ncap.c, ncap_utl.c, ncap_lex.l, and ncap_yacc.y */ /* Copyright (C) 1995--2014 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You can redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "ncap.h" *//* netCDF arithmetic processor-specific definitions (symbol table, ...) */ #ifndef NCAP2_UTL_HH /* Header file has not yet been defined in current source file */ #define NCAP2_UTL_HH #ifdef HAVE_CONFIG_H #include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp. . . */ #include /* machine time */ #ifndef _MSC_VER #include /* POSIX stuff */ #endif #if !(defined __xlC__) && !(defined SGIMP64) // C++ compilers that do not allow stdint.h #include // Required by g++ for LLONG_MAX, ULLONG_MAX, by icpc for int64_t #endif // C++ compilers that do not allow stdint.h #include #include // sin cos cos sin 3.14159 #include // Standard C++ headers #include #include #include #include /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for libnetcdf.a */ #include /* nneeded for ast_ind struct */ #include "ncoParserTokenTypes.hpp" /* Personal headers */ #include "libnco.h" /* netCDF Operator (NCO) library */ #include "ncap2.hh" #include "NcapVector.hh" #include "NcapVarVector.hh" #include "NcapVar.hh" #include "sdo_utl.hh" #include "VarOp.hh" #include "prs_cls.hh" /* Don't know what Charlies done to the bools */ /* Temporary fix for now !!*/ #define nco_bool int // Compress code a little #define SCS(x) static_cast(x) /* Used to do an pre-mpi sort */ typedef struct exp_sct_tag { ANTLR_USE_NAMESPACE(antlr)RefAST etr; std::vector lvl_vtr; // lvalues std::vector dpd_vtr; // dependencies std::vector srp_vtr; //self reverential pointer } exp_sct ; /* Begin funtions in ncap2_utl.cc */ var_sct* /* O [sct] variable containing attribute */ ncap_att_get /* [fnc] Grab an attribute from input file */ (int var_id, /* I var id */ const char *var_nm, /* I [sng] var name */ const char *att_nm, /* I [sng] att name */ int location, /* I [flg] 1 - att from INPUT file 2 - att from OUTPUT file */ prs_cls *prs_arg); /* I/O vectors of atts & vars & file names */ var_sct * /* O [sct] variable containing attribute */ ncap_att_init( /* [fnc] Grab an attribute from input file */ std::string va_nm, /* I [sng] att name of form var_nm&att_nm */ prs_cls *prs_arg); /* I/O vectors of atts & vars & file names */ int ncap_att_gnrl (const std::string s_dst, const std::string s_src, int location, /* I [flg] 1 - att from INPUT file 2 - att from OUTPUT file */ prs_cls *prs_arg); nco_bool /* O [flg] true if var has been stretched */ ncap_att_stretch /* stretch a single valued attribute from 1 to sz */ (var_sct* var, /* I/O [sct] variable */ long nw_sz); /* I [nbr] new var size */ var_sct * /* initialize var to defaults & undefined to true */ ncap_var_udf (const char *var_nm); int ncap_att_cpy_sct (var_sct *var1, var_sct *var2, prs_cls *prs_arg); int ncap_att_cpy (const std::string s_dst, const std::string s_src, prs_cls *prs_arg); void ncap_att_prn (var_sct *var, char *const att_in_sng); int /* number appended */ ncap_att_str /* extract string(s) from a NC_CHAR or NC_STRING type attribute */ (var_sct *var_att, /* I [sct] input attribute */ std::vector &str_vtr); var_sct * /* O [sct] Remainder of modulo operation of input variables (var_1%var_2) */ ncap_var_var_mod /* [fnc] Remainder (modulo) operation of two variables */ (var_sct *var_1, /* I [sc,t] Variable structure containing field */ var_sct *var_2); /* I [sct] Variable structure containing divisor */ var_sct * /* O [sct] Empowerment of input variables (var_1^var_2) */ ncap_var_var_pwr /* [fnc] Empowerment of two variables */ (var_sct *var_1, /* I [sct] Variable structure containing base */ var_sct *var_2); /* I [sct] Variable structure containing exponent */ var_sct * /* O [sct] Calculate atan2(Y,X) for each element */ ncap_var_var_atan2 (var_sct *var1, /* I [sct] Variable structure containing Y */ var_sct *var2); /* I [sct] Variable structure containing X */ void ncap_lmt_evl( int nc_id, lmt_sct* lmt_ptr, prs_cls *prs_arg); var_sct* ncap_var_fnc( var_sct* var_in, double(*fnc_dbl)(double), float(*fnc_flt)(float)); var_sct * /* O [sct] Resultant variable (actually is var) */ ncap_var_abs( /* Purpose: Find absolute value of each element of var */ var_sct *var); /* I/O [sct] input variable */ nm_id_sct * /* O [sct] new copy of xtr_lst */ nco_var_lst_copy( /* [fnc] Purpose: Copy xtr_lst and return new list */ nm_id_sct *xtr_lst, /* I [sct] input list */ int lst_nbr); /* I [nbr] number of elements in list */ nm_id_sct * /* O [sct] New list */ nco_var_lst_sub( /* [fnc] subract elements of lst_b from )lst */ nm_id_sct *xtr_lst, /* I [sct] input list */ int *nbr_xtr, /* I/O [ptr] size of xtr_lst and new list */ nm_id_sct *xtr_lst_b, /* I [sct] list to be subtracted */ int nbr_lst_b); /* I [nbr] size eof xtr_lst_b */ nm_id_sct * /* O [sct] -- new list */ nco_var_lst_add( /* [fnc] add elemenst of lst_a to lst */ nm_id_sct *xtr_lst, /* I [sct] input list */ int *nbr_xtr, /* I/O [ptr] -- size of xtr_lst & new output list */ nm_id_sct *xtr_lst_a, /* I [sct] list of elemenst to be added to new list */ int nbr_lst_a); /* I [nbr] size of xtr_lst_a */ nm_id_sct * /* O [sct] List of dimensions associated with input variable list */ nco_dmn_lst /* [fnc] Create list of all dimensions in file */ (const int nc_id, /* I [id] netCDF input-file ID */ int * const nbr_dmn); /* O [nbr] Number of dimensions in list */ nm_id_sct * /* O [sct] output list */ nco_att_lst_mk (const int in_id, /* I [id] of input file */ const int out_id, /* I [id] id of output file */ NcapVarVector &var_vtr, /* I [vec] vector of vars & att */ int *nbr_lst); /* O [ptr] size of output list */ nco_bool ncap_def_dim( std::string dmn_nm, long sz, bool ltype, prs_cls *prs_arg); nco_bool /* O [flg] Variables now conform */ ncap_var_stretch /* [fnc] Stretch variables */ (var_sct **var_1, /* I/O [ptr] First variable */ var_sct **var_2); /* I/O [ptr] Second variable */ int /* [flg] true they conform */ ncap_var_att_cnf /* [fnc] Make vars/atts conform */ (var_sct *&var1, /* I [sct] Input variable structure */ var_sct *&var2 /* I [sct] Input variable structure */ ); var_sct * /* O [sct] Result if ntl_scn true otherwize null */ ncap_var_att_arr_cnf( /* I [fnc] Make all of vars in array conform to each other */ bool ntl_scn, var_sct ***var_arr, /* I/O [sct] Array of variables */ int sz); /* size of array */ var_sct * /* O [sct] Result var_sct as if binary op had taken place */ ncap_var_att_cnf_ntl /* [fnc] determine resultant struct */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2 /* I [sct] Input variable structure containing second operand */ ); var_sct * /* O Result of variable operation */ ncap_var_var_stc (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op); var_sct * /* O [sct] Sum of input variables (var1+var2) */ ncap_var_var_op /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op); /* Operation +-% */ var_sct * /* O [sct] Sum of input variables (var1+var2) */ ncap_var_var_inc /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op, /* Deal with incremental operators i.e +=,-=,*=,/= */ bool bram, /* I [flg] Make a RAM variable */ prs_cls *prs_arg); var_sct * /* O [sct] Sum of input variables (var1+var2) INITIAL SCAN ONLY */ ncap_var_var_op_ntl /* [fnc] Add two variables */ (var_sct *var1, /* I [sct] Input variable structure containing first operand */ var_sct *var2, /* I [sct] Input variable structure containing second operand */ int op); /* Operation +-% */ bool /* O [flg] true if all var elemenst are true */ ncap_var_lgcl /* [fnc] calculate a aggregate bool value from a variable */ (var_sct* var); /* I [sct] input variable */ var_sct* /* O [sct] casting variable has its own private dims */ ncap_cst_mk( /* [fnc] create casting var from a list of dims */ std::vector &str_vtr, /* I [sng] list of dimension subscripts */ prs_cls *prs_arg); var_sct* ncap_cst_do( var_sct* var, var_sct* var_cst, bool bntlscn); /* End funtions in ncap_utl.c */ /* Let function live here for now */ nco_bool /* Returns True if shape of vars match (using cnt vectors */ nco_shp_chk( var_sct* var1, var_sct* var2); nco_bool /* Reurns True if var has attribute style name */ ncap_var_is_att( var_sct *var); bool /* Returns true if expression contains a utility fuction */ ncap_fnc_srh( RefAST ntr ); void ncap_mpi_get_id /* Extract all VAR_ID & ATT_ID from an Expression */ ( RefAST ntr, std::vector &str_vtr); int /* Sort expressions for MPI Optimization */ ncap_mpi_srt( RefAST ntr, int icnt, std::vector< std::vector > &all_ast_vtr, // Return a Vector of Vectors prs_cls *prs_arg); NcapVector /* O [sct] list of new dims to limit over */ ncap_dmn_mtd( var_sct *var, /* [sct] create casting var from a list of dims */ std::vector &str_vtr); /* I [sng] list of dimension names */ // ncap_sclr_var_mk() overloads /* Create a scalar variable of type, if bfill then malloc ptr_unn */ var_sct* ncap_sclr_var_mk( const std::string var_nm, nc_type type, //bool bfll=false); fxm csz bool bfll); var_sct * ncap_sclr_var_mk( const std::string var_nm, float val_float); var_sct * ncap_sclr_var_mk( const std::string var_nm, double val_double); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_int val_int); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_short val_short); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_char val_char); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_byte val_byte); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_ubyte val_ubyte); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_ushort val_ushort); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_uint val_uint); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_int64 val_int64); var_sct * ncap_sclr_var_mk( const std::string var_nm, nco_uint64 val_uint64); // end ncap_sclr_var_mk() overloads void nco_get_var_mem( var_sct *var_rhs, NcapVector &dmn_vtr); void nco_put_var_mem( var_sct *var_in, var_sct *var_nw, NcapVector &lmt_vtr); #endif /* NCAP2_UTL_HH */ nco-4.5.4/src/nco++/ncoEnumTokenTypes.hpp000066400000000000000000000040071264355130400201460ustar00rootroot00000000000000#ifndef INC_ncoEnumTokenTypes_hpp_ #define INC_ncoEnumTokenTypes_hpp_ /* $ANTLR 2.7.7 (2006-11-01): "ncoGrammer.g" -> "ncoEnumTokenTypes.hpp"$ */ #ifndef CUSTOM_API # define CUSTOM_API #endif enum { EOF_ = 1, NULL_NODE = 4, BLOCK = 5, ARG_LIST = 6, DMN_LIST = 7, DMN_LIST_P = 8, DMN_ARG_LIST = 9, LMT_LIST = 10, VALUE_LIST = 11, FUNC_ARG = 12, LMT = 13, EXPR = 14, FEXPR = 15, POST_INC = 16, POST_DEC = 17, UTIMES = 18, PROP = 19, FOR2 = 20, NORET = 21, ATAN2 = 22, WHERE_ASSIGN = 23, MISS2ZERO = 24, VSORT = 25, VRSORT = 26, VABS = 27, VSQR2 = 28, DEFDIM = 29, SEMI = 30, DEFDIMA = 31, DEFDIMU = 32, LPAREN = 33, NSTRING = 34, COMMA = 35, RPAREN = 36, WHILE = 37, BREAK = 38, CONTINUE = 39, IF = 40, ELSE = 41, WHERE = 42, ELSEWHERE = 43, PRINT = 44, VAR_ID = 45, ATT_ID = 46, LCURL = 47, RCURL = 48, FOR = 49, COLON = 50, LSQUARE = 51, DIM_ID = 52, RSQUARE = 53, DIVIDE = 54, DIM_MTD_ID = 55, CALL_REF = 56, DOT = 57, FUNC = 58, INC = 59, DEC = 60, LNOT = 61, PLUS = 62, MINUS = 63, TIMES = 64, CARET = 65, MOD = 66, FLTHAN = 67, FGTHAN = 68, LTHAN = 69, GTHAN = 70, GEQ = 71, LEQ = 72, EQ = 73, NEQ = 74, LAND = 75, LOR = 76, QUESTION = 77, ASSIGN = 78, PLUS_ASSIGN = 79, MINUS_ASSIGN = 80, TIMES_ASSIGN = 81, DIVIDE_ASSIGN = 82, NCAP_FLOAT = 83, NCAP_DOUBLE = 84, NCAP_INT = 85, NCAP_BYTE = 86, NCAP_UBYTE = 87, NCAP_SHORT = 88, NCAP_USHORT = 89, NCAP_UINT = 90, NCAP_INT64 = 91, NCAP_UINT64 = 92, N4STRING = 93, DIM_ID_SIZE = 94, NRootAST = 95, SHIFTL = 96, SHIFTR = 97, QUOTE = 98, DGT = 99, LPH = 100, LPHDGT = 101, XPN = 102, VAR_NM_QT = 103, BLASTOUT = 104, UNUSED_OPS = 105, WS = 106, CXX_COMMENT = 107, C_COMMENT = 108, NUMBER_DOT = 109, NUMBER = 110, VAR_ATT = 111, VAR_ATT_QT = 112, DIM_QT = 113, DIM_VAL = 114, INCLUDE = 115, LMT_DMN = 116, NULL_TREE_LOOKAHEAD = 3 }; #endif /*INC_ncoEnumTokenTypes_hpp_*/ nco-4.5.4/src/nco++/ncoGrammer.g000066400000000000000000003162731264355130400162600ustar00rootroot00000000000000header { /* $Header$ */ /* Purpose: ANTLR Grammar and support files for ncap2 */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // C Standard Headers #include #include #include #include #if !(defined __xlC__) && !(defined SGIMP64) // C++ compilers that do not allow stdint.h #include // Required by g++ for LLONG_MAX, ULLONG_MAX, by icpc for int64_t #endif // C++ compilers that do not allow stdint.h // C++ Standard Headers #include #include #include #include #include // Custom Headers #include "prs_cls.hh" #include "ncap2_utl.hh" #include "fmc_cls.hh" #include "NcapVar.hh" #include "NcapVarVector.hh" #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #include "NcapVector.hh" #include "antlr/TokenStreamSelector.hpp" #include "ncoParser.hpp" #include "Invoke.hh" ANTLR_USING_NAMESPACE(std); ANTLR_USING_NAMESPACE(antlr); } options { language="Cpp"; } class ncoParser extends Parser; options { k=3; genHashLines = true; // include line number information buildAST = true; // uses CommonAST by default defaultErrorHandler=false; //analyzerDebug = true; //codeGenDebug= true; } tokens { NULL_NODE; BLOCK; ARG_LIST; DMN_LIST; DMN_LIST_P; DMN_ARG_LIST; LMT_LIST; VALUE_LIST; FUNC_ARG; LMT; EXPR; FEXPR; POST_INC; POST_DEC; UTIMES; PROP; // used to differenciate properties & methods FOR2; NORET; ATAN2; //Used indirectly WHERE_ASSIGN; MISS2ZERO; //used only in VarOp -sets all missing values to zero VSORT; // ascending sort only used outside of grammer to sort in VarOp VRSORT; // reverse sort only used outside of grammer to sort in VarOp VABS; // imaginary token used in VarOp to return absolute value VSQR2; // imaginary token used in VarOp to return square of number DEFDIM; } { public: std::vector inc_vtr; } program: (statement)* ; statement: // assign/expression_statement e1:expr SEMI! { if( ncap_fnc_srh(#e1)) #statement = #(#[FEXPR,"FEXPR"],#statement); else #statement = #(#[EXPR,"EXPR"],#statement); } // Define DEFDIM statment // DEFDIMA (regular call - limited or unlimited ) DEFDIM(1) // DEFDIMU (explicitly unlimited) DEFDIM(0) | (def1:DEFDIMA^ |def2:DEFDIMU^ ) LPAREN! NSTRING COMMA! expr (COMMA! expr)? RPAREN! SEMI! { if( #def1 ){ #def1->setType(DEFDIM);#def1->setText("1");} if( #def2 ){ #def2->setType(DEFDIM);#def2->setText("0");} } // while loop | WHILE^ LPAREN! expr RPAREN! statement // for statement | for_stmt // Jump Statements | BREAK SEMI! | CONTINUE SEMI! //deal with empty statement | SEMI! { #statement = #([ NULL_NODE, "null_stmt"]); } // if statement | IF^ LPAREN! expr RPAREN! statement ( //standard if-else ambiguity options {warnWhenFollowAmbig = false;} : ELSE! statement )? // if statement | WHERE^ LPAREN! expr RPAREN! statement ( //standard if-else ambiguity options {warnWhenFollowAmbig = false;} : ELSEWHERE! statement )? // print statement | PRINT^ LPAREN! (VAR_ID|ATT_ID|NSTRING) (COMMA! NSTRING)? RPAREN! SEMI! // Code block | block ; // a bracketed block block: LCURL! (statement)* RCURL! { #block = #( [BLOCK, "block"], #block ); } ; for_stmt: FOR^ LPAREN! (e1:expr)? SEMI! (e2:expr)? SEMI! (e3:expr)? RPAREN! st:statement /* { if(#e1==NULL) #e1 = #([ NULL_NODE, "null_stmt"]); if(#e2==NULL) #e2 = #([ NULL_NODE, "null_stmt"]); if(#e3==NULL) #e3 = #([ NULL_NODE, "null_stmt"]); #for_stmt=#(FOR,e1,e2,e3,st); } */ ; lmt: (expr)? (COLON (expr)?)* { #lmt = #( [LMT, "lmt"], #lmt ); } ; lmt_list: LPAREN! lmt (COMMA! lmt)* RPAREN! { #lmt_list = #( [LMT_LIST, "lmt_list"], #lmt_list ); } ; // Use vars in dimension list so dims in [] can // be used with or with out $ prefix. ie "$lon" or "lon" // So parser is compatible with ncap1 dmn_list_p: LSQUARE! (VAR_ID|DIM_ID) (COMMA! (VAR_ID|DIM_ID))* RSQUARE! { #dmn_list_p = #( [DMN_LIST_P, "dmn_list_p"], #dmn_list_p ); } ; dmn_list: LPAREN! DIM_ID (COMMA! DIM_ID)* RPAREN! { #dmn_list = #( [DMN_LIST, "dmn_list"], #dmn_list ); } ; // list of dims eg /$Lat,$time,$0,$1/ dmn_arg_list: DIVIDE! (DIM_ID|DIM_MTD_ID) (COMMA! (DIM_ID|DIM_MTD_ID))* DIVIDE! { #dmn_arg_list = #( [DMN_ARG_LIST, "dmn_arg_list"], #dmn_arg_list ); } ; value_list: LCURL! expr (COMMA! expr)* RCURL! { #value_list = #( [VALUE_LIST, "value_list"], #value_list ); } ; arg_list: expr|dmn_arg_list|DIM_ID|DIM_MTD_ID|call_ref ; func_arg: LPAREN! (arg_list)? (COMMA! arg_list)* RPAREN! { #func_arg = #( [FUNC_ARG, "func_arg"], #func_arg ); } ; hyper_slb: (VAR_ID^ |ATT_ID ^) (lmt_list|dmn_list|dmn_list_p)? ; // call by reference - prefix & call_ref: CALL_REF^(VAR_ID|ATT_ID) ; /*************************************************************/ /* start expressions */ meth_exp: primary_exp (DOT^ FUNC func_arg)* ; // unary left association unaryleft_exp: meth_exp ( in:INC^ {#in->setType(POST_INC); #in->setText("POST_INC");} | de:DEC^ {#de->setType(POST_DEC); #de->setText("POST_DEC");} )? ; // unary right association /* unary_exp: ( LNOT^| PLUS^| MINUS^ |INC^ | DEC^ | TIMES^ ) unary_exp | unaryleft_exp ; */ unary_exp: ( LNOT^| PLUS^| MINUS^ |INC^ | DEC^ | ur:TIMES^ {#ur->setType(UTIMES);#ur->setText("UTIMES");} ) unary_exp | unaryleft_exp ; // right association pow_exp: unary_exp (CARET^ pow_exp )? ; mexpr: pow_exp ( (TIMES^ | DIVIDE^ | MOD^ ) pow_exp)* ; add_expr: mexpr ( (PLUS^ | MINUS^ ) mexpr)* ; frel_expr: add_expr (( FLTHAN^ | FGTHAN^ ) add_expr)* ; rel_expr: frel_expr (( LTHAN^ | GTHAN^ | GEQ^ | LEQ^ ) frel_expr)* ; eq_expr: rel_expr (( EQ^ | NEQ^ ) rel_expr)* ; lmul_expr: eq_expr ( LAND^ eq_expr )* ; lor_expr: lmul_expr (LOR^ lmul_expr)* ; cond_expr: lor_expr ( QUESTION^ ass_expr COLON! cond_expr)? ; ass_expr: cond_expr ( ( ASSIGN^ | PLUS_ASSIGN^ | MINUS_ASSIGN^ | TIMES_ASSIGN^ | DIVIDE_ASSIGN^ ) (ass_expr|value_list) )? ; // The mother of all expressions !! expr: ass_expr ; // 20151021 csz Prefixed some tokens with NCO_ to prevent namespace conflicts with MSVC definitions in windef.h primary_exp : NCAP_FLOAT | NCAP_DOUBLE | NCAP_INT | NCAP_BYTE | NCAP_UBYTE | NCAP_SHORT | NCAP_USHORT | NCAP_UINT | NCAP_INT64 | NCAP_UINT64 | NSTRING | N4STRING | DIM_ID_SIZE | LPAREN! expr RPAREN! | FUNC^ func_arg | hyper_slb //remember this includes VAR_ID & ATT_ID ; /* End expressions */ /*************************************************************/ imaginary_token : NRootAST ; class ncoLexer extends Lexer; options { k = 4; defaultErrorHandler=false; filter=BLASTOUT; testLiterals=false; charVocabulary = '\u0000'..'\u00FF'; } tokens { // token keywords IF ="if"; ELSE="else"; WHERE="where"; ELSEWHERE="elsewhere"; SHIFTL="<<"; SHIFTR=">>"; BREAK="break"; CONTINUE="continue"; WHILE="while"; FOR="for"; PRINT="print"; DEFDIMA="defdim"; DEFDIMU="defdimunlim"; /* LIMITED="LIMITED"; UNLIMITED="UNLIMITED"; RAM_DELETE="ram_delete"; RAM_WRITE="ram_write"; SET_MISS="set_miss"; CH_MISS="change_miss"; */ } { private: prs_cls *prs_arg; public: // Customized constructor !! ncoLexer(ANTLR_USE_NAMESPACE(std)istream& in, prs_cls *prs_in ) : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),true) { prs_arg=prs_in; // This shouldn't really be here // fxm:: should call default constructor initLiterals(); } public: void uponEOF() /*throws TokenStreamException, CharStreamException*/ { if ( selector.getCurrentStream() != lexer ) { // Do not allow EOF until main lexer // Force selector to retry for another token parser->inc_vtr.pop_back(); std::cout<<"Setting parser(filename)=" <inc_vtr.back()<setFilename(parser->inc_vtr.back()); selector.pop(); // return to old lexer/stream selector.retry(); } // else ANTLR_USE_NAMESPACE(std)cout << "Hit EOF of main file" << ANTLR_USE_NAMESPACE(std)endl; } } ASSIGN options { paraphrase="="; } : '='; PLUS_ASSIGN options { paraphrase="+="; } : "+="; MINUS_ASSIGN options { paraphrase="-=";} : "-="; TIMES_ASSIGN options { paraphrase="*=";} : "*="; DIVIDE_ASSIGN options { paraphrase="/=";} : "/="; INC options { paraphrase="++"; }: "++"; DEC options { paraphrase="--"; }: "--"; QUESTION options { paraphrase="?";} : '?'; LPAREN options { paraphrase="("; } : '(' ; RPAREN options { paraphrase=")";} : ')' ; LCURL options { paraphrase="{"; } : '{' ; RCURL options { paraphrase="}";} : '}' ; LSQUARE options { paraphrase="["; } : '['; RSQUARE options { paraphrase="]"; } : ']'; COMMA options { paraphrase=",";} : ',' ; QUOTE options { paraphrase="\""; }: '"'; SEMI options { paraphrase=";";} : ';' ; COLON options { paraphrase=":";}: ':' ; // Operators CARET options { paraphrase="power of operator";} : '^' ; TIMES options { paraphrase="*";} : '*' ; DIVIDE options { paraphrase="/";} : '/'; MOD options { paraphrase="%"; } : '%' ; PLUS options {paraphrase="+";} : '+' ; MINUS options { paraphrase="-";} : '-' ; EQ options { paraphrase="=="; } : "==" ; NEQ options { paraphrase="!=";} : "!=" ; LTHAN options { paraphrase="<";} : '<' ; GTHAN options { paraphrase=">"; } : '>' ; LEQ options { paraphrase="<="; }: "<=" ; GEQ options { paraphrase=">=";} : ">=" ; FLTHAN options { paraphrase="<<";} : "<<" ; FGTHAN options { paraphrase=">>"; } : ">>" ; LAND options { paraphrase="&&";}: "&&" ; LNOT options { paraphrase="!";} : '!' ; LOR options { paraphrase="||";}: "||" ; DOT options {paraphrase="dot operator";} : '.'; CALL_REF options {paraphrase="call by reference";} : '&'; protected DGT: ('0'..'9'); protected LPH: ( 'a'..'z' | 'A'..'Z' | '_' ); protected LPHDGT: ( 'a'..'z' | 'A'..'Z' | '_' | '0'..'9'); protected XPN: ( 'e' | 'E' ) ( '+' | '-' )? ('0'..'9')+ ; protected VAR_NM_QT: (LPHDGT|'-'|'+'|'.'|'('|')'|':' )+ ; protected BLASTOUT: . { // blast out of lexer & parser // Can't use RecognitionException() as // this is caught in lexer -- use TokenStreamRecognitionException() // instead -- This takes us back to try block in Invoke ostringstream os; char ch=LA(0); os << getFilename() << " line " << getLine() << ", column "<< getColumn() << ": unexpected character '" << ch << "'" <::iterator we=std::lower_bound(prs_arg->fmc_vtr.begin(),prs_arg->fmc_vtr.end(),fmc_cls(fnc_nm)); if(we!=prs_arg->fmc_vtr.end() && we->fnm()==fnc_nm){ int idx=we-prs_arg->fmc_vtr.begin(); char buff[10]; sprintf(buff,"%d",idx); // VERY IMPORTANT - append the index in fmc_vtr to the function name - (name#idx) $setText(fnc_nm+"#"+buff); $setType(FUNC); } } } ('@'(LPH)(LPH|DGT)* {$setType(ATT_ID); })? ; // Return a quoted var or att (var_nm@att_nm) VAR_ATT_QT :( '\''!) VAR_NM_QT {$setType(VAR_ID);} ( '@' VAR_NM_QT {$setType(ATT_ID);})? ('\''!) ; // return a STR_ATT_ID STR_ATT_ID: '@'(LPH)(LPH|DGT)* {$setType(STR_ATT_ID);} ; // Return a quoted STR_ATT_ID STR_ATT_QT :( '\''!) '@' VAR_NM_QT {$setType(STR_ATT_ID);} ('\''!) ; //Return a quoted dim DIM_QT: ( '\''!) ('$'! VAR_NM_QT {$setType(DIM_ID);}) ('\''!) ( ".size"! { $setType(DIM_ID_SIZE);})? ; DIM_VAL options { paraphrase="dimension identifier"; } : '$'! (LPH)(LPH|DGT)* {$setType(DIM_ID);} ( ".size"! { $setType(DIM_ID_SIZE);} )? ; // Shorthand for naming dims in method e.g., $0,$1, $2 etc DIM_MTD_ID options{paraphrase="dimension identifier";} : '$'! (DGT)+ ; NSTRING options{paraphrase="a string";} : '"'! ( ~('"'|'\n'))* '"'! {$setType(NSTRING);} ('s'! {$setType(N4STRING);} )? ; INCLUDE : "#include" (WS)? f:NSTRING { // ANTLR_USING_NAMESPACE(std) // create lexer to handle include std::string f_nm=f->getText(); std::ifstream* input=new std::ifstream(f_nm.c_str()); if(!(*input)){ // if(*input==NULL){ // 20150413: Trips clang 6.0 MACOSX Yosemite warning from -Wnull-arithmetic and subsequent error "invalid operands to binary expression" err_prn("Lexer cannot find include file "+f_nm); } ncoLexer* sublexer = new ncoLexer(*input,prs_arg); // make sure errors are reported in right file sublexer->setFilename(f_nm); parser->setFilename(f_nm); // save the filename - so we can pop it back later if needed // so parser gets the right filename parser->inc_vtr.push_back(f_nm); // you can't just call nextToken of sublexer // because you need a stream of tokens to // head to the parser. The only way is // to blast out of this lexer and reenter // the nextToken of the sublexer instance // of this class. selector.push(sublexer); // ignore this as whitespace; ask selector to try // to get another token. It will call nextToken() // of the new instance of this lexer. selector.retry(); // throws TokenStreamRetryException } ; class ncoTree extends TreeParser; { private: //prs_cls *prs_arg; bool bcst; var_sct* var_cst; public: prs_cls *prs_arg; ASTFactory myFactory; //Structure to hold AST pointers to indices in hyperslabs -only temporary typedef struct{ ANTLR_USE_NAMESPACE(antlr)RefAST ind[3]; } ast_lmt_sct; void setTable(prs_cls *prs_in){ prs_arg=prs_in; } // Customized Constructor ncoTree(prs_cls *prs_in){ prs_arg=prs_in; // default is NO. Casting variable set to true // causes casting in function out(). var_cst must // then be defined bcst=false; ncoTree(); } int lmt_init( RefAST aRef, vector &ast_lmt_vtr) { const std::string fnc_nm("lmt_init"); // [sng] Function name int idx; int nbr_dmn; int nbr_cln; // Number of colons in limit RefAST lRef; RefAST eRef; RefAST cRef; ast_lmt_sct hyp; if(aRef->getType() != LMT_LIST) return 0; lRef=aRef->getFirstChild(); nbr_dmn=lmt_peek(aRef); //nbr_dmn=lRef->getNumberOfChildren(); for(idx=0 ; idx < nbr_dmn ; idx++){ hyp.ind[0]=ANTLR_USE_NAMESPACE(antlr)nullAST; hyp.ind[1]=ANTLR_USE_NAMESPACE(antlr)nullAST; hyp.ind[2]=ANTLR_USE_NAMESPACE(antlr)nullAST; if(lRef->getType()!=LMT) return 0; eRef=lRef->getFirstChild(); nbr_cln=0; while(eRef) { if(eRef->getType() == COLON){ cRef=eRef; nbr_cln++; } eRef=eRef->getNextSibling(); } // Initialise to default markers switch(nbr_cln) { case 0: break; case 1: hyp.ind[0]=cRef; hyp.ind[1]=cRef; break; case 2: hyp.ind[0]=cRef; hyp.ind[1]=cRef; hyp.ind[2]=cRef; break; default: err_prn(fnc_nm,"Too many hyperslab indices"); break; } eRef=lRef->getFirstChild(); // point inidices to any expressions that exist nbr_cln=0; while(eRef) { if(eRef->getType() == COLON) nbr_cln++; else hyp.ind[nbr_cln]=eRef; eRef=eRef->getNextSibling(); } // save indices ast_lmt_vtr.push_back(hyp); lRef=lRef->getNextSibling(); } return nbr_dmn; } bool lmt_var_mk( int nbr_dmn, RefAST lmt, NcapVector &lmt_vtr ) { int idx; int jdx; int sz; int dmn_sz; ptr_unn op1; var_sct *var; std::string fnc_nm="lmt_var_mk"; // calculate variables var=out(lmt->getFirstChild()->getFirstChild()); // convert result to type int var=nco_var_cnf_typ(NC_UINT64,var); (void)cast_void_nctype((nc_type)NC_UINT64,&var->val); sz=var->sz; dmn_sz=var->sz / nbr_dmn; // shape of var must be (nbr_dmn) or (nbr_dmn,2) or (nbr_dmn,3) if( dmn_sz * nbr_dmn != sz ) { var=nco_var_free(var); return false; } for(idx=0; idxnm=NULL; //lmt_ptr->lmt_typ=-1; lmt_ptr->is_usr_spc_lmt=True; /* True if any part of limit is user-specified, else False */ lmt_ptr->min_sng=NULL; lmt_ptr->max_sng=NULL; lmt_ptr->srd_sng=NULL; lmt_ptr->is_usr_spc_min=False; lmt_ptr->is_usr_spc_max=False; /* rec_skp_ntl_spf is used for record dimension in multi-file operators */ lmt_ptr->rec_skp_ntl_spf=0L; /* Number of records skipped in initial superfluous files */ for(jdx=0;jdxval.ui64p[idx+jdx]; switch(jdx){ case 0: lmt_ptr->is_usr_spc_min=True; lmt_ptr->srt=uival; break; case 1: //end lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=uival; break; case 2: //srd lmt_ptr->srd_sng=strdup("~fill_in"); lmt_ptr->srd=uival; break; } } /* need to deal with situation where only start is defined -- ie picking only a single value */ if( lmt_ptr->is_usr_spc_min==True && lmt_ptr->is_usr_spc_max==False && lmt_ptr->srd_sng==NULL) { lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=lmt_ptr->srt; } lmt_vtr.push_back(lmt_ptr); } cast_nctype_void((nc_type)NC_UINT64,&var->val); var=nco_var_free(var); return true; } bool lmt_mk( int nbr_dmn, RefAST lmt, NcapVector &lmt_vtr ) { int idx; int jdx; int sz; lmt_sct *lmt_ptr; RefAST aRef; vector ast_lmt_vtr; // deal with a single expression containing all indicies if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON) { return lmt_var_mk(nbr_dmn,lmt,lmt_vtr); ; } // populate ast_lmt_vtr if( nbr_dmn!=lmt_init(lmt,ast_lmt_vtr) ) return false; for(idx=0 ; idx nm=NULL; //lmt_ptr->lmt_typ=-1; lmt_ptr->is_usr_spc_lmt=True; /* True if any part of limit is user-specified, else False */ lmt_ptr->min_sng=NULL; lmt_ptr->max_sng=NULL; lmt_ptr->srd_sng=NULL; lmt_ptr->is_usr_spc_min=False; lmt_ptr->is_usr_spc_max=False; /* rec_skp_ntl_spf is used for record dimension in multi-file operators */ lmt_ptr->rec_skp_ntl_spf=0L; /* Number of records skipped in initial superfluous files */ for(jdx=0 ; jdx <3 ; jdx++){ long ldx=0L; var_sct *var_out; aRef=ast_lmt_vtr[idx].ind[jdx]; if(aRef && aRef->getType() != COLON ){ // Calculate number using out() var_out=out(aRef); // convert result to type int var_out=nco_var_cnf_typ(NC_INT,var_out); (void)cast_void_nctype((nc_type)NC_INT,&var_out->val); // only interested in the first value. ldx=var_out->val.ip[0]; var_out=nco_var_free(var_out); // switch jdx 0-srt,1-end,2-srd switch(jdx){ case 0: lmt_ptr->is_usr_spc_min=True; lmt_ptr->srt=ldx; break; case 1: //end lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=ldx; break; case 2: //srd lmt_ptr->srd_sng=strdup("~fill_in"); lmt_ptr->srd=ldx; break; } } }// end jdx /* need to deal with situation where only start is defined -- ie picking only a single value */ if( lmt_ptr->is_usr_spc_min==True && lmt_ptr->is_usr_spc_max==False && lmt_ptr->srd_sng==NULL){ lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=lmt_ptr->srt; } lmt_vtr.push_back(lmt_ptr); } // end idx return true;; } /* end lmt_mk */ void run_dbl(RefAST tr,int icnt){ int idx=0; RefAST ntr=tr; extern int ncap_omp_exe( std::vector< std::vector > &all_ast_vtr, ncoTree** wlk_ptr, int wlk_nbr); if(tr== ANTLR_USE_NAMESPACE(antlr)nullAST) err_prn("run_dbl"," REPORTS given a null AST Refrence\n"); //small list dont bother with double parsing // just do a final parse if(icnt <4){ //Final scan prs_arg->ntl_scn=False; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } return; } //Initial scan prs_arg->ntl_scn=True; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } //Define variables in output (void)nco_redef(prs_arg->out_id); (void)prs_arg->ncap_def_ntl_scn(); (void)nco_enddef(prs_arg->out_id); // see if below does anything ? (void)nco_sync(prs_arg->out_id); //Final scan if(!prs_arg->NCAP_MPI_SORT) { idx=0; ntr=tr; prs_arg->ntl_scn=False; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } } else { // Sort expressions - MPI preparation prs_arg->ntl_scn=False; // nb A vector of vectors std::vector< std::vector > all_ast_vtr; ncoTree **wlk_vtr=(ncoTree**)NULL; // Populate and sort vector (void)ncap_mpi_srt(tr,icnt,all_ast_vtr,prs_arg); // Evaluate expressions (execute) (void)ncap_omp_exe(all_ast_vtr,wlk_vtr,0); /* for(unsigned vtr_idx=0 ; vtr_idxgetNextSibling())); // 20101027 csz "while result of assignment is true" (not an equality comparison) if(nbr_stmt <4 || nbr_dpt>0 ){ prs_arg->ntl_scn=False; ntr=tr; do{ iret=statements(ntr); // break if jump statement if(iret==BREAK || iret==CONTINUE) break; } while((ntr=ntr->getNextSibling())); // 20101027 csz "while result of assignment is true" (not an equality comparison) goto exit; } ntr=tr; for(idx=0 ; idx < nbr_stmt; idx++){ ntyp=ntr->getType(); // we have hit an IF or a basic block if(ntyp==BLOCK || ntyp==IF ||ntyp==DEFDIM || ntyp==WHILE ||ntyp==FOR || ntyp==FEXPR ||ntyp==WHERE) { // if(ntyp != EXPR ){ if(icnt>0) (void)run_dbl(etr,icnt); icnt=0; etr=ANTLR_USE_NAMESPACE(antlr)nullAST;; prs_arg->ntl_scn=False; iret=statements(ntr); }else{ if(icnt++==0) etr=ntr; } ntr=ntr->getNextSibling(); } // end for if(icnt >0){ iret=0; (void)run_dbl(etr,icnt); } exit: return iret; } // end run_exe RefAST nco_dupList(RefAST tr){ RefAST otr; // nb astFactory is protected- must call from within class otr=astFactory->dupList(tr); otr->setNextSibling( ANTLR_USE_NAMESPACE(antlr)nullAST ) ; /* if(otr->getNextSibling()!= ANTLR_USE_NAMESPACE(antlr)ASTNULL ) err_prn("nco_dupList", "NON NULL AST SIBLING\n"); */ return otr; } } // end native block // Return the number of dimensions in lmt subscript lmt_peek returns [int nbr_dmn=0] : lmt:LMT_LIST{ RefAST aRef; aRef=lmt->getFirstChild(); nbr_dmn=0; while(aRef) { if(aRef->getType() == LMT) nbr_dmn++; aRef=aRef->getNextSibling(); } } ; statements returns [int iret=0] { var_sct *var=NULL; var_sct *var2=NULL; const std::string fnc_nm("statements"); // list of while/for loops entered n.b depth is lpp_vtr.size() // Temporary fix so call run_exe only does a single parse in the // nested block static std::vector lpp_vtr; } : blk:BLOCK { //std::cout <<"Num of Children in block="<getNumberOfChildren()<getFirstChild(),lpp_vtr.size() ); } | #(exp:EXPR ass:.) { RefAST tr; RefAST ntr; if(ass->getType()==ASSIGN && prs_arg->ntl_scn ){ ntr=ass->getFirstChild(); if(ntr->getType()==UTIMES) ntr=ntr->getFirstChild(); if(ntr->getType() == VAR_ID || ntr->getType() ==ATT_ID){ ntr->addChild( astFactory->create(NORET,"no_ret") ); // std::cout << "Modified assign "<toStringTree()<getFirstChild()); if(var != (var_sct*)NULL) var=nco_var_free(var); iret=EXPR; } // These expressions excute in their own basic blocks // Any expressions which use the utility functions // are flagged as FEXPR by the parser. | #(FEXPR fss:.) { var=out(fss); if(var != (var_sct*)NULL) var=nco_var_free(var); iret=FEXPR; } | #(IF var=out stmt:. ) { //if can have only 3 or 4 parts , 1 node and 2 or 3 siblings // IF LOGICAL_EXP STATEMENT1 STATEMENT2 bool br; //Calculate logical expression br=ncap_var_lgcl(var); var=nco_var_free(var); if(br){ // Execute 2nd sibling if(stmt->getType()==BLOCK ) { if(stmt->getFirstChild()) iret=run_exe(stmt->getFirstChild(),lpp_vtr.size()); }else iret=statements(stmt); } // See if else stmt exists (3rd sibling) if(!br && (stmt=stmt->getNextSibling()) ){ if(stmt->getType()==BLOCK ){ if(stmt->getFirstChild()) iret=run_exe(stmt->getFirstChild(),lpp_vtr.size()); }else iret=statements(stmt); } var=NULL_CEWI; }// end action | #(WHERE var=out stmt3:.) { // convert mask to short RefAST tr; var=nco_var_cnf_typ(NC_SHORT,var); //change missing values to zero if(var->has_mss_val){ var=ncap_var_var_stc(var,NULL_CEWI,MISS2ZERO); var->has_mss_val=False; var->mss_val.vp=(void*)nco_free(var->mss_val.vp); } //deal with block if(stmt3->getType()==BLOCK){ tr=stmt3->getFirstChild(); while(tr) { (void)where_assign(tr,var); tr=tr->getNextSibling(); } } else where_assign(stmt3,var); // deal with else-where if(tr=stmt3->getNextSibling()) { //invert mask var=ncap_var_var_stc(var,NULL_CEWI,LNOT); if(tr->getType()==BLOCK){ tr=tr->getFirstChild(); while(tr) { (void)where_assign(tr,var); tr=tr->getNextSibling(); } } else where_assign(tr,var); } if(var != (var_sct*)NULL) var=nco_var_free(var); iret=WHERE; } | #(WHILE lgcl:. stmt1:.){ bool br; var_sct *var_tf; var_tf=out(lgcl); br=ncap_var_lgcl(var_tf); var_tf=nco_var_free(var_tf); lpp_vtr.push_back("while"); while(br){ if(stmt1->getType()==BLOCK) iret=run_exe(stmt1,lpp_vtr.size()); else iret=statements(stmt1); if(iret==BREAK) break; var_tf=out(lgcl); br=ncap_var_lgcl(var_tf); var_tf=nco_var_free(var_tf); } lpp_vtr.pop_back(); iret=WHILE; var=NULL_CEWI; } |#(FOR e1:. e2:. e3:. stmt2:.) { bool b1,b2,b3,br; var_sct *var_f1; var_sct *var_f2; var_sct *var_f3; b1=(e1->getType()!=NULL_NODE ? true:false); b2=(e2->getType()!=NULL_NODE ? true:false); b3=(e3->getType()!=NULL_NODE ? true:false); lpp_vtr.push_back("for"); if(b1){ var_f1=out(e1); var_f1=nco_var_free(var_f1); } if(b2){ var_f2=out(e2); br=ncap_var_lgcl(var_f2); var_f2=nco_var_free(var_f2); } else br=true; while(br){ if(stmt2->getType()==BLOCK) iret=run_exe(stmt2,lpp_vtr.size()); else iret=statements(stmt2); if(iret==BREAK) break; if(b3){ var_f3=out(e3); var_f3=nco_var_free(var_f3); } if(b2){ var_f2=out(e2); br=ncap_var_lgcl(var_f2); var_f2=nco_var_free(var_f2); } } // end while lpp_vtr.pop_back(); iret=FOR; var=NULL_CEWI; } // end for action | ELSE { iret=ELSE;} | BREAK { iret=BREAK;} | CONTINUE {iret=CONTINUE;} | NULL_NODE { iret=NULL_NODE; } |#(dtyp:DEFDIM def:NSTRING var=out (var2=out)? ){ bool bunlimited=false; int ityp; int dCall; long sz; // 0 - specific - UNLIMITED // 1 - regular LIMITED or UNLIMITED dCall=atoi(dtyp->getText().c_str()); iret=DEFDIM; var=nco_var_cnf_typ((nc_type)NC_INT64,var); (void)cast_void_nctype((nc_type)NC_INT64,&var->val); sz=var->val.i64p[0]; var=(var_sct*)nco_var_free(var); if( dCall==0 ){ bunlimited =true; } else if(dCall==1 && var2){ int ityp; // nb var2 is in upper scope - defined at statment action start var2=nco_var_cnf_typ(NC_INT,var2); (void)cast_void_nctype(NC_INT,&var2->val); ityp=var2->val.ip[0]; (void)cast_nctype_void(NC_INT,&var2->val); var2=nco_var_free(var2); if( ityp==0) bunlimited=true; else if( ityp==1 ) bunlimited=false; else err_prn(fnc_nm,"defdim for "+ def->getText() + ". Third argument must be 0 for \"UNLIMITED\" or 1 for \"LIMITED\" or void"); } (void)ncap_def_dim(def->getText(),sz,bunlimited,prs_arg); } // All the following functions have iret=0 | (#(PRINT VAR_ID))=> #(PRINT pvid:VAR_ID){ int var_id; int fl_id=-1; char *fmt_sng; std::string va_nm(pvid->getText()); NcapVar *Nvar; if(prs_arg->ntl_scn) goto end2; Nvar=prs_arg->var_vtr.find(va_nm); if(Nvar && Nvar->flg_mem){ wrn_prn(fnc_nm,"Cannot print out RAM variables at the moment!"); goto end2; } // check output first -nb can only print out vars that are defined AND written // it is possible to get with the var defined in output but no data // flg_stt==1 mean var defined but no data !! // So we try to use var in input -if it exist their if(Nvar && Nvar->flg_stt==2){ fl_id=prs_arg->out_id; }else{ // Check input file for var if(NC_NOERR==nco_inq_varid_flg(prs_arg->in_id,va_nm.c_str(),&var_id)) fl_id=prs_arg->in_id; } if(fl_id==-1) { wrn_prn(fnc_nm,"Print function cannot find var \""+va_nm+"\" in input or output"); goto end2; } // Grab format string if(pvid->getNextSibling() && pvid->getNextSibling()->getType()==NSTRING) fmt_sng=strdup(pvid->getNextSibling()->getText().c_str()); else fmt_sng=(char*)NULL; if( fl_id >=0) (void)nco_prn_var_val_lmt(fl_id,va_nm.c_str(),(lmt_sct*)NULL,0L,fmt_sng,prs_arg->FORTRAN_IDX_CNV,False,False); if(fmt_sng) fmt_sng=(char*)nco_free(fmt_sng); end2: ; } | (#(PRINT ATT_ID))=> #(PRINT patt:ATT_ID){ int apsn; var_sct *var1; char *fmt_sng; std::string fl_nm; std::string att_nm; std::string var_nm; NcapVar *Nvar; var=NULL_CEWI; // print only on second parse if(prs_arg->ntl_scn) goto end3; fl_nm=patt->getText(); apsn=fl_nm.find("@"); var_nm=fl_nm.substr(0,apsn); att_nm=fl_nm.substr(apsn+1); Nvar=prs_arg->var_vtr.find(var_nm); if( Nvar && att_nm==std::string(nco_mss_val_sng_get()) ){ if(Nvar->var->has_mss_val==True){ var1=ncap_sclr_var_mk(fl_nm,Nvar->var->type,true); (void)memcpy(var1->val.vp,Nvar->var->mss_val.vp, nco_typ_lng(Nvar->var->type)); var=var1; }else{ wrn_prn(fnc_nm,"Cannot print missing value \""+ fl_nm+ "\" for variable \""+ var_nm +"\" as it is undefined"); goto end3; } }else{ Nvar=prs_arg->var_vtr.find(fl_nm); if(Nvar==NULL_CEWI) var=ncap_att_init(fl_nm,prs_arg); else var=nco_var_dpl(Nvar->var); } if(var==NULL_CEWI ){ wrn_prn(fnc_nm,"Cannot print attribute \"" +fl_nm+ "\". Not present in input or output files."); goto end3; } // Grab format string if(patt->getNextSibling() && patt->getNextSibling()->getType()==NSTRING) fmt_sng=strdup(patt->getNextSibling()->getText().c_str()); else fmt_sng=(char*)NULL; (void)ncap_att_prn(var,fmt_sng); var=nco_var_free(var); end3: ; } | (#(PRINT NSTRING))=> #(PRINT pstr:NSTRING){ char *prn_sng; if(!prs_arg->ntl_scn){ prn_sng=strdup(pstr->getText().c_str()); (void)sng_ascii_trn(prn_sng); fprintf(stdout,"%s",prn_sng); prn_sng=(char*)nco_free(prn_sng); } } ; // Parse assign statement - Initial Scan assign_ntl [bool bram] returns [var_sct *var] { const std::string fnc_nm("assign_ntl"); var=NULL_CEWI; } : (#(VAR_ID LMT_LIST ))=> #(vid:VAR_ID lmt:LMT_LIST){ std::string var_nm; var_sct *var_lhs; var_sct *var_rhs; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() >= nco_dbg_scl) dbg_prn(fnc_nm,var_nm+"(limits)"); // evaluate rhs for side effects eg new dims or lvalues var_rhs=out(vid->getNextSibling()); var_rhs=nco_var_free(var_rhs); var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs){ var=nco_var_dpl(var_lhs); (void)prs_arg->ncap_var_write(var_lhs,bram); } else { // set var to udf var_lhs=ncap_var_udf(var_nm.c_str()); var=nco_var_dpl(var_lhs); Nvar=new NcapVar(var_lhs); (void)prs_arg->int_vtr.push_ow(Nvar); } } | (#(VAR_ID (DMN_LIST|DMN_LIST_P) ))=> #(vid1:VAR_ID dmn:.){ int idx; std::string var_nm; var_sct *var1; std::vector str_vtr; RefAST aRef; NcapVar *Nvar; int str_vtr_sz; var_nm=vid1->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"[dims]"); // set class wide variables bcst=true; var_cst=NULL_CEWI; aRef=dmn->getFirstChild(); // pPut dimension names in vector while(aRef) { str_vtr.push_back(aRef->getText()); aRef=aRef->getNextSibling(); } //Check that all dims exist str_vtr_sz=str_vtr.size(); for(idx=0 ; idx < str_vtr_sz ; idx++) if( prs_arg->dmn_in_vtr.findi(str_vtr[idx]) ==-1 && prs_arg->dmn_out_vtr.findi(str_vtr[idx]) ==-1) break; // return undef if dim missing if( idx getNextSibling()); if(var1->undefined) { var=NULL_CEWI; } else { var_cst=nco_var_cnf_typ(var1->type,var_cst); var_cst->typ_dsk=var1->type; var=nco_var_dpl(var_cst); } var1=nco_var_free(var1); } if(!var){ var1=ncap_var_udf(var_nm.c_str()); Nvar=new NcapVar(var1); (void)prs_arg->int_vtr.push_ow(Nvar); var=nco_var_dpl(var1); } else{ var->nm=(char*)nco_free(var->nm); var->nm=strdup(var_nm.c_str()); var1=nco_var_dpl(var); prs_arg->ncap_var_write(var1,bram); } if(var_cst) var_cst=nco_var_free(var_cst); bcst=false; } | vid2:VAR_ID { var_sct *var_lhs=(var_sct*)NULL; var_sct *var_rhs=(var_sct*)NULL; std::string var_nm; var_nm=vid2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm); // Set class wide variables bcst=false; var_cst=NULL_CEWI; // get shape from RHS var_rhs=out(vid2->getNextSibling()); // use init_chk() to avoid warning from ncap_var_init() if var not present if(prs_arg->ncap_var_init_chk(var_nm)) var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs) { var=nco_var_dpl(var_lhs); (void)prs_arg->ncap_var_write(var_lhs,bram); nco_var_free(var_rhs); } else if(var_rhs) { //Copy return variable (void)nco_free(var_rhs->nm); var_rhs->nm =strdup(var_nm.c_str()); //Copy return variable var=nco_var_dpl(var_rhs); // Write var to int_vtr // if var already in int_vtr or var_vtr then write call does nothing (void)prs_arg->ncap_var_write(var_rhs,bram); } else { var=ncap_var_udf(var_nm.c_str()); } } // end action | (#(ATT_ID LMT_LIST))=> #(att:ATT_ID LMT_LIST){ ; } | (#(ATT_ID LMT_DMN))=> #(att1:ATT_ID DMN_LIST){ ; } | att2:ATT_ID { //In Initial scan all newly defined atts are flagged as Undefined var_sct *var1; NcapVar *Nvar; if(nco_dbg_lvl_get() > nco_dbg_var) dbg_prn(fnc_nm,att2->getText()); var1=ncap_var_udf(att2->getText().c_str()); Nvar=new NcapVar(var1); prs_arg->int_vtr.push_ow(Nvar); // Copy return variable var=nco_var_dpl(var1); } //end action ; // end assign block assign [bool bram] returns [var_sct *var] { const std::string fnc_nm("assign"); var=NULL_CEWI; } : (#(VAR_ID LMT_LIST ))=> #(vid:VAR_ID lmt:LMT_LIST){ int idx; int nbr_dmn; int var_id; int slb_sz; std::string var_nm; RefAST lmt_Ref; var_sct *var_lhs=NULL_CEWI; var_sct *var_rhs=NULL_CEWI; NcapVector lmt_vtr; lmt_Ref=vid->getFirstChild(); bcst=false; var_cst=NULL_CEWI; var=NULL_CEWI; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"(limits)"); // check to see if we are dealing with a single // index in limit -- i.e hyperslab a mult-dimensional var // with a single index if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON ){ var=var_lmt_one_lhs(vid,bram); goto end0; } lmt_Ref=lmt; Nvar=prs_arg->var_vtr.find(var_nm); // Overwrite bram possibly if(Nvar) bram=Nvar->flg_mem; // Deal with RAM variables if(bram) { if(Nvar && Nvar->flg_stt==1){ var_sct *var_ini; var_ini=prs_arg->ncap_var_init(var_nm,true); Nvar->var->val.vp=var_ini->val.vp; var_ini->val.vp=(void*)NULL; var_ini=nco_var_free(var_ini); Nvar->flg_stt=2; } if(Nvar && Nvar->flg_stt==2) var_lhs=Nvar->var; if(!Nvar) var_lhs=prs_arg->ncap_var_init(var_nm,true); nbr_dmn=var_lhs->nbr_dim; // Now populate lmt_vtr; if( lmt_mk(nbr_dmn, lmt_Ref,lmt_vtr) == false) err_prn(fnc_nm,"Invalid hyperslab limits for variable "+ var_nm); if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_lhs->dim[idx]->nm); slb_sz=1; // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++){ (void)ncap_lmt_evl(prs_arg->out_id,lmt_vtr[idx],prs_arg); // Calculate size slb_sz *= lmt_vtr[idx]->cnt; } // Calculate RHS variable var_rhs=out(vid->getNextSibling()); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // deal with scalar on RHS first if(var_rhs->sz == 1) (void)ncap_att_stretch(var_rhs,slb_sz); // make sure var_lhs and var_rhs are the same size // and that they are the same shape (ie they conform!!) if(var_rhs->sz != slb_sz){ err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(" +nbr2sng(slb_sz) + ") doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); } (void)nco_put_var_mem(var_rhs,var_lhs,lmt_vtr); if(Nvar==NULL) (void)prs_arg->ncap_var_write(var_lhs,true); // deal with Regular Vars } else { // if var undefined in O or defined but not populated if(!Nvar || ( Nvar && Nvar->flg_stt==1)){ // if var isn't in ouptut then copy it there //rcd=nco_inq_varid_flg(prs_arg->out_id,var_nm,&var_id); var_lhs=prs_arg->ncap_var_init(var_nm,true); // copy atts to output (void)ncap_att_cpy(var_nm,var_nm,prs_arg); (void)prs_arg->ncap_var_write(var_lhs,false); wrn_prn(fnc_nm,"Var being read and written in ASSIGN "+ var_nm); } // Get "new" var_id (void)nco_inq_varid(prs_arg->out_id,var_nm.c_str(),&var_id); var_lhs=prs_arg->ncap_var_init(var_nm,false); nbr_dmn=var_lhs->nbr_dim; // Now populate lmt_vtr; if( lmt_mk(nbr_dmn, lmt_Ref,lmt_vtr) == false) err_prn(fnc_nm,"Invalid hyperslab limits for variable "+ var_nm); if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_lhs->dim[idx]->nm); var_lhs->sz=1; // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++){ (void)ncap_lmt_evl(prs_arg->out_id,lmt_vtr[idx],prs_arg); // Calculate size var_lhs->sz *= lmt_vtr[idx]->cnt; } // Calculate RHS variable var_rhs=out(vid->getNextSibling()); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // deal with scalar on RHS first if(var_rhs->sz == 1){ // stretch variable to var_lhs->sz (void)ncap_att_stretch(var_rhs,var_lhs->sz); } // make sure var_lhs and var_rhs are the same size // and that they are the same shape (ie they conform!!) if(var_rhs->sz != var_lhs->sz){ err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(" +nbr2sng(var_lhs->sz) + ") doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); } // swap values about var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; //write block { for(idx=0;idxsrt[idx]=lmt_vtr[idx]->srt; var_lhs->cnt[idx]=lmt_vtr[idx]->cnt; var_lhs->srd[idx]=lmt_vtr[idx]->srd; } /* end loop over idx */ // write slab to O contains call to Open MP critical region // routine also frees up calling var (void)prs_arg->ncap_var_write_slb(var_lhs); } // end put block !! } // end else if regular var var_rhs=nco_var_free(var_rhs); // Empty and free vector for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_lmt_free(lmt_vtr[idx]); // See If we have to return something end0: if(lmt->getNextSibling() && lmt->getNextSibling()->getType()==NORET) var=NULL_CEWI; else var=prs_arg->ncap_var_init(var_nm,true); } // end action // Deal with LHS casting | (#(VAR_ID (DMN_LIST|DMN_LIST_P) ))=> #(vid1:VAR_ID dmn:.){ var_sct *var1; std::vector str_vtr; RefAST aRef; std::string var_nm; var_nm=vid1->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"[dims]"); // set class wide variables bcst=true; var_cst=NULL_CEWI; //aRef=vid->getFirstChild()->getFirstChild(); aRef=dmn->getFirstChild(); // pPut dimension names in vector while(aRef) { str_vtr.push_back(aRef->getText()); aRef=aRef->getNextSibling(); } // Cast is applied in VAR_ID action in function out() // Note cast is NOT applied to an attribute, an irregular hyperslab // or any entity which has a size of one. var_cst=ncap_cst_mk(str_vtr,prs_arg); var1=out(vid1->getNextSibling()); /* NB var_cst->val.vp always now set to null */ // If the RHS has size one or is an attribute or an irregular hyperslab // then we neet to use the var_cst as the shape of the written variable. // It is possible for the cast on the LHS to have a size of one and the RHS // to have a size of one e.g., if the dim(s) in the list have a size of one bool br1=(var_cst->sz >=1 && var1->sz==1); bool br2=(var_cst->sz==var1->sz && ( ncap_var_is_att(var1) ||var1->has_dpl_dmn==-1 )); // The code rebuilds var1 with the shape from the casting variable if( br1 || br2){ var_sct *var_nw; void *vp_swp; var_nw=nco_var_dpl(var_cst); var_nw=nco_var_cnf_typ(var1->type,var_nw); if(br1) (void)ncap_att_stretch(var1,var_nw->sz); vp_swp=var_nw->val.vp; var_nw->val.vp=var1->val.vp; var1->val.vp=vp_swp; var1=nco_var_free(var1); var1=var_nw; } //blow out if vars not the same size if(var1->sz != var_cst->sz) err_prn(fnc_nm, "LHS cast for "+var_nm+" - cannot make RHS "+ std::string(var1->nm) + " conform."); var1->nm=(char*)nco_free(var1->nm); var1->nm =strdup(var_nm.c_str()); // See If we have to return something if(dmn->getNextSibling() && dmn->getNextSibling()->getType()==NORET) var=NULL_CEWI; else var=nco_var_dpl(var1); //call to nco_var_get() in ncap_var_init() uses this property var1->typ_dsk=var1->type; (void)prs_arg->ncap_var_write(var1,bram); bcst=false; var_cst=nco_var_free(var_cst); } // end action | vid2:VAR_ID { // Set class wide variables var_sct *var_lhs=(var_sct*)NULL; var_sct *var_rhs=(var_sct*)NULL; NcapVar *Nvar; std::string var_nm; var_nm=vid2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm); bcst=false; var_cst=NULL_CEWI; var_rhs=out(vid2->getNextSibling()); // Save name std::string s_var_rhs(var_rhs->nm); Nvar=prs_arg->var_vtr.find(var_nm); if(!Nvar || (Nvar && Nvar->flg_stt==1)) (void)ncap_att_cpy(var_nm,s_var_rhs,prs_arg); if(Nvar) var_lhs=nco_var_dpl(Nvar->var); // use init_chk() to avoid warning from ncap_var_init() if var not present else if(prs_arg->ncap_var_init_chk(var_nm)) var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs) { // var is defined and populated & RHS is scalar -then stretch var to match var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); if(var_rhs->sz ==1 && var_lhs->sz >1) { (void)ncap_att_stretch(var_rhs,var_lhs->sz); // this is a special case -- if the RHS scalar has // no missing value then retain LHS missing value // else LHS missing value gets over written by RHS if(!var_rhs->has_mss_val) (void)nco_mss_val_cp(var_lhs,var_rhs); } if( var_rhs->sz != var_lhs->sz) err_prn(fnc_nm,"regular assign - var size missmatch between \""+var_nm+"\" and RHS of expression"); var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; nco_var_free(var_rhs); // Write var to disk (void)prs_arg->ncap_var_write(var_lhs,bram); } else { nco_free(var_rhs->nm); var_rhs->nm=strdup(var_nm.c_str()); (void)prs_arg->ncap_var_write(var_rhs,bram); } // See If we have to return something if(vid2->getFirstChild() && vid2->getFirstChild()->getType()==NORET) var=NULL_CEWI; else var=prs_arg->ncap_var_init(var_nm,true); ; } // end action | (#(ATT_ID LMT_LIST)) => #(att:ATT_ID LMT_LIST){ ; } | (#(ATT_ID DMN_LIST))=> #(att1:ATT_ID DMN_LIST){ ; } | att2:ATT_ID { var_sct *var1; string sa=att2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,sa); var1=out(att2->getNextSibling()); // we dont need missing values in ATT right !! if(var1->has_mss_val){ var1->has_mss_val=False; var1->mss_val.vp=(void*)nco_free(var1->mss_val.vp); } // if RHS is a non scalar variable then loose superfluous dimension data if( var1->nbr_dim >0){ var_sct *var_tmp; var_tmp=ncap_sclr_var_mk(sa,var1->type,false); var_tmp->sz=var1->sz; var_tmp->val.vp=var1->val.vp; var1->val.vp =(void*)NULL; var1=nco_var_free(var1); var1=var_tmp; }else{ (void)nco_free(var1->nm); var1->nm=strdup(sa.c_str()); } NcapVar *Nvar=new NcapVar(var1,sa); prs_arg->var_vtr.push_ow(Nvar); // See If we have to return something if(att2->getFirstChild() && att2->getFirstChild()->getType()==NORET) var=NULL_CEWI; else var=nco_var_dpl(var1); ; } // end action ; out returns [var_sct *var] { const std::string fnc_nm("out"); var_sct *var1; var_sct *var2; var=NULL_CEWI; } // arithmetic operators : (#(PLUS out out)) => #( PLUS var1=out var2=out) { var=ncap_var_var_op(var1,var2, PLUS );} | (#(MINUS out out)) => #( MINUS var1=out var2=out) { var=ncap_var_var_op(var1,var2, MINUS );} | (#(UTIMES #(POST_INC out)))=> #( UTIMES #(POST_INC var1=out_asn)){ var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,true,prs_arg); } | (#(UTIMES #(POST_DEC out)))=> #( UTIMES #(POST_DEC var1=out_asn)){ var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,true,prs_arg); } | (#(UTIMES #(INC out)))=> #( UTIMES #(INC var1=out_asn)){ var=ncap_var_var_inc(var1,NULL_CEWI,INC,true,prs_arg); } | (#(UTIMES #(DEC out)))=> #( UTIMES #(DEC var1=out_asn)){ var=ncap_var_var_inc(var1,NULL_CEWI,DEC,true,prs_arg); } | #(TIMES var1=out var2=out) { var=ncap_var_var_op(var1,var2, TIMES );} | #(DIVIDE var1=out var2=out) { var=ncap_var_var_op(var1,var2, DIVIDE );} | #(MOD var1=out var2=out) {var=ncap_var_var_op(var1,var2, MOD);} | #(CARET var1=out var2=out) {var=ncap_var_var_op(var1,var2, CARET);} //unary Operators | #(LNOT var1=out ) { var=ncap_var_var_op(var1,NULL_CEWI, LNOT );} | #(MINUS var1=out ) { var=ncap_var_var_op(var1,NULL_CEWI, MINUS );} | #(PLUS var1=out ) // do nothing | #(INC var1=out_asn ) { var=ncap_var_var_inc(var1,NULL_CEWI,INC,false,prs_arg);} | #(DEC var1=out_asn ) { var=ncap_var_var_inc(var1,NULL_CEWI, DEC,false,prs_arg );} | #(POST_INC var1=out_asn ){ var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,false,prs_arg); } | #(POST_DEC var1=out_asn ){ var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,false,prs_arg); } // Logical Operators | #(LAND var1=out var2=out) { var=ncap_var_var_op(var1,var2, LAND );} | #(LOR var1=out var2=out) { var=ncap_var_var_op(var1,var2, LOR );} // Comparison Operators | #(LTHAN var1=out var2=out) { var=ncap_var_var_op(var1,var2, LTHAN );} | #(GTHAN var1=out var2=out) { var=ncap_var_var_op(var1,var2, GTHAN );} | #(GEQ var1=out var2=out) { var=ncap_var_var_op(var1,var2, GEQ );} | #(LEQ var1=out var2=out) { var=ncap_var_var_op(var1,var2, LEQ );} | #(EQ var1=out var2=out) { var=ncap_var_var_op(var1,var2, EQ );} | #(NEQ var1=out var2=out) { var=ncap_var_var_op(var1,var2, NEQ );} // Fortran style Comparison Operators | #(FLTHAN var1=out var2=out) { var=ncap_var_var_op(var1,var2, FLTHAN );} | #(FGTHAN var1=out var2=out) { var=ncap_var_var_op(var1,var2, FGTHAN );} // Assign Operators | #(PLUS_ASSIGN pls_asn:. var2=out) { var1=out_asn(pls_asn); var=ncap_var_var_inc(var1,var2, PLUS_ASSIGN ,(pls_asn->getType()==UTIMES), prs_arg); } | #(MINUS_ASSIGN min_asn:. var2=out){ var1=out_asn(min_asn); var=ncap_var_var_inc(var1,var2, MINUS_ASSIGN ,(min_asn->getType()==UTIMES), prs_arg); } | #(TIMES_ASSIGN tim_asn:. var2=out){ var1=out_asn(tim_asn); var=ncap_var_var_inc(var1,var2, TIMES_ASSIGN ,(tim_asn->getType()==UTIMES), prs_arg); } | #(DIVIDE_ASSIGN div_asn:. var2=out){ var1=out_asn(div_asn); var=ncap_var_var_inc(var1,var2, DIVIDE_ASSIGN ,(div_asn->getType()==UTIMES), prs_arg); } | #(ASSIGN asn:. ) { // Check for RAM variable - if present // change tree - for example from: // ( EXPR ( = ( * n1 ) ( + four four ) ) ) // to ( EXPR ( = n1 ( + four four ) ) ) RefAST tr; bool bram; NcapVar *Nvar; if(asn->getType()==UTIMES){ tr=asn->getFirstChild(); tr->setNextSibling(asn->getNextSibling()); bram=true; } else { tr=asn; bram=false; } // Die if attempting to create a RAM var // from an existing disk var Nvar= prs_arg->var_vtr.find(tr->getText()); if(bram && tr->getType()==VAR_ID && Nvar && Nvar->flg_mem==false){ std::string serr; serr= "It is impossible to recast disk variable: \"" + tr->getText() +"\" as a RAM variable."; err_prn(fnc_nm,serr ); } if(prs_arg->ntl_scn) var=assign_ntl(tr,bram); else var=assign(tr,bram); } | #(WHERE_ASSIGN wasn:. ) { } //ternary Operator | #(QUESTION var1=out qus:.) { bool br; // if initial scan if(prs_arg->ntl_scn){ var=ncap_var_udf("~question"); } else { br=ncap_var_lgcl(var1); if(br) var=out(qus); else var=out(qus->getNextSibling()); } var1=nco_var_free(var1); } // Functions | #(m:FUNC args:FUNC_ARG) { // The lexer has appended the index of the function to the function name m - (name#index) // the index is into fmc_vtr string sm(m->getText()); string sdx(sm,sm.find("#")+1,sm.length()-1) ; int idx=atoi(sdx.c_str()); RefAST tr; var=prs_arg->fmc_vtr[idx].vfnc()->fnd(tr ,args, prs_arg->fmc_vtr[idx],*this); } // Deal with methods | #(DOT mtd:. mfnc:FUNC margs:FUNC_ARG ){ // The lexer has appended the index of the function to the function name m - (name#index) // the index is into fmc_vtr string sm(mfnc->getText()); string sdx(sm,sm.find("#")+1,sm.length()-1) ; int idx=atoi(sdx.c_str()); var=prs_arg->fmc_vtr[idx].vfnc()->fnd(mtd ,margs, prs_arg->fmc_vtr[idx],*this); } | dval:DIM_ID_SIZE { string sDim=dval->getText(); dmn_sct *dmn_fd; // Check output dmn_fd=prs_arg->dmn_out_vtr.find(sDim); // Check input if(dmn_fd==NULL_CEWI) dmn_fd=prs_arg->dmn_in_vtr.find(sDim); // nb there is a problem with the below code // if we have a netcdf4 file and on the intial scan dim is undefined (dmn_fd==NULL) // and on the final scan size >NC_MAX_INT then there is a conflict between // the initial returned type (NC_INT) and the final returned type (NC_INT64) // csz 20100119 Workaround dependence on NC_MAX_INT which DNE in netcdf.h until ~2009 #ifndef NC_MAX_INT # define NC_MAX_INT 2147483647 #endif //Initial Scan if(prs_arg->ntl_scn){ if( (dmn_fd==NULL_CEWI )|| (dmn_fd->sz <= NC_MAX_INT) ) var=ncap_sclr_var_mk(static_cast("~dmn"),(nc_type)NC_INT,false); else var=ncap_sclr_var_mk(static_cast("~dmn"),(nc_type)NC_INT64,false); }else{ if( dmn_fd==NULL_CEWI ) err_prn(fnc_nm,"Unable to locate dimension " +sDim+ " in input or output files "); if(dmn_fd->sz <= NC_MAX_INT ) var=ncap_sclr_var_mk(static_cast("~dmn"),(nco_int)dmn_fd->sz); else var=ncap_sclr_var_mk(static_cast("~dmn"),(nco_int64)dmn_fd->sz); } } // end action // Variable with argument list | (#(VAR_ID LMT_LIST)) => #( vid:VAR_ID lmt:LMT_LIST) { // fxm: 4 Oct 2015 /* the following is valid syntx var_nm(array_var)- array_var now contains all the indices - that is srt vectors srt & end vectors srt,end,srd vectors so for now indexing into a multi-dmensional var using a single index has temporarily been disabled // see if hyperslab limit is a single value if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON) var=var_lmt_one(vid); else var=var_lmt(vid); */ var=var_lmt(vid); } // plain Variable | v:VAR_ID { var=prs_arg->ncap_var_init(v->getText(),true); if(var== NULL){ if(prs_arg->ntl_scn){ var=ncap_var_udf(v->getText().c_str()); return var; }else nco_exit(EXIT_FAILURE); } // apply cast only if sz >1 if(bcst && var->sz >1) var=ncap_cst_do(var,var_cst,prs_arg->ntl_scn); } /* end action */ // PLain attribute | att:ATT_ID { NcapVar *Nvar=NULL; if(prs_arg->ntl_scn) Nvar=prs_arg->int_vtr.find(att->getText()); if(Nvar==NULL) Nvar=prs_arg->var_vtr.find(att->getText()); var=NULL_CEWI; if(Nvar !=NULL) var=nco_var_dpl(Nvar->var); else // Check input file for attribute var=ncap_att_init(att->getText(),prs_arg); if(!prs_arg->ntl_scn && var==NULL_CEWI ){ err_prn(fnc_nm,"Unable to locate attribute " +att->getText()+ " in input or output files."); } // if att not found return undefined if(prs_arg->ntl_scn && var==NULL_CEWI ) var=ncap_var_udf(att->getText().c_str()); if(prs_arg->ntl_scn && var->val.vp !=NULL) var->val.vp=(void*)nco_free(var->val.vp); } // Value list -- stuff values into an attribute | vlst:VALUE_LIST { var=value_list(vlst); } | str:NSTRING { char *tsng; tsng=strdup(str->getText().c_str()); (void)sng_ascii_trn(tsng); var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* Overwrite with attribute expression information */ var->nm=strdup("~zz@string"); var->nbr_dim=0; var->sz=strlen(tsng); var->type=NC_CHAR; if(!prs_arg->ntl_scn){ var->val.vp=(void*)nco_malloc(var->sz*nco_typ_lng(NC_CHAR)); (void)cast_void_nctype((nc_type)NC_CHAR,&var->val); strncpy(var->val.cp,tsng,(size_t)var->sz); (void)cast_nctype_void((nc_type)NC_CHAR,&var->val); } tsng=(char*)nco_free(tsng); } | str1:N4STRING { char *tsng; tsng=strdup(str1->getText().c_str()); (void)sng_ascii_trn(tsng); var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* Overwrite with attribute expression information */ var->nm=strdup("~zz@string"); var->nbr_dim=0; var->sz=1; var->type=(nc_type)NC_STRING; if(!prs_arg->ntl_scn){ // nb sngp is type char** a ragged array of chars // each string terminated by a (char*)NULL var->val.vp=(void*)nco_malloc(nco_typ_lng((nc_type)NC_STRING)); (void)cast_void_nctype((nc_type)NC_STRING,&var->val); var->val.sngp[0]=strdup(tsng); (void)cast_nctype_void((nc_type)NC_STRING,&var->val); } tsng=(char*)nco_free(tsng); } // Naked numbers: Cast is not applied to these numbers | val_float:NCAP_FLOAT {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~float"),(nc_type)NC_FLOAT,false); else var=ncap_sclr_var_mk(SCS("~float"),static_cast(std::strtod(val_float->getText().c_str(),(char **)NULL)));} // end FLOAT | val_double:NCAP_DOUBLE {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~double"),(nc_type)NC_DOUBLE,false); else var=ncap_sclr_var_mk(SCS("~double"),strtod(val_double->getText().c_str(),(char **)NULL));} // end DOUBLE | val_int:NCAP_INT {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int"),(nc_type)NC_INT,false); else var=ncap_sclr_var_mk(SCS("~int"),static_cast(std::strtol(val_int->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end INT | val_short:NCAP_SHORT {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~short"),(nc_type)NC_SHORT,false); else var=ncap_sclr_var_mk(SCS("~short"),static_cast(std::strtol(val_short->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end SHORT | val_byte:NCAP_BYTE {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~byte"),(nc_type)NC_BYTE,false); else var=ncap_sclr_var_mk(SCS("~byte"),static_cast(std::strtol(val_byte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end BYTE // fxm TODO nco851: How to add ENABLE_NETCDF4 #ifdefs to ncoGrammer.g? // Workaround (permanent?) is to add stub netCDF4 forward compatibility prototypes to netCDF3 libnco // #ifdef ENABLE_NETCDF4 | val_ubyte:NCAP_UBYTE {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ubyte"),(nc_type)NC_UBYTE,false); else var=ncap_sclr_var_mk(SCS("~ubyte"),static_cast(std::strtoul(val_ubyte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end UBYTE // NB: sng2nbr converts "255" into nco_ubtye=2. This is not good. // {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ubyte"),(nc_type)NC_UBYTE,false); else var=ncap_sclr_var_mk(SCS("~ubyte"),sng2nbr(val_ubyte->getText(),nco_ubyte_CEWI));} // end UBYTE | val_ushort:NCAP_USHORT {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ushort"),(nc_type)NC_USHORT,false); else var=ncap_sclr_var_mk(SCS("~ushort"),static_cast(std::strtoul(val_ushort->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end USHORT | val_uint:NCAP_UINT {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint"),(nc_type)NC_UINT,false); else var=ncap_sclr_var_mk(SCS("~uint"),static_cast(std::strtoul(val_uint->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end UINT | val_int64:NCAP_INT64 {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int64"),(nc_type)NC_INT64,false); else var=ncap_sclr_var_mk(SCS("~int64"),sng2nbr(val_int64->getText(),nco_int64_CEWI));} // end INT64 // std::strtoll() and std::strtoull() are not (yet) ISO C++ standard //{if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int64"),(nc_type)NC_INT64,false); else var=ncap_sclr_var_mk(SCS("~int64"),static_cast(std::strtoll(val_int64->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end INT64 | val_uint64:NCAP_UINT64 {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint64"),(nc_type)NC_UINT64,false); else var=ncap_sclr_var_mk(SCS("~uint64"),sng2nbr(val_uint64->getText(),nco_uint64_CEWI));} // end UINT64 // std::strtoll() and std::strtoull() are not (yet) ISO C++ standard // {if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint64"),(nc_type)NC_UINT64,false); else var=ncap_sclr_var_mk(SCS("~uint64"),static_cast(std::strtoull(val_uint64->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10)));} // end UINT64 // #endif /* !ENABLE_NETCDF4 */ ; // Return a var or att WITHOUT applying a cast // and checks that the operand is a valid Lvalue // ie that the var or att has NO children!! out_asn returns [var_sct *var] { const std::string fnc_nm("assign_asn"); var=NULL_CEWI; string var_nm_s; NcapVar *Nvar; } : #(UTIMES vid1:VAR_ID) { if(vid1->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +vid1->getText() ); //do attribute inheritance var_nm_s=vid1->getText(); Nvar=prs_arg->var_vtr.find(var_nm_s); if( !Nvar || Nvar->flg_stt==1 ) ncap_att_cpy(var_nm_s,var_nm_s,prs_arg); var=prs_arg->ncap_var_init(var_nm_s,true); if(var== NULL_CEWI){ nco_exit(EXIT_FAILURE); } } | vid:VAR_ID { var_nm_s=vid->getText(); if(vid->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +vid->getText() ); //do attribute inheritance Nvar=prs_arg->var_vtr.find(var_nm_s); if( !Nvar || Nvar->flg_stt==1 ) ncap_att_cpy(var_nm_s,var_nm_s,prs_arg); var=prs_arg->ncap_var_init(var_nm_s,true); if(var== NULL_CEWI){ nco_exit(EXIT_FAILURE); } } /* end action */ // Plain attribute | att:ATT_ID { // check "output" NcapVar *Nvar=NULL; if(att->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +att->getText() ); if(prs_arg->ntl_scn) Nvar=prs_arg->int_vtr.find(att->getText()); if(Nvar==NULL) Nvar=prs_arg->var_vtr.find(att->getText()); var=NULL_CEWI; if(Nvar !=NULL) var=nco_var_dpl(Nvar->var); else var=ncap_att_init(att->getText(),prs_arg); if(!prs_arg->ntl_scn && var==NULL_CEWI ){ err_prn(fnc_nm,"Unable to locate attribute " +att->getText()+ " in input or output files."); } // if att not found return undefined if(prs_arg->ntl_scn && var==NULL_CEWI ) var=ncap_var_udf(att->getText().c_str()); if(prs_arg->ntl_scn && var->val.vp !=NULL) var->val.vp=(void*)nco_free(var->val.vp); }// end action ; value_list returns [var_sct *var] { const std::string fnc_nm("value_list"); var=NULL_CEWI; } :(vlst:VALUE_LIST) { char *cp; int nbr_lst; int idx; int tsz; nc_type type=NC_NAT; var_sct *var_ret; RefAST rRef; std::vector exp_vtr; rRef=vlst->getFirstChild(); while(rRef){ exp_vtr.push_back(out(rRef)); rRef=rRef->getNextSibling(); } nbr_lst=exp_vtr.size(); // if any types are NC_STRING then call value_list_string() action for(idx=0;idx type == NC_STRING){ var_ret=value_list_string(rRef,exp_vtr); goto end_val; } // find highest type for(idx=0;idx type); //(void)ncap_var_retype(exp_vtr[0], exp_vtr[idx]); // Inital Scan if(prs_arg->ntl_scn){ for(idx=0 ; idx undefined) break; // Exit if an element in the list is "undefined" if(idx < nbr_lst){ var_ret=ncap_var_udf("~zz@value_list"); goto end_val; } var_ret=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var_ret); /* Overwrite with attribute expression information */ var_ret->nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=type; goto end_val; } // end initial scan // convert every element in vector to highest type for(idx=0;idx nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=type; tsz=nco_typ_lng(type); var_ret->val.vp=(void*)nco_malloc(nbr_lst*tsz); for(idx=0;idx val.vp)+ (ptrdiff_t)(idx*tsz); memcpy(cp,exp_vtr[idx]->val.vp,tsz); } // Free vector end_val: for(idx=0 ; idx < nbr_lst ; idx++) (void)nco_var_free(exp_vtr[idx]); var=var_ret; } // end action ; // Deal here with a value list of strings // Called only from value_list value_list_string[ std::vector &exp_vtr] returns [var_sct *var] { const std::string fnc_nm("value_list_string"); var=NULL_CEWI; } : { int idx; int nbr_lst; int tsz; nco_string *cp; var_sct *var_ret; nbr_lst=exp_vtr.size(); var_ret=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var_ret); /* Overwrite with attribute expression information */ var_ret->nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=(nc_type)NC_STRING; // Inital Scan if(prs_arg->ntl_scn) goto end_val; // check all var types in vector must be type NC_STRING for(idx=0; idxtype != NC_STRING) err_prn(fnc_nm," error processing value list string: to successfully parse value list of strings all elements must be of type NC_STRING"); // from here on deal with final scan tsz=nco_typ_lng((nc_type)NC_STRING); var_ret->val.vp=(void*)nco_malloc(nbr_lst*tsz); (void)cast_void_nctype((nc_type)NC_STRING,&var_ret->val); cp=var_ret->val.sngp; for(idx=0 ; idxval); cp[idx]=strdup(var_in->val.sngp[0]); // cast pointer back (void)cast_nctype_void((nc_type)NC_STRING,&var_in->val); } // end loop (void)cast_nctype_void((nc_type)NC_STRING,&var_ret->val); end_val: var=var_ret; }// end action ; //where calculate where_assign [var_sct *var_msk] returns [bool bret=false] { const std::string fnc_nm("where_assign"); var_sct *var_rhs; } :#(EXPR #(ASSIGN vid:VAR_ID var_rhs=out)) { bool bfr=false; nco_bool DO_CONFORM; std::string var_nm=vid->getText(); var_sct *var_lhs; NcapVar *Nvar; bret=false; var_lhs=prs_arg->ncap_var_init(var_nm,true); if(var_lhs==NULL_CEWI) nco_exit(EXIT_FAILURE); var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); if(var_rhs->sz >1L && var_rhs->sz != var_lhs->sz) { var_sct *var_tmp=NULL_CEWI; // try and make RHS conform to LHS var_tmp=nco_var_cnf_dmn(var_lhs,var_rhs,var_tmp,True,&DO_CONFORM); if(DO_CONFORM==False) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and variable "<nm <<" conform in where statement."; err_prn(fnc_nm,os.str()); } if(var_rhs != var_tmp){ var_rhs=nco_var_free(var_rhs); var_rhs=var_tmp; } } // Make mask conform if(var_msk->sz != var_lhs->sz){ var_sct *var_tmp=NULL_CEWI; var_tmp=nco_var_cnf_dmn(var_lhs,var_msk,var_tmp,True,&DO_CONFORM); if(DO_CONFORM==False) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and where mask variable "<nm <<" conform. "; err_prn(fnc_nm,os.str()); } if(var_msk != var_tmp){ //var_msk=nco_var_free(var_msk); bfr=true; var_msk=var_tmp; } } char *cp_in; char *cp_out; short *sp; long idx; long jdx; long sz; size_t slb_sz; sz=var_lhs->sz; slb_sz=nco_typ_lng(var_lhs->type); (void)cast_void_nctype(NC_SHORT,&var_msk->val); //Dereference sp=var_msk->val.sp; cp_out=( char*)(var_lhs->val.vp); cp_in=( char*)(var_rhs->val.vp); if(var_rhs->sz==1L){ for(idx=0; idxval); // free "local" copy of var_msk if necessary if(bfr) var_msk=nco_var_free(var_msk); // Do attribute propagation if LHS is new Nvar=prs_arg->var_vtr.find(var_nm); if(!Nvar) (void)ncap_att_cpy(var_nm,std::string(var_rhs->nm),prs_arg); var_rhs=nco_var_free(var_rhs); prs_arg->ncap_var_write(var_lhs,false); bret=true; } ; //Calculate scalar hyperslab where there is a single limit for a possibly // multi-dimensional variable var_lmt_one returns [var_sct *var] { const std::string fnc_nm("var_lmt_one"); var=NULL_CEWI; var_sct *var_nbr; } :#(vid:VAR_ID #(LMT_LIST #(LMT var_nbr=out))) { int idx; var_sct *var_rhs; std::string var_nm; var_nm=vid->getText(); var_rhs=prs_arg->ncap_var_init(var_nm,false); if(var_rhs->undefined){ var=ncap_var_udf("~rhs_undefined"); goto end0; // cannot use return var!! } if(prs_arg->ntl_scn){ var=ncap_sclr_var_mk(var_nm,(nc_type)(var_rhs->type),false); }else{ bool bram; int fl_id; int nbr_dim=var_rhs->nbr_dim; long srt; long srt1[NC_MAX_DIMS]; long sz_dim=1; NcapVar *Nvar; // create var with space for value var=ncap_sclr_var_mk(var_nm,(nc_type)(var_rhs->type),true); // we have already checked limit is a single value // in the calling action earlier in the tree parser //var_nbr=out(lmt->getFirstChild()); var_nbr=nco_var_cnf_typ(NC_INT,var_nbr); (void)cast_void_nctype(NC_INT,&var_nbr->val); srt=var_nbr->val.ip[0]; (void)cast_nctype_void(NC_INT,&var_nbr->val); // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if ( srt<0) srt+=var_rhs->sz-1; // deal with negative index // do some bounds checking if(srt >= var_rhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_rhs->sz)+" is out of bounds\n"); // check for RAM variable Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_mem) bram=true; else bram=false; if(bram){ // deal with RAM variable size_t slb_sz; slb_sz=nco_typ_lng(var_rhs->type); (void)memcpy(var->val.vp,(const char*)Nvar->var->val.vp+(ptrdiff_t)(srt*slb_sz),slb_sz); }else{ // variable in output and defined if(Nvar && Nvar->flg_stt==2) { #ifdef _OPENMP fl_id=( omp_in_parallel() ? prs_arg->out_id_readonly : prs_arg->out_id ); #else fl_id=prs_arg->out_id; #endif // variable output but undefined }else if(Nvar && Nvar->flg_stt==1) { fl_id=prs_arg->in_id; (void)nco_inq_varid(fl_id,var_nm.c_str(),&var_rhs->id); // variable in input }else{ fl_id=prs_arg->in_id; } // convert srt into multiple indices for(idx=0;idxcnt[idx]; for(idx=0; idxcnt[idx]; srt1[idx]=srt/sz_dim; srt-=srt1[idx]*sz_dim; } (void)nco_get_var1(fl_id,var_rhs->id,srt1,var->val.vp,var_rhs->type); } // end else !bram // copy missing value if any over nco_mss_val_cp(var_rhs,var); } // end else !prs_arg->ntl_scn end0: var_nbr=nco_var_free(var_nbr); var_rhs=nco_var_free(var_rhs); } ; //Calculate scalar LHS hyperslab where there is a single limit for a possibly // multi-dimensional variable var_lmt_one_lhs[bool bram] returns [var_sct *var] { const std::string fnc_nm("var_lmt_one_lhs"); var=NULL_CEWI; var_sct *var_nbr; } :#(vid:VAR_ID #(LMT_LIST #(LMT var_nbr=out))) { int idx; int var_id; int slb_sz; long srt; std::string var_nm; var_sct *var_lhs=NULL_CEWI; var_sct *var_rhs=NULL_CEWI; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() > nco_dbg_var) dbg_prn(fnc_nm,var_nm+"(limit)"); Nvar=prs_arg->var_vtr.find(var_nm); // calculate single hyperslab limit var_nbr=nco_var_cnf_typ(NC_INT,var_nbr); (void)cast_void_nctype(NC_INT,&var_nbr->val); srt=var_nbr->val.ip[0]; (void)cast_nctype_void(NC_INT,&var_nbr->val); // Overwrite bram possibly if(Nvar) bram=Nvar->flg_mem; // Deal with RAM variables if(bram){ if(Nvar){ //defined but not-populated if(Nvar->flg_stt==1){ var_sct *var_ini; var_ini=prs_arg->ncap_var_init(var_nm,true); Nvar->var->val.vp=var_ini->val.vp; var_ini->val.vp=(void*)NULL; var_ini=nco_var_free(var_ini); Nvar->flg_stt=2; } //defined and populated if(Nvar->flg_stt==2) var_lhs=Nvar->var; }else{ var_lhs=prs_arg->ncap_var_init(var_nm,true); } // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if(srt<0) srt+=var_lhs->sz-1; //deal with negative index convention // do some bounds checking on single limits if(srt >= var_lhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_lhs->sz)+" is out of bounds\n"); //calculate rhs var_rhs=out(vid->getNextSibling()); // we are only hyperslabbing a single value if(var_rhs->sz !=1) err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(1) doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); slb_sz=nco_typ_lng(var_lhs->type); (void)memcpy((char*)var_lhs->val.vp+(ptrdiff_t)(srt*slb_sz),var_rhs->val.vp,slb_sz); if(!Nvar) (void)prs_arg->ncap_var_write(var_lhs,true); // deal with regular vars }else{ // if var undefined in O or defined but not populated if(!Nvar || ( Nvar && Nvar->flg_stt==1)){ // if var isn't in ouptut then copy it there var_lhs=prs_arg->ncap_var_init(var_nm,true); // copy atts to output (void)ncap_att_cpy(var_nm,var_nm,prs_arg); (void)prs_arg->ncap_var_write(var_lhs,false); } var_lhs=prs_arg->ncap_var_init(var_nm,false); // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if(srt<0) srt+=var_lhs->sz-1; //deal with negative index convention // do some bounds checking on single limits if(srt >= var_lhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_lhs->sz)+" is out of bounds\n"); // Grab RHS var_rhs=out(vid->getNextSibling()); // we are only hyperslabbing a single value if(var_rhs->sz !=1) err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(1) doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // swap values about var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; // write block { int nbr_dim=var_lhs->nbr_dim; long srt1[NC_MAX_DIMS]; long sz_dim=1; // convert srt into multiple indices for(idx=0;idxcnt[idx]; for(idx=0; idxcnt[idx]; srt1[idx]=srt/sz_dim; srt-=srt1[idx]*sz_dim; } for(idx=0;idxsrt[idx]=srt1[idx]; var_lhs->cnt[idx]=1L; var_lhs->srd[idx]=1L; } /* end loop over idx */ // write slab to O contains call to Open MP critical region // routine also frees up var_lhs (void)prs_arg->ncap_var_write_slb(var_lhs); }//end write block } var_rhs=nco_var_free(var_rhs); var_nbr=nco_var_free(var_nbr); } ; //Calculate var with limits var_lmt returns [var_sct *var] { const std::string fnc_nm("var_lmt"); var=NULL_CEWI; } :#(vid:VAR_ID lmt:LMT_LIST) { bool bram; // Check for a RAM variable bool bnrm; int idx; int nbr_dmn; int fl_id; var_sct *var1; var_sct *var_rhs; std::string var_nm; NcapVar *Nvar; RefAST lRef; NcapVector lmt_vtr; NcapVector dmn_vtr; NcapVector dmn_nrm_vtr; // list of dimension names var_nm=vid->getText(); var_rhs=prs_arg->ncap_var_init(var_nm,false); if(var_rhs->undefined){ var=ncap_var_udf("~rhs_undefined"); goto end2; // cannot use return var!! } nbr_dmn=var_rhs->nbr_dim; lRef=lmt; if(prs_arg->ntl_scn){ // check limit only contains numbers or dim_id.size() std::vector str_vtr; (void)ncap_mpi_get_id(lRef,str_vtr); if(str_vtr.size()>0){ var=ncap_var_udf("~rhs_undefined"); goto end2; // cannot use return var!! } // Temporarily change mode prs_arg->ntl_scn=False; lmt_mk(nbr_dmn,lRef,lmt_vtr); prs_arg->ntl_scn=True; }else{ lmt_mk(nbr_dmn,lRef,lmt_vtr); } if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_rhs->dim[idx]->nm); // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++) (void)ncap_lmt_evl(var_rhs->nc_id,lmt_vtr[idx],prs_arg); // See if var can be normalized for(idx=0; idxcnt==1) continue; if(lmt_vtr[idx]->cnt == var_rhs->dim[idx]->cnt) dmn_nrm_vtr.push_back(std::string(lmt_vtr[idx]->nm)); else break; } bnrm= (idx==nbr_dmn ? true:false); // deal more with inital scan if(prs_arg->ntl_scn){ if(bnrm){ var=ncap_cst_mk(dmn_nrm_vtr,prs_arg); (void)nco_free(var->nm); var->nm=strdup(var_nm.c_str()); var=nco_var_cnf_typ(var_rhs->type,var); // apply LHS cast if necessary if(var->sz>1 && bcst) var=ncap_cst_do(var,var_cst,prs_arg->ntl_scn); }else{ var=ncap_var_udf("~rhs_undefined"); } goto end1; } /**** From here on we are dealing with a final scan ****/ // copy lmt_sct to dmn_sct; for(idx=0 ;idx nm=strdup(lmt_vtr[idx]->nm); // Fudge -if the variable is from input then nco_lmt_evl // overwrites the dim id's with their input file values // we want the dim ids from output dmn_nw->id=var_rhs->dim[idx]->id; //dmn_nw->id=lmt_vtr[idx]->id; dmn_nw->cnt=lmt_vtr[idx]->cnt; dmn_nw->srt=lmt_vtr[idx]->srt; dmn_nw->end=lmt_vtr[idx]->end; dmn_nw->srd=lmt_vtr[idx]->srd; dmn_vtr.push_back(dmn_nw); } Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_mem) bram=true; else bram=false; // Ram variable -do an in memory get if(bram){ var=prs_arg->ncap_var_init(var_nm,true); //Do an in memory get (void)nco_get_var_mem(var,dmn_vtr); // put values from dmn_vtr back into var // nb above call has already calculated correct value for // var->sz; for(idx=0;idxsrt[idx]=dmn_vtr[idx]->srt; var->end[idx]=dmn_vtr[idx]->end; var->cnt[idx]=dmn_vtr[idx]->cnt; var->srd[idx]=dmn_vtr[idx]->srd; } // regular variable }else{ // variable in output if(Nvar){ #ifdef _OPENMP fl_id=( omp_in_parallel() ? prs_arg->out_id_readonly : prs_arg->out_id); #else fl_id=prs_arg->out_id; #endif // variable in input }else{ fl_id=prs_arg->in_id; } // Fudge -- fill out var again -but using dims defined in dmn_vtr // We need data in var so that LHS logic in assign can access var shape var=nco_var_fll(fl_id,var_rhs->id,var_nm.c_str(), &dmn_vtr[0],dmn_vtr.size()); //var->sz*=2; // Now get data from disk - use nco_var_get() (void)nco_var_get(fl_id,var); } // end if(nbram) // copy missing value over nco_mss_val_cp(var_rhs,var); /* a hack - we set var->has_dpl_dmn=-1 so we know we are dealing with a hyperslabbed var and not a regular var -- It shouldn't cause any abberant behaviour!! */ var->has_dpl_dmn=-1; // if variable is scalar re-organize in a new var // loose extraneous material so it looks like a // plain scalar variable if(var->sz ==1) { var1=ncap_sclr_var_mk(var_nm,var->type,true); (void)memcpy( (void*)var1->val.vp,var->val.vp,nco_typ_lng(var1->type)); // copy missing value if any from var_rhs to var1 nco_mss_val_cp(var_rhs,var1); // free main var var=nco_var_free(var); var=var1; // if hyperslab -nomalizable // nb the returned var is just like a regular var }else if(bnrm) { // nb dmn_nrm_vtr was populated much earlier in function var1=ncap_cst_mk(dmn_nrm_vtr,prs_arg); (void)nco_free(var1->nm); var1->nm=strdup(var_nm.c_str()); var1=nco_var_cnf_typ(var_rhs->type,var1); // copy missing value if any from var_rhs to var nco_mss_val_cp(var_rhs,var1); // swap values about in var1 & var var1->val.vp=var->val.vp; var->val.vp=(void*)NULL; // free var (void)nco_var_free(var); /* Casting a hyperslab --this makes my brain hurt!!! if the var is already the correct size then do nothing what not even dimension reordering ? */ if(bcst && var1->sz != var_cst->sz) var1=ncap_cst_do(var1,var_cst,prs_arg->ntl_scn); var=var1; }else{ /* A sophisticated hack, var->dim currently contains the local dims from dmn_vtr . We cannot leave them in place as they will never be freed up, and if the var is copied then complications will result. So we replace them with the regular dims in prs_arg->dmn_out_vtr. Currently only one function explicitly references these dims This is the agg_cls::fnd -- The Aggregate Functions Unpredicable behaviour will result when this hyperslabbed var is passed to other functions */ for(idx=0 ; idxdim[idx]=prs_arg->dmn_out_vtr.find(dmn_vtr[idx]->nm); } //free vectors for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_dmn_free(dmn_vtr[idx]); ; end1: ; for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_lmt_free(lmt_vtr[idx]); end2: var_rhs=nco_var_free(var_rhs); } ; nco-4.5.4/src/nco++/ncoLexer.cpp000066400000000000000000002210001264355130400162600ustar00rootroot00000000000000/* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoLexer.cpp"$ */ #include "ncoLexer.hpp" #include #include #include #include #include #include #include #line 1 "ncoGrammer.g" #line 13 "ncoLexer.cpp" ncoLexer::ncoLexer(ANTLR_USE_NAMESPACE(std)istream& in) : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),true) { initLiterals(); } ncoLexer::ncoLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib) : ANTLR_USE_NAMESPACE(antlr)CharScanner(ib,true) { initLiterals(); } ncoLexer::ncoLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state) : ANTLR_USE_NAMESPACE(antlr)CharScanner(state,true) { initLiterals(); } void ncoLexer::initLiterals() { literals["<<"] = 96; literals["for"] = 49; literals["print"] = 44; literals["defdimunlim"] = 32; literals["where"] = 42; literals["elsewhere"] = 43; literals["continue"] = 39; literals["while"] = 37; literals[">>"] = 97; literals["break"] = 38; literals["if"] = 40; literals["else"] = 41; literals["defdim"] = 31; } ANTLR_USE_NAMESPACE(antlr)RefToken ncoLexer::nextToken() { ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken; for (;;) { ANTLR_USE_NAMESPACE(antlr)RefToken theRetToken; int _ttype = ANTLR_USE_NAMESPACE(antlr)Token::INVALID_TYPE; setCommitToPath(false); int _m; _m = mark(); resetText(); try { // for lexical and char stream error handling switch ( LA(1)) { case 0x3f /* '?' */ : { mQUESTION(true); theRetToken=_returnToken; break; } case 0x28 /* '(' */ : { mLPAREN(true); theRetToken=_returnToken; break; } case 0x29 /* ')' */ : { mRPAREN(true); theRetToken=_returnToken; break; } case 0x7b /* '{' */ : { mLCURL(true); theRetToken=_returnToken; break; } case 0x7d /* '}' */ : { mRCURL(true); theRetToken=_returnToken; break; } case 0x5b /* '[' */ : { mLSQUARE(true); theRetToken=_returnToken; break; } case 0x5d /* ']' */ : { mRSQUARE(true); theRetToken=_returnToken; break; } case 0x2c /* ',' */ : { mCOMMA(true); theRetToken=_returnToken; break; } case 0x3b /* ';' */ : { mSEMI(true); theRetToken=_returnToken; break; } case 0x3a /* ':' */ : { mCOLON(true); theRetToken=_returnToken; break; } case 0x9 /* '\t' */ : case 0xa /* '\n' */ : case 0xc /* '\14' */ : case 0x20 /* ' ' */ : { mWS(true); theRetToken=_returnToken; break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { mNUMBER(true); theRetToken=_returnToken; break; } case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mVAR_ATT(true); theRetToken=_returnToken; break; } case 0x40 /* '@' */ : { mSTR_ATT_ID(true); theRetToken=_returnToken; break; } case 0x23 /* '#' */ : { mINCLUDE(true); theRetToken=_returnToken; break; } default: if ((LA(1) == 0x2b /* '+' */ ) && (LA(2) == 0x3d /* '=' */ )) { mPLUS_ASSIGN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x3d /* '=' */ )) { mMINUS_ASSIGN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2a /* '*' */ ) && (LA(2) == 0x3d /* '=' */ )) { mTIMES_ASSIGN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x3d /* '=' */ )) { mDIVIDE_ASSIGN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2b /* '+' */ ) && (LA(2) == 0x2b /* '+' */ )) { mINC(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2d /* '-' */ ) && (LA(2) == 0x2d /* '-' */ )) { mDEC(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3d /* '=' */ ) && (LA(2) == 0x3d /* '=' */ )) { mEQ(true); theRetToken=_returnToken; } else if ((LA(1) == 0x21 /* '!' */ ) && (LA(2) == 0x3d /* '=' */ )) { mNEQ(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3d /* '=' */ )) { mLEQ(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3d /* '=' */ )) { mGEQ(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3c /* '<' */ ) && (LA(2) == 0x3c /* '<' */ )) { mFLTHAN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3e /* '>' */ ) && (LA(2) == 0x3e /* '>' */ )) { mFGTHAN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x26 /* '&' */ ) && (LA(2) == 0x26 /* '&' */ )) { mLAND(true); theRetToken=_returnToken; } else if ((LA(1) == 0x7c /* '|' */ ) && (LA(2) == 0x7c /* '|' */ )) { mLOR(true); theRetToken=_returnToken; } else if ((_tokenSet_0.member(LA(1))) && (LA(2) == 0x3d /* '=' */ )) { mUNUSED_OPS(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x2f /* '/' */ )) { mCXX_COMMENT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2f /* '/' */ ) && (LA(2) == 0x2a /* '*' */ )) { mC_COMMENT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2e /* '.' */ ) && ((LA(2) >= 0x30 /* '0' */ && LA(2) <= 0x39 /* '9' */ ))) { mNUMBER_DOT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x27 /* '\'' */ ) && (_tokenSet_1.member(LA(2)))) { mVAR_ATT_QT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x27 /* '\'' */ ) && (LA(2) == 0x40 /* '@' */ )) { mSTR_ATT_QT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x27 /* '\'' */ ) && (LA(2) == 0x24 /* '$' */ )) { mDIM_QT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x24 /* '$' */ ) && (_tokenSet_2.member(LA(2)))) { mDIM_VAL(true); theRetToken=_returnToken; } else if ((LA(1) == 0x24 /* '$' */ ) && ((LA(2) >= 0x30 /* '0' */ && LA(2) <= 0x39 /* '9' */ ))) { mDIM_MTD_ID(true); theRetToken=_returnToken; } else if ((LA(1) == 0x22 /* '\"' */ ) && (_tokenSet_3.member(LA(2)))) { mNSTRING(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3d /* '=' */ ) && (true)) { mASSIGN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x22 /* '\"' */ ) && (true)) { mQUOTE(true); theRetToken=_returnToken; } else if ((LA(1) == 0x5e /* '^' */ ) && (true)) { mCARET(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2a /* '*' */ ) && (true)) { mTIMES(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2f /* '/' */ ) && (true)) { mDIVIDE(true); theRetToken=_returnToken; } else if ((LA(1) == 0x25 /* '%' */ ) && (true)) { mMOD(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2b /* '+' */ ) && (true)) { mPLUS(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2d /* '-' */ ) && (true)) { mMINUS(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3c /* '<' */ ) && (true)) { mLTHAN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x3e /* '>' */ ) && (true)) { mGTHAN(true); theRetToken=_returnToken; } else if ((LA(1) == 0x21 /* '!' */ ) && (true)) { mLNOT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x2e /* '.' */ ) && (true)) { mDOT(true); theRetToken=_returnToken; } else if ((LA(1) == 0x26 /* '&' */ ) && (true)) { mCALL_REF(true); theRetToken=_returnToken; } else { if (LA(1)==EOF_CHAR) { uponEOF(); _returnToken = makeToken(ANTLR_USE_NAMESPACE(antlr)Token::EOF_TYPE); } else { commit(); try {mBLASTOUT(false);} catch(ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) { // catastrophic failure reportError(e); consume(); } goto tryAgain; } } } commit(); if ( !_returnToken ) goto tryAgain; // found SKIP token _ttype = _returnToken->getType(); _returnToken->setType(_ttype); return _returnToken; } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& e) { if ( !getCommitToPath() ) { rewind(_m); resetText(); try {mBLASTOUT(false);} catch(ANTLR_USE_NAMESPACE(antlr)RecognitionException& ee) { // horrendous failure: error in filter rule reportError(ee); consume(); } } else throw ANTLR_USE_NAMESPACE(antlr)TokenStreamRecognitionException(e); } catch (ANTLR_USE_NAMESPACE(antlr)CharStreamIOException& csie) { throw ANTLR_USE_NAMESPACE(antlr)TokenStreamIOException(csie.io); } catch (ANTLR_USE_NAMESPACE(antlr)CharStreamException& cse) { throw ANTLR_USE_NAMESPACE(antlr)TokenStreamException(cse.getMessage()); } tryAgain:; } } void ncoLexer::mASSIGN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = ASSIGN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('=' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mPLUS_ASSIGN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = PLUS_ASSIGN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("+="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mMINUS_ASSIGN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = MINUS_ASSIGN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("-="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mTIMES_ASSIGN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = TIMES_ASSIGN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("*="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDIVIDE_ASSIGN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DIVIDE_ASSIGN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("/="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mINC(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = INC; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("++"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDEC(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DEC; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("--"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mQUESTION(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = QUESTION; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('?' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLPAREN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LPAREN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('(' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mRPAREN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = RPAREN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(')' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLCURL(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LCURL; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('{' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mRCURL(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = RCURL; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('}' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLSQUARE(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LSQUARE; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('[' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mRSQUARE(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = RSQUARE; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(']' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mCOMMA(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = COMMA; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(',' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mQUOTE(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = QUOTE; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('\"' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mSEMI(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = SEMI; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(';' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mCOLON(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = COLON; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(':' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mCARET(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = CARET; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('^' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mTIMES(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = TIMES; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('*' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDIVIDE(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DIVIDE; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('/' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mMOD(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = MOD; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('%' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mPLUS(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = PLUS; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('+' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mMINUS(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = MINUS; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('-' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mEQ(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = EQ; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("=="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mNEQ(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = NEQ; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("!="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLTHAN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LTHAN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('<' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mGTHAN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = GTHAN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('>' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLEQ(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LEQ; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("<="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mGEQ(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = GEQ; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(">="); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mFLTHAN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = FLTHAN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("<<"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mFGTHAN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = FGTHAN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match(">>"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLAND(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LAND; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("&&"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLNOT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LNOT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('!' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLOR(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LOR; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("||"); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDOT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DOT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('.' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mCALL_REF(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = CALL_REF; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('&' /* charlit */ ); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDGT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DGT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { matchRange('0','9'); } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLPH(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LPH; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { switch ( LA(1)) { case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { matchRange('a','z'); break; } case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : { matchRange('A','Z'); break; } case 0x5f /* '_' */ : { match('_' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mLPHDGT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = LPHDGT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { switch ( LA(1)) { case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { matchRange('a','z'); break; } case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : { matchRange('A','Z'); break; } case 0x5f /* '_' */ : { match('_' /* charlit */ ); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { matchRange('0','9'); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mXPN(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = XPN; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { switch ( LA(1)) { case 0x65 /* 'e' */ : { match('e' /* charlit */ ); break; } case 0x45 /* 'E' */ : { match('E' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } { switch ( LA(1)) { case 0x2b /* '+' */ : { match('+' /* charlit */ ); break; } case 0x2d /* '-' */ : { match('-' /* charlit */ ); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } { // ( ... )+ int _cnt143=0; for (;;) { if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { matchRange('0','9'); } else { if ( _cnt143>=1 ) { goto _loop143; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} } _cnt143++; } _loop143:; } // ( ... )+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mVAR_NM_QT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = VAR_NM_QT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { // ( ... )+ int _cnt146=0; for (;;) { switch ( LA(1)) { case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mLPHDGT(false); break; } case 0x2d /* '-' */ : { match('-' /* charlit */ ); break; } case 0x2b /* '+' */ : { match('+' /* charlit */ ); break; } case 0x2e /* '.' */ : { match('.' /* charlit */ ); break; } case 0x28 /* '(' */ : { match('(' /* charlit */ ); break; } case 0x29 /* ')' */ : { match(')' /* charlit */ ); break; } case 0x3a /* ':' */ : { match(':' /* charlit */ ); break; } default: { if ( _cnt146>=1 ) { goto _loop146; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} } } _cnt146++; } _loop146:; } // ( ... )+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mBLASTOUT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = BLASTOUT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; matchNot(EOF/*_CHAR*/); #line 455 "ncoGrammer.g" // blast out of lexer & parser // Can't use RecognitionException() as // this is caught in lexer -- use TokenStreamRecognitionException() // instead -- This takes us back to try block in Invoke ostringstream os; char ch=LA(0); os << getFilename() << " line " << getLine() << ", column "<< getColumn() << ": unexpected character '" << ch << "'" <setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mUNUSED_OPS(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = UNUSED_OPS; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { switch ( LA(1)) { case 0x25 /* '%' */ : { match("%="); break; } case 0x5e /* '^' */ : { match("^="); break; } case 0x26 /* '&' */ : { match("&="); break; } case 0x7c /* '|' */ : { match("|="); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 471 "ncoGrammer.g" ostringstream os; os << getFilename() << " line " << getLine() << ", column "<< getColumn() << ": unused operator '" << getText() << "'" <setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mWS(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = WS; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { switch ( LA(1)) { case 0x20 /* ' ' */ : { match(' ' /* charlit */ ); break; } case 0x9 /* '\t' */ : { match('\t' /* charlit */ ); #line 484 "ncoGrammer.g" tab(); #line 1432 "ncoLexer.cpp" break; } case 0xc /* '\14' */ : { match('\14' /* charlit */ ); break; } case 0xa /* '\n' */ : { match('\n' /* charlit */ ); #line 484 "ncoGrammer.g" newline(); #line 1445 "ncoLexer.cpp" break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 485 "ncoGrammer.g" _ttype = antlr::Token::SKIP; #line 1456 "ncoLexer.cpp" if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mCXX_COMMENT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = CXX_COMMENT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("//"); { // ( ... )* for (;;) { if ((_tokenSet_3.member(LA(1)))) { matchNot('\n' /* charlit */ ); } else { goto _loop154; } } _loop154:; } // ( ... )* match('\n' /* charlit */ ); #line 490 "ncoGrammer.g" _ttype = antlr::Token::SKIP; newline(); #line 1486 "ncoLexer.cpp" if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mC_COMMENT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = C_COMMENT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match("/*"); { // ( ... )* for (;;) { if (((LA(1) == 0x2a /* '*' */ ) && ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff)) && ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff)))&&( LA(2) != '/' )) { match('*' /* charlit */ ); } else if ((LA(1) == 0xa /* '\n' */ || LA(1) == 0xd /* '\r' */ )) { { switch ( LA(1)) { case 0xd /* '\r' */ : { match('\r' /* charlit */ ); break; } case 0xa /* '\n' */ : { match('\n' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 497 "ncoGrammer.g" newline(); #line 1527 "ncoLexer.cpp" } else if ((_tokenSet_4.member(LA(1)))) { { match(_tokenSet_4); } } else { goto _loop159; } } _loop159:; } // ( ... )* match("*/"); #line 501 "ncoGrammer.g" _ttype = antlr::Token::SKIP; #line 1544 "ncoLexer.cpp" if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mNUMBER_DOT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = NUMBER_DOT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('.' /* charlit */ ); { // ( ... )+ int _cnt162=0; for (;;) { if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { mDGT(false); } else { if ( _cnt162>=1 ) { goto _loop162; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} } _cnt162++; } _loop162:; } // ( ... )+ { if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */ )) { mXPN(false); } else { } } #line 508 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 1583 "ncoLexer.cpp" { switch ( LA(1)) { case 0x44 /* 'D' */ : case 0x64 /* 'd' */ : { { switch ( LA(1)) { case 0x44 /* 'D' */ : { match('D' /* charlit */ ); break; } case 0x64 /* 'd' */ : { match('d' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 509 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 1609 "ncoLexer.cpp" break; } case 0x46 /* 'F' */ : case 0x66 /* 'f' */ : { { switch ( LA(1)) { case 0x46 /* 'F' */ : { match('F' /* charlit */ ); break; } case 0x66 /* 'f' */ : { match('f' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 510 "ncoGrammer.g" _ttype = NCAP_FLOAT; #line 1635 "ncoLexer.cpp" break; } case 0x4c /* 'L' */ : case 0x6c /* 'l' */ : { { switch ( LA(1)) { case 0x4c /* 'L' */ : { match('L' /* charlit */ ); break; } case 0x6c /* 'l' */ : { match('l' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 511 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 1661 "ncoLexer.cpp" break; } default: { } } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mNUMBER(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = NUMBER; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { // ( ... )+ int _cnt170=0; for (;;) { if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { mDGT(false); } else { if ( _cnt170>=1 ) { goto _loop170; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} } _cnt170++; } _loop170:; } // ( ... )+ #line 516 "ncoGrammer.g" _ttype = NCAP_INT; #line 1698 "ncoLexer.cpp" { switch ( LA(1)) { case 0x2e /* '.' */ : { { match('.' /* charlit */ ); { // ( ... )* for (;;) { if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { mDGT(false); } else { goto _loop174; } } _loop174:; } // ( ... )* { if ((LA(1) == 0x4c /* 'L' */ || LA(1) == 0x6c /* 'l' */ )) { { switch ( LA(1)) { case 0x4c /* 'L' */ : { match('L' /* charlit */ ); break; } case 0x6c /* 'l' */ : { match('l' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } } else { { if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */ )) { mXPN(false); } else { } } } } } #line 517 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 1753 "ncoLexer.cpp" break; } case 0x45 /* 'E' */ : case 0x65 /* 'e' */ : { { mXPN(false); } #line 518 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 1764 "ncoLexer.cpp" break; } case 0x53 /* 'S' */ : case 0x73 /* 's' */ : { { switch ( LA(1)) { case 0x53 /* 'S' */ : { match('S' /* charlit */ ); break; } case 0x73 /* 's' */ : { match('s' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 520 "ncoGrammer.g" _ttype = NCAP_SHORT; #line 1790 "ncoLexer.cpp" break; } case 0x42 /* 'B' */ : case 0x62 /* 'b' */ : { { switch ( LA(1)) { case 0x42 /* 'B' */ : { match('B' /* charlit */ ); break; } case 0x62 /* 'b' */ : { match('b' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 521 "ncoGrammer.g" _ttype = NCAP_BYTE; #line 1816 "ncoLexer.cpp" break; } default: if ((LA(1) == 0x55 /* 'U' */ || LA(1) == 0x75 /* 'u' */ ) && (LA(2) == 0x4c /* 'L' */ || LA(2) == 0x6c /* 'l' */ ) && (LA(3) == 0x4c /* 'L' */ || LA(3) == 0x6c /* 'l' */ )) { { switch ( LA(1)) { case 0x55 /* 'U' */ : { match("ULL"); break; } case 0x75 /* 'u' */ : { match("ull"); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 526 "ncoGrammer.g" _ttype = NCAP_UINT64; #line 1841 "ncoLexer.cpp" } else if ((LA(1) == 0x55 /* 'U' */ || LA(1) == 0x75 /* 'u' */ ) && (LA(2) == 0x42 /* 'B' */ || LA(2) == 0x62 /* 'b' */ )) { { switch ( LA(1)) { case 0x55 /* 'U' */ : { match("UB"); break; } case 0x75 /* 'u' */ : { match("ub"); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 522 "ncoGrammer.g" _ttype = NCAP_UBYTE; #line 1864 "ncoLexer.cpp" } else if ((LA(1) == 0x55 /* 'U' */ || LA(1) == 0x75 /* 'u' */ ) && (LA(2) == 0x53 /* 'S' */ || LA(2) == 0x73 /* 's' */ )) { { switch ( LA(1)) { case 0x55 /* 'U' */ : { match("US"); break; } case 0x75 /* 'u' */ : { match("us"); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 523 "ncoGrammer.g" _ttype = NCAP_USHORT; #line 1887 "ncoLexer.cpp" } else if ((LA(1) == 0x4c /* 'L' */ || LA(1) == 0x6c /* 'l' */ ) && (LA(2) == 0x4c /* 'L' */ || LA(2) == 0x6c /* 'l' */ )) { { switch ( LA(1)) { case 0x4c /* 'L' */ : { match("LL"); break; } case 0x6c /* 'l' */ : { match("ll"); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 525 "ncoGrammer.g" _ttype = NCAP_INT64; #line 1910 "ncoLexer.cpp" } else if ((LA(1) == 0x4c /* 'L' */ || LA(1) == 0x6c /* 'l' */ ) && (true)) { { switch ( LA(1)) { case 0x4c /* 'L' */ : { match('L' /* charlit */ ); break; } case 0x6c /* 'l' */ : { match('l' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 519 "ncoGrammer.g" _ttype = NCAP_INT; #line 1933 "ncoLexer.cpp" } else if ((LA(1) == 0x55 /* 'U' */ || LA(1) == 0x75 /* 'u' */ ) && (true) && (true)) { { if ((LA(1) == 0x55 /* 'U' */ ) && (LA(2) == 0x4c /* 'L' */ )) { match("UL"); } else if ((LA(1) == 0x75 /* 'u' */ ) && (LA(2) == 0x6c /* 'l' */ )) { match("ul"); } else if ((LA(1) == 0x55 /* 'U' */ ) && (true)) { match('U' /* charlit */ ); } else if ((LA(1) == 0x75 /* 'u' */ ) && (true)) { match('u' /* charlit */ ); } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } #line 524 "ncoGrammer.g" _ttype = NCAP_UINT; #line 1956 "ncoLexer.cpp" } else { } } } { switch ( LA(1)) { case 0x46 /* 'F' */ : case 0x66 /* 'f' */ : { { switch ( LA(1)) { case 0x46 /* 'F' */ : { match('F' /* charlit */ ); break; } case 0x66 /* 'f' */ : { match('f' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 528 "ncoGrammer.g" _ttype = NCAP_FLOAT; #line 1987 "ncoLexer.cpp" break; } case 0x44 /* 'D' */ : case 0x64 /* 'd' */ : { { switch ( LA(1)) { case 0x44 /* 'D' */ : { match('D' /* charlit */ ); break; } case 0x64 /* 'd' */ : { match('d' /* charlit */ ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } #line 529 "ncoGrammer.g" _ttype = NCAP_DOUBLE; #line 2013 "ncoLexer.cpp" break; } default: { } } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mVAR_ATT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = VAR_ATT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { mLPH(false); } { // ( ... )* for (;;) { switch ( LA(1)) { case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mLPH(false); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { mDGT(false); break; } default: { goto _loop193; } } } _loop193:; } // ( ... )* #line 537 "ncoGrammer.g" // try to intelligently guess the type to avoid un-necessary function search bool bDoSearch; switch( LA(1) ){ case ' ': case '\t': case '(': bDoSearch=true; _ttype = VAR_ID; break; case '@': bDoSearch=false; _ttype = ATT_ID; break; case '[': bDoSearch=false; _ttype = VAR_ID; break; default: bDoSearch=false; _ttype = VAR_ID; break; } if(bDoSearch){ string fnc_nm=text.substr(_begin,text.length()-_begin); std::vector::iterator we=std::lower_bound(prs_arg->fmc_vtr.begin(),prs_arg->fmc_vtr.end(),fmc_cls(fnc_nm)); if(we!=prs_arg->fmc_vtr.end() && we->fnm()==fnc_nm){ int idx=we-prs_arg->fmc_vtr.begin(); char buff[10]; sprintf(buff,"%d",idx); // VERY IMPORTANT - append the index in fmc_vtr to the function name - (name#idx) { text.erase(_begin); text += fnc_nm+"#"+buff; }; _ttype = FUNC; } } #line 2156 "ncoLexer.cpp" { if ((LA(1) == 0x40 /* '@' */ )) { match('@' /* charlit */ ); { mLPH(false); } { // ( ... )* for (;;) { switch ( LA(1)) { case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mLPH(false); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { mDGT(false); break; } default: { goto _loop197; } } } _loop197:; } // ( ... )* #line 573 "ncoGrammer.g" _ttype = ATT_ID; #line 2247 "ncoLexer.cpp" } else { } } _ttype = testLiteralsTable(_ttype); if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mVAR_ATT_QT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = VAR_ATT_QT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } mVAR_NM_QT(false); #line 579 "ncoGrammer.g" _ttype = VAR_ID; #line 2275 "ncoLexer.cpp" { switch ( LA(1)) { case 0x40 /* '@' */ : { match('@' /* charlit */ ); mVAR_NM_QT(false); #line 580 "ncoGrammer.g" _ttype = ATT_ID; #line 2284 "ncoLexer.cpp" break; } case 0x27 /* '\'' */ : { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mSTR_ATT_ID(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = STR_ATT_ID; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; match('@' /* charlit */ ); { mLPH(false); } { // ( ... )* for (;;) { switch ( LA(1)) { case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mLPH(false); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { mDGT(false); break; } default: { goto _loop205; } } } _loop205:; } // ( ... )* #line 585 "ncoGrammer.g" _ttype = STR_ATT_ID; #line 2403 "ncoLexer.cpp" if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mSTR_ATT_QT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = STR_ATT_QT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } match('@' /* charlit */ ); mVAR_NM_QT(false); #line 590 "ncoGrammer.g" _ttype = STR_ATT_ID; #line 2426 "ncoLexer.cpp" { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDIM_QT(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DIM_QT; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } { _saveIndex = text.length(); match('$' /* charlit */ ); text.erase(_saveIndex); mVAR_NM_QT(false); #line 597 "ncoGrammer.g" _ttype = DIM_ID; #line 2457 "ncoLexer.cpp" } { _saveIndex = text.length(); match('\'' /* charlit */ ); text.erase(_saveIndex); } { if ((LA(1) == 0x2e /* '.' */ )) { _saveIndex = text.length(); match(".size"); text.erase(_saveIndex); #line 599 "ncoGrammer.g" _ttype = DIM_ID_SIZE; #line 2471 "ncoLexer.cpp" } else { } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDIM_VAL(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DIM_VAL; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; _saveIndex = text.length(); match('$' /* charlit */ ); text.erase(_saveIndex); { mLPH(false); } { // ( ... )* for (;;) { switch ( LA(1)) { case 0x41 /* 'A' */ : case 0x42 /* 'B' */ : case 0x43 /* 'C' */ : case 0x44 /* 'D' */ : case 0x45 /* 'E' */ : case 0x46 /* 'F' */ : case 0x47 /* 'G' */ : case 0x48 /* 'H' */ : case 0x49 /* 'I' */ : case 0x4a /* 'J' */ : case 0x4b /* 'K' */ : case 0x4c /* 'L' */ : case 0x4d /* 'M' */ : case 0x4e /* 'N' */ : case 0x4f /* 'O' */ : case 0x50 /* 'P' */ : case 0x51 /* 'Q' */ : case 0x52 /* 'R' */ : case 0x53 /* 'S' */ : case 0x54 /* 'T' */ : case 0x55 /* 'U' */ : case 0x56 /* 'V' */ : case 0x57 /* 'W' */ : case 0x58 /* 'X' */ : case 0x59 /* 'Y' */ : case 0x5a /* 'Z' */ : case 0x5f /* '_' */ : case 0x61 /* 'a' */ : case 0x62 /* 'b' */ : case 0x63 /* 'c' */ : case 0x64 /* 'd' */ : case 0x65 /* 'e' */ : case 0x66 /* 'f' */ : case 0x67 /* 'g' */ : case 0x68 /* 'h' */ : case 0x69 /* 'i' */ : case 0x6a /* 'j' */ : case 0x6b /* 'k' */ : case 0x6c /* 'l' */ : case 0x6d /* 'm' */ : case 0x6e /* 'n' */ : case 0x6f /* 'o' */ : case 0x70 /* 'p' */ : case 0x71 /* 'q' */ : case 0x72 /* 'r' */ : case 0x73 /* 's' */ : case 0x74 /* 't' */ : case 0x75 /* 'u' */ : case 0x76 /* 'v' */ : case 0x77 /* 'w' */ : case 0x78 /* 'x' */ : case 0x79 /* 'y' */ : case 0x7a /* 'z' */ : { mLPH(false); break; } case 0x30 /* '0' */ : case 0x31 /* '1' */ : case 0x32 /* '2' */ : case 0x33 /* '3' */ : case 0x34 /* '4' */ : case 0x35 /* '5' */ : case 0x36 /* '6' */ : case 0x37 /* '7' */ : case 0x38 /* '8' */ : case 0x39 /* '9' */ : { mDGT(false); break; } default: { goto _loop217; } } } _loop217:; } // ( ... )* #line 604 "ncoGrammer.g" _ttype = DIM_ID; #line 2580 "ncoLexer.cpp" { if ((LA(1) == 0x2e /* '.' */ )) { _saveIndex = text.length(); match(".size"); text.erase(_saveIndex); #line 606 "ncoGrammer.g" _ttype = DIM_ID_SIZE; #line 2588 "ncoLexer.cpp" } else { } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mDIM_MTD_ID(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = DIM_MTD_ID; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; _saveIndex = text.length(); match('$' /* charlit */ ); text.erase(_saveIndex); { // ( ... )+ int _cnt221=0; for (;;) { if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */ ))) { mDGT(false); } else { if ( _cnt221>=1 ) { goto _loop221; } else {throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn());} } _cnt221++; } _loop221:; } // ( ... )+ if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mNSTRING(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = NSTRING; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; _saveIndex = text.length(); match('\"' /* charlit */ ); text.erase(_saveIndex); { // ( ... )* for (;;) { if ((_tokenSet_5.member(LA(1)))) { { match(_tokenSet_5); } } else { goto _loop225; } } _loop225:; } // ( ... )* _saveIndex = text.length(); match('\"' /* charlit */ ); text.erase(_saveIndex); #line 619 "ncoGrammer.g" _ttype = NSTRING; #line 2659 "ncoLexer.cpp" { if ((LA(1) == 0x73 /* 's' */ )) { _saveIndex = text.length(); match('s' /* charlit */ ); text.erase(_saveIndex); #line 620 "ncoGrammer.g" _ttype = N4STRING; #line 2667 "ncoLexer.cpp" } else { } } if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } void ncoLexer::mINCLUDE(bool _createToken) { int _ttype; ANTLR_USE_NAMESPACE(antlr)RefToken _token; ANTLR_USE_NAMESPACE(std)string::size_type _begin = text.length(); _ttype = INCLUDE; ANTLR_USE_NAMESPACE(std)string::size_type _saveIndex; ANTLR_USE_NAMESPACE(antlr)RefToken f; match("#include"); { switch ( LA(1)) { case 0x9 /* '\t' */ : case 0xa /* '\n' */ : case 0xc /* '\14' */ : case 0x20 /* ' ' */ : { mWS(false); break; } case 0x22 /* '\"' */ : { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltForCharException(LA(1), getFilename(), getLine(), getColumn()); } } } mNSTRING(true); f=_returnToken; #line 625 "ncoGrammer.g" // ANTLR_USING_NAMESPACE(std) // create lexer to handle include std::string f_nm=f->getText(); std::ifstream* input=new std::ifstream(f_nm.c_str()); if(!(*input)){ // if(*input==NULL){ // 20150413: Trips clang 6.0 MACOSX Yosemite warning from -Wnull-arithmetic and subsequent error "invalid operands to binary expression" err_prn("Lexer cannot find include file "+f_nm); } ncoLexer* sublexer = new ncoLexer(*input,prs_arg); // make sure errors are reported in right file sublexer->setFilename(f_nm); parser->setFilename(f_nm); // save the filename - so we can pop it back later if needed // so parser gets the right filename parser->inc_vtr.push_back(f_nm); // you can't just call nextToken of sublexer // because you need a stream of tokens to // head to the parser. The only way is // to blast out of this lexer and reenter // the nextToken of the sublexer instance // of this class. selector.push(sublexer); // ignore this as whitespace; ask selector to try // to get another token. It will call nextToken() // of the new instance of this lexer. selector.retry(); // throws TokenStreamRetryException #line 2740 "ncoLexer.cpp" if ( _createToken && _token==ANTLR_USE_NAMESPACE(antlr)nullToken && _ttype!=ANTLR_USE_NAMESPACE(antlr)Token::SKIP ) { _token = makeToken(_ttype); _token->setText(text.substr(_begin, text.length()-_begin)); } _returnToken = _token; _saveIndex=0; } const unsigned long ncoLexer::_tokenSet_0_data_[] = { 0UL, 96UL, 1073741824UL, 268435456UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // % & ^ const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_0(_tokenSet_0_data_,10); const unsigned long ncoLexer::_tokenSet_1_data_[] = { 0UL, 134179584UL, 2281701374UL, 134217726UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // ( ) + - . 0 1 2 3 4 5 6 7 8 9 : 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 _ a b c d e f g h i j k l m n o p q r s t u v const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_1(_tokenSet_1_data_,10); const unsigned long ncoLexer::_tokenSet_2_data_[] = { 0UL, 0UL, 2281701374UL, 134217726UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 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 _ a b c d e f g // h i j k l m n o p q r s t u v const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_2(_tokenSet_2_data_,10); const unsigned long ncoLexer::_tokenSet_3_data_[] = { 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xd 0xe 0xf 0x10 0x11 // 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f // ! \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ // 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 [ 0x5c ] ^ _ ` a // b c d e f g h i j k l m n o p q r s t u v const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_3(_tokenSet_3_data_,16); const unsigned long ncoLexer::_tokenSet_4_data_[] = { 4294958079UL, 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12 // 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f ! // \" # $ % & \' ( ) + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ 0x5c ] ^ _ ` a b c d // e f g h i j k l m n o p q r s t u v const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_4(_tokenSet_4_data_,16); const unsigned long ncoLexer::_tokenSet_5_data_[] = { 4294966271UL, 4294967291UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xd 0xe 0xf 0x10 0x11 // 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f // ! # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ 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 [ 0x5c ] ^ _ ` a b c // d e f g h i j k l m n o p q r s t u v const ANTLR_USE_NAMESPACE(antlr)BitSet ncoLexer::_tokenSet_5(_tokenSet_5_data_,16); nco-4.5.4/src/nco++/ncoLexer.hpp000066400000000000000000000141761264355130400163030ustar00rootroot00000000000000#ifndef INC_ncoLexer_hpp_ #define INC_ncoLexer_hpp_ #include /* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoLexer.hpp"$ */ #include #include #include #include "ncoParserTokenTypes.hpp" #include #line 1 "ncoGrammer.g" /* $Header$ */ /* Purpose: ANTLR Grammar and support files for ncap2 */ /* Copyright (C) 1995--2015 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // C Standard Headers #include #include #include #include #if !(defined __xlC__) && !(defined SGIMP64) // C++ compilers that do not allow stdint.h #include // Required by g++ for LLONG_MAX, ULLONG_MAX, by icpc for int64_t #endif // C++ compilers that do not allow stdint.h // C++ Standard Headers #include #include #include #include #include // Custom Headers #include "prs_cls.hh" #include "ncap2_utl.hh" #include "fmc_cls.hh" #include "NcapVar.hh" #include "NcapVarVector.hh" #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #include "NcapVector.hh" #include "antlr/TokenStreamSelector.hpp" #include "ncoParser.hpp" #include "Invoke.hh" ANTLR_USING_NAMESPACE(std); ANTLR_USING_NAMESPACE(antlr); #line 54 "ncoLexer.hpp" class CUSTOM_API ncoLexer : public ANTLR_USE_NAMESPACE(antlr)CharScanner, public ncoParserTokenTypes { #line 342 "ncoGrammer.g" private: prs_cls *prs_arg; public: // Customized constructor !! ncoLexer(ANTLR_USE_NAMESPACE(std)istream& in, prs_cls *prs_in ) : ANTLR_USE_NAMESPACE(antlr)CharScanner(new ANTLR_USE_NAMESPACE(antlr)CharBuffer(in),true) { prs_arg=prs_in; // This shouldn't really be here // fxm:: should call default constructor initLiterals(); } public: void uponEOF() /*throws TokenStreamException, CharStreamException*/ { if ( selector.getCurrentStream() != lexer ) { // Do not allow EOF until main lexer // Force selector to retry for another token parser->inc_vtr.pop_back(); std::cout<<"Setting parser(filename)=" <inc_vtr.back()<setFilename(parser->inc_vtr.back()); selector.pop(); // return to old lexer/stream selector.retry(); } // else ANTLR_USE_NAMESPACE(std)cout << "Hit EOF of main file" << ANTLR_USE_NAMESPACE(std)endl; } #line 58 "ncoLexer.hpp" private: void initLiterals(); public: bool getCaseSensitiveLiterals() const { return true; } public: ncoLexer(ANTLR_USE_NAMESPACE(std)istream& in); ncoLexer(ANTLR_USE_NAMESPACE(antlr)InputBuffer& ib); ncoLexer(const ANTLR_USE_NAMESPACE(antlr)LexerSharedInputState& state); ANTLR_USE_NAMESPACE(antlr)RefToken nextToken(); public: void mASSIGN(bool _createToken); public: void mPLUS_ASSIGN(bool _createToken); public: void mMINUS_ASSIGN(bool _createToken); public: void mTIMES_ASSIGN(bool _createToken); public: void mDIVIDE_ASSIGN(bool _createToken); public: void mINC(bool _createToken); public: void mDEC(bool _createToken); public: void mQUESTION(bool _createToken); public: void mLPAREN(bool _createToken); public: void mRPAREN(bool _createToken); public: void mLCURL(bool _createToken); public: void mRCURL(bool _createToken); public: void mLSQUARE(bool _createToken); public: void mRSQUARE(bool _createToken); public: void mCOMMA(bool _createToken); public: void mQUOTE(bool _createToken); public: void mSEMI(bool _createToken); public: void mCOLON(bool _createToken); public: void mCARET(bool _createToken); public: void mTIMES(bool _createToken); public: void mDIVIDE(bool _createToken); public: void mMOD(bool _createToken); public: void mPLUS(bool _createToken); public: void mMINUS(bool _createToken); public: void mEQ(bool _createToken); public: void mNEQ(bool _createToken); public: void mLTHAN(bool _createToken); public: void mGTHAN(bool _createToken); public: void mLEQ(bool _createToken); public: void mGEQ(bool _createToken); public: void mFLTHAN(bool _createToken); public: void mFGTHAN(bool _createToken); public: void mLAND(bool _createToken); public: void mLNOT(bool _createToken); public: void mLOR(bool _createToken); public: void mDOT(bool _createToken); public: void mCALL_REF(bool _createToken); protected: void mDGT(bool _createToken); protected: void mLPH(bool _createToken); protected: void mLPHDGT(bool _createToken); protected: void mXPN(bool _createToken); protected: void mVAR_NM_QT(bool _createToken); protected: void mBLASTOUT(bool _createToken); public: void mUNUSED_OPS(bool _createToken); public: void mWS(bool _createToken); public: void mCXX_COMMENT(bool _createToken); public: void mC_COMMENT(bool _createToken); public: void mNUMBER_DOT(bool _createToken); public: void mNUMBER(bool _createToken); public: void mVAR_ATT(bool _createToken); public: void mVAR_ATT_QT(bool _createToken); public: void mSTR_ATT_ID(bool _createToken); public: void mSTR_ATT_QT(bool _createToken); public: void mDIM_QT(bool _createToken); public: void mDIM_VAL(bool _createToken); public: void mDIM_MTD_ID(bool _createToken); public: void mNSTRING(bool _createToken); public: void mINCLUDE(bool _createToken); private: static const unsigned long _tokenSet_0_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0; static const unsigned long _tokenSet_1_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1; static const unsigned long _tokenSet_2_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2; static const unsigned long _tokenSet_3_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3; static const unsigned long _tokenSet_4_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4; static const unsigned long _tokenSet_5_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_5; }; #endif /*INC_ncoLexer_hpp_*/ nco-4.5.4/src/nco++/ncoParser.cpp000066400000000000000000001611641264355130400164530ustar00rootroot00000000000000/* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoParser.cpp"$ */ #include "ncoParser.hpp" #include #include #include #line 1 "ncoGrammer.g" #line 8 "ncoParser.cpp" ncoParser::ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k) : ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,k) { } ncoParser::ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf) : ANTLR_USE_NAMESPACE(antlr)LLkParser(tokenBuf,3) { } ncoParser::ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k) : ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,k) { } ncoParser::ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer) : ANTLR_USE_NAMESPACE(antlr)LLkParser(lexer,3) { } ncoParser::ncoParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state) : ANTLR_USE_NAMESPACE(antlr)LLkParser(state,3) { } void ncoParser::program() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST program_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; { // ( ... )* for (;;) { if ((_tokenSet_0.member(LA(1)))) { statement(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop3; } } _loop3:; } // ( ... )* program_AST = currentAST.root; returnAST = program_AST; } void ncoParser::statement() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST statement_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e1_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefToken def1 = ANTLR_USE_NAMESPACE(antlr)nullToken; ANTLR_USE_NAMESPACE(antlr)RefAST def1_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefToken def2 = ANTLR_USE_NAMESPACE(antlr)nullToken; ANTLR_USE_NAMESPACE(antlr)RefAST def2_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); e1_AST = returnAST; astFactory->addASTChild( currentAST, returnAST ); match(SEMI); statement_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 96 "ncoGrammer.g" if( ncap_fnc_srh(e1_AST)) statement_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(FEXPR,"FEXPR"))->add(statement_AST))); else statement_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(EXPR,"EXPR"))->add(statement_AST))); #line 103 "ncoParser.cpp" currentAST.root = statement_AST; if ( statement_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && statement_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = statement_AST->getFirstChild(); else currentAST.child = statement_AST; currentAST.advanceChildToEnd(); statement_AST = currentAST.root; break; } case DEFDIMA: case DEFDIMU: { { switch ( LA(1)) { case DEFDIMA: { def1 = LT(1); def1_AST = astFactory->create(def1); astFactory->makeASTRoot(currentAST, def1_AST); match(DEFDIMA); break; } case DEFDIMU: { def2 = LT(1); def2_AST = astFactory->create(def2); astFactory->makeASTRoot(currentAST, def2_AST); match(DEFDIMU); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(LPAREN); ANTLR_USE_NAMESPACE(antlr)RefAST tmp3_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp3_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp3_AST); match(NSTRING); match(COMMA); expr(); astFactory->addASTChild( currentAST, returnAST ); { switch ( LA(1)) { case COMMA: { match(COMMA); expr(); astFactory->addASTChild( currentAST, returnAST ); break; } case RPAREN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(RPAREN); match(SEMI); #line 106 "ncoGrammer.g" if( def1_AST ){ def1_AST->setType(DEFDIM);def1_AST->setText("1");} if( def2_AST ){ def2_AST->setType(DEFDIM);def2_AST->setText("0");} #line 176 "ncoParser.cpp" statement_AST = currentAST.root; break; } case WHILE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp8_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp8_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp8_AST); match(WHILE); match(LPAREN); expr(); astFactory->addASTChild( currentAST, returnAST ); match(RPAREN); statement(); astFactory->addASTChild( currentAST, returnAST ); statement_AST = currentAST.root; break; } case FOR: { for_stmt(); astFactory->addASTChild( currentAST, returnAST ); statement_AST = currentAST.root; break; } case BREAK: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp11_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp11_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp11_AST); match(BREAK); match(SEMI); statement_AST = currentAST.root; break; } case CONTINUE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp13_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp13_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp13_AST); match(CONTINUE); match(SEMI); statement_AST = currentAST.root; break; } case SEMI: { match(SEMI); statement_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 119 "ncoGrammer.g" statement_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(1))->add(astFactory->create(NULL_NODE,"null_stmt")))); #line 228 "ncoParser.cpp" currentAST.root = statement_AST; if ( statement_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && statement_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = statement_AST->getFirstChild(); else currentAST.child = statement_AST; currentAST.advanceChildToEnd(); statement_AST = currentAST.root; break; } case IF: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp16_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp16_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp16_AST); match(IF); match(LPAREN); expr(); astFactory->addASTChild( currentAST, returnAST ); match(RPAREN); statement(); astFactory->addASTChild( currentAST, returnAST ); { if ((LA(1) == ELSE) && (_tokenSet_0.member(LA(2))) && (_tokenSet_1.member(LA(3)))) { match(ELSE); statement(); astFactory->addASTChild( currentAST, returnAST ); } else if ((_tokenSet_2.member(LA(1))) && (_tokenSet_1.member(LA(2))) && (_tokenSet_3.member(LA(3)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } statement_AST = currentAST.root; break; } case WHERE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp20_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp20_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp20_AST); match(WHERE); match(LPAREN); expr(); astFactory->addASTChild( currentAST, returnAST ); match(RPAREN); statement(); astFactory->addASTChild( currentAST, returnAST ); { if ((LA(1) == ELSEWHERE) && (_tokenSet_0.member(LA(2))) && (_tokenSet_1.member(LA(3)))) { match(ELSEWHERE); statement(); astFactory->addASTChild( currentAST, returnAST ); } else if ((_tokenSet_2.member(LA(1))) && (_tokenSet_1.member(LA(2))) && (_tokenSet_3.member(LA(3)))) { } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } statement_AST = currentAST.root; break; } case PRINT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp24_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp24_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp24_AST); match(PRINT); match(LPAREN); { switch ( LA(1)) { case VAR_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp26_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp26_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp26_AST); match(VAR_ID); break; } case ATT_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp27_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp27_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp27_AST); match(ATT_ID); break; } case NSTRING: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp28_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp28_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp28_AST); match(NSTRING); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { switch ( LA(1)) { case COMMA: { match(COMMA); ANTLR_USE_NAMESPACE(antlr)RefAST tmp30_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp30_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp30_AST); match(NSTRING); break; } case RPAREN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(RPAREN); match(SEMI); statement_AST = currentAST.root; break; } case LCURL: { block(); astFactory->addASTChild( currentAST, returnAST ); statement_AST = currentAST.root; break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } returnAST = statement_AST; } void ncoParser::expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ass_expr(); astFactory->addASTChild( currentAST, returnAST ); expr_AST = currentAST.root; returnAST = expr_AST; } void ncoParser::for_stmt() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST for_stmt_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e1_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e2_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e3_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST st_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST tmp33_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp33_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp33_AST); match(FOR); match(LPAREN); { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); e1_AST = returnAST; astFactory->addASTChild( currentAST, returnAST ); break; } case SEMI: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(SEMI); { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); e2_AST = returnAST; astFactory->addASTChild( currentAST, returnAST ); break; } case SEMI: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(SEMI); { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); e3_AST = returnAST; astFactory->addASTChild( currentAST, returnAST ); break; } case RPAREN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } match(RPAREN); statement(); st_AST = returnAST; astFactory->addASTChild( currentAST, returnAST ); for_stmt_AST = currentAST.root; returnAST = for_stmt_AST; } void ncoParser::block() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST block_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LCURL); { // ( ... )* for (;;) { if ((_tokenSet_0.member(LA(1)))) { statement(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop13; } } _loop13:; } // ( ... )* match(RCURL); block_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 140 "ncoGrammer.g" block_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(BLOCK,"block"))->add(block_AST))); #line 556 "ncoParser.cpp" currentAST.root = block_AST; if ( block_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && block_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = block_AST->getFirstChild(); else currentAST.child = block_AST; currentAST.advanceChildToEnd(); block_AST = currentAST.root; returnAST = block_AST; } void ncoParser::lmt() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); astFactory->addASTChild( currentAST, returnAST ); break; } case COMMA: case RPAREN: case COLON: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { // ( ... )* for (;;) { if ((LA(1) == COLON)) { ANTLR_USE_NAMESPACE(antlr)RefAST tmp40_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp40_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp40_AST); match(COLON); { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); astFactory->addASTChild( currentAST, returnAST ); break; } case COMMA: case RPAREN: case COLON: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } } else { goto _loop22; } } _loop22:; } // ( ... )* lmt_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 153 "ncoGrammer.g" lmt_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(LMT,"lmt"))->add(lmt_AST))); #line 675 "ncoParser.cpp" currentAST.root = lmt_AST; if ( lmt_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && lmt_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = lmt_AST->getFirstChild(); else currentAST.child = lmt_AST; currentAST.advanceChildToEnd(); lmt_AST = currentAST.root; returnAST = lmt_AST; } void ncoParser::lmt_list() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt_list_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LPAREN); lmt(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); lmt(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop25; } } _loop25:; } // ( ... )* match(RPAREN); lmt_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 157 "ncoGrammer.g" lmt_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(LMT_LIST,"lmt_list"))->add(lmt_list_AST))); #line 713 "ncoParser.cpp" currentAST.root = lmt_list_AST; if ( lmt_list_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && lmt_list_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = lmt_list_AST->getFirstChild(); else currentAST.child = lmt_list_AST; currentAST.advanceChildToEnd(); lmt_list_AST = currentAST.root; returnAST = lmt_list_AST; } void ncoParser::dmn_list_p() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST dmn_list_p_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LSQUARE); { switch ( LA(1)) { case VAR_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp45_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp45_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp45_AST); match(VAR_ID); break; } case DIM_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp46_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp46_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp46_AST); match(DIM_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); { switch ( LA(1)) { case VAR_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp48_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp48_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp48_AST); match(VAR_ID); break; } case DIM_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp49_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp49_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp49_AST); match(DIM_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } } else { goto _loop30; } } _loop30:; } // ( ... )* match(RSQUARE); dmn_list_p_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 165 "ncoGrammer.g" dmn_list_p_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(DMN_LIST_P,"dmn_list_p"))->add(dmn_list_p_AST))); #line 795 "ncoParser.cpp" currentAST.root = dmn_list_p_AST; if ( dmn_list_p_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && dmn_list_p_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = dmn_list_p_AST->getFirstChild(); else currentAST.child = dmn_list_p_AST; currentAST.advanceChildToEnd(); dmn_list_p_AST = currentAST.root; returnAST = dmn_list_p_AST; } void ncoParser::dmn_list() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST dmn_list_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LPAREN); ANTLR_USE_NAMESPACE(antlr)RefAST tmp52_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp52_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp52_AST); match(DIM_ID); { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); ANTLR_USE_NAMESPACE(antlr)RefAST tmp54_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp54_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp54_AST); match(DIM_ID); } else { goto _loop33; } } _loop33:; } // ( ... )* match(RPAREN); dmn_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 170 "ncoGrammer.g" dmn_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(DMN_LIST,"dmn_list"))->add(dmn_list_AST))); #line 837 "ncoParser.cpp" currentAST.root = dmn_list_AST; if ( dmn_list_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && dmn_list_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = dmn_list_AST->getFirstChild(); else currentAST.child = dmn_list_AST; currentAST.advanceChildToEnd(); dmn_list_AST = currentAST.root; returnAST = dmn_list_AST; } void ncoParser::dmn_arg_list() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST dmn_arg_list_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(DIVIDE); { switch ( LA(1)) { case DIM_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp57_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp57_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp57_AST); match(DIM_ID); break; } case DIM_MTD_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp58_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp58_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp58_AST); match(DIM_MTD_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); { switch ( LA(1)) { case DIM_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp60_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp60_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp60_AST); match(DIM_ID); break; } case DIM_MTD_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp61_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp61_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp61_AST); match(DIM_MTD_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } } else { goto _loop38; } } _loop38:; } // ( ... )* match(DIVIDE); dmn_arg_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 176 "ncoGrammer.g" dmn_arg_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(DMN_ARG_LIST,"dmn_arg_list"))->add(dmn_arg_list_AST))); #line 919 "ncoParser.cpp" currentAST.root = dmn_arg_list_AST; if ( dmn_arg_list_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && dmn_arg_list_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = dmn_arg_list_AST->getFirstChild(); else currentAST.child = dmn_arg_list_AST; currentAST.advanceChildToEnd(); dmn_arg_list_AST = currentAST.root; returnAST = dmn_arg_list_AST; } void ncoParser::value_list() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST value_list_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LCURL); expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop41; } } _loop41:; } // ( ... )* match(RCURL); value_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 181 "ncoGrammer.g" value_list_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(VALUE_LIST,"value_list"))->add(value_list_AST))); #line 957 "ncoParser.cpp" currentAST.root = value_list_AST; if ( value_list_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && value_list_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = value_list_AST->getFirstChild(); else currentAST.child = value_list_AST; currentAST.advanceChildToEnd(); value_list_AST = currentAST.root; returnAST = value_list_AST; } void ncoParser::arg_list() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST arg_list_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { expr(); astFactory->addASTChild( currentAST, returnAST ); arg_list_AST = currentAST.root; break; } case DIVIDE: { dmn_arg_list(); astFactory->addASTChild( currentAST, returnAST ); arg_list_AST = currentAST.root; break; } case DIM_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp66_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp66_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp66_AST); match(DIM_ID); arg_list_AST = currentAST.root; break; } case DIM_MTD_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp67_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp67_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp67_AST); match(DIM_MTD_ID); arg_list_AST = currentAST.root; break; } case CALL_REF: { call_ref(); astFactory->addASTChild( currentAST, returnAST ); arg_list_AST = currentAST.root; break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } returnAST = arg_list_AST; } void ncoParser::call_ref() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST call_ref_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST tmp68_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp68_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp68_AST); match(CALL_REF); { switch ( LA(1)) { case VAR_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp69_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp69_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp69_AST); match(VAR_ID); break; } case ATT_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp70_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp70_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp70_AST); match(ATT_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } call_ref_AST = currentAST.root; returnAST = call_ref_AST; } void ncoParser::func_arg() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST func_arg_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; match(LPAREN); { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case DIM_ID: case DIVIDE: case DIM_MTD_ID: case CALL_REF: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { arg_list(); astFactory->addASTChild( currentAST, returnAST ); break; } case COMMA: case RPAREN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { // ( ... )* for (;;) { if ((LA(1) == COMMA)) { match(COMMA); arg_list(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop46; } } _loop46:; } // ( ... )* match(RPAREN); func_arg_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(currentAST.root); #line 188 "ncoGrammer.g" func_arg_AST = ANTLR_USE_NAMESPACE(antlr)RefAST(astFactory->make((new ANTLR_USE_NAMESPACE(antlr)ASTArray(2))->add(astFactory->create(FUNC_ARG,"func_arg"))->add(func_arg_AST))); #line 1150 "ncoParser.cpp" currentAST.root = func_arg_AST; if ( func_arg_AST!=ANTLR_USE_NAMESPACE(antlr)nullAST && func_arg_AST->getFirstChild() != ANTLR_USE_NAMESPACE(antlr)nullAST ) currentAST.child = func_arg_AST->getFirstChild(); else currentAST.child = func_arg_AST; currentAST.advanceChildToEnd(); func_arg_AST = currentAST.root; returnAST = func_arg_AST; } void ncoParser::hyper_slb() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST hyper_slb_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; { switch ( LA(1)) { case VAR_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp74_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp74_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp74_AST); match(VAR_ID); break; } case ATT_ID: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp75_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp75_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp75_AST); match(ATT_ID); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { switch ( LA(1)) { case LSQUARE: { dmn_list_p(); astFactory->addASTChild( currentAST, returnAST ); break; } case SEMI: case COMMA: case RPAREN: case RCURL: case COLON: case DIVIDE: case DOT: case INC: case DEC: case PLUS: case MINUS: case TIMES: case CARET: case MOD: case FLTHAN: case FGTHAN: case LTHAN: case GTHAN: case GEQ: case LEQ: case EQ: case NEQ: case LAND: case LOR: case QUESTION: case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: { break; } default: if ((LA(1) == LPAREN) && (_tokenSet_4.member(LA(2)))) { lmt_list(); astFactory->addASTChild( currentAST, returnAST ); } else if ((LA(1) == LPAREN) && (LA(2) == DIM_ID)) { dmn_list(); astFactory->addASTChild( currentAST, returnAST ); } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } hyper_slb_AST = currentAST.root; returnAST = hyper_slb_AST; } /*************************************************************/ void ncoParser::meth_exp() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST meth_exp_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; primary_exp(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == DOT)) { ANTLR_USE_NAMESPACE(antlr)RefAST tmp76_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp76_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp76_AST); match(DOT); ANTLR_USE_NAMESPACE(antlr)RefAST tmp77_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp77_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp77_AST); match(FUNC); func_arg(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop54; } } _loop54:; } // ( ... )* meth_exp_AST = currentAST.root; returnAST = meth_exp_AST; } void ncoParser::primary_exp() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST primary_exp_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; switch ( LA(1)) { case NCAP_FLOAT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp78_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp78_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp78_AST); match(NCAP_FLOAT); primary_exp_AST = currentAST.root; break; } case NCAP_DOUBLE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp79_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp79_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp79_AST); match(NCAP_DOUBLE); primary_exp_AST = currentAST.root; break; } case NCAP_INT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp80_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp80_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp80_AST); match(NCAP_INT); primary_exp_AST = currentAST.root; break; } case NCAP_BYTE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp81_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp81_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp81_AST); match(NCAP_BYTE); primary_exp_AST = currentAST.root; break; } case NCAP_UBYTE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp82_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp82_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp82_AST); match(NCAP_UBYTE); primary_exp_AST = currentAST.root; break; } case NCAP_SHORT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp83_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp83_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp83_AST); match(NCAP_SHORT); primary_exp_AST = currentAST.root; break; } case NCAP_USHORT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp84_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp84_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp84_AST); match(NCAP_USHORT); primary_exp_AST = currentAST.root; break; } case NCAP_UINT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp85_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp85_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp85_AST); match(NCAP_UINT); primary_exp_AST = currentAST.root; break; } case NCAP_INT64: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp86_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp86_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp86_AST); match(NCAP_INT64); primary_exp_AST = currentAST.root; break; } case NCAP_UINT64: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp87_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp87_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp87_AST); match(NCAP_UINT64); primary_exp_AST = currentAST.root; break; } case NSTRING: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp88_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp88_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp88_AST); match(NSTRING); primary_exp_AST = currentAST.root; break; } case N4STRING: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp89_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp89_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp89_AST); match(N4STRING); primary_exp_AST = currentAST.root; break; } case DIM_ID_SIZE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp90_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp90_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp90_AST); match(DIM_ID_SIZE); primary_exp_AST = currentAST.root; break; } case LPAREN: { match(LPAREN); expr(); astFactory->addASTChild( currentAST, returnAST ); match(RPAREN); primary_exp_AST = currentAST.root; break; } case FUNC: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp93_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp93_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp93_AST); match(FUNC); func_arg(); astFactory->addASTChild( currentAST, returnAST ); primary_exp_AST = currentAST.root; break; } case VAR_ID: case ATT_ID: { hyper_slb(); astFactory->addASTChild( currentAST, returnAST ); primary_exp_AST = currentAST.root; break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } returnAST = primary_exp_AST; } void ncoParser::unaryleft_exp() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST unaryleft_exp_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefToken in = ANTLR_USE_NAMESPACE(antlr)nullToken; ANTLR_USE_NAMESPACE(antlr)RefAST in_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefToken de = ANTLR_USE_NAMESPACE(antlr)nullToken; ANTLR_USE_NAMESPACE(antlr)RefAST de_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; meth_exp(); astFactory->addASTChild( currentAST, returnAST ); { switch ( LA(1)) { case INC: { in = LT(1); in_AST = astFactory->create(in); astFactory->makeASTRoot(currentAST, in_AST); match(INC); #line 205 "ncoGrammer.g" in_AST->setType(POST_INC); in_AST->setText("POST_INC"); #line 1464 "ncoParser.cpp" break; } case DEC: { de = LT(1); de_AST = astFactory->create(de); astFactory->makeASTRoot(currentAST, de_AST); match(DEC); #line 207 "ncoGrammer.g" de_AST->setType(POST_DEC); de_AST->setText("POST_DEC"); #line 1476 "ncoParser.cpp" break; } case SEMI: case COMMA: case RPAREN: case RCURL: case COLON: case DIVIDE: case PLUS: case MINUS: case TIMES: case CARET: case MOD: case FLTHAN: case FGTHAN: case LTHAN: case GTHAN: case GEQ: case LEQ: case EQ: case NEQ: case LAND: case LOR: case QUESTION: case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } unaryleft_exp_AST = currentAST.root; returnAST = unaryleft_exp_AST; } void ncoParser::unary_exp() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST unary_exp_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefToken ur = ANTLR_USE_NAMESPACE(antlr)nullToken; ANTLR_USE_NAMESPACE(antlr)RefAST ur_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; switch ( LA(1)) { case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: { { switch ( LA(1)) { case LNOT: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp94_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp94_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp94_AST); match(LNOT); break; } case PLUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp95_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp95_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp95_AST); match(PLUS); break; } case MINUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp96_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp96_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp96_AST); match(MINUS); break; } case INC: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp97_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp97_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp97_AST); match(INC); break; } case DEC: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp98_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp98_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp98_AST); match(DEC); break; } case TIMES: { ur = LT(1); ur_AST = astFactory->create(ur); astFactory->makeASTRoot(currentAST, ur_AST); match(TIMES); #line 220 "ncoGrammer.g" ur_AST->setType(UTIMES);ur_AST->setText("UTIMES"); #line 1584 "ncoParser.cpp" break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } unary_exp(); astFactory->addASTChild( currentAST, returnAST ); unary_exp_AST = currentAST.root; break; } case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { unaryleft_exp(); astFactory->addASTChild( currentAST, returnAST ); unary_exp_AST = currentAST.root; break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } returnAST = unary_exp_AST; } void ncoParser::pow_exp() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST pow_exp_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; unary_exp(); astFactory->addASTChild( currentAST, returnAST ); { switch ( LA(1)) { case CARET: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp99_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp99_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp99_AST); match(CARET); pow_exp(); astFactory->addASTChild( currentAST, returnAST ); break; } case SEMI: case COMMA: case RPAREN: case RCURL: case COLON: case DIVIDE: case PLUS: case MINUS: case TIMES: case MOD: case FLTHAN: case FGTHAN: case LTHAN: case GTHAN: case GEQ: case LEQ: case EQ: case NEQ: case LAND: case LOR: case QUESTION: case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } pow_exp_AST = currentAST.root; returnAST = pow_exp_AST; } void ncoParser::mexpr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST mexpr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; pow_exp(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == DIVIDE || LA(1) == TIMES || LA(1) == MOD)) { { switch ( LA(1)) { case TIMES: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp100_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp100_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp100_AST); match(TIMES); break; } case DIVIDE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp101_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp101_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp101_AST); match(DIVIDE); break; } case MOD: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp102_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp102_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp102_AST); match(MOD); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } pow_exp(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop64; } } _loop64:; } // ( ... )* mexpr_AST = currentAST.root; returnAST = mexpr_AST; } void ncoParser::add_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST add_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; mexpr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == PLUS || LA(1) == MINUS)) { { switch ( LA(1)) { case PLUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp103_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp103_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp103_AST); match(PLUS); break; } case MINUS: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp104_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp104_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp104_AST); match(MINUS); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } mexpr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop68; } } _loop68:; } // ( ... )* add_expr_AST = currentAST.root; returnAST = add_expr_AST; } void ncoParser::frel_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST frel_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; add_expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == FLTHAN || LA(1) == FGTHAN)) { { switch ( LA(1)) { case FLTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp105_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp105_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp105_AST); match(FLTHAN); break; } case FGTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp106_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp106_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp106_AST); match(FGTHAN); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } add_expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop72; } } _loop72:; } // ( ... )* frel_expr_AST = currentAST.root; returnAST = frel_expr_AST; } void ncoParser::rel_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST rel_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; frel_expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if (((LA(1) >= LTHAN && LA(1) <= LEQ))) { { switch ( LA(1)) { case LTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp107_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp107_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp107_AST); match(LTHAN); break; } case GTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp108_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp108_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp108_AST); match(GTHAN); break; } case GEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp109_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp109_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp109_AST); match(GEQ); break; } case LEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp110_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp110_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp110_AST); match(LEQ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } frel_expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop76; } } _loop76:; } // ( ... )* rel_expr_AST = currentAST.root; returnAST = rel_expr_AST; } void ncoParser::eq_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST eq_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; rel_expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == EQ || LA(1) == NEQ)) { { switch ( LA(1)) { case EQ: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp111_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp111_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp111_AST); match(EQ); break; } case NEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp112_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp112_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp112_AST); match(NEQ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } rel_expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop80; } } _loop80:; } // ( ... )* eq_expr_AST = currentAST.root; returnAST = eq_expr_AST; } void ncoParser::lmul_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmul_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; eq_expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == LAND)) { ANTLR_USE_NAMESPACE(antlr)RefAST tmp113_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp113_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp113_AST); match(LAND); eq_expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop83; } } _loop83:; } // ( ... )* lmul_expr_AST = currentAST.root; returnAST = lmul_expr_AST; } void ncoParser::lor_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST lor_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; lmul_expr(); astFactory->addASTChild( currentAST, returnAST ); { // ( ... )* for (;;) { if ((LA(1) == LOR)) { ANTLR_USE_NAMESPACE(antlr)RefAST tmp114_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp114_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp114_AST); match(LOR); lmul_expr(); astFactory->addASTChild( currentAST, returnAST ); } else { goto _loop86; } } _loop86:; } // ( ... )* lor_expr_AST = currentAST.root; returnAST = lor_expr_AST; } void ncoParser::cond_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST cond_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; lor_expr(); astFactory->addASTChild( currentAST, returnAST ); { switch ( LA(1)) { case QUESTION: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp115_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp115_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp115_AST); match(QUESTION); ass_expr(); astFactory->addASTChild( currentAST, returnAST ); match(COLON); cond_expr(); astFactory->addASTChild( currentAST, returnAST ); break; } case SEMI: case COMMA: case RPAREN: case RCURL: case COLON: case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } cond_expr_AST = currentAST.root; returnAST = cond_expr_AST; } void ncoParser::ass_expr() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST ass_expr_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; cond_expr(); astFactory->addASTChild( currentAST, returnAST ); { switch ( LA(1)) { case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: { { switch ( LA(1)) { case ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp117_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp117_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp117_AST); match(ASSIGN); break; } case PLUS_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp118_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp118_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp118_AST); match(PLUS_ASSIGN); break; } case MINUS_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp119_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp119_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp119_AST); match(MINUS_ASSIGN); break; } case TIMES_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp120_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp120_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp120_AST); match(TIMES_ASSIGN); break; } case DIVIDE_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp121_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp121_AST = astFactory->create(LT(1)); astFactory->makeASTRoot(currentAST, tmp121_AST); match(DIVIDE_ASSIGN); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } { switch ( LA(1)) { case LPAREN: case NSTRING: case VAR_ID: case ATT_ID: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { ass_expr(); astFactory->addASTChild( currentAST, returnAST ); break; } case LCURL: { value_list(); astFactory->addASTChild( currentAST, returnAST ); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } break; } case SEMI: case COMMA: case RPAREN: case RCURL: case COLON: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(LT(1), getFilename()); } } } ass_expr_AST = currentAST.root; returnAST = ass_expr_AST; } /*************************************************************/ void ncoParser::imaginary_token() { returnAST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)ASTPair currentAST; ANTLR_USE_NAMESPACE(antlr)RefAST imaginary_token_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST tmp122_AST = ANTLR_USE_NAMESPACE(antlr)nullAST; tmp122_AST = astFactory->create(LT(1)); astFactory->addASTChild(currentAST, tmp122_AST); match(NRootAST); imaginary_token_AST = currentAST.root; returnAST = imaginary_token_AST; } void ncoParser::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory ) { factory.setMaxNodeType(118); } const char* ncoParser::tokenNames[] = { "<0>", "EOF", "<2>", "NULL_TREE_LOOKAHEAD", "NULL_NODE", "BLOCK", "ARG_LIST", "DMN_LIST", "DMN_LIST_P", "DMN_ARG_LIST", "LMT_LIST", "VALUE_LIST", "FUNC_ARG", "LMT", "EXPR", "FEXPR", "POST_INC", "POST_DEC", "UTIMES", "PROP", "FOR2", "NORET", "ATAN2", "WHERE_ASSIGN", "MISS2ZERO", "VSORT", "VRSORT", "VABS", "VSQR2", "DEFDIM", ";", "\"defdim\"", "\"defdimunlim\"", "(", "a string", ",", ")", "\"while\"", "\"break\"", "\"continue\"", "\"if\"", "\"else\"", "\"where\"", "\"elsewhere\"", "\"print\"", "VAR_ID", "ATT_ID", "{", "}", "\"for\"", ":", "[", "DIM_ID", "]", "/", "dimension identifier", "call by reference", "dot operator", "FUNC", "++", "--", "!", "+", "-", "*", "power of operator", "%", "<<", ">>", "<", ">", ">=", "<=", "==", "!=", "&&", "||", "?", "=", "+=", "-=", "*=", "/=", "NCAP_FLOAT", "NCAP_DOUBLE", "NCAP_INT", "NCAP_BYTE", "NCAP_UBYTE", "NCAP_SHORT", "NCAP_USHORT", "NCAP_UINT", "NCAP_INT64", "NCAP_UINT64", "N4STRING", "DIM_ID_SIZE", "NRootAST", "\"<<\"", "\">>\"", "\\\"", "DGT", "LPH", "LPHDGT", "XPN", "VAR_NM_QT", "BLASTOUT", "UNUSED_OPS", "white space", "a C++-style comment", "a C-style comment", "a floating point number", "NUMBER", "variable or function or attribute identifier", "VAR_ATT_QT", "STR_ATT_ID", "STR_ATT_QT", "DIM_QT", "dimension identifier", "INCLUDE", "LMT_DMN", 0 }; const unsigned long ncoParser::_tokenSet_0_data_[] = { 3221225472UL, 4228052455UL, 2146959361UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // SEMI "defdim" "defdimunlim" LPAREN NSTRING "while" "break" "continue" // "if" "where" "print" VAR_ID ATT_ID LCURL "for" FUNC INC DEC LNOT PLUS // MINUS TIMES NCAP_FLOAT NCAP_DOUBLE NCAP_INT NCAP_BYTE NCAP_UBYTE NCAP_SHORT // NCAP_USHORT NCAP_UINT NCAP_INT64 NCAP_UINT64 N4STRING DIM_ID_SIZE const ANTLR_USE_NAMESPACE(antlr)BitSet ncoParser::_tokenSet_0(_tokenSet_0_data_,8); const unsigned long ncoParser::_tokenSet_1_data_[] = { 3221225474UL, 4266393575UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // EOF SEMI "defdim" "defdimunlim" LPAREN NSTRING "while" "break" "continue" // "if" "else" "where" "elsewhere" "print" VAR_ID ATT_ID LCURL RCURL "for" // LSQUARE DIVIDE DOT FUNC INC DEC LNOT PLUS MINUS TIMES CARET MOD FLTHAN // FGTHAN LTHAN GTHAN GEQ LEQ EQ NEQ LAND LOR QUESTION ASSIGN PLUS_ASSIGN // MINUS_ASSIGN TIMES_ASSIGN DIVIDE_ASSIGN NCAP_FLOAT NCAP_DOUBLE NCAP_INT // NCAP_BYTE NCAP_UBYTE NCAP_SHORT NCAP_USHORT NCAP_UINT NCAP_INT64 NCAP_UINT64 // N4STRING DIM_ID_SIZE const ANTLR_USE_NAMESPACE(antlr)BitSet ncoParser::_tokenSet_1(_tokenSet_1_data_,8); const unsigned long ncoParser::_tokenSet_2_data_[] = { 3221225474UL, 4228120551UL, 2146959361UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // EOF SEMI "defdim" "defdimunlim" LPAREN NSTRING "while" "break" "continue" // "if" "else" "where" "elsewhere" "print" VAR_ID ATT_ID LCURL RCURL "for" // FUNC INC DEC LNOT PLUS MINUS TIMES NCAP_FLOAT NCAP_DOUBLE NCAP_INT NCAP_BYTE // NCAP_UBYTE NCAP_SHORT NCAP_USHORT NCAP_UINT NCAP_INT64 NCAP_UINT64 N4STRING // DIM_ID_SIZE const ANTLR_USE_NAMESPACE(antlr)BitSet ncoParser::_tokenSet_2(_tokenSet_2_data_,8); const unsigned long ncoParser::_tokenSet_3_data_[] = { 3221225474UL, 4292870143UL, 2147483647UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // EOF SEMI "defdim" "defdimunlim" LPAREN NSTRING COMMA RPAREN "while" // "break" "continue" "if" "else" "where" "elsewhere" "print" VAR_ID ATT_ID // LCURL RCURL "for" COLON LSQUARE DIM_ID DIVIDE DIM_MTD_ID CALL_REF DOT // FUNC INC DEC LNOT PLUS MINUS TIMES CARET MOD FLTHAN FGTHAN LTHAN GTHAN // GEQ LEQ EQ NEQ LAND LOR QUESTION ASSIGN PLUS_ASSIGN MINUS_ASSIGN TIMES_ASSIGN // DIVIDE_ASSIGN NCAP_FLOAT NCAP_DOUBLE NCAP_INT NCAP_BYTE NCAP_UBYTE NCAP_SHORT // NCAP_USHORT NCAP_UINT NCAP_INT64 NCAP_UINT64 N4STRING DIM_ID_SIZE const ANTLR_USE_NAMESPACE(antlr)BitSet ncoParser::_tokenSet_3(_tokenSet_3_data_,8); const unsigned long ncoParser::_tokenSet_4_data_[] = { 0UL, 4228145182UL, 2146959361UL, 0UL, 0UL, 0UL, 0UL, 0UL }; // LPAREN NSTRING COMMA RPAREN VAR_ID ATT_ID COLON FUNC INC DEC LNOT PLUS // MINUS TIMES NCAP_FLOAT NCAP_DOUBLE NCAP_INT NCAP_BYTE NCAP_UBYTE NCAP_SHORT // NCAP_USHORT NCAP_UINT NCAP_INT64 NCAP_UINT64 N4STRING DIM_ID_SIZE const ANTLR_USE_NAMESPACE(antlr)BitSet ncoParser::_tokenSet_4(_tokenSet_4_data_,8); nco-4.5.4/src/nco++/ncoParser.hpp000066400000000000000000000101441264355130400164470ustar00rootroot00000000000000#ifndef INC_ncoParser_hpp_ #define INC_ncoParser_hpp_ #include /* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoParser.hpp"$ */ #include #include #include "ncoParserTokenTypes.hpp" #include #line 1 "ncoGrammer.g" /* $Header$ */ /* Purpose: ANTLR Grammar and support files for ncap2 */ /* Copyright (C) 1995--2015 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // C Standard Headers #include #include #include #include #if !(defined __xlC__) && !(defined SGIMP64) // C++ compilers that do not allow stdint.h #include // Required by g++ for LLONG_MAX, ULLONG_MAX, by icpc for int64_t #endif // C++ compilers that do not allow stdint.h // C++ Standard Headers #include #include #include #include #include // Custom Headers #include "prs_cls.hh" #include "ncap2_utl.hh" #include "fmc_cls.hh" #include "NcapVar.hh" #include "NcapVarVector.hh" #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #include "NcapVector.hh" #include "antlr/TokenStreamSelector.hpp" #include "ncoParser.hpp" #include "Invoke.hh" ANTLR_USING_NAMESPACE(std); ANTLR_USING_NAMESPACE(antlr); #line 54 "ncoParser.hpp" class CUSTOM_API ncoParser : public ANTLR_USE_NAMESPACE(antlr)LLkParser, public ncoParserTokenTypes { #line 84 "ncoGrammer.g" public: std::vector inc_vtr; #line 58 "ncoParser.hpp" public: void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory ); protected: ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf, int k); public: ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenBuffer& tokenBuf); protected: ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer, int k); public: ncoParser(ANTLR_USE_NAMESPACE(antlr)TokenStream& lexer); ncoParser(const ANTLR_USE_NAMESPACE(antlr)ParserSharedInputState& state); int getNumTokens() const { return ncoParser::NUM_TOKENS; } const char* getTokenName( int type ) const { if( type > getNumTokens() ) return 0; return ncoParser::tokenNames[type]; } const char* const* getTokenNames() const { return ncoParser::tokenNames; } public: void program(); public: void statement(); public: void expr(); public: void for_stmt(); public: void block(); public: void lmt(); public: void lmt_list(); public: void dmn_list_p(); public: void dmn_list(); public: void dmn_arg_list(); public: void value_list(); public: void arg_list(); public: void call_ref(); public: void func_arg(); public: void hyper_slb(); public: void meth_exp(); public: void primary_exp(); public: void unaryleft_exp(); public: void unary_exp(); public: void pow_exp(); public: void mexpr(); public: void add_expr(); public: void frel_expr(); public: void rel_expr(); public: void eq_expr(); public: void lmul_expr(); public: void lor_expr(); public: void cond_expr(); public: void ass_expr(); public: void imaginary_token(); public: ANTLR_USE_NAMESPACE(antlr)RefAST getAST() { return returnAST; } protected: ANTLR_USE_NAMESPACE(antlr)RefAST returnAST; private: static const char* tokenNames[]; #ifndef NO_STATIC_CONSTS static const int NUM_TOKENS = 119; #else enum { NUM_TOKENS = 119 }; #endif static const unsigned long _tokenSet_0_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_0; static const unsigned long _tokenSet_1_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_1; static const unsigned long _tokenSet_2_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_2; static const unsigned long _tokenSet_3_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_3; static const unsigned long _tokenSet_4_data_[]; static const ANTLR_USE_NAMESPACE(antlr)BitSet _tokenSet_4; }; #endif /*INC_ncoParser_hpp_*/ nco-4.5.4/src/nco++/ncoParserTokenTypes.hpp000066400000000000000000000042241264355130400204770ustar00rootroot00000000000000#ifndef INC_ncoParserTokenTypes_hpp_ #define INC_ncoParserTokenTypes_hpp_ /* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoParserTokenTypes.hpp"$ */ #ifndef CUSTOM_API # define CUSTOM_API #endif #ifdef __cplusplus struct CUSTOM_API ncoParserTokenTypes { #endif enum { EOF_ = 1, NULL_NODE = 4, BLOCK = 5, ARG_LIST = 6, DMN_LIST = 7, DMN_LIST_P = 8, DMN_ARG_LIST = 9, LMT_LIST = 10, VALUE_LIST = 11, FUNC_ARG = 12, LMT = 13, EXPR = 14, FEXPR = 15, POST_INC = 16, POST_DEC = 17, UTIMES = 18, PROP = 19, FOR2 = 20, NORET = 21, ATAN2 = 22, WHERE_ASSIGN = 23, MISS2ZERO = 24, VSORT = 25, VRSORT = 26, VABS = 27, VSQR2 = 28, DEFDIM = 29, SEMI = 30, DEFDIMA = 31, DEFDIMU = 32, LPAREN = 33, NSTRING = 34, COMMA = 35, RPAREN = 36, WHILE = 37, BREAK = 38, CONTINUE = 39, IF = 40, ELSE = 41, WHERE = 42, ELSEWHERE = 43, PRINT = 44, VAR_ID = 45, ATT_ID = 46, LCURL = 47, RCURL = 48, FOR = 49, COLON = 50, LSQUARE = 51, DIM_ID = 52, RSQUARE = 53, DIVIDE = 54, DIM_MTD_ID = 55, CALL_REF = 56, DOT = 57, FUNC = 58, INC = 59, DEC = 60, LNOT = 61, PLUS = 62, MINUS = 63, TIMES = 64, CARET = 65, MOD = 66, FLTHAN = 67, FGTHAN = 68, LTHAN = 69, GTHAN = 70, GEQ = 71, LEQ = 72, EQ = 73, NEQ = 74, LAND = 75, LOR = 76, QUESTION = 77, ASSIGN = 78, PLUS_ASSIGN = 79, MINUS_ASSIGN = 80, TIMES_ASSIGN = 81, DIVIDE_ASSIGN = 82, NCAP_FLOAT = 83, NCAP_DOUBLE = 84, NCAP_INT = 85, NCAP_BYTE = 86, NCAP_UBYTE = 87, NCAP_SHORT = 88, NCAP_USHORT = 89, NCAP_UINT = 90, NCAP_INT64 = 91, NCAP_UINT64 = 92, N4STRING = 93, DIM_ID_SIZE = 94, NRootAST = 95, SHIFTL = 96, SHIFTR = 97, QUOTE = 98, DGT = 99, LPH = 100, LPHDGT = 101, XPN = 102, VAR_NM_QT = 103, BLASTOUT = 104, UNUSED_OPS = 105, WS = 106, CXX_COMMENT = 107, C_COMMENT = 108, NUMBER_DOT = 109, NUMBER = 110, VAR_ATT = 111, VAR_ATT_QT = 112, STR_ATT_ID = 113, STR_ATT_QT = 114, DIM_QT = 115, DIM_VAL = 116, INCLUDE = 117, LMT_DMN = 118, NULL_TREE_LOOKAHEAD = 3 }; #ifdef __cplusplus }; #endif #endif /*INC_ncoParserTokenTypes_hpp_*/ nco-4.5.4/src/nco++/ncoTree.cpp000066400000000000000000003646171264355130400161260ustar00rootroot00000000000000/* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoTree.cpp"$ */ #include "ncoTree.hpp" #include #include #include #include #include #include #line 1 "ncoGrammer.g" #line 11 "ncoTree.cpp" ncoTree::ncoTree() : ANTLR_USE_NAMESPACE(antlr)TreeParser() { } int ncoTree::lmt_peek(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 1091 "ncoGrammer.g" int nbr_dmn=0; #line 19 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST lmt_peek_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST; try { // for error handling lmt = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1093 "ncoGrammer.g" RefAST aRef; aRef=lmt->getFirstChild(); nbr_dmn=0; while(aRef) { if(aRef->getType() == LMT) nbr_dmn++; aRef=aRef->getNextSibling(); } #line 38 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return nbr_dmn; } int ncoTree::statements(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 1104 "ncoGrammer.g" int iret=0; #line 57 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST statements_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST blk = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST exp = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST ass = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST fss = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST stmt = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST stmt3 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST lgcl = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST stmt1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e2 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST e3 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST stmt2 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST dtyp = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST def = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST pvid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST patt = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST pstr = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 1104 "ncoGrammer.g" var_sct *var=NULL; var_sct *var2=NULL; const std::string fnc_nm("statements"); // list of while/for loops entered n.b depth is lpp_vtr.size() // Temporary fix so call run_exe only does a single parse in the // nested block static std::vector lpp_vtr; #line 86 "ncoTree.cpp" try { // for error handling if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case BLOCK: { blk = _t; match(_t,BLOCK); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1114 "ncoGrammer.g" //std::cout <<"Num of Children in block="<getNumberOfChildren()<getFirstChild(),lpp_vtr.size() ); #line 104 "ncoTree.cpp" } break; } case EXPR: { ANTLR_USE_NAMESPACE(antlr)RefAST __t231 = _t; exp = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,EXPR); _t = _t->getFirstChild(); ass = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t231; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1120 "ncoGrammer.g" RefAST tr; RefAST ntr; if(ass->getType()==ASSIGN && prs_arg->ntl_scn ){ ntr=ass->getFirstChild(); if(ntr->getType()==UTIMES) ntr=ntr->getFirstChild(); if(ntr->getType() == VAR_ID || ntr->getType() ==ATT_ID){ ntr->addChild( astFactory->create(NORET,"no_ret") ); // std::cout << "Modified assign "<toStringTree()<getFirstChild()); if(var != (var_sct*)NULL) var=nco_var_free(var); iret=EXPR; #line 141 "ncoTree.cpp" } break; } case FEXPR: { ANTLR_USE_NAMESPACE(antlr)RefAST __t232 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp123_AST_in = _t; match(_t,FEXPR); _t = _t->getFirstChild(); fss = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t232; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1144 "ncoGrammer.g" var=out(fss); if(var != (var_sct*)NULL) var=nco_var_free(var); iret=FEXPR; #line 165 "ncoTree.cpp" } break; } case IF: { ANTLR_USE_NAMESPACE(antlr)RefAST __t233 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp124_AST_in = _t; match(_t,IF); _t = _t->getFirstChild(); var=out(_t); _t = _retTree; stmt = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t233; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1152 "ncoGrammer.g" //if can have only 3 or 4 parts , 1 node and 2 or 3 siblings // IF LOGICAL_EXP STATEMENT1 STATEMENT2 bool br; //Calculate logical expression br=ncap_var_lgcl(var); var=nco_var_free(var); if(br){ // Execute 2nd sibling if(stmt->getType()==BLOCK ) { if(stmt->getFirstChild()) iret=run_exe(stmt->getFirstChild(),lpp_vtr.size()); }else iret=statements(stmt); } // See if else stmt exists (3rd sibling) if(!br && (stmt=stmt->getNextSibling()) ){ if(stmt->getType()==BLOCK ){ if(stmt->getFirstChild()) iret=run_exe(stmt->getFirstChild(),lpp_vtr.size()); }else iret=statements(stmt); } var=NULL_CEWI; #line 213 "ncoTree.cpp" } break; } case WHERE: { ANTLR_USE_NAMESPACE(antlr)RefAST __t234 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp125_AST_in = _t; match(_t,WHERE); _t = _t->getFirstChild(); var=out(_t); _t = _retTree; stmt3 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t234; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1182 "ncoGrammer.g" // convert mask to short RefAST tr; var=nco_var_cnf_typ(NC_SHORT,var); //change missing values to zero if(var->has_mss_val){ var=ncap_var_var_stc(var,NULL_CEWI,MISS2ZERO); var->has_mss_val=False; var->mss_val.vp=(void*)nco_free(var->mss_val.vp); } //deal with block if(stmt3->getType()==BLOCK){ tr=stmt3->getFirstChild(); while(tr) { (void)where_assign(tr,var); tr=tr->getNextSibling(); } } else where_assign(stmt3,var); // deal with else-where if(tr=stmt3->getNextSibling()) { //invert mask var=ncap_var_var_stc(var,NULL_CEWI,LNOT); if(tr->getType()==BLOCK){ tr=tr->getFirstChild(); while(tr) { (void)where_assign(tr,var); tr=tr->getNextSibling(); } } else where_assign(tr,var); } if(var != (var_sct*)NULL) var=nco_var_free(var); iret=WHERE; #line 275 "ncoTree.cpp" } break; } case WHILE: { ANTLR_USE_NAMESPACE(antlr)RefAST __t235 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp126_AST_in = _t; match(_t,WHILE); _t = _t->getFirstChild(); lgcl = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); stmt1 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t235; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1226 "ncoGrammer.g" bool br; var_sct *var_tf; var_tf=out(lgcl); br=ncap_var_lgcl(var_tf); var_tf=nco_var_free(var_tf); lpp_vtr.push_back("while"); while(br){ if(stmt1->getType()==BLOCK) iret=run_exe(stmt1,lpp_vtr.size()); else iret=statements(stmt1); if(iret==BREAK) break; var_tf=out(lgcl); br=ncap_var_lgcl(var_tf); var_tf=nco_var_free(var_tf); } lpp_vtr.pop_back(); iret=WHILE; var=NULL_CEWI; #line 323 "ncoTree.cpp" } break; } case FOR: { ANTLR_USE_NAMESPACE(antlr)RefAST __t236 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp127_AST_in = _t; match(_t,FOR); _t = _t->getFirstChild(); e1 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); e2 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); e3 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); stmt2 = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t236; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1255 "ncoGrammer.g" bool b1,b2,b3,br; var_sct *var_f1; var_sct *var_f2; var_sct *var_f3; b1=(e1->getType()!=NULL_NODE ? true:false); b2=(e2->getType()!=NULL_NODE ? true:false); b3=(e3->getType()!=NULL_NODE ? true:false); lpp_vtr.push_back("for"); if(b1){ var_f1=out(e1); var_f1=nco_var_free(var_f1); } if(b2){ var_f2=out(e2); br=ncap_var_lgcl(var_f2); var_f2=nco_var_free(var_f2); } else br=true; while(br){ if(stmt2->getType()==BLOCK) iret=run_exe(stmt2,lpp_vtr.size()); else iret=statements(stmt2); if(iret==BREAK) break; if(b3){ var_f3=out(e3); var_f3=nco_var_free(var_f3); } if(b2){ var_f2=out(e2); br=ncap_var_lgcl(var_f2); var_f2=nco_var_free(var_f2); } } // end while lpp_vtr.pop_back(); iret=FOR; var=NULL_CEWI; #line 399 "ncoTree.cpp" } break; } case ELSE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp128_AST_in = _t; match(_t,ELSE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1306 "ncoGrammer.g" iret=ELSE; #line 411 "ncoTree.cpp" } break; } case BREAK: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp129_AST_in = _t; match(_t,BREAK); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1307 "ncoGrammer.g" iret=BREAK; #line 423 "ncoTree.cpp" } break; } case CONTINUE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp130_AST_in = _t; match(_t,CONTINUE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1308 "ncoGrammer.g" iret=CONTINUE; #line 435 "ncoTree.cpp" } break; } case NULL_NODE: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp131_AST_in = _t; match(_t,NULL_NODE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1309 "ncoGrammer.g" iret=NULL_NODE; #line 447 "ncoTree.cpp" } break; } case DEFDIM: { ANTLR_USE_NAMESPACE(antlr)RefAST __t237 = _t; dtyp = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,DEFDIM); _t = _t->getFirstChild(); def = _t; match(_t,NSTRING); _t = _t->getNextSibling(); var=out(_t); _t = _retTree; { if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case VALUE_LIST: case POST_INC: case POST_DEC: case UTIMES: case WHERE_ASSIGN: case NSTRING: case VAR_ID: case ATT_ID: case DIVIDE: case DOT: case FUNC: case INC: case DEC: case LNOT: case PLUS: case MINUS: case TIMES: case CARET: case MOD: case FLTHAN: case FGTHAN: case LTHAN: case GTHAN: case GEQ: case LEQ: case EQ: case NEQ: case LAND: case LOR: case QUESTION: case ASSIGN: case PLUS_ASSIGN: case MINUS_ASSIGN: case TIMES_ASSIGN: case DIVIDE_ASSIGN: case NCAP_FLOAT: case NCAP_DOUBLE: case NCAP_INT: case NCAP_BYTE: case NCAP_UBYTE: case NCAP_SHORT: case NCAP_USHORT: case NCAP_UINT: case NCAP_INT64: case NCAP_UINT64: case N4STRING: case DIM_ID_SIZE: { var2=out(_t); _t = _retTree; break; } case 3: { break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } } } _t = __t237; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1311 "ncoGrammer.g" bool bunlimited=false; int ityp; int dCall; long sz; // 0 - specific - UNLIMITED // 1 - regular LIMITED or UNLIMITED dCall=atoi(dtyp->getText().c_str()); iret=DEFDIM; var=nco_var_cnf_typ((nc_type)NC_INT64,var); (void)cast_void_nctype((nc_type)NC_INT64,&var->val); sz=var->val.i64p[0]; var=(var_sct*)nco_var_free(var); if( dCall==0 ){ bunlimited =true; } else if(dCall==1 && var2){ int ityp; // nb var2 is in upper scope - defined at statment action start var2=nco_var_cnf_typ(NC_INT,var2); (void)cast_void_nctype(NC_INT,&var2->val); ityp=var2->val.ip[0]; (void)cast_nctype_void(NC_INT,&var2->val); var2=nco_var_free(var2); if( ityp==0) bunlimited=true; else if( ityp==1 ) bunlimited=false; else err_prn(fnc_nm,"defdim for "+ def->getText() + ". Third argument must be 0 for \"UNLIMITED\" or 1 for \"LIMITED\" or void"); } (void)ncap_def_dim(def->getText(),sz,bunlimited,prs_arg); #line 572 "ncoTree.cpp" } break; } default: bool synPredMatched241 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == PRINT))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t241 = _t; synPredMatched241 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t240 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp132_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp133_AST_in = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); _t = __t240; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched241 = false; } _t = __t241; inputState->guessing--; } if ( synPredMatched241 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t242 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp134_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); pvid = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); _t = __t242; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1353 "ncoGrammer.g" int var_id; int fl_id=-1; char *fmt_sng; std::string va_nm(pvid->getText()); NcapVar *Nvar; if(prs_arg->ntl_scn) goto end2; Nvar=prs_arg->var_vtr.find(va_nm); if(Nvar && Nvar->flg_mem){ wrn_prn(fnc_nm,"Cannot print out RAM variables at the moment!"); goto end2; } // check output first -nb can only print out vars that are defined AND written // it is possible to get with the var defined in output but no data // flg_stt==1 mean var defined but no data !! // So we try to use var in input -if it exist their if(Nvar && Nvar->flg_stt==2){ fl_id=prs_arg->out_id; }else{ // Check input file for var if(NC_NOERR==nco_inq_varid_flg(prs_arg->in_id,va_nm.c_str(),&var_id)) fl_id=prs_arg->in_id; } if(fl_id==-1) { wrn_prn(fnc_nm,"Print function cannot find var \""+va_nm+"\" in input or output"); goto end2; } // Grab format string if(pvid->getNextSibling() && pvid->getNextSibling()->getType()==NSTRING) fmt_sng=strdup(pvid->getNextSibling()->getText().c_str()); else fmt_sng=(char*)NULL; if( fl_id >=0) (void)nco_prn_var_val_lmt(fl_id,va_nm.c_str(),(lmt_sct*)NULL,0L,fmt_sng,prs_arg->FORTRAN_IDX_CNV,False,False); if(fmt_sng) fmt_sng=(char*)nco_free(fmt_sng); end2: ; #line 662 "ncoTree.cpp" } } else { bool synPredMatched245 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == PRINT))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t245 = _t; synPredMatched245 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t244 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp135_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp136_AST_in = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); _t = __t244; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched245 = false; } _t = __t245; inputState->guessing--; } if ( synPredMatched245 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t246 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp137_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); patt = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); _t = __t246; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1400 "ncoGrammer.g" int apsn; var_sct *var1; char *fmt_sng; std::string fl_nm; std::string att_nm; std::string var_nm; NcapVar *Nvar; var=NULL_CEWI; // print only on second parse if(prs_arg->ntl_scn) goto end3; fl_nm=patt->getText(); apsn=fl_nm.find("@"); var_nm=fl_nm.substr(0,apsn); att_nm=fl_nm.substr(apsn+1); Nvar=prs_arg->var_vtr.find(var_nm); if( Nvar && att_nm==std::string(nco_mss_val_sng_get()) ){ if(Nvar->var->has_mss_val==True){ var1=ncap_sclr_var_mk(fl_nm,Nvar->var->type,true); (void)memcpy(var1->val.vp,Nvar->var->mss_val.vp, nco_typ_lng(Nvar->var->type)); var=var1; }else{ wrn_prn(fnc_nm,"Cannot print missing value \""+ fl_nm+ "\" for variable \""+ var_nm +"\" as it is undefined"); goto end3; } }else{ Nvar=prs_arg->var_vtr.find(fl_nm); if(Nvar==NULL_CEWI) var=ncap_att_init(fl_nm,prs_arg); else var=nco_var_dpl(Nvar->var); } if(var==NULL_CEWI ){ wrn_prn(fnc_nm,"Cannot print attribute \"" +fl_nm+ "\". Not present in input or output files."); goto end3; } // Grab format string if(patt->getNextSibling() && patt->getNextSibling()->getType()==NSTRING) fmt_sng=strdup(patt->getNextSibling()->getText().c_str()); else fmt_sng=(char*)NULL; (void)ncap_att_prn(var,fmt_sng); var=nco_var_free(var); end3: ; #line 758 "ncoTree.cpp" } } else { bool synPredMatched249 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == PRINT))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t249 = _t; synPredMatched249 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t248 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp138_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp139_AST_in = _t; match(_t,NSTRING); _t = _t->getNextSibling(); _t = __t248; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched249 = false; } _t = __t249; inputState->guessing--; } if ( synPredMatched249 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t250 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp140_AST_in = _t; match(_t,PRINT); _t = _t->getFirstChild(); pstr = _t; match(_t,NSTRING); _t = _t->getNextSibling(); _t = __t250; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1455 "ncoGrammer.g" char *prn_sng; if(!prs_arg->ntl_scn){ prn_sng=strdup(pstr->getText().c_str()); (void)sng_ascii_trn(prn_sng); fprintf(stdout,"%s",prn_sng); prn_sng=(char*)nco_free(prn_sng); } #line 811 "ncoTree.cpp" } } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } }}} } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return iret; } var_sct * ncoTree::out(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 2039 "ncoGrammer.g" var_sct *var; #line 835 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST out_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST pls_asn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST min_asn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST tim_asn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST div_asn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST asn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST wasn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST qus = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST m = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST args = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST mtd = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST mfnc = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST margs = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST dval = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST v = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vlst = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST str = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST str1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_float = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_double = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_int = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_short = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_byte = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_ubyte = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_ushort = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_uint = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_int64 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST val_uint64 = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2039 "ncoGrammer.g" const std::string fnc_nm("out"); var_sct *var1; var_sct *var2; var=NULL_CEWI; #line 874 "ncoTree.cpp" try { // for error handling if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case TIMES: { ANTLR_USE_NAMESPACE(antlr)RefAST __t320 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp141_AST_in = _t; match(_t,TIMES); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t320; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2066 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, TIMES ); #line 895 "ncoTree.cpp" } break; } case DIVIDE: { ANTLR_USE_NAMESPACE(antlr)RefAST __t321 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp142_AST_in = _t; match(_t,DIVIDE); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t321; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2069 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, DIVIDE ); #line 914 "ncoTree.cpp" } break; } case MOD: { ANTLR_USE_NAMESPACE(antlr)RefAST __t322 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp143_AST_in = _t; match(_t,MOD); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t322; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2071 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, MOD); #line 933 "ncoTree.cpp" } break; } case CARET: { ANTLR_USE_NAMESPACE(antlr)RefAST __t323 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp144_AST_in = _t; match(_t,CARET); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t323; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2073 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, CARET); #line 952 "ncoTree.cpp" } break; } case LNOT: { ANTLR_USE_NAMESPACE(antlr)RefAST __t324 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp145_AST_in = _t; match(_t,LNOT); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; _t = __t324; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2076 "ncoGrammer.g" var=ncap_var_var_op(var1,NULL_CEWI, LNOT ); #line 969 "ncoTree.cpp" } break; } case INC: { ANTLR_USE_NAMESPACE(antlr)RefAST __t327 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp146_AST_in = _t; match(_t,INC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t327; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2082 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,INC,false,prs_arg); #line 986 "ncoTree.cpp" } break; } case DEC: { ANTLR_USE_NAMESPACE(antlr)RefAST __t328 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp147_AST_in = _t; match(_t,DEC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t328; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2084 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI, DEC,false,prs_arg ); #line 1003 "ncoTree.cpp" } break; } case POST_INC: { ANTLR_USE_NAMESPACE(antlr)RefAST __t329 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp148_AST_in = _t; match(_t,POST_INC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t329; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2086 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,false,prs_arg); #line 1022 "ncoTree.cpp" } break; } case POST_DEC: { ANTLR_USE_NAMESPACE(antlr)RefAST __t330 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp149_AST_in = _t; match(_t,POST_DEC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t330; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2089 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,false,prs_arg); #line 1041 "ncoTree.cpp" } break; } case LAND: { ANTLR_USE_NAMESPACE(antlr)RefAST __t331 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp150_AST_in = _t; match(_t,LAND); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t331; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2094 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, LAND ); #line 1060 "ncoTree.cpp" } break; } case LOR: { ANTLR_USE_NAMESPACE(antlr)RefAST __t332 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp151_AST_in = _t; match(_t,LOR); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t332; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2096 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, LOR ); #line 1079 "ncoTree.cpp" } break; } case LTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t333 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp152_AST_in = _t; match(_t,LTHAN); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t333; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2099 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, LTHAN ); #line 1098 "ncoTree.cpp" } break; } case GTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t334 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp153_AST_in = _t; match(_t,GTHAN); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t334; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2101 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, GTHAN ); #line 1117 "ncoTree.cpp" } break; } case GEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST __t335 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp154_AST_in = _t; match(_t,GEQ); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t335; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2103 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, GEQ ); #line 1136 "ncoTree.cpp" } break; } case LEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST __t336 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp155_AST_in = _t; match(_t,LEQ); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t336; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2105 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, LEQ ); #line 1155 "ncoTree.cpp" } break; } case EQ: { ANTLR_USE_NAMESPACE(antlr)RefAST __t337 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp156_AST_in = _t; match(_t,EQ); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t337; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2107 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, EQ ); #line 1174 "ncoTree.cpp" } break; } case NEQ: { ANTLR_USE_NAMESPACE(antlr)RefAST __t338 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp157_AST_in = _t; match(_t,NEQ); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t338; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2109 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, NEQ ); #line 1193 "ncoTree.cpp" } break; } case FLTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t339 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp158_AST_in = _t; match(_t,FLTHAN); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t339; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2112 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, FLTHAN ); #line 1212 "ncoTree.cpp" } break; } case FGTHAN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t340 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp159_AST_in = _t; match(_t,FGTHAN); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t340; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2114 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, FGTHAN ); #line 1231 "ncoTree.cpp" } break; } case PLUS_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t341 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp160_AST_in = _t; match(_t,PLUS_ASSIGN); _t = _t->getFirstChild(); pls_asn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); var2=out(_t); _t = _retTree; _t = __t341; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2116 "ncoGrammer.g" var1=out_asn(pls_asn); var=ncap_var_var_inc(var1,var2, PLUS_ASSIGN ,(pls_asn->getType()==UTIMES), prs_arg); #line 1254 "ncoTree.cpp" } break; } case MINUS_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t342 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp161_AST_in = _t; match(_t,MINUS_ASSIGN); _t = _t->getFirstChild(); min_asn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); var2=out(_t); _t = _retTree; _t = __t342; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2120 "ncoGrammer.g" var1=out_asn(min_asn); var=ncap_var_var_inc(var1,var2, MINUS_ASSIGN ,(min_asn->getType()==UTIMES), prs_arg); #line 1277 "ncoTree.cpp" } break; } case TIMES_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t343 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp162_AST_in = _t; match(_t,TIMES_ASSIGN); _t = _t->getFirstChild(); tim_asn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); var2=out(_t); _t = _retTree; _t = __t343; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2124 "ncoGrammer.g" var1=out_asn(tim_asn); var=ncap_var_var_inc(var1,var2, TIMES_ASSIGN ,(tim_asn->getType()==UTIMES), prs_arg); #line 1300 "ncoTree.cpp" } break; } case DIVIDE_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t344 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp163_AST_in = _t; match(_t,DIVIDE_ASSIGN); _t = _t->getFirstChild(); div_asn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); var2=out(_t); _t = _retTree; _t = __t344; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2128 "ncoGrammer.g" var1=out_asn(div_asn); var=ncap_var_var_inc(var1,var2, DIVIDE_ASSIGN ,(div_asn->getType()==UTIMES), prs_arg); #line 1323 "ncoTree.cpp" } break; } case ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t345 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp164_AST_in = _t; match(_t,ASSIGN); _t = _t->getFirstChild(); asn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t345; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2134 "ncoGrammer.g" // Check for RAM variable - if present // change tree - for example from: // ( EXPR ( = ( * n1 ) ( + four four ) ) ) // to ( EXPR ( = n1 ( + four four ) ) ) RefAST tr; bool bram; NcapVar *Nvar; if(asn->getType()==UTIMES){ tr=asn->getFirstChild(); tr->setNextSibling(asn->getNextSibling()); bram=true; } else { tr=asn; bram=false; } // Die if attempting to create a RAM var // from an existing disk var Nvar= prs_arg->var_vtr.find(tr->getText()); if(bram && tr->getType()==VAR_ID && Nvar && Nvar->flg_mem==false){ std::string serr; serr= "It is impossible to recast disk variable: \"" + tr->getText() +"\" as a RAM variable."; err_prn(fnc_nm,serr ); } if(prs_arg->ntl_scn) var=assign_ntl(tr,bram); else var=assign(tr,bram); #line 1374 "ncoTree.cpp" } break; } case WHERE_ASSIGN: { ANTLR_USE_NAMESPACE(antlr)RefAST __t346 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp165_AST_in = _t; match(_t,WHERE_ASSIGN); _t = _t->getFirstChild(); wasn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t346; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2168 "ncoGrammer.g" #line 1394 "ncoTree.cpp" } break; } case QUESTION: { ANTLR_USE_NAMESPACE(antlr)RefAST __t347 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp166_AST_in = _t; match(_t,QUESTION); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; qus = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t347; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2173 "ncoGrammer.g" bool br; // if initial scan if(prs_arg->ntl_scn){ var=ncap_var_udf("~question"); } else { br=ncap_var_lgcl(var1); if(br) var=out(qus); else var=out(qus->getNextSibling()); } var1=nco_var_free(var1); #line 1429 "ncoTree.cpp" } break; } case FUNC: { ANTLR_USE_NAMESPACE(antlr)RefAST __t348 = _t; m = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,FUNC); _t = _t->getFirstChild(); args = _t; match(_t,FUNC_ARG); _t = _t->getNextSibling(); _t = __t348; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2191 "ncoGrammer.g" // The lexer has appended the index of the function to the function name m - (name#index) // the index is into fmc_vtr string sm(m->getText()); string sdx(sm,sm.find("#")+1,sm.length()-1) ; int idx=atoi(sdx.c_str()); RefAST tr; var=prs_arg->fmc_vtr[idx].vfnc()->fnd(tr ,args, prs_arg->fmc_vtr[idx],*this); #line 1455 "ncoTree.cpp" } break; } case DOT: { ANTLR_USE_NAMESPACE(antlr)RefAST __t349 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp167_AST_in = _t; match(_t,DOT); _t = _t->getFirstChild(); mtd = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); mfnc = _t; match(_t,FUNC); _t = _t->getNextSibling(); margs = _t; match(_t,FUNC_ARG); _t = _t->getNextSibling(); _t = __t349; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2202 "ncoGrammer.g" // The lexer has appended the index of the function to the function name m - (name#index) // the index is into fmc_vtr string sm(mfnc->getText()); string sdx(sm,sm.find("#")+1,sm.length()-1) ; int idx=atoi(sdx.c_str()); var=prs_arg->fmc_vtr[idx].vfnc()->fnd(mtd ,margs, prs_arg->fmc_vtr[idx],*this); #line 1486 "ncoTree.cpp" } break; } case DIM_ID_SIZE: { dval = _t; match(_t,DIM_ID_SIZE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2212 "ncoGrammer.g" string sDim=dval->getText(); dmn_sct *dmn_fd; // Check output dmn_fd=prs_arg->dmn_out_vtr.find(sDim); // Check input if(dmn_fd==NULL_CEWI) dmn_fd=prs_arg->dmn_in_vtr.find(sDim); // nb there is a problem with the below code // if we have a netcdf4 file and on the intial scan dim is undefined (dmn_fd==NULL) // and on the final scan size >NC_MAX_INT then there is a conflict between // the initial returned type (NC_INT) and the final returned type (NC_INT64) // csz 20100119 Workaround dependence on NC_MAX_INT which DNE in netcdf.h until ~2009 #ifndef NC_MAX_INT #define NC_MAX_INT 2147483647 #endif //Initial Scan if(prs_arg->ntl_scn){ if( (dmn_fd==NULL_CEWI )|| (dmn_fd->sz <= NC_MAX_INT) ) var=ncap_sclr_var_mk(static_cast("~dmn"),(nc_type)NC_INT,false); else var=ncap_sclr_var_mk(static_cast("~dmn"),(nc_type)NC_INT64,false); }else{ if( dmn_fd==NULL_CEWI ) err_prn(fnc_nm,"Unable to locate dimension " +sDim+ " in input or output files "); if(dmn_fd->sz <= NC_MAX_INT ) var=ncap_sclr_var_mk(static_cast("~dmn"),(nco_int)dmn_fd->sz); else var=ncap_sclr_var_mk(static_cast("~dmn"),(nco_int64)dmn_fd->sz); } #line 1536 "ncoTree.cpp" } break; } case ATT_ID: { att = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2299 "ncoGrammer.g" NcapVar *Nvar=NULL; if(prs_arg->ntl_scn) Nvar=prs_arg->int_vtr.find(att->getText()); if(Nvar==NULL) Nvar=prs_arg->var_vtr.find(att->getText()); var=NULL_CEWI; if(Nvar !=NULL) var=nco_var_dpl(Nvar->var); else // Check input file for attribute var=ncap_att_init(att->getText(),prs_arg); if(!prs_arg->ntl_scn && var==NULL_CEWI ){ err_prn(fnc_nm,"Unable to locate attribute " +att->getText()+ " in input or output files."); } // if att not found return undefined if(prs_arg->ntl_scn && var==NULL_CEWI ) var=ncap_var_udf(att->getText().c_str()); if(prs_arg->ntl_scn && var->val.vp !=NULL) var->val.vp=(void*)nco_free(var->val.vp); #line 1576 "ncoTree.cpp" } break; } case VALUE_LIST: { vlst = _t; match(_t,VALUE_LIST); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2330 "ncoGrammer.g" var=value_list(vlst); #line 1590 "ncoTree.cpp" } break; } case NSTRING: { str = _t; match(_t,NSTRING); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2335 "ncoGrammer.g" char *tsng; tsng=strdup(str->getText().c_str()); (void)sng_ascii_trn(tsng); var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* Overwrite with attribute expression information */ var->nm=strdup("~zz@string"); var->nbr_dim=0; var->sz=strlen(tsng); var->type=NC_CHAR; if(!prs_arg->ntl_scn){ var->val.vp=(void*)nco_malloc(var->sz*nco_typ_lng(NC_CHAR)); (void)cast_void_nctype((nc_type)NC_CHAR,&var->val); strncpy(var->val.cp,tsng,(size_t)var->sz); (void)cast_nctype_void((nc_type)NC_CHAR,&var->val); } tsng=(char*)nco_free(tsng); #line 1622 "ncoTree.cpp" } break; } case N4STRING: { str1 = _t; match(_t,N4STRING); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2358 "ncoGrammer.g" char *tsng; tsng=strdup(str1->getText().c_str()); (void)sng_ascii_trn(tsng); var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* Overwrite with attribute expression information */ var->nm=strdup("~zz@string"); var->nbr_dim=0; var->sz=1; var->type=(nc_type)NC_STRING; if(!prs_arg->ntl_scn){ // nb sngp is type char** a ragged array of chars // each string terminated by a (char*)NULL var->val.vp=(void*)nco_malloc(nco_typ_lng((nc_type)NC_STRING)); (void)cast_void_nctype((nc_type)NC_STRING,&var->val); var->val.sngp[0]=strdup(tsng); (void)cast_nctype_void((nc_type)NC_STRING,&var->val); } tsng=(char*)nco_free(tsng); #line 1660 "ncoTree.cpp" } break; } case NCAP_FLOAT: { val_float = _t; match(_t,NCAP_FLOAT); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2388 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~float"),(nc_type)NC_FLOAT,false); else var=ncap_sclr_var_mk(SCS("~float"),static_cast(std::strtod(val_float->getText().c_str(),(char **)NULL))); #line 1672 "ncoTree.cpp" } break; } case NCAP_DOUBLE: { val_double = _t; match(_t,NCAP_DOUBLE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2390 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~double"),(nc_type)NC_DOUBLE,false); else var=ncap_sclr_var_mk(SCS("~double"),strtod(val_double->getText().c_str(),(char **)NULL)); #line 1684 "ncoTree.cpp" } break; } case NCAP_INT: { val_int = _t; match(_t,NCAP_INT); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2392 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int"),(nc_type)NC_INT,false); else var=ncap_sclr_var_mk(SCS("~int"),static_cast(std::strtol(val_int->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1696 "ncoTree.cpp" } break; } case NCAP_SHORT: { val_short = _t; match(_t,NCAP_SHORT); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2394 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~short"),(nc_type)NC_SHORT,false); else var=ncap_sclr_var_mk(SCS("~short"),static_cast(std::strtol(val_short->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1708 "ncoTree.cpp" } break; } case NCAP_BYTE: { val_byte = _t; match(_t,NCAP_BYTE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2396 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~byte"),(nc_type)NC_BYTE,false); else var=ncap_sclr_var_mk(SCS("~byte"),static_cast(std::strtol(val_byte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1720 "ncoTree.cpp" } break; } case NCAP_UBYTE: { val_ubyte = _t; match(_t,NCAP_UBYTE); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2401 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ubyte"),(nc_type)NC_UBYTE,false); else var=ncap_sclr_var_mk(SCS("~ubyte"),static_cast(std::strtoul(val_ubyte->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1732 "ncoTree.cpp" } break; } case NCAP_USHORT: { val_ushort = _t; match(_t,NCAP_USHORT); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2405 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~ushort"),(nc_type)NC_USHORT,false); else var=ncap_sclr_var_mk(SCS("~ushort"),static_cast(std::strtoul(val_ushort->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1744 "ncoTree.cpp" } break; } case NCAP_UINT: { val_uint = _t; match(_t,NCAP_UINT); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2407 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint"),(nc_type)NC_UINT,false); else var=ncap_sclr_var_mk(SCS("~uint"),static_cast(std::strtoul(val_uint->getText().c_str(),(char **)NULL,NCO_SNG_CNV_BASE10))); #line 1756 "ncoTree.cpp" } break; } case NCAP_INT64: { val_int64 = _t; match(_t,NCAP_INT64); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2409 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~int64"),(nc_type)NC_INT64,false); else var=ncap_sclr_var_mk(SCS("~int64"),sng2nbr(val_int64->getText(),nco_int64_CEWI)); #line 1768 "ncoTree.cpp" } break; } case NCAP_UINT64: { val_uint64 = _t; match(_t,NCAP_UINT64); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2413 "ncoGrammer.g" if(prs_arg->ntl_scn) var=ncap_sclr_var_mk(SCS("~uint64"),(nc_type)NC_UINT64,false); else var=ncap_sclr_var_mk(SCS("~uint64"),sng2nbr(val_uint64->getText(),nco_uint64_CEWI)); #line 1780 "ncoTree.cpp" } break; } default: bool synPredMatched290 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == PLUS))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t290 = _t; synPredMatched290 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t289 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp168_AST_in = _t; match(_t,PLUS); _t = _t->getFirstChild(); out(_t); _t = _retTree; out(_t); _t = _retTree; _t = __t289; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched290 = false; } _t = __t290; inputState->guessing--; } if ( synPredMatched290 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t291 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp169_AST_in = _t; match(_t,PLUS); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t291; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2049 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, PLUS ); #line 1826 "ncoTree.cpp" } } else { bool synPredMatched294 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == MINUS))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t294 = _t; synPredMatched294 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t293 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp170_AST_in = _t; match(_t,MINUS); _t = _t->getFirstChild(); out(_t); _t = _retTree; out(_t); _t = _retTree; _t = __t293; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched294 = false; } _t = __t294; inputState->guessing--; } if ( synPredMatched294 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t295 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp171_AST_in = _t; match(_t,MINUS); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; var2=out(_t); _t = _retTree; _t = __t295; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2051 "ncoGrammer.g" var=ncap_var_var_op(var1,var2, MINUS ); #line 1871 "ncoTree.cpp" } } else { bool synPredMatched299 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == UTIMES))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t299 = _t; synPredMatched299 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t297 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp172_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t298 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp173_AST_in = _t; match(_t,POST_INC); _t = _t->getFirstChild(); out(_t); _t = _retTree; _t = __t298; _t = _t->getNextSibling(); _t = __t297; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched299 = false; } _t = __t299; inputState->guessing--; } if ( synPredMatched299 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t300 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp174_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t301 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp175_AST_in = _t; match(_t,POST_INC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t301; _t = _t->getNextSibling(); _t = __t300; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2052 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,POST_INC,true,prs_arg); #line 1926 "ncoTree.cpp" } } else { bool synPredMatched305 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == UTIMES))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t305 = _t; synPredMatched305 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t303 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp176_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t304 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp177_AST_in = _t; match(_t,POST_DEC); _t = _t->getFirstChild(); out(_t); _t = _retTree; _t = __t304; _t = _t->getNextSibling(); _t = __t303; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched305 = false; } _t = __t305; inputState->guessing--; } if ( synPredMatched305 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t306 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp178_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t307 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp179_AST_in = _t; match(_t,POST_DEC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t307; _t = _t->getNextSibling(); _t = __t306; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2055 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,POST_DEC,true,prs_arg); #line 1981 "ncoTree.cpp" } } else { bool synPredMatched311 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == UTIMES))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t311 = _t; synPredMatched311 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t309 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp180_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t310 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp181_AST_in = _t; match(_t,INC); _t = _t->getFirstChild(); out(_t); _t = _retTree; _t = __t310; _t = _t->getNextSibling(); _t = __t309; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched311 = false; } _t = __t311; inputState->guessing--; } if ( synPredMatched311 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t312 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp182_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t313 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp183_AST_in = _t; match(_t,INC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t313; _t = _t->getNextSibling(); _t = __t312; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2058 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,INC,true,prs_arg); #line 2036 "ncoTree.cpp" } } else { bool synPredMatched317 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == UTIMES))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t317 = _t; synPredMatched317 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t315 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp184_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t316 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp185_AST_in = _t; match(_t,DEC); _t = _t->getFirstChild(); out(_t); _t = _retTree; _t = __t316; _t = _t->getNextSibling(); _t = __t315; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched317 = false; } _t = __t317; inputState->guessing--; } if ( synPredMatched317 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t318 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp186_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t319 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp187_AST_in = _t; match(_t,DEC); _t = _t->getFirstChild(); var1=out_asn(_t); _t = _retTree; _t = __t319; _t = _t->getNextSibling(); _t = __t318; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2061 "ncoGrammer.g" var=ncap_var_var_inc(var1,NULL_CEWI,DEC,true,prs_arg); #line 2091 "ncoTree.cpp" } } else if ((_t->getType() == MINUS)) { ANTLR_USE_NAMESPACE(antlr)RefAST __t325 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp188_AST_in = _t; match(_t,MINUS); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; _t = __t325; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2078 "ncoGrammer.g" var=ncap_var_var_op(var1,NULL_CEWI, MINUS ); #line 2106 "ncoTree.cpp" } } else if ((_t->getType() == PLUS)) { ANTLR_USE_NAMESPACE(antlr)RefAST __t326 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp189_AST_in = _t; match(_t,PLUS); _t = _t->getFirstChild(); var1=out(_t); _t = _retTree; _t = __t326; _t = _t->getNextSibling(); } else { bool synPredMatched352 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == VAR_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t352 = _t; synPredMatched352 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t351 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp190_AST_in = _t; match(_t,VAR_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp191_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t351; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched352 = false; } _t = __t352; inputState->guessing--; } if ( synPredMatched352 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t353 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); lmt = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t353; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2253 "ncoGrammer.g" // fxm: 4 Oct 2015 /* the following is valid syntx var_nm(array_var)- array_var now contains all the indices - that is srt vectors srt & end vectors srt,end,srd vectors so for now indexing into a multi-dmensional var using a single index has temporarily been disabled // see if hyperslab limit is a single value if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON) var=var_lmt_one(vid); else var=var_lmt(vid); */ var=var_lmt(vid); #line 2184 "ncoTree.cpp" } } else if ((_t->getType() == VAR_ID)) { v = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2282 "ncoGrammer.g" var=prs_arg->ncap_var_init(v->getText(),true); if(var== NULL){ if(prs_arg->ntl_scn){ var=ncap_var_udf(v->getText().c_str()); return var; }else nco_exit(EXIT_FAILURE); } // apply cast only if sz >1 if(bcst && var->sz >1) var=ncap_cst_do(var,var_cst,prs_arg->ntl_scn); #line 2208 "ncoTree.cpp" } } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } }}}}}}} } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ) { #line 1469 "ncoGrammer.g" var_sct *var; #line 2234 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST assign_ntl_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST dmn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid2 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att2 = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 1469 "ncoGrammer.g" const std::string fnc_nm("assign_ntl"); var=NULL_CEWI; #line 2249 "ncoTree.cpp" try { // for error handling bool synPredMatched254 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == VAR_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t254 = _t; synPredMatched254 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t253 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp192_AST_in = _t; match(_t,VAR_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp193_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t253; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched254 = false; } _t = __t254; inputState->guessing--; } if ( synPredMatched254 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t255 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); lmt = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t255; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1474 "ncoGrammer.g" std::string var_nm; var_sct *var_lhs; var_sct *var_rhs; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() >= nco_dbg_scl) dbg_prn(fnc_nm,var_nm+"(limits)"); // evaluate rhs for side effects eg new dims or lvalues var_rhs=out(vid->getNextSibling()); var_rhs=nco_var_free(var_rhs); var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs){ var=nco_var_dpl(var_lhs); (void)prs_arg->ncap_var_write(var_lhs,bram); } else { // set var to udf var_lhs=ncap_var_udf(var_nm.c_str()); var=nco_var_dpl(var_lhs); Nvar=new NcapVar(var_lhs); (void)prs_arg->int_vtr.push_ow(Nvar); } #line 2318 "ncoTree.cpp" } } else { bool synPredMatched259 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == VAR_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t259 = _t; synPredMatched259 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t257 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp194_AST_in = _t; match(_t,VAR_ID); _t = _t->getFirstChild(); { if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case DMN_LIST: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp195_AST_in = _t; match(_t,DMN_LIST); _t = _t->getNextSibling(); break; } case DMN_LIST_P: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp196_AST_in = _t; match(_t,DMN_LIST_P); _t = _t->getNextSibling(); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } } } _t = __t257; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched259 = false; } _t = __t259; inputState->guessing--; } if ( synPredMatched259 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t260 = _t; vid1 = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); dmn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t260; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1503 "ncoGrammer.g" int idx; std::string var_nm; var_sct *var1; std::vector str_vtr; RefAST aRef; NcapVar *Nvar; int str_vtr_sz; var_nm=vid1->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"[dims]"); // set class wide variables bcst=true; var_cst=NULL_CEWI; aRef=dmn->getFirstChild(); // pPut dimension names in vector while(aRef) { str_vtr.push_back(aRef->getText()); aRef=aRef->getNextSibling(); } //Check that all dims exist str_vtr_sz=str_vtr.size(); for(idx=0 ; idx < str_vtr_sz ; idx++) if( prs_arg->dmn_in_vtr.findi(str_vtr[idx]) ==-1 && prs_arg->dmn_out_vtr.findi(str_vtr[idx]) ==-1) break; // return undef if dim missing if( idx getNextSibling()); if(var1->undefined) { var=NULL_CEWI; } else { var_cst=nco_var_cnf_typ(var1->type,var_cst); var_cst->typ_dsk=var1->type; var=nco_var_dpl(var_cst); } var1=nco_var_free(var1); } if(!var){ var1=ncap_var_udf(var_nm.c_str()); Nvar=new NcapVar(var1); (void)prs_arg->int_vtr.push_ow(Nvar); var=nco_var_dpl(var1); } else{ var->nm=(char*)nco_free(var->nm); var->nm=strdup(var_nm.c_str()); var1=nco_var_dpl(var); prs_arg->ncap_var_write(var1,bram); } if(var_cst) var_cst=nco_var_free(var_cst); bcst=false; #line 2449 "ncoTree.cpp" } } else if ((_t->getType() == VAR_ID)) { vid2 = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1572 "ncoGrammer.g" var_sct *var_lhs=(var_sct*)NULL; var_sct *var_rhs=(var_sct*)NULL; std::string var_nm; var_nm=vid2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm); // Set class wide variables bcst=false; var_cst=NULL_CEWI; // get shape from RHS var_rhs=out(vid2->getNextSibling()); // use init_chk() to avoid warning from ncap_var_init() if var not present if(prs_arg->ncap_var_init_chk(var_nm)) var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs) { var=nco_var_dpl(var_lhs); (void)prs_arg->ncap_var_write(var_lhs,bram); nco_var_free(var_rhs); } else if(var_rhs) { //Copy return variable (void)nco_free(var_rhs->nm); var_rhs->nm =strdup(var_nm.c_str()); //Copy return variable var=nco_var_dpl(var_rhs); // Write var to int_vtr // if var already in int_vtr or var_vtr then write call does nothing (void)prs_arg->ncap_var_write(var_rhs,bram); } else { var=ncap_var_udf(var_nm.c_str()); } #line 2501 "ncoTree.cpp" } } else { bool synPredMatched263 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == ATT_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t263 = _t; synPredMatched263 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t262 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp197_AST_in = _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp198_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t262; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched263 = false; } _t = __t263; inputState->guessing--; } if ( synPredMatched263 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t264 = _t; att = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp199_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t264; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1616 "ncoGrammer.g" ; #line 2546 "ncoTree.cpp" } } else { bool synPredMatched267 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == ATT_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t267 = _t; synPredMatched267 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t266 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp200_AST_in = _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp201_AST_in = _t; match(_t,LMT_DMN); _t = _t->getNextSibling(); _t = __t266; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched267 = false; } _t = __t267; inputState->guessing--; } if ( synPredMatched267 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t268 = _t; att1 = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp202_AST_in = _t; match(_t,DMN_LIST); _t = _t->getNextSibling(); _t = __t268; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1619 "ncoGrammer.g" ; #line 2591 "ncoTree.cpp" } } else if ((_t->getType() == ATT_ID)) { att2 = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1622 "ncoGrammer.g" //In Initial scan all newly defined atts are flagged as Undefined var_sct *var1; NcapVar *Nvar; if(nco_dbg_lvl_get() > nco_dbg_var) dbg_prn(fnc_nm,att2->getText()); var1=ncap_var_udf(att2->getText().c_str()); Nvar=new NcapVar(var1); prs_arg->int_vtr.push_ow(Nvar); // Copy return variable var=nco_var_dpl(var1); #line 2617 "ncoTree.cpp" } } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } }}} } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ) { #line 1642 "ncoGrammer.g" var_sct *var; #line 2643 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST assign_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST dmn = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid2 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att2 = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 1642 "ncoGrammer.g" const std::string fnc_nm("assign"); var=NULL_CEWI; #line 2658 "ncoTree.cpp" try { // for error handling bool synPredMatched272 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == VAR_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t272 = _t; synPredMatched272 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t271 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp203_AST_in = _t; match(_t,VAR_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp204_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t271; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched272 = false; } _t = __t272; inputState->guessing--; } if ( synPredMatched272 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t273 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); lmt = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t273; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1648 "ncoGrammer.g" int idx; int nbr_dmn; int var_id; int slb_sz; std::string var_nm; RefAST lmt_Ref; var_sct *var_lhs=NULL_CEWI; var_sct *var_rhs=NULL_CEWI; NcapVector lmt_vtr; lmt_Ref=vid->getFirstChild(); bcst=false; var_cst=NULL_CEWI; var=NULL_CEWI; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"(limits)"); // check to see if we are dealing with a single // index in limit -- i.e hyperslab a mult-dimensional var // with a single index if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON ){ var=var_lmt_one_lhs(vid,bram); goto end0; } lmt_Ref=lmt; Nvar=prs_arg->var_vtr.find(var_nm); // Overwrite bram possibly if(Nvar) bram=Nvar->flg_mem; // Deal with RAM variables if(bram) { if(Nvar && Nvar->flg_stt==1){ var_sct *var_ini; var_ini=prs_arg->ncap_var_init(var_nm,true); Nvar->var->val.vp=var_ini->val.vp; var_ini->val.vp=(void*)NULL; var_ini=nco_var_free(var_ini); Nvar->flg_stt=2; } if(Nvar && Nvar->flg_stt==2) var_lhs=Nvar->var; if(!Nvar) var_lhs=prs_arg->ncap_var_init(var_nm,true); nbr_dmn=var_lhs->nbr_dim; // Now populate lmt_vtr; if( lmt_mk(nbr_dmn, lmt_Ref,lmt_vtr) == false) err_prn(fnc_nm,"Invalid hyperslab limits for variable "+ var_nm); if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_lhs->dim[idx]->nm); slb_sz=1; // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++){ (void)ncap_lmt_evl(prs_arg->out_id,lmt_vtr[idx],prs_arg); // Calculate size slb_sz *= lmt_vtr[idx]->cnt; } // Calculate RHS variable var_rhs=out(vid->getNextSibling()); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // deal with scalar on RHS first if(var_rhs->sz == 1) (void)ncap_att_stretch(var_rhs,slb_sz); // make sure var_lhs and var_rhs are the same size // and that they are the same shape (ie they conform!!) if(var_rhs->sz != slb_sz){ err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(" +nbr2sng(slb_sz) + ") doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); } (void)nco_put_var_mem(var_rhs,var_lhs,lmt_vtr); if(Nvar==NULL) (void)prs_arg->ncap_var_write(var_lhs,true); // deal with Regular Vars } else { // if var undefined in O or defined but not populated if(!Nvar || ( Nvar && Nvar->flg_stt==1)){ // if var isn't in ouptut then copy it there //rcd=nco_inq_varid_flg(prs_arg->out_id,var_nm,&var_id); var_lhs=prs_arg->ncap_var_init(var_nm,true); // copy atts to output (void)ncap_att_cpy(var_nm,var_nm,prs_arg); (void)prs_arg->ncap_var_write(var_lhs,false); wrn_prn(fnc_nm,"Var being read and written in ASSIGN "+ var_nm); } // Get "new" var_id (void)nco_inq_varid(prs_arg->out_id,var_nm.c_str(),&var_id); var_lhs=prs_arg->ncap_var_init(var_nm,false); nbr_dmn=var_lhs->nbr_dim; // Now populate lmt_vtr; if( lmt_mk(nbr_dmn, lmt_Ref,lmt_vtr) == false) err_prn(fnc_nm,"Invalid hyperslab limits for variable "+ var_nm); if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_lhs->dim[idx]->nm); var_lhs->sz=1; // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++){ (void)ncap_lmt_evl(prs_arg->out_id,lmt_vtr[idx],prs_arg); // Calculate size var_lhs->sz *= lmt_vtr[idx]->cnt; } // Calculate RHS variable var_rhs=out(vid->getNextSibling()); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // deal with scalar on RHS first if(var_rhs->sz == 1){ // stretch variable to var_lhs->sz (void)ncap_att_stretch(var_rhs,var_lhs->sz); } // make sure var_lhs and var_rhs are the same size // and that they are the same shape (ie they conform!!) if(var_rhs->sz != var_lhs->sz){ err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(" +nbr2sng(var_lhs->sz) + ") doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); } // swap values about var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; //write block { for(idx=0;idxsrt[idx]=lmt_vtr[idx]->srt; var_lhs->cnt[idx]=lmt_vtr[idx]->cnt; var_lhs->srd[idx]=lmt_vtr[idx]->srd; } /* end loop over idx */ // write slab to O contains call to Open MP critical region // routine also frees up calling var (void)prs_arg->ncap_var_write_slb(var_lhs); } // end put block !! } // end else if regular var var_rhs=nco_var_free(var_rhs); // Empty and free vector for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_lmt_free(lmt_vtr[idx]); // See If we have to return something end0: if(lmt->getNextSibling() && lmt->getNextSibling()->getType()==NORET) var=NULL_CEWI; else var=prs_arg->ncap_var_init(var_nm,true); #line 2894 "ncoTree.cpp" } } else { bool synPredMatched277 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == VAR_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t277 = _t; synPredMatched277 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t275 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp205_AST_in = _t; match(_t,VAR_ID); _t = _t->getFirstChild(); { if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case DMN_LIST: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp206_AST_in = _t; match(_t,DMN_LIST); _t = _t->getNextSibling(); break; } case DMN_LIST_P: { ANTLR_USE_NAMESPACE(antlr)RefAST tmp207_AST_in = _t; match(_t,DMN_LIST_P); _t = _t->getNextSibling(); break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } } } _t = __t275; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched277 = false; } _t = __t277; inputState->guessing--; } if ( synPredMatched277 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t278 = _t; vid1 = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); dmn = _t; if ( _t == ANTLR_USE_NAMESPACE(antlr)nullAST ) throw ANTLR_USE_NAMESPACE(antlr)MismatchedTokenException(); _t = _t->getNextSibling(); _t = __t278; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1845 "ncoGrammer.g" var_sct *var1; std::vector str_vtr; RefAST aRef; std::string var_nm; var_nm=vid1->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm+"[dims]"); // set class wide variables bcst=true; var_cst=NULL_CEWI; //aRef=vid->getFirstChild()->getFirstChild(); aRef=dmn->getFirstChild(); // pPut dimension names in vector while(aRef) { str_vtr.push_back(aRef->getText()); aRef=aRef->getNextSibling(); } // Cast is applied in VAR_ID action in function out() // Note cast is NOT applied to an attribute, an irregular hyperslab // or any entity which has a size of one. var_cst=ncap_cst_mk(str_vtr,prs_arg); var1=out(vid1->getNextSibling()); /* NB var_cst->val.vp always now set to null */ // If the RHS has size one or is an attribute or an irregular hyperslab // then we neet to use the var_cst as the shape of the written variable. // It is possible for the cast on the LHS to have a size of one and the RHS // to have a size of one e.g., if the dim(s) in the list have a size of one bool br1=(var_cst->sz >=1 && var1->sz==1); bool br2=(var_cst->sz==var1->sz && ( ncap_var_is_att(var1) ||var1->has_dpl_dmn==-1 )); // The code rebuilds var1 with the shape from the casting variable if( br1 || br2){ var_sct *var_nw; void *vp_swp; var_nw=nco_var_dpl(var_cst); var_nw=nco_var_cnf_typ(var1->type,var_nw); if(br1) (void)ncap_att_stretch(var1,var_nw->sz); vp_swp=var_nw->val.vp; var_nw->val.vp=var1->val.vp; var1->val.vp=vp_swp; var1=nco_var_free(var1); var1=var_nw; } //blow out if vars not the same size if(var1->sz != var_cst->sz) err_prn(fnc_nm, "LHS cast for "+var_nm+" - cannot make RHS "+ std::string(var1->nm) + " conform."); var1->nm=(char*)nco_free(var1->nm); var1->nm =strdup(var_nm.c_str()); // See If we have to return something if(dmn->getNextSibling() && dmn->getNextSibling()->getType()==NORET) var=NULL_CEWI; else var=nco_var_dpl(var1); //call to nco_var_get() in ncap_var_init() uses this property var1->typ_dsk=var1->type; (void)prs_arg->ncap_var_write(var1,bram); bcst=false; var_cst=nco_var_free(var_cst); #line 3035 "ncoTree.cpp" } } else if ((_t->getType() == VAR_ID)) { vid2 = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1924 "ncoGrammer.g" // Set class wide variables var_sct *var_lhs=(var_sct*)NULL; var_sct *var_rhs=(var_sct*)NULL; NcapVar *Nvar; std::string var_nm; var_nm=vid2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,var_nm); bcst=false; var_cst=NULL_CEWI; var_rhs=out(vid2->getNextSibling()); // Save name std::string s_var_rhs(var_rhs->nm); Nvar=prs_arg->var_vtr.find(var_nm); if(!Nvar || (Nvar && Nvar->flg_stt==1)) (void)ncap_att_cpy(var_nm,s_var_rhs,prs_arg); if(Nvar) var_lhs=nco_var_dpl(Nvar->var); // use init_chk() to avoid warning from ncap_var_init() if var not present else if(prs_arg->ncap_var_init_chk(var_nm)) var_lhs=prs_arg->ncap_var_init(var_nm,false); if(var_lhs) { // var is defined and populated & RHS is scalar -then stretch var to match var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); if(var_rhs->sz ==1 && var_lhs->sz >1) { (void)ncap_att_stretch(var_rhs,var_lhs->sz); // this is a special case -- if the RHS scalar has // no missing value then retain LHS missing value // else LHS missing value gets over written by RHS if(!var_rhs->has_mss_val) (void)nco_mss_val_cp(var_lhs,var_rhs); } if( var_rhs->sz != var_lhs->sz) err_prn(fnc_nm,"regular assign - var size missmatch between \""+var_nm+"\" and RHS of expression"); var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; nco_var_free(var_rhs); // Write var to disk (void)prs_arg->ncap_var_write(var_lhs,bram); } else { nco_free(var_rhs->nm); var_rhs->nm=strdup(var_nm.c_str()); (void)prs_arg->ncap_var_write(var_rhs,bram); } // See If we have to return something if(vid2->getFirstChild() && vid2->getFirstChild()->getType()==NORET) var=NULL_CEWI; else var=prs_arg->ncap_var_init(var_nm,true); ; #line 3112 "ncoTree.cpp" } } else { bool synPredMatched281 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == ATT_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t281 = _t; synPredMatched281 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t280 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp208_AST_in = _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp209_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t280; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched281 = false; } _t = __t281; inputState->guessing--; } if ( synPredMatched281 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t282 = _t; att = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp210_AST_in = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t282; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1993 "ncoGrammer.g" ; #line 3157 "ncoTree.cpp" } } else { bool synPredMatched285 = false; if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; if (((_t->getType() == ATT_ID))) { ANTLR_USE_NAMESPACE(antlr)RefAST __t285 = _t; synPredMatched285 = true; inputState->guessing++; try { { ANTLR_USE_NAMESPACE(antlr)RefAST __t284 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp211_AST_in = _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp212_AST_in = _t; match(_t,DMN_LIST); _t = _t->getNextSibling(); _t = __t284; _t = _t->getNextSibling(); } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& pe) { synPredMatched285 = false; } _t = __t285; inputState->guessing--; } if ( synPredMatched285 ) { ANTLR_USE_NAMESPACE(antlr)RefAST __t286 = _t; att1 = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,ATT_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST tmp213_AST_in = _t; match(_t,DMN_LIST); _t = _t->getNextSibling(); _t = __t286; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1996 "ncoGrammer.g" ; #line 3202 "ncoTree.cpp" } } else if ((_t->getType() == ATT_ID)) { att2 = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 1999 "ncoGrammer.g" var_sct *var1; string sa=att2->getText(); if(nco_dbg_lvl_get() >= nco_dbg_var) dbg_prn(fnc_nm,sa); var1=out(att2->getNextSibling()); // we dont need missing values in ATT right !! if(var1->has_mss_val){ var1->has_mss_val=False; var1->mss_val.vp=(void*)nco_free(var1->mss_val.vp); } // if RHS is a non scalar variable then loose superfluous dimension data if( var1->nbr_dim >0){ var_sct *var_tmp; var_tmp=ncap_sclr_var_mk(sa,var1->type,false); var_tmp->sz=var1->sz; var_tmp->val.vp=var1->val.vp; var1->val.vp =(void*)NULL; var1=nco_var_free(var1); var1=var_tmp; }else{ (void)nco_free(var1->nm); var1->nm=strdup(sa.c_str()); } NcapVar *Nvar=new NcapVar(var1,sa); prs_arg->var_vtr.push_ow(Nvar); // See If we have to return something if(att2->getFirstChild() && att2->getFirstChild()->getType()==NORET) var=NULL_CEWI; else var=nco_var_dpl(var1); ; #line 3249 "ncoTree.cpp" } } else { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } }}} } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 2423 "ncoGrammer.g" var_sct *var; #line 3273 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST out_asn_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid1 = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST att = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2423 "ncoGrammer.g" const std::string fnc_nm("assign_asn"); var=NULL_CEWI; string var_nm_s; NcapVar *Nvar; #line 3286 "ncoTree.cpp" try { // for error handling if (_t == ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = ASTNULL; switch ( _t->getType()) { case UTIMES: { ANTLR_USE_NAMESPACE(antlr)RefAST __t355 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp214_AST_in = _t; match(_t,UTIMES); _t = _t->getFirstChild(); vid1 = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); _t = __t355; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2433 "ncoGrammer.g" if(vid1->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +vid1->getText() ); //do attribute inheritance var_nm_s=vid1->getText(); Nvar=prs_arg->var_vtr.find(var_nm_s); if( !Nvar || Nvar->flg_stt==1 ) ncap_att_cpy(var_nm_s,var_nm_s,prs_arg); var=prs_arg->ncap_var_init(var_nm_s,true); if(var== NULL_CEWI){ nco_exit(EXIT_FAILURE); } #line 3322 "ncoTree.cpp" } break; } case VAR_ID: { vid = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2451 "ncoGrammer.g" var_nm_s=vid->getText(); if(vid->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +vid->getText() ); //do attribute inheritance Nvar=prs_arg->var_vtr.find(var_nm_s); if( !Nvar || Nvar->flg_stt==1 ) ncap_att_cpy(var_nm_s,var_nm_s,prs_arg); var=prs_arg->ncap_var_init(var_nm_s,true); if(var== NULL_CEWI){ nco_exit(EXIT_FAILURE); } #line 3353 "ncoTree.cpp" } break; } case ATT_ID: { att = _t; match(_t,ATT_ID); _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2472 "ncoGrammer.g" // check "output" NcapVar *Nvar=NULL; if(att->getFirstChild()) err_prn(fnc_nm,"Invalid Lvalue " +att->getText() ); if(prs_arg->ntl_scn) Nvar=prs_arg->int_vtr.find(att->getText()); if(Nvar==NULL) Nvar=prs_arg->var_vtr.find(att->getText()); var=NULL_CEWI; if(Nvar !=NULL) var=nco_var_dpl(Nvar->var); else var=ncap_att_init(att->getText(),prs_arg); if(!prs_arg->ntl_scn && var==NULL_CEWI ){ err_prn(fnc_nm,"Unable to locate attribute " +att->getText()+ " in input or output files."); } // if att not found return undefined if(prs_arg->ntl_scn && var==NULL_CEWI ) var=ncap_var_udf(att->getText().c_str()); if(prs_arg->ntl_scn && var->val.vp !=NULL) var->val.vp=(void*)nco_free(var->val.vp); #line 3396 "ncoTree.cpp" } break; } default: { throw ANTLR_USE_NAMESPACE(antlr)NoViableAltException(_t); } } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 2506 "ncoGrammer.g" var_sct *var; #line 3422 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST value_list_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vlst = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2506 "ncoGrammer.g" const std::string fnc_nm("value_list"); var=NULL_CEWI; #line 3430 "ncoTree.cpp" try { // for error handling { vlst = _t; match(_t,VALUE_LIST); _t = _t->getNextSibling(); } if ( inputState->guessing==0 ) { #line 2511 "ncoGrammer.g" char *cp; int nbr_lst; int idx; int tsz; nc_type type=NC_NAT; var_sct *var_ret; RefAST rRef; std::vector exp_vtr; rRef=vlst->getFirstChild(); while(rRef){ exp_vtr.push_back(out(rRef)); rRef=rRef->getNextSibling(); } nbr_lst=exp_vtr.size(); // if any types are NC_STRING then call value_list_string() action for(idx=0;idx type == NC_STRING){ var_ret=value_list_string(rRef,exp_vtr); goto end_val; } // find highest type for(idx=0;idx type); //(void)ncap_var_retype(exp_vtr[0], exp_vtr[idx]); // Inital Scan if(prs_arg->ntl_scn){ for(idx=0 ; idx undefined) break; // Exit if an element in the list is "undefined" if(idx < nbr_lst){ var_ret=ncap_var_udf("~zz@value_list"); goto end_val; } var_ret=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var_ret); /* Overwrite with attribute expression information */ var_ret->nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=type; goto end_val; } // end initial scan // convert every element in vector to highest type for(idx=0;idx nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=type; tsz=nco_typ_lng(type); var_ret->val.vp=(void*)nco_malloc(nbr_lst*tsz); for(idx=0;idx val.vp)+ (ptrdiff_t)(idx*tsz); memcpy(cp,exp_vtr[idx]->val.vp,tsz); } // Free vector end_val: for(idx=0 ; idx < nbr_lst ; idx++) (void)nco_var_free(exp_vtr[idx]); var=var_ret; #line 3527 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t, std::vector &exp_vtr ) { #line 2602 "ncoGrammer.g" var_sct *var; #line 3548 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST value_list_string_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; #line 2602 "ncoGrammer.g" const std::string fnc_nm("value_list_string"); var=NULL_CEWI; #line 3555 "ncoTree.cpp" try { // for error handling if ( inputState->guessing==0 ) { #line 2608 "ncoGrammer.g" int idx; int nbr_lst; int tsz; nco_string *cp; var_sct *var_ret; nbr_lst=exp_vtr.size(); var_ret=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var_ret); /* Overwrite with attribute expression information */ var_ret->nm=strdup("~zz@value_list"); var_ret->nbr_dim=0; var_ret->sz=nbr_lst; var_ret->type=(nc_type)NC_STRING; // Inital Scan if(prs_arg->ntl_scn) goto end_val; // check all var types in vector must be type NC_STRING for(idx=0; idxtype != NC_STRING) err_prn(fnc_nm," error processing value list string: to successfully parse value list of strings all elements must be of type NC_STRING"); // from here on deal with final scan tsz=nco_typ_lng((nc_type)NC_STRING); var_ret->val.vp=(void*)nco_malloc(nbr_lst*tsz); (void)cast_void_nctype((nc_type)NC_STRING,&var_ret->val); cp=var_ret->val.sngp; for(idx=0 ; idxval); cp[idx]=strdup(var_in->val.sngp[0]); // cast pointer back (void)cast_nctype_void((nc_type)NC_STRING,&var_in->val); } // end loop (void)cast_nctype_void((nc_type)NC_STRING,&var_ret->val); end_val: var=var_ret; #line 3608 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } bool ncoTree::where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t, var_sct *var_msk ) { #line 2659 "ncoGrammer.g" bool bret=false; #line 3629 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST where_assign_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2659 "ncoGrammer.g" const std::string fnc_nm("where_assign"); var_sct *var_rhs; #line 3638 "ncoTree.cpp" try { // for error handling ANTLR_USE_NAMESPACE(antlr)RefAST __t360 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp215_AST_in = _t; match(_t,EXPR); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t361 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp216_AST_in = _t; match(_t,ASSIGN); _t = _t->getFirstChild(); vid = _t; match(_t,VAR_ID); _t = _t->getNextSibling(); var_rhs=out(_t); _t = _retTree; _t = __t361; _t = _t->getNextSibling(); _t = __t360; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2665 "ncoGrammer.g" bool bfr=false; nco_bool DO_CONFORM; std::string var_nm=vid->getText(); var_sct *var_lhs; NcapVar *Nvar; bret=false; var_lhs=prs_arg->ncap_var_init(var_nm,true); if(var_lhs==NULL_CEWI) nco_exit(EXIT_FAILURE); var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); if(var_rhs->sz >1L && var_rhs->sz != var_lhs->sz) { var_sct *var_tmp=NULL_CEWI; // try and make RHS conform to LHS var_tmp=nco_var_cnf_dmn(var_lhs,var_rhs,var_tmp,True,&DO_CONFORM); if(DO_CONFORM==False) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and variable "<nm <<" conform in where statement."; err_prn(fnc_nm,os.str()); } if(var_rhs != var_tmp){ var_rhs=nco_var_free(var_rhs); var_rhs=var_tmp; } } // Make mask conform if(var_msk->sz != var_lhs->sz){ var_sct *var_tmp=NULL_CEWI; var_tmp=nco_var_cnf_dmn(var_lhs,var_msk,var_tmp,True,&DO_CONFORM); if(DO_CONFORM==False) { std::ostringstream os; os<<"Cannot make variable:"<nm <<" and where mask variable "<nm <<" conform. "; err_prn(fnc_nm,os.str()); } if(var_msk != var_tmp){ //var_msk=nco_var_free(var_msk); bfr=true; var_msk=var_tmp; } } char *cp_in; char *cp_out; short *sp; long idx; long jdx; long sz; size_t slb_sz; sz=var_lhs->sz; slb_sz=nco_typ_lng(var_lhs->type); (void)cast_void_nctype(NC_SHORT,&var_msk->val); //Dereference sp=var_msk->val.sp; cp_out=( char*)(var_lhs->val.vp); cp_in=( char*)(var_rhs->val.vp); if(var_rhs->sz==1L){ for(idx=0; idxval); // free "local" copy of var_msk if necessary if(bfr) var_msk=nco_var_free(var_msk); // Do attribute propagation if LHS is new Nvar=prs_arg->var_vtr.find(var_nm); if(!Nvar) (void)ncap_att_cpy(var_nm,std::string(var_rhs->nm),prs_arg); var_rhs=nco_var_free(var_rhs); prs_arg->ncap_var_write(var_lhs,false); bret=true; #line 3761 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return bret; } var_sct * ncoTree::var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 2770 "ncoGrammer.g" var_sct *var; #line 3780 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_one_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2770 "ncoGrammer.g" const std::string fnc_nm("var_lmt_one"); var=NULL_CEWI; var_sct *var_nbr; #line 3789 "ncoTree.cpp" try { // for error handling ANTLR_USE_NAMESPACE(antlr)RefAST __t363 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t364 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp217_AST_in = _t; match(_t,LMT_LIST); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t365 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp218_AST_in = _t; match(_t,LMT); _t = _t->getFirstChild(); var_nbr=out(_t); _t = _retTree; _t = __t365; _t = _t->getNextSibling(); _t = __t364; _t = _t->getNextSibling(); _t = __t363; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2776 "ncoGrammer.g" int idx; var_sct *var_rhs; std::string var_nm; var_nm=vid->getText(); var_rhs=prs_arg->ncap_var_init(var_nm,false); if(var_rhs->undefined){ var=ncap_var_udf("~rhs_undefined"); goto end0; // cannot use return var!! } if(prs_arg->ntl_scn){ var=ncap_sclr_var_mk(var_nm,(nc_type)(var_rhs->type),false); }else{ bool bram; int fl_id; int nbr_dim=var_rhs->nbr_dim; long srt; long srt1[NC_MAX_DIMS]; long sz_dim=1; NcapVar *Nvar; // create var with space for value var=ncap_sclr_var_mk(var_nm,(nc_type)(var_rhs->type),true); // we have already checked limit is a single value // in the calling action earlier in the tree parser //var_nbr=out(lmt->getFirstChild()); var_nbr=nco_var_cnf_typ(NC_INT,var_nbr); (void)cast_void_nctype(NC_INT,&var_nbr->val); srt=var_nbr->val.ip[0]; (void)cast_nctype_void(NC_INT,&var_nbr->val); // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if ( srt<0) srt+=var_rhs->sz-1; // deal with negative index // do some bounds checking if(srt >= var_rhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_rhs->sz)+" is out of bounds\n"); // check for RAM variable Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_mem) bram=true; else bram=false; if(bram){ // deal with RAM variable size_t slb_sz; slb_sz=nco_typ_lng(var_rhs->type); (void)memcpy(var->val.vp,(const char*)Nvar->var->val.vp+(ptrdiff_t)(srt*slb_sz),slb_sz); }else{ // variable in output and defined if(Nvar && Nvar->flg_stt==2) { #ifdef _OPENMP fl_id=( omp_in_parallel() ? prs_arg->out_id_readonly : prs_arg->out_id ); #else fl_id=prs_arg->out_id; #endif // variable output but undefined }else if(Nvar && Nvar->flg_stt==1) { fl_id=prs_arg->in_id; (void)nco_inq_varid(fl_id,var_nm.c_str(),&var_rhs->id); // variable in input }else{ fl_id=prs_arg->in_id; } // convert srt into multiple indices for(idx=0;idxcnt[idx]; for(idx=0; idxcnt[idx]; srt1[idx]=srt/sz_dim; srt-=srt1[idx]*sz_dim; } (void)nco_get_var1(fl_id,var_rhs->id,srt1,var->val.vp,var_rhs->type); } // end else !bram // copy missing value if any over nco_mss_val_cp(var_rhs,var); } // end else !prs_arg->ntl_scn end0: var_nbr=nco_var_free(var_nbr); var_rhs=nco_var_free(var_rhs); #line 3914 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ) { #line 2881 "ncoGrammer.g" var_sct *var; #line 3935 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_one_lhs_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 2881 "ncoGrammer.g" const std::string fnc_nm("var_lmt_one_lhs"); var=NULL_CEWI; var_sct *var_nbr; #line 3944 "ncoTree.cpp" try { // for error handling ANTLR_USE_NAMESPACE(antlr)RefAST __t367 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t368 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp219_AST_in = _t; match(_t,LMT_LIST); _t = _t->getFirstChild(); ANTLR_USE_NAMESPACE(antlr)RefAST __t369 = _t; ANTLR_USE_NAMESPACE(antlr)RefAST tmp220_AST_in = _t; match(_t,LMT); _t = _t->getFirstChild(); var_nbr=out(_t); _t = _retTree; _t = __t369; _t = _t->getNextSibling(); _t = __t368; _t = _t->getNextSibling(); _t = __t367; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 2887 "ncoGrammer.g" int idx; int var_id; int slb_sz; long srt; std::string var_nm; var_sct *var_lhs=NULL_CEWI; var_sct *var_rhs=NULL_CEWI; NcapVar *Nvar; var_nm=vid->getText(); if(nco_dbg_lvl_get() > nco_dbg_var) dbg_prn(fnc_nm,var_nm+"(limit)"); Nvar=prs_arg->var_vtr.find(var_nm); // calculate single hyperslab limit var_nbr=nco_var_cnf_typ(NC_INT,var_nbr); (void)cast_void_nctype(NC_INT,&var_nbr->val); srt=var_nbr->val.ip[0]; (void)cast_nctype_void(NC_INT,&var_nbr->val); // Overwrite bram possibly if(Nvar) bram=Nvar->flg_mem; // Deal with RAM variables if(bram){ if(Nvar){ //defined but not-populated if(Nvar->flg_stt==1){ var_sct *var_ini; var_ini=prs_arg->ncap_var_init(var_nm,true); Nvar->var->val.vp=var_ini->val.vp; var_ini->val.vp=(void*)NULL; var_ini=nco_var_free(var_ini); Nvar->flg_stt=2; } //defined and populated if(Nvar->flg_stt==2) var_lhs=Nvar->var; }else{ var_lhs=prs_arg->ncap_var_init(var_nm,true); } // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if(srt<0) srt+=var_lhs->sz-1; //deal with negative index convention // do some bounds checking on single limits if(srt >= var_lhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_lhs->sz)+" is out of bounds\n"); //calculate rhs var_rhs=out(vid->getNextSibling()); // we are only hyperslabbing a single value if(var_rhs->sz !=1) err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(1) doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); slb_sz=nco_typ_lng(var_lhs->type); (void)memcpy((char*)var_lhs->val.vp+(ptrdiff_t)(srt*slb_sz),var_rhs->val.vp,slb_sz); if(!Nvar) (void)prs_arg->ncap_var_write(var_lhs,true); // deal with regular vars }else{ // if var undefined in O or defined but not populated if(!Nvar || ( Nvar && Nvar->flg_stt==1)){ // if var isn't in ouptut then copy it there var_lhs=prs_arg->ncap_var_init(var_nm,true); // copy atts to output (void)ncap_att_cpy(var_nm,var_nm,prs_arg); (void)prs_arg->ncap_var_write(var_lhs,false); } var_lhs=prs_arg->ncap_var_init(var_nm,false); // fortran index convention if(prs_arg->FORTRAN_IDX_CNV) srt--; else if(srt<0) srt+=var_lhs->sz-1; //deal with negative index convention // do some bounds checking on single limits if(srt >= var_lhs->sz || srt<0 ) err_prn(fnc_nm,"Limit of "+ nbr2sng(srt) +" for variable \""+ var_nm+"\" with size="+nbr2sng(var_lhs->sz)+" is out of bounds\n"); // Grab RHS var_rhs=out(vid->getNextSibling()); // we are only hyperslabbing a single value if(var_rhs->sz !=1) err_prn(fnc_nm, "Hyperslab for "+var_nm+" - number of elements on LHS(1) doesn't equal number of elements on RHS(" +nbr2sng(var_rhs->sz) + ")"); // Convert to LHS type var_rhs=nco_var_cnf_typ(var_lhs->type,var_rhs); // swap values about var_lhs->val.vp=var_rhs->val.vp; var_rhs->val.vp=(void*)NULL; // write block { int nbr_dim=var_lhs->nbr_dim; long srt1[NC_MAX_DIMS]; long sz_dim=1; // convert srt into multiple indices for(idx=0;idxcnt[idx]; for(idx=0; idxcnt[idx]; srt1[idx]=srt/sz_dim; srt-=srt1[idx]*sz_dim; } for(idx=0;idxsrt[idx]=srt1[idx]; var_lhs->cnt[idx]=1L; var_lhs->srd[idx]=1L; } /* end loop over idx */ // write slab to O contains call to Open MP critical region // routine also frees up var_lhs (void)prs_arg->ncap_var_write_slb(var_lhs); }//end write block } var_rhs=nco_var_free(var_rhs); var_nbr=nco_var_free(var_nbr); #line 4113 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } var_sct * ncoTree::var_lmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t) { #line 3035 "ncoGrammer.g" var_sct *var; #line 4132 "ncoTree.cpp" ANTLR_USE_NAMESPACE(antlr)RefAST var_lmt_AST_in = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; ANTLR_USE_NAMESPACE(antlr)RefAST vid = ANTLR_USE_NAMESPACE(antlr)nullAST; ANTLR_USE_NAMESPACE(antlr)RefAST lmt = ANTLR_USE_NAMESPACE(antlr)nullAST; #line 3035 "ncoGrammer.g" const std::string fnc_nm("var_lmt"); var=NULL_CEWI; #line 4141 "ncoTree.cpp" try { // for error handling ANTLR_USE_NAMESPACE(antlr)RefAST __t371 = _t; vid = (_t == ANTLR_USE_NAMESPACE(antlr)RefAST(ASTNULL)) ? ANTLR_USE_NAMESPACE(antlr)nullAST : _t; match(_t,VAR_ID); _t = _t->getFirstChild(); lmt = _t; match(_t,LMT_LIST); _t = _t->getNextSibling(); _t = __t371; _t = _t->getNextSibling(); if ( inputState->guessing==0 ) { #line 3040 "ncoGrammer.g" bool bram; // Check for a RAM variable bool bnrm; int idx; int nbr_dmn; int fl_id; var_sct *var1; var_sct *var_rhs; std::string var_nm; NcapVar *Nvar; RefAST lRef; NcapVector lmt_vtr; NcapVector dmn_vtr; NcapVector dmn_nrm_vtr; // list of dimension names var_nm=vid->getText(); var_rhs=prs_arg->ncap_var_init(var_nm,false); if(var_rhs->undefined){ var=ncap_var_udf("~rhs_undefined"); goto end2; // cannot use return var!! } nbr_dmn=var_rhs->nbr_dim; lRef=lmt; if(prs_arg->ntl_scn){ // check limit only contains numbers or dim_id.size() std::vector str_vtr; (void)ncap_mpi_get_id(lRef,str_vtr); if(str_vtr.size()>0){ var=ncap_var_udf("~rhs_undefined"); goto end2; // cannot use return var!! } // Temporarily change mode prs_arg->ntl_scn=False; lmt_mk(nbr_dmn,lRef,lmt_vtr); prs_arg->ntl_scn=True; }else{ lmt_mk(nbr_dmn,lRef,lmt_vtr); } if( lmt_vtr.size() != nbr_dmn) err_prn(fnc_nm,"Number of hyperslab limits for variable "+ var_nm+" doesn't match number of dimensions"); // add dim names to dimension list for(idx=0 ; idx < nbr_dmn;idx++) lmt_vtr[idx]->nm=strdup(var_rhs->dim[idx]->nm); // fill out limit structure for(idx=0 ; idx < nbr_dmn ;idx++) (void)ncap_lmt_evl(var_rhs->nc_id,lmt_vtr[idx],prs_arg); // See if var can be normalized for(idx=0; idxcnt==1) continue; if(lmt_vtr[idx]->cnt == var_rhs->dim[idx]->cnt) dmn_nrm_vtr.push_back(std::string(lmt_vtr[idx]->nm)); else break; } bnrm= (idx==nbr_dmn ? true:false); // deal more with inital scan if(prs_arg->ntl_scn){ if(bnrm){ var=ncap_cst_mk(dmn_nrm_vtr,prs_arg); (void)nco_free(var->nm); var->nm=strdup(var_nm.c_str()); var=nco_var_cnf_typ(var_rhs->type,var); // apply LHS cast if necessary if(var->sz>1 && bcst) var=ncap_cst_do(var,var_cst,prs_arg->ntl_scn); }else{ var=ncap_var_udf("~rhs_undefined"); } goto end1; } /**** From here on we are dealing with a final scan ****/ // copy lmt_sct to dmn_sct; for(idx=0 ;idx nm=strdup(lmt_vtr[idx]->nm); // Fudge -if the variable is from input then nco_lmt_evl // overwrites the dim id's with their input file values // we want the dim ids from output dmn_nw->id=var_rhs->dim[idx]->id; //dmn_nw->id=lmt_vtr[idx]->id; dmn_nw->cnt=lmt_vtr[idx]->cnt; dmn_nw->srt=lmt_vtr[idx]->srt; dmn_nw->end=lmt_vtr[idx]->end; dmn_nw->srd=lmt_vtr[idx]->srd; dmn_vtr.push_back(dmn_nw); } Nvar=prs_arg->var_vtr.find(var_nm); if(Nvar && Nvar->flg_mem) bram=true; else bram=false; // Ram variable -do an in memory get if(bram){ var=prs_arg->ncap_var_init(var_nm,true); //Do an in memory get (void)nco_get_var_mem(var,dmn_vtr); // put values from dmn_vtr back into var // nb above call has already calculated correct value for // var->sz; for(idx=0;idxsrt[idx]=dmn_vtr[idx]->srt; var->end[idx]=dmn_vtr[idx]->end; var->cnt[idx]=dmn_vtr[idx]->cnt; var->srd[idx]=dmn_vtr[idx]->srd; } // regular variable }else{ // variable in output if(Nvar){ #ifdef _OPENMP fl_id=( omp_in_parallel() ? prs_arg->out_id_readonly : prs_arg->out_id); #else fl_id=prs_arg->out_id; #endif // variable in input }else{ fl_id=prs_arg->in_id; } // Fudge -- fill out var again -but using dims defined in dmn_vtr // We need data in var so that LHS logic in assign can access var shape var=nco_var_fll(fl_id,var_rhs->id,var_nm.c_str(), &dmn_vtr[0],dmn_vtr.size()); //var->sz*=2; // Now get data from disk - use nco_var_get() (void)nco_var_get(fl_id,var); } // end if(nbram) // copy missing value over nco_mss_val_cp(var_rhs,var); /* a hack - we set var->has_dpl_dmn=-1 so we know we are dealing with a hyperslabbed var and not a regular var -- It shouldn't cause any abberant behaviour!! */ var->has_dpl_dmn=-1; // if variable is scalar re-organize in a new var // loose extraneous material so it looks like a // plain scalar variable if(var->sz ==1) { var1=ncap_sclr_var_mk(var_nm,var->type,true); (void)memcpy( (void*)var1->val.vp,var->val.vp,nco_typ_lng(var1->type)); // copy missing value if any from var_rhs to var1 nco_mss_val_cp(var_rhs,var1); // free main var var=nco_var_free(var); var=var1; // if hyperslab -nomalizable // nb the returned var is just like a regular var }else if(bnrm) { // nb dmn_nrm_vtr was populated much earlier in function var1=ncap_cst_mk(dmn_nrm_vtr,prs_arg); (void)nco_free(var1->nm); var1->nm=strdup(var_nm.c_str()); var1=nco_var_cnf_typ(var_rhs->type,var1); // copy missing value if any from var_rhs to var nco_mss_val_cp(var_rhs,var1); // swap values about in var1 & var var1->val.vp=var->val.vp; var->val.vp=(void*)NULL; // free var (void)nco_var_free(var); /* Casting a hyperslab --this makes my brain hurt!!! if the var is already the correct size then do nothing what not even dimension reordering ? */ if(bcst && var1->sz != var_cst->sz) var1=ncap_cst_do(var1,var_cst,prs_arg->ntl_scn); var=var1; }else{ /* A sophisticated hack, var->dim currently contains the local dims from dmn_vtr . We cannot leave them in place as they will never be freed up, and if the var is copied then complications will result. So we replace them with the regular dims in prs_arg->dmn_out_vtr. Currently only one function explicitly references these dims This is the agg_cls::fnd -- The Aggregate Functions Unpredicable behaviour will result when this hyperslabbed var is passed to other functions */ for(idx=0 ; idxdim[idx]=prs_arg->dmn_out_vtr.find(dmn_vtr[idx]->nm); } //free vectors for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_dmn_free(dmn_vtr[idx]); ; end1: ; for(idx=0 ; idx < nbr_dmn ; idx++) (void)nco_lmt_free(lmt_vtr[idx]); end2: var_rhs=nco_var_free(var_rhs); #line 4395 "ncoTree.cpp" } } catch (ANTLR_USE_NAMESPACE(antlr)RecognitionException& ex) { if( inputState->guessing == 0 ) { reportError(ex); if ( _t != ANTLR_USE_NAMESPACE(antlr)nullAST ) _t = _t->getNextSibling(); } else { throw; } } _retTree = _t; return var; } void ncoTree::initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& ) { } const char* ncoTree::tokenNames[] = { "<0>", "EOF", "<2>", "NULL_TREE_LOOKAHEAD", "NULL_NODE", "BLOCK", "ARG_LIST", "DMN_LIST", "DMN_LIST_P", "DMN_ARG_LIST", "LMT_LIST", "VALUE_LIST", "FUNC_ARG", "LMT", "EXPR", "FEXPR", "POST_INC", "POST_DEC", "UTIMES", "PROP", "FOR2", "NORET", "ATAN2", "WHERE_ASSIGN", "MISS2ZERO", "VSORT", "VRSORT", "VABS", "VSQR2", "DEFDIM", ";", "\"defdim\"", "\"defdimunlim\"", "(", "a string", ",", ")", "\"while\"", "\"break\"", "\"continue\"", "\"if\"", "\"else\"", "\"where\"", "\"elsewhere\"", "\"print\"", "VAR_ID", "ATT_ID", "{", "}", "\"for\"", ":", "[", "DIM_ID", "]", "/", "dimension identifier", "call by reference", "dot operator", "FUNC", "++", "--", "!", "+", "-", "*", "power of operator", "%", "<<", ">>", "<", ">", ">=", "<=", "==", "!=", "&&", "||", "?", "=", "+=", "-=", "*=", "/=", "NCAP_FLOAT", "NCAP_DOUBLE", "NCAP_INT", "NCAP_BYTE", "NCAP_UBYTE", "NCAP_SHORT", "NCAP_USHORT", "NCAP_UINT", "NCAP_INT64", "NCAP_UINT64", "N4STRING", "DIM_ID_SIZE", "NRootAST", "\"<<\"", "\">>\"", "\\\"", "DGT", "LPH", "LPHDGT", "XPN", "VAR_NM_QT", "BLASTOUT", "UNUSED_OPS", "white space", "a C++-style comment", "a C-style comment", "a floating point number", "NUMBER", "variable or function or attribute identifier", "VAR_ATT_QT", "STR_ATT_ID", "STR_ATT_QT", "DIM_QT", "dimension identifier", "INCLUDE", "LMT_DMN", 0 }; nco-4.5.4/src/nco++/ncoTree.hpp000066400000000000000000000340131264355130400161130ustar00rootroot00000000000000#ifndef INC_ncoTree_hpp_ #define INC_ncoTree_hpp_ #include #include "ncoParserTokenTypes.hpp" /* $ANTLR 2.7.7 (20130428): "ncoGrammer.g" -> "ncoTree.hpp"$ */ #include #line 1 "ncoGrammer.g" /* $Header$ */ /* Purpose: ANTLR Grammar and support files for ncap2 */ /* Copyright (C) 1995--2015 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // C Standard Headers #include #include #include #include #if !(defined __xlC__) && !(defined SGIMP64) // C++ compilers that do not allow stdint.h #include // Required by g++ for LLONG_MAX, ULLONG_MAX, by icpc for int64_t #endif // C++ compilers that do not allow stdint.h // C++ Standard Headers #include #include #include #include #include // Custom Headers #include "prs_cls.hh" #include "ncap2_utl.hh" #include "fmc_cls.hh" #include "NcapVar.hh" #include "NcapVarVector.hh" #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #include "NcapVector.hh" #include "antlr/TokenStreamSelector.hpp" #include "ncoParser.hpp" #include "Invoke.hh" ANTLR_USING_NAMESPACE(std); ANTLR_USING_NAMESPACE(antlr); #line 52 "ncoTree.hpp" class CUSTOM_API ncoTree : public ANTLR_USE_NAMESPACE(antlr)TreeParser, public ncoParserTokenTypes { #line 657 "ncoGrammer.g" private: //prs_cls *prs_arg; bool bcst; var_sct* var_cst; public: prs_cls *prs_arg; ASTFactory myFactory; //Structure to hold AST pointers to indices in hyperslabs -only temporary typedef struct{ ANTLR_USE_NAMESPACE(antlr)RefAST ind[3]; } ast_lmt_sct; void setTable(prs_cls *prs_in){ prs_arg=prs_in; } // Customized Constructor ncoTree(prs_cls *prs_in){ prs_arg=prs_in; // default is NO. Casting variable set to true // causes casting in function out(). var_cst must // then be defined bcst=false; ncoTree(); } int lmt_init( RefAST aRef, vector &ast_lmt_vtr) { const std::string fnc_nm("lmt_init"); // [sng] Function name int idx; int nbr_dmn; int nbr_cln; // Number of colons in limit RefAST lRef; RefAST eRef; RefAST cRef; ast_lmt_sct hyp; if(aRef->getType() != LMT_LIST) return 0; lRef=aRef->getFirstChild(); nbr_dmn=lmt_peek(aRef); //nbr_dmn=lRef->getNumberOfChildren(); for(idx=0 ; idx < nbr_dmn ; idx++){ hyp.ind[0]=ANTLR_USE_NAMESPACE(antlr)nullAST; hyp.ind[1]=ANTLR_USE_NAMESPACE(antlr)nullAST; hyp.ind[2]=ANTLR_USE_NAMESPACE(antlr)nullAST; if(lRef->getType()!=LMT) return 0; eRef=lRef->getFirstChild(); nbr_cln=0; while(eRef) { if(eRef->getType() == COLON){ cRef=eRef; nbr_cln++; } eRef=eRef->getNextSibling(); } // Initialise to default markers switch(nbr_cln) { case 0: break; case 1: hyp.ind[0]=cRef; hyp.ind[1]=cRef; break; case 2: hyp.ind[0]=cRef; hyp.ind[1]=cRef; hyp.ind[2]=cRef; break; default: err_prn(fnc_nm,"Too many hyperslab indices"); break; } eRef=lRef->getFirstChild(); // point inidices to any expressions that exist nbr_cln=0; while(eRef) { if(eRef->getType() == COLON) nbr_cln++; else hyp.ind[nbr_cln]=eRef; eRef=eRef->getNextSibling(); } // save indices ast_lmt_vtr.push_back(hyp); lRef=lRef->getNextSibling(); } return nbr_dmn; } bool lmt_var_mk( int nbr_dmn, RefAST lmt, NcapVector &lmt_vtr ) { int idx; int jdx; int sz; int dmn_sz; ptr_unn op1; var_sct *var; std::string fnc_nm="lmt_var_mk"; // calculate variables var=out(lmt->getFirstChild()->getFirstChild()); // convert result to type int var=nco_var_cnf_typ(NC_UINT64,var); (void)cast_void_nctype((nc_type)NC_UINT64,&var->val); sz=var->sz; dmn_sz=var->sz / nbr_dmn; // shape of var must be (nbr_dmn) or (nbr_dmn,2) or (nbr_dmn,3) if( dmn_sz * nbr_dmn != sz ) { var=nco_var_free(var); return false; } for(idx=0; idxnm=NULL; //lmt_ptr->lmt_typ=-1; lmt_ptr->is_usr_spc_lmt=True; /* True if any part of limit is user-specified, else False */ lmt_ptr->min_sng=NULL; lmt_ptr->max_sng=NULL; lmt_ptr->srd_sng=NULL; lmt_ptr->is_usr_spc_min=False; lmt_ptr->is_usr_spc_max=False; /* rec_skp_ntl_spf is used for record dimension in multi-file operators */ lmt_ptr->rec_skp_ntl_spf=0L; /* Number of records skipped in initial superfluous files */ for(jdx=0;jdxval.ui64p[idx+jdx]; switch(jdx){ case 0: lmt_ptr->is_usr_spc_min=True; lmt_ptr->srt=uival; break; case 1: //end lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=uival; break; case 2: //srd lmt_ptr->srd_sng=strdup("~fill_in"); lmt_ptr->srd=uival; break; } } /* need to deal with situation where only start is defined -- ie picking only a single value */ if( lmt_ptr->is_usr_spc_min==True && lmt_ptr->is_usr_spc_max==False && lmt_ptr->srd_sng==NULL) { lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=lmt_ptr->srt; } lmt_vtr.push_back(lmt_ptr); } cast_nctype_void((nc_type)NC_UINT64,&var->val); var=nco_var_free(var); return true; } bool lmt_mk( int nbr_dmn, RefAST lmt, NcapVector &lmt_vtr ) { int idx; int jdx; int sz; lmt_sct *lmt_ptr; RefAST aRef; vector ast_lmt_vtr; // deal with a single expression containing all indicies if(lmt->getNumberOfChildren()==1 && lmt->getFirstChild()->getNumberOfChildren()==1 && lmt->getFirstChild()->getFirstChild()->getType() != COLON) { return lmt_var_mk(nbr_dmn,lmt,lmt_vtr); ; } // populate ast_lmt_vtr if( nbr_dmn!=lmt_init(lmt,ast_lmt_vtr) ) return false; for(idx=0 ; idx nm=NULL; //lmt_ptr->lmt_typ=-1; lmt_ptr->is_usr_spc_lmt=True; /* True if any part of limit is user-specified, else False */ lmt_ptr->min_sng=NULL; lmt_ptr->max_sng=NULL; lmt_ptr->srd_sng=NULL; lmt_ptr->is_usr_spc_min=False; lmt_ptr->is_usr_spc_max=False; /* rec_skp_ntl_spf is used for record dimension in multi-file operators */ lmt_ptr->rec_skp_ntl_spf=0L; /* Number of records skipped in initial superfluous files */ for(jdx=0 ; jdx <3 ; jdx++){ long ldx=0L; var_sct *var_out; aRef=ast_lmt_vtr[idx].ind[jdx]; if(aRef && aRef->getType() != COLON ){ // Calculate number using out() var_out=out(aRef); // convert result to type int var_out=nco_var_cnf_typ(NC_INT,var_out); (void)cast_void_nctype((nc_type)NC_INT,&var_out->val); // only interested in the first value. ldx=var_out->val.ip[0]; var_out=nco_var_free(var_out); // switch jdx 0-srt,1-end,2-srd switch(jdx){ case 0: lmt_ptr->is_usr_spc_min=True; lmt_ptr->srt=ldx; break; case 1: //end lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=ldx; break; case 2: //srd lmt_ptr->srd_sng=strdup("~fill_in"); lmt_ptr->srd=ldx; break; } } }// end jdx /* need to deal with situation where only start is defined -- ie picking only a single value */ if( lmt_ptr->is_usr_spc_min==True && lmt_ptr->is_usr_spc_max==False && lmt_ptr->srd_sng==NULL){ lmt_ptr->is_usr_spc_max=True; lmt_ptr->end=lmt_ptr->srt; } lmt_vtr.push_back(lmt_ptr); } // end idx return true;; } /* end lmt_mk */ void run_dbl(RefAST tr,int icnt){ int idx=0; RefAST ntr=tr; extern int ncap_omp_exe( std::vector< std::vector > &all_ast_vtr, ncoTree** wlk_ptr, int wlk_nbr); if(tr== ANTLR_USE_NAMESPACE(antlr)nullAST) err_prn("run_dbl"," REPORTS given a null AST Refrence\n"); //small list dont bother with double parsing // just do a final parse if(icnt <4){ //Final scan prs_arg->ntl_scn=False; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } return; } //Initial scan prs_arg->ntl_scn=True; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } //Define variables in output (void)nco_redef(prs_arg->out_id); (void)prs_arg->ncap_def_ntl_scn(); (void)nco_enddef(prs_arg->out_id); // see if below does anything ? (void)nco_sync(prs_arg->out_id); //Final scan if(!prs_arg->NCAP_MPI_SORT) { idx=0; ntr=tr; prs_arg->ntl_scn=False; while(idx++ < icnt){ (void)statements(ntr); ntr=ntr->getNextSibling(); } } else { // Sort expressions - MPI preparation prs_arg->ntl_scn=False; // nb A vector of vectors std::vector< std::vector > all_ast_vtr; ncoTree **wlk_vtr=(ncoTree**)NULL; // Populate and sort vector (void)ncap_mpi_srt(tr,icnt,all_ast_vtr,prs_arg); // Evaluate expressions (execute) (void)ncap_omp_exe(all_ast_vtr,wlk_vtr,0); /* for(unsigned vtr_idx=0 ; vtr_idxgetNextSibling())); // 20101027 csz "while result of assignment is true" (not an equality comparison) if(nbr_stmt <4 || nbr_dpt>0 ){ prs_arg->ntl_scn=False; ntr=tr; do{ iret=statements(ntr); // break if jump statement if(iret==BREAK || iret==CONTINUE) break; } while((ntr=ntr->getNextSibling())); // 20101027 csz "while result of assignment is true" (not an equality comparison) goto exit; } ntr=tr; for(idx=0 ; idx < nbr_stmt; idx++){ ntyp=ntr->getType(); // we have hit an IF or a basic block if(ntyp==BLOCK || ntyp==IF ||ntyp==DEFDIM || ntyp==WHILE ||ntyp==FOR || ntyp==FEXPR ||ntyp==WHERE) { // if(ntyp != EXPR ){ if(icnt>0) (void)run_dbl(etr,icnt); icnt=0; etr=ANTLR_USE_NAMESPACE(antlr)nullAST;; prs_arg->ntl_scn=False; iret=statements(ntr); }else{ if(icnt++==0) etr=ntr; } ntr=ntr->getNextSibling(); } // end for if(icnt >0){ iret=0; (void)run_dbl(etr,icnt); } exit: return iret; } // end run_exe RefAST nco_dupList(RefAST tr){ RefAST otr; // nb astFactory is protected- must call from within class otr=astFactory->dupList(tr); otr->setNextSibling( ANTLR_USE_NAMESPACE(antlr)nullAST ) ; /* if(otr->getNextSibling()!= ANTLR_USE_NAMESPACE(antlr)ASTNULL ) err_prn("nco_dupList", "NON NULL AST SIBLING\n"); */ return otr; } #line 56 "ncoTree.hpp" public: ncoTree(); static void initializeASTFactory( ANTLR_USE_NAMESPACE(antlr)ASTFactory& factory ); int getNumTokens() const { return ncoTree::NUM_TOKENS; } const char* getTokenName( int type ) const { if( type > getNumTokens() ) return 0; return ncoTree::tokenNames[type]; } const char* const* getTokenNames() const { return ncoTree::tokenNames; } public: int lmt_peek(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: int statements(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: var_sct * out(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: var_sct * assign_ntl(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ); public: var_sct * assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ); public: var_sct * out_asn(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: var_sct * value_list(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: var_sct * value_list_string(ANTLR_USE_NAMESPACE(antlr)RefAST _t, std::vector &exp_vtr ); public: bool where_assign(ANTLR_USE_NAMESPACE(antlr)RefAST _t, var_sct *var_msk ); public: var_sct * var_lmt_one(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: var_sct * var_lmt_one_lhs(ANTLR_USE_NAMESPACE(antlr)RefAST _t, bool bram ); public: var_sct * var_lmt(ANTLR_USE_NAMESPACE(antlr)RefAST _t); public: ANTLR_USE_NAMESPACE(antlr)RefAST getAST() { return returnAST; } protected: ANTLR_USE_NAMESPACE(antlr)RefAST returnAST; ANTLR_USE_NAMESPACE(antlr)RefAST _retTree; private: static const char* tokenNames[]; #ifndef NO_STATIC_CONSTS static const int NUM_TOKENS = 119; #else enum { NUM_TOKENS = 119 }; #endif }; #endif /*INC_ncoTree_hpp_*/ nco-4.5.4/src/nco++/nco_antlr_pst_prc.pl000077500000000000000000000006551264355130400200610ustar00rootroot00000000000000#!/usr/bin/perl -w # Henry Butowsky 20080104 # Usage: nco_antlr_pst_prc.pl < in_fl > out_fl # Removes #ifdef code where __cplusplus is checked. # The struct in ncoParserTokenTypes.hpp is deleted # so that all remains is a global an anonymous enum my($bskp); $bskp=0; while( <> ){ if( /__cplusplus/ ) { $bskp=1;next;} if( /^\#endif/ && $bskp) { $bskp=0;next;} s/ncoParser/ncoEnum/; if(!$bskp) {print;} } nco-4.5.4/src/nco++/nco_gsl.c000066400000000000000000000160451264355130400156000ustar00rootroot00000000000000/* $Header$ */ /* Purpose: GSL functions that handle missing values */ /* nco_gsl.[ch] re-implement GSL functions without arithmetic changes _except_ that the NCO version (prefixed with nco_) accepts a missing value argument which, if non-NULL, indicates data to be "skipped", i.e., treated as missing. GSL and NCO are both distributed under the GPL3 license. The GSL code is copyright by its respective authors. The NCO modifications that provide missing value support are, in addition, Copyright (C) 2013--2016 Charlie Zender License: GNU General Public License (GPL) Version 3 See http://www.gnu.org/copyleft/gpl.html for full license text Original GSL files, copyright holders, and authors of functions below are: gsl/fit/linear.c: Copyright (C) 2000 Brian Gough statistics/covar_source.c: Copyright (C) 1996, 1997, 1998, 1999, 2000 Jim Davies, Brian Gough */ #include "nco_gsl.h" /* Missing value-aware GSL functions */ /* Fit the data (x_i, y_i) to the linear relationship Y = c0 + c1 x returning, c0, c1 -- coefficients cov00, cov01, cov11 -- variance-covariance matrix of c0 and c1, sumsq -- sum of squares of residuals This fit can be used in the case where the errors for the data are uknown, but assumed equal for all points. The resulting variance-covariance matrix estimates the error in the coefficients from the observed variance of the points around the best fit line. */ int nco_gsl_fit_linear (const double *x, const size_t xstride, const double *y, const size_t ystride, const size_t n, double *c0, double *c1, double *cov_00, double *cov_01, double *cov_11, double *sumsq, const double *mss_val) { double m_x = 0, m_y = 0, m_dx2 = 0, m_dxdy = 0; size_t i; #ifdef ENABLE_NCO_GSL /* NCO changes: Skip missing values, consider number of valid points */ size_t nbr_val; /* [nbr] Number of sample points that have data */ size_t idx_val; /* [nbr] Current valid data index */ if (mss_val!=NULL) { nbr_val=0; for (i = 0; i < n; i++) { if (y[i * ystride]!=*mss_val) { nbr_val++; } } } #endif /* ENABLE_NCO_GSL */ if (mss_val==NULL) { for (i = 0; i < n; i++) { m_x += (x[i * xstride] - m_x) / (i + 1.0); m_y += (y[i * ystride] - m_y) / (i + 1.0); } } #ifdef ENABLE_NCO_GSL else { idx_val=0; for (i = 0; i < n; i++) { if (y[i * ystride]!=*mss_val) { m_x += (x[i * xstride] - m_x) / (idx_val + 1.0); m_y += (y[i * ystride] - m_y) / (idx_val + 1.0); idx_val++; } } } #endif /* ENABLE_NCO_GSL */ if (mss_val==NULL) { for (i = 0; i < n; i++) { const double dx = x[i * xstride] - m_x; const double dy = y[i * ystride] - m_y; m_dx2 += (dx * dx - m_dx2) / (i + 1.0); m_dxdy += (dx * dy - m_dxdy) / (i + 1.0); } } #ifdef ENABLE_NCO_GSL else { idx_val=0; for (i = 0; i < n; i++) { if (y[i * ystride]!=*mss_val) { const double dx = x[i * xstride] - m_x; const double dy = y[i * ystride] - m_y; m_dx2 += (dx * dx - m_dx2) / (idx_val + 1.0); m_dxdy += (dx * dy - m_dxdy) / (idx_val + 1.0); idx_val++; } } } #endif /* ENABLE_NCO_GSL */ /* In terms of y = a + b x */ { double s2 = 0, d2 = 0; double b = m_dxdy / m_dx2; double a = m_y - m_x * b; *c0 = a; *c1 = b; /* Compute chi^2 = \sum (y_i - (a + b * x_i))^2 */ if (mss_val==NULL) { for (i = 0; i < n; i++) { const double dx = x[i * xstride] - m_x; const double dy = y[i * ystride] - m_y; const double d = dy - b * dx; d2 += d * d; } } else { for (i = 0; i < n; i++) { if (y[i * ystride]!=*mss_val) { const double dx = x[i * xstride] - m_x; const double dy = y[i * ystride] - m_y; const double d = dy - b * dx; d2 += d * d; } } } if (mss_val==NULL) { s2 = d2 / (n - 2.0); /* chisq per degree of freedom */ *cov_00 = s2 * (1.0 / n) * (1 + m_x * m_x / m_dx2); *cov_11 = s2 * 1.0 / (n * m_dx2); *cov_01 = s2 * (-m_x) / (n * m_dx2); *sumsq = d2; } #ifdef ENABLE_NCO_GSL /* Use number of sample points that have data */ else { s2 = d2 / (nbr_val - 2.0); /* chisq per degree of freedom */ *cov_00 = s2 * (1.0 / nbr_val) * (1 + m_x * m_x / m_dx2); *cov_11 = s2 * 1.0 / (nbr_val * m_dx2); *cov_01 = s2 * (-m_x) / (nbr_val * m_dx2); *sumsq = d2; } } #endif /* ENABLE_NCO_GSL */ return NCO_GSL_SUCCESS; } static double FUNCTION(compute,covariance) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n, const double mean1, const double mean2, const double *mss_val) /* Missing value */ { /* takes a dataset and finds the covariance */ long double covariance = 0 ; size_t i; /* find the sum of the squares */ if (mss_val==NULL) { for (i = 0; i < n; i++) { const long double delta1 = (data1[i * stride1] - mean1); const long double delta2 = (data2[i * stride2] - mean2); covariance += (delta1 * delta2 - covariance) / (i + 1); } } else { for (i = 0; i < n; i++) { if (data2[i * stride2]!=*mss_val) { const long double delta1 = (data1[i * stride1] - mean1); const long double delta2 = (data2[i * stride2] - mean2); covariance += (delta1 * delta2 - covariance) / (i + 1); } } } return covariance ; } double FUNCTION(nco_gsl_stats,covariance_m) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n, const double mean1, const double mean2, const double *mss_val) /* Missing value */ { const double covariance = FUNCTION(compute,covariance) (data1, stride1, data2, stride2, n, mean1, mean2, mss_val); return covariance * ((double)n / (double)(n - 1)); } double FUNCTION(nco_gsl_stats,covariance) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n, const double *mss_val) /* Missing value */ { const double mean1 = FUNCTION(nco_gsl_stats,mean) (data1, stride1, n, mss_val); const double mean2 = FUNCTION(nco_gsl_stats,mean) (data2, stride2, n, mss_val); return FUNCTION(nco_gsl_stats,covariance_m)(data1, stride1, data2, stride2, n, mean1, mean2, mss_val); } double FUNCTION (nco_gsl_stats, mean) (const BASE data[], const size_t stride, const size_t size, const double *mss_val) /* Missing value */ { /* Compute the arithmetic mean of a dataset using the recurrence relation mean_(n) = mean(n-1) + (data[n] - mean(n-1))/(n+1) */ long double mean = 0; size_t i; if (mss_val==NULL) { for (i = 0; i < size; i++) { mean += (data[i * stride] - mean) / (i + 1); } } else { for (i = 0; i < size; i++) { if (data[i * stride]!=*mss_val) { mean += (data[i * stride] - mean) / (i + 1); } } } return mean; } nco-4.5.4/src/nco++/nco_gsl.h000066400000000000000000000037761264355130400156140ustar00rootroot00000000000000/* $Header$ */ /* Purpose: GSL functions that handle missing values */ /* nco_gsl.[ch] re-implement GSL functions without arithmetic changes _except_ that the NCO version (prefixed with nco_) accepts a missing value argument which, if non-NULL, indicates data to be "skipped", i.e., treated as missing. GSL and NCO are both distributed under the GPL3 license. The GSL code is copyright by its respective authors. The NCO modifications that provide missing value support are, in addition, Copyright (C) 2013--2016 Charlie Zender License: GNU General Public License (GPL) Version 3 See http://www.gnu.org/copyleft/gpl.html for full license text Original GSL files, copyright holders, and authors of functions below are: gsl/fit/linear.c: Copyright (C) 2000, 2007 Brian Gough */ /* Usage: #include "nco_gsl.h" *//* Missing value-aware GSL functions */ #ifndef NCO_GSL_H #define NCO_GSL_H #define ENABLE_NCO_GSL /* If disabled results should be the same as the gsl equivalent function; validation only */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Standard header files */ #include /* size_t */ /* GSL macros */ #define CONCAT2x(a,b) a ## _ ## b #define CONCAT2(a,b) CONCAT2x(a,b) #define FUNCTION(drc,nm) CONCAT2(drc,nm) #define BASE double #define NCO_GSL_SUCCESS 0 /* Forward declarations */ int nco_gsl_fit_linear (const double *x, const size_t xstride, const double *y, const size_t ystride, const size_t n, double *c0, double *c1, double *cov_00, double *cov_01, double *cov_11, double *sumsq, const double *mss_val); double FUNCTION(nco_gsl_stats,mean) (const BASE data[], const size_t stride, const size_t size, const double *mss_val); /* fill value */ double FUNCTION(nco_gsl_stats,covariance) (const BASE data1[], const size_t stride1, const BASE data2[], const size_t stride2, const size_t n, const double *mss_val); /* fill value */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_GSL_H */ nco-4.5.4/src/nco++/prs_cls.cc000066400000000000000000000406631264355130400157670ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor */ /* prs_cls -- symbol table - class methods */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // Standard C++ headers #include #include #include #include // Standard C headers #include #include // Personal headers #include "ncap2_utl.hh" #include "prs_cls.hh" #include "ncap2_utl.hh" /* netCDF arithmetic processor */ #include "NcapVar.hh" #include "sdo_utl.hh" /* Begin prs_cls methods */ var_sct * prs_cls::ncap_var_init(const std::string &snm,bool bfll){ /* Purpose: Initialize variable structure, retrieve variable values from disk Parser calls ncap_var_init() when it encounters a new RHS variable */ const char fnc_nm[]="prs_cls::ncap_var_init"; bool bskp_npt=false; int idx; int dmn_var_nbr; int var_id; int rcd; int fl_id; char dmn_nm[NC_MAX_NAME]; const char *var_nm; var_sct *var=NULL_CEWI;; NcapVar *Nvar; var_nm=snm.c_str(); // INITIAL SCAN if(ntl_scn){ // check int vtr Nvar=int_vtr.find(var_nm); // check var_vtr (output) if(Nvar==NULL) Nvar=var_vtr.find(var_nm); if(Nvar) { var=Nvar->cpyVarNoData(); return var; } bfll=false; } if(nco_dbg_lvl_get() >= nco_dbg_fl && !ntl_scn) { std::ostringstream os; os<< "Parser VAR action called ncap_var_init() to retrieve " <flg_stt == 2 && !Nvar->flg_mem){ var=Nvar->cpyVarNoData(); #ifdef _OPENMP fl_id=(omp_in_parallel() ? out_id_readonly : out_id); #else fl_id=out_id; #endif var->tally=(long *)NULL; /* Retrieve variable values from disk into memory */ if(bfll) (void)nco_var_get(fl_id,var); return var; } /* !ntl_scn */ // Variable is defined in O and populated and is a RAM variable if(Nvar && Nvar->flg_stt==2 && Nvar->flg_mem){ var=Nvar->cpyVar(); return var; } // Variable is defined in O but NOT populated // Set flag so read is tried only from input // Maybe not the best solution ? // what else ??? if(Nvar && Nvar->flg_stt == 1) bskp_npt=true; } // end !ntl_scn /* Check output file for var */ rcd=nco_inq_varid_flg(out_id,var_nm,&var_id); if(rcd == NC_NOERR && !bskp_npt){ #ifdef _OPENMP fl_id= (omp_in_parallel() ? out_id_readonly : out_id); #else fl_id=out_id; #endif var=nco_var_fll(fl_id,var_id,var_nm,&dmn_out_vtr[0],dmn_out_vtr.size()); var->tally=(long *)NULL; /* Retrieve variable values from disk into memory */ if(bfll) (void)nco_var_get(fl_id,var); return var; } /* Rest of function assumes var to be read is in Input */ /* Check input file for ID */ rcd=nco_inq_varid_flg(in_id,var_nm,&var_id); if(rcd != NC_NOERR){ /* Return NULL if variable not in input or output file */ std::ostringstream os; os<<"Unable to find variable " < 0){ int *dim_id=NULL_CEWI; dmn_sct *dmn_fd; dmn_sct *dmn_nw; std::vector dmn_tp_out; dim_id=(int *)nco_malloc(dmn_var_nbr*sizeof(int)); (void)nco_inq_vardimid(fl_id,var_id,dim_id); for(idx=0;idx 0){ #ifdef _OPENMP if(omp_in_parallel()) err_prn(fnc_nm,"Attempt to go into netCDF define mode while in OpenMP parallel mode"); #endif (void)nco_redef(out_id); for(idx=0; idx< (int)dmn_tp_out.size();idx++){ dmn_nw=nco_dmn_dpl(dmn_tp_out[idx]); (void)nco_dmn_xrf(dmn_nw,dmn_tp_out[idx]); (void)nco_dmn_dfn(fl_out,out_id,&dmn_nw,1); (void)dmn_out_vtr.push_back(dmn_nw); if(nco_dbg_lvl_get() >= nco_dbg_fl){ std::ostringstream os; os << "Found new dimension " << dmn_nw->nm << " in input variable " << var_nm <<" in file " << fl_in; os << ". Defining dimension " << dmn_nw->nm << " in output file " << fl_out; dbg_prn(fnc_nm,os.str()); } } // end idx (void)nco_enddef(out_id); } // end if } // end if var=nco_var_fll(fl_id,var_id,var_nm,&dmn_out_vtr[0],dmn_out_vtr.size()); /* var->nm=(char *)nco_malloc((strlen(var_nm)+1UL)*sizeof(char)); (void)strcpy(var->nm,var_nm); */ /* Tally is not required yet since ncap does not perform cross-file operations (yet) */ /* var->tally=(long *)nco_malloc_dbg(var->sz*sizeof(long),"Unable to malloc() tally buffer in variable initialization",fnc_nm); (void)nco_zero_long(var->sz,var->tally); */ var->tally=(long *)NULL; /* Retrieve variable values from disk into memory */ if(bfll) (void)nco_var_get(fl_id,var); return var; } int prs_cls::ncap_var_init_chk( const std::string &var_nm){ int rcd; int var_id; NcapVar *Nvar; // Check output Nvar=var_vtr.find(var_nm); if(Nvar) return 1; // Initial scan if(ntl_scn){ // Check int vtr Nvar=int_vtr.find(var_nm); if(Nvar) return 1; } // Check output file for ID rcd=nco_inq_varid_flg(out_id,var_nm.c_str(),&var_id); if(rcd == NC_NOERR) return 1; // Check input file for ID rcd=nco_inq_varid_flg(in_id,var_nm.c_str(),&var_id); if(rcd == NC_NOERR) return 1; // Variable not in Input or Output or int_vtr return 0; } int prs_cls::ncap_var_write_slb( var_sct *var) { int bret; bret=ncap_var_write_wrp(var,false,true); return bret; } int prs_cls::ncap_var_write( var_sct *var, bool bram){ int bret; bret=ncap_var_write_wrp(var,bram,false); return bret; } // We need this function for OpenMP Threading as ncap_var_write() and ncap_var_write_slb // both write to Output - nb only one thread can write!! int prs_cls::ncap_var_write_wrp( var_sct *var, bool bram, bool bslb){ int bret; #ifdef _OPENMP #pragma omp critical #endif { if(bslb){ // put the slab -nb var already defined+ populated in 0 (void)nco_put_vars(out_id,var->id,var->srt,var->cnt,var->srd,var->val.vp,var->type); var=nco_var_free(var); bret=1; }else{ bret=ncap_var_write_omp(var,bram); } } // end pragma return bret; } // end ncap_var_write_wrp() int prs_cls::ncap_var_write_omp( var_sct *var, bool bram){ /* Purpose: Define variable in output file and write variable */ /* const char mss_val_sng[]="missing_value"; *//* [sng] Unidata standard string for missing value */ const char add_fst_sng[]="add_offset"; /* [sng] Unidata standard string for add offset */ const char scl_fct_sng[]="scale_factor"; /* [sng] Unidata standard string for scale factor */ const char fnc_nm[]="prs_cls::ncap_var_write"; int rcd; /* [rcd] Return code */ int var_out_id; bool bdef=false; NcapVar *Nvar; #ifdef NCO_RUSAGE_DBG long maxrss; /* [B] Maximum resident set size */ #endif /* !NCO_RUSAGE_DBG */ // INITIAL SCAN if(ntl_scn){ Nvar=var_vtr.find(var->nm); if(Nvar) { var=nco_var_free(var); return True; } Nvar=int_vtr.find(var->nm); if(Nvar) { var=nco_var_free(var); return True; } //Nvar=new NcapVar(var,""); Nvar=new NcapVar(var); Nvar->flg_mem=bram; int_vtr.push(Nvar); return True; } // FINAL SCAN Nvar=var_vtr.find(var->nm); if(Nvar){ // temporary fix make typ_dsk same as type Nvar->var->typ_dsk=Nvar->var->type; bdef=true; //Possibly overwrite bram !! bram=Nvar->flg_mem; if(var->has_mss_val){ (void)nco_mss_val_cp(var,Nvar->var); // delete missing value }else if(Nvar->var->has_mss_val){ Nvar->var->has_mss_val=False; Nvar->var->mss_val.vp=(void*)nco_free(Nvar->var->mss_val.vp); } // !has_mss_val } // !Nvar // Deal with a new RAM only variable if(!bdef && bram){ //NcapVar *NewNvar=new NcapVar(var,""); NcapVar *NewNvar=new NcapVar(var); NewNvar->flg_mem=bram; NewNvar->flg_stt=2; NewNvar->var->id=-1; NewNvar->var->nc_id=-1; var_vtr.push(NewNvar); return True; } // Deal with a an existing RAM variable if(bdef && bram){ var_sct *var_ref; void *vp_swp; // De-reference var_ref=Nvar->var; // check sizes are the same if(var_ref->sz != var->sz) { std::ostringstream os; os<< "RAM Variable "<< var->nm << " size=" << var->sz << " has aleady been saved in "; os<< fl_out << " with size=" << var_ref->sz; wrn_prn(fnc_nm,os.str()); var = nco_var_free(var); return False; } // var->sz /* convert type to disk type */ var=nco_var_cnf_typ(var_ref->type,var); //Swap values about vp_swp=var_ref->val.vp; var_ref->val.vp=var->val.vp; var->val.vp=vp_swp; Nvar->flg_stt=2; (void)nco_var_free(var); return True; } // !(bdef && bram) // var is already defined but not populated if(bdef && !bram && Nvar->flg_stt==1){ ; } // endif // var is already defined & populated in output if(bdef && !bram && Nvar->flg_stt==2){ var_sct* var_swp; var_sct* var_inf; var_inf=Nvar->cpyVarNoData(); /* check sizes are the same */ if(var_inf->sz != var->sz){ std::ostringstream os; os<< "Variable "<< var->nm << " size=" << var->sz << " has aleady been saved in "; os<< fl_out << " with size=" << var_inf->sz; wrn_prn(fnc_nm,os.str()); var = nco_var_free(var); var_inf=nco_var_free(var_inf); return False; } // var->sz /* convert type to disk type */ var=nco_var_cnf_typ(var_inf->type,var); //Swap values about var_inf->val=var->val;var->val.vp=(void*)NULL; var_swp=var;var=var_inf;var_inf=var_swp; var_inf=nco_var_free(var_inf); var_out_id=var->id; } nco_inq_varid_flg(out_id,var->nm,&var_out_id); // Only go into define mode if necessary if(!bdef || var->pck_ram ){ #ifdef _OPENMP if(omp_in_parallel()) err_prn(fnc_nm, "Attempt to go into netCDF define mode while in OpenMP parallel mode"); #endif // _OPENMP (void)nco_redef(out_id); /* Define variable */ if(!bdef){ (void)nco_def_var(out_id,var->nm,var->type,var->nbr_dim,var->dmn_id,&var_out_id); /* Set HDF Lempel-Ziv compression level, if requested */ int fl_fmt; /* [enm] Output file format */ (void)nco_inq_format(out_id,&fl_fmt); if(fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC){ if(var->nbr_dim > 0){ if(dfl_lvl >= 0) (void)nco_def_var_deflate(out_id,var_out_id,var->shuffle,(int)True,dfl_lvl); else if(var->dfl_lvl >= 0) (void)nco_def_var_deflate(out_id,var_out_id,var->shuffle,(int)True,var->dfl_lvl); /* Set chunk sizes, if requested */ // fxm: must first allow cnk_sz specification in ncap2.cc main() //if(var->cnk_sz && var->nbr_dim > 0) (void)nco_def_var_chunking(out_id,var_id,(int)NC_CHUNKED,var->cnk_sz); } /* endif netCDF4 */ } /* endif */ } // bdef /* Put missing value if(var->has_mss_val) (void)nco_put_att(out_id,var_out_id,nco_mss_val_sng_get(),var->type,1,var->mss_val.vp); */ /* Write/overwrite scale_factor and add_offset attributes */ if(var->pck_ram){ /* Variable is packed in memory */ if(var->has_scl_fct) (void)nco_put_att(out_id,var_out_id,scl_fct_sng,var->typ_upk,1,var->scl_fct.vp); if(var->has_add_fst) (void)nco_put_att(out_id,var_out_id,add_fst_sng,var->typ_upk,1,var->add_fst.vp); } /* endif pck_ram */ /* Take output file out of define mode */ (void)nco_enddef(out_id); } // end if /* Write variable */ if(var->nbr_dim == 0){ (void)nco_put_var1(out_id,var_out_id,0L,var->val.vp,var->type); }else{ (void)nco_put_vara(out_id,var_out_id,var->srt,var->cnt,var->val.vp,var->type); } /* end else */ #ifdef NCO_RUSAGE_DBG /* Compile: cd ~/nco/bld;make 'USR_TKN=-DNCO_RUSAGE_DBG';cd - */ /* Print rusage memory usage statistics */ if(nco_dbg_lvl_get() >= nco_dbg_fl){ std::ostringstream os; os<<" Writing variable "<val.vp=(void*)nco_free(var->val.vp); var1=nco_var_dpl(var); var1->id=var_out_id; var1->nc_id=out_id; //temporary fix .. make typ_dsk same as type var1->typ_dsk=var1->type; Nvar=new NcapVar(var1); (void)var_vtr.push(Nvar); } var=nco_var_free(var); //Set flag - indicates var is DEFINED && POPULATED Nvar->flg_stt=2; return True; } void prs_cls::ncap_def_ntl_scn(void) { int idx; int sz; int var_id; NcapVar *Nvar; NcapVar *Cvar; var_sct *var1; const std::string fnc_nm("prs_cls::ncap_def_ntl_scn"); if(nco_dbg_lvl_get() >= nco_dbg_scl) dbg_prn(fnc_nm, "Entered function"); sz=int_vtr.size(); for(idx=0;idxvar; if(!Nvar->flg_udf && Nvar->xpr_typ==ncap_var){ if(nco_dbg_lvl_get() >= nco_dbg_scl) dbg_prn(fnc_nm, Nvar->getFll()+ (!Nvar->flg_mem ? " defined in output": " RAM variable")); // Define variable if(!Nvar->flg_mem){ (void)nco_def_var(out_id,var1->nm,var1->type,var1->nbr_dim,var1->dmn_id,&var_id); Nvar->var->id=var_id; Nvar->var->nc_id=out_id; Nvar->flg_stt=1; /* Set HDF Lempel-Ziv compression level, if requested */ int fl_fmt; /* [enm] Output file format */ int rcd; /* [rcd] Return code */ (void)nco_inq_format(out_id,&fl_fmt); if(fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC){ if(var1->nbr_dim > 0){ if(dfl_lvl >= 0) (void)nco_def_var_deflate(out_id,var_id,var1->shuffle,(int)True,dfl_lvl); else if(var1->dfl_lvl >= 0) (void)nco_def_var_deflate(out_id,var_id,var1->shuffle,(int)True,var1->dfl_lvl); /* Set chunk sizes, if requested */ // fxm: must first allow cnk_sz specification in ncap2.cc main() //if(var1->cnk_sz && var1->nbr_dim > 0) (void)nco_def_var_chunking(out_id,var_id,(int)NC_CHUNKED,var1->cnk_sz); } /* endif */ } /* endif netCDF4 */ } else { //deal with RAM only var Nvar->var->id=-1; Nvar->var->nc_id=-1; Nvar->flg_stt=1; } // Save newly defined variable in output vector Cvar=new NcapVar(*Nvar); var_vtr.push(Cvar); } delete Nvar; } // Empty int_vtr n.b pointers have all been deleted int_vtr.clear(); } /********End prs_cls methods********************************************************/ /***********************************************************************************/ nco-4.5.4/src/nco++/prs_cls.hh000066400000000000000000000134261264355130400157760ustar00rootroot00000000000000/* Purpose: netCDF arithmetic processor - */ /* prs_cls -- symbol table - data members & class methods */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #ifndef PRS_CLS_HH #define PRS_CLS_HH #include #include #include #include "nco.h" #include "NcapVector.hh" #include "NcapVarVector.hh" #include "NcapVar.hh" // Forward declaration class fmc_cls; class prs_cls{ /* prs_cls */ public: char *fl_in; /* [sng] Input data file */ int in_id; /* [id] Input data file ID */ char *fl_out; /* [sng] Output data file */ int fl_out_fmt; /* format of output file */ int out_id; /* [id] Output data file ID -Handle for reading & writing */ int out_id_readonly; /* [id] Output data file ID -Handle for reading only */ NcapVector &dmn_in_vtr; //Vector of dimensions in input file nb doesn't change NcapVector &dmn_out_vtr; //Vector of dimensions in output file file std::vector &fmc_vtr; //List of functions/methods nb doesn't change NcapVarVector &var_vtr; // list of attributes & variables NcapVarVector &int_vtr; // stores vars/atts in FIRST PARSE NcapVarVector thr_vtr; // Temp store for atts in a parallel run bool ntl_scn; // [flg] Initial scan of script bool FORTRAN_IDX_CNV; //Use fortran convention with hyperslab indices bool ATT_PROPAGATE; //Var on LHS gets attributtes from the leftermost var on the RHS bool ATT_INHERIT; //Var on LHS inherits attributtes from var of the same name // in the input file bool NCAP_MPI_SORT; // sort exressions after second parse for MPI optimization bool NCAP4_FILL; //if true Ouptut file is netcdf4 & missing value="_FillValue" size_t *cnk_sz; /* [nbr] Chunk sizes */ int dfl_lvl; /* [enm] Deflate level */ // Constructor prs_cls( NcapVector &p_dmn_in_vtr, NcapVector &p_dmn_out_vtr, std::vector &p_fmc_vtr, NcapVarVector &p_var_vtr, NcapVarVector &p_int_vtr) : dmn_in_vtr(p_dmn_in_vtr) , dmn_out_vtr(p_dmn_out_vtr) , fmc_vtr(p_fmc_vtr) , var_vtr(p_var_vtr) , int_vtr(p_int_vtr) { ; } // Copy Constructor prs_cls( const prs_cls &prs_cpy) : dmn_in_vtr(prs_cpy.dmn_in_vtr), dmn_out_vtr(prs_cpy.dmn_out_vtr), fmc_vtr(prs_cpy.fmc_vtr), var_vtr(prs_cpy.var_vtr), int_vtr(prs_cpy.int_vtr) { thr_vtr=prs_cpy.thr_vtr; fl_in=prs_cpy.fl_in; in_id=prs_cpy.in_id; fl_out=prs_cpy.fl_out; fl_out_fmt=prs_cpy.fl_out_fmt; out_id=prs_cpy.out_id; out_id_readonly=prs_cpy.out_id_readonly; ntl_scn=prs_cpy.ntl_scn; FORTRAN_IDX_CNV=prs_cpy.FORTRAN_IDX_CNV; ATT_PROPAGATE=prs_cpy.ATT_PROPAGATE; ATT_INHERIT=prs_cpy.ATT_INHERIT; NCAP_MPI_SORT=prs_cpy.NCAP_MPI_SORT; NCAP4_FILL=prs_cpy.NCAP4_FILL; dfl_lvl=prs_cpy.dfl_lvl; cnk_sz=prs_cpy.cnk_sz; } // = operator prs_cls& operator= (const prs_cls &prs_cpy) { *this=prs_cpy; return *this; /* // check for self-assignment if( &prs_cpy == this) return *this; fmc_vtr=prs_cpy.fmc_vtr; dmn_out_vtr=prs_cpy.dmn_out_vtr; fmc_vtr=prs_cpy.fmc_vtr; var_vtr=prs_cpy.var_vtr; int_vtr=prs_cpy.int_vtr; */ fl_in=prs_cpy.fl_in; in_id=prs_cpy.in_id; fl_out=prs_cpy.fl_out; fl_out_fmt=prs_cpy.fl_out_fmt; out_id=prs_cpy.out_id; out_id_readonly=prs_cpy.out_id_readonly; ntl_scn=prs_cpy.ntl_scn; FORTRAN_IDX_CNV=prs_cpy.FORTRAN_IDX_CNV; ATT_PROPAGATE=prs_cpy.ATT_PROPAGATE; ATT_INHERIT=prs_cpy.ATT_INHERIT; NCAP_MPI_SORT=prs_cpy.NCAP_MPI_SORT; NCAP4_FILL=prs_cpy.NCAP4_FILL; dfl_lvl=prs_cpy.dfl_lvl; return *this; } var_sct * /* O [sct] initialized variable */ ncap_var_init( const std::string &snm, /* I [sng] variable name constant */ bool bfll); /* if true fill var with data */ int /* O [flg] non-zero if var is in Input or Ouptut or int_vtr*/ ncap_var_init_chk( const std::string &snm /* I [sng] variable name constant */ ); int /* O [bool] bool - true if sucessful */ ncap_var_write /* [fnc] Write var to output file prs_arg->fl_out */ (var_sct *var, /* I [sct] variable to be written - freed at end */ bool bram); /* I [bool] true if a ram only variable */ int /* O [bool] bool - true if sucessful */ ncap_var_write_slb( /* [fnc] Write hyperslab to O var already exists in O */ var_sct *var /* I [bool] var contains data + hyperslab limits */ ); int /* O [bool] bool - true if sucessful */ ncap_var_write_wrp( /* [fnc] Write hyperslab or regular var */ var_sct *var, /* I [sct] data + limits if needed */ bool bram, /* I [flg] true if ram variable */ bool bslb); /* I [flg] true if slab to write */ int ncap_var_write_omp( var_sct *var, bool bram); void ncap_def_ntl_scn /* define variables captured on first parse */ (void); }; #endif // PRS_CLS_HH nco-4.5.4/src/nco++/sdo_utl.cc000066400000000000000000000057551264355130400157760ustar00rootroot00000000000000// $Header$ // Purpose: Implementation (declaration) of SDO stand-alone utilities /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() // Global functions with C linkages begin // Declare global functions with C++ linkages void dbg_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg) // [fnc] Print uniform debugging message { // Purpose: Print a uniform debugging message std::cerr << nco_prg_nm << ": DEBUG " << fnc_nm << "(): "+msg << std::endl; } // end dbg_prn() void dbg_prn(std::string fnc_nm,std::string msg) // [fnc] Print uniform debugging message { // Purpose: Print a uniform debugging message std::cerr << nco_prg_nm_get() << ": DEBUG " << fnc_nm << "(): "+msg << std::endl; } // end dbg_prn() void dbg_prn(std::string msg) // [fnc] Print uniform debugging message { // Purpose: Print a uniform debugging message std::cerr << "DEBUG: "+msg << std::endl; } // end dbg_prn() void err_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg) // [fnc] Print uniform error message and exit { // Purpose: Print a uniform error message and exit std::cerr << nco_prg_nm << ": ERROR " << fnc_nm << "(): "+msg << std::endl; #ifdef ABORT_ON_ERROR // abort() produces a core dump and traceback information useful to debuggers std::abort(); // [fnc] Exit with core dump #else // !ABORT_ON_ERROR // exit() produces no core dump or useful debugger information std::exit(EXIT_FAILURE); // [fnc] Exit nicely #endif // !ABORT_ON_ERROR } // end err_prn() void err_prn(std::string fnc_nm,std::string msg) // [fnc] Print uniform error message and exit { // Purpose: Print a uniform error message and exit std::cerr << nco_prg_nm_get() << ": ERROR " << fnc_nm << "(): "+msg << std::endl; #ifdef ABORT_ON_ERROR std::abort(); // [fnc] Produce core dump #else std::exit(EXIT_FAILURE); // [fnc] Exit nicely #endif // !ABORT_ON_ERROR } // end err_prn() void err_prn(std::string msg) // [fnc] Print uniform error message and exit { // Purpose: Print uniform error message and exit std::cerr << msg << std::endl; #ifdef ABORT_ON_ERROR std::abort(); // [fnc] Produce core dump #else std::exit(EXIT_FAILURE); // [fnc] Exit nicely #endif // !ABORT_ON_ERROR } // end err_prn() void wrn_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg) // [fnc] Print uniform warning message and exit { // Purpose: Print a uniform warning message std::cerr << nco_prg_nm << ": WARNING " << fnc_nm << "(): "+msg << std::endl; } // end wrn_prn() void wrn_prn(std::string fnc_nm,std::string msg) // [fnc] Print uniform warning message and exit { // Purpose: Print a uniform warning message std::cerr << nco_prg_nm_get() << ": WARNING " << fnc_nm << "(): "+msg << std::endl; } // end wrn_prn() nco-4.5.4/src/nco++/sdo_utl.hh000066400000000000000000000125231264355130400157770ustar00rootroot00000000000000// $Header$ // Purpose: Description (definition) of SDO stand-alone utilities /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ // Source: Routines are subset of CSZ's ~/c++/utl.[cc/hh] // Usage: // #include "sdo_utl.hh" // SDO stand-alone utilities: dbg/err/wrn_prn() #ifndef SDO_UTL_HH // Contents have not yet been inserted in current source file #define SDO_UTL_HH // C++ headers #include // Standard C++ I/O streams cout, cin #include // Standard C++ string stream processing #include // Standard C++ string class // Standard C headers #include // Assertions #include // abort, exit, getopt, malloc, strtod, strtol // 3rd party vendors // Personal headers //#include // Debugging constants // Namespaces #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 #endif // EXIT_SUCCESS is not defined in SUN4 // Prototype functions that have C linkages extern "C" { char *nco_prg_nm_get(void); unsigned short nco_dbg_lvl_get(void); } // end extern C // Define inline'd functions in header so source is visible to calling files // Prototype functions with C++ linkages void dbg_prn(std::string msg); void dbg_prn(std::string fnc_nm,std::string msg); void dbg_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg); void err_prn(std::string msg); void err_prn(std::string fnc_nm,std::string msg); void err_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg); void wrn_prn(std::string fnc_nm,std::string msg); void wrn_prn(std::string nco_prg_nm,std::string fnc_nm,std::string msg); // Templates templatestd::string nbr2sng(const val_T nbr); // O [sng] Number stored as string template // [obj] Object type std::string // [sng] Number stored as string nbr2sng // [fnc] Convert number to string (const val_T val) // [frc] Number to convert to string { /* Purpose: Convert number to string Method taken from CUED C++ FAQ NB: String streams require GCC 3.x */ const std::string fnc_nm("nbr2sng"); // [sng] Subroutine name std::ostringstream sng_srm_out; // [srm] Output string stream if(sng_srm_out << val) return sng_srm_out.str(); // If control reaches this point then error was encountered err_prn(fnc_nm,"Unable to convert number to string"); // Need return value here to avoid compiler warnings return sng_srm_out.str(); // } // end nbr2sng() templatestd::string nbr2sng(const val_T nbr,int dcm_plc_prc); // O [sng] Number stored as string template // [obj] Object type std::string // [sng] Number stored as string nbr2sng // [fnc] Convert number to string (const val_T val, // I [frc] Number to convert to string const int dcm_plc_prc) // I [nbr] Decimal places of precision { /* Purpose: Convert number to string Method taken from CUED C++ FAQ NB: String streams require GCC 3.x */ const std::string fnc_nm("nbr2sng"); // [sng] Subroutine name std::ostringstream sng_srm_out; // [srm] Output string stream sng_srm_out.precision(dcm_plc_prc); if(sng_srm_out << val) return sng_srm_out.str(); // If control reaches this point then error was encountered err_prn(fnc_nm,"Unable to convert number to string"); // Need return value here to avoid compiler warnings return sng_srm_out.str(); // } // end nbr2sng() templatevoid sng2nbr(const std::string sng,val_T *nbr); // O [sng] String stored as number template // [obj] Object type void sng2nbr // [fnc] Convert string to number (const std::string sng, // I [frc] String to convert to number val_T *nbr) // O [frc] Number that was converted from string { /* Purpose: Convert string to number Method inverse of nbr2sng() (see below) This method suggested by Martin York in comp.lang.c++.moderated on 20050522 in response to my thread on "Cross-platform strtoll() functionality" */ const std::string sbr_nm("sng2nbr"); // [sng] Subroutine name std::stringstream sng_srm_in(sng); // [srm] Input string stream if(!(sng_srm_in >> *nbr)) err_prn(sbr_nm,"Unable to convert string \""+sng+"\" to number"); } // end sng2nbr() templateval_T sng2nbr(const std::string sng,const val_T nbr); // O [sng] String stored as number template // [obj] Object type val_T // O [sng] String stored as number sng2nbr // [fnc] Convert string to number (const std::string sng, // I [frc] String to convert to number const val_T nbr) // I [frc] Number of type to convert to (not touched) { /* Purpose: Convert string to number Method inverse of nbr2sng() (see below) This method suggested by Martin York in comp.lang.c++.moderated on 20050522 in response to my thread on "Cross-platform strtoll() functionality" */ val_T val_out; // O [nbr] String stored as number const std::string sbr_nm("sng2nbr"); // [sng] Subroutine name std::stringstream sng_srm_in(sng); // [srm] Input string stream if(sng_srm_in >> val_out) return val_out; else err_prn(sbr_nm,"Unable to convert string \""+sng+"\" to number"); // Redundant return value here avoids two compiler warnings return nbr; // O [nbr] String stored as number } // end sng2nbr() #endif // SDO_UTL_HH nco-4.5.4/src/nco++/sym_cls.cc000066400000000000000000000007571264355130400157730ustar00rootroot00000000000000// maths functions holder (for mth_cls) ********************/ #include #include "sym_cls.hh" sym_cls::sym_cls(std::string sfnm, double (*fnc_dbl)(double), float (*fnc_flt)(float)){ _fnm=sfnm; _fnc_dbl=fnc_dbl; _fnc_flt=fnc_flt; } sym_cls::sym_cls(const char *const pfnm, double (*fnc_dbl)(double), float (*fnc_flt)(float)){ _fnm= static_cast(pfnm); _fnc_dbl=fnc_dbl; _fnc_flt=fnc_flt; } std::string sym_cls::fnm() { return _fnm;} nco-4.5.4/src/nco++/sym_cls.hh000066400000000000000000000010201264355130400157650ustar00rootroot00000000000000// maths functions holder (for mth_cls) ********************/ // Standard C++ headers #ifndef SYM_CLS_HH #define SYM_CLS_HH class sym_cls{ /* sym_sct */ public: std::string _fnm; double (*_fnc_dbl)(double); /* [fnc] Double-valued function */ float (*_fnc_flt)(float); /* [fnc] Float-valued function */ public: sym_cls(std::string sfnm, double (*fnc_dbl)(double), float (*fnc_flt)(float)); sym_cls(const char *const pfnm, double (*fnc_dbl)(double), float (*fnc_flt)(float)); std::string fnm(); }; #endif nco-4.5.4/src/nco++/vtl_cls.hh000066400000000000000000000033751264355130400160010ustar00rootroot00000000000000 // Standard C++ headers #ifndef INC_VTL_CLS_hh_ #define INC_VTL_CLS_hh_ #include #include #include "ncoParserTokenTypes.hpp" #include "ncap2_utl.hh" #include "ncoTree.hpp" #include "fmc_cls.hh" // forward declaration class ncoTree; enum vtl_typ { VVAR,VLVAR,VDVAR, VATT,VLATT,VDATT,VDIM, VDIM_SIZE,VEXPR,VCALL_REF }; class vtl_cls: public ncoParserTokenTypes { public: // expression types, std::vector fmc_vtr; int size(void) { return fmc_vtr.size(); } std::vector *lst_vtr(void){ return &fmc_vtr;} virtual var_sct *fnd(RefAST expr, RefAST fargs,fmc_cls &fmc_obj, ncoTree &walker)=0; static vtl_typ expr_typ(RefAST expr){ int nbr_chd; int chd_typ=0; vtl_typ lcl_typ; nbr_chd=expr->getNumberOfChildren(); if(nbr_chd >0) chd_typ=expr->getFirstChild()->getType(); switch(expr->getType()) { case VAR_ID: { if( nbr_chd==0 ) lcl_typ=VVAR; else if ( nbr_chd==1 && chd_typ==LMT_LIST) lcl_typ=VLVAR; else if (nbr_chd==1 && chd_typ==DMN_LIST) lcl_typ=VDVAR; else lcl_typ=VEXPR; } break; case ATT_ID: { if( nbr_chd==0 ) lcl_typ=VATT; else if ( nbr_chd==1 && chd_typ==LMT_LIST) lcl_typ=VLATT; else if (nbr_chd==1 && chd_typ==DMN_LIST) lcl_typ=VDATT; else lcl_typ=VEXPR; } break; case DIM_ID: lcl_typ=VDIM; break; case DIM_ID_SIZE: lcl_typ=VDIM_SIZE; break; case CALL_REF: lcl_typ=VCALL_REF; break; default: lcl_typ=VEXPR; break; } return lcl_typ; } }; #endif nco-4.5.4/src/nco/000077500000000000000000000000001264355130400136545ustar00rootroot00000000000000nco-4.5.4/src/nco/.gitignore000066400000000000000000000003131264355130400156410ustar00rootroot00000000000000# Git-ignore patterns for ~/nco/src/nco /Makefile /ncap_lex.c /ncap_yacc.c /ncap_yacc.h # Created locally by configure->make all /ncap /ncatted /ncbo /ncecat /ncflint /ncks /ncpdq /ncra /ncrename /ncwa nco-4.5.4/src/nco/ESMC_CoordSys.h000066400000000000000000000026441264355130400164070ustar00rootroot00000000000000// $Id$ // // Earth System Modeling Framework // Copyright 2002-2014, University Corporation for Atmospheric Research, // Massachusetts Institute of Technology, Geophysical Fluid Dynamics // Laboratory, University of Michigan, National Centers for Environmental // Prediction, Los Alamos National Laboratory, Argonne National Laboratory, // NASA Goddard Space Flight Center. // Licensed under the University of Illinois-NCSA License. // // ESMF Util C++ declaration include file // //----------------------------------------------------------------------------- // #ifndef ESMC_COORDSYS_H #define ESMC_COORDSYS_H enum ESMC_CoordSys_Flag {ESMC_COORDSYS_INVALID=-2, ESMC_COORDSYS_UNINIT, ESMC_COORDSYS_CART, ESMC_COORDSYS_SPH_DEG, ESMC_COORDSYS_SPH_RAD}; // Constants for converting between radians and degrees // (These need to match the ones in ESMF_UtilTypes.F90) /* csz 20150320 Define these only in main() files not in original location in ESMC_CoordSys.h Otherwise any file #including ESMC.h inadvertently includes these constants multiple times Should be defined as externals that resolve to single definition in main() sudo cp ~/nco/src/nco/ESMC_CoordSys.h /usr/local/include */ //const double ESMC_CoordSys_Deg2Rad= 0.01745329251994329547437; //const double ESMC_CoordSys_Rad2Deg=57.29577951308232286464772; #endif // ESMC_COORDSYS_H nco-4.5.4/src/nco/Makefile.am000066400000000000000000000105361264355130400157150ustar00rootroot00000000000000# $Header$ -*-makefile-*- if BUILD_YACC_SOURCE NCAP=ncap else NCAP= endif if BUILD_YACC_SOURCE NCWA=ncwa else NCWA= endif if NCO_NEED_GETOPT_LONG NCO_GETOPT_C=nco_getopt.c NCO_GETOPT_H=nco_getopt.h else NCO_GETOPT_C= NCO_GETOPT_H= endif if ENABLE_MPI bin_PROGRAMS = ${NCAP} ncatted ncbo ncecat ncflint ncks ncpdq ncra ncrename mpncbo mpncecat mpncflint mpncpdq mpncra mpncwa ${NCWA} else bin_PROGRAMS = ${NCAP} ncatted ncbo ncecat ncflint ncks ncpdq ncra ncrename ${NCWA} endif AM_YFLAGS = -d --name-prefix=nco_yy ncap_SOURCES = ncap_utl.c ncap.c ncap_yacc.y ncap_lex.l ncap_LDADD = libnco.la ncatted_SOURCES = ncatted.c ncatted_LDADD = libnco.la ncbo_SOURCES = ncbo.c ncbo_LDADD = libnco.la ncecat_SOURCES = ncecat.c ncecat_LDADD = libnco.la ncflint_SOURCES = ncflint.c ncflint_LDADD = libnco.la ncks_SOURCES = ncks.c ncks_LDADD = libnco.la ncpdq_SOURCES = ncpdq.c ncpdq_LDADD = libnco.la ncra_SOURCES = ncra.c ncra_LDADD = libnco.la ncrename_SOURCES = ncrename.c ncrename_LDADD = libnco.la mpncbo_SOURCES = mpncbo.c mpncbo_LDADD = libnco.la mpncecat_SOURCES = mpncecat.c mpncecat_LDADD = libnco.la mpncflint_SOURCES = mpncflint.c mpncflint_LDADD = libnco.la mpncpdq_SOURCES = mpncpdq.c mpncpdq_LDADD = libnco.la mpncra_SOURCES = mpncra.c mpncra_LDADD = libnco.la # ncwa also requires ncap_yacc.y which should already have been built for ncap ncwa_SOURCES = ncwa.c ncap_utl.c ncap_lex.l ncap_yacc.c ncwa_LDADD = libnco.la mpncwa_SOURCES = mpncwa.c ncap_utl.c ncap_lex.l ncap_yacc.c mpncwa_LDADD = libnco.la HEADER_SRC = \ libnco.h \ ${NCO_GETOPT_H} \ ncap.h \ ncap_yacc.h \ nco.h \ nco_att_utl.h \ nco_aux.h \ nco_bnr.h \ nco_cln_utl.h \ nco_cnf_dmn.h \ nco_cnf_typ.h \ nco_cnk.h \ nco_cnv_arm.h \ nco_cnv_csm.h \ nco_ctl.h \ nco_dbg.h \ nco_dmn_utl.h \ nco_fl_utl.h \ nco_grp_utl.h \ nco_grp_trv.h \ nco_lmt.h \ nco_lst_utl.h \ nco_md5.h \ nco_mmr.h \ nco_mpi.h \ nco_msa.h \ nco_mss_val.h \ nco_netcdf.h \ nco_omp.h \ nco_pck.h \ nco_ppc.h \ nco_prn.h \ nco_rec_var.h \ nco_rgr.h \ nco_rth_flt.h \ nco_rth_utl.h \ nco_scl_utl.h \ nco_scm.h \ nco_sld.h \ nco_sng_utl.h \ nco_srm.h \ nco_typ.h \ nco_uthash.h \ nco_var_avg.h \ nco_var_lst.h \ nco_var_rth.h \ nco_var_scv.h \ nco_var_utl.h lib_LTLIBRARIES = libnco.la # This creates version-stamped shared-library, e.g., libnco-2.9.4.so libnco_la_LDFLAGS = -release @VERSION@ # Fedora Core nco.spec in nco-3.1.2 wants to install headers # Fedora Core nco.spec in nco-3.9.7 still wants to install headers # Maybe smart/required for -devel packages? # To my knowledge, though, only NCO programs use libnco # For this reason Debian packages should not (yet) install NCO headers # Remove following line until learn how to prevent Debian from installing headers #include_HEADERS = $(HEADER_SRC) libnco_la_SOURCES = \ ${HEADER_SRC} \ ${NCO_GETOPT_C} \ nco_att_utl.c \ nco_aux.c \ nco_bnr.c \ nco_cln_utl.c \ nco_cnf_dmn.c \ nco_cnf_typ.c \ nco_cnk.c \ nco_cnv_arm.c \ nco_cnv_csm.c \ nco_ctl.c \ nco_dbg.c \ nco_dmn_utl.c \ nco_fl_utl.c \ nco_grp_utl.c \ nco_grp_trv.c \ nco_lmt.c \ nco_lst_utl.c \ nco_md5.c \ nco_mmr.c \ nco_msa.c \ nco_mss_val.c \ nco_netcdf.c \ nco_omp.c \ nco_pck.c \ nco_ppc.c \ nco_prn.c \ nco_rec_var.c \ nco_rgr.c \ nco_rth_flt.c \ nco_rth_utl.c \ nco_scl_utl.c \ nco_scm.c \ nco_sld.c \ nco_sng_utl.c \ nco_srm.c \ nco_var_avg.c \ nco_var_lst.c \ nco_var_rth.c \ nco_var_scv.c \ nco_var_utl.c TESTS = ${DAP_TESTS} EXTRA_DIST = ${NCO_GETOPT_C} DISTCLEANFILES = ncap_lex.c ncap_yacc.c ncap_yacc.h install-exec-hook: cd $(DESTDIR)$(bindir) && ln -s -f ncbo ncdiff || (rm -f ncdiff && ln -s -f ncbo ncdiff) cd $(DESTDIR)$(bindir) && ln -s -f ncra ncea || (rm -f ncea && ln -s -f ncra ncea) cd $(DESTDIR)$(bindir) && ln -s -f ncra nces || (rm -f nces && ln -s -f ncra nces) cd $(DESTDIR)$(bindir) && ln -s -f ncra ncrcat || (rm -f ncrcat && ln -s -f ncra ncrcat) if ENABLE_MPI cd $(DESTDIR)$(bindir) && ln -s -f mpncbo mpncdiff || (rm -f mpncdiff && ln -s -f mpncbo mpncdiff) cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpncea || (rm -f mpncea && ln -s -f mpncra mpncea) cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpnces || (rm -f mpnces && ln -s -f mpncra mpnces) cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpncrcat || (rm -f mpncrcat && ln -s -f mpncra mpncrcat) endif uninstall-hook: cd $(DESTDIR)$(bindir) && rm -f ncdiff ncea nces ncrcat mpncdiff mpncea mpnces mpncrcat CLEANFILES=ncdiff ncea nces ncrcat mpncdiff mpncea mpnces mpncrcat nco-4.5.4/src/nco/Makefile.in000066400000000000000000001503011264355130400157210ustar00rootroot00000000000000# Makefile.in generated by automake 1.15 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2014 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@ # $Header$ -*-makefile-*- VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ @ENABLE_MPI_FALSE@bin_PROGRAMS = $(am__EXEEXT_1) ncatted$(EXEEXT) \ @ENABLE_MPI_FALSE@ ncbo$(EXEEXT) ncecat$(EXEEXT) \ @ENABLE_MPI_FALSE@ ncflint$(EXEEXT) ncks$(EXEEXT) \ @ENABLE_MPI_FALSE@ ncpdq$(EXEEXT) ncra$(EXEEXT) \ @ENABLE_MPI_FALSE@ ncrename$(EXEEXT) $(am__EXEEXT_2) @ENABLE_MPI_TRUE@bin_PROGRAMS = $(am__EXEEXT_1) ncatted$(EXEEXT) \ @ENABLE_MPI_TRUE@ ncbo$(EXEEXT) ncecat$(EXEEXT) \ @ENABLE_MPI_TRUE@ ncflint$(EXEEXT) ncks$(EXEEXT) ncpdq$(EXEEXT) \ @ENABLE_MPI_TRUE@ ncra$(EXEEXT) ncrename$(EXEEXT) \ @ENABLE_MPI_TRUE@ mpncbo$(EXEEXT) mpncecat$(EXEEXT) \ @ENABLE_MPI_TRUE@ mpncflint$(EXEEXT) mpncpdq$(EXEEXT) \ @ENABLE_MPI_TRUE@ mpncra$(EXEEXT) mpncwa$(EXEEXT) \ @ENABLE_MPI_TRUE@ $(am__EXEEXT_2) TESTS = subdir = src/nco ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(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)/acinclude.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(SHELL) $(top_srcdir)/autobld/mkinstalldirs 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)$(bindir)" LTLIBRARIES = $(lib_LTLIBRARIES) libnco_la_LIBADD = am__libnco_la_SOURCES_DIST = libnco.h nco_getopt.h ncap.h ncap_yacc.h \ nco.h nco_att_utl.h nco_aux.h nco_bnr.h nco_cln_utl.h \ nco_cnf_dmn.h nco_cnf_typ.h nco_cnk.h nco_cnv_arm.h \ nco_cnv_csm.h nco_ctl.h nco_dbg.h nco_dmn_utl.h nco_fl_utl.h \ nco_grp_utl.h nco_grp_trv.h nco_lmt.h nco_lst_utl.h nco_md5.h \ nco_mmr.h nco_mpi.h nco_msa.h nco_mss_val.h nco_netcdf.h \ nco_omp.h nco_pck.h nco_ppc.h nco_prn.h nco_rec_var.h \ nco_rgr.h nco_rth_flt.h nco_rth_utl.h nco_scl_utl.h nco_scm.h \ nco_sld.h nco_sng_utl.h nco_srm.h nco_typ.h nco_uthash.h \ nco_var_avg.h nco_var_lst.h nco_var_rth.h nco_var_scv.h \ nco_var_utl.h nco_getopt.c nco_att_utl.c nco_aux.c nco_bnr.c \ nco_cln_utl.c nco_cnf_dmn.c nco_cnf_typ.c nco_cnk.c \ nco_cnv_arm.c nco_cnv_csm.c nco_ctl.c nco_dbg.c nco_dmn_utl.c \ nco_fl_utl.c nco_grp_utl.c nco_grp_trv.c nco_lmt.c \ nco_lst_utl.c nco_md5.c nco_mmr.c nco_msa.c nco_mss_val.c \ nco_netcdf.c nco_omp.c nco_pck.c nco_ppc.c nco_prn.c \ nco_rec_var.c nco_rgr.c nco_rth_flt.c nco_rth_utl.c \ nco_scl_utl.c nco_scm.c nco_sld.c nco_sng_utl.c nco_srm.c \ nco_var_avg.c nco_var_lst.c nco_var_rth.c nco_var_scv.c \ nco_var_utl.c am__objects_1 = am__objects_2 = $(am__objects_1) @NCO_NEED_GETOPT_LONG_TRUE@am__objects_3 = nco_getopt.lo am_libnco_la_OBJECTS = $(am__objects_2) $(am__objects_3) \ nco_att_utl.lo nco_aux.lo nco_bnr.lo nco_cln_utl.lo \ nco_cnf_dmn.lo nco_cnf_typ.lo nco_cnk.lo nco_cnv_arm.lo \ nco_cnv_csm.lo nco_ctl.lo nco_dbg.lo nco_dmn_utl.lo \ nco_fl_utl.lo nco_grp_utl.lo nco_grp_trv.lo nco_lmt.lo \ nco_lst_utl.lo nco_md5.lo nco_mmr.lo nco_msa.lo nco_mss_val.lo \ nco_netcdf.lo nco_omp.lo nco_pck.lo nco_ppc.lo nco_prn.lo \ nco_rec_var.lo nco_rgr.lo nco_rth_flt.lo nco_rth_utl.lo \ nco_scl_utl.lo nco_scm.lo nco_sld.lo nco_sng_utl.lo nco_srm.lo \ nco_var_avg.lo nco_var_lst.lo nco_var_rth.lo nco_var_scv.lo \ nco_var_utl.lo libnco_la_OBJECTS = $(am_libnco_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libnco_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(libnco_la_LDFLAGS) $(LDFLAGS) -o $@ @BUILD_YACC_SOURCE_TRUE@am__EXEEXT_1 = ncap$(EXEEXT) @BUILD_YACC_SOURCE_TRUE@am__EXEEXT_2 = ncwa$(EXEEXT) PROGRAMS = $(bin_PROGRAMS) am_mpncbo_OBJECTS = mpncbo.$(OBJEXT) mpncbo_OBJECTS = $(am_mpncbo_OBJECTS) mpncbo_DEPENDENCIES = libnco.la am_mpncecat_OBJECTS = mpncecat.$(OBJEXT) mpncecat_OBJECTS = $(am_mpncecat_OBJECTS) mpncecat_DEPENDENCIES = libnco.la am_mpncflint_OBJECTS = mpncflint.$(OBJEXT) mpncflint_OBJECTS = $(am_mpncflint_OBJECTS) mpncflint_DEPENDENCIES = libnco.la am_mpncpdq_OBJECTS = mpncpdq.$(OBJEXT) mpncpdq_OBJECTS = $(am_mpncpdq_OBJECTS) mpncpdq_DEPENDENCIES = libnco.la am_mpncra_OBJECTS = mpncra.$(OBJEXT) mpncra_OBJECTS = $(am_mpncra_OBJECTS) mpncra_DEPENDENCIES = libnco.la am_mpncwa_OBJECTS = mpncwa.$(OBJEXT) ncap_utl.$(OBJEXT) \ ncap_lex.$(OBJEXT) ncap_yacc.$(OBJEXT) mpncwa_OBJECTS = $(am_mpncwa_OBJECTS) mpncwa_DEPENDENCIES = libnco.la am_ncap_OBJECTS = ncap_utl.$(OBJEXT) ncap.$(OBJEXT) \ ncap_yacc.$(OBJEXT) ncap_lex.$(OBJEXT) ncap_OBJECTS = $(am_ncap_OBJECTS) ncap_DEPENDENCIES = libnco.la am_ncatted_OBJECTS = ncatted.$(OBJEXT) ncatted_OBJECTS = $(am_ncatted_OBJECTS) ncatted_DEPENDENCIES = libnco.la am_ncbo_OBJECTS = ncbo.$(OBJEXT) ncbo_OBJECTS = $(am_ncbo_OBJECTS) ncbo_DEPENDENCIES = libnco.la am_ncecat_OBJECTS = ncecat.$(OBJEXT) ncecat_OBJECTS = $(am_ncecat_OBJECTS) ncecat_DEPENDENCIES = libnco.la am_ncflint_OBJECTS = ncflint.$(OBJEXT) ncflint_OBJECTS = $(am_ncflint_OBJECTS) ncflint_DEPENDENCIES = libnco.la am_ncks_OBJECTS = ncks.$(OBJEXT) ncks_OBJECTS = $(am_ncks_OBJECTS) ncks_DEPENDENCIES = libnco.la am_ncpdq_OBJECTS = ncpdq.$(OBJEXT) ncpdq_OBJECTS = $(am_ncpdq_OBJECTS) ncpdq_DEPENDENCIES = libnco.la am_ncra_OBJECTS = ncra.$(OBJEXT) ncra_OBJECTS = $(am_ncra_OBJECTS) ncra_DEPENDENCIES = libnco.la am_ncrename_OBJECTS = ncrename.$(OBJEXT) ncrename_OBJECTS = $(am_ncrename_OBJECTS) ncrename_DEPENDENCIES = libnco.la am_ncwa_OBJECTS = ncwa.$(OBJEXT) ncap_utl.$(OBJEXT) ncap_lex.$(OBJEXT) \ ncap_yacc.$(OBJEXT) ncwa_OBJECTS = $(am_ncwa_OBJECTS) ncwa_DEPENDENCIES = libnco.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/autobld/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = @MAINTAINER_MODE_FALSE@am__skiplex = test -f $@ || LEXCOMPILE = $(LEX) $(AM_LFLAGS) $(LFLAGS) LTLEXCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(LEX) $(AM_LFLAGS) $(LFLAGS) AM_V_LEX = $(am__v_LEX_@AM_V@) am__v_LEX_ = $(am__v_LEX_@AM_DEFAULT_V@) am__v_LEX_0 = @echo " LEX " $@; am__v_LEX_1 = YLWRAP = $(top_srcdir)/autobld/ylwrap @MAINTAINER_MODE_FALSE@am__skipyacc = test -f $@ || am__yacc_c2h = sed -e s/cc$$/hh/ -e s/cpp$$/hpp/ -e s/cxx$$/hxx/ \ -e s/c++$$/h++/ -e s/c$$/h/ YACCCOMPILE = $(YACC) $(AM_YFLAGS) $(YFLAGS) LTYACCCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(YACC) $(AM_YFLAGS) $(YFLAGS) AM_V_YACC = $(am__v_YACC_@AM_V@) am__v_YACC_ = $(am__v_YACC_@AM_DEFAULT_V@) am__v_YACC_0 = @echo " YACC " $@; am__v_YACC_1 = SOURCES = $(libnco_la_SOURCES) $(mpncbo_SOURCES) $(mpncecat_SOURCES) \ $(mpncflint_SOURCES) $(mpncpdq_SOURCES) $(mpncra_SOURCES) \ $(mpncwa_SOURCES) $(ncap_SOURCES) $(ncatted_SOURCES) \ $(ncbo_SOURCES) $(ncecat_SOURCES) $(ncflint_SOURCES) \ $(ncks_SOURCES) $(ncpdq_SOURCES) $(ncra_SOURCES) \ $(ncrename_SOURCES) $(ncwa_SOURCES) DIST_SOURCES = $(am__libnco_la_SOURCES_DIST) $(mpncbo_SOURCES) \ $(mpncecat_SOURCES) $(mpncflint_SOURCES) $(mpncpdq_SOURCES) \ $(mpncra_SOURCES) $(mpncwa_SOURCES) $(ncap_SOURCES) \ $(ncatted_SOURCES) $(ncbo_SOURCES) $(ncecat_SOURCES) \ $(ncflint_SOURCES) $(ncks_SOURCES) $(ncpdq_SOURCES) \ $(ncra_SOURCES) $(ncrename_SOURCES) $(ncwa_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red=''; \ grn=''; \ lgn=''; \ blu=''; \ mgn=''; \ brg=''; \ std=''; \ fi; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/autobld/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/autobld/depcomp \ $(top_srcdir)/autobld/mkinstalldirs \ $(top_srcdir)/autobld/test-driver $(top_srcdir)/autobld/ylwrap \ ncap_lex.c ncap_yacc.c ncap_yacc.h DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ ANTLR_ROOT = @ANTLR_ROOT@ 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@ DOC_FOLDER = @DOC_FOLDER@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ESMF_INC = @ESMF_INC@ ESMF_LIB = @ESMF_LIB@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GREP = @GREP@ HAVE_ANTLR = @HAVE_ANTLR@ HAVE_MAKEINFO = @HAVE_MAKEINFO@ I18N_SHARE = @I18N_SHARE@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LD = @LD@ LDFLAGS = @LDFLAGS@ LEX = @LEX@ LEXLIB = @LEXLIB@ LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ LFLAGS = @LFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ NCOXX = @NCOXX@ NCO_CXX = @NCO_CXX@ NETCDF_INC = @NETCDF_INC@ NETCDF_LIB = @NETCDF_LIB@ NETCDF_ROOT = @NETCDF_ROOT@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENMP_CFLAGS = @OPENMP_CFLAGS@ 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@ PATH_TO_NCGEN = @PATH_TO_NCGEN@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UDUNITS2_PATH = @UDUNITS2_PATH@ VERSION = @VERSION@ YACC = @YACC@ YFLAGS = @YFLAGS@ 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@ 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@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ @BUILD_YACC_SOURCE_FALSE@NCAP = @BUILD_YACC_SOURCE_TRUE@NCAP = ncap @BUILD_YACC_SOURCE_FALSE@NCWA = @BUILD_YACC_SOURCE_TRUE@NCWA = ncwa @NCO_NEED_GETOPT_LONG_FALSE@NCO_GETOPT_C = @NCO_NEED_GETOPT_LONG_TRUE@NCO_GETOPT_C = nco_getopt.c @NCO_NEED_GETOPT_LONG_FALSE@NCO_GETOPT_H = @NCO_NEED_GETOPT_LONG_TRUE@NCO_GETOPT_H = nco_getopt.h AM_YFLAGS = -d --name-prefix=nco_yy ncap_SOURCES = ncap_utl.c ncap.c ncap_yacc.y ncap_lex.l ncap_LDADD = libnco.la ncatted_SOURCES = ncatted.c ncatted_LDADD = libnco.la ncbo_SOURCES = ncbo.c ncbo_LDADD = libnco.la ncecat_SOURCES = ncecat.c ncecat_LDADD = libnco.la ncflint_SOURCES = ncflint.c ncflint_LDADD = libnco.la ncks_SOURCES = ncks.c ncks_LDADD = libnco.la ncpdq_SOURCES = ncpdq.c ncpdq_LDADD = libnco.la ncra_SOURCES = ncra.c ncra_LDADD = libnco.la ncrename_SOURCES = ncrename.c ncrename_LDADD = libnco.la mpncbo_SOURCES = mpncbo.c mpncbo_LDADD = libnco.la mpncecat_SOURCES = mpncecat.c mpncecat_LDADD = libnco.la mpncflint_SOURCES = mpncflint.c mpncflint_LDADD = libnco.la mpncpdq_SOURCES = mpncpdq.c mpncpdq_LDADD = libnco.la mpncra_SOURCES = mpncra.c mpncra_LDADD = libnco.la # ncwa also requires ncap_yacc.y which should already have been built for ncap ncwa_SOURCES = ncwa.c ncap_utl.c ncap_lex.l ncap_yacc.c ncwa_LDADD = libnco.la mpncwa_SOURCES = mpncwa.c ncap_utl.c ncap_lex.l ncap_yacc.c mpncwa_LDADD = libnco.la HEADER_SRC = \ libnco.h \ ${NCO_GETOPT_H} \ ncap.h \ ncap_yacc.h \ nco.h \ nco_att_utl.h \ nco_aux.h \ nco_bnr.h \ nco_cln_utl.h \ nco_cnf_dmn.h \ nco_cnf_typ.h \ nco_cnk.h \ nco_cnv_arm.h \ nco_cnv_csm.h \ nco_ctl.h \ nco_dbg.h \ nco_dmn_utl.h \ nco_fl_utl.h \ nco_grp_utl.h \ nco_grp_trv.h \ nco_lmt.h \ nco_lst_utl.h \ nco_md5.h \ nco_mmr.h \ nco_mpi.h \ nco_msa.h \ nco_mss_val.h \ nco_netcdf.h \ nco_omp.h \ nco_pck.h \ nco_ppc.h \ nco_prn.h \ nco_rec_var.h \ nco_rgr.h \ nco_rth_flt.h \ nco_rth_utl.h \ nco_scl_utl.h \ nco_scm.h \ nco_sld.h \ nco_sng_utl.h \ nco_srm.h \ nco_typ.h \ nco_uthash.h \ nco_var_avg.h \ nco_var_lst.h \ nco_var_rth.h \ nco_var_scv.h \ nco_var_utl.h lib_LTLIBRARIES = libnco.la # This creates version-stamped shared-library, e.g., libnco-2.9.4.so libnco_la_LDFLAGS = -release @VERSION@ # Fedora Core nco.spec in nco-3.1.2 wants to install headers # Fedora Core nco.spec in nco-3.9.7 still wants to install headers # Maybe smart/required for -devel packages? # To my knowledge, though, only NCO programs use libnco # For this reason Debian packages should not (yet) install NCO headers # Remove following line until learn how to prevent Debian from installing headers #include_HEADERS = $(HEADER_SRC) libnco_la_SOURCES = \ ${HEADER_SRC} \ ${NCO_GETOPT_C} \ nco_att_utl.c \ nco_aux.c \ nco_bnr.c \ nco_cln_utl.c \ nco_cnf_dmn.c \ nco_cnf_typ.c \ nco_cnk.c \ nco_cnv_arm.c \ nco_cnv_csm.c \ nco_ctl.c \ nco_dbg.c \ nco_dmn_utl.c \ nco_fl_utl.c \ nco_grp_utl.c \ nco_grp_trv.c \ nco_lmt.c \ nco_lst_utl.c \ nco_md5.c \ nco_mmr.c \ nco_msa.c \ nco_mss_val.c \ nco_netcdf.c \ nco_omp.c \ nco_pck.c \ nco_ppc.c \ nco_prn.c \ nco_rec_var.c \ nco_rgr.c \ nco_rth_flt.c \ nco_rth_utl.c \ nco_scl_utl.c \ nco_scm.c \ nco_sld.c \ nco_sng_utl.c \ nco_srm.c \ nco_var_avg.c \ nco_var_lst.c \ nco_var_rth.c \ nco_var_scv.c \ nco_var_utl.c EXTRA_DIST = ${NCO_GETOPT_C} DISTCLEANFILES = ncap_lex.c ncap_yacc.c ncap_yacc.h CLEANFILES = ncdiff ncea nces ncrcat mpncdiff mpncea mpnces mpncrcat all: all-am .SUFFIXES: .SUFFIXES: .c .l .lo .log .o .obj .test .test$(EXEEXT) .trs .y $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(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 src/nco/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign src/nco/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: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @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 " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ 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)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libnco.la: $(libnco_la_OBJECTS) $(libnco_la_DEPENDENCIES) $(EXTRA_libnco_la_DEPENDENCIES) $(AM_V_CCLD)$(libnco_la_LINK) -rpath $(libdir) $(libnco_la_OBJECTS) $(libnco_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || 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 mpncbo$(EXEEXT): $(mpncbo_OBJECTS) $(mpncbo_DEPENDENCIES) $(EXTRA_mpncbo_DEPENDENCIES) @rm -f mpncbo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncbo_OBJECTS) $(mpncbo_LDADD) $(LIBS) mpncecat$(EXEEXT): $(mpncecat_OBJECTS) $(mpncecat_DEPENDENCIES) $(EXTRA_mpncecat_DEPENDENCIES) @rm -f mpncecat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncecat_OBJECTS) $(mpncecat_LDADD) $(LIBS) mpncflint$(EXEEXT): $(mpncflint_OBJECTS) $(mpncflint_DEPENDENCIES) $(EXTRA_mpncflint_DEPENDENCIES) @rm -f mpncflint$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncflint_OBJECTS) $(mpncflint_LDADD) $(LIBS) mpncpdq$(EXEEXT): $(mpncpdq_OBJECTS) $(mpncpdq_DEPENDENCIES) $(EXTRA_mpncpdq_DEPENDENCIES) @rm -f mpncpdq$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncpdq_OBJECTS) $(mpncpdq_LDADD) $(LIBS) mpncra$(EXEEXT): $(mpncra_OBJECTS) $(mpncra_DEPENDENCIES) $(EXTRA_mpncra_DEPENDENCIES) @rm -f mpncra$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncra_OBJECTS) $(mpncra_LDADD) $(LIBS) mpncwa$(EXEEXT): $(mpncwa_OBJECTS) $(mpncwa_DEPENDENCIES) $(EXTRA_mpncwa_DEPENDENCIES) @rm -f mpncwa$(EXEEXT) $(AM_V_CCLD)$(LINK) $(mpncwa_OBJECTS) $(mpncwa_LDADD) $(LIBS) ncap_yacc.h: ncap_yacc.c @if test ! -f $@; then rm -f ncap_yacc.c; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) ncap_yacc.c; else :; fi ncap$(EXEEXT): $(ncap_OBJECTS) $(ncap_DEPENDENCIES) $(EXTRA_ncap_DEPENDENCIES) @rm -f ncap$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncap_OBJECTS) $(ncap_LDADD) $(LIBS) ncatted$(EXEEXT): $(ncatted_OBJECTS) $(ncatted_DEPENDENCIES) $(EXTRA_ncatted_DEPENDENCIES) @rm -f ncatted$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncatted_OBJECTS) $(ncatted_LDADD) $(LIBS) ncbo$(EXEEXT): $(ncbo_OBJECTS) $(ncbo_DEPENDENCIES) $(EXTRA_ncbo_DEPENDENCIES) @rm -f ncbo$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncbo_OBJECTS) $(ncbo_LDADD) $(LIBS) ncecat$(EXEEXT): $(ncecat_OBJECTS) $(ncecat_DEPENDENCIES) $(EXTRA_ncecat_DEPENDENCIES) @rm -f ncecat$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncecat_OBJECTS) $(ncecat_LDADD) $(LIBS) ncflint$(EXEEXT): $(ncflint_OBJECTS) $(ncflint_DEPENDENCIES) $(EXTRA_ncflint_DEPENDENCIES) @rm -f ncflint$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncflint_OBJECTS) $(ncflint_LDADD) $(LIBS) ncks$(EXEEXT): $(ncks_OBJECTS) $(ncks_DEPENDENCIES) $(EXTRA_ncks_DEPENDENCIES) @rm -f ncks$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncks_OBJECTS) $(ncks_LDADD) $(LIBS) ncpdq$(EXEEXT): $(ncpdq_OBJECTS) $(ncpdq_DEPENDENCIES) $(EXTRA_ncpdq_DEPENDENCIES) @rm -f ncpdq$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncpdq_OBJECTS) $(ncpdq_LDADD) $(LIBS) ncra$(EXEEXT): $(ncra_OBJECTS) $(ncra_DEPENDENCIES) $(EXTRA_ncra_DEPENDENCIES) @rm -f ncra$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncra_OBJECTS) $(ncra_LDADD) $(LIBS) ncrename$(EXEEXT): $(ncrename_OBJECTS) $(ncrename_DEPENDENCIES) $(EXTRA_ncrename_DEPENDENCIES) @rm -f ncrename$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncrename_OBJECTS) $(ncrename_LDADD) $(LIBS) ncwa$(EXEEXT): $(ncwa_OBJECTS) $(ncwa_DEPENDENCIES) $(EXTRA_ncwa_DEPENDENCIES) @rm -f ncwa$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ncwa_OBJECTS) $(ncwa_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncbo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncecat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncflint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncpdq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncra.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mpncwa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap_lex.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap_utl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncap_yacc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncatted.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncbo.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncecat.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncflint.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncks.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_att_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_aux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_bnr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cln_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cnf_dmn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cnf_typ.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cnk.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cnv_arm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_cnv_csm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_ctl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_dbg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_dmn_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_fl_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_getopt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_grp_trv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_grp_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_lmt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_lst_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_md5.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_mmr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_msa.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_mss_val.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_netcdf.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_omp.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_pck.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_ppc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_prn.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_rec_var.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_rgr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_rth_flt.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_rth_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_scl_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_scm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_sld.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_sng_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_srm.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_var_avg.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_var_lst.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_var_rth.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_var_scv.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nco_var_utl.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncpdq.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncra.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncrename.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ncwa.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .l.c: $(AM_V_LEX)$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) .y.c: $(AM_V_YACC)$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h `echo $@ | $(am__yacc_c2h)` y.output $*.output -- $(YACCCOMPILE) mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) 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-TESTS check: check-am all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) 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) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." -rm -f ncap_lex.c -rm -f ncap_yacc.c -rm -f ncap_yacc.h clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ 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-libLTLIBRARIES @$(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-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-libLTLIBRARIES @$(NORMAL_INSTALL) $(MAKE) $(AM_MAKEFLAGS) uninstall-hook .MAKE: check-am install-am install-exec-am install-strip uninstall-am .PHONY: CTAGS GTAGS TAGS all all-am check check-TESTS check-am clean \ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am 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-dvi install-dvi-am install-exec \ install-exec-am install-exec-hook 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 recheck tags tags-am \ uninstall uninstall-am uninstall-binPROGRAMS uninstall-hook \ uninstall-libLTLIBRARIES .PRECIOUS: Makefile install-exec-hook: cd $(DESTDIR)$(bindir) && ln -s -f ncbo ncdiff || (rm -f ncdiff && ln -s -f ncbo ncdiff) cd $(DESTDIR)$(bindir) && ln -s -f ncra ncea || (rm -f ncea && ln -s -f ncra ncea) cd $(DESTDIR)$(bindir) && ln -s -f ncra nces || (rm -f nces && ln -s -f ncra nces) cd $(DESTDIR)$(bindir) && ln -s -f ncra ncrcat || (rm -f ncrcat && ln -s -f ncra ncrcat) @ENABLE_MPI_TRUE@ cd $(DESTDIR)$(bindir) && ln -s -f mpncbo mpncdiff || (rm -f mpncdiff && ln -s -f mpncbo mpncdiff) @ENABLE_MPI_TRUE@ cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpncea || (rm -f mpncea && ln -s -f mpncra mpncea) @ENABLE_MPI_TRUE@ cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpnces || (rm -f mpnces && ln -s -f mpncra mpnces) @ENABLE_MPI_TRUE@ cd $(DESTDIR)$(bindir) && ln -s -f mpncra mpncrcat || (rm -f mpncrcat && ln -s -f mpncra mpncrcat) uninstall-hook: cd $(DESTDIR)$(bindir) && rm -f ncdiff ncea nces ncrcat mpncdiff mpncea mpnces mpncrcat # 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: nco-4.5.4/src/nco/libnco.h000066400000000000000000000053761264355130400153060ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF Operator (NCO) library */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Most libnco.h headers depend on netcdf.h and nco_netcdf.h headers */ /* Usage: #include "libnco.h" *//* netCDF Operator (NCO) library */ #ifndef LIBNCO_H /* Contents have not yet been inserted in current source file */ #define LIBNCO_H /* Core headers */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ #include "nco.h" /* netCDF Operator (NCO) definitions */ /* Library headers */ #include "nco_att_utl.h" /* Attribute utilities */ #include "nco_aux.h" /* Auxiliary coordinates */ #include "nco_bnr.h" /* Binary write utilities */ #include "nco_cln_utl.h" /* Calendar utilities */ #include "nco_cnf_dmn.h" /* Conform dimensions */ #include "nco_cnf_typ.h" /* Conform variable types */ #include "nco_cnk.h" /* Chunking */ #include "nco_cnv_arm.h" /* ARM conventions */ #include "nco_cnv_csm.h" /* CCM/CCSM/CF conventions */ #include "nco_ctl.h" /* Program flow control functions */ #include "nco_dbg.h" /* Debugging */ #include "nco_dmn_utl.h" /* Dimension utilities */ #include "nco_fl_utl.h" /* File manipulation */ #include "nco_grp_trv.h" /* Group traversal */ #include "nco_grp_utl.h" /* Group utilities */ #include "nco_lmt.h" /* Hyperslab limits */ #include "nco_lst_utl.h" /* List utilities */ #include "nco_md5.h" /* MD5 digests */ #include "nco_mmr.h" /* Memory management */ #include "nco_msa.h" /* Multi-slabbing algorithm */ #include "nco_mss_val.h" /* Missing value utilities */ #include "nco_omp.h" /* OpenMP utilities */ #include "nco_pck.h" /* Packing and unpacking variables */ #include "nco_ppc.h" /* Precision-Preserving Compression */ #include "nco_prn.h" /* Print variables, attributes, metadata */ #include "nco_rec_var.h" /* Record variable utilities */ #include "nco_rgr.h" /* Regridding */ #include "nco_rth_flt.h" /* Float-precision arithmetic, MSVC macros */ #include "nco_rth_utl.h" /* Arithmetic controls and utilities */ #include "nco_scl_utl.h" /* Scalar utilities */ #include "nco_scm.h" /* Software configuration management */ #include "nco_sld.h" /* Swath-Like Data */ #include "nco_sng_utl.h" /* String utilities */ #include "nco_srm.h" /* Streams */ #include "nco_var_avg.h" /* Average variables */ #include "nco_uthash.h" /* Hash table functionality */ #include "nco_var_lst.h" /* Variable list utilities */ #include "nco_var_rth.h" /* Variable arithmetic */ #include "nco_var_scv.h" /* Arithmetic between variables and scalar values */ #include "nco_var_utl.h" /* Variable utilities */ #endif /* LIBNCO_H */ nco-4.5.4/src/nco/mpncbo.c000066400000000000000000001464751264355130400153170ustar00rootroot00000000000000/* $Header$ */ /* mpncbo -- netCDF binary operator */ /* Purpose: Compute sum, difference, product, or ratio of specified hyperslabs of specfied variables from two input netCDF files and output them to a single file. */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: mpncbo -O -p ~/nco/data in.nc in.nc ~/foo.nc mpncbo -O -v mss_val in.nc in.nc ~/foo.nc mpncbo -p /data/zender/tmp h0001.nc ~/foo.nc mpncbo -p /data/zender/tmp -l /data/zender/tmp/rmt h0001.nc h0002.nc ~/foo.nc mpncbo -p /ZENDER/tmp -l /data/zender/tmp/rmt h0001.nc h0002.nc ~/foo.nc mpncbo -p /ZENDER/tmp -l /usr/tmp/zender h0001.nc h0002.nc ~/foo.nc Test type conversion: ncks -O -C -v float_var in.nc foo1.nc ncrename -v float_var,double_var foo1.nc ncks -O -C -v double_var in.nc foo2.nc mpncbo -O -C -v double_var foo1.nc foo2.nc foo3.nc mpncbo -O -C -v double_var foo2.nc foo1.nc foo4.nc ncks -H -m foo1.nc ncks -H -m foo2.nc ncks -H -m foo3.nc ncks -H -m foo4.nc Test nco_var_cnf_dmn: ncks -O -v scalar_var in.nc ~/foo.nc ; ncrename -v scalar_var,four_dmn_rec_var foo.nc ; mpncbo -O -v four_dmn_rec_var in.nc ~/foo.nc foo2.nc */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in_1=NULL; /* fl_in_1 is nco_realloc'd when not NULL */ char *fl_in_2=NULL; /* fl_in_2 is nco_realloc'd when not NULL */ char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL; /* MPI CEWI */ char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *nco_op_typ_sng=NULL; /* [sng] Operation type */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:FhL:l:Oo:p:rRSt:v:X:xy:-:"; cnk_dmn_sct **cnk_dmn=NULL_CEWI; #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.MRV_flg=False,.flg_ddra=False,.lmn_nbr=0LL,.lmn_nbr_avg=0LL,.lmn_nbr_wgt=0LL,.nco_op_typ=nco_op_nil,.rnk_avg=0,.rnk_var=0,.rnk_wgt=0,.tmr_flg=nco_tmr_srt,.var_idx=0,.wgt_brd_flg=False,.wrd_sz=0}; #endif /* !__cplusplus */ dmn_sct **dim_1; dmn_sct **dim_2; dmn_sct **dmn_out; extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ int *in_id_1_arr; int *in_id_2_arr; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt_1; /* [enm] Input file format */ int fl_in_fmt_2; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx; int jdx; int dmn_idx; int dmn_jdx; int in_id_1; int in_id_2; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl_1; int nbr_dmn_fl_2; int nbr_dmn_xtr_1; int nbr_dmn_xtr_2; int nbr_var_fix_1; /* nbr_var_fix_1 gets incremented */ int nbr_var_fix_2; /* nbr_var_fix_2 gets incremented */ int nbr_var_fl_1; int nbr_var_fl_2; int nbr_var_prc_1; /* nbr_var_prc_1 gets incremented */ int nbr_var_prc_2; /* nbr_var_prc_2 gets incremented */ int xtr_nbr_1=0; /* xtr_nbr_1 won't otherwise be set for -c with no -v */ int xtr_nbr_2=0; /* xtr_nbr_2 won't otherwise be set for -c with no -v */ int nco_op_typ=nco_op_nil; /* [enm] Operation type */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **aux=NULL_CEWI; /* Auxiliary coordinate limits */ lmt_sct **lmt=NULL_CEWI; lmt_all_sct **lmt_all_lst=NULL_CEWI; /* List of *lmt_all structures */ nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FILE_1_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FILE_2_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order*/ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */ nm_id_sct *dmn_lst_1; nm_id_sct *dmn_lst_2; nm_id_sct *xtr_lst_1=NULL; /* xtr_lst_1 may be alloc()'d from NULL with -c option */ nm_id_sct *xtr_lst_2=NULL; /* xtr_lst_2 may be alloc()'d from NULL with -c option */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var_1; var_sct **var_2; var_sct **var_fix_1; var_sct **var_fix_2; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc_1; var_sct **var_prc_2; var_sct **var_prc_out; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length CEWI */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"ddra",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"mdl_cmp",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"operation",required_argument,0,'y'}, {"op_typ",required_argument,0,'y'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&prc_nbr); MPI_Comm_rank(MPI_COMM_WORLD,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* The debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr_1=xtr_nbr_2=var_lst_in_nbr; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case 'y': /* User-specified operation type overrides invocation default */ nco_op_typ_sng=(char *)strdup(optarg); nco_op_typ=nco_op_typ_get(nco_op_typ_sng); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_1_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); in_id_2_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filenames */ fl_idx=0; /* Input file _1 */ fl_in_1=nco_fl_nm_prs(fl_in_1,fl_idx,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_1); /* Make sure file is on local system and is readable or die trying */ fl_in_1=nco_fl_mk_lcl(fl_in_1,fl_pth_lcl,&FILE_1_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_1_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_1); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_2); /* Make sure file is on local system and is readable or die trying */ fl_in_2=nco_fl_mk_lcl(fl_in_2,fl_pth_lcl,&FILE_2_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_2_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_2); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx 0){ int aux_idx_nbr; aux=nco_aux_evl(in_id_1,aux_nbr,aux_arg,&aux_idx_nbr); if(aux_idx_nbr > 0){ lmt=(lmt_sct **)nco_realloc(lmt,(lmt_nbr+aux_idx_nbr)*sizeof(lmt_sct *)); int lmt_nbr_new=lmt_nbr+aux_idx_nbr; int aux_idx=0; for(int lmt_idx=lmt_nbr;lmt_idx2 ordering, may occasionally find xtr_nbr_2 > xtr_nbr_1 This occurs, e.g., when fl_in_1 contains reduced variables and full coordinates are only in fl_in_2 and so will not appear xtr_lst_1 */ /* Sort extraction list by variable ID for fastest I/O */ if(xtr_nbr_1 > 1) xtr_lst_1=nco_lst_srt_nm_id(xtr_lst_1,xtr_nbr_1,False); if(xtr_nbr_2 > 1) xtr_lst_2=nco_lst_srt_nm_id(xtr_lst_2,xtr_nbr_2,False); /* We now have final list of variables to extract. Phew. */ /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_all_mrg(dmn_out,nbr_dmn_xtr_1,lmt_all_lst,nbr_dmn_fl_1); if(nco_dbg_lvl >= nco_dbg_sbr){ for(idx=0;idxnm,dmn_out[jdx]->nm)){ /* NB: Copy new dim data but do NOT free original as dimension element is aliased in var_2 array */ (void)nco_dmn_cpy(dim_2[idx],dmn_out[jdx]); break; } /* endif */ /* Dimension not found so die gracefully */ if(jdx==nbr_dmn_xtr_1){ (void)fprintf(fp_stdout,"%s: ERROR dimension \"%s\" in second file %s is not present in first file %s\n",nco_prg_nm,dim_2[idx]->nm,fl_in_2,fl_in_1); nco_exit(EXIT_FAILURE); } /* endif dimension not found */ } /* end loop over dimensions */ /* Refresh var_2 with the new dim_2 data */ (void)nco_var_dmn_refresh(var_2,xtr_nbr_2); /* Divide variable lists into lists of fixed variables and variables to be processed Create lists from file_1 last so those values remain in *_out arrays */ (void)nco_var_lst_dvd(var_2,var_out,xtr_nbr_2,CNV_CCM_CCSM_CF,True,nco_pck_plc_nil,nco_pck_map_nil,(dmn_sct **)NULL,0,&var_fix_2,&var_fix_out,&nbr_var_fix_2,&var_prc_2,&var_prc_out,&nbr_var_prc_2); /* Avoid double-free() condition */ var_fix_out=(var_sct **)nco_free(var_fix_out); var_prc_out=(var_sct **)nco_free(var_prc_out); (void)nco_var_lst_dvd(var_1,var_out,xtr_nbr_1,CNV_CCM_CCSM_CF,True,nco_pck_plc_nil,nco_pck_map_nil,(dmn_sct **)NULL,0,&var_fix_1,&var_fix_out,&nbr_var_fix_1,&var_prc_1,&var_prc_out,&nbr_var_prc_1); /* Die gracefully on unsupported features... */ if(nbr_var_fix_1 < nbr_var_fix_2){ (void)fprintf(fp_stdout,"%s: ERROR First file has fewer fixed variables than second file (%d < %d). This feature is TODO nco581.\n",nco_prg_nm,nbr_var_fix_1,nbr_var_fix_2); nco_exit(EXIT_FAILURE); } /* endif */ /* Merge two variable lists into same order */ rcd=nco_var_lst_mrg(&var_prc_1,&var_prc_2,&nbr_var_prc_1,&nbr_var_prc_2); /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt_1; /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* 20101019 fxm got to here merging ncbo 4.0.5 into mpncbo */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr_1); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt_1; /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Copy global attributes */ (void)nco_att_cpy(in_id_1,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in_1,in_id_1,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ /* Define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_xtr_1); /* fxm: TODO 550 put max_dim_sz/list(var_1,var_2) into var_def(var_out) */ /* Define variables in output file, copy their attributes */ (void)nco_var_dfn(in_id_1,fl_out,out_id,var_out,xtr_nbr_1,(dmn_sct **)NULL,(int)0,nco_pck_plc_nil,nco_pck_map_nil,dfl_lvl); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl_1,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,rnk_mgr,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,rnk_mgr,MPI_COMM_WORLD); if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ (void)nco_msa_var_val_cpy(in_id_1,out_id,var_fix_1,nbr_var_fix_1,lmt_all_lst,nbr_dmn_fl_1); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* ncbo() code has been similar to nces() (and ncra()) wherever possible Major differences occur where performance would otherwise suffer From now on, however, binary-file and binary-operation nature of ncbo() is too different from nces() paradigm to justify following nces() style. Instead, we adopt symmetric nomenclature (e.g., file_1, file_2), and perform differences variable-by-variable so peak memory usage goes as Order(2*maximum variable size) rather than Order(3*maximum record size) or Order(3*file size) */ /* Perform various error-checks on input file */ if(False) (void)nco_fl_cmp_err_chk(); /* Default operation depends on invocation name */ if(nco_op_typ_sng == NULL) nco_op_typ=nco_op_typ_get(nco_op_typ_sng); /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ /* Compensate for incrementing on each worker's first message */ var_wrt_nbr=-prc_nbr+1; idx=0; /* While variables remain to be processed or written... */ while(var_wrt_nbr < nbr_var_prc_1){ /* Receive message from any worker */ MPI_Recv(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&mpi_stt); /* Obtain MPI message tag type */ msg_tag_typ=mpi_stt.MPI_TAG; /* Get sender's prc_rnk */ rnk_wrk=wrk_id_bfr[0]; /* Allocate next variable, if any, to worker */ if(msg_tag_typ == msg_tag_wrk_rqs){ var_wrt_nbr++; /* [nbr] Number of variables written */ /* Worker closed output file before sending msg_tag_wrk_rqs */ TKN_WRT_FREE=True; if(idx < nbr_var_prc_1){ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; }else{ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); /* msg_tag_typ != msg_tag_wrk_rqs */ }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc_1 */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,0,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ var_prc_out[idx]->id=msg_bfr[2]; /* Process this variable same as UP code */ #else /* !ENABLE_MPI */ #ifdef _OPENMP /* OpenMP notes: shared(): msk and wgt are not altered within loop private(): wgt_avg does not need initialization */ #pragma omp parallel for default(none) firstprivate(ddra_info) private(idx,in_id_1,in_id_2,dmn_idx,dmn_jdx) shared(nco_dbg_lvl,dim_1,fl_in_1,fl_in_2,fl_out,flg_ddra,in_id_1_arr,in_id_2_arr,nbr_dmn_xtr_1,nbr_var_prc_1,nbr_var_prc_2,nco_op_typ,out_id,nco_prg_nm,rcd,var_prc_1,var_prc_2,var_prc_out,lmt_all_lst,nbr_dmn_fl_1) #endif /* !_OPENMP */ /* UP and SMP codes main loop over variables */ for(idx=0;idx= nco_dbg_var) (void)fprintf(fp_stderr,"%s, ",var_prc_1[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); in_id_1=in_id_1_arr[omp_get_thread_num()]; in_id_2=in_id_2_arr[omp_get_thread_num()]; (void)nco_var_mtd_refresh(in_id_1,var_prc_1[idx]); has_mss_val=var_prc_1[idx]->has_mss_val; (void)nco_msa_var_get(in_id_1,var_prc_1[idx],lmt_all_lst,nbr_dmn_fl_1); /* Find and set variable dmn_nbr, ID, mss_val, type in second file */ (void)nco_var_mtd_refresh(in_id_2,var_prc_2[idx]); /* Read hyperslab from second file */ (void)nco_msa_var_get(in_id_2,var_prc_2[idx],lmt_all_lst,nbr_dmn_fl_1); /* Check that all dims in var_prc_2 are in var_prc_1 */ for(dmn_idx=0;dmn_idxnbr_dim;dmn_idx++){ for(dmn_jdx=0;dmn_jdxnbr_dim;dmn_jdx++) if(!strcmp(var_prc_2[idx]->dim[dmn_idx]->nm,var_prc_1[idx]->dim[dmn_jdx]->nm)) break; if(dmn_jdx==var_prc_1[idx]->nbr_dim){ (void)fprintf(fp_stdout,"%s: ERROR Variables do not conform:\nFile %s variable %s has dimension %s not present in file %s variable %s\n",nco_prg_nm,fl_in_2,var_prc_2[idx]->nm, var_prc_2[idx]->dim[dmn_idx]->nm,fl_in_1,var_prc_1[idx]->nm); nco_exit(EXIT_FAILURE); } /* endif error */ } /* end loop over idx */ /* Die gracefully on unsupported features... */ if(var_prc_1[idx]->nbr_dim < var_prc_2[idx]->nbr_dim){ (void)fprintf(fp_stdout,"%s: ERROR Variable %s has lesser rank in first file than in second file (%d < %d). This feature is NCO TODO 552.\n",nco_prg_nm,var_prc_1[idx]->nm,var_prc_1[idx]->nbr_dim,var_prc_2[idx]->nbr_dim); nco_exit(EXIT_FAILURE); } /* endif */ if(var_prc_1[idx]->nbr_dim > var_prc_2[idx]->nbr_dim) (void)ncap_var_cnf_dmn(&var_prc_out[idx],&var_prc_2[idx]); /* var2 now conforms in size to var1, and is in memory */ /* fxm: TODO 268 allow var1 or var2 to typecast */ /* Make sure var2 conforms to type of var1 */ if(var_prc_1[idx]->type != var_prc_2[idx]->type){ if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(fp_stderr,"%s: INFO Input variables do not conform in type:\nFile 1 = %s variable %s has type %s\nFile 2 = %s variable %s has type %s\nFile 3 = %s variable %s will have type %s\n",nco_prg_nm,fl_in_1,var_prc_1[idx]->nm,nco_typ_sng(var_prc_1[idx]->type),fl_in_2,var_prc_2[idx]->nm,nco_typ_sng(var_prc_2[idx]->type),fl_out,var_prc_1[idx]->nm,nco_typ_sng(var_prc_1[idx]->type)); } /* endif different type */ var_prc_2[idx]=nco_var_cnf_typ(var_prc_1[idx]->type,var_prc_2[idx]); /* Change missing_value of var_prc_2, if any, to missing_value of var_prc_1, if any */ has_mss_val=nco_mss_val_cnf(var_prc_1[idx],var_prc_2[idx]); /* mss_val in fl_1, if any, overrides mss_val in fl_2 */ if(has_mss_val) mss_val=var_prc_1[idx]->mss_val; /* Perform specified binary operation */ switch(nco_op_typ){ case nco_op_add: /* [enm] Add file_1 to file_2 */ (void)nco_var_add(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,mss_val,var_prc_2[idx]->val,var_prc_1[idx]->val); break; case nco_op_mlt: /* [enm] Multiply file_1 by file_2 */ (void)nco_var_mlt(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,mss_val,var_prc_2[idx]->val,var_prc_1[idx]->val); break; case nco_op_dvd: /* [enm] Divide file_1 by file_2 */ (void)nco_var_dvd(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,mss_val,var_prc_2[idx]->val,var_prc_1[idx]->val); break; case nco_op_sbt: /* [enm] Subtract file_2 from file_1 */ (void)nco_var_sbt(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,mss_val,var_prc_2[idx]->val,var_prc_1[idx]->val); break; default: /* Other defined nco_op_typ values are valid for ncra(), ncrcat(), ncwa(), not ncbo() */ (void)fprintf(fp_stdout,"%s: ERROR Illegal nco_op_typ in binary operation\n",nco_prg_nm); nco_exit(EXIT_FAILURE); break; } /* end case */ var_prc_2[idx]->val.vp=nco_free(var_prc_2[idx]->val.vp); #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl_1,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* !_OPENMP */ #endif /* !ENABLE_MPI */ /* Common code for UP, SMP, and MPI */ { /* begin OpenMP critical */ /* Copy result to output file and free workspace buffer */ if(var_prc_1[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_1[idx]->val.vp,var_prc_1[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_1[idx]->val.vp,var_prc_1[idx]->type); } /* end else */ } /* end OpenMP critical */ var_prc_1[idx]->val.vp=nco_free(var_prc_1[idx]->val.vp); if(flg_ddra){ /* DDRA diagnostics Usage: ncbo -O -C --mdl -p ~/nco/data in.nc in.nc ~/foo.nc ncbo -O -C --mdl -p ${DATA}/nco_bm stl_5km.nc stl_5km.nc ~/foo.nc ncbo -O -C --mdl -p ${DATA}/nco_bm gcm_T85.nc gcm_T85.nc ~/foo.nc */ /* Assign remaining input for DDRA diagnostics */ ddra_info.lmn_nbr=var_prc_1[idx]->sz; /* [nbr] Variable size */ ddra_info.nco_op_typ=nco_op_typ; /* [enm] Operation type */ ddra_info.rnk_var=var_prc_1[idx]->nbr_dim; /* I [nbr] Variable rank (in input file) */ ddra_info.var_idx=idx; /* [enm] Index */ ddra_info.wrd_sz=nco_typ_lng(var_prc_1[idx]->type); /* [B] Bytes per element */ /* DDRA diagnostics */ rcd+=nco_ddra /* [fnc] Count operations */ (var_prc_1[idx]->nm, /* I [sng] Variable name */ (char *)NULL, /* I [sng] Weight name */ &ddra_info); /* I [sct] DDRA information */ } /* !flg_ddra */ #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end else !idx_all_wrk_ass */ } /* end while loop requesting work/token */ } /* endif Worker */ #else /* !ENABLE_MPI */ } /* end (OpenMP parallel for) loop over idx */ #endif /* !ENABLE_MPI */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Close input netCDF files */ for(thr_idx=0;thr_idxlmt_dmn_nbr;jdx++) lmt_all_lst[idx]->lmt_dmn[jdx]=nco_lmt_free(lmt_all_lst[idx]->lmt_dmn[jdx]); if(nbr_dmn_fl_1 > 0) lmt_all_lst=nco_lmt_all_lst_free(lmt_all_lst,nbr_dmn_fl_1); lmt=(lmt_sct**)nco_free(lmt); if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_1_arr) in_id_1_arr=(int *)nco_free(in_id_1_arr); if(in_id_2_arr) in_id_2_arr=(int *)nco_free(in_id_2_arr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) aux=(lmt_sct **)nco_free(aux); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr_1 > 0) dim_1=nco_dmn_lst_free(dim_1,nbr_dmn_xtr_1); if(nbr_dmn_xtr_2 > 0) dim_2=nco_dmn_lst_free(dim_2,nbr_dmn_xtr_2); if(nbr_dmn_xtr_1 > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_xtr_1); /* Free variable lists Using nco_var_lst_free() to free main var_1 and var_2 lists would fail if ncap_var_prc_dmn() had to broadcast any variables because pointer var_1 and var_2 still contain dangling pointer to old variable. Hence, use nco_var_lst_free() to free prc and fix lists and use nco_free() to free main var_1 and var_2 lists. Dangling pointers in var_1 and var_2 are unsafe: fxm TODO 578 */ if(nbr_var_prc_1 > 0) var_prc_1=nco_var_lst_free(var_prc_1,nbr_var_prc_1); if(nbr_var_fix_1 > 0) var_fix_1=nco_var_lst_free(var_fix_1,nbr_var_fix_1); if(nbr_var_prc_2 > 0) var_prc_2=nco_var_lst_free(var_prc_2,nbr_var_prc_2); if(nbr_var_fix_2 > 0) var_fix_2=nco_var_lst_free(var_fix_2,nbr_var_fix_2); var_1=(var_sct **)nco_free(var_1); var_2=(var_sct **)nco_free(var_2); if(xtr_nbr_1 > 0) var_out=nco_var_lst_free(var_out,xtr_nbr_1); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix_out=(var_sct **)nco_free(var_fix_out); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ /* End timer */ ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/mpncecat.c000066400000000000000000001252041264355130400156160ustar00rootroot00000000000000/* $Header$ */ /* ncecat -- netCDF ensemble concatenator */ /* Purpose: Join variables across files into a new record variable */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL; /* MPI CEWI */ char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *rec_dmn_nm=NULL; /* [sng] New record dimension name */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:FHhL:l:n:Oo:p:rRSt:u:v:X:x-:"; cnk_dmn_sct **cnk_dmn=NULL_CEWI; dmn_sct *rec_dmn; dmn_sct **dim; dmn_sct **dmn_out; extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ int *in_id_arr; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx; int jdx; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_dmn_xtr; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int rec_dmn_id=NCO_REC_DMN_UNDEFINED; int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **aux=NULL_CEWI; /* Auxiliary coordinate limits */ lmt_sct **lmt; lmt_all_sct **lmt_all_lst; /* List of *lmt_all structures */ long idx_rec_out=0L; /* idx_rec_out gets incremented */ nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_APPEND=True; /* Option H */ nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nm_id_sct *dmn_lst; nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc; var_sct **var_prc_out; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ MPI_Info mpi_nfo=MPI_INFO_NULL; /* [sct] File geometry hints */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"fl_lst_in",no_argument,0,'H'}, {"file_list",no_argument,0,'H'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"nintap",required_argument,0,'n'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"ulm_nm",required_argument,0,'u'}, {"rcd_nm",required_argument,0,'u'}, {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start clock and save command line */ cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'H': /* Toggle writing input file list attribute */ FL_LST_IN_APPEND=!FL_LST_IN_APPEND; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'n': /* NINTAP-style abbreviation of files to process */ fl_lst_abb=nco_lst_prs_2D(optarg,",",&abb_arg_nbr); if(abb_arg_nbr < 1 || abb_arg_nbr > 6){ (void)fprintf(stdout,"%s: ERROR Incorrect abbreviation for file list\n",nco_prg_nm); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'u': /* New record dimension name */ rec_dmn_nm=(char *)strdup(optarg); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); /* Parse auxiliary coordinates */ if(aux_nbr > 0){ int aux_idx_nbr; aux=nco_aux_evl(in_id,aux_nbr,aux_arg,&aux_idx_nbr); if(aux_idx_nbr > 0){ lmt=(lmt_sct **)nco_realloc(lmt,(lmt_nbr+aux_idx_nbr)*sizeof(lmt_sct *)); int lmt_nbr_new=lmt_nbr+aux_idx_nbr; int aux_idx=0; for(int lmt_idx=lmt_nbr;lmt_idx 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* We now have final list of variables to extract. Phew. */ /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_mrg(dim,nbr_dmn_xtr,lmt,lmt_nbr); /* Duplicate input dimension structures for output dimension structures */ dmn_out=(dmn_sct **)nco_malloc(nbr_dmn_xtr*sizeof(dmn_sct *)); for(idx=0;idx 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ /* Add input file list global attribute */ if(FL_LST_IN_APPEND && HISTORY_APPEND && FL_LST_IN_FROM_STDIN) (void)nco_fl_lst_att_cat(out_id,fl_lst_in,fl_nbr); #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* ncecat-specific operations */ if(True){ /* Always construct new "record" dimension from scratch */ rec_dmn=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); if(rec_dmn_nm == NULL) rec_dmn->nm=rec_dmn_nm=(char *)strdup("record"); else rec_dmn->nm=rec_dmn_nm; rec_dmn->id=-1; rec_dmn->nc_id=-1; rec_dmn->xrf=NULL; rec_dmn->val.vp=NULL; rec_dmn->is_crd_dmn=False; rec_dmn->is_rec_dmn=True; rec_dmn->sz=0L; rec_dmn->cnt=0L; rec_dmn->srd=0L; rec_dmn->srt=0L; rec_dmn->end=rec_dmn->sz-1L; /* Change existing record dimension, if any, to regular dimension */ for(idx=0;idxis_rec_dmn){ dmn_out[idx]->is_rec_dmn=False; break; } /* end if */ } /* end loop over idx */ /* Add record dimension to end of dimension list */ nbr_dmn_xtr++; dmn_out=(dmn_sct **)nco_realloc(dmn_out,nbr_dmn_xtr*sizeof(dmn_sct **)); dmn_out[nbr_dmn_xtr-1]=rec_dmn; } /* end if */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_xtr); #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ if(True){ /* Prepend record dimension to beginning of all vectors for processed variables */ for(idx=0;idxnbr_dim++; var_prc_out[idx]->is_rec_var=True; var_prc_out[idx]->sz_rec=var_prc_out[idx]->sz; /* Allocate space to hold dimension IDs */ var_prc_out[idx]->dim=(dmn_sct **)nco_realloc(var_prc_out[idx]->dim,var_prc_out[idx]->nbr_dim*sizeof(dmn_sct *)); var_prc_out[idx]->dmn_id=(int *)nco_realloc(var_prc_out[idx]->dmn_id,var_prc_out[idx]->nbr_dim*sizeof(int)); var_prc_out[idx]->cnt=(long *)nco_realloc(var_prc_out[idx]->cnt,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->end=(long *)nco_realloc(var_prc_out[idx]->end,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->srd=(long *)nco_realloc(var_prc_out[idx]->srd,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->srt=(long *)nco_realloc(var_prc_out[idx]->srt,var_prc_out[idx]->nbr_dim*sizeof(long int)); /* Move current array by one to make room for new record dimension info */ (void)memmove((void *)(var_prc_out[idx]->dim+1),(void *)(var_prc_out[idx]->dim),(var_prc_out[idx]->nbr_dim-1)*sizeof(dmn_sct *)); (void)memmove((void *)(var_prc_out[idx]->dmn_id+1),(void *)(var_prc_out[idx]->dmn_id),(var_prc_out[idx]->nbr_dim-1)*sizeof(int)); (void)memmove((void *)(var_prc_out[idx]->cnt+1),(void *)(var_prc_out[idx]->cnt),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->end+1),(void *)(var_prc_out[idx]->end),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->srd+1),(void *)(var_prc_out[idx]->srd),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->srt+1),(void *)(var_prc_out[idx]->srt),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); /* Insert value for new record dimension */ var_prc_out[idx]->dim[0]=rec_dmn; var_prc_out[idx]->dmn_id[0]=rec_dmn->id; var_prc_out[idx]->cnt[0]=1L; var_prc_out[idx]->end[0]=-1L; var_prc_out[idx]->srd[0]=-1L; var_prc_out[idx]->srt[0]=-1L; } /* end loop over idx */ } /* end if */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Define variables in output file, copy their attributes */ (void)nco_var_dfn(in_id,fl_out,out_id,var_out,xtr_nbr,(dmn_sct **)NULL,(int)0,nco_pck_plc_nil,nco_pck_map_nil,dfl_lvl); #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,0,mpi_cmm); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,0,mpi_cmm); if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Close first input netCDF file */ (void)nco_close(in_id); /* Loop over input files */ for(fl_idx=0;fl_idx= nco_dbg_fl) (void)fprintf(fp_stderr,"\nInput file %d is %s; ",fl_idx,fl_in); /* Make sure file is on local system and is readable or die trying */ if(fl_idx != 0) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(fp_stderr,"local file %s:\n",fl_in); /* Open file once per thread to improve caching */ for(thr_idx=0;thr_idx nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,mpi_cmm); /* msg_tag_typ != msg_tag_wrk_rqs */ }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,mpi_cmm); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,mpi_cmm); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,0,msg_tag_wrk_rsp,mpi_cmm,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ var_prc_out[idx]->id=msg_bfr[2]; /* Process this variable same as UP code */ #else /* !ENABLE_MPI */ /* OpenMP with threading over variables, not files */ #ifdef _OPENMP #pragma omp parallel for default(none) private(idx,in_id) shared(nco_dbg_lvl,fl_nbr,idx_rec_out,in_id_arr,nbr_var_prc,out_id,var_prc,var_prc_out,lmt_all_lst,nbr_dmn_fl,jdx) #endif /* !_OPENMP */ /* Process all variables in current file */ for(idx=0;idx= nco_dbg_var) (void)fprintf(fp_stderr,"%s, ",var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Variables may have different ID, missing_value, type, in each file */ (void)nco_var_mtd_refresh(in_id,var_prc[idx]); /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); /* Size of record dimension is 1 in output file */ var_prc_out[idx]->cnt[0]=1L; var_prc_out[idx]->srt[0]=idx_rec_out; #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,mpi_cmm); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,mpi_cmm,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* _OPENMP */ #endif /* !ENABLE_MPI */ { /* begin OpenMP critical */ /* Write variable into current record in output file */ if(var_prc[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc[idx]->val.vp,var_prc[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc[idx]->val.vp,var_prc[idx]->type); } /* end if variable is array */ /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); } /* end OpenMP critical */ #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end else !idx_all_wrk_ass */ } /* end while loop requesting work/token */ } /* endif Worker */ #else /* !ENABLE_MPI */ } /* end (OpenMP parallel for) loop over idx */ #endif /* !ENABLE_MPI */ idx_rec_out++; /* [idx] Index of current record in output file (0 is first, ...) */ if(nco_dbg_lvl > nco_dbg_scl) (void)fprintf(stderr,"\n"); /* Close input netCDF file */ for(thr_idx=0;thr_idxlmt_dmn_nbr;jdx++) lmt_all_lst[idx]->lmt_dmn[jdx]=nco_lmt_free(lmt_all_lst[idx]->lmt_dmn[jdx]); lmt=(lmt_sct**)nco_free(lmt); if(nbr_dmn_fl > 0) lmt_all_lst=nco_lmt_all_lst_free(lmt_all_lst,nbr_dmn_fl); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_arr) in_id_arr=(int *)nco_free(in_id_arr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) aux=(lmt_sct **)nco_free(aux); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr-1); /* NB: ncecat has one fewer input than output dimension */ if(nbr_dmn_xtr > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_xtr); /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/mpncflint.c000066400000000000000000001341511264355130400160170ustar00rootroot00000000000000/* $Header$ */ /* mpncflint -- netCDF file interpolator */ /* Purpose: Linearly interpolate a third netCDF file from two input files */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncflint -O -D 2 in.nc in.nc ~/foo.nc ncflint -O -i lcl_time_hr,9.0 -v lcl_time_hr /data/zender/arese/clm/951030_0800_arese_clm.nc /data/zender/arese/clm/951030_1100_arese_clm.nc ~/foo.nc; ncks -H foo.nc ncflint -O -w 0.66666,0.33333 -v lcl_time_hr /data/zender/arese/clm/951030_0800_arese_clm.nc /data/zender/arese/clm/951030_1100_arese_clm.nc ~/foo.nc; ncks -H foo.nc ncflint -O -w 0.66666 -v lcl_time_hr /data/zender/arese/clm/951030_0800_arese_clm.nc /data/zender/arese/clm/951030_1100_arese_clm.nc ~/foo.nc; ncks -H foo.nc ncdiff -O foo.nc /data/zender/arese/clm/951030_0900_arese_clm.nc foo2.nc;ncks -H foo2.nc | m */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #ifdef ENABLE_MPI #include /* MPI definitions */ #include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ #include /* netCDF definitions and C library */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **ntp_lst_in; char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in_1=NULL; /* fl_in_1 is nco_realloc'd when not NULL */ char *fl_in_2=NULL; /* fl_in_2 is nco_realloc'd when not NULL */ char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL; /* MPI CEWI */ char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *ntp_nm=NULL; /* Option i */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:Fhi:L:l:Oo:p:rRSt:v:xw:-:"; cnk_dmn_sct **cnk_dmn=NULL_CEWI; dmn_sct **dim; dmn_sct **dmn_out; double ntp_val_out=double_CEWI; /* Option i */ double wgt_val_1=0.5; /* Option w */ double wgt_val_2=0.5; /* Option w */ extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ int *in_id_1_arr; int *in_id_2_arr; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt_1; /* [enm] Input file format */ int fl_in_fmt_2; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int has_mss_val=False; int idx; int jdx; int in_id_1; int in_id_2; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_dmn_xtr; int nbr_ntp; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **aux=NULL_CEWI; /* Auxiliary coordinate limits */ lmt_sct **lmt; lmt_all_sct **lmt_all_lst; /* List of *lmt_all structures */ nco_bool CNV_CCM_CCSM_CF; nco_bool CMD_LN_NTP_VAR=False; /* Option i */ nco_bool CMD_LN_NTP_WGT=True; /* Option w */ nco_bool DO_CONFORM=False; /* Did nco_var_cnf_dmn() find truly conforming variables? */ nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FILE_1_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FILE_2_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order*/ nco_bool MUST_CONFORM=False; /* Must nco_var_cnf_dmn() find truly conforming variables? */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nm_id_sct *dmn_lst; nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ val_unn val_gnr_unn; /* Generic container for arrival point or weight */ var_sct *wgt_1=NULL_CEWI; var_sct *wgt_2=NULL_CEWI; var_sct *wgt_out_1=NULL; var_sct *wgt_out_2=NULL; var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc_1; var_sct **var_prc_2; var_sct **var_prc_out; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"interpolate",required_argument,0,'i'}, {"ntp",required_argument,0,'i'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"thr_nbr",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"weight",required_argument,0,'w'}, {"wgt_var",no_argument,0,'w'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&prc_nbr); MPI_Comm_rank(MPI_COMM_WORLD,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start clock and save command line */ cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* The debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'i': /* Name of variable to guide interpolation. Default is none */ ntp_lst_in=nco_lst_prs_2D(optarg,",",&nbr_ntp); if(nbr_ntp > 2){ (void)fprintf(stdout,"%s: ERROR too many arguments to -i\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ ntp_nm=ntp_lst_in[0]; ntp_val_out=strtod(ntp_lst_in[1],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtod",sng_cnv_rcd); CMD_LN_NTP_VAR=True; CMD_LN_NTP_WGT=False; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'w': /* Weight(s) for interpolation. Default is wgt_val_1=wgt_val_2=0.5 */ ntp_lst_in=nco_lst_prs_2D(optarg,",",&nbr_ntp); if(nbr_ntp > 2){ (void)fprintf(stdout,"%s: ERROR too many arguments to -w\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); }else if(nbr_ntp == 2){ wgt_val_1=strtod(ntp_lst_in[0],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[0],"strtod",sng_cnv_rcd); wgt_val_2=strtod(ntp_lst_in[1],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[1],"strtod",sng_cnv_rcd); }else if(nbr_ntp == 1){ wgt_val_1=strtod(ntp_lst_in[0],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[0],"strtod",sng_cnv_rcd); wgt_val_2=1.0-wgt_val_1; } /* end else */ CMD_LN_NTP_WGT=True; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ if(CMD_LN_NTP_VAR && CMD_LN_NTP_WGT){ (void)fprintf(stdout,"%s: ERROR interpolating variable (-i) and fixed weight(s) (-w) both set\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); }else if(!CMD_LN_NTP_VAR && !CMD_LN_NTP_WGT){ (void)fprintf(stdout,"%s: ERROR interpolating variable (-i) or fixed weight(s) (-w) must be set\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end else */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_1_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); in_id_2_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filenames */ fl_idx=0; /* Input file _1 */ fl_in_1=nco_fl_nm_prs(fl_in_1,fl_idx,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\nInput file %d is %s; ",fl_idx,fl_in_1); /* Make sure file is on local system and is readable or die trying */ fl_in_1=nco_fl_mk_lcl(fl_in_1,fl_pth_lcl,&FILE_1_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"local file %s:\n",fl_in_1); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx= nco_dbg_fl) (void)fprintf(stderr,"\nInput file %d is %s; ",fl_idx,fl_in_2); /* Make sure file is on local system and is readable or die trying */ fl_in_2=nco_fl_mk_lcl(fl_in_2,fl_pth_lcl,&FILE_2_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"local file %s:\n",fl_in_2); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx 0){ int aux_idx_nbr; aux=nco_aux_evl(in_id_1,aux_nbr,aux_arg,&aux_idx_nbr); if(aux_idx_nbr > 0){ lmt=(lmt_sct **)nco_realloc(lmt,(lmt_nbr+aux_idx_nbr)*sizeof(lmt_sct *)); int lmt_nbr_new=lmt_nbr+aux_idx_nbr; int aux_idx=0; for(int lmt_idx=lmt_nbr;lmt_idx 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* We now have final list of variables to extract. Phew. */ /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_all_mrg(dmn_out,nbr_dmn_xtr,lmt_all_lst,nbr_dmn_fl); /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idx 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ /* Define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_xtr); /* Define variables in output file, copy their attributes */ (void)nco_var_dfn(in_id_1,fl_out,out_id,var_out,xtr_nbr,(dmn_sct **)NULL,(int)0,nco_pck_plc_nil,nco_pck_map_nil,dfl_lvl); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,0,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,0,MPI_COMM_WORLD); if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ (void)nco_msa_var_val_cpy(in_id_1,out_id,var_fix,nbr_var_fix,lmt_all_lst,nbr_dmn_fl); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Perform various error-checks on input file */ if(False) (void)nco_fl_cmp_err_chk(); /* ncflint-specific stuff: */ /* Find the weighting variable in input file */ if(CMD_LN_NTP_VAR){ int ntp_id_1; int ntp_id_2; var_sct *ntp_1; var_sct *ntp_2; var_sct *ntp_var_out; /* Turn arrival point into pseudo-variable */ val_gnr_unn.d=ntp_val_out; /* Generic container for arrival point or weight */ ntp_var_out=scl_mk_var(val_gnr_unn,NC_DOUBLE); rcd=nco_inq_varid(in_id_1,ntp_nm,&ntp_id_1); rcd=nco_inq_varid(in_id_2,ntp_nm,&ntp_id_2); ntp_1=nco_var_fll(in_id_1,ntp_id_1,ntp_nm,dim,nbr_dmn_xtr); ntp_2=nco_var_fll(in_id_2,ntp_id_2,ntp_nm,dim,nbr_dmn_xtr); /* Currently, only support scalar variables */ if(ntp_1->sz > 1 || ntp_2->sz > 1){ (void)fprintf(stdout,"%s: ERROR interpolation variable %s must be scalar\n",nco_prg_nm_get(),ntp_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Retrieve interpolation variable */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id_1,ntp_1); (void)nco_var_get(in_id_2,ntp_2); /* Weights must be NC_DOUBLE */ ntp_1=nco_var_cnf_typ((nc_type)NC_DOUBLE,ntp_1); ntp_2=nco_var_cnf_typ((nc_type)NC_DOUBLE,ntp_2); /* Check for degenerate case */ if(ntp_1->val.dp[0] == ntp_2->val.dp[0]){ (void)fprintf(stdout,"%s: ERROR Interpolation variable %s is identical (%g) in input files, therefore unable to interpolate.\n",nco_prg_nm_get(),ntp_nm,ntp_1->val.dp[0]); nco_exit(EXIT_FAILURE); } /* end if */ /* Turn weights into pseudo-variables */ wgt_1=nco_var_dpl(ntp_2); wgt_2=nco_var_dpl(ntp_var_out); /* Subtract to find interpolation distances */ (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_var_out->val,wgt_1->val); (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_1->val,wgt_2->val); (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_1->val,ntp_2->val); /* Normalize to obtain final interpolation weights */ (void)nco_var_dvd(wgt_1->type,wgt_1->sz,wgt_1->has_mss_val,wgt_1->mss_val,ntp_2->val,wgt_1->val); (void)nco_var_dvd(wgt_2->type,wgt_2->sz,wgt_2->has_mss_val,wgt_2->mss_val,ntp_2->val,wgt_2->val); if(ntp_1) ntp_1=nco_var_free(ntp_1); if(ntp_2) ntp_2=nco_var_free(ntp_2); if(ntp_var_out) ntp_var_out=nco_var_free(ntp_var_out); } /* end if CMD_LN_NTP_VAR */ if(CMD_LN_NTP_WGT){ val_gnr_unn.d=wgt_val_1; /* Generic container for arrival point or weight */ wgt_1=scl_mk_var(val_gnr_unn,NC_DOUBLE); val_gnr_unn.d=wgt_val_2; /* Generic container for arrival point or weight */ wgt_2=scl_mk_var(val_gnr_unn,NC_DOUBLE); } /* end if CMD_LN_NTP_WGT */ if(nco_dbg_lvl > nco_dbg_scl) (void)fprintf(stderr,"wgt_1 = %g, wgt_2 = %g\n",wgt_1->val.dp[0],wgt_2->val.dp[0]); /* Create structure list for second file */ var_prc_2=(var_sct **)nco_malloc(nbr_var_prc*sizeof(var_sct *)); /* Loop over each interpolated variable */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ /* Compensate for incrementing on each worker's first message */ var_wrt_nbr=-prc_nbr+1; idx=0; /* While variables remain to be processed or written... */ while(var_wrt_nbr < nbr_var_prc){ /* Receive message from any worker */ MPI_Recv(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&mpi_stt); /* Obtain MPI message tag type */ msg_tag_typ=mpi_stt.MPI_TAG; /* Get sender's prc_rnk */ rnk_wrk=wrk_id_bfr[0]; /* Allocate next variable, if any, to worker */ if(msg_tag_typ == msg_tag_wrk_rqs){ var_wrt_nbr++; /* [nbr] Number of variables written */ /* Worker closed output file before sending msg_tag_wrk_rqs */ TKN_WRT_FREE=True; if(idx > nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); /* msg_tag_typ != msg_tag_wrk_rqs */ }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,0,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ var_prc_out[idx]->id=msg_bfr[2]; /* Process this variable same as UP code */ #else /* !ENABLE_MPI */ #ifdef _OPENMP /* OpenMP notes: shared(): msk and wgt are not altered within loop private(): wgt_avg does not need initialization */ #pragma omp parallel for default(none) firstprivate(wgt_1,wgt_2,wgt_out_1,wgt_out_2) private(DO_CONFORM,idx,in_id_1,in_id_2,has_mss_val) shared(MUST_CONFORM,nco_dbg_lvl,dim,fl_in_1,fl_in_2,fl_out,in_id_1_arr,in_id_2_arr,nbr_dmn_xtr,nbr_var_prc,out_id,nco_prg_nm,var_prc_1,var_prc_2,var_prc_out,lmt_all_lst,nbr_dmn_fl) #endif /* !_OPENMP */ /* UP and SMP codes main loop over variables */ for(idx=0;idx= nco_dbg_var) (void)fprintf(fp_stderr,"%s, ",var_prc_1[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); in_id_1=in_id_1_arr[omp_get_thread_num()]; in_id_2=in_id_2_arr[omp_get_thread_num()]; var_prc_2[idx]=nco_var_dpl(var_prc_1[idx]); (void)nco_var_mtd_refresh(in_id_2,var_prc_2[idx]); /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_msa_var_get(in_id_1,var_prc_1[idx],lmt_all_lst,nbr_dmn_fl); (void)nco_msa_var_get(in_id_2,var_prc_2[idx],lmt_all_lst,nbr_dmn_fl); wgt_out_1=nco_var_cnf_dmn(var_prc_1[idx],wgt_1,wgt_out_1,MUST_CONFORM,&DO_CONFORM); wgt_out_2=nco_var_cnf_dmn(var_prc_2[idx],wgt_2,wgt_out_2,MUST_CONFORM,&DO_CONFORM); var_prc_1[idx]=nco_var_cnf_typ((nc_type)NC_DOUBLE,var_prc_1[idx]); var_prc_2[idx]=nco_var_cnf_typ((nc_type)NC_DOUBLE,var_prc_2[idx]); /* Allocate and, if necesssary, initialize space for processed variable */ var_prc_out[idx]->sz=var_prc_1[idx]->sz; /* NB: must not try to free() same tally buffer twice */ /* var_prc_out[idx]->tally=var_prc_1[idx]->tally=(long *)nco_malloc(var_prc_out[idx]->sz*sizeof(long int));*/ var_prc_out[idx]->tally=(long *)nco_malloc(var_prc_out[idx]->sz*sizeof(long int)); (void)nco_zero_long(var_prc_out[idx]->sz,var_prc_out[idx]->tally); /* Weight variable by taking product of weight with variable */ (void)nco_var_mlt(var_prc_1[idx]->type,var_prc_1[idx]->sz,var_prc_1[idx]->has_mss_val,var_prc_1[idx]->mss_val,wgt_out_1->val,var_prc_1[idx]->val); (void)nco_var_mlt(var_prc_2[idx]->type,var_prc_2[idx]->sz,var_prc_2[idx]->has_mss_val,var_prc_2[idx]->mss_val,wgt_out_2->val,var_prc_2[idx]->val); /* Change missing_value of var_prc_2, if any, to missing_value of var_prc_1, if any */ has_mss_val=nco_mss_val_cnf(var_prc_1[idx],var_prc_2[idx]); /* NB: fxm: use tally to determine when to "unweight" answer? TODO */ (void)nco_var_add_tll_ncflint(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,var_prc_1[idx]->mss_val,var_prc_out[idx]->tally,var_prc_1[idx]->val,var_prc_2[idx]->val); /* Re-cast output variable to original type */ var_prc_2[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc_2[idx]); #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* _OPENMP */ #endif /* !ENABLE_MPI */ /* Common code for UP, SMP, and MPI */ { /* begin OpenMP critical */ /* Copy interpolations to output file */ if(var_prc_out[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_2[idx]->val.vp,var_prc_2[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_2[idx]->val.vp,var_prc_2[idx]->type); } /* end else */ } /* end OpenMP critical */ /* Free dynamically allocated buffers */ if(var_prc_1[idx]) var_prc_1[idx]=nco_var_free(var_prc_1[idx]); if(var_prc_2[idx]) var_prc_2[idx]=nco_var_free(var_prc_2[idx]); if(var_prc_out[idx]) var_prc_out[idx]=nco_var_free(var_prc_out[idx]); #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end else !idx_all_wrk_ass */ } /* end while loop requesting work/token */ } /* endif Worker */ #else /* !ENABLE_MPI */ } /* end (OpenMP parallel for) loop over idx */ #endif /* !ENABLE_MPI */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Close input netCDF files */ for(thr_idx=0;thr_idxlmt_dmn_nbr;jdx++) lmt_all_lst[idx]->lmt_dmn[jdx]=nco_lmt_free(lmt_all_lst[idx]->lmt_dmn[jdx]); if(nbr_dmn_fl > 0) lmt_all_lst=nco_lmt_all_lst_free(lmt_all_lst,nbr_dmn_fl); lmt=(lmt_sct**)nco_free(lmt); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) aux=(lmt_sct **)nco_free(aux); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr); if(nbr_dmn_xtr > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_xtr); /* Free variable lists */ /* ncflint free()s _prc variables at end of main loop */ var=(var_sct **)nco_free(var); var_out=(var_sct **)nco_free(var_out); var_prc_out=(var_sct **)nco_free(var_prc_out); if(nbr_var_fix > 0) var_fix=nco_var_lst_free(var_fix,nbr_var_fix); if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/mpncpdq.c000066400000000000000000001723441264355130400154750ustar00rootroot00000000000000/* $Header$ */ /* mpncpdq -- netCDF pack, re-dimension, query */ /* Purpose: Pack, re-dimension, query single netCDF file and output to a single file */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncpdq -O -D 3 -a lat,lev,lon -v three_dmn_var ~/nco/data/in.nc ~/foo.nc;ncks -P ~/foo.nc ncpdq -O -D 3 -a lon,lev,lat -v three_dmn_var ~/nco/data/in.nc ~/foo.nc;ncks -P ~/foo.nc ncpdq -O -D 3 -a lon,time -x -v three_double_dmn ~/nco/data/in.nc ~/foo.nc;ncks -P ~/foo.nc ncpdq -O -D 3 -P all_new ~/nco/data/in.nc ~/foo.nc ncpdq -O -D 3 -P all_xst ~/nco/data/in.nc ~/foo.nc ncpdq -O -D 3 -P xst_new ~/nco/data/in.nc ~/foo.nc ncpdq -O -D 3 -P upk ~/nco/data/in.nc ~/foo.nc */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI #include /* MPI definitions */ #include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { aed_sct *aed_lst_add_fst=NULL_CEWI; aed_sct *aed_lst_scl_fct=NULL_CEWI; char **dmn_rdr_lst_in=NULL_CEWI; /* Option a */ char **fl_lst_abb=NULL; /* Option n */ char **fl_lst_in=NULL_CEWI; char **var_lst_in=NULL_CEWI; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL_CEWI; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *nco_pck_plc_sng=NULL_CEWI; /* [sng] Packing policy Option P */ char *nco_pck_map_sng=NULL_CEWI; /* [sng] Packing map Option M */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *rec_dmn_nm_in=NULL; /* [sng] Record dimension name, original */ char *rec_dmn_nm_out=NULL; /* [sng] Record dimension name, re-ordered */ char *rec_dmn_nm_out_crr=NULL; /* [sng] Name of record dimension, if any, required by re-order */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char add_fst_sng[]="add_offset"; /* [sng] Unidata standard string for add offset */ char scl_fct_sng[]="scale_factor"; /* [sng] Unidata standard string for scale factor */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467Aa:CcD:d:FhL:l:M:Oo:P:p:RrSt:v:Ux-:"; cnk_dmn_sct **cnk_dmn=NULL_CEWI; dmn_sct **dim=NULL_CEWI; dmn_sct **dmn_out; dmn_sct **dmn_rdr=NULL; /* [sct] Dimension structures to be re-ordered */ extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ int **dmn_idx_out_in=NULL; /* [idx] Dimension correspondence, output->input CEWI */ int *in_id_arr; int abb_arg_nbr=0; int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int dmn_out_idx; /* [idx] Index over output dimension list */ int dmn_out_idx_rec_in=NCO_REC_DMN_UNDEFINED; /* [idx] Record dimension index in output dimension list, original */ int dmn_rdr_nbr=0; /* [nbr] Number of dimension to re-order */ int dmn_rdr_nbr_in=0; /* [nbr] Original number of dimension to re-order */ int dmn_rdr_nbr_utl=0; /* [nbr] Number of dimension to re-order, utilized */ int fl_idx=int_CEWI; int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx=int_CEWI; int idx_rdr=int_CEWI; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_dmn_out; int nbr_dmn_xtr; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int nco_pck_map=nco_pck_map_flt_sht; /* [enm] Packing map */ int nco_pck_plc=nco_pck_plc_nil; /* [enm] Packing policy */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int rec_dmn_id_in=NCO_REC_DMN_UNDEFINED; /* [id] Record dimension ID in input file */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **aux=NULL_CEWI; /* Auxiliary coordinate limits */ lmt_sct **lmt=NULL_CEWI; lmt_all_sct **lmt_all_lst=NULL_CEWI; /* List of *lmt_all structures */ nco_bool **dmn_rvr_in=NULL; /* [flg] Reverse dimension */ nco_bool *dmn_rvr_rdr=NULL; /* [flg] Reverse dimension */ nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool REDEFINED_RECORD_DIMENSION=False; /* [flg] Re-defined record dimension */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nm_id_sct *dmn_lst; nm_id_sct *dmn_rdr_lst; nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc; var_sct **var_prc_out; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int jdx=0; /* [idx] For MPI indexing local variables */ /* csz: fxm why 60? make dynamic? */ int lcl_idx_lst[60]; /* [arr] Array containing indices of variables processed at each Worker */ int lcl_nbr_var=0; /* [nbr] Count of variables processes at each Worker */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"arrange",required_argument,0,'a'}, {"permute",required_argument,0,'a'}, {"reorder",required_argument,0,'a'}, {"rdr",required_argument,0,'a'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"pck_map",required_argument,0,'M'}, {"map",required_argument,0,'M'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"pack_policy",required_argument,0,'P'}, {"pck_plc",required_argument,0,'P'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"unpack",no_argument,0,'U'}, {"upk",no_argument,0,'U'}, {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&prc_nbr); MPI_Comm_rank(MPI_COMM_WORLD,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start clock and save command line */ cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'a': /* Re-order dimensions */ dmn_rdr_lst_in=nco_lst_prs_2D(optarg,",",&dmn_rdr_nbr_in); dmn_rdr_nbr=dmn_rdr_nbr_in; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'M': /* Packing map */ nco_pck_map_sng=(char *)strdup(optarg); nco_pck_map=nco_pck_map_get(nco_pck_map_sng); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'P': /* Packing policy */ nco_pck_plc_sng=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'U': /* Unpacking switch */ nco_pck_plc_sng=(char *)strdup("upk"); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); /* Parse auxiliary coordinates */ if(aux_nbr > 0){ int aux_idx_nbr; aux=nco_aux_evl(in_id,aux_nbr,aux_arg,&aux_idx_nbr); if(aux_idx_nbr > 0){ lmt=(lmt_sct **)nco_realloc(lmt,(lmt_nbr+aux_idx_nbr)*sizeof(lmt_sct *)); int lmt_nbr_new=lmt_nbr+aux_idx_nbr; int aux_idx=0; for(int lmt_idx=lmt_nbr;lmt_idx 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_all_mrg(dmn_out,nbr_dmn_xtr,lmt_all_lst,nbr_dmn_fl); /* No re-order dimensions specified implies packing request */ if(dmn_rdr_nbr == 0){ if(nco_pck_plc == nco_pck_plc_nil) nco_pck_plc=nco_pck_plc_get(nco_pck_plc_sng); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG Packing map is %s and packing policy is %s\n",nco_prg_nm_get(),nco_pck_map_sng_get(nco_pck_map),nco_pck_plc_sng_get(nco_pck_plc)); } /* endif */ /* From this point forward, assume ncpdq operator packs or re-orders, not both */ if(dmn_rdr_nbr > 0 && nco_pck_plc != nco_pck_plc_nil){ (void)fprintf(fp_stdout,"%s: ERROR %s does not support simultaneous dimension re-ordering (-a switch) and packing (-P switch).\nHINT: Invoke %s twice, once to re-order (with -a), and once to pack (with -P).\n",nco_prg_nm,nco_prg_nm,nco_prg_nm); nco_exit(EXIT_FAILURE); } /* end if */ if(dmn_rdr_nbr > 0){ /* NB: Same logic as in ncwa, perhaps combine into single function, nco_dmn_avg_rdr_prp()? */ /* Make list of user-specified dimension re-orders */ /* Create reversed dimension list */ dmn_rvr_rdr=(nco_bool *)nco_malloc(dmn_rdr_nbr*sizeof(nco_bool)); for(idx_rdr=0;idx_rdrnm)) break; } /* end loop over idx_rdr */ if(idx != nbr_dmn_xtr) dmn_rdr[dmn_rdr_nbr_utl++]=dim[idx]; else if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING re-ordering dimension \"%s\" is not contained in any variable in extraction list\n",nco_prg_nm,dmn_rdr_lst[idx_rdr].nm); } /* end loop over idx_rdr */ dmn_rdr_nbr=dmn_rdr_nbr_utl; /* Collapse extra dimension structure space to prevent accidentally using it */ dmn_rdr=(dmn_sct **)nco_realloc(dmn_rdr,dmn_rdr_nbr*sizeof(dmn_sct *)); /* Dimension list in name-ID format is no longer needed */ dmn_rdr_lst=nco_nm_id_lst_free(dmn_rdr_lst,dmn_rdr_nbr); /* Make sure no re-ordering dimension is specified more than once */ for(idx=0;idxid == dmn_rdr[idx_rdr]->id){ (void)fprintf(fp_stdout,"%s: ERROR %s specified more than once in reducing list\n",nco_prg_nm,dmn_rdr[idx]->nm); nco_exit(EXIT_FAILURE); } /* end if */ } /* end if */ } /* end loop over idx_rdr */ } /* end loop over idx */ if(dmn_rdr_nbr > nbr_dmn_xtr){ (void)fprintf(fp_stdout,"%s: ERROR More re-ordering dimensions than extracted dimensions\n",nco_prg_nm); nco_exit(EXIT_FAILURE); } /* end if */ } /* dmn_rdr_nbr <= 0 */ /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id); /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idx= nco_dbg_var){ for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var[idx]->nm,var[idx]->id); for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var_fix[idx]->nm,var_fix[idx]->id); for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var_prc[idx]->nm,var_prc[idx]->id); } /* end if */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt; /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); if(nco_dbg_lvl >= nco_dbg_sbr) (void)fprintf(stderr,"Input, output file IDs = %d, %d\n",in_id,out_id); /* Copy global attributes */ (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); } /* !prc_rnk == rnk_mgr */ #endif /* !ENABLE_MPI */ /* If re-ordering, then in files with record dimension... */ if(dmn_rdr_nbr > 0 && rec_dmn_id_in != NCO_REC_DMN_UNDEFINED){ /* ...which, if any, output dimension structure currently holds record dimension? */ for(dmn_out_idx=0;dmn_out_idxis_rec_dmn) break; if(dmn_out_idx != nbr_dmn_out){ dmn_out_idx_rec_in=dmn_out_idx; /* Initialize output record dimension to input record dimension */ rec_dmn_nm_in=rec_dmn_nm_out=dmn_out[dmn_out_idx_rec_in]->nm; }else{ dmn_out_idx_rec_in=NCO_REC_DMN_UNDEFINED; } /* end else */ } /* end if file contains record dimension */ /* If re-ordering, determine and set new dimensionality in metadata of each re-ordered variable */ if(dmn_rdr_nbr > 0){ dmn_idx_out_in=(int **)nco_malloc(nbr_var_prc*sizeof(int *)); dmn_rvr_in=(nco_bool **)nco_malloc(nbr_var_prc*sizeof(nco_bool *)); for(idx=0;idxnbr_dim*sizeof(int)); dmn_rvr_in[idx]=(nco_bool *)nco_malloc(var_prc[idx]->nbr_dim*sizeof(nco_bool)); /* nco_var_dmn_rdr_mtd() does re-order heavy lifting */ rec_dmn_nm_out_crr=nco_var_dmn_rdr_mtd(var_prc[idx],var_prc_out[idx],dmn_rdr,dmn_rdr_nbr,dmn_idx_out_in[idx],dmn_rvr_rdr,dmn_rvr_in[idx]); /* If record dimension required by current variable re-order... ...and variable is multi-dimensional (one dimensional arrays cannot request record dimension changes)... */ if(rec_dmn_nm_out_crr && var_prc_out[idx]->nbr_dim > 1){ /* ...differs from input and current output record dimension(s)... */ if(strcmp(rec_dmn_nm_out_crr,rec_dmn_nm_in) && strcmp(rec_dmn_nm_out_crr,rec_dmn_nm_out)){ /* ...and current output record dimension already differs from input record dimension... */ if(REDEFINED_RECORD_DIMENSION){ /* ...then requested re-order requires multiple record dimensions... */ if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(fp_stdout,"%s: WARNING Re-order requests multiple record dimensions\n. Only first request will be honored (netCDF allows only one record dimension). Record dimensions involved [original,first change request (honored),latest change request (made by variable %s)]=[%s,%s,%s]\n",nco_prg_nm,var_prc[idx]->nm,rec_dmn_nm_in,rec_dmn_nm_out,rec_dmn_nm_out_crr); break; }else{ /* !REDEFINED_RECORD_DIMENSION */ /* ...otherwise, update output record dimension name... */ rec_dmn_nm_out=rec_dmn_nm_out_crr; /* ...and set new and un-set old record dimensions... */ var_prc_out[idx]->dim[0]->is_rec_dmn=True; dmn_out[dmn_out_idx_rec_in]->is_rec_dmn=False; /* ...and set flag that record dimension has been re-defined... */ REDEFINED_RECORD_DIMENSION=True; } /* !REDEFINED_RECORD_DIMENSION */ } /* endif new and old record dimensions differ */ } /* endif current variable is record variable */ } /* end loop over var_prc */ } /* endif dmn_rdr_nbr > 0 */ /* NB: Much of following logic is required by netCDF constraint that only one record variable is allowed per file. netCDF4 will relax this constraint. Hence making following logic prettier or funcionalizing is not high priority. Logic may need to be simplified/re-written once netCDF4 is released. */ if(REDEFINED_RECORD_DIMENSION){ if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(fp_stdout,"%s: INFO Requested re-order will change record dimension from %s to %s. netCDF allows only one record dimension. Hence %s will make %s record (least rapidly varying) dimension in all variables that contain it.\n",nco_prg_nm,rec_dmn_nm_in,rec_dmn_nm_out,nco_prg_nm,rec_dmn_nm_out); /* Changing record dimension may invalidate is_rec_var flag Updating is_rec_var flag to correct value, even if value is ignored, helps keep user appraised of unexpected dimension re-orders. is_rec_var may change both for "fixed" and "processed" variables When is_rec_var changes for processed variables, may also need to change ancillary information and to check for duplicate dimensions. Ancillary information (dmn_idx_out_in) is available only for var_prc! Hence must update is_rec_var flag for var_fix and var_prc separately */ /* Update is_rec_var flag for var_fix */ for(idx=0;idxnbr_dim;dmn_out_idx++) if(!strcmp(var_fix[idx]->dim[dmn_out_idx]->nm,rec_dmn_nm_out)) break; /* ...Will variable be record variable in output file?... */ if(dmn_out_idx == var_fix[idx]->nbr_dim){ /* ...No. Variable will be non-record---does this change its status?... */ if(nco_dbg_lvl >= nco_dbg_var) if(var_fix[idx]->is_rec_var == True) (void)fprintf(fp_stdout,"%s: INFO Requested re-order will change variable %s from record to non-record variable\n",nco_prg_nm,var_fix[idx]->nm); /* Assign record flag dictated by re-order */ var_fix[idx]->is_rec_var=False; }else{ /* ...otherwise variable will be record variable... */ /* ...Yes. Variable will be record... */ /* ...Will becoming record variable change its status?... */ if(var_fix[idx]->is_rec_var == False){ if(nco_dbg_lvl >= nco_dbg_var) (void)fprintf(fp_stdout,"%s: INFO Requested re-order will change variable %s from non-record to record variable\n",nco_prg_nm,var_fix[idx]->nm); /* Change record flag to status dictated by re-order */ var_fix[idx]->is_rec_var=True; } /* endif status changing from non-record to record */ } /* endif variable will be record variable */ } /* end loop over var_fix */ /* Update is_rec_var flag for var_prc */ for(idx=0;idxnbr_dim;dmn_out_idx++) if(!strcmp(var_prc_out[idx]->dim[dmn_out_idx]->nm,rec_dmn_nm_out)) break; /* ...Will variable be record variable in output file?... */ if(dmn_out_idx == var_prc_out[idx]->nbr_dim){ /* ...No. Variable will be non-record---does this change its status?... */ if(nco_dbg_lvl >= nco_dbg_var) if(var_prc_out[idx]->is_rec_var == True) (void)fprintf(fp_stdout,"%s: INFO Requested re-order will change variable %s from record to non-record variable\n",nco_prg_nm,var_prc_out[idx]->nm); /* Assign record flag dictated by re-order */ var_prc_out[idx]->is_rec_var=False; }else{ /* ...otherwise variable will be record variable... */ /* ...Yes. Variable will be record... */ /* ...must ensure new record dimension is not duplicate dimension... */ if(var_prc_out[idx]->has_dpl_dmn){ int dmn_dpl_idx; for(dmn_dpl_idx=1;dmn_dpl_idxnbr_dim;dmn_dpl_idx++){ /* NB: loop starts from 1 */ if(var_prc_out[idx]->dmn_id[0] == var_prc_out[idx]->dmn_id[dmn_dpl_idx]){ (void)fprintf(stdout,"%s: ERROR Requested re-order turns duplicate non-record dimension %s in variable %s into output record dimension. netCDF does not support duplicate record dimensions in a single variable.\n%s: HINT: Exclude variable %s from extraction list with \"-x -v %s\".\n",nco_prg_nm_get(),rec_dmn_nm_out,var_prc_out[idx]->nm,nco_prg_nm_get(),var_prc_out[idx]->nm,var_prc_out[idx]->nm); nco_exit(EXIT_FAILURE); } /* endif err */ } /* end loop over dmn_out */ } /* endif has_dpl_dmn */ /* ...Will becoming record variable change its status?... */ if(var_prc_out[idx]->is_rec_var == False){ if(nco_dbg_lvl >= nco_dbg_var) (void)fprintf(fp_stdout,"%s: INFO Requested re-order will change variable %s from non-record to record variable\n",nco_prg_nm,var_prc_out[idx]->nm); /* Change record flag to status dictated by re-order */ var_prc_out[idx]->is_rec_var=True; /* ...Swap dimension information for multi-dimensional variables... */ if(var_prc_out[idx]->nbr_dim > 1){ /* Swap dimension information when turning multi-dimensional non-record variable into record variable. Single dimensional non-record variables that turn into record variables already have correct dimension information */ dmn_sct *dmn_swp; /* [sct] Dimension structure for swapping */ int dmn_idx_rec_in; /* [idx] Record dimension index in input variable */ int dmn_idx_rec_out; /* [idx] Record dimension index in output variable */ int dmn_idx_swp; /* [idx] Dimension index for swapping */ /* If necessary, swap new record dimension to first position */ /* Label indices with standard names */ dmn_idx_rec_in=dmn_out_idx; dmn_idx_rec_out=0; /* Swap indices in map */ dmn_idx_swp=dmn_idx_out_in[idx][dmn_idx_rec_out]; dmn_idx_out_in[idx][dmn_idx_rec_out]=dmn_idx_rec_in; dmn_idx_out_in[idx][dmn_idx_rec_in]=dmn_idx_swp; /* Swap dimensions in list */ dmn_swp=var_prc_out[idx]->dim[dmn_idx_rec_out]; var_prc_out[idx]->dim[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_in]; var_prc_out[idx]->dim[dmn_idx_rec_in]=dmn_swp; /* NB: Change dmn_id,cnt,srt,end,srd together to minimize chances of forgetting one */ /* Correct output variable structure copy of output record dimension information */ var_prc_out[idx]->dmn_id[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_out]->id; var_prc_out[idx]->cnt[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_out]->cnt; var_prc_out[idx]->srt[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_out]->srt; var_prc_out[idx]->end[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_out]->end; var_prc_out[idx]->srd[dmn_idx_rec_out]=var_prc_out[idx]->dim[dmn_idx_rec_out]->srd; /* Correct output variable structure copy of input record dimension information */ var_prc_out[idx]->dmn_id[dmn_idx_rec_in]=var_prc_out[idx]->dim[dmn_idx_rec_in]->id; var_prc_out[idx]->cnt[dmn_idx_rec_in]=var_prc_out[idx]->dim[dmn_idx_rec_in]->cnt; var_prc_out[idx]->srt[dmn_idx_rec_in]=var_prc_out[idx]->dim[dmn_idx_rec_in]->srt; var_prc_out[idx]->end[dmn_idx_rec_in]=var_prc_out[idx]->dim[dmn_idx_rec_in]->end; var_prc_out[idx]->srd[dmn_idx_rec_in]=var_prc_out[idx]->dim[dmn_idx_rec_in]->srd; } /* endif multi-dimensional */ } /* endif status changing from non-record to record */ } /* endif variable will be record variable */ } /* end loop over var_prc */ } /* !REDEFINED_RECORD_DIMENSION */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* Defining dimension in output file done by Manager alone */ #endif /* !ENABLE_MPI */ /* Once new record dimension, if any, is known, define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_out); #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Alter metadata for variables that will be packed */ if(nco_pck_plc != nco_pck_plc_nil){ if(nco_pck_plc != nco_pck_plc_upk){ /* Allocate attribute list container for maximum number of entries */ aed_lst_add_fst=(aed_sct *)nco_malloc(nbr_var_prc*sizeof(aed_sct)); aed_lst_scl_fct=(aed_sct *)nco_malloc(nbr_var_prc*sizeof(aed_sct)); } /* endif packing */ for(idx=0;idx= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,0,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,0,MPI_COMM_WORLD); #endif /* !ENABLE_MPI */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ (void)nco_msa_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix,lmt_all_lst,nbr_dmn_fl); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Close first input netCDF file */ nco_close(in_id); /* Loop over input files (not currently used, fl_nbr == 1) */ for(fl_idx=0;fl_idx= nco_dbg_fl) (void)fprintf(stderr,"\nInput file %d is %s; ",fl_idx,fl_in); /* Make sure file is on local system and is readable or die trying */ if(fl_idx != 0) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"local file %s:\n",fl_in); /* Open file once per thread to improve caching */ for(thr_idx=0;thr_idx nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); /* msg_tag_typ != msg_tag_wrk_rqs */ }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,0,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ lcl_idx_lst[lcl_nbr_var]=idx; /* storing the indices for subsequent processing by the worker */ lcl_nbr_var++; var_prc_out[idx]->id=msg_bfr[2]; /* Process this variable same as UP code */ #if 0 /* NB: Immediately preceding MPI else scope confounds Emacs indentation Fake end scope restores correct indentation, simplifies code-checking */ } /* fake end else */ #endif /* !0 */ #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp parallel for default(none) private(idx,in_id) shared(aed_lst_add_fst,aed_lst_scl_fct,nco_dbg_lvl,dmn_idx_out_in,dmn_rdr_nbr,dmn_rvr_in,in_id_arr,nbr_var_prc,nco_pck_map,nco_pck_plc,out_id,nco_prg_nm,rcd,var_prc,var_prc_out) #endif /* !_OPENMP */ /* UP and SMP codes main loop over variables */ for(idx=0;idxnc_id=in_id; if(nco_dbg_lvl >= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_msa_var_get(in_id,var_prc[idx],lmt_all_lst,nbr_dmn_fl); if(dmn_rdr_nbr > 0){ if((var_prc_out[idx]->val.vp=(void *)nco_malloc_flg(var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type))) == NULL){ (void)fprintf(fp_stdout,"%s: ERROR Unable to malloc() %ld*%lu bytes for value buffer for variable %s in main()\n",nco_prg_nm_get(),var_prc_out[idx]->sz,(unsigned long)nco_typ_lng(var_prc_out[idx]->type),var_prc_out[idx]->nm); nco_exit(EXIT_FAILURE); } /* endif err */ /* Change dimensionionality of values */ rcd=nco_var_dmn_rdr_val(var_prc[idx],var_prc_out[idx],dmn_idx_out_in[idx],dmn_rvr_in[idx]); /* Re-ordering required two value buffers, time to free input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); /* Free current dimension correspondence */ dmn_idx_out_in[idx]=nco_free(dmn_idx_out_in[idx]); dmn_rvr_in[idx]=nco_free(dmn_rvr_in[idx]); } /* endif dmn_rdr_nbr > 0 */ if(nco_pck_plc != nco_pck_plc_nil){ /* Copy input variable buffer to processed variable buffer */ /* fxm: this is dangerous and leads to double free()'ing variable buffer */ var_prc_out[idx]->val=var_prc[idx]->val; /* (Un-)Pack variable according to packing specification */ nco_pck_val(var_prc[idx],var_prc_out[idx],nco_pck_map,nco_pck_plc,aed_lst_add_fst+idx,aed_lst_scl_fct+idx); } /* endif dmn_rdr_nbr > 0 */ #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* _OPENMP */ #endif /* !ENABLE_MPI */ { /* begin OpenMP critical */ /* Common code for UP, SMP, and MPI */ /* Copy variable to output file then free value buffer */ if(var_prc_out[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); } /* end if variable is array */ } /* end OpenMP critical */ /* Free current output buffer */ var_prc_out[idx]->val.vp=nco_free(var_prc_out[idx]->val.vp); #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end else !idx_all_wrk_ass */ } /* end while loop requesting work/token */ } /* endif Worker */ #else /* !ENABLE_MPI */ } /* end (OpenMP parallel for) loop over idx */ #endif /* !ENABLE_MPI */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(fp_stderr,"\n"); #ifdef ENABLE_MPI MPI_Barrier(MPI_COMM_WORLD); if(prc_rnk == rnk_mgr) { /* Manager only */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk+1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* ! prc_rnk == rnk_mgr */ else{ /* Workers */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk-1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); #endif /* !ENABLE_MPI */ /* Write/overwrite packing attributes for newly packed and re-packed variables Logic here should nearly mimic logic in nco_var_dfn() */ if(nco_pck_plc != nco_pck_plc_nil && nco_pck_plc != nco_pck_plc_upk){ nco_bool nco_pck_plc_alw; /* [flg] Packing policy allows packing nc_typ_in */ /* ...put file in define mode to allow metadata writing... */ if(RAM_OPEN) md_open=NC_WRITE|NC_DISKLESS; else md_open=NC_WRITE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); (void)nco_redef(out_id); /* ...loop through all variables that may have been packed... */ #ifdef ENABLE_MPI for(jdx=0;jdxtyp_upk,(nc_type *)NULL))){ /* Verify input variable was newly packed by this operator Writing pre-existing (non-re-packed) attributes here would fail because nco_pck_dsk_inq() never fills in var->scl_fct.vp and var->add_fst.vp Logic is same as in nco_var_dfn() (except var_prc[] instead of var[]) If operator newly packed this particular variable... */ if( /* ...either because operator newly packs all variables... */ (nco_pck_plc == nco_pck_plc_all_new_att) || /* ...or because operator newly packs un-packed variables like this one... */ (nco_pck_plc == nco_pck_plc_all_xst_att && !var_prc[idx]->pck_ram) || /* ...or because operator re-packs packed variables like this one... */ (nco_pck_plc == nco_pck_plc_xst_new_att && var_prc[idx]->pck_ram) ){ /* Replace dummy packing attributes with final values, or delete them */ if(nco_dbg_lvl >= nco_dbg_io) (void)fprintf(stderr,"%s: main() replacing dummy packing attribute values for variable %s\n",nco_prg_nm,var_prc[idx]->nm); (void)nco_aed_prc(out_id,aed_lst_add_fst[idx].id,aed_lst_add_fst[idx]); (void)nco_aed_prc(out_id,aed_lst_scl_fct[idx].id,aed_lst_scl_fct[idx]); } /* endif variable is newly packed by this operator */ } /* endif nco_pck_plc_alw */ } /* end loop over var_prc */ (void)nco_enddef(out_id); #ifdef ENABLE_MPI nco_close(out_id); #endif /* !ENABLE_MPI */ } /* nco_pck_plc == nco_pck_plc_nil || nco_pck_plc == nco_pck_plc_upk */ #ifdef ENABLE_MPI if(prc_rnk == prc_nbr-1) /* Send Token to Manager */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); else MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk+1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* !Workers */ if(prc_rnk == rnk_mgr){ /* Only Manager */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,prc_nbr-1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Close input netCDF file */ for(thr_idx=0;thr_idx 0){ /* Free dimension correspondence list */ for(idx=0;idx 0) dmn_rdr_lst_in=nco_sng_lst_free(dmn_rdr_lst_in,dmn_rdr_nbr_in); /* Free dimension list pointers */ dmn_rdr=(dmn_sct **)nco_free(dmn_rdr); /* Dimension structures in dmn_rdr are owned by dmn and dmn_out, free'd later */ } /* endif dmn_rdr_nbr > 0 */ if(nco_pck_plc != nco_pck_plc_nil){ if(nco_pck_plc_sng) nco_pck_plc_sng=(char *)nco_free(nco_pck_plc_sng); if(nco_pck_map_sng) nco_pck_map_sng=(char *)nco_free(nco_pck_map_sng); if(nco_pck_plc != nco_pck_plc_upk){ /* No need for loop over var_prc variables to free attribute values Variable structures and attribute edit lists share same attribute values Free them only once, and do it in nco_var_free() */ aed_lst_add_fst=(aed_sct *)nco_free(aed_lst_add_fst); aed_lst_scl_fct=(aed_sct *)nco_free(aed_lst_scl_fct); } /* nco_pck_plc == nco_pck_plc_upk */ } /* nco_pck_plc == nco_pck_plc_nil */ /* NB: lmt now referenced within lmt_all_lst[idx] */ for(idx=0;idxlmt_dmn_nbr;jdx++) lmt_all_lst[idx]->lmt_dmn[jdx]=nco_lmt_free(lmt_all_lst[idx]->lmt_dmn[jdx]); if(nbr_dmn_fl > 0) lmt_all_lst=nco_lmt_all_lst_free(lmt_all_lst,nbr_dmn_fl); lmt=(lmt_sct**)nco_free(lmt); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_arr) in_id_arr=(int *)nco_free(in_id_arr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) aux=(lmt_sct **)nco_free(aux); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr); if(nbr_dmn_xtr > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_xtr); /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/mpncra.c000066400000000000000000002167751264355130400153220ustar00rootroot00000000000000/* $Header$ */ /* This single source file may be called as three separate executables: ncra -- netCDF record averager nces -- netCDF ensemble statistics ncrcat -- netCDF record concatenator */ /* Purpose: Compute averages or extract series of specified hyperslabs of specfied variables of multiple input netCDF files and output them to a single file. */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncra -n 3,4,1 -p ${HOME}/nco/data h0001.nc ~/foo.nc ncra -n 3,4,1 -p ${HOME}/nco/data -l ${HOME} h0001.nc ~/foo.nc ncra -n 3,4,1 -p /ZENDER/tmp -l ${HOME}/nco/data h0001.nc ~/foo.nc scp ~/nco/src/nco/ncra.c esmf.ess.uci.edu:nco/src/nco nces in.nc in.nc ~/foo.nc nces -n 3,4,1 -p ${HOME}/nco/data h0001.nc ~/foo.nc nces -n 3,4,1 -p ${HOME}/nco/data -l ${HOME} h0001.nc ~/foo.nc nces -n 3,4,1 -p /ZENDER/tmp -l ${HOME} h0001.nc ~/foo.nc */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* assert() debugging macro */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* Internationalization i18n, Linux Journal 200211 p. 57--59 */ #ifdef I18N #include /* Internationalization i18n */ #include /* Locale setlocale() */ #define _(sng) gettext (sng) #define gettext_noop(sng) (sng) #define N_(sng) gettext_noop(sng) #endif /* I18N */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI #include /* MPI definitions */ #include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ #ifdef ENABLE_MPI void checkpointMpi(int prc_rnk, int stage){ int msg[]={0,0}; int rcd; /* [rcd] Return code */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ if(prc_rnk == rnk_mgr){ msg[0]=stage; msg[1]=stage; } /* endif */ (void)fprintf(fp_stderr,"%d checkpointing at stage %d\n",prc_rnk,stage); /* make everyone continue from this point. */ rcd=MPI_Bcast(msg,2,MPI_INT,rnk_mgr,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) { /* basic sanity check */ assert(msg[0] == stage); assert(msg[1] == stage); } /* end if */ } /* end checkpointMpi() */ #endif /* !ENABLE_MPI */ int main(int argc,char **argv) { char **fl_lst_abb=NULL; /* Option n */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL_CEWI; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *nco_op_typ_sng=NULL_CEWI; /* [sng] Operation type Option y */ char *nco_pck_plc_sng=NULL_CEWI; /* [sng] Packing policy Option P */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:FHhL:l:n:Oo:p:P:rRSt:v:xY:y:-:"; dmn_sct **dim; dmn_sct **dmn_out; extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ int *in_id_arr; int abb_arg_nbr=0; int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx=int_CEWI; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_dmn_xtr; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int nco_op_typ=nco_op_avg; /* [enm] Default operation is averaging */ int nco_pck_plc=nco_pck_plc_nil; /* [enm] Default packing is none */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int rec_dmn_id=NCO_REC_DMN_UNDEFINED; int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **lmt=NULL_CEWI; lmt_sct *lmt_rec=NULL_CEWI; lmt_all_sct **lmt_all_lst; /* List of *lmt_all structures */ lmt_all_sct *lmt_all_rec=NULL_CEWI; /* Pointer to record limit structure in above list */ long idx_rec; /* [idx] Index of current record in current input file */ long rec_usd_cml=0L; /* [idx] Index of current record in output file (0 is first, ...) */ nco_bool CNV_ARM; nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_APPEND=True; /* Option H */ nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool LAST_RECORD=False; nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nco_int base_time_srt=nco_int_CEWI; nco_int base_time_crr=nco_int_CEWI; nm_id_sct *dmn_lst; nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out=NULL_CEWI; var_sct **var_prc; var_sct **var_prc_out; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int jdx=0; /* [idx] MPI index for local variables */ int lcl_idx_lst[60]; /* [arr] Array containing indices of variables processed at each Worker */ int lcl_nbr_var=0; /* [nbr] Count of variables processes at each Worker */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rnk=0; /* [idx] Rank of process holding write token */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]= { /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"fl_lst_in",no_argument,0,'H'}, {"file_list",no_argument,0,'H'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"nintap",required_argument,0,'n'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"pack",required_argument,0,'P'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"pseudonym",required_argument,0,'Y'}, {"program",required_argument,0,'Y'}, {"prg_nm",required_argument,0,'Y'}, {"math",required_argument,0,'y'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef _LIBINTL_H setlocale(LC_ALL,""); /* LC_ALL sets all localization tokens to same value */ bindtextdomain("nco","/home/zender/share/locale"); /* ${LOCALEDIR} is e.g., /usr/share/locale */ /* MO files should be in ${LOCALEDIR}/es/LC_MESSAGES */ textdomain("nco"); /* PACKAGE is name of program */ #endif /* not _LIBINTL_H */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&prc_nbr); MPI_Comm_rank(MPI_COMM_WORLD,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start clock and save command line */ cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'H': /* Toggle writing input file list attribute */ FL_LST_IN_APPEND=!FL_LST_IN_APPEND; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'n': /* NINTAP-style abbreviation of files to average */ fl_lst_abb=nco_lst_prs_2D(optarg,",",&abb_arg_nbr); if(abb_arg_nbr < 1 || abb_arg_nbr > 6){ (void)fprintf(stdout,gettext("%s: ERROR Incorrect abbreviation for file list\n"),nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'P': /* Packing policy */ nco_pck_plc_sng=(char *)strdup(optarg); nco_pck_plc=nco_pck_plc_get(nco_pck_plc_sng); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stderr,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm_get()); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case 'Y': /* Pseudonym */ /* Call nco_prg_prs to reset pseudonym */ optarg_lcl=(char *)strdup(optarg); if(nco_prg_nm) nco_prg_nm=(char *)nco_free(nco_prg_nm); nco_prg_nm=nco_prg_prs(optarg_lcl,&nco_prg_id); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'y': /* Operation type */ nco_op_typ_sng=(char *)strdup(optarg); if(nco_prg_id == ncra || nco_prg_id == ncfe || nco_prg_id == ncge) nco_op_typ=nco_op_typ_get(nco_op_typ_sng); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ if(lmt_nbr > 0) lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); /* Get number of variables, dimensions, and record dimension ID of input file */ (void)nco_inq(in_id,&nbr_dmn_fl,&nbr_var_fl,(int *)NULL,&rec_dmn_id); (void)nco_inq_format(in_id,&fl_in_fmt); /* Form initial extraction list which may include extended regular expressions */ xtr_lst=nco_var_lst_mk(in_id,nbr_var_fl,var_lst_in,EXCLUDE_INPUT_LIST,EXTRACT_ALL_COORDINATES,&xtr_nbr); /* Change included variables to excluded variables */ if(EXCLUDE_INPUT_LIST) xtr_lst=nco_var_lst_xcl(in_id,nbr_var_fl,xtr_lst,&xtr_nbr); /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id); /* Add all coordinate variables to extraction list */ if(EXTRACT_ALL_COORDINATES) xtr_lst=nco_var_lst_crd_add(in_id,nbr_dmn_fl,nbr_var_fl,xtr_lst,&xtr_nbr,CNV_CCM_CCSM_CF); /* Extract coordinates associated with extracted variables */ if(EXTRACT_ASSOCIATED_COORDINATES) xtr_lst=nco_var_lst_crd_ass_add(in_id,xtr_lst,&xtr_nbr,CNV_CCM_CCSM_CF); /* Sort extraction list by variable ID for fastest I/O */ if(xtr_nbr > 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* We now have final list of variables to extract. Phew. */ /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_all_mrg(dmn_out,nbr_dmn_xtr,lmt_all_lst,nbr_dmn_fl); /* Duplicate input dimension structures for output dimension structures */ dmn_out=(dmn_sct **)nco_malloc(nbr_dmn_xtr*sizeof(dmn_sct *)); for(idx=0;idxlmt_cln=cln_nil; lmt_rec->origin=0.0; lmt_rec->rbs_sng=NULL; /* Obtain metadata for record coordinate */ rcd=nco_inq_varid_flg(in_id,lmt_rec->nm,&var_id); if(rcd == NC_NOERR){ char *cln_att_sng=NULL; lmt_rec->rbs_sng=nco_lmt_get_udu_att(in_id,var_id,"units"); cln_att_sng=nco_lmt_get_udu_att(in_id,var_id,"calendar"); lmt_rec->lmt_cln=nco_cln_get_cln_typ(cln_att_sng); if(cln_att_sng) cln_att_sng=(char*)nco_free(cln_att_sng); }else{ /* endif record coordinate exists */ /* Record dimension, but not record coordinate, exists, which is fine. Reset return code. */ rcd=NC_NOERR; } /* endif record coordinate exists */ } /* endif ncra, ncrcat */ } /* endif record dimension exists */ if(rec_dmn_id != NCO_REC_DMN_UNDEFINED){ for(idx=0;idxnm,lmt_all_lst[idx]->dmn_nm)){ lmt_all_rec=lmt_all_lst[idx]; /* Can only have one record limit */ if(lmt_all_rec->lmt_dmn_nbr > 1L){ (void)fprintf(stdout,"%s: Although this program allows multiple hyperslab limits for a single dimension, it allows only one unwrapped limit for the record dimension \"%s\". You have specified %i.\n",nco_prg_nm_get(),lmt_all_rec->dmn_nm,lmt_all_rec->lmt_dmn_nbr); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_prg_id==ncra || nco_prg_id==ncrcat){ /* Change record dim in lmt_all_lst so that cnt=1 */ lmt_all_lst[idx]->dmn_cnt=1L; lmt_all_lst[idx]->lmt_dmn[0]->srt=0L; lmt_all_lst[idx]->lmt_dmn[0]->end=0L; lmt_all_lst[idx]->lmt_dmn[0]->cnt=1L; lmt_all_lst[idx]->lmt_dmn[0]->srd=1L; } /* endif ncra || ncrcat */ break; } /* endif current limit applies to record dimension */ } /* end loop over all dimensions */ } /* end if file has record dimension */ /* Is this an ARM-format data file? */ CNV_ARM=nco_cnv_arm_inq(in_id); /* NB: nco_cnv_arm_base_time_get() with same nc_id contains OpenMP critical region */ if(CNV_ARM) base_time_srt=nco_cnv_arm_base_time_get(in_id); /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idx 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); /* Add input file list global attribute */ if(FL_LST_IN_APPEND && HISTORY_APPEND && FL_LST_IN_FROM_STDIN) (void)nco_fl_lst_att_cat(out_id,fl_lst_in,fl_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); /* Define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_xtr); /* Define variables in output file, copy their attributes */ (void)nco_var_dfn(in_id,fl_out,out_id,var_out,xtr_nbr,(dmn_sct **)NULL,(int)0,nco_pck_plc_nil,nco_pck_map_nil,dfl_lvl); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ (void)nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,0,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,0,MPI_COMM_WORLD); #endif /* !ENABLE_MPI */ /* Pre-processor token spaghetti here is necessary so that 1. UP/SMP/MPI codes all zero srt vectors before calling nco_var_val_cpy() 2. No codes zero srt vectors more than once */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ /* (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix); */ (void)nco_msa_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix,lmt_all_lst,nbr_dmn_fl); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #else /* !ENABLE_MPI */ /* Close first input netCDF file (SMP only since MPI code immediate re-opens) */ (void)nco_close(in_id); #endif /* !ENABLE_MPI */ /* Allocate and, if necesssary, initialize accumulation space for processed variables */ for(idx=0;idxsz=var_prc[idx]->sz=var_prc[idx]->sz_rec; } /* endif */ if(nco_prg_id == ncra || nco_prg_id == ncfe){ var_prc_out[idx]->tally=var_prc[idx]->tally=(long *)nco_malloc(var_prc_out[idx]->sz*sizeof(long int)); (void)nco_zero_long(var_prc_out[idx]->sz,var_prc_out[idx]->tally); var_prc_out[idx]->val.vp=(void *)nco_malloc(var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type)); (void)nco_var_zero(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->val); } /* end if */ } /* end loop over idx */ #ifdef ENABLE_MPI /* NB: Only manager code manipulates value of TKN_WRT_FREE Pass 1: Workers construct local persistant variable lists Open first file mpncra and mpncrcat process first record only mpnces ingests complete file Workers create local list of their variables Pass 2: Complete record/file loops with local variable lists Workers skip first timestep (mpncra/mpncrcat) Workers process only variables in their local list from Pass 1 This variable persistance is necessary for mpncra and mpnces since their workers must maintain running tallies for each variable. Variable persistance is not necessary for mpncrcat However, we do it anyway to keep mpncrcat and mpncra similar mpncrcat writes records as it reads them and finishes after pass 2 Pass 3: mpnces and mpncra require a final loop to normalize and write Write-token for this loop is passed sequentially through the ranks */ /* Begin Pass 1: Workers construct local persistant variable lists */ fl_idx=0; /* Variables may have different ID, missing_value, type, in each file */ for(idx=0;idx= nco_dbg_std && lmt_rec->srt > lmt_rec->end) (void)fprintf(stdout,gettext("%s: WARNING %s (input file %d) is superfluous\n"),nco_prg_nm_get(),fl_in,fl_idx); idx_rec=lmt_rec->srt; if(fl_idx == fl_nbr-1 && idx_rec >= 1L+lmt_rec->end-lmt_rec->srd) LAST_RECORD=True; /* Process all variables in first record */ if(nco_dbg_lvl > nco_dbg_scl) (void)fprintf(stderr,gettext("Record %ld of %s is output record %ld\n"),idx_rec,fl_in,rec_usd_cml); if(prc_rnk == rnk_mgr){ /* MPI manager code */ /* Compensate for incrementing on each worker's first message */ var_wrt_nbr=-prc_nbr+1; idx=0; /* While variables remain to be processed or written... */ while(var_wrt_nbr < nbr_var_prc){ /* Receive any message from any worker */ MPI_Recv(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&mpi_stt); /* Obtain MPI message tag type */ msg_tag_typ=mpi_stt.MPI_TAG; /* Get sender's prc_rnk */ rnk_wrk=wrk_id_bfr[0]; /* Allocate next variable, if any, to worker */ if(msg_tag_typ == msg_tag_wrk_rqs){ var_wrt_nbr++; /* [nbr] Number of variables written */ /* Worker closed output file before sending msg_tag_wrk_rqs */ if(nco_prg_id == ncrcat) TKN_WRT_FREE=True; /* File written to at this point only for ncrcat */ if(idx > nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ /* csz: fxm Workers do not need to know Master's out_id */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs && nco_prg_id == ncrcat){ /* msg_tag_typ != msg_tag_wrk_rqs */ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ /* csz: fxm delete redundant statement with two lines further down */ wrk_id_bfr[0]=prc_rnk; var_wrt_nbr=0; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; /* csz: fxm dangerous---workers must get and use their own out_id's, not master's out_id */ out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass){ break; }else{ /* idx != idx_all_wrk_ass */ /* Assign this variable to this worker for rest of program */ lcl_idx_lst[lcl_nbr_var]=idx; /* csz: got to here reading logic */ lcl_nbr_var++; var_prc_out[idx]->id=msg_bfr[2]; if(nco_dbg_lvl >= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Update hyperslab start indices to current record for each variable */ var_prc[idx]->srt[0]=idx_rec; var_prc[idx]->end[0]=idx_rec; var_prc[idx]->cnt[0]=1L; /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); if(nco_prg_id == ncra){ /* Convert char, short, long, int, and float types to doubles before arithmetic */ /* Output variable type is "sticky" so only convert on first record */ if(rec_usd_cml == 0) var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ); /* Convert var_prc to type of var_prc_out in case type of variable on disk has changed */ var_prc[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc[idx]); /* Perform arithmetic operations: avg, min, max, ttl, ... */ nco_opr_drv(rec_usd_cml,nco_op_typ,var_prc[idx],var_prc_out[idx]); } /* !ncra */ /* Append current record to output file */ if(nco_prg_id == ncrcat){ var_prc_out[idx]->srt[0]=var_prc_out[idx]->end[0]=rec_usd_cml; var_prc_out[idx]->cnt[0]=1L; /* Replace this time_offset value with time_offset from initial file base_time */ if(CNV_ARM && !strcmp(var_prc[idx]->nm,"time_offset")) var_prc[idx]->val.dp[0]+=(base_time_crr-base_time_srt); /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); if(var_prc_out[idx]->sz_rec > 1L) (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc[idx]->val.vp,var_prc_out[idx]->type); else (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc[idx]->val.vp,var_prc_out[idx]->type); /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end if ncrcat */ /* Make sure record coordinate, if any, is monotonic */ if(nco_prg_id == ncrcat && var_prc[idx]->is_crd_var) (void)rec_crd_chk(var_prc[idx],fl_in,fl_out,idx_rec,rec_usd_cml); /* Convert missing_value, if any, back to unpacked type */ if(var_prc[idx]->has_mss_val && var_prc[idx]->type != var_prc[idx]->typ_upk && !LAST_RECORD) var_prc[idx]=nco_cnv_mss_val_typ(var_prc[idx],var_prc[idx]->typ_upk); /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); if(nco_dbg_lvl >= nco_dbg_var) (void)fprintf(stderr,"\n"); } /* !idx_all_wrk_ass */ } /* while(1) loop requesting work/token in Worker */ rec_usd_cml++; /* [idx] Index of current record in output file (0 is first, ...) */ } /* endif Worker */ printf("DEBUG: End of first pass of ncra/ncrcat at node %d\n",prc_rnk); /* End of ncra, ncrcat section */ }else{ /* ncfe */ if(prc_rnk == rnk_mgr){ /* MPI manager code */ /* Compensate for incrementing on each worker's first message */ var_wrt_nbr=-prc_nbr+1; idx=0; /* While variables remain to be processed or written... */ while(var_wrt_nbr < nbr_var_prc){ /* Receive message from any worker */ MPI_Recv(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&mpi_stt); /* Obtain MPI message tag type */ msg_tag_typ=mpi_stt.MPI_TAG; /* Get sender's prc_rnk */ rnk_wrk=wrk_id_bfr[0]; /* Allocate next variable, if any, to worker */ if(msg_tag_typ == msg_tag_wrk_rqs){ var_wrt_nbr++; /* [nbr] Number of variables written */ /* Worker closed output file before sending msg_tag_wrk_rqs */ /* TKN_WRT_FREE=True; ncfe does not do file write here */ if(idx > nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_wrk_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ lcl_idx_lst[lcl_nbr_var]=idx; /* storing the indices for subsequent processing by the worker */ lcl_nbr_var++; var_prc_out[idx]->id=msg_bfr[2]; if(nco_dbg_lvl >= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); /* Convert char, short, long, int, and float types to doubles before arithmetic */ /* var_prc[idx]=nco_typ_cnv_rth(var_prc[idx],nco_op_typ); */ /* Output variable type is "sticky" so only convert on first record */ if(fl_idx == 0) var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ); /* Convert var_prc to type of var_prc_out in case type of variable on disk has changed */ var_prc[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc[idx]); /* Perform arithmetic operations: avg, min, max, ttl, ... */ /* Note: fl_idx not rec_usd_cml! */ nco_opr_drv(fl_idx,nco_op_typ,var_prc[idx],var_prc_out[idx]); /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); } /* !idx_all_wrk_ass */ } /* while(1) loop requesting work/token in Worker */ } /* endif Worker */ } /* end else ncfe */ if(nco_dbg_lvl > nco_dbg_scl) (void)fprintf(stderr,"\n"); /* Close input netCDF file */ nco_close(in_id); #ifdef ENABLE_MPI /* This barrier ensures that all nodes have reached this point together. Otherwise, the manager code should be altered so it can deal with nodes in different stages of execution at any time. Daniel: I think we should be convinced of this parallelization structure before bothering with implementing the code restructuring in the manager that would let us remove the barrier. The barrier should only negligibly impact performance. */ checkpointMpi(prc_rnk, 1); #endif /* ENABLE_MPI */ /* End Pass 1: Workers construct local persistant variable lists */ printf("DEBUG: prc_rnk %d is done with 1st pass\n",prc_rnk); /* Begin Pass 2: Complete record/file loops with local variable lists */ #endif /* !ENABLE_MPI */ /* Loop over input files */ for(fl_idx=0;fl_idx= nco_dbg_fl) (void)fprintf(stderr,gettext("\nInput file %d is %s; "),fl_idx,fl_in); /* Make sure file is on local system and is readable or die trying */ if(fl_idx != 0) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,gettext("local file %s:\n"),fl_in); /* Open file once per thread to improve caching */ for(thr_idx=0;thr_idx= nco_dbg_std && lmt_rec->srt > lmt_rec->end) (void)fprintf(stdout,gettext("%s: WARNING %s (input file %d) is superfluous\n"),nco_prg_nm_get(),fl_in,fl_idx); for(idx_rec=lmt_rec->srt;idx_rec<=lmt_rec->end;idx_rec+=lmt_rec->srd){ if(fl_idx == fl_nbr-1 && idx_rec >= 1L+lmt_rec->end-lmt_rec->srd) LAST_RECORD=True; #ifdef ENABLE_MPI if(fl_idx == 0 && idx_rec == lmt_rec->srt){ /* MPI operators processed first record in first-stage loop */ continue; }else{ /* a loop of idx = stored indices */ if(prc_rnk == rnk_mgr){ /* For ncrcat, Manager gives write access for each record in each file */ if(nco_prg_id == ncrcat){ /* Give Write access to write current record */ /* var_wrt_nbr=-prc_nbr+1; */ var_wrt_nbr=0; while(var_wrt_nbr < nbr_var_prc){ /* Give write access to Workers who have some variables; wrong condn? */ /* Receive message from any worker */ MPI_Recv(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&mpi_stt); /* Obtain MPI message tag type */ msg_tag_typ=mpi_stt.MPI_TAG; /* Get sender's prc_rnk */ rnk_wrk=wrk_id_bfr[0]; if(msg_tag_typ == msg_tag_wrk_done) TKN_WRT_FREE=True; if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ if(rnk_wrk == tkn_wrt_rnk){ /* Prev write completed */ TKN_WRT_FREE=True; } /* rnk_wrk != tkn_wrt_rnk */ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ tkn_wrt_rnk=rnk_wrk; /* To track who has the token */ var_wrt_nbr++; }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* End-while token request loop */ } /* !ncrcat */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; var_wrt_nbr=0; /* if(fl_idx == 0 && idx_rec == lmt_rec->srt) continue; else a loop of idx = stored indices */ for(jdx=0;jdx nco_dbg_scl) (void)fprintf(stderr,gettext("Record %ld of %s is output record %ld\n"),idx_rec,fl_in,rec_usd_cml); #if 0 /* NB: Immediately preceding MPI for scope confounds Emacs indentation Fake end scope restores correct indentation, simplifies code-checking */ } /* fake end for */ #endif /* !0 */ #ifndef ENABLE_MPI #ifdef _OPENMP #pragma omp parallel for default(none) private(idx,in_id) shared(CNV_ARM,base_time_crr,base_time_srt,nco_dbg_lvl,fl_in,fl_out,idx_rec,rec_usd_cml,in_id_arr,LAST_RECORD,nbr_var_prc,nco_op_typ,out_id,prg,rcd,var_prc,var_prc_out) #endif /* !_OPENMP */ /* UP and SMP codes main loop over variables */ for(idx=0;idx= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Update hyperslab start indices to current record for each variable */ var_prc[idx]->srt[0]=idx_rec; var_prc[idx]->end[0]=idx_rec; var_prc[idx]->cnt[0]=1L; /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); if(nco_prg_id == ncra){ /* Convert char, short, long, int, and float types to doubles before arithmetic */ var_prc[idx]=nco_typ_cnv_rth(var_prc[idx],nco_op_typ); /* Output variable type is "sticky" so only convert on first record */ if(rec_usd_cml == 0) var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ); /* Convert var_prc to type of var_prc_out in case type of variable on disk has changed */ var_prc[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc[idx]); /* Perform arithmetic operations: avg, min, max, ttl, ... */ nco_opr_drv(rec_usd_cml,nco_op_typ,var_prc[idx],var_prc_out[idx]); } /* end if ncra */ /* Append current record to output file */ if(nco_prg_id == ncrcat){ var_prc_out[idx]->srt[0]=var_prc_out[idx]->end[0]=rec_usd_cml; var_prc_out[idx]->cnt[0]=1L; /* Replace this time_offset value with time_offset from initial file base_time */ if(CNV_ARM && !strcmp(var_prc[idx]->nm,"time_offset")) var_prc[idx]->val.dp[0]+=(base_time_crr-base_time_srt); #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ rcd=nco_fl_open(fl_out_tmp,NC_WRITE|NC_SHARE,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #else /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* _OPENMP */ #endif /* !ENABLE_MPI */ if(var_prc_out[idx]->sz_rec > 1) (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc[idx]->val.vp,var_prc_out[idx]->type); else (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc[idx]->val.vp,var_prc_out[idx]->type); #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ #endif /* !ENABLE_MPI */ } /* end if ncrcat */ /* Make sure record coordinate, if any, is monotonic */ if(nco_prg_id == ncrcat && var_prc[idx]->is_crd_var) (void)rec_crd_chk(var_prc[idx],fl_in,fl_out,idx_rec,rec_usd_cml); /* Convert missing_value, if any, back to disk type */ if(var_prc[idx]->has_mss_val && var_prc[idx]->type != var_prc[idx]->typ_upk && !LAST_RECORD) var_prc[idx]=nco_cnv_mss_val_typ(var_prc[idx],var_prc[idx]->typ_upk); /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); } /* end (OpenMP Parallel for) loop over variables */ #ifdef ENABLE_MPI if(nco_prg_id == ncrcat){ /* Return token after writing record's last variable */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_done,MPI_COMM_WORLD); } /* !ncrcat */ #endif /* !ENABLE_MPI */ rec_usd_cml++; /* [idx] Index of current record in output file (0 is first, ...) */ if(nco_dbg_lvl >= nco_dbg_var) (void)fprintf(stderr,"\n"); #ifdef ENABLE_MPI } /* !Worker */ } /* end else ! fl_idx=0,idx_rec=srt */ #endif /* !ENABLE_MPI */ } /* end loop over idx_rec */ #ifdef ENABLE_MPI if(prc_rnk != rnk_mgr){ /* Only Worker */ #endif /* !ENABLE_MPI */ /* Warn if fewer than number of requested records were read and final file has been processed */ if(lmt_rec->lmt_typ == lmt_dmn_idx && lmt_rec->is_usr_spc_min && lmt_rec->is_usr_spc_max){ long rec_nbr_rqs; /* Number of records user requested */ rec_nbr_rqs=1L+(lmt_rec->max_idx-lmt_rec->min_idx)/lmt_rec->srd; if(nco_dbg_lvl >= nco_dbg_std && fl_idx == fl_nbr-1 && rec_nbr_rqs != rec_usd_cml) (void)fprintf(stdout,gettext("%s: WARNING User requested %li records but only %li were found\n"),nco_prg_nm_get(),rec_nbr_rqs,rec_usd_cml); } /* end if */ /* Error if no records were read and final file has been processed */ if(rec_usd_cml <= 0 && fl_idx == fl_nbr-1){ (void)fprintf(stdout,gettext("%s: ERROR No records lay within specified hyperslab\n"),nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ #ifdef ENABLE_MPI } /* !Worker */ printf("DEBUG: prc_rnk %d at the end of ncra/rcat\n",prc_rnk); #endif /* !ENABLE_MPI */ /* End of ncra, ncrcat section */ }else{ /* ncfe */ #ifdef ENABLE_MPI if(prc_rnk != rnk_mgr){ /* Only Worker does the ncfe processing */ if(fl_idx == 0){ continue; }else{ /* a loop of idx = stored indices */ for(jdx=0;jdx= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Retrieve variable from disk into memory */ /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); /* Convert char, short, long, int, and float types to doubles before arithmetic */ /* var_prc[idx]=nco_typ_cnv_rth(var_prc[idx],nco_op_typ); */ /* Output variable type is "sticky" so only convert on first record */ if(fl_idx == 0) var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ); /* Convert var_prc to type of var_prc_out in case type of variable on disk has changed */ var_prc[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc[idx]); /* Perform arithmetic operations: avg, min, max, ttl, ... */ /* Note: fl_idx not rec_usd_cml! */ nco_opr_drv(fl_idx,nco_op_typ,var_prc[idx],var_prc_out[idx]); /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); } /* end (OpenMP parallel for) loop over idx */ #ifdef ENABLE_MPI } /* end else !fl_idx=0 */ } /* !Worker */ #endif /* !ENABLE_MPI */ } /* end else ncfe */ if(nco_dbg_lvl > nco_dbg_scl) (void)fprintf(stderr,"\n"); /* Close input netCDF file */ for(thr_idx=0;thr_idxis_crd_var){ /* Return linear averages of coordinates unless computing extrema Prevent coordinate variables from encountering nco_var_nrm_sdn() */ if((nco_op_typ != nco_op_min) && (nco_op_typ != nco_op_max)) (void)nco_var_nrm(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->tally,var_prc_out[idx]->val); }else{ /* !var_prc[idx]->is_crd_var */ switch(nco_op_typ){ case nco_op_avg: /* Normalize sum by tally to create mean */ case nco_op_sqrt: /* Normalize sum by tally to create mean */ case nco_op_sqravg: /* Normalize sum by tally to create mean */ case nco_op_rms: /* Normalize sum of squares by tally to create mean square */ case nco_op_avgsqr: /* Normalize sum of squares by tally to create mean square */ (void)nco_var_nrm(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->tally,var_prc_out[idx]->val); break; case nco_op_rmssdn: /* Normalize sum of squares by tally-1 to create mean square for sdn */ (void)nco_var_nrm_sdn(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->tally,var_prc_out[idx]->val); break; case nco_op_min: /* Minimum is already in buffer, do nothing */ case nco_op_max: /* Maximum is already in buffer, do nothing */ case nco_op_ttl: /* Total is already in buffer, stuff missing values into elements with zero tally */ (void)nco_var_tll_zro_mss_val(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->tally,var_prc_out[idx]->val); default: break; } /* end switch */ /* Some operations require additional processing */ switch(nco_op_typ){ case nco_op_rms: /* Take root of mean of sum of squares to create root mean square */ case nco_op_rmssdn: /* Take root of sdn mean of sum of squares to create root mean square for sdn */ case nco_op_sqrt: /* Take root of mean to create root mean */ (void)nco_var_sqrt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->tally,var_prc_out[idx]->val,var_prc_out[idx]->val); break; case nco_op_sqravg: /* Square mean to create square of the mean (for sdn) */ (void)nco_var_mlt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->val,var_prc_out[idx]->val); break; default: break; } /* end switch */ } /* !var_prc[idx]->is_crd_var */ var_prc_out[idx]->tally=var_prc[idx]->tally=(long *)nco_free(var_prc[idx]->tally); } /* end (OpenMP parallel for) loop over variables */ #ifdef ENABLE_MPI printf("DEBUG: End of Normzn at prc_rnk %d\n",prc_rnk); } /* prc_rnk == rnk_mgr */ for(idx = 0; idx < nbr_var_prc; idx++) { assert(var_prc_out[idx]->tally == var_prc[idx]->tally); if (var_prc_out[idx]->tally == 0) continue; printf("DEBUG: node %d reset idx %d tally for var_prc(out) (cleanup)\n",prc_rnk,idx); var_prc_out[idx]->tally=var_prc[idx]->tally=(long *)nco_free(var_prc[idx]->tally); } printf("DEBUG: Mgr shud prnt this too, prc_rnk %d\n",prc_rnk); #endif /* !ENABLE_MPI */ } /* !ncra/ncfe */ #ifdef ENABLE_MPI printf("DEBUG: After all processing; Before barrier, prc_rnk %d\n",prc_rnk); if(prc_rnk == rnk_mgr){ /* Only Manager */ rcd=nco_fl_open(fl_out_tmp,NC_WRITE|NC_SHARE,&bfr_sz_hnt,&out_id); printf("DEBUG: prc_rnk %d opened out file\n",prc_rnk); #endif /* !ENABLE_MPI */ /* Manually fix YYMMDD date which was mangled by averaging */ if(CNV_CCM_CCSM_CF && nco_prg_id == ncra) (void)nco_cnv_ccm_ccsm_cf_date(out_id,var_out,xtr_nbr); /* End Pass 2: Complete record/file loops with local variable lists */ /* Begin Pass 3: */ /* End Pass 3: */ /* Add time variable to output file NB: nco_cnv_arm_time_install() contains OpenMP critical region */ if(CNV_ARM && nco_prg_id == ncrcat) (void)nco_cnv_arm_time_install(out_id,base_time_srt,dfl_lvl); #ifdef ENABLE_MPI nco_close(out_id); printf("DEBUG: Mgr prc_rnk %d closed out file %d after fixing date, time \n", prc_rnk, out_id); MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk+1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); printf("DEBUG: Mgr sent token to worker 1 for final write\n"); }else{ /* Workers */ printf("DEBUG: prc_rnk %d waiting for msg from Mgr for final write\n",prc_rnk); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk-1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); printf("DEBUG: prc_rnk %d got token for final write to %d\n",prc_rnk, out_id); if(nco_prg_id == ncra || nco_prg_id == ncfe){ /* Copy averages to output file and free averaging buffers */ rcd=nco_fl_open(fl_out_tmp,NC_WRITE|NC_SHARE,&bfr_sz_hnt,&out_id); printf("DEBUG: prc_rnk %d opened output file for final write\n",prc_rnk); for(jdx=0;jdxval.ip[0]); */ var_prc_out[idx]=nco_var_cnf_typ(var_prc_out[idx]->typ_upk,var_prc_out[idx]); /* printf("DEBUG: After nco_var_cnf_typ prc_rnk %d var val %f\n",prc_rnk,var_prc_out[idx]->val.ip[0]); */ /* Packing/Unpacking */ if(nco_pck_plc == nco_pck_plc_all_new_att) var_prc_out[idx]=nco_put_var_pck(out_id,var_prc_out[idx],nco_pck_plc); printf("DEBUG: prc_rnk %d to final write var %s with idx %d val %g\n",prc_rnk,var_prc_out[idx]->nm,idx,var_prc_out[idx]->val.fp[0]); if(var_prc_out[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); }else{ /* end if variable is scalar */ /* Size of record dimension is one in output file */ if(nco_prg_id == ncra) var_prc_out[idx]->cnt[0]=1L; (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); } /* end if variable is an array */ var_prc_out[idx]->val.vp=nco_free(var_prc_out[idx]->val.vp); } /* end loop over jdx */ /* Close output file */ nco_close(out_id); printf("DEBUG: prc_rnk %d closed out file after writing\n",prc_rnk); /* Send Token to Manager */ } /* end if */ if(prc_rnk == prc_nbr-1) MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); else MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,prc_rnk+1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* !Workers */ if(prc_rnk == rnk_mgr){ /* Only Manager */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,prc_nbr-1,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); (void)nco_fl_mv(fl_out_tmp,fl_out); } /* !Manager */ MPI_Finalize(); #else /* !ENABLE_MPI */ /* Copy averages to output file and free averaging buffers */ if(nco_prg_id == ncra || nco_prg_id == ncfe){ for(idx=0;idxtyp_upk,var_prc_out[idx]); /* Packing/Unpacking */ if(nco_pck_plc == nco_pck_plc_all_new_att) var_prc_out[idx]=nco_put_var_pck(out_id,var_prc_out[idx],nco_pck_plc); if(var_prc_out[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); }else{ /* end if variable is scalar */ /* Size of record dimension is 1 in output file */ if(nco_prg_id == ncra) var_prc_out[idx]->cnt[0]=1L; (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); } /* end if variable is an array */ var_prc_out[idx]->val.vp=nco_free(var_prc_out[idx]->val.vp); } /* end loop over idx */ } /* end if */ /* Close output file and move it from temporary to permanent location */ (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id); #endif /* !ENABLE_MPI */ /* Clean memory unless dirty memory allowed */ if(flg_cln){ /* ncra-specific memory cleanup */ if(nco_prg_id == ncra || nco_prg_id == ncrcat) lmt_rec=nco_lmt_free(lmt_rec); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_arr) in_id_arr=(int *)nco_free(in_id_arr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr); if(nbr_dmn_xtr > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_xtr); #if 1 /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); #endif /* !1 */ #if 0 /* 20051027: Try ncwa free()'ing technique to avoid freeing dangling pointers */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); /* ncwa uses nco_var_lst_free() on var_prc_out because var_out has dangling pointers */ if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix); if(nbr_var_prc > 0) var_prc_out=nco_var_lst_free(var_prc_out,nbr_var_prc); var_prc=(var_sct **)nco_free(var_prc); var_fix=(var_sct **)nco_free(var_fix); var_out=(var_sct **)nco_free(var_out); #endif /* !0 */ } /* !flg_cln */ nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/mpncwa.c000066400000000000000000001775241264355130400153250ustar00rootroot00000000000000/* $Header$ */ /* mpncwa -- netCDF weighted averager */ /* Purpose: Compute averages of specified hyperslabs of specfied variables in a single input netCDF file and output them to a single file. */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* fxm: 19981202 Deactivated -n and -W switches while I rethink the normalization switches */ /* Usage: ncwa -O -a lon ~/nco/data/in.nc ~/foo.nc ncwa -O -R -p /ZENDER/tmp -l ~/nco/data in.nc ~/foo.nc ncwa -O -C -a lat,lon,time -w gw -v PS -p /fs/cgd/csm/input/atm SEP1.T42.0596.nc ~/foo.nc;ncks -H foo.nc scp ~/nco/src/nco/ncwa.c esmf.ess.uci.edu:nco/src/nco */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI #include /* MPI definitions */ #include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "ncap.h" /* netCDF arithmetic processor-specific definitions (symbol table, ...) */ #include "libnco.h" /* netCDF Operator (NCO) library */ /* Global variables (keep consistent with global variables declared in ncap.c) */ size_t ncap_ncl_dpt_crr=0UL; /* [nbr] Depth of current #include file (incremented in ncap.l) */ size_t *ncap_ln_nbr_crr; /* [cnt] Line number (incremented in ncap.l) */ char **ncap_fl_spt_glb; /* [fl] Script file */ int main(int argc,char **argv) { char **dmn_avg_lst_in=NULL_CEWI; /* Option a */ char **fl_lst_abb=NULL; /* Option n */ char **fl_lst_in=NULL_CEWI; char **var_lst_in=NULL_CEWI; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL_CEWI; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *msk_nm=NULL; char *msk_cnd_sng=NULL; /* Mask string to be "parsed" and values given to msk_nm, msk_val, op_typ_rlt */ char *nco_op_typ_sng; /* Operation type */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char *wgt_nm=NULL; const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467Aa:B:bCcD:d:FhIL:l:M:m:nNOo:p:rRST:t:v:Ww:xy:-:"; cnk_dmn_sct **cnk_dmn=NULL_CEWI; #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.MRV_flg=False,.flg_ddra=False,.lmn_nbr=0LL,.lmn_nbr_avg=0LL,.lmn_nbr_wgt=0LL,.nco_op_typ=nco_op_nil,.rnk_avg=0,.rnk_var=0,.rnk_wgt=0,.tmr_flg=nco_tmr_srt,.var_idx=0,.wgt_brd_flg=False,.wrd_sz=0}; #endif /* !__cplusplus */ dmn_sct **dim=NULL_CEWI; dmn_sct **dmn_out=NULL_CEWI; dmn_sct **dmn_avg=NULL_CEWI; double msk_val=1.0; /* Option M */ extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ int *in_id_arr; int abb_arg_nbr=0; int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int dmn_avg_nbr=0; int fl_idx=int_CEWI; int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx=int_CEWI; int idx_avg; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_dmn_out=0; int nbr_dmn_xtr; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int nco_op_typ=nco_op_avg; /* Operation type */ int op_typ_rlt=0; /* Option o */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int rec_dmn_id=NCO_REC_DMN_UNDEFINED; /* [id] Record dimension ID in input file */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; lmt_sct **lmt; nco_bool CNV_CCM_CCSM_CF; nco_bool DO_CONFORM_MSK=False; /* Did nco_var_cnf_dmn() find truly conforming mask? */ nco_bool DO_CONFORM_WGT=False; /* Did nco_var_cnf_dmn() find truly conforming weight? */ nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MULTIPLY_BY_TALLY=False; /* Not currently implemented */ nco_bool MUST_CONFORM=False; /* [flg] Must nco_var_cnf_dmn() find truly conforming variables? */ nco_bool NORMALIZE_BY_TALLY=True; /* Not currently implemented */ nco_bool NORMALIZE_BY_WEIGHT=True; /* Not currently implemented */ nco_bool NRM_BY_DNM=True; /* Option N Normalize by denominator */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WGT_MSK_CRD_VAR=True; /* [flg] Weight and/or mask coordinate variables */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */ nco_bool flg_opt_a=False; /* Option a */ nco_bool flg_rdd=False; /* [flg] Retain degenerate dimensions */ nm_id_sct *dmn_lst; nm_id_sct *xtr_lst=NULL; /* xtr_lst may be alloc()'d from NULL with -c option */ nm_id_sct *dmn_avg_lst; prs_sct prs_arg; /* I/O [sct] Global information required in ncwa parser */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc; var_sct **var_prc_out; var_sct *msk=NULL; var_sct *msk_out=NULL; var_sct *wgt=NULL; var_sct *wgt_avg=NULL; var_sct *wgt_out=NULL; #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Status mpi_stt; /* [enm] Status check to decode msg_tag_typ */ nco_bool TKN_WRT_FREE=True; /* [flg] Write-access to output file is available */ int fl_nm_lng; /* [nbr] Output file name length */ int msg_bfr[msg_bfr_lng]; /* [bfr] Buffer containing var, idx, tkn_wrt_rsp */ int msg_tag_typ; /* [enm] MPI message tag type */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ int tkn_wrt_rsp; /* [enm] Response to request for write token */ int var_wrt_nbr=0; /* [nbr] Variables written to output file until now */ int rnk_wrk; /* [idx] Worker rank */ int wrk_id_bfr[wrk_id_bfr_lng]; /* [bfr] Buffer for rnk_wrk */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"ddra",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"mdl_cmp",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"average",required_argument,0,'a'}, {"avg",required_argument,0,'a'}, {"append",no_argument,0,'A'}, {"mask_condition",required_argument,0,'B'}, {"msk_cnd_sng",required_argument,0,'B'}, {"retain-degenerate-dimensions",no_argument,0,'b'}, /* [flg] Retain degenerate dimensions */ {"rdd",no_argument,0,'b'}, /* [flg] Retain degenerate dimensions */ {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"wgt_msk_crd_var",no_argument,0,'I'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"mask-variable",required_argument,0,'m'}, {"mask_variable",required_argument,0,'m'}, {"mask",required_argument,0,'m'}, {"msk_var",required_argument,0,'m'}, {"msk_nm",required_argument,0,'m'}, {"mask-value",required_argument,0,'M'}, {"mask_value",required_argument,0,'M'}, {"msk_val",required_argument,0,'M'}, {"nintap",required_argument,0,'n'}, {"nmr",no_argument,0,'N'}, {"numerator",no_argument,0,'N'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"suspend", no_argument,0,'S'}, {"mask_comparator",required_argument,0,'T'}, {"msk_cmp_typ",required_argument,0,'T'}, {"op_rlt",required_argument,0,'T'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"normalize-by-tally",no_argument,0,'W',}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"weight",no_argument,0,'w'}, {"wgt",no_argument,0,'w'}, {"wgt_var",no_argument,0,'w'}, {"operation",required_argument,0,'y'}, {"op_typ",required_argument,0,'y'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef ENABLE_MPI /* MPI Initialization */ MPI_Init(&argc,&argv); MPI_Comm_size(MPI_COMM_WORLD,&prc_nbr); MPI_Comm_rank(MPI_COMM_WORLD,&prc_rnk); #endif /* !ENABLE_MPI */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); NORMALIZE_BY_TALLY=NORMALIZE_BY_TALLY; /* CEWI: Avert compiler warning that variable is set but never used */ NORMALIZE_BY_WEIGHT=NORMALIZE_BY_WEIGHT; /* CEWI: Avert compiler warning that variable is set but never used */ /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'a': /* Dimensions over which to average hyperslab */ if(flg_opt_a){ (void)fprintf(fp_stdout,"%s: ERROR Option -a appears more than once\n",nco_prg_nm); (void)fprintf(fp_stdout,"%s: HINT Use -a dim1,dim2,... not -a dim1 -a dim2 ...\n",nco_prg_nm); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* endif */ dmn_avg_lst_in=nco_lst_prs_2D(optarg,",",&dmn_avg_nbr); flg_opt_a=True; break; case 'B': /* Mask string to be parsed */ msk_cnd_sng=(char *)strdup(optarg); break; case 'b': /* [flg] Retain degenerate dimensions */ flg_rdd=True; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'I': /* [flg] Weight and/or mask coordinate variables */ WGT_MSK_CRD_VAR=!WGT_MSK_CRD_VAR; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'm': /* Name of variable to use as mask in reducing. Default is none */ msk_nm=(char *)strdup(optarg); break; case 'M': /* Good data defined by relation to mask value. Default is 1. */ msk_val=strtod(optarg,&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtod",sng_cnv_rcd); break; case 'N': NRM_BY_DNM=False; NORMALIZE_BY_TALLY=False; NORMALIZE_BY_WEIGHT=False; break; case 'n': NORMALIZE_BY_WEIGHT=False; (void)fprintf(fp_stdout,"%s: ERROR This option has been disabled while I rethink its implementation\n",nco_prg_nm); nco_exit(EXIT_FAILURE); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(fp_stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 'T': /* Relational operator type. Default is 0, eq, equality */ op_typ_rlt=nco_op_prs_rlt(optarg); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'W': NORMALIZE_BY_TALLY=False; (void)fprintf(fp_stdout,"%s: ERROR This option has been disabled while I rethink its implementation\n",nco_prg_nm); nco_exit(EXIT_FAILURE); break; case 'w': /* Variable to use as weight in reducing. Default is none */ wgt_nm=(char *)strdup(optarg); break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case 'y': /* Operation type */ nco_op_typ_sng=(char *)strdup(optarg); nco_op_typ=nco_op_typ_get(nco_op_typ_sng); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Parse mask string */ if(msk_cnd_sng){ int cst_zero=0; /* Set arguments for scan */ prs_arg.fl_in=NULL; /* [sng] Input data file */ prs_arg.in_id=0; /* [id] Input data file ID */ prs_arg.fl_out=NULL; /* [sng] Output data file */ prs_arg.out_id=0; /* [id] Output data file ID */ prs_arg.att_lst=NULL; /* [sct] Attributes in script */ prs_arg.nbr_att=&cst_zero; /* [nbr] Number of attributes in script */ prs_arg.dmn_in=NULL; /* [dmn_in] List of all dimensions in input */ prs_arg.nbr_dmn_in=0; /* [nbr] Number of dimensions in input */ prs_arg.dmn_out=NULL; /* [sct] Pointer to output dimension list */ prs_arg.nbr_dmn_out=&cst_zero; /* [nbr] Number of dimensions in output list */ prs_arg.sym_tbl=NULL; /* [fnc] Symbol table for functions */ prs_arg.sym_tbl_nbr=0; /* [nbr] Number of functions in table */ prs_arg.ntl_scn=False; /* [flg] Initial scan of script */ prs_arg.var_LHS=NULL; /* [var] LHS cast variable */ prs_arg.nco_op_typ=nco_op_nil; /* [enm] Operation type */ /* Initialize line counter */ ncap_ln_nbr_crr=(size_t *)nco_realloc(ncap_ln_nbr_crr,ncap_ncl_dpt_crr+1UL); ncap_ln_nbr_crr[ncap_ncl_dpt_crr]=1UL; /* [cnt] Line number incremented in ncap.l */ if(ncap_ncwa_scn(&prs_arg,msk_cnd_sng,&msk_nm,&msk_val,&op_typ_rlt) == 0) nco_exit(EXIT_FAILURE); } /* endif msk_cnd_sng */ /* Ensure we do not attempt to normalize by non-existent weight */ if(wgt_nm == NULL) NORMALIZE_BY_WEIGHT=False; /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); /* Get number of variables, dimensions, and record dimension ID of input file */ (void)nco_inq(in_id,&nbr_dmn_fl,&nbr_var_fl,(int *)NULL,&rec_dmn_id); (void)nco_inq_format(in_id,&fl_in_fmt); /* Form initial extraction list which may include extended regular expressions */ xtr_lst=nco_var_lst_mk(in_id,nbr_var_fl,var_lst_in,EXCLUDE_INPUT_LIST,EXTRACT_ALL_COORDINATES,&xtr_nbr); /* Change included variables to excluded variables */ if(EXCLUDE_INPUT_LIST) xtr_lst=nco_var_lst_xcl(in_id,nbr_var_fl,xtr_lst,&xtr_nbr); /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id); /* Add all coordinate variables to extraction list */ if(EXTRACT_ALL_COORDINATES) xtr_lst=nco_var_lst_crd_add(in_id,nbr_dmn_fl,nbr_var_fl,xtr_lst,&xtr_nbr,CNV_CCM_CCSM_CF); /* Extract coordinates associated with extracted variables */ if(EXTRACT_ASSOCIATED_COORDINATES) xtr_lst=nco_var_lst_crd_ass_add(in_id,xtr_lst,&xtr_nbr,CNV_CCM_CCSM_CF); /* Sort extraction list by variable ID for fastest I/O */ if(xtr_nbr > 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* Find coordinate/dimension values associated with user-specified limits NB: nco_lmt_evl() with same nc_id contains OpenMP critical region */ for(idx=0;idx 0) (void)nco_dmn_lmt_mrg(dim,nbr_dmn_xtr,lmt,lmt_nbr); /* Not specifying any dimensions is interpreted as specifying all dimensions */ if(dmn_avg_nbr == 0){ dmn_avg_nbr=nbr_dmn_xtr; dmn_avg_lst_in=(char **)nco_malloc(dmn_avg_nbr*sizeof(char *)); for(idx=0;idx 0){ if(dmn_avg_nbr > nbr_dmn_xtr){ (void)fprintf(fp_stdout,"%s: ERROR More reducing dimensions than extracted dimensions\n",nco_prg_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Create structured list of reducing dimension names and IDs */ dmn_avg_lst=nco_dmn_lst_mk(in_id,dmn_avg_lst_in,dmn_avg_nbr); /* Dimension average list no longer needed */ if(dmn_avg_nbr > 0) dmn_avg_lst_in=nco_sng_lst_free(dmn_avg_lst_in,dmn_avg_nbr); /* Form list of reducing dimensions from extracted input dimensions */ dmn_avg=(dmn_sct **)nco_malloc(dmn_avg_nbr*sizeof(dmn_sct *)); for(idx_avg=0;idx_avgnm)) break; } /* end loop over idx_avg */ if(idx != nbr_dmn_xtr){ dmn_avg[idx_avg]=dim[idx]; }else{ (void)fprintf(stderr,"%s: WARNING reducing dimension \"%s\" is not contained in any variable in extraction list\n",nco_prg_nm,dmn_avg_lst[idx_avg].nm); /* Collapse dimension average list by omitting irrelevent dimension */ (void)memmove(dmn_avg_lst+idx_avg*sizeof(nm_id_sct),dmn_avg_lst+(idx_avg+1)*sizeof(nm_id_sct),(dmn_avg_nbr-idx_avg-1)*sizeof(nm_id_sct)); --dmn_avg_nbr; dmn_avg_lst=(nm_id_sct *)nco_realloc(dmn_avg_lst,dmn_avg_nbr*sizeof(nm_id_sct)); dmn_avg=(dmn_sct **)nco_realloc(dmn_avg,dmn_avg_nbr*sizeof(dmn_sct *)); } /* end else */ } /* end loop over idx_avg */ /* Make sure no reducing dimension is specified more than once */ for(idx=0;idxid == dmn_avg[idx_avg]->id){ (void)fprintf(fp_stdout,"%s: ERROR %s specified more than once in reducing list\n",nco_prg_nm,dmn_avg[idx]->nm); nco_exit(EXIT_FAILURE); } /* end if */ } /* end if */ } /* end loop over idx_avg */ } /* end loop over idx */ /* Averaged dimensions appear in output file iff flg_rdd is set */ dmn_out=(dmn_sct **)nco_malloc((flg_rdd ? nbr_dmn_xtr : nbr_dmn_xtr-dmn_avg_nbr)*sizeof(dmn_sct *)); nbr_dmn_out=0; for(idx=0;idxnm)) break; } /* end loop over idx_avg */ if(idx_avg == dmn_avg_nbr || flg_rdd){ /* Output list comprises non-averaged and, if specified, degenerate dimensions */ dmn_out[nbr_dmn_out]=nco_dmn_dpl(dim[idx]); (void)nco_dmn_xrf(dim[idx],dmn_out[nbr_dmn_out]); if(idx_avg != dmn_avg_nbr && flg_rdd){ /* Cut degenerate dimensions down to size */ dmn_out[nbr_dmn_out]->cnt=1L; dmn_out[nbr_dmn_out]->srt=dmn_out[nbr_dmn_out]->end=0L; } /* !flg_rdd */ nbr_dmn_out++; } /* end if idx_avg */ } /* end loop over idx_xtr */ /* Dimension average list no longer needed */ dmn_avg_lst=nco_nm_id_lst_free(dmn_avg_lst,dmn_avg_nbr); if(nbr_dmn_out != (flg_rdd ? nbr_dmn_xtr : nbr_dmn_xtr-dmn_avg_nbr)){ (void)fprintf(fp_stdout,"%s: ERROR nbr_dmn_out != %s\n",nco_prg_nm,(flg_rdd) ? "nbr_dmn_xtr" : "nbr_dmn_xtr-dmn_avg_nbr"); nco_exit(EXIT_FAILURE); } /* end if */ } /* dmn_avg_nbr <= 0 */ /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idx= nco_dbg_var){ for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var[idx]->nm,var[idx]->id); for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var_fix[idx]->nm,var_fix[idx]->id); for(idx=0;idxnm = %s, ->id=[%d]\n",idx,var_prc[idx]->nm,var_prc[idx]->id); } /* end if */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt; /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); if(nco_dbg_lvl >= nco_dbg_sbr) (void)fprintf(stderr,"Input, output file IDs = %d, %d\n",in_id,out_id); /* Copy all global attributes */ (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); #ifdef ENABLE_MPI /* Initialize MPI task information */ if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ /* Define dimensions in output file */ (void)nco_dmn_dfn(fl_out,out_id,dmn_out,nbr_dmn_out); /* Define variables in output file, copy their attributes */ (void)nco_var_dfn(in_id,fl_out,out_id,var_out,xtr_nbr,dmn_out,nbr_dmn_out,nco_pck_plc_nil,nco_pck_map_nil,dfl_lvl); #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Add new missing values to output file while in define mode */ if(msk_nm){ for(idx=0;idxhas_mss_val){ var_prc_out[idx]->has_mss_val=True; var_prc_out[idx]->mss_val=nco_mss_val_mk(var_prc[idx]->type); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr) #endif /* !ENABLE_MPI */ (void)nco_put_att(out_id,var_prc_out[idx]->id,nco_mss_val_sng_get(),var_prc_out[idx]->type,1,var_prc_out[idx]->mss_val.vp); } /* end if */ } /* end for */ } /* end if */ #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr){ /* MPI manager code */ #endif /* !ENABLE_MPI */ /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ #ifdef ENABLE_MPI } /* prc_rnk != rnk_mgr */ /* Manager obtains output filename and broadcasts to workers */ if(prc_rnk == rnk_mgr) fl_nm_lng=(int)strlen(fl_out_tmp); MPI_Bcast(&fl_nm_lng,1,MPI_INT,0,MPI_COMM_WORLD); if(prc_rnk != rnk_mgr) fl_out_tmp=(char *)nco_malloc((fl_nm_lng+1)*sizeof(char)); MPI_Bcast(fl_out_tmp,fl_nm_lng+1,MPI_CHAR,0,MPI_COMM_WORLD); if(prc_rnk == rnk_mgr){ /* MPI manager code */ TKN_WRT_FREE=False; #endif /* !ENABLE_MPI */ /* Copy variable data for non-processed variables */ (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix); #ifdef ENABLE_MPI /* Close output file so workers can open it */ nco_close(out_id); TKN_WRT_FREE=True; } /* prc_rnk != rnk_mgr */ #endif /* !ENABLE_MPI */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); /* Close first input netCDF file */ nco_close(in_id); /* Loop over input files (not currently used, fl_nbr == 1) */ for(fl_idx=0;fl_idx= nco_dbg_fl) (void)fprintf(stderr,"\nInput file %d is %s; ",fl_idx,fl_in); /* Make sure file is on local system and is readable or die trying */ if(fl_idx != 0) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"local file %s:\n",fl_in); /* Open file once per thread to improve caching */ for(thr_idx=0;thr_idx nbr_var_prc-1){ msg_bfr[0]=idx_all_wrk_ass; /* [enm] All variables already assigned */ msg_bfr[1]=out_id; /* Output file ID */ }else{ /* Tell requesting worker to allocate space for next variable */ msg_bfr[0]=idx; /* [idx] Variable to be processed */ msg_bfr[1]=out_id; /* Output file ID */ msg_bfr[2]=var_prc_out[idx]->id; /* [id] Variable ID in output file */ /* Point to next variable on list */ idx++; } /* endif idx */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_wrk_rsp,MPI_COMM_WORLD); /* msg_tag_typ != msg_tag_wrk_rqs */ }else if(msg_tag_typ == msg_tag_tkn_wrt_rqs){ /* Allocate token if free, else ask worker to try later */ if(TKN_WRT_FREE){ TKN_WRT_FREE=False; msg_bfr[0]=tkn_wrt_rqs_xcp; /* Accept request for write token */ }else{ msg_bfr[0]=tkn_wrt_rqs_dny; /* Deny request for write token */ } /* !TKN_WRT_FREE */ MPI_Send(msg_bfr,msg_bfr_lng,MPI_INT,rnk_wrk,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD); } /* msg_tag_typ != msg_tag_tkn_wrt_rqs */ } /* end while var_wrt_nbr < nbr_var_prc */ }else{ /* prc_rnk != rnk_mgr, end Manager code begin Worker code */ wrk_id_bfr[0]=prc_rnk; while(1){ /* While work remains... */ /* Send msg_tag_wrk_rqs */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_wrk_rqs,MPI_COMM_WORLD); /* Receive msg_tag_wrk_rsp */ MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,0,msg_tag_wrk_rsp,MPI_COMM_WORLD,&mpi_stt); idx=msg_bfr[0]; out_id=msg_bfr[1]; if(idx == idx_all_wrk_ass) break; else{ var_prc_out[idx]->id=msg_bfr[2]; /* Process this variable same as UP code */ #else /* !ENABLE_MPI */ #ifdef _OPENMP /* OpenMP notes: firstprivate(): msk_out and wgt_out must be NULL on first call to nco_var_cnf_dmn() shared(): msk and wgt are not altered within loop private(): wgt_avg does not need initialization */ #pragma omp parallel for default(none) firstprivate(DO_CONFORM_MSK,DO_CONFORM_WGT,ddra_info,msk_out,wgt_out) private(idx,in_id,wgt_avg) shared(MULTIPLY_BY_TALLY,MUST_CONFORM,NRM_BY_DNM,WGT_MSK_CRD_VAR,nco_dbg_lvl,dmn_avg,dmn_avg_nbr,flg_ddra,flg_rdd,in_id_arr,msk,msk_nm,msk_val,nbr_var_prc,nco_op_typ,op_typ_rlt,out_id,nco_prg_nm,rcd,var_prc,var_prc_out,wgt,wgt_nm) #endif /* !_OPENMP */ /* UP and SMP codes main loop over variables */ for(idx=0;idx= nco_dbg_var) rcd+=nco_var_prc_crr_prn(idx,var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Allocate and, if necessary, initialize accumulation space for all processed variables */ var_prc_out[idx]->sz=var_prc[idx]->sz; /* if((var_prc_out[idx]->tally=var_prc[idx]->tally=(long *)nco_malloc_flg(var_prc_out[idx]->sz*sizeof(long int))) == NULL){*/ /* fxm: verify that var_prc->tally is not needed */ if((var_prc_out[idx]->tally=(long *)nco_malloc_flg(var_prc_out[idx]->sz*sizeof(long int))) == NULL){ (void)fprintf(fp_stdout,"%s: ERROR Unable to malloc() %ld*%ld bytes for tally buffer for variable %s in main()\n",nco_prg_nm_get(),var_prc_out[idx]->sz,(long int)sizeof(long int),var_prc_out[idx]->nm); nco_exit(EXIT_FAILURE); } /* end if err */ (void)nco_zero_long(var_prc_out[idx]->sz,var_prc_out[idx]->tally); if((var_prc_out[idx]->val.vp=(void *)nco_malloc_flg(var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type))) == NULL){ (void)fprintf(fp_stdout,"%s: ERROR Unable to malloc() %ld*%lu bytes for value buffer for variable %s in main()\n",nco_prg_nm_get(),var_prc_out[idx]->sz,(unsigned long)nco_typ_lng(var_prc_out[idx]->type),var_prc_out[idx]->nm); nco_exit(EXIT_FAILURE); } /* end if err */ (void)nco_var_zero(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->val); (void)nco_var_mtd_refresh(in_id,var_prc[idx]); /* Retrieve variable from disk into memory */ if(False) (void)fprintf(fp_stdout,"%s: DEBUG: fxm TODO nco354 About to nco_var_get() %s\n",nco_prg_nm,var_prc[idx]->nm); /* NB: nco_var_get() with same nc_id contains OpenMP critical region */ (void)nco_var_get(in_id,var_prc[idx]); if(False) (void)fprintf(fp_stdout,"%s: DEBUG: fxm TODO nco354 Finished nco_var_get() %s\n",nco_prg_nm,var_prc[idx]->nm); /* Convert char, short, long, int, and float types to doubles before arithmetic */ var_prc[idx]=nco_typ_cnv_rth(var_prc[idx],nco_op_typ); var_prc_out[idx]=nco_typ_cnv_rth(var_prc_out[idx],nco_op_typ); if(msk_nm && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){ msk_out=nco_var_cnf_dmn(var_prc[idx],msk,msk_out,MUST_CONFORM,&DO_CONFORM_MSK); /* If msk and var did not conform then do not mask var! */ if(DO_CONFORM_MSK){ msk_out=nco_var_cnf_typ(var_prc[idx]->type,msk_out); /* mss_val for var_prc has been overwritten in nco_var_mtd_refresh() */ if(!var_prc[idx]->has_mss_val){ var_prc[idx]->has_mss_val=True; var_prc[idx]->mss_val=nco_mss_val_mk(var_prc[idx]->type); } /* end if */ /* Mask by changing variable to missing value where condition is false */ (void)nco_var_msk(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,msk_val,op_typ_rlt,msk_out->val,var_prc[idx]->val); } /* end if */ } /* end if */ /* Perform non-linear transformations before weighting */ if(!var_prc[idx]->is_crd_var){ switch(nco_op_typ){ case nco_op_avgsqr: /* Square variable before weighting */ case nco_op_rms: /* Square variable before weighting */ case nco_op_rmssdn: /* Square variable before weighting */ (void)nco_var_mlt(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->val,var_prc[idx]->val); break; default: /* All other operations are linear, do nothing to them yet */ break; } /* end case */ } /* var_prc[idx]->is_crd_var */ if(wgt_nm && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){ /* fxm: nco_var_cnf_dmn() has bug where it does not allocate tally array for weights that do already conform to var_prc. TODO #114. */ wgt_out=nco_var_cnf_dmn(var_prc[idx],wgt,wgt_out,MUST_CONFORM,&DO_CONFORM_WGT); if(DO_CONFORM_WGT){ wgt_out=nco_var_cnf_typ(var_prc[idx]->type,wgt_out); /* Weight after any initial non-linear operation so, e.g., variable is squared but not weights */ /* Weight variable by taking product of weight and variable */ (void)nco_var_mlt(var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,wgt_out->val,var_prc[idx]->val); } /* end if weights conformed */ } /* end if weight was specified and then tested for conformance */ /* Copy (masked) (weighted) values from var_prc to var_prc_out */ (void)memcpy((void *)(var_prc_out[idx]->val.vp),(void *)(var_prc[idx]->val.vp),var_prc_out[idx]->sz*nco_typ_lng(var_prc_out[idx]->type)); /* 20050516: fxm: destruction of var_prc_out in nco_var_avg() leaves dangling pointers in var_out? */ /* Reduce variable over specified dimensions (tally array is set here) NB: var_prc_out[idx] is new, so corresponding var_out[idx] is dangling */ var_prc_out[idx]=nco_var_avg(var_prc_out[idx],dmn_avg,dmn_avg_nbr,nco_op_typ,flg_rdd,&ddra_info); /* var_prc_out[idx]->val now holds numerator of averaging expression documented in NCO User's Guide Denominator is also tricky due to sundry normalization options These logical switches are VERY tricky---be careful modifying them */ if(NRM_BY_DNM && DO_CONFORM_WGT && (!var_prc[idx]->is_crd_var || WGT_MSK_CRD_VAR)){ /* Duplicate wgt_out as wgt_avg so that wgt_out is not contaminated by any averaging operation and may be reused on next variable. Free wgt_avg after each use but continue to reuse wgt_out */ wgt_avg=nco_var_dpl(wgt_out); if(var_prc[idx]->has_mss_val){ double mss_val_dbl=double_CEWI; /* Set denominator to missing value at all locations where variable is missing value If this is accomplished by setting weight to missing value wherever variable is missing value then weight must not be re-used by next variable (which might conform but have missing values in different locations) This is one good reason to copy wgt_out into disposable wgt_avg for each new variable */ /* First, make sure wgt_avg has same missing value as variable */ (void)nco_mss_val_cp(var_prc[idx],wgt_avg); /* Copy missing value into double precision variable */ switch(wgt_avg->type){ case NC_FLOAT: mss_val_dbl=wgt_avg->mss_val.fp[0]; break; case NC_DOUBLE: mss_val_dbl=wgt_avg->mss_val.dp[0]; break; case NC_INT: mss_val_dbl=wgt_avg->mss_val.ip[0]; break; case NC_SHORT: mss_val_dbl=wgt_avg->mss_val.sp[0]; break; case NC_USHORT: mss_val_dbl=wgt_avg->mss_val.usp[0]; break; case NC_UINT: mss_val_dbl=wgt_avg->mss_val.uip[0]; break; case NC_INT64: mss_val_dbl=wgt_avg->mss_val.i64p[0]; break; case NC_UINT64: mss_val_dbl=wgt_avg->mss_val.ui64p[0]; break; case NC_BYTE: mss_val_dbl=wgt_avg->mss_val.bp[0]; break; case NC_UBYTE: mss_val_dbl=wgt_avg->mss_val.cp[0]; break; case NC_CHAR: mss_val_dbl=wgt_avg->mss_val.cp[0]; break; case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } /* end switch */ /* Second, mask wgt_avg where variable is missing value */ (void)nco_var_msk(wgt_avg->type,wgt_avg->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,mss_val_dbl,nco_op_ne,var_prc[idx]->val,wgt_avg->val); } /* endif weight must be checked for missing values */ /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); if(msk_nm && DO_CONFORM_MSK){ /* Must mask weight in same fashion as variable was masked If msk and var did not conform then do not mask wgt Ensure wgt_avg has a missing value */ if(!wgt_avg->has_mss_val){ wgt_avg->has_mss_val=True; wgt_avg->mss_val=nco_mss_val_mk(wgt_avg->type); } /* end if */ /* Mask by changing weight to missing value where condition is false */ (void)nco_var_msk(wgt_avg->type,wgt_avg->sz,wgt_avg->has_mss_val,wgt_avg->mss_val,msk_val,op_typ_rlt,msk_out->val,wgt_avg->val); } /* endif weight must be masked */ /* fxm: temporary kludge to make sure weight has tally space wgt_avg may lack valid tally array in ncwa because wgt_avg is created, sometimes, before the tally array for var_prc_out[idx] is created. When this occurs the nco_var_dpl() call in nco_var_cnf_dmn() does not copy tally array into wgt_avg. See related note about this above. TODO #114.*/ if(wgt_avg->sz > 0) if((wgt_avg->tally=(long *)nco_realloc(wgt_avg->tally,wgt_avg->sz*sizeof(long int))) == NULL){ (void)fprintf(fp_stdout,"%s: ERROR Unable to realloc() %ld*%ld bytes for tally buffer for weight %s in main()\n",nco_prg_nm_get(),wgt_avg->sz,(long int)sizeof(long int),wgt_avg->nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Average weight over specified dimensions (tally array is set here) */ wgt_avg=nco_var_avg(wgt_avg,dmn_avg,dmn_avg_nbr,nco_op_avg,flg_rdd,&ddra_info); if(MULTIPLY_BY_TALLY){ /* NB: Currently this is not implemented */ /* Multiply numerator (weighted sum of variable) by tally We deviously accomplish this by dividing denominator by tally */ (void)nco_var_nrm(wgt_avg->type,wgt_avg->sz,wgt_avg->has_mss_val,wgt_avg->mss_val,wgt_avg->tally,wgt_avg->val); } /* endif */ /* Rather complex conditional statement is shorter than switch() */ if( /* Normalize by weighted tally if .... */ (nco_op_typ != nco_op_min) && /* ...operation is not min() and... */ (nco_op_typ != nco_op_max) && /* ...operation is not max() and... */ (nco_op_typ != nco_op_ttl || /* ...operation is not ttl() or... */ var_prc[idx]->is_crd_var) /* ...variable is a coordinate */ ){ /* Divide numerator by masked, averaged, weights */ (void)nco_var_dvd(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,wgt_avg->val,var_prc_out[idx]->val); } /* endif */ /* Free wgt_avg, but keep wgt_out, after each use */ if(wgt_avg) wgt_avg=nco_var_free(wgt_avg); /* End of branch for normalization when weights were specified */ }else if(NRM_BY_DNM){ /* Branch for normalization when no weights were specified Normalization is just due to tally */ if(var_prc[idx]->is_crd_var){ /* Return linear averages of coordinates unless computing extrema Prevent coordinate variables from encountering nco_var_nrm_sdn() */ if((nco_op_typ != nco_op_min) && (nco_op_typ != nco_op_max)) (void)nco_var_nrm(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val); }else{ /* !var_prc[idx]->is_crd_var */ switch(nco_op_typ){ case nco_op_avg: /* Normalize sum by tally to create mean */ case nco_op_sqravg: /* Normalize sum by tally to create mean */ case nco_op_avgsqr: /* Normalize sum of squares by tally to create mean square */ case nco_op_rms: /* Normalize sum of squares by tally to create mean square */ case nco_op_sqrt: /* Normalize sum by tally to create mean */ (void)nco_var_nrm(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val); break; case nco_op_rmssdn: /* Normalize sum of squares by tally-1 to create mean square for sdn */ (void)nco_var_nrm_sdn(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val); break; case nco_op_min: /* Minimum is already in buffer, do nothing */ case nco_op_max: /* Maximum is already in buffer, do nothing */ case nco_op_ttl: /* Total is already in buffer, do nothing */ break; default: (void)fprintf(fp_stdout,"%s: ERROR Illegal nco_op_typ in non-weighted normalization\n",nco_prg_nm); nco_exit(EXIT_FAILURE); break; } /* end switch */ } /* !var_prc[idx]->is_crd_var */ }else if(!NRM_BY_DNM){ /* Normalization has been turned off by user, we are done */ ; }else{ (void)fprintf(fp_stdout,"%s: ERROR Unforeseen logical branch in main()\n",nco_prg_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Some non-linear operations require additional processing */ if(!var_prc[idx]->is_crd_var){ switch(nco_op_typ){ case nco_op_sqravg: /* Square mean to create square of the mean (for sdn) */ (void)nco_var_mlt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->val,var_prc_out[idx]->val); break; case nco_op_sqrt: /* Take root of mean to create root mean */ case nco_op_rms: /* Take root of mean of sum of squares to create root mean square */ case nco_op_rmssdn: /* Take root of sdn mean of sum of squares to create root mean square for sdn */ (void)nco_var_sqrt(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_out[idx]->tally,var_prc_out[idx]->val,var_prc_out[idx]->val); break; default: break; } /* end switch */ } /* var_prc[idx]->is_crd_var */ /* Free tally buffer */ var_prc_out[idx]->tally=(long *)nco_free(var_prc_out[idx]->tally); /* Revert any arithmetic promotion but leave unpacked (for now) */ var_prc_out[idx]=nco_var_cnf_typ(var_prc_out[idx]->typ_upk,var_prc_out[idx]); #ifdef ENABLE_MPI /* Obtain token and prepare to write */ while(1){ /* Send msg_tag_tkn_wrt_rqs repeatedly until token obtained */ wrk_id_bfr[0]=prc_rnk; MPI_Send(wrk_id_bfr,wrk_id_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rqs,MPI_COMM_WORLD); MPI_Recv(msg_bfr,msg_bfr_lng,MPI_INT,rnk_mgr,msg_tag_tkn_wrt_rsp,MPI_COMM_WORLD,&mpi_stt); tkn_wrt_rsp=msg_bfr[0]; /* Wait then re-send request */ if(tkn_wrt_rsp == tkn_wrt_rqs_dny) sleep(tkn_wrt_rqs_ntv); else break; } /* end while loop waiting for write token */ /* Worker has token---prepare to write */ if(tkn_wrt_rsp == tkn_wrt_rqs_xcp){ if(RAM_OPEN) md_open=NC_WRITE|NC_SHARE|NC_DISKLESS; else md_open=NC_WRITE|NC_SHARE; rcd=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt,&out_id); /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,lmt_all_lst,nbr_dmn_fl,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); #endif /* !ENABLE_MPI */ #ifdef _OPENMP #pragma omp critical #endif /* _OPENMP */ /* Common code for UP, SMP, and MPI */ { /* begin OpenMP critical */ /* Copy average to output file then free averaging buffer */ if(var_prc_out[idx]->nbr_dim == 0){ (void)nco_put_var1(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_out[idx]->val.vp,var_prc_out[idx]->type); } /* end if variable is array */ } /* end OpenMP critical */ /* fxm: TODO nco722 DDRA diagnostics should work in MPI mode */ if(flg_ddra){ /* DDRA diagnostics Usage: mpncwa -O -C --mdl -a lat,lon,time -w lat ~/nco/data/in.nc ~/foo.nc mpncwa -O -C --mdl -a lat,lon -w lat ${DATA}/nco_bm/stl_5km.nc ~/foo.nc mpncwa -O -C --mdl -a lat,lon,time -w lat ${DATA}/nco_bm/gcm_T85.nc ~/foo.nc */ /* Assign remaining input for DDRA diagnostics */ ddra_info.lmn_nbr=var_prc[idx]->sz; /* [nbr] Variable size */ if(wgt) ddra_info.lmn_nbr_wgt=wgt->sz; /* [nbr] Weight size */ ddra_info.nco_op_typ=nco_op_typ; /* [enm] Operation type */ ddra_info.rnk_var=var_prc[idx]->nbr_dim; /* I [nbr] Variable rank (in input file) */ if(wgt) ddra_info.rnk_wgt=wgt->nbr_dim; /* [nbr] Rank of weight */ ddra_info.var_idx=idx; /* [enm] Index */ ddra_info.wrd_sz=nco_typ_lng(var_prc[idx]->type); /* [B] Bytes per element */ /* DDRA diagnostics */ rcd+=nco_ddra /* [fnc] Count operations */ (var_prc[idx]->nm, /* I [sng] Variable name */ wgt_nm, /* I [sng] Weight name */ &ddra_info); /* I [sct] DDRA information */ } /* !flg_ddra */ /* Free current output buffer */ var_prc_out[idx]->val.vp=nco_free(var_prc_out[idx]->val.vp); #ifdef ENABLE_MPI /* Close output file and increment written counter */ nco_close(out_id); var_wrt_nbr++; } /* endif tkn_wrt_rqs_xcp */ } /* end else !idx_all_wrk_ass */ } /* end while loop requesting work/token */ } /* endif Worker */ #else /* !ENABLE_MPI */ } /* end (OpenMP parallel for) loop over idx */ #endif /* !ENABLE_MPI */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Close input netCDF file */ for(thr_idx=0;thr_idx 0) dmn_avg=(dmn_sct **)nco_free(dmn_avg); if(msk) msk=nco_var_free(msk); if(msk_nm) msk_nm=(char *)nco_free(msk_nm); if(msk_out) msk_out=nco_var_free(msk_out); if(msk_cnd_sng) msk_cnd_sng=(char *)nco_free(msk_cnd_sng); if(wgt) wgt=nco_var_free(wgt); if(wgt_avg) wgt_avg=nco_var_free(wgt_avg); if(wgt_nm) wgt_nm=(char *)nco_free(wgt_nm); if(wgt_out) wgt_out=nco_var_free(wgt_out); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_arr) in_id_arr=(int *)nco_free(in_id_arr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_xtr > 0) dim=nco_dmn_lst_free(dim,nbr_dmn_xtr); if(nbr_dmn_out > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_out); /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); /* ncwa uses nco_var_lst_free() on var_prc_out because var_out has dangling pointers */ if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix); if(nbr_var_prc > 0) var_prc_out=nco_var_lst_free(var_prc_out,nbr_var_prc); var_prc=(var_sct **)nco_free(var_prc); var_fix=(var_sct **)nco_free(var_fix); var_out=(var_sct **)nco_free(var_out); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ /* End timer */ ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/ncap.c000066400000000000000000001305301264355130400147430ustar00rootroot00000000000000/* $Header$ */ /* ncap -- netCDF arithmetic processor */ /* Purpose: Compute user-defined derived fields using forward algebraic notation applied to netCDF files */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncap -O -D 1 -S ${HOME}/nco/data/ncap.in ${HOME}/nco/data/in.nc ${HOME}/nco/data/foo.nc ncap -O -D 1 -s a=b+c -s "b=c-d/2." -S ncap.in in.nc ~/foo.nc ncap -O -D 1 -s two=one+two in.nc ~/foo.nc scp ~/nco/src/nco/ncap.c esmf.ess.uci.edu:nco/src/nco/ncap.c */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* assert() debugging macro */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #include /* POSIX stuff */ /* GNU getopt() is independent system header on FREEBSD, LINUX, LINUXALPHA, LINUXAMD, LINUXARM, WIN32 AT&T getopt() is in unistd.h or stdlib.h on AIX, CRAY, NECSX, SUNMP, SUN4SOL2 fxm: Unsure what ALPHA and SGI do */ #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "ncap.h" /* netCDF arithmetic processor-specific definitions (symbol table, ...) */ #include "libnco.h" /* netCDF Operator (NCO) library */ /* Global variables */ size_t ncap_ncl_dpt_crr=0UL; /* [nbr] Depth of current #include file (incremented in ncap_lex.l) */ size_t *ncap_ln_nbr_crr; /* [cnt] Line number (incremented in ncap_lex.l) */ char **ncap_fl_spt_glb=NULL; /* [fl] Script file */ void glb_init_free /* [fnc] Initialize and free global variables (line numbers and include stuff) */ (nco_bool action); /* I [flg] Initialize */ int main(int argc,char **argv) { extern int nco_yyparse(prs_sct *prs_arg); /* Prototype here as in bison.simple to avoid compiler warning */ /* Following declaration gets rid of implicit declaration compiler warning It is a condensation of the lexer declaration from lex.yy.c: YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); */ extern int nco_yy_scan_string(const char *); extern FILE *nco_yyin; /* [fl] Input script file */ /* fxm TODO nco652 */ double rnd_nbr(double); char **fl_lst_abb=NULL; /* Option n */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *fl_spt_usr=NULL; /* Option s */ char *lmt_arg[NC_MAX_DIMS]; char *opt_crr=NULL; /* [sng] String representation of current long-option name */ #define NCAP_SPT_NBR_MAX 100 char *spt_arg[NCAP_SPT_NBR_MAX]; /* fxm: Arbitrary size, should be dynamic */ char *spt_arg_cat=NULL; /* [sng] User-specified script */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:FfhL:l:n:Oo:p:Rrs:S:vx-:"; /* [sng] Single letter command line options */ cnk_dmn_sct **cnk_dmn=NULL_CEWI; #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.flg_ddra=False}; #endif /* !__cplusplus */ dmn_sct **dmn_in=NULL_CEWI; /* [lst] Dimensions in input file */ dmn_sct **dmn_out=NULL_CEWI; /* [lst] Dimensions written to output file */ dmn_sct **dmn_new=NULL_CEWI; /* [lst] Temporary dimensions to reduce referencing */ extern char *optarg; extern int optind; /* Math float prototypes required by AIX, Solaris, but not by Linux, IRIX */ /* Basic math: acos, asin, atan, cos, exp, fabs, log, log10, sin, sqrt, tan */ /* GNU g++ barfs at these float declartions -- remove if g++ used */ #ifndef __GNUG__ extern float acosf(float); extern float asinf(float); extern float atanf(float); extern float cosf(float); extern float expf(float); extern float fabsf(float); /* 20040629: Only AIX may need this */ extern float logf(float); extern float log10f(float); extern float rnd_nbrf(float); extern float sinf(float); extern float sqrtf(float); extern float tanf(float); /* Advanced math: erf, erfc, gamma */ extern float erff(float); extern float erfcf(float); /* There is no function named gamma in the ISO C standard library. There are standard functions called lgamma() = log(gamma()) and tgamma() = gamma() These functions do not appear in the 1990 ISO C standard; they were introduced by C99 */ extern float gammaf(float); /* Hyperbolic trigonometric: acosh, asinh, atanh, cosh, sinh, tanh */ extern float acoshf(float); extern float asinhf(float); extern float atanhf(float); extern float coshf(float); extern float sinhf(float); extern float tanhf(float); /* Basic Rounding: ceil, floor */ extern float ceilf(float); extern float floorf(float); /* Advanced Rounding: nearbyint, rint, round, trunc */ extern float nearbyintf(float); extern float rintf(float); extern float roundf(float); extern float truncf(float); #endif int abb_arg_nbr=0; int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx; int in_id; int jdx; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_att=0; /* [nbr] Number of attributes in script */ int nbr_dmn_ass=int_CEWI;/* Number of dimensions in temporary list */ int nbr_dmn_in=int_CEWI; /* Number of dimensions in dim_in */ int nbr_dmn_out=0; /* [nbr] Number of dimensions in list dmn_out */ int nbr_lst_a=0; /* size of xtr_lst_a */ int nbr_spt=0; /* Option s. NB: nbr_spt gets incremented */ int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl;/* number of vars in a file */ int nbr_var_prc; /* nbr_var_prc gets incremented */ int nbr_var_ycc=0; /* [nbr] Number of vars to be defined after 1st parse */ int xtr_nbr=0; /* xtr_nbr will not otherwise be set for -c with no -v */ int opt; int out_id; int rcd=NC_NOERR; /* [rcd] Return code */ int var_id; sym_sct **sym_tbl; /* [fnc] Symbol table for functions */ int sym_tbl_nbr; /* [nbr] Size of symbol table */ int sym_idx=0; /* [idx] Counter for symbols */ lmt_sct **lmt=NULL_CEWI; nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool PRN_FNC_TBL=False; /* Option f */ nco_bool PROCESS_ALL_VARS=True; /* Option v */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ nm_id_sct *dmn_lst=NULL; nm_id_sct *xtr_lst=NULL; /* Non-processed variables to copy to OUTPUT */ nm_id_sct *xtr_lst_a=NULL; /* Initialize to ALL variables in OUTPUT file */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ size_t sng_lng; size_t spt_arg_lng=size_t_CEWI; var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc; var_sct **var_prc_out; var_sct **var_ycc=NULL; aed_sct **att_lst=NULL; prs_sct prs_arg; /* [sct] Global information required in parser routines */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"fnc_tbl",no_argument,0,'f'}, {"prn_fnc_tbl",no_argument,0,'f'}, {"ftn",no_argument,0,'F'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"nintap",required_argument,0,'n'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"file",required_argument,0,'S'}, {"script-file",required_argument,0,'S'}, {"fl_spt",required_argument,0,'S'}, {"spt",required_argument,0,'s'}, {"script",required_argument,0,'s'}, {"units",no_argument,0,'u'}, {"variable",no_argument,0,'v'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); cnk_min_byt+=0; } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdf_upk") || !strcmp(opt_crr,"hdf_unpack")) nco_upk_cnv=nco_upk_HDF; /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'f': /* Print function table */ PRN_FNC_TBL=True; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'n': /* NINTAP-style abbreviation of files to process */ /* Currently not used in ncap but should be to allow processing multiple input files by same script */ (void)fprintf(stderr,"%s: ERROR %s does not currently implement -n option\n",nco_prg_nm_get(),nco_prg_nm_get()); fl_lst_abb=nco_lst_prs_2D(optarg,",",&abb_arg_nbr); if(abb_arg_nbr < 1 || abb_arg_nbr > 3){ (void)fprintf(stderr,"%s: ERROR Incorrect abbreviation for file list\n",nco_prg_nm); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case 's': /* Copy command script for later processing */ spt_arg[nbr_spt++]=(char *)strdup(optarg); if(nbr_spt == NCAP_SPT_NBR_MAX-1) (void)fprintf(stderr,"%s: WARNING No more than %d script arguments allowed. TODO #24\n",nco_prg_nm_get(),NCAP_SPT_NBR_MAX); break; case 'S': /* Read command script from file rather than from command line */ fl_spt_usr=(char *)strdup(optarg); break; case 'v': /* Variables to extract/exclude */ PROCESS_ALL_VARS=False; xtr_nbr=0; break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; if(EXCLUDE_INPUT_LIST) (void)fprintf(stderr,"%s: ERROR %s does not currently implement -x option\n",nco_prg_nm_get(),nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Append ";\n" to command-script arguments, then concatenate them */ for(idx=0;idxnm,(sym_tbl[idx]->fnc_flt ? 'y' : 'n'),(sym_tbl[idx]->fnc_dbl ? 'y' : 'n')); nco_exit(EXIT_SUCCESS); } /* end if PRN_FNC_TBL */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Make uniform list of user-specified chunksizes */ cnk_sz_byt+=0; /* CEWI */ if(cnk_nbr > 0) cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Make uniform list of user-specified dimension limits */ if(lmt_nbr > 0) lmt=nco_lmt_prs(lmt_nbr,lmt_arg); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); (void)nco_inq_format(in_id,&fl_in_fmt); /* Form list of all dimensions in file */ dmn_lst=nco_dmn_lst(in_id,&nbr_dmn_in); dmn_in=(dmn_sct **)nco_malloc(nbr_dmn_in*sizeof(dmn_sct *)); for(idx=0;idx 0) (void)nco_dmn_lmt_mrg(dmn_in,nbr_dmn_in,lmt,lmt_nbr); /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt; /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Copy global attributes */ (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Set arguments for script execution */ prs_arg.fl_in=fl_in; /* [sng] Input data file */ prs_arg.in_id=in_id; /* [id] Input data file ID */ prs_arg.fl_out=fl_out; /* [sng] Output data file */ prs_arg.out_id=out_id; /* [id] Output data file ID */ prs_arg.att_lst=&att_lst; /* [sct] Attributes in script */ prs_arg.nbr_att=&nbr_att; /* [nbr] Number of attributes in script */ prs_arg.dmn_in=dmn_in; /* [dmn_in] List of all dimensions in input */ prs_arg.nbr_dmn_in=nbr_dmn_in; /* [nbr] Number of dimensions in input */ prs_arg.dmn_out=&dmn_out; /* pointer to list of dims in output */ prs_arg.nbr_dmn_out=&nbr_dmn_out; /* number of dims in above list */ prs_arg.sym_tbl=sym_tbl; /* [fnc] Symbol table for functions */ prs_arg.sym_tbl_nbr=sym_tbl_nbr; /* [nbr] Number of functions in table */ /* prs_arg.ntl_scn=False; [flg] Initial scan of script */ prs_arg.var_LHS=NULL; /* [var] LHS cast variable */ prs_arg.var_lst=&var_ycc; /* [sct] Variables to be defined after 1st parse */ prs_arg.nbr_var=&nbr_var_ycc; /* [nbr] Number of vars to be defined after 1st parse */ prs_arg.nco_op_typ=nco_op_nil; /* [enm] Operation type */ prs_arg.dfl_lvl=dfl_lvl; /* [enm] Deflate level */ /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; /* Parse twice: 1st parse defines variable dimensions in output file. 2nd parse initializes variable values */ for(jdx=0;jdx<2;jdx++){ prs_arg.ntl_scn=(jdx==0 ? True : False); if(fl_spt_usr == NULL){ /* No script file specified, look for command-line scripts */ if(nbr_spt == 0){ (void)fprintf(stderr,"%s: ERROR no script file or command line scripts specified\n",nco_prg_nm_get()); (void)fprintf(stderr,"%s: HINT Use, e.g., -s \"foo=bar\"\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ /* Print all command-line scripts */ if(nco_dbg_lvl_get() > nco_dbg_scl){ for(idx=0;idx 0) fl_spt_usr=(char *)nco_free(fl_spt_usr); (void)glb_init_free(False); if(!prs_arg.ntl_scn) continue; (void)nco_redef(out_id); for(idx=0;idx= nco_dbg_var) (void)fprintf(stdout,"%s: Checking var_ycc[%d]->undefined for variable %s...\n",nco_prg_nm_get(),idx,var_ycc[idx]->nm); if(var_ycc[idx]->undefined){ /* 20060225: TODO nco680 free() list at end or risk double-free()'ing*/ var_ycc[idx]=nco_var_free(var_ycc[idx]); continue; } /* endif */ (void)nco_def_var(out_id,var_ycc[idx]->nm,var_ycc[idx]->type,var_ycc[idx]->nbr_dim,var_ycc[idx]->dmn_id,&var_id); /* Set HDF Lempel-Ziv compression level, if requested */ if(dfl_lvl >= 0 && var_ycc[idx]->nbr_dim > 0) (void)nco_def_var_deflate(out_id,var_id,(int)NC_SHUFFLE,(int)True,dfl_lvl); var_ycc[idx]->val.vp=nco_free(var_ycc[idx]->val.vp); } /* end loop over idx */ (void)nco_enddef(out_id); } /* end loop over jdx */ /* Get number of variables in output file */ rcd=nco_inq(out_id,(int *)NULL,&nbr_var_fl,(int *)NULL,(int*)NULL); /* Make list of all new variables in output_file */ xtr_lst_a=nco_var_lst_mk(out_id,nbr_var_fl,var_lst_in,False,False,&nbr_lst_a); if(PROCESS_ALL_VARS){ /* Get number of variables in input file */ rcd=nco_inq(in_id,(int *)NULL,&nbr_var_fl,(int *)NULL,(int *)NULL); /* Form initial list of all variables in input file */ xtr_lst=nco_var_lst_mk(in_id,nbr_var_fl,var_lst_in,False,False,&xtr_nbr); }else{ /* Make list of variables of new attributes whose parent variable is only in input file */ xtr_lst=nco_att_lst_mk(in_id,out_id,att_lst,nbr_att,&xtr_nbr); } /* endif */ /* Find dimensions associated with xtr_lst */ /* Write to O only new dims Add apropriate coordinate variables to extraction list options -c -process all cordinates i.e., add coordinates to var list Also add their dims options --none -process associated co-ords loop though dim_out and append to var list options -C no co-ordinates Do nothing */ /* Subtract list A again */ /* Finally extract variables on list */ /* Subtract list A */ if(nbr_lst_a > 0) xtr_lst=nco_var_lst_sub(xtr_lst,&xtr_nbr,xtr_lst_a,nbr_lst_a); /* Put file in define mode to allow metadata writing */ (void)nco_redef(out_id); /* Free current list of all dimensions in input file */ dmn_lst=nco_nm_id_lst_free(dmn_lst,nbr_dmn_in); /* Make list of dimensions of variables in xtr_lst */ if(xtr_nbr > 0) dmn_lst=nco_dmn_lst_ass_var(in_id,xtr_lst,xtr_nbr,&nbr_dmn_ass); /* Find and add any new dimensions to output */ for(idx=0;idxnm) && !dmn_in[jdx]->xrf){ /* Add dimension to output list dmn_prc */ dmn_new=nco_dmn_out_grow(&prs_arg); *dmn_new=nco_dmn_dpl(dmn_in[jdx]); (void)nco_dmn_xrf(*dmn_new,dmn_in[jdx]); /* Write dimension to output */ (void)nco_dmn_dfn(fl_out,out_id,dmn_new,1); break; } /* endif */ } /* end loop over jdx */ /* Free current list of all dimensions in input file */ dmn_lst=nco_nm_id_lst_free(dmn_lst,nbr_dmn_ass); /* Dimensions for manually specified extracted variables are now defined in output file Add coordinate variables to extraction list If EXTRACT_ALL_COORDINATES then write associated dimension to output */ if(EXTRACT_ASSOCIATED_COORDINATES){ for(idx=0;idxis_crd_dmn) continue; if(EXTRACT_ALL_COORDINATES && !dmn_in[idx]->xrf){ /* Add dimensions to output list dmn_out */ dmn_new=nco_dmn_out_grow(&prs_arg); *dmn_new=nco_dmn_dpl(dmn_in[idx]); (void)nco_dmn_xrf(*dmn_new,dmn_in[idx]); /* Write dimension to output */ (void)nco_dmn_dfn(fl_out,out_id,dmn_new,1); } /* end if */ /* Add coordinate variable to extraction list, dimension has already been output */ if(dmn_in[idx]->xrf){ for(jdx=0;jdxnm)) break; if(jdx != xtr_nbr) continue; /* If coordinate is not on list then add it to extraction list */ xtr_lst=(nm_id_sct *)nco_realloc(xtr_lst,(xtr_nbr+1)*sizeof(nm_id_sct)); xtr_lst[xtr_nbr].nm=(char *)strdup(dmn_in[idx]->nm); xtr_lst[xtr_nbr++].id=dmn_in[idx]->cid; } /* endif */ } /* end loop over idx */ } /* end if */ /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id); /* Add coordinates defined by CF convention */ if(CNV_CCM_CCSM_CF && (EXTRACT_ALL_COORDINATES || EXTRACT_ASSOCIATED_COORDINATES)) xtr_lst=nco_cnv_cf_crd_add(in_id,xtr_lst,&xtr_nbr); /* Subtract list A again (it may contain re-defined coordinates) */ if(xtr_nbr > 0) xtr_lst=nco_var_lst_sub(xtr_lst,&xtr_nbr,xtr_lst_a,nbr_lst_a); /* Sort extraction list for faster I/O */ if(xtr_nbr > 1) xtr_lst=nco_lst_srt_nm_id(xtr_lst,xtr_nbr,False); /* Write "fixed" variables */ var=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(idx=0;idxvar_nm,&var_id); if(rcd != NC_NOERR) continue; att_lst[idx]->mode=aed_overwrite; (void)nco_aed_prc(out_id,var_id,*att_lst[idx]); } /* end for */ /* Set chunksize parameters */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) (void)nco_cnk_sz_set(out_id,(lmt_msa_sct **)NULL_CEWI,(int)0,&cnk_map,&cnk_plc,cnk_sz_scl,cnk_dmn,cnk_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ (void)nco_enddef(out_id); /* Copy non-processed vars */ (void)nco_var_val_cpy(in_id,out_id,var_fix,nbr_var_fix); /* Close input netCDF file */ rcd=nco_close(in_id); /* Remove local copy of file */ if(FL_RTR_RMT_LCN && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in); /* Close output file and move it from temporary to permanent location */ (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id); /* Clean memory unless dirty memory allowed */ if(flg_cln){ /* ncap-specific memory */ /* fxm: ncap-specific memory freeing instructions go here */ for(idx=0;idxnm=(char *)nco_free(sym_tbl[idx]->nm); sym_tbl[idx]=(sym_sct *)nco_free(sym_tbl[idx]); } /* end loop */ sym_tbl=(sym_sct **)nco_free(sym_tbl); if(fl_spt_usr) fl_spt_usr=(char *)nco_free(fl_spt_usr); /* Free variable list: some in var_ycc may have been previously free()'d */ /* fxm: TODO nco680 */ if(nbr_var_ycc > 0) var_ycc=nco_var_lst_free(var_ycc,nbr_var_ycc); /* Free attribute list */ for(idx=0;idxatt_nm=(char *)nco_free(att_lst[idx]->att_nm); att_lst[idx]->var_nm=(char *)nco_free(att_lst[idx]->var_nm); att_lst[idx]->val.vp=(void *)nco_free(att_lst[idx]->val.vp); att_lst[idx]=(aed_sct *)nco_free(att_lst[idx]); } /* end loop */ if(nbr_att >0 ) att_lst=(aed_sct **)nco_free(att_lst); /* Free extraction lists */ xtr_lst=nco_nm_id_lst_free(xtr_lst,xtr_nbr); xtr_lst_a=nco_nm_id_lst_free(xtr_lst_a,nbr_lst_a); /* Free command line algebraic arguments, if any */ for(idx=0;idx 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); /* Free limits */ for(idx=0;idx 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr); /* Free chunking information */ for(idx=0;idx 0) cnk_dmn=nco_cnk_lst_free(cnk_dmn,cnk_nbr); /* Free dimension lists */ if(nbr_dmn_in > 0) dmn_in=nco_dmn_lst_free(dmn_in,nbr_dmn_in); if(nbr_dmn_out > 0) dmn_out=nco_dmn_lst_free(dmn_out,nbr_dmn_out); /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); } /* !flg_cln */ /* End timer */ ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ void glb_init_free /* [fnc] Initialize and free global variables (line numbers and include stuff) */ (nco_bool action) /* I [flg] Initialize */ { /* Purpose: Initialize and free global variables (line numbers and include stuff) */ if(action){ ncap_ncl_dpt_crr=0UL; ncap_ln_nbr_crr=(size_t *)nco_realloc(ncap_ln_nbr_crr,(ncap_ncl_dpt_crr+1UL)*sizeof(size_t)); ncap_ln_nbr_crr[ncap_ncl_dpt_crr]=1UL; ncap_fl_spt_glb=(char **)nco_realloc(ncap_fl_spt_glb,(ncap_ncl_dpt_crr+1UL)*sizeof(char *)); } /* endif action */ if(!action){ ncap_ncl_dpt_crr=0UL; ncap_ln_nbr_crr=(size_t *)nco_free(ncap_ln_nbr_crr); ncap_fl_spt_glb=(char **)nco_free(ncap_fl_spt_glb); } /* endif not action */ } /* end glb_init_free() */ nco-4.5.4/src/nco/ncap.h000066400000000000000000000236571264355130400147630ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor definitions and function prototypes for ncap.c, ncap_utl.c, ncap_lex.l, and ncap_yacc.y */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "ncap.h" *//* netCDF arithmetic processor-specific definitions (symbol table, ...) */ #ifndef NCAP_H /* Header file has not yet been defined in current source file */ #define NCAP_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for libnetcdf.a */ /* Personal headers */ #include "libnco.h" /* netCDF Operator (NCO) library */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Define symbol table */ /* YACC seems to initialize all user-defined pointers (like those in symbol table) to NULL Symbol type may, therefore, be determined safely by testing for non-NULL members This technique is frequently used in Pigeon book */ /* Symbol structure */ typedef struct{ /* sym_sct */ char *nm; /* [sng] Symbol name */ double (*fnc_dbl)(double); /* [fnc] Double-valued function */ float (*fnc_flt)(float); /* [fnc] Float-valued function */ nod_typ_enm nod_typ; /* [enm] Node type */ } sym_sct; /* Operator */ typedef struct{ /* Nie02 oprNodeType */ nod_typ_enm nod_typ; /* [enm] Node type */ int opr_tkn; /* [enm] Operator token */ int arg_nbr; /* [nbr] Number of arguments */ union nod_typ_tag *arg; /* [unn] Argument list (has arg_nbr elements) */ } opr_nod_sct; typedef union nod_typ_tag{ /* Nie02 nodeTypeTag */ nod_typ_enm nod_typ; /* [enm] Node type */ scv_sct scv; /* [sct] Scalar value */ sym_sct sym; /* [sct] Intrinsic function name */ opr_nod_sct opr; /* [sct] Operator structure */ } nodeType; /* Parse structure prs_sct is easy to confuse with yylval since both are passed to lexer yylval is union of all possible data types for semantic values prs_sct is passed into lexer by calling routine (e.g., main()) prs_sct elements are essentially global variables which can be modified in lexer Calling routine (e.g., main()) and parser then have access to prs_sct Two elements of prs_sct, var_LHS & nco_op_typ, are more local in that they may change line-to-line in input script. */ typedef struct{ /* prs_sct */ char *fl_in; /* [sng] Input data file */ int in_id; /* [id] Input data file ID */ char *fl_out; /* [sng] Output data file */ int out_id; /* [id] Output data file ID */ aed_sct ***att_lst; /* [sct] list of Attributes defined in script */ int *nbr_att; /* [nbr] Number of attributes in script */ dmn_sct **dmn_in; /* [dmn] List of all dimensions in input file */ int nbr_dmn_in; /* [nbr] Number of dimensions in above list */ dmn_sct ***dmn_out; /* pointer to a list of dimensions currently in output file */ int *nbr_dmn_out; /* number of dimensions in above list */ sym_sct **sym_tbl; /* [fnc] Symbol table for functions */ int sym_tbl_nbr; /* [nbr] Number of functions in table */ nco_bool ntl_scn; /* [flg] Initial scan of script */ var_sct *var_LHS; /* [var] LHS cast variable */ var_sct ***var_lst; /* list of variables to be defined in O */ int *nbr_var; /* [nbr] of variables in above list */ int nco_op_typ; /* [enm] Operation type */ int dfl_lvl; /* [enm] Deflate level */ size_t *cnk_sz; /* [nbr] Chunk sizes */ } prs_sct; /* Begin funtions in ncap_lex.l */ void ncap_ntl_scn /* [fnc] Scan command script, construct I/O lists */ (prs_sct * const prs_arg, /* I/O [sct] Global information required in parser routines */ const char * const spt_arg_cat, /* I [sng] User-specified script */ nm_id_sct** const xtr_lst_a, /* O [sct] RHS variables present in input file */ int * const nbr_lst_a, /* O [nbr] Number of distinct RHS variables in input file */ nm_id_sct** const xtr_lst_b, /* O [sct] LHS variables present in input file */ int * const nbr_lst_b, /* O [nbr] Number of distinct LHS variables in input file */ nm_id_sct** const xtr_lst_c, /* O [sct] Parent variables of LHS attributes in input file */ int * const nbr_lst_c, /* O [nbr] Number of attribute parent variables in input file */ nm_id_sct** const xtr_lst_d, /* O [sct] LHS dimensions in input file */ int * const nbr_lst_d); /* O [nbr] Number of LHS dimensions in input file */ /* end ncap_ntl_scn() prototype */ int ncap_ncwa_scn (prs_sct * const prs_arg, const char * const msk_sng, char **msk_nm, double *msk_val, int *op_typ_rlt); /* End funtions in ncap_lex.l */ /* Begin funtions in ncap_yacc.y */ void freeNode /* [fnc] Free syntax tree node Nie02 freeNode() */ (nodeType *nod); /* I/O [sct] Syntax tree node to free */ aed_sct * /* O [idx] Pointer to attribute in list */ ncap_aed_lookup /* [fnc] Find location of existing attribute or add new attribute */ (const char * const var_nm, /* I [sng] Variable name */ const char * const att_nm, /* I [sng] Attribute name */ prs_sct * const prs_arg, /* I/O [sct] contains attribute list */ const nco_bool update); /* I [flg] Delete existing value or add new attribute to list */ var_sct * /*I [sct] varibale in list */ ncap_var_lookup (var_sct *var, /* I [sct] variable */ prs_sct *prs_arg, /* I/O [sct] contains var list */ const nco_bool add); /* I if not in list then add to list */ void nco_var_free_wrp(var_sct **); nodeType * /* O [unn] Syntax tree node */ opr_ctl /* [fnc] Operation controller function Nie02 opr() */ (int opr_tkn, /* I [enm] Operator token */ int arg_nbr, /* I [nbr] Number of arguments */ ... /* I [llp] Ellipsis defined in stdarg.h */ ); /* end opr_ctl() */ int nco_yyerror(prs_sct* prs_arg, const char * const sng); /* End funtions in ncap_yacc.y */ /* Begin funtions in ncap_utl.c */ var_sct * /* O [sct] Sum of input variables (var_1+var_2) */ ncap_var_var_add /* [fnc] Add two variables (var_1+var_2) */ (var_sct *var_1, /* I [sct] Input variable structure containing first operand */ var_sct *var_2); /* I [sct] Input variable structure containing second operand */ var_sct * /* O [sct] Quotient of input variables (var_2/var_1) */ ncap_var_var_dvd /* [fnc] Divide two variables (var_2/var_1) */ (var_sct *var_1, /* I [sct] Variable structure containing denominator */ var_sct *var_2); /* I [sct] Variable structure containing numerator */ var_sct * /* O [sct] Product of input variables (var_1*var_2) */ ncap_var_var_mlt /* [fnc] Multiply two variables (var_1*var_2) */ (var_sct *var_1, /* I [sct] Variable structure containing first operand */ var_sct *var_2); /* I [sct] Variable structure containing second operand */ var_sct * /* O [sct] Remainder of modulo operation of input variables (var_1%var_2) */ ncap_var_var_mod /* [fnc] Remainder operation of two variables */ (var_sct *var_1, /* I [sct] Variable structure containing field */ var_sct *var_2); /* I [sct] Variable structure containing divisor */ var_sct * /* O [sct] Empowerment of input variables (var_1^var_2) */ ncap_var_var_pwr /* [fnc] Empowerment of two variables */ (var_sct *var_1, /* I [sct] Variable structure containing base */ var_sct *var_2); /* I [sct] Variable structure containing exponent */ var_sct * /* O [frc] Remainder of input variables (var_2-var_1) */ ncap_var_var_sub /* [fnc] Subtract two variables (var_2-var_1) */ (var_sct *var_2, /* I [sct] Variable structure containing second operand */ /* fxm TODO: 19 non-standard argument order */ var_sct *var_1); /* I [sct] Variable structure containing first operand */ /* fxm: Following functions need editing, const'ifying, etc. */ nco_bool ncap_var_stretch(var_sct **,var_sct **); dmn_sct **nco_dmn_out_grow(prs_sct *); int ncap_scv_minus(scv_sct *); int ncap_var_write(var_sct *,prs_sct*); nm_id_sct *nco_nm_id_lst_crd_make(int,nm_id_sct *,int *); nm_id_sct *nco_var_lst_add(nm_id_sct *,int *,nm_id_sct *,int); nm_id_sct *nco_var_lst_copy(nm_id_sct *,int); nm_id_sct *nco_var_lst_sub(nm_id_sct *,int *,nm_id_sct *,int); nm_id_sct *nco_dmn_lst(const int, int * const); nm_id_sct *nco_att_lst_mk(int,int,aed_sct **,int,int *); ptr_unn ncap_scv_2_ptr_unn(scv_sct); scv_sct ncap_scv_abs(scv_sct); scv_sct ncap_scv_clc(scv_sct,const char,scv_sct); sym_sct *ncap_sym_init(const char * const sym_nm,double (*fnc_dbl)(double),float (*fnc_flt)(float)); sym_sct *ncap_scl_mk_sym(double val); sym_sct *ncap_sym_look(char *sym_nm); var_sct *ncap_var_abs(var_sct *); var_sct *ncap_var_fnc(var_sct *,sym_sct *); /* var_sct *ncap_var_init(const char * const,prs_sct *);*/ var_sct *ncap_var_init(char * ,prs_sct *); var_sct *ncap_var_scv_add(var_sct *,scv_sct); var_sct *ncap_var_scv_mlt(var_sct *,scv_sct); var_sct *ncap_var_scv_sub(var_sct *,scv_sct); var_sct *ncap_var_scv_dvd(var_sct *,scv_sct); var_sct *ncap_var_scv_mod(var_sct *,scv_sct); var_sct *ncap_var_scv_pwr(var_sct *,scv_sct); var_sct *ncap_scv_var_dvd(scv_sct scv,var_sct *var); var_sct *ncap_scv_var_mod(scv_sct scv,var_sct *var); var_sct *ncap_scv_var_pwr(scv_sct scv,var_sct *var); void ncap_fnc_add(char *nm, double (*fnc_dbl)()); void nco_lbr_vrs_prn(void); /* End funtions in ncap_utl.c */ /* Source code for following functions is generated by parser but parser does not do good job of making these prototypes known so routines that call these functions must either include their prototypes locally, which is bad form if it needs to be done in more than one location, or prototype the parser routines here */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCAP_H */ nco-4.5.4/src/nco/ncap_lex.l000066400000000000000000001352661264355130400156370ustar00rootroot00000000000000%{ /* $Header$ -*-C-*- */ /* Everything from here to closing brace is placed at top of lexer */ /* Purpose: Token generator for ncap parser */ /* Copyright (C) 1995--2013 Charlie Zender License: GNU General Public License (GPL) Version 3 The full license text is at http://www.gnu.org/copyleft/gpl.html and in the file nco/doc/LICENSE in the NCO source distribution. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Example lexers: /data/zender/ora/lexyacc/ch3-05.l GCC lexer is hard-coded in C for speed, but is easy to read: ../src/gcc-3.x.x/c-lex.c Unidata ${DATA}/tmp/netcdf-3.5.1-beta10/src/ncgen/ncgen.l */ /* Usage: scp ~/nco/src/nco/ncap_lex.l goldhill.cgd.ucar.edu:nco/src/nco scp ~/nco/src/nco/ncap_lex.l krein.math.uci.edu:nco/src/nco flex --stdout ~/nco/src/nco/ncap_lex.l > ~/nco/src/nco/ncap_lex.c flex --header-file=${HOME}/nco/src/nco/ncap_lex.h --stdout ~/nco/src/nco/ncap_lex.l > ~/nco/src/nco/ncap_lex.c NB: flex with -Cf or -CF not -I if this scanner will not be interactive */ /* Standard header files */ #include /* assert() debugging macro */ #include /* Integer representation, INT_MIN, INT_MAX... */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strdup */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Headers specific to this program */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "ncap.h" /* netCDF arithmetic processor-specific definitions (symbol table, ...) */ #include "ncap_yacc.h" /* Symbol definitions from parser */ /* We want yylex() errors to skip current line rather than stop execution We do this by provoking error in parser by returning unrecognized token This causes parser to read up to next ';' To avoid having two error messages we prefix error message to yyerror with '#' This causes yyerror to print current error and skip next error fxm: Hackish, but I see no other way */ /* NCO prototypes yylex() in three separate places---Ensure that all prototypes agree! The alternative, prototyping yylex() once in ncap.h, requires YY*STYPE (ncap_yacc.h) too That is unappealing since we want ncap.h segregable from parser and scanner dependencies (Asterisks inserted into token names in comments so that cpp does not expand token) 1. Top of ncap_lex.l via YY*DECL token Define YY*DECL token so yylex() accepts re-entrant arguments (Flex p. 12, Bison p. 60) Use YY*DECL on line following its definition to make prototype visible in ncap_lex.c This quiets a compiler warning 2. Top of ncap_yacc.y via YY*DECL token Required to quiet compiler warning (see additional comments in ncap_yacc.y) 3. In ncap_lex.l ncap_ntl_scn() declaration Required for ncap_ntl_scn() call to yylex() (additional comments in ncap_ntl_scn()) */ #define YY_DECL int yylex(YYSTYPE *lval_ptr,prs_sct *prs_arg) YY_DECL; #if (defined(__GNUC__) || defined(__INTEL_COMPILER)) && !defined(__PATHCC__) && !defined(PGI_CC) && (defined(ENABLE_DEBUG_CUSTOM) || defined(ENABLE_OPTIMIZE_CUSTOM)) /* CEWI fxm 20040110 Prototype functions that cause warnings with pedantic GCC compiling Portability of this entire section is questionable, so enclose in ifdef GCC We already assume lexer is flex since AT&T lex does not understand rules Thus prototyping following flex-specific functions adds no additional assumptions See also 20040112 thread in comp.compilers */ /* Implicit declaration warnings: -D_POSIX_SOURCE also avoids fileno warning */ int fileno(FILE *); /* fixes: warning: implicit declaration of function `fileno', -D_POSIX_SOURCE also avoids this warning */ /* int yy_flex_realloc(void *,size_t); *//* fixes: warning: implicit declaration of function `yy_flex_realloc'. Is this obsolete? Other versions of flex on Linux seem to want void * yy_flex_realloc(void *,size_t), which actually makes more sense given that it is a realloc() function */ /* 20050318: Fedora Core 2 flex 2.5.4 gcc 3.4.2 This prototype causes error: conflicting types for 'yy_flex_realloc' */ /* Missing prototypes warnings: Triggered by -Wmissing-prototypes */ FILE *yyget_in(void); /* fixes: warning: no previous prototype for `yyget_in' */ FILE *yyget_out(void); /* fixes: warning: no previous prototype for `yyget_out' */ char *yyget_text(void); /* fixes: warning: no previous prototype for `yyget_text' */ int yyget_debug(void); /* fixes: warning: no previous prototype for `yyget_debug' */ /* 20150115: MacOSX with clang and --enable-debug-custom fails on yyget_leng() prototype Change return type of yyget_leng() from int to yy_size_t */ /* int yyget_leng(void); *//* fixes: warning: no previous prototype for `yyget_leng' */ yy_size_t yyget_leng(void); /* fixes: warning: no previous prototype for `yyget_leng' */ int yyget_lineno(void); /* fixes: warning: no previous prototype for `yyget_lineno' */ int yylex_destroy(void); /* fixes: warning: no previous prototype for `yylex_destroy' */ void yyset_debug(int bdebug); /* fixes: warning: no previous prototype for `yyset_debug' */ void yyset_in(FILE *in_str); /* fixes: warning: no previous prototype for `yyset_in' */ void yyset_lineno(int line_number); /* fixes: warning: no previous prototype for `yyset_lineno' */ void yyset_out(FILE *out_str); /* fixes: warning: no previous prototype for `yyset_out' */ #endif /* !__GNUC__ */ /* Global variables */ extern size_t ncap_ncl_dpt_crr; /* [nbr] Depth of current #include file (declared in ncap.c) */ extern size_t *ncap_ln_nbr_crr; /* [cnt] Line number (declared in ncap.c) */ extern char **ncap_fl_spt_glb; /* [fl] Script file (declared in ncap.c) */ /* File scope variables */ /* fxm: turn arbitrary size into pre-processor token */ char ncap_err_sng[200]; /* [sng] Buffer for error string */ /* Is lexer on left or right hand side of equals sign? LHS should contain only a variable or attribute In this case return variable/attribute name to parser If on RHS then return attribute value or variable structure Initialize to false, change to true if token is '=', false is token is ';' */ static nco_bool RHS=False; /* [flg] Is lexer on RHS of '=' sign? */ /* Headers necessary for INCLUDE state */ #define NCO_MAX_NCL_DPT 10 YY_BUFFER_STATE ncl_stk[NCO_MAX_NCL_DPT]; /* Include stack */ %} /* %x defines exclusive start states Once state is active, other rules do not match until initial state is restored NB: State names may not contain hyphens CCOMMENT: Handle C comments LMB92 p. 172, p. 43 INCLUDE: Read in #include file (from example in flex manpage) DMN_LST: Dimension list LHS_SUBSCRIPT: Left Hand Side subscripts (currently LHS casting) RHS_SUBSCRIPT: Right Hand Side subscripts (currently not used) */ %x CCOMMENT DMN_LST INCLUDE LHS_SUBSCRIPT RHS_SUBSCRIPT /* Definitions: LMB92 p. 153 Definitions are named regular expressions, e.g., DGT [0-9] Definitions enclosed in braces in rules section, e.g. {DGT}, are interpreted literally DGT [0-9] Digit LPH [A-Za-z_] Alphabetic character LPHDGT [A-Za-z0-9_] Alphanumeric character XPN [eE][+-]?[0-9]+ Real number Exponent */ DOT '.' DGT [0-9] LPH [A-Za-z_] LPHDGT [A-Za-z0-9_] XPN [eE][+-]?[0-9]+ /* Following sections after %% are lexer rules Each rule is regular expression followed by C-code for action If token matches regular expression then C-code is executed */ %% \#include { /* INCLUDE is exclusive start state for obtaining #include filename */ BEGIN INCLUDE; } /* end include */ [ \t]* /* Eat whitespace */ [^ \t\n]+ { /* Get include file name */ if(ncap_ncl_dpt_crr >= NCO_MAX_NCL_DPT){ (void)fprintf(stderr,"%s: ERROR File %s nesting depth of %lu is too deep",nco_prg_nm_get(),yytext,(unsigned long)ncap_ncl_dpt_crr); nco_exit(EXIT_FAILURE); } /* endif */ if(nco_dbg_lvl_get() > 1) (void)fprintf(stderr,"%s: INFO Will descend from file %s at nesting depth %lu to #include'd file %s at depth %lu\n",nco_prg_nm_get(),ncap_fl_spt_glb[ncap_ncl_dpt_crr],(unsigned long)ncap_ncl_dpt_crr,yytext,(unsigned long)ncap_ncl_dpt_crr+1UL); /* Put current input buffer on stack */ ncl_stk[ncap_ncl_dpt_crr]=YY_CURRENT_BUFFER; /* Increment nesting level */ ncap_ncl_dpt_crr++; /* Allocate another entry in line counter array */ ncap_ln_nbr_crr=(size_t *)nco_realloc(ncap_ln_nbr_crr,ncap_ncl_dpt_crr+1UL); /* Initialize line number counter for new file */ ncap_ln_nbr_crr[ncap_ncl_dpt_crr]=1UL; /* Store file name for diagnostics */ ncap_fl_spt_glb=(char **)nco_realloc(ncap_fl_spt_glb,ncap_ncl_dpt_crr+1UL); ncap_fl_spt_glb[ncap_ncl_dpt_crr]=(char *)strdup(yytext); if((yyin=fopen(ncap_fl_spt_glb[ncap_ncl_dpt_crr],"r")) == NULL){ (void)fprintf(stderr,"%s: ERROR Unable to open script file %s\n",nco_prg_nm_get(),ncap_fl_spt_glb[ncap_ncl_dpt_crr]); nco_exit(EXIT_FAILURE); } /* endif error */ /* Create new scanner input buffer for include file and switch to it Current start conditions remains active in new input buffer */ nco_yy_switch_to_buffer(yy_create_buffer(yyin,YY_BUF_SIZE)); /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* end enter #include file */ <> { /* NB: AT&T lex does not appear to have rules */ nco_bool NCO_SCRIPT_WITH_EOF_IS_TOPLEVEL=True; /* Emerge from #include file if nested, else exit lexer */ if(ncap_ncl_dpt_crr > 0UL){ /* If we are exiting a #include'd script, delete its buffers */ NCO_SCRIPT_WITH_EOF_IS_TOPLEVEL=False; /* [flg] */ if(nco_dbg_lvl_get() > 1) (void)fprintf(stderr,"%s: DEBUG Found EOF, emerging from file %s at nesting depth %lu to file %s at depth %lu\n",nco_prg_nm_get(),ncap_fl_spt_glb[ncap_ncl_dpt_crr],(unsigned long)ncap_ncl_dpt_crr,ncap_fl_spt_glb[ncap_ncl_dpt_crr-1],(unsigned long)ncap_ncl_dpt_crr-1UL); ncap_fl_spt_glb[ncap_ncl_dpt_crr]=(char *)nco_free(ncap_fl_spt_glb[ncap_ncl_dpt_crr]); /* Decrement depth of nesting */ ncap_ncl_dpt_crr--; /* De-allocate entry from line counter array */ ncap_ln_nbr_crr=(size_t *)nco_realloc(ncap_ln_nbr_crr,ncap_ncl_dpt_crr+1UL); /* De-allocate entry from script name array */ ncap_fl_spt_glb=(char **)nco_realloc(ncap_fl_spt_glb,ncap_ncl_dpt_crr+1UL); } /* endif #include'd script */ if(NCO_SCRIPT_WITH_EOF_IS_TOPLEVEL){ /* Emerged from zeroth level, exit lexer */ yyterminate(); }else{ /* Reclaim storage used by buffer just exited */ yy_delete_buffer(YY_CURRENT_BUFFER); /* Switch back to parent buffer */ nco_yy_switch_to_buffer(ncl_stk[ncap_ncl_dpt_crr]); } /* endelse */ } /* end */ "/*" { /* CCOMMENT is exclusive start state for C comments LMB92 p. 172 When CCOMMENT state is active, only CCOMMENT rules will match (hence an "exclusive start state" rather than "regular start state") Thus must (re)-define line number incrementing */ BEGIN CCOMMENT; } \n { /* Throw away comment text but increment line counter */ ncap_ln_nbr_crr[ncap_ncl_dpt_crr]++; } . { /* Throw away everything except end comment text */ } "*/" { /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* end CCOMMENT start state rules */ "(/" { /* Dimension list */ if(nco_dbg_lvl_get() > 0) (void)fprintf(stderr,"Entering DMN_LST with %s\n",yytext); BEGIN DMN_LST; return IGNORE; } /* End dimension list */ [ \t\n]* /* Eat whitespace */ "/)" { if(nco_dbg_lvl_get() > 0) (void)fprintf(stderr,"Exiting DMN_LST with %s\n",yytext); /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* End dimension list */ [^\]\n]*[\]\n]/"/)" { /*{LPH}{LPHDGT}*[ \t\n]*[,]?[ \t\n]* {*/ /* Recognize dimension lists */ if(nco_dbg_lvl_get() > 0) (void)fprintf(stderr,"Lexing dimension list %s\n",yytext); /* Valid subscripts must contain alphanumeric string */ if(yyleng < 3) goto end_dmn_lst; end_dmn_lst: /* Errors encountered during LHS processing jump to here */ /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* end dimension list */ \n { /* NB: Remaining rules are default state, also known as INITIAL state, or 0 state */ /* Ignore new lines */ ncap_ln_nbr_crr[ncap_ncl_dpt_crr]++; } [ \t]+ { /* Eat spaces and tabs */ } \/\/[^\n]* { /* Enable C++ comments */ } \"[^"\n]*["\n] { /* Process quoted strings */ char *bfr; bfr=(char*)nco_malloc(yyleng*sizeof(char)); strcpy(bfr,&yytext[1]); bfr[yyleng-2]='\0'; /* Replace C-language escape codes with actual byte values */ (void)sng_ascii_trn(bfr); lval_ptr->sng=strdup(bfr); bfr=(char*)nco_free(bfr); if(nco_dbg_lvl_get() > 3){ (void)fprintf(stderr,"Lexing string: %s\n",yytext); (void)fprintf(stderr,"Made string: %s\n",lval_ptr->sng); } /* endif */ return SNG; } /* end quoted strings */ {DGT}*\.{DGT}*({XPN})?[LlDd]?|{DGT}*({XPN})[LlDd]? { /* double or long double */ /* {DGT}*\.{DGT}*({XPN})?[LlDd]?|{DGT}*({XPN})[LlDd]? # Original rule and comments used until 20140527 NB: Tempted to prepend lexer expressions for floats and doubles with [+-]? so that unary plus/minus is handled in lexer rather than parser. However, this has unintended side-effects so let parser handle it for now */ /* 20140527: Many years after writing the above line I regret not recording what those unintended side-effects were... [+-]?{DGT}*\.{DGT}*({XPN})?[LlDd]?|{DGT}*({XPN})[LlDd]? # Potential rule tested 20140527 Not including sign signifiers [+-]? causes bug parsing --mask_condition expressions with negative msk_val Without the optional signage, ncap_ncwa_scn() ignores unary negative sign so msk_val is returned as abs(msk_val) Prepending [+-]? to number rules for doubles, floats etc fixes this particular problem but causes others Specifically, when lexer ingests signage tokens then parser treatment of subtraction fails, e.g., ncap -O -D 4 -v -s 'zero=1-1.0' ~/nco/data/in.nc ~/foo.nc # Result is zero=1 Hence the "unintended side-effects" mentioned above includes, roughly, that using [+-]? in lexer interferes with parser handling of unary signs */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a double %s\n",yytext); lval_ptr->scv.val.d=strtod(yytext,&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(yytext,"strtod",sng_cnv_rcd); lval_ptr->scv.type=NC_DOUBLE; return SCV; } /* end double or long double */ {DGT}*\.{DGT}*({XPN})?[Ff]|{DGT}*({XPN})[Ff] { /* float */ float float_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a float %s\n",yytext); if(sscanf((char *)yytext,"%e",&float_tkn) != 1){ sprintf(ncap_err_sng,"#Bad float: %s",yytext); nco_yyerror(prs_arg,ncap_err_sng); return EPROVOKE; } /* endif */ lval_ptr->scv.val.f=float_tkn; lval_ptr->scv.type=NC_FLOAT; return SCV; } /* end float */ {DGT}+("LL"|"ll") { /* int64 */ nco_int64 int64_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing an int64 %s\n",yytext); if(sscanf((char *)yytext,"%lli",&int64_tkn) != 1){ sprintf(ncap_err_sng,"Bad int64 constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.i=int64_tkn; lval_ptr->scv.type=NC_INT64; return SCV; } /* end int64 */ {DGT}+("ULL"|"ull") { /* uint64 */ nco_uint64 uint64_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a uint64 %s\n",yytext); if(sscanf((char *)yytext,"%llu",&uint64_tkn) != 1){ sprintf(ncap_err_sng,"Bad uint64 constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.i=uint64_tkn; lval_ptr->scv.type=NC_UINT64; return SCV; } /* end uint64 */ {DGT}+[lL]? { /* int */ nco_int int_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing an int %s\n",yytext); /* NB: Format depends on opaque type of nco_int Until 200911, nco_int was C-type long, and now nco_int is C-type int if(sscanf((char *)yytext,"%li",&int_tkn) != 1){ */ if(sscanf((char *)yytext,"%i",&int_tkn) != 1){ sprintf(ncap_err_sng,"Bad int constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.i=int_tkn; lval_ptr->scv.type=NC_INT; return SCV; } /* end int */ {DGT}+([uU]|"ul"|"UL") { /* uint */ nco_uint uint_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a uint %s\n",yytext); if(sscanf((char *)yytext,"%u",&uint_tkn) != 1){ sprintf(ncap_err_sng,"Bad uint constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.ui=uint_tkn; lval_ptr->scv.type=NC_UINT; return SCV; } /* end uint */ {DGT}+[sS] { /* short */ nco_short short_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a short %s\n",yytext); if(sscanf((char *)yytext,"%hi",&short_tkn) != 1){ sprintf(ncap_err_sng,"Bad short constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.s=short_tkn; lval_ptr->scv.type=NC_SHORT; return SCV; } /* end short */ {DGT}+("us"|"US") { /* ushort */ nco_ushort short_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a ushort %s\n",yytext); if(sscanf((char *)yytext,"%hu",&short_tkn) != 1){ sprintf(ncap_err_sng,"Bad short constant: %s",(char *)yytext); nco_yyerror(prs_arg,ncap_err_sng); } /* endif err */ lval_ptr->scv.val.s=short_tkn; lval_ptr->scv.type=NC_USHORT; return SCV; } /* end short */ {DGT}+[Bb] { /* byte */ nco_byte byte_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a byte %s\n",yytext); if(sscanf((char *)yytext,"%hhi",&byte_tkn) != 1){ sprintf(ncap_err_sng,"#Bad byte: %s",yytext); nco_yyerror(prs_arg,ncap_err_sng); return EPROVOKE; } /* endif err */ lval_ptr->scv.val.b=byte_tkn; lval_ptr->scv.type=NC_BYTE; return SCV; } /* end byte */ {DGT}+("UB"|"ub") { /* ubyte */ nco_ubyte ubyte_tkn; if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing a ubyte %s\n",yytext); if(sscanf((char *)yytext,"%hhu",&ubyte_tkn) != 1){ sprintf(ncap_err_sng,"#Bad byte: %s",yytext); nco_yyerror(prs_arg,ncap_err_sng); return EPROVOKE; } /* endif err */ lval_ptr->scv.val.ub=ubyte_tkn; lval_ptr->scv.type=NC_UBYTE; return SCV; } /* end ubyte */ foo1_zyx {return ABS;} /* Strategy for lexing control statements: 1. Look for language control statements (if, while, do, for) 2. Look for NCO-defined intrinsic functions (abs, pack, unpack) 3. Look for mathematical intrinsic functions (sin, cos) 4. Look for NCO-defined named constants (M_PI, M_E) */ "if" {return IF;} "print" {return PRINT;} foo2_zyx {return ABS;} /* TOKEN whitespace (: Token followed any amount of whitespace followed by opening parenthesis signifies function name, not variable name. This disambiguates variable and functional namespaces. Dimension reducing functions (min,max,avg,ttl) need thought Each function should allow specification of optional dimension list, e.g., foo=avg(var,(/lat,lon/)); should return mean T over lat,lon dimensions Certain functions, however, have binary versions, e.g., foo=min(var_1,var_2); should return point-wise minimum values Dimension lists require syntax like (/.../) to disambiguate meanings like foo=min(lat,lat) End result: foo=min(lat) Returns minimum value of lat foo=min(lat,(/lat/)) Returns minimum value of lat foo=min(lat,lat) Returns copy of lat (i.e., pointwise minimum of lat and lat) foo=min(var,(/dmn_1,dmn_2/)) Returns minimum of variable over dmn_1, dmn_2 dimensions */ abs/[ ]*\( {return ABS;} atostr/[ ]*\( {return ATOSTR;} avg/[ ]*\( {prs_arg->nco_op_typ=nco_op_avg;return RDC;} min/[ ]*\( {prs_arg->nco_op_typ=nco_op_min;return RDC;} max/[ ]*\( {prs_arg->nco_op_typ=nco_op_max;return RDC;} ttl/[ ]*\( {prs_arg->nco_op_typ=nco_op_ttl;return RDC;} pck/[ ]*\( {return PACK;} pack/[ ]*\( {return PACK;} pow/[ ]*\( {return POWER;} upk/[ ]*\( {return UNPACK;} unpack/[ ]*\( {return UNPACK;} float/[ ]*\( { lval_ptr->cnv_type = NC_FLOAT;return CNV_TYPE;} double/[ ]*\( { lval_ptr->cnv_type = NC_DOUBLE;return CNV_TYPE;} long/[ ]*\( { lval_ptr->cnv_type = NC_INT;return CNV_TYPE;} int/[ ]*\( { lval_ptr->cnv_type = NC_INT;return CNV_TYPE;} short/[ ]*\( { lval_ptr->cnv_type = NC_SHORT;return CNV_TYPE;} ushort/[ ]*\( { lval_ptr->cnv_type = NC_USHORT;return CNV_TYPE;} uint/[ ]*\( { lval_ptr->cnv_type = NC_UINT;return CNV_TYPE;} int64/[ ]*\( { lval_ptr->cnv_type = NC_INT64;return CNV_TYPE;} uint64/[ ]*\( { lval_ptr->cnv_type = NC_UINT64;return CNV_TYPE;} ubyte/[ ]*\( { lval_ptr->cnv_type = NC_UBYTE;return CNV_TYPE;} byte/[ ]*\( { lval_ptr->cnv_type = NC_BYTE;return CNV_TYPE;} char/[ ]*\( { lval_ptr->cnv_type = NC_CHAR;return CNV_TYPE;} M_PI {return NAMED_CONSTANT;} {LPH}{LPHDGT}*/[ ]*\( { /* Compare input with mathematical function names in table and return pointer to structure containing name, double function, float function */ int idx; for(idx=0;idxsym_tbl_nbr;idx++) if(!strcmp(yytext,(prs_arg->sym_tbl[idx]->nm))){ lval_ptr->sym=prs_arg->sym_tbl[idx]; return FUNCTION; } /* endif */ (void)sprintf(ncap_err_sng,"Warning: Unable to locate function %s. Perhaps %s is a variable?",yytext,yytext); (void)nco_yyerror(prs_arg,ncap_err_sng); return EPROVOKE; } /* end functions */ {LPH}{LPHDGT}*@{LPH}{LPHDGT}* { /* Recognize variable attributes, e.g., var_nm@att_nm */ aed_sct *ptr_aed; char *amp_ptr; char att_nm[NC_MAX_NAME]; char var_nm[NC_MAX_NAME]; int rcd=NC_NOERR; int rcd_out; int var_id; long att_sz; nc_type type; ptr_unn val; size_t sng_lng; nco_bool blkp; var_sct var_lkp; /* for us when calling lookup vars on first pass only */ if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing attribute %s\n",yytext); amp_ptr=strchr(yytext,'@'); sng_lng=amp_ptr-yytext; strncpy(var_nm,yytext,sng_lng); var_nm[sng_lng]='\0'; strcpy(att_nm,++amp_ptr); var_lkp.nm=var_nm; /* Assume global attribute when variable name is "global" */ if(!strcmp(var_nm,"global")) var_id=NC_GLOBAL; else rcd=nco_inq_varid_flg(prs_arg->in_id,var_nm,&var_id); /* We are on RHS so return value of attribute (if available) to parser During initial scan, just return attributes on RHS if(prs_arg->ntl_scn){ if(!RHS){ lval_ptr->aed.att_nm=(char *)strdup(att_nm); lval_ptr->aed.var_nm=(char *)strdup(var_nm); return OUT_ATT; }else{ return IGNORE; } } */ if(RHS){ /* First check if attribute has already been saved in symbol table If so then obtain and return value, else check input file If attribute is present obtain and return value from disk else return NC_BYTE of value 0 If attribute is NC_CHAR then return SNG type Other types (NC_FLOAT, NC_DOUBLE, NC_BYTE, NC_SHORT) return SCV */ ptr_aed=ncap_aed_lookup(var_nm,att_nm,prs_arg,False); if(ptr_aed){ if(ptr_aed->type == NC_CHAR){ (void)cast_void_nctype(ptr_aed->type,&ptr_aed->val); lval_ptr->sng=(char *)nco_malloc((ptr_aed->sz+1)*nco_typ_lng(NC_CHAR)); strncpy(lval_ptr->sng,(char *)(ptr_aed->val.cp),(size_t)(ptr_aed->sz)); lval_ptr->sng[ptr_aed->sz]='\0'; return SNG; }else{ lval_ptr->scv=ptr_unn_2_scv(ptr_aed->type,ptr_aed->val); return SCV; } /* end else */ } /* end if */ if(rcd == NC_NOERR){ rcd=nco_inq_att_flg(prs_arg->in_id,var_id,att_nm,&type,&att_sz); if (rcd == NC_ENOTATT){ (void)sprintf(ncap_err_sng,"Warning: Unable to locate RHS attribute %s of variable %s with var ID = %d in file %s. Returning 0-byte.",att_nm,var_nm,var_id,prs_arg->fl_in); (void)nco_yyerror(prs_arg,ncap_err_sng); lval_ptr->scv.val.b=0; lval_ptr->scv.type=NC_BYTE; return SCV; } /* end if */ if(rcd == NC_NOERR){ val.vp=(void *)nco_malloc(att_sz*nco_typ_lng(type)); rcd=nco_get_att(prs_arg->in_id,var_id,att_nm,val.vp,type); if(type == NC_CHAR){ (void)cast_void_nctype(type,&val); lval_ptr->sng=(char *)nco_malloc((att_sz+1)*sizeof(char)); strncpy(lval_ptr->sng,(char *)val.cp,(size_t)att_sz); lval_ptr->sng[att_sz]='\0';; val.vp=(void*)nco_free(val.vp); return SNG; }else{ lval_ptr->scv=ptr_unn_2_scv(type,val); val.vp=(void*)nco_free(val.vp); return SCV; } /* end else */ } /* end if */ }else{ /* ...else rcd reported an error */ /* Attribute is not in table or on disk so return 0-byte */ (void)sprintf(ncap_err_sng,"Warning: Unable to locate RHS attribute %s of variable %s with var ID = %d in file %s. Returning 0-byte.",att_nm,var_nm,var_id,prs_arg->fl_in); (void)nco_yyerror(prs_arg,ncap_err_sng); lval_ptr->scv.val.b=0; lval_ptr->scv.type=NC_BYTE; return SCV; } /* end if */ }/* end if RHS */ /* We are on LHS so simply save information for later processing by parser Atrribute is valid if its associated variable is in input or output file */ if(!RHS){ if(prs_arg->ntl_scn) blkp= ( ncap_var_lookup(&var_lkp,prs_arg,False) !=NULL) ; else blkp=False; rcd_out=nco_inq_varid_flg(prs_arg->out_id,var_nm,&var_id); if(rcd == NC_NOERR || rcd_out == NC_NOERR || blkp ){ lval_ptr->aed.att_nm=(char *)strdup(att_nm); lval_ptr->aed.var_nm=(char *)strdup(var_nm); return OUT_ATT; }else{ (void)sprintf(ncap_err_sng,"#Warning: unable to locate variable %s. So cannot create attribute %s",var_nm,yytext); (void)nco_yyerror(prs_arg,ncap_err_sng); return EPROVOKE; } /* end else */ } /* end if */ } /* End scalar values. Phew! */ {LPH}{LPHDGT}*/\[ { /* Recognize variables with subscripts */ if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing variable with subscripts %s\n",yytext); if(RHS){ lval_ptr->var_nm_RHS=(char *)strdup(yytext); BEGIN RHS_SUBSCRIPT; return VAR; }else{ lval_ptr->var_nm_LHS=(char *)strdup(yytext); BEGIN LHS_SUBSCRIPT; return OUT_VAR; } /* end else */ } /* end variables with subscripts */ {LPH}{LPHDGT}* { /* Recognize plain variables */ if(nco_dbg_lvl_get() > 3) (void)fprintf(stderr,"Lexing variable %s\n",yytext); if(RHS){ /* fxm mmr: memory leak since var_nm_RHS is never free()'d */ lval_ptr->var_nm_RHS=(char *)strdup(yytext); return VAR; }else{ lval_ptr->var_nm_LHS=(char *)strdup(yytext); return OUT_VAR; } /* end else */ } /* end variables without subscripts */ \[[^\]\n]*[\]\n] { /* fxm: allow whitespace in dimension list */ /* Recognize subscripted (hyperslabbed) variables Hyperslabbed variables for now indicated with square brackets Using square brackets so development does not break functions Left context is described in LMB92 p. 152 Subscript syntax is taken from Fortran9X specification: x[dmn1,dmn2,...,dmnN] x[a:b,c:,:d,e] */ const char * const sbs_dlm=","; /* [sng] Subscript delimiter */ static const char * const tpl_nm="Internally generated template"; char **sbs_lst; /* [sng] Array of dimension subscripts */ char *sbs_sng; /* [sng] Subscript */ int dmn_nbr; /* [nbr] Number of dimensions */ int idx; /* [idx] Counter */ int jdx; /* [idx] Counter */ double val=1.0; /* [frc] Value of template */ var_sct *var; /* [sct] Variable */ dmn_sct **dmn; /* [dmn] Dimension structure list */ dmn_sct *dmn_item; dmn_sct **dmn_new; /* Valid subscripts must contain alphanumeric string */ if(nco_dbg_lvl_get() > 2) (void)fprintf(stderr,"Interpreting %s as LHS_SUBSCRIPT\n",yytext); if(yyleng < 3) goto end_LHS_sbs; /* if(prs_arg->ntl_scn) goto end_LHS_sbs; */ /* Copy token into user memory and turn into list of dimension names */ sbs_sng=(char *)nco_malloc(yyleng*sizeof(char)); strcpy(sbs_sng,&yytext[1]); sbs_sng[yyleng-2]='\0'; sbs_lst=nco_lst_prs_2D(sbs_sng,sbs_dlm,&dmn_nbr); dmn=(dmn_sct **)nco_malloc(dmn_nbr*sizeof(dmn_sct *)); (void)nco_redef(prs_arg->out_id); for(idx=0;idxdmn_out */ for(jdx=0;jdx<*(prs_arg->nbr_dmn_out);jdx++){ dmn_item=(*(prs_arg->dmn_out))[jdx]; if(!strcmp(sbs_lst[idx],dmn_item->nm)){ dmn[idx]=dmn_item; break; } /* endif */ } /* end loop over jdx */ if(jdx != *(prs_arg->nbr_dmn_out)) continue; /* then try seach for dimension in prs_arg->dmn_in */ for (jdx=0;jdxnbr_dmn_in;jdx++){ dmn_item = prs_arg->dmn_in[jdx]; /* If found add dimension to dmn_out and dmn */ if(!strcmp(sbs_lst[idx],dmn_item->nm)){ /* BEWARE -- nco_dmn_out_grow() increments *(prs_arg->nbr_dmn_out) */ dmn_new = nco_dmn_out_grow(prs_arg); *dmn_new=nco_dmn_dpl(dmn_item); (void)nco_dmn_xrf(*dmn_new,dmn_item); /* write found dimension to output */ (void)nco_dmn_dfn(prs_arg->fl_out,prs_arg->out_id,dmn_new,1); dmn[idx]=*dmn_new; break; } /* endif */ } /* end loop over jdx */ if(jdx != prs_arg->nbr_dmn_in) continue; /* Exit action if dimension not found */ (void)sprintf(ncap_err_sng,"Warning: Unrecognized dimension \"%s\" in LHS subscripts",sbs_lst[idx]); (void)nco_yyerror(prs_arg,ncap_err_sng); (void)nco_enddef(prs_arg->out_id); goto end_LHS_sbs; } /* endif */ (void)nco_enddef(prs_arg->out_id); /* Check that un-limited dimension is first dimension */ for(idx=1;idxis_rec_dmn){ (void)sprintf(ncap_err_sng,"Warning:\"%s\" is the record dimension. It can only be the first dimension in a list",dmn[idx]->nm); (void)nco_yyerror(prs_arg,ncap_err_sng); goto end_LHS_sbs; } /* endif */ /* Create template variable to cast all RHS expressions */ var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* [fnc] Set defaults for each member of variable structure */ /* Overwrite with LHS information */ /* fxm mmr: memory leak with var->nm */ var->nm=(char *)strdup(tpl_nm); var->type=NC_DOUBLE; var->nbr_dim=dmn_nbr; var->dim=dmn; /* Allocate space for dimension structures */ if(var->nbr_dim > 0) var->dmn_id=(int *)nco_malloc(var->nbr_dim*sizeof(int)); else var->dmn_id=(int *)NULL; if(var->nbr_dim > 0) var->cnt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->cnt=(long *)NULL; if(var->nbr_dim > 0) var->srt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srt=(long *)NULL; if(var->nbr_dim > 0) var->end=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->end=(long *)NULL; if(var->nbr_dim > 0) var->srd=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srd=(long *)NULL; /* Defensive programming */ var->sz=1L; /* Attach LHS dimensions to variable */ for(idx=0;idxdim[idx]=dmn[idx]; var->dmn_id[idx]=dmn[idx]->id; var->cnt[idx]=dmn[idx]->cnt; var->srt[idx]=dmn[idx]->srt; var->end[idx]=dmn[idx]->end; var->srd[idx]=dmn[idx]->srd; var->sz*=var->cnt[idx]; } /* end loop over dim */ /* Do not initialize val in initial scan */ if(prs_arg->ntl_scn) { var->val.vp=(void*)NULL; goto end_var; } /* Allocate space for variable values fxm: more efficient and safer to use nco_calloc() and not fill with values? */ if((var->val.vp=(void *)nco_malloc_flg(var->sz*nco_typ_lng(var->type))) == NULL){ (void)fprintf(stderr,"%s: ERROR Unable to malloc() %ld*%lu bytes for var_LHS() in lexer\n",nco_prg_nm_get(),var->sz,(unsigned long)nco_typ_lng(var->type)); nco_exit(EXIT_FAILURE); } /* end if */ /* Copy arbitrary value into variable Placing a uniform value in variable should be unnecessary since variable is intended for use solely as dimensional template for nco_var_cnf_dmn() Nevertheless, copy 1.0 into value for safety */ { /* Change scope to define convenience variables which reduce de-referencing */ long var_sz; /* [nbr] Number of elements in variable */ size_t var_typ_sz; /* [B] Size of single element of variable */ char *var_val_cp; /* [ptr] Pointer to values */ var_sz=var->sz; /* [nbr] Number of elements in variable */ var_typ_sz=nco_typ_lng(var->type); var_val_cp=(char *)var->val.vp; for(idx=0;idxvar_LHS=var; if(nco_dbg_lvl_get() > 2) (void)fprintf(stderr,"%s: Lexer creating LHS cast template: Template var->nm %s, var->nbr_dim %d, var->sz %li\n",nco_prg_nm_get(),prs_arg->var_LHS->nm,prs_arg->var_LHS->nbr_dim,prs_arg->var_LHS->sz); if(0){ /* Remove some compiler warning messages CEWI */ /* Following two statements remove "defined but not used" messages in ncap_lex.c (lex.yy.c) */ (void)yyunput((int)0,(char *)NULL); /* (void)yy_flex_realloc((void *)NULL,(size_t)NULL);*/ /* Remove warnings which only occur on SGI IRIX cc */ yy_full_match=yy_full_match+0; yy_full_lp=yy_full_lp+0; yy_full_state=yy_full_state+0; } /* endif False */ /* Free dimension list memory */ (void)nco_free(sbs_sng); /* char list */ if(dmn_nbr > 0) sbs_lst=nco_sng_lst_free(sbs_lst,dmn_nbr); end_LHS_sbs: /* Errors encountered during LHS processing jump to here */ /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* end LHS subscripted variables */ \[[^\]\n]*[\]\n] { /* RHS_SUBSCRIPT */ (void)sprintf(ncap_err_sng,"Warning RHS subscripts are not yet implemented"); (void)nco_yyerror(prs_arg,ncap_err_sng); /* Return to default state, known as INITIAL state or 0 state LMB92 p. 43 */ BEGIN INITIAL; } /* end RHS_SUBSCRIPT */ "&&" { /* And */ return AND; } /* end && */ "||" { /* Or */ return OR; } /* end || */ "==" { /* Comparison equals */ lval_ptr->nco_rlt_opr=nco_op_eq; return COMPARISON; } /* end == */ "!=" { /* Comparison not equals */ lval_ptr->nco_rlt_opr=nco_op_ne; return COMPARISON; } /* end != */ "<=" { /* Comparison less than or equal to */ lval_ptr->nco_rlt_opr=nco_op_le; return COMPARISON; } /* end <= */ ">=" { /* Comparison greater than or equal to */ lval_ptr->nco_rlt_opr=nco_op_ge; return COMPARISON; } /* end >= */ "<" { /* Comparison less than */ lval_ptr->nco_rlt_opr=nco_op_lt; return COMPARISON; } /* end < */ ">" { /* Comparison greater than */ lval_ptr->nco_rlt_opr=nco_op_gt; return COMPARISON; } /* end > */ = { /* Equals assignment */ RHS=True; return yytext[0]; } /* end equals */ ; { /* semi-colon indicates end-of-statement */ RHS=False; return yytext[0]; } /* end semi-colon */ . { /* Everything not parsed by above falls through to here */ if(nco_dbg_lvl_get() > 5) (void)fprintf(stderr,"%s: Following token reached last lexer rule: %s\n",nco_prg_nm_get(),yytext); return yytext[0]; } /* end trickle down */ %% /* Begin user functions section */ int /* fxm: 20060217 Change to int from bool to work with g++ */ yywrap(void) { /* Purpose: Routine to replace library-defined yywrap() yywrap() is called when YY_INPUT returns EOF, e.g., at end of script Returning false (zero) means there is more to scan, and input has been redirected to new source, e.g., yyin points to new file. Returning true (non-zero) means scanning is complete, so scanner terminates and returns 0 to calling function Default is to return true (one) when called---this terminates scanner */ if(nco_dbg_lvl_get() >= 3) (void)fprintf(stderr,"%s: DEBUG yywrap() called with ncap_ncl_dpt_crr = %lu\n",nco_prg_nm_get(),(unsigned long)ncap_ncl_dpt_crr); /* comp.compilers thread 20020523 yywrap() should always return 1, even when scanning a #include'd file return (ncap_ncl_dpt_crr <= 1) ? 1 : 0; */ return 1; } /* end yywrap() */ void ncap_ntl_scn /* [fnc] Scan command script, construct I/O lists */ (prs_sct * const prs_arg, /* I/O [sct] Global information required in parser routines */ const char * const spt_arg_cat, /* I [sng] User-specified script */ nm_id_sct** const xtr_lst_a, /* O [sct] RHS variables present in input file */ int * const nbr_lst_a, /* O [nbr] Number of distinct RHS variables in input file */ nm_id_sct** const xtr_lst_b, /* O [sct] LHS variables present in input file */ int * const nbr_lst_b, /* O [nbr] Number of distinct LHS variables in input file */ nm_id_sct** const xtr_lst_c, /* O [sct] Parent variables of LHS attributes in input file */ int * const nbr_lst_c, /* O [nbr] Number of attribute parent variables in input file */ nm_id_sct** const xtr_lst_d, /* O [sct] LHS dimensions in input file */ int * const nbr_lst_d) /* O [nbr] Number of LHS dimensions in input file */ { /* Purpose: Scan command script, construct I/O lists Call routine to learn metadata contents of output file prior to arithmetic processing lst_a: RHS variables present in input file lst_b: LHS variables present in input file lst_c: Parent variables of LHS attributes in input file lst_d: Dimensions required by LHS subscripts (casting) */ /* 20020510: ncap_ntl_scn() was in ncap_utl.c but chokes g++ (not gcc) g++ complains that since YYSTYPE is defined in ncap_yacc.h, it is an error to call external function (yylex()) that uses this type Although the error is somewhat bogus, there is some merit to it Placing routine in ncap.l gives routine access to yylex() prototype and YYSTYPE Since ncap_ntl_scn() does call yylex(), it may reside in ncap.l To move routine to other file, #define NCAP_NTL_SCN_NOT_IN_NCAP_L */ #undef NCAP_NTL_SCN_NOT_IN_NCAP_L #ifdef NCAP_NTL_SCN_NOT_IN_NCAP_L /* Get YYSTYPE prior to calling scanner */ #include "ncap_yacc.h" /* ncap_yacc.h (ncap.tab.h) is produced from ncap_yacc.y by parser generator */ extern FILE *yyin; /* [fl] File handle for script file */ extern int yylex(YYSTYPE *lval_ptr,prs_sct *prs_arg); /* [fnc] Scanner entrypoint */ /* Following declaration gets rid of implicit declaration compiler warning It is a condensation of the lexer declaration from lex.yy.c: YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); */ extern int yy_scan_string(const char *); #endif /* NCAP_NTL_SCN_NOT_IN_NCAP_L */ nco_bool mch_flg; /* [flg] Variable is defined in list already */ char *var_nm; int lst_a_nbr=0; /* [nbr] Number of elements in list A */ int lst_b_nbr=0; /* [nbr] Number of elements in list B */ int lst_c_nbr=0; /* [nbr] Number of elements in list C */ int lst_d_nbr=0; /* [nbr] Number of elements in list D */ int lst_t_nbr=0; /* [nbr] Number of elements in list T */ int tkn_crr=-1; /* [tkn] Current token, must initialize to non-zero value */ int var_id; int var_idx; nm_id_sct *lst_a=NULL_CEWI; nm_id_sct *lst_b=NULL_CEWI; nm_id_sct *lst_c=NULL_CEWI; nm_id_sct *lst_d=NULL_CEWI; nm_id_sct *lst_t=NULL_CEWI; YYSTYPE lval; /* [tkn] Token */ if(spt_arg_cat){ yy_scan_string(spt_arg_cat); }else{ /* Open script file for reading */ if((yyin=fopen(ncap_fl_spt_glb[ncap_ncl_dpt_crr],"r")) == NULL){ (void)fprintf(stderr,"%s: ERROR Unable to open script file %s\n",nco_prg_nm_get(),ncap_fl_spt_glb[ncap_ncl_dpt_crr]); nco_exit(EXIT_FAILURE); } /* endif error */ } /* endif input from script */ /* While there are more tokens... */ while(tkn_crr != 0){ /* ...obtain next token from lexer... */ tkn_crr=yylex(&lval,prs_arg); /* ...determine which variables and attributes exist in input file... */ switch (tkn_crr){ case IGNORE: break; /* Do nothing */ case SCV: break; /* Do nothing */ case EPROVOKE: break; /* Do nothing */ case VAR: /* Search for RHS variables in input file */ var_nm=lval.var_nm_RHS; if(NC_NOERR == nco_inq_varid_flg(prs_arg->in_id,var_nm,&var_id)){ mch_flg=False; /* [flg] Variable is defined in list already */ /* Search RHS variables already known to be in input file... */ for(var_idx=0;var_idxin_id,var_nm,&var_id)){ mch_flg=False; for(var_idx=0;var_idxin_id,var_nm,&var_id)){ mch_flg=False; for(var_idx=0;var_idxlst as incompatible with nm_id_sct * in receiving prototype This is true. Not sure how/if this line ever worked. Were ncap not in maintenance mode, would be worth fixing? */ lst_d=nco_var_lst_add(lst_d,&lst_d_nbr,(nm_id_sct *)lval.sbs_lst->lst,lval.sbs_lst->nbr); if(lst_t_nbr > 0) (void)nco_nm_id_lst_free(lst_t,lst_t_nbr); break; default: /* Tokens that fall through are perfectly safe and normal Tokens values 1--256 are ASCII characters, values > 256 defined in yy.tab.h */ if(nco_dbg_lvl_get() >= 5)(void)fprintf(stderr,"%s: DEBUG Token type %d not handled in ncap_ntl_scn()\n",nco_prg_nm_get(),tkn_crr); break; } /* end switch */ } /* end while */ if(lst_a_nbr > 0){*xtr_lst_a=lst_a;*nbr_lst_a=lst_a_nbr;} if(lst_b_nbr > 0){*xtr_lst_b=lst_b;*nbr_lst_b=lst_b_nbr;} if(lst_c_nbr > 0){*xtr_lst_c=lst_c;*nbr_lst_c=lst_c_nbr;} if(lst_d_nbr > 0){*xtr_lst_d=lst_d;*nbr_lst_d=lst_d_nbr;} } /* end ncap_ntl_scn() */ int /* O [enm] Return code */ ncap_ncwa_scn /* [fnc] Scan command script, construct I/O lists */ (prs_sct * const prs_arg, /* I/O [sct] Global information required in parser routines */ const char * const msk_sng, /* I [sng] User-specified script */ char **msk_nm, /* O [sng] Masking variable name */ double *msk_val, /* O [frc] Masking value */ int *op_typ_rlt) /* O [enm] Relational operator type */ { /* Get YYSTYPE prior to calling scanner */ /* #include "ncap_yacc.h" extern int yylex(YYSTYPE *lval_ptr,prs_sct *prs_arg); extern int yy_scan_string(const char *); */ nco_bool scv_dfn=False; nco_bool minus_dfn=False; int op_typ=-1; int rcd=NCO_NOERR; char *fnl_sng; char *msk_nm_LHS=NULL; scv_sct scv_out; int tkn_crr=-1; /* [tkn] Current token, must initialize to non-zero value */ YYSTYPE lval; /* [tkn] Token */ fnl_sng=(char *)nco_malloc((strlen(msk_sng)+3UL)*sizeof(char)); (void)strcpy(fnl_sng,msk_sng); (void)strcat(fnl_sng,";\n"); yy_scan_string(fnl_sng); /* While there are more tokens... */ while(tkn_crr != 0){ /* ...obtain next token from lexer... */ tkn_crr=yylex(&lval,prs_arg); /* ...determine which variables and attributes exist in input file... */ switch(tkn_crr){ case OUT_VAR: msk_nm_LHS=strdup(lval.var_nm_LHS); break; case COMPARISON: op_typ=lval.nco_rlt_opr; break; case '-': minus_dfn=True; break; case SCV: scv_out=lval.scv; if (minus_dfn) (void)ncap_scv_minus(&scv_out); scv_dfn=True; break; default: /* Tokens that fall through are perfectly safe and normal Tokens values 1--256 are ASCII characters, values > 256 defined in yy.tab.h */ if(nco_dbg_lvl_get() >= 5) (void)fprintf(stderr,"%s: DEBUG Token type %d not handled in ncap_ntl_scn()\n",nco_prg_nm_get(),tkn_crr); /* Assume single '=' means '==' if op_typ is not defined */ if(tkn_crr == '=' && op_typ == -1) op_typ=nco_op_eq; break; } /* end switch */ } /* end while */ /* Check that all three required items for an ncwa mask_condition have been scanned */ if(msk_nm_LHS == (char *)NULL){ (void)fprintf(stderr,"%s: Mask string (%s) does not contain valid variable name\n",nco_prg_nm_get(),msk_sng); rcd=NCO_ERR; }else{ *msk_nm=msk_nm_LHS; } /* endif */ if(op_typ == -1){ (void)fprintf(stderr,"%s: Mask string (%s) does not contain valid comparison operator\n",nco_prg_nm_get(),msk_sng); rcd=NCO_ERR; }else{ *op_typ_rlt=op_typ; } /* endif */ if(scv_dfn == False){ (void)fprintf(stderr,"%s: Mask string (%s) does not contain valid number\n",nco_prg_nm_get(),msk_sng); rcd=NCO_ERR; }else{ (void)nco_scv_cnf_typ((nc_type)NC_DOUBLE,&scv_out); *msk_val=scv_out.val.d; } /* endif */ return rcd; } /* end ncap_ncwa_scn() */ /* End user functions section */ nco-4.5.4/src/nco/ncap_utl.c000066400000000000000000001444731264355130400156420ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF arithmetic processor */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include #include "ncap.h" /* netCDF arithmetic processor */ extern char ncap_err_sng[200]; /* [sng] Buffer for error string (declared in ncap_lex.l) */ var_sct * /* fxm: which prototype to use? */ /* ncap_var_init(const char * const var_nm,prs_sct *prs_arg) */ ncap_var_init(char *var_nm,prs_sct *prs_arg) { /* Purpose: Initialize variable structure, retrieve variable values from disk Parser calls ncap_var_init() when it encounters a new RHS variable */ /* const char fnc_nm[]="ncap_var_init()"; *//* [sng] Function name */ int idx; int jdx; int dmn_var_nbr; int *dim_id=NULL; int var_id; int rcd; int fl_id; nco_bool DEF_VAR=False; dmn_sct *dmn_in; dmn_sct **dim_new=NULL_CEWI; var_sct var_lkp; var_sct *var; var_sct *var_lst; /* Several possiblilties here: var NOT in I or O var in I var in O (defined and filled) var in 0 (defined but empty) Must handle case var in I, var in O (defined & empty) with care This occurs when var is on LHS and RHS, e.g., two=two^6 INITIAL SCAN check var list for var -- if present fill with nulls and return Not present check output then input FINAL SCAN check var list for var -- if present & defined + filled return var from output if present & defined + unfilled reurn var from input if defined Not present check output then input */ var_lkp.nm=strdup(var_nm); var_lst=ncap_var_lookup(&var_lkp,((prs_sct*)prs_arg),False); (void)nco_free(var_lkp.nm); if(prs_arg->ntl_scn && var_lst){ var=nco_var_dpl(var_lst); var->val.vp=NULL; return var; } /* endif */ /* Check if var in list has been defined but NOT filled */ if(!prs_arg->ntl_scn && var_lst && var_lst->sz >0 ) DEF_VAR=True; /* Check output file for var */ rcd=nco_inq_varid_flg(prs_arg->out_id,var_nm,&var_id); if(rcd == NC_NOERR && !DEF_VAR){ fl_id=prs_arg->out_id; }else{ /* Check input file for ID */ rcd=nco_inq_varid_flg(prs_arg->in_id,var_nm,&var_id); if(rcd != NC_NOERR){ /* Return NULL if variable not in input or output file */ (void)fprintf(stderr,"WARNING unable to find %s in %s or %s\n",var_nm,prs_arg->fl_in,prs_arg->fl_out); return (var_sct *)NULL; } /* end if */ /* Find dimensions used in var Learn which are not already in output list prs_arg->dmn_out and output file Add these to output list and output file */ (void)nco_redef(prs_arg->out_id); fl_id=prs_arg->in_id; (void)nco_inq_varndims(fl_id,var_id,&dmn_var_nbr); if(dmn_var_nbr>0){ dim_id=(int *)nco_malloc(dmn_var_nbr*sizeof(int)); (void)nco_inq_vardimid(fl_id,var_id,dim_id); for(idx=0;idxnbr_dmn_in;jdx++){ /* De-reference */ dmn_in=prs_arg->dmn_in[jdx]; if(dim_id[idx] != dmn_in->id || dmn_in->xrf) continue; /* Define new dimension in (prs_arg->dmn_out) */ dim_new=nco_dmn_out_grow(prs_arg); *dim_new=nco_dmn_dpl(dmn_in); (void)nco_dmn_xrf(*dim_new,dmn_in); /* Write new dimension to output file */ (void)nco_dmn_dfn(prs_arg->fl_out,prs_arg->out_id,dim_new,1); if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG Found new dimension %s in input variable %s in file %s. Defining dimension %s in output file %s\n",nco_prg_nm_get(),(*dim_new)->nm,var_nm,prs_arg->fl_in,(*dim_new)->nm,prs_arg->fl_out); break; } /* end loop over dimensions in current output dimension list */ (void)nco_free(dim_id); } /* end loop over dimension in current input variable */ (void)nco_enddef(prs_arg->out_id); } /* end else */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: parser VAR action called ncap_var_init() to retrieve %s from disk\n",nco_prg_nm_get(),var_nm); var=nco_var_fll(fl_id,var_id,var_nm,*(prs_arg->dmn_out),*(prs_arg->nbr_dmn_out)); /* var->nm=(char *)nco_malloc((strlen(var_nm)+1UL)*sizeof(char)); (void)strcpy(var->nm,var_nm); */ /* Tally is not required yet since ncap does not perform cross-file operations (yet) */ /* var->tally=(long *)nco_malloc_dbg(var->sz*sizeof(long int),"Unable to malloc() tally buffer in variable initialization",fnc_nm); (void)nco_zero_long(var->sz,var->tally); */ var->tally=(long *)NULL; /* Retrieve variable values from disk into memory */ if(prs_arg->ntl_scn) { var->val.vp=(void*)NULL; }else{ (void)nco_var_get(fl_id,var); } /* end else */ /* (void)nco_var_free(var_nm);*/ /* (void)nco_free(var_nm->nm);*/ /* var=nco_var_upk(var); */ return var; } /* end ncap_var_init() */ dmn_sct ** nco_dmn_out_grow (prs_sct * prs_arg) { /* Purpose: Expand dimension list by one and return pointer to newly created member */ int *sz; sz=prs_arg->nbr_dmn_out; *(prs_arg->dmn_out)=(dmn_sct **)nco_realloc(*(prs_arg->dmn_out),(++*sz)*sizeof(dmn_sct *)); return (*(prs_arg->dmn_out)+(*sz-1)); } /* end nco_dmn_out_grow() */ int ncap_var_write (var_sct *var, prs_sct *prs_arg) { /* Purpose: Define variable in output file and write variable */ /* const char mss_val_sng[]="missing_value"; *//* [sng] Unidata standard string for missing value */ const char add_fst_sng[]="add_offset"; /* [sng] Unidata standard string for add offset */ const char scl_fct_sng[]="scale_factor"; /* [sng] Unidata standard string for scale factor */ int rcd; /* [rcd] Return code */ int var_out_id; var_sct *ptr_var; var_sct *var_dpl; nco_bool DEF_VAR; /* True if var has been defined in O in initial scan */ #ifdef NCO_RUSAGE_DBG long maxrss; /* [B] Maximum resident set size */ #endif /* !NCO_RUSAGE_DBG */ /* If inital scan duplicate then save in list, free val.vp */ if(prs_arg->ntl_scn){ var->val.vp=nco_free(var->val.vp); var_dpl=nco_var_dpl(var); assert(var_dpl->nm); if(ncap_var_lookup(var_dpl,((prs_sct*)prs_arg),True)) (void)fprintf(stdout,"%s: variable %s defined\n",nco_prg_nm_get(),var->nm); (void)nco_var_free(var); return True; } /* endif ntl_scn */ /* Check if var is in table AND has been defined NB: var and ptr_var are different */ ptr_var=ncap_var_lookup(var,((prs_sct*)prs_arg),False); DEF_VAR=(ptr_var && ptr_var->sz > 0 ? True : False); rcd=nco_inq_varid_flg(((prs_sct *)prs_arg)->out_id,var->nm,&var_out_id); if(!DEF_VAR){ /* Check to see if variable has already been defined and written */ if(rcd == NC_NOERR){ (void)sprintf(ncap_err_sng,"Warning: Variable %s has aleady been saved in %s",var->nm,((prs_sct *)prs_arg)->fl_out); (void)nco_yyerror(prs_arg,ncap_err_sng); var = nco_var_free(var); return False; } } /* DEF_VAR */ if(DEF_VAR && (var->pck_ram || var->has_mss_val)){ /* Put file in define mode to allow metadata writing */ (void)nco_redef(prs_arg->out_id); /* Put missing value */ if(var->has_mss_val) (void)nco_put_att(prs_arg->out_id,var_out_id,nco_mss_val_sng_get(),var->type,1,var->mss_val.vp); /* Write/overwrite scale_factor and add_offset attributes */ if(var->pck_ram){ /* Variable is packed in memory */ if(var->has_scl_fct) (void)nco_put_att(prs_arg->out_id,var_out_id,scl_fct_sng,var->typ_upk,1,var->scl_fct.vp); if(var->has_add_fst) (void)nco_put_att(prs_arg->out_id,var_out_id,add_fst_sng,var->typ_upk,1,var->add_fst.vp); } /* endif pck_ram */ /* Take output file out of define mode */ (void)nco_enddef(prs_arg->out_id); } /* endif DEF_VAR... */ if(!DEF_VAR){ /* Put file in define mode to allow metadata writing */ (void)nco_redef(prs_arg->out_id); /* Define variable */ (void)nco_def_var(prs_arg->out_id,var->nm,var->type,var->nbr_dim,var->dmn_id,&var_out_id); /* Set HDF Lempel-Ziv compression level, if requested */ if(prs_arg->dfl_lvl >= 0 && var->nbr_dim > 0) (void)nco_def_var_deflate(prs_arg->out_id,var_out_id,(int)NC_SHUFFLE,(int)True,prs_arg->dfl_lvl); /* Set chunk sizes, if requested */ if(prs_arg->cnk_sz && var->nbr_dim > 0) (void)nco_def_var_chunking(prs_arg->out_id,var_out_id,(int)NC_CHUNKED,prs_arg->cnk_sz); /* Put missing value */ if(var->has_mss_val) (void)nco_put_att(prs_arg->out_id,var_out_id,nco_mss_val_sng_get(),var->type,1,var->mss_val.vp); /* Write/overwrite scale_factor and add_offset attributes */ if(var->pck_ram){ /* Variable is packed in memory */ if(var->has_scl_fct) (void)nco_put_att(prs_arg->out_id,var_out_id,scl_fct_sng,var->typ_upk,1,var->scl_fct.vp); if(var->has_add_fst) (void)nco_put_att(prs_arg->out_id,var_out_id,add_fst_sng,var->typ_upk,1,var->add_fst.vp); } /* endif pck_ram */ /* Take output file out of define mode */ (void)nco_enddef(prs_arg->out_id); } /* end if */ /* Write variable */ if(var->nbr_dim == 0){ (void)nco_put_var1(prs_arg->out_id,var_out_id,0L,var->val.vp,var->type); }else{ (void)nco_put_vara(prs_arg->out_id,var_out_id,var->srt,var->cnt,var->val.vp,var->type); } /* end else */ #ifdef NCO_RUSAGE_DBG /* Compile: cd ~/nco/bld;make 'USR_TKN=-DNCO_RUSAGE_DBG';cd - */ /* Print rusage memory usage statistics */ if(nco_dbg_lvl_get() >= 0) (void)fprintf(stdout,"%s: INFO ncap_var_write() writing variable %s\n",nco_prg_nm_get(),var->nm); maxrss=nco_mmr_usg_prn((int)0); #endif /* !NCO_RUSAGE_DBG */ /* Free varible */ var=nco_var_free(var); /* Use sz to keep track of defined and written variables */ if(DEF_VAR) ptr_var->sz=-1; return rcd; } /* end ncap_var_write() */ sym_sct * ncap_sym_init (const char * const sym_nm, double (*fnc_dbl)(double), float (*fnc_flt)(float)) { /* Purpose: Allocate space for sym_sct then initialize */ sym_sct *symbol; symbol=(sym_sct *)nco_malloc(sizeof(sym_sct)); symbol->nm=(char *)strdup(sym_nm); symbol->fnc_dbl=fnc_dbl; symbol->fnc_flt=fnc_flt; return symbol; } /* end ncap_sym_init() */ ptr_unn ncap_scv_2_ptr_unn (scv_sct scv) { /* Purpose: Convert scv_sct to ptr_unn malloc() appropriate space for single type NB: Does not work on strings */ ptr_unn val; nc_type type=scv.type; val.vp=(void *)nco_malloc(nco_typ_lng(type)); (void)cast_void_nctype(type,&val); switch(type){ case NC_FLOAT: *val.fp=scv.val.f; break; case NC_DOUBLE: *val.dp=scv.val.d; break; case NC_INT: *val.ip=scv.val.i; break; case NC_SHORT: *val.sp=scv.val.s; break; case NC_USHORT: *val.usp=scv.val.us; break; case NC_UINT: *val.uip=scv.val.ui; break; case NC_INT64: *val.i64p=scv.val.i64; break; case NC_UINT64: *val.ui64p=scv.val.ui64; break; case NC_BYTE: *val.bp=scv.val.b; break; case NC_UBYTE: *val.ubp=scv.val.ub; break; case NC_CHAR: break; /* do nothing */ case NC_STRING: break; /* do nothing */ default: nco_dfl_case_nc_type_err(); break; } /* end switch */ (void)cast_nctype_void(type,&val); return val; } /* end ncap_scv_2_ptr_unn() */ var_sct * /* O [sct] Sum of input variables (var_1+var_2) */ ncap_var_var_add /* [fnc] Add two variables */ (var_sct *var_1, /* I [sct] Input variable structure containing first operand */ var_sct *var_2) /* I [sct] Input variable structure containing second operand */ { /* Purpose: Add two variables */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); // if(var_1 != var_chk1) var_chk1 = (var_sct*)nco_var_free(var_chk1); //if(var_2 != var_chk2) var_chk2 = (var_sct*)nco_var_free(var_chk2); /* fxm: bug in nco_var_add()? missing_value is not carried over to var_2 in result when var_1->has_mss_val is true */ if(var_1->has_mss_val){ (void)nco_var_add(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_add(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); } /* end if */ var_1=nco_var_free(var_1); return var_2; } /* end ncap_var_var_add() */ var_sct * /* O [sct] Quotient of input variables (var_2/var_1) */ ncap_var_var_dvd /* [fnc] Divide two variables (var_2/var_1) */ (var_sct *var_1, /* I [sct] Variable structure containing denominator */ var_sct *var_2) /* I [sct] Variable structure containing numerator */ { /* Purpose: Divide two variables (var_2/var_1) */ /* Purpose: Divide two variables */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); if(var_1->has_mss_val){ (void)nco_var_dvd(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_dvd(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); } /* end else */ var_1=nco_var_free(var_1); return var_2; } /* end ncap_var_var_dvd() */ var_sct * /* O [sct] Product of input variables (var_1*var_2) */ ncap_var_var_mlt /* [fnc] Multiply two variables */ (var_sct *var_1, /* I [sct] Variable structure containing first operand */ var_sct *var_2) /* I [sct] Variable structure containing second operand */ { /* Purpose: Multiply two variables */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); if(var_1->has_mss_val){ (void)nco_var_mlt(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_mlt(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); } /* end else */ var_1=nco_var_free(var_1); return var_2; } /* end ncap_var_var_mlt() */ var_sct * /* O [sct] Remainder of modulo operation of input variables (var_1%var_2) */ ncap_var_var_mod /* [fnc] Remainder (modulo) operation of two variables */ (var_sct *var_1, /* I [sct] Variable structure containing field */ var_sct *var_2) /* I [sct] Variable structure containing divisor */ { /* Purpose: Remainder (modulo) operation of two variables (var_1%var_2) */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); if(var_1->has_mss_val){ (void)nco_var_mod(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_mod(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); } /* end else */ var_1=nco_var_free(var_1); return var_2; } /* end ncap_var_var_mod() */ var_sct * /* O [sct] Empowerment of input variables (var_1^var_2) */ ncap_var_var_pwr /* [fnc] Empowerment of two variables */ (var_sct *var_1, /* I [sct] Variable structure containing base */ var_sct *var_2) /* I [sct] Variable structure containing exponent */ { /* Purpose: Empower two variables (var_1^var_2) */ /* Purpose: Add two variables */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } /* Make sure vars are at least float precision */ if(nco_rth_prc_rnk(var_1->type) < nco_rth_prc_rnk_float && nco_rth_prc_rnk(var_2->type < nco_rth_prc_rnk_float)) var_1=nco_var_cnf_typ((nc_type)NC_FLOAT,var_1); (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); if(var_1->has_mss_val){ (void)nco_var_pwr(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_pwr(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); } /* end else */ return var_2; } /* end ncap_var_var_pwr() */ var_sct * /* O [frc] Remainder of input variables (var_2-var_1) */ ncap_var_var_sub /* [fnc] Subtract two variables (var_2-var_1) */ (var_sct *var_2, /* I [sct] Variable structure containing second operand */ /* fxm TODO: 19 non-standard argument order */ var_sct *var_1) /* I [sct] Variable structure containing first operand */ { /* Purpose: Subtract a variable from another variable */ /* Purpose: Add two variables */ /* Store result in var_2 */ if(var_1->undefined) var_2->undefined=True; if(var_2->undefined) { var_1=nco_var_free(var_1); return var_2; } (void)ncap_var_retype(var_1,var_2); /* Handle initial scan */ if(var_1->val.vp==(void*)NULL ) { if(var_1->nbr_dim > var_2->nbr_dim) { var_2=nco_var_free(var_2); return var_1; }else{ var_1=nco_var_free(var_1); return var_2; } } (void)ncap_var_cnf_dmn(&var_1,&var_2); if(var_1->has_mss_val){ (void)nco_var_sbt(var_1->type,var_1->sz,var_1->has_mss_val,var_1->mss_val,var_1->val,var_2->val); }else{ (void)nco_var_sbt(var_1->type,var_1->sz,var_2->has_mss_val,var_2->mss_val,var_1->val,var_2->val); }/* end else */ var_1=nco_var_free(var_1); return var_2; } /* end ncap_var_var_sub() */ var_sct * ncap_var_fnc(var_sct *var_in,sym_sct *app) { /* Purpose: Evaluate fnc_dbl(var) or fnc_flt(var) for each value in variable Float and double functions are in app */ long idx; long sz; ptr_unn op1; if(var_in->undefined) return var_in; /* Promote variable to NC_FLOAT */ if(nco_rth_prc_rnk(var_in->type) < nco_rth_prc_rnk_float) var_in=nco_var_cnf_typ((nc_type)NC_FLOAT,var_in); /* Handle initial scan differently */ if(var_in->val.vp == NULL) return var_in; op1=var_in->val; sz=var_in->sz; (void)cast_void_nctype(var_in->type,&op1); if(var_in->has_mss_val) (void)cast_void_nctype(var_in->type,&(var_in->mss_val)); switch(var_in->type){ case NC_DOUBLE: { if(!var_in->has_mss_val){ for(idx=0;idxfnc_dbl))(op1.dp[idx]); }else{ double mss_val_dbl=*(var_in->mss_val.dp); /* Temporary variable reduces de-referencing */ for(idx=0;idxfnc_dbl))(op1.dp[idx]); } /* end for */ } /* end else */ break; } case NC_FLOAT: { if(!var_in->has_mss_val){ for(idx=0;idxfnc_flt))(op1.fp[idx]); }else{ float mss_val_flt=*(var_in->mss_val.fp); /* Temporary variable reduces de-referencing */ for(idx=0;idxfnc_flt))(op1.fp[idx]); } /* end for */ } /* end else */ break; } default: nco_dfl_case_nc_type_err(); break; }/* end switch */ if(var_in->has_mss_val) (void)cast_nctype_void(var_in->type,&(var_in->mss_val)); return var_in; } /* end ncap_var_fnc() */ var_sct * ncap_var_scv_add(var_sct *var,scv_sct scv) { /* Purpose: add the value in scv to each element of var */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_scv_add(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* end ncap_var_scv_add() */ var_sct * ncap_var_scv_sub(var_sct *var,scv_sct scv) { /* Purpose: Subtract value in scv from each element of var */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)ncap_scv_minus(&scv); (void)nco_var_scv_add(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* end ncap_var_scv_sub() */ var_sct * ncap_var_scv_mlt(var_sct *var,scv_sct scv) { /* Purpose: Multiply variable by value in scv */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_scv_mlt(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* end ncap_var_scv_mlt */ var_sct * ncap_var_scv_dvd(var_sct *var,scv_sct scv) { /* Purpose: Divide each element of var by value in scv */ (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_scv_dvd(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* end ncap_var_scv_dvd */ var_sct * ncap_scv_var_dvd(scv_sct scv,var_sct *var) { /* Purpose: Divide scv by value of each element in var */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_scv_var_dvd(var->type,var->sz,var->has_mss_val,var->mss_val,&scv,var->val); return var; } /* end ncap_scv_var_dvd */ var_sct * ncap_var_scv_mod(var_sct *var,scv_sct scv) { /* Purpose: Modulus of each element of var with scv */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_scv_mod(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* ncap_var_scv_mod */ var_sct * ncap_scv_var_mod(scv_sct scv,var_sct *var) { /* Purpose: Modulus of scv with each element of var */ if(var->undefined) return var; (void)ncap_var_scv_cnf_typ_hgh_prc(&var,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_scv_var_mod(var->type,var->sz,var->has_mss_val,var->mss_val,&scv,var->val); return var; } /* ncap_var_scv_mod */ var_sct * ncap_var_scv_pwr(var_sct *var,scv_sct scv) { /* Purpose: Empower each element in var by scv */ /* Promote scv and var to NC_FLOAT if necessary since C has no integer empowerment This reduces type conversion warnings (it is not done to avoid overflow) */ if(nco_rth_prc_rnk(var->type) < nco_rth_prc_rnk_float) var=nco_var_cnf_typ((nc_type)NC_FLOAT,var); (void)nco_scv_cnf_typ(var->type,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_scv_pwr(var->type,var->sz,var->has_mss_val,var->mss_val,var->val,&scv); return var; } /* end ncap_var_scv_pwr */ var_sct * ncap_scv_var_pwr(scv_sct scv,var_sct *var) { /* Purpose: Empower each element in scv by var */ /* Promote scv and var to NC_FLOAT if necessary since C has no integer empowerment This reduces type conversion warnings (it is not done to avoid overflow) */ if(var->undefined) return var; if(nco_rth_prc_rnk(var->type) < nco_rth_prc_rnk_float) var=nco_var_cnf_typ((nc_type)NC_FLOAT,var); (void)nco_scv_cnf_typ(var->type,&scv); /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_scv_var_pwr(var->type,var->sz,var->has_mss_val,var->mss_val,&scv,var->val); return var; } /* end ncap_var_scv_pwr */ var_sct * ncap_var_abs(var_sct *var) { /* Purpose: Find absolute value of each element of var */ if(var->undefined) return var; /* Deal with inital scan */ if(var->val.vp == NULL) return var; (void)nco_var_abs(var->type,var->sz,var->has_mss_val,var->mss_val,var->val); return var; } /* end ncap_var_abs */ scv_sct ncap_scv_clc (scv_sct scv_1, const char op, scv_sct scv_2) { /* Purpose: Calculate (scv_1 op scv_2) NB: Scalar values must be of same type */ /* http://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html __GNUC__ : Defined by gcc __GNUG__ : Defined by g++, equivalent to (__GNUC__ && __cplusplus) */ #ifndef __GNUG__ extern float fmodf(float,float); /* Cannot insert fmodf in ncap_sym_init() because it takes two arguments TODO #20 */ extern float fabsf(float); /* Sun math.h does not include fabsf() prototype */ #endif /* __GNUG__ */ scv_sct scv_out; scv_out.type=scv_1.type; /* if(scv_1.undefined || scv_2.undefined ) { scv_out.undefined=True; return scv_out; } */ switch(scv_out.type){ case NC_FLOAT: switch(op){ case '+': scv_out.val.f=scv_1.val.f+scv_2.val.f;break; case '-': scv_out.val.f=scv_1.val.f-scv_2.val.f;break; case '/': scv_out.val.f=scv_1.val.f/scv_2.val.f;break; case '*': scv_out.val.f=scv_1.val.f*scv_2.val.f;break; case '%': scv_out.val.f=fmodf(scv_1.val.f,fabsf(scv_2.val.f));break; } break; case NC_DOUBLE: switch(op){ case '+': scv_out.val.d=scv_1.val.d+scv_2.val.d;break; case '-': scv_out.val.d=scv_1.val.d-scv_2.val.d;break; case '/': scv_out.val.d=scv_1.val.d/scv_2.val.d;break; case '*': scv_out.val.d=scv_1.val.d*scv_2.val.d;break; case '%': scv_out.val.d=fmod(scv_1.val.d,fabs(scv_2.val.d));break; } break; case NC_INT: switch(op){ case '+': scv_out.val.i=scv_1.val.i+scv_2.val.i;break; case '-': scv_out.val.i=scv_1.val.i-scv_2.val.i;break; case '/': scv_out.val.i=scv_1.val.i/scv_2.val.i;break; case '*': scv_out.val.i=scv_1.val.i*scv_2.val.i;break; case '%': scv_out.val.i=scv_1.val.i%scv_2.val.i;break; } break; case NC_SHORT: switch(op){ case '+': scv_out.val.s=scv_1.val.s+scv_2.val.s;break; case '-': scv_out.val.s=scv_1.val.s-scv_2.val.s;break; case '/': scv_out.val.s=scv_1.val.s/scv_2.val.s;break; case '*': scv_out.val.s=scv_1.val.s*scv_2.val.s;break; case '%': scv_out.val.s=scv_1.val.s%scv_2.val.s;break; } break; case NC_USHORT: switch(op){ case '+': scv_out.val.us=scv_1.val.us+scv_2.val.us;break; case '-': scv_out.val.us=scv_1.val.us-scv_2.val.us;break; case '/': scv_out.val.us=scv_1.val.us/scv_2.val.us;break; case '*': scv_out.val.us=scv_1.val.us*scv_2.val.us;break; case '%': scv_out.val.us=scv_1.val.us%scv_2.val.us;break; } break; case NC_UINT: switch(op){ case '+': scv_out.val.ui=scv_1.val.ui+scv_2.val.ui;break; case '-': scv_out.val.ui=scv_1.val.ui-scv_2.val.ui;break; case '/': scv_out.val.ui=scv_1.val.ui/scv_2.val.ui;break; case '*': scv_out.val.ui=scv_1.val.ui*scv_2.val.ui;break; case '%': scv_out.val.ui=scv_1.val.ui%scv_2.val.ui;break; } break; case NC_INT64: switch(op){ case '+': scv_out.val.i64=scv_1.val.i64+scv_2.val.i64;break; case '-': scv_out.val.i64=scv_1.val.i64-scv_2.val.i64;break; case '/': scv_out.val.i64=scv_1.val.i64/scv_2.val.i64;break; case '*': scv_out.val.i64=scv_1.val.i64*scv_2.val.i64;break; case '%': scv_out.val.i64=scv_1.val.i64%scv_2.val.i64;break; } break; case NC_UINT64: switch(op){ case '+': scv_out.val.ui64=scv_1.val.ui64+scv_2.val.ui64;break; case '-': scv_out.val.ui64=scv_1.val.ui64-scv_2.val.ui64;break; case '/': scv_out.val.ui64=scv_1.val.ui64/scv_2.val.ui64;break; case '*': scv_out.val.ui64=scv_1.val.ui64*scv_2.val.ui64;break; case '%': scv_out.val.ui64=scv_1.val.ui64%scv_2.val.ui64;break; } break; case NC_BYTE: switch(op){ case '+': scv_out.val.b=scv_1.val.b+scv_2.val.b;break; case '-': scv_out.val.b=scv_1.val.b-scv_2.val.b;break; case '/': scv_out.val.b=scv_1.val.b/scv_2.val.b;break; case '*': scv_out.val.b=scv_1.val.b*scv_2.val.b;break; case '%': scv_out.val.b=scv_1.val.b%scv_2.val.b;break; } break; case NC_UBYTE: switch(op){ case '+': scv_out.val.ub=scv_1.val.ub+scv_2.val.ub;break; case '-': scv_out.val.ub=scv_1.val.ub-scv_2.val.ub;break; case '/': scv_out.val.ub=scv_1.val.ub/scv_2.val.ub;break; case '*': scv_out.val.ub=scv_1.val.ub*scv_2.val.ub;break; case '%': scv_out.val.ub=scv_1.val.ub%scv_2.val.ub;break; } break; case NC_CHAR: break; /* Do nothing */ case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; }/* end switch */ return scv_out; } /* end ncap_scv_clc_type */ scv_sct ncap_scv_abs(scv_sct scv) { /* Purpose: Find the absolute value of a scalar value */ #ifndef __GNUG__ extern float fabsf(float); /* Sun math.h does not include fabsf() prototype */ #endif scv_sct scv_out; scv_out.type=scv.type; switch(scv.type){ case NC_FLOAT: scv_out.val.f=fabsf(scv.val.f); break; case NC_DOUBLE: scv_out.val.d=fabs(scv.val.d); break; case NC_INT: scv_out.val.i=labs(scv.val.i); break; /* int abs(int), long labs(long int) */ break; case NC_SHORT: scv_out.val.s=((scv.val.s >= 0) ? scv.val.s : -scv.val.s); break; case NC_USHORT: scv_out.val.us=scv.val.us; break; case NC_UINT: scv_out.val.ui=scv.val.ui; break; case NC_INT64: scv_out.val.i64=llabs(scv.val.i64); break; case NC_UINT64: scv_out.val.ui64=scv.val.ui64; break; case NC_BYTE: scv_out.val.b=((scv.val.b >= 0) ? scv.val.b : -scv.val.b); break; case NC_UBYTE: scv_out.val.ub=scv.val.ub; break; case NC_CHAR: break; /* Do nothing */ case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return scv_out; } /* end ncap_scv_abs */ int ncap_scv_minus(scv_sct *scv) { /* Purpose: Return negative of input */ switch(scv->type){ case NC_FLOAT: scv->val.f=-scv->val.f; break; case NC_DOUBLE: scv->val.d=-scv->val.d; break; case NC_INT: scv->val.i=-scv->val.i; break; case NC_SHORT: scv->val.s=-scv->val.s; break; case NC_INT64: scv->val.i64=-scv->val.i64; break; case NC_BYTE: scv->val.b=-scv->val.b; break; case NC_USHORT: /* NB: Unsigned */ case NC_UINT: /* NB: Unsigned */ case NC_UINT64: /* NB: Unsigned */ case NC_UBYTE: /* NB: Unsigned */ (void)fprintf(stdout,"%s: ERROR ncap_scr_minus() reports attempt to convert unsigned integer type to a negative number\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; case NC_CHAR: break; /* Do nothing */ case NC_STRING: break; /* Do nothing */ default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return scv->type; } /* end ncap_scv_minus() */ nm_id_sct * nco_var_lst_copy(nm_id_sct *xtr_lst,int lst_nbr) { /* Purpose: Copy xtr_lst and return new list */ int idx; nm_id_sct *xtr_new_lst; if(lst_nbr == 0) return NULL; xtr_new_lst=(nm_id_sct *)nco_malloc(lst_nbr*sizeof(nm_id_sct)); for(idx=0;idx 0){ xtr_new_lst=(nm_id_sct *)nco_malloc((size_t)(*xtr_nbr)*sizeof(nm_id_sct)); for(idx=0;idxvar_nm,&var_id); if(rcd== NC_NOERR) continue; rcd=nco_inq_varid_flg(in_id,att_lst[idx]->var_nm,&var_id); if(rcd == NC_NOERR){ /* eliminate any duplicates from list */ for(jdx=0;jdxvar_nm)) break; if(jdx!=size) continue; /* fxm mmr TODO 491: memory leak xtr_lst */ xtr_lst=(nm_id_sct *)nco_realloc(xtr_lst,(size+1)*sizeof(nm_id_sct)); xtr_lst[size].id=var_id; xtr_lst[size++].nm=(char *)strdup(att_lst[idx]->var_nm); } /* end if */ } /* end loop over att */ *nbr_lst=size; return xtr_lst; } /* end nco_att_lst_mk() */ nco_bool /* O [flg] Variables now conform */ ncap_var_stretch /* [fnc] Stretch variables */ (var_sct **var_1, /* I/O [ptr] First variable */ var_sct **var_2) /* I/O [ptr] Second variable */ { /* Purpose: Make input variables conform or die var_1 and var_2 are considered completely symmetrically No assumption is made about var_1 relative to var_2 Main difference betwee ncap_var_stretch() and nco_var_cnf_dmn() is If variables conform, then ncap_var_stretch() will broadcast If variables share no dimensions, then ncap_var_stretch() will convolve Terminology--- Broadcast: Inflate smaller conforming variable to larger variable Conform: Dimensions of one variable are subset of other variable Convolve: Construct array whose rank is sum of non-duplicated dimensions Stretch: Union of broadcast and convolve Logic is pared down version of nco_var_cnf_dmn() 1. USE_DUMMY_WGT has been eliminated: ncap has no reason not to stretch input variables because grammar ensures only arithmetic variables will be stretched. 2. wgt_crr has been eliminated: ncap never does anything multiple times so no equivalent to wgt_crr exists 3. ncap_var_stretch(), unlike nco_var_cnf_dmn(), performs memory management Variables are var_free'd if they are superceded (replaced) 4. Conformance logic is duplicated from nco_var_cnf_dmn() var_gtr plays role of var var_lsr plays role of wgt var_lsr_out plays role of wgt_out var_lsr_out=var_lsr only if variables already conform var_gtr_out is required since both variables may change var_gtr_out=var_gtr unless convolution is required */ nco_bool CONFORMABLE=False; /* [flg] Whether var_lsr can be made to conform to var_gtr */ nco_bool CONVOLVE=False; /* [flg] var_1 and var_2 had to be convolved */ nco_bool DO_CONFORM; /* [flg] Did var_1 and var_2 conform? */ nco_bool MUST_CONFORM=False; /* [flg] Must var_1 and var_2 conform? */ int idx; int idx_dmn; int var_lsr_var_gtr_dmn_shr_nbr=0; /* [nbr] Number of dimensions shared by var_lsr and var_gtr */ var_sct *var_gtr=NULL; /* [ptr] Pointer to variable structure of greater rank */ var_sct *var_lsr=NULL; /* [ptr] Pointer to variable structure to lesser rank */ var_sct *var_gtr_out=NULL; /* [ptr] Pointer to stretched version of greater rank variable */ var_sct *var_lsr_out=NULL; /* [ptr] Pointer to stretched version of lesser rank variable */ /* Initialize flag to false. Overwrite by true after successful conformance */ DO_CONFORM=False; /* Determine which variable is greater and which lesser rank */ if((*var_1)->nbr_dim >= (*var_2)->nbr_dim){ var_gtr=*var_1; var_lsr=*var_2; }else{ var_gtr=*var_2; var_lsr=*var_1; } /* endif */ /* var_gtr_out=var_gtr unless convolution is required */ var_gtr_out=var_gtr; /* Does lesser variable (var_lsr) conform to greater variable's dimensions? */ if(var_lsr_out == NULL){ if(var_gtr->nbr_dim > 0){ /* Test that all dimensions in var_lsr appear in var_gtr */ for(idx=0;idxnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ if(!strcmp(var_lsr->dim[idx]->nm,var_gtr->dim[idx_dmn]->nm)){ var_lsr_var_gtr_dmn_shr_nbr++; /* var_lsr and var_gtr share this dimension */ break; } /* endif */ } /* end loop over var_gtr dimensions */ } /* end loop over var_lsr dimensions */ /* Decide whether var_lsr and var_gtr dimensions conform, are mutually exclusive, or are partially exclusive */ if(var_lsr_var_gtr_dmn_shr_nbr == var_lsr->nbr_dim){ /* var_lsr and var_gtr conform */ /* fxm: Variables do not conform when dimension list of one is subset of other if order of dimensions differs, i.e., a(lat,lev,lon) !~ b(lon,lev) */ CONFORMABLE=True; }else if(var_lsr_var_gtr_dmn_shr_nbr == 0){ /* Dimensions in var_lsr and var_gtr are mutually exclusive */ CONFORMABLE=False; if(MUST_CONFORM){ (void)fprintf(stdout,"%s: ERROR %s and template %s share no dimensions\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= 1) (void)fprintf(stdout,"\n%s: DEBUG %s and %s share no dimensions: Attempting to convolve...\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); CONVOLVE=True; } /* endif */ }else if(var_lsr_var_gtr_dmn_shr_nbr > 0 && var_lsr_var_gtr_dmn_shr_nbr < var_lsr->nbr_dim){ /* Some, but not all, of var_lsr dimensions are in var_gtr */ CONFORMABLE=False; if(MUST_CONFORM){ (void)fprintf(stdout,"%s: ERROR %d dimensions of %s belong to template %s but %d dimensions do not\n",nco_prg_nm_get(),var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm,var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr); nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= 1) (void)fprintf(stdout,"\n%s: DEBUG %d dimensions of %s belong to template %s but %d dimensions do not: Not broadcasting %s to %s, could attempt stretching???\n",nco_prg_nm_get(),var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm,var_lsr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr,var_lsr->nm,var_gtr->nm); CONVOLVE=True; } /* endif */ } /* end if */ if(CONFORMABLE){ if(var_gtr->nbr_dim == var_lsr->nbr_dim){ /* var_gtr and var_lsr conform and are same rank */ /* Test whether all var_lsr and var_gtr dimensions match in sequence */ for(idx=0;idxnbr_dim;idx++){ if(strcmp(var_lsr->dim[idx]->nm,var_gtr->dim[idx]->nm)) break; } /* end loop over dimensions */ /* If so, take shortcut and copy var_lsr to var_lsr_out */ if(idx == var_gtr->nbr_dim) DO_CONFORM=True; }else{ /* var_gtr and var_lsr conform but are not same rank, set flag to proceed to generic conform routine */ DO_CONFORM=False; } /* end else */ } /* endif CONFORMABLE */ }else{ /* nbr_dmn == 0 */ /* var_gtr is scalar, if var_lsr is also then set flag to copy var_lsr to var_lsr_out else proceed to generic conform routine */ if(var_lsr->nbr_dim == 0) DO_CONFORM=True; else DO_CONFORM=False; } /* end else nbr_dmn == 0 */ if(CONFORMABLE && DO_CONFORM){ var_lsr_out=nco_var_dpl(var_lsr); (void)nco_xrf_var(var_lsr,var_lsr_out); } /* end if */ } /* endif var_lsr_out == NULL */ if(var_lsr_out == NULL && CONVOLVE){ /* Convolve variables by returned stretched variables with minimum possible number of dimensions */ int dmn_nbr; /* Number of dimensions in convolution */ if(nco_dbg_lvl_get() >= 1) (void)fprintf(stdout,"\n%s: WARNING Convolution not yet implemented, results of operation between %s and %s are unpredictable\n",nco_prg_nm_get(),var_lsr->nm,var_gtr->nm); /* Dimensions in convolution are union of dimensions in variables */ dmn_nbr=var_lsr->nbr_dim+var_gtr->nbr_dim-var_lsr_var_gtr_dmn_shr_nbr; /* Number of dimensions in convolution */ dmn_nbr=dmn_nbr+0; /* CEWI: Avert compiler warning that variable is set but never used */ /* fxm: these should go away soon */ var_lsr_out=nco_var_dpl(var_lsr); var_gtr_out=nco_var_dpl(var_gtr); /* for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){;} if(var_lsr_var_gtr_dmn_shr_nbr == 0); else; */ /* Free calling variables */ var_lsr=nco_var_free(var_lsr); var_gtr=nco_var_free(var_gtr); } /* endif STRETCH */ if(var_lsr_out == NULL){ /* Expand lesser variable (var_lsr) to match size of greater variable */ const char fnc_nm[]="ncap_var_stretch()"; /* [sng] Function name */ char *var_lsr_cp; char *var_lsr_out_cp; int idx_var_lsr_var_gtr[NC_MAX_DIMS]; int var_lsr_nbr_dim; int var_gtr_nbr_dmn_m1; long *var_gtr_cnt; long dmn_ss[NC_MAX_DIMS]; long dmn_var_gtr_map[NC_MAX_DIMS]; long dmn_var_lsr_map[NC_MAX_DIMS]; long var_gtr_lmn; long var_lsr_lmn; long var_gtr_sz; size_t var_lsr_typ_sz; /* Copy main attributes of greater variable into lesser variable */ var_lsr_out=nco_var_dpl(var_gtr); (void)nco_xrf_var(var_lsr,var_lsr_out); /* Modify elements of lesser variable array */ var_lsr_out->nm=(char *)nco_free(var_lsr_out->nm); var_lsr_out->nm=(char *)strdup(var_lsr->nm); var_lsr_out->id=var_lsr->id; var_lsr_out->type=var_lsr->type; /* Added 20050323: Not quite sure why, but var->val.vp may already have values here when LHS-casting Perform safety free to guard against memory leaks */ var_lsr_out->val.vp=nco_free(var_lsr_out->val.vp); var_lsr_out->val.vp=(void *)nco_malloc_dbg(var_lsr_out->sz*nco_typ_lng(var_lsr_out->type),"Unable to malloc() value buffer in variable stretching",fnc_nm); var_lsr_cp=(char *)var_lsr->val.vp; var_lsr_out_cp=(char *)var_lsr_out->val.vp; var_lsr_typ_sz=nco_typ_lng(var_lsr_out->type); if(var_lsr_out->nbr_dim == 0){ /* Variables are scalars, not arrays */ (void)memcpy(var_lsr_out_cp,var_lsr_cp,var_lsr_typ_sz); }else if(var_lsr->nbr_dim == 0){ /* Lesser-ranked input variable is scalar Expansion in this degenerate case needs no index juggling (reverse-mapping) Code as special case to speed-up important applications of ncap for synthetic file creation */ var_gtr_sz=var_gtr->sz; for(var_gtr_lmn=0;var_gtr_lmnnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ if(!strcmp(var_gtr->dim[idx_dmn]->nm,var_lsr->dim[idx]->nm)){ idx_var_lsr_var_gtr[idx]=idx_dmn; /* idx_var_gtr_var_lsr[idx_dmn]=idx;*/ break; } /* end if */ /* Sanity check */ if(idx_dmn == var_gtr->nbr_dim-1){ (void)fprintf(stdout,"%s: ERROR var_lsr %s has dimension %s but var_gtr %s does not deep in ncap_var_stretch()\n",nco_prg_nm_get(),var_lsr->nm,var_lsr->dim[idx]->nm,var_gtr->nm); nco_exit(EXIT_FAILURE); } /* end if err */ } /* end loop over greater variable dimensions */ } /* end loop over lesser variable dimensions */ /* Figure out map for each dimension of greater variable */ for(idx=0;idxnbr_dim;idx++) dmn_var_gtr_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_var_gtr_map[idx]*=var_gtr->cnt[idx_dmn]; /* Figure out map for each dimension of lesser variable */ for(idx=0;idxnbr_dim;idx++) dmn_var_lsr_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_var_lsr_map[idx]*=var_lsr->cnt[idx_dmn]; /* Define convenience variables to avoid repetitive indirect addressing */ var_lsr_nbr_dim=var_lsr->nbr_dim; var_gtr_sz=var_gtr->sz; var_gtr_cnt=var_gtr->cnt; var_gtr_nbr_dmn_m1=var_gtr->nbr_dim-1; /* var_gtr_lmn is offset into 1-D array corresponding to N-D indices dmn_ss */ for(var_gtr_lmn=0;var_gtr_lmnnbr_dim >= (*var_2)->nbr_dim){ *var_1=var_gtr_out; /* [ptr] First variable */ *var_2=var_lsr_out; /* [ptr] Second variable */ }else{ *var_1=var_lsr_out; /* [ptr] First variable */ *var_2=var_gtr_out; /* [ptr] Second variable */ } /* endif */ /* Variables now conform */ return DO_CONFORM; } /* end ncap_var_stretch() */ nco-4.5.4/src/nco/ncap_yacc.y000066400000000000000000000743661264355130400160060ustar00rootroot00000000000000%{ /* $Header$ -*-C-*- */ /* Begin C declarations section */ /* Purpose: Grammar parser for ncap */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: bison --output=${HOME}/nco/src/nco/ncap_yacc.c -d ~/nco/src/nco/ncap_yacc.y */ /* Example yacc text: Nie02 "A Compact Guide to Lex & Yacc" by Thomas Niemann, ePaper Press, URL:http://epaperpress.com/lexandyacc/index.html LMB92 ${DATA}/ora/lexyacc/ch3-05.y GCC c-parse.y GCC parser_build_binary_op() c-typeck.c Unidata ncgen.y */ /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* va_start, va_arg, va_end */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "ncap.h" /* netCDF arithmetic processor-specific definitions (symbol table, ...) */ /* Bison adds routines which reference YY*LEX token to ncap_yacc.c These routines generate warnings unless YY*LEX prototype appears above YYLEX prototype generates error unless YYSTYPE token is defined Thus must #include ncap_yacc.h solely to pre-define YY*STYPE for YY*LEX prototype There is no other reason for ncap_yacc.h to appear in ncap_yacc.y Yes, this is rather circular */ /* Get YYSTYPE prior to prototyping scanner */ #include "ncap_yacc.h" /* ncap_yacc.h (ncap.tab.h) is produced from ncap_yacc.y by parser generator */ #define YY_DECL int yylex(YYSTYPE *lval_ptr,prs_sct *prs_arg) YY_DECL; /* Turn on parser debugging option (Bison manual p. 85) */ #define YYDEBUG 0 int yydebug=0; /* 0: Normal operation. 1: Print parser rules during execution */ /* Turns on more verbose errors than just plain "parse error" when yyerror() is called by parser */ #define YYERROR_VERBOSE 1 /* Bison manual p. 60 describes how to call yyparse() with arguments Following two statements superceded 20051213 by parse-param and lex-param below */ /* #define YYPARSE_PARAM prs_arg */ /* #define YYLEX_PARAM prs_arg */ int rcd; /* [enm] Return value for function calls */ /* Global variables */ extern size_t ncap_ncl_dpt_crr; /* [nbr] Depth of current #include file (declared in ncap.c) */ extern size_t *ncap_ln_nbr_crr; /* [cnt] Line number (declared in ncap.c) */ extern char **ncap_fl_spt_glb; /* [fl] Script file (declared in ncap.c) */ extern char ncap_err_sng[200]; /* [sng] Buffer for error string (declared in ncap_lex.l) */ /* End C declarations section */ %} /* Begin parser declaration section */ /* Request pure, re-entrant parser, so we can pass a structure to parser fxm: 20020122 ncap16: Code breaks on Linux when pure_parser is _not_ used---why? e.g., ncap -O -D 5 -S ${HOME}/dst/dst.nco ${DATA}/${caseid}/${caseid}_${yr_sng}_xy.nc ${DATA}/${caseid}/${caseid}_${yr_sng}_xy.nc Possibly because hardcoded yy* function prototypes change? */ %pure-parser %parse-param {prs_sct *prs_arg} %lex-param {prs_sct *prs_arg} /* NB: "terminal symbol" is just a fancy name for token produced by lexer Symbols defined on LHS of rules are called "non-terminal symbols" or "non-terminals" Examples of non-terminals are xpr, stt, stt_lst Examples of terminal symbols, or tokens, are NAME, NUMBER Convention is to make token names all uppercase, and non-terminals lowercase */ /* Define YYSTYPE union (type of lex variable yylval value) This specifies all possible data types for semantic values */ %union{ char *sng; /* [sng] String value */ char *var_nm_LHS; /* [sng] Variables on LHS */ char *var_nm_RHS; /* [sng] Variables on RHS */ aed_sct aed; /* [sct] Attribute */ sym_sct *sym; /* [sct] Intrinsic function name */ scv_sct scv; /* [sct] Scalar value */ var_sct *var; /* [sct] Variable */ nm_lst_sct *sbs_lst; /* [sct] Subscript list */ int nco_rlt_opr; /* [enm] Comparison operator type */ nc_type cnv_type; /* [enm] Used for type conversion functions */ } /* end YYSTYPE union (type of yylval value) */ /* Tell parser which kind of values each token takes Token name (traditionally in all caps) becomes #define directive in parser so we can refer to token name rather than token's numeric code */ %token OUT_ATT %token COMPARISON %token LHS_SBS %token SCV %token SNG %token FUNCTION %token OUT_VAR %token VAR %token CNV_TYPE %token ABS ATOSTR EPROVOKE IGNORE NAMED_CONSTANT PACK POWER RDC UNPACK %token IF PRINT /* "type" declaration sets type for non-terminal symbols which otherwise need no declaration Format of "type" declaration is %type RHS_xpr RHS expression type RHS_xpr is same type as YYSTYPE union member with name in <> */ %type scv_xpr %type sng_xpr %type var_xpr %type out_var_xpr %type out_att_xpr /* "left", "right", and "nonassoc" perform same function as "token" and, in addition, specify associativity and relative precedence of symbols. Each successive line has higher precedence than preceding lines */ /* fxm: 20020608 AND, NOT, OR not implemented in lexer yet */ %left AND NOT OR /* && ! || */ %left COMPARISON /* == != < > <= >= */ %left '+' '-' %left '*' '/' '%' %right '^' %nonassoc UMINUS %nonassoc LOWER_THAN_ELSE %nonassoc ELSE /* End parser declaration section */ %% /* Begin Rules section Format is rule: action Comments OK in space between C code but must be indented */ program: stmt_lst ; /* end program */ stmt_lst: ';' { ;} /* collect extra ; */ | stmt_lst ';' { ;} /* collect extra ; */ | stmt_lst stmt ';' { /* Purpose: Actions to be performed at end-of-statement go here */ /* Clean up from and exit LHS_cst mode */ (void)nco_var_free_wrp(&((prs_sct *)prs_arg)->var_LHS); } /* end stmt ';' */ | stmt_lst error ';' {(void)nco_var_free_wrp(&((prs_sct *)prs_arg)->var_LHS);} | stmt ';' {(void)nco_var_free_wrp(&((prs_sct *)prs_arg)->var_LHS);} | error ';' {(void)nco_var_free_wrp(&((prs_sct *)prs_arg)->var_LHS);} /* Catch most errors then read up to next semi-colon */ ; /* end stmt_lst */ stmt: /* Statement is definition of out_att_xpr or out_var_xpr (LHS tokens) in terms of scv_xpr, var_xpr, and sng_xpr (RHS tokens). All permutations are valid so this rule has six possible actions */ IF '(' bln_xpr ')' stmt %prec LOWER_THAN_ELSE { /* LMB92 p. 234 */ ; } /* end IF bln_xpr stmt */ | IF '(' bln_xpr ')' stmt ELSE stmt { /* LMB92 p. 234 */ ; } /* end IF bln_xpr stmt ELSE stmt */ PRINT '(' scv_xpr ')' ';' { ; } /* end PRINT '(' scv_xpr ')' */ PRINT '(' var_xpr ')' ';' { ; } /* end PRINT '(' var_xpr ')' */ | out_att_xpr '=' scv_xpr { aed_sct *ptr_aed; ptr_aed=ncap_aed_lookup($1.var_nm,$1.att_nm,((prs_sct *)prs_arg),True); ptr_aed->val=ncap_scv_2_ptr_unn($3); ptr_aed->type=$3.type; ptr_aed->sz=1L; (void)cast_nctype_void(ptr_aed->type,&ptr_aed->val); if(nco_dbg_lvl_get() >= nco_dbg_std) (void)sprintf(ncap_err_sng,"Saving attribute %s@%s to %s",$1.var_nm,$1.att_nm,((prs_sct *)prs_arg)->fl_out); (void)nco_yyerror(prs_arg,ncap_err_sng); if(nco_dbg_lvl_get() >= nco_dbg_fl){ (void)fprintf(stderr,"Saving in array attribute %s@%s=",$1.var_nm,$1.att_nm); switch($3.type){ /* NB: Format depends on opaque type of nco_int Until 200911, nco_int was C-type long, and now nco_int is C-type int case NC_INT: (void)fprintf(stderr,"%ld\n",$3.val.i); break; */ case NC_FLOAT: (void)fprintf(stderr,"%G\n",$3.val.f); break; case NC_DOUBLE: (void)fprintf(stderr,"%.5G\n",$3.val.d);break; case NC_INT: (void)fprintf(stderr,"%d\n",$3.val.i); break; case NC_SHORT: (void)fprintf(stderr,"%hi\n",$3.val.s); break; case NC_BYTE: (void)fprintf(stderr,"%hhi\n",$3.val.b); break; case NC_UBYTE: (void)fprintf(stderr,"%hhu\n",$3.val.ub); break; case NC_USHORT: (void)fprintf(stderr,"%hu\n",$3.val.us); break; case NC_UINT: (void)fprintf(stderr,"%u\n",$3.val.ui); break; case NC_INT64: (void)fprintf(stderr,"%lld\n",$3.val.i64); break; case NC_UINT64: (void)fprintf(stderr,"%llu\n",$3.val.ui64); break; case NC_CHAR: (void)fprintf(stderr,"%c\n",$3.val.c); break; case NC_STRING: (void)fprintf(stderr,"%s\n",$3.val.sng); break; default: break; } /* end switch */ } /* end if */ $1.var_nm=(char *)nco_free($1.var_nm); $1.att_nm=(char *)nco_free($1.att_nm); } /* end out_att_xpr '=' scv_xpr */ | out_att_xpr '=' sng_xpr { aed_sct *ptr_aed; size_t sng_lng; sng_lng=strlen($3); ptr_aed=ncap_aed_lookup($1.var_nm,$1.att_nm,((prs_sct *)prs_arg),True); ptr_aed->type=NC_CHAR; ptr_aed->sz=(long int)((sng_lng+1)*nco_typ_lng(NC_CHAR)); ptr_aed->val.cp=(nco_char *)nco_malloc((sng_lng+1)*nco_typ_lng(NC_CHAR)); strcpy((char *)(ptr_aed->val.cp),$3); (void)cast_nctype_void((nc_type)NC_CHAR,&ptr_aed->val); if(nco_dbg_lvl_get() >= nco_dbg_std) (void)sprintf(ncap_err_sng,"Saving attribute %s@%s=%s",$1.var_nm,$1.att_nm,$3); (void)nco_yyerror(prs_arg,ncap_err_sng); $1.var_nm=(char *)nco_free($1.var_nm); $1.att_nm=(char *)nco_free($1.att_nm); $3=(char *)nco_free($3); } /* end out_att_xpr '=' sng_xpr */ | out_att_xpr '=' var_xpr { /* Storing 0-dimensional variables in attribute is OK */ aed_sct *ptr_aed; if($3->nbr_dim < 2){ ptr_aed=ncap_aed_lookup($1.var_nm,$1.att_nm,((prs_sct *)prs_arg),True); ptr_aed->sz=$3->sz; ptr_aed->type=$3->type; /* if inital scan then fill attribute with zeros */ if( ((prs_sct*)prs_arg)->ntl_scn) { ptr_aed->val.vp=(void*)nco_calloc( ptr_aed->sz,nco_typ_lng(ptr_aed->type)); } else { ptr_aed->val.vp=(void*)nco_malloc((ptr_aed->sz)*nco_typ_lng(ptr_aed->type)); (void)nco_var_copy(ptr_aed->type,ptr_aed->sz,$3->val,ptr_aed->val); } /* cast_nctype_void($3->type,&ptr_aed->val); */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)sprintf(ncap_err_sng,"Saving attribute %s@%s %d dimensional variable",$1.var_nm,$1.att_nm,$3->nbr_dim); (void)yyerror(prs_arg,ncap_err_sng); }else{ (void)sprintf(ncap_err_sng,"Warning: Cannot store in attribute %s@%s a variable with dimension %d",$1.var_nm,$1.att_nm,$3->nbr_dim); (void)yyerror(prs_arg,ncap_err_sng); } /* endif */ $1.var_nm=(char *)nco_free($1.var_nm); $1.att_nm=(char *)nco_free($1.att_nm); (void)nco_var_free($3); } /* end out_att_xpr '=' var_xpr */ | out_var_xpr '=' var_xpr { ($3->nm)=(char*)nco_free($3->nm); $3->nm=strdup($1); (void)ncap_var_write($3,(prs_sct *)prs_arg); /* Print mess only for defined variables */ if(nco_dbg_lvl_get() >= nco_dbg_std && !$3->undefined){(void)sprintf(ncap_err_sng,"Saving variable %s to %s",$1,((prs_sct *)prs_arg)->fl_out); (void)yyerror(prs_arg,ncap_err_sng); } /* endif */ $1=(char *)nco_free($1); } /* end out_var_xpr '=' var_xpr */ | out_var_xpr '=' scv_xpr { var_sct *var; var_sct *var_tmp; if(nco_dbg_lvl_get() > 5) (void)fprintf(stderr,"%s: DEBUG out_var_xpr = scv_xpr rule for %s\n",nco_prg_nm_get(),$1); /* Turn attribute into temporary variable for writing */ var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults */ (void)var_dfl_set(var); /* [fnc] Set defaults for each member of variable structure */ /* Overwrite with attribute expression information */ var->nm=strdup($1); var->nbr_dim=0; var->sz=1; var->type=$3.type; var->val=ncap_scv_2_ptr_unn($3); if(((prs_sct *)prs_arg)->var_LHS != NULL){ /* User intends LHS to cast RHS to same dimensionality Stretch newly initialized variable to size of LHS template */ /* (void)ncap_var_cnf_dmn(&$$,&(((prs_sct *)prs_arg)->var_LHS));*/ var_tmp=var; (void)ncap_var_stretch(&var_tmp,&(((prs_sct *)prs_arg)->var_LHS)); if(var_tmp != var) { var=nco_var_free(var); var=var_tmp; } if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: Stretching former scv_xpr defining %s with LHS template: Template var->nm %s, var->nbr_dim %d, var->sz %li\n",nco_prg_nm_get(),$1,((prs_sct *)prs_arg)->var_LHS->nm,((prs_sct *)prs_arg)->var_LHS->nbr_dim,((prs_sct *)prs_arg)->var_LHS->sz); } /* endif LHS_cst */ var->undefined=False; (void)ncap_var_write(var,(prs_sct *)prs_arg); if(nco_dbg_lvl_get() >= nco_dbg_std ) (void)sprintf(ncap_err_sng,"Saving variable %s to %s",$1,((prs_sct *)prs_arg)->fl_out); (void)yyerror(prs_arg,ncap_err_sng); $1=(char *)nco_free($1); } /* end out_var_xpr '=' scv_xpr */ | out_var_xpr '=' sng_xpr { var_sct *var; var=(var_sct *)nco_calloc((size_t)1,sizeof(var_sct)); var->nm=strdup($1); var->nbr_dim=0; var->dmn_id=(int *)NULL; var->sz=strlen($3)+1; var->val.cp=(nco_char *)strdup($3); var->type=NC_CHAR; var->undefined=False; (void)cast_nctype_void((nc_type)NC_CHAR,&var->val); (void)ncap_var_write(var,(prs_sct *)prs_arg); if(nco_dbg_lvl_get() >= nco_dbg_std) (void)sprintf(ncap_err_sng,"Saving variable %s to %s",$1,((prs_sct *)prs_arg)->fl_out); (void)yyerror(prs_arg,ncap_err_sng); $1=(char *)nco_free($1); $3=(char *)nco_free($3); } /* end out_var_xpr '=' sng_xpr */ ; /* end stmt */ scv_xpr: /* scv_xpr results from RHS action which involves only scv_xpr's One action exists for each binary and unary attribute-valid operator */ scv_xpr '+' scv_xpr { (void)ncap_scv_scv_cnf_typ_hgh_prc(&$1,&$3); $$=ncap_scv_clc($1,'+',$3); } | scv_xpr '-' scv_xpr { (void)ncap_scv_scv_cnf_typ_hgh_prc(&$1,&$3); $$=ncap_scv_clc($1,'-',$3); } | scv_xpr '*' scv_xpr { (void)ncap_scv_scv_cnf_typ_hgh_prc(&$1,&$3); $$=ncap_scv_clc($1,'*',$3); } | scv_xpr '/' scv_xpr { (void)ncap_scv_scv_cnf_typ_hgh_prc(&$1,&$3); $$=ncap_scv_clc($1,'/',$3); } | scv_xpr '%' scv_xpr { (void)ncap_scv_scv_cnf_typ_hgh_prc(&$1,&$3); $$=ncap_scv_clc($1,'%',$3); } | '-' scv_xpr %prec UMINUS { (void)ncap_scv_minus(&$2); $$=$2; } | '+' scv_xpr %prec UMINUS { $$=$2; } | scv_xpr '^' scv_xpr { if(nco_rth_prc_rnk($1.type) <= nco_rth_prc_rnk_float && nco_rth_prc_rnk($3.type) <= nco_rth_prc_rnk_float) { (void)nco_scv_cnf_typ((nc_type)NC_FLOAT,&$1); (void)nco_scv_cnf_typ((nc_type)NC_FLOAT,&$3); $$.val.f=powf($1.val.f,$3.val.f); $$.type=NC_FLOAT; }else{ (void)nco_scv_cnf_typ((nc_type)NC_DOUBLE,&$1); (void)nco_scv_cnf_typ((nc_type)NC_DOUBLE,&$3); $$.val.d=pow($1.val.d,$3.val.d); $$.type=NC_DOUBLE; } /* end else */ } /* end scv_xpr '^' scv_xpr */ | POWER '(' scv_xpr ',' scv_xpr ')' { /* fxm: ncap52 this is identical to previous clause except for argument numbering, should be functionalized to use common code */ if(nco_rth_prc_rnk($3.type) <= nco_rth_prc_rnk_float && nco_rth_prc_rnk($5.type) <= nco_rth_prc_rnk_float) { (void)nco_scv_cnf_typ((nc_type)NC_FLOAT,&$3); (void)nco_scv_cnf_typ((nc_type)NC_FLOAT,&$5); $$.val.f=powf($3.val.f,$5.val.f); $$.type=NC_FLOAT; }else{ (void)nco_scv_cnf_typ((nc_type)NC_DOUBLE,&$3); (void)nco_scv_cnf_typ((nc_type)NC_DOUBLE,&$5); $$.val.d=pow($3.val.d,$5.val.d); $$.type=NC_DOUBLE; } /* end else */ } /* end POWER '(' scv_xpr ',' scv_xpr ')' */ | ABS '(' scv_xpr ')' { $$=ncap_scv_abs($3); } | FUNCTION '(' scv_xpr ')' { if(nco_rth_prc_rnk($3.type) <= nco_rth_prc_rnk_float) { (void)nco_scv_cnf_typ((nc_type)NC_FLOAT,&$3); $$.val.f=(*($1->fnc_flt))($3.val.f); $$.type=NC_FLOAT; }else{ $$.val.d=(*($1->fnc_dbl))($3.val.d); $$.type=NC_DOUBLE; } /* end else */ } /* end FUNCTION '(' scv_xpr ')' */ | CNV_TYPE '(' scv_xpr ')' { (void)nco_scv_cnf_typ($1,&$3); $$=$3; } | '(' scv_xpr ')' {$$=$2;} | SCV {$$=$1;} ; /* end scv_xpr */ out_var_xpr: OUT_VAR {$$=$1;} ; out_att_xpr: OUT_ATT {$$=$1;} ; sng_xpr: /* sng_xpr is any combination of sng_xpr or attribute */ sng_xpr '+' sng_xpr { size_t sng_lng; sng_lng=strlen($1)+strlen($3); $$=(char*)nco_malloc((sng_lng+1)*sizeof(char)); strcpy($$,$1); strcat($$,$3); $1=(char *)nco_free($1); $3=(char *)nco_free($3); } /* end sng_xpr '+' sng_xpr */ | ATOSTR '(' scv_xpr ')' { char bfr[50]; switch ($3.type){ /* NB: Format depends on opaque type of nco_int Until 200911, nco_int was C-type long, and now nco_int is C-type int case NC_INT: sprintf(bfr,"%ld",$3.val.i); break; */ case NC_DOUBLE: sprintf(bfr,"%.10G",$3.val.d); break; case NC_FLOAT: sprintf(bfr,"%G",$3.val.f); break; case NC_INT: sprintf(bfr,"%d",$3.val.i); break; case NC_SHORT: sprintf(bfr,"%hi",$3.val.s); break; case NC_BYTE: sprintf(bfr,"%hhi",$3.val.b); break; case NC_UBYTE: sprintf(bfr,"%hhu",$3.val.ub); break; case NC_USHORT: sprintf(bfr,"%hu",$3.val.us); break; case NC_UINT: sprintf(bfr,"%u",$3.val.ui); break; case NC_INT64: sprintf(bfr,"%lld",$3.val.i64); break; case NC_UINT64: sprintf(bfr,"%llu",$3.val.ui64); break; case NC_CHAR: sprintf(bfr,"%c",$3.val.c); break; case NC_STRING: sprintf(bfr,"%s",$3.val.sng); break; default: break; } /* end switch */ $$=strdup(bfr); } /* end ATOSTR '(' scv_xpr ')' */ | ATOSTR '(' scv_xpr ',' sng_xpr ')' { char bfr[150]; /* Format string according to string expression */ /* User decides which format corresponds to which type */ switch ($3.type){ case NC_DOUBLE: sprintf(bfr,$5,$3.val.d); break; case NC_FLOAT: sprintf(bfr,$5,$3.val.f); break; case NC_INT: sprintf(bfr,$5,$3.val.i); break; case NC_SHORT: sprintf(bfr,$5,$3.val.s); break; case NC_BYTE: sprintf(bfr,$5,$3.val.b); break; case NC_UBYTE: sprintf(bfr,$5,$3.val.ub); break; case NC_USHORT: sprintf(bfr,$5,$3.val.us); break; case NC_UINT: sprintf(bfr,$5,$3.val.ui); break; case NC_INT64: sprintf(bfr,$5,$3.val.i64); break; case NC_UINT64: sprintf(bfr,$5,$3.val.ui64); break; case NC_CHAR: sprintf(bfr,$5,$3.val.c); break; case NC_STRING: sprintf(bfr,$5,$3.val.sng); break; default: break; } /* end switch */ $5=(char *)nco_free($5); $$=strdup(bfr); } /* end ATOSTR '(' scv_xpr ',' sng_xpr ')' */ | SNG {$$=$1;} /* Terminal symbol action */ ; /* end sng_xpr */ bln_xpr: /* bln_xpr results from comparison of var_xpr's and scv_xpr's */ var_xpr COMPARISON var_xpr { } | scv_xpr COMPARISON scv_xpr { } | var_xpr COMPARISON scv_xpr { } | scv_xpr COMPARISON var_xpr { } ; /* end bln_xpr */ var_xpr: /* var_xpr results from RHS action which involves a var_xpr, i.e., OP var, var OP var, var OP att, att OP var */ var_xpr '+' var_xpr { /* Begin Addition */ $$=ncap_var_var_add($1,$3); } | var_xpr '+' scv_xpr { $$=ncap_var_scv_add($1,$3); } | scv_xpr '+' var_xpr { /* Addition commutes so swap arguments and use S+V = V+S */ $$=ncap_var_scv_add($3,$1); } /* End Addition */ | var_xpr '-' var_xpr { /* Begin Subtraction */ $$=ncap_var_var_sub($1,$3); } | var_xpr '-' scv_xpr { $$=ncap_var_scv_sub($1,$3); } | scv_xpr '-' var_xpr { /* Subtraction is non-commutative, do not swap arguments and/or re-use V-S subtraction function Use anti-symmetric property that V-S=-(S-V) */ scv_sct minus; minus.val.b=-1; minus.type=NC_BYTE; (void)nco_scv_cnf_typ($3->type,&minus); (void)ncap_var_scv_sub($3,$1); $$=ncap_var_scv_mlt($3,minus); } /* End Subtraction */ | var_xpr '*' var_xpr { /* Begin Multiplication */ $$=ncap_var_var_mlt($1,$3); } | var_xpr '*' scv_xpr { $$=ncap_var_scv_mlt($1,$3); } | scv_xpr '*' var_xpr { /* Addition commutes so swap arguments and use S*V = V*S */ $$=ncap_var_scv_mlt($3,$1); } /* End Multiplication */ | var_xpr '/' var_xpr { /* Begin Division */ /* NB: Order was important (keeping denominator as I/O variable) This is no longer true with ncbo Maybe rewrite to keep argument ordering consitent with multiplication, addition */ $$=ncap_var_var_dvd($3,$1); } | var_xpr '/' scv_xpr { /* Keep V as I/O */ $$=ncap_var_scv_dvd($1,$3); } | scv_xpr '/' var_xpr { /* Division is non-commutative, use S/V not V/S division function */ $$=ncap_scv_var_dvd($1,$3); } /* End Division */ | var_xpr '%' var_xpr { /* Begin Modulo */ $$=ncap_var_var_mod($1,$3); } | var_xpr '%' scv_xpr { $$=ncap_var_scv_mod($1,$3); } | scv_xpr '%' var_xpr { /* Modulo is non-commutative, use S%V not V%S modulo function */ $$=ncap_scv_var_mod($1,$3); } /* End Modulo */ | var_xpr '^' var_xpr { /* Begin Empowerment of form x^y */ $$=ncap_var_var_pwr($1,$3); } | var_xpr '^' scv_xpr { $$=ncap_var_scv_pwr($1,$3); } | scv_xpr '^' var_xpr { /* Empowerment is non-commutative, use S^V not V^S empowerment function */ $$=ncap_scv_var_pwr($1,$3); } | POWER '(' var_xpr ',' var_xpr ')' { /* Begin Empowerment of form pow(x,y) */ /* fxm: TODO ncap52 Combine pow() with ^ parsing in parser ncap_yacc.y */ $$=ncap_var_var_pwr($3,$5); } | POWER '(' var_xpr ',' scv_xpr ')' { $$=ncap_var_scv_pwr($3,$5); } | POWER '(' scv_xpr ',' var_xpr ')' { /* Empowerment is non-commutative, use S^V not V^S empowerment function */ $$=ncap_scv_var_pwr($3,$5); } /* End Empowerment */ | '-' var_xpr %prec UMINUS { /* Begin Unary Subtraction */ scv_sct minus; minus.val.b=-1; minus.type=NC_BYTE; $$=ncap_var_scv_mlt($2,minus); } /* End Unary Subtraction */ | '+' var_xpr %prec UMINUS { /* Begin Unary Addition */ $$=$2; } /* End Unary Addition */ | ABS '(' var_xpr ')' { $$=ncap_var_abs($3); } /* end ABS */ | RDC '(' var_xpr ')' { $$=ncap_var_abs($3); /* fxm Finish avg,min,max,ttl */ /* $$=nco_var_avg($3,dim,dmn_nbr,nco_op_typ); */ /* if(prs_arg->nco_op_typ == nco_op_avg) (void)nco_var_dvd(var_prc_out[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,wgt_avg->val,var_prc_out[idx]->val); */ (void)fprintf(stderr,"%s: WARNING RDC tokens not implemented yet\n",nco_prg_nm_get()); /* $3 is freed in nco_var_avg() */ } /* end ABS */ | PACK '(' var_xpr ')' { /* Packing variable does not create duplicate so DO NOT free $3 */ const nc_type nc_typ_pck_dfl=NC_SHORT; /* [enm] Default type to pack to */ nco_bool PCK_VAR_WITH_NEW_PCK_ATT; if(((prs_sct*)prs_arg)->ntl_scn){ $3->undefined=True; $$=$3; }else{ $$=nco_var_pck($3,nc_typ_pck_dfl,&PCK_VAR_WITH_NEW_PCK_ATT); PCK_VAR_WITH_NEW_PCK_ATT=PCK_VAR_WITH_NEW_PCK_ATT+0; /* CEWI */ } /* end else */ } /* end PACK */ | UNPACK '(' var_xpr ')' { /* Unpacking variable does not create duplicate so DO NOT free $3 */ /* Do not unpack on first pass */ if(((prs_sct*)prs_arg)->ntl_scn){ $3->undefined=True; $$=$3; }else{ $$=nco_var_upk($3); } /* end else */ } /* end UNPACK */ | FUNCTION '(' var_xpr ')' { $$=ncap_var_fnc($3,$1); } | '(' var_xpr ')' { $$=$2; } | CNV_TYPE '(' var_xpr ')' { $$=nco_var_cnf_typ($1,$3); } | NAMED_CONSTANT { /* Terminal symbol action */ /* fxm: Allow commands like a=M_PI*rds^2; to work */ } | VAR { /* Terminal symbol action */ var_sct *var; var_sct *var_tmp; prs_sct *prs_drf; /*Pointer for de-referencing */ prs_drf=(prs_sct*)prs_arg; var=ncap_var_init($1,prs_drf); var->undefined=False; if(prs_drf->ntl_scn == True && prs_drf->var_LHS != NULL){ var_tmp=nco_var_dpl(prs_drf->var_LHS); var_tmp->id=var->id; var_tmp->nm=(char*)nco_free(var_tmp->nm); var_tmp->nm=strdup($1); var_tmp->type=var->type; var_tmp->typ_dsk=var->typ_dsk; var_tmp->undefined=False; var_tmp->val.vp=(void*)NULL; var=nco_var_free(var); var=var_tmp; } /* endif ntl_scn */ if(prs_drf->ntl_scn == False && prs_drf->var_LHS != NULL){ /* User intends LHS to cast RHS to same dimensionality Stretch newly initialized variable to size of LHS template */ /* (void)ncap_var_cnf_dmn(&$$,&(((prs_sct *)prs_arg)->var_LHS));*/ var_tmp=var; (void)ncap_var_stretch(&var_tmp,&(prs_drf->var_LHS)); if(var_tmp != var) { var=nco_var_free(var); var=var_tmp; } if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: Stretching variable %s with LHS template: Template var->nm %s, var->nbr_dim %d, var->sz %li\n",nco_prg_nm_get(),var->nm,prs_drf->var_LHS->nm,prs_drf->var_LHS->nbr_dim,prs_drf->var_LHS->sz); var->undefined=False; } /* endif LHS_cst */ $1=(char*)nco_free($1); $$=var; /* Sanity check */ if ($$==(var_sct *)NULL) YYERROR; } /* end VAR terminal symbol */ ; /* end var_xpr */ /* End Rules section */ %% /* Begin User Functions section */ aed_sct * /* O [idx] Location of attribute in list */ ncap_aed_lookup /* [fnc] Find location of existing attribute or add new attribute */ (const char * const var_nm, /* I [sng] Variable name */ const char * const att_nm, /* I [sng] Attribute name */ prs_sct * prs_arg, /* contains attribute list */ const nco_bool update) /* I [flg] Delete existing value or add new attribute to list */ { int idx; int size; aed_sct *ptr_aed; size=*(prs_arg->nbr_att); for(idx=0;idxatt_lst))[idx]; if(strcmp(ptr_aed->att_nm,att_nm) || strcmp(ptr_aed->var_nm,var_nm)) continue; if(update) ptr_aed->val.vp=nco_free(ptr_aed->val.vp); /* Return pointer to list element */ return ptr_aed; } /* end for */ if(!update) return (aed_sct *)NULL; *(prs_arg->att_lst)=(aed_sct **)nco_realloc(*(prs_arg->att_lst),(size+1)*sizeof(aed_sct*)); ++*(prs_arg->nbr_att); (*(prs_arg->att_lst))[size]=(aed_sct *)nco_malloc(sizeof(aed_sct)); (*(prs_arg->att_lst))[size]->var_nm=strdup(var_nm); (*(prs_arg->att_lst))[size]->att_nm=strdup(att_nm); return (*(prs_arg->att_lst))[size]; } /* end ncap_aed_lookup() */ var_sct * /*I [sct] varibale in list */ ncap_var_lookup (var_sct *var, /* I [sct] variable */ prs_sct *prs_arg, /* I/O [sct] contains var list */ const nco_bool add) /* I if not in list then add to list */ { int idx; int size; var_sct *ptr_var; size = *(prs_arg->nbr_var); for(idx=0;idxvar_lst))[idx]; /* assert(var->nm); assert(ptr_var->nm); if(!strcmp(var->nm,ptr_var->nm)) return ptr_var; */ if(ptr_var==NULL || strcmp(var->nm,ptr_var->nm) ) continue; return ptr_var; } /* end loop over idx */ if(!add) return (var_sct *)NULL; *(prs_arg->var_lst)=(var_sct **)nco_realloc(*(prs_arg->var_lst),(size+1)*sizeof(var_sct*)); ++*(prs_arg->nbr_var); (*(prs_arg->var_lst))[size]=var; return (var_sct *)NULL; } /* end ncap_var_lookup() */ int /* [rcd] Return code */ yyerror /* [fnc] Print error/warning/info messages generated by parser */ (prs_sct *prs_arg, const char * const err_sng_lcl) /* [sng] Message to print */ { /* Purpose: Print error/warning/info messages generated by parser Use eprokoke_skip to skip error message after sending error message from yylex() Stop provoked error message from yyparse being printed */ static nco_bool eprovoke_skip; prs_arg=prs_arg+0; /* CEWI otherwise unused parameter error */ /* if(eprovoke_skip){eprovoke_skip=False ; return 0;} */ if(nco_dbg_lvl_get() >= nco_dbg_std){ (void)fprintf(stderr,"%s: %s line %lu",nco_prg_nm_get(),ncap_fl_spt_glb[ncap_ncl_dpt_crr],(unsigned long)ncap_ln_nbr_crr[ncap_ncl_dpt_crr]); if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr," %s",err_sng_lcl); (void)fprintf(stderr,"\n"); (void)fflush(stderr); } /* endif dbg */ if(err_sng_lcl[0] == '#') eprovoke_skip=True; eprovoke_skip=eprovoke_skip+0; /* CEWI Do nothing except avoid compiler warnings */ return 0; } /* end yyerror() */ void nco_var_free_wrp /* [fnc] Safely free variable */ (var_sct **var) /* I/O [sct] Variable */ { /* Purpose: Safely free variable Routine is wrapper for nco_var_free() that simplifies code in calling routine */ if(*var != NULL) *var=nco_var_free(*var); } /* end nco_var_free_wrp() */ nodeType * /* O [unn] Syntax tree node */ opr_ctl /* [fnc] Operation controller function Nie02 opr() */ (int opr_tkn, /* I [enm] Operator token */ int arg_nbr, /* I [nbr] Number of optional arguments to malloc() wrapper */ ...) /* I [llp] Ellipsis defined in stdarg.h */ { /* Purpose: Create and return syntax tree node */ va_list arg_lst; /* [] Variable argument list */ nodeType *nod; /* [sct] Syntax tree node */ size_t nod_sz; /* [nbr] Node size */ int arg_idx; /* [idx] Argument index */ /* Operator node requires space for token and arguments */ nod_sz=sizeof(opr_nod_sct)+(arg_nbr-1)*sizeof(nodeType *); nod=(nodeType *)nco_malloc(nod_sz); /* Copy information into new node */ nod->nod_typ=typ_opr; /* [enm] Node type */ nod->opr.opr_tkn=opr_tkn; /* [enm] Operator token */ nod->opr.arg_nbr=arg_nbr; /* [nbr] Number of arguments */ /* Begin variable argument list access */ va_start(arg_lst,arg_nbr); for(arg_idx=0;arg_idxopr.arg_nbr;arg_idx++) nod->opr.arg[arg_idx]=va_arg(arg_lst,nodeType); /* NB: Nie02 p. 27 has typo in va_arg() */ /* End variable argument list access */ va_end(arg_lst); return nod; } /* end opr_ctl() */ void freeNode /* [fnc] Free syntax tree node Nie02 freeNode() */ (nodeType *nod) /* I/O [sct] Syntax tree node to free */ { /* Purpose: Free syntax tree node */ int arg_idx; /* [idx] Argument index */ if(!nod) return; /* Operator nodes have copies of arguments. Free these first. */ if(nod->nod_typ == typ_opr){ /* Recursive call to freeNode continue until statement is reduced */ for(arg_idx=0;arg_idxopr.arg_nbr;arg_idx++) freeNode(nod->opr.arg+arg_idx); /* Nie02 p. 28 has typo and passes node not node pointer */ } /* endif */ /* Free node itself */ nod=(nodeType *)nco_free(nod); return; /* 20050109: fxm added return to void function to squelch erroneous gcc-3.4.2 warning */ } /* end freeNode() */ /* End User Functions section */ nco-4.5.4/src/nco/ncatted.c000066400000000000000000000526341264355130400154540ustar00rootroot00000000000000/* $Header$ */ /* ncatted -- netCDF attribute editor */ /* Purpose: Add, create, delete, or overwrite attributes in a netCDF file */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: Use C language escape sequences: ncatted -D 3 -h -a history,global,o,c,"String\tformatting\tfor\nDennis" ~/nco/data/in.nc ~/foo.nc ncatted -D 3 -h -a history,global,o,c,"String\tformatting\tfor\nDennis" ${DATA}/hdf/MOD10CM.A2007001.005.2007108111758.hdf ~/foo.nc ncatted -D 3 -h -a history,global,o,c,'\a\b\f\n\r\t\v\\\?\0' ~/nco/data/in.nc ~/foo.nc ncatted -D 3 -h -a history,global,o,c,'Characters which require protection by backslash:\nDouble quote: \"\nTwo consecutive double quotes: \"\"\nSingle quote: Beyond my shell abilities!\nBackslash: \\\nTwo consecutive backslashes: \\\\\nQuestion mark: \?\n' ~/nco/data/in.nc ~/foo.nc ncatted -D 3 -h -a history,global,o,c,'Characters which do not require protection by backslash:\nSingle backquote: `\nDollarsign: $\nLeft brace: {\nRight brace: }\nPipe: |\nAmpersand: &\nAt sign: @\nPercent: %\n\n' ~/nco/data/in.nc ~/foo.nc Append to existing string: ncatted -D 5 -O -a char_att,att_var,a,c,"and appended Sentence three." ~/nco/data/in.nc ~/foo.nc Append to existing string with internal delimiter characters (commas): ncatted -D 5 -O -a char_att,att_var,a,c,"appended a comma, and three more commas,,," ~/nco/data/in.nc ~/foo.nc Append to existing float: ncatted -D 5 -O -a float_att,att_var,a,f,74 ~/nco/data/in.nc ~/foo.nc ncatted -D 5 -O -a float_att,att_var,a,f,74,75,76 ~/nco/data/in.nc ~/foo.nc Create new float: ncatted -D 5 -O -a new_float_att,att_var,c,f,74 ~/nco/data/in.nc ~/foo.nc Create new string: ncatted -D 5 -O -a new_string_att,att_var,c,sng,"string" ~/nco/data/in_4.nc ~/foo.nc Create new list of strings: ncatted -D 5 -O -a new_string_att,att_var,c,sng,"list","of","strings" ~/nco/data/in_4.nc ~/foo.nc Create all new netCDF4 atomic type attributes: ncatted -D 5 -O -a new_ubyte_att,att_var,c,ub,0 -a new_ushort_att,att_var,c,us,74 -a new_uint_att,att_var,c,u,71,72,73,74 -a new_int64_att,att_var,c,ll,-74 -a new_uint64_att,att_var,c,ull,74,75 -a new_string_att,att_var,c,sng,"No man is an island" ~/nco/data/in_4.nc ~/foo.nc Delete attribute: ncatted -D 5 -O -a float_att,att_var,d,,, ~/nco/data/in.nc ~/foo.nc Delete all attributes for given var: ncatted -D 5 -O -a ,att_var,d,,, ~/nco/data/in.nc ~/foo.nc Modify existing float: ncatted -D 5 -O -a float_att,att_var,m,f,74 ~/nco/data/in.nc ~/foo.nc Modify existing missing value attribute: ncatted -D 5 -O -a missing_value,mss_val,m,f,74 ~/nco/data/in.nc ~/foo.nc Multiple attribute edits: ncatted -D 5 -O -a char_att,att_var,a,c,"and appended Sentence three." -a short_att,att_var,c,s,37,38,39 -a float_att,att_var,d,,, -a long_att,att_var,o,l,37 -a new_att,att_var,o,d,73,74,75 ~/nco/data/in.nc ~/foo.nc Create global attribute: ncatted -D 5 -O -a float_att,global,c,f,74 ~/nco/data/in.nc ~/foo.nc Test algorithm for all variables: Append to existing string for all variables: ncatted -D 5 -O -a char_att,,a,c,"and appended Sentence three." ~/nco/data/in.nc ~/foo.nc Append to existing float for all variables: ncatted -D 5 -O -a float_att,,a,f,74 ~/nco/data/in.nc ~/foo.nc ncatted -D 5 -O -a float_att,,a,f,74,75,76 ~/nco/data/in.nc ~/foo.nc Create new float for all variables: ncatted -D 5 -O -a float_att,,c,f,74 ~/nco/data/in.nc ~/foo.nc Delete attribute for all variables: ncatted -D 5 -O -a float_att,,d,,, ~/nco/data/in.nc ~/foo.nc Modify existing float for all variables: ncatted -D 5 -O -a float_att,,m,f,74 ~/nco/data/in.nc ~/foo.nc Verify results: ncks -C -h ~/foo.nc | m */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #ifdef HAVE_STRINGS_H # include /* strcasecmp() */ #endif /* !HAVE_STRINGS_H */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ #ifdef I18N # include /* nl_langinfo() */ # include /* Internationalization i18n */ # include /* Locale setlocale() */ # define _(sng) gettext (sng) # define gettext_noop(sng) (sng) # define N_(sng) gettext_noop(sng) #endif /* I18N */ /* Supply stub gettext() function in case i18n failed */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include /* Parallel netCDF definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { aed_sct *aed_lst=NULL_CEWI; char **fl_lst_abb=NULL; /* Option n */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char *aed_arg[NC_MAX_ATTRS]; char *cmd_ln; char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char trv_pth[]="/"; /* [sng] Root path of traversal tree */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="Aa:D:hl:Oo:p:Rr-:"; #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.flg_ddra=False}; #endif /* !__cplusplus */ extern char *optarg; extern int optind; int abb_arg_nbr=0; int fl_nbr=0; int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int nbr_aed=0; /* Option a. NB: nbr_var_aed gets incremented */ int nbr_var_fl; int nc_id; int md_open; /* [enm] Mode flag for nc_open() call */ int opt; int rcd=NC_NOERR; /* [rcd] Return code */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool FL_OUT_NEW=False; nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool flg_cln=False; /* [flg] Clean memory prior to exit */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ trv_tbl_sct *trv_tbl=NULL; /* [lst] Traversal table */ nco_dmn_dne_t *flg_dne=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, /* Long options with short counterparts */ {"append",no_argument,0,'A'}, {"attribute",required_argument,0,'a'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); #ifdef ENABLE_MPI /* MPI Initialization */ if(False) (void)fprintf(stdout,gettext("%s: WARNING Compiled with MPI\n"),nco_prg_nm); MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'a': /* Copy argument for later processing */ aed_arg[nbr_aed]=(char *)strdup(optarg); nbr_aed++; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); if(fl_out) FL_OUT_NEW=True; else fl_out=(char *)strdup(fl_lst_in[0]); if(nbr_aed == 0){ (void)fprintf(stdout,"%s: ERROR must specify an attribute to edit\n",nco_prg_nm); nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: DEBUG attribute assumed to hold missing data is named \"%s\"\n",nco_prg_nm_get(),nco_mss_val_sng_get()); /* Make uniform list of user-specified attribute edit structures */ if(nbr_aed > 0) aed_lst=nco_prs_aed_lst(nbr_aed,aed_arg); /* We now have final list of attributes to edit */ /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(FL_OUT_NEW){ /* Obtain user consent, if needed, to overwrite output file (or die trying) */ if(!FORCE_OVERWRITE) nco_fl_overwrite_prm(fl_out); /* Copy input file to output file and then search through output, changing names on the fly. This avoids possible XDR translation performance penalty of copying each variable with netCDF. */ (void)nco_fl_cp(fl_in,fl_out); /* Ensure output file is user/owner-writable */ (void)nco_fl_chmod(fl_out); } /* end if FL_OUT_NEW */ /* Open file. Writing must be enabled and file should be in define mode for renaming */ /* if(nco_dbg_lvl == 8) md_open|=NC_SHARE;*/ if(RAM_OPEN) md_open=NC_WRITE|NC_DISKLESS; else md_open=NC_WRITE; rcd+=nco_fl_open(fl_out,md_open,&bfr_sz_hnt,&nc_id); (void)nco_redef(nc_id); /* Get number of variables in file */ (void)nco_inq(nc_id,(int *)NULL,&nbr_var_fl,(int *)NULL,(int *)NULL); /* Initialize traversal table */ trv_tbl_init(&trv_tbl); /* Construct GTT (Group Traversal Table) */ (void)nco_bld_trv_tbl(nc_id,trv_pth,(int)0,NULL,(int)0,NULL,False,False,NULL,(int)0,NULL,(int) 0,False,False,False,False,True,nco_pck_plc_nil,&flg_dne,trv_tbl); /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; for(int idx_aed=0;idx_aed+?|{}")){ /* Variable name contains a "regular expression" (rx) */ trv_tbl_sct *trv_tbl_rx; char **var_lst_in; /* I [sng] User-specified list of variables */ int var_lst_in_nbr; /* I [nbr] Number of variables in list */ var_lst_in=nco_lst_prs_2D(aed_lst[idx_aed].var_nm,",",&var_lst_in_nbr); trv_tbl_init(&trv_tbl_rx); /* Use regular expressions in aed structure to construct traversal table Variables marked for extraction will then have the attributes edited */ (void)nco_bld_trv_tbl(nc_id,trv_pth,(int)0,NULL,(int)0,NULL,False,False,NULL,(int)0,var_lst_in,var_lst_in_nbr,False,False,False,False,False,nco_pck_plc_nil,&flg_dne,trv_tbl_rx); /* Edit same attribute for all variables marked for extraction */ (void)nco_aed_prc_var_xtr(nc_id,aed_lst[idx_aed],trv_tbl_rx); trv_tbl_free(trv_tbl_rx); var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); }else if(!strcasecmp(aed_lst[idx_aed].var_nm,"group")){ /* Variable name of "group" means edit group attributes */ (void)nco_aed_prc_grp(nc_id,aed_lst[idx_aed],trv_tbl); }else if(!strcasecmp(aed_lst[idx_aed].var_nm,"global")){ /* Variable name of "global" means edit global attributes */ (void)nco_aed_prc_glb(nc_id,aed_lst[idx_aed],trv_tbl); }else{ /* Regular ole' variable name means edits attributes that match absoluted and relative names */ (void)nco_aed_prc_var_nm(nc_id,aed_lst[idx_aed],trv_tbl); } /* end var_nm */ } /* end loop over aed structures */ /* Catenate the time-stamped command line to the "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(nc_id,cmd_ln); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(nc_id); }else{ (void)nco__enddef(nc_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Close the open netCDF file */ nco_close(nc_id); /* Remove local copy of file */ if(FL_RTR_RMT_LCN && RM_RMT_FL_PST_PRC) (void)nco_fl_rm(fl_in); /* Clean memory unless dirty memory allowed */ if(flg_cln){ /* ncatted-specific memory */ for(int idx=0;idx 0) aed_lst=(aed_sct *)nco_free(aed_lst); /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); trv_tbl_free(trv_tbl); } /* !flg_cln */ #ifdef ENABLE_MPI MPI_Finalize(); #endif /* !ENABLE_MPI */ /* End timer */ ddra_info.tmr_flg=nco_tmr_end; /* [enm] Timer flag */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); if(rcd != NC_NOERR) nco_err_exit(rcd,"main"); nco_exit_gracefully(); return EXIT_SUCCESS; } /* end main() */ nco-4.5.4/src/nco/ncbo.c000066400000000000000000001065041264355130400147470ustar00rootroot00000000000000/* $Header$ */ /* ncbo -- netCDF binary operator */ /* Purpose: Compute sum, difference, product, or ratio of specified hyperslabs of specfied variables from two input netCDF files and output them to a single file. */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3. As a special exception to the terms of the GPL, you are permitted to link the NCO source code with the HDF, netCDF, OPeNDAP, and UDUnits libraries and to distribute the resulting executables under the terms of the GPL, but in addition obeying the extra stipulations of the HDF, netCDF, OPeNDAP, and UDUnits licenses. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. The original author of this software, Charlie Zender, seeks to improve it with your suggestions, contributions, bug-reports, and patches. Please contact the NCO project at http://nco.sf.net or write to Charlie Zender Department of Earth System Science University of California, Irvine Irvine, CA 92697-3100 */ /* Usage: ncbo -O -p ~/nco/data in.nc in.nc ~/foo.nc ncbo -O -v mss_val -p ~/nco/data in.nc in.nc ~/foo.nc ncbo -p /data/zender/tmp h0001.nc ~/foo.nc ncbo -p /data/zender/tmp -l /data/zender/tmp/rmt h0001.nc h0002.nc ~/foo.nc ncbo -p /ZENDER/tmp -l /data/zender/tmp/rmt h0001.nc h0002.nc ~/foo.nc ncbo -p /ZENDER/tmp -l /usr/tmp/zender h0001.nc h0002.nc ~/foo.nc Test type conversion: ncks -O -C -v float_var in.nc foo1.nc ncrename -v float_var,double_var foo1.nc ncks -O -C -v double_var in.nc foo2.nc ncbo -O -C -v double_var foo1.nc foo2.nc foo3.nc ncbo -O -C -v double_var foo2.nc foo1.nc foo4.nc ncks -H -m foo1.nc ncks -H -m foo2.nc ncks -H -m foo3.nc ncks -H -m foo4.nc Test nco_var_cnf_dmn(): ncks -O -v scalar_var in.nc ~/foo.nc ; ncrename -v scalar_var,four_dmn_rec_var foo.nc ; ncbo -O -v four_dmn_rec_var in.nc ~/foo.nc foo2.nc */ #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ #ifdef I18N # include /* nl_langinfo() */ # include /* Internationalization i18n */ # include /* Locale setlocale() */ # define _(sng) gettext (sng) # define gettext_noop(sng) (sng) # define N_(sng) gettext_noop(sng) #endif /* I18N */ /* Supply stub gettext() function in case i18n failed */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include /* Parallel netCDF definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { nco_bool CNV_CCM_CCSM_CF; nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FILE_1_RETRIEVED_FROM_REMOTE_LOCATION=False; nco_bool FILE_2_RETRIEVED_FROM_REMOTE_LOCATION=False; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool GRP_VAR_UNN=False; /* [flg] Select union of specified groups and variables */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order*/ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */ nco_bool flg_ddra=False; /* [flg] DDRA diagnostics */ char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in_1=NULL; /* fl_in_1 is nco_realloc'd when not NULL */ char *fl_in_2=NULL; /* fl_in_2 is nco_realloc'd when not NULL */ char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *nco_op_typ_sng=NULL; /* [sng] Operation type */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *ppc_arg[NC_MAX_VARS]; /* [sng] PPC arguments */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char **grp_lst_in=NULL; /* [sng] User-specified list of groups */ char trv_pth[]="/"; /* [sng] Root path of traversal tree */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:FG:g:hL:l:Oo:p:rRt:v:X:xzy:-:"; cnk_sct cnk; /* [sct] Chunking structure */ #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.MRV_flg=False,.flg_ddra=False,.lmn_nbr=0LL,.lmn_nbr_avg=0LL,.lmn_nbr_wgt=0LL,.nco_op_typ=nco_op_nil,.rnk_avg=0,.rnk_var=0,.rnk_wgt=0,.tmr_flg=nco_tmr_srt,.var_idx=0,.wgt_brd_flg=False,.wrd_sz=0}; #endif /* !__cplusplus */ extern char *optarg; extern int optind; gpe_sct *gpe=NULL; /* [sng] Group Path Editing (GPE) structure */ int *in_id_1_arr; int *in_id_2_arr; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt_1; /* [enm] Input file format */ int fl_in_fmt_2; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int idx; int in_id_1; int in_id_2; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_glb_att_1; /* [nbr] Number of global attributes in file */ int nbr_glb_att_2; /* [nbr] Number of global attributes in file */ int nbr_grp_att_1; /* [nbr] Number of group attributes in file */ int nbr_grp_att_2; /* [nbr] Number of group attributes in file */ int nbr_att_var_1; /* [nbr] Number of variable attributes in file */ int nbr_att_var_2; /* [nbr] Number of variable attributes in file */ int nbr_dmn_fl_1; /* [nbr] Number of dimensions in file */ int nbr_dmn_fl_2; /* [nbr] Number of dimensions in file */ int nbr_rec_fl_1; /* [nbr] Number of record dimensions in file */ int nbr_rec_fl_2; /* [nbr] Number of record dimensions in file */ int grp_dpt_fl_1; /* [nbr] Maximum group depth (root = 0) */ int grp_dpt_fl_2; /* [nbr] Maximum group depth (root = 0) */ int grp_lst_in_nbr=0; /* [nbr] Number of groups explicitly specified by user */ int nbr_grp_fl_1; /* [nbr] Number of groups in file */ int nbr_grp_fl_2; /* [nbr] Number of groups in file */ int var_ntm_fl_1; /* [nbr] Number of non-atomic variables in file */ int var_ntm_fl_2; /* [nbr] Number of non-atomic variables in file */ int nbr_var_fl_1; /* [nbr] Number of atomic-type variables in file */ int nbr_var_fl_2; /* [nbr] Number of atomic-type variables in file */ int nbr_gpe_nm; /* [nbr] Number of GPE entries */ int nbr_cmn_nm=0; /* [nbr] Number of common entries */ int nco_op_typ=nco_op_nil; /* [enm] Operation type */ int opt; int out_id; int ppc_nbr=0; /* [nbr] Number of PPC arguments */ int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ trv_tbl_sct *trv_tbl_1=NULL; /* [lst] Traversal table input file 1 */ trv_tbl_sct *trv_tbl_2=NULL; /* [lst] Traversal table input file 2 */ gpe_nm_sct *gpe_nm=NULL; /* [sct] GPE name duplicate check array */ nco_cmn_t *cmn_lst=NULL; /* [sct] A list of common names */ nco_dmn_dne_t *flg_dne1=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ nco_dmn_dne_t *flg_dne2=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ nco_dmn_dne_t *flg_dne=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"ddra",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"mdl_cmp",no_argument,0,0}, /* [flg] DDRA diagnostics */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"intersection",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"nsx",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"union",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"unn",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, {"ppc",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"precision_preserving_compression",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"quantize",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"7",no_argument,0,'7'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"gpe",required_argument,0,'G'}, /* [sng] Group Path Edit (GPE) */ {"grp",required_argument,0,'g'}, {"group",required_argument,0,'g'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"operation",required_argument,0,'y'}, {"op_typ",required_argument,0,'y'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ nbr_gpe_nm=0; /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); #ifdef ENABLE_MPI /* MPI Initialization */ if(False) (void)fprintf(stdout,gettext("%s: WARNING Compiled with MPI\n"),nco_prg_nm); MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk_dmn */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"ddra") || !strcmp(opt_crr,"mdl_cmp")) ddra_info.flg_ddra=flg_ddra=True; /* [flg] DDRA diagnostics */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdf_upk") || !strcmp(opt_crr,"hdf_unpack")) nco_upk_cnv=nco_upk_HDF; /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){ ppc_arg[ppc_nbr]=(char *)strdup(optarg); ppc_nbr++; } /* endif "ppc" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"unn") || !strcmp(opt_crr,"union")) GRP_VAR_UNN=True; if(!strcmp(opt_crr,"nsx") || !strcmp(opt_crr,"intersection")) GRP_VAR_UNN=False; if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* The debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'G': /* Apply Group Path Editing (GPE) to output group */ gpe=nco_gpe_prs_arg(optarg); fl_out_fmt=NC_FORMAT_NETCDF4; break; case 'g': /* Copy group argument for later processing */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); grp_lst_in=nco_lst_prs_2D(optarg_lcl,",",&grp_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case 'y': /* User-specified operation type overrides invocation default */ nco_op_typ_sng=(char *)strdup(optarg); nco_op_typ=nco_op_typ_get(nco_op_typ_sng); break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ /* Initialize traversal tables */ (void)trv_tbl_init(&trv_tbl_1); (void)trv_tbl_init(&trv_tbl_2); /* Default operation depends on invocation name */ if(nco_op_typ_sng == NULL) nco_op_typ=nco_op_typ_get(nco_op_typ_sng); /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_1_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); in_id_2_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filenames */ fl_idx=0; /* Input file _1 */ fl_in_1=nco_fl_nm_prs(fl_in_1,fl_idx,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_1); /* Make sure file is on local system and is readable or die trying */ fl_in_1=nco_fl_mk_lcl(fl_in_1,fl_pth_lcl,&FILE_1_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_1_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_1); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_2); /* Make sure file is on local system and is readable or die trying */ fl_in_2=nco_fl_mk_lcl(fl_in_2,fl_pth_lcl,&FILE_2_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_2_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_2); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx 0) nco_ppc_ini(in_id_1,&dfl_lvl,fl_out_fmt,ppc_arg,ppc_nbr,trv_tbl_1); /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Initialize chunking from user-specified inputs */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) rcd+=nco_cnk_ini(in_id_1,fl_out,cnk_arg,cnk_nbr,cnk_map,cnk_plc,cnk_min_byt,cnk_sz_byt,cnk_sz_scl,&cnk); if(gpe){ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Group Path Edit (GPE) feature enabled\n",nco_prg_nm_get()); if(fl_out_fmt != NC_FORMAT_NETCDF4) (void)fprintf(stderr,"%s: WARNING Group Path Edit (GPE) requires netCDF4 output format in most cases (except flattening) but user explicitly requested output format = %s. This command will fail if the output file requires netCDF4 features like groups or netCDF4 atomic types (e.g., NC_STRING, NC_UBYTE...).\n",nco_prg_nm_get(),nco_fmt_sng(fl_out_fmt)); } /* !gpe */ /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(in_id_1); /* Group broadcating (DEFINE mode, True as flg_dfn parameter) */ (void)nco_grp_brd(in_id_1,in_id_2,out_id,&cnk,dfl_lvl,gpe,gpe_nm,nbr_gpe_nm,CNV_CCM_CCSM_CF,nco_op_typ,trv_tbl_1,trv_tbl_2,(nco_bool)True); /* Copy global attributes from file 1 */ (void)nco_att_cpy(in_id_1,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in_1,in_id_1,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Group broadcating (WRITE mode, False as flg_dfn parameter) */ (void)nco_grp_brd(in_id_1,in_id_2,out_id,&cnk,dfl_lvl,gpe,gpe_nm,nbr_gpe_nm,CNV_CCM_CCSM_CF,nco_op_typ,trv_tbl_1,trv_tbl_2,(nco_bool)False); /* Close input netCDF files */ for(thr_idx=0;thr_idx 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) cnk.cnk_dmn=(cnk_dmn_sct **)nco_cnk_lst_free(cnk.cnk_dmn,cnk_nbr); trv_tbl_free(trv_tbl_1); trv_tbl_free(trv_tbl_2); if(gpe) gpe=(gpe_sct *)nco_gpe_free(gpe); /* Memory management for GPE names */ for(idx=0;idx 0) cmn_lst=(nco_cmn_t *)nco_free(cmn_lst); for(idx=0;idx /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ #ifdef I18N # include /* nl_langinfo() */ # include /* Internationalization i18n */ # include /* Locale setlocale() */ # define _(sng) gettext (sng) # define gettext_noop(sng) (sng) # define N_(sng) gettext_noop(sng) #endif /* I18N */ /* Supply stub gettext() function in case i18n failed */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include /* Parallel netCDF definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { nco_bool CNV_CCM_CCSM_CF; nco_bool CPY_GLB_METADATA=True; /* Option M */ nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_APPEND=True; /* Option H */ nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool GROUP_AGGREGATE=False; /* Option G */ nco_bool GRP_VAR_UNN=False; /* [flg] Select union of specified groups and variables */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool HAVE_LIMITS=False; /* [flg] Are there user limits? (-d) */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool USE_MM3_WORKAROUND=False; /* [flg] Faster copy on Multi-record Multi-variable netCDF3 files */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool RECORD_AGGREGATE=True; /* Option G */ nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */ char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **grp_lst_in=NULL; char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *gpe_arg=NULL; /* [sng] GPE argument */ char *grp_out=NULL; /* [sng] Group name */ char *lmt_arg[NC_MAX_DIMS]; char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *ppc_arg[NC_MAX_VARS]; /* [sng] PPC arguments */ char *rec_dmn_nm=NULL; /* [sng] New record dimension name */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ /* NCO_GRP_OUT_SFX_LNG is number of consecutive numeric digits automatically generated as group name suffixes */ #define NCO_GRP_OUT_SFX_LNG 2 char grp_out_sfx[NCO_GRP_OUT_SFX_LNG+1L]; char trv_pth[]="/"; /* [sng] Root path of traversal tree */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:Fg:G:HhL:l:Mn:Oo:p:rRt:u:v:X:x-:"; cnk_sct cnk; /* [sct] Chunking structure */ #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.flg_ddra=False}; #endif /* !__cplusplus */ extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE *fp_bnr=NULL; /* [fl] Unformatted binary output file handle */ gpe_sct *gpe=NULL; /* [sng] Group Path Editing (GPE) structure */ int *in_id_arr=NULL; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int gpe_id; /* [id] Group ID of GPE path (diagnostic only) */ int grp_lst_in_nbr=0; /* [nbr] Number of groups explicitly specified by user */ int idx; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int lmt_nbr_rgn=0; /* Option d. Original limit number for GTT initialization */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int opt; int out_id; int ppc_nbr=0; /* [nbr] Number of PPC arguments */ int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_idx; int var_lst_in_nbr=0; long idx_rec_out=0L; /* idx_rec_out gets incremented */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t grp_out_lng; /* [nbr] Length of original, canonicalized GPE specification filename component */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ var_sct **var=NULL; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out=NULL; var_sct **var_prc; var_sct **var_prc_out; trv_tbl_sct *trv_tbl=NULL; /* [lst] Traversal table */ nco_dmn_dne_t *flg_dne=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"gag",no_argument,0,0}, /* [flg] Group aggregation */ {"aggregate_group",no_argument,0,0}, /* [flg] Group aggregation */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"md5_dgs",no_argument,0,0}, /* [flg] Perform MD5 digests */ {"md5_digest",no_argument,0,0}, /* [flg] Perform MD5 digests */ {"mrd",no_argument,0,0}, /* [enm] Multiple Record Dimension convention */ {"multiple_record_dimension",no_argument,0,0}, /* [enm] Multiple Record Dimension convention */ {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"intersection",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"nsx",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"union",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"unn",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, {"ppc",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"precision_preserving_compression",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"quantize",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"gpe",required_argument,0,'G'}, /* [sng] Group Path Edit (GPE) */ {"group",required_argument,0,'g'}, {"grp",required_argument,0,'g'}, {"fl_lst_in",no_argument,0,'H'}, {"file_list",no_argument,0,'H'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"no_glb_mtd",no_argument,0,'M'}, {"suppress_global_metadata",no_argument,0,'M'}, {"nintap",required_argument,0,'n'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"ulm_nm",required_argument,0,'u'}, {"rcd_nm",required_argument,0,'u'}, {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); #ifdef ENABLE_MPI /* MPI Initialization */ if(False) (void)fprintf(stdout,gettext("%s: WARNING Compiled with MPI\n"),nco_prg_nm); MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"gag") || !strcmp(opt_crr,"aggregate_group")) GROUP_AGGREGATE=True; /* [flg] Aggregate files into groups not records */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"md5_dgs") || !strcmp(opt_crr,"md5_digest")){ if(!md5) md5=nco_md5_ini(); md5->dgs=True; if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Will perform MD5 digests of input and output hyperslabs\n",nco_prg_nm_get()); } /* endif "md5_dgs" */ if(!strcmp(opt_crr,"mrd") || !strcmp(opt_crr,"multiple_record_dimension")) nco_mrd_cnv=nco_mrd_allow; /* [enm] Multiple Record Dimension convention */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){ ppc_arg[ppc_nbr]=(char *)strdup(optarg); ppc_nbr++; } /* endif "ppc" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"unn") || !strcmp(opt_crr,"union")) GRP_VAR_UNN=True; if(!strcmp(opt_crr,"nsx") || !strcmp(opt_crr,"intersection")) GRP_VAR_UNN=False; if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; lmt_nbr_rgn=lmt_nbr; HAVE_LIMITS=True; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'G': /* Apply Group Path Editing (GPE) to output group */ /* NB: GNU getopt() optional argument syntax is ugly (requires "=" sign) so avoid it http://stackoverflow.com/questions/1052746/getopt-does-not-parse-optional-arguments-to-parameters */ gpe=nco_gpe_prs_arg(optarg); grp_out=(char *)strdup(gpe->nm_cnn); /* [sng] Group name */ grp_out_lng=gpe->lng_cnn; GROUP_AGGREGATE=True; break; case 'g': /* Copy group argument for later processing */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); grp_lst_in=nco_lst_prs_2D(optarg_lcl,",",&grp_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'H': /* Toggle writing input file list attribute */ FL_LST_IN_APPEND=!FL_LST_IN_APPEND; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'M': /* Toggle copying global metadata */ CPY_GLB_METADATA=!CPY_GLB_METADATA; break; case 'n': /* NINTAP-style abbreviation of files to process */ fl_lst_abb=nco_lst_prs_2D(optarg,",",&abb_arg_nbr); if(abb_arg_nbr < 1 || abb_arg_nbr > 6){ (void)fprintf(stdout,"%s: ERROR Incorrect abbreviation for file list\n",nco_prg_nm); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'u': /* New record dimension name */ rec_dmn_nm=(char *)strdup(optarg); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ trv_tbl_init(&trv_tbl); if(GROUP_AGGREGATE){ RECORD_AGGREGATE=!GROUP_AGGREGATE; fl_out_fmt=NC_FORMAT_NETCDF4; } /* !GROUP_AGGREGATE */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; /* Open file using appropriate buffer size hints and verbosity */ rcd+=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); (void)nco_inq_format(in_id,&fl_in_fmt); if(RECORD_AGGREGATE){ /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Construct GTT, Group Traversal Table (groups,variables,dimensions, limits) */ (void)nco_bld_trv_tbl(in_id,trv_pth,lmt_nbr,lmt_arg,aux_nbr,aux_arg,MSA_USR_RDR,FORTRAN_IDX_CNV,grp_lst_in,grp_lst_in_nbr,var_lst_in,xtr_nbr,EXTRACT_ALL_COORDINATES,GRP_VAR_UNN,False,EXCLUDE_INPUT_LIST,EXTRACT_ASSOCIATED_COORDINATES,nco_pck_plc_nil,&flg_dne,trv_tbl); /* Were all user-specified dimensions found? */ (void)nco_chk_dmn(lmt_nbr,flg_dne); /* Get number of variables, dimensions, and global attributes in file, file format */ (void)trv_tbl_inq((int *)NULL,(int *)NULL,(int *)NULL,&nbr_dmn_fl,(int *)NULL,(int *)NULL,(int *)NULL,(int *)NULL,&nbr_var_fl,trv_tbl); /* Fill-in variable structure list for all extracted variables */ var=nco_fll_var_trv(in_id,&xtr_nbr,trv_tbl); var_out=(var_sct **)nco_malloc(xtr_nbr*sizeof(var_sct *)); for(var_idx=0;var_idx 0) nco_ppc_ini(in_id,&dfl_lvl,fl_out_fmt,ppc_arg,ppc_nbr,trv_tbl); /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Initialize chunking from user-specified inputs */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) rcd+=nco_cnk_ini(in_id,fl_out,cnk_arg,cnk_nbr,cnk_map,cnk_plc,cnk_min_byt,cnk_sz_byt,cnk_sz_scl,&cnk); /* ncecat-specific operations */ if(RECORD_AGGREGATE){ if(!rec_dmn_nm) rec_dmn_nm=(char *)strdup("record"); /* Prepend record dimension to beginning of all vectors for processed variables */ for(idx=0;idxnbr_dim++; var_prc_out[idx]->is_rec_var=True; var_prc_out[idx]->sz_rec=var_prc_out[idx]->sz; /* Allocate space to hold dimension IDs */ var_prc_out[idx]->dim=(dmn_sct **)nco_realloc(var_prc_out[idx]->dim,var_prc_out[idx]->nbr_dim*sizeof(dmn_sct *)); var_prc_out[idx]->dmn_id=(int *)nco_realloc(var_prc_out[idx]->dmn_id,var_prc_out[idx]->nbr_dim*sizeof(int)); var_prc_out[idx]->cnt=(long *)nco_realloc(var_prc_out[idx]->cnt,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->end=(long *)nco_realloc(var_prc_out[idx]->end,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->srd=(long *)nco_realloc(var_prc_out[idx]->srd,var_prc_out[idx]->nbr_dim*sizeof(long int)); var_prc_out[idx]->srt=(long *)nco_realloc(var_prc_out[idx]->srt,var_prc_out[idx]->nbr_dim*sizeof(long int)); /* Moves current array by one to make room for new record dimension info */ (void)memmove((void *)(var_prc_out[idx]->dim+1),(void *)(var_prc_out[idx]->dim),(var_prc_out[idx]->nbr_dim-1)*sizeof(dmn_sct *)); (void)memmove((void *)(var_prc_out[idx]->dmn_id+1),(void *)(var_prc_out[idx]->dmn_id),(var_prc_out[idx]->nbr_dim-1)*sizeof(int)); (void)memmove((void *)(var_prc_out[idx]->cnt+1L),(void *)(var_prc_out[idx]->cnt),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->end+1L),(void *)(var_prc_out[idx]->end),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->srd+1L),(void *)(var_prc_out[idx]->srd),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); (void)memmove((void *)(var_prc_out[idx]->srt+1L),(void *)(var_prc_out[idx]->srt),(var_prc_out[idx]->nbr_dim-1)*sizeof(long int)); /* Insert value for new record dimension */ var_prc_out[idx]->cnt[0]=1L; var_prc_out[idx]->end[0]=-1L; var_prc_out[idx]->srd[0]=-1L; var_prc_out[idx]->srt[0]=-1L; } /* end loop over idx */ /* Define dimensions, extracted groups, variables, and attributes in output file */ (void)nco_xtr_dfn(in_id,out_id,&cnk,dfl_lvl,gpe,md5,!FORCE_APPEND,True,False,nco_pck_plc_nil,rec_dmn_nm,trv_tbl); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); /* Add input file list global attribute */ if(FL_LST_IN_APPEND && HISTORY_APPEND && FL_LST_IN_FROM_STDIN) (void)nco_fl_lst_att_cat(out_id,fl_lst_in,fl_nbr); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); /* Copy variable data for non-processed variables */ (void)nco_cpy_fix_var_trv(in_id,out_id,gpe,trv_tbl); /* Close first input netCDF file */ (void)nco_close(in_id); /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; } /* !RECORD_AGGREGATE */ if(GROUP_AGGREGATE){ #ifndef ENABLE_NETCDF4 (void)fprintf(stderr,"%s: ERROR GAG requires netCDF4 capabilities. HINT: Rebuild NCO with netCDF4 enabled.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); #endif /* ENABLE_NETCDF4 */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Group Aggregation (GAG) feature enabled\n",nco_prg_nm_get()); if(fl_out_fmt != NC_FORMAT_NETCDF4){ (void)fprintf(stderr,"%s: ERROR Group Aggregation requires netCDF4 output format but user explicitly requested format = %s\n",nco_prg_nm_get(),nco_fmt_sng(fl_out_fmt)); nco_exit(EXIT_FAILURE); } /* endif err */ } /* !GROUP_AGGREGATE */ /* Loop over input files */ for(fl_idx=0;fl_idx= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in); /* Make sure file is on local system and is readable or die trying */ if(fl_idx) fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); if(nco_dbg_lvl >= nco_dbg_fl && FL_RTR_RMT_LCN) (void)fprintf(stderr,", local file is %s",fl_in); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); if(GROUP_AGGREGATE){ size_t gpe_arg_lng; /* [nbr] Length of group specification */ if(grp_out){ /* Append enumerated counter to end of user-specified root group path */ sprintf(grp_out_sfx,"%02d",fl_idx); gpe_arg_lng=grp_out_lng+NCO_GRP_OUT_SFX_LNG+gpe->lng_edt; gpe_arg=(char *)nco_malloc((gpe_arg_lng+1L)*sizeof(char)); (void)strcpy(gpe_arg,grp_out); (void)strcat(gpe_arg,grp_out_sfx); if(gpe->edt) (void)strcat(gpe_arg,gpe->edt); }else{ /* Use filename stub as group name */ char *stb_srt_psn; /* [sng] Starting position of "stub", i.e., last component of filename */ size_t fl_in_lng; /* [nbr] Length of filename */ size_t sfx_fst; /* [nbr] Offset of suffix from start of string */ size_t sfx_lng; /* [nbr] Suffix has this many characters */ /* Is there a .nc, .cdf, .nc3, or .nc4 suffix? or an .hdf, .HDF, .h5, .H5, or .he5 suffix? */ fl_in_lng=strlen(fl_in); sfx_lng=3L; sfx_fst=fl_in_lng-sfx_lng; /* Sample data found in, e.g., ftp://ftp.unidata.ucar.edu/pub/netcdf/sample_data and http://hdfeos.org/zoo Two versions of HDF-EOS exist: HDF-EOS2 for HDF4, and HDF-EOS5 for HDF5 */ if(strncmp(fl_in+sfx_fst,".nc",sfx_lng) && /* netCDF standard suffix */ strncmp(fl_in+sfx_fst,".H5",sfx_lng) && /* HDF5 suffix used by ICESat GLAS, e.g., GLAH05_633_2103_001_1107_3_01_0001.H5 */ strncmp(fl_in+sfx_fst,".h5",sfx_lng)){ /* HDF5 suffix used by BUV, ICESat GLAS, MABEL, MEaSUREs Ozone, SBUV, e.g., BUV-Nimbus04_L3zm_v01-00-2012m0203t144121.h5, GLAH13_633_2103_001_1317_0_01_0001.h5, mabel_l2_20130927t201800_008_1.h5, MSO3L3zm5_v01-02-2013m0907t142428.h5 */ sfx_lng=4L; sfx_fst=fl_in_lng-sfx_lng; if(strncmp(fl_in+sfx_fst,".cdf",sfx_lng) && /* netCDF old-fashioned suffix */ strncmp(fl_in+sfx_fst,".hdf",sfx_lng) && /* HDF-EOS2 (HDF4) suffix used by AIRS, AMSR-E, MODIS, MOPPITT, SeaWiFS, e.g., AIRS.2002.08.01.L3.RetStd_H031.v4.0.21.0.G06104133732.hdf, MSR_E_L2_Rain_V10_200905312326_A.hdf, MOD10CM.A2007001.005.2007108111758.hdf, MOP01-20121231-L1V3.34.10.hdf, S1999001.L3m_DAY_CDOM_cdom_index_9km.hdf */ strncmp(fl_in+sfx_fst,".HDF",sfx_lng) && /* HDF-EOS2 (HDF4) suffix used by TRMM, e.g., 3B43.070901.6A.HDF */ strncmp(fl_in+sfx_fst,".he5",sfx_lng) && /* HDF-EOS5 (HDF5) suffix used by HIRDLS, OMI Aerosols, e.g., HIRDLS-Aura_L3ZAD_v06-00-00-c02_2005d022-2008d077.he5, OMI-Aura_L2-OMAERUV_2013m1004t2338-o49057_v003-2013m1005t053932.he5 */ strncmp(fl_in+sfx_fst,".nc3",sfx_lng) && /* netCDF3 variant suffix */ strncmp(fl_in+sfx_fst,".nc4",sfx_lng)){ /* netCDF4 variant suffix */ (void)fprintf(stderr,"%s: WARNING GAG filename suffix is unusual---using whole filename as group name\n",nco_prg_nm_get()); sfx_lng=0; } /* endif */ } /* endif */ stb_srt_psn=strrchr(fl_in,'/'); if(!stb_srt_psn) stb_srt_psn=fl_in; else stb_srt_psn++; gpe_arg_lng=strlen(stb_srt_psn)-sfx_lng; gpe_arg=(char *)nco_malloc((gpe_arg_lng+1L)*sizeof(char)); gpe_arg=strncpy(gpe_arg,stb_srt_psn,strlen(stb_srt_psn)-sfx_lng); gpe_arg[gpe_arg_lng]='\0'; /* GPE arguments derived from filenames check for existence of path in output file */ rcd=nco_inq_grp_full_ncid_flg(out_id,gpe_arg,&gpe_id); /* Existence implies current file may overwrite contents of previous file */ if(rcd == NC_NOERR) (void)fprintf(stderr,"%s: WARNING GAG path \"%s\" automatically derived from stub of filename %s conflicts with existing path in output file. Any input data with same absolute path names as contents of a previous input file will be overwritten. Is the same input file specified multiple times? Is this intentional?\nHINT: To distribute copies of a single input file into different groups, use GPE to generate distinct output group names, e.g., %s -G copy in.nc in.nc out.nc\n",nco_prg_nm_get(),gpe_arg,fl_in,nco_prg_nm_get()); else rcd=NC_NOERR; } /* !grp_out */ /* Free old structure, if any, before re-use */ if(gpe) gpe=(gpe_sct *)nco_gpe_free(gpe); gpe=nco_gpe_prs_arg(gpe_arg); gpe_arg=(char *)nco_free(gpe_arg); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO GAG current file has gpe->arg=%s\n",nco_prg_nm_get(),gpe->arg); /* Open file using appropriate buffer size hints and verbosity */ if(fl_idx) rcd=nco_fl_open(fl_in,md_open,&bfr_sz_hnt,&in_id); if(fl_idx == 0){ /* fxm: Copy global attributes of first file to root of output file to preserve history attribute */ /* Copy global attributes */ if(CPY_GLB_METADATA) (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,(nco_bool)True); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); /* Add input file list global attribute */ if(FL_LST_IN_APPEND && HISTORY_APPEND && FL_LST_IN_FROM_STDIN) (void)nco_fl_lst_att_cat(out_id,fl_lst_in,fl_nbr); } /* endif first file */ trv_tbl_sct *trv_tbl_gpr=NULL; /* [lst] Traversal table for GROUP_AGGREGATE only */ /* Initialize traversal table */ trv_tbl_init(&trv_tbl_gpr); /* Construct GTT, Group Traversal Table (groups,variables,dimensions, limits) */ (void)nco_bld_trv_tbl(in_id,trv_pth,lmt_nbr_rgn,lmt_arg,aux_nbr,aux_arg,MSA_USR_RDR,FORTRAN_IDX_CNV,grp_lst_in,grp_lst_in_nbr,var_lst_in,xtr_nbr,EXTRACT_ALL_COORDINATES,GRP_VAR_UNN,False,EXCLUDE_INPUT_LIST,EXTRACT_ASSOCIATED_COORDINATES,nco_pck_plc_nil,&flg_dne,trv_tbl_gpr); /* Get number of variables, dimensions, and global attributes in file, file format */ (void)trv_tbl_inq((int *)NULL,(int *)NULL,(int *)NULL,&nbr_dmn_fl,(int *)NULL,(int *)NULL,(int *)NULL,(int *)NULL,&nbr_var_fl,trv_tbl_gpr); (void)nco_inq_format(in_id,&fl_in_fmt); /* We now have final list of variables to extract. Phew. */ /* Define extracted groups, variables, and attributes in output file */ (void)nco_xtr_dfn(in_id,out_id,&cnk,dfl_lvl,gpe,md5,CPY_GLB_METADATA,(nco_bool)True,(nco_bool)False,nco_pck_plc_nil,rec_dmn_nm,trv_tbl_gpr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Write extracted data to output file */ (void)nco_xtr_wrt(in_id,out_id,gpe,fp_bnr,md5,HAVE_LIMITS,trv_tbl_gpr); /* Close input netCDF file */ (void)nco_close(in_id); /* Free traversal table */ trv_tbl_free(trv_tbl_gpr); } /* !GROUP_AGGREGATE */ if(RECORD_AGGREGATE){ /* Open file once per thread to improve caching */ for(thr_idx=0;thr_idx 0) USE_MM3_WORKAROUND=False; if(!USE_MM3_WORKAROUND){ /* Copy all data variable-by-variable */ ; }else{ /* MM3 workaround algorithm */ /* ncecat-specific MM3 characteristics: Only coordinates are "fixed" (non-processed) variables All other variables are "processed" These variables may be fixed or record on input yet are all record on output Makes sense to always use MM3? */ ; } /* endif MM3 workaround */ /* OpenMP with threading over variables, not files */ #ifdef _OPENMP # pragma omp parallel for default(none) private(in_id) shared(nco_dbg_lvl,fl_nbr,idx_rec_out,in_id_arr,nbr_var_prc,out_id,var_prc,var_prc_out,nbr_dmn_fl,md5,trv_tbl) #endif /* !_OPENMP */ /* Process all variables in current file */ for(idx=0;idx= nco_dbg_var) (void)fprintf(fp_stderr,"%s, ",var_prc[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); /* Obtain variable GTT object using full variable name */ var_trv=trv_tbl_var_nm_fll(var_prc[idx]->nm_fll,trv_tbl); /* Variables may have different ID, missing_value, type, in each file */ (void)nco_inq_grp_full_ncid(in_id,var_trv->grp_nm_fll,&grp_id); (void)nco_var_mtd_refresh(grp_id,var_prc[idx]); /* Read */ (void)nco_msa_var_get_trv(in_id,var_prc[idx],trv_tbl); /* Size of record dimension is 1 in output file */ var_prc_out[idx]->cnt[0]=1L; var_prc_out[idx]->srt[0]=idx_rec_out; /* Write variable into current record in output file */ /* Obtain output group ID */ (void)nco_inq_grp_full_ncid(out_id,var_trv->grp_nm_fll,&grp_out_id); /* Get variable ID */ (void)nco_inq_varid(grp_out_id,var_trv->nm,&var_out_id); /* Store the output variable ID */ var_prc_out[idx]->id=var_out_id; if(var_trv->ppc != NC_MAX_INT){ if(var_trv->flg_nsd) (void)nco_ppc_bitmask(var_trv->ppc,var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->val); else (void)nco_ppc_around(var_trv->ppc,var_prc[idx]->type,var_prc[idx]->sz,var_prc[idx]->has_mss_val,var_prc[idx]->mss_val,var_prc[idx]->val); } /* endif ppc */ if(nco_is_xcp(var_trv->nm)) nco_xcp_prc(var_trv->nm,var_prc[idx]->type,var_prc[idx]->sz,(char *)var_prc[idx]->val.vp); #ifdef _OPENMP # pragma omp critical #endif /* _OPENMP */ { /* begin OpenMP critical */ if(var_prc[idx]->nbr_dim == 0){ (void)nco_put_var1(grp_out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc[idx]->val.vp,var_prc[idx]->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(grp_out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc[idx]->val.vp,var_prc[idx]->type); } /* end if variable is array */ /* Perform MD5 digest of input and output data if requested */ if(md5) (void)nco_md5_chk(md5,var_prc_out[idx]->nm,var_prc_out[idx]->sz*nco_typ_lng(var_prc[idx]->type),out_id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc[idx]->val.vp); /* Free current input buffer */ var_prc[idx]->val.vp=nco_free(var_prc[idx]->val.vp); } /* end OpenMP critical */ } /* end (OpenMP parallel for) loop over idx */ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); idx_rec_out++; /* [idx] Index of current record in output file (0 is first, ...) */ /* Close input netCDF file */ for(thr_idx=0;thr_idx 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) cnk.cnk_dmn=(cnk_dmn_sct **)nco_cnk_lst_free(cnk.cnk_dmn,cnk_nbr); if(RECORD_AGGREGATE){ /* Free dimension lists */ /* ncecat-specific memory cleanup */ if(rec_dmn_nm) rec_dmn_nm=(char *)nco_free(rec_dmn_nm); /* Free variable lists */ if(xtr_nbr > 0) var=nco_var_lst_free(var,xtr_nbr); if(xtr_nbr > 0) var_out=nco_var_lst_free(var_out,xtr_nbr); var_prc=(var_sct **)nco_free(var_prc); var_prc_out=(var_sct **)nco_free(var_prc_out); var_fix=(var_sct **)nco_free(var_fix); var_fix_out=(var_sct **)nco_free(var_fix_out); if(gpe) gpe=(gpe_sct *)nco_gpe_free(gpe); if(md5) md5=(md5_sct *)nco_md5_free(md5); /* Free traversal table */ trv_tbl_free(trv_tbl); for(idx=0;idx /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ #ifdef I18N # include /* nl_langinfo() */ # include /* Internationalization i18n */ # include /* Locale setlocale() */ # define _(sng) gettext (sng) # define gettext_noop(sng) (sng) # define N_(sng) gettext_noop(sng) #endif /* I18N */ /* Supply stub gettext() function in case i18n failed */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include /* Parallel netCDF definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { nco_bool CNV_CCM_CCSM_CF; nco_bool CMD_LN_NTP_VAR=False; /* Option i */ nco_bool CMD_LN_NTP_WGT=True; /* Option w */ nco_bool DO_CONFORM=False; /* Did nco_var_cnf_dmn() find truly conforming variables? */ nco_bool EXCLUDE_INPUT_LIST=False; /* Option c */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FILE_1_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FILE_2_RETRIEVED_FROM_REMOTE_LOCATION; nco_bool FIX_REC_CRD=False; /* [flg] Do not interpolate/multiply record coordinate variables */ nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool GRP_VAR_UNN=False; /* [flg] Select union of specified groups and variables */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order*/ nco_bool MUST_CONFORM=False; /* Must nco_var_cnf_dmn() find truly conforming variables? */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */ char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **ntp_lst_in; char **grp_lst_in=NULL_CEWI; char **var_lst_in=NULL_CEWI; char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *fl_in_1=NULL; /* fl_in_1 is nco_realloc'd when not NULL */ char *fl_in_2=NULL; /* fl_in_2 is nco_realloc'd when not NULL */ char *fl_out=NULL; /* Option o */ char *fl_out_tmp; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *lmt_arg[NC_MAX_DIMS]; char *ntp_nm=NULL; /* Option i */ char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *ppc_arg[NC_MAX_VARS]; /* [sng] PPC arguments */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char trv_pth[]="/"; /* [sng] Root path of traversal tree */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="3467ACcD:d:Fg:G:hi:L:l:Oo:p:rRt:v:X:xw:-:"; cnk_sct cnk; /* [sct] Chunking structure */ #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.flg_ddra=False}; #endif /* !__cplusplus */ double ntp_val_out=double_CEWI; /* Option i */ double wgt_val_1=0.5; /* Option w */ double wgt_val_2=0.5; /* Option w */ extern char *optarg; extern int optind; /* Using naked stdin/stdout/stderr in parallel region generates warning Copy appropriate filehandle to variable scoped shared in parallel clause */ FILE * const fp_stderr=stderr; /* [fl] stderr filehandle CEWI */ FILE * const fp_stdout=stdout; /* [fl] stdout filehandle CEWI */ gpe_sct *gpe=NULL; /* [sng] Group Path Editing (GPE) structure */ int *in_id_1_arr; int *in_id_2_arr; int abb_arg_nbr=0; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int fl_idx; int fl_nbr=0; int fl_in_fmt_1; /* [enm] Input file format */ int fl_in_fmt_2; /* [enm] Input file format */ int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int has_mss_val=False; int idx; int in_id_1; int in_id_2; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int nbr_dmn_fl; int nbr_ntp; int nbr_var_fix; /* nbr_var_fix gets incremented */ int nbr_var_fl; int nbr_var_prc; /* nbr_var_prc gets incremented */ int xtr_nbr=0; /* xtr_nbr won't otherwise be set for -c with no -v */ int opt; int out_id; int ppc_nbr=0; /* [nbr] Number of PPC arguments */ int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; int grp_lst_in_nbr=0; /* [nbr] Number of groups explicitly specified by user */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ val_unn val_gnr_unn; /* Generic container for arrival point or weight */ var_sct *wgt_1=NULL_CEWI; var_sct *wgt_2=NULL_CEWI; var_sct *wgt_out_1=NULL; var_sct *wgt_out_2=NULL; var_sct **var; var_sct **var_fix; var_sct **var_fix_out; var_sct **var_out; var_sct **var_prc_1; var_sct **var_prc_2; var_sct **var_prc_out; trv_tbl_sct *trv_tbl=NULL; /* [lst] Traversal table */ nco_dmn_dne_t *flg_dne=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"hdf_upk",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"hdf_unpack",no_argument,0,0}, /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"fix_rec_crd",no_argument,0,0}, /* [flg] Do not interpolate/multiply record coordinate variables */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"intersection",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"nsx",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"union",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"unn",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, {"ppc",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"precision_preserving_compression",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"quantize",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"append",no_argument,0,'A'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"debug",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"gpe",required_argument,0,'G'}, /* [sng] Group Path Edit (GPE) */ {"grp",required_argument,0,'g'}, {"group",required_argument,0,'g'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"interpolate",required_argument,0,'i'}, {"ntp",required_argument,0,'i'}, {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"local",required_argument,0,'l'}, {"lcl",required_argument,0,'l'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"path",required_argument,0,'p'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"variable",required_argument,0,'v'}, {"weight",required_argument,0,'w'}, {"wgt_var",no_argument,0,'w'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); #ifdef ENABLE_MPI /* MPI Initialization */ if(False) (void)fprintf(stdout,gettext("%s: WARNING Compiled with MPI\n"),nco_prg_nm); MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fix_rec_crd")) FIX_REC_CRD=True; /* [flg] Do not interpolate/multiply record coordinate variables */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdf_upk") || !strcmp(opt_crr,"hdf_unpack")) nco_upk_cnv=nco_upk_HDF; /* [flg] HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")){ ppc_arg[ppc_nbr]=(char *)strdup(optarg); ppc_nbr++; } /* endif "ppc" */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"unn") || !strcmp(opt_crr,"union")) GRP_VAR_UNN=True; if(!strcmp(opt_crr,"nsx") || !strcmp(opt_crr,"intersection")) GRP_VAR_UNN=False; if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=False; break; case 'c': EXTRACT_ALL_COORDINATES=True; break; case 'D': /* The debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'G': /* Apply Group Path Editing (GPE) to output group */ /* NB: GNU getopt() optional argument syntax is ugly (requires "=" sign) so avoid it http://stackoverflow.com/questions/1052746/getopt-does-not-parse-optional-arguments-to-parameters */ gpe=nco_gpe_prs_arg(optarg); fl_out_fmt=NC_FORMAT_NETCDF4; break; case 'g': /* Copy group argument for later processing */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); grp_lst_in=nco_lst_prs_2D(optarg_lcl,",",&grp_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'i': /* Name of variable to guide interpolation. Default is none */ ntp_lst_in=nco_lst_prs_2D(optarg,",",&nbr_ntp); if(nbr_ntp > 2){ (void)fprintf(stdout,"%s: ERROR too many arguments to -i\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ ntp_nm=ntp_lst_in[0]; ntp_val_out=strtod(ntp_lst_in[1],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[1],"strtod",sng_cnv_rcd); CMD_LN_NTP_VAR=True; CMD_LN_NTP_WGT=False; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'w': /* Weight(s) for interpolation. Default is wgt_val_1=wgt_val_2=0.5 */ ntp_lst_in=nco_lst_prs_2D(optarg,",",&nbr_ntp); if(nbr_ntp > 2){ (void)fprintf(stdout,"%s: ERROR too many arguments to -w\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); }else if(nbr_ntp == 2){ wgt_val_1=strtod(ntp_lst_in[0],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[0],"strtod",sng_cnv_rcd); wgt_val_2=strtod(ntp_lst_in[1],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[1],"strtod",sng_cnv_rcd); }else if(nbr_ntp == 1){ wgt_val_1=strtod(ntp_lst_in[0],&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(ntp_lst_in[0],"strtod",sng_cnv_rcd); wgt_val_2=1.0-wgt_val_1; } /* end else */ CMD_LN_NTP_WGT=True; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ break; case 'x': /* Exclude rather than extract variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ if(CMD_LN_NTP_VAR && CMD_LN_NTP_WGT){ (void)fprintf(stdout,"%s: ERROR interpolating variable (-i) and fixed weight(s) (-w) both set\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); }else if(!CMD_LN_NTP_VAR && !CMD_LN_NTP_WGT){ (void)fprintf(stdout,"%s: ERROR interpolating variable (-i) or fixed weight(s) (-w) must be set\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end else */ /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_1_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); in_id_2_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); /* Parse filenames */ fl_idx=0; /* Input file _1 */ fl_in_1=nco_fl_nm_prs(fl_in_1,fl_idx,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_1); /* Make sure file is on local system and is readable or die trying */ fl_in_1=nco_fl_mk_lcl(fl_in_1,fl_pth_lcl,&FILE_1_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_1_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_1); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Input file %d is %s",nco_prg_nm_get(),fl_idx,fl_in_2); /* Make sure file is on local system and is readable or die trying */ fl_in_2=nco_fl_mk_lcl(fl_in_2,fl_pth_lcl,&FILE_2_RETRIEVED_FROM_REMOTE_LOCATION); if(nco_dbg_lvl >= nco_dbg_fl && FILE_2_RETRIEVED_FROM_REMOTE_LOCATION) (void)fprintf(stderr,", local file is %s",fl_in_2); if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"\n"); /* Open file once per thread to improve caching */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idx 0) nco_ppc_ini(in_id_1,&dfl_lvl,fl_out_fmt,ppc_arg,ppc_nbr,trv_tbl); /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Initialize chunking from user-specified inputs */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) rcd+=nco_cnk_ini(in_id_1,fl_out,cnk_arg,cnk_nbr,cnk_map,cnk_plc,cnk_min_byt,cnk_sz_byt,cnk_sz_scl,&cnk); /* Transfer variable type to table. NOTE: Using var/xtr_nbr containing all variables (processed, fixed) */ (void)nco_var_typ_trv(xtr_nbr,var,trv_tbl); /* Define dimensions, extracted groups, variables, and attributes in output file */ (void)nco_xtr_dfn(in_id_1,out_id,&cnk,dfl_lvl,gpe,md5,!FORCE_APPEND,True,False,nco_pck_plc_nil,(char *)NULL,trv_tbl); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in_1,in_id_1,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* Assign zero to start and unity to stride vectors in output variables */ (void)nco_var_srd_srt_set(var_out,xtr_nbr); /* Copy variable data for non-processed variables */ (void)nco_cpy_fix_var_trv(in_id_1,out_id,gpe,trv_tbl); /* Perform various error-checks on input file */ if(False) (void)nco_fl_cmp_err_chk(); /* ncflint-specific stuff: */ /* Find the weighting variable in input file */ if(CMD_LN_NTP_VAR){ var_sct *ntp_1=NULL; var_sct *ntp_2=NULL; var_sct *ntp_var_out; /* Turn arrival point into pseudo-variable */ val_gnr_unn.d=ntp_val_out; /* Generic container for arrival point or weight */ ntp_var_out=scl_mk_var(val_gnr_unn,NC_DOUBLE); int xtr_nbr_ntp_1; int xtr_nbr_ntp_2; var_sct ** var_ntp_1; var_sct ** var_ntp_2; /* Fill-in variable structure list for all variables named "ntp_nm" NOTE: using table from file 1 */ var_ntp_1=nco_var_trv(in_id_1,ntp_nm,&xtr_nbr_ntp_1,trv_tbl); var_ntp_2=nco_var_trv(in_id_2,ntp_nm,&xtr_nbr_ntp_2,trv_tbl); if (xtr_nbr_ntp_1) ntp_1=var_ntp_1[0]; if (xtr_nbr_ntp_2) ntp_2=var_ntp_2[0]; if(!xtr_nbr_ntp_1 || !xtr_nbr_ntp_2){ (void)fprintf(fp_stdout,"%s: ERROR Variable %s is not present in input file. ncflint assumes same file structure for both input files\n",nco_prg_nm_get(),ntp_nm); nco_exit(EXIT_FAILURE); } /* endif */ /* Read */ (void)nco_msa_var_get_trv(in_id_1,ntp_1,trv_tbl); (void)nco_msa_var_get_trv(in_id_2,ntp_2,trv_tbl); /* Currently, only support scalar variables */ if(ntp_1->sz > 1 || ntp_2->sz > 1){ (void)fprintf(stdout,"%s: ERROR interpolation variable %s must be scalar\n",nco_prg_nm_get(),ntp_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Weights must be NC_DOUBLE */ ntp_1=nco_var_cnf_typ((nc_type)NC_DOUBLE,ntp_1); ntp_2=nco_var_cnf_typ((nc_type)NC_DOUBLE,ntp_2); /* Check for degenerate case */ if(ntp_1->val.dp[0] == ntp_2->val.dp[0]){ (void)fprintf(stdout,"%s: ERROR Interpolation variable %s is identical (%g) in input files, therefore unable to interpolate.\n",nco_prg_nm_get(),ntp_nm,ntp_1->val.dp[0]); nco_exit(EXIT_FAILURE); } /* end if */ /* Turn weights into pseudo-variables */ wgt_1=nco_var_dpl(ntp_2); wgt_2=nco_var_dpl(ntp_var_out); /* Subtract to find interpolation distances */ (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_var_out->val,wgt_1->val); (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_1->val,wgt_2->val); (void)nco_var_sbt(ntp_1->type,ntp_1->sz,ntp_1->has_mss_val,ntp_1->mss_val,ntp_1->val,ntp_2->val); /* Normalize to obtain final interpolation weights */ (void)nco_var_dvd(wgt_1->type,wgt_1->sz,wgt_1->has_mss_val,wgt_1->mss_val,ntp_2->val,wgt_1->val); (void)nco_var_dvd(wgt_2->type,wgt_2->sz,wgt_2->has_mss_val,wgt_2->mss_val,ntp_2->val,wgt_2->val); for(idx=0;idx= nco_dbg_scl) (void)fprintf(stderr,"wgt_1 = %g, wgt_2 = %g\n",wgt_1->val.dp[0],wgt_2->val.dp[0]); /* Create structure list for second file */ var_prc_2=(var_sct **)nco_malloc(nbr_var_prc*sizeof(var_sct *)); /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; /* Loop over each interpolated variable */ #ifdef _OPENMP /* OpenMP notes: shared(): msk and wgt are not altered within loop private(): wgt_avg does not need initialization */ # pragma omp parallel for default(none) firstprivate(wgt_1,wgt_2,wgt_out_1,wgt_out_2) private(DO_CONFORM,idx,in_id_1,in_id_2,has_mss_val) shared(MUST_CONFORM,nco_dbg_lvl,fl_in_1,fl_in_2,fl_out,gpe,in_id_1_arr,in_id_2_arr,nbr_var_prc,out_id,nco_prg_nm,var_prc_1,var_prc_2,var_prc_out,nbr_dmn_fl,trv_tbl) #endif /* !_OPENMP */ for(idx=0;idx= nco_dbg_var) (void)fprintf(fp_stderr,"%s, ",var_prc_1[idx]->nm); if(nco_dbg_lvl >= nco_dbg_var) (void)fflush(fp_stderr); in_id_1=in_id_1_arr[omp_get_thread_num()]; in_id_2=in_id_2_arr[omp_get_thread_num()]; var_prc_2[idx]=nco_var_dpl(var_prc_1[idx]); /* Obtain variable GTT object using full variable name */ var_trv_1=trv_tbl_var_nm_fll(var_prc_1[idx]->nm_fll,trv_tbl); var_trv_2=trv_tbl_var_nm_fll(var_prc_2[idx]->nm_fll,trv_tbl); if(!var_trv_2){ (void)fprintf(fp_stdout,"%s: ERROR Variable %s is not present in second input file. ncflint assumes same structure for processed objects in both files\n",nco_prg_nm_get(),var_trv_1->nm_fll); nco_exit(EXIT_FAILURE); } /* endif */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(in_id_1,var_trv_1->grp_nm_fll,&grp_id_1); (void)nco_inq_grp_full_ncid(in_id_2,var_trv_2->grp_nm_fll,&grp_id_2); (void)nco_var_mtd_refresh(grp_id_2,var_prc_2[idx]); /* Read */ (void)nco_msa_var_get_trv(in_id_1,var_prc_1[idx],trv_tbl); (void)nco_msa_var_get_trv(in_id_2,var_prc_2[idx],trv_tbl); /* Set var_prc_1 and var_prc_2 to correct size */ var_prc_1[idx]->sz=var_prc_out[idx]->sz; var_prc_2[idx]->sz=var_prc_out[idx]->sz; /* Stretch second variable to match dimensions of first variable */ wgt_out_1=nco_var_cnf_dmn(var_prc_out[idx],wgt_1,wgt_out_1,MUST_CONFORM,&DO_CONFORM); wgt_out_2=nco_var_cnf_dmn(var_prc_out[idx],wgt_2,wgt_out_2,MUST_CONFORM,&DO_CONFORM); var_prc_1[idx]=nco_var_cnf_typ((nc_type)NC_DOUBLE,var_prc_1[idx]); var_prc_2[idx]=nco_var_cnf_typ((nc_type)NC_DOUBLE,var_prc_2[idx]); /* Allocate and, if necesssary, initialize space for processed variable */ var_prc_out[idx]->sz=var_prc_1[idx]->sz; /* NB: must not try to free() same tally buffer twice */ /* var_prc_out[idx]->tally=var_prc_1[idx]->tally=(long *)nco_malloc(var_prc_out[idx]->sz*sizeof(long int));*/ var_prc_out[idx]->tally=(long *)nco_malloc(var_prc_out[idx]->sz*sizeof(long int)); (void)nco_zero_long(var_prc_out[idx]->sz,var_prc_out[idx]->tally); /* Weight variable by taking product of weight with variable */ (void)nco_var_mlt(var_prc_1[idx]->type,var_prc_1[idx]->sz,var_prc_1[idx]->has_mss_val,var_prc_1[idx]->mss_val,wgt_out_1->val,var_prc_1[idx]->val); (void)nco_var_mlt(var_prc_2[idx]->type,var_prc_2[idx]->sz,var_prc_2[idx]->has_mss_val,var_prc_2[idx]->mss_val,wgt_out_2->val,var_prc_2[idx]->val); /* Change missing_value of var_prc_2, if any, to missing_value of var_prc_1, if any */ has_mss_val=nco_mss_val_cnf(var_prc_1[idx],var_prc_2[idx]); /* NB: fxm: use tally to determine when to "unweight" answer? TODO */ (void)nco_var_add_tll_ncflint(var_prc_1[idx]->type,var_prc_1[idx]->sz,has_mss_val,var_prc_1[idx]->mss_val,var_prc_out[idx]->tally,var_prc_1[idx]->val,var_prc_2[idx]->val); /* Re-cast output variable to original type */ var_prc_2[idx]=nco_var_cnf_typ(var_prc_out[idx]->type,var_prc_2[idx]); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,var_trv_1->grp_nm_fll); else grp_out_fll=(char *)strdup(var_trv_1->grp_nm_fll); /* Obtain output group ID */ (void)nco_inq_grp_full_ncid(out_id,grp_out_fll,&grp_out_id); /* Memory management after current extracted group */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); /* Get variable ID */ (void)nco_inq_varid(grp_out_id,var_trv_1->nm,&var_out_id); /* Store the output variable ID */ var_prc_out[idx]->id=var_out_id; if(var_trv_1->ppc != NC_MAX_INT){ if(var_trv_1->flg_nsd) (void)nco_ppc_bitmask(var_trv_1->ppc,var_prc_2[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_2[idx]->val); else (void)nco_ppc_around(var_trv_1->ppc,var_prc_2[idx]->type,var_prc_out[idx]->sz,var_prc_out[idx]->has_mss_val,var_prc_out[idx]->mss_val,var_prc_2[idx]->val); } /* endif ppc */ if(nco_is_xcp(var_trv_1->nm)) nco_xcp_prc(var_trv_1->nm,var_prc_2[idx]->type,var_prc_out[idx]->sz,(char *)var_prc_2[idx]->val.vp); #ifdef _OPENMP # pragma omp critical #endif /* _OPENMP */ { /* begin OpenMP critical */ /* Copy interpolations to output file */ if(!var_prc_out[idx]->nbr_dim) (void)nco_put_var1(grp_out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_2[idx]->val.vp,var_prc_2[idx]->type); else (void)nco_put_vara(grp_out_id,var_prc_out[idx]->id,var_prc_out[idx]->srt,var_prc_out[idx]->cnt,var_prc_2[idx]->val.vp,var_prc_2[idx]->type); } /* end OpenMP critical */ /* Free dynamically allocated buffers */ if(var_prc_1[idx]) var_prc_1[idx]=nco_var_free(var_prc_1[idx]); if(var_prc_2[idx]) var_prc_2[idx]=nco_var_free(var_prc_2[idx]); if(var_prc_out[idx]) var_prc_out[idx]=nco_var_free(var_prc_out[idx]); } /* end (OpenMP parallel for) loop over idx */ if(nco_dbg_lvl >= nco_dbg_var) (void)fprintf(stderr,"\n"); /* Close input netCDF files */ for(thr_idx=0;thr_idx 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) cnk.cnk_dmn=(cnk_dmn_sct **)nco_cnk_lst_free(cnk.cnk_dmn,cnk_nbr); var=(var_sct **)nco_free(var); var_out=(var_sct **)nco_free(var_out); var_prc_out=(var_sct **)nco_free(var_prc_out); if(nbr_var_fix > 0) var_fix=nco_var_lst_free(var_fix,nbr_var_fix); if(nbr_var_fix > 0) var_fix_out=nco_var_lst_free(var_fix_out,nbr_var_fix); trv_tbl_free(trv_tbl); for(idx=0;idx /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard C headers */ #include /* assert() */ #include /* stderr, FILE, NULL, etc. */ #include /* atof, atoi, malloc, getopt */ #include /* strcmp() */ #include /* stat() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif #ifndef HAVE_GETOPT_LONG # include "nco_getopt.h" #else /* HAVE_GETOPT_LONG */ # ifdef HAVE_GETOPT_H # include # endif /* !HAVE_GETOPT_H */ #endif /* HAVE_GETOPT_LONG */ #ifdef I18N # include /* nl_langinfo() */ # include /* Internationalization i18n */ # include /* Locale setlocale() */ # define _(sng) gettext (sng) # define gettext_noop(sng) (sng) # define N_(sng) gettext_noop(sng) #endif /* I18N */ /* Supply stub gettext() function in case i18n failed */ #ifndef _LIBINTL_H # define gettext(foo) foo #endif /* _LIBINTL_H */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef ENABLE_MPI # include /* MPI definitions */ # include /* Parallel netCDF definitions */ # include "nco_mpi.h" /* MPI utilities */ #endif /* !ENABLE_MPI */ /* Personal headers */ /* #define MAIN_PROGRAM_FILE MUST precede #include libnco.h */ #define MAIN_PROGRAM_FILE #include "libnco.h" /* netCDF Operator (NCO) library */ int main(int argc,char **argv) { char **fl_lst_abb=NULL; /* Option a */ char **fl_lst_in; char **gaa_arg=NULL; /* [sng] Global attribute arguments */ char **grp_lst_in=NULL; char **rgr_arg=NULL; /* [sng] Regridding arguments */ char **var_lst_in=NULL; char **xtn_lst_in=NULL; /* [sng] Extensive variables */ char *aux_arg[NC_MAX_DIMS]; char *cmd_ln; char *cnk_arg[NC_MAX_DIMS]; char *cnk_map_sng=NULL_CEWI; /* [sng] Chunking map */ char *cnk_plc_sng=NULL_CEWI; /* [sng] Chunking policy */ char *dlm_sng=NULL; char *fl_bnr=NULL; /* [sng] Unformatted binary output file */ char *fl_in=NULL; char *fl_out=NULL; /* Option o */ char *fl_out_tmp=NULL_CEWI; char *fl_pth=NULL; /* Option p */ char *fl_pth_lcl=NULL; /* Option l */ char *fl_scrip=NULL; /* [sng] SCRIP file name */ char *lmt_arg[NC_MAX_DIMS]; char *opt_crr=NULL; /* [sng] String representation of current long-option name */ char *optarg_lcl=NULL; /* [sng] Local copy of system optarg */ char *ppc_arg[NC_MAX_VARS]; /* [sng] PPC arguments */ char *rec_dmn_nm=NULL; /* [sng] Record dimension name */ char *rec_dmn_nm_fix=NULL; /* [sng] Record dimension name (Original input name without _fix prefix) */ char *rgr_in=NULL; /* [sng] File containing fields to be regridded */ char *rgr_out=NULL; /* [sng] File containing regridded fields */ char *rgr_grd_src=NULL; /* [sng] File containing input grid */ char *rgr_grd_dst=NULL; /* [sng] File containing destination grid */ char *rgr_map=NULL; /* [sng] File containing mapping weights from source to destination grid */ char *rgr_var=NULL; /* [sng] Variable for special regridding treatment */ char *smr_sng=NULL; /* [sng] File summary string */ char *smr_xtn_sng=NULL; /* [sng] File extended summary string */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char *spr_chr=NULL; /* [sng] Separator for XML character types */ char *spr_nmr=NULL; /* [sng] Separator for XML numeric types */ char trv_pth[]="/"; /* [sng] Root path of traversal tree */ const char * const CVS_Id="$Id$"; const char * const CVS_Revision="$Revision$"; const char * const opt_sht_lst="34567aABb:CcD:d:FG:g:HhL:l:MmOo:Pp:qQrRs:t:uVv:X:xz-:"; cnk_sct cnk; /* [sct] Chunking structure */ #if defined(__cplusplus) || defined(PGI_CC) ddra_info_sct ddra_info; ddra_info.flg_ddra=False; #else /* !__cplusplus */ ddra_info_sct ddra_info={.flg_ddra=False}; #endif /* !__cplusplus */ double wgt_vld_thr=NC_MIN_DOUBLE; /* [frc] Weight threshold for valid destination value */ extern char *optarg; extern int optind; FILE *fp_bnr=NULL; /* [fl] Unformatted binary output file handle */ gpe_sct *gpe=NULL; /* [sng] Group Path Editing (GPE) structure */ int *in_id_arr; /* [id] netCDF file IDs used by OpenMP code */ int abb_arg_nbr=0; int att_glb_nbr; int att_grp_nbr; int att_var_nbr; int aux_nbr=0; /* [nbr] Number of auxiliary coordinate hyperslabs specified */ int cnk_map=nco_cnk_map_nil; /* [enm] Chunking map */ int cnk_nbr=0; /* [nbr] Number of chunk sizes */ int cnk_plc=nco_cnk_plc_nil; /* [enm] Chunking policy */ int dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ int dmn_nbr_fl; int dmn_rec_fl; int fl_in_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Input file format */ int fl_nbr=0; int fl_out_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Output file format */ int fll_md_old; /* [enm] Old fill mode */ int gaa_nbr=0; /* [nbr] Number of global attributes to add */ int grp_dpt_fl; /* [nbr] Maximum group depth (root = 0) */ int grp_lst_in_nbr=0; /* [nbr] Number of groups explicitly specified by user */ int grp_nbr_fl; int idx; int in_id; int lmt_nbr=0; /* Option d. NB: lmt_nbr gets incremented */ int md_open; /* [enm] Mode flag for nc_open() call */ int opt; int ppc_nbr=0; /* [nbr] Number of PPC arguments */ int rgr_nbr=0; /* [nbr] Number of regridding arguments */ int rcd=NC_NOERR; /* [rcd] Return code */ int thr_idx; /* [idx] Index of current thread */ int thr_nbr=int_CEWI; /* [nbr] Thread number Option t */ int var_lst_in_nbr=0; int var_nbr_fl; int var_ntm_fl; int xtn_nbr=0; /* [nbr] Number of extensive variables */ int xtr_nbr=0; /* xtr_nbr will not otherwise be set for -c with no -v */ kvm_sct *sld_nfo=NULL; /* [sct] Container for SLD/SCRIP information */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ nco_bool ALPHABETIZE_OUTPUT=True; /* Option a */ nco_bool CPY_GRP_METADATA; /* [flg] Copy group metadata (attributes) */ nco_bool EXCLUDE_INPUT_LIST=False; /* Option x */ nco_bool EXTRACT_ALL_COORDINATES=False; /* Option c */ nco_bool EXTRACT_ASSOCIATED_COORDINATES=True; /* Option C */ nco_bool FL_RTR_RMT_LCN; nco_bool FL_LST_IN_FROM_STDIN=False; /* [flg] fl_lst_in comes from stdin */ nco_bool FORCE_APPEND=False; /* Option A */ nco_bool FORCE_NOCLOBBER=False; /* Option no-clobber */ nco_bool FORCE_OVERWRITE=False; /* Option O */ nco_bool FORTRAN_IDX_CNV=False; /* Option F */ nco_bool GET_GRP_INFO=False; /* [flg] Iterate file, get group extended information */ nco_bool GET_FILE_INFO=False; /* [flg] Get file information (#groups, #dimensions, #attributes, #variables) */ nco_bool GET_LIST=False; /* [flg] Iterate file, print variables and exit */ nco_bool GRP_VAR_UNN=False; /* [flg] Select union of specified groups and variables */ nco_bool GRP_XTR_VAR_XCL=False; /* [flg] Extract matching groups, exclude matching variables */ nco_bool HISTORY_APPEND=True; /* Option h */ nco_bool HAVE_LIMITS=False; /* [flg] Are there user limits? (-d) */ nco_bool MSA_USR_RDR=False; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ nco_bool PRN_CDL=False; /* [flg] Print CDL */ nco_bool PRN_HDN=False; /* [flg] Print hidden attributes */ nco_bool PRN_SRM=False; /* [flg] Print ncStream */ nco_bool PRN_JSN=False; /* [flg] Print JSON */ nco_bool PRN_XML=False; /* [flg] Print XML (NcML) */ nco_bool PRN_XML_LOCATION=True; /* [flg] Print XML location tag */ nco_bool PRN_DMN_IDX_CRD_VAL=True; /* [flg] Print leading dimension/coordinate indices/values Option Q */ nco_bool PRN_DMN_UNITS=True; /* [flg] Print dimensional units Option u */ nco_bool PRN_DMN_VAR_NM=True; /* [flg] Print dimension/variable names */ nco_bool PRN_DMN_UNITS_TGL=False; /* [flg] Toggle print dimensional units Option u */ nco_bool PRN_GLB_METADATA=False; /* [flg] Print global metadata */ nco_bool PRN_GLB_METADATA_TGL=False; /* [flg] Toggle print global metadata Option M */ nco_bool PRN_MSS_VAL_BLANK=True; /* [flg] Print missing values as blanks */ nco_bool PRN_QUENCH=False; /* [flg] Quench (turn-off) all printing to screen */ nco_bool PRN_VAR_DATA=False; /* [flg] Print variable data */ nco_bool PRN_VAR_DATA_TGL=False; /* [flg] Toggle print variable data Option H */ nco_bool PRN_VAR_METADATA=False; /* [flg] Print variable metadata */ nco_bool PRN_VAR_METADATA_TGL=False; /* [flg] Toggle print variable metadata Option m */ nco_bool PRN_VRB=False; /* [flg] Print data and metadata by default */ nco_bool PRN_NEW_FMT=False; /* [flg] Print using new print format */ nco_bool RETAIN_ALL_DIMS=False; /* [flg] Retain all dimensions */ nco_bool RAM_CREATE=False; /* [flg] Create file in RAM */ nco_bool RAM_OPEN=False; /* [flg] Open (netCDF3-only) file(s) in RAM */ nco_bool RM_RMT_FL_PST_PRC=True; /* Option R */ nco_bool WRT_TMP_FL=True; /* [flg] Write output to temporary file */ nco_bool flg_cln=True; /* [flg] Clean memory prior to exit */ nco_bool flg_rgr=False; /* [flg] Regrid */ size_t bfr_sz_hnt=NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ size_t cnk_min_byt=NCO_CNK_SZ_MIN_BYT_DFL; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt=0UL; /* [B] Chunk size in bytes */ size_t cnk_sz_scl=0UL; /* [nbr] Chunk size scalar */ size_t hdr_pad=0UL; /* [B] Pad at end of header section */ trv_tbl_sct *trv_tbl=NULL; /* [lst] Traversal table */ nco_dmn_dne_t *flg_dne=NULL; /* [lst] Flag to check if input dimension -d "does not exist" */ #ifdef ENABLE_MPI /* Declare all MPI-specific variables here */ MPI_Comm mpi_cmm=MPI_COMM_WORLD; /* [prc] Communicator */ int prc_rnk; /* [idx] Process rank */ int prc_nbr=0; /* [nbr] Number of MPI processes */ #endif /* !ENABLE_MPI */ static struct option opt_lng[]={ /* Structure ordered by short option key if possible */ /* Long options with no argument, no short option counterpart */ {"cdl",no_argument,0,0}, /* [flg] Print CDL */ {"cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"clean",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"mmr_cln",no_argument,0,0}, /* [flg] Clean memory prior to exit */ {"drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"dirty",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"mmr_drt",no_argument,0,0}, /* [flg] Allow dirty memory on exit */ {"cmp",no_argument,0,0}, {"compiler",no_argument,0,0}, {"copyright",no_argument,0,0}, {"cpy",no_argument,0,0}, {"license",no_argument,0,0}, {"hdf4",no_argument,0,0}, /* [flg] Treat file as HDF4 */ {"hdn",no_argument,0,0}, /* [flg] Print hidden attributes */ {"hidden",no_argument,0,0}, /* [flg] Print hidden attributes */ {"id",no_argument,0,0}, /* [flg] Print normally hidden information, like file, group, and variable IDs */ {"lbr",no_argument,0,0}, {"library",no_argument,0,0}, {"md5_dgs",no_argument,0,0}, /* [flg] Perform MD5 digests */ {"md5_digest",no_argument,0,0}, /* [flg] Perform MD5 digests */ {"md5_wrt_att",no_argument,0,0}, /* [flg] Write MD5 digests as attributes */ {"md5_write_attribute",no_argument,0,0}, /* [flg] Write MD5 digests as attributes */ {"mpi_implementation",no_argument,0,0}, {"msa_usr_rdr",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"msa_user_order",no_argument,0,0}, /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ {"no_blank",no_argument,0,0}, /* [flg] Print numeric missing values */ {"no-blank",no_argument,0,0}, /* [flg] Print numeric missing values */ {"noblank",no_argument,0,0}, /* [flg] Print numeric missing values */ {"no_clb",no_argument,0,0}, {"noclobber",no_argument,0,0}, {"no-clobber",no_argument,0,0}, {"no_clobber",no_argument,0,0}, {"no_dmn_var_nm",no_argument,0,0}, /* [flg] Omit variable and dimension names and indices but print all values */ {"no_nm_prn",no_argument,0,0}, /* [flg] Omit variable and dimension names and indices but print all values */ {"rad",no_argument,0,0}, /* [flg] Retain all dimensions */ {"retain_all_dimensions",no_argument,0,0}, /* [flg] Retain all dimensions */ {"orphan_dimensions",no_argument,0,0}, /* [flg] Retain all dimensions */ {"rph_dmn",no_argument,0,0}, /* [flg] Retain all dimensions */ {"ram_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"create_ram",no_argument,0,0}, /* [flg] Create file in RAM */ {"open_ram",no_argument,0,0}, /* [flg] Open (netCDF3) file(s) in RAM */ {"diskless_all",no_argument,0,0}, /* [flg] Open (netCDF3) and create file(s) in RAM */ {"secret",no_argument,0,0}, {"shh",no_argument,0,0}, {"srm",no_argument,0,0}, /* [flg] Print ncStream */ {"sysconf",no_argument,0,0}, /* [flg] Perform sysconf() test */ {"wrt_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"write_tmp_fl",no_argument,0,0}, /* [flg] Write output to temporary file */ {"no_tmp_fl",no_argument,0,0}, /* [flg] Do not write output to temporary file */ {"intersection",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"nsx",no_argument,0,0}, /* [flg] Select intersection of specified groups and variables */ {"union",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"unn",no_argument,0,0}, /* [flg] Select union of specified groups and variables */ {"grp_xtr_var_xcl",no_argument,0,0}, /* [flg] Extract matching groups, exclude matching variables */ {"version",no_argument,0,0}, {"vrs",no_argument,0,0}, {"jsn",no_argument,0,0}, /* [flg] Print JSON */ {"json",no_argument,0,0}, /* [flg] Print JSON */ {"w10",no_argument,0,0}, /* [flg] Print JSON */ {"w10n",no_argument,0,0}, /* [flg] Print JSON */ {"xml",no_argument,0,0}, /* [flg] Print XML (NcML) */ {"ncml",no_argument,0,0}, /* [flg] Print XML (NcML) */ {"xml_no_location",no_argument,0,0}, /* [flg] Omit XML location tag */ {"ncml_no_location",no_argument,0,0}, /* [flg] Omit XML location tag */ /* Long options with argument, no short option counterpart */ {"bfr_sz_hnt",required_argument,0,0}, /* [B] Buffer size hint */ {"buffer_size_hint",required_argument,0,0}, /* [B] Buffer size hint */ {"cnk_byt",required_argument,0,0}, /* [B] Chunk size in bytes */ {"chunk_byte",required_argument,0,0}, /* [B] Chunk size in bytes */ {"cnk_dmn",required_argument,0,0}, /* [nbr] Chunk size */ {"chunk_dimension",required_argument,0,0}, /* [nbr] Chunk size */ {"cnk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"chunk_map",required_argument,0,0}, /* [nbr] Chunking map */ {"cnk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"chunk_min",required_argument,0,0}, /* [B] Minimize size of variable to chunk */ {"cnk_plc",required_argument,0,0}, /* [nbr] Chunking policy */ {"chunk_policy",required_argument,0,0}, /* [nbr] Chunking policy */ {"cnk_scl",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"chunk_scalar",required_argument,0,0}, /* [nbr] Chunk size scalar */ {"fl_fmt",required_argument,0,0}, {"file_format",required_argument,0,0}, {"fix_rec_dmn",required_argument,0,0}, /* [sng] Fix record dimension */ {"no_rec_dmn",required_argument,0,0}, /* [sng] Fix record dimension */ {"gaa",required_argument,0,0}, /* [sng] Global attribute add */ {"glb_att_add",required_argument,0,0}, /* [sng] Global attribute add */ {"hdr_pad",required_argument,0,0}, {"header_pad",required_argument,0,0}, {"mk_rec_dmn",required_argument,0,0}, /* [sng] Name of record dimension in output */ {"mk_rec_dim",required_argument,0,0}, /* [sng] Name of record dimension in output */ {"ppc",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"precision_preserving_compression",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"quantize",required_argument,0,0}, /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ {"rgr",required_argument,0,0}, /* [sng] Regridding */ {"regridding",required_argument,0,0}, /* [sng] Regridding */ {"rgr_in",required_argument,0,0}, /* [sng] File containing fields to be regridded */ {"rgr_grd_src",required_argument,0,0}, /* [sng] File containing input grid */ {"rgr_grd_dst",required_argument,0,0}, /* [sng] File containing destination grid */ {"rgr_map",required_argument,0,0}, /* [sng] File containing mapping weights from source to destination grid */ {"map_file",required_argument,0,0}, /* [sng] File containing mapping weights from source to destination grid */ {"rgr_var",required_argument,0,0}, /* I [sng] Variable for special regridding treatment */ {"rgr_rnr",required_argument,0,0}, /* [flg] Renormalize destination values by valid area */ {"rnr",required_argument,0,0}, /* [flg] Renormalize destination values by valid area */ {"renormalize",required_argument,0,0}, /* [flg] Renormalize destination values by valid area */ {"scrip",required_argument,0,0}, /* SCRIP file */ {"tst_udunits",required_argument,0,0}, {"xml_spr_chr",required_argument,0,0}, /* [flg] Separator for XML character types */ {"xml_spr_nmr",required_argument,0,0}, /* [flg] Separator for XML numeric types */ {"xtn_var_lst",required_argument,0,0}, /* [sng] Extensive variables */ {"extensive",required_argument,0,0}, /* [sng] Extensive variables */ /* Long options with short counterparts */ {"3",no_argument,0,'3'}, {"4",no_argument,0,'4'}, {"64bit",no_argument,0,'4'}, {"netcdf4",no_argument,0,'4'}, {"pnetcdf",no_argument,0,'5'}, {"5",no_argument,0,'5'}, {"7",no_argument,0,'7'}, {"abc",no_argument,0,'a'}, {"alphabetize",no_argument,0,'a'}, {"append",no_argument,0,'A'}, {"apn",no_argument,0,'A'}, {"bnr",required_argument,0,'b'}, {"binary",required_argument,0,'b'}, {"binary-file",required_argument,0,'b'}, {"fl_bnr",required_argument,0,'b'}, {"coords",no_argument,0,'c'}, {"crd",no_argument,0,'c'}, {"no-coords",no_argument,0,'C'}, {"no-crd",no_argument,0,'C'}, {"data",required_argument,0,'H'}, {"debug",required_argument,0,'D'}, {"dbg_lvl",required_argument,0,'D'}, {"nco_dbg_lvl",required_argument,0,'D'}, {"dimension",required_argument,0,'d'}, {"dmn",required_argument,0,'d'}, {"fortran",no_argument,0,'F'}, {"ftn",no_argument,0,'F'}, {"gpe",required_argument,0,'G'}, /* [sng] Group Path Edit (GPE) */ {"grp",required_argument,0,'g'}, {"group",required_argument,0,'g'}, {"history",no_argument,0,'h'}, {"hst",no_argument,0,'h'}, {"hieronymus",no_argument,0,'H'}, /* fxm: need better mnemonic for -H */ {"dfl_lvl",required_argument,0,'L'}, /* [enm] Deflate level */ {"deflate",required_argument,0,'L'}, /* [enm] Deflate level */ {"lcl",required_argument,0,'l'}, {"local",required_argument,0,'l'}, {"metadata",no_argument,0,'m'}, {"mtd",no_argument,0,'m'}, {"Metadata",no_argument,0,'M'}, {"Mtd",no_argument,0,'M'}, {"overwrite",no_argument,0,'O'}, {"ovr",no_argument,0,'O'}, {"output",required_argument,0,'o'}, {"fl_out",required_argument,0,'o'}, {"print",required_argument,0,'P'}, {"prn",required_argument,0,'P'}, {"path",required_argument,0,'p'}, {"quench",no_argument,0,'q'}, {"quiet",no_argument,0,'Q'}, {"retain",no_argument,0,'R'}, {"rtn",no_argument,0,'R'}, {"revision",no_argument,0,'r'}, {"spinlock",no_argument,0,'S'}, /* [flg] Suspend with signal handler to facilitate debugging */ {"sng_fmt",required_argument,0,'s'}, {"string",required_argument,0,'s'}, {"thr_nbr",required_argument,0,'t'}, {"threads",required_argument,0,'t'}, {"omp_num_threads",required_argument,0,'t'}, {"units",no_argument,0,'u'}, {"var_val",no_argument,0,'V'}, /* [flg] Print variable values only */ {"variable",required_argument,0,'v'}, {"auxiliary",required_argument,0,'X'}, {"exclude",no_argument,0,'x'}, {"xcl",no_argument,0,'x'}, {"help",no_argument,0,'?'}, {"hlp",no_argument,0,'?'}, {"get_grp_info",no_argument,0,0}, {"get_file_info",no_argument,0,0}, {"lbr_rcd",no_argument,0,0}, {0,0,0,0} }; /* end opt_lng */ int opt_idx=0; /* Index of current long option into opt_lng array */ #ifdef _LIBINTL_H setlocale(LC_ALL,""); /* LC_ALL sets all localization tokens to same value */ bindtextdomain("nco","/home/zender/share/locale"); /* ${LOCALEDIR} is e.g., /usr/share/locale */ /* MO files should be in ${LOCALEDIR}/es/LC_MESSAGES */ textdomain("nco"); /* PACKAGE is name of program or library */ #endif /* not _LIBINTL_H */ /* Start timer and save command line */ ddra_info.tmr_flg=nco_tmr_srt; rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_mtd; cmd_ln=nco_cmd_ln_sng(argc,argv); /* Get program name and set program enum (e.g., nco_prg_id=ncra) */ nco_prg_nm=nco_prg_prs(argv[0],&nco_prg_id); /* MPI I/O: Either Parallel netCDF (PnetCDF) or HDF5-based export NETCDF_ROOT=/usr/local/parallel;export NETCDF_INC=/usr/local/parallel/include;export NETCDF_LIB=/usr/local/parallel/lib;export NETCDF4_ROOT=/usr/local/parallel; cd ~/nco/bld;make MPI=Y;cd - LD_LIBRARY_PATH=/usr/local/parallel/lib\:${LD_LIBRARY_PATH} ldd `which ncks` ncks -O -5 ~/nco/data/in.nc ~/foo.nc # PnetCDF mpiexec -n 1 ncks -O -4 ~/nco/data/in.nc ~/foo.nc # HDF5 od -An -c -N4 ~/foo.nc */ #ifdef ENABLE_MPI /* MPI Initialization */ if(False) (void)fprintf(stdout,gettext("%s: WARNING Compiled with MPI\n"),nco_prg_nm); MPI_Init(&argc,&argv); MPI_Comm_size(mpi_cmm,&prc_nbr); MPI_Comm_rank(mpi_cmm,&prc_rnk); #endif /* !ENABLE_MPI */ /* Parse command line arguments */ while(1){ /* getopt_long_only() allows one dash to prefix long options */ opt=getopt_long(argc,argv,opt_sht_lst,opt_lng,&opt_idx); /* NB: access to opt_crr is only valid when long_opt is detected */ if(opt == EOF) break; /* Parse positional arguments once getopt_long() returns EOF */ opt_crr=(char *)strdup(opt_lng[opt_idx].name); /* Process long options without short option counterparts */ if(opt == 0){ if(!strcmp(opt_crr,"bfr_sz_hnt") || !strcmp(opt_crr,"buffer_size_hint")){ bfr_sz_hnt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif bfr_sz */ if(!strcmp(opt_crr,"cnk_byt") || !strcmp(opt_crr,"chunk_byte")){ cnk_sz_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_byt */ if(!strcmp(opt_crr,"cnk_min") || !strcmp(opt_crr,"chunk_min")){ cnk_min_byt=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_min */ if(!strcmp(opt_crr,"cnk_dmn") || !strcmp(opt_crr,"chunk_dimension")){ /* Copy limit argument for later processing */ cnk_arg[cnk_nbr]=(char *)strdup(optarg); cnk_nbr++; } /* endif cnk_dmn */ if(!strcmp(opt_crr,"cnk_scl") || !strcmp(opt_crr,"chunk_scalar")){ cnk_sz_scl=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif cnk_scl */ if(!strcmp(opt_crr,"cnk_map") || !strcmp(opt_crr,"chunk_map")){ /* Chunking map */ cnk_map_sng=(char *)strdup(optarg); cnk_map=nco_cnk_map_get(cnk_map_sng); } /* endif cnk_map */ if(!strcmp(opt_crr,"cnk_plc") || !strcmp(opt_crr,"chunk_policy")){ /* Chunking policy */ cnk_plc_sng=(char *)strdup(optarg); cnk_plc=nco_cnk_plc_get(cnk_plc_sng); } /* endif cnk_plc */ if(!strcmp(opt_crr,"cmp") || !strcmp(opt_crr,"compiler")){ (void)fprintf(stdout,"%s\n",nco_cmp_get()); nco_exit(EXIT_SUCCESS); } /* endif "cmp" */ if(!strcmp(opt_crr,"cpy") || !strcmp(opt_crr,"copyright") || !strcmp(opt_crr,"license")){ (void)nco_cpy_prn(); nco_exit(EXIT_SUCCESS); } /* endif "copyright" */ if(!strcmp(opt_crr,"cdl")) PRN_CDL=True; /* [flg] Print CDL */ if(!strcmp(opt_crr,"cln") || !strcmp(opt_crr,"mmr_cln") || !strcmp(opt_crr,"clean")) flg_cln=True; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"drt") || !strcmp(opt_crr,"mmr_drt") || !strcmp(opt_crr,"dirty")) flg_cln=False; /* [flg] Clean memory prior to exit */ if(!strcmp(opt_crr,"fix_rec_dmn") || !strcmp(opt_crr,"no_rec_dmn")){ const char fix_pfx[]="fix_"; /* [sng] Prefix string to fix dimension */ rec_dmn_nm=(char *)nco_malloc((strlen(fix_pfx)+strlen(optarg)+1L)*sizeof(char)); rec_dmn_nm=strcpy(rec_dmn_nm,fix_pfx); rec_dmn_nm=strcat(rec_dmn_nm,optarg); rec_dmn_nm_fix=strdup(optarg); } /* endif fix_rec_dmn */ if(!strcmp(opt_crr,"fl_fmt") || !strcmp(opt_crr,"file_format")) rcd=nco_create_mode_prs(optarg,&fl_out_fmt); if(!strcmp(opt_crr,"gaa") || !strcmp(opt_crr,"glb_att_add")){ gaa_arg=(char **)nco_realloc(gaa_arg,(gaa_nbr+1)*sizeof(char *)); gaa_arg[gaa_nbr++]=(char *)strdup(optarg); } /* endif gaa */ if(!strcmp(opt_crr,"get_grp_info") || !strcmp(opt_crr,"grp_info_get")) GET_GRP_INFO=True; if(!strcmp(opt_crr,"get_file_info")) GET_FILE_INFO=True; if(!strcmp(opt_crr,"hdf4")) nco_fmt_xtn=nco_fmt_xtn_hdf4; /* [enm] Treat file as HDF4 */ if(!strcmp(opt_crr,"hdn") || !strcmp(opt_crr,"hidden")) PRN_HDN=True; /* [flg] Print hidden attributes */ if(!strcmp(opt_crr,"hdr_pad") || !strcmp(opt_crr,"header_pad")){ hdr_pad=strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); } /* endif "hdr_pad" */ if(!strcmp(opt_crr,"lbr") || !strcmp(opt_crr,"library")){ (void)nco_lbr_vrs_prn(); nco_exit(EXIT_SUCCESS); } /* endif "lbr" */ if(!strcmp(opt_crr,"lbr_rcd")) nco_exit_lbr_rcd(); if(!strcmp(opt_crr,"scrip")){ fl_scrip=strdup(optarg); sld_nfo=(kvm_sct *)nco_malloc(BUFSIZ*sizeof(kvm_sct)); nco_scrip_read(fl_scrip,sld_nfo); } /* endif "scrip" */ if(!strcmp(opt_crr,"mk_rec_dmn") || !strcmp(opt_crr,"mk_rec_dim")) rec_dmn_nm=strdup(optarg); if(!strcmp(opt_crr,"mpi_implementation")){ (void)fprintf(stdout,"%s\n",nco_mpi_get()); nco_exit(EXIT_SUCCESS); } /* endif "mpi" */ if(!strcmp(opt_crr,"md5_dgs") || !strcmp(opt_crr,"md5_digest")){ if(!md5) md5=nco_md5_ini(); md5->dgs=True; if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Will perform MD5 digests of input and output hyperslabs\n",nco_prg_nm_get()); } /* endif "md5_dgs" */ if(!strcmp(opt_crr,"md5_wrt_att") || !strcmp(opt_crr,"md5_write_attribute")){ if(!md5) md5=nco_md5_ini(); md5->wrt=md5->dgs=True; if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Will write MD5 digests as attributes\n",nco_prg_nm_get()); } /* endif "md5_wrt_att" */ if(!strcmp(opt_crr,"msa_usr_rdr") || !strcmp(opt_crr,"msa_user_order")) MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ if(!strcmp(opt_crr,"no_blank") || !strcmp(opt_crr,"no-blank") || !strcmp(opt_crr,"noblank")) PRN_MSS_VAL_BLANK=!PRN_MSS_VAL_BLANK; if(!strcmp(opt_crr,"no_clb") || !strcmp(opt_crr,"no-clobber") || !strcmp(opt_crr,"no_clobber") || !strcmp(opt_crr,"noclobber")) FORCE_NOCLOBBER=!FORCE_NOCLOBBER; if(!strcmp(opt_crr,"no_nm_prn") || !strcmp(opt_crr,"no_dmn_var_nm")) PRN_DMN_VAR_NM=False; /* endif "no_nm_prn" */ if(!strcmp(opt_crr,"ppc") || !strcmp(opt_crr,"precision_preserving_compression") || !strcmp(opt_crr,"quantize")) ppc_arg[ppc_nbr++]=(char *)strdup(optarg); if(!strcmp(opt_crr,"rad") || !strcmp(opt_crr,"retain_all_dimensions") || !strcmp(opt_crr,"orphan_dimensions") || !strcmp(opt_crr,"rph_dmn")) RETAIN_ALL_DIMS=True; if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"create_ram") || !strcmp(opt_crr,"diskless_all")) RAM_CREATE=True; /* [flg] Open (netCDF3) file(s) in RAM */ if(!strcmp(opt_crr,"ram_all") || !strcmp(opt_crr,"open_ram") || !strcmp(opt_crr,"diskless_all")) RAM_OPEN=True; /* [flg] Create file in RAM */ if(!strcmp(opt_crr,"rgr") || !strcmp(opt_crr,"regridding")){ flg_rgr=True; rgr_arg=(char **)nco_realloc(rgr_arg,(rgr_nbr+1)*sizeof(char *)); rgr_arg[rgr_nbr++]=(char *)strdup(optarg); } /* endif "rgr" */ if(!strcmp(opt_crr,"rgr_in")) rgr_in=(char *)strdup(optarg); if(!strcmp(opt_crr,"rgr_grd_src")) rgr_grd_src=(char *)strdup(optarg); if(!strcmp(opt_crr,"rgr_grd_dst")) rgr_grd_dst=(char *)strdup(optarg); if(!strcmp(opt_crr,"rgr_map") || !strcmp(opt_crr,"map_file")){ flg_rgr=True; rgr_map=(char *)strdup(optarg); } /* endif rgr_map */ if(!strcmp(opt_crr,"rnr") || !strcmp(opt_crr,"rgr_rnr") || !strcmp(opt_crr,"renormalize")){ wgt_vld_thr=strtod(optarg,&sng_cnv_rcd); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtod",sng_cnv_rcd); } /* endif rgr_rnr */ if(!strcmp(opt_crr,"rgr_var")){ flg_rgr=True; rgr_var=(char *)strdup(optarg); } /* !rgr_var */ if(!strcmp(opt_crr,"secret") || !strcmp(opt_crr,"scr") || !strcmp(opt_crr,"shh")){ (void)fprintf(stdout,"Hidden/unsupported NCO options:\nCompiler used\t\t--cmp, --compiler\nCopyright\t\t--cpy, --copyright, --license\nHidden functions\t--scr, --ssh, --secret\nLibrary used\t\t--lbr, --library\nMemory clean\t\t--mmr_cln, --cln, --clean\nMemory dirty\t\t--mmr_drt, --drt, --dirty\nMPI implementation\t--mpi_implementation\nNo-clobber files\t--no_clb, --no-clobber\nPseudonym\t\t--pseudonym, -Y (ncra only)\nSpinlock\t\t--spinlock\nStreams\t\t\t--srm\nSysconf\t\t\t--sysconf\nTest UDUnits\t\t--tst_udunits,'units_in','units_out','cln_sng'? \nVersion\t\t\t--vrs, --version\n\n"); nco_exit(EXIT_SUCCESS); } /* endif "shh" */ if(!strcmp(opt_crr,"srm")) PRN_SRM=True; /* [flg] Print ncStream */ if(!strcmp(opt_crr,"sysconf")){ long maxrss; /* [B] Maximum resident set size */ maxrss=nco_mmr_usg_prn((int)0); maxrss+=0; /* CEWI */ nco_exit(EXIT_SUCCESS); } /* endif "sysconf" */ if(!strcmp(opt_crr,"tst_udunits")){ /* Use this feature with, e.g., ncks --tst_udunits='5 meters',centimeters ~/nco/data/in.nc ncks --tst_udunits='days since 1918-11-11','days since 1939-09-09',standard ~/nco/data/in.nc ncks --tst_udunits='days since 1918-11-11','days since 1939-09-09',360_day ~/nco/data/in.nc ncks --tst_udunits='days since 1918-11-11','days since 1939-09-09',365_day ~/nco/data/in.nc ncks --tst_udunits='days since 1918-11-11','days since 1939-09-09',366_day ~/nco/data/in.nc */ char *cp; char **args; double crr_val; #ifndef ENABLE_UDUNITS (void)fprintf(stdout,"%s: Build NCO with UDUnits support to use this option\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); #endif /* !ENABLE_UDUNITS */ cp=strdup(optarg); args=nco_lst_prs_1D(cp,",",&lmt_nbr); nco_cln_clc_org(args[0],args[1],(lmt_nbr > 2 ? nco_cln_get_cln_typ(args[2]) : cln_nil),&crr_val); (void)fprintf(stdout,"Units in=%s, units out=%s, difference (date) or conversion (non-date) = %f\n",args[0],args[1],crr_val); if(cp) cp=(char *)nco_free(cp); nco_exit(EXIT_SUCCESS); } /* endif "tst_udunits" */ if(!strcmp(opt_crr,"unn") || !strcmp(opt_crr,"union")) GRP_VAR_UNN=True; if(!strcmp(opt_crr,"nsx") || !strcmp(opt_crr,"intersection")) GRP_VAR_UNN=False; if(!strcmp(opt_crr,"grp_xtr_var_xcl")){ EXCLUDE_INPUT_LIST=True; GRP_XTR_VAR_XCL=True; } /* endif "grp_xtr_var_xcl" */ if(!strcmp(opt_crr,"vrs") || !strcmp(opt_crr,"version")){ (void)nco_vrs_prn(CVS_Id,CVS_Revision); nco_exit(EXIT_SUCCESS); } /* endif "vrs" */ if(!strcmp(opt_crr,"wrt_tmp_fl") || !strcmp(opt_crr,"write_tmp_fl")) WRT_TMP_FL=True; if(!strcmp(opt_crr,"no_tmp_fl")) WRT_TMP_FL=False; if(!strcmp(opt_crr,"jsn") || !strcmp(opt_crr,"json") || !strcmp(opt_crr,"w10") || !strcmp(opt_crr,"w10n")) PRN_JSN=True; /* [flg] Print JSON */ if(!strcmp(opt_crr,"xml") || !strcmp(opt_crr,"ncml")) PRN_XML=True; /* [flg] Print XML (NcML) */ if(!strcmp(opt_crr,"xml_no_location") || !strcmp(opt_crr,"ncml_no_location")){PRN_XML_LOCATION=False;PRN_XML=True;} /* [flg] Print XML location tag */ if(!strcmp(opt_crr,"xml_spr_chr")){spr_chr=(char *)strdup(optarg);PRN_XML=True;} /* [flg] Separator for XML character types */ if(!strcmp(opt_crr,"xml_spr_nmr")){spr_nmr=(char *)strdup(optarg);PRN_XML=True;} /* [flg] Separator for XML numeric types */ if(!strcmp(opt_crr,"xtn_var_lst") || !strcmp(opt_crr,"extensive")){ /* Extensive variables */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); xtn_lst_in=nco_lst_prs_2D(optarg_lcl,",",&xtn_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); } /* !xtn */ } /* opt != 0 */ /* Process short options */ switch(opt){ case 0: /* Long options have already been processed, return */ break; case '3': /* Request netCDF3 output storage format */ fl_out_fmt=NC_FORMAT_CLASSIC; break; case '4': /* Catch-all to prescribe output storage format */ if(!strcmp(opt_crr,"64bit")) fl_out_fmt=NC_FORMAT_64BIT; else fl_out_fmt=NC_FORMAT_NETCDF4; break; case '5': /* Print using new print format */ fl_out_fmt=NC_FORMAT_CDF5; PRN_NEW_FMT=!PRN_NEW_FMT; break; case '6': /* Request netCDF3 64-bit offset output storage format */ fl_out_fmt=NC_FORMAT_64BIT; break; case '7': /* Request netCDF4-classic output storage format */ fl_out_fmt=NC_FORMAT_NETCDF4_CLASSIC; break; case 'A': /* Toggle FORCE_APPEND */ FORCE_APPEND=!FORCE_APPEND; break; case 'a': /* Toggle ALPHABETIZE_OUTPUT */ ALPHABETIZE_OUTPUT=!ALPHABETIZE_OUTPUT; break; case 'b': /* Set file for binary output */ fl_bnr=(char *)strdup(optarg); break; case 'C': /* Extract all coordinates associated with extracted variables? */ EXTRACT_ASSOCIATED_COORDINATES=!EXTRACT_ASSOCIATED_COORDINATES; break; case 'c': /* Add all coordinates to extraction list? */ EXTRACT_ALL_COORDINATES=True; break; case 'D': /* Debugging level. Default is 0. */ nco_dbg_lvl=(unsigned short int)strtoul(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtoul",sng_cnv_rcd); nc_set_log_level(nco_dbg_lvl); break; case 'd': /* Copy limit argument for later processing */ lmt_arg[lmt_nbr]=(char *)strdup(optarg); lmt_nbr++; HAVE_LIMITS=True; break; case 'F': /* Toggle index convention. Default is 0-based arrays (C-style). */ FORTRAN_IDX_CNV=!FORTRAN_IDX_CNV; break; case 'G': /* Apply Group Path Editing (GPE) to output group */ gpe=nco_gpe_prs_arg(optarg); /* fl_out_fmt=NC_FORMAT_NETCDF4; */ break; case 'g': /* Copy group argument for later processing */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); grp_lst_in=nco_lst_prs_2D(optarg_lcl,",",&grp_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); break; case 'H': /* Toggle printing data to screen */ PRN_VAR_DATA_TGL=True; break; case 'h': /* Toggle appending to history global attribute */ HISTORY_APPEND=!HISTORY_APPEND; break; case 'L': /* [enm] Deflate level. Default is 0. */ dfl_lvl=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'l': /* Local path prefix for files retrieved from remote file system */ fl_pth_lcl=(char *)strdup(optarg); break; case 'm': /* Toggle printing variable metadata to screen */ PRN_VAR_METADATA_TGL=True; break; case 'M': /* Toggle printing global metadata to screen */ PRN_GLB_METADATA_TGL=True; break; case 'O': /* Toggle FORCE_OVERWRITE */ FORCE_OVERWRITE=!FORCE_OVERWRITE; break; case 'o': /* Name of output file */ fl_out=(char *)strdup(optarg); break; case 'P': /* Print data to screen, maximal verbosity */ PRN_VRB=True; EXTRACT_ASSOCIATED_COORDINATES=!EXTRACT_ASSOCIATED_COORDINATES; break; case 'p': /* Common file path */ fl_pth=(char *)strdup(optarg); break; case 'q': /* [flg] Quench (turn-off) all printing to screen */ PRN_QUENCH=True; /* [flg] Quench (turn-off) all printing to screen */ break; case 'Q': /* Turn off printing of dimension indices and coordinate values */ PRN_DMN_IDX_CRD_VAL=!PRN_DMN_IDX_CRD_VAL; break; case 'R': /* Toggle removal of remotely-retrieved-files. Default is True. */ RM_RMT_FL_PST_PRC=!RM_RMT_FL_PST_PRC; break; case 'r': /* Print CVS program information and copyright notice */ (void)nco_vrs_prn(CVS_Id,CVS_Revision); (void)nco_lbr_vrs_prn(); (void)nco_cpy_prn(); (void)nco_cnf_prn(); nco_exit(EXIT_SUCCESS); break; #ifdef ENABLE_MPI case 'S': /* Suspend with signal handler to facilitate debugging */ if(signal(SIGUSR1,nco_cnt_run) == SIG_ERR) (void)fprintf(stdout,"%s: ERROR Could not install suspend handler.\n",nco_prg_nm); while(!nco_spn_lck_brk) usleep(nco_spn_lck_us); /* Spinlock. fxm: should probably insert a sched_yield */ break; #endif /* !ENABLE_MPI */ case 's': /* User specified delimiter string for printed output */ dlm_sng=(char *)strdup(optarg); break; case 't': /* Thread number */ thr_nbr=(int)strtol(optarg,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(optarg,"strtol",sng_cnv_rcd); break; case 'u': /* Toggle printing dimensional units */ PRN_DMN_UNITS_TGL=True; break; case 'V': /* Print variable values only (same as -Q --no_nm_prn) */ PRN_DMN_IDX_CRD_VAL=False; PRN_DMN_VAR_NM=False; break; case 'v': /* Variables to extract/exclude */ /* Replace commas with hashes when within braces (convert back later) */ optarg_lcl=(char *)strdup(optarg); (void)nco_rx_comma2hash(optarg_lcl); var_lst_in=nco_lst_prs_2D(optarg_lcl,",",&var_lst_in_nbr); optarg_lcl=(char *)nco_free(optarg_lcl); xtr_nbr=var_lst_in_nbr; break; case 'X': /* Copy auxiliary coordinate argument for later processing */ aux_arg[aux_nbr]=(char *)strdup(optarg); aux_nbr++; MSA_USR_RDR=True; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ HAVE_LIMITS=True; break; case 'x': /* Exclude rather than extract groups and variables specified with -v */ EXCLUDE_INPUT_LIST=True; break; case 'z': /* Print absolute path of all input variables then exit */ GET_LIST=True; break; case '?': /* Print proper usage */ (void)nco_usg_prn(); nco_exit(EXIT_SUCCESS); break; case '-': /* Long options are not allowed */ (void)fprintf(stderr,"%s: ERROR Long options are not available in this build. Use single letter options instead.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; default: /* Print proper usage */ (void)fprintf(stdout,"%s ERROR in command-line syntax/options. Please reformulate command accordingly.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); break; } /* end switch */ if(opt_crr) opt_crr=(char *)nco_free(opt_crr); } /* end while loop */ #ifdef _LANGINFO_H /* Internationalization i18n Linux Journal 200211 p. 57--59 http://www.linuxjournal.com/article/6176 Fedora: http://fedoraproject.org/wiki/How_to_do_I18N_through_gettext cd ~/nco/bld;make I18N=Y cd ~/nco/bld;xgettext --default-domain=nco --join-existing -o ../po/nco.pot ../src/nco/ncks.c ../src/nco/ncra.c for LL in fr es; do mkdir -p ~/share/locale/${LL}/LC_MESSAGES msgfmt ~/nco/po/${LL}/nco.po -o ~/nco/po/${LL}/nco.mo /bin/cp ~/nco/po/${LL}/nco.mo ~/share/locale/${LL}/LC_MESSAGES # sudo /bin/cp ~/nco/po/${LL}/nco.mo /usr/share/locale/${LL}/LC_MESSAGES done export LOCALEDIR=${HOME}/share/locale LC_ALL=en ncks -D 1 -O ~/nco/data/in.nc ~/foo.nc LANG=en_GB.utf8 LANGUAGE=en_GB:en:fr_FR:fr LC_ALL=en_GB.utf8 ncks -D 1 -O ~/nco/data/in.nc ~/foo.nc LANG=es ncks -D 1 -O ~/nco/data/in.nc ~/foo.nc LANG=fr_FR.utf8 LANGUAGE=fr_FR:fr:en_GB:en LC_ALL=fr_FR.utf8 ncks -D 1 -O ~/nco/data/in.nc ~/foo.nc */ if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stdout,gettext("%s: I18N Current charset = %s\n"),nco_prg_nm,nl_langinfo(CODESET)); if(nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stdout,gettext("%s: I18N This text may appear in a foreign language\n"),nco_prg_nm); #endif /* !_LANGINFO_H */ /* Initialize traversal table */ (void)trv_tbl_init(&trv_tbl); /* Process positional arguments and fill in filenames */ fl_lst_in=nco_fl_lst_mk(argv,argc,optind,&fl_nbr,&fl_out,&FL_LST_IN_FROM_STDIN); /* Initialize thread information */ thr_nbr=nco_openmp_ini(thr_nbr); in_id_arr=(int *)nco_malloc(thr_nbr*sizeof(int)); trv_tbl->thr_nbr=thr_nbr; trv_tbl->in_id_arr=in_id_arr; /* Parse filename */ fl_in=nco_fl_nm_prs(fl_in,0,&fl_nbr,fl_lst_in,abb_arg_nbr,fl_lst_abb,fl_pth); /* Make sure file is on local system and is readable or die trying */ fl_in=nco_fl_mk_lcl(fl_in,fl_pth_lcl,&FL_RTR_RMT_LCN); /* Open file using appropriate buffer size hints and verbosity */ if(RAM_OPEN) md_open=NC_NOWRITE|NC_DISKLESS; else md_open=NC_NOWRITE; for(thr_idx=0;thr_idxnbr_dmn-dmn_rec_fl,dmn_rec_fl,att_glb_nbr+att_glb_nbr,var_nbr_fl,var_ntm_fl); goto close_and_free; } /* !GET_FILE_INFO */ if(ALPHABETIZE_OUTPUT) trv_tbl_srt(trv_tbl); /* We now have final list of variables to extract. Phew. */ if(fl_out){ /* Copy everything (all data and metadata) to output file by default */ if(PRN_VAR_DATA_TGL) PRN_VAR_DATA=False; else PRN_VAR_DATA=True; if(PRN_VAR_METADATA_TGL) PRN_VAR_METADATA=False; else PRN_VAR_METADATA=True; if(PRN_GLB_METADATA_TGL) PRN_GLB_METADATA=False; else PRN_GLB_METADATA=True; if(FORCE_APPEND){ /* When appending, do not copy global metadata by default */ if(var_lst_in) PRN_GLB_METADATA=False; else PRN_GLB_METADATA=True; if(PRN_GLB_METADATA_TGL) PRN_GLB_METADATA=!PRN_GLB_METADATA; } /* !FORCE_APPEND */ }else{ /* !fl_out */ /* Only input file is specified, so some printing should occur */ if(PRN_VRB || (!PRN_VAR_DATA_TGL && !PRN_VAR_METADATA_TGL && !PRN_GLB_METADATA_TGL)){ /* Verbose printing simply means assume user wants deluxe frills by default */ if(PRN_DMN_UNITS_TGL) PRN_DMN_UNITS=False; else PRN_DMN_UNITS=True; if(PRN_VAR_DATA_TGL) PRN_VAR_DATA=False; else PRN_VAR_DATA=True; if(PRN_VAR_METADATA_TGL) PRN_VAR_METADATA=False; else PRN_VAR_METADATA=True; /* Assume user wants global metadata unless variable extraction is invoked */ if(var_lst_in == NULL) PRN_GLB_METADATA=True; if(PRN_GLB_METADATA_TGL) PRN_GLB_METADATA=!PRN_GLB_METADATA; }else{ /* end if PRN_VRB */ /* Default is to print data and metadata to screen if output file is not specified */ if(PRN_DMN_UNITS_TGL) PRN_DMN_UNITS=True; else PRN_DMN_UNITS=False; if(PRN_VAR_DATA_TGL) PRN_VAR_DATA=True; else PRN_VAR_DATA=False; if(PRN_VAR_METADATA_TGL) PRN_VAR_METADATA=True; else PRN_VAR_METADATA=False; if(PRN_GLB_METADATA_TGL) PRN_GLB_METADATA=True; else PRN_GLB_METADATA=False; } /* !PRN_VRB */ /* PRN_QUENCH turns off all printing to screen */ if(PRN_QUENCH) PRN_VAR_DATA=PRN_VAR_METADATA=PRN_GLB_METADATA=False; } /* !fl_out */ if(fl_bnr && !fl_out){ /* Native binary files depend on writing netCDF file to enter generic I/O logic */ (void)fprintf(stdout,"%s: ERROR Native binary files cannot be written unless netCDF output filename also specified. HINT: Repeat command with dummy netCDF file specified for output file (e.g., -o foo.nc)\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* endif fl_bnr */ if(flg_rgr && !fl_out){ (void)fprintf(stdout,"%s: ERROR Regridding requested but no output file specified\nHINT: Specify output file with \"-o fl_out\" or as last argument\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* !flg_rgr */ if(gpe){ if(nco_dbg_lvl >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Group Path Edit (GPE) feature enabled\n",nco_prg_nm_get()); if(fl_out && fl_out_fmt != NC_FORMAT_NETCDF4 && nco_dbg_lvl >= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING Group Path Edit (GPE) requires netCDF4 output format in most cases (except flattening) but user explicitly requested output format = %s. This command will fail if the output file requires netCDF4 features like groups, non-atomic types, or multiple record dimensions. However, it _will_ autoconvert netCDF4 atomic types (e.g., NC_STRING, NC_UBYTE...) to netCDF3 atomic types (e.g., NC_CHAR, NC_SHORT...).\n",nco_prg_nm_get(),nco_fmt_sng(fl_out_fmt)); } /* !gpe */ if(fl_out){ /* Output file was specified so PRN_ tokens refer to (meta)data copying */ int out_id; /* Make output and input files consanguinous */ if(fl_out_fmt == NCO_FORMAT_UNDEFINED) fl_out_fmt=fl_in_fmt; /* Regridding */ if(flg_rgr){ rgr_sct *rgr_nfo; /* Initialize regridding structure */ rgr_in=(char *)strdup(fl_in); rgr_out=(char *)strdup(fl_out); rgr_nfo=nco_rgr_ini(cmd_ln,in_id,rgr_arg,rgr_nbr,rgr_in,rgr_out,rgr_grd_src,rgr_grd_dst,rgr_map,rgr_var,wgt_vld_thr,xtn_lst_in,xtn_nbr); rgr_nfo->fl_out_tmp=nco_fl_out_open(rgr_nfo->fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Copy Global Metadata */ rgr_nfo->out_id=out_id; nco_bool PCK_ATT_CPY=True; /* [flg] Copy attributes "scale_factor", "add_offset" */ (void)nco_att_cpy(in_id,out_id,NC_GLOBAL,NC_GLOBAL,PCK_ATT_CPY); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); if(thr_nbr > 0 && HISTORY_APPEND) (void)nco_thr_att_cat(out_id,thr_nbr); /* Regrid fields or generate grids */ rcd=nco_rgr_ctl(rgr_nfo,trv_tbl); /* Change from NCO_NOERR to NC_NOERR */ rcd=NC_NOERR; /* Close output file and move it from temporary to permanent location */ (void)nco_fl_out_cls(rgr_nfo->fl_out,rgr_nfo->fl_out_tmp,out_id); /* Free regridding structure */ rgr_nfo=nco_rgr_free(rgr_nfo); } /* endif !flg_rgr */ if(!flg_rgr){ /* Initialize, decode, and set PPC information */ if(ppc_nbr > 0) nco_ppc_ini(in_id,&dfl_lvl,fl_out_fmt,ppc_arg,ppc_nbr,trv_tbl); /* Verify output file format supports requested actions */ (void)nco_fl_fmt_vet(fl_out_fmt,cnk_nbr,dfl_lvl); /* Open output file */ fl_out_tmp=nco_fl_out_open(fl_out,FORCE_APPEND,FORCE_OVERWRITE,fl_out_fmt,&bfr_sz_hnt,RAM_CREATE,RAM_OPEN,WRT_TMP_FL,&out_id); /* Initialize chunking from user-specified inputs */ if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC) rcd+=nco_cnk_ini(in_id,fl_out,cnk_arg,cnk_nbr,cnk_map,cnk_plc,cnk_min_byt,cnk_sz_byt,cnk_sz_scl,&cnk); /* Define extracted groups, variables, and attributes in output file */ CPY_GRP_METADATA = FORCE_APPEND ? False : PRN_GLB_METADATA; (void)nco_xtr_dfn(in_id,out_id,&cnk,dfl_lvl,gpe,md5,CPY_GRP_METADATA,PRN_VAR_METADATA,RETAIN_ALL_DIMS,nco_pck_plc_nil,rec_dmn_nm,trv_tbl); /* Catenate time-stamped command line to "history" global attribute */ if(HISTORY_APPEND) (void)nco_hst_att_cat(out_id,cmd_ln); if(HISTORY_APPEND && FORCE_APPEND) (void)nco_prv_att_cat(fl_in,in_id,out_id); if(gaa_nbr > 0) (void)nco_glb_att_add(out_id,gaa_arg,gaa_nbr); if(HISTORY_APPEND) (void)nco_vrs_att_cat(out_id); #ifdef ENABLE_MPI if(prc_rnk == rnk_mgr) if(prc_nbr > 0 && HISTORY_APPEND) (void)nco_mpi_att_cat(out_id,prc_nbr); #endif /* !ENABLE_MPI */ /* Turn off default filling behavior to enhance efficiency */ nco_set_fill(out_id,NC_NOFILL,&fll_md_old); /* Take output file out of define mode */ if(hdr_pad == 0UL){ (void)nco_enddef(out_id); }else{ (void)nco__enddef(out_id,hdr_pad); if(nco_dbg_lvl >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Padding header with %lu extra bytes\n",nco_prg_nm_get(),(unsigned long)hdr_pad); } /* hdr_pad */ /* [fnc] Open unformatted binary data file for writing */ if(fl_bnr) fp_bnr=nco_bnr_open(fl_bnr); /* Timestamp end of metadata setup and disk layout */ rcd+=nco_ddra((char *)NULL,(char *)NULL,&ddra_info); ddra_info.tmr_flg=nco_tmr_rgl; /* Write extracted data to output file */ if(PRN_VAR_DATA) (void)nco_xtr_wrt(in_id,out_id,gpe,fp_bnr,md5,HAVE_LIMITS,trv_tbl); /* [fnc] Close unformatted binary data file */ if(fp_bnr) (void)nco_bnr_close(fp_bnr,fl_bnr); if(nco_dbg_lvl_get() == 14){ (void)nco_wrt_trv_tbl(in_id,trv_tbl,True); (void)nco_wrt_trv_tbl(out_id,trv_tbl,True); } /* endif dbg */ /* Close output file and move it from temporary to permanent location */ (void)nco_fl_out_cls(fl_out,fl_out_tmp,out_id); } /* flg_rgr */ }else{ /* !fl_out */ nco_bool ALPHA_BY_FULL_GROUP=False; /* [flg] Print alphabetically by full group */ nco_bool ALPHA_BY_STUB_GROUP=True; /* [flg] Print alphabetically by stub group */ char *fl_nm_stub; char *fl_in_dpl=NULL; char *sfx_ptr; /* Update all GTT dimensions with hyperslabbed size */ (void)nco_dmn_trv_msa_tbl(in_id,rec_dmn_nm,trv_tbl); /* No output file was specified so PRN_ tokens refer to screen printing */ prn_fmt_sct prn_flg; prn_flg.cdl=PRN_CDL; prn_flg.jsn=PRN_JSN; prn_flg.srm=PRN_SRM; prn_flg.xml=PRN_XML; prn_flg.trd=!(PRN_CDL || PRN_XML || PRN_JSN); if((prn_flg.cdl || prn_flg.xml) && nco_dbg_lvl >= nco_dbg_std) prn_flg.nfo_xtr=True; else prn_flg.nfo_xtr=False; prn_flg.new_fmt=(PRN_CDL || PRN_JSN || PRN_SRM || PRN_XML || PRN_NEW_FMT); prn_flg.hdn=PRN_HDN; prn_flg.rad=RETAIN_ALL_DIMS; /* CDL must print filename stub */ if(prn_flg.cdl || prn_flg.xml){ fl_in_dpl=strdup(fl_in); fl_nm_stub=strrchr(fl_in_dpl,'/'); if(fl_nm_stub) fl_nm_stub++; else fl_nm_stub=fl_in_dpl; sfx_ptr=strrchr(fl_nm_stub,'.'); if(sfx_ptr) *sfx_ptr='\0'; prn_flg.fl_stb=fl_nm_stub; } /* endif CDL */ /* JSON and XML need filename (unless location will be omitted) */ if(prn_flg.xml || prn_flg.jsn) prn_flg.fl_in=fl_in; prn_flg.spr_nmr=spr_nmr; prn_flg.spr_chr=spr_chr; prn_flg.xml_lcn=PRN_XML_LOCATION; prn_flg.gpe=gpe; prn_flg.md5=md5; prn_flg.nbr_zro=0; prn_flg.ndn=0; /* Initialize for prn_flg->trd */ prn_flg.spc_per_lvl=2; prn_flg.sxn_fst=2; prn_flg.var_fst=2; prn_flg.tab=4; if(nco_dbg_lvl >= nco_dbg_scl) prn_flg.fll_pth=True; else prn_flg.fll_pth=False; if(prn_flg.xml) prn_flg.nwl_pst_val=False; else prn_flg.nwl_pst_val=True; prn_flg.dlm_sng=dlm_sng; prn_flg.ALPHA_BY_FULL_GROUP=ALPHA_BY_FULL_GROUP; prn_flg.ALPHA_BY_STUB_GROUP=ALPHA_BY_STUB_GROUP; prn_flg.FORTRAN_IDX_CNV=FORTRAN_IDX_CNV; prn_flg.PRN_DMN_IDX_CRD_VAL=PRN_DMN_IDX_CRD_VAL; prn_flg.PRN_DMN_UNITS=PRN_DMN_UNITS; prn_flg.PRN_DMN_VAR_NM=PRN_DMN_VAR_NM; prn_flg.PRN_GLB_METADATA=PRN_GLB_METADATA; prn_flg.PRN_MSS_VAL_BLANK=PRN_MSS_VAL_BLANK; prn_flg.PRN_VAR_DATA=PRN_VAR_DATA; prn_flg.PRN_VAR_METADATA=PRN_VAR_METADATA; /* Derived formats */ if(prn_flg.cdl){ prn_flg.PRN_DMN_UNITS=False; prn_flg.PRN_DMN_VAR_NM=True; prn_flg.PRN_MSS_VAL_BLANK=True; } /* endif */ if(prn_flg.jsn){ /* JSON either prints metadata or data, not both */ if(prn_flg.PRN_VAR_DATA){ prn_flg.PRN_VAR_METADATA=False; prn_flg.PRN_GLB_METADATA=False; } /* !PRN_VAR_DATA */ if(prn_flg.PRN_GLB_METADATA) prn_flg.PRN_VAR_METADATA=False; } /* endif JSON */ if(prn_flg.xml) prn_flg.PRN_MSS_VAL_BLANK=False; /* File summary */ if(PRN_GLB_METADATA){ prn_flg.smr_sng=smr_sng=(char *)nco_malloc((strlen(fl_in)+300L*sizeof(char))); /* [sng] File summary string */ smr_xtn_sng=(char *)nco_malloc(300L*sizeof(char)); /* [sng] File extended summary string */ if(nco_dbg_lvl > nco_dbg_std) (void)sprintf(smr_xtn_sng," (representation of extended/underlying filetype %s)",nco_fmt_xtn_sng(nco_fmt_xtn_get())); else smr_xtn_sng[0]='\0'; (void)sprintf(smr_sng,"Summary of %s: filetype = %s%s, %i groups (max. depth = %i), %i dimensions (%i fixed, %i record), %i variables (%i atomic-type, %i non-atomic), %i attributes (%i global, %i group, %i variable)",fl_in,nco_fmt_sng(fl_in_fmt),smr_xtn_sng,grp_nbr_fl,grp_dpt_fl,trv_tbl->nbr_dmn,trv_tbl->nbr_dmn-dmn_rec_fl,dmn_rec_fl,var_nbr_fl+var_ntm_fl,var_nbr_fl,var_ntm_fl,att_glb_nbr+att_grp_nbr+att_var_nbr,att_glb_nbr,att_grp_nbr,att_var_nbr); if(!prn_flg.cdl && !prn_flg.xml && !prn_flg.srm) (void)fprintf(stdout,"%s\n\n",smr_sng); } /* endif summary */ if(!prn_flg.new_fmt){ /* Traditional printing order/format always used prior to 201307 */ if(PRN_GLB_METADATA){ int dmn_ids_rec[NC_MAX_DIMS]; /* [ID] Record dimension IDs array */ int nbr_rec_lcl; /* [nbr] Number of record dimensions visible in root */ /* Get unlimited dimension information from input file/group */ rcd=nco_inq_unlimdims(in_id,&nbr_rec_lcl,dmn_ids_rec); if(nbr_rec_lcl > 0){ char dmn_nm[NC_MAX_NAME]; long rec_dmn_sz; for(int rec_idx=0;rec_idx nco_dbg_fl) while(sld_nfo[idx].key) nco_kvm_prn(sld_nfo[idx++]); if(sld_nfo) sld_nfo=nco_kvm_lst_free(sld_nfo,idx); } /* endif fl_scrip */ /* NCO-generic clean-up */ /* Free individual strings/arrays */ if(cmd_ln) cmd_ln=(char *)nco_free(cmd_ln); if(cnk_map_sng) cnk_map_sng=(char *)nco_free(cnk_map_sng); if(cnk_plc_sng) cnk_plc_sng=(char *)nco_free(cnk_plc_sng); if(fl_in) fl_in=(char *)nco_free(fl_in); if(fl_out) fl_out=(char *)nco_free(fl_out); if(fl_out_tmp) fl_out_tmp=(char *)nco_free(fl_out_tmp); if(fl_pth) fl_pth=(char *)nco_free(fl_pth); if(fl_pth_lcl) fl_pth_lcl=(char *)nco_free(fl_pth_lcl); if(in_id_arr) in_id_arr=(int *)nco_free(in_id_arr); if(spr_nmr) spr_nmr=(char *)nco_free(spr_nmr); if(spr_chr) spr_chr=(char *)nco_free(spr_chr); /* Free lists of strings */ if(fl_lst_in && fl_lst_abb == NULL) fl_lst_in=nco_sng_lst_free(fl_lst_in,fl_nbr); if(fl_lst_in && fl_lst_abb) fl_lst_in=nco_sng_lst_free(fl_lst_in,1); if(fl_lst_abb) fl_lst_abb=nco_sng_lst_free(fl_lst_abb,abb_arg_nbr); if(gaa_nbr > 0) gaa_arg=nco_sng_lst_free(gaa_arg,gaa_nbr); if(grp_lst_in_nbr > 0) grp_lst_in=nco_sng_lst_free(grp_lst_in,grp_lst_in_nbr); if(var_lst_in_nbr > 0) var_lst_in=nco_sng_lst_free(var_lst_in,var_lst_in_nbr); /* Free limits */ for(idx=0;idx 0) cnk.cnk_dmn=(cnk_dmn_sct **)nco_cnk_lst_free(cnk.cnk_dmn,cnk_nbr); trv_tbl_free(trv_tbl); for(idx=0;idx /* stderr, FILE, NULL, printf */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #ifdef NC_HAVE_META_H # include /* NC_VERSION_..., NC_HAVE_RENAME_GRP */ #endif /* !NC_HAVE_META_H */ /* Personal headers */ #include "nco_typ.h" /* Type definitions, opaque types */ #include "nco_uthash.h" /* Hash table functionality */ /* C pre-processor macros for instantiating variable values with string tokens Macros for token pasting described at http://www.parashift.com/c++-faq-lite Layer of indirection is required, use public macro to call private macro */ #define TKN2SNG_PRV(x) #x #define TKN2SNG(x) TKN2SNG_PRV(x) /* Encapsulate C++ const usage in C99-safe macro C++ compilers will use type-safe version C89 and C99 compilers use less type-safe version that is standards-compliant */ #ifdef __cplusplus # define CST_X_PTR_CST_PTR_CST_Y(x,y) const x * const * const y # define X_CST_PTR_CST_PTR_Y(x,y) x const * const * y #else /* !__cplusplus */ # define CST_X_PTR_CST_PTR_CST_Y(x,y) x * const * const y # define X_CST_PTR_CST_PTR_Y(x,y) x * const * y #endif /* !__cplusplus */ #ifdef __cplusplus /* Use C-bindings so C++-compiled and C-compiled libraries are compatible */ extern "C" { #endif /* !__cplusplus */ /* Replace restrict by __restrict in g++ compiler Substitute whitespace for restrict in all other C++ compilers */ #ifdef __cplusplus # ifdef __GNUG__ # define restrict __restrict # else /* !__GNUG__ */ # define restrict # endif /* !__GNUG__ */ #endif /* !__cplusplus */ /* Boolean values */ /* From Wikipedia: "On a recent C compiler (supporting the C99 standard), there is a _Bool type, which is used to define bool by the stdbool.h header: #include bool b = false; ... b = true; During its standardization process, the C++ programming language introduced the bool, true and false keywords, adding a native datatype to support boolean data. Preprocessor macros may be used to turn bool into _Bool, false into 0 and true into 1, allowing compatibility with the aforementioned C99 use of the stdbool.h header." */ #define nco_bool int #ifndef __cplusplus # ifndef bool # define bool int # endif /* bool */ #endif /* __cplusplus */ #ifndef True # define True 1 #endif /* True */ #ifndef False # define False 0 #endif /* False */ /* Variables marked CEWI "Compiler Error Warning Initialization" are initialized to prevent spurious "warning: `float foo' might be used uninitialized in this function" warnings when, e.g., GCC -Wuninitialized is turned on. Note that these warning messages are compiler- and OS-dependent GCC warning on Alpha, e.g., cannot be removed by this trick */ #define NULL_CEWI NULL #define char_CEWI '\0' #define double_CEWI 0.0 #define float_CEWI 0.0 #define int_CEWI 0 #define long_CEWI 0L #define long_long_CEWI ((long long int)0LL) #define nco_bool_CEWI 0 #define nco_byte_CEWI ((signed char)0) #define nco_char_CEWI '\0' #define nco_int_CEWI (0L) #define nco_short_CEWI ((short int)0) #define nco_ubyte_CEWI ((unsigned char)0) #define nco_ushort_CEWI ((unsigned short int)0) #define nco_uint_CEWI (0U) #define nco_int64_CEWI ((long long int)0LL) #define nco_uint64_CEWI ((unsigned long long int)0ULL) #define nco_string_CEWI NULL #define short_CEWI 0 #define size_t_CEWI 0UL /* 20150617: Define macro to indicate variables are unused by design http://stackoverflow.com/questions/777261/avoiding-unused-variables-warnings-when-using-assert-in-a-release-build Especially useful to keep variables used only in assert() macros from triggering unused variable warnings Eventually, much CEWI code could be replaced by this macro */ #define CEWI_unused(x) ((void)x) /* Numeric constants to simplify arithmetic */ #define NCO_BYT_PER_KB 1024UL #define NCO_BYT_PER_MB 1048576UL #define NCO_BYT_PER_GB 1073741824UL #define NCO_BYT_PER_TB 1099511627776UL /* netcdf.h NC_GLOBAL is, strictly, the variable ID for global attributes NCO_REC_DMN_UNDEFINED is dimension ID of record dimension iff record dimension is undefined Normally using -1 for this ID is fine, but token makes meaning clearer NB: nc_inq() family returns -1 for missing record dimensions */ #define NCO_REC_DMN_UNDEFINED -1 /* Valid netCDF4 deflation levels (dfl_lvl) range from 0..9 inclusive Variables with dfl_lvl == 0 return true for compression yet are not deflated Calling deflation routine with dfl_lvl == 0 wastes time _unless_ user wishes to uncompress variable that is currently deflated with dfl_lvl != 0. Undefined dfl_lvl indicates user has not yet specified and intended dfl_lvl This undefined value must be less than zero (and not equal to zero) so that if(dfl_lvl >= 0) deflate(); only calls deflate() when user requests it. Setting dfl_lvl == 0 decompresses already compressed variables */ #define NCO_DFL_LVL_UNDEFINED -1 /* netcdf.h defines four NC_FORMAT tokens: NC_FORMAT_CLASSIC, ... The values are (currently) enumerated from one to four Operators need to check if fl_out_fmt has been user-specified Safest way is to compare current value of fl_out_fmt to initial value Initial value should be a number that will never be a true netCDF format */ #define NCO_FORMAT_UNDEFINED 0 /* Argument to strtol() and strtoul() indicating base-10 conversions */ #define NCO_SNG_CNV_BASE10 10 /* netCDF 4.3.2 (201404) implements a configure-time constant called DEFAULT_CHUNK_SIZE = 4194304 = 4 MB This is a good size for HPC systems with MB-scale blocksizes Token is not in netcdf.h, and NCO's equivalent need not match netCDF's NCO uses NCO token NCO_CNK_SZ_BYT_DFL and default algorithm when user specifies any chunking option NCO uses netCDF token DEFAULT_CHUNK_SIZE and default algorithm when user specifies no chunking option */ #define NCO_CNK_SZ_BYT_DFL 4194304 /* 20141105 Minimum size of a variable to chunk */ #define NCO_CNK_SZ_MIN_BYT_DFL 8192 /* Linux default blocksize is 4096 B---a good chunk size for 1-D record dimension variables */ #define NCO_CNK_SZ_BYT_R1D_DFL 4096 /* netCDF provides no guidance on maximum nesting of groups */ #define NCO_MAX_GRP_DEPTH 10 /* Signifier that iterator found no more groups in container */ #define NCO_LST_GRP 0 /* Debugging level that quiets all non-requested informational messages This value is compared against user-selected nco_dbg_lvl Running operators with --quiet automatically sets nco_dbg_lvl=NCO_DBG_QUIET */ #define NCO_DBG_QUIET 0 /* Find traversal table objects via hash table rather than brute-force strcmp() search */ /*#define NCO_HSH_TRV_OBJ */ #undef NCO_HSH_TRV_OBJ /* NCO_MSS_VAL_SNG names attribute whose value is "skipped" by arithmetic, aka the missing value attribute Attribute name should be either "missing_value" or "_FillValue" */ #ifndef NCO_MSS_VAL_SNG /* 20070831: TKN2SNG() technique inserts quotes into string though same test code in c.c does not produce extra quotes. TODO nco905. */ /*# define NCO_MSS_VAL_SNG missing_value */ /*# define NCO_MSS_VAL_SNG _FillValue*/ /*char nco_mss_val_sng[]=TKN2SNG(NCO_MSS_VAL_SNG);*/ /* [sng] Missing value attribute name */ /* Arcane workaround using NCO_USE_FILL_VALUE necessary because TKN2SNG() macro above is broken. TODO nco905 */ # define NCO_USE_FILL_VALUE # ifdef NCO_USE_FILL_VALUE /* NCO_NETCDF4_AND_FILLVALUE tells whether netCDF4 restrictions on _FillValue operations (must be defined before variable written, cannot be changed after variable written) can affect output file */ # ifdef ENABLE_NETCDF4 # define NCO_NETCDF4_AND_FILLVALUE # endif /* !ENABLE_NETCDF4 */ # endif /* !NCO_USE_FILL_VALUE */ #endif /* NCO_MSS_VAL_SNG */ /* Prototype global functions before defining them in next block */ char *nco_mss_val_sng_get(void); /* [sng] Missing value attribute name */ char *nco_not_mss_val_sng_get(void); /* [sng] Not missing value attribute name */ char *nco_prg_nm_get(void); int nco_prg_id_get(void); unsigned short nco_dbg_lvl_get(void); unsigned short nco_fmt_xtn_get(void); unsigned short nco_mrd_cnv_get(void); unsigned short nco_rth_cnv_get(void); unsigned short nco_upk_cnv_get(void); void nco_fmt_xtn_set(unsigned short nco_fmt_xtn_arg); #ifdef MAIN_PROGRAM_FILE /* Current file contains main() */ /* Tokens and variables with scope limited to main.c, and global variables allocated here */ int nco_prg_id; /* [enm] Program ID */ int nco_prg_id_get(void){return nco_prg_id;} /* [enm] Program ID */ char *nco_prg_nm; /* [sng] Program name */ char *nco_prg_nm_get(void){return nco_prg_nm;} /* [sng] Program name */ unsigned short nco_dbg_lvl=0; /* [enm] Debugging level */ unsigned short nco_dbg_lvl_get(void){return nco_dbg_lvl;} /* [enm] Debugging level */ unsigned short nco_fmt_xtn=0; /* [enm] Extended file format */ unsigned short nco_fmt_xtn_get(void){return nco_fmt_xtn;} /* [enm] Extended file format */ void nco_fmt_xtn_set(unsigned short nco_fmt_xtn_arg){nco_fmt_xtn=nco_fmt_xtn_arg;} /* [enm] Extended file format */ unsigned short nco_mrd_cnv=0; /* [enm] Multiple Record Dimension convention */ unsigned short nco_mrd_cnv_get(void){return nco_mrd_cnv;} /* [enm] Multiple Record Dimension convention */ unsigned short nco_rth_cnv=1; /* [enm] Arithmetic convention */ unsigned short nco_rth_cnv_get(void){return nco_rth_cnv;} /* [enm] Arithmetic convention */ unsigned short nco_upk_cnv=0; /* [enm] Unpacking convention */ unsigned short nco_upk_cnv_get(void){return nco_upk_cnv;} /* [enm] Unpacking convention */ # ifdef NCO_USE_FILL_VALUE /* This arcane get()/set() usage necessary because TKN2SNG() macro above is broken. TODO nco905 */ char nco_mss_val_sng[]="_FillValue"; /* [sng] Missing value attribute name */ char nco_not_mss_val_sng[]="missing_value"; /* [sng] Not missing value attribute name */ # else /* !NCO_USE_FILL_VALUE */ char nco_mss_val_sng[]="missing_value"; /* [sng] Missing value attribute name */ char nco_not_mss_val_sng[]="_FillValue"; /* [sng] Not missing value attribute name */ # endif /* !NCO_USE_FILL_VALUE */ char *nco_mss_val_sng_get(void){return nco_mss_val_sng;} /* [sng] Missing value attribute name */ char *nco_not_mss_val_sng_get(void){return nco_not_mss_val_sng;} /* [sng] Not missing value attribute name */ #ifdef ENABLE_ESMF /* csz 20150320 Define these only in main() files not in original location in ESMC_CoordSys.h Otherwise any file #including ESMC.h inadvertently includes these constants multiple times Should be defined as externals that resolve to single definition in main() sudo cp ~/nco/src/nco/ESMC_CoordSys.h /usr/local/include # Linux sudo cp ~/nco/src/nco/ESMC_CoordSys.h /opt/local/include/esmf # MacOS MacPorts */ const double ESMC_CoordSys_Deg2Rad= 0.01745329251994329547437; const double ESMC_CoordSys_Rad2Deg=57.29577951308232286464772; #endif /* !ENABLE_ESMF */ #else /* MAIN_PROGRAM_FILE is NOT defined, i.e., current file does not contain main() */ /* External references to global variables are declared as extern here Variables with local file scope in all files except main.c are allocated here */ #endif /* MAIN_PROGRAM_FILE is NOT defined, i.e., the current file does not contain main() */ /* Compatibility tokens for when NCO compiled with older netcdf.h It is hard to track where/when many tokens defined Easiest to individually check for pre-definition of each */ /* 20140924: netCDF meta-information available in library versions 4.3.3-rc2 Define compatibility tokens for earlier libraries equivalent to 3.6.0 */ #ifndef NC_VERSION_MAJOR # define NC_VERSION_MAJOR 3 #endif /* !NC_VERSION_MAJOR */ #ifndef NC_VERSION_MINOR # define NC_VERSION_MINOR 6 #endif /* !NC_VERSION_MINOR */ #ifndef NC_VERSION_PATCH # define NC_VERSION_PATCH 0 #endif /* !NC_VERSION_PATCH */ #ifndef NC_VERSION_NOTE # define NC_VERSION_NOTE "" /* May be blank */ #endif /* !NC_VERSION_NOTE */ #ifndef NC_VERSION # define NC_VERSION "3.6.0" #endif /* !NC_VERSION */ /* Define NC_LIB_VERSION as three-digit number for arithmetic comparisons by CPP */ #ifndef NC_LIB_VERSION # define NC_LIB_VERSION ( NC_VERSION_MAJOR * 100 + NC_VERSION_MINOR * 10 + NC_VERSION_PATCH ) #endif /* !NC_LIB_VERSION */ /* NCO meta-information available in VERSION token since forever 20141008: Define NCO tokens consistent with new netcdf_meta.h tokens */ #ifndef NCO_VERSION_MAJOR # define NCO_VERSION_MAJOR 4 #endif /* !NCO_VERSION_MAJOR */ #ifndef NCO_VERSION_MINOR # define NCO_VERSION_MINOR 5 #endif /* !NCO_VERSION_MINOR */ #ifndef NCO_VERSION_PATCH # define NCO_VERSION_PATCH 4 #endif /* !NCO_VERSION_PATCH */ #ifndef NCO_VERSION_NOTE # define NCO_VERSION_NOTE "" /* Blank for final versions, non-blank (e.g., "beta37") for pre-release versions */ #endif /* !NCO_VERSION_NOTE */ #ifndef NCO_LIB_VERSION /* Define NC_LIB_VERSION as three-digit number for arithmetic comparisons by CPP */ # define NCO_LIB_VERSION ( NCO_VERSION_MAJOR * 100 + NCO_VERSION_MINOR * 10 + NCO_VERSION_PATCH ) #endif /* !NCO_LIB_VERSION */ #ifndef NCO_VERSION # define NCO_VERSION "4.5.4" #endif /* !NCO_VERSION */ /* Compatibility tokens new to netCDF4 netcdf.h: */ #ifndef NC_NETCDF4 # define NC_NETCDF4 0x1000 /* Use netCDF-4/HDF5 format. Mode flag for nc_create(). */ #endif #ifndef NC_MPIIO # define NC_MPIIO 0x2000 /* Turn on MPI I/O. Mode flag for both nc_create() and nc_open(). */ #endif #ifndef NC_MPIPOSIX # define NC_MPIPOSIX 0x4000 /* Turn on MPI POSIX I/O. Mode flag for both nc_create() and nc_open(). Deprecated as of libhdf5 1.8.13. */ #endif #ifndef NC_INMEMORY # define NC_INMEMORY 0x8000 /* Read from memory. Mode flag for nc_open() or nc_create() */ #endif #ifndef NC_PNETCDF # define NC_PNETCDF (NC_MPIIO) /* Use parallel-netcdf library. Alias for NC_MPIIO */ #endif /* Use these with nc_var_par_access(). */ #ifndef NC_INDEPENDENT # define NC_INDEPENDENT 0 #endif #ifndef NC_COLLECTIVE # define NC_COLLECTIVE 1 #endif #ifndef NC_ENDIAN_NATIVE # define NC_ENDIAN_NATIVE 0 #endif #ifndef NC_ENDIAN_LITTLE # define NC_ENDIAN_LITTLE 1 #endif #ifndef NC_ENDIAN_BIG # define NC_ENDIAN_BIG 2 #endif #ifndef NC_CHUNKED # define NC_CHUNKED (0) #endif #ifndef NC_CONTIGUOUS # define NC_CONTIGUOUS (1) #endif #ifndef NC_NOCHECKSUM # define NC_NOCHECKSUM 0 #endif #ifndef NC_FLETCHER32 # define NC_FLETCHER32 1 #endif #ifndef NC_NOSHUFFLE # define NC_NOSHUFFLE 0 #endif #ifndef NC_SHUFFLE # define NC_SHUFFLE 1 #endif /* Six compatibility tokens not all available until netCDF 3.6.1 netcdf.h NC_64BIT_OFFSET is used (so far) only in nco_fl_utl.c 20151222: Introduction of CDF5 in netCDF 4.4.0-RC4 netcdf.h makes original NC_FORMAT_64BIT token ambiguous Type introduced as NC_FORMAT_64BIT in netCDF 3.X is now properly called NC_FORMAT_64BIT_OFFSET (64-bit offsets/pointers NOT data) Type introduced as CDF5 (from pnetCDF) in netCDF 4.4.0 is properly called NC_FORMAT_64BIT_DATA (64-bit offsets/pointers AND data) */ #ifndef NC_CLASSIC_MODEL # define NC_CLASSIC_MODEL 0x0100 /**< Enforce classic model. Mode flag for nc_create(). */ #endif #ifndef NC_64BIT_OFFSET # define NC_64BIT_OFFSET 0x0200 /* Use large (64-bit) file offsets */ #endif #ifndef NC_DISKLESS # define NC_DISKLESS 0x0008 /* Use diskless file. Mode flag for nc_open() or nc_create(). */ #endif #ifndef NC_FORMAT_CLASSIC # define NC_FORMAT_CLASSIC (1) #endif #ifndef NC_FORMAT_64BIT_OFFSET # define NC_FORMAT_64BIT_OFFSET (2) #endif #ifndef NC_FORMAT_64BIT # define NC_FORMAT_64BIT (NC_FORMAT_64BIT_OFFSET) #endif #ifndef NC_FORMAT_NETCDF4 # define NC_FORMAT_NETCDF4 (3) #endif #ifndef NC_FORMAT_NETCDF4_CLASSIC # define NC_FORMAT_NETCDF4_CLASSIC (4) /* create netcdf-4 files, with NC_CLASSIC_MODEL. */ #endif #ifndef NC_FORMAT_64BIT_DATA # define NC_FORMAT_64BIT_DATA (5) #endif /* 20131222: Seven compatibility tokens introduced in netCDF 4.3.1-rc7 netcdf.h 20151222: Tokens are superseded in netCDF 4.4.0-RC4 netcdf.h by same tokens with "FORMATX" instead of "FORMAT" This disambiguates extended format (FORMATX) flags returned by nc_inq_format_extended() from format flags (e.g., NC_FORMAT_CLASSIC) returned by nco_inq_format() Also added NC_FORMAT_NC4 as alias to NC_FORMAT_NC_HDF5 */ #ifndef NC_FORMAT_UNDEFINED # define NC_FORMAT_UNDEFINED (0) #else # define NC_HAVE_INQ_FORMAT_EXTENDED #endif #ifndef NC_FORMAT_NC3 # define NC_FORMAT_NC3 (1) #endif #ifndef NC_FORMAT_NC_HDF5 # define NC_FORMAT_NC_HDF5 (2) /* netCDF-4 subset of HDF5 */ #endif #ifndef NC_FORMAT_NC4 # define NC_FORMAT_NC4 NC_FORMAT_NC_HDF5 /* alias */ #endif #ifndef NC_FORMAT_NC_HDF4 # define NC_FORMAT_NC_HDF4 (3) /* netCDF-4 subset of HDF4 */ #endif #ifndef NC_FORMAT_PNETCDF # define NC_FORMAT_PNETCDF (4) #endif #ifndef NC_FORMAT_DAP2 # define NC_FORMAT_DAP2 (5) #endif #ifndef NC_FORMAT_DAP4 # define NC_FORMAT_DAP4 (6) #endif #ifndef NC_FORMATX_UNDEFINED # define NC_FORMATX_UNDEFINED (0) #else # define NC_HAVE_INQ_FORMATX_EXTENDED #endif #ifndef NC_FORMATX_NC3 # define NC_FORMATX_NC3 (1) #endif #ifndef NC_FORMATX_NC_HDF5 # define NC_FORMATX_NC_HDF5 (2) /* netCDF4 subset of HDF5 */ #endif #ifndef NC_FORMATX_NC4 # define NC_FORMATX_NC4 NC_FORMATX_NC_HDF5 /* alias */ #endif #ifndef NC_FORMATX_NC_HDF4 # define NC_FORMATX_NC_HDF4 (3) /* netcdf4 subset of HDF4 */ #endif #ifndef NC_FORMATX_PNETCDF # define NC_FORMATX_PNETCDF (4) #endif #ifndef NC_FORMATX_DAP2 # define NC_FORMATX_DAP2 (5) #endif #ifndef NC_FORMATX_DAP4 # define NC_FORMATX_DAP4 (6) #endif /* Three compatibility tokens from pnetcdf.h introduced to NCO 20140604 None are used yet */ #ifndef NC_64BIT_DATA # define NC_64BIT_DATA 0x0010 /* CDF-5 format, (64-bit) supported */ #endif #ifndef NC_FORMAT_CDF5 # define NC_FORMAT_CDF5 5 /* CDF-5 format, with NC_64BIT_DATA. */ #endif #ifndef NC_FORMAT_64BIT_DATA # define NC_FORMAT_64BIT_DATA NC_FORMAT_CDF5 #endif /* Backwards-compatibility error codes for netCDF4 Currently used only in nco_grp_utl.c and nco_netcdf.c */ #ifndef NC_EBADGRPID # define NC_EBADGRPID (-116) /**< Bad group ID. */ #endif #ifndef NC_ENOGRP # define NC_ENOGRP (-125) /**< No group found. */ #endif /* Two backwards-compatibility error codes implemented in 201106 to diagnose problems with DAP Currently used only in nco_fl_utl.c */ #ifndef NC_ECANTREAD # define NC_ECANTREAD (-102) /**< Can't read. */ #endif #ifndef NC_EDAPSVC # define NC_EDAPSVC (-70) /**< DAP server error */ #endif /* NCO began using MIN/MAX tokens in nco_pck.c on 20101130 Not sure when these tokens were introduced to netcdf.h */ #ifndef NC_MAX_BYTE # define NC_MAX_BYTE 127 #endif #ifndef NC_MIN_BYTE # define NC_MIN_BYTE (-NC_MAX_BYTE-1) #endif #ifndef NC_MAX_CHAR # define NC_MAX_CHAR 255 #endif #ifndef NC_MAX_SHORT # define NC_MAX_SHORT 32767 #endif #ifndef NC_MIN_SHORT # define NC_MIN_SHORT (-NC_MAX_SHORT - 1) #endif #ifndef NC_MAX_INT # define NC_MAX_INT 2147483647 #endif #ifndef NC_MIN_INT # define NC_MIN_INT (-NC_MAX_INT - 1) #endif #ifndef NC_MAX_FLOAT # define NC_MAX_FLOAT 3.402823466e+38f #endif #ifndef NC_MIN_FLOAT # define NC_MIN_FLOAT (-NC_MAX_FLOAT) #endif #ifndef NC_MAX_DOUBLE # define NC_MAX_DOUBLE 1.7976931348623157e+308 #endif #ifndef NC_MIN_DOUBLE # define NC_MIN_DOUBLE (-NC_MAX_DOUBLE) #endif #ifndef NC_MAX_UBYTE # define NC_MAX_UBYTE NC_MAX_CHAR #endif #ifndef NC_MAX_USHORT # define NC_MAX_USHORT 65535U #endif #ifndef NC_MAX_UINT # define NC_MAX_UINT 4294967295U #endif #ifndef NC_MAX_INT64 # define NC_MAX_INT64 (9223372036854775807LL) #endif #ifndef NC_MIN_INT64 # define NC_MIN_INT64 (-9223372036854775807LL-1) #endif #ifndef NC_MAX_UINT64 # define NC_MAX_UINT64 (18446744073709551615ULL) #endif /* Endif older netcdf.h */ /* Define compatibility tokens when user does not have znetCDF */ #ifndef ENABLE_ZNETCDF # ifndef NC_COMPRESS # define NC_COMPRESS 0x200 /* bn file is compressed */ # endif #endif /* !ENABLE_ZNETCDF */ /* NB: Use NCO_NOERR and NCO_ERR as return codes to other functions, not to shell (e.g., Bash, Csh) Shell exit codes (where 0 indicates success) are traditionally opposite C exit codes (where 0 indicates failure) */ /* Internal NCO function return code indicating success */ #define NCO_NOERR 1 /* Internal NCO function return code indicating failure */ #define NCO_ERR 0 /* UDUnits return code indicating success */ #define UDUNITS_NOERR 0 /* NB: Use EXIT_SUCCESS and EXIT_FAILURE as return codes to shell (e.g., Bash, Csh), not to other functions Shell exit codes (where 0 indicates success) are traditionally opposite C-function (not C-program) exit codes (where 0 indicates failure) 20130711: FC19 x86_64 Linux defines EXIT_FAILURE == 134 */ #ifndef EXIT_SUCCESS /* Most likely this is a SUN4 machine */ # define EXIT_SUCCESS 0 #endif /* SUN4 */ #ifndef EXIT_FAILURE /* Most likely this is a SUN4 machine */ # define EXIT_FAILURE 1 #endif /* SUN4 */ #define TRV_MAP_SIZE NC_MAX_DIMS enum nco_prg_id{ /* [enm] Key value for all netCDF operators */ ncap, /* 0 [enm] */ ncatted, /* 1 [enm] */ ncbo, /* 2 [enm] */ ncfe, /* 3 [enm] */ ncecat, /* 4 [enm] */ ncflint, /* 5 [enm] */ ncks, /* 6 [enm] */ ncpdq, /* 7 [enm] */ ncra, /* 8 [enm] */ ncrcat, /* 9 [enm] */ ncrename, /* 10 [enm] */ ncwa, /* 11 [enm] */ ncge, /* 12 [enm] */ /* 20131018: New operator */ ncmv /* 13 [enm] */ /* 20131018: Potential new operator */ }; /* end nco_prg_id enum */ enum nco_dbg_typ_enm{ /* [enm] Debugging levels */ /* List in increasing levels of verbosity */ nco_dbg_quiet, /* 0 [enm] Quiet all non-error messages */ nco_dbg_std, /* 1 [enm] Standard mode. Minimal, but some, messages */ nco_dbg_fl, /* 2 [enm] Filenames */ nco_dbg_scl, /* 3 [enm] Scalars, other per-file information */ nco_dbg_grp, /* 4 [enm] Groups, highest level per-file loop information */ nco_dbg_var, /* 5 [enm] Variables, highest level per-group loop information */ nco_dbg_crr, /* 6 [enm] Current task */ nco_dbg_sbr, /* 7 [enm] Subroutine names on entry and exit */ nco_dbg_io, /* 8 [enm] Subroutine I/O */ nco_dbg_vec, /* 9 [enm] Entire vectors */ nco_dbg_vrb, /* 10 [enm] Verbose, print everything possible */ nco_dbg_old, /* 11 [enm] Old debugging blocks not used anymore */ nco_dbg_dev, /* 12 [enm] NCO developer information; only useful for debugging */ nco_dbg_sup, /* 13 [enm] NCO extra developer information not usually used (debug memory leaks) */ nco_dbg_nbr /* 14 [enm] Number of debugging types (equals last enumerated value) */ }; /* end nco_dbg_typ_enm */ enum nco_op_typ{ /* [enm] Operation type */ /* Types used in ncbo(): */ nco_op_add, /* [enm] Add file_1 to file_2 */ nco_op_dvd, /* [enm] Divide file_1 by file_2 */ nco_op_mlt, /* [enm] Multiply file_1 by file_2 */ nco_op_sbt, /* [enm] Subtract file_2 from file_1 */ /* Types used in ncra(), ncrcat(), ncwa(): */ nco_op_avg, /* [enm] Average */ nco_op_min, /* [enm] Minimum value */ nco_op_max, /* [enm] Maximum value */ nco_op_ttl, /* [enm] Linear sum */ nco_op_sqravg, /* [enm] Square of mean */ nco_op_avgsqr, /* [enm] Mean of sum of squares */ nco_op_sqrt, /* [enm] Square root of mean */ nco_op_rms, /* [enm] Root-mean-square (normalized by N) */ nco_op_rmssdn, /* [enm] Root-mean square normalized by N-1 */ nco_op_mabs, /* [enm] Maximum absolute value */ nco_op_mebs, /* [enm] Mean absolute value */ nco_op_mibs, /* [enm] Minimum absolute value */ nco_op_nil /* [enm] Nil or undefined operation type */ }; /* end nco_op_typ enum */ enum nco_rlt_opr{ /* [enm] Arithmetic relations (comparisons) for masking */ nco_op_eq, /* Equality */ nco_op_ne, /* Inequality */ nco_op_lt, /* Less than */ nco_op_gt, /* Greater than */ nco_op_le, /* Less than or equal to */ nco_op_ge /* Greater than or equal to */ }; /* end nco_rlt_opr enum */ typedef enum nco_obj_typ_enm{ /* [enm] netCDF4 object type: group, variable */ nco_obj_typ_err=-1, /* -1 Invalid type for initialization */ nco_obj_typ_grp, /* 0, Group */ nco_obj_typ_var, /* 1, Variable of atomic type */ nco_obj_typ_nonatomic_var /* 2, Variable of non-atomic type (vlen, opaque, enum, compound, user-defined) */ } nco_obj_typ; enum nco_fmt_xtn{ /* [enm] Extended or underlying filetype */ /* 20131222: Tokens defined as of netCDF 4.3.1-rc7 */ nco_fmt_xtn_nil=NC_FORMAT_UNDEFINED, /* 0 Undefined (more precisely, not yet defined) */ nco_fmt_xtn_nc3=NC_FORMAT_NC3, /* 1 netCDF3 */ nco_fmt_xtn_hdf5=NC_FORMAT_NC_HDF5, /* 2 HDF5 */ nco_fmt_xtn_hdf4=NC_FORMAT_NC_HDF4, /* 3 HDF4 */ nco_fmt_xtn_pnetcdf=NC_FORMAT_PNETCDF, /* 4 PnetCDF */ nco_fmt_xtn_dap2=NC_FORMAT_DAP2, /* 5 DAP2 */ nco_fmt_xtn_dap4=NC_FORMAT_DAP4, /* 6 DAP4 */ }; /* end nco_fmt_xtn */ enum nco_mrd_cnv{ /* [enm] Multiple Record Dimension convention: for ncecat and ncpdq */ /* This currently could be implemented as a flag rather than an enum General case may need more than binary option so use enum */ nco_mrd_restrict, /* 0 Fix some dimensions so as to avoid producing additional record dimensions */ nco_mrd_allow /* 1 Allow multiple record dimensions when operator produces them naturally */ }; /* end nco_mrd_cnv */ enum nco_rth_cnv{ /* [enm] Arithmetic convention to assume */ nco_rth_flt_flt, /* 0 Keep single-precision floating point (NCO default through version 4.3.5 20130927) */ nco_rth_flt_dbl /* 1 Promote single-precision floating point to double before arithmetic (NCO default since version 4.3.6 20130927)*/ }; /* end nco_rth_cnv */ enum nco_upk_cnv{ /* [enm] Unpacking convention to assume */ /* netCDF convention : http://www.unidata.ucar.edu/software/netcdf/docs/netcdf/Attribute-Conventions.html HDF/NASA convention: http://modis-atmos.gsfc.nasa.gov/MOD08_D3/faq.html */ nco_upk_netCDF, /* 0 netCDF unpack convention: unpacked=(scale_factor*packed)+add_offset */ nco_upk_HDF /* 1 HDF unpack convention: unpacked=scale_factor*(packed-add_offset) */ }; /* end nco_upk_cnv */ typedef enum aed{ /* [enm] Attribute editor mode */ aed_append, aed_create, aed_delete, aed_modify, aed_overwrite } aed_enm; /* end aed enum */ typedef enum gpe{ /* [enm] Group Path Editing mode */ gpe_append, gpe_delete, gpe_flatten, gpe_backspace } gpe_enm; /* end gpe enum */ typedef enum { /* [enm] Memory allocation type */ nco_mmr_calloc, /* [enm] nco_calloc() */ nco_mmr_free, /* [enm] nco_free() */ nco_mmr_malloc, /* [enm] nco_malloc() */ nco_mmr_realloc /* [enm] nco_realloc() */ } nco_mmr_typ_enm; /* end nco_mmr_typ enum */ typedef enum { /* [enm] Arithmetic precision rank */ /* Ranked ordering of "arithmetic precision" from lowest to highest */ nco_rth_prc_rnk_string, /* [enm] */ /* Least precise */ nco_rth_prc_rnk_char, /* [enm] */ nco_rth_prc_rnk_ubyte, /* [enm] */ nco_rth_prc_rnk_byte, /* [enm] */ nco_rth_prc_rnk_ushort, /* [enm] */ nco_rth_prc_rnk_short, /* [enm] */ nco_rth_prc_rnk_uint, /* [enm] */ nco_rth_prc_rnk_int, /* [enm] */ nco_rth_prc_rnk_uint64, /* [enm] */ nco_rth_prc_rnk_int64, /* [enm] */ nco_rth_prc_rnk_float, /* [enm] */ nco_rth_prc_rnk_double /* [enm] */ /* Most precise */ } nco_rth_prc_rnk_enm; /* end nco_rth_prc_rnk enum */ typedef enum { /* [enm] Timer flag */ nco_tmr_srt, /* [enm] Initialize timer (first timer call) */ nco_tmr_mtd, /* [enm] Metadata timer (second timer call) */ nco_tmr_rgl, /* [enm] Regular timer call (main loop timer call) */ nco_tmr_end /* [enm] Close timer (last timer call) */ } nco_tmr_flg; /* [enm] Timer flag */ typedef enum { /* [enm] Node enumerator Nie02 nodeEnum */ typ_scv, /* [enm] Scalar value */ typ_sym, /* [enm] Symbol identifier */ typ_opr /* [enm] Operator */ } nod_typ_enm; /* end Node enumerator */ /* end enumeration section */ typedef enum { /* [enm] Calendar type */ cln_std=1, /* Standard mixed Julian/Gregorian */ cln_grg, /* Gregorian Calendar */ cln_jul, /* Julian Calendar */ cln_360, /* 30-day month Calendar */ cln_365, /* No Leap year Calendar */ cln_366, /* Leap year Calendar */ cln_nil /* No calendar found */ } nco_cln_typ; /* [enm] Calendar type */ /* Limit structure */ typedef struct { /* lmt_sct */ char *nm; /* [sng] Dimension name */ char *nm_fll; /* [sng] Full dimension name */ char *grp_nm_fll; /* [sng] Full group where dimension is defined. Added for group support from original netCDF3 */ char *max_sng; /* User-specified string for dimension maximum */ char *min_sng; /* User-specified string for dimension minimum */ char *mro_sng; /* User-specified string for multi-record output */ char *ssc_sng; /* User-specified string for dimension subcycle */ char *rbs_sng; /* Used by ncra, ncrcat to re-base record coordinate (holds unit attribute from first file) */ char *srd_sng; /* User-specified string for dimension stride */ double max_val; /* Double precision representation of maximum value of coordinate requested or implied */ double min_val; /* Double precision representation of minimum value of coordinate requested or implied */ double origin; /* Used by ncra, ncrcat to re-base record coordinate */ int id; /* Dimension ID */ int lmt_typ; /* crd_val or dmn_idx */ long cnt; /* # of valid elements in this dimension (including effects of stride and wrapping) */ long ssc; /* Subcycle of hyperslab */ long end; /* Index to end of hyperslab */ long max_idx; /* Index of maximum requested value in dimension */ long min_idx; /* Index of minimum requested value in dimension */ /* Following four flags are used only by multi-file operators ncra and ncrcat: */ long idx_end_max_abs; /* [idx] Maximum allowed index in record dimension (multi-file record dimension only) */ long rec_dmn_sz; /* [nbr] Number of records in this file (multi-file record dimension only) */ long rec_in_cml; /* [nbr] Cumulative number of records in all files opened so far (multi-file record dimension only) */ long rec_rmn_prv_ssc; /* [nbr] Records remaining-to-be-read to complete subcycle group from previous file (multi-file record dimension only) */ long rec_skp_ntl_spf; /* [nbr] Records skipped in initial superfluous files (multi-file record dimension only) */ long rec_skp_vld_prv; /* [nbr] Records skipped since previous good one (multi-file record dimension only) */ long srd; /* Stride of hyperslab */ long srt; /* Index to start of hyperslab */ nco_bool flg_mro; /* True for multi-record output (used by ncra only) */ nco_bool flg_input_complete; /* True for multi-file operators when no more files need be opened */ nco_bool is_rec_dmn; /* True if record dimension, else False */ nco_bool is_usr_spc_lmt; /* True if any part of limit is user-specified, else False */ nco_bool is_usr_spc_max; /* True if user-specified, else False */ nco_bool is_usr_spc_min; /* True if user-specified, else False */ nco_cln_typ lmt_cln; /* Used by ncra, ncrcat to store enum of calendar-type attribute */ } lmt_sct; /* Name ID structure */ typedef struct{ /* nm_id_sct */ char *nm; /* Variable (stub name) */ int id; /* [id] Variable ID */ int grp_id_in; /* [id] Group ID in input file */ int grp_id_out; /* [id] Group ID in output file */ } nm_id_sct; /* Rename structure */ typedef struct{ /* rnm_sct */ char *old_nm; char *new_nm; int id; } rnm_sct; /* DDRA information structure */ typedef struct{ /* ddra_info_sct */ int nco_op_typ; /* [enm] Operation type */ int rnk_avg; /* [nbr] Rank of averaging space */ int rnk_var; /* [nbr] Variable rank (in input file) */ int rnk_wgt; /* [nbr] Rank of weight */ int var_idx; /* [enm] Index */ int wrd_sz; /* [B] Bytes per element */ long long lmn_nbr; /* [nbr] Variable size */ long long lmn_nbr_avg; /* [nbr] Averaging block size */ long long lmn_nbr_wgt; /* [nbr] Weight size */ nco_bool flg_ddra; /* [flg] Run DDRA diagnostics */ nco_bool MRV_flg; /* [flg] Avergaging dimensions are MRV dimensions */ nco_bool wgt_brd_flg; /* [flg] Broadcast weight for this variable */ nco_tmr_flg tmr_flg; /* [enm] Timer flag */ } ddra_info_sct; /* Pointer union */ typedef union{ /* ptr_unn */ float * restrict fp; double * restrict dp; nco_int * restrict ip; short * restrict sp; nco_char * restrict cp; nco_byte * restrict bp; nco_ubyte * restrict ubp; nco_ushort * restrict usp; nco_uint * restrict uip; nco_int64 * restrict i64p; nco_uint64 * restrict ui64p; nco_string * restrict sngp; void * restrict vp; } ptr_unn; /* Value union */ typedef union{ /* val_unn */ float f; double d; nco_int i; short s; nco_char c; nco_byte b; nco_ubyte ub; nco_ushort us; nco_uint ui; nco_int64 i64; nco_uint64 ui64; nco_string sng; } val_unn; /* Scalar value structure */ typedef struct{ /* scv_sct */ val_unn val; /* [sct] Value */ nc_type type; /* [enm] netCDF type */ nod_typ_enm nod_typ; /* [enm] Node type */ } scv_sct; /* Group Path Editing (GPE) structure */ typedef struct{ /* gpe_sct */ char *arg; /* [sng] Full GPE specification (for debugging) */ char *edt; /* [sng] Editing component of full GPE specification */ char *nm; /* [sng] Group name component of full GPE specification */ char *nm_cnn; /* [sng] Canonicalized (i.e., slash-terminated) group name */ gpe_enm md; /* [enm] Editing mode to perform */ short lvl_nbr; /* [nbr] Number of levels to shift */ size_t lng; /* [nbr] Length of user-specified group path */ size_t lng_cnn; /* [nbr] Length of canonicalized user-specified group path */ size_t lng_edt; /* [nbr] Length of editing component of full GPE specification */ } gpe_sct; /* Attribute editing structure */ typedef struct{ /* aed_sct */ char *att_nm; /* Name of attribute */ char *var_nm; /* Name of variable, or NULL for global attribute */ int id; /* Variable ID or NC_GLOBAL (= -1) for global attribute */ long sz; /* Number of elements in attribute */ nc_type type; /* Type of attribute */ ptr_unn val; /* Pointer to attribute value */ aed_enm mode; /* Action to perform with attribute */ } aed_sct; /* MD5 flags structure */ typedef struct{ /* md5_sct */ char *att_nm; /* [sng] MD5 attribute name */ nco_bool dgs; /* [flg] Perform MD5 digests */ nco_bool wrt; /* [flg] Write MD5 digests as attributes */ } md5_sct; /* Print flags structure */ typedef struct{ /* prn_fmt_sct */ char *fl_in; /* [sng] Input filename */ char *fl_stb; /* [sng] Input filename stub */ char *smr_sng; /* [sng] Summary string */ char *spr_chr; /* [sng] Separator string for character types */ char *spr_nmr; /* [sng] Separator string for numeric types */ gpe_sct *gpe; /* I [sng] GPE structure */ md5_sct *md5; /* [flg] MD5 configuration */ nco_bool cdl; /* [flg] Print CDL */ nco_bool srm; /* [flg] Print ncStream */ nco_bool trd; /* [flg] Print traditional NCO format */ nco_bool jsn; /* [flg] Print JSON */ nco_bool xml; /* [flg] Print XML (NcML) */ nco_bool hdn; /* [flg] Print hidden attributes */ nco_bool rad; /* [flg] Retain all dimensions */ nco_bool xml_lcn; /* [flg] Print XML location tag */ nco_bool nfo_xtr; /* [flg] Print extra information in CDL/XML mode */ nco_bool new_fmt; /* [flg] Print in new format */ nco_bool nwl_pst_val; /* [flg] Print newline after variable values */ int nbr_zro; /* [nbr] Trailing zeros allowed after decimal point */ int ndn; /* [nbr] Indentation */ int fll_pth; /* [nbr] Print full paths */ int tab; /* [nbr] Number of spaces in tab */ int spc_per_lvl; /* [nbr] Indentation spaces per group level */ int sxn_fst; /* [nbr] Offset of section from group name */ int var_fst; /* [nbr] Offset of variable from section name */ char *dlm_sng; /* User specified delimiter string for printed output */ nco_bool ALPHA_BY_FULL_GROUP; /* [flg] Print alphabetically by full group */ nco_bool ALPHA_BY_FULL_OBJECT; /* [flg] Print alphabetically by full object */ nco_bool ALPHA_BY_STUB_GROUP; /* [flg] Print alphabetically by stub group */ nco_bool ALPHA_BY_STUB_OBJECT; /* [flg] Print alphabetically by stub object */ nco_bool FORTRAN_IDX_CNV; /* Option F */ nco_bool PRN_DMN_IDX_CRD_VAL; /* [flg] Print leading dimension/coordinate indices/values Option Q */ nco_bool PRN_DMN_UNITS; /* [flg] Print dimensional units Option u */ nco_bool PRN_DMN_VAR_NM; /* [flg] Print dimension/variable names */ nco_bool PRN_GLB_METADATA; /* [flg] Print global metadata */ nco_bool PRN_MSS_VAL_BLANK; /* [flg] Print missing values as blanks */ nco_bool PRN_VAR_DATA; /* [flg] Print variable data */ nco_bool PRN_VAR_METADATA; /* [flg] Print variable metadata */ } prn_fmt_sct; /* Types used in regrid structure */ typedef enum nco_grd_2D_typ_enm{ /* [enm] Two-dimensional grid-type enum */ nco_grd_2D_nil=0, nco_grd_2D_gss, /* Gaussian latitudes used by global spectral models: CCM 1-3, CAM 1-3, LSM, MATCH, UCICTM */ nco_grd_2D_fv, /* FV scalar grid (lat[0]=-90): CAM FV, GEOS-CHEM, UCICTM, UKMO */ nco_grd_2D_eqa, /* Equi-angle offset grid, FV staggered velocity grid (lat[0]=-89.X)): CIESIN/SEDAC, IGBP-DIS, TOMS AAI */ nco_grd_2D_unk, /* Unknown or unclassified, POP displaced-pole */ } nco_grd_2D_typ_enm; typedef enum nco_grd_lat_typ_enm{ /* [enm] Latitude grid-type enum */ nco_grd_lat_nil=0, nco_grd_lat_unk, /* Unknown or unclassified latitude grid type (e.g., curvilinear) */ nco_grd_lat_gss, /* Gaussian latitude grid used by global spectral models: CCM 1-3, CAM 1-3, LSM, MATCH, UCICTM */ nco_grd_lat_fv, /* FV latitude grid. Equi-angle (except at poles) latitude grid with odd number of latitudes so poles are considered at (and labeled as) centers of first and last gridcells (i.e., lat_ctr[0]=-90), and those polar gridcells span half the equi-angular latitude increment, aka FV scalar grid: CAM FV, GEOS-CHEM, UCICTM, UKMO */ nco_grd_lat_eqa, /* Equi-Angular latitude grid. Equi-angle (everywhere) latitude grid. Poles are at edges of first and last gridcells (i.e., lat_ctr[0]=-89.xxx). AKA FV-staggered velocity grid. Used by CIESIN/SEDAC, IGBP-DIS, TOMS AAI */ } nco_grd_lat_typ_enm; typedef enum nco_grd_lon_typ_enm{ /* [enm] Longitude grid-type enum */ nco_grd_lon_nil=0, nco_grd_lon_unk, /* Unknown or unclassified longitude grid type (e.g., curvilinear) */ nco_grd_lon_180_wst, /* Date line at west edge of first longitude cell */ nco_grd_lon_180_ctr, /* Date line at center of first longitude cell */ nco_grd_lon_Grn_wst, /* Greenwich at west edge of first longitude cell */ nco_grd_lon_Grn_ctr, /* Greenwich at center of first longitude cell */ nco_grd_lon_bb, /* Longitude grid determined by bounding box (lon_wst/lon_est) and gridcell number (lon_nbr) */ } nco_grd_lon_typ_enm; /* Regrid structure */ typedef struct{ /* rgr_sct */ // File names specifiable with individual command line switches char *drc_tps; /* [sng] Data directory for Tempest grids, meshes, and weights */ char *fl_grd_src; /* [sng] File containing input grid */ char *fl_grd_dst; /* [sng] File containing destination grid */ char *fl_in; /* [sng] File containing fields to be regridded */ char *fl_out; /* [sng] File containing regridded fields */ char *fl_out_tmp; /* [sng] Temporary file containing regridded fields */ char *fl_map; /* [sng] File containing mapping weights from source to destination grid */ char *var_nm; /* [sng] Variable for special regridding treatment */ // Grid names specifiable with key-value syntax char **rgr_arg; /* [sng] Regridding arguments */ char *area_nm; /* [sng] Name of variable containing gridcell area */ char *bnd_nm; /* [sng] Name of dimension to employ for spatial bounds */ char *bnd_tm_nm; /* [sng] Name of dimension to employ for temporal bounds */ char *col_nm_in; /* [sng] Name to recognize as input horizontal spatial dimension on unstructured grid */ char *col_nm_out; /* [sng] Name of horizontal spatial output dimension on unstructured grid */ char *frc_nm; /* [sng] Name of variable containing gridcell fraction */ char *lat_bnd_nm; /* [sng] Name of rectangular boundary variable for latitude */ char *lat_nm_in; /* [sng] Name of input dimension to recognize as latitude */ char *lat_nm_out; /* [sng] Name of output dimension for latitude */ char *lat_vrt_nm; /* [sng] Name of non-rectangular boundary variable for latitude */ char *lat_wgt_nm; /* [sng] Name of variable containing latitude weights */ char *lon_bnd_nm; /* [sng] Name of rectangular boundary variable for longitude */ char *lon_nm_in; /* [sng] Name of dimension to recognize as longitude */ char *lon_nm_out; /* [sng] Name of output dimension for longitude */ char *lon_vrt_nm; /* [sng] Name of non-rectangular boundary variable for longitude */ char *vrt_nm; /* [sng] Name of dimension to employ for vertices */ // User-specified grid properties char *fl_grd; /* [sng] Name of grid file to create */ char *fl_skl; /* [sng] Name of skeleton data file to create */ char *grd_ttl; /* [sng] Grid title */ double lat_crv; /* [dgr] Latitudinal curvilinearity */ double lon_crv; /* [dgr] Longitudinal curvilinearity */ double lat_sth; /* [dgr] Latitude of southern edge of grid */ double lon_wst; /* [dgr] Longitude of western edge of grid */ double lat_nrt; /* [dgr] Latitude of northern edge of grid */ double lon_est; /* [dgr] Longitude of eastern edge of grid */ long lat_nbr; /* [nbr] Number of latitudes in destination grid */ long lon_nbr; /* [nbr] Number of longitudes in destination grid */ nco_grd_2D_typ_enm grd_typ; /* [enm] Destination grid-type enum */ nco_grd_lat_typ_enm lat_typ; /* [enm] Latitude grid-type enum */ nco_grd_lon_typ_enm lon_typ; /* [enm] Longitude grid-type enum */ // Other internal data and metadata char **xtn_var; /* [sng] Extensive variables */ char *cmd_ln; /* [sng] Command-line */ double wgt_vld_thr; /* [frc] Weight threshold for valid destination value */ int in_id; /* [id] Input netCDF file ID */ int out_id; /* [id] Output netCDF file ID */ int rgr_nbr; /* [nbr] Number of regridding arguments */ int xtn_nbr; /* [nbr] Number of extensive variables */ long idx_dbg; /* [idx] Index of gridcell for debugging */ long tst; /* [enm] Generic key for testing (undocumented) */ nco_bool flg_usr_rqs; /* [flg] User requested regridding */ nco_bool flg_grd_src; /* [flg] User-specified input grid */ nco_bool flg_grd_dst; /* [flg] User-specified destination grid */ nco_bool flg_crv; /* [flg] Use curvilinear coordinates */ nco_bool flg_grd; /* [flg] Create SCRIP-format grid file */ nco_bool flg_nfr; /* [flg] Infer SCRIP-format grid file */ nco_bool flg_map; /* [flg] User-specified mapping weights */ nco_bool flg_rnr; /* [flg] Renormalize destination values by valid area */ } rgr_sct; /* Key-value structure */ typedef struct{ char *key; char *val; } kvm_sct; /* Attribute structure */ typedef struct{ /* att_sct */ char *nm; nc_type type; long sz; char fmt[5]; ptr_unn val; } att_sct; /* Per-dimension chunking specification (free with nco_cnk_dmn_free()) */ typedef struct{ /* cnk_dmn_sct */ char *nm; /* [sng] Dimension name */ char *nm_fll; /* [sng] Full dimension name */ size_t sz; /* [nbr] Chunk size */ nco_bool is_usr_spc_cnk; /* [flg] Chunk size was user-specified */ } cnk_dmn_sct; /* Chunking structure */ typedef struct{ /* cnk_sct */ nco_bool flg_usr_rqs; /* [flg] User requested chunking */ int cnk_nbr; /* [nbr] Number of user-specified chunk sizes */ cnk_dmn_sct **cnk_dmn; /* [sct] User-specified per-dimension chunking information */ int cnk_map; /* [enm] Chunking map */ int cnk_plc; /* [enm] Chunking policy */ size_t cnk_min_byt; /* [B] Minimize size of variable to chunk */ size_t cnk_sz_byt; /* [B] Chunk size in Bytes */ size_t cnk_sz_scl; /* [nbr] Chunk size scalar */ } cnk_sct; /* GTT structure to break full path name into components */ typedef struct{ char *nm; /* [sng] Path component */ int psn; /* [nbr] Position of path component */ } sng_pth_sct; /* MSA Limits structure: GTT has a member for every unique dimension and for every coordinate variable */ typedef struct { char *dmn_nm; /* [sng] Dimension name */ long dmn_sz_org; /* [nbr] Original size of dimension */ long dmn_cnt; /* [nbr] Hyperslabbed size of dimension */ nco_bool NON_HYP_DMN; /* [flg] Limit is same as dimension in input file */ nco_bool WRP; /* [flg] Limit is wrapped (true if wrapping, lmt_dmn_nbr==2) */ nco_bool MSA_USR_RDR; /* [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ int lmt_dmn_nbr; /* [nbr] Number of lmt arguments */ lmt_sct **lmt_dmn; /* [sct] List of limit structures associated with each dimension */ int lmt_crr; /* [nbr] Index of current limit structure being initialized (helper to initialze lmt_sct*) */ } lmt_msa_sct; /* GTT coordinate variable structure; it contains netCDF model fields and an MSA field */ typedef struct{ char *crd_nm_fll; /* [sng] Full coordinate name */ char *dmn_nm_fll; /* [sng] Full name of dimension for *this* coordinate */ char *crd_grp_nm_fll; /* [sng] Full group name where coordinate is located */ char *dmn_grp_nm_fll; /* [sng] Full group name where dimension of *this* coordinate is located */ char *nm; /* [sng] Name of dimension and coordinate */ nco_bool is_rec_dmn; /* [flg] Is a record dimension? */ size_t sz; /* [nbr] Size of coordinate */ nc_type var_typ; /* [enm] NetCDF type */ lmt_msa_sct lmt_msa; /* [sct] MSA Limits structure for every coordinate */ int dmn_id; /* [ID] Unique ID for dimension (duplicate of dmn_trv_sct.dim_id, since all coordinates share that ID) */ int grp_dpt; /* [nbr] Depth of group (root = 0); needed to get in scope of variable match */ } crd_sct; /* GTT dimension structure (stored in *groups*); it contains netCDF model fields and an MSA field */ typedef struct{ char *grp_nm_fll; /* [sng] Full group name where dimension was defined */ char *nm_fll; /* [sng] Dimension fully qualified name (path) */ char *nm; /* [sng] Dimension name */ nco_bool is_rec_dmn; /* [flg] Is a record dimension? */ size_t sz; /* [nbr] Size of dimension */ int crd_nbr; /* [nbr] Number of coordinate structures */ crd_sct **crd; /* [sct] List of coordinate structures */ lmt_msa_sct lmt_msa; /* [sct] MSA Limits structure (implicit that is for non-coordinate case) */ int dmn_id; /* [ID] Dimension ID; same as "var_dmn_sct.id" from nc_inq_dimid() */ nco_bool has_crd_scp; /* [flg] Does variable with same name exist in dimension's scope? */ nco_bool flg_xtr; /* [flg] Extract dimension */ } dmn_trv_sct; /* Build a list of 'standard_name' 'latitude' and 'longitude' coordinates (Auxiliary Coordinates) */ typedef struct{ char *nm_fll; /* [sng] Coordinate full name ('latitude' or 'longitude') */ int dmn_id; /* [id] Dimension ID of dimension of 'latitude' and 'longitude' coordinate variables, e.g., lat_gds(gds_crd) */ char units[NC_MAX_NAME+1]; /* [sng] Units of 'latitude' and 'longitude' */ nc_type crd_typ; /* [enm] netCDF type of both "latitude" and "longitude" */ int grp_dpt; /* [nbr] Depth of group (root = 0) */ } aux_crd_sct; /* GTT Variable dimensions: Dimensions have name and size, and maybe an associated (coordinate) variable */ typedef struct{ char *dmn_nm_fll; /* [sng] Full dimension name */ char *dmn_nm; /* [sng] Dimension name */ char *grp_nm_fll; /* [sng] Full group where dimension is defined */ nco_bool is_rec_dmn; /* [flg] Is a record dimension? */ nco_bool is_crd_var; /* [flg] Dimension has an associated coordinate variable */ crd_sct *crd; /* [sct] Pointer to coordinate variable if any */ dmn_trv_sct *ncd; /* [sct] Pointer to non-coordinate dimension if any */ int dmn_id; /* [ID] Dimension ID; same as dmn_trv_sct.id from nc_inq_vardimid() */ aux_crd_sct *lat_crd; /* [lst] Array of 'latitude' coordinates */ aux_crd_sct *lon_crd; /* [lst] Array of 'longitude' coordinates */ int nbr_lat_crd; /* [nbr] Number of items in 'latitude' coordinates array */ int nbr_lon_crd; /* [nbr] Number of items in 'longitude' coordinates array */ /* Following are members only used by transformation operators (non-ncks) */ nco_bool flg_dmn_avg; /* [flg] Diferentiate between dimensions to average or keep for this variable (ncwa) */ nco_bool flg_rdd; /* [flg] Retain dimension as degenerate (size 1) (ncwa) */ } var_dmn_sct; /* Processing type enumerator */ typedef enum { err_typ=-1, /* -1 [enm] Invalid type for initialization */ fix_typ, /* 0 [enm] Fixed variable (operator alters neither data nor metadata) */ prc_typ /* 1 [enm] Process variable (operator may alter data and metadata) */ } prc_typ_enm; /* GTT Object structure Information for each object/node in traversal tree Contains basic information about this object/node needed by traversal algorithm Node/object is either group or variable like in HDF5 Initialize trv_sct structure to defaults in trv_tbl_init() Populate trv_sct structure with correct values in nco_grp_itr() Deep-copy each pointer member of trv_sct structure in nco_grp_itr() free() each pointer member of trv_sct structure in trv_tbl_free() */ typedef struct{ nco_obj_typ nco_typ; /* [enm] netCDF4 object type: group or variable */ char *nm_fll; /* [sng] Fully qualified name (path) */ var_dmn_sct *var_dmn; /* [sct] (For variables only) Dimensions for variable object */ nco_bool is_crd_var; /* [flg] (For variables only) Is a coordinate variable? (unique dimension exists in scope) */ nco_bool is_rec_var; /* [flg] (For variables only) Is a record variable? (is_crd_var must be True) */ nc_type var_typ; /* [enm] (For variables only) NetCDF type */ size_t nm_fll_lng; /* [sng] Length of full name */ char *grp_nm_fll; /* [sng] Full group name (for groups, same as nm_fll) */ char *grp_nm; /* [sng] Group name (for groups, same as nm) */ char *nm; /* [sng] Relative name (i.e., variable name or last component of path name for groups) */ size_t nm_lng; /* [sng] Length of short name */ int grp_dpt; /* [nbr] Depth of group (root = 0) */ int nbr_att; /* [nbr] Number of attributes */ int nbr_dmn; /* [nbr] Number of dimensions */ int nbr_rec; /* [nbr] Number of record dimensions */ int nbr_grp; /* [nbr] (For groups only) Number of sub-groups */ int nbr_var; /* [nbr] (For groups only) Number of variables */ int ppc; /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ nco_bool flg_nsd; /* [flg] PPC is NSD */ nco_bool flg_cf; /* [flg] Object matches CF-metadata extraction criteria */ nco_bool flg_crd; /* [flg] Object matches coordinate extraction criteria */ nco_bool flg_dfl; /* [flg] Object meets default subsetting criteria */ nco_bool flg_gcv; /* [flg] Group contains matched variable */ nco_bool flg_mch; /* [flg] Object matches user-specified strings */ nco_bool flg_mtd; /* [flg] Group contains only metadata */ nco_bool flg_ncs; /* [flg] Group is ancestor of specified group or variable */ nco_bool flg_nsx; /* [flg] Object matches intersection criteria */ nco_bool flg_rcr; /* [flg] Extract group recursively */ nco_bool flg_rgr; /* [flg] Regrid variable */ nco_bool flg_xtn; /* [flg] Extensive variable */ nco_bool flg_mrv; /* [flg] Most-Rapidly-Varying horizontal dimensions variable */ nco_bool flg_unn; /* [flg] Object matches union criteria */ nco_bool flg_vfp; /* [flg] Variable matches full path specification */ nco_bool flg_vsg; /* [flg] Variable selected because group matches */ nco_bool flg_xcl; /* [flg] Object matches exclusion criteria */ nco_bool flg_xtr; /* [flg] Extract object */ nco_bool flg_aux; /* [flg] Variable contains auxiliary coordinates */ nco_bool flg_std_att_lat; /* [flg] Variable contains 'standard_name' attribute "latitude" */ nco_bool flg_std_att_lon; /* [flg] Variable contains 'standard_name' attribute "longitude" */ /* Following are members only used by transformation operators (non-ncks) */ prc_typ_enm enm_prc_typ; /* [enm] Processing type enumerator */ nc_type var_typ_out; /* [enm] NetCDF type in output file (ncflint) (ncpdq) */ int *dmn_idx_out_in; /* [nbr] Dimension correspondence, output->input (ncpdq); output of nco_var_dmn_rdr_mtd() */ nco_bool *dmn_rvr_in; /* [flg] Reverse dimensions (ncpdq) */ nco_bool flg_rdr; /* [flg] Variable has dimensions to re-order (ncpdq) */ char *rec_dmn_nm_out; /* [sng] Record dimension name, re-ordered (ncpdq) (used as flag also for re-defined record dimension)*/ char *grp_nm_fll_prn; /* [sng] (ncge) Parent group full name */ /* Good hash, dude */ UT_hash_handle hh; /* [sct] Handle for hash table */ char *hsh_key; /* [sng] Hash key (must be unique!) */ nco_bool flg_nsm_prn; /* [flg] (ncge) Group is ensemble parent group */ nco_bool flg_nsm_mbr; /* [flg] (ncge) Variable or group is ensemble member */ nco_bool flg_nsm_tpl; /* [flg] (ncge) Variable is template */ char *nsm_nm; /* [sng] (ncge) Ensemble parent group name i.e., full path to ensemble parent */ } trv_sct; /* Fill actual value of dmn_sct structure in nco_dmn_fll() free() each pointer member of dmn_sct structure in nco_dmn_free() deep-copy each pointer member of dmn_sct structure in nco_dmn_dpl() */ /* Dimension structure */ typedef struct dmn_sct_tag{ /* dmn_sct */ char *nm; /* [sng] Dimension name */ char *nm_fll; /* [sng] Dimension full name */ char fmt[5]; /* [sng] Hint for printf()-style formatting */ int cid; /* [id] Variable ID of associated coordinate, if any */ int id; /* [id] Dimension ID */ int nc_id; /* [id] File ID */ long cnt; /* [nbr] Number of valid elements in this dimension (including effects of stride and wrapping) */ long end; /* [idx] Index to end of hyperslab */ long srd; /* [nbr] Stride of hyperslab */ long srt; /* [idx] Index to start of hyperslab */ long sz; /* [nbr] Full size of dimension in file (NOT the hyperslabbed size) */ nc_type type; /* [enm] Type of coordinate, if applicable */ ptr_unn val; /* [sct] Buffer to hold hyperslab (used by nco_prn to hold coordinate values) */ short is_crd_dmn; /* [flg] Is this a coordinate dimension? */ short is_rec_dmn; /* [flg] Is this the record dimension? */ size_t cnk_sz; /* [nbr] Chunk size */ struct dmn_sct_tag *xrf; /* [sct] Cross-reference to associated dimension structure (usually the structure for dimension on output) */ } dmn_sct; /* end dmn_sct_tag */ /* Ensemble group structure (ncge). It contains a name for the group (e.g., /cesm/cesm_01) and a list of variables for the group */ typedef struct{ char *mbr_nm_fll; /* [sng] Goup full name */ char **var_nm_fll; /* [sng] List of full variable names for this group (e.g., /cesm/cesm_01/tas) */ int var_nbr; /* [nbr] Number of variable for this group (size of above array) */ } nsm_grp_sct; /* Ensemble (ncge) */ typedef struct{ char *grp_nm_fll_prn; /* [sng] Parent group full name (key for ensemble) (e.g., /cesm) */ nsm_grp_sct *mbr; /* [sng] List of ensemble group member structs (size is mbr_nbr) */ int mbr_nbr; /* [nbr] Number of members (groups) of ensemble (i.e., number in this ensemble in this file) */ char **tpl_mbr_nm; /* [sng] List of variable that act as templates (first, store relative name) (e.g., /cesm/cesm_01/tas) */ int tpl_nbr; /* [nbr] Number of variables that are templates in group */ char **skp_nm_fll; /* [sng] Skip list (fixed variables to define at ensemble parent group, store full name) (e.g., /cesm/cesm_01/time) */ int skp_nbr; /* [nbr] Number of skip list variables */ int mbr_srt; /* [nbr] Member offsets, start (multi files, keep track of new added members) */ int mbr_end; /* [nbr] Member offsets, end (multi files, keep track of new added members) */ } nsm_sct; /* Name structure */ typedef struct{ /* nm_sct */ char *nm; /* [sng] Name */ } nm_sct; /* Name list structure */ typedef struct{ nm_sct *lst; /* [sct] List of nm_sct (char * currently) */ int nbr; /* [nbr] Number of items in "lst" array */ } nm_lst_sct; /* GTT (Group Traversal Table) structure contains two lists 1) lst: All objects (variables and groups) in file tree (HDF5 model) 2) lst_dmn: All unique dimensions (in groups) in file tree (netCDF addition to HDF5) */ typedef struct{ trv_sct *lst; /* [sct] Array of trv_sct */ unsigned int nbr; /* [nbr] Number of trv_sct elements */ dmn_trv_sct *lst_dmn; /* [sct] Array of dmn_trv_sct */ unsigned int nbr_dmn; /* [nbr] Number of dmn_trv_sct elements */ trv_sct *hsh; /* [hsh] Hash table of all trv_sct objects */ dmn_sct *dmn_dgn; /* [sct] (ncwa) Degenerate dimensions */ int nbr_dmn_dgn; /* [sct] (ncwa) Number of degenerate dimensions (size of above array) */ int nsm_nbr; /* [nbr] (ncge) Number of ensembles (i.e., number in first file) */ nsm_sct *nsm; /* [lst] (ncge) List of ensembles (size is nsm_nbr) */ char *nsm_sfx; /* [sng] (ncge) Ensemble suffix (e.g., /cesm + _avg). Store here instead of passing as function parameters (ncge only) */ int thr_nbr; /* [nbr] Thread number Option t */ int *in_id_arr; /* [id] netCDF file IDs used by OpenMP code */ } trv_tbl_sct; /* GPE duplicate name check structure */ typedef struct{ /* gpe_nm_sct */ char *var_nm_fll; /* [sng] Fully qualified variable name */ } gpe_nm_sct; /* Common variable names; common defined as same absolute path in 2 files */ typedef struct{ char *nm; /* [sng] A name */ nco_bool flg_in_fl[2]; /* [flg] Is this name in each file?; files are [0] and [1] */ } nco_cmn_t; /* cell_methods structure */ typedef struct{ char *dmn_nm; /* [sng] Dimension name */ int op_type; /* [enm] Operation type */ } cell_methods_sct; /* Limit "lmt_sct" monotonic direction */ typedef enum { decreasing, /* 0 */ increasing, /* 1 */ not_checked /* 2 */ } monotonic_direction_enm; /* Structure to check for valid input dimension */ typedef struct { nco_bool flg_dne; /* [flg] Flag to check if input dimension -d "does not exist" */ char *dim_nm; /* [sng] Dimension name */ } nco_dmn_dne_t; /* Initialize default value of each member of var_sct structure in var_dfl_set() Fill actual value of var_sct structure in nco_var_fll() free() each pointer member of var_sct structure in nco_var_free() deep-copy each pointer member of var_sct structure in nco_var_dpl() */ /* Variable structure */ typedef struct var_sct_tag{ /* var_sct */ char *nm; /* [sng] Variable name */ char *nm_fll; /* [sng] Absolute variable name (needed for GTT search for object by full name) */ char fmt[5]; /* [sng] Hint for printf()-style formatting */ double *wgt_sum; /* [frc] Running sum of per-file weights (ncra/ncea only) */ double wgt_crr; /* [frc] Weight of current record (ncra/ncea only) */ dmn_sct **dim; /* [sct] Pointers to full dimension structures */ int *dmn_id; /* [id] Contiguous vector of dimension IDs */ int cid; /* [id] Dimension ID of associated coordinate, if any */ int dfl_lvl; /* [enm] Deflate level [0..9] */ int has_add_fst; /* [flg] Valid add_offset attribute exists */ int has_dpl_dmn; /* [flg] Variable has duplicate copies of same dimension */ int has_mss_val; /* [flg] Is there a missing_value attribute? */ int has_scl_fct; /* [flg] Valid scale_factor attribute exists */ int id; /* [id] Variable ID */ int nbr_att; /* [nbr] Number of attributes */ int nbr_dim; /* [nbr] Number of dimensions of variable in input file */ int nc_id; /* [id] File ID */ int pck_dsk; /* [flg] Variable is packed on disk (valid scale_factor, add_offset, or both attributes exist) */ int pck_ram; /* [flg] Variable is packed in memory (valid scale_factor, add_offset, or both attributes exist) */ int shuffle; /* [flg] Turn on shuffle filter */ int undefined; /* [flg] Variable is still undefined (in first parser pass) */ long *cnt; /* [nbr] Contiguous vector of lengths of hyperslab */ long *end; /* [idx] Contiguous vector of indices to end of hyperslab */ long *srd; /* [nbr] Contiguous vector of stride of hyperslab */ long *srt; /* [idx] Contiguous vector of indices to start of hyperslab */ long *tally; /* [nbr] Number of valid operations performed so far */ long sz; /* [nbr] Number of elements (NOT bytes) in hyperslab (NOT full size of variable in input file!) */ long sz_rec; /* [nbr] Number of elements in one record of hyperslab */ nc_type typ_dsk; /* [enm] Type of variable on disk (never changes) */ nc_type typ_pck; /* [enm] Type of variable when packed (on disk). typ_pck = typ_dsk except in cases where variable is packed in input file and unpacked in output file. */ nc_type typ_upk; /* [enm] Type of variable when unpacked (expanded) (in memory) */ nc_type type; /* [enm] Type of variable in RAM */ ptr_unn add_fst; /* [frc] Value of add_offset attribute of type typ_upk */ ptr_unn mss_val; /* [frc] Value of missing_value attribute, if any (mss_val stored in this structure must be same type as variable) */ ptr_unn scl_fct; /* [frc] Value of scale_factor attribute of type typ_upk */ ptr_unn val; /* [bfr] Buffer to hold hyperslab */ short is_crd_var; /* [flg] Is this a coordinate variable? */ short is_fix_var; /* [flg] Is this a fixed (non-processed) variable? */ short is_rec_var; /* [flg] Is this a record variable? */ size_t *cnk_sz; /* [id] Contiguous vector of chunk sizes */ struct var_sct_tag *xrf; /* [sct] Cross-reference to associated variable structure (usually structure for variable on output) fxm: deprecate! TODO nco226 */ } var_sct; /* end var_sct_tag */ /* Dimension utility structure to share common fields; used in nco_cnk_sz_set_trv() */ typedef struct{ char *nm_fll; /* [sng] Full dimension name */ char nm[NC_MAX_NAME+1L];/* [sng] Name of dimension/coordinate */ int id; /* [id] Dimension ID */ nco_bool NON_HYP_DMN; /* [flg] Limit is same as dimension in input file */ nco_bool is_rec_dmn; /* [flg] Dimension is unlimited/record dimension */ size_t dmn_cnt; /* [nbr] Hyperslabbed size of dimension (= sz iff !NON_HYP_DMN) */ size_t sz; /* [nbr] Size (non-hyperslabbed) of dimension */ } dmn_cmn_sct; #ifdef __cplusplus } /* end extern "C" */ #endif /* !__cplusplus */ #endif /* NCO_H */ nco-4.5.4/src/nco/nco_att_utl.c000066400000000000000000002740301264355130400163410ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Attribute utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_att_utl.h" /* Attribute utilities */ /* Microsoft standard C library lacks standard definitions for strtoll(), strtoull() 20140522 fxm: strtoll() and strtull() currently only used in nco_att_utl.c Yes Microsoft replacement functions are generic Should dangling definitions be placed in other header file, e.g., nco_rth_flt.h? */ #ifdef _MSC_VER # define strtoull _strtoui64 # define strtoll _strtoi64 #endif /* !_MSC_VER */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_wrp /* [fnc] Expand regular expressions then pass attribute edits to nco_aed_prc() */ (const int nc_id, /* I [id] Input netCDF file ID */ const int var_id, /* I [id] ID of variable on which to perform attribute editing */ const aed_sct aed) /* I [sct] Attribute-edit information */ { /* Purpose: Wrapper for nco_aed_prc(), which processes single attribute edit for single variable This wrapper passes its arguments straight throught to nco_aed_prc() with one exception--- it unrolls attribute names that are regular expressions into multiple calls to nco_aed_prc() */ const char fnc_nm[]="nco_aed_prc_wrp()"; /* [sng] Function name */ nco_bool flg_chg=False; /* [flg] Attribute was altered */ if(aed.att_nm && !strpbrk(aed.att_nm,".*^$\\[]()<>+?|{}")){ // const char foo[]="foo {{"; /* NB: previous line confuses Emacs C-mode indenter. Restore with isolated parenthesis? */ /* If attribute name is not regular expression, call single attribute routine then return */ flg_chg|=nco_aed_prc(nc_id,var_id,aed); return flg_chg; /* [flg] Attribute was altered */ } /* !rx */ aed_sct aed_swp; /* [sct] Attribute-edit information */ char **att_nm_lst; int att_idx; int att_nbr; int grp_id; grp_id=nc_id; /* Get number of attributes for variable/group */ (void)nco_inq_varnatts(grp_id,var_id,&att_nbr); /* 20150629: Read in all attribute names before any editing This is because creation and deletion of attributes changes their number According to netCDF documentation, "The number of an attribute is more volatile than the name, since it can change when other attributes of the same variable are deleted. This is why an attribute number is not called an attribute ID." */ att_nm_lst=(char **)nco_malloc(att_nbr*sizeof(char *)); for(att_idx=0;att_idxre_nsub+1L; /* Number of parenthesized sub-expressions */ /* Search string */ result=(regmatch_t *)nco_malloc(sizeof(regmatch_t)*rx_prn_sub_xpr_nbr); /* Regular expression is ready to use */ /* Check each attribute for match to rx */ for(att_idx=0;att_idx= nco_dbg_crr && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s examining variable %s\n",nco_prg_nm_get(),fnc_nm,var_nm); /* Query attribute metadata when attribute name was specified */ if(aed.att_nm) rcd_inq_att=nco_inq_att_flg(nc_id,var_id,aed.att_nm,&att_typ,&att_sz); /* Before changing metadata, change missing values to new missing value if warranted This capability is add-on feature not implemented too cleanly or efficiently If every variable has "_FillValue" attribute and "_FillValue" is changed globally, then algorithm goes into and out of define mode for each variable, rather than collecting all information in first pass and replacing all data in second pass. This is because ncatted was originally designed to change only metadata and so was architected differently from other NCO operators. */ if( aed.att_nm /* Linux strcmp() dumps core if attribute name is blank */ && strcmp(aed.att_nm,nco_mss_val_sng_get()) == 0 /* Current attribute is "_FillValue" */ && var_id != NC_GLOBAL /* Current attribute is not global */ && (aed.mode == aed_modify || aed.mode == aed_overwrite) /* Modifying or overwriting existing value */ && rcd_inq_att == NC_NOERR /* Only when existing _FillValue attribute is modified */ && att_sz == 1L /* Old _FillValue attribute must be of size 1 */ && aed.sz == 1L /* New _FillValue attribute must be of size 1 */ ){ int *dmn_id; long *dmn_sz; long *dmn_srt; long idx; long var_sz=long_CEWI; ptr_unn mss_val_crr; ptr_unn mss_val_new; ptr_unn var_val; var_sct *var=NULL_CEWI; if(nco_dbg_lvl_get() >= nco_dbg_std && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO Replacing missing value data in variable %s\n",nco_prg_nm_get(),var_nm); /* Take file out of define mode */ (void)nco_enddef(nc_id); /* Initialize (partially) variable structure */ var=(var_sct *)nco_malloc(sizeof(var_sct)); var->nc_id=nc_id; var->id=var_id; var->sz=1L; /* Get type of variable and number of dimensions */ (void)nco_inq_var(nc_id,var_id,(char *)NULL,&var->type,&var->nbr_dim,(int *)NULL,(int *)NULL); dmn_id=(int *)nco_malloc(var->nbr_dim*sizeof(int)); dmn_sz=(long *)nco_malloc(var->nbr_dim*sizeof(long int)); dmn_srt=(long *)nco_malloc(var->nbr_dim*sizeof(long int)); (void)nco_inq_vardimid(nc_id,var_id,dmn_id); /* Get dimension sizes and construct variable size */ for(idx=0;idxnbr_dim;idx++){ (void)nco_inq_dimlen(nc_id,dmn_id[idx],dmn_sz+idx); var->sz*=dmn_sz[idx]; dmn_srt[idx]=0L; } /* end loop over dim */ var->dmn_id=dmn_id; var->cnt=dmn_sz; var->srt=dmn_srt; /* Place nco_var_get() code inline since var struct is not truly complete */ if((var->val.vp=(void *)nco_malloc_flg(var->sz*nco_typ_lng(var->type))) == NULL){ (void)fprintf(stdout,"%s: ERROR Unable to malloc() %ld*%lu bytes in %s\n",nco_prg_nm_get(),var->sz,(unsigned long)nco_typ_lng(var->type),fnc_nm); nco_exit(EXIT_FAILURE); } /* end if */ if(var->sz > 1L){ (void)nco_get_vara(nc_id,var_id,var->srt,var->cnt,var->val.vp,var->type); }else{ (void)nco_get_var1(nc_id,var_id,var->srt,var->val.vp,var->type); } /* end else */ /* Get current missing value attribute */ var->mss_val.vp=NULL; var->has_mss_val=nco_mss_val_get(nc_id,var); /* Sanity check */ if(var->has_mss_val == False){ (void)fprintf(stdout,"%s: ERROR variable %s does not have \"%s\" attribute in %s\n",nco_prg_nm_get(),var_nm,nco_mss_val_sng_get(),fnc_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Shortcuts to avoid indirection */ var_val=var->val; var_sz=var->sz; /* Get new and old missing values in same type as variable */ mss_val_crr.vp=(void *)nco_malloc(att_sz*nco_typ_lng(var->type)); mss_val_new.vp=(void *)nco_malloc(aed.sz*nco_typ_lng(var->type)); (void)nco_val_cnf_typ(var->type,var->mss_val,var->type,mss_val_crr); (void)nco_val_cnf_typ(aed.type,aed.val,var->type,mss_val_new); /* Typecast pointer to values before access */ (void)cast_void_nctype(var->type,&var_val); (void)cast_void_nctype(var->type,&mss_val_crr); (void)cast_void_nctype(var->type,&mss_val_new); switch(var->type){ /* case NC_FLOAT: for(idx=0L;idxtype,&var_val); (void)cast_nctype_void(var->type,&mss_val_crr); (void)cast_nctype_void(var->type,&mss_val_new); /* Write to disk */ if(var->nbr_dim == 0){ (void)nco_put_var1(nc_id,var_id,var->srt,var->val.vp,var->type); }else{ /* end if variable is scalar */ (void)nco_put_vara(nc_id,var_id,var->srt,var->cnt,var->val.vp,var->type); } /* end else */ /* Free memory */ mss_val_crr.vp=nco_free(mss_val_crr.vp); mss_val_new.vp=nco_free(mss_val_new.vp); var->mss_val.vp=nco_free(var->mss_val.vp); var->val.vp=nco_free(var->val.vp); var->dmn_id=(int *)nco_free(var->dmn_id); var->srt=(long *)nco_free(var->srt); var->cnt=(long *)nco_free(var->cnt); /* 20050704 try and use nco_free() to avoid valgrind error message */ var=(var_sct *)nco_free(var); /* Put file back in define mode */ (void)nco_redef(nc_id); } /* end if replacing missing value data */ /* Change metadata (as written, this must be done after _FillValue data is replaced) */ #ifdef NCO_NETCDF4_AND_FILLVALUE /* According to netCDF4 C Reference Manual: "Fill values must be written while the file is still in initial define mode, that is, after the file is created, but before it leaves define mode for the first time. NC EFILLVALUE is returned when the user attempts to set the fill value after it is too late." The netCDF4/_FillValue code (and rename trick) works around that limitation. */ /* Bold hack which gets around problem of modifying netCDF4 "_FillValue" attributes netCDF4 does not allow this by default, though netCDF3 does Change attribute name to att_nm_tmp, modify value, then restore name */ /* Check if file is netCDF3 classic with netCDF4 library If so, do not employ rename trick NB: create global rather than local-scope variable for output file format? */ { /* Temporary scope for fl_fmt */ int fl_fmt; (void)nco_inq_format(nc_id,&fl_fmt); flg_fmt_netCDF4=(fl_fmt==NC_FORMAT_NETCDF4 || fl_fmt==NC_FORMAT_NETCDF4_CLASSIC); } /* end scope */ if( flg_fmt_netCDF4 && /* Output file is netCDF4 and ... */ aed.att_nm && /* 20130419: Verify att_nm exists before using it in strcmp() below. att_nm does not exist when user leaves field blank. Fix provided by Etienne Tourigny. */ !strcmp(aed.att_nm,nco_mss_val_sng_get()) && /* ... attribute is missing value and ... */ aed.mode != aed_delete && /* ... we are not deleting attribute */ NC_LIB_VERSION <= 440){ /* netCDF library does not contain fix to NCF-187 */ /* Rename existing attribute to netCDF4-safe name After modifying missing value attribute with netCDF4-safe name below, we will rename attribute to original missing value name. */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s reports creating, modifying, or overwriting %s attribute %s in netCDF4 file requires re-name trick\n",nco_prg_nm_get(),fnc_nm,var_nm,aed.att_nm); if(rcd_inq_att == NC_NOERR) (void)nco_rename_att(nc_id,var_id,aed.att_nm,att_nm_tmp); flg_netCDF4_rename_trick=True; /* [flg] Re-name _FillValue in order to create/modify/overwrite it */ strcpy(aed.att_nm,att_nm_tmp); } /* endif libnetCDF may have netCDF4 restrictions */ #endif /* !NCO_NETCDF4_AND_FILLVALUE */ switch(aed.mode){ case aed_append: if(rcd_inq_att == NC_NOERR){ /* Append to existing attribute value */ if(aed.type != att_typ){ (void)fprintf(stdout,"%s: ERROR %s attribute %s is of type %s not %s, unable to append\n",nco_prg_nm_get(),var_nm,aed.att_nm,nco_typ_sng(att_typ),nco_typ_sng(aed.type)); nco_exit(EXIT_FAILURE); } /* end if */ att_val_new=(void *)nco_malloc((att_sz+aed.sz)*nco_typ_lng(aed.type)); (void)nco_get_att(nc_id,var_id,aed.att_nm,(void *)att_val_new,aed.type); /* 20120903: Handle trailing NULs for strings Prevent interstitial NULs accumulation by overwriting NUL-terminator with first character of append string When Behavior 1 is requested, this line removes NULs appended by strdup() in nco_prs_aed_lst() */ if(aed.type == NC_CHAR) if(((char *)att_val_new)[att_sz-1L] == '\0') att_sz--; /* NB: Following assumes sizeof(char) = 1 byte */ (void)memcpy((void *)((char *)att_val_new+att_sz*nco_typ_lng(aed.type)), (void *)aed.val.vp, aed.sz*nco_typ_lng(aed.type)); rcd+=nco_put_att(nc_id,var_id,aed.att_nm,aed.type,att_sz+aed.sz,att_val_new); flg_chg=True; /* [flg] Attribute was altered */ att_val_new=nco_free(att_val_new); }else{ /* Create new attribute */ rcd+=nco_put_att(nc_id,var_id,aed.att_nm,aed.type,aed.sz,aed.val.vp); flg_chg=True; /* [flg] Attribute was altered */ } /* end else */ break; case aed_create: if(rcd_inq_att != NC_NOERR){ rcd+=nco_put_att(nc_id,var_id,aed.att_nm,aed.type,aed.sz,aed.val.vp); flg_chg=True; /* [flg] Attribute was altered */ } /* endif */ break; case aed_delete: /* Delete specified attribute if attribute name was specified... */ if(aed.att_nm){ /* ...and if attribute is known to exist from previous inquire call... */ if(rcd_inq_att == NC_NOERR){ rcd+=nco_del_att(nc_id,var_id,aed.att_nm); flg_chg=True; /* [flg] Attribute was altered */ } /* endif */ }else{ /* ...else delete all attributes for this variable... */ while(nbr_att){ rcd+=nco_inq_attname(nc_id,var_id,nbr_att-1,att_nm); rcd+=nco_del_att(nc_id,var_id,att_nm); nbr_att--; flg_chg=True; /* [flg] Attribute was altered */ } /* end while */ } /* end else */ break; case aed_modify: if(rcd_inq_att == NC_NOERR){ rcd+=nco_put_att(nc_id,var_id,aed.att_nm,aed.type,aed.sz,aed.val.vp); flg_chg=True; /* [flg] Attribute was altered */ } /* endif */ break; case aed_overwrite: rcd+=nco_put_att(nc_id,var_id,aed.att_nm,aed.type,aed.sz,aed.val.vp); flg_chg=True; /* [flg] Attribute was altered */ break; default: break; } /* end switch */ #ifdef NCO_NETCDF4_AND_FILLVALUE if(flg_netCDF4_rename_trick){ rcd+=nco_rename_att(nc_id,var_id,att_nm_tmp,nco_mss_val_sng_get()); /* Restore original name (space already allocated) */ strcpy(aed.att_nm,nco_mss_val_sng_get()); } /* !flg_netCDF4_rename_trick */ #endif /* !NCO_NETCDF4_AND_FILLVALUE */ if(rcd != NC_NOERR) (void)fprintf(stdout,"%s: DEBUG WARNING %s reports unexpected cumulative rcd = %i on exit. Please report this to NCO project.\n",nco_prg_nm_get(),fnc_nm,rcd); return flg_chg; /* [flg] Attribute was altered */ } /* end nco_aed_prc() */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_glb /* [fnc] Process attributes in root group */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Process attributes in root group */ const char fnc_nm[]="nco_aed_prc_glb()"; /* [sng] Function name */ int grp_id; /* [id] Group ID */ nco_bool flg_chg=nco_bool_CEWI; /* [flg] Attribute was altered */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_grp && !strcmp("/",trv_tbl->lst[tbl_idx].nm_fll)){ (void)nco_inq_grp_full_ncid(nc_id,trv_tbl->lst[tbl_idx].grp_nm_fll,&grp_id); flg_chg=nco_aed_prc_wrp(grp_id,NC_GLOBAL,aed); break; } /* !grp */ } /* !tbl */ if(nco_dbg_lvl_get() > nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed in root group\n",fnc_nm,nco_prg_nm_get(),aed.att_nm); return flg_chg; } /* nco_aed_prc_glb() */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_grp /* [fnc] Process attributes in groups */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Process attributes in groups */ const char fnc_nm[]="nco_aed_prc_grp()"; /* [sng] Function name */ int grp_id; /* [id] Group ID */ nco_bool flg_chg=False; /* [flg] Attribute was altered */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_grp){ (void)nco_inq_grp_full_ncid(nc_id,trv_tbl->lst[tbl_idx].grp_nm_fll,&grp_id); flg_chg|=nco_aed_prc_wrp(grp_id,NC_GLOBAL,aed); } /* !group */ } /* end loop over tables */ if(nco_dbg_lvl_get() > nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed in any group\n",fnc_nm,nco_prg_nm_get(),aed.att_nm); return flg_chg; } /* nco_aed_prc_grp() */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_all /* [fnc] Process attributes in all variables */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Process attributes in all variables */ const char fnc_nm[]="nco_aed_prc_var_all()"; /* [sng] Function name */ int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ nco_bool flg_chg=False; /* [flg] Attribute was altered */ nco_bool var_fnd=False; /* [flg] Variable was found */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var){ (void)nco_inq_grp_full_ncid(nc_id,trv_tbl->lst[tbl_idx].grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,trv_tbl->lst[tbl_idx].nm,&var_id); flg_chg|=nco_aed_prc_wrp(grp_id,var_id,aed); var_fnd=True; } /* !var */ } /* !tbl */ if(!var_fnd){ (void)fprintf(stderr,"%s: ERROR File contains no variables so variable attributes cannot be changed\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* var_fnd */ if(nco_dbg_lvl_get() >= nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed in any variable\n",fnc_nm,nco_prg_nm_get(),aed.att_nm); return flg_chg; } /* nco_aed_prc_var_all() */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_nm /* [fnc] Process attributes in variables that match input name */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Process attributes in variables that match input name (absolute or relative) */ const char fnc_nm[]="nco_aed_prc_var_nm()"; /* [sng] Function name */ int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ nco_bool flg_chg=False; /* [flg] Attribute was altered */ nco_bool var_fnd=False; /* [flg] Variable was found */ /* Loop table (absolute name) */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_sct trv=trv_tbl->lst[tbl_idx]; if(trv.nco_typ == nco_obj_typ_var && !strcmp(aed.var_nm,trv.nm_fll)){ (void)nco_inq_grp_full_ncid(nc_id,trv.grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,trv.nm,&var_id); flg_chg|=nco_aed_prc_wrp(grp_id,var_id,aed); /* Only 1 match possible, return */ if(nco_dbg_lvl_get() >= nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed for variable %s\n",fnc_nm,nco_prg_nm_get(),aed.att_nm,trv.grp_nm_fll); return flg_chg; } /* !var */ } /* !tbl */ /* Try relative variable names */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_sct trv=trv_tbl->lst[tbl_idx]; if(trv.nco_typ == nco_obj_typ_var && !strcmp(aed.var_nm,trv.nm)){ (void)nco_inq_grp_full_ncid(nc_id,trv.grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,trv.nm,&var_id); flg_chg|=nco_aed_prc_wrp(grp_id,var_id,aed); var_fnd=True; } /* !var */ } /* !tbl */ /* Try absolute group names */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_sct trv=trv_tbl->lst[tbl_idx]; if(trv.nco_typ == nco_obj_typ_grp && !strcmp(aed.var_nm,trv.nm_fll)){ (void)nco_inq_grp_full_ncid(nc_id,trv.grp_nm_fll,&grp_id); flg_chg|=nco_aed_prc_wrp(grp_id,NC_GLOBAL,aed); if(nco_dbg_lvl_get() >= nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed for group %s\n",fnc_nm,nco_prg_nm_get(),aed.att_nm,trv.grp_nm_fll); /* Only 1 match possible, return */ return flg_chg; } /* !var */ } /* !tbl */ /* Try relative group names */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_sct trv=trv_tbl->lst[tbl_idx]; if(trv.nco_typ == nco_obj_typ_grp && !strcmp(aed.var_nm,trv.nm)){ (void)nco_inq_grp_full_ncid(nc_id,trv.grp_nm_fll,&grp_id); flg_chg|=nco_aed_prc_wrp(grp_id,NC_GLOBAL,aed); var_fnd=True; } /* !var */ } /* !tbl */ if(!var_fnd){ (void)fprintf(stderr,"%s: ERROR File contains no variables or groups that match name %s so attribute %s cannot be changed\n",nco_prg_nm_get(),aed.var_nm,aed.att_nm); nco_exit(EXIT_FAILURE); } /* var_fnd */ if(nco_dbg_lvl_get() >= nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed for groups or variables that match relative name %s\n",fnc_nm,nco_prg_nm_get(),aed.att_nm,aed.var_nm); return flg_chg; } /* nco_aed_prc_var_nm() */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_xtr /* [fnc] Process attributes in variables with extraction flag set */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Process attributes in extracted variables */ const char fnc_nm[]="nco_aed_prc_var_xtr()"; /* [sng] Function name */ int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ nco_bool flg_chg=False; /* [flg] Attribute was altered */ nco_bool var_fnd=False; /* [flg] Variable was found */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_sct trv=trv_tbl->lst[tbl_idx]; if(trv.nco_typ == nco_obj_typ_var && trv.flg_xtr){ (void)nco_inq_grp_full_ncid(nc_id,trv.grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,trv.nm,&var_id); flg_chg|=nco_aed_prc_wrp(grp_id,var_id,aed); var_fnd=True; } /* !var */ } /* !tbl */ if(!var_fnd){ (void)fprintf(stderr,"%s: ERROR File contains no extracted variables or groups so attribute %s cannot be changed\n",nco_prg_nm_get(),aed.att_nm); nco_exit(EXIT_FAILURE); } /* var_fnd */ if(nco_dbg_lvl_get() >= nco_dbg_var && !flg_chg) (void)fprintf(stderr,"%s: INFO %s reports attribute %s was not changed in any extracted variables\n",fnc_nm,nco_prg_nm_get(),aed.att_nm); return flg_chg; } /* nco_aed_prc_var_xtr() */ void nco_att_cpy /* [fnc] Copy attributes from input netCDF file to output netCDF file */ (const int in_id, /* I [id] netCDF input-file ID */ const int out_id, /* I [id] netCDF output-file ID */ const int var_in_id, /* I [id] netCDF input-variable ID */ const int var_out_id, /* I [id] netCDF output-variable ID */ const nco_bool PCK_ATT_CPY) /* I [flg] Copy attributes "scale_factor", "add_offset" */ { /* Purpose: Copy attributes from input netCDF file to output netCDF file If var_in_id == NC_GLOBAL, then copy global attributes Otherwise copy only indicated variable's attributes When PCK_ATT_CPY is false, copy all attributes except "scale_factor", "add_offset" */ char att_nm[NC_MAX_NAME]; char var_nm[NC_MAX_NAME]; int fl_fmt; /* [enm] Output file format */ int idx; int nbr_att; int rcd; /* [enm] Return code */ long att_sz; nc_type att_typ_in; nc_type att_typ_out; nco_bool flg_autoconvert; if(var_in_id == NC_GLOBAL){ (void)nco_inq_natts(in_id,&nbr_att); if(nbr_att > NC_MAX_ATTRS) (void)fprintf(stdout,"%s: WARNING Number of global attributes is %d which exceeds number permitted by netCDF NC_MAX_ATTRS = %d\n",nco_prg_nm_get(),nbr_att,NC_MAX_ATTRS); }else{ (void)nco_inq_varnatts(in_id,var_in_id,&nbr_att); if(nbr_att > 0) (void)nco_inq_varname(out_id,var_out_id,var_nm); if(nbr_att > NC_MAX_ATTRS) (void)fprintf(stdout,"%s: WARNING Variable %s has %d attributes which exceeds number permitted by netCDF NC_MAX_ATTRS = %d\n",nco_prg_nm_get(),var_nm,nbr_att,NC_MAX_ATTRS); } /* end else */ /* Jump back here if current attribute is treated specially */ for(idx=0;idx= nco_dbg_std && nco_dbg_lvl_get() != nco_dbg_dev){ if(rcd == NC_NOERR){ if(var_out_id == NC_GLOBAL){ (void)fprintf(stderr,"%s: INFO Overwriting global or group attribute %s\n",nco_prg_nm_get(),att_nm); }else{ (void)fprintf(stderr,"%s: INFO Overwriting attribute %s for output variable %s\n",nco_prg_nm_get(),att_nm,var_nm); } /* end else */ } /* end if */ } /* end if dbg */ /* File format needed for autoconversion */ (void)nco_inq_format(out_id,&fl_fmt); /* Allow ncks to autoconvert netCDF4 atomic types to netCDF3 output type ... */ if(nco_prg_id_get() == ncks && fl_fmt != NC_FORMAT_NETCDF4 && !nco_typ_nc3(att_typ_in)){ att_typ_out=nco_typ_nc4_nc3(att_typ_in); flg_autoconvert=True; if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO Autoconverting %s%s attribute %s from netCDF4 type %s to netCDF3 type %s\n",nco_prg_nm_get(),(var_out_id == NC_GLOBAL) ? "global or group" : "variable ",(var_out_id == NC_GLOBAL) ? "" : var_nm,att_nm,nco_typ_sng(att_typ_in),nco_typ_sng(att_typ_out)); } /* !flg_autoconvert */ if(strcmp(att_nm,nco_mss_val_sng_get())){ if(flg_autoconvert){ var_sct att_var; /* [sct] Variable structure */ var_sct *att_var_ptr=NULL; /* [sct] Variable structure */ /* Initialize variable structure with minimal info. for nco_var_cnf_typ() */ att_var.nm=att_nm; att_var.type=att_typ_in; att_var.has_mss_val=False; att_var.sz=att_sz; att_var.val.vp=(void *)nco_malloc(att_sz*nco_typ_lng(att_typ_in)); /* Pointer to attribute value */ (void)nco_get_att(in_id,var_in_id,att_nm,att_var.val.vp,att_typ_in); if(att_typ_in == NC_STRING && att_typ_out == NC_CHAR){ /* Special case for string conversion: Keep first string of existing attribute (netCDF3 output attribute can only hold one string) */ att_var.sz=att_sz=strlen(att_var.val.sngp[0]); rcd=nco_put_att(out_id,var_out_id,att_nm,att_typ_out,att_sz,att_var.val.sngp[0]); (void)cast_nctype_void(att_typ_out,&att_var.val); if(att_var.val.vp) att_var.val.vp=(void *)nco_free(att_var.val.vp); }else{ /* !NC_STRING */ att_var_ptr=nco_var_cnf_typ(att_typ_out,&att_var); rcd=nco_put_att(out_id,var_out_id,att_nm,att_typ_out,att_sz,att_var_ptr->val.vp); if(att_var_ptr->val.vp) att_var_ptr->val.vp=nco_free(att_var_ptr->val.vp); } /* !NC_STRING */ }else{ /* Copy all attributes except _FillValue with fast library routine */ (void)nco_copy_att(in_id,var_in_id,att_nm,out_id,var_out_id); } /* !Autoconvert */ }else{ /* Convert "_FillValue" attribute to unpacked type then copy Impose NCO convention that _FillValue is same type as variable, whether variable is packed or not */ aed_sct aed; size_t att_lng_in; ptr_unn mss_tmp; (void)nco_inq_att(in_id,var_in_id,att_nm,&att_typ_in,&att_sz); if(att_sz != 1L){ (void)fprintf(stderr,"%s: WARNING input %s attribute has %li elements, but CF convention insists that %s be scalar (i.e., one element, possibly of compound type). Will attempt to copy using nco_copy_att(). HINT: If this fails, redefine %s as scalar.\n",nco_prg_nm_get(),att_nm,att_sz,att_nm,att_nm); (void)nco_copy_att(in_id,var_in_id,att_nm,out_id,var_out_id); return; } /* end if */ /* Convert "_FillValue" to unpacked type before copying */ aed.att_nm=att_nm; /* Name of attribute */ if(var_out_id == NC_GLOBAL){ aed.var_nm=NULL; }else{ (void)nco_inq_varname(out_id,var_out_id,var_nm); aed.var_nm=var_nm; /* Name of variable, or NULL for global attribute */ } /* end if */ aed.id=out_id; /* Variable ID or NC_GLOBAL ( = -1) for global attribute */ aed.sz=att_sz; /* Number of elements in attribute */ if(!flg_autoconvert){ /* Do not convert global attributes or PCK_ATT_CPY */ if(PCK_ATT_CPY || var_out_id==NC_GLOBAL) att_typ_out=att_typ_in; else (void)nco_inq_vartype(out_id,var_out_id,&att_typ_out); } /* flg_autoconvert */ if(att_typ_out == att_typ_in){ aed.type=att_typ_out; /* Type of attribute */ aed.val.vp=(void *)nco_malloc(nco_typ_lng(aed.type)); /* Pointer to attribute value */ (void)nco_get_att(in_id,var_in_id,att_nm,aed.val.vp,att_typ_out); }else{ /* att_typ_out!=att_typ_in */ /* Convert type */ aed.type=att_typ_out; /* Type of attribute */ aed.val.vp=(void *)nco_malloc(nco_typ_lng(aed.type)); /* Pointer to attribute value */ att_lng_in=att_sz*nco_typ_lng(att_typ_in); mss_tmp.vp=(void *)nco_malloc(att_lng_in); (void)nco_get_att(in_id,var_in_id,att_nm,mss_tmp.vp,att_typ_in); (void)nco_val_cnf_typ(att_typ_in,mss_tmp,att_typ_out,aed.val); mss_tmp.vp=nco_free(mss_tmp.vp); } /* att_typ_out!=att_typ_in */ /* Overwrite mode causes problems with netCDF4 and "_FillValue" Use create mode instead */ aed.mode=aed_create; (void)nco_aed_prc(out_id,var_out_id,aed); /* Release temporary memory */ aed.val.vp=nco_free(aed.val.vp); } /* endif copying _FillValue */ } /* end loop over attributes */ } /* end nco_att_cpy() */ void nco_fl_lst_att_cat /* [fnc] Add input file list global attribute */ (const int out_id, /* I [id] netCDF output-file ID */ CST_X_PTR_CST_PTR_CST_Y(char,fl_lst_in), /* I [sng] Input file list */ const int fl_nbr) /* I [nbr] Number of files in input file list */ { /* Purpose: Write input file list to global metadata */ aed_sct fl_in_lst_aed; aed_sct fl_in_nbr_aed; char att_nm_lst[]="nco_input_file_list"; char att_nm_nbr[]="nco_input_file_number"; char spc_sng[]=" "; /* [sng] Intervening space */ char *fl_in_lst_sng; nco_int fl_nbr_lng; /* [nbr] Number of files in input file list */ int fl_idx; size_t fl_in_lst_sng_lng; /* [nbr] Filename list string length */ ptr_unn att_val; /* Unfold file list into single string */ fl_in_lst_sng_lng=0L; /* [nbr] Filename list string length */ for(fl_idx=0;fl_idx= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING the \"%s\" global attribute is type %s, not %s. Therefore contents will not be appended to %s in output file.\n",nco_prg_nm_get(),att_nm,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR),att_nm); return; } /* end if */ /* Allocate and NUL-terminate space for current history attribute If history attribute is of size zero then ensure strlen(hst_crr) == 0 */ hst_crr=(char *)nco_malloc((att_sz+1L)*sizeof(char)); hst_crr[att_sz]='\0'; if(att_sz > 0) (void)nco_get_att(in_id,NC_GLOBAL,att_nm,(void *)hst_crr,NC_CHAR); att_sz=strlen(hst_sng_fmt)+strlen(fl_in)+strlen(att_nm)+strlen(hst_crr); hst_sng=(char *)nco_malloc((att_sz+1L)*sizeof(char)); hst_sng[att_sz]='\0'; (void)sprintf(hst_sng,hst_sng_fmt,fl_in,att_nm,hst_crr); } /* endif history global attribute exists in input file */ /* Get number of global attributes in output file */ (void)nco_inq(out_id,(int *)NULL,(int *)NULL,&glb_att_nbr,(int *)NULL); for(idx=0;idx= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING the \"%s\" global attribute is type %s, not %s. Therefore contents will not be appended to %s in output file.\n",nco_prg_nm_get(),att_nm,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR),att_nm); return; } /* end if */ /* Allocate and NUL-terminate space for current provenance attribute If provenance attribute is of size zero then ensure strlen(prv_crr) = 0 */ prv_crr=(char *)nco_malloc((att_sz+1L)*sizeof(char)); prv_crr[att_sz]='\0'; if(att_sz > 0) (void)nco_get_att(out_id,NC_GLOBAL,att_nm,(void *)prv_crr,NC_CHAR); /* Add 4 for formatting characters */ prv_new=(char *)nco_malloc((strlen(prv_crr)+strlen(hst_sng)+strlen(time_stamp_sng)+4UL)*sizeof(char)); (void)sprintf(prv_new,"%s: %s%s",time_stamp_sng,hst_sng,prv_crr); } /* endif provenance global attribute currently exists */ rcd+=nco_put_att(out_id,NC_GLOBAL,att_nm,NC_CHAR,(long int)(strlen(prv_new)),(void *)prv_new); if(hst_sng) hst_sng=(char *)nco_free(hst_sng); if(hst_crr) hst_crr=(char *)nco_free(hst_crr); if(prv_crr) prv_crr=(char *)nco_free(prv_crr); if(prv_new) prv_new=(char *)nco_free(prv_new); return; /* 20050109: fxm added return to void function to squelch unwelcome gcc-3.4.2 warning */ } /* end nco_prv_att_cat() */ void nco_hst_att_cat /* [fnc] Add command line, date stamp to history attribute */ (const int out_id, /* I [id] netCDF output-file ID */ const char * const hst_sng) /* I [sng] String to add to history attribute */ { /* Purpose: Add command line and date stamp to existing history attribute, if any, and write them to specified output file */ /* Length of string + NUL required to hold output of ctime() */ #define TIME_STAMP_SNG_LNG 25 char att_nm[NC_MAX_NAME]; char *ctime_sng; char *hst_crr=NULL; char *hst_new; char time_stamp_sng[TIME_STAMP_SNG_LNG]; const char att_nm_hst[]="history"; /* [sng] Lowercase name of history attribute */ int idx; int glb_att_nbr; int rcd=NC_NOERR; /* [rcd] Return code */ long att_sz=0L; nc_type att_typ; time_t time_crr_time_t; /* Create timestamp string */ time_crr_time_t=time((time_t *)NULL); ctime_sng=ctime(&time_crr_time_t); /* NUL-terminate time_stamp_sng */ time_stamp_sng[TIME_STAMP_SNG_LNG-1]='\0'; /* Eliminate carriage return in ctime_sng */ (void)strncpy(time_stamp_sng,ctime_sng,TIME_STAMP_SNG_LNG-1UL); /* Get number of global attributes in file */ (void)nco_inq(out_id,(int *)NULL,(int *)NULL,&glb_att_nbr,(int *)NULL); for(idx=0;idx= nco_dbg_std) (void)fprintf(stderr,"%s: WARNING the \"%s\" global attribute is type %s, not %s. Therefore current command line will not be appended to %s in output file.\n",nco_prg_nm_get(),att_nm,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR),att_nm); return; } /* end if */ /* Allocate and NUL-terminate space for current history attribute If history attribute is of size zero then ensure strlen(hst_crr) = 0 */ hst_crr=(char *)nco_malloc((att_sz+1L)*sizeof(char)); hst_crr[att_sz]='\0'; if(att_sz > 0) (void)nco_get_att(out_id,NC_GLOBAL,att_nm,(void *)hst_crr,NC_CHAR); /* Add 4 for formatting characters */ hst_new=(char *)nco_malloc((strlen(hst_crr)+strlen(hst_sng)+strlen(time_stamp_sng)+4UL)*sizeof(char)); (void)sprintf(hst_new,"%s: %s\n%s",time_stamp_sng,hst_sng,hst_crr); } /* endif history global attribute currently exists */ rcd+=nco_put_att(out_id,NC_GLOBAL,att_nm,NC_CHAR,(long int)(strlen(hst_new)+1UL),(void *)hst_new); hst_crr=(char *)nco_free(hst_crr); hst_new=(char *)nco_free(hst_new); return; /* 20050109: fxm added return to void function to squelch unwelcome gcc-3.4.2 warning */ } /* end nco_hst_att_cat() */ aed_sct * /* O [sct] List of attribute edit structures */ nco_prs_aed_lst /* [fnc] Parse user-specified attribute edits into structure list */ (const int nbr_aed, /* I [nbr] Number of attributes in list */ X_CST_PTR_CST_PTR_Y(char,aed_arg)) /* I/O [sng] List of user-specified attribute edits (delimiters are changed to NULL on output */ { /* Purpose: Parse name, type, size, and value elements of comma-separated list of attribute edit information Routine merely evaluates syntax of input expressions Routine does not validate attributes or variables against those present in input netCDF file */ /* Options are: -a att_nm,var_nm,mode,att_typ,att_val (modifies attribute att_nm for the single variable var_nm) -a att_nm,,mode,att_typ,att_val (modifies attribute att_nm for every variable in file) If option -a is given with var_nm = NULL, then var_nm is expanded into every variable name in file Thus attribute editing operation is performed on every variable in file. mode,att_nm,att_typ,att_val (modifies global attribute att_nm for file) This option may be combined with modes -a, -c, -d, or -o to specify appending to, changing, deleting, or overwriting, any existing global attribute named att_nm One mode must be set for each edited attribute: append (a), create (c), delete (d), modify (m), or overwrite (o). -a: Attribute append mode Append value att_val to current var_nm attribute att_nm value att_val, if any. If var_nm does not have an attribute att_nm, there is no effect. -c: Attribute create mode Create variable var_nm attribute att_nm with att_val if att_nm does not yet exist. If var_nm already has an attribute att_nm, there is no effect. -d: Attribute delete mode Delete current var_nm attribute att_nm. If var_nm does not have an attribute att_nm, there is no effect. -m: Attribute modify mode Change value of current var_nm attribute att_nm to value att_val. If var_nm does not have an attribute att_nm, there is no effect. -o: Attribute overwrite mode Write attribute att_nm with value att_val to variable var_nm, overwriting existing attribute att_nm, if any. This is default mode. */ aed_sct *aed_lst; char **arg_lst; char *msg_sng=NULL_CEWI; /* [sng] Error message */ const char * const dlm_sng=","; const long idx_att_val_arg=4L; /* Number of required delimiters preceding attribute values in -a argument list */ int idx; int arg_nbr; long lmn; nco_bool ATT_TYP_INHERIT; /* [flg] Inherit attribute type from pre-existing attribute */ nco_bool NCO_SYNTAX_ERROR=False; /* [flg] Syntax error in attribute-edit specification */ aed_lst=(aed_sct *)nco_malloc(nbr_aed*sizeof(aed_sct)); for(idx=0;idx idx_att_val_arg+1){ /* Number of elements which must be concatenated into single string value */ long lmn_nbr; lmn_nbr=arg_nbr-idx_att_val_arg; if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: WARNING NC_CHAR (string) attribute is embedded with %li literal element delimiters (\"%s\"), re-assembling...\n",nco_prg_nm_get(),lmn_nbr-1L,dlm_sng); /* Rewrite list, splicing in original delimiter string */ /* fxm: TODO nco527 ncatted memory may be lost here */ arg_lst[idx_att_val_arg]=sng_lst_cat(arg_lst+idx_att_val_arg,lmn_nbr,dlm_sng); /* Keep bookkeeping straight, just in case */ arg_nbr=idx_att_val_arg+1L; lmn_nbr=1L; } /* endif arg_nbr > idx_att_val_arg+1 */ /* Replace any C language '\X' escape codes with ASCII bytes */ if(aed_lst[idx].type == NC_CHAR || aed_lst[idx].type == NC_STRING) (void)sng_ascii_trn(arg_lst[idx_att_val_arg]); /* Set size of current aed structure */ if(aed_lst[idx].type == NC_CHAR){ /* 20100409 Remove extra space formerly allocated for NUL-terminator This caused each append to insert a NUL at end of NC_CHAR attributes Multiple appends would then result in attributes pockmarked with NULs Solves TODO nco985 Not yet sure there are no ill effects though... 20120902 Apparently this fixed some of append mode and broke other modes Dave Allured reports on NCO Discussion forum that create, modify, and overwrite modes have not added NUL to NC_CHAR attributes since 4.0.2. strdup() below attaches trailing NUL to user-specified string Retaining this NUL is obliquely discussed in netCDF Best Practices document: http://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#Strings%20and%20Variables%20of%20type%20char Two behaviors are possible: 1. Terminate user-specified strings with NUL before saving as attributes This behavior was used in 4.0.2-4.2.2 (201007-201210) 2. Do not NUL-terminate user-specified strings This behavior was re-instituted in 4.3.0 (201204) Between 201210 and 201304 the behavior was unclear to me... ncgen may be interpreted as utilizing Behavior 2, since attributes in CDL are not NUL-terminated after conversion to netCDF binary format As of 20130327, NCO chooses Behavior 2 (like ncgen) To revert to Behavior 1, uncomment next line to create space for NUL-terminator */ /* aed_lst[idx].sz=(arg_lst[idx_att_val_arg] == NULL) ? 1L : strlen(arg_lst[idx_att_val_arg])+1L; */ /* Behavior 1 */ aed_lst[idx].sz=(arg_lst[idx_att_val_arg] == NULL) ? 0L : strlen(arg_lst[idx_att_val_arg])+0L; /* Behavior 2 (like ncgen) */ }else{ /* Number of elements of numeric types is determined by number of delimiters */ aed_lst[idx].sz=arg_nbr-idx_att_val_arg; } /* end else */ /* Set value of current aed structure */ if(aed_lst[idx].type == NC_CHAR){ /* strdup() attaches a trailing NUL to the user-specified string Retaining is obliquely discussed in netCDF Best Practices document: http://www.unidata.ucar.edu/software/netcdf/docs/BestPractices.html#Strings%20and%20Variables%20of%20type%20char */ aed_lst[idx].val.cp=(nco_char *)strdup(arg_lst[idx_att_val_arg]); }else if(aed_lst[idx].type == NC_STRING){ aed_lst[idx].val.vp=(void *)nco_malloc(aed_lst[idx].sz*nco_typ_lng(aed_lst[idx].type)); for(lmn=0L;lmn= nco_dbg_io){ for(idx=0;idxold_nm,dlm_chr); if(!dlm_ptr) *mch_obj_all=True; att_nm_lng=strlen(rnm_att->old_nm); /* Return if delimiter appears to be part of attribute name */ if(att_nm_lng < 3L || dlm_ptr == rnm_att->old_nm+att_nm_lng-1L) return NCO_ERR; if(dlm_ptr){ /* Handle cases where object string makes use of abbreviations */ if(dlm_ptr == rnm_att->old_nm){ /* Strings that start with '@' imply all groups (and no variables) */ strcpy(obj_nm,"group"); }else if(!strncasecmp(rnm_att->old_nm,".@",2L)){ /* Strings that start with '.@' imply all groups are optional (and no variables) */ strcpy(obj_nm,".group"); } /* end else abbreviations */ /* NUL-terminate object name in user-supplied string */ *dlm_ptr='\0'; if(!obj_nm_abb){ /* If input object name was not abbreviated, copy it to output object name */ obj_nm_lng=strlen(rnm_att->old_nm); if(obj_nm_lng > NC_MAX_NAME){ (void)fprintf(stdout,"%s: ERROR Derived object name \"%s\" too long\n",nco_prg_nm_get(),rnm_att->old_nm); nco_exit(EXIT_FAILURE); } /* end if */ /* Copy object name only */ strcpy(obj_nm,rnm_att->old_nm); } /* obj_nm_abb */ /* Output object name now searchable for standard hints */ if(!strncasecmp(obj_nm,"global",6L)) *mch_grp_glb=True; else if(!strncasecmp(obj_nm,".global",7L)) *mch_grp_glb=True; else if(!strncasecmp(obj_nm,"group",5L)) *mch_grp_all=True; else if(!strncasecmp(obj_nm,".group",6L)) *mch_grp_all=True; /* Point old obj_nm@att_nm name to attribute name att_nm alone */ rnm_att->old_nm=dlm_ptr+1L; } /* endif contains '@' */ /* Delimiter '@' is optional in new name */ dlm_ptr=strchr(rnm_att->new_nm,dlm_chr); if(dlm_ptr){ /* When found in new name, point the user string to next character */ att_nm_lng=strlen(rnm_att->new_nm); if((dlm_ptr-rnm_att->new_nm) < (long int)att_nm_lng) rnm_att->new_nm=dlm_ptr+1L; else return NCO_ERR; } /* endif */ return NCO_NOERR; } /* end nco_prs_att() */ char * /* O [sng] Stub of GPE applied to input path */ nco_gpe_evl_stb /* [fnc] Apply Group Path Editing (GPE) to argument safely */ (const gpe_sct * const gpe, /* I [sng] GPE structure, if any */ const char * const grp_nm_fll_in) /* I [sng] Full group name */ { /* Purpose: Apply Group Path Editing (GPE) to input full group name, return stub of result NB: Function designed to make it easy for ncks to print GPE-transformed group stubs Hence returned strings may be used directly in print functions without pointers being save and free()'d This kind of memory leak is acceptable since it scales only with total number of groups in printed file, and does not scale with data size. */ const char fnc_nm[]="nco_gpe_evl_stb()"; /* [sng] Function name */ const char sls_chr='/'; /* [sng] Slash character */ char *grp_nm_stb_out; /* [sng] Returned output name. Must be free()'d in calling routine. */ char *grp_nm_fll_out; /* [sng] Intermediate output name. Allocated and free()'d here. */ char *sls_ptr; /* [sng] Pointer to slash character. Unsafe to free(). */ size_t in_lng; /* [nbr] Length of grp_nm_fll_in */ in_lng=strlen(grp_nm_fll_in); if(!in_lng) (void)fprintf(stdout,"%s: WARNING %s reports grp_nm_fll_in is empty\n",nco_prg_nm_get(),fnc_nm); grp_nm_fll_out=nco_gpe_evl(gpe,grp_nm_fll_in); /* Root group has no stub */ if(in_lng == 1UL) return grp_nm_fll_out; /* First level and deeper group stubs begin just after final slash */ sls_ptr=strrchr(grp_nm_fll_out,sls_chr); assert(sls_ptr); grp_nm_stb_out=(char *)strdup(sls_ptr+1UL); if(grp_nm_fll_out) grp_nm_fll_out=(char *)nco_free(grp_nm_fll_out); return grp_nm_stb_out; } /* end nco_gpe_evl_stb() */ char * /* O [sng] Result of applying GPE to input path */ nco_gpe_evl /* [fnc] Apply Group Path Editing (GPE) to argument */ (const gpe_sct * const gpe, /* I [sng] GPE structure */ const char * const grp_nm_fll_in) /* I [sng] Full group name */ { /* Purpose: Apply Group Path Editing (GPE) to input full group name, return result grp_nm_fll_in: "Input" path---usually full group path of object in input file grp_nm_fll_out: "Output" path---usually full group path of object in output file grp_nm_fll_out: Calling routine is responsible for freeing this memory grp_nm_fll_in usually is not terminated by a slash grp_nm_fll_in is assumed to begin with a slash The "group path" includes only groups--variable names should be omitted GPE string is the path argument supplied to the GPE option */ const char fnc_nm[]="nco_gpe_evl()"; /* [sng] Function name */ const char sls_sng[]="/"; /* [sng] Slash string */ const char sls_chr='/'; /* [sng] Slash character */ char *grp_nm_fll_out=NULL; /* [sng] Returned output name. Must be free()'d in calling routine. */ char *grp_out; /* [sng] Mutable pointer to output name. Unsafe to free(). */ char *grp_nm_fll_in_dpl; /* [sng] Allocated pointer to output name. Allocated and free()'d here. */ char *sls_ptr; /* [sng] Pointer to slash character. Unsafe to free(). */ int lvl_idx=0; /* [idx] Level counter (gets incremented) */ size_t in_lng; /* [nbr] Length of grp_nm_fll_in */ size_t out_lng; /* [nbr] Length of grp_nm_fll_out */ /* Default */ in_lng=strlen(grp_nm_fll_in); if(!in_lng) (void)fprintf(stdout,"%s: WARNING %s reports grp_nm_fll_in is empty\n",nco_prg_nm_get(),fnc_nm); grp_nm_fll_in_dpl=(char *)strdup(grp_nm_fll_in); sls_ptr=grp_out=grp_nm_fll_in_dpl; /* Prevent attempts to dereference NULL. perform identity translation and return */ if(!gpe) return grp_nm_fll_in_dpl; /* If GPE was not invoked, perform identity translation and return */ if(!gpe->arg) return grp_nm_fll_in_dpl; /* Sanity checks */ if(grp_out[0] != '/') (void)fprintf(stdout,"%s: WARNING %s reports GPE input path %s does not begin with slash\n",nco_prg_nm_get(),fnc_nm,grp_out); switch(gpe->md){ case gpe_delete: /* Delete up to lvl_nbr levels by advancing one slash per level */ while(grp_out && (lvl_idx++ < gpe->lvl_nbr)) grp_out=strchr(grp_out+1,sls_chr); if(grp_out){ /* More levels remain */ if(gpe->lng_cnn > 1L){ /* Prepend argument to remaining levels */ out_lng=gpe->lng_cnn+strlen(grp_out); grp_nm_fll_out=(char *)nco_malloc((out_lng+1L)*sizeof(char)); (void)strcpy(grp_nm_fll_out,gpe->nm_cnn); grp_nm_fll_out=strcat(grp_nm_fll_out,grp_out); }else{ /* No argument to prepend */ grp_nm_fll_out=(char *)strdup(grp_out); } /* !gpe->nm */ }else{ /* !grp_out */ /* All levels already deleted */ if(gpe->nm_cnn) grp_nm_fll_out=(char *)strdup(gpe->nm_cnn); else grp_nm_fll_out=(char *)strdup(sls_sng); } /* !grp_out */ break; case gpe_append: /* Append: Append input name to GPE name */ out_lng=gpe->lng_cnn+in_lng; grp_nm_fll_out=(char *)nco_malloc((out_lng+1L)*sizeof(char)); (void)strcpy(grp_nm_fll_out,gpe->nm_cnn); grp_nm_fll_out=strcat(grp_nm_fll_out,grp_nm_fll_in); break; case gpe_flatten: /* Delete all levels */ if(gpe->nm_cnn) grp_nm_fll_out=(char *)strdup(gpe->nm_cnn); else grp_nm_fll_out=(char *)strdup(sls_sng); break; case gpe_backspace: /* Truncate up-to lvl_nbr levels by backspacing one slash per level */ while(sls_ptr && (lvl_idx++ < gpe->lvl_nbr)){ sls_ptr=strrchr(grp_out+1,sls_chr); /* Replace slash by NUL */ if(sls_ptr) *sls_ptr='\0'; } /* end while */ if(sls_ptr){ /* More levels remain */ if(gpe->lng_cnn > 1L){ /* Append argument to remaining levels */ out_lng=strlen(grp_out)+gpe->lng_cnn; grp_nm_fll_out=(char *)nco_malloc((out_lng+1L)*sizeof(char)); (void)strcpy(grp_nm_fll_out,grp_out); grp_nm_fll_out=strcat(grp_nm_fll_out,gpe->nm_cnn); }else{ /* !gpe->nm */ /* No argument to append */ grp_nm_fll_out=(char *)strdup(grp_out); } /* !gpe->nm */ }else{ /* !sls_ptr */ /* All levels already truncated */ if(gpe->nm_cnn) grp_nm_fll_out=(char *)strdup(gpe->nm_cnn); else grp_nm_fll_out=(char *)strdup(sls_sng); } /* !sls_ptr */ break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ /* Final parsing results */ if(nco_dbg_lvl_get() >= nco_dbg_scl){ (void)fprintf(stdout,"%s: INFO %s reports GPE changes input grp_nm_fll_in = %s to output grp_nm_fll_out = %s\n",nco_prg_nm_get(),fnc_nm,grp_nm_fll_in,grp_nm_fll_out); } /* end if */ if(grp_nm_fll_in_dpl) grp_nm_fll_in_dpl=(char *)nco_free(grp_nm_fll_in_dpl); return grp_nm_fll_out; } /* end nco_gpe_evl() */ gpe_sct * /* O [sct] Structure with dynamic memory free()'d */ nco_gpe_free /* [fnc] Free dynamic memory of GPE structure */ (gpe_sct * gpe) /* O [sct] GPE structure */ { /* Purpose: Free GPE structure */ if(gpe->arg) gpe->arg=(char *)nco_free(gpe->arg); if(gpe->nm) gpe->nm=(char *)nco_free(gpe->nm); if(gpe->edt) gpe->edt=(char *)nco_free(gpe->edt); if(gpe->nm_cnn) gpe->nm_cnn=(char *)nco_free(gpe->nm_cnn); if(gpe) gpe=(gpe_sct *)nco_free(gpe); return gpe; } /* end nco_gpe_free() */ gpe_sct * /* O [sng] GPE structure */ nco_gpe_prs_arg /* [fnc] Parse Group Path Editing (GPE) argument */ (const char * const gpe_arg) /* I [sng] User-specified GPE specification */ { /* Purpose: Parse user-specified Group Path Editing (GPE) argument ncks -O -D 3 -G test ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 3 -G g2:1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 3 -G @-2 ~/nco/data/in_grp.nc ~/foo.nc */ const char fnc_nm[]="nco_gpe_prs_arg()"; /* [sng] Function name */ char *at_cp; char *colon_cp; char *spr_cp=NULL; /* [sng] Separator location */ gpe_sct *gpe; /* [sct] GPE structure */ /* Initialize structure */ /* NB: Be sure to free() all dynamic memory in nco_gpe_free() */ gpe=(gpe_sct *)nco_malloc(sizeof(gpe_sct)); gpe->arg=NULL; /* [sng] Full GPE specification (for debugging) */ gpe->edt=NULL; /* [sng] Editing component of full GPE specification */ gpe->nm=NULL; /* [sng] Group name component of full GPE specification */ gpe->nm_cnn=NULL; /* [sng] Canonicalized (i.e., slash-prefixed) group name */ gpe->lng=0L; /* [nbr] Length of user-specified group path */ gpe->lng_cnn=0L; /* [nbr] Length of canonicalized user-specified group path */ gpe->lng_edt=0L; /* [nbr] Length of editing component of full GPE specification */ gpe->lvl_nbr=0; /* [nbr] Number of levels to shift */ gpe->md=gpe_append; /* [enm] Editing mode to perform */ /* Structure has been initialized, safe to return now on no-ops */ if(gpe_arg) gpe->arg=(char *)strdup(gpe_arg); else return gpe; /* Find positions of commas and number of characters between (non-inclusive) them */ colon_cp=strchr(gpe->arg,':'); at_cp=strchr(gpe->arg,'@'); /* Basic sanity checks */ if(colon_cp && at_cp){ (void)fprintf(stdout,"%s: ERROR %s reports GPE specification \"%s\" contains both a colon ':' and an at-sign '@'\n",nco_prg_nm_get(),fnc_nm,gpe->arg); nco_exit(EXIT_FAILURE); } /* end if */ if(colon_cp){ gpe->md=gpe_delete; /* [enm] Editing mode to perform */ spr_cp=colon_cp; /* [sng] Separator location */ } /* endif colon */ if(at_cp){ gpe->md=gpe_backspace; /* [enm] Editing mode to perform */ spr_cp=at_cp; /* [sng] Separator location */ } /* endif at */ if(spr_cp){ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ char *nbr_sng; /* [sng] Number string */ size_t nbr_lng; gpe->nm=(char *)nco_malloc(((spr_cp-gpe->arg)+1L)*sizeof(char)); /* [sng] Group name */ gpe->nm=(char *)strncpy(gpe->nm,gpe->arg,spr_cp-gpe->arg); /* [sng] Group name */ gpe->nm[spr_cp-gpe->arg]='\0'; /* [sng] Group name */ /* Is there anything after the separator? */ nbr_sng=spr_cp+1L; /* [sng] Number string */ nbr_lng=strlen(nbr_sng); if(nbr_lng){ /* Convert it */ gpe->lvl_nbr=(int)strtol(nbr_sng,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(nbr_sng,"strtol",sng_cnv_rcd); } /* end if */ if(gpe->lvl_nbr < 0 && colon_cp){ /* Equate negative number following colon to positive number following at-sign */ gpe->md=gpe_backspace; /* [enm] Editing mode to perform */ gpe->lvl_nbr=-gpe->lvl_nbr; } /* end if */ if(gpe->lvl_nbr < 0){ (void)fprintf(stdout,"%s: ERROR %s reports GPE level shift number gpe->lvl_nbr = %d is less than zero. Level shift number must not be negative.\n",nco_prg_nm_get(),fnc_nm,gpe->lvl_nbr); nco_exit(EXIT_FAILURE); } /* end if */ if(colon_cp && !nbr_lng) gpe->md=gpe_flatten; /* [enm] Editing mode to perform */ if(at_cp && !nbr_lng) (void)fprintf(stdout,"%s: WARNING %s reports GPE specification \"%s\" specifies no level after the at-sign '@'\n",nco_prg_nm_get(),fnc_nm,gpe->arg); gpe->edt=(char *)strdup(spr_cp); /* [sng] Editing component of full GPE specification */ gpe->lng_edt=strlen(gpe->edt); /* [nbr] Length of editing component of full GPE specification */ } /* !spr_cp */ if(!spr_cp){ gpe->nm=(char *)strdup(gpe->arg); /* [sng] Group name */ gpe->md=gpe_append; /* [enm] Editing mode to perform */ } /* spr_cp */ /* Name is known, save length for later use */ gpe->lng=strlen(gpe->nm); /* [nbr] Length of user-specified group path */ /* Obtain "canonical" (slash-prefixed) name */ /* Slash-initiate name */ if(gpe->nm[0] == '/'){ gpe->nm_cnn=(char *)strdup(gpe->nm); gpe->lng_cnn=gpe->lng; }else{ gpe->lng_cnn=gpe->lng+1L; gpe->nm_cnn=(char *)nco_malloc((gpe->lng_cnn+1L)*sizeof(char)); (void)strcpy(gpe->nm_cnn+1L,gpe->nm); gpe->nm_cnn[0]='/'; } /* endif */ #if 0 /* Slash-terminate name */ if(gpe->nm[gpe->lng_cnn-1L] == '/'){ gpe->nm_cnn=(char *)strdup(gpe->nm); gpe->lng_cnn=gpe->lng; }else{ gpe->lng_cnn=gpe->lng+1L; gpe->nm_cnn=(char *)nco_malloc((gpe->lng_cnn+1L)*sizeof(char)); (void)strcpy(gpe->nm_cnn,gpe->nm); gpe->nm_cnn[gpe->lng_cnn-1L]='/'; gpe->nm_cnn[gpe->lng_cnn]='\0'; } /* endif */ #endif /* !0 */ /* Final parsing results */ if(nco_dbg_lvl_get() >= nco_dbg_scl){ (void)fprintf(stdout,"%s: INFO %s reports gpe->arg = %s\n",nco_prg_nm_get(),fnc_nm,gpe->arg); (void)fprintf(stdout,"%s: INFO %s reports gpe->nm = %s\n",nco_prg_nm_get(),fnc_nm,gpe->nm); (void)fprintf(stdout,"%s: INFO %s reports gpe->lng = %zi\n",nco_prg_nm_get(),fnc_nm,gpe->lng); (void)fprintf(stdout,"%s: INFO %s reports gpe->nm_cnn = %s\n",nco_prg_nm_get(),fnc_nm,gpe->nm_cnn); (void)fprintf(stdout,"%s: INFO %s reports gpe->lng_cnn = %zi\n",nco_prg_nm_get(),fnc_nm,gpe->lng_cnn); (void)fprintf(stdout,"%s: INFO %s reports gpe->edt = %s\n",nco_prg_nm_get(),fnc_nm,gpe->edt); (void)fprintf(stdout,"%s: INFO %s reports gpe->lng_edt = %zi\n",nco_prg_nm_get(),fnc_nm,gpe->lng_edt); (void)fprintf(stdout,"%s: INFO %s reports gpe->md = %s\n",nco_prg_nm_get(),fnc_nm,nco_gpe_sng(gpe->md)); (void)fprintf(stdout,"%s: INFO %s reports gpe->lvl_nbr = %i\n",nco_prg_nm_get(),fnc_nm,gpe->lvl_nbr); } /* end if */ return gpe; } /* end nco_gpe_prs_arg() */ const char * /* O [sng] String describing GPE */ nco_gpe_sng /* [fnc] Convert GPE enum to string */ (const gpe_enm gpe_md) /* I [enm] GPE mode */ { switch(gpe_md){ case gpe_delete: return "gpe_delete"; case gpe_append: return "gpe_append"; case gpe_flatten: return "gpe_flatten"; case gpe_backspace: return "gpe_backspace"; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ /* Some compilers, e.g., SGI cc, need return statement to end non-void functions */ return (char *)NULL; } /* end nco_gpe_sng() */ rnm_sct * /* O [sng] Structured list of old, new names */ nco_prs_rnm_lst /* [fnc] Set old_nm, new_nm elements of rename structure */ (const int nbr_rnm, /* I [nbr] Number of elements in rename list */ char * const * const rnm_arg) /* I [sng] Unstructured list of old, new names */ { /* Purpose: Set old_nm, new_nm elements of rename structure Routine merely fills rename structure and does not attempt to validate presence of variables in input netCDF file. */ rnm_sct *rnm_lst; int idx; ptrdiff_t lng_arg_1; ptrdiff_t lng_arg_2; rnm_lst=(rnm_sct *)nco_malloc((size_t)nbr_rnm*sizeof(rnm_sct)); for(idx=0;idx= nco_dbg_io){ for(idx=0;idxtm_mon+1,time_crr_tm->tm_mday,time_crr_tm->tm_year%100); /* Copy string (except for terminating NUL) into variable (which likely does not have room for terminating NUL */ strncpy(var_val,var_val_p1,var_sz); var_val_p1=(char *)nco_free(var_val_p1); return; } /* !date_written */ if(!strcmp(var_nm,"time_written")){ /* Datestamp strings are formatted thusly: "Fri Jun 5 17:24:13 2015\n" */ strncpy(var_val,ctime_sng+11,8); return; } /* !time_written */ } /* end nco_xcp_prc() */ nco-4.5.4/src/nco/nco_att_utl.h000066400000000000000000000201321264355130400163360ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Attribute utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_att_utl.h" *//* Attribute utilities */ #ifndef NCO_ATT_UTL_H #define NCO_ATT_UTL_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* stderr, FILE, NULL, printf */ #include /* strcmp() */ #ifdef HAVE_STRINGS_H # include /* strcasecmp() */ #endif /* !HAVE_STRINGS_H */ #include /* machine time */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_cnf_typ.h" /* Conform variable types */ #include "nco_ctl.h" /* Program flow control functions */ #include "nco_lst_utl.h" /* List utilities */ #include "nco_mmr.h" /* Memory management */ #include "nco_mss_val.h" /* Missing value utilities */ #ifdef _MSC_VER # include "nco_rth_flt.h" /* Float-precision arithmetic, MSVC macros */ #endif /* !_MSC_VER */ #include "nco_scm.h" /* Software configuration management */ #include "nco_sng_utl.h" /* String utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_wrp /* [fnc] Expand regular expressions then pass attribute edits to nco_aed_prc() */ (const int nc_id, /* I [id] Input netCDF file ID */ const int var_id, /* I [id] ID of variable on which to perform attribute editing */ const aed_sct aed); /* I [sct] Attribute-edit information */ nco_bool /* [flg] Attribute was altered */ nco_aed_prc /* [fnc] Process single attribute edit for single variable */ (const int nc_id, /* I [id] Input netCDF file ID */ const int var_id, /* I [id] ID of variable on which to perform attribute editing */ const aed_sct aed); /* I [sct] Attribute-edit information */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_glb /* [fnc] Process attributes in root group */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl); /* I [lst] Traversal table */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_grp /* [fnc] Process attributes in groups */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl); /* I [lst] Traversal table */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_all /* [fnc] Process attributes in all variables */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl); /* I [lst] Traversal table */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_xtr /* [fnc] Process attributes in variables that match table extraction flag */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl); /* I [lst] Traversal table */ nco_bool /* [flg] Attribute was changed */ nco_aed_prc_var_nm /* [fnc] Process attributes in variables that match input name */ (const int nc_id, /* I [id] netCDF file ID */ const aed_sct aed, /* I [sct] Attribute-edit information */ const trv_tbl_sct * const trv_tbl); /* I [lst] Traversal table */ void nco_att_cpy /* [fnc] Copy attributes from input netCDF file to output netCDF file */ (const int in_id, /* I [id] netCDF input-file ID */ const int out_id, /* I [id] netCDF output-file ID */ const int var_in_id, /* I [id] netCDF input-variable ID */ const int var_out_id, /* I [id] netCDF output-variable ID */ const nco_bool PCK_ATT_CPY); /* I [flg] Copy attributes "scale_factor", "add_offset" */ void nco_fl_lst_att_cat /* [fnc] Add input file list global attribute */ (const int out_id, /* I [id] netCDF output-file ID */ CST_X_PTR_CST_PTR_CST_Y(char,fl_lst_in), /* I [sng] Input file list */ const int fl_nbr); /* I [nbr] Number of files in input file list */ void nco_hst_att_cat /* [fnc] Add command line, date stamp to history attribute */ (const int out_id, /* I [id] netCDF output-file ID */ const char * const hst_sng); /* I [sng] String to add to history attribute */ void nco_prv_att_cat /* [fnc] Add provenance (history contents) of appended file to provenance attribute */ (const char * const fl_in, /* I [sng] Name of input-file */ const int in_id, /* I [id] netCDF input-file ID */ const int out_id); /* I [id] netCDF output-file ID */ void nco_mpi_att_cat /* [fnc] Add MPI tasks global attribute */ (const int out_id, /* I [id] netCDF output-file ID */ const int mpi_nbr); /* I [nbr] MPI nodes/tasks number */ aed_sct * /* O [sct] List of attribute edit structures */ nco_prs_aed_lst /* [fnc] Parse user-specified attribute edits into structure list */ (const int nbr_aed, /* I [nbr] Number of attributes in list */ X_CST_PTR_CST_PTR_Y(char,aed_arg)); /* I/O [sng] List of user-specified attribute edits (delimiters are changed to NULL on output */ int /* [flg] Error code */ nco_prs_att /* [fnc] Parse conjoined object and attribute names */ (rnm_sct * const rnm_att, /* I/O [sct] Structure [Object@]Attribute name on input, Attribute name on output */ char * const obj_nm, /* O [sng] Object name, if any */ nco_bool *mch_grp_all, /* O [flg] Rename all group attributes */ nco_bool *mch_grp_glb, /* O [flg] Rename only global attributes */ nco_bool *mch_obj_all); /* O [flg] Rename all group and variable attributes */ gpe_sct * /* O [sng] GPE structure */ nco_gpe_prs_arg /* [fnc] Parse Group Path Editing (GPE) argument */ (const char * const gpe_arg); /* I [sng] User-specified GPE specification */ char * /* O [sng] Result of applying GPE to input path */ nco_gpe_evl /* [fnc] Apply Group Path Editing (GPE) to argument */ (const gpe_sct * const gpe, /* I [sng] GPE structure */ const char * const grp_nm_fll_in); /* I [sng] Full group name */ char * /* O [sng] Stub of GPE applied to input path */ nco_gpe_evl_stb /* [fnc] Find stub of Group Path Editing (GPE) applied to argument */ (const gpe_sct * const gpe, /* I [sng] GPE structure */ const char * const grp_nm_fll_in); /* I [sng] Full group name */ gpe_sct * /* O [sct] Structure with dynamic memory free()'d */ nco_gpe_free /* [fnc] Free dynamic memory of GPE structure */ (gpe_sct * const gpe); /* O [sct] GPE structure */ const char * /* O [sng] String describing GPE */ nco_gpe_sng /* [fnc] Convert GPE enum to string */ (const gpe_enm gpe_md); /* I [enm] GPE mode */ rnm_sct * /* O [sng] Structured list of old, new names */ nco_prs_rnm_lst /* [fnc] Set old_nm, new_nm elements of rename structure */ (const int nbr_rnm, /* I [nbr] Number of elements in rename list */ char * const * const rnm_arg); /* I [sng] Unstructured list of old, new names */ void nco_glb_att_add /* [fnc] Add global attributes */ (const int out_id, /* I [id] netCDF output-file ID */ char **gaa_arg, /* [sng] Global attribute arguments */ const int gaa_arg_nbr); /* [nbr] Number of global attribute arguments */ void nco_thr_att_cat /* [fnc] Add threading global attribute */ (const int out_id, /* I [id] netCDF output-file ID */ const int thr_nbr); /* I [nbr] Thread number */ void nco_vrs_att_cat /* [fnc] Add NCO version global attribute */ (const int out_id); /* I [id] netCDF output-file ID */ nco_bool /* [O] Perform exception processing on this variable */ nco_is_xcp /* [fnc] Determine whether to perform exception processing */ (const char * const var_nm); /* [sng] Variable name */ void nco_xcp_prc /* [fnc] Perform exception processing on this variable */ (const char * const var_nm, /* [sng] Variable name */ const nc_type var_typ, /* I [enm] netCDF type of operand */ const long var_sz, /* I [nbr] Size (in elements) of operand */ char * const var_val); /* I/O [sng] Values of operand */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_ATT_UTL_H */ nco-4.5.4/src/nco/nco_aux.c000066400000000000000000000640161264355130400154630ustar00rootroot00000000000000/* $Header$ */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Purpose: Support hyperslabbing cell-based grids over coordinate ranges This works on datasets that contain CF-convention auxiliary coordinate variables. Such datasets contain variables with standard_name's "latitude" and "longitude". Cells that contain a value within the user-requested range are considered a match. Could be useful to look at the CF bounds variable instead but harder. Author: Karen Schuchardt Example usage: ncks -X 0.,45.,0.,90. -X 180.,225.,-90.,0. ~/nco/data/in.nc ~/foo.nc */ #include "nco_aux.h" /* Auxiliary coordinates */ nco_bool nco_find_lat_lon (int nc_id, char var_nm_lat[], char var_nm_lon[], char **units, int *lat_id, int *lon_id, nc_type *crd_typ) { /* Purpose: Find auxiliary coordinate variables that map to latitude/longitude Find variables with standard_name = "latitude" and "longitude" Return true if both latitude and longitude standard names are found Also return needed information about these auxiliary coordinates Assumes that units and types for latitude and longitude are identical Caller responsible for memory management for variable names Memory for unit strings must be freed by caller */ const char fnc_nm[]="nco_find_lat_lon()"; char var_nm[NC_MAX_NAME]; char att_val[NC_MAX_NAME]; int idx; int nvars=0; int rcd=NC_NOERR; int crd_nbr=0; int var_dimid[NC_MAX_VAR_DIMS]; /* [enm] Dimension ID */ int var_att_nbr; /* [nbr] Number of attributes */ int var_dmn_nbr; /* [nbr] Number of dimensions */ long att_lng; nc_type var_typ; /* [enm] variable type */ /* Make sure CF tag exists. Currently require CF-1.X value */ if(NCO_GET_ATT_CHAR(nc_id,NC_GLOBAL,"Conventions",att_val) || !strstr(att_val,"CF-1.")) if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stderr,"%s: WARNING %s reports file \"Convention\" attribute is missing or is present but not of the form \"CF-1.X\". Auxiliary coordinate support (i.e., the -X option) cannot be expected to behave well file does not support CF-1.X metadata conventions. Continuing anyway...\n",nco_prg_nm_get(),fnc_nm); /* Get number of variables */ rcd=nco_inq_nvars(nc_id,&nvars); /* For each variable, see if standard name is latitude or longitude */ for(idx=0;idx 1) (void)fprintf(stderr,"%s: WARNING %s reports latitude variable %s has %d dimensions. NCO only supports hyperslabbing of auxiliary coordinate variables with a single dimension. Continuing with unpredictable results...\n",nco_prg_nm_get(),fnc_nm,var_nm,var_dmn_nbr); /* Assign type; assumed same for both lat and lon */ *crd_typ=var_typ; crd_nbr++; } /* endif latitude */ if(!strcmp(att_val,"longitude")){ strcpy(var_nm_lon,var_nm); *lon_id=idx; crd_nbr++; } /* endif longitude */ if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s variable <%s>\n",nco_prg_nm_get(),fnc_nm,var_nm); } /* endif standard_name */ } /* end loop over vars */ if(crd_nbr != 2){ if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: %s unable to identify lat/lon auxiliary coordinate variables.\n",nco_prg_nm_get(),fnc_nm); return False; }else return True; } /* end nco_find_lat_lon() */ int /* [enm] Return status */ nco_get_dmn_info (int nc_id, int var_id, char dmn_nm[], int *dimid, long *dmn_sz) { /* Purpose: Get dimension information associated with specified variable In our case, this is lat or lon---they are presumed to be identical */ int rcd=NC_NOERR; nc_type var_typ; /* variable type */ int var_dimid[NC_MAX_VAR_DIMS]; /* dimension ids */ int var_att_nbr; /* number of attributes */ int var_dmn_nbr; /* number of dims */ /* Get dimension information */ rcd=nco_inq_var(nc_id,var_id,0,&var_typ,&var_dmn_nbr,var_dimid,&var_att_nbr); if(rcd == NC_NOERR){ *dimid=var_dimid[0]; rcd=nco_inq_dimlen(nc_id,var_dimid[0],dmn_sz); rcd=nco_inq_dimname(nc_id,var_dimid[0],dmn_nm); } /* endif */ if(rcd != NC_NOERR) nco_err_exit(rcd,"nco_get_dmn_info() unable to get dimension information"); return rcd; } /* end nco_get_dmn_info() */ lmt_sct ** nco_aux_evl (int in_id, int aux_nbr, char *aux_arg[], int *lmt_nbr, char *nm_dmn) /* O [sng] Dimension name */ { /* Purpose: Create lmt structure of slabs of continguous cells that match rectangular region specified by -X arguments. Intended for use with non-monotonic grids Requires CF-1.0 conventions Uses latitude/longitude centers rather than cell_bounds to detect matches Code assumes units are degrees if they are not radians */ const char fnc_nm[]="nco_aux_evl()"; /* [sng] Function name */ char *units=NULL; /* fxm TODO nco925: "units" value needs dynamically allocated size in case value exceeds NC_MAX_NAME */ char cll_idx_sng[100]; /* Buffer for user-assigned limit names */ char dmn_nm[NC_MAX_NAME]; char var_nm_lat[NC_MAX_NAME]; char var_nm_lon[NC_MAX_NAME]; dmn_sct lat; dmn_sct lon; double lat_crr; /* [dgr] Current cell latitude */ double lon_crr; /* [dgr] Current cell longitude */ double lat_min; /* [dgr] Lower left latitude of bounding rectangle */ double lat_max; /* [dgr] Upper right longitude of bounding rectangle */ double lon_min; /* [dgr] Lower left longitude of bounding rectangle */ double lon_max; /* [dgr] Upper right latitude of bounding rectangle */ int aux_idx; /* [idx] Index over user -X options */ int cll_grp_nbr=0; /* [nbr] Number of groups of cells within this bounding box */ int cll_idx; /* [idx] Cell index */ int cll_idx_min=-1; /* [idx] Minimum index of cell in consecutive cell set */ int cll_nbr_cns=0; /* [nbr] Number of consecutive cells within current group */ int cll_nbr_ttl=0; /* [nbr] Total number of cells within this bounding box */ int dmn_id=int_CEWI; int lat_id; int lon_id; int rcd=NC_NOERR; lmt_sct **lmt=NULL; /* [sct] List of returned lmt structures */ long dmn_sz=0; nc_type crd_typ; void *vp_lat; /* [dgr] Latitude coordinate array, float or double */ void *vp_lon; /* [dgr] Longitude coordinate array, float or double */ nco_bool has_lat_lon; *lmt_nbr=0; /* Obtain lat/lon variable names */ has_lat_lon=nco_find_lat_lon(in_id,var_nm_lat,var_nm_lon,&units,&lat_id,&lon_id,&crd_typ); if(!has_lat_lon) return NULL; /* Obtain dimension information of lat/lon coordinates */ rcd+=nco_get_dmn_info(in_id,lat_id,dmn_nm,&dmn_id,&dmn_sz); if(rcd != NC_NOERR) nco_err_exit(rcd,"nco_aux_evl() unable get past nco_get_dmn_info()\n"); /* Load latitude/longitude variables needed to search for region matches */ lat.type=crd_typ; lat.sz=dmn_sz; lat.srt=0L; vp_lat=(void *)nco_malloc(dmn_sz*nco_typ_lng(lat.type)); lon.type=crd_typ; lon.sz=dmn_sz; lon.srt=0L; vp_lon=(void *)nco_malloc(dmn_sz*nco_typ_lng(lon.type)); rcd+=nco_get_vara(in_id,lat_id,&lat.srt,&lat.sz,vp_lat,lat.type); rcd+=nco_get_vara(in_id,lon_id,&lon.srt,&lon.sz,vp_lon,lon.type); lmt_sct lmt_tpl; (void)nco_lmt_init(&lmt_tpl); lmt_tpl.nm=(char *)strdup(dmn_nm); lmt_tpl.lmt_typ=lmt_dmn_idx; lmt_tpl.is_usr_spc_lmt=True; lmt_tpl.is_usr_spc_min=True; lmt_tpl.is_usr_spc_max=True; lmt_tpl.flg_mro=False; lmt_tpl.srd_sng=(char *)strdup("1"); lmt_tpl.ssc_sng=NULL; lmt_tpl.ssc_sng=NULL; lmt_tpl.mro_sng=NULL; lmt_tpl.mro_sng=NULL; lmt_tpl.is_rec_dmn=0; lmt_tpl.id=dmn_id; lmt_tpl.min_idx=0; lmt_tpl.max_idx=0; lmt_tpl.srt=0L; lmt_tpl.end=0L; lmt_tpl.cnt=0L; lmt_tpl.srd=1L; lmt_tpl.ssc=1L; /* malloc() lmt structure to return No way to know exact size in advance though maximum is about dim_sz/2 */ int MAX_LMT_NBR=dmn_sz/2; if(aux_nbr > 0) lmt=(lmt_sct **)nco_malloc(MAX_LMT_NBR*sizeof(lmt_sct *)); /* Loop over user-specified bounding boxes */ for(aux_idx=0;aux_idx= lon_min && lon_crr <= lon_max && lat_crr >= lat_min && lat_crr <= lat_max){ if(cll_idx_min == -1){ /* First cell within current bounding box */ cll_idx_min=cll_idx; cll_nbr_cns=1; }else if(cll_idx == cll_idx_min+cll_nbr_cns){ /* Later, contiguous cell within current bounding box */ cll_nbr_cns++; } /* end found matching cell */ }else if(cll_idx_min != -1){ /* Current cell is not within bounding box though immediately previous cell is */ sprintf(cll_idx_sng,"%d",cll_idx_min); lmt_tpl.min_sng=(char *)strdup(cll_idx_sng); lmt_tpl.min_idx=lmt_tpl.srt=cll_idx_min; sprintf(cll_idx_sng,"%d",cll_idx_min+cll_nbr_cns-1); lmt_tpl.max_sng=(char *)strdup(cll_idx_sng); lmt_tpl.max_idx=lmt_tpl.end=cll_idx_min+cll_nbr_cns-1; lmt_tpl.cnt=cll_nbr_cns; (*lmt_nbr)++; if(*lmt_nbr > MAX_LMT_NBR) nco_err_exit(0,"%s: Number of slabs exceeds allocated mamory"); lmt[(*lmt_nbr)-1]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); *lmt[(*lmt_nbr)-1]=lmt_tpl; cll_grp_nbr++; cll_nbr_ttl+=cll_nbr_cns; /* Indicate that next cell, if any, in this bounding box requires new limit structure */ cll_idx_min=-1; } /* end if one or more consecutive matching cells */ } /* end loop over cells */ if(nco_dbg_lvl_get() > nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: %s reports bounding-box %g <= %s <= %g and %g <= %s <= %g brackets %d distinct group(s) comprising %d total gridpoint(s)\n",nco_prg_nm_get(),fnc_nm,lon_min,var_nm_lon,lon_max,lat_min,var_nm_lat,lat_max,cll_grp_nbr,cll_nbr_ttl); } } /* end loop over user supplied -X options */ /* Free allocated memory */ if(units) units=(char *)nco_free(units); if(vp_lat) vp_lat=nco_free(vp_lat); if(vp_lon) vp_lon=nco_free(vp_lon); /* With some loss of generality, we assume cell-based coordinates are not record coordinates spanning multiple files. Thus finding no cells within any bounding box constitutes a domain error. */ if(*lmt_nbr == 0){ (void)fprintf(stdout,"%s: ERROR %s reports that none of the %d specified auxiliary-coordinate bounding-box(es) contain any latitude/longitude coordinate pairs. This condition was not flagged as an error until 20110221. Prior to that, when no coordinates were in any of the user-specified auxiliary-coordinate hyperslab(s), NCO mistakenly returned the entire coordinate range as being within the hyperslab(s).\n",nco_prg_nm_get(),fnc_nm,aux_nbr); nco_exit(EXIT_FAILURE); } /* end if */ lmt=(lmt_sct **)nco_realloc(lmt,(*lmt_nbr)*sizeof(lmt_sct *)); /* Export dimension name */ strcpy(nm_dmn,dmn_nm); return lmt; } /* end nco_aux_evl() */ void nco_aux_prs (const char *bnd_bx_sng, const char *units, double *lon_min, double *lon_max, double *lat_min, double *lat_max) { /* Purpose: Parse command-line arguments of form: lon_min,lon_max,lat_min,lat_max */ char *bnd_bx_sng_tmp; char *crd_tkn; bnd_bx_sng_tmp=strdup(bnd_bx_sng); sscanf(bnd_bx_sng,"%lf,%lf,%lf,%lf",lon_min,lon_max,lat_min,lat_max); crd_tkn=strtok(bnd_bx_sng_tmp,", "); if(crd_tkn) sscanf(crd_tkn,"%lf",lon_min); else nco_err_exit(0,"nco_aux_prs(): Problem with LL longitude string"); crd_tkn=strtok(NULL,", "); if(crd_tkn) sscanf(crd_tkn,"%lf",lon_max); else nco_err_exit(0,"nco_aux_prs(): Problem with UR longitude string"); crd_tkn=strtok(NULL,", "); if(crd_tkn) sscanf(crd_tkn,"%lf",lat_min); else nco_err_exit(0,"nco_aux_prs(): Problem with LL latitude string"); crd_tkn=strtok(NULL,", "); if(crd_tkn) sscanf(crd_tkn,"%lf",lat_max); else nco_err_exit(0,"nco_aux_prs(): Problem with UR latitude string"); if(bnd_bx_sng_tmp) bnd_bx_sng_tmp=(char *)nco_free(bnd_bx_sng_tmp); if(!strcmp(units,"radians")){ const double dgr2rdn=M_PI/180.0; *lon_min*=dgr2rdn; *lon_max*=dgr2rdn; *lat_min*=dgr2rdn; *lat_max*=dgr2rdn; } /* endif radians */ } /* nco_aux_prs */ lmt_sct ** /* O [lst] Auxiliary coordinate limits */ nco_aux_evl_trv (const int nc_id, /* I [ID] netCDF file ID */ int aux_nbr, /* I [sng] Number of auxiliary coordinates */ char *aux_arg[], /* I [sng] Auxiliary coordinates */ trv_sct *lat_trv, /* I [sct] "latitude" variable */ trv_sct *lon_trv, /* I [sct] "longitude" variable */ const nc_type crd_typ, /* I [nbr] netCDF type of both "latitude" and "longitude" */ const char * const units, /* I [sng] Units of both "latitude" and "longitude" */ int *aux_lmt_nbr) /* I/O [nbr] Number of coordinate limits */ { /* Purpose: Create lmt structure of slabs of continguous cells that match rectangular region specified by -X arguments. Intended for use with non-monotonic grids Requires CF-1.0 conventions Uses latitude/longitude centers rather than cell_bounds to detect matches Code assumes units are degrees if they are not radians */ const char fnc_nm[]="nco_aux_evl_trv()"; char cll_idx_sng[100]; /* Buffer for user-assigned limit names */ char dmn_nm[NC_MAX_NAME]; char var_nm_lat[NC_MAX_NAME]; char var_nm_lon[NC_MAX_NAME]; dmn_sct lat; dmn_sct lon; double lat_crr; /* [dgr] Current cell latitude */ double lon_crr; /* [dgr] Current cell longitude */ double lat_min; /* [dgr] Lower left latitude of bounding rectangle */ double lat_max; /* [dgr] Upper right longitude of bounding rectangle */ double lon_min; /* [dgr] Lower left longitude of bounding rectangle */ double lon_max; /* [dgr] Upper right latitude of bounding rectangle */ int aux_idx; /* [idx] Index over user -X options */ int cll_grp_nbr=0; /* [nbr] Number of groups of cells within this bounding box */ int cll_idx; /* [idx] Cell index */ int cll_idx_min=-1; /* [idx] Minimum index of cell in consecutive cell set */ int cll_nbr_cns=0; /* [nbr] Number of consecutive cells within current group */ int cll_nbr_ttl=0; /* [nbr] Total number of cells within this bounding box */ int dmn_id=int_CEWI; int lat_id; int lon_id; int rcd=NC_NOERR; int grp_id_lat; /* [id] Group ID */ int grp_id_lon; /* [id] Group ID */ lmt_sct **lmt=NULL; /* [sct] List of returned lmt structures */ long dmn_sz=0; void *vp_lat; /* [dgr] Latitude coordinate array, float or double */ void *vp_lon; /* [dgr] Longitude coordinate array, float or double */ *aux_lmt_nbr=0; /* Obtain group ID of 'latitude' and 'longitude' */ (void)nco_inq_grp_full_ncid(nc_id,lat_trv->grp_nm_fll,&grp_id_lat); (void)nco_inq_grp_full_ncid(nc_id,lon_trv->grp_nm_fll,&grp_id_lon); /* Obtain variable ID of 'latitude' and 'longitude' */ (void)nco_inq_varid(grp_id_lat,lat_trv->nm,&lat_id); (void)nco_inq_varid(grp_id_lon,lon_trv->nm,&lon_id); /* Obtain dimension information of lat/lon coordinates */ (void)nco_get_dmn_info(grp_id_lat,lat_id,dmn_nm,&dmn_id,&dmn_sz); /* Load latitude/longitude variables needed to search for region matches */ lat.type=crd_typ; lat.sz=dmn_sz; lat.srt=0L; vp_lat=(void *)nco_malloc(dmn_sz*nco_typ_lng(lat.type)); lon.type=crd_typ; lon.sz=dmn_sz; lon.srt=0L; vp_lon=(void *)nco_malloc(dmn_sz*nco_typ_lng(lon.type)); rcd+=nco_get_vara(grp_id_lat,lat_id,&lat.srt,&lat.sz,vp_lat,lat.type); rcd+=nco_get_vara(grp_id_lon,lon_id,&lon.srt,&lon.sz,vp_lon,lon.type); lmt_sct lmt_tpl; (void)nco_lmt_init(&lmt_tpl); lmt_tpl.nm=(char *)strdup(dmn_nm); lmt_tpl.lmt_typ=lmt_dmn_idx; lmt_tpl.is_usr_spc_lmt=True; lmt_tpl.is_usr_spc_min=True; lmt_tpl.is_usr_spc_max=True; lmt_tpl.flg_mro=False; lmt_tpl.srd_sng=(char *)strdup("1"); lmt_tpl.ssc_sng=NULL; lmt_tpl.ssc_sng=NULL; lmt_tpl.mro_sng=NULL; lmt_tpl.mro_sng=NULL; lmt_tpl.is_rec_dmn=0; lmt_tpl.id=dmn_id; lmt_tpl.min_idx=0; lmt_tpl.max_idx=0; lmt_tpl.srt=0L; lmt_tpl.end=0L; lmt_tpl.cnt=0L; lmt_tpl.srd=1L; lmt_tpl.ssc=1L; /* malloc() lmt structure to return No way to know exact size in advance though maximum is about dim_sz/2 */ int MAX_LMT_NBR=dmn_sz/2; if(aux_nbr > 0) lmt=(lmt_sct **)nco_malloc(MAX_LMT_NBR*sizeof(lmt_sct *)); /* Loop over user-specified bounding boxes */ for(aux_idx=0;aux_idx= lon_min && lon_crr <= lon_max && lat_crr >= lat_min && lat_crr <= lat_max){ if(cll_idx_min == -1){ /* First cell within current bounding box */ cll_idx_min=cll_idx; cll_nbr_cns=1; }else if(cll_idx == cll_idx_min+cll_nbr_cns){ /* Later, contiguous cell within current bounding box */ cll_nbr_cns++; } /* end found matching cell */ }else if(cll_idx_min != -1){ /* Current cell is not within bounding box though immediately previous cell is */ sprintf(cll_idx_sng,"%d",cll_idx_min); lmt_tpl.min_sng=(char *)strdup(cll_idx_sng); lmt_tpl.min_idx=lmt_tpl.srt=cll_idx_min; sprintf(cll_idx_sng,"%d",cll_idx_min+cll_nbr_cns-1); lmt_tpl.max_sng=(char *)strdup(cll_idx_sng); lmt_tpl.max_idx=lmt_tpl.end=cll_idx_min+cll_nbr_cns-1; lmt_tpl.cnt=cll_nbr_cns; (*aux_lmt_nbr)++; if(*aux_lmt_nbr > MAX_LMT_NBR) nco_err_exit(0,"%s: Number of slabs exceeds allocated mamory"); lmt[(*aux_lmt_nbr)-1]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); *lmt[(*aux_lmt_nbr)-1]=lmt_tpl; cll_grp_nbr++; cll_nbr_ttl+=cll_nbr_cns; /* Indicate that next cell, if any, in this bounding box requires new limit structure */ cll_idx_min=-1; } /* end if one or more consecutive matching cells */ } /* end loop over cells */ if(nco_dbg_lvl_get() > nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: %s reports bounding-box %g <= %s <= %g and %g <= %s <= %g brackets %d distinct group(s) comprising %d total gridpoint(s)\n",nco_prg_nm_get(),fnc_nm,lon_min,var_nm_lon,lon_max,lat_min,var_nm_lat,lat_max,cll_grp_nbr,cll_nbr_ttl); } /* end loop over user supplied -X options */ /* Free allocated memory */ if(vp_lat) vp_lat=nco_free(vp_lat); if(vp_lon) vp_lon=nco_free(vp_lon); /* No limits found */ if(*aux_lmt_nbr == 0) return NULL; lmt=(lmt_sct **)nco_realloc(lmt,(*aux_lmt_nbr)*sizeof(lmt_sct *)); return lmt; } /* nco_aux_evl_trv */ nco_bool nco_find_lat_lon_trv (const int nc_id, /* I [ID] netCDF file ID */ const trv_sct * const var_trv, /* I [sct] Variable to search for "standard_name" attribute */ const char * const att_val_trg, /* I [sng] Attribute value to find ("latitude" or "longitude") */ char **var_nm_fll, /* I/O [sng] Full name of variable that has "latitude" or "longitude" attributes */ int *dmn_id, /* I/O [id] Dimension ID of "latitude" and "longitude" */ nc_type *crd_typ, /* I/O [enm] netCDF type of both "latitude" and "longitude" */ char units[]) /* I/O [sng] Units of both "latitude" and "longitude" */ { /* Purpose: Find auxiliary coordinate variables that map to latitude/longitude Find variables with standard_name = "latitude" and "longitude" Return true if both latitude and longitude standard names are found Also return needed information about these auxiliary coordinates Assumes that units and types for latitude and longitude are identical Caller responsible for memory management for variable names Memory for unit strings must be freed by caller */ const char fnc_nm[]="nco_find_lat_lon_trv()"; char att_nm[NC_MAX_NAME]; /* [sng] Attribute name */ char var_nm[NC_MAX_NAME]; int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ int var_dimid[NC_MAX_VAR_DIMS]; /* [enm] Dimension ID */ int var_att_nbr; /* [nbr] Number of attributes */ int var_dmn_nbr; /* [nbr] Number of dimensions */ nc_type var_typ; /* [enm] variable type */ assert(var_trv->nco_typ == nco_obj_typ_var); /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv->grp_nm_fll,&grp_id); /* Obtain variable ID */ (void)nco_inq_varid(grp_id,var_trv->nm,&var_id); /* Find number of attributes */ (void)nco_inq_var(grp_id,var_id,var_nm,&var_typ,&var_dmn_nbr,var_dimid,&var_att_nbr); assert(var_att_nbr == var_trv->nbr_att); for(int idx_att=0;idx_att= nco_dbg_var) (void)fprintf(stdout,"%s: %s reports CF convention requires \"latitude\" to have units attribute\n",nco_prg_nm_get(),fnc_nm); return False; } /* endif */ NCO_GET_ATT_CHAR(grp_id,var_id,"units",units); units[att_lng]='\0'; if(var_dmn_nbr > 1) (void)fprintf(stderr,"%s: WARNING %s reports latitude variable %s has %d dimensions. NCO only supports hyperslabbing of auxiliary coordinate variables with a single dimension. Continuing with unpredictable results...\n",nco_prg_nm_get(),fnc_nm,var_nm,var_dmn_nbr); /* Copy values to export */ *var_nm_fll=(char *)strdup(var_trv->nm_fll); *crd_typ=var_typ; *dmn_id=var_dimid[0]; return True; } /* strcmp() */ } /* end loop over attributes */ return False; } /* end nco_find_lat_lon_trv() */ nco-4.5.4/src/nco/nco_aux.h000066400000000000000000000057671264355130400155000ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Sub-set cell-based grids using auxiliary coordinate variable */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_aux.h" *//* Auxiliary coordinates */ #ifndef NCO_AUX_H #define NCO_AUX_H /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, printf */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_lmt.h" /* Hyperslab limits */ #include "nco_sng_utl.h" /* String utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ lmt_sct ** nco_aux_evl (int in_id, int aux_nbr, char *aux_arg[], int *lmt_nbr, char *nm_dmn); /* O [sng] Dimension name */ nco_bool nco_find_lat_lon (int ncid, char var_nm_lat[], char var_nm_lon[], char **units, int *lat_id, int *lon_id, nc_type *crd_typ); int nco_get_dmn_info (int ncid, int varid, char dimname[], int *dimid, long *dmn_sz); void nco_aux_prs (const char *bnd_bx_sng, const char *units, double *lon_min, double *lon_max, double *lat_min, double *lat_max); lmt_sct ** /* O [lst] Auxiliary coordinate limits */ nco_aux_evl_trv (const int nc_id, /* I [ID] netCDF file ID */ int aux_nbr, /* I [sng] Number of auxiliary coordinates */ char *aux_arg[], /* I [sng] Auxiliary coordinates */ trv_sct *lat_trv, /* I [sct] "latitude" variable */ trv_sct *lon_trv, /* I [sct] "longitude" variable */ const nc_type crd_typ, /* I [nbr] netCDF type of both "latitude" and "longitude" */ const char * const units, /* I [sng] Units of both "latitude" and "longitude" */ int *aux_lmt_nbr); /* I/O [nbr] Number of coordinate limits */ nco_bool nco_find_lat_lon_trv (const int nc_id, /* I [ID] netCDF file ID */ const trv_sct * const var_trv, /* I [sct] Variable object that contains "standard_name" attribute */ const char * const att_val_trg, /* I [sng] Attribute value to find ( "latitude" or "longitude" ) */ char **var_nm_fll, /* I/O [sng] Full name of variable that has "latitude" or "longitude" attributes */ int *dmn_id, /* I/O [id] Dimension ID of the diension of "latitude" and "longitude" */ nc_type *crd_typ, /* I/O [enm] netCDF type of both "latitude" and "longitude" */ char units[]); /* I/O [sng] Units of both "latitude" and "longitude" */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_AUX_H */ nco-4.5.4/src/nco/nco_bnr.c000066400000000000000000000064051264355130400154450ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Binary write utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_bnr.h" /* Binary write utilities */ FILE * /* O [fl] Unformatted binary output file handle */ nco_bnr_open /* [fnc] Open unformatted binary data file for writing */ (const char * const fl_bnr) /* [sng] Unformatted binary output file */ { /* Purpose: Open unformatted binary data file for writing */ FILE *fp_bnr; /* [fl] Unformatted binary output file handle */ /* Open output file */ if((fp_bnr=fopen(fl_bnr,"w")) == NULL){ (void)fprintf(stderr,"%s: ERROR unable to open binary output file %s\n",nco_prg_nm_get(),fl_bnr); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stdout,"%s: Opened binary file %s\n",nco_prg_nm_get(),fl_bnr); if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"Variable(s): Name (native type, # elements x bytes per element):\n"); return fp_bnr; /* O [fl] Unformatted binary output file handle */ } /* end nco_bnr_open() */ int /* [rcd] Return code */ nco_bnr_close /* [fnc] Close unformatted binary data file for writing */ (FILE *fp_bnr, /* I [fl] Unformatted binary output file handle */ const char * const fl_bnr) /* [sng] Unformatted binary output file */ { /* Purpose: Close unformatted binary data file for writing */ int rcd; /* [rcd] Return code */ /* Close output file */ rcd=fclose(fp_bnr); if(rcd != 0){ (void)fprintf(stderr,"%s: ERROR unable to close binary output file %s\n",nco_prg_nm_get(),fl_bnr); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"\n"); if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stdout,"%s: Closed binary file %s\n",nco_prg_nm_get(),fl_bnr); return rcd; /* O [rcd] Return code */ } /* end nco_bnr_close() */ size_t /* O [nbr] Number of elements successfully written */ nco_bnr_wrt /* [fnc] Write unformatted binary data */ (FILE * const fp_bnr, /* I [fl] Unformatted binary output file handle */ const char * const var_nm, /* I [sng] Variable name */ const long var_sz, /* I [nbr] Variable size */ const nc_type var_typ, /* I [enm] Variable type */ const void * const void_ptr) /* I [ptr] Data to write */ { /* Purpose: Write unformatted binary data */ /* Testing: ncks -O -D 3 -B -b foo.bnr ~/nco/data/in.nc ~/nco/data/foo.nc */ long wrt_nbr; /* [nbr] Number of elements successfully written */ /* Write unformatted data to binary output file */ wrt_nbr=fwrite(void_ptr,(size_t)nco_typ_lng(var_typ),(size_t)var_sz,fp_bnr); if(wrt_nbr != var_sz){ (void)fprintf(stderr,"%s: ERROR only succeeded in writing %ld of %ld elements of variable %s\n",nco_prg_nm_get(),wrt_nbr,var_sz,var_nm); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s (%s, %ld x %lu b), ",var_nm,c_typ_nm(var_typ),var_sz,(unsigned long)nco_typ_lng(var_typ)); if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fflush(stderr); return wrt_nbr; /* O [nbr] Number of elements successfully written */ } /* end nco_bnr_wrt() */ nco-4.5.4/src/nco/nco_bnr.h000066400000000000000000000034071264355130400154510ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Binary write utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_bnr.h" *//* Binary write utilities */ #ifndef NCO_BNR_H #define NCO_BNR_H /* Standard header files */ #include /* stderr, FILE, NULL, printf */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_ctl.h" /* Program flow control functions */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ FILE * /* O [fl] Unformatted binary output file handle */ nco_bnr_open /* [fnc] Open unformatted binary data file for writing */ (const char * const fl_bnr); /* [sng] Unformatted binary output file */ int /* [rcd] Return code */ nco_bnr_close /* [fnc] Close unformatted binary data file for writing */ (FILE *fp_bnr, /* I [fl] Unformatted binary output file handle */ const char * const fl_bnr); /* [sng] Unformatted binary output file */ size_t /* O [nbr] Number of elements successfully written */ nco_bnr_wrt /* [fnc] Write unformatted binary data */ (FILE * const fp_bnr, /* I [fl] Unformatted binary output file handle */ const char * const var_nm, /* I [sng] Variable name */ const long var_sz, /* I [nbr] Variable size */ const nc_type var_typ, /* I [enm] Variable type */ const void * const void_ptr); /* I [ptr] Data to write */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_BNR_H */ nco-4.5.4/src/nco/nco_cln_utl.c000066400000000000000000000664271264355130400163360ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Calendar utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_cln_utl.h" /* Calendar utilities */ /* Arrays to hold calendar type units */ /* Format: year, month, day, hour, minute, second, origin, offset */ double DATA_360[8]={31104000.0,2592000.0,86400.0,3600.0,60.0,1,0.0,0.0}; double DATA_365[8]={31536000.0,2628000.0,86400.0,3600.0,60.0,1,0.0,0.0}; /* Days in months */ int DAYS_PER_MONTH_360[12]={30,30,30,30,30,30,30,30,30,30,30,30}; int DAYS_PER_MONTH_365[12]={31,28,31,30,31,30,31,31,30,31,30,31}; int DAYS_PER_MONTH_366[12]={31,29,31,30,31,30,31,31,30,31,30,31}; int /* O [nbr] Number of days to end of month */ nco_nd2endm /* [fnc] Compute number of days to end of month */ (const int mth, /* I [mth] Month */ const int day) /* I [day] Current day */ { /* Purpose: Returns number of days to end of month This number added to the input argument day gives last day of month mth Original fortran: Brian Eaton cal_util.F:nd2endm() C version: Charlie Zender */ const int mdays[]={31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int nbr_day_2_mth_end; if(mth < 1 || mth > 12 || day < 0){ (void)fprintf(stdout,"%s: ERROR nco_nd2endm() reports mth = %d, day = %d\n",nco_prg_nm_get(),mth,day); nco_exit(EXIT_FAILURE); } /* end if */ nbr_day_2_mth_end=mdays[mth-1]-day; return nbr_day_2_mth_end; } /* nco_nd2endm */ nco_int /* O [YYMMDD] Date a specified number of days from input date */ nco_newdate /* [fnc] Compute date a specified number of days from input date */ (const nco_int date, /* I [YYMMDD] Date */ const nco_int day_srt) /* I [day] Days ahead of input date */ { /* Purpose: Find date a specified number of days (possibly negative) from given date Original fortran: Brian Eaton cal_util.F:newdate() C version: Charlie Zender */ /* Local */ const long mth_day_nbr[]= /* Number of days in each month */ {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; long day_nbr_2_eom; /* Days to end of month */ long day_crr; /* Day of date */ long day_ncr; /* Running count of days to increment date by */ long mth_crr; /* Month of date */ long mth_idx; /* Index */ long mth_srt; /* Save the initial value of month */ long mth_tmp; /* Current month as we increment date */ long yr_crr; /* Year of date */ nco_int date_srt; /* Initial value of date (may change sign) */ nco_int newdate_YYMMDD; /* New date in YYMMDD format */ if(day_srt == 0L) return date; date_srt=date; yr_crr=date_srt/10000L; if(date_srt < 0L) date_srt=-date_srt; mth_crr=(date_srt%10000L)/100L; mth_srt=mth_crr; day_crr=date_srt%100L; if(day_srt > 0){ day_ncr=day_srt; yr_crr+=day_ncr/365L; day_ncr=day_ncr%365L; for(mth_idx=mth_srt;mth_idx<=mth_srt+12L;mth_idx++){ mth_tmp=mth_idx; if(mth_idx > 12L) mth_tmp=mth_idx-12L; day_nbr_2_eom=(long int)nco_nd2endm(mth_tmp,day_crr); if(day_ncr > day_nbr_2_eom){ mth_crr++; if(mth_crr > 12L){ mth_crr=1L; yr_crr++; } /* end if */ day_crr=1L; day_ncr-=day_nbr_2_eom+1L; if(day_ncr == 0L) break; }else{ day_crr=day_crr+day_ncr; break; } /* end if */ } /* end loop over mth */ /* Previous two breaks continue execution here */ }else if(day_srt < 0L){ day_ncr=-day_srt; yr_crr=yr_crr-day_ncr/365L; day_ncr=day_ncr%365L; mth_srt=mth_crr; for(mth_idx=mth_srt+12L;mth_idx>=mth_srt;mth_idx--){ if(day_ncr >= day_crr){ mth_crr--; if(mth_crr < 1L){ mth_crr=12L; yr_crr--; } /* end if */ day_ncr-=day_crr; day_crr=mth_day_nbr[mth_crr-1L]; if(day_ncr == 0L) break; }else{ day_crr-=day_ncr; break; } /* end if */ } /* end loop over mth */ /* Previous two breaks continue execution here */ } /* end if */ if(yr_crr >= 0){ newdate_YYMMDD=yr_crr*10000L+mth_crr*100L+day_crr; }else{ newdate_YYMMDD=-yr_crr*10000L+mth_crr*100L+day_crr; newdate_YYMMDD=-newdate_YYMMDD; } /* end if */ return newdate_YYMMDD; } /* end nco_newdate() */ #ifdef ENABLE_UDUNITS # ifdef HAVE_UDUNITS2_H /* UDUnits2 routines */ int /* [rcd] Return code */ nco_cln_clc_dff /* [fnc] UDUnits2 Compute difference between two coordinate units */ (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ double crr_val, double *og_val) /* O [] Difference between two units strings */ { const char fnc_nm[]="nco_cln_clc_dff()"; /* [sng] Function name */ cv_converter *ut_cnv; /* UDUnits converter */ int ut_rcd; /* [enm] UDUnits2 status */ ut_system *ut_sys; ut_unit *ut_sct_in; /* [sct] UDUnits structure, input units */ ut_unit *ut_sct_out; /* [sct] UDUnits structure, output units */ /* Quick return if units identical */ if(!strcasecmp(fl_unt_sng,fl_bs_sng)){ *og_val=crr_val; return NCO_NOERR; } /* end if */ /* When empty, ut_read_xml() uses environment variable UDUNITS2_XML_PATH, if any Otherwise it uses default initial location hardcoded when library was built */ if(nco_dbg_lvl_get() >= nco_dbg_vrb) ut_set_error_message_handler(ut_write_to_stderr); else ut_set_error_message_handler(ut_ignore); ut_sys=ut_read_xml(NULL); if(ut_sys == NULL){ (void)fprintf(stdout,"%s: %s() failed to initialize UDUnits2 library\n",nco_prg_nm_get(),fnc_nm); return NCO_ERR; /* Failure */ } /* end if err */ /* Units string to convert from */ ut_sct_in=ut_parse(ut_sys,fl_unt_sng,UT_ASCII); if(!ut_sct_in){ /* Problem with 'units' attribute */ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"ERROR: empty units attribute string\n"); if(ut_rcd == UT_SYNTAX) (void)fprintf(stderr,"ERROR: units attribute \"%s\" has a syntax error\n",fl_unt_sng); if(ut_rcd == UT_UNKNOWN) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is not listed in UDUnits2 SI system database\n",fl_unt_sng); return NCO_ERR; /* Failure */ } /* endif coordinate on disk has no units attribute */ /* Units string to convert to */ ut_sct_out=ut_parse(ut_sys,fl_bs_sng,UT_ASCII); if(!ut_sct_out){ /* Problem with 'units' attribute */ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"ERROR: Empty units attribute string\n"); if(ut_rcd == UT_SYNTAX) (void)fprintf(stderr,"ERROR: units attribute \"%s\" has a syntax error\n",fl_bs_sng); if(ut_rcd == UT_UNKNOWN) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is not listed in UDUnits2 SI system database\n",fl_bs_sng); return NCO_ERR; /* Failure */ } /* endif */ /* Create converter */ ut_cnv=ut_get_converter(ut_sct_in,ut_sct_out); /* UDUnits converter */ if(!ut_cnv){ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"WARNING: One of units, %s or %s, is NULL\n",fl_bs_sng,fl_unt_sng); if(ut_rcd == UT_NOT_SAME_SYSTEM) (void)fprintf(stderr,"WARNING: Units %s and %s belong to different unit systems\n",fl_bs_sng,fl_unt_sng); if(ut_rcd == UT_MEANINGLESS) (void)fprintf(stderr,"WARNING: Conversion between user-specified unit \"%s\" and file units \"%s\" is meaningless\n",fl_bs_sng,fl_unt_sng); return NCO_ERR; /* Failure */ } /* endif */ /* Convert */ *og_val=cv_convert_double(ut_cnv,crr_val); if(nco_dbg_lvl_get() >= nco_dbg_var) fprintf(stderr, "%s: INFO %s() reports conversion between systems \"%s\" and \"%s\" is %f\n",nco_prg_nm_get(),fnc_nm,fl_unt_sng,fl_bs_sng,*og_val); ut_free(ut_sct_in); ut_free(ut_sct_out); cv_free(ut_cnv); ut_free_system(ut_sys); /* Free memory taken by UDUnits library */ return NCO_NOERR; } /* end UDUnits2 nco_cln_clc_dff() */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_prs_tm /* UDUnits2 Extract time stamp from parsed UDUnits string */ (const char *unt_sng, /* I [ptr] units attribute string */ tm_cln_sct *tm_in) /* O [sct] Time structure to be populated */ { const char fnc_nm[]="nco_cln_prs_tm()"; /* [sng] Function name */ /* 20141230: fxm figure out a better length */ char bfr[200]; char *dt_sng; int ut_rcd; /* [enm] UDUnits2 status */ ut_system *ut_sys; ut_unit *ut_sct_in; /* UDUnits structure, input units */ /* When empty, ut_read_xml() uses environment variable UDUNITS2_XML_PATH, if any Otherwise it uses default initial location hardcoded when library was built */ if(nco_dbg_lvl_get() >= nco_dbg_vrb) ut_set_error_message_handler(ut_write_to_stderr); else ut_set_error_message_handler(ut_ignore); ut_sys=ut_read_xml(NULL); if(ut_sys == NULL){ (void)fprintf(stdout,"%s: %s failed to initialize UDUnits2 library\n",nco_prg_nm_get(),fnc_nm); return NCO_ERR; /* Failure */ } /* end if err */ /* Units string to convert from */ ut_sct_in=ut_parse(ut_sys,unt_sng,UT_ASCII); if(ut_sct_in == NULL){ /* Problem with 'units' attribute */ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"ERROR: empty units attribute string\n"); if(ut_rcd == UT_SYNTAX) (void)fprintf(stderr,"ERROR: units attribute \"%s\" has a syntax error\n",unt_sng); if(ut_rcd == UT_UNKNOWN) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is not listed in UDUnits2 SI system database\n",unt_sng); return NCO_ERR; /* Failure */ } /* endif coordinate on disk has no units attribute */ /* Print timestamp to buffer in standard, dependable format */ ut_format(ut_sct_in,bfr,sizeof(bfr),UT_ASCII|UT_NAMES); /* Extract parsed time units from print string (kludgy) 20141230 change to using ut_decode_time() instead? */ dt_sng=strstr(bfr,"since"); sscanf(dt_sng,"%*s %d-%d-%d %d:%d:%f",&tm_in->year,&tm_in->month,&tm_in->day,&tm_in->hour,&tm_in->min,&tm_in->sec); ut_free_system(ut_sys); /* Free memory taken by UDUnits library */ ut_free(ut_sct_in); return NCO_NOERR; } /* end UDUnits2 nco_cln_prs_tm() */ # else /* !HAVE_UDUNITS2_H */ /* UDUnits1 routines */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_clc_dff /* [fnc] UDUnits1 Difference between two co-ordinate units */ (const char *fl_unt_sng, /* I [ptr] units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ double crr_val, double *og_val) /* O [ptr] */ { const char fnc_nm[]="nco_cln_clc_dff()"; /* [sng] Function name */ double slp; double incpt; int rcd; utUnit udu_sct_in; /* UDUnits structure, input units */ utUnit udu_sct_out; /* UDUnits structure, output units */ /* Quick return if units identical */ if(!strcmp(fl_unt_sng,fl_bs_sng) ){ *og_val=crr_val; return NCO_NOERR; } /* endif */ #ifdef UDUNITS_PATH /* UDUNITS_PATH macro expands to where autoconf found database file */ rcd=utInit(UDUNITS_PATH); #else /* !UDUNITS_PATH */ /* When empty, utInit() uses environment variable UDUNITS_PATH, if any Otherwise it uses default initial location hardcoded when library was built */ rcd=utInit(""); #endif /* !UDUNITS_PATH */ if(rcd != UDUNITS_NOERR){ (void)fprintf(stdout,"%s: %s failed to initialize UDUnits2 library\n",nco_prg_nm_get(),fnc_nm); return NCO_ERR; } /* end if err */ /* units string to convert from */ rcd=utScan(fl_unt_sng,&udu_sct_in); if(rcd != UDUNITS_NOERR){ if(rcd == UT_EINVALID) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is invalid \n",fl_unt_sng); if(rcd == UT_ESYNTAX) (void)fprintf(stderr,"ERROR units attribute \"%s\" contains a syntax error",fl_unt_sng); if(rcd == UT_EUNKNOWN) (void)fprintf(stderr,"ERROR units attribute \"%s\" is not in udunits database",fl_unt_sng); (void)utTerm(); /* Free memory taken by UDUnits library */ return NCO_ERR; } /* endif unkown type */ /* units string to convert to */ rcd=utScan(fl_bs_sng,&udu_sct_out); if(rcd != UDUNITS_NOERR){ if(rcd == UT_EINVALID) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is invalid \n",fl_bs_sng); if(rcd == UT_ESYNTAX) (void)fprintf(stderr,"ERROR units attribute \"%s\" contains a syntax error",fl_bs_sng); if(rcd == UT_EUNKNOWN) (void)fprintf(stderr,"ERROR units attribute \"%s\" is not in udunits database",fl_bs_sng); (void)utTerm(); /* Free memory taken by UDUnits library */ return NCO_ERR; } /* endif unkown type */ rcd=utConvert(&udu_sct_in,&udu_sct_out,&slp,&incpt); if(rcd == UT_ECONVERT){ (void)fprintf(stderr,"ERROR: user specified unit \"%s\" cannot be converted to units \"%s\"\n",fl_unt_sng,fl_bs_sng); (void)utTerm(); return NCO_ERR; } /* endif */ *og_val=crr_val*slp+incpt; /* debug stuff */ if(nco_dbg_lvl_get() > nco_dbg_std) (void)fprintf(stderr,"%s: %s reports difference between systems \"%s\" and \"%s\" is %f\n",nco_prg_nm_get(),fnc_nm,fl_unt_sng,fl_bs_sng,*og_val); (void)utTerm(); return NCO_NOERR; } /* end UDUnits1 nco_cln_clc_dff() */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_prs_tm /* UDUnits1 Extract time stamp from a parsed udunits string */ (const char *unt_sng, /* I [ptr] units attribute string */ tm_cln_sct *tm_in) /* O [sct] Time structure to be populated */ { const char fnc_nm[]="nco_cln_prs_tm()"; /* [sng] Function name */ int rcd; utUnit udu_sct_in; /* UDUnits structure, input units */ #ifdef UDUNITS_PATH /* UDUNITS_PATH macro expands to where autoconf found database file */ rcd=utInit(UDUNITS_PATH); #else /* !UDUNITS_PATH */ /* When empty, utInit() uses environment variable UDUNITS_PATH, if any Otherwise it uses default initial location hardcoded when library was built */ rcd=utInit(""); #endif /* !UDUNITS_PATH */ if(rcd != UDUNITS_NOERR){ (void)fprintf(stdout,"%s: %s failed to initialize UDUnits library\n",nco_prg_nm_get(),fnc_nm); return NCO_ERR; } /* end if err */ /* Units string to convert from */ rcd=utScan(unt_sng,&udu_sct_in); if(rcd != UDUNITS_NOERR){ if(rcd == UT_EINVALID) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is invalid \n",unt_sng); if(rcd == UT_ESYNTAX) (void)fprintf(stderr,"ERROR units attribute \"%s\" contains a syntax error",unt_sng); if(rcd == UT_EUNKNOWN) (void)fprintf(stderr,"ERROR units attribute \"%s\" is not in udunits database",unt_sng); (void)utTerm(); /* Free memory taken by UDUnits library */ return NCO_ERR; } /* endif unkown type */ /* Extract time origin */ if(utIsTime(&udu_sct_in)){ utCalendar(0.0,&udu_sct_in,&tm_in->year,&tm_in->month,&tm_in->day,&tm_in->hour,&tm_in->min,&tm_in->sec); rcd=NCO_NOERR; }else{ rcd=NCO_ERR; } /* endelse */ (void)utTerm(); /* Free memory taken by UDUnits library */ return rcd; } /* end UDUnits1 nco_cln_prs_tm() */ # endif /* !HAVE_UDUNITS2 */ #else /* !ENABLE_UDUNITS */ /* No UDUnits implementation available */ /* Stubs to enable compilation without UDUnits */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_clc_dff( /* [fnc] Difference between two co-ordinate units */ const char *fl_unt_sng, /* I [ptr] units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ double crr_val, double *og_val){ /* O [ptr] */ return NCO_NOERR; } int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_prs_tm( /* Extract time stamp from a parsed UDUnits string */ const char *unt_sng, /* I [ptr] units attribute string */ tm_cln_sct *tm_in){ /* O [sct] struct to be populated */ return NCO_NOERR; } #endif /* !ENABLE_UDUNITS */ /* End UDUnits-related routines*/ tm_typ /* O [enm] Units type */ nco_cln_get_tm_typ /* Returns time unit type or tm_void if not found */ (const char *ud_sng){ /* I [ptr] Units string */ int idx; int len; char *lcl_sng; tm_typ rcd_typ; lcl_sng=strdup(ud_sng); /* Set initial return type to void and overwrite */ rcd_typ=tm_void; /* Convert to lower case */ len=strlen(lcl_sng); for(idx=0;idxsc_cln){ case cln_360: data=DATA_360; cln_sct->value=data[0]*(cln_sct->year-1)+ data[1]*(cln_sct->month-1)+ data[2]*(cln_sct->day-1)+ data[3]*cln_sct->hour+ data[4]*cln_sct->min+ data[5]*(double)cln_sct->sec; break; case cln_365: data=DATA_365; cln_sct->value=data[0]*(cln_sct->year-1)+ data[2]*nco_cln_days_in_year_prior_to_given_month(cln_365,cln_sct->month)+ data[2]*(cln_sct->day-1)+ data[3]*cln_sct->hour+ data[4]*cln_sct->min+ data[5]*(double)cln_sct->sec; break; case cln_366: break; case cln_std: case cln_grg: case cln_jul: case cln_nil: break; } /* end switch */ return; } /* end nco_cln_pop_val() */ double /* O [dbl] relative time */ nco_cln_rel_val (double offset, /* I [dbl] time in base units */ nco_cln_typ lmt_cln, /* I [enm] Calendar type */ tm_typ bs_tm_typ) /* I [enm] Time units */ { double *data=NULL_CEWI; double scl=double_CEWI; switch(lmt_cln) { case cln_360: data=DATA_360; break; case cln_365: data=DATA_365; break; case cln_366: break; case cln_std: case cln_grg: case cln_jul: case cln_nil: break; } /* Switch for type */ switch(bs_tm_typ){ case tm_year: scl=data[0]; break; case tm_month: scl=data[1]; break; case tm_day: scl=data[2]; break; case tm_hour: scl=data[3]; break; case tm_min: scl=data[4]; break; case tm_sec: case tm_void: scl=data[5]; break; } /* end switch */ return offset/scl; } /* end nco_cln_rel_val() */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_clc_tm /* [fnc] Difference between two coordinate units */ (const char *fl_unt_sng, /* I [ptr] Units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] Units attribute string from disk */ nco_cln_typ lmt_cln, /* [enum] Calendar type of coordinate variable */ double *og_val){ /* O [ptr] */ int rcd; int year; int month; char *lcl_unt_sng; /* 20141230 figure out better length */ char tmp_sng[100]; double crr_val; tm_typ bs_tm_typ; /* enum for units type in fl_bs_sng */ tm_cln_sct unt_cln_sct; tm_cln_sct bs_cln_sct; if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: nco_cln_clc_tm() reports unt_sng=%s bs_sng=%s\n",nco_prg_nm_get(),fl_unt_sng,fl_bs_sng); /* Does fl_unt_sng look like a regular timestamp? */ if(sscanf(fl_unt_sng,"%d-%d",&year,&month) == 2){ lcl_unt_sng=(char *)nco_malloc((strlen(fl_unt_sng)+3L)*sizeof(char)); strcpy(lcl_unt_sng,"s@"); strcat(lcl_unt_sng,fl_unt_sng); }else{ lcl_unt_sng=strdup(fl_unt_sng); } /* endelse */ /* Temporary until we handle more calendar types */ if(lmt_cln != cln_360 && lmt_cln != cln_365){ rcd=nco_cln_clc_dff(lcl_unt_sng,fl_bs_sng,0.0,og_val); lcl_unt_sng=(char *)nco_free(lcl_unt_sng); return rcd; } /* endif */ /* Obtain units type from fl_bs_sng */ if(sscanf(fl_bs_sng,"%s",tmp_sng) != 1) return NCO_ERR; bs_tm_typ=nco_cln_get_tm_typ(tmp_sng); /* Assume non-standard calendar */ if(nco_cln_prs_tm(lcl_unt_sng,&unt_cln_sct) == NCO_ERR) return NCO_ERR; if(nco_cln_prs_tm(fl_bs_sng,&bs_cln_sct) == NCO_ERR) return NCO_ERR; unt_cln_sct.sc_typ=bs_tm_typ; bs_cln_sct.sc_typ=bs_tm_typ; unt_cln_sct.sc_cln=lmt_cln; bs_cln_sct.sc_cln=lmt_cln; (void)nco_cln_pop_val(&unt_cln_sct); (void)nco_cln_pop_val(&bs_cln_sct); crr_val=nco_cln_rel_val(unt_cln_sct.value-bs_cln_sct.value,lmt_cln,bs_tm_typ); *og_val=crr_val; lcl_unt_sng=(char *)nco_free(lcl_unt_sng); return NCO_NOERR; } /* end nco_cln_clc_tm() */ int /* [rcd] Successful conversion returns NCO_NOERR */ nco_cln_clc_org /* [fnc] Difference between two generic co-ordinate units */ (const char *fl_unt_sng, /* I [ptr] Source value (optional) and source units */ const char *fl_bs_sng, /* I [ptr] Target units */ nco_cln_typ lmt_cln, /* [enm] Calendar type, if any, of coordinate variable */ double *og_val) /* O [ptr] Target value in units stored on disk */ { /* Purpose: Given a value expressed source units (fl_unit_sng) and target units to switch to, determine and return the value expressed in the target units. */ int rcd; char *usr_unt_sng; double crr_val; /* If units contain date or timestamp call special time-conversion routine */ if(strcasestr(fl_bs_sng," from ") || strcasestr(fl_bs_sng," since ") || strcasestr(fl_bs_sng," after ")){ rcd=nco_cln_clc_tm(fl_unt_sng,fl_bs_sng,lmt_cln,og_val); return rcd; } /* endif */ /* Regular conversion of fl_unt_sng of form , e.g., '10 inches', '100 ft' */ usr_unt_sng=(char *)nco_calloc(strlen(fl_unt_sng)+1L, sizeof(char)); sscanf(fl_unt_sng,"%lg %s",&crr_val,usr_unt_sng); rcd=nco_cln_clc_dff(usr_unt_sng,fl_bs_sng,crr_val,og_val); usr_unt_sng=(char *)nco_free(usr_unt_sng); return rcd; } /* end nco_cln_clc_org() */ int /* O [flg] String is calendar date */ nco_cln_chk_tm /* [fnc] Is string a UDUnits-compatible calendar format, e.g., "PERIOD since REFERENCE_DATE" */ (const char *unit_sng) /* I [sng] Units string */ { /* Purpose: Determine whether the string is a UDUnits-compatible calendar format, e.g., "PERIOD since REFERENCE_DATE" */ /* Does string contain date keyword? */ if(strcasestr(unit_sng," from ") || strcasestr(unit_sng," since ") || strcasestr(unit_sng," after ")) return True; else return False; } /* end nco_cln_chk_tm() */ int /* [rcd] Return code */ nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */ (const ptr_unn val, /* I [sct] Value to rebase */ const long val_idx, /* I [idx] Index into 1-D array of values */ const nc_type val_typ, /* I [enm] Value type */ const char *unit_sng, /* I [sng] Units string */ char *lgb_sng) /* O [sng] Legible version of input string */ { /* Purpose: Rebase calendar string for legibility Assumptions: Input units string unit_sng is a calendar date, i.e., contains "from", "since", or "after" ncdump handles this in nctime0.c dumplib.c/nctime_val_tostring() by Dave Allured, NOAA cdRel2Iso() from CDMS by Bob Drach, LLNL cdParseRelunits() from CDMS by Bob Drach, LLNL */ #ifdef HAVE_UDUNITS2_H const char fnc_nm[]="nco_cln_sng_rbs()"; /* [sng] Function name */ double val_dbl; /* [day] Calendar offset converted to double */ int ut_rcd; /* [enm] UDUnits2 status */ ut_system *ut_sys; ut_unit *ut_sct_in; /* [sct] UDUnits structure, input units */ ut_unit *ut_sct_out; /* [sct] UDUnits structure, output units */ /* Quick return if units DNE */ if(!unit_sng) return NCO_NOERR; /* When empty, ut_read_xml() uses environment variable UDUNITS2_XML_PATH, if any Otherwise it uses default initial location hardcoded when library was built */ if(nco_dbg_lvl_get() >= nco_dbg_vrb) ut_set_error_message_handler(ut_write_to_stderr); else ut_set_error_message_handler(ut_ignore); ut_sys=ut_read_xml(NULL); if(!ut_sys){ (void)fprintf(stdout,"%s: %s() failed to initialize UDUnits2 library\n",nco_prg_nm_get(),fnc_nm); return NCO_ERR; /* Failure */ } /* end if err */ /* Units string containing calendar origin converted to UDUnit structure */ ut_sct_in=ut_parse(ut_sys,unit_sng,UT_ASCII); if(!ut_sct_in){ /* Problem with 'units' attribute */ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"ERROR: empty units attribute string\n"); if(ut_rcd == UT_SYNTAX) (void)fprintf(stderr,"ERROR: units attribute \"%s\" has a syntax error\n",unit_sng); if(ut_rcd == UT_UNKNOWN) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is not listed in UDUnits2 SI system database\n",unit_sng); return NCO_ERR; /* Failure */ } /* endif coordinate on disk has no units attribute */ /* Convert time since calendar origin to double */ val_dbl=ptr_unn_2_scl_dbl(val,val_typ); /* Units string to convert to */ ut_sct_out=ut_offset(ut_sct_in,val_dbl); if(!ut_sct_out){ /* Problem with 'units' attribute */ ut_rcd=ut_get_status(); /* [enm] UDUnits2 status */ if(ut_rcd == UT_BAD_ARG) (void)fprintf(stderr,"ERROR: Empty units attribute string\n"); if(ut_rcd == UT_SYNTAX) (void)fprintf(stderr,"ERROR: units attribute \"%s\" has a syntax error\n",unit_sng); if(ut_rcd == UT_UNKNOWN) (void)fprintf(stderr,"ERROR: units attribute \"%s\" is not listed in UDUnits2 SI system database\n",unit_sng); return NCO_ERR; /* Failure */ } /* endif */ val_dbl+=0*val_idx; /* CEWI */ ut_free(ut_sct_in); ut_free(ut_sct_out); ut_free_system(ut_sys); /* Free memory taken by UDUnits library */ #endif /* !HAVE_UDUNITS2 */ lgb_sng[0]='\0'; /* CEWI */ return NCO_NOERR; } /* end nco_cln_sng_rbs() */ nco-4.5.4/src/nco/nco_cln_utl.h000066400000000000000000000120731264355130400163270ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Calendar utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_cln_utl.h" *//* Calendar utilities */ #ifndef NCO_CLN_UTL_H #define NCO_CLN_UTL_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* isalnum(), isdigit(), tolower() */ #include /* stderr, FILE, NULL, printf */ #include /* strtod, strtol, malloc, getopt, exit */ #include /* strcmp() */ #ifdef HAVE_STRINGS_H # include /* strcasecmp() */ #endif /* !HAVE_STRINGS_H */ /* 3rd party vendors */ #ifdef ENABLE_UDUNITS # ifdef HAVE_UDUNITS2_H # include /* Unidata units library */ # else # include /* Unidata units library */ # endif /* !HAVE_UDUNITS2_H */ #endif /* !ENABLE_UDUNITS */ #ifdef _MSC_VER #undef snprintf /* udunits2 defines snprintf as c99_snprintf, so the above is required */ #define snprintf _snprintf #endif /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_ctl.h" /* Program flow control functions */ #include "nco_sng_utl.h" /* String utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Calendar types */ typedef enum { tm_year=1, tm_month, tm_day, tm_hour, tm_min, tm_sec, tm_void /* No time units matched */ } tm_typ; typedef struct { tm_typ sc_typ; nco_cln_typ sc_cln; int year; int month; int day; int hour; int min; float sec; double value; } tm_cln_sct; int /* O [nbr] Number of days to end of month */ nco_nd2endm /* [fnc] Compute number of days to end of month */ (const int mth, /* I [mth] Month */ const int day); /* I [day] Current day */ nco_int /* O [YYMMDD] Date a specified number of days from input date */ nco_newdate /* [fnc] Compute date a specified number of days from input date */ (const nco_int date, /* I [YYMMDD] Date */ const nco_int day_srt); /* I [day] Days ahead of input date */ int /* [flg] NCO_NOERR or NCO_ERR */ nco_cln_clc_dff( /* [fnc] difference between two co-ordinate units */ const char *fl_unt_sng, /* I [ptr] units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ double crr_val, /* I [dbl] input units value */ double *rgn_val); /* O difference between two units string */ int /* [flg] NCO_NOERR or NCO_ERR */ nco_cln_prs_tm( /* Extract time stamp from a parsed udunits string */ const char *unt_sng, /* I [ptr] units attribute string */ tm_cln_sct *tm_in); /* O [sct] struct to be populated */ tm_typ /* [enum] Units type */ nco_cln_get_tm_typ( /* returns time unit type or tm_void if not found */ const char *ud_sng); /* I [ptr] units string */ nco_cln_typ /* [enum] Calendar type */ nco_cln_get_cln_typ( /* [fnc] Calendar type or cln_nil if not found */ const char *ud_sng); /* I [ptr] units string */ int /* O [int] number of days */ nco_cln_days_in_year_prior_to_given_month( /* [fnc] Number of days in year prior to month */ nco_cln_typ lmt_cln, /* [enum] calendar type */ int mth_idx); /* I [idx] Month (1-based counting, December == 12) */ void nco_cln_pop_val( /* [fnc] Calculate value in cln_sct */ tm_cln_sct *cln_sct);/* I/O [ptr] Calendar structure */ double /* O [dbl] Relative time */ nco_cln_rel_val( /* [fnc] */ double offset, /* I [dbl] time in base units */ nco_cln_typ lmt_cln, /* I [enum] Calendar type */ tm_typ bs_tm_typ); /* I [enum] Time units */ int /* O [flg] NCO_NOERR or NCO_ERR */ nco_cln_clc_tm( /* [fnc] Difference between two time coordinate units */ const char *fl_unt_sng, /* I [ptr] user units attribute string */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ nco_cln_typ lmt_cln, /* [enm] Calendar type of coordinate var */ double *rgn_val); /* O [ptr] time diff in units based on fl_bs_sng */ int /* O [flg] NCO_NOERR or NCO_ERR */ nco_cln_clc_org( /* [fnc] Difference between two generic coordinate units */ const char *fl_unt_sng, /* I [ptr] units attribute string from disk */ const char *fl_bs_sng, /* I [ptr] units attribute string from disk */ nco_cln_typ lmt_cln, /* I [enum] Calendar type of coordinate var */ double *og_val); /* O [ptr] */ int /* O [flg] String is calendar date */ nco_cln_chk_tm /* [fnc] Is string a UDUnits-compatible calendar format, e.g., "PERIOD since REFERENCE_DATE" */ (const char *unit_sng); /* I [sng] Units string */ int /* [rcd] Return code */ nco_cln_sng_rbs /* [fnc] Rebase calendar string for legibility */ (const ptr_unn val, /* I [sct] Value to rebase */ const long val_idx, /* I [idx] Index into 1-D array of values */ const nc_type val_typ, /* I [enm] Value type */ const char *unit_sng, /* I [sng] Units string */ char *lgb_sng); /* O [sng] Legible version of input string */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CLN_UTL_H */ nco-4.5.4/src/nco/nco_cnf_dmn.c000066400000000000000000001245561264355130400163000ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Conform dimensions between variables */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_cnf_dmn.h" /* Conform dimensions */ var_sct * /* O [sct] Pointer to conforming variable structure */ nco_var_cnf_dmn /* [fnc] Stretch second variable to match dimensions of first variable */ (const var_sct * const var, /* I [ptr] Pointer to variable structure to serve as template */ var_sct * const wgt, /* I [ptr] Pointer to variable structure to make conform to var */ var_sct *wgt_crr, /* I/O [ptr] Pointer to existing conforming variable structure, if any (destroyed when does not conform to var) */ const nco_bool MUST_CONFORM, /* I [flg] Must wgt and var conform? */ nco_bool *DO_CONFORM) /* O [flg] Do wgt and var conform? */ { /* Threads: Routine is thread safe and calls no unsafe routines */ /* fxm: TODO 226. Is xrf in nco_var_cnf_dmn() really necessary? If not, remove it and make wgt arg const var_sct * const */ /* Purpose: Stretch second variable to match dimensions of first variable Dimensions in var which are not in wgt will be present in wgt_out, with values replicated from existing dimensions in wgt. By default, wgt's dimensions must be subset of var's dimensions (MUST_CONFORM=true) Calling routine should set MUST_CONFORM=false if wgt and var need not conform When wgt and var do not conform then then nco_var_cnf_dmn sets *DO_CONFORM=False and returns copy of var with all values set to 1.0 Calling procedure then decides what to do with unity output MUST_CONFORM is True for ncbo: Variables of like name to be, e.g., differenced, must conform MUST_CONFORM is False false for ncap, ncflint, ncwa: Some variables to be averaged may not conform to specified weight, e.g., lon will not conform to gw. This is fine and returned wgt_out may be discarded. */ /* There are many inelegant ways to accomplish this (without using C++): */ /* Perhaps most efficient method in general case is to expand weight array until it is same size as variable array, and then multiply these arrays together element-by-element in highly vectorized loop (possibly in Fortran or BLAS). To enhance speed, (enlarged) weight-values array could be static, only re-made when dimensions of incoming variables change. */ /* Another general method, though more expensive, is to use C to figure out the multidimensional indices into the one dimensional hyperslab, a la ncks. Knowing these indices, routine could loop over the one-dimensional array element by element, choosing the appropriate index into the weight array from those same multidimensional indices. This method can also create a static weight-value array that is only destroyed when an incoming variable changes dimensions from the previous variable. */ /* Another method, which is not completely general, but which may be good enough for governement work, is to create Fortran subroutines which expect variables of a given number of dimensions as input. Creating these functions for up to five dimensions would satisfy most situations C code would determine which branch to call based on number of dimensions C++ or Fortran9x overloading could construct this interface more elegantly */ /* An (untested) simplification to some of these methods is to copy the 1-D array value pointer of variable and cast it to an N-D array pointer Then C could handle indexing This method easily produce working, but non-general code Implementation would require ugly branches or hard-to-understand recursive function calls */ /* Routine assumes weight will never have more dimensions than variable (otherwise which hyperslab of weight to use would be ill-defined). However, weight may (and often will) have fewer dimensions than variable */ nco_bool CONFORMABLE=False; /* [flg] wgt can be made to conform to var */ nco_bool USE_DUMMY_WGT=False; /* [flg] Fool NCO into thinking wgt conforms to var */ int idx; /* [idx] Counting index */ int idx_dmn; /* [idx] Dimension index */ int wgt_var_dmn_shr_nbr=0; /* [nbr] Number of dimensions wgt and var share */ var_sct *wgt_out=NULL; /* Initialize flag to false. Overwrite by true after successful conformance */ *DO_CONFORM=False; /* Does current weight (wgt_crr) conform to variable's dimensions? */ if(wgt_crr){ /* Test rank first because wgt_crr because of 19960218 bug (invalid dmn_id in old wgt_crr leads to match) */ if(var->nbr_dim == wgt_crr->nbr_dim){ /* Test whether all wgt and var dimensions match in sequence */ for(idx=0;idxnbr_dim;idx++){ /* 20131002: nco_var_cnf_dmn() borken for groups as shown by dimension short-name strcmp() comparison here */ if(strcmp(wgt_crr->dim[idx]->nm,var->dim[idx]->nm)) break; } /* end loop over dimensions */ if(idx == var->nbr_dim) *DO_CONFORM=True; } /* end if ranks are equal */ /* 20060425: Weight re-use will not occur if wgt_crr is free()'d here Some DDRA benchmarks need to know cost of broadcasting weights To turn off weight re-use and cause broadcasting, execute "else" block below by (temporarily) using if(*DO_CONFORM && False){ ....instead of.... if(*DO_CONFORM){ in following condition */ if(*DO_CONFORM){ wgt_out=wgt_crr; }else{ wgt_crr=nco_var_free(wgt_crr); wgt_out=NULL; } /* !*DO_CONFORM */ } /* wgt_crr == NULL */ /* Does original weight (wgt) conform to variable's dimensions? */ if(wgt_out == NULL){ if(var->nbr_dim > 0){ /* Test that all dimensions in wgt appear in var */ for(idx=0;idxnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ /* 20131002: nco_var_cnf_dmn() borken for groups as shown by dimension short-name strcmp() comparison here */ if(!strcmp(wgt->dim[idx]->nm,var->dim[idx_dmn]->nm)){ wgt_var_dmn_shr_nbr++; /* wgt and var share this dimension */ break; } /* endif */ } /* end loop over var dimensions */ } /* end loop over wgt dimensions */ /* Decide whether wgt and var dimensions conform, are mutually exclusive, or are partially exclusive (an error) */ if(wgt_var_dmn_shr_nbr == wgt->nbr_dim){ /* wgt and var conform */ CONFORMABLE=True; }else if(wgt_var_dmn_shr_nbr == 0){ /* Dimensions in wgt and var are mutually exclusive */ CONFORMABLE=False; if(MUST_CONFORM){ (void)fprintf(stdout,"%s: ERROR %s and template %s share no dimensions\n",nco_prg_nm_get(),wgt->nm,var->nm); nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"\n%s: DEBUG %s and template %s share no dimensions: Not broadcasting %s to %s\n",nco_prg_nm_get(),wgt->nm,var->nm,wgt->nm,var->nm); USE_DUMMY_WGT=True; } /* endif */ }else if(wgt->nbr_dim > var->nbr_dim){ /* wgt is larger rank than var---no possibility of conforming */ CONFORMABLE=False; if(MUST_CONFORM){ (void)fprintf(stdout,"%s: ERROR %s is rank %d but template %s is rank %d: Impossible to broadcast\n",nco_prg_nm_get(),wgt->nm,wgt->nbr_dim,var->nm,var->nbr_dim); nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"\n%s: DEBUG %s is rank %d but template %s is rank %d: Not broadcasting %s to %s\n",nco_prg_nm_get(),wgt->nm,wgt->nbr_dim,var->nm,var->nbr_dim,wgt->nm,var->nm); USE_DUMMY_WGT=True; } /* endif */ }else if(wgt_var_dmn_shr_nbr > 0 && wgt_var_dmn_shr_nbr < wgt->nbr_dim){ /* Some, but not all, of wgt dimensions are in var */ CONFORMABLE=False; if(MUST_CONFORM){ (void)fprintf(stdout,"%s: ERROR %d dimensions of %s belong to template %s but %d dimensions do not\n",nco_prg_nm_get(),wgt_var_dmn_shr_nbr,wgt->nm,var->nm,wgt->nbr_dim-wgt_var_dmn_shr_nbr); nco_exit(EXIT_FAILURE); }else{ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"\n%s: DEBUG %d dimensions of %s belong to template %s but %d dimensions do not: Not broadcasting %s to %s\n",nco_prg_nm_get(),wgt_var_dmn_shr_nbr,wgt->nm,var->nm,wgt->nbr_dim-wgt_var_dmn_shr_nbr,wgt->nm,var->nm); USE_DUMMY_WGT=True; } /* endif */ } /* end if */ if(USE_DUMMY_WGT){ /* Variables do not truly conform, but this might be OK, depending on the application, so set DO_CONFORM flag to false and ... */ *DO_CONFORM=False; /* ... return a dummy weight of 1.0, which allows program logic to pretend variable is weighted, but does not change answers */ wgt_out=nco_var_dpl(var); (void)vec_set(wgt_out->type,wgt_out->sz,wgt_out->val,1.0); } /* endif */ if(CONFORMABLE){ if(var->nbr_dim == wgt->nbr_dim){ /* var and wgt conform and are same rank */ /* Test whether all wgt and var dimensions match in sequence */ for(idx=0;idxnbr_dim;idx++){ /* 20131002: nco_var_cnf_dmn() borken for groups as shown by dimension short-name strcmp() comparison here */ if(strcmp(wgt->dim[idx]->nm,var->dim[idx]->nm)) break; /* if(wgt->dmn_id[idx] != var->dmn_id[idx]) break;*/ } /* end loop over dimensions */ /* If so, take shortcut and copy wgt to wgt_out */ if(idx == var->nbr_dim) *DO_CONFORM=True; }else{ /* var and wgt conform but are not same rank, set flag to proceed to generic conform routine */ *DO_CONFORM=False; } /* end else */ } /* endif CONFORMABLE */ }else{ /* var is scalar, if wgt is also then set flag to copy wgt to wgt_out else proceed to generic conform routine */ if(wgt->nbr_dim == 0) *DO_CONFORM=True; else *DO_CONFORM=False; } /* end else */ if(CONFORMABLE && *DO_CONFORM){ wgt_out=nco_var_dpl(wgt); (void)nco_xrf_var(wgt,wgt_out); } /* end if */ } /* end if */ /* Set diagnostic DDRA information DDRA */ /* ddra_info->wgt_brd_flg=(wgt_out == NULL) ? True : False; *//* [flg] Broadcast weight for this variable */ if(wgt_out == NULL){ /* Expand original weight (wgt) to match size of current variable */ char * restrict wgt_cp; char * restrict wgt_out_cp; int idx_wgt_var[NC_MAX_DIMS]; int wgt_nbr_dim; int var_nbr_dmn_m1; long * restrict var_cnt; long dmn_ss[NC_MAX_DIMS]; long dmn_var_map[NC_MAX_DIMS]; long dmn_wgt_map[NC_MAX_DIMS]; long var_lmn; long wgt_lmn; long var_sz; size_t wgt_typ_sz; /* Copy main attributes of variable into output weight */ wgt_out=nco_var_dpl(var); (void)nco_xrf_var(wgt,wgt_out); /* wgt_out variable was copied from template var Modify key fields so its name and type are based on wgt, not var wgt_out will then be hybrid between wgt and var Remainder of routine fills wgt_out's var-dimensionality with wgt-values */ wgt_out->nm=(char *)nco_free(wgt_out->nm); wgt_out->nm=(char *)strdup(wgt->nm); wgt_out->id=wgt->id; wgt_out->type=wgt->type; wgt_out->val.vp=(void *)nco_free(wgt_out->val.vp); wgt_out->val.vp=(void *)nco_malloc(wgt_out->sz*nco_typ_lng(wgt_out->type)); wgt_cp=(char *)wgt->val.vp; wgt_out_cp=(char *)wgt_out->val.vp; wgt_typ_sz=nco_typ_lng(wgt_out->type); if(wgt_out->nbr_dim == 0){ /* Variable (and weight) are scalars, not arrays */ (void)memcpy(wgt_out_cp,wgt_cp,wgt_typ_sz); }else if(wgt->nbr_dim == 0){ /* Lesser-ranked input variable is scalar Expansion in this degenerate case needs no index juggling (reverse-mapping) Code as special case to speed-up important applications of ncap for synthetic file creation */ var_sz=var->sz; for(var_lmn=0;var_lmnnbr_dim;idx++){ for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Compare names, not dimension IDs */ /* 20131002: nco_var_cnf_dmn() borken for groups as shown by dimension short-name strcmp() comparison here */ if(!strcmp(var->dim[idx_dmn]->nm,wgt->dim[idx]->nm)){ idx_wgt_var[idx]=idx_dmn; break; } /* end if */ /* Sanity check */ if(idx_dmn == var->nbr_dim-1){ (void)fprintf(stdout,"%s: ERROR wgt %s has dimension %s but var %s does not deep in nco_var_cnf_dmn()\n",nco_prg_nm_get(),wgt->nm,wgt->dim[idx]->nm,var->nm); nco_exit(EXIT_FAILURE); } /* end if err */ } /* end loop over variable dimensions */ } /* end loop over weight dimensions */ /* Figure out map for each dimension of variable */ for(idx=0;idxnbr_dim;idx++) dmn_var_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_var_map[idx]*=var->cnt[idx_dmn]; /* Figure out map for each dimension of weight */ for(idx=0;idxnbr_dim;idx++) dmn_wgt_map[idx]=1L; for(idx=0;idxnbr_dim-1;idx++) for(idx_dmn=idx+1;idx_dmnnbr_dim;idx_dmn++) dmn_wgt_map[idx]*=wgt->cnt[idx_dmn]; /* Define convenience variables to avoid repetitive indirect addressing */ wgt_nbr_dim=wgt->nbr_dim; var_sz=var->sz; var_cnt=var->cnt; var_nbr_dmn_m1=var->nbr_dim-1; /* var_lmn is offset into 1-D array corresponding to N-D indices dmn_ss */ for(var_lmn=0;var_lmnnbr_dim > var_2_org->nbr_dim){ var_tmp=nco_var_cnf_dmn(var_1_org,var_2_org,var_tmp,MUST_CONFORM,&DO_CONFORM); if(var_2_org != var_tmp){ var_2_org=nco_var_free(var_2_org); *var_2=var_tmp; } /* endif replace var_2 */ }else{ var_tmp=nco_var_cnf_dmn(var_2_org,var_1_org,var_tmp,MUST_CONFORM,&DO_CONFORM); if(var_1_org != var_tmp){ var_1_org=nco_var_free(var_1_org); *var_1=var_tmp; } /* endif replace var_1 */ } /* endif var_1 > var_2 */ if(!DO_CONFORM){ (void)fprintf(stderr,"%s: ncap_var_cnf_dmn() reports that variables %s and %s do not have have conforming dimensions. Cannot proceed with operation\n",nco_prg_nm_get(),(*var_1)->nm,(*var_2)->nm); nco_exit(EXIT_FAILURE); } /* endif */ return DO_CONFORM; /* [flg] Do var_1 and var_2 conform after processing? */ } /* end ncap_var_cnf_dmn() */ char * /* [sng] Name of record dimension, if any, required by re-order */ nco_var_dmn_rdr_mtd /* [fnc] Change dimension ordering of variable metadata */ (const var_sct * const var_in, /* I [ptr] Variable with metadata and data in original order */ var_sct * const var_out, /* I/O [ptr] Variable whose metadata will be re-ordered */ CST_X_PTR_CST_PTR_CST_Y(dmn_sct,dmn_rdr), /* I [sct] List of dimension structures in new order */ const int dmn_rdr_nbr, /* I [nbr] Number of dimension structures in structure list */ int * const dmn_idx_out_in, /* O [idx] Dimension correspondence, output->input */ const nco_bool * const dmn_rvr_rdr, /* I [idx] Reverse dimension */ nco_bool * const dmn_rvr_in) /* O [idx] Reverse dimension */ { /* Purpose: Re-order dimensions in a given variable dmn_rdr contains new dimension order for dimensions Currently routine allows only dimension permutations, i.e., re-arranging dimensions without changing their number (variable rank). Routine keeps track of two variables var_* whose abbreviations are: in: Input variable (already hyperslabbed) with old dimension ordering rdr: User-specified re-ordered dimension list. Possibly subset of dmn_in out: Output (re-ordered) dimensionality specific to each variable At first it seemed this routine could re-order input variable in place without copying it Multiple constraints keep this from being practical Constraints are dictated by the architectural decision to call nco_var_dmn_rdr_mtd() twice Decision to call nco_var_dmn_rdr_mtd() twice is based on: 1. Want to parallelize loop over variables to increase throughput Parallel writes to output file only possible if output file is defined in shape, order Output file only definable once variable shapes, i.e., re-ordered dimensions known Alternatives to calling nco_var_dmn_rdr_mtd() twice: A. Each thread enters redefine() mode and adds its variable to output file Internal data re-copying would be expensive and unnecessary Hence Alternative A is not viable B. Perform output file definition and all writes after all variable re-ordering Memory consumption would increase to O(fl_in_sz) to keep all re-ordered data in memory Hence Alternative B is not viable 2. The two calls to nco_var_dmn_rdr_mtd() accomplish the following A. First call: Create var_out->dim for call to nco_var_dfn() Main thread makes first call in serial mode just prior to nco_var_dfn() No input data (AOT metadata) have been allocated or read in at this point Routine exits after modifying var_out metadata for new dimension geometry B. Second call: Re-order var_in->val data and place in var_out Although var_out->dmn is retained between calls, intermediate information such as in_out dimension mapping arrays are lost and must be re-created Hence second call must re-do most of first call, then begin re-ordering Routine must access un-touched var_in->dim input structure during both parts of second call Hence var_in must be unmodified between first and second call dmn_rdr is user-specified list of dimensions to be re-arranged User specifies all or only a subset of all dimensions in input file For example, say user specifies -d lat,lon This ensures lat precedes lon in all variables in output file In this case dmn_rdr is (user-specified) list [lat,lon] Input 0-D variables dimensioned [] output with dmn_out=[] (unaltered) Input 1-D variables dimensioned [lat] output with dmn_out=[lat] (unaltered) Input 2-D variables dimensioned [lat,lon] output with dmn_out=[lat,lon] (unaltered) Input 2-D variables dimensioned [time,lev] output with dmn_out=[time,lev] (unaltered) Input 2-D variables dimensioned [lon,lat] output with dmn_out=[lon,lat] (transposed) Input 3-D variables dimensioned [lon,lat,time] output with dmn_out=[lat,lon,time] Input 3-D variables dimensioned [time,lon,lat] output with dmn_out=[time,lat,lon] Input 3-D variables dimensioned [lon,lev,lat] output with dmn_out=[lat,lev,lon] Input 4-D variables dimensioned [lon,lev,lat,time] output with dmn_out=[lat,lev,lon,time] Hence output dimension dmn_out list depends on each particular variable Some, or even all, dimensions in dmn_rdr may not be in dmn_in Re-ordering is only necessary for variables where dmn_in and dmn_rdr share at least two dimensions Dimension reversal: Users specify dimension reversal by prefixing dimension name with negative sign Host routine passes dimension reversing flags in dmn_rvr_rdr Dimensions may be re-ordered, reversed, or both */ /* 20070509 CEWI RUVICFFU: dmn_idx_rdr_in */ const char fnc_nm[]="nco_var_dmn_rdr_mtd()"; /* [sng] Function name */ char *rec_dmn_nm_out=NULL; /* [sng] Name of record dimension, if any, required by re-order */ dmn_sct **dmn_in=NULL; /* [sct] List of dimension structures in input order */ dmn_sct **dmn_out; /* [sct] List of dimension structures in output order */ int dmn_idx_in_shr[NC_MAX_DIMS]; /* [idx] Dimension correspondence, input->share Purely diagnostic */ int dmn_idx_in_out[NC_MAX_DIMS]; /* [idx] Dimension correspondence, input->output */ int dmn_idx_in_rdr[NC_MAX_DIMS]; /* [idx] Dimension correspondence, input->re-order NB: Purely diagnostic */ int dmn_idx_shr_rdr[NC_MAX_DIMS]; /* [idx] Dimension correspondence, share->re-order */ int dmn_idx_shr_in[NC_MAX_DIMS]; /* [idx] Dimension correspondence, share->input */ int dmn_idx_shr_out[NC_MAX_DIMS]; /* [idx] Dimension correspondence, share->output */ int dmn_idx_rec_out=NCO_REC_DMN_UNDEFINED; /* [idx] Record dimension index in output variable */ int dmn_shr_nbr=0; /* [nbr] Number of dimensions dmn_in and dmn_rdr share */ int dmn_in_idx; /* [idx] Counting index for dmn_in */ int dmn_in_nbr; /* [nbr] Number of dimensions in input variable */ int dmn_out_idx; /* [idx] Counting index for dmn_out */ int dmn_out_nbr; /* [nbr] Number of dimensions in output variable */ int dmn_rdr_idx; /* [idx] Counting index for dmn_rdr */ int dmn_shr_idx; /* [idx] Counting index for dmn_shr */ int idx_err=-99999; /* [idx] Invalid index for debugging */ /* Initialize variables to reduce indirection */ /* NB: Number of input and output dimensions are equal for pure re-orders However, keep dimension numbers in separate variables to ease relax this rule in future */ dmn_in_nbr=var_in->nbr_dim; dmn_out_nbr=var_out->nbr_dim; /* Initialize dimension maps to missing_value to aid debugging */ for(dmn_out_idx=0;dmn_out_idxis_rec_var) rec_dmn_nm_out=var_in->dim[0]->nm; /* 20130613: if netCDF3 _only_! */ for(dmn_in_idx=0;dmn_in_idxdim[dmn_in_idx]->id == dmn_rdr[dmn_rdr_idx]->id){ dmn_idx_in_rdr[dmn_in_idx]=dmn_rdr_idx; dmn_idx_shr_rdr[dmn_shr_nbr]=dmn_rdr_idx; dmn_idx_shr_in[dmn_shr_nbr]=dmn_in_idx; dmn_idx_in_shr[dmn_in_idx]=dmn_shr_nbr; dmn_shr_nbr++; /* dmn_in and dmn_rdr share this dimension */ break; } /* endif */ } /* end loop over dmn_in */ } /* end loop over dmn_rdr */ /* Map permanent list of reversed dimensions to input variable */ for(dmn_shr_idx=0;dmn_shr_idx nco_dbg_scl){ (void)fprintf(stdout,"%s: DEBUG %s variable %s shares %d of its %d dimensions with the %d dimensions in the re-order list\n",nco_prg_nm_get(),fnc_nm,var_in->nm,dmn_shr_nbr,var_in->nbr_dim,dmn_rdr_nbr); (void)fprintf(stdout,"shr_idx\tshr_rdr\tshr_in\tshr_out\n"); for(dmn_shr_idx=0;dmn_shr_idxdim; dmn_out=(dmn_sct **)nco_malloc(dmn_out_nbr*sizeof(dmn_sct *)); /* Assign dimension structures to new dimension list in correct order Remember: dmn_in has dimension IDs relative to input file Copy dmn_in->xrf to get dimension IDs relative to output file (once they are defined) Oh come on, it only seems like cheating! */ for(dmn_out_idx=0;dmn_out_idxxrf; /* Re-ordered output dimension list dmn_out now comprises correctly ordered but otherwise verbatim copies of dmn_out structures in calling routine */ /* Free var_out's old dimension list */ var_out->dim=(dmn_sct **)nco_free(var_out->dim); /* Replace old with new dimension list */ var_out->dim=dmn_out; /* NB: var_out is now in an inconsistent state var_out->dim refers to re-ordered dimensions However, var_out->dmn_id,cnt,srt,end,srd refer still duplicate var_in members They refer to old dimension ordering in input file nco_cnf_dmn_rdr_mtd() implicitly assumes that only nco_cnf_dmn_rdr_mtd() modifies var_out Call to nco_cnf_dmn_rdr_val() for this variable performs actual re-ordering The interim inconsistent state is required for dimension IDs because output dimension IDs are not known until nco_dmn_dfn() which cannot (or, at least, should not) occur until output record dimension is known. Interim modifications of var_out by any other routine are dangerous! */ /* This is clear at date written (20040727), but memories are short Hence we modify var_out->dmn_id,cnt,srt,end,srd to contain re-ordered values now This makes it safer to var_out->dmn_id,cnt,srt,end,srd before second call to nco_cnf_dmn_rdr() If dmn_out->id does depend on record dimension identity, then this update will do no good Hence, we must re-update dmn_out->id after nco_dmn_dfn() in nco_cnf_dmn_rdr_val() Structures should be completely consistent at that point Not updating these structures (at least dmn_out->id) is equivalent to assuming that dmn_out->id does not depend on record dimension identity, which is an ASSUMPTION that may currently be true, but netCDF API does not guarantee as always true. */ for(dmn_out_idx=0;dmn_out_idxdmn_id[dmn_out_idx]=dmn_out[dmn_out_idx]->id; var_out->cnt[dmn_out_idx]=dmn_out[dmn_out_idx]->cnt; var_out->srt[dmn_out_idx]=dmn_out[dmn_out_idx]->srt; var_out->end[dmn_out_idx]=dmn_out[dmn_out_idx]->end; var_out->srd[dmn_out_idx]=dmn_out[dmn_out_idx]->srd; } /* end loop over dmn_out */ if(var_out->is_rec_var){ /* Which dimension in output dimension list is scheduled to be record dimension? */ for(dmn_out_idx=0;dmn_out_idxis_rec_dmn) break; if(dmn_out_idx != dmn_out_nbr){ dmn_idx_rec_out=dmn_out_idx; /* Request that first dimension be record dimension */ rec_dmn_nm_out=dmn_out[0]->nm; if(nco_dbg_lvl_get() >= nco_dbg_scl && dmn_idx_rec_out != 0) (void)fprintf(stdout,"%s: INFO %s for variable %s reports old input record dimension %s is now ordinal dimension %d, new record dimension must be %s\n",nco_prg_nm_get(),fnc_nm,var_in->nm,dmn_out[dmn_idx_rec_out]->nm,dmn_idx_rec_out,dmn_out[0]->nm); }else{ /* 20121009: This block only reached by variables that will change from record in input file to fixed in output file Leave is_rec_var as True here for those variables Change is_rec_var to false in "if(REDEFINED_RECORD_DIMENSION)" block of ncpdq.c instead Yes, this leaves the metadata in an inconsistent state However, changing all these flags in one place in ncpdq.c main() is clearer */ ; } /* end else */ } /* endif record variable */ if(nco_dbg_lvl_get() > nco_dbg_var){ for(dmn_in_idx=0;dmn_in_idxnm,var_in->dim[dmn_in_idx]->nm,dmn_in_idx,var_in->dmn_id[dmn_in_idx],dmn_idx_in_out[dmn_in_idx]); } /* endif dbg */ return rec_dmn_nm_out; } /* end nco_var_dmn_rdr_mtd() */ int /* O [enm] Return success code */ nco_var_dmn_rdr_val /* [fnc] Change dimension ordering of variable values */ (const var_sct * const var_in, /* I [ptr] Variable with metadata and data in original order */ var_sct * const var_out, /* I/O [ptr] Variable whose data will be re-ordered */ const int * const dmn_idx_out_in, /* I [idx] Dimension correspondence, output->input */ const nco_bool * const dmn_rvr_in) /* I [idx] Reverse dimension */ { /* Purpose: Re-order values in given variable according to supplied dimension map Description of re-ordering concepts is in nco_var_dmn_rdr_mtd() Description of actual re-ordering algorithm is in nco_var_dmn_rdr_val() */ /* 20070509 CEWI RUVICFFU: dmn_in, dmn_id_out */ nco_bool IDENTITY_REORDER=False; /* [flg] User requested identity re-ordering */ char *val_in_cp; /* [ptr] Input data location as char pointer */ char *val_out_cp; /* [ptr] Output data location as char pointer */ const char fnc_nm[]="nco_var_dmn_rdr_val()"; /* [sng] Function name */ /* dmn_sct **dmn_in=NULL; */ /* [sct] List of dimension structures in input order */ dmn_sct **dmn_out; /* [sct] List of dimension structures in output order */ /* int *dmn_id_out; */ /* [id] Contiguous vector of dimension IDs */ int dmn_idx; /* [idx] Index over dimensions */ int dmn_in_idx; /* [idx] Counting index for dmn_in */ int dmn_in_nbr; /* [nbr] Number of dimensions in input variable */ int dmn_in_nbr_m1; /* [nbr] Number of dimensions in input variable, less one */ int dmn_out_idx; /* [idx] Counting index for dmn_out */ int dmn_out_nbr; /* [nbr] Number of dimensions in output variable */ int rcd=0; /* [rcd] Return code */ int typ_sz; /* [B] Size of data element in memory */ long dmn_in_map[NC_MAX_DIMS]; /* [idx] Map for each dimension of input variable */ long dmn_out_map[NC_MAX_DIMS]; /* [idx] Map for each dimension of output variable */ long dmn_in_sbs[NC_MAX_DIMS]; /* [idx] Dimension subscripts into N-D input array */ long var_in_lmn; /* [idx] Offset into 1-D input array */ long var_out_lmn; /* [idx] Offset into 1-D output array */ long *var_in_cnt; /* [nbr] Number of valid elements in this dimension (including effects of stride and wrapping) */ long var_sz; /* [nbr] Number of elements (NOT bytes) in hyperslab (NOT full size of variable in input file!) */ /* Initialize variables to reduce indirection */ /* NB: Number of input and output dimensions are equal for pure re-orders However, keep dimension numbers in separate variables to ease relax this rule in future */ dmn_in_nbr=var_in->nbr_dim; dmn_out_nbr=var_out->nbr_dim; /* On entry to this section of code, we assume: 1. var_out metadata are re-ordered 2. var_out->val buffer has been allocated (calling routine must do this) */ /* Get ready to re-order */ /* dmn_id_out=var_out->dmn_id; */ /* dmn_in=var_in->dim; */ dmn_in_nbr_m1=dmn_in_nbr-1; dmn_out=var_out->dim; typ_sz=nco_typ_lng(var_out->type); val_in_cp=(char *)var_in->val.vp; val_out_cp=(char *)var_out->val.vp; var_in_cnt=var_in->cnt; var_sz=var_in->sz; /* As explained in nco_var_dmn_rdr_mtd(), "Hence, we must re-update dmn_out->id after nco_dmn_dfn() in nco_cnf_dmn_rdr_val() Structures should be completely consistent at that point Not updating these structures (at least dmn_out->id) is equivalent to assuming that dmn_out->id does not depend on record dimension identity, which is an ASSUMPTION that may currently be true, but is not guaranteed by the netCDF API to always be true." */ for(dmn_out_idx=0;dmn_out_idxdmn_id[dmn_out_idx]=dmn_out[dmn_out_idx]->id; var_out->cnt[dmn_out_idx]=dmn_out[dmn_out_idx]->cnt; var_out->srt[dmn_out_idx]=dmn_out[dmn_out_idx]->srt; var_out->end[dmn_out_idx]=dmn_out[dmn_out_idx]->end; var_out->srd[dmn_out_idx]=dmn_out[dmn_out_idx]->srd; } /* end loop over dmn_out */ /* Report full metadata re-order, if requested */ if(nco_dbg_lvl_get() > 3){ int dmn_idx_in_out[NC_MAX_DIMS]; /* [idx] Dimension correspondence, input->output */ /* Create reverse correspondence */ for(dmn_out_idx=0;dmn_out_idxnm,var_in->dim[dmn_in_idx]->nm,dmn_in_idx,var_in->dmn_id[dmn_in_idx],dmn_idx_in_out[dmn_in_idx],var_out->dmn_id[dmn_idx_in_out[dmn_in_idx]]); } /* endif dbg */ /* Is identity re-ordering requested? */ for(dmn_out_idx=0;dmn_out_idx= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s reports re-order is identity transformation for variable %s\n",nco_prg_nm_get(),fnc_nm,var_in->nm); /* Copy in one fell swoop then return */ (void)memcpy((void *)(var_out->val.vp),(void *)(var_in->val.vp),var_out->sz*nco_typ_lng(var_out->type)); return rcd; } /* !IDENTITY_REORDER */ if(var_in->has_dpl_dmn) (void)fprintf(stdout,"%s: WARNING %s reports non-identity re-order for variable with duplicate dimensions %s.\n%s does not support non-identity re-orders of variables with duplicate dimensions\n",nco_prg_nm_get(),fnc_nm,var_in->nm,nco_prg_nm_get()); /* Compute map for each dimension of input variable */ for(dmn_in_idx=0;dmn_in_idxcnt[dmn_idx]; /* Compute map for each dimension of output variable */ for(dmn_out_idx=0;dmn_out_idxcnt[dmn_idx]; /* There is more than one method to re-order dimensions Output dimensionality is known in advance, unlike nco_var_avg() Hence outer loop may be over dimensions or over elements Method 1: Loop over input elements 1a. Loop over 1-D input array offsets 1b. Invert 1-D input array offset to get N-D input subscripts 1c. Turn N-D input subscripts into N-D output subscripts 1d. Map N-D output subscripts to get 1-D output element 1e. Copy input element to output element This method is simplified from method used in nco_var_avg() Method 2: Loop over input dimensions 1a. Loop over input dimensions, from slowest to fastest varying 1b. */ /* Begin Method 1: Loop over input elements */ /* var_in_lmn is offset into 1-D array */ for(var_in_lmn=0;var_in_lmn /* stderr, FILE, NULL, printf */ #include /* strtod, strtol, malloc, getopt, qsort */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_ctl.h" /* Program flow control functions */ #include "nco_lst_utl.h" /* List utilities */ #include "nco_mmr.h" /* Memory management */ #include "nco_rth_utl.h" /* Arithmetic controls and utilities */ #include "nco_var_utl.h" /* Variable utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ var_sct * /* O [sct] Pointer to conforming variable structure */ nco_var_cnf_dmn /* [fnc] Stretch second variable to match dimensions of first variable */ (const var_sct * const var, /* I [ptr] Pointer to variable structure to serve as template */ var_sct * const wgt, /* I [ptr] Pointer to variable structure to make conform to var */ var_sct *wgt_crr, /* I/O [ptr] pointer to existing conforming variable structure, if any (destroyed when does not conform to var) */ const nco_bool MUST_CONFORM, /* I [flg] Must wgt and var conform? */ nco_bool *DO_CONFORM); /* O [flg] Do wgt and var conform? */ nco_bool /* [flg] var_1 and var_2 conform after processing */ ncap_var_cnf_dmn /* [fnc] Broadcast smaller variable into larger */ (var_sct **var_1, /* I/O [ptr] First variable */ var_sct **var_2); /* I/O [ptr] Second variable */ dmn_sct ** /* O [sct] Dimension structures to be re-ordered */ nco_dmn_avg_rdr_prp /* [fnc] Process dimension string list into dimension structure list */ (dmn_sct ** const dmn_in, /* I [sct] Dimension list for input file */ char **dmn_rdr_lst, /* I [sng] Names of dimensions to be re-ordered */ const int dmn_rdr_nbr); /* I [nbr] Number of dimension structures in re-order list */ char * /* [sng] Name of record dimension, if any, required by re-order */ nco_var_dmn_rdr_mtd /* [fnc] Change dimension ordering of variable metadata */ (const var_sct * const var_in, /* I [ptr] Variable with metadata and data in original order */ var_sct * const var_out, /* I/O [ptr] Variable whose metadata will be re-ordered */ CST_X_PTR_CST_PTR_CST_Y(dmn_sct,dmn_rdr), /* I [sct] List of dimension structures in new order */ const int dmn_rdr_nbr, /* I [nbr] Number of dimension structures in structure list */ int * const dmn_idx_out_in, /* O [idx] Dimension correspondence, output->input */ const nco_bool * const dmn_rvr_rdr, /* I [idx] Reverse dimension */ nco_bool * const dmn_rvr_in); /* O [idx] Reverse dimension */ int /* O [enm] Return success code */ nco_var_dmn_rdr_val /* [fnc] Change dimension ordering of variable values */ (const var_sct * const var_in, /* I [ptr] Variable with metadata and data in original order */ var_sct * const var_out, /* I/O [ptr] Variable whose data will be re-ordered */ const int * const dmn_idx_out_in, /* I [idx] Dimension correspondence, output->input */ const nco_bool * const dmn_rvr_in); /* I [idx] Reverse dimension */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CNF_DMN_H */ nco-4.5.4/src/nco/nco_cnf_typ.c000066400000000000000000002217441264355130400163330ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Conform variable types */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_cnf_typ.h" /* Conform variable types */ void cast_void_nctype /* [fnc] Cast generic pointer to netCDF type */ (const nc_type type, /* I [enm] netCDF type to cast void pointer to*/ ptr_unn * const ptr) /* I/O [ptr] Pointer to pointer union whose vp element will be cast to type type*/ { /* Purpose: Cast generic pointer in ptr_unn structure from type void to output netCDF type */ switch(type){ case NC_FLOAT: ptr->fp=(float *)ptr->vp; break; case NC_DOUBLE: ptr->dp=(double *)ptr->vp; break; case NC_INT: ptr->ip=(nco_int *)ptr->vp; break; case NC_SHORT: ptr->sp=(short *)ptr->vp; break; case NC_CHAR: ptr->cp=(nco_char *)ptr->vp; break; case NC_BYTE: ptr->bp=(nco_byte *)ptr->vp; break; case NC_UBYTE: ptr->ubp=(nco_ubyte *)ptr->vp; break; case NC_USHORT: ptr->usp=(nco_ushort *)ptr->vp; break; case NC_UINT: ptr->uip=(nco_uint *)ptr->vp; break; case NC_INT64: ptr->i64p=(nco_int64 *)ptr->vp; break; case NC_UINT64: ptr->ui64p=(nco_uint64 *)ptr->vp; break; case NC_STRING: ptr->sngp=(nco_string *)ptr->vp; break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ } /* end cast_void_nctype() */ void cast_nctype_void /* [fnc] Cast generic pointer in ptr_unn structure from type type to type void */ (const nc_type type, /* I [enm] netCDF type of pointer */ ptr_unn * const ptr) /* I/O pointer to pointer union which to cast from type type to type void */ { /* Cast generic pointer in ptr_unn structure from type type to type void */ switch(type){ case NC_FLOAT: ptr->vp=(void *)ptr->fp; break; case NC_DOUBLE: ptr->vp=(void *)ptr->dp; break; case NC_INT: ptr->vp=(void *)ptr->ip; break; case NC_SHORT: ptr->vp=(void *)ptr->sp; break; case NC_CHAR: ptr->vp=(void *)ptr->cp; break; case NC_BYTE: ptr->vp=(void *)ptr->bp; break; case NC_UBYTE: ptr->vp=(void *)ptr->ubp; break; case NC_USHORT: ptr->vp=(void *)ptr->usp; break; case NC_UINT: ptr->vp=(void *)ptr->uip; break; case NC_INT64: ptr->vp=(void *)ptr->i64p; break; case NC_UINT64: ptr->vp=(void *)ptr->ui64p; break; case NC_STRING: ptr->vp=(void *)ptr->sngp; break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ } /* end cast_nctype_void() */ var_sct * /* O [var] Variable after (possible) conversion */ nco_typ_cnv_rth /* [fnc] Convert char, short, long, int, and float types to doubles before arithmetic */ (var_sct *var, /* I/O [var] Variable to be considered for conversion */ const int nco_op_typ) /* I [enm] Operation type */ { /* Threads: Routine is thread safe and calls no unsafe routines */ /* Purpose: Convert char, short, long, int types to doubles for arithmetic Conversions are performed unless arithmetic operation type is min or max Floats (and doubles, of course) are not converted for performance reasons Remember to convert back after weighting and arithmetic are complete! */ /* Variables which are unpacked into NC_FLOAT should remain NC_FLOAT here Unpacking happens 'transparently' when original data are read by nco_var_get() Output structures (i.e., var_prc_out) often correspond to original input type Thus var structure may have typ_upk=NC_FLOAT and type=NC_SHORT In that case, promote based on typ_upk rather than on type Otherwise most var's that had been unpacked would be converted to NC_DOUBLE here That would put them in conflict with corresponding var_out, which is usually based on typ_upk Check this first, then proceed with normal non-float->double conversion */ /* 20130906: Users have long been uncomfortable with not implicitly converting floats to doubles A new section of the manual that describes the advantages and disadvantages: http://nco.sf.net/nco.html#dbl Implementing --dbl switch on ncwa, ncra, nces (ncap2?) to force implicit conversion */ if(nco_rth_cnv_get() == nco_rth_flt_flt){ /* NCO default until 201309: promote, where necessary, anything but floats and doubles Now non-default and activated only by --flt switch */ if(var->typ_upk == NC_FLOAT){ var=nco_var_cnf_typ((nc_type)NC_FLOAT,var); }else{ /* Conversion only for appropriate operation types */ if(var->type != NC_FLOAT && var->type != NC_DOUBLE && nco_op_typ != nco_op_min && nco_op_typ != nco_op_max && nco_op_typ != nco_op_mabs && nco_op_typ != nco_op_mebs && nco_op_typ != nco_op_mibs) var=nco_var_cnf_typ((nc_type)NC_DOUBLE,var); } /* end if */ }else{ /* !nco_rth_flt_flt */ /* NCO default after 201309: promote, where necessary, anything but doubles Now default and activated redundantly --dbl switch */ /* Conversion only for appropriate operation types */ if(var->type != NC_DOUBLE && nco_op_typ != nco_op_min && nco_op_typ != nco_op_max && nco_op_typ != nco_op_mabs && nco_op_typ != nco_op_mebs && nco_op_typ != nco_op_mibs) var=nco_var_cnf_typ((nc_type)NC_DOUBLE,var); } /* !nco_rth_flt_flt */ return var; } /* nco_typ_cnv_rth() */ var_sct * /* O [sct] Variable reverted to on-disk type */ nco_cnv_var_typ_dsk /* [fnc] Revert variable to on-disk type */ (var_sct *var) /* I [sct] Variable to be reverted */ { /* Purpose: Revert variable to on-disk type */ if(var->type != var->typ_dsk) var=nco_var_cnf_typ(var->typ_dsk,var); return var; } /* nco_cnv_var_typ_dsk() */ var_sct * /* O [sct] Variable with mss_val converted to typ_upk */ nco_cnv_mss_val_typ /* [fnc] Convert missing_value, if any, to mss_val_out_typ */ (var_sct *var, /* I [sct] Variable with missing_value to convert */ const nc_type mss_val_out_typ) /* I [enm] Type of mss_val on output */ { /* Purpose: Convert variable missing_value field, if any, to mss_val_out_typ Routine is currently called only by ncra and by nco_var_get(), for following reason: Most applications should call nco_var_cnf_typ() without calling nco_cnv_mss_val_typ() since nco_var_cnf_typ() converts misssing_value type along with variable type. The important exception to this is ncra ncra refreshes variable metadata (including missing_value, if any) once per file (naturally), but refreshes variable values once per record. Current type of missing_value is not stored separately in variable structure (this is probably a mistake), so type of missing value may remain as promoted type for arithmetic. When next record is read and nco_typ_cnf_rth() promotion of new input to arithmetic type (double, if necessary) will fail when it tries to convert the missing_value, if any, which _was already promoted_. Performing type conversion on memory already converted is a no-no! And it results in unpredictable and incorrect answers Thus it is very important to synchronize type of variable and missing_value In the case described above, ncra simply calls this routine to convert missing_value to typ_upk at the end of each record. Routine is dangerous because it _allows_ mss_val and variable to be different types Make sure you have a (very) good reason to do this! Better permanent solution is to add missing_value type to variable structure */ nc_type var_in_typ; /* [enm] Type of variable and mss_val on input */ ptr_unn mss_val_in; ptr_unn mss_val_out; var_in_typ=var->type; /* [enm] Type of variable and mss_val on input */ /* Skip if no missing_value or if missing_value is already typ_upk */ if(!var->has_mss_val || var_in_typ == mss_val_out_typ) return var; /* Simple error-checking and diagnostics */ if(nco_dbg_lvl_get() >= nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: %s NCO_MSS_VAL_SNG attribute of variable %s from type %s to type %s\n",nco_prg_nm_get(),mss_val_out_typ > var_in_typ ? "Promoting" : "Demoting",var->nm,nco_typ_sng(var_in_typ),nco_typ_sng(mss_val_out_typ)); } /* end if */ /* Sequence of following commands is important (copy before overwriting!) */ mss_val_in=var->mss_val; mss_val_out.vp=(void *)nco_malloc(nco_typ_lng(mss_val_out_typ)); (void)nco_val_cnf_typ(var_in_typ,mss_val_in,mss_val_out_typ,mss_val_out); var->mss_val=mss_val_out; /* Free original Of course this only changes var_in->mss_val Calling routine must update var_out->mss_val if var_out->val points to var_in->val This dangling pointer was a problem in ncpdq */ mss_val_in.vp=nco_free(mss_val_in.vp); return var; /* O [sct] Variable with mss_val converted to typ_upk */ } /* nco_cnv_mss_val_typ() */ var_sct * /* O [sct] Pointer to variable structure of type var_out_typ */ nco_var_cnf_typ /* [fnc] Return copy of input variable typecast to desired type */ (const nc_type var_out_typ, /* I [enm] Type to convert variable structure to */ var_sct * const var_in) /* I/O [enm] Pointer to variable structure (may be destroyed) */ { /* Threads: Routine is thread safe and makes no unsafe routines */ /* Purpose: Return copy of input variable typecast to desired type Routine converts missing_value, if any, to output type Routine saves time by returning original variable structure with val and type members changed as necessary Routine assumes variable and missing_value, if any, are same type in memory This is currently always true except briefly in ncra (and possibly ncpdq) This condition is unsafe and is described more fully in nco_cnv_mss_val_typ() */ long idx; long sz; long sz_msk=long_CEWI; /* Holds value when called with var_in->val.vp==NULL */ nc_type var_in_typ; ptr_unn val_in; ptr_unn val_out; var_sct *var_out; /* Do types of variable AND its missing value already match? This routine assumes missing_value, if any, to be same type as variable */ if(var_in->type == var_out_typ) return var_in; if(var_in->val.vp == NULL){ /* Variable has no data when var_in.val.vp==NULL In this case function should only convert missing values Accomplish this by temporarily masking off val_in by setting var_in->sz=0 Restore correct size at function end fxm: 20050521 Which operators take advantage of this behavior? */ sz_msk=var_in->sz; var_in->sz=0L; } /* endif NULL */ /* Setting output pointer equal to input pointer is confusing Theoretical advantage is that it speeds up routine Nevertheless, be careful... */ var_out=var_in; var_in_typ=var_in->type; /* Simple error-checking and diagnostics */ if(nco_dbg_lvl_get() >= nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: %s variable %s from type %s to type %s\n",nco_prg_nm_get(),var_out_typ > var_in_typ ? "Promoting" : "Demoting",var_in->nm,nco_typ_sng(var_in_typ),nco_typ_sng(var_out_typ)); } /* end if */ /* Move current variable values to swap location */ val_in=var_in->val; /* Allocate space for type-conforming values */ var_out->type=var_out_typ; var_out->val.vp=(void *)nco_malloc(var_out->sz*nco_typ_lng(var_out->type)); /* Define convenience variables to avoid repetitive indirect addressing */ sz=var_out->sz; val_out=var_out->val; /* Copy and typecast missing_value attribute, if any */ /* Calling routine must avoid re-promoting missing values already promoted during arithmetic */ if(var_out->has_mss_val){ ptr_unn var_in_mss_val; /* Sequence of following commands is important (copy before overwriting!) */ var_in_mss_val=var_out->mss_val; var_out->mss_val.vp=(void *)nco_malloc(nco_typ_lng(var_out->type)); (void)nco_val_cnf_typ(var_in_typ,var_in_mss_val,var_out_typ,var_out->mss_val); /* Free original */ var_in_mss_val.vp=nco_free(var_in_mss_val.vp); } /* end if */ /* Typecast pointer to values before access There is only one var structure so use shortcut, de-referenced types */ (void)cast_void_nctype(var_in_typ,&val_in); (void)cast_void_nctype(var_out_typ,&val_out); /* Copy and typecast entire array of values, using C implicit coercion */ switch(var_out_typ){ case NC_FLOAT: switch(var_in_typ){ case NC_FLOAT: for(idx=0L;idx NB: Rounding with lrint(), lrintf(), llrint(), and llrintf() imposes dependency on */ case NC_FLOAT: for(idx=0L;idxsz=sz_msk; /* Free input variable data */ val_in.vp=nco_free(val_in.vp); return var_out; } /* end nco_var_cnf_typ() */ var_sct * /* O [sct] Pointer to variable structure of type var_out_typ */ nco_var_cnf_typ_tst /* [fnc] Return copy of input variable typecast to desired type */ (const nc_type var_out_typ, /* I [enm] Type to convert variable structure to */ var_sct * const var_in) /* I/O [enm] Pointer to variable structure (may be destroyed) */ { /* 20120302: Same as nco_var_cnf_typ() but keeps missing values in range on down-promotions Similar changes were made to nco_val_cnf_typ_tst() which is based on nco_val_cnf_typ() Intended to address TODO nco1035 */ /* Threads: Routine is thread safe and makes no unsafe routines */ /* Purpose: Return copy of input variable typecast to desired type Routine converts missing_value, if any, to output type Routine saves time by returning original variable structure with val and type members changed as necessary Routine assumes variable and missing_value, if any, are same type in memory This is currently always true except briefly in ncra (and possibly ncpdq) This condition is unsafe and is described more fully in nco_cnv_mss_val_typ() */ long idx; long sz; long sz_msk=long_CEWI; /* Holds value when called with var_in->val.vp==NULL */ nc_type var_in_typ; ptr_unn val_in; ptr_unn val_out; var_sct *var_out; /* Do types of variable AND its missing value already match? This routine assumes missing_value, if any, to be same type as variable */ if(var_in->type == var_out_typ) return var_in; if(var_in->val.vp == NULL){ /* Variable has no data when var_in.val.vp==NULL In this case function should only convert missing values Accomplish this by temporarily masking off val_in by setting var_in->sz=0 Restore correct size at function end fxm: 20050521 Which operators take advantage of this behavior? */ sz_msk=var_in->sz; var_in->sz=0L; } /* endif NULL */ /* Setting output pointer equal to input pointer is confusing Theoretical advantage is that it speeds up routine Nevertheless, be careful... */ var_out=var_in; var_in_typ=var_in->type; /* Simple error-checking and diagnostics */ if(nco_dbg_lvl_get() >= nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: %s variable %s from type %s to type %s\n",nco_prg_nm_get(),var_out_typ > var_in_typ ? "Promoting" : "Demoting",var_in->nm,nco_typ_sng(var_in_typ),nco_typ_sng(var_out_typ)); } /* end if */ /* Move current variable values to swap location */ val_in=var_in->val; /* Allocate space for type-conforming values */ var_out->type=var_out_typ; var_out->val.vp=(void *)nco_malloc(var_out->sz*nco_typ_lng(var_out->type)); /* Define convenience variables to avoid repetitive indirect addressing */ sz=var_out->sz; val_out=var_out->val; /* Copy and typecast missing_value attribute, if any */ /* Calling routine must avoid re-promoting missing values already promoted during arithmetic */ if(var_out->has_mss_val){ ptr_unn var_in_mss_val; /* Sequence of following commands is important (copy before overwriting!) */ var_in_mss_val=var_out->mss_val; var_out->mss_val.vp=(void *)nco_malloc(nco_typ_lng(var_out->type)); (void)nco_val_cnf_typ(var_in_typ,var_in_mss_val,var_out_typ,var_out->mss_val); /* Free original */ var_in_mss_val.vp=nco_free(var_in_mss_val.vp); } /* end if */ /* Typecast pointer to values before access There is only one var structure so use shortcut, de-referenced types */ (void)cast_void_nctype(var_in_typ,&val_in); (void)cast_void_nctype(var_out_typ,&val_out); /* Copy and typecast entire array of values, using C implicit coercion */ switch(var_out_typ){ case NC_FLOAT: switch(var_in_typ){ case NC_FLOAT: for(idx=0L;idx NB: Rounding with lrint(), lrintf(), llrint(), and llrintf() imposes dependency on */ case NC_FLOAT: for(idx=0L;idxsz=sz_msk; /* Free input variable data */ val_in.vp=nco_free(val_in.vp); return var_out; } /* end nco_var_cnf_typ_tst() */ void nco_val_cnf_typ /* [fnc] Copy val_in and typecast from typ_in to typ_out */ (const nc_type typ_in, /* I [enm] Type of input value */ ptr_unn val_in, /* I [ptr] Pointer to input value */ const nc_type typ_out, /* I [enm] Type of output value */ ptr_unn val_out) /* I [ptr] Pointer to output value */ { /* Threads: Routine is thread safe and makes no unsafe routines */ /* Purpose: Fill val_out with copy of val_in that has been typecast from typ_in to typ_out Last-referenced state of both value pointers is assumed to be .vp, and val_out union is returned in that state */ /* val_in and val_out should not be same pointer union since val_out must hold enough space (one element of type typ_out) to hold output and output type may be larger than input type */ /* Typecast pointer to values before access */ (void)cast_void_nctype(typ_in,&val_in); (void)cast_void_nctype(typ_out,&val_out); /* Copy and typecast single value using implicit coercion rules of C */ switch(typ_out){ case NC_FLOAT: switch(typ_in){ case NC_FLOAT: *val_out.fp=*val_in.fp; break; case NC_DOUBLE: *val_out.fp=*val_in.dp; break; case NC_INT: *val_out.fp=*val_in.ip; break; case NC_SHORT: *val_out.fp=*val_in.sp; break; case NC_CHAR: *val_out.fp=strtod((const char *)val_in.cp,(char **)NULL); break; case NC_BYTE: *val_out.fp=*val_in.bp; break; case NC_UBYTE: *val_out.fp=*val_in.ubp; break; case NC_USHORT: *val_out.fp=*val_in.usp; break; case NC_UINT: *val_out.fp=*val_in.uip; break; case NC_INT64: *val_out.fp=*val_in.i64p; break; case NC_UINT64: *val_out.fp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_DOUBLE: switch(typ_in){ case NC_FLOAT: *val_out.dp=*val_in.fp; break; case NC_DOUBLE: *val_out.dp=*val_in.dp; break; case NC_INT: *val_out.dp=*val_in.ip; break; case NC_SHORT: *val_out.dp=*val_in.sp; break; case NC_CHAR: *val_out.dp=strtod((const char *)val_in.cp,(char **)NULL); break; case NC_BYTE: *val_out.dp=*val_in.bp; break; case NC_UBYTE: *val_out.dp=*val_in.ubp; break; case NC_USHORT: *val_out.dp=*val_in.usp; break; case NC_UINT: *val_out.dp=*val_in.uip; break; case NC_INT64: *val_out.dp=*val_in.i64p; break; case NC_UINT64: *val_out.dp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_INT: switch(typ_in){ case NC_FLOAT: *val_out.ip=(nco_int)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.ip=(nco_int)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.ip=*val_in.ip; break; case NC_SHORT: *val_out.ip=*val_in.sp; break; case NC_CHAR: *val_out.ip=(nco_int)strtod((const char *)val_in.cp,(char **)NULL); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_BYTE: *val_out.ip=*val_in.bp; break; case NC_UBYTE: *val_out.ip=*val_in.ubp; break; case NC_USHORT: *val_out.ip=*val_in.usp; break; case NC_UINT: *val_out.ip=*val_in.uip; break; case NC_INT64: *val_out.ip=*val_in.i64p; break; case NC_UINT64: *val_out.ip=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_SHORT: switch(typ_in){ case NC_FLOAT: *val_out.sp=(short int)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.sp=(short int)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.sp=*val_in.ip; break; case NC_SHORT: *val_out.sp=*val_in.sp; break; case NC_CHAR: *val_out.sp=(short int)strtod((const char *)val_in.cp,(char **)NULL); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_BYTE: *val_out.sp=*val_in.bp; break; case NC_UBYTE: *val_out.sp=*val_in.ubp; break; case NC_USHORT: *val_out.sp=*val_in.usp; break; case NC_UINT: *val_out.sp=*val_in.uip; break; case NC_INT64: *val_out.sp=*val_in.i64p; break; case NC_UINT64: *val_out.sp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_CHAR: switch(typ_in){ case NC_FLOAT: *val_out.cp=(nco_char)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.cp=(nco_char)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.cp=*val_in.ip; break; case NC_SHORT: *val_out.cp=*val_in.sp; break; case NC_CHAR: *val_out.cp=*val_in.cp; break; case NC_BYTE: *val_out.cp=*val_in.bp; break; case NC_UBYTE: *val_out.cp=*val_in.ubp; break; case NC_USHORT: *val_out.cp=*val_in.usp; break; case NC_UINT: *val_out.cp=*val_in.uip; break; case NC_INT64: *val_out.cp=*val_in.i64p; break; case NC_UINT64: *val_out.cp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_BYTE: switch(typ_in){ case NC_FLOAT: *val_out.bp=(nco_byte)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.bp=(nco_byte)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.bp=*val_in.ip; break; case NC_SHORT: *val_out.bp=*val_in.sp; break; case NC_CHAR: *val_out.bp=*val_in.cp; break; case NC_BYTE: *val_out.bp=*val_in.bp; break; case NC_UBYTE: *val_out.bp=*val_in.ubp; break; case NC_USHORT: *val_out.bp=*val_in.usp; break; case NC_UINT: *val_out.bp=*val_in.uip; break; case NC_INT64: *val_out.bp=*val_in.i64p; break; case NC_UINT64: *val_out.bp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_UBYTE: switch(typ_in){ case NC_FLOAT: *val_out.ubp=(nco_ubyte)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.ubp=(nco_ubyte)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.ubp=*val_in.ip; break; case NC_SHORT: *val_out.ubp=*val_in.sp; break; case NC_CHAR: *val_out.ubp=*val_in.cp; break; case NC_BYTE: *val_out.ubp=*val_in.bp; break; case NC_UBYTE: *val_out.ubp=*val_in.ubp; break; case NC_USHORT: *val_out.ubp=*val_in.usp; break; case NC_UINT: *val_out.ubp=*val_in.uip; break; case NC_INT64: *val_out.ubp=*val_in.i64p; break; case NC_UINT64: *val_out.ubp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_USHORT: switch(typ_in){ case NC_FLOAT: *val_out.usp=(nco_ushort)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.usp=(nco_ushort)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.usp=*val_in.ip; break; case NC_SHORT: *val_out.usp=*val_in.sp; break; case NC_CHAR: *val_out.usp=*val_in.cp; break; case NC_BYTE: *val_out.usp=*val_in.bp; break; case NC_UBYTE: *val_out.usp=*val_in.ubp; break; case NC_USHORT: *val_out.usp=*val_in.usp; break; case NC_UINT: *val_out.usp=*val_in.uip; break; case NC_INT64: *val_out.usp=*val_in.i64p; break; case NC_UINT64: *val_out.usp=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_UINT: switch(typ_in){ case NC_FLOAT: *val_out.uip=(nco_uint)lrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.uip=(nco_uint)lrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.uip=*val_in.ip; break; case NC_SHORT: *val_out.uip=*val_in.sp; break; case NC_CHAR: *val_out.uip=*val_in.cp; break; case NC_BYTE: *val_out.uip=*val_in.bp; break; case NC_UBYTE: *val_out.uip=*val_in.ubp; break; case NC_USHORT: *val_out.uip=*val_in.usp; break; case NC_UINT: *val_out.uip=*val_in.uip; break; case NC_INT64: *val_out.uip=*val_in.i64p; break; case NC_UINT64: *val_out.uip=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_INT64: switch(typ_in){ case NC_FLOAT: *val_out.i64p=(nco_int64)llrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.i64p=(nco_int64)llrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.i64p=*val_in.ip; break; case NC_SHORT: *val_out.i64p=*val_in.sp; break; case NC_CHAR: *val_out.i64p=*val_in.cp; break; case NC_BYTE: *val_out.i64p=*val_in.bp; break; case NC_UBYTE: *val_out.i64p=*val_in.ubp; break; case NC_USHORT: *val_out.i64p=*val_in.usp; break; case NC_UINT: *val_out.i64p=*val_in.uip; break; case NC_INT64: *val_out.i64p=*val_in.i64p; break; case NC_UINT64: *val_out.i64p=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_UINT64: switch(typ_in){ case NC_FLOAT: *val_out.ui64p=(nco_uint64)llrintf(*val_in.fp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: *val_out.ui64p=(nco_uint64)llrint(*val_in.dp); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: *val_out.ui64p=*val_in.ip; break; case NC_SHORT: *val_out.ui64p=*val_in.sp; break; case NC_CHAR: *val_out.ui64p=*val_in.cp; break; case NC_BYTE: *val_out.ui64p=*val_in.bp; break; case NC_UBYTE: *val_out.ui64p=*val_in.ubp; break; case NC_USHORT: *val_out.ui64p=*val_in.usp; break; case NC_UINT: *val_out.ui64p=*val_in.uip; break; case NC_INT64: *val_out.ui64p=*val_in.i64p; break; case NC_UINT64: *val_out.ui64p=*val_in.ui64p; break; case NC_STRING: break; default: nco_dfl_case_nc_type_err(); break; } break; case NC_STRING: switch(typ_in){ case NC_FLOAT: break; case NC_DOUBLE: break; case NC_INT: break; case NC_SHORT: break; case NC_CHAR: break; case NC_BYTE: break; case NC_UBYTE: break; case NC_USHORT: break; case NC_UINT: break; case NC_INT64: break; case NC_UINT64: break; case NC_STRING: *val_out.sngp=*val_in.sngp; break; default: nco_dfl_case_nc_type_err(); break; } break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ /* NB: There is no need to un-typecast input pointers because they were passed by value and are thus purely local to this routine. The only thing changed by this routine is the contents of the location pointed to by the pointer to the output value. */ } /* end nco_val_cnf_typ */ int /* O [enm] Dummy return */ nco_scv_cnf_typ /* [fnc] Convert scalar attribute to typ_new using C implicit coercion */ (const nc_type typ_new, /* I [enm] Type to convert scv_old to */ scv_sct * const scv_old) /* I/O [sct] Scalar value to convert */ { /* Purpose: Convert scalar attribute to typ_new using C implicit coercion */ nc_type typ_old=scv_old->type; scv_sct scv_new; switch (typ_new){ case NC_FLOAT: switch(typ_old){ case NC_FLOAT: scv_new.val.f=(scv_old->val).f; break; case NC_DOUBLE: scv_new.val.f=(scv_old->val).d; break; case NC_INT: scv_new.val.f=(scv_old->val).i; break; case NC_SHORT: scv_new.val.f=(scv_old->val).s; break; case NC_BYTE: scv_new.val.f=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.f=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.f=(scv_old->val).us; break; case NC_UINT: scv_new.val.f=(scv_old->val).ui; break; case NC_INT64: scv_new.val.f=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.f=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_DOUBLE: switch(typ_old){ case NC_FLOAT: scv_new.val.d=(scv_old->val).f; break; case NC_DOUBLE: scv_new.val.d =(scv_old->val).d; break; case NC_INT: scv_new.val.d=(scv_old->val).i; break; case NC_SHORT: scv_new.val.d=(scv_old->val).s; break; case NC_BYTE: scv_new.val.d=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.d=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.d=(scv_old->val).us; break; case NC_UINT: scv_new.val.d=(scv_old->val).ui; break; case NC_INT64: scv_new.val.d=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.d=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_INT: switch(typ_old){ case NC_FLOAT: scv_new.val.i=(nco_int)lrintf((scv_old->val).f); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: scv_new.val.i=(nco_int)lrint((scv_old->val).d); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: scv_new.val.i =scv_old->val.i; break; case NC_SHORT: scv_new.val.i=(scv_old->val).s; break; case NC_BYTE: scv_new.val.i=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.i=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.i=(scv_old->val).us; break; case NC_UINT: scv_new.val.i=(scv_old->val).ui; break; case NC_INT64: scv_new.val.i=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.i=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_SHORT: switch(typ_old){ case NC_FLOAT: scv_new.val.s=(short int)lrintf((scv_old->val).f); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_DOUBLE: scv_new.val.s=(short int)lrint((scv_old->val).d); break; /* Coerce to avoid C++ compiler assignment warning */ case NC_INT: scv_new.val.s=(scv_old->val).i; break; case NC_SHORT: scv_new.val.s=(scv_old->val).s; break; case NC_BYTE: scv_new.val.s=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.s=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.s=(scv_old->val).us; break; case NC_UINT: scv_new.val.s=(scv_old->val).ui; break; case NC_INT64: scv_new.val.s=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.s=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_CHAR: /* Do nothing */ break; case NC_BYTE: switch(typ_old){ case NC_FLOAT: scv_new.val.b=(nco_byte)lrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.b=(nco_byte)lrint((scv_old->val).d); break; case NC_INT: scv_new.val.b=(scv_old->val).i; break; case NC_SHORT: scv_new.val.b=(scv_old->val).s; break; case NC_BYTE: scv_new.val.b=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.b=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.b=(scv_old->val).us; break; case NC_UINT: scv_new.val.b=(scv_old->val).ui; break; case NC_INT64: scv_new.val.b=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.b=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_UBYTE: switch(typ_old){ case NC_FLOAT: scv_new.val.ub=(nco_ubyte)lrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.ub=(nco_ubyte)lrint((scv_old->val).d); break; case NC_INT: scv_new.val.ub=(scv_old->val).i; break; case NC_SHORT: scv_new.val.ub=(scv_old->val).s; break; case NC_BYTE: scv_new.val.ub=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.ub=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.ub=(scv_old->val).us; break; case NC_UINT: scv_new.val.ub=(scv_old->val).ui; break; case NC_INT64: scv_new.val.ub=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.ub=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_USHORT: switch(typ_old){ case NC_FLOAT: scv_new.val.us=(nco_ushort)lrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.us=(nco_ushort)lrint((scv_old->val).d); break; case NC_INT: scv_new.val.us=(scv_old->val).i; break; case NC_SHORT: scv_new.val.us=(scv_old->val).s; break; case NC_BYTE: scv_new.val.us=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.us=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.us=(scv_old->val).us; break; case NC_UINT: scv_new.val.us=(scv_old->val).ui; break; case NC_INT64: scv_new.val.us=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.us=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_UINT: switch(typ_old){ case NC_FLOAT: scv_new.val.ui=(nco_uint)lrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.ui=(nco_uint)lrint((scv_old->val).d); break; case NC_INT: scv_new.val.ui=(scv_old->val).i; break; case NC_SHORT: scv_new.val.ui=(scv_old->val).s; break; case NC_BYTE: scv_new.val.ui=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.ui=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.ui=(scv_old->val).us; break; case NC_UINT: scv_new.val.ui=(scv_old->val).ui; break; case NC_INT64: scv_new.val.ui=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.ui=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_INT64: switch(typ_old){ case NC_FLOAT: scv_new.val.i64=(nco_int64)llrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.i64=(nco_int64)llrint((scv_old->val).d); break; case NC_INT: scv_new.val.i64=(scv_old->val).i; break; case NC_SHORT: scv_new.val.i64=(scv_old->val).s; break; case NC_BYTE: scv_new.val.i64=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.i64=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.i64=(scv_old->val).us; break; case NC_UINT: scv_new.val.i64=(scv_old->val).ui; break; case NC_INT64: scv_new.val.i64=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.i64=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_UINT64: switch(typ_old){ case NC_FLOAT: scv_new.val.ui64=(nco_uint64)llrintf((scv_old->val).f); break; case NC_DOUBLE: scv_new.val.ui64=(nco_uint64)llrint((scv_old->val).d); break; case NC_INT: scv_new.val.ui64=(scv_old->val).i; break; case NC_SHORT: scv_new.val.ui64=(scv_old->val).s; break; case NC_BYTE: scv_new.val.ui64=(scv_old->val).b; break; case NC_UBYTE: scv_new.val.ui64=(scv_old->val).ub; break; case NC_USHORT: scv_new.val.ui64=(scv_old->val).us; break; case NC_UINT: scv_new.val.ui64=(scv_old->val).ui; break; case NC_INT64: scv_new.val.ui64=(scv_old->val).i64; break; case NC_UINT64: scv_new.val.ui64=(scv_old->val).ui64; break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; case NC_STRING: switch(typ_old){ case NC_FLOAT: break; case NC_DOUBLE: break; case NC_INT: break; case NC_SHORT: break; case NC_BYTE: break; case NC_UBYTE: break; case NC_USHORT: break; case NC_UINT: break; case NC_INT64: break; case NC_UINT64: break; case NC_STRING: break; case NC_CHAR: break; case NC_NAT: break; } break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ scv_new.type=typ_new; *scv_old=scv_new; return True; } /* end nco_scv_cnf_typ() */ nco_bool /* O [flg] Input is integer type */ nco_typ_ntg /* [fnc] Identify integer types */ (const nc_type typ_in) /* I [enm] Type to check for integer-ness */ { nco_bool flg_ntg=True; /* CEWI */ switch(typ_in){ case NC_INT: case NC_SHORT: case NC_INT64: case NC_BYTE: case NC_UINT: case NC_USHORT: case NC_UINT64: case NC_UBYTE: flg_ntg=True; break; case NC_FLOAT: case NC_DOUBLE: case NC_CHAR: case NC_NAT: case NC_STRING: flg_ntg=False; break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return flg_ntg; } /* end nco_typ_ntg() */ nco_bool /* O [flg] Input is signed type */ nco_typ_sgn /* [fnc] Identify signed types */ (const nc_type typ_in) /* I [enm] Type to check for signedness */ { nco_bool flg_sgn=True; /* CEWI */ switch(typ_in){ case NC_FLOAT: case NC_DOUBLE: case NC_INT64: case NC_INT: case NC_SHORT: case NC_BYTE: case NC_CHAR: case NC_NAT: case NC_STRING: flg_sgn=True; break; case NC_UBYTE: case NC_USHORT: case NC_UINT: case NC_UINT64: flg_sgn=False; break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return flg_sgn; } /* end nco_typ_sgn() */ nco_bool /* O [flg] Input is netCDF3 atomic type */ nco_typ_nc3 /* [fnc] Identify netCDF3 atomic types */ (nc_type typ_in) /* I [enm] Type to check netCDF3 compliance */ { nco_bool flg_nc3=True; /* CEWI */ switch(typ_in){ case NC_FLOAT: case NC_DOUBLE: case NC_INT: case NC_SHORT: case NC_BYTE: case NC_CHAR: flg_nc3=True; break; case NC_STRING: case NC_INT64: case NC_UBYTE: case NC_USHORT: case NC_UINT: case NC_UINT64: flg_nc3=False; break; case NC_NAT: default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return flg_nc3; } /* end nco_typ_nc3() */ nc_type /* O [enm] netCDF3 type */ nco_typ_nc4_nc3 /* [fnc] Convert netCDF4 to netCDF3 atomic type */ (const nc_type typ_nc4) /* I [enm] netCDF4 type */ { /* Purpose: Perform intelligent type conversion from netCDF4->3 type */ /* Already netCDF3 type */ if(nco_typ_nc3(typ_nc4)) return typ_nc4; switch(typ_nc4){ case NC_UBYTE: return NC_SHORT; break; case NC_USHORT: case NC_UINT: case NC_INT64: case NC_UINT64: return NC_INT; break; case NC_STRING: return NC_CHAR; break; case NC_NAT: default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return typ_nc4; } /* end nco_typ_nc4_nc3() */ nc_type /* O [enm] Return Highest type */ ncap_typ_hgh /* [fnc] Return Highest type */ (nc_type typ_1, /* I [enm] type */ nc_type typ_2) /* I [enm] type */ { /* Threads: Routine is thread safe and makes no unsafe routines */ /* Purpose: Perform intelligent type conversion with the netCDF3/4 types The logic is as follows 1) If one type is double highest type double .. end 2) if one type float then highest type float .. end 3) if both are signed type then highest type returned 4) if both are unsigned type then highest type returned 5) First var signed second var unsigned if the signed type can represent all values af the unsigned type Then the signed type returned If the types are the same then unsigned type returned If the signed type is less than the unsigned type then the unsigned type is returned Examples: NC_CHAR,NC_UBYTE -> result NC_CHAR NC_INT, NC_USHORT -> result NC_INT NC_SHORT, NC_UINT -> result NC_UINT NC_INT64, NC_UINT -> result NC_INT64 NC_INT64,NC_UINT64 -> result NC_UINT64 */ nco_bool v1s; nco_bool v2s; /* Already identical */ if(typ_1 == typ_2) return typ_1; /* Deal with NC_DOUBLE */ if(typ_1 == NC_DOUBLE || typ_2 == NC_DOUBLE) return NC_DOUBLE; /* Deal with NC_FLOAT */ if(typ_1 == NC_FLOAT || typ_2 == NC_FLOAT) return NC_FLOAT; v1s=nco_typ_sgn(typ_1); v2s=nco_typ_sgn(typ_2); /* Both signed or both unsigned */ if(v1s == v2s) return (typ_1 > typ_2 ? typ_1 : typ_2); /* From here on one is signed the other unsigned */ /* Swap vars about so var_1 is signed, var_2 unsigned */ if(v1s == False && v2s == True){ nc_type typ_tmp; typ_tmp=typ_1;typ_1=typ_2;typ_2=typ_tmp; } switch(typ_1){ case NC_NAT: return typ_2; break; case NC_BYTE: return typ_2; break; case NC_CHAR: return typ_2; break; case NC_SHORT: return (typ_2 < NC_USHORT ? typ_1 : typ_2); break; case NC_INT: return (typ_2 < NC_UINT ? typ_1 : typ_2); break; case NC_INT64: return (typ_2 < NC_UINT64 ? typ_1 : typ_2); break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return typ_1; } /* end ncap_typ_hgh() */ nc_type /* O [enm] Higher precision of input variables */ ncap_var_retype /* [fnc] Promote variable to higher common precision */ (var_sct *var_1, /* I/O [sct] Variable */ var_sct *var_2) /* I/O [sct] Variable */ { /* Threads: Routine is thread safe and makes no unsafe routines */ /* Purpose: Perform intelligent type conversion with netCDF3/4 types */ nc_type typ_hgh; typ_hgh=ncap_typ_hgh(var_1->type,var_2->type); if(var_1->type != typ_hgh) var_1=nco_var_cnf_typ(typ_hgh,var_1); if(var_2->type != typ_hgh) var_2=nco_var_cnf_typ(typ_hgh,var_2); return typ_hgh; } /* end ncap_var_retype() */ nc_type /* O [enm] Highest precision of arguments */ ncap_scv_scv_cnf_typ_hgh_prc /* [fnc] Promote arguments to higher precision if necessary */ (scv_sct * const scv_1, /* I/O [sct] Scalar value */ scv_sct * const scv_2) /* I/O [sct] Scalar value */ { /* fxm: TODO nco616: netCDF4 breaks assumption that range/precision increases with nc_type enum */ /* Purpose: Promote scalar values to higher of two precisions, if necessary */ if(scv_1->type == scv_2->type){ return scv_1->type; }else if(scv_1->type > scv_2->type){ (void)nco_scv_cnf_typ(scv_1->type,scv_2); return scv_1->type; }else{ (void)nco_scv_cnf_typ(scv_2->type,scv_1); return scv_2->type; } /* endif */ } /* end ncap_scv_scv_cnf_typ_hgh_prc() */ nc_type /* O [enm] Highest precision of arguments */ ncap_var_scv_cnf_typ_hgh_prc /* [fnc] Promote arguments to higher precision if necessary */ (var_sct ** const var, /* I/O [sct] Variable */ scv_sct * const scv) /* I/O [sct] Scalar value */ { /* fxm: TODO nco616: netCDF4 breaks assumption that range/precision increases with nc_type enum */ /* Purpose: If types of variable and scalar value differ, convert argument with lower precision to higher precision type. Otherwise do nothing. fxm: Assumes nc_type increases monotonically with precision */ /* Do nothing if types match */ if((*var)->type == scv->type){ return (*var)->type; }else if((*var)->type > scv->type){ (void)nco_scv_cnf_typ((*var)->type,scv); return (*var)->type; }else{ *var=nco_var_cnf_typ(scv->type,*var); return scv->type; } /* endif */ } /* end ncap_var_scv_cnf_typ_hgh_prc() */ nco-4.5.4/src/nco/nco_cnf_typ.h000066400000000000000000000121031264355130400163230ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Conform variable types */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_cnf_typ.h" *//* Conform variable types */ #ifndef NCO_CNF_TYP_H #define NCO_CNF_TYP_H /* Standard header files */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, printf */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_mmr.h" /* Memory management */ #ifdef _MSC_VER # include "nco_rth_flt.h" /* Float-precision arithmetic, MSVC macros */ #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void cast_void_nctype /* [fnc] Cast generic pointer to netCDF type */ (const nc_type type, /* I [enm] netCDF type to cast void pointer to */ ptr_unn * const ptr); /* I/O [ptr] Pointer to pointer union whose vp element will be cast to type type*/ void cast_nctype_void /* [fnc] Cast generic pointer in ptr_unn structure from type type to type void */ (const nc_type type, /* I [enm] netCDF type of pointer */ ptr_unn * const ptr); /* I/O pointer to pointer union which to cast from type type to type void */ var_sct * /* O [var] Variable after (possible) conversion */ nco_typ_cnv_rth /* [fnc] Convert char, short, long, int, and float types to doubles before arithmetic */ (var_sct *var, /* I/O [var] Variable to be considered for conversion */ const int nco_op_typ); /* I [enm] Operation type */ var_sct * /* O [sct] Variable reverted to on-disk type */ nco_cnv_var_typ_dsk /* [fnc] Revert variable to on-disk type */ (var_sct *var); /* I [sct] Variable to be reverted */ var_sct * /* O [sct] Pointer to variable structure of type var_out_typ */ nco_var_cnf_typ /* [fnc] Return copy of input variable typecast to desired type */ (const nc_type var_out_typ, /* I [enm] Type to convert variable structure to */ var_sct * const var_in); /* I/O [enm] Pointer to variable structure (may be destroyed) */ var_sct * /* O [sct] Pointer to variable structure of type var_out_typ */ nco_var_cnf_typ_tst /* [fnc] Return copy of input variable typecast to desired type */ (const nc_type var_out_typ, /* I [enm] Type to convert variable structure to */ var_sct * const var_in); /* I/O [enm] Pointer to variable structure (may be destroyed) */ var_sct * /* O [sct] Variable with mss_val converted to typ_upk */ nco_cnv_mss_val_typ /* [fnc] Convert missing_value, if any, to mss_val_out_typ */ (var_sct *var, /* I [sct] Variable with missing_value to convert */ const nc_type mss_val_out_typ); /* I [enm] Type of mss_val on output */ void nco_val_cnf_typ /* [fnc] Copy val_in and typecast from typ_in to typ_out */ (const nc_type typ_in, /* I [enm] Type of input value */ ptr_unn val_in, /* I [ptr] Pointer to input value */ const nc_type typ_out, /* I [enm] Type of output value */ ptr_unn val_out); /* I [ptr] Pointer to output value */ int /* O [enm] Dummy return */ nco_scv_cnf_typ /* [fnc] Convert scalar attribute to typ_new using C implicit coercion */ (const nc_type typ_new, /* I [enm] Type to convert scv_old to */ scv_sct * const scv_old); /* I/O [sct] Scalar value to convert */ nc_type /* O [enm] Return Highest type */ ncap_typ_hgh /* [fnc] Promote variable to higher common precision */ (nc_type typ_1, /* I [enm] type */ nc_type typ_2); /* I [enm] type */ nc_type /* O [enm] Highest precision of input variables */ ncap_var_retype /* [fnc] Promote variable to higher common precision */ (var_sct *var_1, /* I/O [sct] Variable */ var_sct *var_2); /* I/O [sct] Variable */ nc_type /* O [enm] Highest precision of arguments */ ncap_scv_scv_cnf_typ_hgh_prc /* [fnc] Promote arguments to higher precision if necessary */ (scv_sct * const scv_1, /* I/O [sct] Scalar value */ scv_sct * const scv_2); /* I/O [sct] Scalar value */ nc_type /* O [enm] Highest precision of arguments */ ncap_var_scv_cnf_typ_hgh_prc /* [fnc] Promote arguments to higher precision if necessary */ (var_sct ** const var, /* I/O [sct] Variable */ scv_sct * const scv); /* I/O [sct] Scalar value */ nco_bool /* O [flg] Input is integer type */ nco_typ_ntg /* [fnc] Identify integer types */ (const nc_type typ_in); /* I [enm] Type to check for integer-ness */ nco_bool /* O [flg] Input is signed type */ nco_typ_sgn /* [fnc] Identify signed types */ (const nc_type typ_in); /* I [enm] Type to check for signedness */ nco_bool /* O [flg] Input is netCDF3 atomic type */ nco_typ_nc3 /* [fnc] Identify netCDF3 atomic types */ (const nc_type typ_in); /* I [enm] Type to check netCDF3 compliance */ nc_type /* O [enm] netCDF3 type */ nco_typ_nc4_nc3 /* [fnc] Convert netCDF4 to netCDF3 atomic type */ (const nc_type typ_nc4); /* I [enm] netCDF4 type */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CNF_TYP_H */ nco-4.5.4/src/nco/nco_cnk.c000066400000000000000000002047251264355130400154440ustar00rootroot00000000000000/* $Header$ */ /* Purpose: NCO utilities for chunking */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: ncks -O -4 -D 4 --cnk_scl=8 ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_scl=8 ${DATA}/dstmch90/dstmch90_clm.nc ~/foo.nc ncks -O -4 -D 4 --cnk_dmn time,10 ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_dmn time,10 --cnk_map=dmn ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_map=dmn -d time,0,3 ~/nco/data/in.nc ~/foo.nc ncks -O -4 -D 4 --cnk_dmn lat,64 --cnk_dmn lon,128 ${DATA}/dstmch90/dstmch90_clm.nc ~/foo.nc ncks -O -4 -D 4 --cnk_plc=uck ~/foo.nc ~/foo.nc ncks -O -4 -D 4 --cnk_plc=g2d --cnk_map=rd1 --cnk_dmn lat,64 --cnk_dmn lon,128 ${DATA}/dstmch90/dstmch90_clm.nc ~/foo.nc ncks -O -4 -D 4 --cnk_plc=all ~/nco/data/in.nc ~/foo.nc # Chunk unchunked data ncks -O -4 -D 4 --cnk_plc=uck ~/foo.nc ~/foo.nc # Unchunk chunked data ncks -O -4 -D 4 --cnk_plc=all ~/foo.nc ~/foo.nc # Chunk chunked data ncks -O -4 -D 4 --cnk_plc=uck ~/nco/data/in.nc ~/foo.nc # Unchunk unchunked data ncks -O -C --cnk_plc=xst --cnk_map=xst -g g13 -v one,two,three,four -p ~/nco/data in_grp.nc ~/foo.nc ncks -O -4 -C --cnk_plc=all --cnk_map=lfp ~/nco/data/in.nc ~/foo.nc ncks -C -m --hdn --cdl ~/foo.nc ncecat testing: ncecat -O -4 -D 4 --cnk_plc=all -p ~/nco/data in.nc in.nc ~/foo.nc ncecat -O -4 -D 4 --cnk_plc=g2d --cnk_map=rd1 --cnk_dmn lat,64 --cnk_dmn lon,128 -p ${DATA}/dstmch90 dstmch90_clm.nc dstmch90_clm.nc ~/foo.nc ncwa testing: ncwa -O -4 -D 4 -a time --cnk_plc=g2d --cnk_map=rd1 --cnk_dmn lat,32 --cnk_dmn lon,128 -p ${DATA}/dstmch90 dstmch90_clm_0112.nc ~/foo.nc Advanced Chunking: http://hdfeos.org/workshops/ws13/presentations/day1/HDF5-EOSXIII-Advanced-Chunking.ppt http://www.hdfgroup.org/HDF5/doc/H5.user/Chunking.html http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_why_it_matters http://www.unidata.ucar.edu/blogs/developer/en/entry/chunking_data_choosing_shapes http://www.unidata.ucar.edu/software/netcdf/docs/default_chunking_4_0_1.html http://www.unidata.ucar.edu/software/netcdf/docs_rc/default_chunking_4_1.html */ #include "nco_cnk.h" /* Chunking */ const char * /* O [sng] Chunking map string */ nco_cnk_map_sng_get /* [fnc] Convert chunking map enum to string */ (const int nco_cnk_map) /* I [enm] Chunking map */ { /* Purpose: Convert chunking map enum to string */ switch(nco_cnk_map){ case nco_cnk_map_nil: return "nil"; case nco_cnk_map_dmn: return "dmn"; case nco_cnk_map_rd1: return "rd1"; case nco_cnk_map_scl: return "scl"; case nco_cnk_map_prd: return "prd"; case nco_cnk_map_lfp: return "lfp"; case nco_cnk_map_xst: return "xst"; case nco_cnk_map_rew: return "rew"; case nco_cnk_map_nc4: return "nc4"; case nco_cnk_map_nco: return "nco"; default: nco_dfl_case_cnk_map_err(); break; } /* end switch */ /* Some compilers, e.g., SGI cc, need return statement to end non-void functions */ return (char *)NULL; } /* end nco_cnk_map_sng_get() */ const char * /* O [sng] Chunking policy string */ nco_cnk_plc_sng_get /* [fnc] Convert chunking policy enum to string */ (const int nco_cnk_plc) /* I [enm] Chunking policy */ { /* Purpose: Convert chunking policy enum to string */ switch(nco_cnk_plc){ case nco_cnk_plc_nil: return "nil"; case nco_cnk_plc_all: return "all"; case nco_cnk_plc_g2d: return "g2d"; case nco_cnk_plc_g3d: return "g3d"; case nco_cnk_plc_r1d: return "r1d"; case nco_cnk_plc_xpl: return "xpl"; case nco_cnk_plc_xst: return "xst"; case nco_cnk_plc_uck: return "uck"; default: nco_dfl_case_cnk_plc_err(); break; } /* end switch */ /* Some compilers, e.g., SGI cc, need return statement to end non-void functions */ return (char *)NULL; } /* end nco_cnk_plc_sng_get() */ void nco_dfl_case_cnk_map_err(void) /* [fnc] Print error and exit for illegal switch(cnk_map) case */ { /* Purpose: Convenience routine for printing error and exiting when switch(cnk_map) statement receives an illegal default case Placing this in its own routine saves many lines of code since this function is used in many many switch() statements. */ const char fnc_nm[]="nco_dfl_case_cnk_map_err()"; (void)fprintf(stdout,"%s: ERROR switch(cnk_map) statement fell through to default case, which is unsafe. This catch-all error handler ensures all switch(cnk_map) statements are fully enumerated. Exiting...\n",fnc_nm); nco_err_exit(0,fnc_nm); } /* end nco_dfl_case_cnk_map_err() */ void nco_dfl_case_cnk_plc_err(void) /* [fnc] Print error and exit for illegal switch(cnk_plc) case */ { /* Purpose: Convenience routine for printing error and exiting when switch(cnk_plc) statement receives an illegal default case Placing this in its own routine saves many lines of code since this function is used in many many switch() statements. */ const char fnc_nm[]="nco_dfl_case_cnk_plc_err()"; (void)fprintf(stdout,"%s: ERROR switch(cnk_plc) statement fell through to default case, which is unsafe. This catch-all error handler ensures all switch(cnk_plc) statements are fully enumerated. Exiting...\n",fnc_nm); nco_err_exit(0,fnc_nm); } /* end nco_dfl_case_cnk_plc_err() */ int /* [rcd] Return code */ nco_cnk_ini /* [fnc] Initialize chunking from user-specified inputs */ (const int in_id, /* I [id] netCDF input file ID */ const char * const fl_out, /* I [sng] Output filename */ CST_X_PTR_CST_PTR_CST_Y(char,cnk_arg), /* I [sng] List of user-specified chunksizes */ const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ const int cnk_map, /* I [enm] Chunking map */ const int cnk_plc, /* I [enm] Chunking policy */ const size_t cnk_min_byt, /* I [B] Minimize size of variable to chunk */ const size_t cnk_sz_byt, /* I [B] Chunk size in bytes */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ cnk_sct * const cnk) /* O [sct] Chunking structure */ { /* Purpose: Initialize chunking from user-specified inputs */ int rcd=0; /* [enm] Return code */ size_t fl_sys_blk_sz=0UL; /* [nbr] File system blocksize for I/O */ /* Initialize */ cnk->flg_usr_rqs=False; cnk->cnk_dmn=NULL_CEWI; cnk->cnk_nbr=cnk_nbr; cnk->cnk_map=cnk_map; cnk->cnk_plc=cnk_plc; cnk->cnk_min_byt=cnk_min_byt; cnk->cnk_sz_byt=cnk_sz_byt; cnk->cnk_sz_scl=cnk_sz_scl; /* Did user explicitly request chunking? */ if(cnk_nbr > 0 || cnk_min_byt > 0UL || cnk_sz_byt > 0UL || cnk_sz_scl > 0UL || cnk_map != nco_cnk_map_nil || cnk_plc != nco_cnk_plc_nil) cnk->flg_usr_rqs=True; /* Chunks are atomic unit of HDF5 read/write Variables are compressed and check-summed one chunk at-a-time Set NCO_CNK_SZ_BYT_DFL to system blocksize, if known Setting chunksize equal to system blocksize thought to minimize disk head movement, be most efficient Blocksize is related to default buffer; check this with ncks -O -4 -D 6 -v one ~/nco/data/in.nc ~/foo.nc Buffer is at least twice and sometimes sixteen times Blocksize: Blocksize Buffer Linux default 4096 8192 Yellowstone /home 32768 524288 Yellowstong /glade 131072 524288 Yellowstong /tmp 4096 524288 <-- probably hardcoded default not actual blocksize reported */ /* Discover blocksize if possible */ fl_sys_blk_sz=nco_fl_blocksize(fl_out); if(cnk_sz_byt > 0ULL){ /* Use user-specified chunk size if available */ cnk->cnk_sz_byt=cnk_sz_byt; }else{ /* Otherwise use filesystem blocksize if valid, otherwise use Linux default */ cnk->cnk_sz_byt= (fl_sys_blk_sz > 0ULL) ? fl_sys_blk_sz : NCO_CNK_SZ_BYT_DFL; } /* end else */ /* Java chunking defaults: http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/reference/netcdf4Clibrary.html */ if(cnk_min_byt == 0ULL) cnk->cnk_min_byt= (fl_sys_blk_sz > 0ULL) ? 2*fl_sys_blk_sz : NCO_CNK_SZ_MIN_BYT_DFL; if(cnk_sz_byt <= 0ULL) cnk->cnk_sz_byt=NCO_CNK_SZ_BYT_DFL; /* Make uniform list of user-specified per-dimension chunksizes */ if(cnk->cnk_nbr > 0) cnk->cnk_dmn=nco_cnk_prs(cnk_nbr,cnk_arg); /* Set actual chunk policy and map to defaults as necessary 20140821: Until today, defaults for map and policy (rd1 and g2d, respectively) were set independently 20141013: Tweak defaults so chunking always called (required to preserve input chunking) 20150514: Use different defaults if input is netCDF3 (i.e., completely unchunked) Now we consider three distinct cases: 1. Neither map nor policy was explicitly set, and something else, e.g., size, was 2. User set map not policy 3. User set policy not map */ if(cnk_map == nco_cnk_map_nil && cnk_plc == nco_cnk_plc_nil){ /* Does _input_ file support chunking? */ int fl_in_fmt=NCO_FORMAT_UNDEFINED; /* [enm] Input file format */ (void)nco_inq_format(in_id,&fl_in_fmt); if(fl_in_fmt == NC_FORMAT_NETCDF4 || fl_in_fmt == NC_FORMAT_NETCDF4_CLASSIC){ /* Input is netCDF4 so preserve chunking unless otherwise specified */ cnk->cnk_map=nco_cnk_map_xst; cnk->cnk_plc=nco_cnk_plc_xst; }else{ /* Input is netCDF3 so choose chunking judiciously unless otherwise specified */ if(nco_dbg_lvl_get() > nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Input file format %s does not support chunking and no chunking policy or map specified so output chunking format will use NCO (not netCDF) defaults\n",nco_prg_nm_get(),nco_fmt_sng(fl_in_fmt)); cnk->cnk_map=nco_cnk_map_nco; cnk->cnk_plc=nco_cnk_plc_nco; } /* endif dbg */ } /* endif */ if(cnk->cnk_map == nco_cnk_map_nil && cnk->cnk_plc != nco_cnk_plc_nil) cnk->cnk_map=nco_cnk_map_rd1; if(cnk->cnk_plc == nco_cnk_plc_nil && cnk->cnk_map != nco_cnk_map_nil) cnk->cnk_plc=nco_cnk_plc_g2d; /* NCO-recommended chunking map is expected to change over time cnk_map=nco assigns current NCO-recommended map */ if(cnk->cnk_map == nco_cnk_map_nco) cnk->cnk_map=nco_cnk_map_rew; if(cnk->cnk_plc == nco_cnk_plc_nco) cnk->cnk_plc=nco_cnk_plc_all; return rcd; } /* end nco_cnk_ini() */ cnk_dmn_sct ** /* O [sct] Structure list with user-specified per-dimension chunking information */ nco_cnk_prs /* [fnc] Create chunking structures with name and chunksize elements */ (const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ CST_X_PTR_CST_PTR_CST_Y(char,cnk_arg)) /* I [sng] List of user-specified chunksizes */ { /* Purpose: Determine name and per-dimension chunksize elements from user arguments Routine merely evaluates syntax of input expressions and does not attempt to validate dimensions or chunksizes against input file. Routine based on nco_lmt_prs() */ /* Valid syntax adheres to nm,cnk_sz */ void nco_usg_prn(void); char **arg_lst; char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ const char dlm_sng[]=","; cnk_dmn_sct **cnk_dmn=NULL_CEWI; int idx; int arg_nbr; if(cnk_nbr > 0) cnk_dmn=(cnk_dmn_sct **)nco_malloc(cnk_nbr*sizeof(cnk_dmn_sct *)); for(idx=0;idx 2 || /* Too much information */ arg_lst[0] == NULL || /* Dimension name not specified */ False){ (void)fprintf(stdout,"%s: ERROR in chunksize specification for dimension %s\n%s: HINT Conform request to chunksize documentation at http://nco.sf.net/nco.html#cnk\n",nco_prg_nm_get(),cnk_arg[idx],nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ /* Initialize structure */ /* cnk strings that are not explicitly set by user remain NULL, i.e., specifying default setting will appear as if nothing at all was set. Hopefully, in routines that follow, branch followed when dimension has all default settings specified (e.g.,"-d foo,,,,") yields same answer as branch for which no hyperslab along that dimension was set. */ cnk_dmn[idx]=(cnk_dmn_sct *)nco_malloc(sizeof(cnk_dmn_sct)); cnk_dmn[idx]->nm=NULL; cnk_dmn[idx]->nm_fll=NULL; cnk_dmn[idx]->is_usr_spc_cnk=True; /* True if any part of limit is user-specified, else False */ /* Parse input name into a temporary string and inquire if name is absolute or relative */ char *sng_tmp=arg_lst[0]; nco_bool is_fll_pth=nco_is_fll_pth(sng_tmp); if(is_fll_pth) cnk_dmn[idx]->nm_fll=(char *)strdup(sng_tmp); else cnk_dmn[idx]->nm=(char *)strdup(sng_tmp); /* 20130711: Debian Mayhem project bug #716602 shows unsanitized input can cause core-dump _inside_ strtoul() */ cnk_dmn[idx]->sz=strtoul(arg_lst[1],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(arg_lst[1],"strtoul",sng_cnv_rcd); /* Free current pointer array to strings Strings themselves are untouched and will be free()'d with chunk structures in nco_cnk_lst_free() */ arg_lst=(char **)nco_free(arg_lst); } /* end loop over cnk structure list */ return cnk_dmn; } /* end nco_cnk_prs() */ cnk_dmn_sct ** /* O [sct] Pointer to free'd structure list */ nco_cnk_lst_free /* [fnc] Free memory associated with chunking structure list */ (cnk_dmn_sct **cnk_lst, /* I/O [sct] Chunking structure list to free */ const int cnk_nbr) /* I [nbr] Number of chunking structures in list */ { /* Threads: Routine is thread safe and calls no unsafe routines */ /* Purpose: Free all memory associated with dynamically allocated chunking structure list */ int idx; for(idx=0;idxnm) cnk_dmn->nm=(char *)nco_free(cnk_dmn->nm); if(cnk_dmn->nm_fll) cnk_dmn->nm_fll=(char *)nco_free(cnk_dmn->nm_fll); /* Free structure pointer last */ if(cnk_dmn) cnk_dmn=(cnk_dmn_sct *)nco_free(cnk_dmn); return NULL; } /* end nco_cnk_dmn_free() */ int /* O [enm] Chunking map */ nco_cnk_map_get /* [fnc] Convert user-specified chunking map to key */ (const char *nco_cnk_map_sng) /* [sng] User-specified chunking map */ { /* Purpose: Convert user-specified string to chunking map Return nco_cnk_map_xst by default */ const char fnc_nm[]="nco_cnk_map_get()"; /* [sng] Function name */ char *nco_prg_nm; /* [sng] Program name */ nco_prg_nm=nco_prg_nm_get(); /* [sng] Program name */ if(nco_cnk_map_sng == NULL){ /* 20140815: Change default from rd1 to xst */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s reports %s invoked without explicit chunking map. Defaulting to chunking map \"xst\".\n",nco_prg_nm,fnc_nm,nco_prg_nm); return nco_cnk_map_xst; } /* endif */ if(!strcmp(nco_cnk_map_sng,"nil")) return nco_cnk_map_nil; if(!strcmp(nco_cnk_map_sng,"cnk_map_nil")) return nco_cnk_map_nil; if(!strcmp(nco_cnk_map_sng,"dmn")) return nco_cnk_map_dmn; if(!strcmp(nco_cnk_map_sng,"cnk_map_dmn")) return nco_cnk_map_dmn; if(!strcmp(nco_cnk_map_sng,"rd1")) return nco_cnk_map_rd1; if(!strcmp(nco_cnk_map_sng,"cnk_map_rd1")) return nco_cnk_map_rd1; if(!strcmp(nco_cnk_map_sng,"scl")) return nco_cnk_map_scl; if(!strcmp(nco_cnk_map_sng,"cnk_map_scl")) return nco_cnk_map_scl; if(!strcmp(nco_cnk_map_sng,"prd")) return nco_cnk_map_prd; if(!strcmp(nco_cnk_map_sng,"cnk_map_prd")) return nco_cnk_map_prd; if(!strcmp(nco_cnk_map_sng,"lfp")) return nco_cnk_map_lfp; if(!strcmp(nco_cnk_map_sng,"cnk_map_lfp")) return nco_cnk_map_lfp; if(!strcmp(nco_cnk_map_sng,"xst")) return nco_cnk_map_xst; if(!strcmp(nco_cnk_map_sng,"cnk_map_xst")) return nco_cnk_map_xst; if(!strcmp(nco_cnk_map_sng,"rew")) return nco_cnk_map_rew; if(!strcmp(nco_cnk_map_sng,"cnk_map_rew")) return nco_cnk_map_rew; if(!strcmp(nco_cnk_map_sng,"nc4")) return nco_cnk_map_nc4; if(!strcmp(nco_cnk_map_sng,"cnk_map_nc4")) return nco_cnk_map_nc4; if(!strcmp(nco_cnk_map_sng,"nco")) return nco_cnk_map_nco; if(!strcmp(nco_cnk_map_sng,"cnk_map_nco")) return nco_cnk_map_nco; (void)fprintf(stderr,"%s: ERROR %s reports unknown user-specified chunking map %s\n",nco_prg_nm_get(),fnc_nm,nco_cnk_map_sng); nco_exit(EXIT_FAILURE); return nco_cnk_map_nil; /* Statement should not be reached */ } /* end nco_cnk_map_get() */ int /* O [enm] Chunking policy */ nco_cnk_plc_get /* [fnc] Convert user-specified chunking policy to key */ (const char *nco_cnk_plc_sng) /* [sng] User-specified chunking policy */ { /* Purpose: Convert user-specified string to chunking operation type Return nco_cnk_plc_xst by default */ const char fnc_nm[]="nco_cnk_plc_get()"; /* [sng] Function name */ char *nco_prg_nm; /* [sng] Program name */ nco_prg_nm=nco_prg_nm_get(); /* [sng] Program name */ if(nco_cnk_plc_sng == NULL){ /* 20140815: Change default from g2d to xst */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s reports %s invoked without explicit chunking policy. Defaulting to chunking policy \"xst\".\n",nco_prg_nm,fnc_nm,nco_prg_nm); return nco_cnk_plc_xst; } /* endif */ if(!strcmp(nco_cnk_plc_sng,"nil")) return nco_cnk_plc_nil; if(!strcmp(nco_cnk_plc_sng,"cnk_nil")) return nco_cnk_plc_nil; if(!strcmp(nco_cnk_plc_sng,"plc_nil")) return nco_cnk_plc_nil; if(!strcmp(nco_cnk_plc_sng,"all")) return nco_cnk_plc_all; if(!strcmp(nco_cnk_plc_sng,"cnk_all")) return nco_cnk_plc_all; if(!strcmp(nco_cnk_plc_sng,"plc_all")) return nco_cnk_plc_all; if(!strcmp(nco_cnk_plc_sng,"g2d")) return nco_cnk_plc_g2d; if(!strcmp(nco_cnk_plc_sng,"cnk_g2d")) return nco_cnk_plc_g2d; if(!strcmp(nco_cnk_plc_sng,"plc_g2d")) return nco_cnk_plc_g2d; if(!strcmp(nco_cnk_plc_sng,"g3d")) return nco_cnk_plc_g3d; if(!strcmp(nco_cnk_plc_sng,"cnk_g3d")) return nco_cnk_plc_g3d; if(!strcmp(nco_cnk_plc_sng,"plc_g3d")) return nco_cnk_plc_g3d; if(!strcmp(nco_cnk_plc_sng,"nco")) return nco_cnk_plc_nco; if(!strcmp(nco_cnk_plc_sng,"cnk_nco")) return nco_cnk_plc_nco; if(!strcmp(nco_cnk_plc_sng,"plc_nco")) return nco_cnk_plc_nco; if(!strcmp(nco_cnk_plc_sng,"r1d")) return nco_cnk_plc_r1d; if(!strcmp(nco_cnk_plc_sng,"cnk_r1d")) return nco_cnk_plc_r1d; if(!strcmp(nco_cnk_plc_sng,"plc_r1d")) return nco_cnk_plc_r1d; if(!strcmp(nco_cnk_plc_sng,"xpl")) return nco_cnk_plc_xpl; if(!strcmp(nco_cnk_plc_sng,"cnk_xpl")) return nco_cnk_plc_xpl; if(!strcmp(nco_cnk_plc_sng,"plc_xpl")) return nco_cnk_plc_xpl; if(!strcmp(nco_cnk_plc_sng,"xst")) return nco_cnk_plc_xst; if(!strcmp(nco_cnk_plc_sng,"cnk_xst")) return nco_cnk_plc_xst; if(!strcmp(nco_cnk_plc_sng,"plc_xst")) return nco_cnk_plc_xst; if(!strcmp(nco_cnk_plc_sng,"uck")) return nco_cnk_plc_uck; if(!strcmp(nco_cnk_plc_sng,"cnk_uck")) return nco_cnk_plc_uck; if(!strcmp(nco_cnk_plc_sng,"plc_uck")) return nco_cnk_plc_uck; if(!strcmp(nco_cnk_plc_sng,"unchunk")) return nco_cnk_plc_uck; (void)fprintf(stderr,"%s: ERROR %s reports unknown user-specified chunking policy %s\n",nco_prg_nm_get(),fnc_nm,nco_cnk_plc_sng); nco_exit(EXIT_FAILURE); return nco_cnk_plc_nil; /* Statement should not be reached */ } /* end nco_cnk_plc_get() */ nco_bool /* O [flg] Variable is chunked on disk */ nco_cnk_dsk_inq /* [fnc] Check whether variable is chunked on disk */ (const int nc_id, /* I [idx] netCDF file ID */ const int var_id) /* I [id] Variable ID */ { /* Purpose: Check whether variable is chunked on disk */ /* nces -O -D 3 -v cnk ~/nco/data/in.nc ~/nco/data/foo.nc */ int srg_typ; /* [enm] Storage type */ (void)nco_inq_var_chunking(nc_id,var_id,&srg_typ,(size_t *)NULL); if(srg_typ == NC_CONTIGUOUS) return False; else return True; } /* end nco_cnk_dsk_inq() */ #if 0 /* NB: Following routines are placeholders, currently not used */ size_t * /* O [nbr] Chunksize array for variable */ nco_cnk_sz_get /* [fnc] Determine chunksize array */ (const int nc_id, /* I [id] netCDF file ID */ const char * const var_nm, /* I [sng] Variable name */ const int cnk_map, /* I [enm] Chunking map */ const int cnk_plc, /* I [enm] Chunking policy */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr) /* I [nbr] Number of dimensions with user-specified chunking */ { /* Purpose: Use chunking map and policy to determine chunksize list */ int dmn_nbr; /* [nbr] Number of dimensions in variable */ int dmn_idx; int idx; int rec_dmn_id; size_t *cnk_sz; /* [nbr] Chunksize list */ /* Get record dimension ID */ (void)nco_inq(nc_id,(int *)NULL,(int *)NULL,(int *)NULL,&rec_dmn_id); /* Get type and number of dimensions and attributes for variable */ cnk_sz=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); return cnk_sz; } /* end nco_cnk_sz_get() */ nco_bool /* O [flg] NCO will attempt to chunk variable */ nco_is_chunkable /* [fnc] Will NCO attempt to chunk variable? */ (const nc_type nc_typ_in) /* I [enm] Type of input variable */ { /* Purpose: Determine whether NCO should attempt to chunk a given type Chunking certain variable types is not recommended, e.g., chunking NC_CHAR and NC_BYTE makes no sense, because precision would needlessly be lost. Routine should be consistent with nco_cnk_plc_typ_get() NB: Routine is deprecated in favor of more flexible nco_cnk_plc_typ_get() */ const char fnc_nm[]="nco_is_chunkable()"; /* [sng] Function name */ (void)fprintf(stdout,"%s: ERROR deprecated routine %s should not be called\n",nco_prg_nm_get(),fnc_nm); nco_exit(EXIT_FAILURE); switch(nc_typ_in){ case NC_FLOAT: case NC_DOUBLE: case NC_INT64: case NC_UINT64: case NC_INT: case NC_UINT: return True; break; case NC_SHORT: case NC_USHORT: case NC_CHAR: case NC_BYTE: case NC_UBYTE: case NC_STRING: return False; break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ /* Some compilers, e.g., SGI cc, need return statement to end non-void functions */ return False; } /* end nco_is_chunkable() */ #endif /* endif 0 */ void nco_cnk_sz_set /* [fnc] Set chunksize parameters */ (const int nc_id, /* I [id] netCDF file ID */ CST_X_PTR_CST_PTR_CST_Y(lmt_msa_sct,lmt_all_lst), /* I [sct] Hyperslab limits */ const int lmt_all_lst_nbr, /* I [nbr] Number of hyperslab limits */ int * const cnk_map_ptr, /* I/O [enm] Chunking map */ int * const cnk_plc_ptr, /* I/O [enm] Chunking policy */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr) /* I [nbr] Number of dimensions with user-specified chunking */ { /* Purpose: Use chunking map and policy to determine chunksize list */ const char fnc_nm[]="nco_cnk_sz_set()"; /* [sng] Function name */ char dmn_nm[NC_MAX_NAME+1L]; char var_nm[NC_MAX_NAME+1L]; int *dmn_id; int cnk_idx; int dmn_idx; int cnk_map; /* [enm] Chunking map */ int cnk_plc; /* [enm] Chunking policy */ int chk_typ; /* [enm] Checksum type */ int deflate; /* [enm] Deflate filter is on */ int dmn_nbr; /* [nbr] Number of dimensions in variable */ int fl_fmt; /* [enm] Input file format */ int lmt_idx; int lmt_idx_rec=int_CEWI; int rcd_dmn_id; int srg_typ; /* [enm] Storage type */ int var_idx; int var_nbr; long dmn_sz; nco_bool flg_cnk=False; /* [flg] Chunking requested */ nco_bool is_rec_var; /* [flg] Record variable */ nco_bool is_chk_var; /* [flg] Check-summed variable */ nco_bool is_cmp_var; /* [flg] Compressed variable */ nco_bool is_chunked; /* [flg] Chunked variable */ nco_bool must_be_chunked; /* [flg] Variable must be chunked */ nc_type var_typ_dsk; size_t *cnk_sz; /* [nbr] Chunksize list */ size_t cnk_sz_dfl; /* [nbr] Chunksize default */ /* Did user explicitly request chunking? */ if(cnk_nbr > 0 || cnk_sz_scl > 0UL || *cnk_map_ptr != nco_cnk_map_nil || *cnk_plc_ptr != nco_cnk_plc_nil) flg_cnk=True; if(!flg_cnk) return; /* Set actual chunk policy and map to defaults as necessary This rather arcane procedure saves a few lines of code in calling program (because defaults not set there) while maintaining correctness of arguments */ if(*cnk_map_ptr == nco_cnk_map_nil) *cnk_map_ptr=nco_cnk_map_get((char *)NULL); if(*cnk_plc_ptr == nco_cnk_plc_nil) *cnk_plc_ptr=nco_cnk_plc_get((char *)NULL); cnk_map=*cnk_map_ptr; cnk_plc=*cnk_plc_ptr; /* Bail on unsupported options */ if(cnk_plc == nco_cnk_plc_xpl){ (void)fprintf(stderr,"%s: ERROR cnk_plc = %s not yet supported\n",nco_prg_nm_get(),nco_cnk_plc_sng_get(cnk_plc)); nco_exit(EXIT_FAILURE); } /* endif */ /* Does output file support chunking? */ (void)nco_inq_format(nc_id,&fl_fmt); if(fl_fmt != NC_FORMAT_NETCDF4 && fl_fmt != NC_FORMAT_NETCDF4_CLASSIC){ (void)fprintf(stderr,"%s: WARNING Output file format is %s so chunking request will be ignored\n",nco_prg_nm_get(),nco_fmt_sng(fl_fmt)); return; } /* endif dbg */ /* Vet input */ if(cnk_map == nco_cnk_map_scl && cnk_sz_scl <= 0){ (void)fprintf(stderr,"%s: ERROR cnk_sz_scl = %lu must be greater than 0\n",nco_prg_nm_get(),(unsigned long)cnk_sz_scl); nco_exit(EXIT_FAILURE); } /* endif cnk_sz_scl */ if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Requested chunking or unchunking\n",nco_prg_nm_get()); if(nco_dbg_lvl_get() >= nco_dbg_scl){ (void)fprintf(stderr,"cnk_plc: %s\n",nco_cnk_plc_sng_get(cnk_plc)); (void)fprintf(stderr,"cnk_map: %s\n",nco_cnk_map_sng_get(cnk_map)); (void)fprintf(stderr,"cnk_sz_scl: %lu\n",(unsigned long)cnk_sz_scl); if(cnk_nbr > 0){ (void)fprintf(stderr,"idx dmn_nm\tcnk_sz:\n"); for(cnk_idx=0;cnk_idxnm,(unsigned long)cnk_dmn[cnk_idx]->sz); } /* cnk_nbr == 0 */ } /* endif dbg */ /* Get record dimension ID */ (void)nco_inq(nc_id,(int *)NULL,&var_nbr,(int *)NULL,&rcd_dmn_id); /* Find record dimension, if any, in limit structure list first This information may be needed below */ if(rcd_dmn_id != NCO_REC_DMN_UNDEFINED){ (void)nco_inq_dimname(nc_id,rcd_dmn_id,dmn_nm); for(lmt_idx=0;lmt_idxdmn_nm)){ lmt_idx_rec=lmt_idx; break; } /* end if */ } /* end loop over limit */ } /* NCO_REC_DMN_UNDEFINED */ /* NB: Assumes variable IDs range from [0..var_nbr-1] */ for(var_idx=0;var_idx= nco_dbg_var) (void)fprintf(stderr,"%s: INFO %s %s must be chunked (record, compressed, or check-summed variable)\n",nco_prg_nm_get(),fnc_nm,var_nm); }else{ /* Turn-off chunking for this variable */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stderr,"%s: INFO %s unchunking %s\n",nco_prg_nm_get(),fnc_nm,var_nm); (void)nco_def_var_chunking(nc_id,var_idx,srg_typ,cnk_sz); } /* !must_be_chunked */ }else{ /* !chunked */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stderr,"%s: INFO %s not unchunking %s because it is not chunked\n",nco_prg_nm_get(),fnc_nm,var_nm); } /* !chunked */ /* Free space holding dimension IDs before skipping to next variable */ dmn_id=(int *)nco_free(dmn_id); /* Skip to next variable in loop */ continue; } /* end if */ /* Variable will definitely be chunked */ srg_typ=NC_CHUNKED; /* [enm] Storage type */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stderr,"%s: INFO %s %schunking %s\n",nco_prg_nm_get(),fnc_nm,(is_chunked ? "re-" : "" ),var_nm); /* Allocate space to hold chunksizes */ cnk_sz=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); /* Default "equal" chunksize for each dimension */ cnk_sz_dfl=cnk_sz_scl; if(cnk_map == nco_cnk_map_prd){ double cnk_sz_prd_dbl; /* [nbr] Chunksize product, double precision */ double cnk_sz_eql_dbl; /* [nbr] Chunksize equal, double precision */ double cnk_sz_dfl_dbl; /* [nbr] Chunksize default, double precision */ cnk_sz_prd_dbl=cnk_sz_scl; cnk_sz_eql_dbl=pow(cnk_sz_prd_dbl,1.0/dmn_nbr); cnk_sz_dfl_dbl=ceil(cnk_sz_eql_dbl); cnk_sz_dfl=(size_t)cnk_sz_dfl_dbl; } /* endif map_prd */ for(dmn_idx=0;dmn_idxNON_HYP_DMN){ /* When not hyperslabbed, use input record dimension size ... */ cnk_sz[dmn_idx]=lmt_all_lst[lmt_idx_rec]->dmn_sz_org; }else{ /* !NON_HYP_DMN */ /* ... and when hyperslabbed, use user-specified count */ cnk_sz[dmn_idx]=lmt_all_lst[lmt_idx_rec]->dmn_cnt; } /* !NON_HYP_DMN */ }else{ /* !record dimension */ /* Set non-record dimensions to default, possibly over-ride later */ cnk_sz[dmn_idx]=dmn_sz; if(dmn_sz == 0L){ (void)fprintf(stderr,"%s: ERROR %s reports variable %s has dim_sz == 0L for non-record dimension %s. This should not occur and it will cause chunking to fail...\n",nco_prg_nm_get(),fnc_nm,var_nm,dmn_nm); } /* endif err */ } /* !record dimension */ /* Propagate scalar chunksize, if specified */ if(cnk_sz_dfl > 0UL){ if(dmn_id[dmn_idx] == rcd_dmn_id){ if(lmt_all_lst[lmt_idx_rec]->NON_HYP_DMN){ /* When not hyperslabbed, use input record dimension size ... */ cnk_sz[dmn_idx]=(cnk_sz_dfl <= (size_t)lmt_all_lst[lmt_idx_rec]->dmn_sz_org) ? cnk_sz_dfl : (size_t)lmt_all_lst[lmt_idx_rec]->dmn_sz_org; }else{ /* !NON_HYP_DMN */ /* ... and when hyperslabbed, use user-specified count */ cnk_sz[dmn_idx]=(cnk_sz_dfl <= (size_t)lmt_all_lst[lmt_idx_rec]->dmn_cnt) ? cnk_sz_dfl : (size_t)lmt_all_lst[lmt_idx_rec]->dmn_cnt; } /* !NON_HYP_DMN */ }else{ /* !rcd_dmn_id */ /* Non-record sizes default to cnk_sz_dfl or to dimension size */ cnk_sz[dmn_idx]=(cnk_sz_dfl <= (size_t)dmn_sz) ? cnk_sz_dfl : (size_t)dmn_sz; } /* !rcd_dmn_id */ } /* !cnk_sz_dfl */ cnk_xpl_override: /* end goto */ /* Explicit chunk specifications override all else */ for(cnk_idx=0;cnk_idxnm,dmn_nm)){ cnk_sz[dmn_idx]=cnk_dmn[cnk_idx]->sz; if(dmn_id[dmn_idx] == rcd_dmn_id){ if(lmt_all_lst[lmt_idx_rec]->NON_HYP_DMN){ if(cnk_sz[dmn_idx] > (size_t)lmt_all_lst[lmt_idx_rec]->dmn_sz_org){ (void)fprintf(stderr,"%s: WARNING %s allowing user-specified record dimension chunksize = %lu for %s to exceed record dimension size in input file = %lu. May fail if output file is not concatenated from multiple inputs.\n",nco_prg_nm_get(),fnc_nm,(unsigned long)cnk_dmn[cnk_idx]->sz,dmn_nm,lmt_all_lst[lmt_idx_rec]->dmn_sz_org); } /* endif too big */ }else{ /* !NON_HYP_DMN */ if(cnk_sz[dmn_idx] > (size_t)lmt_all_lst[lmt_idx_rec]->dmn_cnt){ (void)fprintf(stderr,"%s: WARNING %s allowing user-specified record dimension chunksize = %lu for %s to exceed user-specified record dimension hyperslab size in input file = %lu. May fail if output file is not concatenated from multiple inputs.\n",nco_prg_nm_get(),fnc_nm,(unsigned long)cnk_dmn[cnk_idx]->sz,dmn_nm,lmt_all_lst[lmt_idx_rec]->dmn_cnt); } /* endif too big */ } /* !NON_HYP_DMN */ }else{ /* !rcd_dmn_id */ if(cnk_sz[dmn_idx] > (size_t)dmn_sz){ /* dmn_sz of record dimension may (will) be zero in output file Non-record dimensions, though, must have cnk_sz <= dmn_sz */ (void)fprintf(stderr,"%s: WARNING %s trimming user-specified chunksize = %lu to %s size = %lu\n",nco_prg_nm_get(),fnc_nm,(unsigned long)cnk_dmn[cnk_idx]->sz,dmn_nm,dmn_sz); /* Trim else out-of-bounds sizes will fail in HDF library in nc_enddef() */ cnk_sz[dmn_idx]=(size_t)dmn_sz; } /* endif */ } /* !rcd_dmn_id */ break; } /* cnk_nm != dmn_nm */ } /* end loop over cnk */ } /* end loop over dmn */ if(nco_dbg_lvl_get() >= nco_dbg_scl){ (void)fprintf(stderr,"idx nm\tdmn_sz\tcnk_sz for %s:\n",var_nm); for(dmn_idx=0;dmn_idxflg_usr_rqs; cnk_nbr=cnk->cnk_nbr; cnk_map=cnk->cnk_map; cnk_plc=cnk->cnk_plc; cnk_min_byt=cnk->cnk_min_byt; cnk_sz_byt=cnk->cnk_sz_byt; cnk_sz_scl=cnk->cnk_sz_scl; cnk_dmn=cnk->cnk_dmn; /* Only use NCO chunking when user explicitly sets a chunking option */ if(!flg_usr_rqs) return; /* Bail on unsupported options */ if(cnk_map == nco_cnk_map_nil){ (void)fprintf(stderr,"%s: ERROR cnk_map = %s not yet supported\n",nco_prg_nm_get(),nco_cnk_map_sng_get(cnk_map)); nco_exit(EXIT_FAILURE); } /* endif */ /* Does output file support chunking? */ (void)nco_inq_format(grp_id_out,&fl_fmt); if(fl_fmt != NC_FORMAT_NETCDF4 && fl_fmt != NC_FORMAT_NETCDF4_CLASSIC){ (void)fprintf(stderr,"%s: WARNING Output file format is %s so chunking request will be ignored\n",nco_prg_nm_get(),nco_fmt_sng(fl_fmt)); return; } /* endif dbg */ /* Vet input */ if(cnk_map == nco_cnk_map_scl && cnk_sz_scl <= 0UL){ (void)fprintf(stderr,"%s: ERROR cnk_sz_scl = %lu must be greater than 0\n",nco_prg_nm_get(),(unsigned long)cnk_sz_scl); nco_exit(EXIT_FAILURE); } /* endif cnk_sz_scl */ if(FIRST_CALL && nco_dbg_lvl_get() >= nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: INFO User requests (or compression or record dimension requires) chunking or unchunking\n",nco_prg_nm_get()); if(nco_dbg_lvl_get() >= nco_dbg_scl && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"cnk_plc, cnk_map: %s, %s\n",nco_cnk_plc_sng_get(cnk_plc),nco_cnk_map_sng_get(cnk_map)); (void)fprintf(stdout,"cnk_sz_scl, cnk_sz_byt, cnk_min_byt: %lu, %lu, %lu\n",(unsigned long)cnk_sz_scl,(unsigned long)cnk_sz_byt,(unsigned long)cnk_min_byt); if(cnk_nbr > 0){ (void)fprintf(stdout,"idx cnk_nm\tcnk_sz:\n"); for(cnk_idx=0;cnk_idxnm ? cnk_dmn[cnk_idx]->nm : cnk_dmn[cnk_idx]->nm_fll,(unsigned long)cnk_dmn[cnk_idx]->sz); } /* cnk_nbr == 0 */ } /* endif dbg */ } /* endif dbg */ FIRST_CALL=False; /* Initialize storage type for this variable */ srg_typ=NC_CONTIGUOUS; /* [enm] Storage type */ is_rec_var=False; /* [flg] Record variable */ is_chk_var=False; /* [flg] Check-summed variable */ is_cmp_var=False; /* [flg] Compressed variable */ is_chunked=False; /* [flg] Chunked variable */ is_xpl_cnk=False; /* [flg] Explicitly chunked variable */ /* Obtain variable ID */ (void)nco_inq_varid(grp_id_out,var_nm,&var_id_out); (void)nco_inq_varid(grp_id_in,var_nm,&var_id_in); /* Get type and number of dimensions for variable */ (void)nco_inq_var(grp_id_out,var_id_out,(char *)NULL,&var_typ_dsk,&dmn_nbr,(int *)NULL,(int *)NULL); typ_sz=nco_typ_lng(var_typ_dsk); if(dmn_nbr == 0){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s skipping scalar...\n",nco_prg_nm_get(),fnc_nm); return; } /* dmn_nbr */ /* Does variable contain a record dimension? */ for(dmn_idx=0;dmn_idx= 433) is_chunked=nco_cnk_dsk_inq(grp_id_in,var_id_in); /* Does variable have any user-chunked dimensions? */ for(dmn_idx=0;dmn_idxnm_fll){ if(!strcmp(cnk_dmn[cnk_idx]->nm_fll,dmn_cmn[dmn_idx].nm_fll)) break; }else{ if(!strcmp(cnk_dmn[cnk_idx]->nm,dmn_cmn[dmn_idx].nm)) break; } /* end else */ } /* end loop over cnk_idx */ if(cnk_idx != cnk_nbr) break; } /* end loop over dmn_idx */ if(dmn_idx != dmn_nbr) is_xpl_cnk=True; /* Let netCDF layer determine chunking */ if(cnk_map == nco_cnk_map_nc4) return; if(must_be_chunked){ /* Some variables simply must be chunked */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s %s must be chunked (record, compressed, or check-summed variable)\n",nco_prg_nm_get(),fnc_nm,var_nm); }else{ /* Exit chunking function now (and thus implement netCDF4-default chunking behavior) for variables that are... */ if((var_sz_byt < cnk_min_byt) || /* ...too small in size... */ (cnk_plc == nco_cnk_plc_xpl && !is_xpl_cnk) || /* ...not explicitly chunked... */ (cnk_plc == nco_cnk_plc_xst && !is_chunked) || /* ...not already chunked... */ (cnk_plc == nco_cnk_plc_g2d && dmn_nbr < 2) || /* ...much too small in rank... */ (cnk_plc == nco_cnk_plc_g3d && dmn_nbr < 3) || /* ...too small in rank... */ (cnk_plc == nco_cnk_plc_uck) || /* ...intentionally unchunked... */ False){ /* If variable is chunked in input */ if(is_chunked){ /* Turn-off chunking for this variable */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s unchunking %s\n",nco_prg_nm_get(),fnc_nm,var_nm); if(shuffle){ /* 20150415: If shuffle is set on input variable then NCO also sets it on output variable nco_cnk_sz_set_trv() is first place NCO knows whether to unchunk variable Variables defined with shuffle must be chunked, therefore instruct variable to be stored as not shuffled Unset shuffle before unchunking variable, otherwise nc_def_var_chunking() returns NC_EINVAL */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s turning-off shuffle filter before unchunking variable %s\n",nco_prg_nm_get(),fnc_nm,var_nm); shuffle=NC_NOSHUFFLE; deflate=0; (void)nco_def_var_deflate(grp_id_out,var_id_out,shuffle,deflate,(int)0); } /* !shuffle */ /* Redundant since default netCDF srg_typ = NC_CONTIGUOUS for variables that need not be chunked */ (void)nco_def_var_chunking(grp_id_out,var_id_out,srg_typ,cnk_sz); }else{ /* !chunked */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s not unchunking %s because it is not chunked\n",nco_prg_nm_get(),fnc_nm,var_nm); } /* !chunked */ /* Return control to calling routine NB: Here is where loop in original nco_cnk_sz_set() continues to next variable */ return; } /* !turn-off chunking */ } /* !must_be_chunked */ /* Routine has not returned yet so this variable will definitely be chunked */ srg_typ=NC_CHUNKED; /* [enm] Storage type */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stdout,"%s: INFO %s %schunking %s\n",nco_prg_nm_get(),fnc_nm,(is_chunked ? "re-" : "" ),var_nm); /* Allocate space to hold chunksizes */ cnk_sz=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); if(cnk_map == nco_cnk_map_xst){ /* Set chunksizes to existing sizes for this variable */ if(is_chunked){ char **dmn_nm_in; /* [sng] Dimension names for this variable in input file */ int *dmn_id_in; /* [id] Dimension IDs for this variable in input file */ int dmn_idx_in; /* [idx] Counter for input dimensions */ int dmn_nbr_in; /* [nbr] Number of dimensions for variable in input file */ size_t *cnk_in=NULL; /* [nbr] Chunksize list in input file */ (void)nco_inq_varndims(grp_id_in,var_id_in,&dmn_nbr_in); cnk_in=(size_t *)nco_malloc(dmn_nbr_in*sizeof(size_t)); dmn_id_in=(int *)nco_malloc(dmn_nbr_in*sizeof(int)); dmn_nm_in=(char **)nco_malloc(dmn_nbr_in*sizeof(char *)); for(dmn_idx=0;dmn_idx= nco_dbg_var) (void)fprintf(stdout,"%s: INFO %s reports variable %s output dimension %s not found in input file. Setting default chunksize for this dimension to = %lu\n",nco_prg_nm_get(),fnc_nm,var_nm,dmn_cmn[dmn_idx].nm,(unsigned long)cnk_sz[dmn_idx]); } /* endif dimension not in input file */ } /* end loop over dmn_idx */ /* Memory management */ if(cnk_in) cnk_in=(size_t *)nco_free(cnk_in); if(dmn_id_in) dmn_id_in=(int *)nco_free(dmn_id_in); for(dmn_idx=0;dmn_idx=0;dmn_idx--) /* NB: reverse loop */ if(dmn_cmn[dmn_idx].is_rec_dmn) break; dmn_idx_1st_rec=dmn_idx; /* Find product of all righter chunksizes */ for(dmn_idx=dmn_nbr-1;dmn_idx>=dmn_idx_1st_rec+1;dmn_idx--) cnk_sz_prd_rgt*=cnk_sz[dmn_idx]; /* Derive product of all lefter chunksizes */ cnk_sz_prd_lft=cnk_val_nbr/cnk_sz_prd_rgt; /* How many lefter chunksizes are there? */ dmn_nbr_lft=dmn_idx_1st_rec+1; cnk_sz_lft_dbl=pow(cnk_sz_prd_lft,1.0/dmn_nbr_lft); cnk_sz_lft=(size_t)cnk_sz_lft_dbl; if(cnk_sz_lft <= 0) cnk_sz_lft=1L; /* Assign remaining chunkspace equally amongst lefter dimensions */ for(dmn_idx=0;dmn_idx<=dmn_idx_1st_rec;dmn_idx++) cnk_sz[dmn_idx]=cnk_sz_lft; /* Allow existing chunksizes to be over-ridden by explicitly specified chunksizes */ goto cnk_xpl_override; } /* !nco_cnk_map_lfp */ //cnk_map_rew: /* end goto */ /* Apply Rew only to 3-D variables */ if(cnk_map == nco_cnk_map_rew && dmn_nbr != 3) goto cnk_xpl_override; if(cnk_map == nco_cnk_map_rew || (cnk_plc == nco_cnk_plc_nco && dmn_nbr == 3)){ /* Implementation by Russ Rew at http://www.unidata.ucar.edu/staff/russ/public/chunk_shape_3D.py >>> import cnk >>> cnk.chunk_shape_3D(varShape=(98128,277,349),valSize=4,chunkSize=4096) [33, 5, 6] Test case is (time,lat,lon) = 98128 x 277 x 349 ncks -O -C -4 -D 5 -v three_dmn_rec_var --cnk_byt=128 --cnk_map=rew -p ~/nco/data in.nc ~/foo.nc ncks -O -C -4 -D 5 -v var --cnk_byt=4096 --cnk_map=rew -p ~/nco/data cnk.nc ${DATA}/nco_bm/cnk_rew.nc */ double cnk_val_nbr; double dmn_sz_prd=1.0; /* [nbr] Number of elements in output variable */ double cnk_nbr_xct; /* [nbr] Exact number of ideal chunks needed to store variable */ double cnk_nbr_2D_axs; /* [nbr] Exact number of ideal chunks along each 2D axis */ double fct_ncr=1.0; /* [frc] Factor by which to increase chunk size */ double cnk_sz_rgn_zro_dfl; /* [nbr] Default chunk size for dimension zero (time) */ size_t *cnk_sz_prt; /* [nbr] Perturbed chunk size (base chunk size plus zero or one) */ size_t *cnk_sz_rgn; /* [nbr] Original (first-guess) chunk size (no adjustments) */ size_t *prt_cff; /* [nbr] Rerturbation to base chunk size for each dimension, also [0,1] multiplier for each power of two in this permutation index */ size_t *two_pwr_idx; /* [nbr] Two-to-the-power-of-the-array-index */ size_t *var_shp; /* [nbr] Shape of variable */ /* Allocate space to hold variable shape */ cnk_sz_rgn=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); cnk_sz_prt=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); prt_cff=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); two_pwr_idx=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); var_shp=(size_t *)nco_malloc(dmn_nbr*sizeof(size_t)); cnk_val_nbr=cnk_sz_byt/(double)typ_sz; for(dmn_idx=0;dmn_idx<=dmn_nbr-1;dmn_idx++){ /* Store shape for future use */ var_shp[dmn_idx]= (dmn_cmn[dmn_idx].NON_HYP_DMN) ? dmn_cmn[dmn_idx].sz : dmn_cmn[dmn_idx].dmn_cnt; /* Determine hyperslab size */ dmn_sz_prd*=var_shp[dmn_idx]; } /* end loop over dmn_idx */ /* [nbr] Exact number of ideal chunks needed to store variable */ cnk_nbr_xct=dmn_sz_prd/cnk_val_nbr; /* [nbr] Exact number of ideal chunks along each 2D axis */ cnk_nbr_2D_axs=pow(cnk_nbr_xct,0.25); /* Default chunk size for dimension zero (time) */ cnk_sz_rgn_zro_dfl=var_shp[0]/(cnk_nbr_2D_axs*cnk_nbr_2D_axs); if(var_shp[0]/(cnk_nbr_2D_axs*cnk_nbr_2D_axs) >= 1.0){ cnk_sz_rgn[0]=(size_t)cnk_sz_rgn_zro_dfl; // Here Rew13 uses Python // operator for integer arithmetic }else{ /* Adjust chunk shape because time-series length incommensurate with lateral dimensions: If default chunk shape would give time chunk size smaller than one, then set time chunk size equal to one (larger than default) and compensate for effect of this in overall chunk volume by shrinking lateral size by same factor such that product of adjusted chunk sizes equals product of default chunk sizes */ cnk_sz_rgn[0]=1L; cnk_nbr_2D_axs/=sqrt(cnk_sz_rgn_zro_dfl); } /* endif */ for(dmn_idx=1;dmn_idx<=dmn_nbr-1;dmn_idx++) /* NB: Start at index 1 */ if(var_shp[dmn_idx]/cnk_nbr_2D_axs < 1.0) fct_ncr*=cnk_nbr_2D_axs/var_shp[dmn_idx]; for(dmn_idx=1;dmn_idx<=dmn_nbr-1;dmn_idx++) /* NB: Start at index 1 */ if(var_shp[dmn_idx]/cnk_nbr_2D_axs < 1.0) cnk_sz_rgn[dmn_idx]=1L; else cnk_sz_rgn[dmn_idx]=(size_t)(fct_ncr*var_shp[dmn_idx]/cnk_nbr_2D_axs); /* First-guess estimate of chunk size */ size_t cnk_sz_prd=1L; for(dmn_idx=0;dmn_idx<=dmn_nbr-1;dmn_idx++) cnk_sz_prd*=cnk_sz_rgn[dmn_idx]; assert(cnk_sz_prd*typ_sz <= cnk_sz_byt); /* prm_idx = prm_cff[0]*2^0 + prm_cff[1]*2^1 + prm_cff[2]*2^2 + ... + prm_cff[dmn_nbr-1]*2^(dmn_nbr-1) */ two_pwr_idx[0]=1L; for(dmn_idx=1;dmn_idx<=dmn_nbr-1;dmn_idx++) two_pwr_idx[dmn_idx]=2L*two_pwr_idx[dmn_idx-1]; size_t two_pwr_rnk=2L*two_pwr_idx[dmn_nbr-1]; int sum_idx; /* [idx] Counting index for partial sums [dmn_idx+1..dmn_nbr-1] */ long cnk_gap; /* [B] Difference between actual and requested chunksize */ long cnk_gap_prt; /* [B] Difference between perturbed and requested chunksize */ size_t prm_idx; /* [idx] Permutation index [0..2^(dmn_nbr-1)] */ size_t prt_sum; /* [nbr] Partial sum (sum of coefficients times powers of two for higher powers */ /* Score initial guess */ cnk_gap=(long)(cnk_sz_byt-cnk_sz_prd*typ_sz); /* In case initial guess is lucky and permutation loop breaks before completing */ for(dmn_idx=0;dmn_idx<=dmn_nbr-1;dmn_idx++) cnk_sz[dmn_idx]=cnk_sz_rgn[dmn_idx]; /* Loop through permutations of adjusting first-estimate chunk size by plus one NB: Skip permutation prm_idx=0 since it is degenerate and does not change first-guess chunk sizes */ for(prm_idx=1;prm_idx=0;dmn_idx--){ /* NB: descending loop */ cnk_sz_prt[dmn_idx]=cnk_sz_rgn[dmn_idx]; prt_sum=prt_cff[dmn_idx]=0UL; /* Partial sum of higher powers */ for(sum_idx=dmn_idx+1;sum_idx<=dmn_nbr-1;sum_idx++) prt_sum+=prt_cff[sum_idx]*two_pwr_idx[sum_idx]; prt_cff[dmn_idx]=(prm_idx-prt_sum)/two_pwr_idx[dmn_idx]; cnk_sz_prt[dmn_idx]+=prt_cff[dmn_idx]; cnk_sz_prd*=cnk_sz_prt[dmn_idx]; } /* dmn_idx */ /* Test gap narrowness */ cnk_gap_prt=(long)(cnk_sz_byt-cnk_sz_prd*typ_sz); if(nco_dbg_lvl_get() >= nco_dbg_var){ (void)fprintf(stdout,"prm_idx = %lu, cnk_gap = %ld, cnk_sz_prd = %lu, cnk_gap_prt = %ld, prt_sum = %lu\n",(unsigned long)prm_idx,cnk_gap,(unsigned long)cnk_sz_prd,cnk_gap_prt,(unsigned long)prt_sum); (void)fprintf(stdout,"idx dmn_nm\tdmn_sz\tvar_shp\tsz_rgn\tsz_prt\tprt_cff\ttwo_pwr:\n"); for(dmn_idx=0;dmn_idx= 0L && cnk_gap_prt < cnk_gap){ /* Candidate improves best previous guess */ for(dmn_idx=0;dmn_idx<=dmn_nbr-1;dmn_idx++){ cnk_sz[dmn_idx]=cnk_sz_prt[dmn_idx]; cnk_gap=cnk_gap_prt; } /* end loop over dimensions */ } /* endif gap */ } /* end loop over permutations */ if(nco_dbg_lvl_get() >= nco_dbg_var){ (void)fprintf(stdout,"map rew debugging:\n"); (void)fprintf(stdout,"cnk_nbr_xct = %g, cnk_val_nbr = %g, dmn_sz_prd = %g, cnk_sz_prd = %lu\n",cnk_nbr_xct,cnk_val_nbr,dmn_sz_prd,(unsigned long)cnk_sz_prd); (void)fprintf(stdout,"idx dmn_nm\tdmn_sz\tvar_shp\tcnk_sz:\n"); for(dmn_idx=0;dmn_idx 0UL){ for(dmn_idx=0;dmn_idxnm_fll) if(!strcmp(cnk_dmn[cnk_idx]->nm_fll,dmn_cmn[dmn_idx].nm_fll)) break; /* If no full-names match, then first short-name (relative name) match wins */ if(cnk_idx == cnk_nbr) for(cnk_idx=0;cnk_idxnm_fll) if(!strcmp(cnk_dmn[cnk_idx]->nm,dmn_cmn[dmn_idx].nm)) break; /* If no match then no override so continue to next dimension */ if(cnk_idx == cnk_nbr) continue; /* Override default chunking with user-specified chunking for this dimension if... */ if( /* ... Policy is anything but r1d or ...*/ (cnk_plc != nco_cnk_plc_r1d) || /* ... Policy is r1d and this is the matching r1d coordinate or ... */ (cnk_plc == nco_cnk_plc_r1d && (dmn_nbr == 1 && is_rec_var)) || False){ /* Perform override */ cnk_sz[dmn_idx]=cnk_dmn[cnk_idx]->sz; }else{ /* Override was not performed due to policy, so continue to next dimension */ continue; } /* endif */ /* Sanity checks for dimensions that were over-ridden by user-specified chunksizes */ /* Is this a record dimension? */ if(dmn_cmn[dmn_idx].is_rec_dmn){ /* dmn_sz of record dimension can/will be zero in output file Allow (though warn) when cnk_sz > dmn_sz in such cases */ if(dmn_cmn[dmn_idx].NON_HYP_DMN){ if(dmn_cmn[dmn_idx].sz > 0 && /* Warn only after records have been written */ cnk_sz[dmn_idx] > (size_t)dmn_cmn[dmn_idx].sz){ (void)fprintf(stderr,"%s: WARNING %s allowing user-specified record dimension %s chunksize %lu which exceeds current output file record dimension size = %lu. May fail if output file is not concatenated from multiple inputs.\n",nco_prg_nm_get(),fnc_nm,dmn_cmn[dmn_idx].nm,(unsigned long)cnk_dmn[cnk_idx]->sz,(unsigned long)dmn_cmn[dmn_idx].sz); } /* endif too big */ }else{ /* !NON_HYP_DMN */ if(cnk_sz[dmn_idx] > (size_t)dmn_cmn[dmn_idx].dmn_cnt){ (void)fprintf(stderr,"%s: WARNING %s allowing user-specified record dimension %s chunksize = %lu which exceeds user-specified record dimension input hyperslab size = %lu. May fail if output file is not concatenated from multiple inputs.\n",nco_prg_nm_get(),fnc_nm,dmn_cmn[dmn_idx].nm,(unsigned long)cnk_dmn[cnk_idx]->sz,(unsigned long)dmn_cmn[dmn_idx].dmn_cnt); } /* endif too big */ } /* !NON_HYP_DMN */ }else{ /* !rcd_dmn_id */ if(cnk_sz[dmn_idx] > (size_t)dmn_cmn[dmn_idx].sz){ /* Unlike record dimensions, non-record dimensions must have cnk_sz <= dmn_sz */ (void)fprintf(stderr,"%s: WARNING %s trimming user-specified fixed dimension %s chunksize from %lu to %lu\n",nco_prg_nm_get(),fnc_nm,dmn_cmn[dmn_idx].nm,(unsigned long)cnk_dmn[cnk_idx]->sz,(unsigned long)dmn_cmn[dmn_idx].sz); /* Trim else out-of-bounds sizes will fail in HDF library in nc_enddef() */ cnk_sz[dmn_idx]=(size_t)dmn_cmn[dmn_idx].sz; } /* endif */ } /* !rcd_dmn_id */ } /* end loop over dmn_idx */ /* Final Safety Check */ cnk_sft_chk: /* end goto */ /* Status: Previous loop implemented per-dimension checks on user-requested chunksizes only Loop below implements similar final safety check for ALL dimensions and ALL chunking maps Check trims fixed (not record) dimension chunksize to never be larger than dimension size */ for(dmn_idx=0;dmn_idx (size_t)dmn_cmn[dmn_idx].sz){ if(!dmn_cmn[dmn_idx].is_rec_dmn){ /* Unlike record dimensions, non-record dimensions must have cnk_sz <= dmn_sz */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stderr,"%s: INFO %s final check trimming chunksize of \"%s\" dimension from %lu to %lu\n",nco_prg_nm_get(),fnc_nm,dmn_cmn[dmn_idx].nm,(unsigned long)cnk_sz[dmn_idx],(unsigned long)dmn_cmn[dmn_idx].sz); /* Trim else out-of-bounds sizes will fail in HDF library in nc_enddef() */ cnk_sz[dmn_idx]=(size_t)dmn_cmn[dmn_idx].sz; } /* rcd_dmn_id */ } /* end if */ } /* end loop over dmn */ if(nco_dbg_lvl_get() >= nco_dbg_var && nco_dbg_lvl_get() != nco_dbg_dev){ /* Dimensions and chunksizes used by variable in output file */ (void)fprintf(stdout,"idx dmn_nm\tdmn_sz\tcnk_sz:\n"); for(dmn_idx=0;dmn_idx /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, printf */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_fl_utl.h" /* File manipulation */ #include "nco_grp_utl.h" /* Group utilities */ #include "nco_lst_utl.h" /* List utilities */ #include "nco_mmr.h" /* Memory management */ /* Chunking policies: Handle each chunking policies in nco_cnk_sz_set() */ enum nco_cnk_plc{ /* [enm] Chunking policy */ nco_cnk_plc_nil, /* 0 [enm] Do not think about chunking */ nco_cnk_plc_all, /* 1 [enm] Chunk all variables */ nco_cnk_plc_g2d, /* 2 [enm] Chunk variables >= two dimensions */ nco_cnk_plc_g3d, /* 3 [enm] Chunk variables >= three dimensions */ nco_cnk_plc_xpl, /* 4 [enm] Chunk variables with explicitly chunked dimensions */ nco_cnk_plc_xst, /* 5 [enm] Chunk variables that are chunked in input */ nco_cnk_plc_uck, /* 6 [enm] Unchunk all chunked variables */ nco_cnk_plc_r1d, /* 7 [enm] Chunk record coordinates == one dimension */ nco_cnk_plc_nco /* 8 [enm] Chunk variables according to current "best" NCO algorithm */ }; /* end nco_cnk_plc enum */ /* Chunking type maps: */ enum nco_cnk_map{ /* [enm] Chunking conversion map */ nco_cnk_map_nil, /* 0 [enm] Do not chunk anything, storage is unchanged */ nco_cnk_map_dmn, /* 1 [enm] Chunksize equals dimension size */ nco_cnk_map_rd1, /* 2 [enm] Chunksize equals dimension size except record dimension has size one */ nco_cnk_map_scl, /* 3 [enm] Chunksize equals scalar size specified */ nco_cnk_map_prd, /* 4 [enm] Chunksize product is scalar size specified */ nco_cnk_map_lfp, /* 5 [enm] Chunksizes of lefter dimensions flexes to matches scalar size specified */ nco_cnk_map_xst, /* 6 [enm] Chunksize equals chunk-sizes in input file */ nco_cnk_map_rew, /* 7 [enm] Chunksize balances access to 1D and 2D slabs of 3D variable */ nco_cnk_map_nc4, /* 8 [enm] Chunksize determined by netCDF layer */ nco_cnk_map_nco /* 9 [enm] Chunksize determined by current "best" NCO algorithm */ }; /* end nco_cnk_map enum */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void nco_dfl_case_cnk_map_err(void); /* [fnc] Print error and exit for illegal switch(cnk_map) case */ void nco_dfl_case_cnk_plc_err(void); /* [fnc] Print error and exit for illegal switch(nco_cnk_plc) case */ const char * /* O [sng] Chunking map string */ nco_cnk_map_sng_get /* [fnc] Convert chunking map enum to string */ (const int nco_cnk_map); /* I [enm] Chunking map */ const char * /* O [sng] Chunking policy string */ nco_cnk_plc_sng_get /* [fnc] Convert chunking policy enum to string */ (const int nco_cnk_plc); /* I [enm] Chunking policy */ int /* [rcd] [enm] Return code */ nco_cnk_ini /* [fnc] Initialize chunking from user-specified inputs */ (const int in_id, /* I [id] netCDF input file ID */ const char * const fl_out, /* I [sng] Output filename */ CST_X_PTR_CST_PTR_CST_Y(char,cnk_arg), /* I [sng] List of user-specified chunksizes */ const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ const int cnk_map, /* I [enm] Chunking map */ const int cnk_plc, /* I [enm] Chunking policy */ const size_t cnk_min_byt, /* I [B] Minimize size of variable to chunk */ const size_t cnk_sz_byt, /* I [B] Chunk size in bytes */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ cnk_sct * const cnk); /* O [sct] Chunking structure */ cnk_dmn_sct ** /* O [sct] Structure list with user-specified per-dimension chunking information */ nco_cnk_prs /* [fnc] Create chunking structures with name and chunksize elements */ (const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ CST_X_PTR_CST_PTR_CST_Y(char,cnk_arg)); /* I [sng] List of user-specified chunksizes */ cnk_dmn_sct ** /* O [sct] Pointer to free'd structure list */ nco_cnk_lst_free /* [fnc] Free memory associated with chunking structure list */ (cnk_dmn_sct **cnk_lst, /* I/O [sct] Chunking structure list to free */ const int cnk_nbr); /* I [nbr] Number of chunking structures in list */ cnk_dmn_sct * /* O [sct] Pointer to free'd chunking structure */ nco_cnk_dmn_free /* [fnc] Free all memory associated with chunking structure */ (cnk_dmn_sct *cnk_dmn); /* I/O [sct] Chunking structure to free */ void nco_cnk_sz_set /* [fnc] Set chunksize parameters */ (const int nc_id, /* I [id] netCDF file ID */ CST_X_PTR_CST_PTR_CST_Y(lmt_msa_sct,lmt_all_lst), /* I [sct] Hyperslab limits */ const int lmt_all_lst_nbr, /* I [nbr] Number of hyperslab limits */ int * const cnk_map_ptr, /* I/O [enm] Chunking map */ int * const cnk_plc_ptr, /* I/O [enm] Chunking policy */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr); /* I [nbr] Number of dimensions with user-specified chunking */ void nco_cnk_sz_set_trv /* [fnc] Set chunksize parameters (GTT version of nco_cnk_sz_set() ) */ (const int grp_id_in, /* I [id] netCDF group ID in input file */ const int grp_id_out, /* I [id] netCDF group ID in output file */ const cnk_sct * const cnk, /* I [sct] Chunking structure */ const char * const var_nm, /* I [sng] Name of variable */ const dmn_cmn_sct * const dmn_cmn); /* I [sct] Dimension structure in output file */ int /* O [enm] Chunking map */ nco_cnk_map_get /* [fnc] Convert user-specified chunking map to key */ (const char *nco_cnk_map_sng); /* [sng] User-specified chunking map */ int /* O [enm] Chunking policy */ nco_cnk_plc_get /* [fnc] Convert user-specified chunking policy to key */ (const char *nco_cnk_plc_sng); /* [sng] User-specified chunking policy */ nco_bool /* O [flg] Variable is chunked on disk */ nco_cnk_dsk_inq /* [fnc] Check whether variable is chunked on disk */ (const int nc_id, /* I [idx] netCDF file ID */ const int var_id); /* I [id] Variable ID */ #if 0 size_t * /* O [nbr] Chunksize array for variable */ nco_cnk_sz_get /* [fnc] Determine chunksize array */ (const int nc_id, /* I [id] netCDF file ID */ const char * const var_nm, /* I [sng] Variable name */ const int cnk_map, /* I [enm] Chunking map */ const int cnk_plc, /* I [enm] Chunking policy */ const size_t cnk_sz_scl, /* I [nbr] Chunk size scalar */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr); /* I [nbr] Number of dimensions with user-specified chunking */ nco_bool /* O [flg] NCO will attempt to chunk variable */ nco_is_chunkable /* [fnc] Will NCO attempt to chunk variable? */ (const nc_type nc_typ_in); /* I [enm] Type of input variable */ #endif /* endif 0 */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CNK_H */ nco-4.5.4/src/nco/nco_cnv_arm.c000066400000000000000000000150431264355130400163070ustar00rootroot00000000000000/* $Header$ */ /* Purpose: ARM conventions, e.g., http://www.arm.gov/data/time.stm */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_cnv_arm.h" /* ARM conventions */ nco_bool /* O [flg] File obeys ARM conventions */ nco_cnv_arm_inq /* O [fnc] Check if file obeys ARM conventions */ (const int nc_id) /* I [id] netCDF file ID */ { /* Purpose: Check whether file adheres to ARM time format defined http://www.arm.gov/data/time.stm */ nco_bool CNV_ARM; const char time_sng[]="time"; /* CEWI */ const char base_time_sng[]="base_time"; /* CEWI */ const char time_offset_sng[]="time_offset"; /* CEWI */ int time_dmn_id; int base_time_id; int time_offset_id; int rcd=NC_NOERR; /* [rcd] Return code */ /* Look for ARM file signature */ rcd+=nco_inq_dimid_flg(nc_id,time_sng,&time_dmn_id); rcd+=nco_inq_varid_flg(nc_id,base_time_sng,&base_time_id); rcd+=nco_inq_varid_flg(nc_id,time_offset_sng,&time_offset_id); /* All three IDs must be valid to handle ARM format */ if(rcd != NC_NOERR){ CNV_ARM=False; }else{ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: CONVENTION File convention is DOE ARM\n",nco_prg_nm_get()); CNV_ARM=True; } /* end else */ return CNV_ARM; } /* end nco_cnv_arm_inq */ double /* O [s] base_time + current time_offset */ nco_cnv_arm_time_mk /* [fnc] Return time corresponding to current time offset */ (const int nc_id, /* I [id] netCDF file ID */ const double time_offset) /* I [s] Current time offset */ { /* NB: nco_cnv_arm_time_mk() with same nc_id contains OpenMP critical region */ /* Purpose: Return time corresponding to current time offset */ double arm_time; int base_time_id; int rcd=NC_NOERR; /* [rcd] Return code */ nco_int base_time; /* Find base_time variable (NC_INT: base UNIX time of file) */ rcd=nco_inq_varid_flg(nc_id,"base_time",&base_time_id); if(rcd != NC_NOERR){ (void)fprintf(stderr,"%s: WARNING ARM file does not have variable \"base_time\", exiting nco_cnv_arm_time_mk()...\n",nco_prg_nm_get()); return -1; } /* end if */ { /* begin potential OpenMP critical */ /* Block is critical/thread-safe for identical/distinct in_id's */ (void)nco_get_var1(nc_id,base_time_id,0L,&base_time,NC_INT); } /* end potential OpenMP critical */ arm_time=base_time+time_offset; return arm_time; } /* end nco_cnv_arm_time_mk() */ void nco_cnv_arm_time_install /* [fnc] Add time variable to concatenated ARM files */ (const int nc_id, /* I [id] netCDF file ID */ const nco_int base_time_srt, /* I [s] base_time of first input file */ const int dfl_lvl) /* I [enm] Deflate level [0..9] */ { /* NB: nco_cnv_arm_time_install() contains OpenMP critical region */ /* Purpose: Add time variable to concatenated ARM files */ const char att_long_name[]="UNIX time"; const char att_units[]="seconds since 1970/01/01 00:00:00.00"; const char long_name_sng[]="long_name"; /* CEWI */ const char time_sng[]="time"; /* CEWI */ const char units_sng[]="units"; /* CEWI */ double *time_offset; int rcd=NC_NOERR; /* [rcd] Return code */ int time_id; int time_dmn_id; int time_offset_id; long idx; long srt=0L; long cnt; /* Synchronize output file */ (void)nco_sync(nc_id); /* Find time_offset variable */ rcd=nco_inq_varid_flg(nc_id,"time_offset",&time_offset_id); if(rcd != NC_NOERR){ (void)fprintf(stderr,"%s: WARNING ARM file does not have variable \"time_offset\", exiting nco_cnv_arm_time_install()...\n",nco_prg_nm_get()); return; } /* endif */ /* See if time variable already exists */ rcd=nco_inq_varid_flg(nc_id,time_sng,&time_id); if(rcd == NC_NOERR){ (void)fprintf(stderr,"%s: WARNING ARM file already has variable \"time\"\n",nco_prg_nm_get()); return; } /* endif */ /* See if time dimension exists */ rcd=nco_inq_dimid_flg(nc_id,time_sng,&time_dmn_id); if(rcd != NC_NOERR){ (void)fprintf(stderr,"%s: WARNING ARM file does not have dimension \"time\"\n",nco_prg_nm_get()); return; } /* endif */ /* Get dimension size */ (void)nco_inq_dimlen(nc_id,time_dmn_id,&cnt); /* If the time coordinate does not already exist, create it */ time_offset=(double *)nco_malloc(cnt*nco_typ_lng(NC_DOUBLE)); { /* begin potential OpenMP critical */ /* Block is critical/thread-safe for identical/distinct in_id's */ (void)nco_get_vara(nc_id,time_offset_id,&srt,&cnt,(void *)time_offset,NC_DOUBLE); } /* end potential OpenMP critical */ for(idx=0L;idx= 0) (void)nco_def_var_deflate(nc_id,time_id,(int)NC_SHUFFLE,(int)True,dfl_lvl); /* Add attributes for time variable */ (void)nco_put_att(nc_id,time_id,units_sng,NC_CHAR,(long int)(strlen(att_units)+1UL),(const void *)att_units); (void)nco_put_att(nc_id,time_id,long_name_sng,NC_CHAR,(long int)(strlen(att_long_name)+1UL),(const void *)att_long_name); /* Catenate time-stamped reminder onto "history" global attribute */ (void)nco_hst_att_cat(nc_id,"ncrcat added variable time=base_time+time_offset"); /* Take file out of define mode */ (void)nco_enddef(nc_id); /* Block is always critical */ { /* begin OpenMP critical */ /* Write time variable */ (void)nco_put_vara(nc_id,time_id,&srt,&cnt,(void *)time_offset,NC_DOUBLE); } /* end OpenMP critical */ /* Free time_offset buffer */ time_offset=(double *)nco_free(time_offset); return; /* 20050109: fxm added return to void function to squelch erroneous gcc-3.4.2 warning */ } /* end nco_cnv_arm_time_install */ nco_int /* O [s] Value of base_time variable */ nco_cnv_arm_base_time_get /* [fnc] Get base_time variable from ARM file */ (const int nc_id) /* I [id] netCDF file ID */ { /* NB: nco_cnv_arm_base_time_get() with same nc_id contains OpenMP critical region */ /* Purpose: Get base_time variable from ARM file */ int base_time_id; nco_int base_time; (void)nco_inq_varid(nc_id,"base_time",&base_time_id); /* Block is critical/thread-safe for identical/distinct in_id's */ { /* begin potential OpenMP critical */ (void)nco_get_var1(nc_id,base_time_id,0L,&base_time,NC_INT); } /* end potential OpenMP critical */ return base_time; } /* end nco_cnv_arm_base_time_get */ nco-4.5.4/src/nco/nco_cnv_arm.h000066400000000000000000000035101264355130400163100ustar00rootroot00000000000000/* $Header$ */ /* Purpose: ARM conventions */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_cnv_arm.h" *//* ARM conventions */ #ifndef NCO_CNV_ARM_H #define NCO_CNV_ARM_H /* Standard header files */ #include /* stderr, FILE, NULL, printf */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_att_utl.h" /* Attribute utilities */ #include "nco_mmr.h" /* Memory management */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nco_bool /* O [flg] File obeys ARM conventions */ nco_cnv_arm_inq /* O [fnc] Check if file obeys ARM conventions */ (const int nc_id); /* I [id] netCDF file ID */ double /* O [s] base_time + current time_offset */ nco_cnv_arm_time_mk /* [fnc] Return time corresponding to current time offset */ (const int nc_id, /* I [id] netCDF file ID */ const double time_offset); /* I [s] Current time offset */ void nco_cnv_arm_time_install /* [fnc] Add time variable to concatenated ARM files */ (const int nc_id, /* I [id] netCDF file ID */ const nco_int base_time_srt, /* I [s] base_time of first input file */ const int dfl_lvl); /* I [enm] Deflate level [0..9] */ nco_int /* O [s] Value of base_time variable */ nco_cnv_arm_base_time_get /* [fnc] Get base_time variable from ARM file */ (const int nc_id); /* I [id] netCDF file ID */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CNV_ARM_H */ nco-4.5.4/src/nco/nco_cnv_csm.c000066400000000000000000000630161264355130400163150ustar00rootroot00000000000000/* $Header$ */ /* Purpose: CCM/CCSM/CF conventions */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_cnv_csm.h" /* CCM/CCSM/CF conventions */ nco_bool /* O [flg] File obeys CCM/CCSM/CF conventions */ nco_cnv_ccm_ccsm_cf_inq /* O [fnc] Check if file obeys CCM/CCSM/CF conventions */ (const int nc_id) /* I [id] netCDF file ID */ { /* Purpose: Check if file adheres to CCM/CCSM/CF history tape format */ nco_bool CNV_CCM_CCSM_CF=False; char *att_val; char *cnv_sng=NULL_CEWI; /* netCDF standard is uppercase Conventions, though some models user lowercase */ char cnv_sng_UC[]="Conventions"; /* Unidata standard string (uppercase) */ char cnv_sng_LC[]="conventions"; /* Unidata non-standard string (lowercase) */ int rcd; /* [rcd] Return code */ long att_sz; nc_type att_typ; /* Look for signature of a CCM/CCSM/CF-format file */ cnv_sng=cnv_sng_UC; rcd=nco_inq_att_flg(nc_id,NC_GLOBAL,cnv_sng,&att_typ,&att_sz); if(rcd != NC_NOERR){ /* Re-try with lowercase string because some models, e.g., CLM, user lowercase "conventions" */ cnv_sng=cnv_sng_LC; rcd=nco_inq_att_flg(nc_id,NC_GLOBAL,cnv_sng,&att_typ,&att_sz); } /* endif lowercase */ if(rcd == NC_NOERR && att_typ == NC_CHAR){ /* Add one for NUL byte */ att_val=(char *)nco_malloc(att_sz*nco_typ_lng(att_typ)+1L); (void)nco_get_att(nc_id,NC_GLOBAL,cnv_sng,att_val,att_typ); /* NUL-terminate convention attribute before using strcmp() */ att_val[att_sz]='\0'; /* CCM3, CCSM1 conventions */ if(strstr(att_val,"NCAR-CSM")) CNV_CCM_CCSM_CF=True; /* Backwards compatibility */ /* Climate-Forecast conventions */ if(strstr(att_val,"CF-1.")) CNV_CCM_CCSM_CF=True; /* NB: Not fully implemented TODO nco145 */ /* As of 20060514, CLM 3.0 uses CF1.0 not CF-1.0 (CAM gets it right) */ if(strstr(att_val,"CF1.")) CNV_CCM_CCSM_CF=True; /* NB: Not fully implemented TODO nco145 */ if(CNV_CCM_CCSM_CF && nco_dbg_lvl_get() >= nco_dbg_std){ (void)fprintf(stderr,"%s: CONVENTION File \"%s\" attribute is \"%s\"\n",nco_prg_nm_get(),cnv_sng,att_val); if(cnv_sng == cnv_sng_LC) (void)fprintf(stderr,"%s: WARNING: This file uses a non-standard attribute (\"%s\") to indicate the netCDF convention. The correct attribute is \"%s\".\n",nco_prg_nm_get(),cnv_sng_LC,cnv_sng_UC); /* Only warn in arithmetic operators where conventions change behavior */ if(nco_dbg_lvl_get() >= nco_dbg_fl && nco_dbg_lvl_get() != nco_dbg_dev && nco_is_rth_opr(nco_prg_id_get())) (void)fprintf(stderr,"%s: INFO NCO attempts to abide by many official and unofficial metadata conventions including ARM, CCM, CCSM, and CF. To adhere to these conventions, NCO implements variable-specific exceptions in certain operators, e.g., ncbo will not subtract variables named \"date\" or \"gw\", and many operators will always leave coordinate variables unchanged. The full list of exceptions is in the manual http://nco.sf.net/nco.html#CF\n",nco_prg_nm_get()); } /* endif dbg */ att_val=(char *)nco_free(att_val); } /* endif */ return CNV_CCM_CCSM_CF; } /* end nco_cnv_ccm_ccsm_cf_inq */ void nco_cnv_ccm_ccsm_cf_date /* [fnc] Fix date variable in averaged CCM/CCSM/CF files */ (const int nc_id, /* I [id] netCDF file ID */ X_CST_PTR_CST_PTR_Y(var_sct,var), /* I/O [sct] Variables in output file */ const int nbr_var) /* I [nbr] Number of variables in list */ { /* Purpose: Fix date variable in averaged CCM/CCSM/CF files */ char wrn_sng[1000]; int date_idx; int idx; int rcd=NC_NOERR; /* [rcd] Return code */ int time_idx; int nbdate_id; nco_int day; nco_int date; nco_int nbdate; (void)sprintf(wrn_sng,"Most, but not all, CCM/CCSM/CF files which are in CCM format contain the fields \"nbdate\", \"time\", and \"date\". When the \"date\" field is present but either \"nbdate\" or \"time\" is missing, then %s is unable to construct a meaningful average \"date\" to store in the output file. Therefore the \"date\" variable in your output file may be meaningless.\n",nco_prg_nm_get()); /* Find date variable (NC_INT: current date as 6 digit integer (YYMMDD)) */ for(idx=0;idxnm,"date")) break; } /* end loop over idx */ if(idx == nbr_var) return; else date_idx=idx; // if(var[date_idx]->type != NC_INT) return; /* 20101026 TODO nco998 problem is that "date" type is NC_DOUBLE here */ /* Find scalar nbdate variable (NC_INT: base date date as 6 digit integer (YYMMDD)) */ rcd=nco_inq_varid_flg(nc_id,"nbdate",&nbdate_id); if(rcd != NC_NOERR){ (void)fprintf(stderr,"%s: WARNING CCM/CCSM/CF convention file output variable list contains \"date\" but not \"nbdate\"\n",nco_prg_nm_get()); (void)fprintf(stderr,"%s: %s",nco_prg_nm_get(),wrn_sng); return; } /* endif */ { /* begin potential OpenMP critical */ /* Block is critical/thread-safe for identical/distinct in_id's */ (void)nco_get_var1(nc_id,nbdate_id,0L,&nbdate,NC_INT); } /* end potential OpenMP critical */ /* Find time variable (NC_DOUBLE: current day since nbdate) */ for(idx=0;idxnm,"time")) break; } /* end loop over idx */ if(idx == nbr_var){ (void)fprintf(stderr,"%s: WARNING CCM/CCSM/CF convention file output variable list contains \"date\" and \"nbdate\" yet lacks \"time\"\n",nco_prg_nm_get()); (void)fprintf(stderr,"%s: %s",nco_prg_nm_get(),wrn_sng); return; }else{ time_idx=idx; } /* endif */ /* Assign current day to averaged day number */ day=(nco_int)(var[time_idx]->val.dp[0]); /* Recompute date variable based on new (averaged) day number */ date=nco_newdate(nbdate,day); if(var[date_idx]->type == NC_INT){ if(!var[date_idx]->val.ip) return; else var[date_idx]->val.ip[0]=date; }else if(var[date_idx]->type == NC_DOUBLE){ if(!var[date_idx]->val.dp) return; else var[date_idx]->val.dp[0]=date; }else{ (void)fprintf(stderr,"%s: WARNING CCM/CCSM/CF convention file output variable \"date\" is not NC_INT or NC_DOUBLE\n",nco_prg_nm_get()); } /* end else */ return; /* 20050109: fxm added return to void function to squelch erroneous gcc-3.4.2 warning */ } /* end nco_cnv_ccm_ccsm_cf_date */ nm_id_sct * /* O [sct] Extraction list */ nco_cnv_cf_crd_add /* [fnc] Add coordinates defined by CF convention */ (const int nc_id, /* I netCDF file ID */ nm_id_sct *xtr_lst, /* I/O current extraction list (destroyed) */ int * const xtr_nbr) /* I/O number of variables in current extraction list */ { /* Purpose: Detect coordinates specified by CF convention and add them to extraction list http://www.cgd.ucar.edu/cms/eaton/cf-metadata/CF-1.0.html#grid_ex2 */ const char dlm_sng[]=" "; /* [sng] Delimiter string */ const char fnc_nm[]="nco_cnv_cf_crd_add()"; /* [sng] Function name */ char **crd_lst; /* [sng] 1D array of list elements */ char *att_val; char att_nm[NC_MAX_NAME]; int crd_id; int idx_att; int idx_crd; int idx_var; int idx_var2; int nbr_att; int nbr_crd; /* [nbr] Number of coordinates specified in "coordinates" attribute */ int rcd=NC_NOERR; /* [rcd] Return code */ int var_id; long att_sz; nc_type att_typ; /* ...for each variable in extraction list... */ for(idx_var=0;idx_var<*xtr_nbr;idx_var++){ /* Eschew indirection */ var_id=xtr_lst[idx_var].id; /* Find number of attributes */ (void)nco_inq_varnatts(nc_id,var_id,&nbr_att); for(idx_att=0;idx_att 0) (void)nco_get_att(nc_id,var_id,att_nm,(void *)att_val,NC_CHAR); /* NUL-terminate attribute */ att_val[att_sz]='\0'; /* Split list into separate coordinate names */ /* using nco_lst_prs_sgl_2D() and not nco_lst_prs_2D */ /* see TODO 944 */ crd_lst=nco_lst_prs_sgl_2D(att_val,dlm_sng,&nbr_crd); /* ...for each coordinate in "coordinates" attribute... */ for(idx_crd=0;idx_crdnm_fll,trv_tbl); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,var_trv->grp_nm_fll); else grp_out_fll=(char *)strdup(var_trv->grp_nm_fll); /* Obtain output group ID */ (void)nco_inq_grp_full_ncid(out_id,grp_out_fll,&grp_out_id); /* Memory management after current extracted group */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); /* Get variable ID */ (void)nco_inq_varid(grp_out_id,var_trv->nm,&var_out_id); /* Initialize attribute-edit structure for this variable */ aed.var_nm=var_trv->nm; aed.id=var_out_id; aed.sz=0L; dmn_nbr_mch=0; flg_dpl=False; /* cell_methods format: blank-separated phrases of form "dmn1[, dmn2[...]]: op_typ", e.g., "lat, lon: mean" */ for(dmn_idx_var=0;dmn_idx_varnbr_dmn;dmn_idx_var++){ for(dmn_idx_rdc=0;dmn_idx_rdcnm_fll); /* Compare full names */ if(!strcmp(var_trv->var_dmn[dmn_idx_var].dmn_nm_fll,dmn_rdc[dmn_idx_rdc]->nm_fll)){ /* Add length of each matching dimension to accumulating attribute size */ aed.sz+=strlen(dmn_rdc[dmn_idx_rdc]->nm); dmn_mch[dmn_nbr_mch++]=dmn_idx_rdc; } /* !match */ } /* dmn_idx_rdc */ } /* dmn_idx_var */ assert(dmn_nbr_mch > 0); /* Preserve rule to always return averages (never extrema or other statistics) of coordinates */ if(var[var_idx]->is_crd_var) nco_op_typ_lcl=nco_op_avg; else nco_op_typ_lcl=nco_op_typ; /* NUL-terminate before concatenation */ att_op_sng[0]='\0'; switch(nco_op_typ_lcl){ /* Next five operations are defined in CF Conventions */ case nco_op_avg: strcpy(att_op_sng,"mean"); break; case nco_op_min: strcpy(att_op_sng,"minimum"); break; case nco_op_max: strcpy(att_op_sng,"maximum"); break; case nco_op_ttl: strcpy(att_op_sng,"sum"); break; case nco_op_avgsqr: strcpy(att_op_sng,"variance"); break; /* Mean of sum of squares */ /* Remaining operations are supported by NCO yet are not in CF Conventions */ case nco_op_mabs: strcpy(att_op_sng,"maximum_absolute_value"); break; /* Maximum absolute value */ case nco_op_mebs: strcpy(att_op_sng,"mean_absolute_value"); break; /* Mean absolute value */ case nco_op_mibs: strcpy(att_op_sng,"minimum_absolute_value"); break; /* Minimum absolute value */ case nco_op_sqravg: strcpy(att_op_sng,"square_of_mean"); break; /* Square of mean */ case nco_op_sqrt: strcpy(att_op_sng,"square_root_of_mean"); break; /* Square root of mean */ case nco_op_rms: strcpy(att_op_sng,"root_mean_square"); break; /* Root-mean-square (normalized by N) */ case nco_op_rmssdn: strcpy(att_op_sng,"root_mean_square_nm1"); break; /* Root-mean square normalized by N-1 */ case nco_op_nil: /* nco_op_nil, Undefined operation type */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: DEBUG %s reports variable %s cell_method not implemented for operation %d\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,nco_op_typ); continue; } /* End switch */ /* Initialize to size of ": " plus length of operation string */ aed.sz+=2L+strlen(att_op_sng); /* Add room for commas and spaces, i.e., "dmn1, dmn2, dmn3" */ if(dmn_nbr_mch > 1) aed.sz+=2*(dmn_nbr_mch-1); /* Add room for NUL-terminator */ aed.val.cp=(char *)nco_malloc((aed.sz+1L)*sizeof(char)); aed.val.cp[0]='\0'; /* Build single string by concatenating known matches */ for(int dmn_idx_mch=0;dmn_idx_mchnm); if(dmn_idx_mch=dmn_nbr_mch */ (void)strcat(aed.val.cp,": "); (void)strcat(aed.val.cp,att_op_sng); /* 20150625: Older versions of CAM, e.g., CAM3, used "cell_method" instead of "cell_methods" If old attribute is not deleted then the output file will contain both attributes Does variable already have "cell_method" attribute? */ strcpy(aed.att_nm,"cell_method"); rcd=nco_inq_att_flg(grp_out_id,var_out_id,aed.att_nm,&att_typ,&att_lng); if(rcd == NC_NOERR){ if(FIRST_WARNING) (void)fprintf(stderr,"%s: WARNING: Variable \"%s\" uses the non-standard attribute name \"cell_method\" instead of \"cell_methods\", the correct attribute name. The CAM3 model (and others?) have this problem. Expect \"double attributes\" in output. This message is printed only once per invocation, although the problem likely occurs in more variables.\n",nco_prg_nm_get(),aed.var_nm); FIRST_WARNING=False; } /* endif attribute exists */ /* Does variable already have "cell_methods" attribute? */ strcpy(aed.att_nm,"cell_methods"); rcd=nco_inq_att_flg(grp_out_id,var_out_id,aed.att_nm,&att_typ,&att_lng); if(rcd == NC_NOERR){ if(att_typ == NC_STRING) (void)fprintf(stderr,"%s: WARNING %s reports existing cell_methods attribute for variable %s is type NC_STRING. Unpredictable results...\n",nco_prg_nm_get(),fnc_nm,aed.var_nm); if(att_typ != NC_STRING && att_typ != NC_CHAR) (void)fprintf(stderr,"%s: WARNING %s reports existing cell_methods attribute for variable %s is type %s. Unpredictable results...\n",nco_prg_nm_get(),fnc_nm,aed.var_nm,nco_typ_sng(att_typ)); /* 20150625: Often climatologies are multiply-averaged over time For example, climate model output is often archived as monthly means in each gridcell The cell_methods attribute of these monthly data begin as "time: mean" (i.e., monthly mean). We then create a climatology by a sequence of one or two more temporal-averaging steps The one-step method puts all the months in the hopper and averages those Variables in the resultiing file may have cell_methods = "time: mean time: mean" The two-step method first averages the months into four climatological seasons Then it averages those four seasons into the climatological annual mean Variables in the resultiing file may have cell_methods = "time: mean time: mean time: mean" To avoid this redundancy, we check that the new cell_method does not duplicate the old If it would, then skip adding the new */ ptr_unn val_old; /* [sng] Old cell_methods attribute */ val_old.vp=(void *)nco_malloc((att_lng+1L)*sizeof(char)); (void)nco_get_att(grp_out_id,var_out_id,aed.att_nm,val_old.vp,NC_CHAR); val_old.cp[att_lng]='\0'; if(strstr(val_old.cp,aed.val.cp)) flg_dpl=True; if(val_old.vp) val_old.vp=(void *)nco_free(val_old.vp); aed.mode=aed_append; /* Insert space between existing attribute and appended attribute */ att_val_cpy=(char *)strdup(aed.val.cp); /* Add one for space character */ aed.sz++; /* Add one for NUL-terminator */ aed.val.cp=(char *)nco_realloc(aed.val.cp,(aed.sz+1L)*sizeof(char)); aed.val.cp[0]=' '; aed.val.cp[1]='\0'; (void)strncat(aed.val.cp,att_val_cpy,aed.sz-1L); if(att_val_cpy) att_val_cpy=(char *)nco_free(att_val_cpy); }else{ aed.mode=aed_create; } /* endif attribute exists */ /* Edit attribute */ if(!flg_dpl) (void)nco_aed_prc(grp_out_id,var_out_id,aed); /* 20150308 */ /* Does variable already have "coordinates" attribute? NB: This reuses att_nm which has only enough space to hold "cell_methods" */ strcpy(aed.att_nm,"coordinates"); rcd=nco_inq_att_flg(grp_out_id,var_out_id,aed.att_nm,&att_typ,&att_lng); if(rcd == NC_NOERR && att_typ == NC_CHAR){ /* Remove reduced dimensions from coordinates string coordinates format: blank-separated names of form "dmn1 [dmn2 [...]] dmnN", e.g., "time lat lon" */ /* Add room for NUL-terminator */ att_val=(char *)nco_malloc((att_lng+1L)*sizeof(char)); rcd=nco_get_att(grp_out_id,var_out_id,aed.att_nm,att_val,att_typ); /* Reset value from previous use */ aed.val.cp[0]='\0'; att_val[att_lng]='\0'; mlt_dmn_rdc=False; assert(rcd == NC_NOERR); for(dmn_idx_var=0;dmn_idx_varnbr_dmn;dmn_idx_var++){ for(dmn_idx_rdc=0;dmn_idx_rdcvar_dmn[dmn_idx_var].dmn_nm_fll,dmn_rdc[dmn_idx_rdc]->nm_fll)){ if(mlt_dmn_rdc){ /* At least one other dimension has already been reduced/excised Hence multiple dimensions of this variable may be reduced Start next excision from ending point of last excision, not from disk-values */ strcpy(att_val,aed.val.cp); att_lng=strlen(aed.val.cp); } /* endif */ /* Is dimension in current (possibly locally-modified) "coordinates" attribute? NB: Assume short name not full name */ if((sbs_ptr=strstr(att_val,dmn_rdc[dmn_idx_rdc]->nm))){ /* Is this the only dimension in "coordinates" attribute? */ if(!strcmp(dmn_rdc[dmn_idx_rdc]->nm,att_val)){ /* Variable will become scalar so delete "coordinates" attribute */ aed.mode=aed_delete; }else{ /* endif scalar */ /* Excise dimension from "coordinates" attribute */ dmn_sng_lng=strlen(dmn_rdc[dmn_idx_rdc]->nm); sbs_sng_lng=(size_t)(sbs_ptr-att_val); aed.mode=aed_overwrite; /* If dimension to excise is trailed by a space, also remove the space, i.e., count it as part of dimension string True for all dimensions except final dimension (trailed by a NUL, not a space) */ if(sbs_ptr[dmn_sng_lng] == ' ') dmn_sng_lng++; aed.sz=att_lng-dmn_sng_lng; /* Add one for NUL-terminator */ aed.val.cp=(char *)nco_realloc(aed.val.cp,(aed.sz+1L)*sizeof(char)); strncpy(aed.val.cp,att_val,sbs_sng_lng); aed.val.cp[sbs_sng_lng]='\0'; strcat(aed.val.cp,sbs_ptr+dmn_sng_lng); } /* endelse scalar */ /* Edit attribute */ (void)nco_aed_prc(grp_out_id,var_out_id,aed); mlt_dmn_rdc=True; } /* !match attribute */ } /* !match variable */ } /* dmn_idx_rdc */ } /* dmn_idx_var */ } /* endif attribute exists */ if(att_val) att_val=(char *)nco_free(att_val); if(aed.val.cp) aed.val.cp=(char *)nco_free(aed.val.cp); } /* var_idx >= var_nbr */ if(aed.att_nm) aed.att_nm=(char *)nco_free(aed.att_nm); if(dmn_mch) dmn_mch=(int *)nco_free(dmn_mch); return NC_NOERR; } /* end nco_cnv_cf_cll_mth_add() */ int nco_rdc_sng_to_op_typ /* [fnc] Convert operation string to integer */ (const char * const att_op_sng) /* [fnc] Operation string */ { if(!strcmp(att_op_sng,"mabs")) return nco_op_mabs; if(!strcmp(att_op_sng,"mebs")) return nco_op_mebs; if(!strcmp(att_op_sng,"mibs")) return nco_op_mibs; if(!strcmp(att_op_sng,"mean")) return nco_op_avg; if(!strcmp(att_op_sng,"minimum")) return nco_op_min; if(!strcmp(att_op_sng,"maximum")) return nco_op_max; if(!strcmp(att_op_sng,"sum")) return nco_op_ttl; if(!strcmp(att_op_sng,"sqravg")) return nco_op_sqravg; if(!strcmp(att_op_sng,"avgsqr")) return nco_op_avgsqr; if(!strcmp(att_op_sng,"sqrt")) return nco_op_sqrt; if(!strcmp(att_op_sng,"rms")) return nco_op_rms; if(!strcmp(att_op_sng,"rmssdn")) return nco_op_rmssdn; return False; /* Statement should not be reached */ } /* nco_rdc_sng_to_op_typ() */ const char * /* O [sng] String describing operation type */ nco_op_typ_to_rdc_sng /* [fnc] Convert operation type to string */ (const int nco_op_typ) /* I [enm] Operation type */ { switch(nco_op_typ){ case nco_op_avg: return "mean"; case nco_op_mabs: return "mabs"; case nco_op_mebs: return "mebs"; case nco_op_mibs: return "mibs"; case nco_op_min: return "minimum"; case nco_op_max: return "maximum"; case nco_op_ttl: return "sum"; case nco_op_sqravg: return "sqravg"; case nco_op_avgsqr: return "avgsqr"; case nco_op_sqrt: return "sqrt"; case nco_op_rms: return "rms"; case nco_op_rmssdn: return "rmssdn"; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ return False; /* Statement should not be reached */ } /* nco_op_typ_to_rdc_sng() */ nco-4.5.4/src/nco/nco_cnv_csm.h000066400000000000000000000057651264355130400163310ustar00rootroot00000000000000/* $Header$ */ /* Purpose: CCM/CCSM/CF conventions */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_cnv_csm.h" *//* CCM/CCSM/CF conventions */ #ifndef NCO_CNV_CCSM_H #define NCO_CNV_CCSM_H /* Standard header files */ #include /* stderr, FILE, NULL, printf */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_cln_utl.h" /* Calendar utilities */ #include "nco_lst_utl.h" /* List utilities */ #include "nco_mmr.h" /* Memory management */ #include "nco_sng_utl.h" /* String utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ nco_bool /* O [flg] File obeys CCM/CCSM/CF conventions */ nco_cnv_ccm_ccsm_cf_inq /* O [fnc] Check if file obeys CCM/CCSM/CF conventions */ (const int nc_id); /* I [id] netCDF file ID */ void nco_cnv_ccm_ccsm_cf_date /* [fnc] Fix date variable in averaged CCSM files */ (const int nc_id, /* I [id] netCDF file ID */ X_CST_PTR_CST_PTR_Y(var_sct,var), /* I/O [sct] Variables in output file */ const int nbr_var); /* I [nbr] Number of variables in list */ nm_id_sct * /* O [sct] Extraction list */ nco_cnv_cf_crd_add /* [fnc] Add coordinates defined by CF convention */ (const int nc_id, /* I netCDF file ID */ nm_id_sct *xtr_lst, /* I/O current extraction list (destroyed) */ int * const xtr_nbr); /* I/O number of variables in current extraction list */ int /* [rcd] Return code */ nco_cnv_cf_cll_mth_add /* [fnc] Add cell_methods attributes */ (const int out_id, /* I [id] netCDF file ID */ var_sct * const * const var, /* I [sct] Variable to reduce (e.g., average) (destroyed) */ const int var_nbr, /* I [nbr] Number of variables to be defined */ dmn_sct * const * const dmn, /* I [sct] Dimensions over which to reduce variable */ const int dmn_nbr, /* I [sct] Number of dimensions to reduce variable over */ const int nco_op_typ, /* I [enm] Operation type, default is average */ gpe_sct *gpe, /* [sng] Group Path Editing (GPE) structure */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ int /* I [enm] Operation type */ nco_rdc_sng_to_op_typ /* [fnc] Convert operation string to integer */ (const char * const att_op_sng); /* I [sng] Operation string */ const char * /* O [sng] String describing operation type */ nco_op_typ_to_rdc_sng /* [fnc] Convert operation type to string */ (const int nco_op_typ); /* I [enm] Operation type */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CNV_CCSM_H */ nco-4.5.4/src/nco/nco_ctl.c000066400000000000000000002033701264355130400154460ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Program flow control functions */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_ctl.h" /* Program flow control functions */ const char * /* O [sng] Compiler and version */ nco_cmp_get(void) /* [fnc] Return compiler and version */ { /* Purpose: Return string containing compiler and version */ const char fnc_nm[]="nco_cmp_get()"; #if defined(_AIX) && !defined(__GNUC__) && !defined(__xlC__) #define NCO_XLC_LIKELY static const char cmp_nm[]="xlc"; /* [sng] Compiler name */ static const char cmp_sng[]="Token _AIX defined in nco_cmp_get(), probably compiled with AIX xlc_r or xlc"; /* [sng] Compiler string */ #endif /* !_AIX */ #if defined(__xlC__) #define NCO_XLC_LIKELY static const char cmp_nm[]="xlC"; /* [sng] Compiler name */ static const char cmp_sng[]="Token __xlC__ defined in nco_cmp_get(), probably compiled with AIX xlC_r or xlC"; /* [sng] Compiler string */ #endif /* !__xlC__ */ #if defined(__GNUC__) && !defined(__clang) && !defined(__INTEL_COMPILER) && !defined(__PATHCC__) && !defined(PGI_CC) /* Testing for GCC macros early is dangerous because some compilers, including Intel's, define GCC macros for compatibility */ #if defined(__GNUG__) static const char cmp_nm[]="g++"; /* [sng] Compiler name */ static const char cmp_sng[]="Token __GNUG__ defined in nco_cmp_get(). Compiled with GNU g++ (or a compiler that emulates g++)."; /* [sng] Compiler string */ #else /* !__GNUG__ */ static const char cmp_nm[]="gcc"; /* [sng] Compiler name */ static const char cmp_sng[]="Token __GNUC__ defined in nco_cmp_get(). Compiled with GNU gcc (or a compiler that emulates gcc)."; /* [sng] Compiler string */ #endif /* !__GNUG__ */ static const char cmp_vrs[]=TKN2SNG(__VERSION__); // [sng] Compiler version static const char cmp_vrs_mjr[]=TKN2SNG(__GNUC__); // [sng] Compiler major version static const char cmp_vrs_mnr[]=TKN2SNG(__GNUC_MINOR__); // [sng] Compiler minor version static const char cmp_vrs_pch[]=TKN2SNG(__GNUC_PATCHLEVEL__); // [sng] Compiler patch version if(nco_dbg_lvl_get() >= nco_dbg_fl){ (void)fprintf(stderr,"%s: INFO GCC major version is %s\n",nco_prg_nm_get(),cmp_vrs_mjr); (void)fprintf(stderr,"%s: INFO GCC minor version is %s\n",nco_prg_nm_get(),cmp_vrs_mnr); (void)fprintf(stderr,"%s: INFO GCC patch version is %s\n",nco_prg_nm_get(),cmp_vrs_pch); } /* endif dbg */ if(nco_dbg_lvl_get() >= nco_dbg_std){ (void)fprintf(stderr,"%s: INFO GCC version is %s\n",nco_prg_nm_get(),cmp_vrs); } /* endif dbg */ #endif /* !__GNUC__ */ #ifdef __clang /* Some compilers, including clang, also define __GNUC__ by default */ static const char cmp_nm[]="clang"; static const char cmp_sng[]="Token __clang defined in nco_cmp_get(), probably compiled with LLVM clang"; /* [sng] Compiler string */ #endif /* !__clang */ #ifdef __INTEL_COMPILER /* Some compilers, including icc, also define __GNUC__ by default */ static const char cmp_nm[]="icc"; static const char cmp_sng[]="Token __INTEL_COMPILER defined in nco_cmp_get(), probably compiled with Intel icc"; /* [sng] Compiler string */ #endif /* !__INTEL_COMPILER */ #ifdef __PATHCC__ /* Some compilers, including pathcc, also define __GNUC__ by default */ static const char cmp_nm[]="pathcc"; static const char cmp_sng[]="Token __PATHCC__ defined in nco_cmp_get(), probably compiled with PathScale (Qlogic) pathcc"; /* [sng] Compiler string */ #endif /* !__PATHCC__ */ #ifdef PGI_CC static const char cmp_nm[]="pgcc"; static const char cmp_sng[]="Token PGI_CC defined in nco_cmp_get(), probably compiled with PGI pgcc"; /* [sng] Compiler string */ #endif /* !PGI_CC */ /* No tokens matched */ #if !defined(NCO_XLC_LIKELY) && !defined(__clang) && !defined(__GNUC__) && !defined(__INTEL_COMPILER) && !defined(__PATHCC__) && !defined(PGI_CC) /* Unknown compiler */ static const char cmp_nm[]="unknown"; /* [sng] Compiler name */ static const char cmp_sng[]="Unknown compiler tokens in nco_cmp_get(), compiler is unknown"; /* [sng] Compiler string */ #endif /* !unknown */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s reports compiler name is \"%s\"\n%s\n",nco_prg_nm_get(),fnc_nm,cmp_nm,cmp_sng); return cmp_nm; } /* end nco_cmp_get() */ const char * /* O [sng] MPI implementation */ nco_mpi_get(void) /* [fnc] Return MPI implementation */ { /* Purpose: Return string containing MPI implementation information */ const char fnc_nm[]="nco_mpi_get()"; #ifdef _H_MPI static const char mpi_nm[]="PPE"; /* [sng] MPI name */ static const char mpi_sng[]="Token _H_MPI defined in nco_mpi_get(), MPI environment is probably AIX PPE MPI"; /* [sng] MPI string */ #endif /* !_H_MPI */ #ifdef LAM_MPI static const char mpi_nm[]="LAM"; /* [sng] MPI name */ static const char mpi_sng[]="Token LAM_MPI defined in nco_mpi_get(), MPI environment is probably LAM-MPI"; /* [sng] MPI string */ #endif /* !LAM_MPI */ #if MPICH_NAME == '1' static const char mpi_nm[]="MPICH"; /* [sng] MPI name */ static const char mpi_sng[]="Token MPICH_NAME defined to 1 in nco_mpi_get(), MPI environment is probably MPICH version 1"; /* [sng] MPI string */ #endif /* !MPICH_NAME */ #ifdef MPICH2 static const char mpi_nm[]="MPICH2"; /* [sng] MPI name */ static const char mpi_sng[]="Token MPICH2 defined in nco_mpi_get(), MPI environment is probably MPICH2, i.e., MPICH version 2"; /* [sng] MPI string */ #endif /* !MPICH2 */ #ifdef OMPI_MPI_H static const char mpi_nm[]="OPENMPI"; /* [sng] MPI name */ static const char mpi_sng[]="Token OMPI_MPI_H defined in nco_mpi_get(), MPI environment is probably OpenMPI"; /* [sng] MPI string */ #endif /* !OMPI_MPI_H */ /* In case no token matched */ #if !defined(_H_MPI) && !defined(LAM_MPI) && (MPICH_NAME != '1') && !defined(MPICH2) && !defined(OMPI_MPI_H) #ifndef MPI_VERSION /* MPI is not installed */ static const char mpi_nm[]="none"; /* [sng] MPI name */ static const char mpi_sng[]="No MPI tokens found in nco_mpi_get(), MPI environment is not active"; /* [sng] MPI string */ #else /* MPI_VERSION */ /* Unknown MPI implementation */ static const char mpi_nm[]="unknown"; /* [sng] MPI name */ static const char mpi_sng[]="Unknown MPI tokens found in nco_mpi_get(), MPI environment is present and of unknown pedigree"; /* [sng] MPI string */ #endif /* MPI_VERSION */ #endif /* !unknown */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s reports MPI implementation name is \"%s\"\n%s\n",nco_prg_nm_get(),fnc_nm,mpi_nm,mpi_sng); return mpi_nm; } /* end nco_mpi_get() */ int /* O [rcd] Return code */ nco_ddra /* [fnc] Count operations */ (const char * const var_nm, /* I [sng] Variable name */ const char * const wgt_nm, /* I [sng] Weight name */ const ddra_info_sct * const ddra_info) /* I [sct] DDRA information */ { /* Purpose: Estimate operation counts required */ /* 20070509 CEWI RUVICFFU: ntg_nbr_rdc_dfl, ntg_nbr_nrm_dfl, flp_nbr_rdc_dfl, flp_nbr_nrm_dfl, rnk_avg */ const char fnc_nm[]="nco_ddra()"; /* Following speed parameter estimates are for clay.ess.uci.edu clay is the dual opteron used in ppr_ZeM07 */ const float ntg_nbr_brd_fdg_fct=1.8f; /* [frc] Empirical correction to broadcasting */ const float spd_flp_ncwa=153e6f; /* [# s-1] Floating point operation speed */ const float spd_ntg_ncwa=200e6f; /* [# s-1] Integer operation speed */ const float spd_flp_ncbo=353.2e6f; /* [# s-1] Floating point operation speed */ const float spd_ntg_ncbo=1386.54e6f; /* [# s-1] Integer operation speed */ const float spd_rd=63.375e6f; /* [B s-1] Disk read bandwidth */ const float spd_wrt=57.865e6f; /* [B s-1] Disk write bandwidth */ /* 20060602: hjm estimates faster speeds for ncbo: spd_flp_ncbo = 353.2e6: Based on unoptimized operations in tacg function spd_ntg_ncbo = 1386.54e6: Based on counting unoptimized operations in tacg function hjm estimates slower speeds for ncwa: spd_flp_ncwa = 153e6: Based on direct PAPI measures spd_ntg_ncwa = 200e6: Based on direct measure, using large data set, calculating backwards */ float spd_flp=float_CEWI; /* [# s-1] Floating point operation speed */ float spd_ntg=float_CEWI; /* [# s-1] Integer operation speed */ int rcd=NC_NOERR; /* [rcd] Return code */ /* Timer information */ static clock_t tm_obs_old; /* [us] Microseconds initially */ static float tm_obs_ttl=0.0; /* [s] Total seconds elapsed */ clock_t tm_obs_crr; /* [us] Microseconds currently */ float tm_obs_dff; /* [s] Seconds elapsed */ /* Cumulative file costs */ static long long lmn_nbr_ttl=0LL; /* I/O [nbr] Cumulative variable size */ static long long ntg_nbr_ttl=0LL; /* I/O [nbr] Cumulative integer operations */ static long long flp_nbr_ttl=0LL; /* I/O [nbr] Cumulative floating point operations */ /* Cumulative times */ static float tm_ntg_ttl=0.0f; /* I/O [s] Cumulative integer time */ static float tm_flp_ttl=0.0f; /* I/O [s] Cumulative floating point time */ static float tm_rd_ttl=0.0f; /* I/O [s] Cumulative read time */ static float tm_wrt_ttl=0.0f; /* I/O [s] Cumulative write time */ static float tm_io_ttl=0.0f; /* [s] I/O time */ static float tm_ttl=0.0f; /* I/O [s] Cumulative time */ /* Current variable costs */ float tm_ntg; /* [s] Integer time */ float tm_flp; /* [s] Floating point time */ float tm_rd; /* [s] Read time */ float tm_wrt; /* [s] Write time */ float tm_io=float_CEWI; /* [s] I/O time */ float tm_crr=float_CEWI; /* [s] Time for this variable */ long long ntg_nbr=long_long_CEWI; /* [nbr] Integer operations */ long long flp_nbr=long_long_CEWI; /* [nbr] Floating point operations */ long long rd_nbr_byt=long_long_CEWI; /* [B] Bytes read */ long long wrt_nbr_byt=long_long_CEWI; /* [B] Bytes written */ /* Summary statistics */ float tm_frc_flp_ttl=float_CEWI; /* [frc] Floating point time fraction */ float tm_frc_io_ttl=float_CEWI; /* [frc] I/O time fraction */ float tm_frc_ntg_ttl=float_CEWI; /* [frc] Integer time fraction */ float tm_frc_rd_ttl=float_CEWI; /* [frc] Read time fraction */ float tm_frc_wrt_ttl=float_CEWI; /* [frc] Write time fraction */ /* Default algorithm costs if invoked */ long long ntg_nbr_byt_swp_dfl; /* [nbr] Integer operations for byte-swap */ long long ntg_nbr_brd_dfl; /* [nbr] Integer operations for broadcasting */ long long ntg_nbr_clc_dfl; /* [nbr] Integer operations for collection */ /* long long ntg_nbr_rdc_dfl; */ /* [nbr] Integer operations for reduction */ /* long long ntg_nbr_nrm_dfl; */ /* [nbr] Integer operations for normalization */ long long flp_nbr_bnr_dfl; /* [nbr] Floating point operations for binary arithmetic */ /* long long flp_nbr_rdc_dfl; */ /* [nbr] Floating point operations for reduction */ /* long long flp_nbr_nrm_dfl; */ /* [nbr] Floating point operations for normalization */ /* Initialize all algorithm counts for this variable to zero then increment */ long long ntg_nbr_byt_swp=0LL; /* [nbr] Integer operations for byte-swap */ long long ntg_nbr_brd=0LL; /* [nbr] Integer operations for broadcasting */ long long ntg_nbr_clc=0LL; /* [nbr] Integer operations for collection */ long long ntg_nbr_rdc=0LL; /* [nbr] Integer operations for reduction */ long long ntg_nbr_nrm=0LL; /* [nbr] Integer operations for normalization */ long long flp_nbr_bnr=0LL; /* [nbr] Floating point operations for binary arithmetic */ long long flp_nbr_rdc=0LL; /* [nbr] Floating point operations for reduction */ long long flp_nbr_nrm=0LL; /* [nbr] Floating point operations for normalization */ /* Copies of DDRA information */ int nco_op_typ; /* [enm] Operation type */ /* int rnk_avg; */ /* [nbr] Rank of averaging space */ int rnk_var; /* [nbr] Variable rank (in input file) */ int rnk_wgt; /* [nbr] Rank of weight */ int var_idx=int_CEWI; /* [enm] Index */ int wrd_sz; /* [B] Bytes per element */ long long lmn_nbr=int_CEWI; /* [nbr] Variable size */ long long lmn_nbr_avg; /* [nbr] Averaging block size */ long long lmn_nbr_wgt; /* [nbr] Weight size */ nco_bool MRV_flg; /* [flg] Avergaging dimensions are MRV dimensions */ nco_bool wgt_brd_flg; /* [flg] Broadcast weight for this variable */ /* Locals */ long long lmn_nbr_out=long_long_CEWI; /* [nbr] Output elements */ /* Where possible, work in terms of "default" counts per algorithm Algorithms (e.g., reduction, byte-swapping) are generally subroutines Record hand-counted counts in only one place This makes it easier and less error-prone to propagate optimizations Also, easier to think in terms of procedures than raw counts Algorithms for subtraction: "byte_swap+byte_swap+binary_arithmetic+byte_swap" Algorithms for non-weighted, non-MRV averaging: "byte_swap(input)+collection+reduction+normalization+byte_swap(output)" Algorithms for non-weighted, MRV averaging: "byte_swap(input)+reduction+normalization+byte_swap(output)" Algorithms for weighted, non-MRV averaging: "byte_swap(input)+byte_swap(weight)+broadcast(weight)+ collection(numerator)+collection(denominator)+ binary_arithmetic(weight*value)+ reduction(numerator)+reduction(denominator)+ normalization(numerator)+normalization(denominator)+byte_swap(output)" Units: [nbr] = Operation counts for lmn_nbr elements [nbr nbr-1] = Operation counts per element */ switch(ddra_info->tmr_flg){ case nco_tmr_srt: /* [enm] Initialize timer (first timer call) */ tm_obs_crr=clock(); tm_obs_old=tm_obs_crr; return rcd; /* [rcd] Return code */ break; case nco_tmr_mtd: /* [enm] Metadata timer (second timer call) */ case nco_tmr_end: /* [enm] Close timer (last timer call) */ goto update_timers; break; case nco_tmr_rgl: /* [enm] Regular timer call (main loop timer call) */ break; default: nco_dfl_case_tmr_typ_err(); break; } /* end switch */ /* Decode input */ MRV_flg=ddra_info->MRV_flg; /* [flg] Avergaging dimensions are MRV dimensions */ lmn_nbr=ddra_info->lmn_nbr; /* [nbr] Variable size */ lmn_nbr_avg=ddra_info->lmn_nbr_avg; /* [nbr] Averaging block size */ lmn_nbr_wgt=ddra_info->lmn_nbr_wgt; /* [nbr] Weight size */ nco_op_typ=ddra_info->nco_op_typ; /* [enm] Operation type */ /* rnk_avg=ddra_info->rnk_avg; */ /* [nbr] Rank of averaging space */ rnk_var=ddra_info->rnk_var; /* [nbr] Variable rank (in input file) */ rnk_wgt=ddra_info->rnk_wgt; /* [nbr] Rank of weight */ var_idx=ddra_info->var_idx; /* [enm] Index */ wgt_brd_flg=ddra_info->wgt_brd_flg; /* [flg] Broadcast weight for this variable */ wrd_sz=ddra_info->wrd_sz; /* [B] Bytes per element */ /* Derived variables */ switch(nco_op_typ){ /* Types used in ncbo(), ncflint() */ case nco_op_add: /* [enm] Add file_1 to file_2 */ case nco_op_dvd: /* [enm] Divide file_1 by file_2 */ case nco_op_mlt: /* [enm] Multiply file_1 by file_2 */ case nco_op_sbt: /* [enm] Subtract file_2 from file_1 */ spd_flp=spd_flp_ncbo; /* [# s-1] Floating point operation speed */ spd_ntg=spd_ntg_ncbo; /* [# s-1] Integer operation speed */ lmn_nbr_out=lmn_nbr; /* [nbr] Output elements */ break; /* Types used in ncra(), ncrcat(), ncwa(): */ case nco_op_avg: /* [enm] Average */ case nco_op_min: /* [enm] Minimum value */ case nco_op_max: /* [enm] Maximum value */ case nco_op_ttl: /* [enm] Linear sum */ case nco_op_sqravg: /* [enm] Square of mean */ case nco_op_avgsqr: /* [enm] Mean of sum of squares */ case nco_op_sqrt: /* [enm] Square root of mean */ case nco_op_rms: /* [enm] Root-mean-square (normalized by N) */ case nco_op_rmssdn: /* [enm] Root-mean square normalized by N-1 */ spd_flp=spd_flp_ncwa; /* [# s-1] Floating point operation speed */ spd_ntg=spd_ntg_ncwa; /* [# s-1] Integer operation speed */ lmn_nbr_out=lmn_nbr/lmn_nbr_avg; /* [nbr] Output elements */ break; case nco_op_nil: /* [enm] Nil or undefined operation type */ break; default: (void)fprintf(stdout,"%s: ERROR Illegal nco_op_typ in %s\n",nco_prg_nm_get(),fnc_nm); nco_exit(EXIT_FAILURE); break; } /* end switch */ flp_nbr_bnr_dfl=lmn_nbr; /* [nbr] Floating point operations for binary arithmetic */ /* flp_nbr_nrm_dfl=lmn_nbr_out; */ /* [nbr] Floating point operations for normalization */ /* flp_nbr_rdc_dfl=lmn_nbr; */ /* [nbr] Floating point operations for reduction */ /* Integer operations for broadcasting weight */ ntg_nbr_brd_dfl=(long long int)(ntg_nbr_brd_fdg_fct*lmn_nbr*(6*rnk_var+8*rnk_wgt+2)); /* [nbr] N(6R+8R_w+2) */ /* Byte-swap integer operations per element */ ntg_nbr_byt_swp_dfl=wrd_sz+2; /* [nbr nbr-1] W+2 */ /* Integer operations for collection */ ntg_nbr_clc_dfl=lmn_nbr*(14*rnk_var+4); /* [nbr] N(14R+4) */ /* Integer operations for normalization */ /* ntg_nbr_nrm_dfl=4*lmn_nbr_out; */ /* [nbr] 4N/N_A = 4N_O */ /* Integer operations for reduction */ /* ntg_nbr_rdc_dfl=lmn_nbr*6+lmn_nbr_out; */ /* [nbr] N(6+N/N_A) */ switch(nco_op_typ){ /* Types used in ncbo(), ncflint() */ case nco_op_add: /* [enm] Add file_1 to file_2 */ case nco_op_dvd: /* [enm] Divide file_1 by file_2 */ case nco_op_mlt: /* [enm] Multiply file_1 by file_2 */ case nco_op_sbt: /* [enm] Subtract file_2 from file_1 */ /* Subtraction computation assumes variables are same size fxm: Account for broadcasting */ /* One floating point (add/subtract/multiply/divide) per element */ flp_nbr_bnr=flp_nbr_bnr_dfl; /* Byte-swap elements from two input files and one output file */ ntg_nbr_byt_swp=3*lmn_nbr*ntg_nbr_byt_swp_dfl; /* 3N(W+2) */ rd_nbr_byt=2*lmn_nbr*wrd_sz; /* [B] Bytes read */ wrt_nbr_byt=lmn_nbr_out*wrd_sz; /* [B] Bytes written */ break; /* Types used in ncra(), ncrcat(), ncwa(): */ case nco_op_avg: /* [enm] Average */ case nco_op_min: /* [enm] Minimum value */ case nco_op_max: /* [enm] Maximum value */ case nco_op_ttl: /* [enm] Linear sum */ case nco_op_sqravg: /* [enm] Square of mean */ case nco_op_avgsqr: /* [enm] Mean of sum of squares */ case nco_op_sqrt: /* [enm] Square root of mean */ case nco_op_rms: /* [enm] Root-mean-square (normalized by N) */ case nco_op_rmssdn: /* [enm] Root-mean square normalized by N-1 */ rd_nbr_byt=lmn_nbr*wrd_sz; /* [B] Bytes read */ wrt_nbr_byt=lmn_nbr_out*wrd_sz; /* [B] Bytes written */ /* One floating point add per input element to sum numerator */ flp_nbr_rdc=lmn_nbr; /* One floating point divide per output element to normalize numerator by denominatro (tally) */ flp_nbr_nrm=lmn_nbr_out; /* Byte-swap elements from one input file and one (rank-reduced) output file */ ntg_nbr_byt_swp=(lmn_nbr+lmn_nbr_out)*ntg_nbr_byt_swp_dfl; if(!MRV_flg){ /* Collection required for numerator */ ntg_nbr_clc+=ntg_nbr_clc_dfl; } /* !MRV_flg */ if(wgt_nm){ if(var_idx == 0){ /* Set cost = 0 after first variable since only read weight once */ rd_nbr_byt+=lmn_nbr_wgt*wrd_sz; /* [B] Bytes read */ /* Byte-swap cost for first weight input is usually negligible */ ntg_nbr_byt_swp+=lmn_nbr_wgt*ntg_nbr_byt_swp_dfl; } /* var_idx != 0 */ /* One floating point multiply per input element for weight*value in numerator, and one floating point add per input element to sum weight in denominator */ flp_nbr_rdc+=2*lmn_nbr; /* One floating point divide per output element to normalize denominator by tally */ flp_nbr_nrm+=lmn_nbr_out; if(wgt_brd_flg){ /* fxm: Charge for broadcasting weight at least once */ /* Broadcasting cost for weight */ ntg_nbr_brd=ntg_nbr_brd_dfl; } /* !wgt_brd_flg */ if(!MRV_flg){ /* Collection required for denominator */ ntg_nbr_clc+=ntg_nbr_clc_dfl; } /* !MRV_flg */ } /* !wgt_nm */ break; case nco_op_nil: /* [enm] Nil or undefined operation type */ break; default: (void)fprintf(stdout,"%s: ERROR Illegal nco_op_typ in %s\n",nco_prg_nm_get(),fnc_nm); nco_exit(EXIT_FAILURE); break; } /* end switch */ flp_nbr= /* [nbr] Floating point operations */ flp_nbr_bnr+ /* [nbr] Floating point operations for binary arithmetic */ flp_nbr_rdc+ /* [nbr] Floating point operations for reduction */ flp_nbr_nrm; /* [nbr] Floating point operations for normalization */ ntg_nbr= /* [nbr] Integer operations */ ntg_nbr_byt_swp+ /* [nbr] Integer operations for byte-swap */ ntg_nbr_brd+ /* [nbr] Integer operations for broadcasting */ ntg_nbr_clc+ /* [nbr] Integer operations for collection */ ntg_nbr_rdc+ /* [nbr] Integer operations for reduction */ ntg_nbr_nrm; /* [nbr] Integer operations for normalization */ tm_ntg=ntg_nbr/spd_ntg; /* [s] Integer time */ tm_flp=flp_nbr/spd_flp; /* [s] Floating point time */ tm_rd=rd_nbr_byt/spd_rd; /* [s] Read time */ tm_wrt=wrt_nbr_byt/spd_wrt; /* [s] Write time */ tm_io=tm_rd+tm_wrt; /* [s] I/O time */ tm_crr=tm_ntg+tm_flp+tm_rd+tm_wrt; /* [s] Time for this variable */ /* Increment running totals */ lmn_nbr_ttl+=lmn_nbr; /* [nbr] Cumulative variable size */ flp_nbr_ttl+=flp_nbr; /* [nbr] Cumulative floating point operations */ ntg_nbr_ttl+=ntg_nbr; /* [nbr] Cumulative integer operations */ tm_ntg_ttl+=tm_ntg; /* [s] Cumulative integer time */ tm_flp_ttl+=tm_flp; /* [s] Cumulative floating point time */ tm_rd_ttl+=tm_rd; /* [s] Cumulative read time */ tm_wrt_ttl+=tm_wrt; /* [s] Cumulative write time */ tm_io_ttl+=tm_io; /* [s] Cumulative I/O time */ tm_ttl+=tm_crr; /* [s] Cumulative time */ tm_frc_flp_ttl=tm_flp_ttl/tm_ttl; /* [frc] Floating point time fraction */ tm_frc_io_ttl=tm_io_ttl/tm_ttl; /* [frc] I/O time fraction */ tm_frc_ntg_ttl=tm_ntg_ttl/tm_ttl; /* [frc] Integer time fraction */ tm_frc_rd_ttl=tm_rd_ttl/tm_ttl; /* [frc] Read time fraction */ tm_frc_wrt_ttl=tm_wrt_ttl/tm_ttl; /* [frc] Write time fraction */ if(var_idx == 0){ /* Table headings */ (void)fprintf(stderr,"%3s %8s %8s %8s %8s %5s %5s %8s %8s %8s %4s %4s %4s %4s %4s %7s %7s\n", "idx"," var_nm "," lmn "," flp "," ntg ","tm_io"," tm "," lmn_ttl"," flp_ttl"," ntg_ttl"," flp"," ntg"," rd"," wrt"," io"," tm_ttl"," tm_obs"); (void)fprintf(stderr,"%3s %8s %8s %8s %8s %5s %5s %8s %8s %8s %4s %4s %4s %4s %4s %7s %7s\n", " "," "," # "," # "," # "," s "," s "," # "," # "," # "," % "," % "," % "," % "," % "," s "," s "); } /* var_idx != 0 */ /* Update timers */ update_timers: /* NB: POSIX requires CLOCKS_PER_SEC equals 1000000 so resolution = 1 microsecond */ tm_obs_crr=clock(); tm_obs_dff=(float)(tm_obs_crr-tm_obs_old)/CLOCKS_PER_SEC; tm_obs_old=tm_obs_crr; tm_obs_ttl+=tm_obs_dff; switch(ddra_info->tmr_flg){ case nco_tmr_mtd: /* [enm] Metadata timer (second timer call) */ if(ddra_info->flg_ddra || nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: TIMER Metadata setup and file layout before main loop took %7.2f s\n",nco_prg_nm_get(),tm_obs_ttl); break; case nco_tmr_rgl: /* [enm] Regular timer call (main loop timer call) */ (void)fprintf(stderr, "%3d %8s %8.2e %8.2e %8.2e %5.2f %5.2f %8.2e %8.2e %8.2e %4.1f %4.1f %4.1f %4.1f %4.1f %7.2f %7.2f\n", var_idx,var_nm,(float)lmn_nbr,(float)flp_nbr,(float)ntg_nbr,tm_io,tm_crr,(float)lmn_nbr_ttl,(float)flp_nbr_ttl,(float)ntg_nbr_ttl,100.0*tm_frc_flp_ttl,100.0*tm_frc_ntg_ttl,100.0*tm_frc_rd_ttl,100.0*tm_frc_wrt_ttl,100.0*tm_frc_io_ttl,tm_ttl,tm_obs_ttl); break; case nco_tmr_end: /* [enm] Close timer (last timer call) */ if(ddra_info->flg_ddra || nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: TIMER Elapsed clock() time for command is %7.2f s\n",nco_prg_nm_get(),tm_obs_ttl); break; default: nco_dfl_case_tmr_typ_err(); break; } /* end switch */ return rcd; /* [rcd] Return code */ } /* nco_ddra() */ void nco_dfl_case_tmr_typ_err(void) /* [fnc] Print error and exit for illegal switch(tmr_typ) case */ { /* Purpose: Convenience routine for printing error and exiting when switch(tmr_typ) statement receives an illegal default case Placing this in its own routine saves many lines of code since this function is used in many many switch() statements. */ const char fnc_nm[]="nco_dfl_case_tmr_typ_err()"; (void)fprintf(stdout,"%s: ERROR switch(tmr_typ) statement fell through to default case, which is unsafe. This catch-all error handler ensures all switch(tmr_typ) statements are fully enumerated. Exiting...\n",fnc_nm); nco_err_exit(0,fnc_nm); } /* end nco_dfl_case_tmr_typ_err() */ void nco_exit /* [fnc] Wrapper for exit() */ (int rcd) /* I [enm] Return code */ { /* Purpose: Wrapper for exit() */ const char fnc_nm[]="nco_exit()"; #ifdef NCO_ABORT_ON_ERROR const char exit_nm[]="abort()"; #else /* !NCO_ABORT_ON_ERROR */ const char exit_nm[]="exit(EXIT_FAILURE)"; #endif /* !NCO_ABORT_ON_ERROR */ if(rcd == EXIT_SUCCESS){ exit(rcd); }else{ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: ERROR exiting through %s which will now call %s\n",nco_prg_nm_get(),fnc_nm,exit_nm); #ifdef NCO_ABORT_ON_ERROR abort(); #else /* !NCO_ABORT_ON_ERROR */ exit(rcd); #endif /* !NCO_ABORT_ON_ERROR */ } /* endif rcd */ } /* nco_exit() */ void nco_exit_gracefully(void) /* [fnc] Clean up timers, file descriptors, memory, then exit */ { /* Purpose: Clean up timers, file descriptors, memory, then exit */ (void)fclose(stderr); (void)fclose(stdin); (void)fclose(stdout); /* This should be penultimate command in program After program name is free'd, calls to nco_prg_nm_get() will fail */ (void)nco_free(nco_prg_nm_get()); nco_exit(EXIT_SUCCESS); } /* end nco_exit_gracefully() */ void nco_exit_lbr_rcd(void) /* [fnc] Exit with netCDF library version as return code */ { /* Purpose: Exit with status equaling a numeric code determined by netCDF library version Exit status must be 0-255 Modern netCDF versions range from 300-440 Hence program returns netCDF version minus an offset of 300 so version 4.4.0 exit()s with $?=140 Usage: ncks --lbr_rcd Verify exit status with "echo $?" */ char lbr_sng[NC_MAX_NAME+1]; int rcd=360; #if defined(ENABLE_NETCDF4) && defined(HAVE_NETCDF4_H) strcpy(lbr_sng,nc_inq_libvers()); rcd=400; /* Detect buggy netCDF version 4.1 so that workarounds may be implemented Other versions used to enable version-specific regression tests in NCO_rgr.pm */ if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '1'){rcd=410;} else if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '3' && lbr_sng[3] == '.' && lbr_sng[4] == '0' ){rcd=430;} else if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '3' && lbr_sng[3] == '.' && lbr_sng[4] == '1' ){rcd=431;} else if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '3' && lbr_sng[3] == '.' && lbr_sng[4] == '2' ){rcd=432;} /* NB: Same return values for 4.3.3 and 4.3.3.1. Few people installed 4.3.3, most installed 4.3.3.1. */ else if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '3' && lbr_sng[3] == '.' && lbr_sng[4] == '3' ){rcd=433;} else if(lbr_sng[0] == '4' && lbr_sng[1] == '.' && lbr_sng[2] == '4' && lbr_sng[3] == '.' && lbr_sng[4] == '0' ){rcd=440;} #endif /* HAVE_NETCDF4_H */ /* exit() with custom rcd for use by Perl regression tester nco_bm.pl/NCO_rgr.pm */ rcd-=300; exit(rcd); } /* end nco_exit_lbr_rcd() */ nco_bool /* [flg] Program is multi-file operator */ nco_is_mfo /* [fnc] Query whether program is multi-file operator */ (const int nco_prg_id) /* [enm] Program ID */ { /* Purpose: Is this a multi-file operator (MFO)? MFOs take arbitrarily large numbers of input files ncbo and ncflint are not MFOs because they take a fixed number (two) of input files MFOs attempt to read input filenames from stdin when input filenames are not positional arguments */ switch(nco_prg_id){ case ncfe: case ncecat: case ncra: case ncrcat: case ncge: return True; break; case ncap: case ncatted: case ncbo: case ncflint: case ncks: case ncpdq: case ncrename: case ncwa: return False; break; default: nco_dfl_case_prg_id_err(); break; } /* end switch */ return False; } /* end nco_is_mfo() */ nco_bool /* [flg] Program does arithmetic */ nco_is_rth_opr /* [fnc] Query whether program does arithmetic */ (const int nco_prg_id) /* [enm] Program ID */ { /* Purpose: Is operator arithmetic? For purposes of this function, an arithmetic operator is one which changes values Concatenators (ncrcat, ncecat) are not arithmetic because they just glue data Permutor (ncpdq) is not arithmetic because it just re-arranges values Packer (ncpdq) is not arithmetic because it re-represents values Attributors (ncrename, ncatted) are not arithmetic because they change metadata, not data nco_is_rth_opr() flag help control packing behavior Clearly, arithmetic operators must operate on unpacked values Hence, one use of nco_is_rth_opr() is to tell arithmetic operators to automatically unpack variables when reading them Non-arithmetic operators do not need to unpack variables */ switch(nco_prg_id){ case ncap: case ncbo: case ncfe: case ncflint: case ncra: case ncwa: case ncge: return True; break; case ncatted: case ncecat: case ncks: case ncpdq: case ncrcat: case ncrename: return False; break; default: nco_dfl_case_prg_id_err(); break; } /* end switch */ return False; } /* end nco_is_rth_opr() */ nco_bool /* [flg] Program does arithmetic and preserves rank */ nco_is_sz_rnk_prv_rth_opr /* [fnc] Is program size and rank-preserving arithmetic operator? */ (const int nco_prg_id, /* I [enm] Program ID */ const int nco_pck_plc) /* I [enm] Packing policy */ { /* Purpose: Is program size and rank-preserving arithmetic operator? For purposes of this function, arithmetic operators change values Concatenators (ncrcat, ncecat) are not arithmetic because they just glue data Permutor (ncpdq) _is not_ arithmetic because it only re-arranges values Packer (ncpdq) _is_ arithmetic because it uses floating point arithmetic to re-represent values nco_pck_plc flag is required as input and used only to distinguish between ncpdq packing and permuting. Attributors (ncrename, ncatted) are not arithmetic because they change metadata, not data Averager ncwa is clearly not size or rank-preserving Averager ncra preserves numeric rank though not record-dimension size and so is so is not size and rank-preserving. One use of nco_is_sz_rnk_prv_rth_opr() is to tell which operators should not process multidimensional coordinate values. For example, we want ncwa to act on coordinates that are reduced However, we do not want ncfe, ncbo, or ncflint, for example, to load and process single or multi-dimensional coordinate variables. Nor do we want ncpdq to pack variables like gaussian weights, or area since that causes a significant loss of arithmetic precision when those are used as weights in re-inflated files. Such variables to these operators are best treated as "fixed" variables to be copied directly from the input to the output file. */ switch(nco_prg_id){ case ncap: case ncbo: case ncfe: case ncge: case ncflint: return True; break; case ncatted: case ncecat: case ncks: case ncrcat: case ncra: /* Process (not fix) time-varying fields like date, datesec */ case ncrename: case ncwa: return False; break; case ncpdq: if(nco_pck_plc != nco_pck_plc_nil) return True; else return False; break; default: nco_dfl_case_prg_id_err(); break; } /* end switch */ return False; } /* end nco_is_sz_rnk_prv_rth_opr() */ void nco_lbr_vrs_prn(void) /* [fnc] Print netCDF library version */ { /* Purpose: Print netCDF library version */ char *cmp_dat_sng; char *dlr_ptr; char *lbr_sng; char *lbr_vrs_sng; char *of_ptr; size_t cmp_dat_sng_lng; size_t lbr_vrs_sng_lng; /* Behavior of nc_inq_libvers() depends on library versions. Return values are: netCDF 3.4--3.6.x: "3.4 of May 16 1998 14:06:16 $" netCDF 4.0-alpha1--4.0-alpha10: NULL netCDF 4.0-alpha11--4.0-alpha16: "4.0-alpha11" netCDF 4.0-beta1--present: "4.0-beta1" */ lbr_sng=(char *)strdup(nc_inq_libvers()); /* (void)fprintf(stderr,"%s: nco_lbr_vrs_prn() returns %s\n",nco_prg_nm_get(),lbr_sng);*/ of_ptr=strstr(lbr_sng," of "); if(of_ptr == NULL){ (void)fprintf(stderr,"%s: WARNING nco_lbr_vrs_prn() reports of_ptr == NULL\n",nco_prg_nm_get()); lbr_vrs_sng_lng=(size_t)strlen(lbr_sng); }else{ lbr_vrs_sng_lng=(size_t)(of_ptr-lbr_sng); } /* endif */ lbr_vrs_sng=(char *)nco_malloc(lbr_vrs_sng_lng+1ul); strncpy(lbr_vrs_sng,lbr_sng,lbr_vrs_sng_lng); lbr_vrs_sng[lbr_vrs_sng_lng]='\0'; /* NUL-terminate */ dlr_ptr=strstr(lbr_sng," $"); if(of_ptr && dlr_ptr){ cmp_dat_sng_lng=(size_t)(dlr_ptr-of_ptr-4ul); /* 4 is the length of " of " */ cmp_dat_sng=(char *)nco_malloc(cmp_dat_sng_lng+1ul); strncpy(cmp_dat_sng,of_ptr+4ul,cmp_dat_sng_lng); /* 4 is the length of " of " */ cmp_dat_sng[cmp_dat_sng_lng]='\0'; /* NUL-terminate */ }else{ cmp_dat_sng=(char *)strdup("Unknown"); } /* endif */ (void)fprintf(stderr,"Linked to netCDF library version %s, compiled %s\n",lbr_vrs_sng,cmp_dat_sng); cmp_dat_sng=(char *)nco_free(cmp_dat_sng); lbr_vrs_sng=(char *)nco_free(lbr_vrs_sng); lbr_sng=(char *)nco_free(lbr_sng); } /* end nco_lbr_vrs_prn() */ void nco_cnf_prn(void) /* [fnc] Print NCO configuration and help text */ { /* Purpose: Print NCO configuration and help text */ (void)fprintf(stdout,"Homepage: http://nco.sf.net\n"); (void)fprintf(stdout,"User Guide: http://nco.sf.net/nco.html\n"); /* fxm: TKN2YESNO breaks when TKN is undefined Full macro language like M4 might be useful here, though probably too much trouble */ #define TKN2YESNO(x) ((x+0) ? ("No"):("Yes")) /* NB: Keep configuration option tokens consistent among configure.ac, bld/Makefile, and nco_ctl.c Alphabetize list by first word in English text description of token */ (void)fprintf(stdout,"Configuration Option:\tActive?\tMeaning or Reference:\nCheck _FillValue\t%s\thttp://nco.sf.net/nco.html#mss_val\nCheck missing_value\t%s\thttp://nco.sf.net/nco.html#mss_val\nDAP clients\t\t%s\thttp://nco.sf.net/nco.html#dap\nDebugging: Custom\t%s\tPedantic, bounds checking (slowest execution)\nDebugging: Symbols\t%s\tProduce symbols for debuggers (e.g., dbx, gdb)\nESMF Library\t\t%s\thttp://nco.sf.net/nco.html#esmf\nGNU Scientific Library\t%s\thttp://nco.sf.net/nco.html#gsl\nHDF4 support\t\t%s\thttp://nco.sf.net/nco.html#hdf4\nInternationalization\t%s\thttp://nco.sf.net/nco.html#i18n (pre-alpha)\nMPI parallelization\t%s\thttp://nco.sf.net/nco.html#mpi (beta)\nnetCDF3 64-bit files\t%s\thttp://nco.sf.net/nco.html#lfs\nnetCDF4/HDF5 available\t%s\thttp://nco.sf.net/nco.html#nco4\nnetCDF4/HDF5 enabled\t%s\thttp://nco.sf.net/nco.html#nco4\nOpenMP SMP threading\t%s\thttp://nco.sf.net/nco.html#omp\nOptimization: run-time\t%s\tFastest execution possible (slowest compilation)\nParallel netCDF3\t%s\thttp://nco.sf.net/nco.html#pnetcdf (pre-alpha)\nRegular Expressions\t%s\thttp://nco.sf.net/nco.html#rx\nShared libraries built\t%s\tSmall, dynamically linked executables\nStatic libraries built\t%s\tLarge executables with private namespaces\nUDUnits conversions\t%s\thttp://nco.sf.net/nco.html#udunits\nUDUnits2 conversions\t%s\thttp://nco.sf.net/nco.html#udunits\n%s", (!strcmp("_FillValue",nco_mss_val_sng_get())) ? "Yes" : "No", (!strcmp("missing_value",nco_mss_val_sng_get())) ? "Yes" : "No", #if defined(ENABLE_DAP) && (ENABLE_DAP) "Yes", #else /* !ENABLE_DAP */ "No", #endif /* !ENABLE_DAP */ #if defined(ENABLE_DEBUG_CUSTOM) && (ENABLE_DEBUG_CUSTOM) "Yes", #else /* !ENABLE_DEBUG_CUSTOM */ "No", #endif /* !ENABLE_DEBUG_CUSTOM */ #if defined(ENABLE_DEBUG_SYMBOLS) && (ENABLE_DEBUG_SYMBOLS) "Yes", #else /* !ENABLE_DEBUG_SYMBOLS */ "No", #endif /* !ENABLE_DEBUG_SYMBOLS */ #if defined(ENABLE_ESMF) && (ENABLE_ESMF) "Yes", #else /* !ENABLE_ESMF */ "No", #endif /* !ENABLE_ESMF */ #if defined(ENABLE_GSL) && (ENABLE_GSL) "Yes", #else /* !ENABLE_GSL */ "No", #endif /* !ENABLE_GSL */ /* 20131018: This switch is not active yet. Requires netCDF library support */ #if NC_LIB_VERSION >= 433 # if NC_HAS_HDF4 "Yes", # else /* !NC_HAS_HDF4 */ "No", # endif /* !NC_HAS_HDF4 */ #else /* !NC_LIB_VERSION */ "Unknown", #endif /* !NC_LIB_VERSION */ #if defined(I18N) && (I18N) "Yes", #else /* !I18N */ "No", #endif /* !I18N */ #if defined(ENABLE_MPI) && (ENABLE_MPI) "Yes", #else /* !ENABLE_MPI */ "No", #endif /* !ENABLE_MPI */ #if defined(NC_64BIT_OFFSET) && (NC_64BIT_OFFSET) "Yes", #else /* !NC_64BIT_OFFSET */ "No", #endif /* !NC_64BIT_OFFSET */ #if defined(HAVE_NETCDF4_H) && (HAVE_NETCDF4_H) "Yes", #else /* !HAVE_NETCDF4_H */ "No", #endif /* !HAVE_NETCDF4_H */ #if defined(ENABLE_NETCDF4) && (ENABLE_NETCDF4) "Yes", #else /* !ENABLE_NETCDF4 */ "No", #endif /* !ENABLE_NETCDF4 */ #if defined(_OPENMP) && (_OPENMP) "Yes", #else /* !_OPENMP */ "No", #endif /* !_OPENMP */ #if defined(ENABLE_OPTIMIZE_CUSTOM) && (ENABLE_OPTIMIZE_CUSTOM) "Yes", #else /* !ENABLE_OPTIMIZE_CUSTOM */ "No", #endif /* !ENABLE_OPTIMIZE_CUSTOM */ #if defined(ENABLE_PNETCDF) && (ENABLE_PNETCDF) "Yes", #else /* !ENABLE_PNETCDF */ "No", #endif /* !ENABLE_PNETCDF */ #if defined(NCO_HAVE_REGEX_FUNCTIONALITY) && (NCO_HAVE_REGEX_FUNCTIONALITY) "Yes", #else /* !NCO_HAVE_REGEX_FUNCTIONALITY */ "No", #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */ #if defined(ENABLE_SHARED) && (ENABLE_SHARED) "Yes", #else /* !ENABLE_SHARED */ "No", #endif /* !ENABLE_SHARED */ #if defined(ENABLE_STATIC) && (ENABLE_STATIC) "Yes", #else /* !ENABLE_STATIC */ "No", #endif /* !ENABLE_STATIC */ #if defined(ENABLE_UDUNITS) && (ENABLE_UDUNITS) "Yes", #else /* !ENABLE_UDUNITS */ "No", #endif /* !ENABLE_UDUNITS */ #if defined(HAVE_UDUNITS2_H) && (HAVE_UDUNITS2_H) "Yes", #else /* !HAVE_UDUNITS2_H */ "No", #endif /* !HAVE_UDUNITS2_H */ ""); /* End of print statement marker */ (void)fprintf(stderr,"\n%s",nco_nmn_get()); } /* end nco_cnf_prn() */ const char * /* O [sng] Mnemonic that describes current NCO version */ nco_nmn_get(void) /* [fnc] Return mnemonic that describes current NCO version */ { /* Purpose: Return mnemonic describing current NCO version Always include terminal \n so mnemonic does not dangle */ return "Capital Grille\n"; } /* end nco_nmn_get() */ char * /* O [sng] nm_in stripped of any path (i.e., program name stub) */ nco_prg_prs /* [fnc] Strip program name to stub and set program ID */ (const char * const nm_in, /* I [sng] Name of program, i.e., argv[0] (may include path prefix) */ int * const prg_lcl) /* O [enm] Enumerated number corresponding to nm_in */ { /* Purpose: Set program name and enum */ char *nm_out; char *nm_out_tmp; char *nm_out_orig; /* Get program name (use strrchr() first in case nm_in contains a path) */ nm_out_orig=nm_out_tmp=(char *)strdup(nm_in); #ifdef _MSC_VER int len; if(strrchr(nm_out_tmp,'\\')) nm_out_tmp=strrchr(nm_out_tmp,'\\')+1; char *s=strstr(nm_out_tmp,".exe"); if(s!=NULL && !strcmp(s,".exe")){ len=strlen(nm_out_tmp); /* cut any '.exe' from name */ nm_out_tmp[len-4]='\0'; } /* endif */ #else /* !_MSC_VER */ if(strrchr(nm_out_tmp,'/')) nm_out_tmp=strrchr(nm_out_tmp,'/')+1; #endif /* !_MSC_VER */ /* Skip possible libtool prefix */ if(!strncmp(nm_out_tmp,"lt-",3)){nm_out_tmp+=3;} /* Classify calling program */ /* ncap and acceptable synonyms (symbolic links): */ if(!strcmp(nm_out_tmp,"ncap")){*prg_lcl=ncap;} else if(!strcmp(nm_out_tmp,"ncap2")){*prg_lcl=ncap;} /* ncatted and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncatted")){*prg_lcl=ncatted;} /* ncbo and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"mpncbo")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"mpncdiff")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncadd")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncbo")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncdiff")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncdivide")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncmult")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncmultiply")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncsub")){*prg_lcl=ncbo;} else if(!strcmp(nm_out_tmp,"ncsubtract")){*prg_lcl=ncbo;} /* ncecat and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncecat")){*prg_lcl=ncecat;} else if(!strcmp(nm_out_tmp,"mpncecat")){*prg_lcl=ncecat;} /* ncfe and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncea")){*prg_lcl=ncfe;} else if(!strcmp(nm_out_tmp,"mpncea")){*prg_lcl=ncfe;} else if(!strcmp(nm_out_tmp,"nces")){*prg_lcl=ncfe;} else if(!strcmp(nm_out_tmp,"mpnces")){*prg_lcl=ncfe;} else if(!strcmp(nm_out_tmp,"ncfe")){*prg_lcl=ncfe;} else if(!strcmp(nm_out_tmp,"mpncfe")){*prg_lcl=ncfe;} /* ncge and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncge")){*prg_lcl=ncge;} else if(!strcmp(nm_out_tmp,"mpncge")){*prg_lcl=ncge;} /* ncflint and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncflint")){*prg_lcl=ncflint;} else if(!strcmp(nm_out_tmp,"mpncflint")){*prg_lcl=ncflint;} /* ncks and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncks")){*prg_lcl=ncks;} /* ncpdq and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncpdq")){*prg_lcl=ncpdq;} else if(!strcmp(nm_out_tmp,"mpncpdq")){*prg_lcl=ncpdq;} else if(!strcmp(nm_out_tmp,"ncpack")){*prg_lcl=ncpdq;} else if(!strcmp(nm_out_tmp,"ncunpack")){*prg_lcl=ncpdq;} /* ncra and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncrs")){*prg_lcl=ncra;} else if(!strcmp(nm_out_tmp,"mpncrs")){*prg_lcl=ncra;} else if(!strcmp(nm_out_tmp,"ncra")){*prg_lcl=ncra;} else if(!strcmp(nm_out_tmp,"mpncra")){*prg_lcl=ncra;} /* ncrcat and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncrcat")){*prg_lcl=ncrcat;} else if(!strcmp(nm_out_tmp,"mpncrcat")){*prg_lcl=ncrcat;} /* ncrename and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncrename")){*prg_lcl=ncrename;} /* ncwa and acceptable synonyms (symbolic links): */ else if(!strcmp(nm_out_tmp,"ncws")){*prg_lcl=ncwa;} else if(!strcmp(nm_out_tmp,"mpncws")){*prg_lcl=ncwa;} else if(!strcmp(nm_out_tmp,"ncwa")){*prg_lcl=ncwa;} else if(!strcmp(nm_out_tmp,"mpncwa")){*prg_lcl=ncwa;} else{ (void)fprintf(stdout,"%s: ERROR executable name %s not registered in nco_prg_prs()\n",nm_out_tmp,nm_out_tmp); nco_exit(EXIT_FAILURE); } /* end else */ /* Duplicate stub for returning */ nm_out=(char *)strdup(nm_out_tmp); /* Free copy of argv[0] */ nm_out_orig=(char *)nco_free(nm_out_orig); return nm_out; } /* end nco_prg_prs() */ void nco_usg_prn(void) { /* Purpose: Print correct command-line usage (currently to stdout) */ char *opt_sng=NULL_CEWI; int prg_lcl; prg_lcl=nco_prg_id_get(); switch(prg_lcl){ case ncap: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-F] [-f] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-s algebra] [-S fl.nco] [-t thr_nbr] [-v] in.nc [out.nc]\n"); break; case ncatted: opt_sng=(char *)strdup("[-a ...] [--bfr sz] [-D nco_dbg_lvl] [--glb ...] [-h] [--hdr_pad nbr] [-l path] [-O] [-o out.nc] [-p path] [-R] [-r] in.nc [[out.nc]]\n"); break; case ncbo: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] [-y op_typ] in_1.nc in_2.nc [out.nc]\n"); break; case ncflint: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_crd] [--fl_fmt fmt] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-i var,val] [-L lvl] [-l path] [--msa] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-v ...] [-X box] [-x] [-w wgt_1[,wgt_2]] in_1.nc in_2.nc [out.nc]\n"); break; case ncks: opt_sng=(char *)strdup("[-3] [-4] [-5] [-6] [-7] [-A] [-a] [-b fl_bnr] [--bfr sz] [-C] [-c] [--cdl] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fix_rec_dmn dim] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [--grp_xtr_var_xcl] [-H] [-h] [--hdn] [--hdr_pad nbr] [-L lvl] [-l path] [-M] [-m] [--map map.nc] [--md5_dgs] [--md5_wrt] [--mk_rec_dmn dim] [--msa] [--no_blank] [--no_tmp_fl] [-O] [-o out.nc] [-P] [-p path] [--ppc ...] [-Q] [-q] [-R] [-r] [--rad] [--rgr] [--ram_all] [--rnr=wgt] [-s format] [-t thr_nbr] [-u] [--unn] [-V] [-v ...] [-X box] [-x] [--xml] [--xml_no_loc] [--xml_spr_chr sng] [--xml_spr_nmr sng] [--xtn_var ...] in.nc [[out.nc]]\n"); break; case ncpdq: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [-M pck_map] [--mrd] [--msa] [--no_tmp_fl] [-O] [-o out.nc] [-P pck_plc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-U] [-v ...] [-X box] [-x] in.nc [out.nc]\n"); break; case ncra: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--mro] [--msa] [-N] [-n ...] [--no_cll_mth] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t thr_nbr] [--unn] [-w wgt] [-v ...] [-X box] [-x] [-y op_typ] in.nc [...] [out.nc]\n"); break; case ncfe: case ncge: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdf] [--hdr_pad nbr] [-L lvl] [-l path] [--msa] [-n ...] [--no_tmp_fl] [--nsm_fl] [--nsm_grp] [--nsm_sfx] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] [-y op_typ] in.nc [...] [out.nc]\n"); break; case ncrcat: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-H] [-h] [--hdr_pad nbr] [-L lvl] [-l path] [--md5_digest] [--msa] [-n ...] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [--rec_apn] [-t thr_nbr] [--unn] [-v ...] [-X box] [-x] in.nc [...] [out.nc]\n"); break; case ncecat: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--gag] [--glb ...] [-H] [-h] [--hdr_pad nbr] [-L lvl] [-l path] [-M] [--md5_digest] [--mrd] [--msa] [-n ...] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-t thr_nbr] [-u ulm_nm] [--unn] [-v ...] [-X box] [-x] in.nc [...] [out.nc]\n"); break; case ncrename: opt_sng=(char *)strdup("[-a ...] [--bfr sz] [-D nco_dbg_lvl] [-d ...] [-g ...] [--glb ...] [-h] [--hdr_pad nbr] [-l path] [-O] [-o out.nc] [-p path] [-R] [-r] [-v ...] in.nc [[out.nc]]\n"); break; case ncwa: opt_sng=(char *)strdup("[-3] [-4] [-6] [-7] [-A] [-a ...] [-B mask_cond] [-b] [--bfr sz] [-C] [-c] [--cnk_byt sz] [--cnk_dmn nm,sz] [--cnk_map map] [--cnk_min min] [--cnk_plc plc] [--cnk_scl sz] [-D nco_dbg_lvl] [-d ...] [--dbl|flt] [-F] [--fl_fmt fmt] [-G grp:lvl] [-g ...] [--glb ...] [-h] [--hdf] [--hdr_pad nbr] [-I] [-L lvl] [-l path] [-m mask] [-M mask_val] [-N] [--no_cll_mth] [--no_tmp_fl] [-O] [-o out.nc] [-p path] [--ppc ...] [-R] [-r] [--ram_all] [-T mask_comp] [-t thr_nbr] [--unn] [-v ...] [-w wgt] [-x] [-y op_typ] in.nc [out.nc]\n"); break; default: nco_dfl_case_prg_id_err(); break; } /* end switch */ /* We now have command-specific command line option string */ (void)fprintf(stdout,"%s Command line options cheatsheet (full details at http://nco.sf.net/nco.html#%s):\n",nco_prg_nm_get(),nco_prg_nm_get()); (void)fprintf(stdout,"%s %s\n",nco_prg_nm_get(),opt_sng); if(strstr(opt_sng,"[-3]")) (void)fprintf(stdout,"-3, --3, --fl_fmt=classic\tOutput file in netCDF3 CLASSIC (32-bit offset) storage format\n"); #ifdef ENABLE_NETCDF4 if(strstr(opt_sng,"[-4]")) (void)fprintf(stdout,"-4, --4, --netcdf4\t\tOutput file in netCDF4 (HDF5) storage format\n"); #endif /* !ENABLE_NETCDF4 */ if(strstr(opt_sng,"[-5]")) (void)fprintf(stdout,"-5, --5, \t\tPrint alphabetically by group then variable\n"); if(strstr(opt_sng,"[-6]")) (void)fprintf(stdout,"-6, --6, --64, --fl_fmt=64bit\tOutput file in netCDF3 64-bit offset storage format\n"); if(strstr(opt_sng,"[-7]")) (void)fprintf(stdout,"-7, --7, --fl_fmt=netcdf4_classic\tOutput file in netCDF4 CLASSIC format (3+4=7)\n"); if(strstr(opt_sng,"[-A]")) (void)fprintf(stdout,"-A, --apn, --append\tAppend to existing output file, if any\n"); if(strstr(opt_sng,"[-a")){ if(prg_lcl == ncatted) (void)fprintf(stdout,"-a, --attribute att_nm,var_nm,mode,att_typ,att_val Attribute specification:\n\t\t\tmode = a,c,d,m,o and att_typ = f,d,l,s,c,b\n"); #ifdef ENABLE_NETCDF4 if(prg_lcl == ncatted) (void)fprintf(stdout,"\t\t\tnetCDF4 att_typ's = ub,us,u,ll,ull\n"); #endif /* !ENABLE_NETCDF4 */ if(prg_lcl == ncks) (void)fprintf(stdout,"-a, --abc, --alphabetize\tDisable alphabetization of extracted variables\n"); if(prg_lcl == ncpdq) (void)fprintf(stdout,"-a, --arrange, --permute, --reorder, --rdr [-]rdr_dim1[,[-]rdr_dim2[...]] Re-order dimensions\n"); if(prg_lcl == ncrename) (void)fprintf(stdout,"-a, --attribute old_att,new_att Attribute's old and new names\n"); if(prg_lcl == ncwa) (void)fprintf(stdout,"-a, --avg, --average avg_dim1[,avg_dim2[...]] Averaging dimensions\n"); } /* end if */ if(strstr(opt_sng,"[-B")){ #ifndef _MSC_VER if(prg_lcl == ncwa) (void)fprintf(stdout,"-B, --msk_cnd, --mask_condition mask_cond\tMask condition (e.g., \"ORO < 1\")\n"); #endif /* _MSC_VER */ } /* end if -B */ if(strstr(opt_sng,"[-b ")) (void)fprintf(stdout,"-b, --fl_bnr, --binary-file fl_bnr\tUnformatted binary file to write\n"); if(strstr(opt_sng,"[-b]")) (void)fprintf(stdout,"-b, --rdd, --retain-degenerate-dimensions\tRetain degenerate dimensions\n"); if(strstr(opt_sng,"--bfr")) (void)fprintf(stdout," --bfr_sz, --buffer_size sz\tBuffer size to open files with\n"); if(strstr(opt_sng,"[-C]")) (void)fprintf(stdout,"-C, --nocoords\t\tAssociated coordinate variables should not be processed\n"); if(strstr(opt_sng,"[-c]")) (void)fprintf(stdout,"-c, --crd, --coords\tCoordinate variables will all be processed\n"); if(strstr(opt_sng,"--cdl")) (void)fprintf(stdout," --cdl\t\tPrint CDL (netCDF lingua franca used by ncdump/ncgen)\n"); if(strstr(opt_sng,"--cnk_dmn")) (void)fprintf(stdout," --cnk_dmn, --chunk_dimension nm,sz\tChunksize of dimension nm is sz\n"); if(strstr(opt_sng,"--cnk_map")) (void)fprintf(stdout," --cnk_map, --chunk_map map\t\tChunking map [dmn,lfp,prd,rd1,rew,scl,xpl,xst]\n"); if(strstr(opt_sng,"--cnk_min")) (void)fprintf(stdout," --cnk_min, --chunk_min min\t\tMinimum size [B] of variable to chunk\n"); if(strstr(opt_sng,"--cnk_plc")) (void)fprintf(stdout," --cnk_plc, --chunk_policy plc\tChunking policy [all,g2d,g3d,xpl,xst,uck]\n"); if(strstr(opt_sng,"--cnk_scl")) (void)fprintf(stdout," --cnk_scl, --chunk_scalar sz\tChunksize scalar (for all dimensions)\n"); if(strstr(opt_sng,"[-D")) (void)fprintf(stdout,"-D, --dbg_lvl, --debug-level lvl\tDebug-level is lvl\n"); if(strstr(opt_sng,"[-d")){ if(prg_lcl == ncrename) (void)fprintf(stdout,"-d, --dmn, --dimension old_dim,new_dim Dimension's old and new names\n"); else if(prg_lcl == ncra || prg_lcl == ncrcat) (void)fprintf(stdout,"-d, --dmn, --dimension dim,[min][,[max][[[,stride[,subcycle]]]]] Dimension's limits, stride, subcycle in hyperslab\n"); else (void)fprintf(stdout,"-d, --dmn, --dimension dim,[min][,[max]][,[stride]] Dimension's limits and stride in hyperslab\n"); } /* end if -d */ if(strstr(opt_sng,"--dbl|flt")) (void)fprintf(stdout," --dbl, --flt, --rth_dbl|flt\tdbl: Always promote single- to double-precision b4 arithmetic (default). flt: OK with single-precision arithmetic.\n"); if(strstr(opt_sng,"[-F]")) (void)fprintf(stdout,"-F, --ftn, --fortran\tFortran indexing conventions (1-based) for I/O\n"); if(strstr(opt_sng,"[-f]")) (void)fprintf(stdout,"-f, --fnc_tbl, --prn_fnc_tbl\tPrint function table\n"); if(strstr(opt_sng,"--fix_rec_crd")) (void)fprintf(stdout," --fix_rec_crd\tDo not interpolate/multiply record coordinate variables\n"); if(strstr(opt_sng,"--fix_rec_dmn dim")) (void)fprintf(stdout," --fix_rec_dmn dim\tChange dimension dim (or all) to fixed dimension in output file\n"); #ifdef ENABLE_NETCDF4 if(strstr(opt_sng,"--fl_fmt")) (void)fprintf(stdout," --fl_fmt, --file_format fmt\tFile format [classic,64bit,netcdf4,netcdf4_classic]\n"); #else /* !ENABLE_NETCDF4 */ if(strstr(opt_sng,"--fl_fmt")) (void)fprintf(stdout," --fl_fmt, --file_format fmt\tFile format [classic,64bit]\n"); #endif /* !ENABLE_NETCDF4 */ #ifdef ENABLE_NETCDF4 if(strstr(opt_sng,"--gag")) (void)fprintf(stdout," --gag, --aggregate_group\tGroup Aggregation (not Record Aggregation)\n"); if(strstr(opt_sng,"[-G")) (void)fprintf(stdout,"-G, --gpe [grp_nm][:[lvl]]\tGroup Path Editing path, levels to replace\n"); if(strstr(opt_sng,"[-g")){ if(prg_lcl == ncrename) (void)fprintf(stdout,"-g, --grp --group\told_grp,new_grp Group's old and new names\n"); if(prg_lcl != ncrename) (void)fprintf(stdout,"-g, --grp grp1[,grp2[...]] Group(s) to process (regular expressions supported)\n"); } /* end if */ if(strstr(opt_sng,"--glb")) (void)fprintf(stdout," --glb_att_add nm=val\tGlobal attribute to add\n"); if(strstr(opt_sng,"--gxvx, --grp_xtr_var_xcl")) (void)fprintf(stdout," --gxvx, --grp_xtr_var_xcl\tGroup Extraction Variable Exclusion\n"); #endif /* !ENABLE_NETCDF4 */ if(strstr(opt_sng,"[-H]")){ if(prg_lcl == ncks) (void)fprintf(stdout,"-H, --data, --hieronymus\tToggle printing data\n"); if(nco_is_mfo(prg_lcl)) (void)fprintf(stdout,"-H, --fl_lst_in, --file_list\tDo not create \"input_file_list\" global attribute\n"); } /* end if -H */ if(strstr(opt_sng,"[-h]")) (void)fprintf(stdout,"-h, --hst, --history\tDo not append to \"history\" global attribute\n"); if(strstr(opt_sng,"--hdn")) (void)fprintf(stdout," --hdn, --hidden\tPrint hidden (aka special) attributes\n"); if(strstr(opt_sng,"--hdf")) (void)fprintf(stdout," --hdf_upk, --hdf_upk\tHDF unpack convention: unpacked=scale_factor*(packed-add_offset)\n"); if(strstr(opt_sng,"--hdr_pad")) (void)fprintf(stdout," --hdr_pad, --header_pad\tPad output header with nbr bytes\n"); if(strstr(opt_sng,"[-i var,val]")) (void)fprintf(stdout,"-i, --ntp, --interpolate var,val\tInterpolant and value\n"); if(strstr(opt_sng,"[-I]")) (void)fprintf(stdout,"-I, --wgt_msk_crd_var\tDo not weight or mask coordinate variables\n"); #ifdef ENABLE_NETCDF4 if(strstr(opt_sng,"[-L")) (void)fprintf(stdout,"-L, --dfl_lvl, --deflate lvl\tLempel-Ziv deflation/compression (lvl=0..9) for netCDF4 output\n"); #endif /* !ENABLE_NETCDF4 */ if(strstr(opt_sng,"[-l")) (void)fprintf(stdout,"-l, --lcl, --local path\tLocal storage path for remotely-retrieved files\n"); if(strstr(opt_sng,"[-M")){ if(prg_lcl == ncecat) (void)fprintf(stdout,"-M, --no_glb_mtd\tSuppress (do not copy) global metadata\n"); if(prg_lcl == ncks) (void)fprintf(stdout,"-M, --Mtd, --Metadata\tToggle printing global metadata\n"); if(prg_lcl == ncpdq) (void)fprintf(stdout,"-M, --pck_map, --pack_map, --map pck_map\tPack map [flt_sht,flt_byt,hgh_sht,hgh_byt,nxt_lsr]\n"); if(prg_lcl == ncwa) (void)fprintf(stdout,"-M, --msk_val, --mask-value, --mask_value mask_val\tMasking value (default is 1.0)\n"); } /* end if */ if(strstr(opt_sng,"[-m")){ if(prg_lcl == ncwa) (void)fprintf(stdout,"-m, --msk_nm, --msk_var, --mask-variable, --mask_variable mask_var\tMasking variable name\n"); if(prg_lcl == ncks) (void)fprintf(stdout,"-m, --mtd, --metadata\tToggle printing variable metadata\n"); } /* end if */ if(strstr(opt_sng,"--map")) (void)fprintf(stdout," --map, --rgr_map map.nc\tFile containing (ESMF- or SCRIP-format) weights to regrid input to output grid\n"); if(strstr(opt_sng,"--md5_digest")) (void)fprintf(stdout," --md5_dgs, --md5_digest\tPerform MD5 digests\n"); if(strstr(opt_sng,"--md5_wrt_att")) (void)fprintf(stdout," --md5_wrt, --md5_write\tWrite MD5 digests as attributes\n"); if(strstr(opt_sng,"--mk_rec_dmn")) (void)fprintf(stdout," --mk_rec_dmn dim\tDefine dim as record dimension in output file\n"); if(strstr(opt_sng,"--mro")) (void)fprintf(stdout," --mro\t\tMulti-Record Output\n"); if(strstr(opt_sng,"[-N]")){ if(prg_lcl == ncwa) (void)fprintf(stdout,"-N, --nmr, --numerator\tNo normalization\n"); if(prg_lcl == ncra || prg_lcl == ncfe || prg_lcl == ncge) (void)fprintf(stdout,"-N, --no_nrm_by_wgt\tNo normalization by weights\n"); } /* !-N */ if(strstr(opt_sng,"[-n ...]")){ /* if(prg_lcl == ncwa) (void)fprintf(stdout,"-n\t\tNormalize by tally but not weight\n");*/ if(prg_lcl != ncwa) (void)fprintf(stdout,"-n, --nintap nbr_files,[nbr_numeric_chars[,increment]] NINTAP-style abbreviation of file list\n"); } /* !-n */ if(strstr(opt_sng,"--no_blank")) (void)fprintf(stdout," --no_blank\t\tPrint numeric missing values instead of blanks (underscores)\n"); if(strstr(opt_sng,"--no_cll_mth")) (void)fprintf(stdout," --no_cll_mth\tDo not add/modify cell_methods attributes\n"); if(strstr(opt_sng,"--no_tmp_fl")) (void)fprintf(stdout," --no_tmp_fl\t\tDo not write output to temporary file\n"); if(strstr(opt_sng,"--nsm_fl")) (void)fprintf(stdout," --nsm_fl, --ensemble_file\tEnsembles comprise equally weighted files\n"); if(strstr(opt_sng,"--nsm_grp")) (void)fprintf(stdout," --nsm_grp, --ensemble_group\tEnsembles comprise equally weighted groups\n"); if(strstr(opt_sng,"--nsm_sfx")) (void)fprintf(stdout," --nsm_sfx, --ensemble_suffix\tPlace ensemble output in group parent/parent+nsm_sfx\n"); if(strstr(opt_sng,"[-o")) (void)fprintf(stdout,"-o, --output, --fl_out out.nc\tOutput file name (or use last positional argument)\n"); if(strstr(opt_sng,"[-O]")) (void)fprintf(stdout,"-O, --ovr, --overwrite\tOverwrite existing output file, if any\n"); if(strstr(opt_sng,"[-P")){ if(prg_lcl == ncks) (void)fprintf(stdout,"-P, --prn, --print\tPrint data, metadata, and units. Abbreviation for -C -H -M -m -u.\n"); if(prg_lcl == ncpdq) (void)fprintf(stdout,"-P, --pck_plc, --pack_policy pck_plc\tPacking policy [all_new,all_xst,xst_new,upk]\n"); } /* end if -P */ if(strstr(opt_sng,"[-p")) (void)fprintf(stdout,"-p, --pth, --path path\tPath prefix for all input filenames\n"); if(strstr(opt_sng,"--ppc")) (void)fprintf(stdout," --ppc v1[,v2[,...]]=prc\tPrecision-Preserving Compression: Number of total or decimal significant digits\n"); if(strstr(opt_sng,"[-Q]")) (void)fprintf(stdout,"-Q, --quiet\t\tQuiet printing of dimension indices and coordinate values\n"); if(strstr(opt_sng,"[-q]")) (void)fprintf(stdout,"-q, --quench\t\tQuench (turn-off) all printing to screen\n"); if(strstr(opt_sng,"[-R]")) (void)fprintf(stdout,"-R, --rtn, --retain\tRetain remotely-retrieved files after use\n"); if(strstr(opt_sng,"[-r]")) (void)fprintf(stdout,"-r, --revision, --version\tCompile-time configuration and/or program version\n"); if(strstr(opt_sng,"--rad")) (void)fprintf(stdout," --orphan, --rph_dmn\tRetain or print all (including orphaned) dimensions\n"); if(strstr(opt_sng,"--ram_all")) (void)fprintf(stdout," --ram_all, --diskless_all\tOpen netCDF3 files and create output files in RAM\n"); if(strstr(opt_sng,"--rec_apn")) (void)fprintf(stdout," --rec_apn, --record_append\tAppend records directly to output file\n"); if(strstr(opt_sng,"--rgr")) (void)fprintf(stdout," --rgr key=value\t\tSee http://nco.sf.net/nco.html#regrid for valid keys\n"); if(strstr(opt_sng,"--rnr")) (void)fprintf(stdout," --rnr=wgt, --renormalize\t\tWeight threshold for valid destination value\n"); // if(strstr(opt_sng,"--rgr_grd_dst")) (void)fprintf(stdout," --rgr_grd_dst file\tDestination grid\n"); // if(strstr(opt_sng,"--rgr_grd_src")) (void)fprintf(stdout," --rgr_grd_src file\tSource grid\n"); // if(strstr(opt_sng,"--rgr_in")) (void)fprintf(stdout," --rgr_in file\tFile containing fields to be regridded\n"); if(strstr(opt_sng,"[-s")){ if(prg_lcl != ncap) (void)fprintf(stdout,"-s, --sng_fmt, --string format\tString format for text output\n"); if(prg_lcl == ncap) (void)fprintf(stdout,"-s, --spt, --script algebra\tAlgebraic command defining single output variable\n"); } /* end if */ if(strstr(opt_sng,"[-S")) (void)fprintf(stdout,"-S, --fl_spt, --script-file fl.nco\tScript file containing multiple algebraic commands\n"); if(strstr(opt_sng,"[-T")) (void)fprintf(stdout,"-T, --mask_comparator, --msk_cmp_typ, --op_rlt comparator\tComparator for mask condition: eq,ne,ge,le,gt,lt\n"); if(strstr(opt_sng,"[-t")) (void)fprintf(stdout,"-t, --thr_nbr, --threads, --omp_num_threads thr_nbr\tThread number for OpenMP\n"); if(strstr(opt_sng,"[-U]")) (void)fprintf(stdout,"-U, --upk, --unpack\tUnpack input file\n"); if(strstr(opt_sng,"[-u")){ if(prg_lcl == ncks) (void)fprintf(stdout,"-u, --units\t\tToggle printing units of variables, if any\n"); if(prg_lcl == ncecat) (void)fprintf(stdout,"-u, --ulm_nm --rcd_nm\tNew unlimited (record) dimension name\n"); } /* end if */ if(strstr(opt_sng,"--unn")) (void)fprintf(stdout," --unn, --union\tSelect union of specified groups and variables\n"); if(strstr(opt_sng,"[-V")) (void)fprintf(stdout,"-V, --var_val\t\tPrint variable values only\n"); if(strstr(opt_sng,"[-v")){ if(prg_lcl == ncrename) (void)fprintf(stdout,"-v, --variable old_var,new_var Variable's old and new names\n"); if(prg_lcl == ncap) (void)fprintf(stdout,"-v, --variable \t\tOutput file includes ONLY user-defined variables\n"); if(prg_lcl != ncrename && prg_lcl != ncap) (void)fprintf(stdout,"-v, --variable var1[,var2[...]] Variable(s) to process (regular expressions supported)\n"); } /* end if */ /* if(strstr(opt_sng,"[-W]")) (void)fprintf(stdout,"-W\t\tNormalize by weight but not tally\n");*/ if(strstr(opt_sng,"[-w")){ if(prg_lcl == ncra) (void)fprintf(stdout,"-w, --wgt_var, --weight wgt\tPer-file weights or variable name\n"); if(prg_lcl == ncwa) (void)fprintf(stdout,"-w, --wgt_var, --weight wgt\tWeighting variable name\n"); if(prg_lcl == ncflint) (void)fprintf(stdout,"-w, --wgt_var, --weight wgt_1[,wgt_2] Weight(s) of file(s)\n"); } /* end if */ if(strstr(opt_sng,"[-X")) (void)fprintf(stdout,"-X, --auxiliary lon_min,lon_max,lat_min,lat_max\tAuxiliary coordinate bounding box\n"); if(strstr(opt_sng,"[-x]")) (void)fprintf(stdout,"-x, --xcl, --exclude\tExtract all variables EXCEPT those specified with -v\n"); if(strstr(opt_sng,"--xml")) (void)fprintf(stdout," --xml\t\tPrint XML (NcML, netCDF Markup Language)\n"); if(strstr(opt_sng,"--xml_no_loc")) (void)fprintf(stdout," --xml_no_location\tOmit NcML location element\n"); if(strstr(opt_sng,"--xml_spr_chr")) (void)fprintf(stdout," --xml_spr_chr sng\tSeparator for NcML character types\n"); if(strstr(opt_sng,"--xml_spr_nmr")) (void)fprintf(stdout," --xml_spr_nmr sng\tSeparator for NcML numeric types\n"); if(strstr(opt_sng,"--xtn_var")) (void)fprintf(stdout," --xtn_var, --extensive var\tExtensive variables for regridding (summed not averaged)\n"); if(strstr(opt_sng,"[-y op_typ]")){ if(prg_lcl == ncbo)(void)fprintf(stdout,"-y, --op_typ, --operation op_typ\tBinary arithmetic operation: add,sbt,mlt,dvd (+,-,*,/)\n"); if(prg_lcl == ncra || prg_lcl == ncfe || prg_lcl == ncge || prg_lcl == ncwa)(void)fprintf(stdout,"-y, --op_typ, --operation op_typ\tArithmetic operation: avg,mabs,mebs,mibs,min,max,ttl,sqravg,avgsqr,sqrt,rms,rmssdn\n"); } /* All operators have input files, no need to strstr(in.nc) */ if(prg_lcl == ncbo || prg_lcl == ncflint){ (void)fprintf(stdout,"in_1.nc in_2.nc\t\tInput file names\n"); }else{ if(nco_is_mfo(prg_lcl)) (void)fprintf(stdout,"in.nc [...]\t\tInput file names\n"); else (void)fprintf(stdout,"in.nc\t\t\tInput file name\n"); } /* endif in.nc */ if(strstr(opt_sng,"[out.nc]")) (void)fprintf(stdout,"out.nc\t\t\tOutput file name (or use -o switch)\n"); /* if(strstr(opt_sng,"-")) (void)fprintf(stdout,"-\n");*/ /* Free the space holding option string */ opt_sng=(char *)nco_free(opt_sng); /* Public service announcements */ (void)fprintf(stdout,"\nEight ways to find more help on %s and/or NCO:\n",nco_prg_nm_get()); (void)fprintf(stdout,"1. Examples: http://nco.sf.net/nco.html#xmp_%s\n",nco_prg_nm_get()); (void)fprintf(stdout,"2. Ref. manual: http://nco.sf.net/nco.html#%s\n",nco_prg_nm_get()); (void)fprintf(stdout,"3. User Guide: http://nco.sf.net#RTFM\n"); (void)fprintf(stdout,"4. Manual pages: \'man %s\', \'man nco\', ...\n",nco_prg_nm_get()); (void)fprintf(stdout,"5. Homepage: http://nco.sf.net\n"); (void)fprintf(stdout,"6. FAQ: http://nco.sf.net#FAQ\n"); (void)fprintf(stdout,"7. Help Forum: http://sf.net/p/nco/discussion/9830\n"); (void)fprintf(stdout,"8. Publications: http://nco.sf.net#pub\n"); (void)fprintf(stdout,"Post questions, suggestions, patches at http://sf.net/projects/nco\n"); } /* end nco_usg_prn() */ nco-4.5.4/src/nco/nco_ctl.h000066400000000000000000000067441264355130400154610ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Program flow control functions */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_ctl.h" *//* Program flow control functions */ #ifndef NCO_CTL_H #define NCO_CTL_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* stderr, FILE, NULL, printf */ #include /* strtod, strtol, malloc, getopt, exit */ #include /* strcmp() */ #include /* machine time */ #ifndef _MSC_VER # include /* POSIX stuff */ #endif /* 3rd party vendors */ #ifdef ENABLE_MPI #include /* MPI definitions */ #endif /* !ENABLE_MPI */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_mmr.h" /* Memory management */ #include "nco_pck.h" /* Packing and unpacking variables */ #include "nco_sng_utl.h" /* String utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ const char * /* O [sng] Compiler and version */ nco_cmp_get(void); /* [fnc] Return compiler and version */ void nco_exit /* [fnc] Wrapper for exit() */ (int rcd); /* I [enm] Return code */ void nco_exit_gracefully(void); /* [fnc] Clean up timers, file descriptors, memory, then exit */ void nco_exit_lbr_rcd(void); /* [fnc] Exit with netCDF library version as return code */ nco_bool /* [flg] Program does arithmetic */ nco_is_rth_opr /* [fnc] Query whether program does arithmetic */ (const int nco_prg_id); /* [enm] Program ID */ nco_bool /* [flg] Program does arithmetic and preserves rank */ nco_is_sz_rnk_prv_rth_opr /* [fnc] Is program size and rank-preserving arithmetic operator? */ (const int nco_prg_id, /* I [enm] Program ID */ const int nco_pck_plc); /* I [enm] Packing policy */ nco_bool /* [flg] Program is multi-file operator */ nco_is_mfo /* [fnc] Query whether program is multi-file operator */ (const int nco_prg_id); /* [enm] Program ID */ int /* O [rcd] Return code */ nco_ddra /* [fnc] Count operations */ (const char * const var_nm, /* I [sng] Variable name */ const char * const wgt_nm, /* I [sng] Weight name */ const ddra_info_sct * const ddra_info); /* I [sct] DDRA information */ void nco_dfl_case_tmr_typ_err(void); /* [fnc] Print error and exit for illegal switch(tmr_typ) case */ void nco_cnf_prn(void); /* [fnc] Print NCO configuration and help text */ void nco_lbr_vrs_prn(void); /* [fnc] Print netCDF library version */ const char * /* O [sng] MPI implementation */ nco_mpi_get(void); /* [fnc] Return MPI implementation */ const char * /* O [sng] Mnemonic that describes current NCO version */ nco_nmn_get(void); /* [fnc] Return mnemonic that describes current NCO version */ char * /* O [sng] nm_in stripped of any path (i.e., program name stub) */ nco_prg_prs /* [fnc] Strip program name to stub and set program ID */ (const char * const nm_in, /* I [sng] Name of program, i.e., argv[0] (may include path prefix) */ int * const nco_prg_lcl); /* O [enm] Enumerated number corresponding to nm_in */ void nco_usg_prn(void); /* [fnc] Print correct program usage */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_CTL_H */ nco-4.5.4/src/nco/nco_dbg.c000066400000000000000000000024041264355130400154130ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Debugging */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_dbg.h" /* Debugging */ void err_prn /* [fnc] Print formatted error messages */ (char *err_msg) /* I [sng] Formatted error message to print */ { /* Purpose: Print error message (currently only to stdout) approximately in GNU style, i.e., "program_name: ERROR error message....\n". Routine is intended to make error messages convenient to use in routines without routine itself needing access to copy of program. Therefore a copy of this routine should be placed in each main.c file, just like the program's nco_usg_prn() routine. */ /* Routine is more difficult to implement practically than it first seemed, because it assumes all calling routines have their error messages in a single string, when in reality, they often utilize var_args capabilities of fprintf() themselves and have multiple formatted inputs. Hold off for now. */ (void)fprintf(stdout,"%s: %s",nco_prg_nm_get(),err_msg); } /* end err_prn() */ nco-4.5.4/src/nco/nco_dbg.h000066400000000000000000000015431264355130400154230ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Debugging */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_dbg.h" *//* Debugging */ #ifndef NCO_DBG_H #define NCO_DBG_H /* Standard header files */ #include /* stderr, FILE, NULL, printf */ /* 3rd party vendors */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void err_prn /* [fnc] Print formatted error messages */ (char *err_msg); /* I [sng] Formatted error message to print */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_DBG_H */ nco-4.5.4/src/nco/nco_dmn_utl.c000066400000000000000000000426561264355130400163360ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Dimension utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_dmn_utl.h" /* Dimension utilities */ void nco_dmn_dfn /* [fnc] Define dimensions in output file */ (const char * const fl_nm, /* I [sng] Name of output file */ const int nc_id, /* I [id] netCDF output file ID */ dmn_sct ** const dmn, /* I [sct] Dimension structures to define in output file */ const int nbr_dmn) /* I [nbr] Number of dimension structures in structure list */ { /* Purpose: Define dimensions in output file */ int idx; int rcd=NC_NOERR; /* [rcd] Return code */ for(idx=0;idxnm,&dmn[idx]->id); /* If dimension has not been defined yet, define it */ if(rcd != NC_NOERR){ if(dmn[idx]->is_rec_dmn){ (void)nco_def_dim(nc_id,dmn[idx]->nm,NC_UNLIMITED,&(dmn[idx]->id)); }else{ (void)nco_def_dim(nc_id,dmn[idx]->nm,dmn[idx]->cnt,&(dmn[idx]->id)); } /* end else */ }else{ (void)fprintf(stderr,"%s: WARNING dimension \"%s\" is already defined in %s\n",nco_prg_nm_get(),dmn[idx]->nm,fl_nm); } /* end if */ } /* end loop over idx */ } /* end nco_dmn_dfn() */ dmn_sct * /* O [sct] Copy of input dimension structure */ nco_dmn_dpl /* [fnc] Duplicate input dimension structure */ (const dmn_sct * const dmn) /* I [sct] Dimension structure to duplicate */ { /* Purpose: nco_malloc() and return duplicate of input dmn_sct */ const void *dmn_vp=dmn; dmn_sct *dmn_cpy; dmn_cpy=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); /* Shallow copy structure */ (void)memcpy((void *)dmn_cpy,dmn_vp,sizeof(dmn_sct)); /* Make sure dmn_free() frees names when dimension is destructed */ if(dmn->nm) dmn_cpy->nm=(char *)strdup(dmn->nm); return dmn_cpy; } /* end nco_dmn_dpl() */ void nco_dmn_cpy /* [fnc] Copy dim elements from dim from source to target */ (dmn_sct * const dmn_trg, /* O [sct] Dimension structure to copy into */ const dmn_sct * const dmn_src) /* I [sct] Dimension structure to copy from */ { if(dmn_trg->nm) dmn_trg->nm=(char*)nco_free(dmn_trg->nm); /* Shallow copy elements */ *dmn_trg=*dmn_src; /* Re-copy name */ dmn_trg->nm=strdup(dmn_src->nm); return; } /* end nco_dmn_cpy() */ dmn_sct * /* O [sct] Output dimension structure */ nco_dmn_fll /* [fnc] Create and return completed dmn_sct */ (const int nc_id, /* I [id] netCDF input file ID */ const int dmn_id, /* I [id] Dimension ID */ const char * const dmn_nm) /* I [sng] Dimension name */ { /* Purpose: nco_malloc() and return a completed dmn_sct */ dmn_sct *dmn; int rcd=NC_NOERR; /* [rcd] Return code */ int rec_dmn_id; dmn=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); dmn->nm=(char *)strdup(dmn_nm); dmn->nm_fll=NULL; dmn->id=dmn_id; dmn->nc_id=nc_id; dmn->xrf=NULL; dmn->val.vp=NULL; dmn->is_crd_dmn=False; dmn->cid=-1; /* [id] Variable ID of associated coordinate, if any */ (void)nco_inq_dimlen(dmn->nc_id,dmn_id,&dmn->sz); /* Get record dimension ID */ (void)nco_inq(dmn->nc_id,(int *)NULL,(int *)NULL,(int *)NULL,&rec_dmn_id); if(dmn->id == rec_dmn_id){ dmn->is_rec_dmn=True; }else{ dmn->is_rec_dmn=False; } /* end if */ rcd=nco_inq_varid_flg(dmn->nc_id,dmn_nm,&dmn->cid); if(rcd == NC_NOERR){ dmn->is_crd_dmn=True; /* What type is coordinate? */ (void)nco_inq_vartype(dmn->nc_id,dmn->cid,&dmn->type); } /* end if */ dmn->cnk_sz=0L; dmn->cnt=dmn->sz; dmn->srt=0L; dmn->end=dmn->sz-1L; dmn->srd=1L; return dmn; } /* end nco_dmn_fll() */ dmn_sct * /* O [sct] Pointer to free'd dimension */ nco_dmn_free /* [fnc] Free all memory associated with dimension structure */ (dmn_sct *dmn) /* I/O [sct] Dimension to free */ { /* Threads: Routine is thread safe and calls no unsafe routines */ /* Purpose: Free all memory associated with a dynamically allocated dimension structure */ dmn->nm=(char *)nco_free(dmn->nm); /* Free structure pointer last */ dmn=(dmn_sct *)nco_free(dmn); return NULL; } /* end nco_dmn_free() */ void nco_dmn_cnk_mrg /* [fnc] Merge chunking information into dimension structures */ (dmn_sct ** const dmn, /* I [sct] Dimension structures to modify */ const int nbr_dmn, /* I [nbr] Number of dimension structures in structure list */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr) /* I [nbr] Number of dimensions with user-specified chunking */ { /* Purpose: Merge chunking information into dimension structures */ int dmn_idx; int cnk_idx; for(dmn_idx=0;dmn_idxnm,dmn[dmn_idx]->nm)){ dmn[dmn_idx]->cnk_sz=cnk_dmn[cnk_idx]->sz; break; } /* end if */ } /* end loop over cnk_idx */ } /* end loop over dmn */ } /* end nco_dmn_cnk_mrg() */ void nco_dmn_lmt_mrg /* [fnc] Merge limit structure information into dimension structures */ (dmn_sct ** const dmn, /* I [sct] Dimension structures to modify */ const int nbr_dmn, /* I [nbr] Number of dimension structures in structure list */ CST_X_PTR_CST_PTR_CST_Y(lmt_sct,lmt), /* I [sct] Dimension limit information */ const int lmt_nbr) /* I [nbr] Number of dimensions with user-specified limits */ { /* Purpose: Merge limit structure information into dimension structures */ int dmn_idx; int lmt_idx; for(dmn_idx=0;dmn_idxnm,dmn[dmn_idx]->nm)){ dmn[dmn_idx]->cnt=lmt[lmt_idx]->cnt; dmn[dmn_idx]->srt=lmt[lmt_idx]->srt; dmn[dmn_idx]->end=lmt[lmt_idx]->end; dmn[dmn_idx]->srd=lmt[lmt_idx]->srd; break; } /* end if */ } /* end loop over lmt_idx */ } /* end loop over dmn */ } /* end nco_dmn_lmt_mrg() */ dmn_sct ** /* O [sct] Pointer to free'd structure list */ nco_dmn_lst_free /* [fnc] Free memory associated with dimension structure list */ (dmn_sct **dmn_lst, /* I/O [sct] Dimension structure list to free */ const int dmn_nbr) /* I [nbr] Number of dimension structures in list */ { /* Threads: Routine is thread safe and calls no unsafe routines */ /* Purpose: Free all memory associated with dynamically allocated dimension structure list */ int idx; for(idx=0;idxxrf=dmn_2; dmn_2->xrf=dmn_1; } /* end nco_dmn_xrf() */ int /* O [flg] Dimension exists in scope of group (if rcd != NC_NOERR) */ nco_inq_dmn_grp_id /* [fnc] Return location and ID of named dimension in specified group */ (const int nc_id, /* I [id] netCDF group ID */ const char * const dmn_nm, /* I [sng] Dimension name */ int * const dmn_id, /* O [id] Dimension ID in specified group */ int * const grp_id_dmn) /* O [id] Group ID where dimension visible to specified group is defined */ { /* Purpose: Return location and ID of named dimension in specified group ncks -O -D 1 -v two_dmn_rec_var ~/nco/data/in_grp.nc ~/foo.nc */ const char fnc_nm[]="nco_inq_dmn_grp_id()"; /* [sng] Function name */ const int flg_prn=1; /* [flg] Retrieve all dimensions in all parent groups */ int dmn_ids[NC_MAX_DIMS]; /* [nbr] Dimensions IDs array */ int dmn_idx; /* [idx] Dimension index */ int dmn_nbr; /* [nbr] Number of dimensions for group */ int rcd; /* [rcd] Return code */ nco_bool grp_dfn_fnd=False; /* [flg] Group of definition has been found */ /* Initialize search to start with specified group */ *grp_id_dmn=nc_id; rcd=nco_inq_dimid_flg(*grp_id_dmn,dmn_nm,dmn_id); if(nco_dbg_lvl_get() >= nco_dbg_std){ char *grp_nm_fll; /* [sng] Group name */ char dmn_nm_lcl[NC_MAX_NAME]; /* [sng] Dimension name */ size_t grp_nm_fll_lng; /* [nbr] Length of group name */ (void)nco_inq_grpname_full(*grp_id_dmn,&grp_nm_fll_lng,(char *)NULL); grp_nm_fll=(char *)nco_malloc((grp_nm_fll_lng+1L)*sizeof(char)); (void)nco_inq_grpname_full(*grp_id_dmn,(size_t *)NULL,grp_nm_fll); (void)nco_inq_dimids(*grp_id_dmn,&dmn_nbr,dmn_ids,flg_prn); (void)fprintf(stdout,"%s: %s nco_inq_dimids() reports following dimensions/IDs are visible to group %s:\n",nco_prg_nm_get(),fnc_nm,grp_nm_fll); for(dmn_idx=0;dmn_idx= nco_dbg_std){ char *grp_nm_fll; /* [sng] Group name */ size_t grp_nm_fll_lng; /* [nbr] Length of group name */ (void)nco_inq_grpname_full(*grp_id_dmn,&grp_nm_fll_lng,(char *)NULL); grp_nm_fll=(char *)nco_malloc((grp_nm_fll_lng+1L)*sizeof(char)); (void)nco_inq_grpname_full(*grp_id_dmn,(size_t *)NULL,grp_nm_fll); (void)fprintf(stdout,"%s: %s reports dimension %s was%s defined in group %s\n",nco_prg_nm_get(),fnc_nm,dmn_nm,(dmn_idx < dmn_nbr) ? "" : " not",grp_nm_fll); if(grp_nm_fll) grp_nm_fll=(char *)nco_free(grp_nm_fll); } /* endif dbg */ if(dmn_idx < dmn_nbr){ grp_dfn_fnd=True; }else{ /* Overwrite current group ID with parent group ID */ rcd=nco_inq_grp_parent_flg(*grp_id_dmn,grp_id_dmn); } /* end else */ } /* end while */ return rcd; } /* end nco_inq_dmn_grp_id */ void nco_dmn_sct_cmp /* [fnc] Check that dims in list 2 are a subset of list 1 and that they are the same size */ (dmn_sct ** const dim_1, /* I [sct] Dimension list 1 */ const int nbr_dmn_1, /* I [nbr] Number of dimension structures in structure list */ dmn_sct **const dim_2, /* I [sct] Dimension list 1 */ const int nbr_dmn_2, /* I [nbr] Number of dimension structures in structure list */ const char *const fl_sng_1, /* I [sng] Name of first file */ const char *fl_sng_2) /* I [sng] Name of second file */ { int idx; int jdx; for(idx=0;idxnm,dim_1[jdx]->nm)) break; if(jdx == nbr_dmn_1){ (void)fprintf(stderr,"%s: ERROR dimension \"%s\" in second file %s is not present in first file %s\n",nco_prg_nm_get(),dim_2[idx]->nm,fl_sng_2,fl_sng_1); nco_exit(EXIT_FAILURE); } /* end if missing dimension */ if(dim_2[idx]->cnt != dim_1[jdx]->cnt){ (void)fprintf(stderr,"%s: ERROR %sdimension size mismatch: dimension %s in file %s is size %li while dimension %s in file %s is size %li\n",nco_prg_nm_get(),(dim_1[jdx]->is_rec_dmn) ? "record " : "",dim_1[jdx]->nm,fl_sng_1,dim_1[jdx]->cnt,dim_2[idx]->nm,fl_sng_2,dim_2[idx]->cnt); nco_exit(EXIT_FAILURE); } /* endif size mismatch */ } /* end loop over dimensions */ } /* end nco_dmn_sct_cmp() */ nm_id_sct * /* O [sct] List of dimensions associated with input variable list */ nco_dmn_lst_ass_var /* [fnc] Create list of all dimensions associated with input variable list */ (const int nc_id, /* I [id] netCDF input-file ID */ const nm_id_sct * const var, /* I [sct] Variable list */ const int nbr_var, /* I [nbr] Number of variables in list */ int * const nbr_dmn) /* O [nbr] Number of dimensions associated with input variable list */ { /* Purpose: Create list of all dimensions associated with input variable list */ nco_bool dmn_has_been_placed_on_list; char dmn_nm[NC_MAX_NAME]; int dmn_id[NC_MAX_DIMS]; int idx_dmn_in; int idx_var; int idx_var_dmn; int idx_dmn_lst; int nbr_dmn_in; int nbr_var_dmn; nm_id_sct *dmn; *nbr_dmn=0; /* Get number of dimensions */ (void)nco_inq(nc_id,&nbr_dmn_in,(int *)NULL,(int *)NULL,(int *)NULL); /* Number of input dimensions is upper bound on number of output dimensions */ dmn=(nm_id_sct *)nco_malloc(nbr_dmn_in*sizeof(nm_id_sct)); /* ...For each dimension in file... */ for(idx_dmn_in=0;idx_dmn_indmn_nm,dmn[dmn_idx]->nm)){ dmn[dmn_idx]->cnt=lmt_all_lst[lmt_idx]->dmn_cnt; dmn[dmn_idx]->srt=0; dmn[dmn_idx]->end=lmt_all_lst[lmt_idx]->dmn_cnt-1; dmn[dmn_idx]->srd=1L; break; } /* end if */ } /* end loop over lmt_idx */ } /* end loop over dmn */ } /* end nco_dmn_lmt_all_mrg() */ nco-4.5.4/src/nco/nco_dmn_utl.h000066400000000000000000000132431264355130400163310ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Dimension utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_dmn_utl.h" *//* Dimension utilities */ #ifndef NCO_DMN_UTL_H #define NCO_DMN_UTL_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* stderr, FILE, NULL, printf */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_mmr.h" /* Memory management */ #include "nco_sng_utl.h" /* String utilities */ #include "nco_grp_utl.h" /* Group utilities */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ void nco_dmn_dfn /* [fnc] Define dimensions in output file */ (const char * const fl_nm, /* I [sng] Name of output file */ const int nc_id, /* I [id] netCDF output file ID */ dmn_sct ** const dmn, /* I [sct] Dimension structures to define in output file */ const int nbr_dmn); /* I [nbr] Number of dimension structures in structure list */ dmn_sct * /* O [sct] copy of input dimension structure */ nco_dmn_dpl /* [fnc] Duplicate input dimension structure */ (const dmn_sct * const dmn); /* I [sct] Dimension structure to duplicate */ void nco_dmn_cpy /* [fnc] Copy dim elements from dim from source to target */ (dmn_sct *const dmn_t, /* O [sct] Dimension structure to copy into */ const dmn_sct * const dmn_s); dmn_sct * /* O [sct] Output dimension structure */ nco_dmn_fll /* [fnc] Create and return completed dmn_sct */ (const int nc_id, /* I [id] netCDF input file ID*/ const int dmn_id, /* I [id] Dimension ID */ const char * const dmn_nm); /* I [sng] Dimension name */ dmn_sct * /* O [sct] Pointer to free'd dimension */ nco_dmn_free /* [fnc] Free all memory associated with dimension structure */ (dmn_sct *dmn); /* I/O [sct] Dimension to free */ void nco_dmn_cnk_mrg /* [fnc] Merge chunking information into dimension structures */ (dmn_sct ** const dmn, /* I [sct] Dimension structures to modify */ const int nbr_dmn, /* I [nbr] Number of dimension structures in structure list */ CST_X_PTR_CST_PTR_CST_Y(cnk_dmn_sct,cnk_dmn), /* I [sct] Chunking information */ const int cnk_nbr); /* I [nbr] Number of dimensions with user-specified chunking */ void nco_dmn_lmt_mrg /* [fnc] Merge limit structure information into dimension structures */ (dmn_sct ** const dmn, /* I [sct] Dimension structures to modify */ const int nbr_dmn, /* I [nbr] Number of dimension structures in structure list */ CST_X_PTR_CST_PTR_CST_Y(lmt_sct,lmt), /* I [sct] Dimension limit information */ const int lmt_nbr); /* I [nbr] Number of dimensions with user-specified limits */ dmn_sct ** /* O [sct] Pointer to free'd structure list */ nco_dmn_lst_free /* [fnc] Free memory associated with dimension structure list */ (dmn_sct **dmn_lst, /* I/O [sct] Dimension structure list to free */ const int dmn_nbr); /* I [nbr] Number of dimension structures in list */ nm_id_sct * /* O [sct] Dimension list */ nco_dmn_lst_mk /* [fnc] Attach dimension IDs to dimension list */ (const int nc_id, /* I [id] netCDF file ID */ CST_X_PTR_CST_PTR_CST_Y(char,dmn_lst_in), /* I [sng] User-specified list of dimension names */ const int nbr_dmn); /* I [nbr] Total number of dimensions in list */ void nco_dmn_xrf /* [fnc] Crossreference xrf elements of dimension structures */ (dmn_sct * const dmn_1, /* I/O [sct] Dimension structure */ dmn_sct * const dmn_2); /* I/O [sct] Dimension structure */ int /* O [flg] Dimension exists in scope of group (if rcd != NC_NOERR) */ nco_inq_dmn_grp_id /* [fnc] Return location and ID of named dimension in specified group */ (const int nc_id, /* I [id] netCDF group ID */ const char * const dmn_nm, /* I [sng] Dimension name */ int * const dmn_id, /* O [id] Dimension ID in specified group */ int * const grp_id_dmn); /* O [id] Group ID where dimension visible to specified group is defined */ nm_id_sct * /* O [sct] List of dimensions associated with input variable list */ nco_dmn_lst_ass_var /* [fnc] Create list of all dimensions associated with input variable list */ (const int nc_id, /* I [id] netCDF input-file ID */ const nm_id_sct * const var, /* I [sct] Variable list */ const int nbr_var, /* I [nbr] Number of variables in list */ int * const nbr_dmn); /* O [nbr] Number of dimensions associated with input variable list */ void nco_dmn_sct_cmp /* [fnc] Check that dims in list 2 are a subset of list 1 and that they are the same size */ (dmn_sct ** const dim_1n, /* I [sct] Dimension list 1 */ const int nbr_dmn_1, /* I [nbr] Number of dimension structures in structure list */ dmn_sct **const dim_2, /* I [sct] Dimension list 1 */ const int nbr_dmn_2, /* I [nbr] Number of dimension structures in structure list */ const char *const fl_sng_1, /* I [sng] Name of first file */ const char *fl_sng_2); /* I [sng] Name of second file */ void nco_dmn_lmt_all_mrg /* [fnc] Merge limit structure information into dimension structures */ (dmn_sct ** const dmn, /* I [sct] Dimension structures to modify */ const int nbr_dmn, /* I [nbr] Number of dimension structures in structure list */ CST_X_PTR_CST_PTR_CST_Y(lmt_msa_sct,lmt_all_lst), /* I [sct] Dimension limit information */ const int lmt_nbr); /* I [nbr] Number of dimensions with user-specified limits */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_DMN_UTL_H */ nco-4.5.4/src/nco/nco_fl_utl.c000066400000000000000000002467601264355130400161630ustar00rootroot00000000000000/* $Header$ */ /* Purpose: File manipulation */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ #include "nco_fl_utl.h" /* File manipulation */ int /* O [enm] Mode flag for nco_create() call */ nco_create_mode_mrg /* [fnc] Merge clobber mode with user-specified file format */ (const int md_clobber, /* I [enm] Clobber mode (NC_CLOBBER or NC_NOCLOBBER) */ const int fl_out_fmt) /* I [enm] Output file format */ { /* Purpose: Merge clobber mode with flag determined by fl_out_fmt to produce output mode flag md_clobber: Either NC_CLOBBER or NC_NOCLOBBER md_create: md_clobber OR'd with (user-specified) file format mode */ int md_create; /* O [enm] Mode flag for nco_create() call */ if(md_clobber != NC_CLOBBER && md_clobber != NC_NOCLOBBER){ (void)fprintf(stderr,"%s: ERROR nco_create_mode_mrg() received unknown clobber mode md_clobber\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* endif */ md_create=md_clobber; if(fl_out_fmt == NC_FORMAT_64BIT){ md_create|=NC_64BIT_OFFSET; }else if(fl_out_fmt == NC_FORMAT_CDF5){ md_create|=NC_64BIT_DATA; }else if(fl_out_fmt == NC_FORMAT_NETCDF4){ md_create|=NC_NETCDF4; }else if(fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC){ md_create|=NC_NETCDF4|NC_CLASSIC_MODEL; }else if(fl_out_fmt == NC_COMPRESS){ /* fxm: is NC_COMPRESS legal? */ md_create|=NC_COMPRESS; }else if(fl_out_fmt != NC_FORMAT_CLASSIC){ (void)fprintf(stderr,"%s: ERROR nco_create_mode_mrg() received unknown file format = %d\n",nco_prg_nm_get(),fl_out_fmt); nco_exit(EXIT_FAILURE); } /* end else fl_out_fmt */ #ifdef ENABLE_MPI md_create|=NC_NETCDF4|NC_MPIIO; #endif /* !ENABLE_MPI */ return md_create; } /* end nco_create_mode_mrg() */ int /* [rcd] Return code */ nco_create_mode_prs /* [fnc] Parse user-specified file format */ (const char * const fl_fmt_sng, /* I [sng] User-specified file format string */ int * const fl_fmt_enm) /* O [enm] Output file format */ { int rcd=NC_NOERR; /* [rcd] Return code */ /* Careful! Some valid format strings are subsets of other valid format strings: "classic" is a sub-string of itself and of "netcdf4_classic" "netcdf4" is a sub-string of itself and of "netcdf4_classic" */ if(strcasestr("classic",fl_fmt_sng) && !strcasestr(fl_fmt_sng,"netcdf4")){ /* If "classic" contains string and string does not contain "netcdf4" */ *fl_fmt_enm=NC_FORMAT_CLASSIC; }else if(strcasestr("64bit",fl_fmt_sng)){ /* If "64bit" contains string */ *fl_fmt_enm=NC_FORMAT_64BIT; }else if(strcasestr(fl_fmt_sng,"netcdf4")){ /* If string contains "netcdf4" */ #ifdef ENABLE_NETCDF4 if(strcasestr("netcdf4",fl_fmt_sng)){ /* If "netcdf4" contains string */ *fl_fmt_enm=NC_FORMAT_NETCDF4; }else if(strcasestr("netcdf4_classic",fl_fmt_sng)){ /* If "netcdf4_classic" contains string */ *fl_fmt_enm=NC_FORMAT_NETCDF4_CLASSIC; } /* endif NETCDF4 */ #else /* !ENABLE_NETCDF4 */ (void)fprintf(stderr,"%s: ERROR This NCO was not built with netCDF4 and cannot create the requested netCDF4 file format. HINT: Re-try with netCDF3 file format, either by omitting the filetype specification, or by explicitly specifying the \"-3\", \"--fl_fmt=classic\", \"-6\", or \"--fl_fmt=64bit\" options.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); #endif /* !ENABLE_NETCDF4 */ }else if(strcasestr("pnetcdf",fl_fmt_sng)){ #ifdef ENABLE_MPI /* If "pnetcdf" contains string */ *fl_fmt_enm=NC_FORMAT_CDF5; #else /* !ENABLE_MPI */ (void)fprintf(stderr,"%s: ERROR This NCO was not built with PnetCDF (http://trac.mcs.anl.gov/projects/parallel-netcdf) and cannot create the requested PnetCDF file format. HINT: Re-try with supported file format such as \"classic\" or \"64bit\".\n",nco_prg_nm_get()); #endif /* !ENABLE_MPI */ }else{ (void)fprintf(stderr,"%s: ERROR Unknown output file format \"%s\" requested. Valid formats are (unambiguous leading characters of) \"classic\", \"64bit\", \"netcdf4\", and \"netcdf4_classic\".\n",nco_prg_nm_get(),fl_fmt_sng); nco_exit(EXIT_FAILURE); } /* endif fl_fmt_enm */ return rcd; /* [rcd] Return code */ } /* end nco_create_mode_prs() */ void nco_fl_cmp_err_chk(void) /* [fnc] Perform error checking on file */ { /* Purpose: Perform error checking on file */ } /* end nco_fl_cmp_err_chk() */ void nco_fl_fmt_vet /* [fnc] Verify output file format supports requested actions */ (const int fl_fmt, /* I [enm] Output file format */ const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ const int dfl_lvl) /* I [enm] Deflate level [0..9] */ { /* Purpose: Verify output file format supports requested actions */ if(cnk_nbr > 0 && !(fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC)) (void)fprintf(stdout,"%s: WARNING Attempt to chunk variables in output file which has netCDF format %s. Chunking is only supported by netCDF filetypes NC_FORMAT_NETCDF4 and NC_FORMAT_NETCDF4_CLASSIC. Command will attempt to complete but without chunking. HINT: re-run command and change output type to netCDF4 using \"-4\", \"--fl_fmt=netcdf4\", or \"--fl_fmt=netcdf4_classic\" option.\n",nco_prg_nm_get(),nco_fmt_sng(fl_fmt)); if(dfl_lvl >= 0 && !(fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC)) (void)fprintf(stdout,"%s: WARNING Attempt to deflate (compress) variables in output file which has netCDF format %s. Deflation is only supported by netCDF filetypes NC_FORMAT_NETCDF4 and NC_FORMAT_NETCDF4_CLASSIC. Command will attempt to complete but without deflation. HINT: re-run command and change output type to netCDF4 using \"-4\", (same as \"--fl_fmt=netcdf4\"), or \"-7\" (same as \"--fl_fmt=netcdf4_classic\") option.\n",nco_prg_nm_get(),nco_fmt_sng(fl_fmt)); } /* end nco_nco_fl_fmt_vet() */ void nco_fl_overwrite_prm /* [fnc] Obtain user consent to overwrite output file */ (const char * const fl_nm) /* I [sng] Name of file */ { /* Purpose: Obtain user consent to overwrite output file (or die trying) */ const char fnc_nm[]="nco_fl_overwrite_prm()"; /* [sng] Function name */ int rcd_sys; struct stat stat_sct; /* Use stat() to determine if output file already exists */ rcd_sys=stat(fl_nm,&stat_sct); /* When output file already exists, query user whether to overwrite */ if(rcd_sys != -1){ char garbage; char usr_rpl='z'; short nbr_itr=0; /* fxm TODO nco199: Internationalize (i18n) NCO with gettext() */ while(usr_rpl != 'n' && usr_rpl != 'y'){ nbr_itr++; if(nbr_itr > NCO_MAX_NBR_USR_INPUT_RETRY){ (void)fprintf(stdout,"\n%s: ERROR %s reports %d failed attempts to obtain valid interactive input. Assuming non-interactive shell and exiting.\n",nco_prg_nm_get(),fnc_nm,nbr_itr-1); nco_exit(EXIT_FAILURE); } /* end if */ (void)fprintf(stdout,"%s: overwrite %s (y/n)? ",nco_prg_nm_get(),fl_nm); (void)fflush(stdout); usr_rpl=(char)fgetc(stdin); /* Allow one carriage return per response free of charge */ if(usr_rpl == '\n') usr_rpl=(char)fgetc(stdin); /* Treat other charcacters after the last question/prompt, and before the next, as garbage */ do{garbage=fgetc(stdin);} while(garbage != '\n' && garbage != EOF); /* (void)fflush(stdin); comp.lang.c 20000212 and http://www.eskimo.com/~scs/C-faq/q12.18.html C FAQ Author Steve Summit explains why not to use fflush(stdin) and how best to manually clean stdin of unwanted residue */ } /* end while */ if(usr_rpl == 'n') nco_exit(EXIT_SUCCESS); } /* end if rcd_sys != -1 */ } /* end nco_fl_overwrite_prm() */ #ifdef _MSC_VER void nco_fl_chmod(const char * const fl_nm){} #else /* !_MSC_VER */ void nco_fl_chmod /* [fnc] Ensure file is user/owner-writable */ (const char * const fl_nm) /* I [sng] Name of file */ { /* Purpose: Make file user/owner-writable Uses chmod() C-library call rather than chmod shell program Routine assumes that output file already exists, but is of unknown mode */ const char fnc_nm[]="nco_fl_chmod()"; /* [sng] Function name */ int rcd_sys; mode_t fl_md; mode_t fl_usr_md; mode_t fl_usr_wrt_md; struct stat stat_sct; /* Output file now guaranteed to exist. Perform stat() to check its permissions. */ rcd_sys=stat(fl_nm,&stat_sct); /* 20120228 Ensure output file is writable even when input file is not stat structure includes st_mode field which includes following flags: mode_t st_mode S_IRWXU 00700 mask for file owner permissions S_IWUSR 00200 owner has write permission Method of checking: First bit-wise "and" (& S_IRWXU) uses mask to strip full, multibyte, file mode flag of all but user/owner byte Second bit-wise "and" (& S_IWUSR) is "true" (non-zero) iff owner write permission is set */ fl_md=stat_sct.st_mode; fl_usr_md=fl_md & S_IRWXU; fl_usr_wrt_md=fl_usr_md & S_IWUSR; if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: %s reports permissions for file %s are (octal) = %lo\n",nco_prg_nm_get(),fnc_nm,fl_nm,(unsigned long)fl_md); if(!fl_usr_wrt_md){ /* Set user-write bit of output file */ fl_md=fl_md | S_IWUSR; rcd_sys=chmod(fl_nm,fl_md); if(rcd_sys == -1){ #ifndef __GNUG__ (void)fprintf(stdout,"%s: %s reports chmod() returned error \"%s\"\n",nco_prg_nm_get(),fnc_nm,strerror(errno)); #endif /* __GNUG__ */ (void)fprintf(stdout,"%s: ERROR Unable to make output file writable by user, exiting...\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* endif rcd_sys */ } /* end if chmod */ } /* end nco_fl_chmod() */ #endif /* !_MSC_VER */ void nco_fl_cp /* [fnc] Copy first file to second */ (const char * const fl_src, /* I [sng] Name of source file to copy */ const char * const fl_dst) /* I [sng] Name of destination file */ { /* Purpose: Copy first file to second */ char *cmd_cp; char *fl_dst_cdl; char *fl_src_cdl; #ifdef _MSC_VER const char cmd_cp_fmt[]="copy %s %s"; #else /* !_MSC_VER */ const char cmd_cp_fmt[]="cp %s %s"; #endif /* !_MSC_VER */ int rcd; const int fmt_chr_nbr=4; /* Perform system() call iff files are not identical */ if(!strcmp(fl_src,fl_dst)){ if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Temporary and final files %s are identical---no need to copy.\n",nco_prg_nm_get(),fl_src); return; } /* end if */ /* 20131227 Allow for whitespace characters in fl_dst Assume CDL translation results in acceptable name for shell commands */ fl_src_cdl=nm2sng_fl(fl_src); fl_dst_cdl=nm2sng_fl(fl_dst); /* Construct and execute copy command */ cmd_cp=(char *)nco_malloc((strlen(cmd_cp_fmt)+strlen(fl_src_cdl)+strlen(fl_dst_cdl)-fmt_chr_nbr+1UL)*sizeof(char)); if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: Copying %s to %s...",nco_prg_nm_get(),fl_src_cdl,fl_dst_cdl); (void)sprintf(cmd_cp,cmd_cp_fmt,fl_src_cdl,fl_dst_cdl); rcd=system(cmd_cp); if(rcd == -1){ (void)fprintf(stdout,"%s: ERROR nco_fl_cp() is unable to execute cp command \"%s\"\n",nco_prg_nm_get(),cmd_cp); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"done\n"); cmd_cp=(char *)nco_free(cmd_cp); if(fl_dst_cdl) fl_dst_cdl=(char *)nco_free(fl_dst_cdl); if(fl_src_cdl) fl_src_cdl=(char *)nco_free(fl_src_cdl); } /* end nco_fl_cp() */ #ifdef _MSC_VER char * nco_fl_info_get(const char *){return NULL;} #else /* !_MSC_VER */ char * /* O [sng] Canonical file name*/ nco_fl_info_get /* [fnc] Determine canonical filename and properties */ (const char * const fl_nm_lcl) /* I [sng] Name of file */ { /* Purpose: Return canonical filename of by removing all symbolic links */ int rcd; char *fl_nm_cnc=NULL; /* [sng] Canonical file name */ struct stat stat_sct; /* Does file exist on local system? */ rcd=stat(fl_nm_lcl,&stat_sct); if(rcd == -1) (void)fprintf(stderr,"%s: INFO File %s does not exist on local system\n",nco_prg_nm_get(),fl_nm_lcl); /* Is file a symbolic link? */ rcd=lstat(fl_nm_lcl,&stat_sct); #ifndef NECSX if(rcd != -1 && S_ISLNK(stat_sct.st_mode)){ #else /* NECSX */ if(rcd != -1 && ((stat_sct.st_mode & S_IFMT) == S_IFLNK)){ /* fxm: This is BSD not POSIX */ #endif /* NECSX */ #if (defined HAVE_CANONICALIZE_FILE_NAME) && 0 /* 20040619: Function prototype is not found (perhaps due to aggressive standard switches) by NCO, althouth configure.ac finds it */ /* Remember to free() fl_nm_cnc after using it */ fl_nm_cnc=(char *)canonicalize_file_name(fl_nm_lcl); if(fl_nm_cnc){ (void)fprintf(stderr,"%s: INFO Local file %s is symbolic link to %s",nco_prg_nm_get(),fl_nm_lcl,fl_nm_cnc); fl_nm_cnc=(char *)nco_free(fl_nm_cnc); }else{ (void)fprintf(stderr,"%s: INFO Local file %s is symbolic link but does not canonicalize",nco_prg_nm_get(),fl_nm_lcl); } /* endif link canonicalizes */ #else /* !HAVE_CANONICALIZE_FILE_NAME */ (void)fprintf(stderr,"%s: INFO File %s is a symbolic link\n",nco_prg_nm_get(),fl_nm_lcl); #endif /* !HAVE_CANONICALIZE_FILE_NAME */ } /* endif symbolic link */ return fl_nm_cnc; } /* end nco_fl_info_get() */ #endif /* !_MSC_VER */ char ** /* O [sng] List of user-specified filenames */ nco_fl_lst_mk /* [fnc] Create file list from command line positional arguments */ (CST_X_PTR_CST_PTR_CST_Y(char,argv), /* I [sng] Argument list */ const int argc, /* I [nbr] Argument count */ int arg_crr, /* I [idx] Index of current argument */ int * const fl_nbr, /* O [nbr] Number of files in input file list */ char ** const fl_out, /* I/O [sng] Name of output file */ nco_bool *FL_LST_IN_FROM_STDIN) /* O [flg] fl_lst_in comes from stdin */ { /* Purpose: Parse positional arguments on command line Name of calling program plays a role in this */ /* Assume command-line switches have been digested already (e.g., by getopt()) Assume argv[arg_crr] points to first positional argument (i.e., first argument following all switches and their arugments). fl_out is filled in if it was not specified as a command line switch Multi-file operators take input filenames from positional arguments, if any Otherwise, multi-file operators try to get input filenames from stdin */ nco_bool FL_OUT_FROM_PSN_ARG=True; /* [flg] fl_out comes from positional argument */ char **fl_lst_in=NULL_CEWI; /* [sng] List of user-specified filenames */ int idx; int fl_nm_sz_wrn=255; int psn_arg_fst=0; /* [nbr] Offset for expected number of positional arguments */ int psn_arg_nbr; /* [nbr] Number of remaining positional arguments */ int nco_prg_id; /* Program ID */ nco_prg_id=nco_prg_id_get(); /* [enm] Program ID */ psn_arg_nbr=argc-arg_crr; /* [nbr] Number of remaining positional arguments */ /* Is output file already known from command line switch (i.e., -o fl_out)? */ if(*fl_out){ /* fl_out is already known so interpret all remaining positional arguments as input files */ FL_OUT_FROM_PSN_ARG=False; /* Offset expected number of positional arguments by one to account for fl_out being known */ psn_arg_fst=1; } /* end if */ /* Might there be problems with any specified files? */ for(idx=arg_crr;idx= fl_nm_sz_wrn) (void)fprintf(stderr,"%s: WARNING filename %s is very long (%ld characters) and may not be portable to older operating systems\n",nco_prg_nm_get(),argv[idx],(long int)strlen(argv[idx])); } /* end loop over idx */ /* All operators except multi-file operators must have at least one positional argument */ if(!nco_is_mfo(nco_prg_id) && psn_arg_nbr == 0){ (void)fprintf(stdout,"%s: ERROR received %d filenames; need at least one\n",nco_prg_nm_get(),psn_arg_nbr); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ switch(nco_prg_id){ case ncap: case ncatted: case ncks: case ncrename: /* Operators with single fl_in and optional fl_out */ if(psn_arg_nbr > 2-psn_arg_fst){ if(FL_OUT_FROM_PSN_ARG) (void)fprintf(stdout,"%s: ERROR received %d filenames; need no more than two\n",nco_prg_nm_get(),psn_arg_nbr); else (void)fprintf(stdout,"%s: ERROR received %d input filenames; need no more than one (output file was specified with -o switch)\n",nco_prg_nm_get(),psn_arg_nbr); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ fl_lst_in=(char **)nco_malloc(sizeof(char *)); /* fxm: free() this memory sometime */ fl_lst_in[(*fl_nbr)++]=(char *)strdup(argv[arg_crr++]); /* Output file is optional for these operators */ if(arg_crr == argc-1) *fl_out=(char *)strdup(argv[arg_crr]); return fl_lst_in; /* break; *//* NB: break after return in case statement causes SGI cc warning */ case ncbo: case ncflint: /* Operators with dual fl_in and required fl_out */ if(psn_arg_nbr != 3-psn_arg_fst){ if(FL_OUT_FROM_PSN_ARG) (void)fprintf(stdout,"%s: ERROR received %d filenames; need exactly three\n",nco_prg_nm_get(),psn_arg_nbr); else (void)fprintf(stdout,"%s: ERROR received %d input filenames; need exactly two (output file was specified with -o switch)\n",nco_prg_nm_get(),psn_arg_nbr); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case ncpdq: case ncwa: /* Operators with single fl_in and required fl_out */ if(psn_arg_nbr != 2-psn_arg_fst){ if(FL_OUT_FROM_PSN_ARG) (void)fprintf(stdout,"%s: ERROR received %d filenames; need exactly two\n",nco_prg_nm_get(),psn_arg_nbr); else (void)fprintf(stdout,"%s: ERROR received %d input filenames; need exactly one (output file was specified with -o switch)\n",nco_prg_nm_get(),psn_arg_nbr); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ break; case ncra: case ncfe: case ncrcat: case ncecat: case ncge: /* Operators with multiple fl_in and required fl_out */ if(psn_arg_nbr < 2-psn_arg_fst){ /* If multi-file operator has no positional arguments for input files... */ if(nco_is_mfo(nco_prg_id) && ((!FL_OUT_FROM_PSN_ARG && psn_arg_nbr == 0) || (FL_OUT_FROM_PSN_ARG && psn_arg_nbr == 1))){ /* ...then try to obtain input files from stdin... */ char *fl_in=NULL; /* [sng] Input file name */ FILE *fp_in; /* [enm] Input file handle */ char *bfr_in; /* [sng] Temporary buffer for stdin filenames */ int cnv_nbr; /* [nbr] Number of scanf conversions performed this scan */ long fl_lst_in_lng; /* [nbr] Number of characters in input file name list */ char fmt_sng[10]; size_t fl_nm_lng; /* [nbr] Filename length */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG nco_fl_lst_mk() reports input files not specified as positional arguments. Attempting to read from stdin instead...\n",nco_prg_nm_get()); /* Initialize information to read stdin */ fl_lst_in_lng=0L; /* [nbr] Number of characters in input file name list */ if(fl_in == NULL){ fp_in=stdin; /* [enm] Input file handle */ }else{ if((fp_in=fopen(fl_in,"r")) == NULL){ (void)fprintf(stderr,"%s: ERROR opening file containing input filename list %s\n",nco_prg_nm_get(),fl_in); nco_exit(EXIT_FAILURE); } /* endif err */ } /* endelse */ /* Allocate temporary space for input buffer */ #define FL_NM_IN_MAX_LNG 256 /* [nbr] Maximum length of single input file name */ #define FL_LST_IN_MAX_LNG 504576001 /* [nbr] Maximum length of input file list */ /* 20121207: 10 MB per request of S. McGinnis 20121130 20140711: 50 MB per request of Christine Smit 20140711 for 30 years of hourly data files each 192 characters long */ bfr_in=(char *)nco_malloc((FL_NM_IN_MAX_LNG+1L)*sizeof(char)); (void)sprintf(fmt_sng,"%%%ds\n",FL_NM_IN_MAX_LNG); /* Assume filenames are whitespace-separated Format string "%256s\n" tells scanf() to: 1. Skip any initial whitespace 2. Read first block of non-whitespace characters (up to 256 of them) into buffer 3. \n allows entries to be separated by carriage returns */ while(((cnv_nbr=fscanf(fp_in,fmt_sng,bfr_in)) != EOF) && (fl_lst_in_lng < FL_LST_IN_MAX_LNG)){ if(cnv_nbr == 0){ (void)fprintf(stdout,"%s: ERROR stdin input not convertable to filename. HINT: Maximum length for input filenames is %d characters. HINT: Separate filenames with whitespace. Carriage returns are automatically stripped out.\n",nco_prg_nm_get(),FL_NM_IN_MAX_LNG); nco_exit(EXIT_FAILURE); } /* endif err */ fl_nm_lng=strlen(bfr_in); fl_lst_in_lng+=fl_nm_lng; (*fl_nbr)++; if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG input file #%d is \"%s\", filename length=%li\n",nco_prg_nm_get(),*fl_nbr,bfr_in,(long int)fl_nm_lng); /* Increment file number */ fl_lst_in=(char **)nco_realloc(fl_lst_in,(*fl_nbr*sizeof(char *))); fl_lst_in[(*fl_nbr)-1]=(char *)strdup(bfr_in); } /* end while */ /* Finished reading list. Close file resource if one was opened. */ if(fl_in != NULL && fp_in != NULL) (void)fclose(fp_in); #if 0 /* 20040621: Following flusher does no harm on Linux However, AIX gets caught in an infinite loop here */ /* Discard characters remainining in stdin */ char chr_foo; while((chr_foo=getchar()) != '\n' && chr_foo != EOF){ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG Read and discarded \'%c\'\n",nco_prg_nm_get(),chr_foo); } /* end while */ #endif /* endif 0 */ /* Free temporary buffer */ bfr_in=(char *)nco_free(bfr_in); if(fl_lst_in_lng >= FL_LST_IN_MAX_LNG){ (void)fprintf(stdout,"%s: ERROR Total length of fl_lst_in from stdin exceeds %d characters. Possible misuse of feature. If your input file list is really this long, post request to developer's forum (http://sf.net/p/nco/discussion/9831) to expand FL_LST_IN_MAX_LNG\n",nco_prg_nm_get(),FL_LST_IN_MAX_LNG); nco_exit(EXIT_FAILURE); } /* endif err */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG Read %d filenames in %li characters from stdin\n",nco_prg_nm_get(),*fl_nbr,(long)fl_lst_in_lng); if(*fl_nbr > 0) *FL_LST_IN_FROM_STDIN=True; else (void)fprintf(stderr,"%s: WARNING Tried and failed to get input filenames from stdin\n",nco_prg_nm_get()); } /* endif multi-file operator without positional arguments for fl_in */ if(!*FL_LST_IN_FROM_STDIN){ if(FL_OUT_FROM_PSN_ARG) (void)fprintf(stdout,"%s: ERROR received %d filenames; need at least two\n",nco_prg_nm_get(),psn_arg_nbr); else (void)fprintf(stdout,"%s: ERROR received %d input filenames; need at least one (output file was specified with -o switch)\n",nco_prg_nm_get(),psn_arg_nbr); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* FL_LST_IN_FROM_STDIN */ } /* end Operators with multiple fl_in and required fl_out */ break; default: nco_dfl_case_prg_id_err(); break; } /* end switch */ /* If input files are required but have not been obtained yet from stdin */ if(!*FL_LST_IN_FROM_STDIN){ /* Fill-in input file list from positional arguments */ /* fxm: valgrind unfree'd memory in nco_fl_lst_mk() (nco_fl_utl.c:264) */ fl_lst_in=(char **)nco_malloc((psn_arg_nbr-1+psn_arg_fst)*sizeof(char *)); while(arg_crr < argc-1+psn_arg_fst) fl_lst_in[(*fl_nbr)++]=(char *)strdup(argv[arg_crr++]); } /* FL_LST_IN_FROM_STDIN */ if(*fl_nbr == 0){ (void)fprintf(stdout,"%s: ERROR Must specify input filename.\n",nco_prg_nm_get()); (void)nco_usg_prn(); nco_exit(EXIT_FAILURE); } /* end if */ /* Assign output file from positional argument */ if(FL_OUT_FROM_PSN_ARG) *fl_out=(char *)strdup(argv[argc-1]); return fl_lst_in; } /* end nco_fl_lst_mk() */ char * /* O [sng] Filename of locally available file */ nco_fl_mk_lcl /* [fnc] Retrieve input file and return local filename */ (char *fl_nm, /* I/O [sng] Current filename, if any (destroyed) */ const char * const fl_pth_lcl, /* I [sng] Local storage area for files retrieved from remote locations */ nco_bool * const FL_RTR_RMT_LCN) /* O [flg] File was retrieved from remote location */ { /* Purpose: Locate input file, retrieve it from remote storage system if necessary, create local storage directory if neccessary, check file for read-access, return name of file on local system */ #ifdef _MSC_VER /* TODO nco1068 The stat function retuns -1 for large files; assume success */ *FL_RTR_RMT_LCN=False; return fl_nm; #endif FILE *fp_in; nco_bool DAP_URL=False; /* DAP handles netCDF API, no retrieval necessary */ nco_bool FTP_URL=False; /* Retrieve remote file via FTP */ nco_bool FTP_NETRC=False; /* Retrieve remote file via FTP with .netrc file */ nco_bool FTP_OR_SFTP_URL; /* FTP or SFTP */ nco_bool HTTP_URL=False; /* Retrieve remote file via wget */ nco_bool SFTP_URL=False; /* Retrieve remote file via SFTP */ char *cln_ptr; /* [ptr] Colon pointer */ char *fl_nm_lcl; char *fl_nm_lcl_tmp; char *fl_nm_stub; char *fl_pth_lcl_tmp=NULL; const char fnc_nm[]="nco_fl_mk_lcl()"; /* [sng] Function name */ const char ftp_url_sng[]="ftp://"; const char http_url_sng[]="http://"; const char https_url_sng[]="https://"; const char sftp_url_sng[]="sftp://"; #ifdef ENABLE_DAP int rcd; /* [rcd] Return code */ #endif /* !ENABLE_DAP */ int rcd_stt=0; /* [rcd] Return code from stat() */ int rcd_sys; /* [rcd] Return code from system() */ int rcd_frd; /* [rcd] Return code from fread() and fclose() */ size_t url_sng_lng=0L; /* CEWI */ struct stat stat_sct; /* Assume local filename is input filename */ fl_nm_lcl=(char *)strdup(fl_nm); /* Remove any URL and machine-name components from local filename */ if(strstr(fl_nm_lcl,sftp_url_sng) == fl_nm_lcl){ SFTP_URL=True; url_sng_lng=strlen(sftp_url_sng); }else if(strstr(fl_nm_lcl,ftp_url_sng) == fl_nm_lcl){ /* !sftp */ FTP_URL=True; url_sng_lng=strlen(ftp_url_sng); } /* !ftp */ FTP_OR_SFTP_URL=FTP_URL || SFTP_URL; if(FTP_OR_SFTP_URL){ /* If FTP rearrange fl_nm_lcl to remove ftp://hostname part, and if SFTP rearrange fl_nm_lcl to remove sftp://hostname: part, then search for file on local disk */ fl_pth_lcl_tmp=strchr(fl_nm_lcl+url_sng_lng,'/'); if(!fl_pth_lcl_tmp){ (void)fprintf(stderr,"%s: ERROR %s unable to find valid filename component of SFTP path %s\n",nco_prg_nm_get(),fnc_nm,fl_nm_lcl); nco_exit(EXIT_FAILURE); } /* endif */ fl_nm_lcl_tmp=fl_nm_lcl; fl_nm_lcl=(char *)nco_malloc(strlen(fl_pth_lcl_tmp)+1UL); (void)strcpy(fl_nm_lcl,fl_pth_lcl_tmp); fl_nm_lcl_tmp=(char *)nco_free(fl_nm_lcl_tmp); }else if((strstr(fl_nm_lcl,http_url_sng) == fl_nm_lcl) || (strstr(fl_nm_lcl,https_url_sng) == fl_nm_lcl)){ /* Filename starts with "http://" or "https://" so try DAP first (if available), then wget */ #ifdef ENABLE_DAP /* Filename has http:// prefix so try DAP access to unadulterated filename */ int in_id; /* [id] Temporary input file ID */ /* Attempt nc_open() on HTTP protocol files. Success means DAP found file. Do not worry about NC_DISKLESS here since any file will be immediately closed */ rcd=nco_open_flg(fl_nm_lcl,NC_NOWRITE,&in_id); if(rcd == NC_NOERR){ int nco_prg_id; /* Program ID */ nco_prg_id=nco_prg_id_get(); /* [enm] Program ID */ /* Fail gracefully if ncatted or ncrename try to use DAP */ switch(nco_prg_id){ case ncatted: case ncrename: (void)fprintf(stderr,"%s: ERROR %s reminds you that ncatted and ncrename must process truly local (i.e., not read via DAP) files (fxm TODO nco664)\n",nco_prg_nm_get(),fnc_nm); nco_exit(EXIT_FAILURE); break; default: /* All other operators work correctly with DAP */ break; } /* end switch */ /* Close file to prevent accumulating dangling open files on DAP server */ rcd=nco_close(in_id); /* Great! DAP worked so file has earned DAP identification */ DAP_URL=True; if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: INFO %s successfully accessed this file using the DAP protocol\n",nco_prg_nm_get(),fnc_nm); /* 20120728: Set rcd_stt=0 to mimic successful stat() return so rest of function treats file as local (DAP treats HTTP protocol files as local files) */ rcd_stt=0; }else{ /* DAP-access failed */ (void)fprintf(stderr,"%s: INFO DAP-access to %s failed with error code %d. ",nco_prg_nm_get(),fl_nm_lcl,rcd); (void)fprintf(stderr,"Translation into English with nc_strerror(%d) is \"%s\"\n",rcd,nc_strerror(rcd)); /* Error codes explained by Dennis Heimbigner in e-mail on 20110627 */ if(rcd == NC_ECANTREAD) (void)fprintf(stderr,"%s: HINT DAP-access error code indicates that URL does not exist. Is there a typo in the URL? Please verify that the file is accessible on the DAP-server at the specified location.\n",nco_prg_nm_get()); if(rcd == NC_EDAPSVC) (void)fprintf(stderr,"%s: HINT DAP-access error code indicates that URL _does_ exist, so error appears to be in DAP server. Reasons for this could include an aggregation server (e.g., GDS or THREDDS) that receives a URL that is valid according to the aggregation metadata but the implied back-end dataset may be temporarily unavailable.\n",nco_prg_nm_get()); /* Error codes NC_EDDS, NC_EDAS, etc. are self-explanatory with nc_strerror() */ } /* DAP-access failed */ #else /* !ENABLE_DAP */ (void)fprintf(stderr,"%s: INFO Access to %s may (because filename starts with \"http://\") require DAP, but NCO was not enabled with DAP. Instead NCO will try to search for the file locally, and then will try wget.\n",nco_prg_nm_get(),fl_nm_lcl); (void)fprintf(stderr,"%s: HINT: Obtain or build DAP-enabled NCO, e.g., with configure --enable-dap-netcdf ...\n",nco_prg_nm_get()); #endif /* !ENABLE_DAP */ if(DAP_URL == False){ /* DAP access to http:// file failed */ /* Attempt to retrieve URLs directly when DAP access fails. Tests: ncks -D 2 -M http://dust.ess.uci.edu/nco/in.nc # wget ncks -D 2 -M -l . http://dust.ess.uci.edu/nco/in.nc # wget ncks -D 2 -M -l . -p http://dust.ess.uci.edu/nco in.nc # wget ncks -D 2 -M -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc # DAP ncks -O -D 2 -M -p http://dust.ess.uci.edu/cgi-bin/dods/nph-dods/dodsdata in.nc ~/foo.nc # DAP ncks -O -v one -p http://thredds-test.ucar.edu/thredds/dodsC/testdods in.nc ~/foo.nc # DAP */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Will attempt to find file on local disk and, if unsuccessful, will then attempt retrieve remote file to local client using wget\n",nco_prg_nm_get()); /* DAP cannot open file so leave DAP_URL=FALSE and set HTTP_URL=True Later we will attempt to wget file to local system */ HTTP_URL=True; url_sng_lng=strlen(http_url_sng); /* If HTTP then rearrange fl_nm_lcl to remove http://hostname part before searching for file on local disk */ fl_pth_lcl_tmp=strchr(fl_nm_lcl+url_sng_lng,'/'); if(!fl_pth_lcl_tmp){ (void)fprintf(stderr,"%s: ERROR %s unable to find valid filename component of HTTP path %s\n",nco_prg_nm_get(),fnc_nm,fl_nm_lcl); nco_exit(EXIT_FAILURE); } /* endif */ fl_nm_lcl_tmp=fl_nm_lcl; fl_nm_lcl=(char *)nco_malloc(strlen(fl_pth_lcl_tmp)+1UL); (void)strcpy(fl_nm_lcl,fl_pth_lcl_tmp); fl_nm_lcl_tmp=(char *)nco_free(fl_nm_lcl_tmp); } /* !DAP_URL, HTTP_URL */ }else if((cln_ptr=strchr(fl_nm_lcl,':'))){ /* 19990804 Colon separates machine name from filename in rcp, scp, and sftp requests However, colon is also legal in _any_ UNIX filename Thus whether colon signifies rcp or scp request is somewhat ambiguous NCO treats names with more than one colon as regular filenames In order for colon to be interpreted as machine name delimiter, it must be preceded by period within three or four spaces, e.g., uci.edu: */ if(((cln_ptr-4 >= fl_nm_lcl) && *(cln_ptr-4) == '.') || ((cln_ptr-3 >= fl_nm_lcl) && *(cln_ptr-3) == '.')){ /* Rearrange fl_nm_lcl to remove hostname: part */ fl_pth_lcl_tmp=strchr(fl_nm_lcl+url_sng_lng,'/'); if(!fl_pth_lcl_tmp){ (void)fprintf(stderr,"%s: ERROR %s unable to find valid filename component of scp or rcp path %s\n",nco_prg_nm_get(),fnc_nm,fl_nm_lcl); nco_exit(EXIT_FAILURE); } /* endif */ fl_nm_lcl_tmp=fl_nm_lcl; fl_nm_lcl=(char *)nco_malloc(strlen(fl_pth_lcl_tmp)+1UL); (void)strcpy(fl_nm_lcl,fl_pth_lcl_tmp); fl_nm_lcl_tmp=(char *)nco_free(fl_nm_lcl_tmp); } /* endif period is three or four characters from colon */ } /* end if */ /* Does file exist on local system? */ if(!DAP_URL) rcd_stt=stat(fl_nm_lcl,&stat_sct); if(rcd_stt == -1 && (nco_dbg_lvl_get() >= nco_dbg_fl)) (void)fprintf(stderr,"\n%s: INFO stat() #1 failed: %s does not exist\n",nco_prg_nm_get(),fl_nm_lcl); /* If not, check if file exists on local system under same path interpreted relative to current working directory */ if(rcd_stt == -1){ if(fl_nm_lcl[0] == '/'){ rcd_stt=stat(fl_nm_lcl+1UL,&stat_sct); if(rcd_stt == -1 && (nco_dbg_lvl_get() >= nco_dbg_fl)) (void)fprintf(stderr,"%s: INFO stat() #2 failed: %s does not exist\n",nco_prg_nm_get(),fl_nm_lcl+1UL); } /* end if */ if(rcd_stt == 0){ /* NB: Adding one to filename pointer is like deleting initial slash on filename Then free(fl_nm_lcl) would miss this initial byte (memory is lost) Hence must copy new name into its own memory space */ fl_nm_lcl_tmp=(char *)strdup(fl_nm_lcl+1UL); fl_nm_lcl=(char *)nco_free(fl_nm_lcl); fl_nm_lcl=fl_nm_lcl_tmp; (void)fprintf(stderr,"%s: WARNING not searching for %s on remote filesystem, using local file %s instead\n",nco_prg_nm_get(),fl_nm,fl_nm_lcl+1UL); } /* end if */ } /* end if */ /* Finally, check if file exists locally in directory for remotely retrieved files This occurs when previous program invocations have already retrieved some files */ if(rcd_stt == -1){ /* Where does filename stub begin? NB: Assume local filename has a slash (because remote file system always has a slash) */ fl_nm_stub=strrchr(fl_nm_lcl,'/')+1UL; /* Construct local filename from user-supplied local file path and existing file stub */ if(fl_pth_lcl){ fl_nm_lcl_tmp=fl_nm_lcl; /* Allocate enough room for the joining slash '/' and the terminating NUL */ fl_nm_lcl=(char *)nco_malloc((strlen(fl_pth_lcl)+strlen(fl_nm_stub)+2)*sizeof(char)); (void)strcpy(fl_nm_lcl,fl_pth_lcl); (void)strcat(fl_nm_lcl,"/"); (void)strcat(fl_nm_lcl,fl_nm_stub); /* Free old filename space */ fl_nm_lcl_tmp=(char *)nco_free(fl_nm_lcl_tmp); } /* end if */ /* At last, check for file in local storage directory */ rcd_stt=stat(fl_nm_lcl,&stat_sct); if(rcd_stt != -1) (void)fprintf(stderr,"%s: WARNING not searching for %s on remote filesystem, using local file %s instead\n",nco_prg_nm_get(),fl_nm,fl_nm_lcl); if(rcd_stt == -1 && (nco_dbg_lvl_get() >= nco_dbg_fl)) (void)fprintf(stderr,"%s: INFO stat() #3 failed: %s does not exist\n",nco_prg_nm_get(),fl_nm_lcl); } /* end if */ /* File was not found locally and is not DAP-accessible, try to fetch file from remote filesystem */ if(rcd_stt == -1){ typedef struct{ /* [enm] Remote fetch command structure */ const char *fmt; /* [] Format */ const int fmt_chr_nbr; /* [nbr] Number of formatting characters */ const int transfer_mode; /* [enm] Transfer mode */ const int file_order; /* [enm] File order */ } rmt_fch_cmd_sct; char *cmd_sys; char *fl_nm_rmt; char *fmt_ftp=NULL; /* [sng] Declare outside FTP block scope for easier freeing */ /* fxm: use autoconf HAVE_MKDIR_M rather than SUN4 token TODO nco293 */ #ifndef SUN4 const char cmd_mkdir[]="mkdir -m 777 -p"; #else /* SUN4 */ const char cmd_mkdir[]="mkdir -p"; #endif /* SUN4 */ enum{ /* [enm] Transfer mode */ synchronous, /* Syncronous transfer */ asynchronous}; /* Asynchronous transfer */ enum{ /* [enm] File order */ lcl_rmt, /* Local file argument before remote file argument */ rmt_lcl}; /* Remote file argument before local file argument */ size_t fl_pth_lcl_lng=size_t_CEWI; /* CEWI */ rmt_fch_cmd_sct *rmt_cmd=NULL; /* fxm: Initialize structure contents as const */ rmt_fch_cmd_sct hsiget={"hsi get %s : %s",4,synchronous,lcl_rmt}; /* rmt_fch_cmd_sct msread={"msread -R %s %s",4,synchronous,lcl_rmt};*/ /* Deprecated 20110419 */ /* rmt_fch_cmd_sct msrcp={"msrcp mss:%s %s",4,synchronous,rmt_lcl};*/ /* Deprecated 20110419 */ /* rmt_fch_cmd_sct nrnet={"nrnet msget %s r flnm=%s l mail=FAIL",4,asynchronous,lcl_rmt};*/ /* Deprecated 20110419 */ /* rmt_fch_cmd_sct rcp={"rcp -p %s %s",4,synchronous,rmt_lcl};*/ /* Deprecated ~2000 */ /* wget -p: fxm (and enables clobber) wget -r: Turn on recursive retrieving (and enables clobber) wget --tries: Set number of retries. Default is 20. */ rmt_fch_cmd_sct http={"wget --tries=1 --output-document=%s %s",4,synchronous,lcl_rmt}; rmt_fch_cmd_sct scp={"scp -p %s %s",4,synchronous,rmt_lcl}; rmt_fch_cmd_sct sftp={"sftp %s %s",4,synchronous,rmt_lcl}; /* Fill-in ftp structure fmt element dynamically later */ rmt_fch_cmd_sct ftp={"",4,synchronous,rmt_lcl}; /* Why did stat() command fail? */ /* (void)perror(nco_prg_nm_get());*/ /* Remote filename is input filename by definition */ fl_nm_rmt=fl_nm; /* URL specifier in filename unambiguously signals to use FTP */ if(rmt_cmd == NULL){ if(FTP_URL){ /* fxm: use autoconf HAVE_XXX rather than WIN32 token TODO nco292 */ #ifdef WIN32 /* #ifndef HAVE_NETWORK fxm */ /* I have no idea how networking calls work in MS Windows, so just exit */ (void)fprintf(stdout,"%s: ERROR Networking required to obtain %s is not supported by this operating system\n",nco_prg_nm_get(),fl_nm_rmt); nco_exit(EXIT_FAILURE); #else /* !WIN32 */ char *usr_nm; char *host_nm_lcl; char *host_nm_rmt; char *usr_email=NULL; /* CEWI */ char *fl_nm_netrc; const char fl_stb_netrc[]="/.netrc"; const char ftp_cmd_anonymous[]="/usr/bin/ftp -i -p -n"; /* -n turns off using .netrc */ const char ftp_cmd_netrc[]="/usr/bin/ftp -i -p"; /* Allow FTP to use .netrc */ const char fmt_ftp_anonymous_tpl[]="%s %s << END\nuser anonymous %s\nbin\nget %s %s\nquit\nEND"; const char fmt_ftp_netrc_tpl[]="%s %s << END\nbin\nget %s %s\nquit\nEND"; struct passwd *usr_pwd; uid_t usr_uid; rmt_cmd=&ftp; /* Get UID to get password structure which contains home directory, login name Home directory needed to search for .netrc Login name used to construct e-mail address for anonymous FTP */ usr_uid=getuid(); usr_pwd=getpwuid(usr_uid); usr_nm=usr_pwd->pw_name; /* Construct remote hostname and filename now since: 1. .netrc, if any, will soon be searched for remote hostname 2. Remote hostname and filename always needed for remote retrieval */ /* Remote hostname begins directly after "[s]ftp://" */ host_nm_rmt=fl_nm_rmt+url_sng_lng; /* Filename begins after slash */ fl_nm_rmt=strstr(fl_nm_rmt+url_sng_lng,"/")+1UL; /* NUL-terminate hostname by overwriting colon in hostname:/filename syntax */ *(fl_nm_rmt-1)='\0'; /* Use anonymous FTP unless .netrc file exists on local system */ fl_nm_netrc=(char *)strdup(usr_pwd->pw_dir); /* Create space for full path to ${HOME}/.netrc */ fl_nm_netrc=(char *)nco_realloc(fl_nm_netrc,(strlen(fl_nm_netrc)+strlen(fl_stb_netrc)+2UL)*sizeof(char)); fl_nm_netrc=(char *)strcat(fl_nm_netrc,fl_stb_netrc); rcd_stt=stat(fl_nm_netrc,&stat_sct); if(!rcd_stt){ /* Search .netrc file for remote host name */ char *host_nm_rmt_psn; char *fl_netrc_bfr; FILE *fp_netrc; /* [fl] .netrc inpu file handle */ if((fp_netrc=fopen(fl_nm_netrc,"r")) == NULL){ (void)fprintf(stderr,"%s: ERROR unable to open user's .netrc file %s\n",nco_prg_nm_get(),fl_nm_netrc); /* Why did fopen() command fail? */ (void)perror(nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ /* Add one for NUL-terminator */ fl_netrc_bfr=(char *)nco_malloc((1UL+stat_sct.st_size)*sizeof(char)); /* NUL-terminate buffer */ fl_netrc_bfr[stat_sct.st_size]='\0'; rcd_frd=fread((void *)fl_netrc_bfr,stat_sct.st_size,1,fp_netrc); if(rcd_frd <= 0){ (void)fprintf(stderr,"%s: ERROR reading %s\n",nco_prg_nm_get(),fl_nm_netrc); /* Why did fread() command fail? */ (void)perror(nco_prg_nm_get()); /* Check for feof() vs. ferror() here? */ rcd_frd=fclose(fp_netrc); nco_exit(EXIT_FAILURE); } /* end if */ rcd_frd=fclose(fp_netrc); host_nm_rmt_psn=strstr(fl_netrc_bfr,host_nm_rmt); if(host_nm_rmt_psn){ FTP_NETRC=True; if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s will use .netrc file at %s instead of anonymous FTP\n",nco_prg_nm_get(),fnc_nm,fl_nm_netrc); } /* endif host_nm_rmt_psn */ fl_netrc_bfr=(char *)nco_free(fl_netrc_bfr); } /* endif rcd_stt */ if(!FTP_NETRC){ /* DEBUG: 256 should be replaced by MAXHOSTNAMELEN from , but Solaris does not have MAXHOSTNAMELEN in sys/param.h */ host_nm_lcl=(char *)nco_malloc((256UL+1UL)*sizeof(char)); (void)gethostname(host_nm_lcl,256UL+1UL); /* fxm: move to gethostbyname() next */ if(!strchr(host_nm_lcl,'.')){ /* #ifdef HAVE_RES_ */ /* Returned hostname did not include fully qualified Internet domain name (FQDN) */ (void)res_init(); (void)strcat(host_nm_lcl,"."); (void)strcat(host_nm_lcl,_res.defdname); /* #endif HAVE_RES_ */ } /* end if */ /* Add one for joining "@" and one for NUL byte */ usr_email=(char *)nco_malloc((strlen(usr_nm)+1UL+strlen(host_nm_lcl)+1UL)*sizeof(char)); (void)sprintf(usr_email,"%s@%s",usr_nm,host_nm_lcl); /* Free hostname space */ host_nm_lcl=(char *)nco_free(host_nm_lcl); } /* FTP_NETRC */ if(FTP_NETRC){ /* Subtract four characters for two "percent s" formats replaced by new strings, add one for NUL byte */ fmt_ftp=(char *)nco_malloc((strlen(fmt_ftp_netrc_tpl)+strlen(ftp_cmd_netrc)+strlen(host_nm_rmt)-4UL+1UL)*sizeof(char)); (void)sprintf(fmt_ftp,fmt_ftp_netrc_tpl,ftp_cmd_netrc,host_nm_rmt,"%s","%s"); }else{ /* Subtract six characters for three "percent s" formats replaced by new strings, add one for NUL byte */ fmt_ftp=(char *)nco_malloc((strlen(fmt_ftp_anonymous_tpl)+strlen(ftp_cmd_anonymous)+strlen(host_nm_rmt)+strlen(usr_email)-6UL+1UL)*sizeof(char)); (void)sprintf(fmt_ftp,fmt_ftp_anonymous_tpl,ftp_cmd_anonymous,host_nm_rmt,usr_email,"%s","%s"); } /* !FTP_NETRC */ rmt_cmd->fmt=fmt_ftp; /* Free space, if any, holding user's E-mail address */ if(!FTP_NETRC) usr_email=(char *)nco_free(usr_email); /* Always free .netrc filename space */ fl_nm_netrc=(char *)nco_free(fl_nm_netrc); #endif /* !WIN32 */ } /* end if FTP_URL */ } /* end if rmt_cmd */ /* Currently, sftp transfers are indicated by FTP-style URLs NB: Unlike FTP, SFTP does not have a recognized URL format Hence actual transfer via SFTP uses scp syntax (for single files) Multiple file transfer via SFTP can use FTP-like scripts, requires more work NCO SFTP file specification must have colon separating hostname from filename */ if(rmt_cmd == NULL){ if(SFTP_URL){ /* Remote filename begins after URL but includes hostname */ fl_nm_rmt+=url_sng_lng; /* Make sure that SFTP hostname looks like a hostname */ if((cln_ptr=strchr(fl_nm_rmt,':'))){ if(((cln_ptr-4 >= fl_nm_rmt) && *(cln_ptr-4) == '.') || ((cln_ptr-3 >= fl_nm_rmt) && *(cln_ptr-3) == '.')){ rmt_cmd=&sftp; } /* end if */ } /* end if colon */ } /* end if SFTP */ } /* end if rmt_cmd */ /* Attempt wget on files that contain http:// prefix and are not accessible via DAP */ if(rmt_cmd == NULL){ if(HTTP_URL){ rmt_cmd=&http; (void)fprintf(stderr,"%s: INFO Will now attempt wget on the full filepath. wget will fail if the file is \"hidden\" behind a DAP server. Unfortunately, failed wget attempts creates rather long pathnames in the current directory. fxm TODO nco970, nco971. On the other hand, wget should succeed if the file is stored in any publicly-accessible web location.\n",nco_prg_nm_get()); } /* end if HTTP */ } /* end if rmt_cmd */ /* Otherwise, single colon preceded by period in filename signals rcp or scp Determining whether to try scp instead of rcp is difficult Ideally, NCO would test remote machine for rcp/scp priveleges with system command like, e.g., "ssh echo ok" To start we use scp which has its own fall-through to rcp */ if(rmt_cmd == NULL){ if((cln_ptr=strchr(fl_nm_rmt,':'))){ if(((cln_ptr-4 >= fl_nm_rmt) && *(cln_ptr-4) == '.') || ((cln_ptr-3 >= fl_nm_rmt) && *(cln_ptr-3) == '.')){ rmt_cmd=&scp; } /* end if */ } /* end if colon */ } /* end if rmt_cmd */ #if 0 /* NB: MSS commands deprecated 20110419 */ if(rmt_cmd == NULL){ /* Does msrcp command exist on local system? */ rcd_stt=stat("/usr/local/bin/msrcp",&stat_sct); /* SCD Dataproc, Ouray */ if(rcd_stt != 0) rcd_stt=stat("/usr/bin/msrcp",&stat_sct); /* ACD Linux */ if(rcd_stt != 0) rcd_stt=stat("/opt/local/bin/msrcp",&stat_sct); /* CGD */ if(rcd_stt != 0) rcd_stt=stat("/usr/local/dcs/bin/msrcp",&stat_sct); /* ACD */ if(rcd_stt == 0) rmt_cmd=&msrcp; } /* end if */ if(rmt_cmd == NULL){ /* Does msread command exist on local system? */ rcd_stt=stat("/usr/local/bin/msread",&stat_sct); if(rcd_stt == 0) rmt_cmd=&msread; } /* end if */ if(rmt_cmd == NULL){ /* Does nrnet command exist on local system? */ rcd_stt=stat("/usr/local/bin/nrnet",&stat_sct); if(rcd_stt == 0) rmt_cmd=&nrnet; } /* end if */ /* Before we look for file on remote system, make sure filename has correct syntax to exist on remote system */ if(rmt_cmd == &msread || rmt_cmd == &nrnet || rmt_cmd == &msrcp){ if (fl_nm_rmt[0] != '/' || fl_nm_rmt[1] < 'A' || fl_nm_rmt[1] > 'Z'){ (void)fprintf(stderr,"%s: ERROR %s is not on local filesystem and is not a syntactically valid filename on remote file system\n",nco_prg_nm_get(),fl_nm_rmt); nco_exit(EXIT_FAILURE); } /* end if */ } /* end if */ #endif /* endif False */ /* NB: HPSS commands replaced MSS commands in NCO 4.0.8 in 201104 */ if(rmt_cmd == NULL){ /* Does hsi command exist on local system? */ rcd_stt=stat("/usr/local/bin/hsi",&stat_sct); /* CISL Bluefire default */ if(rcd_stt != 0) rcd_stt=stat("/opt/hpss/bin/hsi",&stat_sct); /* CISL alternate */ if(rcd_stt != 0) rcd_stt=stat("/ncar/opt/hpss/hsi",&stat_sct); /* Yellowstone default added to NCO 4.3.2 in 201306 */ if(rcd_stt == 0) rmt_cmd=&hsiget; } /* end if */ if(rmt_cmd == NULL){ (void)fprintf(stderr,"%s: ERROR file %s neither exists locally nor matches remote filename patterns\n",nco_prg_nm_get(),fl_nm_rmt); nco_exit(EXIT_FAILURE); } /* end if */ if(fl_pth_lcl == NULL){ /* Derive path for storing local file from remote filename */ (void)fprintf(stderr,"%s: INFO deriving local filepath from remote filename\n",nco_prg_nm_get()); fl_nm_stub=strrchr(fl_nm_lcl,'/')+1UL; if(HTTP_URL){ /* Strip leading slash from fl_nm_lcl for HTTP files so, e.g., http://dust.ess.uci.edu/nco/in.nc produces local path "nco" not "/nco" */ fl_nm_lcl_tmp=(char *)strdup(fl_nm_lcl+1UL); fl_nm_lcl=(char *)nco_free(fl_nm_lcl); fl_nm_lcl=fl_nm_lcl_tmp; } /* !HTTP_URL */ /* Construct local storage filepath name */ fl_pth_lcl_lng=strlen(fl_nm_lcl)-strlen(fl_nm_stub)-1UL; /* Allocate enough room for terminating NUL */ fl_pth_lcl_tmp=(char *)nco_malloc((fl_pth_lcl_lng+1UL)*sizeof(char)); (void)strncpy(fl_pth_lcl_tmp,fl_nm_lcl,fl_pth_lcl_lng); fl_pth_lcl_tmp[fl_pth_lcl_lng]='\0'; /* Tell user what local filepath was derived */ (void)fprintf(stderr,"%s: INFO Retrieved files will be stored in derived directory ./%s\n",nco_prg_nm_get(),fl_pth_lcl_tmp); }else{ /* Copy user-specified local path to unite following code in terms of fl_pth_lcl_tmp */ fl_pth_lcl_tmp=(char *)strdup(fl_pth_lcl); } /* fl_pth_lcl */ /* Does local filepath exist already on local system? */ rcd_stt=stat(fl_pth_lcl_tmp,&stat_sct); /* If not, then create local filepath */ if(rcd_stt != 0){ /* Allocate enough room for joining space ' ' and terminating NUL */ cmd_sys=(char *)nco_malloc((strlen(cmd_mkdir)+fl_pth_lcl_lng+2UL)*sizeof(char)); (void)strcpy(cmd_sys,cmd_mkdir); (void)strcat(cmd_sys," "); (void)strcat(cmd_sys,fl_pth_lcl_tmp); rcd_sys=system(cmd_sys); if(rcd_sys != 0){ (void)fprintf(stderr,"%s: ERROR Unable to create local directory %s\n",nco_prg_nm_get(),fl_pth_lcl_tmp); if(fl_pth_lcl == NULL) (void)fprintf(stderr,"%s: HINT Use -l option\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Created local directory ./%s\n",nco_prg_nm_get(),fl_pth_lcl_tmp); /* Free local command space */ cmd_sys=(char *)nco_free(cmd_sys); } /* end if */ /* Free local path space, if any */ fl_pth_lcl_tmp=(char *)nco_free(fl_pth_lcl_tmp); /* Allocate enough room for joining space ' ' and terminating NUL */ cmd_sys=(char *)nco_malloc((strlen(rmt_cmd->fmt)-rmt_cmd->fmt_chr_nbr+strlen(fl_nm_lcl)+strlen(fl_nm_rmt)+2)*sizeof(char)); if(rmt_cmd->file_order == lcl_rmt){ (void)sprintf(cmd_sys,rmt_cmd->fmt,fl_nm_lcl,fl_nm_rmt); }else{ (void)sprintf(cmd_sys,rmt_cmd->fmt,fl_nm_rmt,fl_nm_lcl); } /* end else */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: Retrieving file from remote location with command:\n%s\n",nco_prg_nm_get(),cmd_sys); (void)fflush(stderr); /* Fetch file from remote file system */ rcd_sys=system(cmd_sys); /* Free local command space */ cmd_sys=(char *)nco_free(cmd_sys); /* Free dynamically allocated FTP script memory */ if(rmt_cmd == &ftp) fmt_ftp=(char *)nco_free(fmt_ftp); if(rmt_cmd->transfer_mode == synchronous){ if(rcd_sys != 0){ (void)fprintf(stderr,"%s: ERROR Synchronous fetch command failed\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ }else{ /* This is appropriate place to insert invocation of shell command to retrieve file asynchronously and then to return status to NCO synchronously. */ int fl_sz_crr=-2; int fl_sz_ntl=-1; int tm_nbr=100; /* Maximum number of sleep periods before error exit */ int tm_idx; int tm_sleep_scn=10; /* [s] Seconds per stat() check for successful return */ #ifdef _MSC_VER /* MSVC NB: Win32 Sleep() function measured in milliseconds, Linux sleep() function measured in seconds */ int tm_sleep_ms=tm_sleep_scn*1000; /* [ms] Milliseconds per stat() check for successful return */ #endif /* !_MSC_VER */ /* Asynchronous retrieval uses sleep-and-poll technique */ for(tm_idx=0;tm_idx= nco_dbg_std) (void)fprintf(stderr,"."); (void)fflush(stderr); } /* end for */ if(tm_idx == tm_nbr){ (void)fprintf(stderr,"%s: ERROR Maximum time (%d seconds = %.1f minutes) for asynchronous file retrieval exceeded.\n",nco_prg_nm_get(),tm_nbr*tm_sleep_scn,tm_nbr*tm_sleep_scn/60.0); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"\n%s Retrieval successful after %d sleeps of %d seconds each = %.1f minutes\n",nco_prg_nm_get(),tm_idx,tm_sleep_scn,tm_idx*tm_sleep_scn/60.0); } /* end else transfer mode is asynchronous */ *FL_RTR_RMT_LCN=True; }else{ /* end if input file did not exist locally */ *FL_RTR_RMT_LCN=False; } /* end if file was already on the local system */ if(nco_dbg_lvl_get() >= nco_dbg_fl) if(DAP_URL && fl_pth_lcl) (void)fprintf(stderr,"%s: INFO User-specified option \"-l %s\" was not used since input file was not retrieved from remote location\n",nco_prg_nm_get(),fl_pth_lcl); if(!DAP_URL){ /* File is (now, anyway) truly local---does local system have read permission? */ if((fp_in=fopen(fl_nm_lcl,"r")) == NULL){ (void)fprintf(stderr,"%s: ERROR User does not have read permission for %s, or file does not exist\n",nco_prg_nm_get(),fl_nm_lcl); nco_exit(EXIT_FAILURE); }else{ (void)fclose(fp_in); } /* end else */ /* For local files, perform optional file diagnostics */ if(nco_dbg_lvl_get() >= nco_dbg_std){ char *fl_nm_cnc=NULL; /* [sng] Canonical file name */ /* Determine canonical filename and properties */ fl_nm_cnc=nco_fl_info_get(fl_nm_lcl); if(fl_nm_cnc) fl_nm_cnc=(char *)nco_free(fl_nm_cnc); } /* endif dbg */ } /* end if file is truly local */ /* Free input filename space */ fl_nm=(char *)nco_free(fl_nm); /* Return local filename */ return(fl_nm_lcl); } /* end nco_fl_mk_lcl() */ void nco_fl_mv /* [fnc] Move first file to second */ (const char * const fl_src, /* I [sng] Name of source file to move */ const char * const fl_dst) /* I [sng] Name of destination file */ { /* Purpose: Move first file to second */ char *cmd_mv; char *fl_dst_cdl; char *fl_src_cdl; #ifdef _MSC_VER const char cmd_mv_fmt[]="move %s %s"; #else /* !_MSC_VER */ const char cmd_mv_fmt[]="mv -f %s %s"; #endif /* !_MSC_VER */ int rcd_sys; /* [rcd] Return code from system() */ const int fmt_chr_nbr=4; /* Only bother to perform system() call if files are not identical */ if(!strcmp(fl_src,fl_dst)){ if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Temporary and final files %s are identical---no need to move.\n",nco_prg_nm_get(),fl_src); return; } /* end if */ /* 20131227 Allow for whitespace characters in fl_dst Assume CDL translation results in acceptable name for shell commands */ fl_src_cdl=nm2sng_fl(fl_src); fl_dst_cdl=nm2sng_fl(fl_dst); /* Construct and execute move command */ cmd_mv=(char *)nco_malloc((strlen(cmd_mv_fmt)+strlen(fl_src_cdl)+strlen(fl_dst_cdl)-fmt_chr_nbr+1UL)*sizeof(char)); if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Moving %s to %s...",nco_prg_nm_get(),fl_src_cdl,fl_dst_cdl); (void)sprintf(cmd_mv,cmd_mv_fmt,fl_src_cdl,fl_dst_cdl); rcd_sys=system(cmd_mv); if(rcd_sys == -1){ (void)fprintf(stdout,"%s: ERROR nco_fl_mv() unable to execute mv command \"%s\"\n",nco_prg_nm_get(),cmd_mv); nco_exit(EXIT_FAILURE); } /* end if */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"done\n"); cmd_mv=(char *)nco_free(cmd_mv); if(fl_dst_cdl) fl_dst_cdl=(char *)nco_free(fl_dst_cdl); if(fl_src_cdl) fl_src_cdl=(char *)nco_free(fl_src_cdl); } /* end nco_fl_mv() */ char * /* O [sng] Name of file to retrieve */ nco_fl_nm_prs /* [fnc] Construct file name from input arguments */ (char *fl_nm, /* I/O [sng] Current filename, if any */ const int fl_idx, /* I [nbr] Ordinal index of file in input file list */ int * const fl_nbr, /* I/O [nbr] Number of files to be processed */ char * const * const fl_lst_in, /* I [sng] User-specified filenames */ const int abb_arg_nbr, /* I [nbr] Number of abbreviation arguments */ CST_X_PTR_CST_PTR_CST_Y(char,fl_lst_abb), /* I [sng] NINTAP-style arguments, if any */ const char * const fl_pth) /* I [sng] Path prefix for files in fl_lst_in */ { /* Purpose: Construct file name from various input arguments and switches Routine implements NINTAP-style specification by using static memory to avoid repetition in construction of filename */ char *sng_cnv_rcd=NULL_CEWI; /* [sng] strtol()/strtoul() return code */ static char *fl_nm_1st_dgt; static char *fl_nm_nbr_sng; static char fl_nm_nbr_sng_fmt[10]; static int fl_nm_nbr_crr; static int fl_nm_nbr_dgt; static int fl_nm_nbr_ncr; static int fl_nm_nbr_max; static int fl_nm_nbr_min; static int fl_nm_nbr_ttl; static int mm_crr; static int yyyy_crr; static nco_bool FIRST_INVOCATION=True; static nco_bool flg_yyyymm=False; /* Free any old filename space */ fl_nm=(char *)nco_free(fl_nm); /* Construct filename from NINTAP-style arguments and input name */ if(fl_lst_abb){ if(FIRST_INVOCATION){ int fl_nm_sfx_lng=0; /* Parse abbreviation list analogously to CCM Processor ICP "NINTAP" */ if(fl_nbr){ *fl_nbr=(int)strtol(fl_lst_abb[0],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_lst_abb[0],"strtol",sng_cnv_rcd); fl_nm_nbr_ttl=*fl_nbr; } /* endif */ if(abb_arg_nbr > 1){ fl_nm_nbr_dgt=(int)strtol(fl_lst_abb[1],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_lst_abb[1],"strtol",sng_cnv_rcd); }else{ fl_nm_nbr_dgt=3; } /* end if */ if(abb_arg_nbr > 2){ fl_nm_nbr_ncr=(int)strtol(fl_lst_abb[2],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_lst_abb[2],"strtol",sng_cnv_rcd); }else{ fl_nm_nbr_ncr=1; } /* end if */ if(abb_arg_nbr > 3){ fl_nm_nbr_max=(int)strtol(fl_lst_abb[3],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_lst_abb[3],"strtol",sng_cnv_rcd); }else{ fl_nm_nbr_max=0; } /* end if */ if(abb_arg_nbr > 4){ fl_nm_nbr_min=(int)strtol(fl_lst_abb[4],&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_lst_abb[4],"strtol",sng_cnv_rcd); }else{ fl_nm_nbr_min=1; } /* end if */ if(abb_arg_nbr > 5){ if(!strcmp(fl_lst_abb[5],"yyyymm")) flg_yyyymm=True; } /* end if */ /* Is there a .nc, .h5, .cdf, .hdf, .hd5, or .he5 suffix? */ if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-3,".nc",3)) fl_nm_sfx_lng=3; if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-3,".h5",3)) fl_nm_sfx_lng=3; else if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-4,".cdf",4)) fl_nm_sfx_lng=4; else if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-4,".hdf",4)) fl_nm_sfx_lng=4; else if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-4,".hd5",4)) fl_nm_sfx_lng=4; else if(!strncmp(fl_lst_in[0]+strlen(fl_lst_in[0])-4,".he5",4)) fl_nm_sfx_lng=4; /* Initialize static information useful for future invocations */ fl_nm_1st_dgt=fl_lst_in[0]+strlen(fl_lst_in[0])-fl_nm_nbr_dgt-fl_nm_sfx_lng; fl_nm_nbr_sng=(char *)nco_malloc((size_t)(fl_nm_nbr_dgt+1UL)*sizeof(char)); fl_nm_nbr_sng=strncpy(fl_nm_nbr_sng,fl_nm_1st_dgt,(size_t)fl_nm_nbr_dgt); fl_nm_nbr_sng[fl_nm_nbr_dgt]='\0'; fl_nm_nbr_crr=(int)strtol(fl_nm_nbr_sng,&sng_cnv_rcd,NCO_SNG_CNV_BASE10); if(*sng_cnv_rcd) nco_sng_cnv_err(fl_nm_nbr_sng,"strtol",sng_cnv_rcd); if(flg_yyyymm){ yyyy_crr=fl_nm_nbr_crr/100; mm_crr=fl_nm_nbr_crr%12; mm_crr=fl_nm_nbr_crr-yyyy_crr*100; (void)sprintf(fl_nm_nbr_sng_fmt,"%%0%dd%%02d",fl_nm_nbr_dgt-2); }else{ (void)sprintf(fl_nm_nbr_sng_fmt,"%%0%dd",fl_nm_nbr_dgt); } /* !flg_yyyymm */ /* First filename is always specified on command line anyway... */ fl_nm=(char *)strdup(fl_lst_in[0]); /* Set flag that this routine has already been invoked at least once */ FIRST_INVOCATION=False; }else{ /* end if FIRST_INVOCATION */ /* Create current filename from previous filename */ fl_nm_nbr_crr+=fl_nm_nbr_ncr; if(fl_nm_nbr_max){ if(flg_yyyymm){ /* String contains dates (months) in YYYYMM format so increment left-most four digits (year) by one when right-most two digits exceed fl_nm_nbr_max */ mm_crr+=fl_nm_nbr_ncr; if(mm_crr > fl_nm_nbr_max){ mm_crr=fl_nm_nbr_min; yyyy_crr++; } /* !mm_crr */ (void)sprintf(fl_nm_nbr_sng,fl_nm_nbr_sng_fmt,yyyy_crr,mm_crr); }else{ if(fl_nm_nbr_crr > fl_nm_nbr_max) fl_nm_nbr_crr=fl_nm_nbr_min; (void)sprintf(fl_nm_nbr_sng,fl_nm_nbr_sng_fmt,fl_nm_nbr_crr); } /* !flg_yyyymm */ }else{ /* !fl_nm_nbr_max */ (void)sprintf(fl_nm_nbr_sng,fl_nm_nbr_sng_fmt,fl_nm_nbr_crr); } /* !fl_nm_nbr_max */ fl_nm=(char *)strdup(fl_lst_in[0]); (void)strncpy(fl_nm+(fl_nm_1st_dgt-fl_lst_in[0]),fl_nm_nbr_sng,(size_t)fl_nm_nbr_dgt); if(fl_idx == fl_nm_nbr_ttl-1) fl_nm_nbr_sng=(char *)nco_free(fl_nm_nbr_sng); } /* end if not FIRST_INVOCATION */ }else{ /* end if abbreviation list */ fl_nm=(char *)strdup(fl_lst_in[fl_idx]); } /* end if no abbreviation list */ /* Prepend path prefix */ if(fl_pth){ char *fl_nm_stub; fl_nm_stub=fl_nm; /* Allocate enough room for joining slash '/' and terminating NUL */ fl_nm=(char *)nco_malloc((strlen(fl_nm_stub)+strlen(fl_pth)+2)*sizeof(char)); (void)strcpy(fl_nm,fl_pth); #ifdef _MSC_VER nco_bool is_url; char *sng; /* Remote access detection; this should be replaced with NC_testurl; DAP-URL = "http://" host [ ":" port ] [ abs-path ] */ if(strlen(fl_pth) < 8UL) is_url=False; else{ sng=(char *)nco_malloc(8); sng=strncpy(sng,fl_pth,8); sng[7]='\0'; if(!strcmp("http://",sng)) is_url=True; else is_url=False; sng=(char *)nco_free(sng); } /* end else */ /* Windows uses backslash for path separator; escape that character */ if(is_url) (void)strcat(fl_nm,"/"); else (void)strcat(fl_nm,"\\"); #else /* !_MSC_VER */ (void)strcat(fl_nm,"/"); #endif /* !_MSC_VER */ (void)strcat(fl_nm,fl_nm_stub); /* Free filestub space */ fl_nm_stub=(char *)nco_free(fl_nm_stub); } /* end if */ /* Return new filename */ return(fl_nm); } /* end nco_fl_nm_prs() */ int /* [rcd] Return code */ nco_fl_open /* [fnc] Open file using appropriate buffer size hints and verbosity */ (const char * const fl_nm, /* I [sng] Name of file to open */ const int md_open, /* I [enm] Mode flag for nc_open() call */ const size_t * const bfr_sz_hnt, /* I [B] Buffer size hint */ int * const nc_id) /* O [id] File ID */ { /* Purpose: Open file using appropriate buffer size hints and verbosity ncks -O -D 3 --bfr_sz=8192 ~/nco/data/in.nc ~/foo.nc */ const char fnc_nm[]="nco_fl_open()"; /* [sng] Function name */ int rcd=NC_NOERR; /* [rcd] Return code */ int fl_fmt_xtn_prv; /* I [enm] Previous extended file format */ int fl_fmt_xtn_crr; /* I [enm] Current extended file format */ int mode; /* I [enm] Mode flag for nc_inq_format_extended() call */ nco_bool flg_rqs_vrb_mpl; /* [flg] Sufficiently verbose implicit request */ nco_bool flg_rqs_vrb_xpl; /* [flg] Sufficiently verbose explicit request */ size_t bfr_sz_hnt_lcl; /* [B] Buffer size hint */ /* Initialize local buffer size hint with user-input value */ bfr_sz_hnt_lcl= (bfr_sz_hnt) ? *bfr_sz_hnt : NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ /* Is request implicit and sufficiently verbose? */ flg_rqs_vrb_mpl = ((bfr_sz_hnt == NULL || *bfr_sz_hnt == NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_var) ? True : False; /* Is request explicit and sufficiently verbose? */ flg_rqs_vrb_xpl = ((bfr_sz_hnt != NULL && *bfr_sz_hnt != NC_SIZEHINT_DEFAULT) && nco_dbg_lvl_get() >= nco_dbg_fl) ? True : False; /* Print implicit or explicit buffer request depending on debugging level */ if(flg_rqs_vrb_mpl) (void)fprintf(stderr,"%s: INFO %s reports nc__open() will request file buffer of default size\n",nco_prg_nm_get(),fnc_nm); if(flg_rqs_vrb_xpl) (void)fprintf(stderr,"%s: INFO %s reports nc__open() will request file buffer size = %lu bytes\n",nco_prg_nm_get(),fnc_nm,(unsigned long)*bfr_sz_hnt); /* Pass local copy of size hint otherwise user-specified value is overwritten on first call */ #ifdef ENABLE_MPI rcd=nco_open_par(fl_nm,md_open|NC_MPIIO,MPI_COMM_WORLD,MPI_INFO_NULL,nc_id); #else /* !ENABLE_MPI */ rcd=nco__open(fl_nm,md_open,&bfr_sz_hnt_lcl,nc_id); #endif /* !ENABLE_MPI */ /* Print results using same verbosity criteria NB: bfr_sz_hnt_lcl is never NULL because nco__open() always returns a valid size */ if(flg_rqs_vrb_mpl || flg_rqs_vrb_xpl) (void)fprintf(stderr,"%s: INFO %s reports nc__open() opened file with buffer size = %lu bytes\n",nco_prg_nm_get(),fnc_nm,(unsigned long)bfr_sz_hnt_lcl); /* 20131222: Update underlying file-type using new nc_inq_format_extended() function */ fl_fmt_xtn_prv=nco_fmt_xtn_get(); rcd+=nco_inq_format_extended(*nc_id,&fl_fmt_xtn_crr,&mode); if(fl_fmt_xtn_prv != nco_fmt_xtn_nil){ /* Complain if set value of extended type does not match current type */ if(fl_fmt_xtn_prv != fl_fmt_xtn_crr) (void)fprintf(stderr,"%s: INFO %s reports current extended filetype = %s does not equal previous extended filetype = %s. This is expected when NCO is instructed to convert filetypes, i.e., to read from one type and write to another. And when NCO generates grids or templates (which are always netCDF3) when the input file is netCDF4. It is also expected when multi-file operators receive files known to be of different types. However, it could also indicate an unexpected change in input dataset type of which the user should be cognizant.\n",nco_prg_nm_get(),fnc_nm,nco_fmt_xtn_sng(fl_fmt_xtn_crr),nco_fmt_xtn_sng(fl_fmt_xtn_prv)); }else{ /* Set undefined extended file type to actual extended filetype */ nco_fmt_xtn_set(fl_fmt_xtn_crr); } /* endif */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO Extended filetype of %s is %s, mode = %d\n",nco_prg_nm_get(),fl_nm,nco_fmt_xtn_sng(fl_fmt_xtn_crr),mode); return rcd; } /* end nco_fl_open() */ size_t /* [B] Blocksize */ nco_fl_blocksize /* [fnc] Find blocksize of filesystem will or does contain this file */ (const char * const fl_out) /* [sng] Filename */ { /* Purpose: Find blocksize of filesystem will or does contain this file */ const char fnc_nm[]="nco_fl_blocksize()"; /* [sng] Function name */ const char sls_chr='/'; /* [chr] Slash character */ char *drc_out; /* [sng] Directory containing output file */ char *sls_ptr; /* [sng] Pointer to slash */ int rcd_stt=0; /* [rcd] Return code from stat() */ size_t fl_sys_blk_sz=0UL; /* [nbr] File system blocksize for I/O */ struct stat stat_sct; drc_out=(char *)strdup(fl_out); /* Find last occurence of '/' */ sls_ptr=strrchr(drc_out,sls_chr); if(sls_ptr){ /* Filename includes path component(s) NUL-terminate file name at last slash */ *sls_ptr='\0'; }else{ /* Filename is relative to local directory Replace filename by local directory specification, i.e., by UNIX "." */ drc_out[0]='.'; drc_out[1]='\0'; } /* endif */ /* Blocksize information in stat structure: blksize_t st_blksize blocksize for file system I/O 20140105: Although blksize_t defined in stat(), there is actually no Linux type named blksize_t Use size_t instead */ rcd_stt=stat(drc_out,&stat_sct); if(rcd_stt == -1){ (void)fprintf(stdout,"%s: ERROR %s reports output file directory %s does not exist, unable to stat()\n",nco_prg_nm_get(),fnc_nm,drc_out); nco_exit(EXIT_FAILURE); } /* end if */ #ifndef _MSC_VER fl_sys_blk_sz=(size_t)stat_sct.st_blksize; #endif /* _MSC_VER */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO %s reports preferred output filesystem I/O block size: %ld bytes\n",nco_prg_nm_get(),fnc_nm,(long)fl_sys_blk_sz); if(drc_out) drc_out=(char *)nco_free(drc_out); return fl_sys_blk_sz; } /* end nco_fl_blocksize() */ char * /* O [sng] Name of temporary file actually opened */ nco_fl_out_open /* [fnc] Open output file subject to availability and user input */ (const char * const fl_out, /* I [sng] Name of file to open */ const nco_bool FORCE_APPEND, /* I [flg] Append to existing file, if any */ const nco_bool FORCE_OVERWRITE, /* I [flg] Overwrite existing file, if any */ const int fl_out_fmt, /* I [enm] Output file format */ const size_t * const bfr_sz_hnt, /* I [B] Buffer size hint */ const int RAM_CREATE, /* I [flg] Create file in RAM */ const int RAM_OPEN, /* I [flg] Open (netCDF3) file(s) in RAM */ const int WRT_TMP_FL, /* I [flg] Write output to temporary file */ int * const out_id) /* O [id] File ID */ { /* Purpose: Open output file subject to availability and user input In accord with conservative NCO/netCDF philosophy, normally open temporary file named according to fl_out and process ID so that errors cannot infect intended output file. Calling routine has responsibility to close and free fl_out_tmp */ char *fl_out_tmp; char *pid_sng; /* String containing decimal representation of PID */ const char fnc_nm[]="nco_fl_out_open()"; /* [sng] Function name */ const char tmp_sng_1[]="pid"; /* Extra string appended to temporary filenames */ const char tmp_sng_2[]="tmp"; /* Extra string appended to temporary filenames */ int md_create; /* [enm] Mode flag for nco_create() call */ int rcd=NC_NOERR; /* [rcd] Return code */ int rcd_stt; /* [rcd] Return code */ long fl_out_tmp_lng; /* [nbr] Length of temporary file name */ long pid_sng_lng; /* [nbr] Theoretical length of decimal representation of this PID */ long pid_sng_lng_max; /* [nbr] Maximum length of decimal representation of any PID */ pid_t pid; /* Process ID */ size_t bfr_sz_hnt_lcl; /* [B] Buffer size hint */ struct stat stat_sct; /* Make sure output is possible */ #ifndef ENABLE_NETCDF4 if(fl_out_fmt == NC_FORMAT_NETCDF4 || fl_out_fmt == NC_FORMAT_NETCDF4_CLASSIC){ (void)fprintf(stdout,"%s: ERROR Requested netCDF4-format output file but NCO was built without netCDF4 support\n",nco_prg_nm_get()); (void)fprintf(stdout,"%s: HINT: Obtain or build a netCDF4-enabled version of NCO. Try, e.g., ./configure --enable-netcdf4 ...;make;make install\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* netCDF4 */ #endif /* ENABLE_NETCDF4 */ /* Set default clobber mode then modify for specified file format */ md_create=NC_CLOBBER; /* [enm] Mode flag for nco_create() call */ /* [fnc] Merge clobber mode with user-specified file format */ md_create=nco_create_mode_mrg(md_create,fl_out_fmt); if(RAM_CREATE) md_create|=NC_DISKLESS|NC_WRITE; if(FORCE_OVERWRITE && FORCE_APPEND){ (void)fprintf(stdout,"%s: ERROR FORCE_OVERWRITE and FORCE_APPEND are both set\n",nco_prg_nm_get()); (void)fprintf(stdout,"%s: HINT: Overwrite (-O) and Append (-A) options are mutually exclusive. Re-run your command, setting at most one of these switches.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* end if */ /* Generate unique temporary file name System routines tempnam(), tmpname(), mktemp() perform a similar function, but are OS dependent Maximum length of PID depends on pid_t Until about 1995 most OSs set pid_t = short = 16 or 32 bits Now some OSs have /usr/include/sys/types.h set pid_t = long = 32 or 64 bits 20000126: Use sizeof(pid_t) rather than hardcoded size to fix longstanding bug on SGIs */ /* Maximum length of decimal representation of PID is number of bits in PID times log10(2) */ pid_sng_lng_max=(long)ceil(8*sizeof(pid_t)*log10(2.0)); pid_sng=(char *)nco_malloc((pid_sng_lng_max+1UL)*sizeof(char)); pid=getpid(); (void)sprintf(pid_sng,"%ld",(long)pid); /* Theoretical length of decimal representation of PID is 1+ceil(log10(PID)) where the 1 is required iff PID is exact power of 10 */ pid_sng_lng=1L+(long)ceil(log10((double)pid)); /* NCO temporary file name is user-specified file name + "." + tmp_sng_1 + PID + "." + nco_prg_nm + "." + tmp_sng_2 + NUL */ fl_out_tmp_lng=strlen(fl_out)+1UL+strlen(tmp_sng_1)+strlen(pid_sng)+1UL+strlen(nco_prg_nm_get())+1UL+strlen(tmp_sng_2)+1UL; /* NB: Calling routine has responsibility to free() this memory */ fl_out_tmp=(char *)nco_malloc(fl_out_tmp_lng*sizeof(char)); (void)sprintf(fl_out_tmp,"%s.%s%s.%s.%s",fl_out,tmp_sng_1,pid_sng,nco_prg_nm_get(),tmp_sng_2); if(nco_dbg_lvl_get() >= nco_dbg_sbr) (void)fprintf(stdout,"%s: %s reports sizeof(pid_t) = %d bytes, pid = %ld, pid_sng_lng = %ld bytes, strlen(pid_sng) = %ld bytes, fl_out_tmp_lng = %ld bytes, strlen(fl_out_tmp) = %ld, fl_out_tmp = %s\n",nco_prg_nm_get(),fnc_nm,(int)sizeof(pid_t),(long)pid,pid_sng_lng,(long)strlen(pid_sng),fl_out_tmp_lng,(long)strlen(fl_out_tmp),fl_out_tmp); /* Free temporary memory */ pid_sng=(char *)nco_free(pid_sng); #ifndef _MSC_VER if(nco_dbg_lvl_get() == nco_dbg_vec){ /* Use built-in system routines to generate temporary filename This allows file to be built in fast directory like /tmp rather than local directory which could be a slow, NFS-mounted directories like /fs/cgd There are many options: tmpnam() uses P_tmpdir, does not allow specfication of drc tempnam(const char *drc, const char *pfx) uses writable $TMPDIR, else drc, else P_tmpdir, else /tmp and prefixes returned name with up to five characters from pfx, if supplied mkstemp(char *tpl) generates a filename and creates file in mode 0600 Many sysadmins do not make /tmp large enough for huge temporary data files tempnam(), however, allows $TMPDIR or drc to be set to override /tmp 20001010 Tried tempnam() 20001010 but GCC 2.96 warns: "the use of `tempnam' is dangerous, better use `mkstemp'" */ int fl_out_hnd; /* Temporary file */ char *fl_out_tmp_sys; /* System-generated unique temporary filename */ fl_out_tmp_sys=(char *)nco_malloc((strlen(fl_out)+7)*sizeof(char)); fl_out_tmp_sys[0]='\0'; /* NUL-terminate */ fl_out_tmp_sys=strcat(fl_out_tmp_sys,fl_out); fl_out_tmp_sys=strcat(fl_out_tmp_sys,"XXXXXX"); #ifdef HAVE_MKSTEMP fl_out_hnd=mkstemp(fl_out_tmp_sys); #else /* !HAVE_MKSTEMP */ /* 20020812: Cray OS does not support mkstemp() */ fl_out_hnd=creat(mktemp(fl_out_tmp_sys),0600); #endif /* !HAVE_MKSTEMP */ fl_out_hnd=fl_out_hnd+0; /* CEWI Removes compiler warning on SGI */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stdout,"%s: %s reports strlen(fl_out_tmp_sys) = %ld, fl_out_tmp_sys = %s, \n",nco_prg_nm_get(),fnc_nm,(long)strlen(fl_out_tmp_sys),fl_out_tmp_sys); fl_out_tmp_sys=(char *)nco_free(fl_out_tmp_sys); } /* endif dbg */ #endif /* _MSC_VER */ if(WRT_TMP_FL){ /* If temporary file already exists, prompt user to remove temporary files and exit */ rcd_stt=stat(fl_out_tmp,&stat_sct); if(rcd_stt != -1){ (void)fprintf(stdout,"%s: ERROR temporary file %s already exists, remove and try again\n",nco_prg_nm_get(),fl_out_tmp); nco_exit(EXIT_FAILURE); } /* end if */ }else{ /* !WRT_TMP_FL */ /* Name "temporary output file" same as final output file et voilà, no temporary file! */ (void)strcpy(fl_out_tmp,fl_out); } /* !WRT_TMP_FL */ /* Initialize local buffer size hint with user-input value */ bfr_sz_hnt_lcl= (bfr_sz_hnt) ? *bfr_sz_hnt : NC_SIZEHINT_DEFAULT; /* [B] Buffer size hint */ if(FORCE_OVERWRITE){ #ifdef ENABLE_MPI rcd+=nco_create_par(fl_out_tmp,md_create,MPI_COMM_WORLD,MPI_INFO_NULL,out_id); #else /* !ENABLE_MPI */ rcd+=nco__create(fl_out_tmp,md_create,NC_SIZEHINT_DEFAULT,&bfr_sz_hnt_lcl,out_id); #endif /* !ENABLE_MPI */ return fl_out_tmp; } /* end if */ /* Following code block could be potentially be used by ncrename and ncatted Doing so would align file I/O for these operators with rest of NCO However, this would also require abandoning their "special treatment" which both requires them to work on local (not remote or DAP) files, and prevents them from creating intermediate files. Changing towards greater NCO-wide consistency would be a good thing? In ~20 years since release, though, only one complaint (from Chris Lynnes) that ncatted/ncrename have this locality requirement */ if(False){ if(nco_prg_id_get() == ncrename || nco_prg_id_get() == ncatted){ /* ncrename and ncatted allow single filename without question */ /* Incur expense of copying current file to temporary file */ int md_open; /* [enm] Mode flag for nc_open() call */ (void)nco_fl_cp(fl_out,fl_out_tmp); if(RAM_OPEN) md_open=NC_WRITE|NC_DISKLESS; else md_open=NC_WRITE; rcd+=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt_lcl,out_id); (void)nco_redef(*out_id); return fl_out_tmp; } /* end if */ } /* end if false */ /* If permanent output file already exists, query user whether to overwrite, append, or exit */ rcd_stt=stat(fl_out,&stat_sct); if(rcd_stt != -1){ char *rcd_fgets=NULL; /* Return code from fgets */ char usr_rpl[NCO_USR_RPL_MAX_LNG]; int md_open; /* [enm] Mode flag for nc_open() call */ int usr_rpl_int; short nbr_itr=0; size_t usr_rpl_lng; /* Initialize user reply string */ usr_rpl[0]='z'; usr_rpl[1]='\0'; if(RAM_OPEN) md_open=NC_WRITE|NC_DISKLESS; else md_open=NC_WRITE; if(FORCE_APPEND){ /* Incur expense of copying current file to temporary file This is a no-op when files are identical */ (void)nco_fl_cp(fl_out,fl_out_tmp); rcd+=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt_lcl,out_id); (void)nco_redef(*out_id); return fl_out_tmp; } /* end if */ /* Ensure one exit condition for each valid switch in following case statement */ while(strcasecmp(usr_rpl,"o") && strcasecmp(usr_rpl,"a") && strcasecmp(usr_rpl,"e")){ /* fxm: i18n necessary here */ /* int cnv_nbr; *//* [nbr] Number of scanf conversions performed this scan */ if(nbr_itr++ > NCO_MAX_NBR_USR_INPUT_RETRY){ (void)fprintf(stdout,"\n%s: ERROR %d failed attempts to obtain valid interactive input. Assuming non-interactive shell and exiting.\n",nco_prg_nm_get(),nbr_itr-1); nco_exit(EXIT_FAILURE); } /* end if */ if(nbr_itr > 1) (void)fprintf(stdout,"%s: ERROR Invalid response.\n",nco_prg_nm_get()); (void)fprintf(stdout,"%s: %s exists---`e'xit, `o'verwrite (i.e., delete existing file), or `a'ppend (i.e., replace duplicate variables in and add new variables to existing file) (e/o/a)? ",nco_prg_nm_get(),fl_out); (void)fflush(stdout); /* fgets() reads (at most one less than NCO_USR_RPL_MAX_LNG) to first newline or EOF */ rcd_fgets=fgets(usr_rpl,NCO_USR_RPL_MAX_LNG,stdin); /* fscanf() reads ... */ /* while((cnv_nbr=fscanf(stdin,"%9s",usr_rpl)) != EOF) continue;*/ /* while((rcd_fgets=fgets(usr_rpl,NCO_USR_RPL_MAX_LNG,stdin)) == NULL){*/ /* if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: DEBUG Read \"%s\" while waiting for non-NULL on stdin...\n",nco_prg_nm_get(),(rcd_fgets == NULL) ? "NULL" : usr_rpl);*/ /* continue;}*/ /* Ensure last character in input string is \n and replace that with \0 */ usr_rpl_lng=strlen(usr_rpl); if(usr_rpl_lng >= 1) if(usr_rpl[usr_rpl_lng-1] == '\n') usr_rpl[usr_rpl_lng-1]='\0'; if(nco_dbg_lvl_get() == nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s reports that fgets() read \"%s\" (after removing trailing newline) from stdin\n",nco_prg_nm_get(),fnc_nm,(rcd_fgets == NULL) ? "NULL" : usr_rpl); } /* end while user reply is not yet "o", "a", or "e" */ /* Ensure one case statement for each exit condition in preceding while loop */ usr_rpl_int=(int)usr_rpl[0]; switch(usr_rpl_int){ case 'E': case 'e': nco_exit(EXIT_SUCCESS); break; case 'O': case 'o': #ifdef ENABLE_MPI rcd+=nco_create_par(fl_out_tmp,md_create,MPI_COMM_WORLD,MPI_INFO_NULL,out_id); #else /* !ENABLE_MPI */ rcd+=nco__create(fl_out_tmp,md_create,NC_SIZEHINT_DEFAULT,&bfr_sz_hnt_lcl,out_id); #endif /* !ENABLE_MPI */ break; case 'A': case 'a': /* Incur expense of copying current file to temporary file */ (void)nco_fl_cp(fl_out,fl_out_tmp); rcd+=nco_fl_open(fl_out_tmp,md_open,&bfr_sz_hnt_lcl,out_id); (void)nco_redef(*out_id); break; default: nco_dfl_case_nc_type_err(); break; } /* end switch */ }else{ /* Output file does not already exist */ md_create=NC_NOCLOBBER; md_create=nco_create_mode_mrg(md_create,fl_out_fmt); if(RAM_CREATE) md_create|=NC_DISKLESS|NC_WRITE; #ifdef ENABLE_MPI rcd+=nco_create_par(fl_out_tmp,md_create,MPI_COMM_WORLD,MPI_INFO_NULL,out_id); #else /* !ENABLE_MPI */ rcd+=nco__create(fl_out_tmp,md_create,NC_SIZEHINT_DEFAULT,&bfr_sz_hnt_lcl,out_id); #endif /* !ENABLE_MPI */ } /* end if output file does not already exist */ if(rcd != NC_NOERR) nco_err_exit(rcd,fnc_nm); return fl_out_tmp; } /* end nco_fl_out_open() */ void nco_fl_out_cls /* [fnc] Close temporary output file, move it to permanent output file */ (const char * const fl_out, /* I [sng] Name of permanent output file */ const char * const fl_out_tmp, /* I [sng] Name of temporary output file to close and move to permanent output file */ const int nc_id) /* I [id] File ID of fl_out_tmp */ { /* Purpose: Close temporary output file, move it to permanent output file */ int rcd; /* [rcd] Return code */ rcd=nco_close(nc_id); if(rcd != NC_NOERR){ (void)fprintf(stdout,"%s: ERROR nco_fl_out_cls() is unable to nco_close() file %s\n",nco_prg_nm_get(),fl_out_tmp); nco_exit(EXIT_FAILURE); } /* end if */ /* Only bother to perform system() call if files are not identical */ if(!strcmp(fl_out_tmp,fl_out)){ if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: INFO Temporary and final files %s are identical---no need to move.\n",nco_prg_nm_get(),fl_out); return; }else{ (void)nco_fl_mv(fl_out_tmp,fl_out); } /* end if */ } /* end nco_fl_out_cls() */ void nco_fl_rm /* [fnc] Remove file */ (char *fl_nm) /* I [sng] File to be removed */ { /* Purpose: Remove specified file from local system */ int rcd; char *rm_cmd; #ifdef _MSC_VER const char rm_cmd_sys_dep[]="del /F"; #else /* !_MSC_VER */ const char rm_cmd_sys_dep[]="rm -f"; #endif /* !_MSC_VER */ /* Remember to add one for the space and one for the terminating NUL character */ rm_cmd=(char *)nco_malloc((strlen(rm_cmd_sys_dep)+1UL+strlen(fl_nm)+1UL)*sizeof(char)); (void)sprintf(rm_cmd,"%s %s",rm_cmd_sys_dep,fl_nm); if(nco_dbg_lvl_get() >= nco_dbg_fl) (void)fprintf(stderr,"%s: DEBUG Removing %s with %s\n",nco_prg_nm_get(),fl_nm,rm_cmd); rcd=system(rm_cmd); if(rcd == -1) (void)fprintf(stderr,"%s: WARNING unable to remove %s, continuing anyway...\n",nco_prg_nm_get(),fl_nm); rm_cmd=(char *)nco_free(rm_cmd); } /* end nco_fl_rm() */ nco-4.5.4/src/nco/nco_fl_utl.h000066400000000000000000000160471264355130400161610ustar00rootroot00000000000000/* $Header$ */ /* Purpose: File manipulation */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_fl_utl.h" *//* File manipulation */ #ifndef NCO_FL_UTL_H #define NCO_FL_UTL_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* system/library error diagnostics, errno */ #include /* sin cos cos sin 3.14159 */ #include /* stderr, FILE, NULL, printf */ #include /* strtod, strtol, malloc, getopt, exit */ #include /* strcmp() */ #ifdef HAVE_STRINGS_H # include /* strcasecmp() */ #endif /* !HAVE_STRINGS_H */ #include /* stat() */ #ifndef _MSC_VER # include /* POSIX stuff */ # include /* needed for _res */ # include /* password structures for getpwuid() */ #endif /* !_MSC_VER */ #ifdef _MSC_VER # include /* MSVC getpid() */ # include /* MSVC Sleep() */ typedef int pid_t; #endif /* !_MSC_VER */ #ifndef WIN32 # include /* needed for _res */ # include /* Internet structures for _res */ #endif /* !WIN32 */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ #include "nco_netcdf.h" /* NCO wrappers for netCDF C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_ctl.h" /* Program flow control functions */ #include "nco_mmr.h" /* Memory management */ #include "nco_sng_utl.h" /* String utilities */ /* 20120301: Replace multiple instances of hard-coded retry limit with CPP token NCO_MAX_NBR_USR_INPUT_RETRY */ #ifndef NCO_MAX_NBR_USR_INPUT_RETRY # define NCO_MAX_NBR_USR_INPUT_RETRY 10 #endif /* NCO_MAX_NBR_USR_INPUT_RETRY */ /* 20120301: Replace multiple instances of hard-coded reply length limit with CPP token NCO_USR_RPL_MAX_LNG */ #ifndef NCO_USR_RPL_MAX_LNG # define NCO_USR_RPL_MAX_LNG 10 #endif /* NCO_USR_RPL_MAX_LNG */ #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ int /* O [enm] Mode flag for nco_create() call */ nco_create_mode_mrg /* [fnc] Merge clobber mode with user-specified file format */ (const int md_clobber, /* I [enm] Clobber mode (NC_CLOBBER or NC_NOCLOBBER) */ const int fl_out_fmt); /* I [enm] Output file format */ int /* [rcd] Return code */ nco_create_mode_prs /* [fnc] Parse user-specified file format */ (const char * const fl_fmt_sng, /* I [sng] User-specified file format string */ int * const fl_fmt_enm); /* O [enm] Output file format */ void nco_fl_cmp_err_chk(void); /* [fnc] Perform error checking on file */ void nco_fl_chmod /* [fnc] Ensure file is user/owner-writable */ (const char * const fl_nm); /* I [sng] Name of file */ void nco_fl_cp /* [fnc] Copy first file to second */ (const char * const fl_src, /* I [sng] Name of source file to copy */ const char * const fl_dst); /* I [sng] Name of destination file */ void nco_fl_overwrite_prm /* [fnc] Obtain user consent to overwrite output file */ (const char * const fl_nm); /* I [sng] Name of file */ void nco_fl_fmt_vet /* [fnc] Verify output file format supports requested actions */ (const int fl_fmt, /* I [enm] Output file format */ const int cnk_nbr, /* I [nbr] Number of chunksizes specified */ const int dfl_lvl); /* I [enm] Deflate level [0..9] */ char * /* O [sng] Canonical file name*/ nco_fl_info_get /* [fnc] Determine canonical filename and properties */ (const char * const fl_nm_lcl); /* I [sng] Name of file */ char ** /* O [sng] List of user-specified filenames */ nco_fl_lst_mk /* [fnc] Create file list from command line positional arguments */ (CST_X_PTR_CST_PTR_CST_Y(char,argv), /* I [sng] Argument list */ const int argc, /* I [nbr] Argument count */ int arg_crr, /* I [idx] Index of current argument */ int * const fl_nbr, /* O [nbr] Number of files in input file list */ char ** const fl_out, /* I/O [sng] Name of output file */ nco_bool *FL_LST_IN_FROM_STDIN); /* O [flg] fl_lst_in comes from stdin */ char * /* O [sng] Filename of locally available file */ nco_fl_mk_lcl /* [fnc] Retrieve input file and return local filename */ (char *fl_nm, /* I/O [sng] Current filename, if any (destroyed) */ const char * const fl_pth_lcl, /* I [sng] Local storage area for files retrieved from remote locations */ nco_bool * const FL_RTR_RMT_LCN); /* O [flg] File was retrieved from remote location */ void nco_fl_mv /* [fnc] Move first file to second */ (const char * const fl_src, /* I [sng] Name of source file to move */ const char * const fl_dst); /* I [sng] Name of destination file */ char * /* O [sng] Name of file to retrieve */ nco_fl_nm_prs /* [fnc] Construct file name from input arguments */ (char *fl_nm, /* I/O [sng] Current filename, if any */ const int fl_idx, /* I [nbr] Ordinal index of file in input file list */ int * const fl_nbr, /* I/O [nbr] Number of files to be processed */ char * const * const fl_lst_in, /* I [sng] User-specified filenames */ const int abb_arg_nbr, /* I [nbr] Number of abbreviation arguments */ CST_X_PTR_CST_PTR_CST_Y(char,fl_lst_abb), /* I [sng] NINTAP-style arguments, if any */ const char * const fl_pth); /* I [sng] Path prefix for files in fl_lst_in */ size_t /* [B] Blocksize */ nco_fl_blocksize /* [fnc] Find blocksize of filesystem will or does contain this file */ (const char * const fl_out); /* [sng] Filename */ char * /* O [sng] Name of temporary file actually opened */ nco_fl_out_open /* [fnc] Open output file subject to availability and user input */ (const char * const fl_out, /* I [sng] Name of file to open */ const nco_bool FORCE_APPEND, /* I [flg] Append to existing file, if any */ const nco_bool FORCE_OVERWRITE, /* I [flg] Overwrite existing file, if any */ const int fl_out_fmt, /* I [enm] Output file format */ const size_t * const bfr_sz_hnt, /* I [B] Buffer size hint */ const int RAM_CREATE, /* I [flg] Create file in RAM */ const int RAM_OPEN, /* I [flg] Open (netCDF3) file(s) in RAM */ const int WRT_TMP_FL, /* I [flg] Write output to temporary file */ int * const out_id); /* O [id] File ID */ void nco_fl_out_cls /* [fnc] Close temporary output file, move it to permanent output file */ (const char * const fl_out, /* I [sng] Name of permanent output file */ const char * const fl_out_tmp, /* I [sng] Name of temporary output file to close and move to permanent output file */ const int nc_id); /* I [id] File ID of fl_out_tmp */ void nco_fl_rm /* [fnc] Remove file */ (char *fl_nm); /* I [sng] File to be removed */ int /* [rcd] Return code */ nco_fl_open /* [fnc] Open file using appropriate buffer size hints and verbosity */ (const char * const fl_nm, /* I [sng] Name of file to open */ const int md_open, /* I [enm] Mode flag for nc_open() call */ const size_t * const bfr_sz_hnt, /* I [B] Buffer size hint */ int * const nc_id); /* O [id] File ID */ #ifdef __cplusplus } /* end extern "C" */ #endif /* __cplusplus */ #endif /* NCO_FL_UTL_H */ nco-4.5.4/src/nco/nco_getopt.c000066400000000000000000000222301264355130400161600ustar00rootroot00000000000000/* $Header$ */ /* "my_getopt" package is "drop-in" replacement for GNU getopt() by Benjamin Sittler downloaded from http://www.geocities.com/ResearchTriangle/Node/9405/#my_getopt It is distributed under the BSD-like license below Modifications: 20030101: Downloaded source 20030108: Renamed my_getopt.h, my_getopt.c to nco_getopt.c, nco_getopt.h */ /* Original, unmodified license header: */ /* * my_getopt.c - my re-implementation of getopt. * Copyright 1997, 2000, 2001, 2002, Benjamin Sittler * * 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 AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #include #include #include #include #include "nco_getopt.h" /* csz renamed this with nco_ prefix */ int my_optind=1, my_opterr=1, my_optopt=0; char *my_optarg=0; /* this is the plain old UNIX getopt, with GNU-style extensions. */ /* if you're porting some piece of UNIX software, this is all you need. */ /* this supports GNU-style permution and optional arguments */ int my_getopt(int argc, char * argv[], const char *opts) { static int charind=0; const char *s; char mode, colon_mode; int off = 0, opt = -1; if(getenv("POSIXLY_CORRECT")) colon_mode = mode = '+'; else { if((colon_mode = *opts) == ':') off ++; if(((mode = opts[off]) == '+') || (mode == '-')) { off++; if((colon_mode != ':') && ((colon_mode = opts[off]) == ':')) off ++; } } my_optarg = 0; if(charind) { my_optopt = argv[my_optind][charind]; for(s=opts+off; *s; s++) if(my_optopt == *s) { charind++; if((*(++s) == ':') || ((my_optopt == 'W') && (*s == ';'))) { if(argv[my_optind][charind]) { my_optarg = &(argv[my_optind++][charind]); charind = 0; } else if(*(++s) != ':') { charind = 0; if(++my_optind >= argc) { if(my_opterr) fprintf(stderr, "%s: option requires an argument -- %c\n", argv[0], my_optopt); opt = (colon_mode == ':') ? ':' : '?'; goto my_getopt_ok; } my_optarg = argv[my_optind++]; } } opt = my_optopt; goto my_getopt_ok; } if(my_opterr) fprintf(stderr, "%s: illegal option -- %c\n", argv[0], my_optopt); opt = '?'; if(argv[my_optind][++charind] == '\0') { my_optind++; charind = 0; } my_getopt_ok: if(charind && ! argv[my_optind][charind]) { my_optind++; charind = 0; } } else if((my_optind >= argc) || ((argv[my_optind][0] == '-') && (argv[my_optind][1] == '-') && (argv[my_optind][2] == '\0'))) { my_optind++; opt = -1; } else if((argv[my_optind][0] != '-') || (argv[my_optind][1] == '\0')) { char *tmp; int i, j, k; if(mode == '+') opt = -1; else if(mode == '-') { my_optarg = argv[my_optind++]; charind = 0; opt = 1; } else { for(i=j=my_optind; i j) { tmp=argv[--i]; for(k=i; k+1 argc) my_optind = argc; return opt; } /* this is the extended getopt_long{,_only}, with some GNU-like * extensions. Implements _getopt_internal in case any programs * expecting GNU libc getopt call it. */ int _my_getopt_internal(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind, int long_only) { char mode, colon_mode = *shortopts; int shortoff = 0, opt = -1; if(getenv("POSIXLY_CORRECT")) colon_mode = mode = '+'; else { if((colon_mode = *shortopts) == ':') shortoff ++; if(((mode = shortopts[shortoff]) == '+') || (mode == '-')) { shortoff++; if((colon_mode != ':') && ((colon_mode = shortopts[shortoff]) == ':')) shortoff ++; } } my_optarg = 0; if((my_optind >= argc) || ((argv[my_optind][0] == '-') && (argv[my_optind][1] == '-') && (argv[my_optind][2] == '\0'))) { my_optind++; opt = -1; } else if((argv[my_optind][0] != '-') || (argv[my_optind][1] == '\0')) { char *tmp; int i, j, k; opt = -1; if(mode == '+') return -1; else if(mode == '-') { my_optarg = argv[my_optind++]; return 1; } for(i=j=my_optind; i j) { tmp=argv[--i]; for(k=i; k+1= argc) { opt = (colon_mode == ':') ? ':' : '?'; if(my_opterr) fprintf(stderr, "%s: option `--%s' requires an argument\n", argv[0], longopts[found].name); } else my_optarg = argv[my_optind]; } if(!opt) { if (longind) *longind = found; if(!longopts[found].flag) opt = longopts[found].val; else *(longopts[found].flag) = longopts[found].val; } my_optind++; } else if(!hits) { if(offset == 1) opt = my_getopt(argc, argv, shortopts); else { opt = '?'; if(my_opterr) fprintf(stderr, "%s: unrecognized option `%s'\n", argv[0], argv[my_optind++]); } } else { opt = '?'; if(my_opterr) fprintf(stderr, "%s: option `%s' is ambiguous\n", argv[0], argv[my_optind++]); } } if (my_optind > argc) my_optind = argc; return opt; } int my_getopt_long(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind) { return _my_getopt_internal(argc, argv, shortopts, longopts, longind, 0); } int my_getopt_long_only(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind) { return _my_getopt_internal(argc, argv, shortopts, longopts, longind, 1); } nco-4.5.4/src/nco/nco_getopt.h000066400000000000000000000061541264355130400161740ustar00rootroot00000000000000/* $Header$ */ /* "my_getopt" package is "drop-in" replacement for GNU getopt() by Benjamin Sittler downloaded from http://www.geocities.com/ResearchTriangle/Node/9405/#my_getopt It is distributed under BSD-like license. Modifications: 20030101: Downloaded source 20030108: Renamed my_getopt.h, my_getopt.c to nco_getopt.c, nco_getopt.h */ /* Original, unmodified license header: */ /* * my_getopt.h - interface to my re-implementation of getopt. * Copyright 1997, 2000, 2001, 2002, Benjamin Sittler * * 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 AUTHORS OR COPYRIGHT * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. */ #ifndef MY_GETOPT_H_INCLUDED #define MY_GETOPT_H_INCLUDED #ifdef __cplusplus extern "C" { #endif /* UNIX-style short-argument parser */ extern int my_getopt(int argc, char * argv[], const char *opts); extern int my_optind, my_opterr, my_optopt; extern char *my_optarg; struct option { const char *name; int has_arg; int *flag; int val; }; /* human-readable values for has_arg */ #undef no_argument #define no_argument 0 #undef required_argument #define required_argument 1 #undef optional_argument #define optional_argument 2 /* GNU-style long-argument parsers */ extern int my_getopt_long(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind); extern int my_getopt_long_only(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind); extern int _my_getopt_internal(int argc, char * argv[], const char *shortopts, const struct option *longopts, int *longind, int long_only); #undef getopt #define getopt my_getopt #undef getopt_long #define getopt_long my_getopt_long #undef getopt_long_only #define getopt_long_only my_getopt_long_only #undef _getopt_internal #define _getopt_internal _my_getopt_internal #undef opterr #define opterr my_opterr #undef optind #define optind my_optind #undef optopt #define optopt my_optopt #undef optarg #define optarg my_optarg #ifdef __cplusplus } #endif #endif /* MY_GETOPT_H_INCLUDED */ nco-4.5.4/src/nco/nco_grp_trv.c000066400000000000000000001245461264355130400163560ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF4 traversal storage */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* This file contains the API for low level group data structures: Group Traversal Table (GTT): functions prefixed with "trv_tbl_" It does not include any netCDF API calls */ #include "nco_grp_trv.h" /* Group traversal */ void trv_tbl_init /* [fnc] GTT initialize */ (trv_tbl_sct **tbl) /* I/O [sct] Traversal table */ { trv_tbl_sct *tb=(trv_tbl_sct *)nco_malloc(sizeof(trv_tbl_sct)); /* Object (group/variable) list */ tb->nbr=0; tb->lst=NULL; /* Dimension list */ tb->nbr_dmn=0; tb->lst_dmn=NULL; /* Degenerate dimensions used by ncwa */ tb->nbr_dmn_dgn=0; tb->dmn_dgn=NULL; /* Ensembles */ tb->nsm_nbr=0; tb->nsm=NULL; tb->nsm_sfx=NULL; *tbl=tb; } /* trv_tbl_init() */ void trv_tbl_free /* [fnc] GTT free memory */ (trv_tbl_sct *tbl) /* I [sct] Traversal table */ { const char fnc_nm[]="trv_tbl_free()"; /* [sng] Function name */ #ifdef DEBUG_LEAKS int crt_counter=0; #endif /* Hash Table */ nco_trv_hsh_del(tbl); /* Object (group/variable) list */ for(unsigned idx=0;idxnbr;idx++){ tbl->lst[idx].nm_fll=(char *)nco_free(tbl->lst[idx].nm_fll); tbl->lst[idx].nm=(char *)nco_free(tbl->lst[idx].nm); tbl->lst[idx].grp_nm=(char *)nco_free(tbl->lst[idx].grp_nm); tbl->lst[idx].grp_nm_fll=(char *)nco_free(tbl->lst[idx].grp_nm_fll); tbl->lst[idx].grp_nm_fll_prn=(char *)nco_free(tbl->lst[idx].grp_nm_fll_prn); tbl->lst[idx].nsm_nm=(char *)nco_free(tbl->lst[idx].nsm_nm); tbl->lst[idx].rec_dmn_nm_out=(char *)nco_free(tbl->lst[idx].rec_dmn_nm_out); tbl->lst[idx].hsh_key=(char *)nco_free(tbl->lst[idx].hsh_key); /* Dimensions */ for(int dmn_idx=0;dmn_idxlst[idx].nbr_dmn;dmn_idx++){ /* If dimensions exist (only for variables ) */ if(tbl->lst[idx].var_dmn){ tbl->lst[idx].var_dmn[dmn_idx].dmn_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].dmn_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].dmn_nm=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].dmn_nm); tbl->lst[idx].var_dmn[dmn_idx].grp_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].grp_nm_fll); int nbr_lat_crd=tbl->lst[idx].var_dmn[dmn_idx].nbr_lat_crd; for(int idx_crd=0;idx_crdlst[idx].var_dmn[dmn_idx].lat_crd[idx_crd].nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].lat_crd[idx_crd].nm_fll); int nbr_lon_crd=tbl->lst[idx].var_dmn[dmn_idx].nbr_lon_crd; for(int idx_crd=0;idx_crdlst[idx].var_dmn[dmn_idx].lon_crd[idx_crd].nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].lon_crd[idx_crd].nm_fll); /* Coordinate structure */ if(tbl->lst[idx].var_dmn[dmn_idx].crd){ tbl->lst[idx].var_dmn[dmn_idx].crd->crd_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->crd_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].crd->dmn_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->dmn_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].crd->crd_grp_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->crd_grp_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].crd->dmn_grp_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->dmn_grp_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].crd->nm=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->nm); tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.dmn_nm=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.dmn_nm); for(int lmt_idx=0;lmt_idxlst[idx].var_dmn[dmn_idx].crd->lmt_msa.lmt_dmn_nbr;lmt_idx++) tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.lmt_dmn[lmt_idx]=nco_lmt_free(tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.lmt_dmn[lmt_idx]); tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.lmt_dmn=(lmt_sct **)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd->lmt_msa.lmt_dmn); tbl->lst[idx].var_dmn[dmn_idx].crd=(crd_sct *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].crd); #ifdef DEBUG_LEAKS crt_counter++; #endif }else if(tbl->lst[idx].var_dmn[dmn_idx].ncd){ tbl->lst[idx].var_dmn[dmn_idx].ncd->grp_nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->grp_nm_fll); tbl->lst[idx].var_dmn[dmn_idx].ncd->nm_fll=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->nm_fll); tbl->lst[idx].var_dmn[dmn_idx].ncd->nm=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->nm); tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.dmn_nm=(char *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.dmn_nm); for(int lmt_idx=0;lmt_idxlst[idx].var_dmn[dmn_idx].ncd->lmt_msa.lmt_dmn_nbr;lmt_idx++) tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.lmt_dmn[lmt_idx]=nco_lmt_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.lmt_dmn[lmt_idx]); tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.lmt_dmn=(lmt_sct **)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd->lmt_msa.lmt_dmn); tbl->lst[idx].var_dmn[dmn_idx].ncd=(dmn_trv_sct *)nco_free(tbl->lst[idx].var_dmn[dmn_idx].ncd); } } /* Dimensions */ tbl->lst[idx].var_dmn=(var_dmn_sct *)nco_free(tbl->lst[idx].var_dmn); tbl->lst[idx].dmn_idx_out_in=(int *)nco_free(tbl->lst[idx].dmn_idx_out_in); tbl->lst[idx].dmn_rvr_in=(nco_bool *)nco_free(tbl->lst[idx].dmn_rvr_in); } /* If dimensions exist (only for variables) */ } /* Object (group/variable) list */ tbl->lst=(trv_sct *)nco_free(tbl->lst); /* Dimension list */ for(unsigned int dmn_idx=0;dmn_idxnbr_dmn;dmn_idx++){ tbl->lst_dmn[dmn_idx].nm=(char *)nco_free(tbl->lst_dmn[dmn_idx].nm); tbl->lst_dmn[dmn_idx].nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].nm_fll); tbl->lst_dmn[dmn_idx].grp_nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].grp_nm_fll); tbl->lst_dmn[dmn_idx].lmt_msa.dmn_nm=(char *)nco_free(tbl->lst_dmn[dmn_idx].lmt_msa.dmn_nm); for(int lmt_idx=0;lmt_idxlst_dmn[dmn_idx].lmt_msa.lmt_dmn_nbr;lmt_idx++) tbl->lst_dmn[dmn_idx].lmt_msa.lmt_dmn[lmt_idx]=nco_lmt_free(tbl->lst_dmn[dmn_idx].lmt_msa.lmt_dmn[lmt_idx]); /* Total number of coordinate variables for this dimension */ int crd_nbr=tbl->lst_dmn[dmn_idx].crd_nbr; /* Coordinate structures */ for(int crd_idx=0;crd_idxlst_dmn[dmn_idx].crd[crd_idx]->crd_nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->crd_nm_fll); tbl->lst_dmn[dmn_idx].crd[crd_idx]->dmn_nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->dmn_nm_fll); tbl->lst_dmn[dmn_idx].crd[crd_idx]->crd_grp_nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->crd_grp_nm_fll); tbl->lst_dmn[dmn_idx].crd[crd_idx]->dmn_grp_nm_fll=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->dmn_grp_nm_fll); tbl->lst_dmn[dmn_idx].crd[crd_idx]->nm=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->nm); tbl->lst_dmn[dmn_idx].crd[crd_idx]->lmt_msa.dmn_nm=(char *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->lmt_msa.dmn_nm); for(int lmt_idx=0;lmt_idxlst_dmn[dmn_idx].crd[crd_idx]->lmt_msa.lmt_dmn_nbr;lmt_idx++) tbl->lst_dmn[dmn_idx].crd[crd_idx]->lmt_msa.lmt_dmn[lmt_idx]=nco_lmt_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]->lmt_msa.lmt_dmn[lmt_idx]); tbl->lst_dmn[dmn_idx].crd[crd_idx]=(crd_sct *)nco_free(tbl->lst_dmn[dmn_idx].crd[crd_idx]); } /* Coordinate structures */ tbl->lst_dmn[dmn_idx].crd=(crd_sct **)nco_free(tbl->lst_dmn[dmn_idx].crd); } /* Dimension list */ tbl->lst_dmn=(dmn_trv_sct *)nco_free(tbl->lst_dmn); /* Members used only by transformation operators (non-ncks) */ /* (ncwa) Degenerate dimensions */ tbl->dmn_dgn=(dmn_sct *)nco_free(tbl->dmn_dgn); /* Ensembles */ for(int idx_nsm=0;idx_nsmnsm_nbr;idx_nsm++){ tbl->nsm[idx_nsm].grp_nm_fll_prn=(char *)nco_free(tbl->nsm[idx_nsm].grp_nm_fll_prn); for(int idx=0;idxnsm[idx_nsm].tpl_nbr;idx++) tbl->nsm[idx_nsm].tpl_mbr_nm[idx]=(char *)nco_free(tbl->nsm[idx_nsm].tpl_mbr_nm[idx]); for(int idx=0;idxnsm[idx_nsm].skp_nbr;idx++) tbl->nsm[idx_nsm].skp_nm_fll[idx]=(char *)nco_free(tbl->nsm[idx_nsm].skp_nm_fll[idx]); tbl->nsm[idx_nsm].mbr=(nsm_grp_sct*)nco_free(tbl->nsm[idx_nsm].mbr); } /* Ensembles */ tbl->nsm_sfx=(char *)nco_free(tbl->nsm_sfx); tbl=(trv_tbl_sct *)nco_free(tbl); #ifdef DEBUG_LEAKS if(nco_dbg_lvl_get() >= nco_dbg_sup)(void)fprintf(stdout,"%s: DEBUG %s %d crd",nco_prg_nm_get(),fnc_nm,crt_counter); #endif } /* end trv_tbl_free() */ void trv_tbl_inq /* [fnc] Find and return global totals of dimensions, variables, attributes */ (int * const att_glb_all, /* O [nbr] Number of global attributes in file */ int * const att_grp_all, /* O [nbr] Number of group attributes in file */ int * const att_var_all, /* O [nbr] Number of variable attributes in file */ int * const dmn_nbr_all, /* O [nbr] Number of dimensions in file */ int * const dmn_rec_all, /* O [nbr] Number of record dimensions in file */ int * const grp_dpt_all, /* O [nbr] Maximum group depth (root = 0) */ int * const grp_nbr_all, /* O [nbr] Number of groups in file */ int * const var_ntm_all, /* O [nbr] Number of non-atomic variables in file */ int * const var_tmc_all, /* O [nbr] Number of atomic-type variables in file */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* [fnc] Find and return global file summaries like # of dimensions, variables, attributes */ int att_glb_lcl; /* [nbr] Number of global attributes in file */ int att_grp_lcl; /* [nbr] Number of group attributes in file */ int att_var_lcl; /* [nbr] Number of variable attributes in file */ int dmn_rec_lcl; /* [nbr] Number of record dimensions in file */ int grp_dpt_lcl; /* [nbr] Maximum group depth (root = 0) */ int grp_nbr_lcl; /* [nbr] Number of groups in file */ int var_ntm_lcl; /* [nbr] Number of non-atomic variables in file */ int var_tmc_lcl; /* [nbr] Number of atomic-type variables in file */ /* Initialize */ att_glb_lcl=0; att_grp_lcl=0; att_var_lcl=0; dmn_rec_lcl=0; grp_dpt_lcl=0; grp_nbr_lcl=0; var_ntm_lcl=0; var_tmc_lcl=0; for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv=trv_tbl->lst[idx_tbl]; if(trv.nco_typ == nco_obj_typ_var) att_var_lcl+=trv.nbr_att; if(trv.nco_typ == nco_obj_typ_nonatomic_var) var_ntm_lcl++; if(trv.nco_typ == nco_obj_typ_grp){ grp_nbr_lcl+=trv.nbr_grp; var_tmc_lcl+=trv.nbr_var; if(grp_dpt_lcl < trv.grp_dpt) grp_dpt_lcl=trv.grp_dpt; if(!strcmp(trv.nm_fll,"/")) att_glb_lcl=trv.nbr_att; else att_grp_lcl+=trv.nbr_att; } /* end nco_obj_typ_grp */ } /* end idx_tbl */ for(unsigned idx_tbl=0;idx_tblnbr_dmn;idx_tbl++) if(trv_tbl->lst_dmn[idx_tbl].is_rec_dmn) dmn_rec_lcl++; if(att_glb_all) *att_glb_all=att_glb_lcl; if(att_grp_all) *att_grp_all=att_grp_lcl; if(att_var_all) *att_var_all=att_var_lcl; if(dmn_nbr_all) *dmn_nbr_all=trv_tbl->nbr_dmn; if(dmn_rec_all) *dmn_rec_all=dmn_rec_lcl; if(grp_dpt_all) *grp_dpt_all=grp_dpt_lcl; if(grp_nbr_all) *grp_nbr_all=grp_nbr_lcl; if(var_ntm_all) *var_ntm_all=var_ntm_lcl; if(var_tmc_all) *var_tmc_all=var_tmc_lcl; return; } /* end trv_tbl_inq() */ void trv_tbl_prn_flg_mch /* [fnc] Print table items that have .flg_mch */ (const trv_tbl_sct * const trv_tbl, /* I [sct] Traversal table */ const nco_obj_typ obj_typ) /* I [enm] Object type (group or variable) */ { /* Print all matching objects of given type from traversal table */ trv_sct trv_obj; for(unsigned int tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_obj=trv_tbl->lst[tbl_idx]; if((trv_obj.nco_typ == obj_typ) && trv_obj.flg_mch) (void)fprintf(stdout,"nm_fll=%s\n",trv_obj.nm_fll); } /* end loop over trv_tbl */ } /* end trv_tbl_prn_flg_mch() */ void trv_tbl_prn_flg_xtr /* [fnc] Print table items that have .flg_xtr */ (const char * const fnc_nm, /* I [sng] Function name */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { (void)fprintf(stdout,"%s: INFO %s reports extracted objects:\n",nco_prg_nm_get(),fnc_nm); /* Print all matching objects from traversal table */ trv_sct trv_obj; for(unsigned int tbl_idx=0;tbl_idxnbr;tbl_idx++){ trv_obj=trv_tbl->lst[tbl_idx]; if(trv_obj.flg_xtr) (void)fprintf(stdout,"%s\n",trv_obj.nm_fll); } /* end loop over trv_tbl */ } /* end trv_tbl_prn_flg_xtr() */ void trv_tbl_prn /* [fnc] Print table with -z */ (const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv=trv_tbl->lst[idx_tbl]; if(trv.nco_typ == nco_obj_typ_grp) (void)fprintf(stdout,"grp: "); else (void)fprintf(stdout,"var: "); (void)fprintf(stdout,"%s\n",trv_tbl->lst[idx_tbl].nm_fll); } /* end idx_tbl */ } /* end trv_tbl_prn() */ char * /* O [flg] Full variable name */ nco_gid_var_nm_2_var_nm_fll /* [fnc] Construct full variable name from group ID and variable name */ (const int grp_id, /* I [ID] netCDF input group ID */ const char * const var_nm) /* I [sng] Variable name */ { char *var_nm_fll; size_t grp_nm_lng; size_t var_nm_fll_lng; (void)nco_inq_grpname_full(grp_id,&grp_nm_lng,NULL); /* Groups except root need a slash character to separate their name from variable name */ var_nm_fll_lng=grp_nm_lng+strlen(var_nm); if(grp_nm_lng != 1L) var_nm_fll_lng++; /* One extra space for NUL-terminator */ var_nm_fll=(char *)nco_malloc(var_nm_fll_lng+1L); (void)nco_inq_grpname_full(grp_id,NULL,var_nm_fll); if(grp_nm_lng != 1L) strcat(var_nm_fll,"/"); strcat(var_nm_fll,var_nm); return var_nm_fll; } /* end nco_gid_var_nm_2_var_nm_fll() */ nco_bool /* O [flg] Item found or not */ trv_tbl_fnd_var_nm_fll /* [fnc] Check if "var_nm_fll" is in table */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && !strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)) return True; return False; } /* end trv_tbl_fnd_var_nm_fll() */ trv_sct * /* O [sct] Table object */ trv_tbl_var_nm_fll /* [fnc] Return variable object from full name key */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Purpose: Return variable object with given full name */ #ifdef NCO_HSH_TRV_OBJ trv_sct *trv_obj; /* [sct] GTT object structure */ HASH_FIND_STR(trv_tbl->hsh,var_nm_fll,trv_obj); if(trv_obj && trv_obj->nco_typ == nco_obj_typ_var) return trv_obj; else return NULL; #else /* !NCO_HSH_TRV_OBJ */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var) if(!strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)) return &trv_tbl->lst[idx_tbl]; return NULL; #endif /* !NCO_HSH_TRV_OBJ */ } /* trv_tbl_var_nm_fll() */ trv_sct * /* O [sct] Table object */ trv_tbl_grp_nm_fll /* [fnc] Return group object from full name key */ (const char * const grp_nm_fll, /* I [sng] Group name to find */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Purpose: Return group object with given full name */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_grp && !strcmp(grp_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)) return &trv_tbl->lst[idx_tbl]; return NULL; } /* trv_tbl_grp_nm_fll() */ void trv_tbl_mrk_xtr /* [fnc] Mark extraction flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const nco_bool flg_xtr, /* I [flg] Flag (True or False) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { #ifdef NCO_HSH_TRV_OBJ trv_sct *trv_obj; /* [sct] GTT object structure */ HASH_FIND_STR(trv_tbl->hsh,var_nm_fll,trv_obj); if(trv_obj) trv_obj->flg_xtr=flg_xtr; #else /* !NCO_HSH_TRV_OBJ */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(!strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)) trv_tbl->lst[idx_tbl].flg_xtr=flg_xtr; #endif /* !NCO_HSH_TRV_OBJ */ return; } /* end trv_tbl_mrk_xtr() */ void trv_tbl_mrk_grp_xtr /* [fnc] Mark extraction flag in table for "grp_nm_fll" */ (const char * const grp_nm_fll, /* I [sng] Group name to find */ const nco_bool flg_xtr, /* I [flg] Flag (True or False) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(!strcmp(grp_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)) trv_tbl->lst[idx_tbl].flg_xtr=flg_xtr; return; } /* end trv_tbl_mrk_grp_xtr() */ void trv_tbl_mrk_prc_fix /* [fnc] Mark fixed/processed flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ prc_typ_enm typ_prc, /* I [enm] Processing type */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ if(!strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)){ trv_tbl->lst[idx_tbl].enm_prc_typ=typ_prc; return; } } assert(0); } /* end trv_tbl_mrk_prc_fix() */ void trv_tbl_prn_xtr /* [fnc] Print extraction flag of traversal table */ (const trv_tbl_sct * const trv_tbl, /* I [sct] Traversal table */ const char * const fnc_nm) /* I [sng] Function name of the calling function */ { int idx=0; int nbr_flg=0; /* Loop table */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].flg_xtr) nbr_flg++; (void)fprintf(stdout,"%s: INFO %s reports %d objects with extraction flag (flg_xtr) set:\n",nco_prg_nm_get(),fnc_nm,nbr_flg); for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].flg_xtr) (void)fprintf(stdout,"%d %s\n",idx++,trv_tbl->lst[idx_tbl].nm_fll); } /* end trv_tbl_prn_xtr() */ static int /* O [enm] Comparison result [<,=,>] 0 iff val_1 [<,==,>] val_2 */ trv_tbl_cmp_nm_fll /* [fnc] Compare two trv_sct's by full name member */ (const void *val_1, /* I [sct] trv_sct to compare */ const void *val_2) /* I [sct] trv_sct to compare */ { /* Purpose: Compare two trv_sct's by name structure member Function is suitable for argument to ANSI C qsort() routine in stdlib.h Code based on responses to my comp.lang.c thread 20040101 */ return strcmp((*(trv_sct const *)val_1).nm_fll,(*(trv_sct const *)val_2).nm_fll); } /* end nco_cmp_trv_tbl_nm() */ void trv_tbl_srt /* [fnc] Sort traversal table */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Alphabetize list by object full name This produces easy-to-search variable name screen output with ncks */ qsort(trv_tbl->lst,(size_t)trv_tbl->nbr,sizeof(trv_sct),trv_tbl_cmp_nm_fll); } /* end trv_tbl_srt() */ void trv_tbl_mch /* [fnc] Match 2 tables (find common objects) and export common objects */ (const trv_tbl_sct * const trv_tbl_1, /* I [sct] GTT (Group Traversal Table) */ const trv_tbl_sct * const trv_tbl_2, /* I [sct] GTT (Group Traversal Table) */ nco_cmn_t **cmn_lst, /* I/O [sct] List of common names */ int * nbr_cmn_nm) /* I/O [nbr] Number of common names */ { /* Purpose: Find common objects. Use cosequential match algorithm described in Folk, Michael; Zoellick, Bill. (1992). File Structures. Addison-Wesley. Compare 2 ordered lists of names: if Name(1) is less than Name(2), read next name from List 1; this is done by incrementing current index if Name(1) is greater than Name(2), read next name from List 2 if names are identical, read next names from both lists Used in ncbo; ncbo performs binary operations on variables in file 1 and matching variables (those with the same name) in file 2 and stores results in file 3. This function detects common absolute names in tables 1 and 2 and does ncbo binary operation NB: cosequential match algorithm requires alphabetical sorted full names. The table is sorted in nco_bld_trv_tbl() only for ncbo */ const char fnc_nm[]="trv_tbl_mch()"; /* [sng] Function name */ int idx_lst; /* [idx] Current position in common List */ int idx_tbl_1; /* [idx] Current position in List 1 */ int idx_tbl_2; /* [idx] Current position in List 2 */ int nbr_tbl_1; /* [nbr] Number of items in list 1 */ int nbr_tbl_2; /* [nbr] Number of items in list 2 */ int nco_cmp; /* [nbr] Return value of strcmp() */ nco_bool flg_more_names_exist; /* [flg] Are there more names to process? */ if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: INFO %s reports Sorted table 1\n",nco_prg_nm_get(),fnc_nm); (void)trv_tbl_prn(trv_tbl_1); (void)fprintf(stdout,"%s: INFO %s reports Sorted table 2\n",nco_prg_nm_get(),fnc_nm); (void)trv_tbl_prn(trv_tbl_2); } /* endif dbg */ /* Get number of objects in each table */ nbr_tbl_1=trv_tbl_1->nbr; nbr_tbl_2=trv_tbl_2->nbr; /* If both lists have names, then there are names to process */ flg_more_names_exist = (nbr_tbl_1 > 0 && nbr_tbl_2 > 0) ? True : False; /* Initialize counters */ idx_tbl_1=0; idx_tbl_2=0; idx_lst=0; /* Store list of common objects */ (*cmn_lst)=(nco_cmn_t *)nco_malloc((nbr_tbl_1+nbr_tbl_2)*sizeof(nco_cmn_t)); /* Iterate lists */ while(flg_more_names_exist){ trv_sct trv_1=trv_tbl_1->lst[idx_tbl_1]; trv_sct trv_2=trv_tbl_2->lst[idx_tbl_2]; /* Criteria is string compare */ nco_cmp=strcmp(trv_1.nm_fll,trv_2.nm_fll); /* Names match: store flag, define or write in output file, then read next name from lists */ if(!nco_cmp){ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(trv_1.nm_fll); idx_lst++; idx_tbl_1++; idx_tbl_2++; }else if(nco_cmp < 0){ /* Name(1) is less than Name(2), read next name from List 1 */ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=False; (*cmn_lst)[idx_lst].nm=strdup(trv_1.nm_fll); idx_lst++; if(nco_dbg_lvl_get() == nco_dbg_old)(void)fprintf(stdout,"%s: INFO %s reports tbl_1[%d]:%s\n",nco_prg_nm_get(),fnc_nm,idx_tbl_1,trv_1.nm_fll); idx_tbl_1++; }else{ /* Name(1) is greater than Name(2), read next name from List 2 */ (*cmn_lst)[idx_lst].flg_in_fl[0]=False; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(trv_2.nm_fll); idx_lst++; if(nco_dbg_lvl_get() == nco_dbg_old)(void)fprintf(stdout,"%s: INFO %s reports tbl_2[%d]:%s\n",nco_prg_nm_get(),fnc_nm,idx_tbl_2,trv_2.nm_fll); idx_tbl_2++; } /* end nco_cmp */ flg_more_names_exist = (idx_tbl_1 < nbr_tbl_1 && idx_tbl_2 < nbr_tbl_2) ? True : False; } /* end while */ /* List1 did not end */ if(idx_tbl_1 < nbr_tbl_1){ while(idx_tbl_1 < nbr_tbl_1){ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=False; (*cmn_lst)[idx_lst].nm=strdup(trv_tbl_1->lst[idx_tbl_1].nm_fll); idx_lst++; if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s reports tbl_1[%d]:%s\n",nco_prg_nm_get(),fnc_nm,idx_tbl_1,trv_tbl_1->lst[idx_tbl_1].nm_fll); idx_tbl_1++; } /* end while */ } /* end if */ /* List2 did not end */ if(idx_tbl_2 < nbr_tbl_2){ while(idx_tbl_2 < nbr_tbl_2){ (*cmn_lst)[idx_lst].flg_in_fl[0]=False; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(trv_tbl_2->lst[idx_tbl_2].nm_fll); idx_lst++; if(nco_dbg_lvl_get() == nco_dbg_old)(void)fprintf(stdout,"%s: INFO %s reports tbl_2[%d]:%s\n",nco_prg_nm_get(),fnc_nm,idx_tbl_2,trv_tbl_2->lst[idx_tbl_2].nm_fll); idx_tbl_2++; } /* end while */ } /* end if */ /* Print list */ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)trv_tbl_cmn_nm_prt(*cmn_lst,idx_lst); /* Export number of entries */ *nbr_cmn_nm=idx_lst; } /* trv_tbl_mch() */ void trv_tbl_cmn_nm_prt /* [fnc] Print list of common objects (same absolute path) */ (const nco_cmn_t * const cmn_lst, /* I [sct] List of common names */ const int nbr_cmn_nm) /* I [nbr] Number of common names entries */ { (void)fprintf(stdout,"%s: INFO reports common objects for both files (same absolute path)\n",nco_prg_nm_get()); (void)fprintf(stdout,"file1 file2\n"); (void)fprintf(stdout,"---------------------------------------\n"); for(int idx=0;idxnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_grp && trv_tbl->lst[idx_tbl].grp_dpt == 1) nbr_grp_dpt++; return nbr_grp_dpt; } /* trv_tbl_inq_dpt() */ dmn_trv_sct * /* O [sct] GTT dimension structure (stored in *groups*) */ nco_dmn_trv_sct /* [fnc] Return unique dimension object from unique ID */ (const int dmn_id, /* I [id] Unique dimension ID */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Search table dimension list and compare IDs */ for(unsigned int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++) if(dmn_id == trv_tbl->lst_dmn[idx_dmn].dmn_id) return &trv_tbl->lst_dmn[idx_dmn]; assert(0); return NULL; } /* nco_dmn_trv_sct() */ void nco_dmn_set_msa /* [fnc] Update dimension with hyperslabbed size */ (const int dmn_id, /* I [id] Unique dimension ID */ const long dmn_cnt, /* I [nbr] New dimension size */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Search table dimension list and compared IDs */ for(unsigned int dmn_idx=0;dmn_idxnbr_dmn;dmn_idx++) if(dmn_id == trv_tbl->lst_dmn[dmn_idx].dmn_id) trv_tbl->lst_dmn[dmn_idx].lmt_msa.dmn_cnt=dmn_cnt; return; } /* nco_dmn_set_msa() */ void nco_trv_hsh_del /* Delete hash table */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Delete hash table http://troydhanson.github.io/uthash/userguide.html#_delete_item */ trv_sct *trv_obj; /* [sct] GTT object structure */ trv_sct *hsh_tmp; /* [sct] GTT object structure */ /* Iterate over hash table */ HASH_ITER(hh,trv_tbl->hsh,trv_obj,hsh_tmp){ /* Delete current object */ HASH_DEL(trv_tbl->hsh,trv_obj); } /* end iteration over hash table */ } /* nco_trv_hsh_del() */ void nco_trv_hsh_bld /* Hash traversal table for fastest access */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Hash all objects in traversal table and store resultant hash table */ /* Notes on Hash vs. Other methods: Usually we wish to find and return object with same full name Full names are guaranteed to unique in netCDF4/HDF5 files The two practical methods are: 1. Bruit-force search with loop/strcmp(): (old method) No initial setup necessary Loop through traversal table, use strcmp() to find matching name This method works if traversal table is re-ordered or names change after keys are generated Time-expense of bruit-force searches is O(n) This method is therefore more robust yet much slower than hashes 2. Hash table: (new method) Add each object to hash table on creation by calling nco_trv_hsh_bld() from nco_bld_trv_tbl() This generates hash table as string-keyed hash with object's full-name as key Then, as needed, pass key to hash table to retrieve desired object This method does not depend on traversal table remaining in same order as when keys were generated But it does require that no names change after keys are generated More specifically, it requires old hash entries be deleted and new ones added when keys change Time-expense of hashes is O(1+n/k) Hashes are therefore more fragile yet much quicker than bruit-force searches Care must be used to destroy/replace/re-create hash table entries if when keys change (or table is re-ordered) Hash table lookups: trv_sct *trv_obj; HASH_FIND_STR(trv_tbl->hsh,nm_fll,trv_obj); return trv_obj; fxm: this does not work yet!!! must check that trv_obj->obj_typ=nco_obj_typ_var!!! why??? Input key argument (nm_fll field) is unchanged However, HASH_FIND_STR() macro treats key as (i.e., casts it to) unsigned bytes internally Hence -Wcast_qual causes compiler complaint if key argument is const char * const nm_fll Potential workarounds: 1. Eliminate -Wcast_qual from compiler settings Verified that this does work Unpalatable because it weakens static checking on rest of code Use GNU Make Target-specific variables to restrict lax flags to files with hash prototypes, e.g., # Target-specific variable values syntax TARGET ... : VARIABLE-ASSIGNMENT # Rules begin in leftmost column else interpreted as commands ifneq (${null},$(findstring ${PVM_ARCH},LINUXALPHALINUXAMD64LINUXARMFREEBSD)) ifeq (gcc,$(firstword ${CC})) ${MY_OBJ_DIR}/nco_grp_trv.o : CFLAGS := $(filter-out -Wcast-qual,${CFLAGS}) ${MY_OBJ_DIR}/nco_grp_trv.o : CXXFLAGS := $(filter-out -Wcast-qual,${CXXFLAGS}) endif # endif GCC endif # endif LINUX 2. Change function prototype to non-const key This eliminates compiler warnings at cost of introducing non-typesafe code paths Move all hash-lookup functions into single file that does not get -Wcast_qual? 3. Pass key as void pointer? Not sure this is doable/would work 4. Duplicate then free() key for each hash-lookup Verified this works yet it seems too expensive, e.g., char *hsh_key=(char *)strdup(nm_fll); HASH_FIND_STR(trv_tbl->hsh,hsh_key,trv_obj); if(hsh_key) hsh_key=(char *)nco_free(hsh_key); */ /* NB: Hash table MUST be NULL-initialized */ trv_tbl->hsh=NULL; for(unsigned int tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Key is full object name but do not use nm_fll itself as key That would be unsafe because of dangling pointer to nm_fll Instead duplicate nm_fll into its own hsh_key field Release this hsh_key memory in trv_tbl_free() */ trv_tbl->lst[tbl_idx].hsh_key=strdup(trv_tbl->lst[tbl_idx].nm_fll); /* General macro faster than convenience macro since can use GTT-supplied string length */ HASH_ADD_KEYPTR(hh,trv_tbl->hsh,trv_tbl->lst[tbl_idx].hsh_key,trv_tbl->lst[tbl_idx].nm_fll_lng,trv_tbl->lst+tbl_idx); /* Convenience macro (more expensive because UTHASH must compute key-length itself?) */ // HASH_ADD_PTR(trv_tbl->hsh,trv_tbl->lst[tbl_idx].hsh_key,trv_tbl->lst+tbl_idx); } /* end loop over trv_tbl */ } /* end trv_tbl_hsh() */ void nco_nm_srt /* [fnc] Sort traversal table */ (char **nm_lst, /* I [sng] List of names */ const int nm_lst_nbr) /* I [nbr] Number of items in list */ { /* Purpose: Sort list of strings */ qsort(nm_lst,(size_t)nm_lst_nbr,sizeof(char **),nco_cmp_sng); } /* end nco_nm_srt() */ void nco_nm_mch /* [fnc] Match 2 lists of strings and mark common strings */ (char **nm_lst_1, /* I [sng] List of names */ const int nm_lst_1_nbr, /* I [nbr] Number of items in list */ char **nm_lst_2, /* I [sng] List of names */ const int nm_lst_2_nbr, /* I [nbr] Number of items in list */ nco_cmn_t **cmn_lst, /* I/O [sct] List of all names */ int * nbr_nm, /* I/O [nbr] Number of all names (size of above array) */ int * nbr_cmn_nm) /* I/O [nbr] Number of common names */ { /* Purpose: Match 2 lists of strings and export common strings. Use cosequential match algorithm described in Folk, Michael; Zoellick, Bill. (1992). File Structures. Addison-Wesley. Compare 2 ordered lists of names: if Name(1) is less than Name(2), read next name from List 1; this is done by incrementing current index if Name(1) is greater than Name(2), read next name from List 2 if names are identical, read next names from both lists */ int idx_lst; /* [idx] Current position in common List */ int idx_tbl_1; /* [idx] Current position in List 1 */ int idx_tbl_2; /* [idx] Current position in List 2 */ int nbr_tbl_1; /* [nbr] Number of items in list 1 */ int nbr_tbl_2; /* [nbr] Number of items in list 2 */ int nco_cmp; /* [nbr] Return value of strcmp() */ nco_bool flg_more_names_exist; /* [flg] Are there more names to process? */ /* Names must be sorted */ (void)nco_nm_srt(nm_lst_1,nm_lst_1_nbr); (void)nco_nm_srt(nm_lst_2,nm_lst_2_nbr); /* Get number of objects in each table */ nbr_tbl_1=nm_lst_1_nbr; nbr_tbl_2=nm_lst_2_nbr; /* If both lists have names, then there are names to process */ flg_more_names_exist = (nbr_tbl_1 > 0 && nbr_tbl_2 > 0) ? True : False; /* Store list of common objects */ (*cmn_lst)=(nco_cmn_t *)nco_malloc((nbr_tbl_1+nbr_tbl_2)*sizeof(nco_cmn_t)); /* Initialize counters and output */ *nbr_cmn_nm=0; *nbr_nm=0; idx_tbl_1=0; idx_tbl_2=0; idx_lst=0; /* Iterate lists */ while(flg_more_names_exist){ char *nm_1=nm_lst_1[idx_tbl_1]; char *nm_2=nm_lst_2[idx_tbl_2]; /* Criteria is string compare */ nco_cmp=strcmp(nm_1,nm_2); /* Names match: store flag, define or write in output file, then read next name from lists */ if(!nco_cmp){ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(nm_1); idx_lst++; idx_tbl_1++; idx_tbl_2++; /* Export commnon names */ *nbr_cmn_nm=idx_lst; }else if(nco_cmp < 0){ /* Name(1) is less than Name(2), read next name from List 1 */ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=False; (*cmn_lst)[idx_lst].nm=strdup(nm_1); idx_lst++; idx_tbl_1++; }else{ /* Name(1) is greater than Name(2), read next name from List 2 */ (*cmn_lst)[idx_lst].flg_in_fl[0]=False; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(nm_2); idx_lst++; idx_tbl_2++; } /* end nco_cmp */ flg_more_names_exist = (idx_tbl_1 < nbr_tbl_1 && idx_tbl_2 < nbr_tbl_2) ? True : False; } /* end while */ /* List1 did not end */ if(idx_tbl_1 < nbr_tbl_1){ while(idx_tbl_1 < nbr_tbl_1){ (*cmn_lst)[idx_lst].flg_in_fl[0]=True; (*cmn_lst)[idx_lst].flg_in_fl[1]=False; (*cmn_lst)[idx_lst].nm=strdup(nm_lst_1[idx_tbl_1]); idx_lst++; idx_tbl_1++; } /* end while */ } /* end if */ /* List2 did not end */ if(idx_tbl_2 < nbr_tbl_2){ while(idx_tbl_2 < nbr_tbl_2){ (*cmn_lst)[idx_lst].flg_in_fl[0]=False; (*cmn_lst)[idx_lst].flg_in_fl[1]=True; (*cmn_lst)[idx_lst].nm=strdup(nm_lst_2[idx_tbl_2]); idx_lst++; idx_tbl_2++; } /* end while */ } /* end if */ /* Export number of entries */ *nbr_nm=idx_lst; } /* nco_nm_mch() */ void trv_tbl_mrk_nsm_mbr /* [fnc] Mark ensemble member flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const nco_bool flg_nsm_tpl, /* I [flg] Variable is template member */ const char * const grp_nm_fll_prn, /* I [sng] Parent group full name (key for ensemble) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && !strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)){ trv_tbl->lst[idx_tbl].flg_nsm_mbr=True; trv_tbl->lst[idx_tbl].nsm_nm=strdup(grp_nm_fll_prn); if(flg_nsm_tpl) trv_tbl->lst[idx_tbl].flg_nsm_tpl=True; } } return; } /* end trv_tbl_mrk_nsm_mbr() */ char * /* O [sng] Full path */ nco_bld_nm_fll /* [fnc] Utility function to build a full path */ (const char * const grp_nm_fll, /* I [sng] Group full name */ const char * const var_nm) /* I [sng] Variable name */ { /* Allocate path buffer and include space for trailing NUL */ char *var_nm_fll=(char *)nco_malloc(strlen(grp_nm_fll)+strlen(var_nm)+2L); /* Initialize path with current absolute group path */ strcpy(var_nm_fll,grp_nm_fll); /* If not root group, concatenate separator */ if(strcmp(grp_nm_fll,"/")) strcat(var_nm_fll,"/"); /* Concatenate variable to absolute group path */ strcat(var_nm_fll,var_nm); return var_nm_fll; } /* nco_bld_nm_fll() */ nco_bool nco_lst_ins /* [fnc] Utility function to detect inserted names in a name list */ (const char * const nm, /* I [sng] A name to detect */ const nco_cmn_t *cmn_lst, /* I [sct] List of names */ const int nbr_nm) /* I [nbr] Number of names (size of above array) */ { /* If match then mark as inserted in array */ for(int idx_nm=0;idx_nmnsm_sfx); /* Loop table */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_grp && !strcmp(grp_nm_fll_prn,trv_tbl->lst[tbl_idx].nm_fll)){ /* Define (append) a new name */ char *nm_fll_sfx=(char*)nco_malloc(strlen(grp_nm_fll_prn)+strlen(trv_tbl->lst[tbl_idx].nm)+strlen(trv_tbl->nsm_sfx)+2L); strcpy(nm_fll_sfx,grp_nm_fll_prn); strcat(nm_fll_sfx,"/"); strcat(nm_fll_sfx,trv_tbl->lst[tbl_idx].nm); strcat(nm_fll_sfx,trv_tbl->nsm_sfx); return nm_fll_sfx; } /* Match */ } /* Loop table*/ assert(0); return NULL; } /* nco_bld_nsm_sfx() */ nco_bool nco_is_fll_pth /* [fnc] Utility function to inquire if a string is a full path */ (const char * const str) /* I [sng] A string to inquire */ { const char *sbs_srt; /* [sng] Location of string match start in parameter string */ /* If parameter string contains any slash character '/' , assume it is a full path */ sbs_srt=strstr(str,"/"); if(sbs_srt) return True; return False; } /* nco_is_fll_pth() */ trv_sct * /* O [sct] Table object */ trv_tbl_var_nm /* [fnc] Return variable object (relative name) */ (const char * const var_nm, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Purpose: Return variable object with given relative name (returns 1st name found) NB: Calling this function is almost certainly a mistake */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && !strcmp(var_nm,trv_tbl->lst[idx_tbl].nm)) return &trv_tbl->lst[idx_tbl]; return NULL; } /* trv_tbl_var_nm() */ trv_sct * /* O [sct] Table object */ trv_tbl_nsm_nm /* [fnc] Return variable object */ (const char * const var_nm, /* I [sng] Variable name (relative) to find */ const char * const grp_nm_fll_prn, /* I [sng] Ensemble parent group */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Purpose: Return variable object that matches criteria of ensemble parent group and variable relative name */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; if(var_trv.nco_typ == nco_obj_typ_var && !strcmp(var_nm,var_trv.nm)) if(!strcmp(grp_nm_fll_prn,var_trv.grp_nm_fll_prn)) return &trv_tbl->lst[idx_tbl]; } return NULL; } /* trv_tbl_nsm_nm() */ trv_sct * /* O [sct] Table object */ trv_tbl_nsm_nm_att /* [fnc] Return variable object */ (const char * const var_nm, /* I [sng] Variable name (relative) to find */ const char * const grp_nm_fll_prn, /* I [sng] Ensemble parent group */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Purpose: Return variable object that matches criteria of ensemble parent group and variable relative name NOTE: using "var_trv.grp_nm_fll" for match */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; if(var_trv.nco_typ == nco_obj_typ_var && !strcmp(var_nm,var_trv.nm)) if(!strcmp(grp_nm_fll_prn,var_trv.grp_nm_fll)) return &trv_tbl->lst[idx_tbl]; } return NULL; } /* trv_tbl_nsm_nm_att() */ nco-4.5.4/src/nco/nco_grp_trv.h000066400000000000000000000254011264355130400163510ustar00rootroot00000000000000/* $Header$ */ /* Purpose: netCDF4 traversal storage */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Usage: #include "nco_grp_trv.h" *//* Group traversal */ #ifndef NCO_GRP_TRV_H #define NCO_GRP_TRV_H #ifdef HAVE_CONFIG_H # include /* Autotools tokens */ #endif /* !HAVE_CONFIG_H */ /* Standard header files */ #include /* strcmp() */ /* 3rd party vendors */ #include /* netCDF definitions and C library */ /* Personal headers */ #include "nco.h" /* netCDF Operator (NCO) definitions */ #include "nco_cnf_typ.h" /* Conform variable types */ #include "nco_mmr.h" /* Memory management */ void trv_tbl_init /* [fnc] GTT initialize */ (trv_tbl_sct **tbl); /* I/O [sct] Traversal table */ /* end trv_tbl_init */ void trv_tbl_free /* [fnc] GTT free memory */ (trv_tbl_sct *tbl); /* I/O [sct] Traversal table */ /* end trv_tbl_free */ void trv_tbl_inq /* [fnc] Find and return global totals of dimensions, variables, attributes */ (int * const att_glb_all, /* O [nbr] Number of global attributes in file */ int * const att_grp_all, /* O [nbr] Number of group attributes in file */ int * const att_var_all, /* O [nbr] Number of variable attributes in file */ int * const dmn_nbr_all, /* O [nbr] Number of dimensions in file */ int * const dmn_rec_all, /* O [nbr] Number of record dimensions in file */ int * const grp_dpt_all, /* O [nbr] Maximum group depth (root = 0) */ int * const grp_nbr_all, /* O [nbr] Number of groups in file */ int * const var_ntm_all, /* O [nbr] Number of non-atomic variables in file */ int * const var_tmc_all, /* O [nbr] Number of atomic-type variables in file */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ void trv_tbl_prn_flg_mch /* [fnc] Print table items that have .flg_mch */ (const trv_tbl_sct * const trv_tbl, /* I [sct] Traversal table */ const nco_obj_typ obj_typ); /* I [enm] Object type (group or variable) */ void trv_tbl_prn /* [fnc] Print table with -z */ (const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ nco_bool trv_tbl_fnd_var_nm_fll /* [fnc] Check if "var_nm_fll" is in table */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ trv_sct * /* O [sct] Table object */ trv_tbl_var_nm /* [fnc] Return variable object (relative name) */ (const char * const var_nm, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ trv_sct * /* O [sct] Table object */ trv_tbl_var_nm_fll /* [fnc] Return object from full name key */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ trv_sct * /* O [sct] Table object */ trv_tbl_grp_nm_fll /* [fnc] Return group object from full name key */ (const char * const grp_nm_fll, /* I [sng] Group name to find */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ void trv_tbl_mrk_xtr /* [fnc] Mark extraction flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const nco_bool flg_xtr, /* I [flg] Flag (True or False) */ trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ void trv_tbl_mrk_grp_xtr /* [fnc] Mark extraction flag in table for "grp_nm_fll" */ (const char * const grp_nm_fll, /* I [sng] Group name to find */ const nco_bool flg_xtr, /* I [flg] Flag (True or False) */ trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ void trv_tbl_mrk_prc_fix /* [fnc] Mark fixed/processed flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ prc_typ_enm typ_prc, /* I [enm] Processing type */ trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ void trv_tbl_prn_xtr /* [fnc] Print extraction flag of traversal table */ (const trv_tbl_sct * const trv_tbl, /* I [sct] Traversal table */ const char * const fnc_nm); /* I [sng] Function name of the calling function */ void trv_tbl_srt /* [fnc] Sort traversal table */ (trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ int /* O [nbr] Number of depth 1 groups (root = 0) */ trv_tbl_inq_dpt /* [fnc] Return number of depth 1 groups */ (const trv_tbl_sct * const trv_tbl); /* I [sct] GTT (Group Traversal Table) */ void trv_tbl_mch /* [fnc] Match 2 tables (find common objects) and export common objects */ (const trv_tbl_sct * const trv_tbl_1, /* I [sct] GTT (Group Traversal Table) */ const trv_tbl_sct * const trv_tbl_2, /* I [sct] GTT (Group Traversal Table) */ nco_cmn_t **cmn_lst, /* I/O [sct] List of common names */ int * nbr_cmn_nm); /* I/O [nbr] Number of common names entries */ void trv_tbl_prn_flg_xtr /* [fnc] Print table items that have .flg_xtr */ (const char * const fnc_nm, /* I [sng] Function name */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ void trv_tbl_cmn_nm_prt /* [fnc] Print list of common objects (same absolute path) */ (const nco_cmn_t * const cmn_lst, /* I [sct] List of common names */ const int nbr_cmn_nm); /* I [nbr] Number of common names entries */ dmn_trv_sct * /* O [sct] GTT dimension structure (stored in *groups*) */ nco_dmn_trv_sct /* [fnc] Return unique dimension object from unique ID */ (const int dmn_id, /* I [id] Unique dimension ID */ const trv_tbl_sct * const trv_tbl); /* I [sct] GTT (Group Traversal Table) */ void nco_dmn_set_msa /* [fnc] Update dimension with hyperslabbed size */ (const int dmn_id, /* I [id] Unique dimension ID */ const long dmn_cnt, /* I [nbr] New dimension size */ trv_tbl_sct * const trv_tbl); /* I/O [sct] GTT (Group Traversal Table) */ void nco_trv_hsh_bld /* Hash traversal table for fastest access */ (trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ void nco_trv_hsh_del /* Delete hash table */ (trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ void nco_nm_srt /* [fnc] Sort traversal table */ (char **nm_lst, /* I [sng] List of names */ const int nm_lst_nbr); /* I [nbr] Number of items in list */ void nco_nm_mch /* [fnc] Match 2 lists of strings and mark common strings */ (char **nm_lst_1, /* I [sng] List of names */ const int nm_lst_1_nbr, /* I [nbr] Number of items in list */ char **nm_lst_2, /* I [sng] List of names */ const int nm_lst_2_nbr, /* I [nbr] Number of items in list */ nco_cmn_t **cmn_lst, /* I/O [sct] List of all names */ int * nbr_nm, /* I/O [nbr] Number of all names (size of above array) */ int * nbr_cmn_nm); /* I/O [nbr] Number of common names */ void trv_tbl_mrk_nsm_mbr /* [fnc] Mark ensemble member flag in table for "var_nm_fll" */ (const char * const var_nm_fll, /* I [sng] Variable name to find */ const nco_bool flg_nsm_tpl, /* I [flg] Variable is template member */ const char * const grp_nm_fll_prn, /* I [sng] Parent group full name (key for ensemble) */ trv_tbl_sct * const trv_tbl); /* I/O [sct] Traversal table */ char * /* O [sng] Full path */ nco_bld_nm_fll /* [fnc] Utility function to build a full path */ (const char * const grp_nm_fll, /* I [sng] Group full name */ const char * const var_nm); /* I [sng] Variable name */ nco_bool nco_lst_ins /* [fnc] Utility function to detect inserted names in a name list */ (const char * const nm, /* I [sng] A name to detect */ const nco_cmn_t *cmn_lst, /* I [sct] List of names */ const int nbr_nm); /* I [nbr] Number of names (size of above array) */ char * /* O [sng] Full path with suffix */ nco_bld_nsm_sfx /* [fnc] Build ensemble suffix */ (const char * const grp_nm_fll_prn, /* I [sng] Absolute group name of ensemble root */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ char * /* O [flg] Full variable name */ nco_gid_var_nm_2_var_nm_fll /* [fnc] Construct full variable name from group ID and variable name */ (const int grp_id, /* I [ID] netCDF input group ID */ const char * const var_nm); /* I [sng] Variable name */ nco_bool nco_is_fll_pth /* [fnc] Utility function to inquire if a string is a full path */ (const char * const str); /* I [sng] A string to inquire */ trv_sct * /* O [sct] Table object */ trv_tbl_nsm_nm /* [fnc] Return variable object */ (const char * const var_nm, /* I [sng] Variable name (relative) to find */ const char * const grp_nm_fll_prn, /* I [sng] Ensemble parent group */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ trv_sct * /* O [sct] Table object */ trv_tbl_nsm_nm_att /* [fnc] Return variable object */ (const char * const var_nm, /* I [sng] Variable name (relative) to find */ const char * const grp_nm_fll_prn, /* I [sng] Ensemble parent group */ const trv_tbl_sct * const trv_tbl); /* I [sct] Traversal table */ #endif /* NCO_GRP_TRV_H */ nco-4.5.4/src/nco/nco_grp_utl.c000066400000000000000000016235231264355130400163470ustar00rootroot00000000000000/* $Header$ */ /* Purpose: Group utilities */ /* Copyright (C) 1995--2016 Charlie Zender This file is part of NCO, the netCDF Operators. NCO is free software. You may redistribute and/or modify NCO under the terms of the GNU General Public License (GPL) Version 3 with exceptions described in the LICENSE file */ /* Testing: eos52nc4 ~/nco/data/in.he5 ~/in.nc4 export HDF5_DISABLE_VERSION_CHECK=1 ncdump -h ~/in.nc4 ncks -D 1 -m ~/in.nc4 ncks -O -D 3 -g HIRDLS -m ~/in.nc4 ~/foo.nc ncks -O -D 3 -m ~/in_grp.nc ~/foo.nc ncks -O -D 3 -v 'Q.?' ~/nco/data/in.nc ~/foo.nc */ #include "nco_grp_utl.h" /* Group utilities */ void nco_flg_set_grp_var_ass /* [fnc] Set flags for groups and variables associated with matched object */ (const char * const grp_nm_fll, /* I [sng] Full name of group */ const nco_obj_typ obj_typ, /* I [enm] Object type (group or variable) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Set flags for groups and variables associated with matched object */ trv_sct trv_obj; /* [sct] Traversal table object */ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++){ /* Create shallow copy to avoid indirection */ trv_obj=trv_tbl->lst[obj_idx]; /* If group was user-specified, flag all variables in group */ if(obj_typ == nco_obj_typ_grp && trv_obj.nco_typ == nco_obj_typ_var) if(!strcmp(grp_nm_fll,trv_obj.grp_nm_fll)) trv_tbl->lst[obj_idx].flg_vsg=True; /* If variable was user-specified, flag group containing variable */ if(obj_typ == nco_obj_typ_var && trv_obj.nco_typ == nco_obj_typ_grp) if(!strcmp(grp_nm_fll,trv_obj.grp_nm_fll)) trv_tbl->lst[obj_idx].flg_gcv=True; /* Flag ancestor groups of all user-specified groups and variables */ if(strstr(grp_nm_fll,trv_obj.grp_nm_fll)) trv_tbl->lst[obj_idx].flg_ncs=True; } /* end loop over obj_idx */ } /* end nco_flg_set_grp_var_ass() */ int /* [rcd] Return code */ nco_inq_grps_full /* [fnc] Discover and return IDs of apex and all sub-groups */ (const int grp_id, /* I [ID] Apex group */ int * const grp_nbr, /* O [nbr] Number of groups */ int * const grp_ids) /* O [ID] Group IDs of children */ { /* Purpose: Discover and return IDs of apex and all sub-groups If grp_nbr is NULL, it is ignored If grp_ids is NULL, it is ignored grp_ids must contain enough space to hold grp_nbr IDs */ int rcd=NC_NOERR; /* [rcd] Return code */ int grp_nbr_crr; /* [nbr] Number of groups counted so far */ int grp_id_crr; /* [ID] Current group ID */ grp_stk_sct *grp_stk=NULL_CEWI; /* [sct] Group stack pointer */ /* Initialize variables that are incremented */ grp_nbr_crr=0; /* [nbr] Number of groups counted (i.e., stored in grp_ids array) so far */ /* Initialize and obtain group iterator */ rcd+=nco_grp_stk_get(grp_id,&grp_stk); /* Find and return next group ID */ rcd+=nco_grp_stk_nxt(grp_stk,&grp_id_crr); while(grp_id_crr != NCO_LST_GRP){ /* Store last popped value into group ID array */ if(grp_ids) grp_ids[grp_nbr_crr]=grp_id_crr; /* [ID] Group IDs of children */ /* Increment counter */ grp_nbr_crr++; /* Find and return next group ID */ rcd+=nco_grp_stk_nxt(grp_stk,&grp_id_crr); } /* end while */ if(grp_nbr) *grp_nbr=grp_nbr_crr; /* O [nbr] Number of groups */ /* Free group iterator */ nco_grp_itr_free(grp_stk); return rcd; /* [rcd] Return code */ } /* end nco_inq_grps_full() */ int /* O [rcd] Return code */ nco_def_grp_full /* [fnc] Ensure all components of group path are defined */ (const int nc_id, /* I [ID] netCDF output-file ID */ const char * const grp_nm_fll, /* I [sng] Full group name */ int * const grp_out_id) /* O [ID] Deepest group ID */ { /* Purpose: Ensure all components of full path name exist and return ID of deepest group */ char *grp_pth=NULL; /* [sng] Full group path */ char *grp_pth_dpl=NULL; /* [sng] Full group path memory duplicate */ char *sls_ptr; /* [sng] Pointer to slash */ int grp_id_prn; /* [ID] Parent group ID */ int rcd=NC_NOERR; /* Initialize defaults */ *grp_out_id=nc_id; grp_pth_dpl=(char *)strdup(grp_nm_fll); grp_pth=grp_pth_dpl; /* No need to try to define root group */ if(grp_pth[0] == '/') grp_pth++; /* Define everything necessary beneath root group */ while(strlen(grp_pth)){ /* Terminate path at next slash, if any */ sls_ptr=strchr(grp_pth,'/'); /* Replace slash by NUL */ if(sls_ptr) *sls_ptr='\0'; /* Identify parent group */ grp_id_prn=*grp_out_id; /* If current group is not defined, define it */ if(nco_inq_ncid_flg(grp_id_prn,grp_pth,grp_out_id)) nco_def_grp(grp_id_prn,grp_pth,grp_out_id); /* Point to next group, if any */ if(sls_ptr) grp_pth=sls_ptr+1; else break; } /* end while */ grp_pth_dpl=(char *)nco_free(grp_pth_dpl); return rcd; } /* end nco_def_grp_full() */ void nco_grp_itr_free /* [fnc] Free group iterator */ (grp_stk_sct * const grp_stk) /* O [sct] Group stack pointer */ { /* Purpose: Free group iterator Call a function that hides the iterator implementation behind the API */ nco_grp_stk_free(grp_stk); } /* end nco_grp_itr_free() */ int /* [rcd] Return code */ nco_grp_stk_get /* [fnc] Initialize and obtain group iterator */ (const int grp_id, /* I [ID] Apex group */ grp_stk_sct ** const grp_stk) /* O [sct] Group stack pointer */ { /* Purpose: Initialize and obtain group iterator Routine pushes apex group onto stack The "Apex group" is normally (though not necessarily) the netCDF file ID, aka, root ID, and is the top group in the hierarchy. Returned iterator contains one valid group, the apex group, and the stack counter equals one */ int rcd=NC_NOERR; /* [rcd] Return code */ rcd+=nco_inq_grps(grp_id,(int *)NULL,(int *)NULL); /* These error codes would cause an abort in the netCDF wrapper layer anyway, so this condition is purely for defensive programming. */ if(rcd != NC_EBADID && rcd != NC_EBADGRPID){ *grp_stk=nco_grp_stk_ntl(); /* [fnc] Push group ID onto stack */ (void)nco_grp_stk_psh(*grp_stk,grp_id); } /* endif */ return rcd; /* [rcd] Return code */ } /* end nco_grp_stk_get() */ int /* [rcd] Return code */ nco_grp_stk_nxt /* [fnc] Find and return next group ID */ (grp_stk_sct * const grp_stk, /* I/O [sct] Group stack pointer */ int * const grp_id) /* O [ID] Group ID */ { /* Purpose: Find and return next group ID Next group ID is popped off stack If this group contains sub-groups, these sub-groups are pushed onto stack before return Hence routine ensures every group is eventually examined for sub-groups */ int *grp_ids; /* [ID] Group IDs of children */ int idx; int grp_nbr; /* I [nbr] Number of sub-groups */ int rcd=NC_NOERR; /* [rcd] Return code */ /* Is stack empty? */ if(grp_stk->grp_nbr == 0){ /* Return flag showing iterator has reached the end, i.e., no more groups */ *grp_id=NCO_LST_GRP; }else{ /* Return current stack top */ *grp_id=nco_grp_stk_pop(grp_stk); /* Replenish stack with sub-group IDs, if available */ rcd+=nco_inq_grps(*grp_id,&grp_nbr,(int *)NULL); if(grp_nbr > 0){ /* Add sub-groups of current stack top */ grp_ids=(int *)nco_malloc(grp_nbr*sizeof(int)); rcd+=nco_inq_grps(*grp_id,(int *)NULL,grp_ids); /* Push sub-group IDs in reverse order so when popped will come out in original order */ for(idx=grp_nbr-1;idx>=0;idx--) (void)nco_grp_stk_psh(grp_stk,grp_ids[idx]); /* Clean up memory */ grp_ids=(int *)nco_free(grp_ids); } /* endif sub-groups exist */ } /* endelse */ return rcd; /* [rcd] Return code */ } /* end nco_grp_stk_nxt() */ grp_stk_sct * /* O [sct] Group stack pointer */ nco_grp_stk_ntl /* [fnc] Initialize group stack */ (void) { /* Purpose: Initialize dynamic array implementation of group stack */ grp_stk_sct *grp_stk; /* O [sct] Group stack pointer */ grp_stk=(grp_stk_sct *)nco_malloc(sizeof(grp_stk)); /* O [sct] Group stack pointer */ grp_stk->grp_nbr=0; /* [nbr] Number of items in stack = number of elements in grp_id array */ grp_stk->grp_id=NULL; /* [ID] Group ID */ return grp_stk;/* O [sct] Group stack pointer */ } /* end nco_grp_stk_ntl() */ void nco_grp_stk_psh /* [fnc] Push group ID onto stack */ (grp_stk_sct * const grp_stk, /* I/O [sct] Group stack pointer */ const int grp_id) /* I [ID] Group ID to push */ { /* Purpose: Push group ID onto dynamic array implementation of stack */ grp_stk->grp_nbr++; /* [nbr] Number of items in stack = number of elements in grp_id array */ grp_stk->grp_id=(int *)nco_realloc(grp_stk->grp_id,(grp_stk->grp_nbr)*sizeof(int)); /* O [sct] Pointer to group IDs */ grp_stk->grp_id[grp_stk->grp_nbr-1]=grp_id; /* [ID] Group ID */ } /* end nco_grp_stk_psh() */ int /* O [ID] Group ID that was popped */ nco_grp_stk_pop /* [fnc] Remove and return group ID from stack */ (grp_stk_sct * const grp_stk) /* I/O [sct] Pointer to top of stack */ { /* Purpose: Remove and return group ID from dynamic array implementation of stack */ int grp_id; /* [ID] Group ID that was popped */ grp_id=grp_stk->grp_id[grp_stk->grp_nbr-1]; /* [ID] Group ID that was popped */ if(grp_stk->grp_nbr == 0){ (void)fprintf(stderr,"%s: ERROR nco_grp_stk_pop() asked to pop empty stack\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); } /* endif */ grp_stk->grp_nbr--; /* [nbr] Number of items in stack = number of elements in grp_id array */ grp_stk->grp_id=(int *)nco_realloc(grp_stk->grp_id,(grp_stk->grp_nbr)*sizeof(int)); /* O [sct] Pointer to group IDs */ return grp_id; /* [ID] Group ID that was popped */ } /* end nco_grp_stk_pop() */ void nco_grp_stk_free /* [fnc] Free group stack */ (grp_stk_sct * const grp_stk) /* O [sct] Group stack pointer */ { /* Purpose: Free dynamic array implementation of stack */ grp_stk->grp_id=(int *)nco_free(grp_stk->grp_id); } /* end nco_grp_stk_free() */ void nco_prn_grp_nm_fll /* [fnc] Debug function to print group full name from ID */ (const int grp_id) /* I [ID] Group ID */ { #if defined(HAVE_NETCDF4_H) size_t grp_nm_lng; char *grp_nm_fll; (void)nco_inq_grpname_full(grp_id,&grp_nm_lng,NULL); grp_nm_fll=(char*)nco_malloc(grp_nm_lng+1L); (void)nco_inq_grpname_full(grp_id,&grp_nm_lng,grp_nm_fll); (void)fprintf(stdout,"%s",grp_nm_fll); grp_nm_fll=(char*)nco_free(grp_nm_fll); #endif } /* nco_prn_grp_nm_fll() */ int /* [rcd] Return code */ nco_grp_dfn /* [fnc] Define groups in output file */ (const int out_id, /* I [ID] netCDF output-file ID */ nm_id_sct *grp_xtr_lst, /* [grp] Groups to be defined */ const int grp_nbr) /* I [nbr] Number of groups to be defined */ { /* Purpose: Define groups in output file */ int idx; int rcd=NC_NOERR; /* [rcd] Return code */ int rcr_lvl=1; /* [nbr] Recursion level */ if(nco_dbg_lvl_get() >= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO nco_grp_dfn() reports file level = 0 parent group = / (root group) will have %d sub-group%s\n",nco_prg_nm_get(),grp_nbr,(grp_nbr == 1) ? "" : "s"); /* For each (possibly user-specified) top-level group, define group and all subgroups */ for(idx=0;idx= nco_dbg_scl) (void)fprintf(stderr,"%s: INFO nco_def_grp_rcr() reports file level = %d parent group = %s will have %d sub-group%s\n",nco_prg_nm_get(),rcr_lvl,prn_nm,grp_nbr,(grp_nbr == 1) ? "" : "s"); /* Define each group, recursively, in output file */ for(idx=0;idxnm_fll); Allocation: sng_pth_lst_var=(sng_pth_sct **)nco_malloc(sls_nbr_var*sizeof(sng_pth_sct *)); Get token list in variable full name: (void)nco_get_sng_pth_sct(var_trv->nm_fll,&sng_pth_lst_var); */ char *ptr_chr; /* [sng] Pointer to character '/' in full name */ char *ptr_chr_tkn; /* [sng] Pointer to character */ int sls_nbr=0; /* [nbr] Number of of slash characterrs in string path */ int psn_chr; /* [nbr] Position of character '/' in in full name */ const char sls_chr='/'; /* [chr] Slash character */ const char sls_sng[]="/"; /* [sng] Slash string */ /* Duplicate original, since strtok() changes it */ char *sng=strdup(nm_fll); if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"Splitting \"%s\" into tokens:\n",sng); /* Get first token */ ptr_chr_tkn=strtok(sng,sls_sng); ptr_chr=strchr(nm_fll,sls_chr); while(ptr_chr){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s ",ptr_chr_tkn); psn_chr=ptr_chr-nm_fll; /* Store token and position */ (*sng_pth_lst)[sls_nbr]=(sng_pth_sct *)nco_malloc(sizeof(sng_pth_sct)); (*sng_pth_lst)[sls_nbr]->nm=strdup(ptr_chr_tkn); (*sng_pth_lst)[sls_nbr]->psn=psn_chr; /* Point where last token was found is kept internally by function */ ptr_chr_tkn=strtok(NULL,sls_sng); ptr_chr=strchr(ptr_chr+1,sls_chr); sls_nbr++; } /* end while */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"\n"); if(sng) sng=(char *)nco_free(sng); return sls_nbr; } /* nco_get_sls_chr_cnt() */ void nco_prn_att_trv /* [fnc] Traverse tree to print all group and global attributes */ (const int nc_id, /* I [id] netCDF file ID */ const prn_fmt_sct * const prn_flg, /* I [sct] Print-format information */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { int grp_id; /* [ID] Group ID */ int nbr_att; /* [nbr] Number of attributes */ int nbr_dmn; /* [nbr] Number of dimensions */ int nbr_var; /* [nbr] Number of variables */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv=trv_tbl->lst[idx_tbl]; if(trv.nco_typ == nco_obj_typ_grp && trv.flg_xtr){ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,trv.nm_fll,&grp_id); /* Obtain info for group */ (void)nco_inq(grp_id,&nbr_dmn,&nbr_var,&nbr_att,(int *)NULL); /* List attributes using obtained group ID */ if(nbr_att){ if(trv.grp_dpt > 0) (void)fprintf(stdout,"Group %s attributes:\n",trv.nm_fll); else (void)fprintf(stdout,"Global attributes:\n"); (void)nco_prn_att(grp_id,prn_flg,NC_GLOBAL); } /* nbr_att */ } /* end nco_obj_typ_grp */ } /* end idx_tbl */ } /* end nco_prn_att_trv() */ int /* O [nbr] Number of matches to current rx */ nco_trv_rx_search /* [fnc] Search for pattern matches in traversal table */ (const char * const rx_sng, /* I [sng] Regular expression pattern */ const nco_obj_typ obj_typ, /* I [enm] Object type (group or variable) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Set flags indicating whether each list member matches given regular expression NB: This function only writes True to match flag, it never writes False Input flags are assumed to be stateful, and may contain Trues from previous calls */ int mch_nbr=0; #ifndef NCO_HAVE_REGEX_FUNCTIONALITY (void)fprintf(stdout,"%s: ERROR: Sorry, wildcarding (extended regular expression matches to variables) was not built into this NCO executable, so unable to compile regular expression \"%s\".\nHINT: Make sure libregex.a is on path and re-build NCO.\n",nco_prg_nm_get(),rx_sng); nco_exit(EXIT_FAILURE); /* Avoid compiler warning of unused variables by using obj_typ and trv_tbl */ if(trv_tbl->lst) trv_tbl->lst[0].nco_typ = obj_typ; #else /* NCO_HAVE_REGEX_FUNCTIONALITY */ const char fnc_nm[]="nco_trv_rx_search()"; /* [sng] Function name */ const char sls_chr='/'; /* [chr] Slash character */ char *sng2mch; /* [sng] String to match to regular expression */ int err_id; int flg_cmp; /* Comparison flags */ int flg_exe; /* Execution flages */ regex_t *rx; regmatch_t *result; size_t obj_idx; size_t rx_prn_sub_xpr_nbr; rx=(regex_t *)nco_malloc(sizeof(regex_t)); /* Choose RE_SYNTAX_POSIX_EXTENDED regular expression type */ flg_cmp=(REG_EXTENDED | REG_NEWLINE); /* Set execution flags */ flg_exe=0; /* Compile regular expression */ if((err_id=regcomp(rx,rx_sng,flg_cmp))){ /* Compile regular expression */ char const * rx_err_sng; /* POSIX regcomp return error codes */ switch(err_id){ case REG_BADPAT: rx_err_sng="Invalid pattern"; break; case REG_ECOLLATE: rx_err_sng="Not implemented"; break; case REG_ECTYPE: rx_err_sng="Invalid character class name"; break; case REG_EESCAPE: rx_err_sng="Trailing backslash"; break; case REG_ESUBREG: rx_err_sng="Invalid back reference"; break; case REG_EBRACK: rx_err_sng="Unmatched left bracket"; break; case REG_EPAREN: rx_err_sng="Parenthesis imbalance"; break; case REG_EBRACE: rx_err_sng="Unmatched {"; break; case REG_BADBR: rx_err_sng="Invalid contents of { }"; break; case REG_ERANGE: rx_err_sng="Invalid range end"; break; case REG_ESPACE: rx_err_sng="Ran out of memory"; break; case REG_BADRPT: rx_err_sng="No preceding re for repetition op"; break; default: rx_err_sng="Invalid pattern"; break; } /* end switch */ (void)fprintf(stdout,"%s: ERROR %s error in regular expression \"%s\" %s\n",nco_prg_nm_get(),fnc_nm,rx_sng,rx_err_sng); nco_exit(EXIT_FAILURE); } /* end if err */ rx_prn_sub_xpr_nbr=rx->re_nsub+1L; /* Number of parenthesized sub-expressions */ /* Search string */ result=(regmatch_t *)nco_malloc(sizeof(regmatch_t)*rx_prn_sub_xpr_nbr); /* Check each object string for match to rx */ for(obj_idx=0;obj_idxnbr;obj_idx++){ /* Check apples against apples and oranges against oranges */ if(trv_tbl->lst[obj_idx].nco_typ == obj_typ){ /* NB: Here is where match flag would be set to False if input were stateless */ /* Regular expressions embedded in simple strings (without forward slashes) apply to stubs Presence of slash indicates that regular expression applies to full pathname */ if(strchr(rx_sng,sls_chr)) sng2mch=trv_tbl->lst[obj_idx].nm_fll; else sng2mch=trv_tbl->lst[obj_idx].nm; if(!regexec(rx,sng2mch,rx_prn_sub_xpr_nbr,result,flg_exe)){ trv_tbl->lst[obj_idx].flg_mch=True; mch_nbr++; } /* end if match */ } /* end if obj_typ */ } /* end loop over variables */ regfree(rx); /* Free regular expression data structure */ rx=(regex_t *)nco_free(rx); result=(regmatch_t *)nco_free(result); #endif /* NCO_HAVE_REGEX_FUNCTIONALITY */ return mch_nbr; } /* end nco_trv_rx_search() */ nco_bool nco_pth_mch /* [fnc] Name component in full path matches user string */ (char * const nm_fll, /* I [sng] Full name (path) */ char * const nm, /* I [sng] Name (relative) */ char * const usr_sng) /* [sng] User-supplied object name */ { const char sls_chr='/'; /* [chr] Slash character */ char *sbs_end; /* [sng] Location of user-string match end in object path */ char *sbs_srt; /* [sng] Location of user-string match start in object path */ char *sbs_srt_nxt; /* [sng] String to search next for match */ char *var_mch_srt; /* [sng] Location of variable short name in user-string */ nco_bool flg_pth_end_bnd; /* [flg] String ends at path component boundary */ nco_bool flg_pth_srt_bnd; /* [flg] String begins at path component boundary */ nco_bool flg_var_cnd; /* [flg] Match meets addition condition(s) for variable */ size_t usr_sng_lng; /* [nbr] Length of user-supplied string */ size_t nm_fll_lng; /* [sng] Length of full name */ size_t nm_lng; /* [sng] Length of relative name */ /* Initialize (combined return) flags */ flg_pth_srt_bnd=flg_pth_end_bnd=flg_var_cnd=False; /* Get lenghts */ nm_fll_lng=strlen(nm_fll); nm_lng=strlen(nm); usr_sng_lng=strlen(usr_sng); /* Look for partial match, not necessarily on path boundaries */ /* 20130829: Variables and group names may be proper subsets of ancestor group names e.g., variable named g9 in group named g90 is /g90/g9 e.g., group named g1 in group named g10 is g10/g1 Search algorithm must test same full name multiple times in such cases For variables, only final match (closest to end full name) need be fully tested */ sbs_srt=NULL; sbs_srt_nxt=nm_fll; while((sbs_srt_nxt=strstr(sbs_srt_nxt,usr_sng))){ /* Object name contains usr_sng at least once */ /* Complete path-check below will begin at this substring ... */ sbs_srt=sbs_srt_nxt; /* ...and also here for variables unless match is found in next iteration after advancing substring... */ if(sbs_srt_nxt+usr_sng_lng <= nm_fll+nm_fll_lng) sbs_srt_nxt+=usr_sng_lng; else break; } /* end while */ /* Does object name contain usr_sng? */ if(sbs_srt){ /* Ensure match spans (begins and ends on) whole path-component boundaries Full path-check starts at current substring */ /* Does match begin at path component boundary ... directly on a slash? */ if(*sbs_srt == sls_chr) flg_pth_srt_bnd=True; /* ...or one after a component boundary? */ if((sbs_srt > nm_fll) && (*(sbs_srt-1L) == sls_chr)) flg_pth_srt_bnd=True; /* Does match end at path component boundary ... directly on a slash? */ sbs_end=sbs_srt+usr_sng_lng-1L; if(*sbs_end == sls_chr) flg_pth_end_bnd=True; /* ...or one before a component boundary? */ if(sbs_end <= nm_fll+nm_fll_lng-1L) if((*(sbs_end+1L) == sls_chr) || (*(sbs_end+1L) == '\0')) flg_pth_end_bnd=True; /* Additional condition is user-supplied string must end with short form of name */ if(nm_lng <= usr_sng_lng){ var_mch_srt=usr_sng+usr_sng_lng-nm_lng; if(!strcmp(var_mch_srt,nm)) flg_var_cnd=True; } /* endif */ } /* !sbs_srt */ /* Must meet necessary flags */ if(flg_pth_srt_bnd && flg_pth_end_bnd && flg_var_cnd) return True; return False; } /* nco_pth_mch() */ nco_bool /* O [flg] All names are in file */ nco_xtr_mk /* [fnc] Check -v and -g input names and create extraction list */ (char ** grp_lst_in, /* I [sng] User-specified list of groups */ const int grp_xtr_nbr, /* I [nbr] Number of groups in list */ char ** var_lst_in, /* I [sng] User-specified list of variables */ const int var_xtr_nbr, /* I [nbr] Number of variables in list */ const nco_bool EXCLUDE_INPUT_LIST, /* I [flg] Exclude rather than extract groups and variables */ const nco_bool EXTRACT_ALL_COORDINATES, /* I [flg] Process all coordinates */ const nco_bool flg_unn, /* I [flg] Select union of specified groups and variables */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Verify all user-specified objects exist in file and create extraction list Verify both variables and groups Handle regular expressions Set flags in traversal table to help generate extraction list Unmatched exclusion lists should succeed Tests: ncks -O -D 5 -g / ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g '' ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g g1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g /g1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g /g1/g1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g g1.+ ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -v v1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -x -v lat2 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g g1.+ -v v1,sc. ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -v scl,/g1/g1g1/v1 ~/nco/data/in_grp.nc ~/foo.nc ncks -O -D 5 -g g3g.+,g9/ -v scl,/g1/g1g1/v1 ~/nco/data/in_grp.nc ~/foo.nc */ const char fnc_nm[]="nco_xtr_mk()"; /* [sng] Function name */ const char sls_chr='/'; /* [chr] Slash character */ char **obj_lst_in; /* [sng] User-specified list of objects */ char *sbs_end; /* [sng] Location of user-string match end in object path */ char *sbs_srt; /* [sng] Location of user-string match start in object path */ char *sbs_srt_nxt; /* [sng] String to search next for match */ char *usr_sng; /* [sng] User-supplied object name */ char *var_mch_srt; /* [sng] Location of variable short name in user-string */ int obj_nbr; /* [nbr] Number of objects in list */ #ifdef NCO_HAVE_REGEX_FUNCTIONALITY int rx_mch_nbr; #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */ nco_bool flg_ncr_mch_crr; /* [flg] Current group meets anchoring properties of this user-supplied string */ nco_bool flg_ncr_mch_grp; /* [flg] User-supplied string anchors at root */ nco_bool flg_pth_end_bnd; /* [flg] String ends at path component boundary */ nco_bool flg_pth_srt_bnd; /* [flg] String begins at path component boundary */ nco_bool flg_rcr_mch_crr; /* [flg] Current group meets recursion criteria of this user-supplied string */ nco_bool flg_rcr_mch_grp; /* [flg] User-supplied string will match groups recursively */ nco_bool flg_unn_ffc; /* [flg] Union or Effective Union (not intersection) */ nco_bool flg_usr_mch_obj; /* [flg] One or more objects match each user-supplied string */ nco_bool flg_var_cnd; /* [flg] Match meets addition condition(s) for variable */ nco_obj_typ obj_typ; /* [enm] Object type (group or variable) */ size_t usr_sng_lng; /* [nbr] Length of user-supplied string */ trv_sct grp_obj; /* [sct] Traversal table object assumed to be group */ trv_sct trv_obj; /* [sct] Traversal table object */ trv_sct var_obj; /* [sct] Traversal table object assumed to be variable */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s Extraction list will be formed as %s of group and variable specifications if both are given\n",nco_prg_nm_get(),fnc_nm,(flg_unn) ? "union" : "intersection"); /* Specifying no groups or variables is equivalent to requesting all */ if(!grp_xtr_nbr && !var_xtr_nbr && !EXTRACT_ALL_COORDINATES) for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++) trv_tbl->lst[obj_idx].flg_dfl=True; for(unsigned int itr_idx=0;itr_idx<2;itr_idx++){ /* Set object type (group or variable) */ if(itr_idx == 0){ obj_typ=nco_obj_typ_grp; obj_lst_in=(char **)grp_lst_in; obj_nbr=grp_xtr_nbr; }else if(itr_idx == 1){ obj_typ=nco_obj_typ_var; obj_lst_in=(char **)var_lst_in; obj_nbr=var_xtr_nbr; } /* endelse */ for(int obj_idx=0;obj_idx 1L && usr_sng[usr_sng_lng-1L] == sls_chr){ /* Remove trailing slash for subsequent searches since canonical group names do not end with slash */ flg_rcr_mch_grp=False; usr_sng[usr_sng_lng-1L]='\0'; usr_sng_lng--; } /* flg_rcr_mch_grp */ /* Turn-on root-anchoring for groups? */ if(obj_typ == nco_obj_typ_grp) if(usr_sng[0L] == sls_chr) flg_ncr_mch_grp=True; /* Convert pound signs (back) to commas */ nco_hash2comma(usr_sng); /* If usr_sng is regular expression ... */ if(strpbrk(usr_sng,".*^$\\[]()<>+?|{}")){ /* ... and regular expression library is present */ #ifdef NCO_HAVE_REGEX_FUNCTIONALITY if((rx_mch_nbr=nco_trv_rx_search(usr_sng,obj_typ,trv_tbl))) flg_usr_mch_obj=True; if(!rx_mch_nbr) (void)fprintf(stdout,"%s: WARNING: Regular expression \"%s\" does not match any %s\nHINT: See regular expression syntax examples at http://nco.sf.net/nco.html#rx\n",nco_prg_nm_get(),usr_sng,(obj_typ == nco_obj_typ_grp) ? "group" : "variable"); continue; #else /* !NCO_HAVE_REGEX_FUNCTIONALITY */ (void)fprintf(stdout,"%s: ERROR: Sorry, wildcarding (extended regular expression matches to variables) was not built into this NCO executable, so unable to compile regular expression \"%s\".\nHINT: Make sure libregex.a is on path and re-build NCO.\n",nco_prg_nm_get(),usr_sng); nco_exit(EXIT_FAILURE); #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */ } /* end if regular expression */ /* usr_sng is not rx, so manually search for multicomponent matches */ for(unsigned int tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Create shallow copy to avoid indirection */ trv_obj=trv_tbl->lst[tbl_idx]; if(trv_obj.nco_typ == obj_typ){ /* Initialize defaults for current candidate path to match */ flg_pth_srt_bnd=False; flg_pth_end_bnd=False; flg_var_cnd=False; flg_rcr_mch_crr=True; flg_ncr_mch_crr=True; /* Look for partial match, not necessarily on path boundaries */ /* 20130829: Variables and group names may be proper subsets of ancestor group names e.g., variable named g9 in group named g90 is /g90/g9 e.g., group named g1 in group named g10 is g10/g1 Search algorithm must test same full name multiple times in such cases For variables, only final match (closest to end full name) need be fully tested */ sbs_srt=NULL; sbs_srt_nxt=trv_obj.nm_fll; while((sbs_srt_nxt=strstr(sbs_srt_nxt,usr_sng))){ /* Object name contains usr_sng at least once */ /* Complete path-check below will begin at this substring ... */ sbs_srt=sbs_srt_nxt; /* ...for groups always at first occurence of substring... */ if(obj_typ == nco_obj_typ_grp) break; /* ...and also here for variables unless match is found in next iteration after advancing substring... */ if(sbs_srt_nxt+usr_sng_lng <= trv_obj.nm_fll+trv_obj.nm_fll_lng) sbs_srt_nxt+=usr_sng_lng; else break; } /* end while */ /* Does object name contain usr_sng? */ if(sbs_srt){ /* Ensure match spans (begins and ends on) whole path-component boundaries Full path-check starts at current substring */ /* Does match begin at path component boundary ... directly on a slash? */ if(*sbs_srt == sls_chr) flg_pth_srt_bnd=True; /* ...or one after a component boundary? */ if((sbs_srt > trv_obj.nm_fll) && (*(sbs_srt-1L) == sls_chr)) flg_pth_srt_bnd=True; /* Does match end at path component boundary ... directly on a slash? */ sbs_end=sbs_srt+usr_sng_lng-1L; if(*sbs_end == sls_chr) flg_pth_end_bnd=True; /* ...or one before a component boundary? */ if(sbs_end <= trv_obj.nm_fll+trv_obj.nm_fll_lng-1L) if((*(sbs_end+1L) == sls_chr) || (*(sbs_end+1L) == '\0')) flg_pth_end_bnd=True; /* Additional condition for variables is user-supplied string must end with short form of variable name */ if(obj_typ == nco_obj_typ_var){ if(trv_obj.nm_lng <= usr_sng_lng){ var_mch_srt=usr_sng+usr_sng_lng-trv_obj.nm_lng; if(!strcmp(var_mch_srt,trv_obj.nm)) flg_var_cnd=True; } /* endif */ if(nco_dbg_lvl_get() >= nco_dbg_sbr && nco_dbg_lvl_get() != nco_dbg_dev) (void)fprintf(stderr,"%s: INFO %s reports variable %s %s additional conditions for variable match with %s.\n",nco_prg_nm_get(),fnc_nm,usr_sng,(flg_var_cnd) ? "meets" : "fails",trv_obj.nm_fll); } /* endif var */ /* If anchoring, match must begin at root */ if(flg_ncr_mch_grp && *sbs_srt != sls_chr) flg_ncr_mch_crr=False; /* If no recursion, match must terminate user-supplied string */ if(!flg_rcr_mch_grp && *(sbs_end+1L)) flg_rcr_mch_crr=False; /* Set traversal table flags */ if(obj_typ == nco_obj_typ_var){ /* Variables must meet necessary flags for variables */ if(flg_pth_srt_bnd && flg_pth_end_bnd && flg_var_cnd){ trv_tbl->lst[tbl_idx].flg_mch=True; trv_tbl->lst[tbl_idx].flg_rcr=False; /* Was matched variable specified as full path (i.e., beginning with slash?) */ if(*usr_sng == sls_chr) trv_tbl->lst[tbl_idx].flg_vfp=True; } /* end flags */ }else if (obj_typ == nco_obj_typ_grp){ /* !nco_obj_typ_var */ /* Groups must meet necessary flags for groups */ if(flg_pth_srt_bnd && flg_pth_end_bnd && flg_ncr_mch_crr && flg_rcr_mch_crr){ trv_tbl->lst[tbl_idx].flg_mch=True; trv_tbl->lst[tbl_idx].flg_rcr=flg_rcr_mch_grp; } /* end flags */ } /* !nco_obj_typ_var */ /* Set function return condition */ if(trv_tbl->lst[tbl_idx].flg_mch) flg_usr_mch_obj=True; if(nco_dbg_lvl_get() == nco_dbg_old){ /* Redundant call to nco_flg_set_grp_var_ass() here in debugging mode only to set flags for following print statements Essential call to nco_flg_set_grp_var_ass() occurs after itr loop Most debugging info is available in debugging section at routine end However, group boundary/anchoring/recursion info is only available here */ if(trv_tbl->lst[tbl_idx].flg_mch) nco_flg_set_grp_var_ass(trv_obj.grp_nm_fll,obj_typ,trv_tbl); (void)fprintf(stderr,"%s: INFO %s reports %s %s matches filepath %s. Begins on boundary? %s. Ends on boundary? %s. Extract? %s.",nco_prg_nm_get(),fnc_nm,(obj_typ == nco_obj_typ_grp) ? "group" : "variable",usr_sng,trv_obj.nm_fll,(flg_pth_srt_bnd) ? "Yes" : "No",(flg_pth_end_bnd) ? "Yes" : "No",(trv_tbl->lst[tbl_idx].flg_mch) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_grp) (void)fprintf(stderr," Anchored? %s.",(flg_ncr_mch_grp) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_grp) (void)fprintf(stderr," Recursive? %s.",(trv_tbl->lst[tbl_idx].flg_rcr) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_grp) (void)fprintf(stderr," flg_gcv? %s.",(trv_tbl->lst[tbl_idx].flg_gcv) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_grp) (void)fprintf(stderr," flg_ncs? %s.",(trv_tbl->lst[tbl_idx].flg_ncs) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_var) (void)fprintf(stderr," flg_vfp? %s.",(trv_tbl->lst[tbl_idx].flg_vfp) ? "Yes" : "No"); if(obj_typ == nco_obj_typ_var) (void)fprintf(stderr," flg_vsg? %s.",(trv_tbl->lst[tbl_idx].flg_vsg) ? "Yes" : "No"); (void)fprintf(stderr,"\n"); } /* end if dbg */ } /* endif strstr() */ } /* endif nco_obj_typ */ } /* end loop over tbl_idx */ if(!flg_usr_mch_obj && !EXCLUDE_INPUT_LIST){ (void)fprintf(stderr,"%s: ERROR %s reports user-supplied %s name or regular expression \'%s\' is not in and/or does not match contents of input file\n",nco_prg_nm_get(),fnc_nm,(obj_typ == nco_obj_typ_grp) ? "group" : "variable",usr_sng); nco_exit(EXIT_FAILURE); } /* flg_usr_mch_obj */ /* Free dynamic memory */ if(usr_sng) usr_sng=(char *)nco_free(usr_sng); } /* obj_idx */ if(nco_dbg_lvl_get() >= nco_dbg_sbr && nco_dbg_lvl_get() != nco_dbg_dev){ (void)fprintf(stdout,"%s: INFO %s reports following %s match sub-setting and regular expressions:\n",nco_prg_nm_get(),fnc_nm,(obj_typ == nco_obj_typ_grp) ? "groups" : "variables"); trv_tbl_prn_flg_mch(trv_tbl,obj_typ); } /* endif dbg */ } /* itr_idx */ /* Compute intersection of groups and variables if necessary Intersection criteria flag, flg_nsx, is satisfied by default. Unset later when necessary. */ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++) trv_tbl->lst[obj_idx].flg_nsx=True; /* Each object with flg_mch set needs to have its associated objects set An object (group or variable) may have had its flg_mch set multiple times, e.g., once via rx and once via explicit listing And since rx's often match multiple objects, no sense in flagging associated objects inside rx loop Now all -g and -v constraints have been evaluated (after itr loop) Now speed through table once and set associated objects for all groups and variables flagged with flg_mch */ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++) if(trv_tbl->lst[obj_idx].flg_mch) nco_flg_set_grp_var_ass(trv_tbl->lst[obj_idx].grp_nm_fll,trv_tbl->lst[obj_idx].nco_typ,trv_tbl); /* Union is same as intersection if either variable or group list is empty, otherwise check intersection criteria */ if(flg_unn || !grp_xtr_nbr || !var_xtr_nbr) flg_unn_ffc=True; else flg_unn_ffc=False; if(!flg_unn_ffc){ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++){ var_obj=trv_tbl->lst[obj_idx]; if(var_obj.nco_typ == nco_obj_typ_var){ /* Cancel (non-full-path) variable intersection match unless variable is also in user-specified group */ if(var_obj.flg_mch && !var_obj.flg_vfp){ grp_obj=trv_tbl->lst[0]; /* CEWI */ for(unsigned int obj2_idx=0;obj2_idxnbr;obj2_idx++){ grp_obj=trv_tbl->lst[obj2_idx]; if(grp_obj.nco_typ == nco_obj_typ_grp && !strcmp(var_obj.grp_nm_fll,grp_obj.grp_nm_fll)) break; } /* end loop over obj2_idx */ if(!grp_obj.flg_mch) trv_tbl->lst[obj_idx].flg_nsx=False; } /* flg_mch && flg_vfp */ } /* nco_obj_typ_grp */ } /* end loop over obj_idx */ } /* flg_unn */ /* Does matched or default group contain only metadata? Flag used in nco_xtr_grp_mrk() to preserve metadata-only groups on extraction list */ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++) if(trv_tbl->lst[obj_idx].nco_typ == nco_obj_typ_grp) if(trv_tbl->lst[obj_idx].flg_mch || trv_tbl->lst[obj_idx].flg_dfl) if(!trv_tbl->lst[obj_idx].nbr_var) trv_tbl->lst[obj_idx].flg_mtd=True; /* Combine previous flags into initial extraction flag */ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++){ /* Extract object if ... */ if( /* No subsetting */ (trv_tbl->lst[obj_idx].flg_dfl) || /* ...user-specified no sub-setting... */ /* Intersection mode (default mode) */ (!flg_unn_ffc && trv_tbl->lst[obj_idx].flg_mch && trv_tbl->lst[obj_idx].flg_nsx) || /* ...intersection mode variable matches group... */ /* Union mode */ (flg_unn_ffc && trv_tbl->lst[obj_idx].flg_mch) || /* ...union mode object matches user-specified string... */ (flg_unn_ffc && trv_tbl->lst[obj_idx].flg_vsg) || /* ...union mode variable selected because group matches... */ (flg_unn_ffc && trv_tbl->lst[obj_idx].flg_gcv) || /* ...union mode group contains matched variable... */ False) trv_tbl->lst[obj_idx].flg_xtr=True; } /* end loop over obj_idx */ if(nco_dbg_lvl_get() == nco_dbg_vrb){ for(unsigned int obj_idx=0;obj_idxnbr;obj_idx++){ /* Create shallow copy to avoid indirection */ trv_obj=trv_tbl->lst[obj_idx]; (void)fprintf(stderr,"%s: INFO %s final flags of %s %s:\n",nco_prg_nm_get(),fnc_nm,(trv_obj.nco_typ == nco_obj_typ_grp) ? "group" : "variable",trv_obj.nm_fll); (void)fprintf(stderr," flg_dfl? %s.",(trv_obj.flg_dfl) ? "Yes" : "No"); (void)fprintf(stderr," flg_mch? %s.",(trv_obj.flg_mch) ? "Yes" : "No"); (void)fprintf(stderr," flg_xtr? %s.",(trv_obj.flg_xtr) ? "Yes" : "No"); if(trv_obj.nco_typ == nco_obj_typ_var) (void)fprintf(stderr," flg_vfp? %s.",(trv_obj.flg_vfp) ? "Yes" : "No"); if(trv_obj.nco_typ == nco_obj_typ_var) (void)fprintf(stderr," flg_vsg? %s.",(trv_obj.flg_vsg) ? "Yes" : "No"); if(trv_obj.nco_typ == nco_obj_typ_grp) (void)fprintf(stderr," flg_gcv? %s.",(trv_obj.flg_gcv) ? "Yes" : "No"); if(trv_obj.nco_typ == nco_obj_typ_grp) (void)fprintf(stderr," flg_ncs? %s.",(trv_obj.flg_ncs) ? "Yes" : "No"); if(trv_obj.nco_typ == nco_obj_typ_grp) (void)fprintf(stderr," flg_nsx? %s.",(trv_obj.flg_nsx) ? "Yes" : "No"); (void)fprintf(stderr,"\n"); } /* end loop over obj_idx */ } /* endif dbg */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)trv_tbl_prn_xtr(trv_tbl,fnc_nm); return (nco_bool)True; } /* end nco_xtr_mk() */ void nco_xtr_xcl /* [fnc] Convert extraction list to exclusion list */ (nco_bool EXTRACT_ASSOCIATED_COORDINATES, /* I [flg] Extract all coordinates associated with extracted variables? */ nco_bool GRP_XTR_VAR_XCL, /* I [flg] Extract matching groups, exclude matching variables */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Convert extraction list to exclusion list Exclusion is ambiguous for groups Consider, e.g., ncks -x -v /g1/v1 Should that exclude g1 completely, e.g., exclude /g1/v2 as well? Probably not. Extraction list for this case is nearly unambiguous: ~(/g1/v1) Now consider a different way of specifying the same thing, i.e., ncks -x -g g1 -v v1 Since g1 is explicitly specified, it is ambiguous whether the -x should apply to all of g1 Extraction list for this case, as of 20140520, is same as above: ~(/g1/v1) I.e., extract all except exclude intersection of -g and -v arguments However, one could also decide to implement this extraction list: *g1*, ~(v1) (here *g1* means the full group path contains a whole component named g1) In other words elements matching -v arguments could be excluded, and those matching -g could be extracted This would make it easy to extract certain groups, while excluding certain variables from those groups There are use-cases where the exclusion flag should exclude groups Consider, e.g., ncks -x -g g1 In this case g1 and all descendents should be excluded ncdismember needs to create extraction lists like: *g1*, ~(/g1/v1); or *g1*, ~v1; Potential avenues to implement this include 1. ncks -x -g g1 -v v1 2. ncks -x -g g1 -v /g1/v1 3. ncks --grp_xtr_var_xcl -g g1 -v v1 (method implemented in NCO 4.4.4 in 201405) Given that, here is how this routine and NCO actually uses flg_xcl: For variables, -x sets the exclusion flag and is "permanent", i.e., removes variable from extraction list For groups, -x sets the exclusion flag but is not "permanent"---it does not remove group from extraction list Instead it is used to help determine whether group should be excluded for metadata-only containing groups Group extraction is reset and done from scratch (except for flg_xcl/flg_mtd) in nco_xtr_grp_mrk() */ const char fnc_nm[]="nco_xtr_xcl()"; /* [sng] Function name */ if(GRP_XTR_VAR_XCL){ /* Block implements GRP_XTR_VAR_XCL option introduced 20140521 */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var){ /* Toggle variable extraction under any of following conditions */ if( /* Variable set to be extracted because it matches explicit -v extraction string */ (trv_tbl->lst[idx_tbl].flg_xtr) || /* Variable does not match explicit -v extraction string (so will not be excluded) and variable is in group that does match explicit -g extraction string */ (!trv_tbl->lst[idx_tbl].flg_mch && trv_tbl->lst[idx_tbl].flg_vsg) || False){ trv_tbl->lst[idx_tbl].flg_xtr=!trv_tbl->lst[idx_tbl].flg_xtr; /* Toggle extraction flag */ trv_tbl->lst[idx_tbl].flg_xcl=True; /* Extraction flag was toggled by exclusion option */ } /* end if */ } /* end if */ } /* end for */ }else{ /* Block implements default (and only) behavior until 20140521, i.e., extract all except exclude intersection of -g and -v arguments */ static short FIRST_WARNING=True; for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_tbl->lst[idx_tbl].flg_xtr=!trv_tbl->lst[idx_tbl].flg_xtr; /* Toggle extraction flag */ trv_tbl->lst[idx_tbl].flg_xcl=True; /* Extraction flag was toggled by exclusion option */ if(!trv_tbl->lst[idx_tbl].flg_xtr && trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_tbl].is_crd_var){ if(FIRST_WARNING && EXTRACT_ASSOCIATED_COORDINATES){ (void)fprintf(stdout,"%s: HINT Explicitly excluding (with -x) a coordinate variable (like \"%s\") from the extraction list does not always remove the coordinate from output unless the -C option is also invoked to turn off extraction of coordinates of other variables. Otherwise, a coordinate you wish to exclude may be extracted in its capacity as coordinate-information for other extracted variables. Use \"-C -x -v crd_nm\" to guarantee crd_nm will not be output. See http://nco.sf.net/nco.html#xmp_xtr_xcl for more information.\n",nco_prg_nm_get(),trv_tbl->lst[idx_tbl].nm); FIRST_WARNING=False; } /* !FIRST_WARNING */ } /* end if */ } /* end for */ } /* !GRP_XTR_VAR_XCL */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)trv_tbl_prn_xtr(trv_tbl,fnc_nm); return; } /* end nco_xtr_xcl() */ void nco_xtr_crd_add /* [fnc] Add all coordinates to extraction list */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Add all coordinates to extraction list Find all coordinates (variables with same names and sizes as dimensions) and ensure they are marked for extraction */ const char fnc_nm[]="nco_xtr_crd_add()"; /* [sng] Function name */ /* If variable is coordinate variable then mark it for extraction */ for(unsigned idx_var=0;idx_varnbr;idx_var++) if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var) if(trv_tbl->lst[idx_var].is_crd_var) trv_tbl->lst[idx_var].flg_xtr=True; /* Print extraction list in debug mode */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)trv_tbl_prn_xtr(trv_tbl,fnc_nm); return; } /* end nco_xtr_crd_add() */ void nco_xtr_cf_add /* [fnc] Add to extraction list variables associated with CF convention */ (const int nc_id, /* I [ID] netCDF file ID */ const char * const cf_nm, /* I [sng] CF convention ("ancillary_variables", "bounds", "climatology", or "coordinates") */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Add to extraction list all variables associated with specified CF convention Driver routine for nco_xtr_cf_var_add() Detect associated coordinates specified by CF "ancillary_variables", "bounds", and "coordinates" conventions http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.1/cf-conventions.html#coordinate-system */ const char fnc_nm[]="nco_xtr_cf_add()"; /* [sng] Function name */ /* Search for and add CF-compliant bounds and coordinates to extraction list */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_tbl].flg_xtr) (void)nco_xtr_cf_var_add(nc_id,&trv_tbl->lst[idx_tbl],cf_nm,trv_tbl); /* Print extraction list in debug mode */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)trv_tbl_prn_xtr(trv_tbl,fnc_nm); return; } /* nco_xtr_cf_add() */ void nco_xtr_cf_var_add /* [fnc] Add variables associated (via CF) with specified variable to extraction list */ (const int nc_id, /* I [ID] netCDF file ID */ const trv_sct * const var_trv, /* I [sct] Variable (object) */ const char * const cf_nm, /* I [sng] CF convention ("ancillary_variables", "bounds", "climatology", or "coordinates") */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Detect associated variables specified by CF "ancillary_variables", "bounds", "climatology", or "coordinates" convention Private routine called by nco_xtr_cf_add() http://cfconventions.org/1.6.html#ancillary-data http://cf-pcmdi.llnl.gov/documents/cf-conventions/1.1/cf-conventions.html#coordinate-system */ char **cf_lst; /* [sng] 1D array of list elements */ char att_nm[NC_MAX_NAME+1L]; /* [sng] Attribute name */ const char dlm_sng[]=" "; /* [sng] Delimiter string */ int grp_id; /* [id] Group ID */ int nbr_att; /* [nbr] Number of attributes */ int nbr_cf; /* [nbr] Number of variables specified in CF attribute ("ancillary_variables", "bounds", "climatology", or "coordinates") */ int var_id; /* [id] Variable ID */ assert(var_trv->nco_typ == nco_obj_typ_var); (void)nco_inq_grp_full_ncid(nc_id,var_trv->grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,var_trv->nm,&var_id); (void)nco_inq_varnatts(grp_id,var_id,&nbr_att); assert(nbr_att == var_trv->nbr_att); for(int idx_att=0;idx_attnm_fll,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR)); return; } /* end if */ att_val=(char *)nco_malloc((att_sz+1L)*sizeof(char)); if(att_sz > 0L) (void)nco_get_att(grp_id,var_id,att_nm,(void *)att_val,NC_CHAR); /* NUL-terminate attribute */ att_val[att_sz]='\0'; /* Split list into separate coordinate names Use nco_lst_prs_sgl_2D() not nco_lst_prs_2D() to avert TODO nco944 */ cf_lst=nco_lst_prs_sgl_2D(att_val,dlm_sng,&nbr_cf); /* ...for each variable in CF convention attribute, i.e., for each variable listed in "ancillary_variables", or in "bounds", or in "coordinates"... */ for(int idx_cf=0;idx_cfgrp_nm_fll)+strlen(cf_lst_var)+2L); strcpy(cf_lst_var_nm_fll,var_trv->grp_nm_fll); if(strcmp(var_trv->grp_nm_fll,sls_sng)) strcat(cf_lst_var_nm_fll,sls_sng); strcat(cf_lst_var_nm_fll,cf_lst_var); /* Find last occurence of '/' */ ptr_chr=strrchr(cf_lst_var_nm_fll,sls_chr); psn_chr=ptr_chr-cf_lst_var_nm_fll; while(ptr_chr){ /* If variable is on list */ if(trv_tbl_fnd_var_nm_fll(cf_lst_var_nm_fll,trv_tbl)){ /* Mark it for extraction */ (void)trv_tbl_mrk_xtr(cf_lst_var_nm_fll,True,trv_tbl); /* Exclude ancestor (greater scope, closer to root) variables, add only most in-scope (usually in same group) */ break; } /* end if */ cf_lst_var_nm_fll[psn_chr]='\0'; ptr_chr=strrchr(cf_lst_var_nm_fll,sls_chr); /* Re-add variable name to shortened path */ if(ptr_chr){ psn_chr=ptr_chr-cf_lst_var_nm_fll; cf_lst_var_nm_fll[psn_chr]='\0'; if(strcmp(var_trv->grp_nm_fll,sls_sng)) strcat(cf_lst_var_nm_fll,sls_sng); strcat(cf_lst_var_nm_fll,cf_lst_var); ptr_chr=strrchr(cf_lst_var_nm_fll,sls_chr); psn_chr=ptr_chr-cf_lst_var_nm_fll; } /* !ptr_chr */ } /* end while */ /* Free allocated */ if(cf_lst_var_nm_fll) cf_lst_var_nm_fll=(char *)nco_free(cf_lst_var_nm_fll); } /* end loop over idx_cf */ /* Free allocated memory */ att_val=(char *)nco_free(att_val); cf_lst=nco_sng_lst_free(cf_lst,nbr_cf); } /* end strcmp() */ } /* end loop over attributes */ return; } /* nco_xtr_cf_var_add() */ nm_id_sct * /* O [sct] Extraction list */ nco_trv_tbl_nm_id /* [fnc] Create extraction list of nm_id_sct from traversal table */ (const int nc_id_in, /* I [ID] netCDF input file ID */ const int nc_id_out, /* I [ID] netCDF output file ID */ const gpe_sct * const gpe, /* I [sct] GPE structure */ int * const xtr_nbr, /* I/O [nbr] Number of variables in extraction list */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: Create extraction list of nm_id_sct from traversal table */ nm_id_sct *xtr_lst; /* [sct] Extraction list */ int nbr_tbl=0; for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++) if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_tbl].flg_xtr) nbr_tbl++; xtr_lst=(nm_id_sct *)nco_malloc(nbr_tbl*sizeof(nm_id_sct)); nbr_tbl=0; for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_tbl].flg_xtr){ int var_id; int grp_id_in; int grp_id_out; char *grp_out_fll; /* Get input group ID */ (void)nco_inq_grp_full_ncid(nc_id_in,trv_tbl->lst[idx_tbl].grp_nm_fll,&grp_id_in); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,trv_tbl->lst[idx_tbl].grp_nm_fll); else grp_out_fll=(char *)strdup(trv_tbl->lst[idx_tbl].grp_nm_fll); /* Get output group ID */ (void)nco_inq_grp_full_ncid(nc_id_out,grp_out_fll,&grp_id_out); /* Get variable ID */ (void)nco_inq_varid(grp_id_in,trv_tbl->lst[idx_tbl].nm,&var_id); grp_out_fll=(char *)nco_free(grp_out_fll); /* 20130213: Necessary to allow MM3->MM4 and MM4->MM3 workarounds Store in/out group IDs as determined in nco_xtr_dfn() In MM3/4 cases, either grp_in_id or grp_out_id are always root Other is always root unless GPE is used */ xtr_lst[nbr_tbl].grp_id_in=grp_id_in; xtr_lst[nbr_tbl].grp_id_out=grp_id_out; xtr_lst[nbr_tbl].id=var_id; xtr_lst[nbr_tbl].nm=(char *)strdup(trv_tbl->lst[idx_tbl].nm); nbr_tbl++; } /* end flg == True */ } /* end loop over idx_tbl */ *xtr_nbr=nbr_tbl; return xtr_lst; } /* end nco_trv_tbl_nm_id() */ void nco_xtr_crd_ass_add /* [fnc] Add to extraction list all coordinates associated with extracted variables */ (const int nc_id, /* I [ID] netCDF file ID */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Add to extraction list all coordinates associated with extracted variables */ const char fnc_nm[]="nco_xtr_crd_ass_add()"; /* [sng] Function name */ char dmn_nm_var[NC_MAX_NAME+1]; /* [sng] Dimension name for *variable* */ int *dmn_id_var; /* [ID] Dimensions IDs array for variable */ int grp_id; /* [ID] Group ID */ int nbr_dmn_var; /* [nbr] Number of dimensions associated with current matched variable */ int var_id; /* [ID] Variable ID */ long dmn_sz; /* [nbr] Dimension size */ /* Loop table */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Filter variables to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Obtain variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Get number of dimensions for *variable* */ (void)nco_inq_varndims(grp_id,var_id,&nbr_dmn_var); if(nco_dbg_lvl_get() >= nco_dbg_dev){ (void)fprintf(stdout,"%s: DEBUG %s <%s> nbr_dmn_var=%d var_trv.nbr_dmn=%d\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,nbr_dmn_var,var_trv.nbr_dmn); if(nbr_dmn_var != var_trv.nbr_dmn){ (void)fprintf(stdout,"%s: ERROR %s <%s> nbr_dmn_var=%d var_trv.nbr_dmn=%d\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,nbr_dmn_var,var_trv.nbr_dmn); (void)nco_prn_dmn(nc_id,var_trv.grp_nm_fll,var_trv.nm,var_trv.nm_fll,trv_tbl); } (void)fflush(stdout); } if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)nco_prn_dmn(nc_id,var_trv.grp_nm_fll,var_trv.nm,var_trv.nm_fll,trv_tbl); assert(nbr_dmn_var == var_trv.nbr_dmn); dmn_id_var=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); /* Get dimension IDs for variable */ (void)nco_inq_vardimid(grp_id,var_id,dmn_id_var); /* Loop over dimensions of variable */ for(int idx_var_dim=0;idx_var_dimnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; if(var_trv.flg_xtr && var_trv.nco_typ == nco_obj_typ_var){ /* Print full name of variable */ if(var_trv.grp_dpt > 0) (void)fprintf(stdout,"%s\n",var_trv.nm_fll); /* Print variable metadata */ (void)nco_prn_var_dfn(nc_id,prn_flg,&var_trv); int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Obtain variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Print variable attributes */ (void)nco_prn_att(grp_id,prn_flg,var_id); } /* end flg_xtr */ } /* end idx_tbl */ return; } /* end nco_prn_xtr_mtd() */ void nco_prn_xtr_val /* [fnc] Print variable data */ (const int nc_id, /* I netCDF file ID */ prn_fmt_sct * const prn_flg, /* I/O [sct] Print-format information */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: Print variable data */ /* Loop variables in table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; if(var_trv.flg_xtr && var_trv.nco_typ == nco_obj_typ_var){ /* Print full name of variable */ if(!prn_flg->dlm_sng && var_trv.grp_dpt > 0) (void)fprintf(stdout,"%s\n",var_trv.nm_fll); /* Print variable values */ (void)nco_prn_var_val_trv(nc_id,prn_flg,&var_trv,trv_tbl); } /* End flg_xtr */ } /* End Loop variables in table */ return; } /* end nco_prn_xtr_val() */ void nco_xtr_dmn_mrk /* [fnc] Mark extracted dimensions */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Set flag for dimensions to be extracted ncks print functions need dimension extraction flag to print CDL files */ unsigned int dmn_idx; /* [idx] Index over dimensions */ unsigned int dmn_nbr; /* [nbr] Number of dimensions defined in file */ unsigned int dmn_var_idx; /* [idx] Index over dimensions in variable */ unsigned int dmn_var_nbr; /* [nbr] Number of dimensions in variable */ unsigned int obj_idx; /* [idx] Index over objects */ unsigned int obj_nbr; /* [nbr] Number of objects in table */ dmn_nbr=trv_tbl->nbr_dmn; obj_nbr=trv_tbl->nbr; /* Set extraction flag for groups if ancestors of extracted variables */ for(dmn_idx=0;dmn_idxlst_dmn[dmn_idx].flg_xtr=False; for(obj_idx=0;obj_idxlst[obj_idx]; /* For each variable to be extracted ... */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ dmn_var_nbr=var_trv.nbr_dmn; for(dmn_var_idx=0;dmn_var_idxlst_dmn[dmn_idx].dmn_id){ trv_tbl->lst_dmn[dmn_idx].flg_xtr=True; /* Break from loop over dmn_var_idx into loop over obj_idx */ break; } /* endif match */ } /* end loop over dmn_var_idx */ } /* endif extracted variable */ /* Break from loop over obj_idx into loop over dmn_idx */ if(trv_tbl->lst_dmn[dmn_idx].flg_xtr) break; } /* end loop over obj_idx */ } /* end loop over dmn_idx */ } /* end nco_xtr_dmn_mrk() */ void nco_xtr_grp_mrk /* [fnc] Mark extracted groups */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Set flag for groups to be extracted Could be performed before or after writing variables Used to be part of nco_xtr_dfn() However, ncks print functions need group extraction flag set for printing As of 20130716 we isolate this flag-setting in nco_xtr_grp_mrk() Actual group copying still done in nco_xtr_dfn() */ const char sls_sng[]="/"; /* [sng] Slash string */ char *grp_fll_sls; /* [sng] Full group name with slash appended */ char *sbs_srt; /* [sng] Location of user-string match start in object path */ nco_bool flg_pth_srt_bnd; /* [flg] String begins at path component boundary */ nco_bool flg_pth_end_bnd; /* [flg] String ends at path component boundary */ unsigned int grp_idx; unsigned int obj_idx; /* Goal here is to annotate which groups will appear in output Need to know in order to efficiently copy their metadata Definition of flags in extraction table is operational Could create a new flag just for this Instead, we re-purpose the extraction flag, flg_xtr, for groups Could re-purpose flg_ncs too with same effect nco_xtr_mk() sets flg_xtr for groups, like variables, that match user-specified strings Later processing makes flg_xtr for groups unreliable For instance, the exclusion flag (-x) is ambiguous for groups Also identification of associated coordinates and auxiliary coordinates occurs after nco_xtr_mk() Associated and auxiliary coordinates may be in distant groups Hence no better place than nco_xtr_grp_mrk() to finally identify ancestor groups */ /* Set extraction flag for groups if ancestors of extracted variables */ for(grp_idx=0;grp_idxnbr;grp_idx++){ /* For each group ... */ if(trv_tbl->lst[grp_idx].nco_typ == nco_obj_typ_grp){ /* Metadata-only containing groups already have flg_mtd set in nco_xtr_mk() Variable ancestry may not affect such groups, especially if they are leaf groups Set extraction flag to True (then continue) iff matching groups contain only metadata Otherwise set initialize extraction flag to False and overwrite later based on descendent variables */ if((trv_tbl->lst[grp_idx].flg_xtr=(!trv_tbl->lst[grp_idx].flg_xcl && trv_tbl->lst[grp_idx].flg_mtd))) continue; if(!strcmp(trv_tbl->lst[grp_idx].grp_nm_fll,sls_sng)){ /* Manually mark root group as extracted because matching algorithm below fails for root group (it looks for "//" in variable names) */ trv_tbl->lst[grp_idx].flg_xtr=True; continue; } /* endif root group */ grp_fll_sls=(char *)strdup(trv_tbl->lst[grp_idx].nm_fll); grp_fll_sls=(char *)nco_realloc(grp_fll_sls,(trv_tbl->lst[grp_idx].nm_fll_lng+2L)*sizeof(char)); strcat(grp_fll_sls,sls_sng); /* ... loop through ... */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ /* ... all variables to be extracted ... */ if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_var].flg_xtr){ /* ... finds that full path to current group is contained in an extracted variable path ... */ if((sbs_srt=strstr(trv_tbl->lst[idx_var].nm_fll,grp_fll_sls))){ flg_pth_srt_bnd=False; flg_pth_end_bnd=False; /* ... and _begins_ a full group path of that variable ... */ if(sbs_srt == trv_tbl->lst[idx_var].nm_fll) flg_pth_srt_bnd=True; /* Match ends on path component boundary, directly on a slash, because we added slash before matching */ flg_pth_end_bnd=True; if(flg_pth_srt_bnd && flg_pth_end_bnd){ /* ... and mark _only_ those groups for extraction... */ trv_tbl->lst[grp_idx].flg_xtr=True; break; } /* endif */ } /* endif full group path */ } /* endif extracted variable */ } /* end loop over idx_var */ if(grp_fll_sls) grp_fll_sls=(char *)nco_free(grp_fll_sls); } /* endif group */ } /* end loop over grp_idx */ /* Current status of flg_xtr for groups is that it has been set 1. For all user-specified groups 2. For default (non user-specified) groups 3. For metadata-only groups that do not conflict with the above What is lacking here is extraction flags for ancestors of all extracted groups Ancestor flags were set in nco_xtr_mk() but must be discarded and reset for same reasons that group flags in nco_xtr_mk() are unreliable for final list. This loop ensures groups are marked for extraction if any descendents are marked Mainly (only?) this catches ancestors of metadata only groups This loop is not necessary for _copying_ files because nco_xtr_dfn() algorithm handles ancestors This loop _is_ necessary for _printing_ files because nco_grp_prn() algorithm does not handle ancestors Set extraction flag for groups if ancestors of extracted groups */ for(grp_idx=0;grp_idxnbr;grp_idx++){ /* For each group that is not yet on extraction list ... */ if(trv_tbl->lst[grp_idx].nco_typ == nco_obj_typ_grp && !trv_tbl->lst[grp_idx].flg_xtr){ grp_fll_sls=(char *)strdup(trv_tbl->lst[grp_idx].nm_fll); grp_fll_sls=(char *)nco_realloc(grp_fll_sls,(trv_tbl->lst[grp_idx].nm_fll_lng+2L)*sizeof(char)); strcat(grp_fll_sls,sls_sng); /* Search for its path as a component of an extracted group path */ for(obj_idx=0;obj_idxnbr;obj_idx++){ if(trv_tbl->lst[obj_idx].nco_typ == nco_obj_typ_grp && trv_tbl->lst[obj_idx].flg_xtr){ if((sbs_srt=strstr(trv_tbl->lst[obj_idx].nm_fll,grp_fll_sls))){ flg_pth_srt_bnd=False; flg_pth_end_bnd=False; /* Ancestor groups must match start of extracted group */ if(sbs_srt == trv_tbl->lst[obj_idx].nm_fll) flg_pth_srt_bnd=True; /* Match ends on path component boundary, directly on a slash, because we added slash before matching */ flg_pth_end_bnd=True; if(flg_pth_srt_bnd && flg_pth_end_bnd){ trv_tbl->lst[grp_idx].flg_ncs=True; trv_tbl->lst[grp_idx].flg_xtr=True; continue; } /* endif current group is ancestor of extracted group */ } /* endif current group may be ancestor of extracted group */ } /* endif extracted group */ } /* end loop over obj_idx */ if(grp_fll_sls) grp_fll_sls=(char *)nco_free(grp_fll_sls); } /* endif group */ } /* end loop over grp_idx */ } /* end nco_xtr_grp_mrk() */ void nco_xtr_dfn /* [fnc] Define extracted groups, variables, and attributes in output file */ (const int nc_id, /* I [ID] netCDF input file ID */ const int nc_out_id, /* I [ID] netCDF output file ID */ const cnk_sct * const cnk, /* I [sct] Chunking structure */ const int dfl_lvl, /* I [enm] Deflate level [0..9] */ const gpe_sct * const gpe, /* I [sct] GPE structure */ const md5_sct * const md5, /* I [sct] MD5 configuration */ const nco_bool CPY_GRP_METADATA, /* I [flg] Copy group metadata (attributes) */ const nco_bool CPY_VAR_METADATA, /* I [flg] Copy variable metadata (attributes) */ const nco_bool RETAIN_ALL_DIMS, /* I [flg] Retain all dimensions */ const int nco_pck_plc, /* I [enm] Packing policy */ const char * const rec_dmn_nm, /* I [sng] Record dimension name */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Define groups, variables, and attributes in output file rec_dmn_nm, if any, is name requested for (netCDF3) sole record dimension */ const char fnc_nm[]="nco_xtr_dfn()"; /* [sng] Function name */ char *grp_out_fll; /* [sng] Group name */ int fl_fmt; /* [enm] netCDF file format */ int grp_id; /* [ID] Group ID in input file */ int grp_out_id; /* [ID] Group ID in output file */ int nbr_gpe_nm; /* [nbr] Number of GPE entries */ int var_out_id; /* [ID] Variable ID in output file */ int nco_prg_id; /* [enm] Program ID */ int nbr_dmn_cmn_out; /* [sct] Number of all dimensions in output file (used for RETAIN_ALL_DIMS) */ nco_bool PCK_ATT_CPY; /* [flg] Copy attributes "scale_factor", "add_offset" */ gpe_nm_sct *gpe_nm; /* [sct] GPE name duplicate check array */ dmn_cmn_sct *dmn_cmn_out; /* [sct] List of all dimensions in output file (used for RETAIN_ALL_DIMS) */ nco_prg_id=nco_prg_id_get(); nbr_gpe_nm=0; gpe_nm=NULL; nbr_dmn_cmn_out=0; dmn_cmn_out=NULL; /* Get file format */ (void)nco_inq_format(nc_out_id,&fl_fmt); /* Isolate extra complexity of copying group metadata */ if(CPY_GRP_METADATA){ /* Extraction flag for groups was set in nco_xtr_grp_mrk() This loop defines those groups in output file and copies their metadata */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct grp_trv=trv_tbl->lst[idx_tbl]; /* If object is group ancestor of extracted variable */ if(grp_trv.nco_typ == nco_obj_typ_grp && grp_trv.flg_xtr){ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,grp_trv.grp_nm_fll,&grp_id); /* ncge groups require special handling */ if(nco_prg_id == ncge && grp_trv.flg_nsm_prn){ /* Ensemble parent groups */ if(trv_tbl->nsm_sfx){ /* Define new name by appending suffix (e.g., /cesm + _avg) */ char *nm_fll_sfx=nco_bld_nsm_sfx(grp_trv.grp_nm_fll_prn,trv_tbl); /* Use then delete new name */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,nm_fll_sfx); else grp_out_fll=(char *)strdup(nm_fll_sfx); nm_fll_sfx=(char *)nco_free(nm_fll_sfx); }else{ if(gpe) grp_out_fll=nco_gpe_evl(gpe,grp_trv.grp_nm_fll_prn); else grp_out_fll=(char *)strdup(grp_trv.grp_nm_fll_prn); } /* !nsm_sfx */ }else if(nco_prg_id == ncge && grp_trv.flg_nsm_mbr){ /* Ensemble member groups are not written to output */ continue; }else{ /* Regular (non-ensemble-related) group (within ncge or any other operator) */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,grp_trv.grp_nm_fll); else grp_out_fll=(char *)strdup(grp_trv.grp_nm_fll); } /* !flg_nsm */ /* If output group does not exist, create it */ if(nco_inq_grp_full_ncid_flg(nc_out_id,grp_out_fll,&grp_out_id)) nco_def_grp_full(nc_out_id,grp_out_fll,&grp_out_id); /* Copy group attributes */ if(grp_trv.nbr_att){ PCK_ATT_CPY=True; (void)nco_att_cpy(grp_id,grp_out_id,NC_GLOBAL,NC_GLOBAL,PCK_ATT_CPY); } /* grp_trv.nbr_att */ /* Memory management after current extracted group */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); } /* end if group and flg_xtr */ } /* end loop over traversal table */ } /* !CPY_GRP_METADATA */ /* Define variables */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* If object is an extracted variable... */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Transform ensemble member group paths as above */ if(nco_prg_id == ncge && var_trv.flg_nsm_mbr){ if(trv_tbl->nsm_sfx){ /* Define new name by appending suffix (e.g., /cesm + _avg) */ char *nm_fll_sfx=nco_bld_nsm_sfx(var_trv.grp_nm_fll_prn,trv_tbl); /* Use then delete new name */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,nm_fll_sfx); else grp_out_fll=(char *)strdup(nm_fll_sfx); nm_fll_sfx=(char *)nco_free(nm_fll_sfx); }else{ /* Non-suffix case */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,var_trv.nsm_nm); else grp_out_fll=(char *)strdup(var_trv.nsm_nm); } /* !trv_tbl->nsm_sfx */ }else{ /* Variable not in ensembles */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,var_trv.grp_nm_fll); else grp_out_fll=(char *)strdup(var_trv.grp_nm_fll); } /* !ncge */ /* If output group does not exist, create it */ if(nco_inq_grp_full_ncid_flg(nc_out_id,grp_out_fll,&grp_out_id)) nco_def_grp_full(nc_out_id,grp_out_fll,&grp_out_id); if(nco_prg_id == ncge){ /* Is requested variable already in output file? fxm: Seems wasteful. Can ncge restrict definition to only variables in template group? i.e., satisfying both flg_xtr and flg_nsm_tpl */ int rcd=nco_inq_varid_flg(grp_out_id,var_trv.nm,&var_out_id); /* Yes, get outta' Dodge... avoid GPE failure on duplicate definition */ if(rcd == NC_NOERR) continue; } /* ncge */ /* Detect duplicate GPE names in advance, then exit() with helpful error */ if(gpe) nco_gpe_chk(grp_out_fll,var_trv.nm,&gpe_nm,&nbr_gpe_nm); /* Define variable in output file */ var_out_id=nco_cpy_var_dfn_trv(nc_id,nc_out_id,cnk,grp_out_fll,dfl_lvl,gpe,rec_dmn_nm,&var_trv,&dmn_cmn_out,&nbr_dmn_cmn_out,trv_tbl); /* Copy variable's attributes */ if(CPY_VAR_METADATA){ int var_id; /* [id] Variable ID */ var_sct *var_prc; /* [sct] Variable to process */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Get variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Allocate variable structure and fill with metadata */ var_prc=nco_var_fll_trv(grp_id,var_id,&var_trv,trv_tbl); PCK_ATT_CPY=nco_pck_cpy_att(nco_prg_id,nco_pck_plc,var_prc); (void)nco_att_cpy(grp_id,grp_out_id,var_id,var_out_id,PCK_ATT_CPY); for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ var_prc->dim[idx_dmn]->xrf=(dmn_sct *)nco_dmn_free(var_prc->dim[idx_dmn]->xrf); var_prc->dim[idx_dmn]=(dmn_sct *)nco_dmn_free(var_prc->dim[idx_dmn]); } /* end loop over dimensions */ var_prc=(var_sct *)nco_var_free(var_prc); } /* !CPY_VAR_METADATA */ /* Pre-allocate space for MD5 attributes */ if(md5){ if(md5->wrt){ /* Save time with netCDF3 files by pre-allocating header space */ aed_sct aed_md5; char md5_dgs_hxd_sng_ram[]="01234567890123456789012345678901"; /* [sng] Placeholder name for actual digest */ aed_md5.att_nm=md5->att_nm; aed_md5.var_nm=var_trv.nm; aed_md5.id=var_out_id; aed_md5.sz=NCO_MD5_DGS_SZ*2L; aed_md5.type=NC_CHAR; aed_md5.val.cp=md5_dgs_hxd_sng_ram; aed_md5.mode=aed_overwrite; (void)nco_aed_prc(grp_out_id,var_out_id,aed_md5); } /* !wrt */ } /* !md5 */ /* Write PPC attribute */ if(var_trv.ppc != NC_MAX_INT){ aed_sct aed_ppc; char att_nm_dsd[]="least_significant_digit"; char att_nm_nsd[]="number_of_significant_digits"; int ppc_old; int rcd; if(var_trv.flg_nsd) aed_ppc.att_nm=att_nm_nsd; else aed_ppc.att_nm=att_nm_dsd; aed_ppc.var_nm=var_trv.nm; aed_ppc.id=var_out_id; aed_ppc.val.ip=&var_trv.ppc; rcd=nco_inq_att_flg(grp_out_id,aed_ppc.id,aed_ppc.att_nm,&aed_ppc.type,&aed_ppc.sz); if(rcd != NC_NOERR){ /* No PPC attribute yet exists */ aed_ppc.sz=1L; aed_ppc.type=NC_INT; aed_ppc.mode=aed_create; (void)nco_aed_prc(grp_out_id,var_out_id,aed_ppc); }else{ if(aed_ppc.sz == 1L && aed_ppc.type == NC_INT){ /* Conforming PPC attribute already exists, only replace with new value if rounder */ (void)nco_get_att(grp_out_id,aed_ppc.id,aed_ppc.att_nm,&ppc_old,NC_INT); if(var_trv.ppc < ppc_old){ aed_ppc.mode=aed_modify; (void)nco_aed_prc(grp_out_id,var_out_id,aed_ppc); } /* endif */ }else{ /* !conforming */ (void)fprintf(stderr,"%s: WARNING Non-conforming %s attribute found in variable %s, skipping...\n",nco_prg_nm_get(),aed_ppc.att_nm,var_trv.nm_fll); } /* !conforming */ } /* !rcd */ } /* !PPC */ /* Memory management after current extracted variable */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); } /* end if variable and flg_xtr */ } /* end loop over idx_tbl */ /* Retain all dimensions */ if(RETAIN_ALL_DIMS) (void)nco_rad(nc_out_id,nbr_dmn_cmn_out,dmn_cmn_out,trv_tbl); /* Memory management for GPE names */ for(int idx=0;idx= nco_dbg_std) (void)fprintf(stderr,"%s: INFO Using MM3-workaround to hasten copying of record variables\n",nco_prg_nm_get()); /* Convert extraction list from traversal table to nm_id_sct format to re-use old code */ xtr_lst=nco_trv_tbl_nm_id(nc_id_in,nc_id_out,gpe,&xtr_nbr,trv_tbl); /* Split list into fixed-length and record variables */ (void)nco_var_lst_fix_rec_dvd(nc_id_in,xtr_lst,xtr_nbr,&fix_lst,&fix_nbr,&rec_lst,&rec_nbr); /* Copy fixed-length data variable-by-variable */ for(idx_var=0;idx_var= nco_dbg_var && !fp_bnr) (void)fprintf(stderr,"%s, ",fix_lst[idx_var]->nm); if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fflush(stderr); (void)nco_cpy_var_val(fix_lst[idx_var]->grp_id_in,fix_lst[idx_var]->grp_id_out,fp_bnr,md5,fix_lst[idx_var]->nm,trv_tbl); } /* end loop over idx_var */ /* Copy record data record-by-record */ (void)nco_cpy_rec_var_val(nc_id_in,fp_bnr,md5,rec_lst,rec_nbr,trv_tbl); /* Extraction lists no longer needed */ if(fix_lst) fix_lst=(nm_id_sct **)nco_free(fix_lst); if(rec_lst) rec_lst=(nm_id_sct **)nco_free(rec_lst); if(xtr_lst) xtr_lst=nco_nm_id_lst_free(xtr_lst,xtr_nbr); }else{ /* !USE_MM3_WORKAROUND */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv=trv_tbl->lst[idx_tbl]; /* If object is an extracted variable... */ if(trv.nco_typ == nco_obj_typ_var && trv.flg_xtr){ int grp_id_in; int grp_id_out; char *grp_out_fll; /* Get input group ID */ (void)nco_inq_grp_full_ncid(nc_id_in,trv_tbl->lst[idx_tbl].grp_nm_fll,&grp_id_in); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,trv_tbl->lst[idx_tbl].grp_nm_fll); else grp_out_fll=(char *)strdup(trv_tbl->lst[idx_tbl].grp_nm_fll); /* Get output group ID */ (void)nco_inq_grp_full_ncid(nc_id_out,grp_out_fll,&grp_id_out); /* Copy variable data from input netCDF file to output netCDF file */ (void)nco_cpy_var_val_mlt_lmt_trv(grp_id_in,grp_id_out,fp_bnr,md5,&trv); /* Memory management */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); } /* endif */ } /* end loop over idx_tbl */ } /* !USE_MM3_WORKAROUND */ /* Print extraction list in developer mode */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)trv_tbl_prn_xtr(trv_tbl,fnc_nm); } /* end nco_xtr_wrt() */ void nco_prn_dmn_grp /* [fnc] Print dimensions for a group */ (const int nc_id, /* I [ID] File ID */ const char * const grp_nm_fll) /* I [sng] Full name of group */ { char dmn_nm[NC_MAX_NAME+1]; /* [sng] Dimension name */ int *dmn_ids; /* [nbr] Dimensions IDs array */ int *dmn_ids_ult; /* [nbr] Unlimited dimensions IDs array */ int grp_id; /* [ID] Group ID */ int nbr_dmn; /* [nbr] Number of dimensions */ int nbr_dmn_ult; /* [nbr] Number of unlimited dimensions */ long dmn_sz; /* [nbr] Dimension size */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,grp_nm_fll,&grp_id); (void)nco_inq_unlimdims(grp_id,&nbr_dmn_ult,NULL); /* Alloc dimension IDs array */ dmn_ids_ult=(int *)nco_malloc(nbr_dmn_ult*sizeof(int)); /* Obtain unlimited dimensions for group */ (void)nco_inq_unlimdims(grp_id,&nbr_dmn_ult,dmn_ids_ult); /* Obtain dimensions IDs for group */ dmn_ids=nco_dmn_malloc(nc_id,grp_nm_fll,&nbr_dmn); /* List dimensions using obtained group ID */ for(int dnm_idx=0;dnm_idxnbr;idx_var++){ /* Filter variables */ if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var){ trv_sct var_trv=trv_tbl->lst[idx_var]; if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: INFO %s reports variable dimensions\n",nco_prg_nm_get(),fnc_nm); (void)fprintf(stdout,"%s:",var_trv.nm_fll); (void)fprintf(stdout," %d dimensions:\n",var_trv.nbr_dmn); } /* endif dbg */ /* Full dimension names for each variable */ for(int idx_dmn_var=0;idx_dmn_var\n",dmn_trv->nm_fll); } /* endif dbg */ if(strcmp(var_trv.var_dmn[idx_dmn_var].dmn_nm,dmn_trv->nm)){ /* Test case generates duplicated dimension IDs in netCDF file ncks -O -v two_dmn_rec_var in_grp.nc out.nc defines new dimensions for the file, as ID=0 index [0]: ID=1 index [1]: ID=2 index [0]: ID=3 index [1]: ID=4 index [1]: but the resulting file, when read, has the following IDs dimensions: #0,time = UNLIMITED ; // (10 currently) #1,lev = 3 ; #4,vrt_nbr = 2 ; group: g8 { dimensions: #0,lev = 3 ; #1,vrt_nbr = 2 ; From: "Unidata netCDF Support" To: Sent: Tuesday, March 12, 2013 5:02 AM Subject: [netCDF #SHH-257980]: Re: [netcdfgroup] Dimensions IDs > Your Ticket has been received, and a Unidata staff member will review it and reply accordingly. Listed below are details of this new Ticket. Please make sure the Ticket ID remains in the Subject: line on all correspondence related to this Ticket. > > Ticket ID: SHH-257980 > Subject: Re: [netcdfgroup] Dimensions IDs > Department: Support netCDF > Priority: Normal > Status: Open */ (void)fprintf(stdout,"%s: INFO %s reports variable <%s> with duplicate dimensions\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll); (void)fprintf(stdout,"%s: ERROR netCDF file with duplicate dimension IDs detected. Please use netCDF version at least 4.3.0.\n",nco_prg_nm_get()); (void)nco_prn_trv_tbl(nc_id,trv_tbl); nco_exit(EXIT_FAILURE); } /* Store full dimension name */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].dmn_nm_fll=strdup(dmn_trv->nm_fll); #ifdef DEBUG_LEAKS assert(trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].grp_nm_fll == NULL); #endif /* Store full group name where dimension is located */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].grp_nm_fll=strdup(dmn_trv->grp_nm_fll); /* Mark as record dimension if so */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_rec_dmn=dmn_trv->is_rec_dmn; } } /* Filter variables */ } /* Variables */ } /* end nco_blb_dmn_ids_trv() */ int /* [rcd] Return code */ nco_grp_itr /* [fnc] Populate traversal table by examining, recursively, subgroups of parent */ (const int grp_id, /* I [ID] Group ID */ char * const grp_nm_fll_prn, /* I [sng] Absolute group name of parent (path) */ char * const grp_nm_fll, /* I [sng] Absolute group name (path) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Populate traversal table by examining, recursively, subgroups of parent */ const char fnc_nm[]="nco_grp_itr()"; /* [sng] Function name */ const char sls_sng[]="/"; /* [sng] Slash string */ char grp_nm[NC_MAX_NAME+1]; /* [sng] Group name */ char var_nm[NC_MAX_NAME+1]; /* [sng] Variable name */ char dmn_nm[NC_MAX_NAME+1]; /* [sng] Dimension name */ char rec_nm[NC_MAX_NAME+1]; /* [sng] Record dimension name */ char *var_nm_fll; /* [sng] Full path for variable */ char *dmn_nm_fll; /* [sng] Full path for dimension */ char *sls_psn; /* [sng] Current position of group path search */ const int flg_prn=0; /* [flg] All the dimensions in all parent groups will also be retrieved */ int *dmn_ids_grp=NULL; /* [ID] Dimension IDs array for group */ int *dmn_ids_grp_ult=NULL; /* [ID] Unlimited (record) dimensions IDs array for group */ int *dmn_id_var=NULL; /* [ID] Dimensions IDs array for variable */ int *grp_ids; /* [ID] Sub-group IDs array */ int grp_dpt=0; /* [nbr] Depth of group (root = 0) */ int nbr_att; /* [nbr] Number of attributes */ int nbr_dmn_grp; /* [nbr] Number of dimensions for group */ int nbr_dmn_var; /* [nbr] Number of dimensions for variable */ int nbr_grp; /* [nbr] Number of sub-groups in this group */ int nbr_rec; /* [nbr] Number of record dimensions in this group */ int nbr_var; /* [nbr] Number of variables */ int rcd=NC_NOERR; /* [rcd] Return code */ long dmn_sz; /* [nbr] Dimension size */ long rec_sz; /* [nbr] Record dimension size */ nc_type var_typ; /* O [enm] NetCDF type */ nco_obj_typ obj_typ; /* [enm] Object type (group or variable) */ /* Get all information for this group */ /* Get group name */ rcd+=nco_inq_grpname(grp_id,grp_nm); /* Get number of sub-groups */ rcd+=nco_inq_grps(grp_id,&nbr_grp,(int *)NULL); /* Obtain number of dimensions/variable/attributes for group; NB: ignore record dimension ID */ rcd+=nco_inq(grp_id,&nbr_dmn_grp,&nbr_var,&nbr_att,(int *)NULL); /* Alloc dimension IDs array */ dmn_ids_grp=(int *)nco_malloc(nbr_dmn_grp*sizeof(int)); /* Obtain dimensions IDs for group */ rcd+=nco_inq_dimids(grp_id,&nbr_dmn_grp,dmn_ids_grp,flg_prn); rcd+=nco_inq_unlimdims(grp_id,&nbr_rec,NULL); /* Alloc dimension IDs array */ dmn_ids_grp_ult=(int *)nco_malloc(nbr_rec*sizeof(int)); /* Obtain unlimited dimensions for group */ rcd+=nco_inq_unlimdims(grp_id,&nbr_rec,dmn_ids_grp_ult); /* Compute group depth */ sls_psn=grp_nm_fll; if(!strcmp(grp_nm_fll,sls_sng)) grp_dpt=0; else grp_dpt=1; while((sls_psn=strchr(sls_psn+1,'/'))) grp_dpt++; if(nco_dbg_lvl_get() >= nco_dbg_io) (void)fprintf(stderr,"%s: INFO %s found group %s at level %d\n",nco_prg_nm_get(),fnc_nm,grp_nm_fll,grp_dpt); /* Keep the old table objects size for insertion */ unsigned int idx; idx=trv_tbl->nbr; /* Add one more element to GTT (nco_realloc nicely handles first time/not first time insertions) */ trv_tbl->nbr++; trv_tbl->lst=(trv_sct *)nco_realloc(trv_tbl->lst,trv_tbl->nbr*sizeof(trv_sct)); /* Add this element (a group) to table */ trv_tbl->lst[idx].nco_typ=nco_obj_typ_grp; /* [enm] netCDF4 object type: group or variable */ trv_tbl->lst[idx].nm=strdup(grp_nm); /* [sng] Relative name (i.e., variable name or last component of path name for groups) */ trv_tbl->lst[idx].grp_nm=strdup(grp_nm); /* [sng] Group name */ trv_tbl->lst[idx].nm_lng=strlen(grp_nm); /* [sng] Length of short name */ trv_tbl->lst[idx].grp_nm_fll=strdup(grp_nm_fll);/* [sng] Full group name (for groups, same as nm_fll) */ trv_tbl->lst[idx].nm_fll=strdup(grp_nm_fll); /* [sng] Fully qualified name (path) */ trv_tbl->lst[idx].nm_fll_lng=strlen(grp_nm_fll);/* [sng] Length of full name */ trv_tbl->lst[idx].flg_cf=False; /* [flg] Object matches CF-metadata extraction criteria */ trv_tbl->lst[idx].flg_crd=False; /* [flg] Object matches coordinate extraction criteria */ trv_tbl->lst[idx].flg_dfl=False; /* [flg] Object meets default subsetting criteria */ trv_tbl->lst[idx].flg_gcv=False; /* [flg] Group contains matched variable */ trv_tbl->lst[idx].flg_mch=False; /* [flg] Object matches user-specified strings */ trv_tbl->lst[idx].flg_mtd=False; /* [flg] Group contains only metadata */ trv_tbl->lst[idx].flg_ncs=False; /* [flg] Group is ancestor of specified group or variable */ trv_tbl->lst[idx].flg_nsx=False; /* [flg] Object matches intersection criteria */ trv_tbl->lst[idx].flg_rgr=False; /* [flg] Regrid variable */ trv_tbl->lst[idx].flg_xtn=False; /* [flg] Extensive variable */ trv_tbl->lst[idx].flg_mrv=False; /* [flg] Most-Rapidly-Varying horizontal dimensions variable */ trv_tbl->lst[idx].flg_rcr=False; /* [flg] Extract group recursively */ trv_tbl->lst[idx].flg_unn=False; /* [flg] Object matches union criteria */ trv_tbl->lst[idx].flg_vfp=False; /* [flg] Variable matches full path specification */ trv_tbl->lst[idx].flg_vsg=False; /* [flg] Variable selected because group matches */ trv_tbl->lst[idx].flg_xcl=False; /* [flg] Object matches exclusion criteria */ trv_tbl->lst[idx].flg_xtr=False; /* [flg] Extract object */ trv_tbl->lst[idx].flg_rdr=False; /* [flg] Variable has dimensions to re-order (ncpdq) */ trv_tbl->lst[idx].flg_aux=False; /* [flg] Variable contains auxiliary coordinates */ trv_tbl->lst[idx].flg_std_att_lat=False; /* [flg] Variable contains 'standard_name' attribute "latitude" */ trv_tbl->lst[idx].flg_std_att_lon=False; /* [flg] Variable contains 'standard_name' attribute "longitude" */ trv_tbl->lst[idx].rec_dmn_nm_out=NULL; /* [sng] Record dimension name, re-ordered */ trv_tbl->lst[idx].grp_dpt=grp_dpt; /* [nbr] Depth of group (root = 0) */ trv_tbl->lst[idx].nbr_dmn=nbr_dmn_grp; /* [nbr] Number of dimensions */ trv_tbl->lst[idx].nbr_att=nbr_att; /* [nbr] Number of attributes */ trv_tbl->lst[idx].nbr_grp=nbr_grp; /* [nbr] Number of sub-groups (for group) */ trv_tbl->lst[idx].nbr_rec=nbr_rec; /* [nbr] Number of record dimensions */ trv_tbl->lst[idx].nbr_var=nbr_var; /* [nbr] Number of variables (for group) */ trv_tbl->lst[idx].ppc=NC_MAX_INT; /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ trv_tbl->lst[idx].flg_nsd=True; /* [flg] PPC is NSD */ trv_tbl->lst[idx].is_crd_var=nco_obj_typ_err; /* [flg] (For variables only) Is this a coordinate variable? (unique dimension exists in-scope) */ trv_tbl->lst[idx].is_rec_var=nco_obj_typ_err; /* [flg] (For variables only) Is a record variable? (is_crd_var must be True) */ trv_tbl->lst[idx].var_typ=(nc_type)nco_obj_typ_err;/* [enm] (For variables only) NetCDF type */ trv_tbl->lst[idx].enm_prc_typ=err_typ; /* [enm] (For variables only) Processing type enumerator */ trv_tbl->lst[idx].var_typ_out=(nc_type)err_typ; /* [enm] (For variables only) NetCDF type in output file (used by ncflint, ncpdq) */ if(grp_nm_fll_prn) trv_tbl->lst[idx].grp_nm_fll_prn=strdup(grp_nm_fll_prn); /* [sng] (ncge) Parent group full name */ else trv_tbl->lst[idx].grp_nm_fll_prn=NULL; trv_tbl->lst[idx].flg_nsm_prn=False; /* [flg] (ncge) Group is, or variable is in, ensemble parent group */ trv_tbl->lst[idx].flg_nsm_mbr=False; /* [flg] (ncge) Group is, or variable is in, ensemble member group */ trv_tbl->lst[idx].flg_nsm_tpl=False; /* [flg] Group is, or variable is in, template member group */ trv_tbl->lst[idx].nsm_nm=NULL; /* [sng] (ncge) Ensemble parent group name i.e., full path to ensemble parent */ /* Variable dimensions. For groups there are no variable dimensions */ trv_tbl->lst[idx].var_dmn=NULL; /* ncpdq dimension arrays */ trv_tbl->lst[idx].dmn_idx_out_in=NULL; trv_tbl->lst[idx].dmn_rvr_in=NULL; /* Iterate variables for this group */ for(int idx_var=0;idx_var NC_MAX_ATOMIC_TYPE */ obj_typ=nco_obj_typ_nonatomic_var; if(nco_dbg_lvl_get() >= nco_dbg_var){ (void)fprintf(stderr,"%s: WARNING NCO only supports netCDF4 atomic-type variables. Variable %s is type %d = %s, and will be ignored in subsequent processing.\n", nco_prg_nm_get(),var_nm_fll,var_typ,nco_typ_sng(var_typ)); } /* endif */ } /* > NC_MAX_ATOMIC_TYPE */ /* Keep the old table objects size for insertion */ idx=trv_tbl->nbr; /* Add one more element to GTT (nco_realloc nicely handles first time/not first time insertions) */ trv_tbl->nbr++; trv_tbl->lst=(trv_sct *)nco_realloc(trv_tbl->lst,trv_tbl->nbr*sizeof(trv_sct)); /* Add this element, a variable, to table. NB: nbr_var, nbr_grp, flg_rcr not valid here */ trv_tbl->lst[idx].nco_typ=obj_typ; trv_tbl->lst[idx].nm=strdup(var_nm); trv_tbl->lst[idx].nm_lng=strlen(var_nm); trv_tbl->lst[idx].grp_nm_fll=strdup(grp_nm_fll); trv_tbl->lst[idx].grp_nm=strdup(grp_nm); trv_tbl->lst[idx].nm_fll=strdup(var_nm_fll); trv_tbl->lst[idx].nm_fll_lng=strlen(var_nm_fll); trv_tbl->lst[idx].flg_cf=False; trv_tbl->lst[idx].flg_crd=False; trv_tbl->lst[idx].flg_dfl=False; trv_tbl->lst[idx].flg_gcv=False; trv_tbl->lst[idx].flg_mch=False; trv_tbl->lst[idx].flg_mtd=False; trv_tbl->lst[idx].flg_ncs=False; trv_tbl->lst[idx].flg_nsx=False; trv_tbl->lst[idx].flg_rcr=False; trv_tbl->lst[idx].flg_rgr=False; trv_tbl->lst[idx].flg_xtn=False; trv_tbl->lst[idx].flg_mrv=False; trv_tbl->lst[idx].flg_unn=False; trv_tbl->lst[idx].flg_vfp=False; trv_tbl->lst[idx].flg_vsg=False; trv_tbl->lst[idx].flg_xcl=False; trv_tbl->lst[idx].flg_xtr=False; trv_tbl->lst[idx].flg_rdr=False; trv_tbl->lst[idx].flg_aux=False; trv_tbl->lst[idx].flg_std_att_lat=False; trv_tbl->lst[idx].flg_std_att_lon=False; trv_tbl->lst[idx].rec_dmn_nm_out=NULL; trv_tbl->lst[idx].grp_dpt=grp_dpt; trv_tbl->lst[idx].nbr_att=nbr_att; trv_tbl->lst[idx].nbr_dmn=nbr_dmn_var; trv_tbl->lst[idx].nbr_grp=nco_obj_typ_err; trv_tbl->lst[idx].nbr_rec=nbr_rec; /* NB: broken fxm should be record dimensions used by this variable */ trv_tbl->lst[idx].nbr_var=nco_obj_typ_err; trv_tbl->lst[idx].ppc=NC_MAX_INT; /* [nbr] Precision-preserving compression, i.e., number of total or decimal significant digits */ trv_tbl->lst[idx].flg_nsd=True; /* [flg] PPC is NSD */ trv_tbl->lst[idx].is_crd_var=False; trv_tbl->lst[idx].is_rec_var=False; trv_tbl->lst[idx].var_typ=var_typ; trv_tbl->lst[idx].enm_prc_typ=err_typ; trv_tbl->lst[idx].var_typ_out=(nc_type)err_typ; if(grp_nm_fll_prn) trv_tbl->lst[idx].grp_nm_fll_prn=strdup(grp_nm_fll_prn); else trv_tbl->lst[idx].grp_nm_fll_prn=NULL; trv_tbl->lst[idx].flg_nsm_prn=False; trv_tbl->lst[idx].flg_nsm_mbr=False; trv_tbl->lst[idx].flg_nsm_tpl=False; trv_tbl->lst[idx].nsm_nm=NULL; /* Variable dimensions */ trv_tbl->lst[idx].var_dmn=(var_dmn_sct *)nco_malloc(nbr_dmn_var*sizeof(var_dmn_sct)); trv_tbl->lst[idx].dmn_idx_out_in=NULL; trv_tbl->lst[idx].dmn_rvr_in=NULL; for(int idx_dmn_var=0;idx_dmn_varlst[idx].var_dmn[idx_dmn_var].dmn_nm=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].dmn_nm_fll=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].grp_nm_fll=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].is_crd_var=nco_obj_typ_err; trv_tbl->lst[idx].var_dmn[idx_dmn_var].is_rec_dmn=nco_obj_typ_err; trv_tbl->lst[idx].var_dmn[idx_dmn_var].crd=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].ncd=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].dmn_id=nco_obj_typ_err; /* Assume dimension is to keep on output */ trv_tbl->lst[idx].var_dmn[idx_dmn_var].flg_dmn_avg=False; trv_tbl->lst[idx].var_dmn[idx_dmn_var].flg_rdd=False; trv_tbl->lst[idx].var_dmn[idx_dmn_var].lat_crd=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].lon_crd=NULL; trv_tbl->lst[idx].var_dmn[idx_dmn_var].nbr_lat_crd=0; trv_tbl->lst[idx].var_dmn[idx_dmn_var].nbr_lon_crd=0; } /* endfor */ /* Variable dimensions; store what we know at this time: relative name and ID */ for(int idx_dmn_var=0;idx_dmn_varlst[idx].var_dmn[idx_dmn_var].dmn_nm=strdup(dmn_nm_var); trv_tbl->lst[idx].var_dmn[idx_dmn_var].dmn_id=dmn_id_var[idx_dmn_var]; } /* Variable dimensions; store what we know at this time: relative name and ID */ /* Free constructed name */ var_nm_fll=(char *)nco_free(var_nm_fll); /* Free dimension IDs array */ dmn_id_var=(int *)nco_free(dmn_id_var); } /* Iterate variables for this group */ /* Add dimension objects */ /* Iterate dimensions (for group; dimensions are defined *for* groups) */ for(int idx_dmn=0;idx_dmnnbr_dmn; /* Add one more element to dimension list of GTT (nco_realloc nicely handles first time/not first time insertions) */ trv_tbl->nbr_dmn++; trv_tbl->lst_dmn=(dmn_trv_sct *)nco_realloc(trv_tbl->lst_dmn,trv_tbl->nbr_dmn*sizeof(dmn_trv_sct)); /* Initialize as non-record dimension */ trv_tbl->lst_dmn[idx].is_rec_dmn=False; /* Get dimension name */ rcd+=nco_inq_dim(grp_id,dmn_ids_grp[idx_dmn],dmn_nm,&dmn_sz); /* Iterate unlimited dimensions to detect if dimension is record */ for(int rec_idx=0;rec_idxlst_dmn[idx].is_rec_dmn=True; /* Exit record dimension loop; we found it */ break; } /* end match record dimension name */ } /* end record dimension loop */ /* Allocate path buffer and include space for trailing NUL */ dmn_nm_fll=(char *)nco_malloc(strlen(grp_nm_fll)+strlen(dmn_nm)+2L); /* Initialize path with current absolute group path */ strcpy(dmn_nm_fll,grp_nm_fll); /* If not root group, concatenate separator */ if(strcmp(grp_nm_fll,sls_sng)) strcat(dmn_nm_fll,sls_sng); /* Concatenate dimension name to absolute group path */ strcat(dmn_nm_fll,dmn_nm); /* Store object */ trv_tbl->lst_dmn[idx].nm=strdup(dmn_nm); trv_tbl->lst_dmn[idx].grp_nm_fll=strdup(grp_nm_fll); trv_tbl->lst_dmn[idx].nm_fll=strdup(dmn_nm_fll); trv_tbl->lst_dmn[idx].sz=dmn_sz; trv_tbl->lst_dmn[idx].lmt_msa.dmn_nm=strdup(dmn_nm); trv_tbl->lst_dmn[idx].lmt_msa.dmn_sz_org=dmn_sz; trv_tbl->lst_dmn[idx].lmt_msa.dmn_cnt=dmn_sz; trv_tbl->lst_dmn[idx].lmt_msa.WRP=False; trv_tbl->lst_dmn[idx].lmt_msa.NON_HYP_DMN=True; trv_tbl->lst_dmn[idx].lmt_msa.MSA_USR_RDR=False; trv_tbl->lst_dmn[idx].lmt_msa.lmt_dmn_nbr=0; trv_tbl->lst_dmn[idx].lmt_msa.lmt_crr=0; trv_tbl->lst_dmn[idx].lmt_msa.lmt_dmn=NULL; trv_tbl->lst_dmn[idx].crd_nbr=0; trv_tbl->lst_dmn[idx].crd=NULL; trv_tbl->lst_dmn[idx].dmn_id=dmn_ids_grp[idx_dmn]; trv_tbl->lst_dmn[idx].has_crd_scp=nco_obj_typ_err; /* Free constructed name */ dmn_nm_fll=(char *)nco_free(dmn_nm_fll); } /* end dimension loop */ /* Go to sub-groups */ grp_ids=(int *)nco_malloc(nbr_grp*sizeof(int)); rcd+=nco_inq_grps(grp_id,&nbr_grp,grp_ids); /* Heart of traversal construction: Construct new sub-group path and call function recursively with new name */ for(int grp_idx=0;grp_idxnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Interested in variables only */ if(var_trv.nco_typ == nco_obj_typ_var){ /* Loop unique dimensions list in groups */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn_trv=trv_tbl->lst_dmn[idx_dmn]; /* Is there a variable with this dimension name anywhere? (relative name) */ if(!strcmp(dmn_trv.nm,var_trv.nm)){ /* Is variable in-scope of dimension? */ if(nco_crd_var_dmn_scp(&var_trv,&dmn_trv,trv_tbl)){ /* Mark this variable as coordinate variable. NB: True coordinate variables are 1D */ if(var_trv.nbr_dmn == 1) trv_tbl->lst[idx_var].is_crd_var=True; else trv_tbl->lst[idx_var].is_crd_var=False; /* If the group dimension is a record dimension then the variable is a record variable */ trv_tbl->lst[idx_var].is_rec_var=dmn_trv.is_rec_dmn; if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: INFO %s reports %s is ",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll); if(dmn_trv.is_rec_dmn) (void)fprintf(stdout,"(record) "); (void)fprintf(stdout,"coordinate\n"); } /* endif dbg */ /* Go to next variable */ break; } /* Is variable in-scope of dimension? */ } /* Is there a variable with this dimension name anywhere? (relative name) */ } /* Loop unique dimensions list in groups */ } /* Interested in variables only */ } /* Loop all variables */ } /* nco_bld_crd_rec_var_trv() */ void nco_bld_crd_var_trv /* [fnc] Build GTT "crd_sct" coordinate variable structure */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Build GTT "crd_sct" coordinate variable structure */ const char fnc_nm[]="nco_bld_crd_var_trv()"; /* [sng] Function name */ /* Step 1) Find the total number of coordinate variables for every dimension */ /* Loop unique dimensions list in groups */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn_trv=trv_tbl->lst_dmn[idx_dmn]; /* Loop all objects */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Interested in variables only */ if(var_trv.nco_typ == nco_obj_typ_var){ /* Is there a variable with this dimension name anywhere? (relative name) */ if(!strcmp(dmn_trv.nm,var_trv.nm)){ /* Is variable in-scope of dimension ? */ if(nco_crd_var_dmn_scp(&var_trv,&dmn_trv,trv_tbl)){ /* Increment the number of coordinate variables for this dimension */ trv_tbl->lst_dmn[idx_dmn].crd_nbr++; } /* Is variable in-scope of dimension ? */ } /* Is there a variable with this dimension name anywhere? (relative name) */ } /* Interested in variables only */ } /* Loop all objects */ } /* Loop unique dimensions list in groups */ /* Step 2) Allocate coordinate variables array (crd_sct **) for every dimension */ /* Loop unique dimensions list in groups */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ /* Total number of coordinate variables for this dimension */ int crd_nbr=trv_tbl->lst_dmn[idx_dmn].crd_nbr; /* Alloc coordinate array if there are any coordinates */ if(crd_nbr) trv_tbl->lst_dmn[idx_dmn].crd=(crd_sct **)nco_malloc(crd_nbr*sizeof(crd_sct *)); } /* Loop unique dimensions list in groups */ /* Step 3) Allocate/Initialize every coordinate variable array for every dimension */ /* Loop unique dimensions list in groups */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn_trv=trv_tbl->lst_dmn[idx_dmn]; int crd_idx=0; /* [nbr] Coordinate index for current dimension */ /* Loop all objects */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Interested in variables only */ if(var_trv.nco_typ == nco_obj_typ_var){ /* Is there a variable with this dimension name anywhere? (relative name) */ if(strcmp(dmn_trv.nm,var_trv.nm) == 0 ){ /* Is variable in-scope of dimension ? */ if(nco_crd_var_dmn_scp(&var_trv,&dmn_trv,trv_tbl)){ /* Alloc this coordinate */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]=(crd_sct *)nco_malloc(sizeof(crd_sct)); /* The coordinate full name is the variable full name found in-scope */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->crd_nm_fll=strdup(var_trv.nm_fll); /* The coordinate dimension full name is the dimension full name */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->dmn_nm_fll=strdup(dmn_trv.nm_fll); /* The coordinate ID is the dimension unique ID */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->dmn_id=dmn_trv.dmn_id; /* Full group name where coordinate is located is the variable full group name */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->crd_grp_nm_fll=strdup(var_trv.grp_nm_fll); /* Full group name where dimension of *this* coordinate is located is the full group name of the dimension */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->dmn_grp_nm_fll=strdup(dmn_trv.grp_nm_fll); /* Store relative name (same for dimension and variable) */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->nm=strdup(var_trv.nm); /* Is a record dimension(variable) if the dimennsion is a record dimension */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->is_rec_dmn=dmn_trv.is_rec_dmn; /* Size is size */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->sz=dmn_trv.sz; /* Type */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->var_typ=var_trv.var_typ; /* Group depth */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->grp_dpt=var_trv.grp_dpt; /* MSA */ trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.dmn_nm=strdup(var_trv.nm); trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.dmn_cnt=dmn_trv.sz; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.dmn_sz_org=dmn_trv.sz; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.WRP=False; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.NON_HYP_DMN=True; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.MSA_USR_RDR=False; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.lmt_dmn_nbr=0; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.lmt_crr=0; trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]->lmt_msa.lmt_dmn=NULL; if(nco_dbg_lvl_get() == nco_dbg_old){ crd_sct *crd=trv_tbl->lst_dmn[idx_dmn].crd[crd_idx]; (void)fprintf(stdout,"%s: INFO %s variable <%s> has coordinate <%s> from dimension <%s>\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,crd->crd_nm_fll,crd->dmn_nm_fll); } /* endif */ /* Increment coordinate index for current dimension */ crd_idx++; } /* Is variable in-scope of dimension ? */ } /* Is there a variable with this dimension name anywhere? (relative name) */ } /* Interested in variables only */ } /* Loop all objects */ } /* Loop unique dimensions list in groups */ } /* nco_bld_crd_var_trv() */ static void prt_lmt /* [fnc] Print limit */ (const int lmt_idx, /* I [sct] Index */ lmt_sct *lmt) /* I [sct] Limit */ { (void)fprintf(stdout," LIMIT[%d]%s(%li,%li,%li) ",lmt_idx,lmt->nm,lmt->srt,lmt->cnt,lmt->srd); } /* prt_lmt() */ void nco_prn_trv_tbl /* [fnc] Print GTT (Group Traversal Table) */ (const int nc_id, /* I [ID] File ID */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: print GTT (Group Traversal Table); usage ncks --get_grp_info ~/nco/data/in_grp.nc */ int nbr_dmn; /* [nbr] Total number of unique dimensions */ int nbr_crd; /* [nbr] Total number of coordinate variables */ int nbr_crd_var; /* [nbr] Total number of coordinate variables */ nbr_dmn=0; (void)fprintf(stdout,"%s: INFO reports group information\n",nco_prg_nm_get()); for(unsigned grp_idx=0;grp_idxnbr;grp_idx++){ /* Filter groups */ if(trv_tbl->lst[grp_idx].nco_typ == nco_obj_typ_grp){ trv_sct trv=trv_tbl->lst[grp_idx]; (void)fprintf(stdout,"%s: %d subgroups, %d dimensions, %d record dimensions, %d attributes, %d variables\n",trv.nm_fll,trv.nbr_grp,trv.nbr_dmn,trv.nbr_rec,trv.nbr_att,trv.nbr_var); /* Print dimensions for group */ (void)nco_prn_dmn_grp(nc_id,trv.nm_fll); nbr_dmn+=trv.nbr_dmn; } /* Filter groups */ } /* Loop groups */ assert((unsigned int)nbr_dmn == trv_tbl->nbr_dmn); /* Variables */ nbr_crd=0; (void)fprintf(stdout,"\n"); (void)fprintf(stdout,"%s: INFO reports variable information\n",nco_prg_nm_get()); for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; if(var_trv.nco_typ == nco_obj_typ_var){ (void)fprintf(stdout,"%s:",var_trv.nm_fll); if(var_trv.is_crd_var){ (void)fprintf(stdout," (coordinate)"); nbr_crd++; } /* endif */ if(var_trv.is_rec_var) (void)fprintf(stdout," (record)"); /* If record variable must be coordinate variable */ if(var_trv.is_rec_var) assert(var_trv.is_crd_var); (void)fprintf(stdout," %d dimensions: ",var_trv.nbr_dmn); for(int idx_dmn_var=0;idx_dmn_varlmt_msa.lmt_dmn_nbr;lmt_idx++) (void)prt_lmt(lmt_idx,var_dmn.crd->lmt_msa.lmt_dmn[lmt_idx]); }else{ /* Dimension has no coordinate variables */ for(int lmt_idx=0;lmt_idxlmt_msa.lmt_dmn_nbr;lmt_idx++) (void)prt_lmt(lmt_idx,var_dmn.ncd->lmt_msa.lmt_dmn[lmt_idx]); } /* !crd */ } /* !dmn */ (void)fprintf(stdout,"\n"); } /* !var */ } /* !var */ /* Unique dimension list, Coordinate variables stored in unique dimension list, limits */ nbr_crd_var=0; (void)fprintf(stdout,"\n"); (void)fprintf(stdout,"%s: INFO reports coordinate variables and limits listed by dimension:\n",nco_prg_nm_get()); for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn_trv=trv_tbl->lst_dmn[idx_dmn]; /* Dimension ID and full name */ (void)fprintf(stdout,"(#%d%s)",dmn_trv.dmn_id,dmn_trv.nm_fll); /* Filter output */ if(dmn_trv.is_rec_dmn) (void)fprintf(stdout," record dimension(%lu):: ",(unsigned long)dmn_trv.sz); else (void)fprintf(stdout," dimension(%lu):: ",(unsigned long)dmn_trv.sz); nbr_crd_var+=dmn_trv.crd_nbr; /* Loop coordinates */ for(int crd_idx=0;crd_idxcrd_nm_fll); /* Dimension full name */ (void)fprintf(stdout,"(#%d%s) ",crd->dmn_id,crd->dmn_nm_fll); /* Limits */ for(int lmt_idx=0;lmt_idxlmt_msa.lmt_dmn_nbr;lmt_idx++) (void)prt_lmt(lmt_idx,crd->lmt_msa.lmt_dmn[lmt_idx]); /* Terminate this coordinate with "::" */ if(dmn_trv.crd_nbr>1) (void)fprintf(stdout,":: "); } /* Loop coordinates */ /* Terminate line */ (void)fprintf(stdout,"\n"); } /* Coordinate variables stored in unique dimension list */ assert(nbr_crd_var == nbr_crd); } /* nco_prn_trv_tbl() */ void nco_has_crd_dmn_scp /* [fnc] Is there a variable with same name in dimension's scope? */ (const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { const char fnc_nm[]="nco_has_crd_dmn_scp()"; /* [sng] Function name */ /* Unique dimension list */ if(nco_dbg_lvl_get() == nco_dbg_old)(void)fprintf(stdout,"%s: INFO reports dimension information with limits: %d dimensions\n",nco_prg_nm_get(),trv_tbl->nbr_dmn); for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn_trv=trv_tbl->lst_dmn[idx_dmn]; /* Dimension #/name first */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"#%d%s\n",dmn_trv.dmn_id,dmn_trv.nm_fll); nco_bool in_scp=False; /* Loop object table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ /* Filter variables */ if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Is there a variable with this dimension name (a coordinate varible) anywhere (relative name) */ if(!strcmp(dmn_trv.nm,var_trv.nm)){ /* Is variable in-scope of dimension ? */ if(nco_crd_var_dmn_scp(&var_trv,&dmn_trv,trv_tbl)){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s reports variable <%s> in-scope of dimension <%s>\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,dmn_trv.nm_fll); trv_tbl->lst_dmn[idx_dmn].has_crd_scp=True; /* Built before; variable must be a cordinate */ assert(var_trv.is_crd_var); in_scp=True; } /* Is variable in-scope of dimension ? */ } /* Is there a variable with this dimension name anywhere? (relative name) */ } /* Filter variables */ } /* Loop object table */ if(nco_dbg_lvl_get() == nco_dbg_old) if(!in_scp) (void)fprintf(stdout,"%s: INFO %s dimension <%s> with no in-scope variables\n",nco_prg_nm_get(),fnc_nm,dmn_trv.nm_fll); trv_tbl->lst_dmn[idx_dmn].has_crd_scp=in_scp; } /* Unique dimension list */ /* Unique dimension list */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++) assert(trv_tbl->lst_dmn[idx_dmn].has_crd_scp != nco_obj_typ_err); } /* nco_has_crd_dmn_scp() */ nco_bool /* O [flg] True if variable is in-scope of dimension */ nco_crd_var_dmn_scp /* [fnc] Is coordinate variable in dimension scope */ (const trv_sct * const var_trv, /* I [sct] GTT Object Variable */ const dmn_trv_sct * const dmn_trv, /* I [sct] GTT unique dimension */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: Find if variable is in-scope of the dimension: Use case in-scope: dimension /lon variable /g1/lon Use case not in-scope: variable /lon dimension /g1/lon NOTE: deal with cases like dimension: /lon variable: /g8/lon dimension: /g8/lon */ const char fnc_nm[]="nco_crd_var_dmn_scp()"; /* [sng] Function name */ const char sls_chr='/'; /* [chr] Slash character */ char *sbs_srt; /* [sng] Location of user-string match start in object path */ char *sbs_end; /* [sng] Location of user-string match end in object path */ nco_bool flg_pth_srt_bnd=False; /* [flg] String begins at path component boundary */ nco_bool flg_pth_end_bnd=False; /* [flg] String ends at path component boundary */ size_t var_sng_lng; /* [nbr] Length of variable name */ size_t var_nm_fll_lng; /* [nbr] Length of full variable name */ size_t dmn_nm_fll_lng; /* [nbr] Length of of full dimension name */ /* Coordinate variables are 1D */ if(var_trv->nbr_dmn !=1 ){ return False; } /* Most common case is for the unique dimension full name to match the full variable name */ if(!strcmp(var_trv->nm_fll,dmn_trv->nm_fll)){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s found absolute match of variable <%s> and dimension <%s>:\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,dmn_trv->nm_fll); return True; } /* Deal with in-scope cases */ var_nm_fll_lng=strlen(var_trv->nm_fll); dmn_nm_fll_lng=strlen(dmn_trv->nm_fll); var_sng_lng=strlen(var_trv->nm); /* Look for partial match, not necessarily on path boundaries; locate variable (str2) in full dimension name (str1) */ if((sbs_srt=strstr(dmn_trv->nm_fll,var_trv->nm))){ /* Ensure match spans (begins and ends on) whole path-component boundaries */ /* Does match begin at path component boundary ... directly on a slash? */ if(*sbs_srt == sls_chr) flg_pth_srt_bnd=True; /* ...or one after a component boundary? */ if((sbs_srt > dmn_trv->nm_fll) && (*(sbs_srt-1L) == sls_chr)) flg_pth_srt_bnd=True; /* Does match end at path component boundary ... directly on a slash? */ sbs_end=sbs_srt+var_sng_lng-1L; if(*sbs_end == sls_chr) flg_pth_end_bnd=True; /* ...or one before a component boundary? */ if(sbs_end <= dmn_trv->nm_fll+dmn_nm_fll_lng-1L) if((*(sbs_end+1L) == sls_chr) || (*(sbs_end+1L) == '\0')) flg_pth_end_bnd=True; /* If match is on both ends of '/' then it's a "real" name, not for example "lat_lon" as a variable looking for "lon" */ if(flg_pth_srt_bnd && flg_pth_end_bnd){ /* Absolute match (equality redundant); strcmp deals cases like /g3/rlev/ and /g5/rlev */ if(var_nm_fll_lng == dmn_nm_fll_lng && strcmp(var_trv->nm_fll,dmn_trv->nm_fll) == 0){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s found absolute match of variable <%s> and dimension <%s>:\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,dmn_trv->nm_fll); return True; /* Variable in-scope of dimension */ }else if(var_nm_fll_lng>dmn_nm_fll_lng){ /* NOTE: deal with cases like dimension: /lon variable: /g8/lon dimension: /g8/lon */ /* Loop unique dimensions list in groups */ for(unsigned idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ dmn_trv_sct dmn=trv_tbl->lst_dmn[idx_dmn]; /* Loop all objects */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var=trv_tbl->lst[idx_var]; /* Interested in variables only */ if(var.nco_typ == nco_obj_typ_var){ /* Is there a *full* match already for the *input* dimension ? */ if(!strcmp(var_trv->nm_fll,dmn.nm_fll)){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s variable <%s> has another dimension full match <%s>:\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,dmn.nm_fll); return False; } /* Is there a *full* match already? */ } /* Interested in variables only */ } /* Loop all objects */ } /* Loop unique dimensions list in groups */ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s found variable <%s> in-scope of dimension <%s>:\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,dmn_trv->nm_fll); return True; /* Variable out of scope of dimension */ }else if(var_nm_fll_lng < dmn_nm_fll_lng){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s found variable <%s> out of scope of dimension <%s>:\n",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll,dmn_trv->nm_fll); return False; } /* Absolute match */ } /* If match is on both ends of '/' then it's a "real" name, not for example "lat_lon" as a variable looking for "lon" */ }/* Look for partial match, not necessarily on path boundaries */ return False; } /* nco_crd_var_dmn_scp() */ int /* O [enm] Comparison result [<,=,>] 0 iff val_1 [<,==,>] val_2 */ nco_cmp_crd_dpt /* [fnc] Compare two crd_sct's by group depth */ (const void *val_1, /* I [sct] crd_sct * to compare */ const void *val_2) /* I [sct] crd_sct * to compare */ { /* Purpose: Compare two crd_sct's by group depth structure member Function is suitable for argument to ANSI C qsort() routine in stdlib.h crd_sct **crd is an array of pointers to unique dimension coordinates */ const crd_sct * const * const crd1=(const crd_sct * const *)val_1; const crd_sct * const * const crd2=(const crd_sct * const *)val_2; if((*crd1)->grp_dpt > (*crd2)->grp_dpt) return -1; else if((*crd1)->grp_dpt < (*crd2)->grp_dpt) return 1; else return 0; } /* end nco_cmp_crd_dpt() */ crd_sct * /* O [sct] Coordinate object */ nco_scp_var_crd /* [fnc] Return in-scope coordinate for variable */ (const trv_sct * const var_trv, /* I [sct] Variable object */ dmn_trv_sct * const dmn_trv) /* I [sct] Dimension object */ { /* Purpose: Choose one coordinate from the dimension object to assign as a valid coordinate to the variable dimension Scope definition: In the same group of the variable or beneath (closer to root) Above: out of scope (no luck) Use cases: dimension lon4; variable lon4_var(lon4) Variable /g16/g16g4/g16g4g4/g16g4g4g4/lon4_var 2 coordinates down in-scope /g16/g16g4/g16g4g4/lon4 /g16/g16g4/lon4 */ /* If more than one coordinate, sort them by group depth */ if(dmn_trv->crd_nbr>1) qsort(dmn_trv->crd,(size_t)dmn_trv->crd_nbr,sizeof(crd_sct *),nco_cmp_crd_dpt); /* Loop over coordinates; they all have unique dimension ID of variable dimension */ for(int crd_idx=0;crd_idxcrd_nbr;crd_idx++){ crd_sct *crd=dmn_trv->crd[crd_idx]; /* Absolute match: in-scope */ if(!strcmp(var_trv->nm_fll,crd->crd_nm_fll)){ /* Variable must be coordinate for this to happen */ assert(var_trv->is_crd_var); return crd; }else if(!strcmp(var_trv->grp_nm_fll,crd->crd_grp_nm_fll)){ /* Same group: in-scope */ return crd; } else if(crd->grp_dpt < var_trv->grp_dpt){ /* Level below: in-scope */ return crd; } } /* Loop coordinates */ return NULL; } /* nco_scp_var_crd() */ void nco_bld_var_dmn /* [fnc] Assign variables dimensions to either coordinates or dimension structs */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Fill variable dimensions with pointers to either a coordinate variable or dimension structs */ const char fnc_nm[]="nco_bld_var_dmn()"; /* [sng] Function name */ #ifdef DEBUG_LEAKS int crt_counter=0; #endif /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ /* Filter variables */ if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Loop dimensions for object (variable) */ for(int idx_dmn_var=0;idx_dmn_varlst[idx_var].var_dmn[idx_dmn_var].crd=NULL; /* Get unique dimension ID from variable dimension */ int var_dmn_id=var_trv.var_dmn[idx_dmn_var].dmn_id; /* Get unique dimension object from unique dimension ID */ dmn_trv_sct *dmn_trv=nco_dmn_trv_sct(var_dmn_id,trv_tbl); /* No coordinates */ if(dmn_trv->crd_nbr == 0){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s reports variable <%s> with *NON* coordinate dimension [%d]%s\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,idx_dmn_var,var_trv.var_dmn[idx_dmn_var].dmn_nm_fll); /* Mark as False the position of the bool array coordinate/non coordinate */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_crd_var=False; /* Store unique dimension (non coordinate) */ /* Deep-copy dimension */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd=(dmn_trv_sct *)nco_malloc(sizeof(dmn_trv_sct)); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->grp_nm_fll=(char *)strdup(dmn_trv->grp_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->nm_fll=(char *)strdup(dmn_trv->nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->nm=(char *)strdup(dmn_trv->nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->crd=NULL; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->crd_nbr=0; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->dmn_id=dmn_trv->dmn_id; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->flg_xtr=dmn_trv->flg_xtr; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->has_crd_scp=dmn_trv->has_crd_scp; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->is_rec_dmn=dmn_trv->is_rec_dmn; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->sz=dmn_trv->sz; /* MSA */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.NON_HYP_DMN=dmn_trv->lmt_msa.NON_HYP_DMN; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_cnt=dmn_trv->lmt_msa.dmn_cnt; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_nm=(char *)strdup(dmn_trv->lmt_msa.dmn_nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_sz_org=dmn_trv->lmt_msa.dmn_sz_org; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_crr=dmn_trv->lmt_msa.lmt_crr; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_dmn=NULL; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_dmn_nbr=0; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.MSA_USR_RDR=dmn_trv->lmt_msa.MSA_USR_RDR; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.WRP=dmn_trv->lmt_msa.WRP; }else if(dmn_trv->crd_nbr > 0){ /* Choose in-scope coordinates Scope definition: In the same group of the variable or above (closer to root) Below: out-of-scope */ crd_sct *crd=NULL; /* [sct] Coordinate to assign to dimension of variable */ /* Choose the "in-scope" coordinate for the variable and assign it to the variable dimension */ crd=nco_scp_var_crd(&var_trv,dmn_trv); /* The "in-scope" coordinate is returned */ if(crd){ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s reports dimension [%d]%s of variable <%s> in-scope of coordinate <%s>\n",nco_prg_nm_get(),fnc_nm,idx_dmn_var,var_trv.var_dmn[idx_dmn_var].dmn_nm_fll,var_trv.nm_fll,crd->crd_nm_fll); /* Mark as True */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_crd_var=True; #ifdef DEBUG_LEAKS crt_counter++; assert(trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd == NULL); #endif /* Deep-copy coordinate */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd=(crd_sct *)nco_malloc(sizeof(crd_sct)); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->crd_nm_fll=(char *)strdup(crd->crd_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->dmn_nm_fll=(char *)strdup(crd->dmn_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->crd_grp_nm_fll=(char *)strdup(crd->crd_grp_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->dmn_grp_nm_fll=(char *)strdup(crd->dmn_grp_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->nm=(char *)strdup(crd->nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->is_rec_dmn=crd->is_rec_dmn; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->sz=crd->sz; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->var_typ=crd->var_typ; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->dmn_id=crd->dmn_id; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->grp_dpt=crd->grp_dpt; /* MSA */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.NON_HYP_DMN=crd->lmt_msa.NON_HYP_DMN; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.dmn_cnt=crd->lmt_msa.dmn_cnt; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.dmn_nm=(char *)strdup(crd->lmt_msa.dmn_nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.dmn_sz_org=crd->lmt_msa.dmn_sz_org; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.lmt_crr=crd->lmt_msa.lmt_crr; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.lmt_dmn=NULL; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.lmt_dmn_nbr=0; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.MSA_USR_RDR=crd->lmt_msa.MSA_USR_RDR; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].crd->lmt_msa.WRP=crd->lmt_msa.WRP; }else{ if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: INFO %s reports dimension [%d]%s of variable <%s> with out-of-scope coordinate\n",nco_prg_nm_get(),fnc_nm,idx_dmn_var,var_trv.var_dmn[idx_dmn_var].dmn_nm_fll,var_trv.nm_fll); /* Mark as False */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_crd_var=False; /* Store the unique dimension as if it was a non coordinate */ /* Deep-copy dimension */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd=(dmn_trv_sct *)nco_malloc(sizeof(dmn_trv_sct)); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->grp_nm_fll=(char *)strdup(dmn_trv->grp_nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->nm_fll=(char *)strdup(dmn_trv->nm_fll); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->nm=(char *)strdup(dmn_trv->nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->crd=NULL; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->crd_nbr=0; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->dmn_id=dmn_trv->dmn_id; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->flg_xtr=dmn_trv->flg_xtr; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->has_crd_scp=dmn_trv->has_crd_scp; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->is_rec_dmn=dmn_trv->is_rec_dmn; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->sz=dmn_trv->sz; /* MSA */ trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.NON_HYP_DMN=dmn_trv->lmt_msa.NON_HYP_DMN; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_cnt=dmn_trv->lmt_msa.dmn_cnt; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_nm=(char *)strdup(dmn_trv->lmt_msa.dmn_nm); trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_sz_org=dmn_trv->lmt_msa.dmn_sz_org; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_crr=dmn_trv->lmt_msa.lmt_crr; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_dmn=NULL; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.lmt_dmn_nbr=0; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.MSA_USR_RDR=dmn_trv->lmt_msa.MSA_USR_RDR; trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].ncd->lmt_msa.WRP=dmn_trv->lmt_msa.WRP; } /* None was found in-scope */ } /* There are coordinates; one must be chosen */ } /* Loop dimensions for object (variable) */ } /* Filter variables */ } /* Loop table */ /* Check if bool array is all filled */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++) if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var) for(int idx_dmn_var=0;idx_dmn_varlst[idx_var].nbr_dmn;idx_dmn_var++) if(trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_crd_var == nco_obj_typ_err) if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: OOPSY %s reports variable <%s> with NOT filled dimension [%d]%s\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_var].nm_fll,idx_dmn_var,trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].dmn_nm_fll); /* Check if bool array is all filled */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++) if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var) for(int idx_dmn_var=0;idx_dmn_varlst[idx_var].nbr_dmn;idx_dmn_var++) assert(trv_tbl->lst[idx_var].var_dmn[idx_dmn_var].is_crd_var != nco_obj_typ_err); #ifdef DEBUG_LEAKS if(nco_dbg_lvl_get() >= nco_dbg_sup)(void)fprintf(stdout,"%s: %s DEBUG %d crd",nco_prg_nm_get(),fnc_nm,crt_counter); #endif } /* nco_bld_var_dmn() */ void nco_wrt_trv_tbl /* [fnc] Obtain file information from GTT (Group Traversal Table) for debugging */ (const int nc_id, /* I [ID] File ID */ const trv_tbl_sct * const trv_tbl, /* I [sct] GTT (Group Traversal Table) */ nco_bool use_flg_xtr) /* I [flg] Use flg_xtr in selection */ { const char fnc_nm[]="nco_wrt_trv_tbl()"; /* [sng] Function name */ int nbr_dmn_var; /* [nbr] Number of variables in group */ int grp_id; /* [id] Group ID */ int var_id; /* [id] Variable ID */ int *dmn_id_var; /* [id] Dimensions IDs array for variable */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; nco_bool flg_xtr; if(use_flg_xtr)flg_xtr=var_trv.flg_xtr; else flg_xtr=True; /* If object is an extracted variable... */ if(var_trv.nco_typ == nco_obj_typ_var && flg_xtr){ if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: INFO %s variable <%s>",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll); } /* endif dbg */ /* Obtain group ID where variable is located */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Obtain variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Get type of variable and number of dimensions */ (void)nco_inq_var(grp_id,var_id,(char *)NULL,(nc_type *)NULL,&nbr_dmn_var,(int *)NULL,(int *)NULL); /* Alloc dimension IDs array */ dmn_id_var=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); /* Get dimension IDs for variable */ (void)nco_inq_vardimid(grp_id,var_id,dmn_id_var); if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout," %d dimensions: ",nbr_dmn_var); /* Variable dimensions */ for(int idx_dmn_var=0;idx_dmn_varnco_typ == nco_obj_typ_var); if(*rec_dmn_nm){ nbr_rec=(*rec_dmn_nm)->nbr; } else { nbr_rec=0; (*rec_dmn_nm)=(nm_lst_sct *)nco_malloc(sizeof(nm_lst_sct)); (*rec_dmn_nm)->nbr=0; (*rec_dmn_nm)->lst=NULL; /* Must be NULL to nco_realloc() correct handling */ } /* Loop dimensions for object (variable) */ for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++) { /* Get unique dimension object from unique dimension ID, in input list */ dmn_trv=nco_dmn_trv_sct(var_trv->var_dmn[idx_dmn].dmn_id,trv_tbl); /* Dimension is a record dimension */ if(dmn_trv->is_rec_dmn){ /* Add one more element to table (nco_realloc nicely handles first time/not first time insertions) */ (*rec_dmn_nm)->lst=(nm_sct *)nco_realloc((*rec_dmn_nm)->lst,(nbr_rec+1)*sizeof(nm_sct)); /* Duplicate string into list */ (*rec_dmn_nm)->lst[nbr_rec].nm=strdup(dmn_trv->nm); nbr_rec++; } /* Dimension is a record dimension */ } /* Loop dimensions for object (variable) */ if(*rec_dmn_nm) (*rec_dmn_nm)->nbr=nbr_rec; } /* nco_get_rec_dmn_nm() */ var_sct ** /* O [sct] Variable list */ nco_fll_var_trv /* [fnc] Fill-in variable structure list for all extracted variables */ (const int nc_id, /* I [id] netCDF file ID */ int * const xtr_nbr, /* I/O [nbr] Number of variables in extraction list */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { int grp_id; /* [ID] Group ID */ int var_id; /* [ID] Variable ID */ int idx_var; int nbr_xtr; var_sct **var=NULL; nbr_xtr=0; /* Loop table */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Filter variables to extract */ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && trv_tbl->lst[tbl_idx].flg_xtr){ nbr_xtr++; } /* Filter variables */ } /* Loop table */ /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(nbr_xtr*sizeof(var_sct *)); idx_var=0; /* Loop table */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Filter variables */ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && trv_tbl->lst[tbl_idx].flg_xtr){ trv_sct var_trv=trv_tbl->lst[tbl_idx]; /* Obtain group ID from API */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Get variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Transfer from table to local variable array; nco_var_fll() needs location ID and name */ var[idx_var]=nco_var_fll_trv(grp_id,var_id,&var_trv,trv_tbl); idx_var++; } /* Filter variables */ } /* Loop table */ *xtr_nbr=nbr_xtr; return var; } /* nco_fll_var_trv() */ var_sct ** /* O [sct] Variable list */ nco_var_trv /* [fnc] Fill-in variable structure list for all variables named "var_nm" */ (const int nc_id, /* I [id] netCDF file ID */ const char * const var_nm, /* I [sng] Variable name (relative) */ int * const xtr_nbr, /* I/O [nbr] Number of variables in extraction list */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { int idx_var; int nbr_xtr; var_sct **var=NULL; nbr_xtr=0; /* Loop table */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Filter variables to extract */ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && (strcmp(trv_tbl->lst[tbl_idx].nm,var_nm) == 0) ){ nbr_xtr++; } /* Filter variables */ } /* Loop table */ /* Fill-in variable structure list for all extracted variables */ var=(var_sct **)nco_malloc(nbr_xtr*sizeof(var_sct *)); idx_var=0; /* Loop table */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ /* Filter variables */ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && (strcmp(trv_tbl->lst[tbl_idx].nm,var_nm) == 0) ){ trv_sct var_trv=trv_tbl->lst[tbl_idx]; int grp_id; /* [ID] Group ID */ int var_id; /* [ID] Variable ID */ /* Obtain group ID from API */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Get variable ID */ (void)nco_inq_varid(grp_id,var_trv.nm,&var_id); /* Transfer from table to local variable array; nco_var_fll() needs location ID and name */ var[idx_var]=nco_var_fll_trv(grp_id,var_id,&var_trv,trv_tbl); idx_var++; } /* Filter variables */ } /* Loop table */ *xtr_nbr=nbr_xtr; return var; } /* nco_var_trv() */ void nco_cpy_fix_var_trv /* [fnc] Copy fixed variables from input to output file */ (const int nc_id, /* I [ID] netCDF input file ID */ const int out_id, /* I [ID] netCDF output file ID */ const gpe_sct * const gpe, /* I [sng] GPE structure */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { char *grp_out_fll; /* [sng] Group name */ int grp_id_in; /* [ID] Group ID */ int grp_id_out; /* [ID] Group ID */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ /* Loop table */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* If object is a fixed variable... */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.enm_prc_typ == fix_typ){ /* If variable is an ensemble member, do not create it in the same location as input */ if(var_trv.flg_nsm_mbr){ assert(nco_prg_id_get() == ncge); continue; } /* endif */ /* Obtain group IDs */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id_in); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,var_trv.grp_nm_fll); else grp_out_fll=(char *)strdup(var_trv.grp_nm_fll); (void)nco_inq_grp_full_ncid(out_id,grp_out_fll,&grp_id_out); if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: INFO writing fixed variable <%s> from ",nco_prg_nm_get(),var_trv.nm_fll); (void)nco_prn_grp_nm_fll(grp_id_in); (void)fprintf(stdout," to "); (void)nco_prn_grp_nm_fll(grp_id_out); (void)fprintf(stdout,"\n"); } /* endif dbg */ /* Copy variable data */ (void)nco_cpy_var_val_mlt_lmt_trv(grp_id_in,grp_id_out,(FILE *)NULL,md5,&var_trv); /* Memory management after current extracted group */ if(grp_out_fll) grp_out_fll=(char *)nco_free(grp_out_fll); } /* If object is a fixed variable... */ } /* Loop table */ } /* nco_cpy_fix_var_trv() */ void nco_prc_cmn /* [fnc] Process objects (ncbo only) */ (const int nc_id_1, /* I [id] netCDF input-file ID */ const int nc_id_2, /* I [id] netCDF input-file ID */ const int nc_out_id, /* I [id] netCDF output-file ID */ const cnk_sct * const cnk, /* I [sct] Chunking structure */ const int dfl_lvl, /* I [enm] Deflate level [0..9] */ const gpe_sct * const gpe, /* I [sct] GPE structure */ gpe_nm_sct *gpe_nm, /* I/O [sct] GPE name duplicate check array */ int nbr_gpe_nm, /* I/O [nbr] Number of GPE entries */ const nco_bool CNV_CCM_CCSM_CF, /* I [flg] File adheres to NCAR CCM/CCSM/CF conventions */ const nco_bool FIX_REC_CRD, /* I [flg] Do not interpolate/multiply record coordinate variables (ncflint only) */ CST_X_PTR_CST_PTR_CST_Y(dmn_sct,dmn_xcl), /* I [sct] Dimensions not allowed in fixed variables */ const int nbr_dmn_xcl, /* I [nbr] Number of altered dimensions */ const int nco_op_typ, /* I [enm] Operation type (command line -y) */ trv_sct * trv_1, /* I [sct] Table object */ trv_sct * trv_2, /* I [sct] Table object */ trv_tbl_sct * const trv_tbl_1, /* I/O [sct] GTT (Group Traversal Table) */ trv_tbl_sct * const trv_tbl_2, /* I/O [sct] GTT (Group Traversal Table) */ const nco_bool flg_grp_1, /* I [flg] Use table 1 as template for group creation on True, otherwise use table 2 */ const nco_bool flg_dfn) /* I [flg] Action type (True for define variables, False when write variables ) */ { const char fnc_nm[]="nco_prc_cmn()"; /* [sng] Function name */ char *grp_out_fll; /* [sng] Group name */ int fl_fmt; /* [enm] netCDF file format */ int grp_id_1; /* [id] Group ID in input file */ int grp_id_2; /* [id] Group ID in input file */ int grp_out_id; /* [id] Group ID in output file */ int nco_prg_id; /* [enm] Program ID */ int var_id_1; /* [id] Variable ID in input file */ int var_id_2; /* [id] Variable ID in input file */ int var_out_id; /* [id] Variable ID in output file */ var_sct *var_prc_1=NULL; /* [sct] Variable to process in file 1 */ var_sct *var_prc_2=NULL; /* [sct] Variable to process in file 2 */ var_sct *var_prc_out=NULL; /* [sct] Variable to process in output */ var_sct *var_prc_gtr; /* [sct] Greater rank variable to process */ var_sct *var_prc_lsr; /* [sct] Lesser rank variable to process */ nco_bool RNK_1_GTR; /* [flg] Rank of variable in file 1 variable greater than or equal to file 2 */ prc_typ_enm prc_typ_1; /* [enm] Processing type */ prc_typ_enm prc_typ_2; /* [enm] Processing type */ assert(trv_1->nco_typ == nco_obj_typ_var); assert(trv_1->flg_xtr); assert(trv_2->nco_typ == nco_obj_typ_var); assert(trv_2->flg_xtr); /* Get Program ID */ nco_prg_id=nco_prg_id_get(); assert(nco_prg_id == ncbo); /* Get output file format */ (void)nco_inq_format(nc_out_id,&fl_fmt); /* Edit group name for output */ if(flg_grp_1){ if(gpe) grp_out_fll=nco_gpe_evl(gpe,trv_1->grp_nm_fll); else grp_out_fll=(char *)strdup(trv_1->grp_nm_fll); }else{ /* !flg_grp_1 */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,trv_2->grp_nm_fll); else grp_out_fll=(char *)strdup(trv_2->grp_nm_fll); } /* !flg_grp_1 */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id_1,trv_1->grp_nm_fll,&grp_id_1); (void)nco_inq_grp_full_ncid(nc_id_2,trv_2->grp_nm_fll,&grp_id_2); /* Get variable ID */ (void)nco_inq_varid(grp_id_1,trv_1->nm,&var_id_1); (void)nco_inq_varid(grp_id_2,trv_2->nm,&var_id_2); /* Allocate variable structure and fill with metadata */ var_prc_1=nco_var_fll_trv(grp_id_1,var_id_1,trv_1,trv_tbl_1); var_prc_2=nco_var_fll_trv(grp_id_2,var_id_2,trv_2,trv_tbl_2); if(var_prc_1->nbr_dim >= var_prc_2->nbr_dim) RNK_1_GTR=True; else RNK_1_GTR=False; var_prc_gtr= (RNK_1_GTR) ? var_prc_1 : var_prc_2; var_prc_lsr= (RNK_1_GTR) ? var_prc_2 : var_prc_1; var_prc_out= (RNK_1_GTR) ? nco_var_dpl(var_prc_1) : nco_var_dpl(var_prc_2); /* Get processing type */ (void)nco_var_lst_dvd_trv(var_prc_1,var_prc_out,CNV_CCM_CCSM_CF,FIX_REC_CRD,nco_pck_map_nil,nco_pck_plc_nil,dmn_xcl,nbr_dmn_xcl,&prc_typ_1); (void)nco_var_lst_dvd_trv(var_prc_2,var_prc_out,CNV_CCM_CCSM_CF,FIX_REC_CRD,nco_pck_map_nil,nco_pck_plc_nil,dmn_xcl,nbr_dmn_xcl,&prc_typ_2); /* Conform type and rank for processed variables */ if(prc_typ_1 == prc_typ && prc_typ_2 == prc_typ){ int dmn_idx_gtr; int dmn_idx_lsr; /* Check that all dims in var_prc_lsr are in var_prc_gtr */ for(dmn_idx_lsr=0;dmn_idx_lsrnbr_dim;dmn_idx_lsr++){ for(dmn_idx_gtr=0;dmn_idx_gtrnbr_dim;dmn_idx_gtr++) if(!strcmp(var_prc_lsr->dim[dmn_idx_lsr]->nm,var_prc_gtr->dim[dmn_idx_gtr]->nm)) break; if(dmn_idx_gtr == var_prc_gtr->nbr_dim){ (void)fprintf(stdout,"%s: ERROR Variables do not conform: variable %s has dimension %s not present in variable %s\n",nco_prg_nm_get(),var_prc_lsr->nm,var_prc_lsr->dim[dmn_idx_lsr]->nm,var_prc_gtr->nm); nco_exit(EXIT_FAILURE); } /* endif error */ } /* end loop over idx */ /* Read */ (void)nco_msa_var_get_trv(nc_id_1,var_prc_1,trv_tbl_1); (void)nco_msa_var_get_trv(nc_id_2,var_prc_2,trv_tbl_2); nc_type typ_hgh; typ_hgh=ncap_typ_hgh(var_prc_1->type,var_prc_2->type); /* Make sure variables conform in type */ if(var_prc_1->type != var_prc_2->type) if(nco_dbg_lvl_get() >= nco_dbg_std && flg_dfn) (void)fprintf(stderr,"%s: INFO Input variables do not conform in type: file 1 variable %s has type %s, file 2 variable %s has type %s, output variable %s will have type %s\n",nco_prg_nm_get(),var_prc_1->nm,nco_typ_sng(var_prc_1->type),var_prc_2->nm,nco_typ_sng(var_prc_2->type),var_prc_gtr->nm,nco_typ_sng(typ_hgh)); typ_hgh=ncap_var_retype(var_prc_1,var_prc_2); trv_1->var_typ=trv_2->var_typ=typ_hgh; /* Broadcast lesser to greater variable. NB: Pointers may change so _gtr, _lsr not valid */ if(var_prc_1->nbr_dim != var_prc_2->nbr_dim){ (void)ncap_var_cnf_dmn(&var_prc_1,&var_prc_2); }else{ /* Still possible that variables are mismatched even if ranks are equal One or more dimensions could be degenerate Before subtraction must make sure dimension sizes match Or re-code ncap_var_cnf_dmn() so that it understands how to broadcast degenerate dimensions */ for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ if(var_prc_1->dim[idx_dmn]->sz != var_prc_2->dim[idx_dmn]->sz){ (void)fprintf(stdout,"%s: ERROR Variables do not conform: variable %s has dimension %s with sizes %ld and %ld in input files one and two, respectively\n",nco_prg_nm_get(),var_prc_1->nm_fll,var_prc_1->dim[idx_dmn]->nm,var_prc_1->dim[idx_dmn]->sz,var_prc_2->dim[idx_dmn]->sz); nco_exit(EXIT_FAILURE); } /* endif error */ } /* end loop over idx_dmn */ } /* end else */ /* var1 and var2 now conform in size and type to eachother and are in memory */ assert(var_prc_1->type == var_prc_2->type); assert(trv_1->var_typ == trv_2->var_typ); assert(trv_1->var_typ == var_prc_1->type); } /* Conform type and rank for process variables */ /* Define mode */ if(flg_dfn){ char *rec_dmn_nm=NULL; /* [sng] Record dimension name */ nm_lst_sct *rec_dmn_nm_1=NULL; /* [sct] Record dimension names array */ nm_lst_sct *rec_dmn_nm_2=NULL; /* [sct] Record dimension names array */ nco_bool PCK_ATT_CPY; /* [flg] Copy attributes "scale_factor", "add_offset" */ PCK_ATT_CPY=nco_pck_cpy_att(nco_prg_id,nco_pck_plc_nil,var_prc_1); /* If output group does not exist, create it */ if(nco_inq_grp_full_ncid_flg(nc_out_id,grp_out_fll,&grp_out_id)) nco_def_grp_full(nc_out_id,grp_out_fll,&grp_out_id); /* Detect duplicate GPE names in advance, then exit with helpful error */ if(gpe) (void)nco_gpe_chk(grp_out_fll,trv_1->nm,&gpe_nm,&nbr_gpe_nm); /* Get array of record names for object */ (void)nco_get_rec_dmn_nm(trv_1,trv_tbl_1,&rec_dmn_nm_1); (void)nco_get_rec_dmn_nm(trv_2,trv_tbl_2,&rec_dmn_nm_2); /* Use for record dimension name the first in array */ if(rec_dmn_nm_1->lst) rec_dmn_nm=(char *)strdup(rec_dmn_nm_1->lst[0].nm); if(!rec_dmn_nm && rec_dmn_nm_2->lst) rec_dmn_nm=(char *)strdup(rec_dmn_nm_2->lst[0].nm); /* Define variable in output file */ if(RNK_1_GTR) var_out_id=nco_cpy_var_dfn_trv(nc_id_1,nc_out_id,cnk,grp_out_fll,dfl_lvl,gpe,rec_dmn_nm,trv_1,NULL,0,trv_tbl_1); else var_out_id=nco_cpy_var_dfn_trv(nc_id_2,nc_out_id,cnk,grp_out_fll,dfl_lvl,gpe,rec_dmn_nm,trv_2,NULL,0,trv_tbl_2); /* Copy variable's attributes */ if(RNK_1_GTR) (void)nco_att_cpy(grp_id_1,grp_out_id,var_id_1,var_out_id,PCK_ATT_CPY); else (void)nco_att_cpy(grp_id_2,grp_out_id,var_id_2,var_out_id,PCK_ATT_CPY); /* Memory management for record dimension names */ if(rec_dmn_nm) rec_dmn_nm=(char *)nco_free(rec_dmn_nm); if(rec_dmn_nm_1){ for(int idx=0;idxnbr;idx++) rec_dmn_nm_1->lst[idx].nm=(char *)nco_free(rec_dmn_nm_1->lst[idx].nm); rec_dmn_nm_1=(nm_lst_sct *)nco_free(rec_dmn_nm_1); } /* !rec_dmn_nm_1 */ if(rec_dmn_nm_2){ for(int idx=0;idxnbr;idx++) rec_dmn_nm_2->lst[idx].nm=(char *)nco_free(rec_dmn_nm_2->lst[idx].nm); rec_dmn_nm_2=(nm_lst_sct *)nco_free(rec_dmn_nm_2); } /* !rec_dmn_nm_2 */ }else{ /* !flg_dfn */ /* Write mode */ int has_mss_val; /* [flg] Variable has missing value */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ ptr_unn mss_val; /* [sct] Missing value */ /* Get group ID */ (void)nco_inq_grp_full_ncid(nc_out_id,grp_out_fll,&grp_out_id); /* Get variable ID */ (void)nco_inq_varid(grp_out_id,trv_1->nm,&var_out_id); if(nco_dbg_lvl_get() >= nco_dbg_vrb) (void)fprintf(stdout,"%s: INFO %s reports operation type %d for %s\n",nco_prg_nm_get(),fnc_nm,prc_typ_1,trv_1->nm_fll); /* Non-processed variable */ if(prc_typ_1 == fix_typ || prc_typ_2 == fix_typ){ if(RNK_1_GTR) (void)nco_cpy_var_val_mlt_lmt_trv(grp_id_1,grp_out_id,(FILE *)NULL,md5,trv_1); else (void)nco_cpy_var_val_mlt_lmt_trv(grp_id_2,grp_out_id,(FILE *)NULL,md5,trv_2); } /* endif fix */ /* Processed variable */ if(prc_typ_1 == prc_typ && prc_typ_2 == prc_typ){ var_prc_out->id=var_out_id; /* fxm: gtr or lsr? */ for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ var_prc_out->srt[idx_dmn]=var_prc_gtr->srt[idx_dmn]; var_prc_out->cnt[idx_dmn]=var_prc_gtr->cnt[idx_dmn]; } /* endfor */ /* Set missing value */ has_mss_val=var_prc_gtr->has_mss_val; /* Change missing_value, if any, of lesser rank to missing_value, if any, of greater rank */ if(RNK_1_GTR) has_mss_val=nco_mss_val_cnf(var_prc_1,var_prc_2); else has_mss_val=nco_mss_val_cnf(var_prc_2,var_prc_1); /* mss_val of larger rank, if any, overrides mss_val of smaller rank */ if(has_mss_val) mss_val= (RNK_1_GTR) ? var_prc_1->mss_val : var_prc_2->mss_val; /* Perform specified binary operation */ switch(nco_op_typ){ case nco_op_add: /* [enm] Add file_1 to file_2 */ (void)nco_var_add(var_prc_1->type,var_prc_1->sz,has_mss_val,mss_val,var_prc_2->val,var_prc_1->val); break; case nco_op_mlt: /* [enm] Multiply file_1 by file_2 */ (void)nco_var_mlt(var_prc_1->type,var_prc_1->sz,has_mss_val,mss_val,var_prc_2->val,var_prc_1->val); break; case nco_op_dvd: /* [enm] Divide file_1 by file_2 */ (void)nco_var_dvd(var_prc_1->type,var_prc_1->sz,has_mss_val,mss_val,var_prc_2->val,var_prc_1->val); break; case nco_op_sbt: /* [enm] Subtract file_2 from file_1 */ (void)nco_var_sbt(var_prc_1->type,var_prc_1->sz,has_mss_val,mss_val,var_prc_2->val,var_prc_1->val); break; default: /* Other defined nco_op_typ values are valid for ncra(), ncrcat(), ncwa(), not ncbo() */ (void)fprintf(stdout,"%s: ERROR Illegal nco_op_typ in binary operation\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); break; } /* end case */ if(trv_1->ppc != NC_MAX_INT){ if(trv_1->flg_nsd) (void)nco_ppc_bitmask(trv_1->ppc,var_prc_1->type,var_prc_out->sz,var_prc_out->has_mss_val,var_prc_out->mss_val,var_prc_1->val); else (void)nco_ppc_around(trv_1->ppc,var_prc_1->type,var_prc_out->sz,var_prc_out->has_mss_val,var_prc_out->mss_val,var_prc_1->val); } /* endif ppc */ if(nco_is_xcp(trv_1->nm)) nco_xcp_prc(trv_1->nm,var_prc_1->type,var_prc_out->sz,(char *)var_prc_1->val.vp); /* Copy result to output file */ if(var_prc_1->nbr_dim == 0) (void)nco_put_var1(grp_out_id,var_prc_out->id,var_prc_out->srt,var_prc_1->val.vp,var_prc_1->type); else (void)nco_put_vara(grp_out_id,var_prc_out->id,var_prc_out->srt,var_prc_out->cnt,var_prc_1->val.vp,var_prc_1->type); } /* !prc_typ */ } /* !flg_dfn */ for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ var_prc_1->dim[idx_dmn]->xrf=(dmn_sct *)nco_dmn_free(var_prc_1->dim[idx_dmn]->xrf); var_prc_1->dim[idx_dmn]=(dmn_sct *)nco_dmn_free(var_prc_1->dim[idx_dmn]); } /* endfor */ /* Free allocated variable structures */ var_prc_out=(var_sct *)nco_var_free(var_prc_out); var_prc_1=(var_sct *)nco_var_free(var_prc_1); var_prc_2=(var_sct *)nco_var_free(var_prc_2); /* Free output path name */ grp_out_fll=(char *)nco_free(grp_out_fll); } /* nco_prc_cmn() */ void nco_cpy_fix /* [fnc] Copy fixed object (ncbo only) */ (const int nc_id_1, /* I [id] netCDF input-file ID */ const int nc_out_id, /* I [id] netCDF output-file ID */ const cnk_sct * const cnk, /* I [sct] Chunking structure */ const int dfl_lvl, /* I [enm] Deflate level [0..9] */ const gpe_sct * const gpe, /* I [sct] GPE structure */ gpe_nm_sct *gpe_nm, /* I/O [sct] GPE name duplicate check array */ int nbr_gpe_nm, /* I/O [nbr] Number of GPE entries */ const nco_bool CNV_CCM_CCSM_CF, /* I [flg] File adheres to NCAR CCM/CCSM/CF conventions */ const nco_bool FIX_REC_CRD, /* I [flg] Do not interpolate/multiply record coordinate variables (ncflint only) */ CST_X_PTR_CST_PTR_CST_Y(dmn_sct,dmn_xcl), /* I [sct] Dimensions not allowed in fixed variables */ const int nbr_dmn_xcl, /* I [nbr] Number of altered dimensions */ trv_sct *trv_1, /* I/O [sct] Table object (nco_cpy_var_dfn_trv) */ trv_tbl_sct * const trv_tbl_1, /* I/O [sct] GTT (Group Traversal Table) */ const nco_bool flg_dfn) /* I [flg] Action type (True for define variables, False when write variables ) */ { char *grp_out_fll; /* [sng] Group name */ int fl_fmt; /* [enm] netCDF file format */ int grp_id_1; /* [id] Group ID in input file */ int grp_out_id; /* [id] Group ID in output file */ int nco_prg_id; /* [enm] Program ID */ int var_id_1; /* [id] Variable ID in input file */ int var_out_id; /* [id] Variable ID in output file */ md5_sct *md5=NULL; /* [sct] MD5 configuration */ var_sct *var_prc_1; /* [sct] Variable to process in file 1 */ var_sct *var_prc_out; /* [sct] Variable to process in output */ prc_typ_enm prc_typ_1; /* [enm] Processing type */ assert(trv_1->nco_typ == nco_obj_typ_var); assert(trv_1->flg_xtr); /* Get Program ID */ nco_prg_id=nco_prg_id_get(); /* Get output file format */ (void)nco_inq_format(nc_out_id,&fl_fmt); /* Edit group name for output */ if(gpe) grp_out_fll=nco_gpe_evl(gpe,trv_1->grp_nm_fll); else grp_out_fll=(char *)strdup(trv_1->grp_nm_fll); /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id_1,trv_1->grp_nm_fll,&grp_id_1); /* Get variable ID */ (void)nco_inq_varid(grp_id_1,trv_1->nm,&var_id_1); /* Allocate variable structure and fill with metadata */ var_prc_1=nco_var_fll_trv(grp_id_1,var_id_1,trv_1,trv_tbl_1); var_prc_out=nco_var_dpl(var_prc_1); (void)nco_var_lst_dvd_trv(var_prc_1,var_prc_out,CNV_CCM_CCSM_CF,FIX_REC_CRD,nco_pck_map_nil,nco_pck_plc_nil,dmn_xcl,nbr_dmn_xcl,&prc_typ_1); if(prc_typ_1 != fix_typ){ var_prc_1=(var_sct *)nco_var_free(var_prc_1); var_prc_out=(var_sct *)nco_var_free(var_prc_out); grp_out_fll=(char *)nco_free(grp_out_fll); return; } /* endif */ if(flg_dfn){ /* Define mode */ nco_bool PCK_ATT_CPY; /* [flg] Copy attributes "scale_factor", "add_offset" */ PCK_ATT_CPY=nco_pck_cpy_att(nco_prg_id,nco_pck_plc_nil,var_prc_1); /* If output group does not exist, create it */ if(nco_inq_grp_full_ncid_flg(nc_out_id,grp_out_fll,&grp_out_id)) nco_def_grp_full(nc_out_id,grp_out_fll,&grp_out_id); /* Detect duplicate GPE names in advance, then exit with helpful error */ if(gpe)(void)nco_gpe_chk(grp_out_fll,trv_1->nm,&gpe_nm,&nbr_gpe_nm); /* Define variable in output file */ var_out_id=nco_cpy_var_dfn_trv(nc_id_1,nc_out_id,cnk,grp_out_fll,dfl_lvl,gpe,(char *)NULL,trv_1,NULL,0,trv_tbl_1); /* Copy variable's attributes */ (void)nco_att_cpy(grp_id_1,grp_out_id,var_id_1,var_out_id,PCK_ATT_CPY); }else{ /* !flg_dfn */ /* Write mode */ /* Get group ID */ (void)nco_inq_grp_full_ncid(nc_out_id,grp_out_fll,&grp_out_id); /* Get variable ID */ (void)nco_inq_varid(grp_out_id,trv_1->nm,&var_out_id); /* Copy non-processed variable */ (void)nco_cpy_var_val_mlt_lmt_trv(grp_id_1,grp_out_id,(FILE *)NULL,md5,trv_1); } /* !flg_dfn */ /* Free allocated variable structures */ var_prc_1=(var_sct *)nco_var_free(var_prc_1); var_prc_out=(var_sct *)nco_var_free(var_prc_out); /* Free output path name */ grp_out_fll=(char *)nco_free(grp_out_fll); } /* nco_cpy_fix() */ nco_bool /* O [flg] Copy packing attributes */ nco_pck_cpy_att /* [fnc] Inquire about copying packing attributes */ (const int nco_prg_id, /* I [enm] Program ID */ const int nco_pck_plc, /* I [enm] Packing policy */ const var_sct * const var_prc) /* I [sct] Variable */ { nco_bool PCK_ATT_CPY=True; /* [flg] Copy attributes "scale_factor", "add_offset" */ /* Copy all attributes except in cases where packing/unpacking is involved 0. Variable is unpacked on input, unpacked on output --> Copy all attributes 1. Variable is packed on input, is not altered, and remains packed on output --> Copy all attributes 2. Variable is packed on input, is unpacked for some reason, and will be unpacked on output --> Copy all attributes except scale_factor and add_offset 3. Variable is packed on input, is unpacked for some reason, and will be packed on output (possibly with new packing attributes) --> Copy all attributes, but scale_factor and add_offset must be overwritten later with new values 4. Variable is not packed on input, packing is performed, and output is packed --> Copy all attributes, define dummy values for scale_factor and add_offset now, and write those values later, when they are known */ /* Do not copy packing attributes "scale_factor" and "add_offset" if variable is packed in input file and unpacked in output file Arithmetic operators calling nco_var_dfn() with fixed variables should leave them fixed Currently ncap calls nco_var_dfn() only for fixed variables, so handle exception with ncap-specific condition */ /* Copy exising packing attributes, if any, unless... */ if(nco_is_rth_opr(nco_prg_id) && /* ...operator is arithmetic... */ nco_prg_id != ncap && /* ...and is not ncap (hence it must be, e.g., ncra, ncbo)... */ !var_prc->is_fix_var && /* ...and variable is processed (not fixed)... */ var_prc->pck_dsk) /* ...and variable is packed in input file... */ PCK_ATT_CPY=False; /* Do not copy packing attributes when unpacking variables ncpdq is currently only operator that passes values other than nco_pck_plc_nil */ if(nco_pck_plc == nco_pck_plc_upk) /* ...and variable will be _unpacked_ ... */ PCK_ATT_CPY=False; return PCK_ATT_CPY; } /* nco_pck_cpy_att() */ void nco_var_prc_fix_trv /* [fnc] Store processed and fixed variables info into GTT */ (const int nbr_var_prc, /* I [nbr] Number of processed variables */ var_sct **var_prc, /* I [sct] Array of processed variables */ const int nbr_var_fix, /* I [nbr] Number of fixed variables */ var_sct **var_fix, /* I [sct] Array of fixed variables */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Store processed and fixed variables info into GTT */ /* Store processed variables info into table */ for(int idx_var=0;idx_varnm_fll,prc_typ,trv_tbl); /* Store fixed variables info into table */ for(int idx_var=0;idx_varnm_fll,fix_typ,trv_tbl); return; } /* end nco_var_prc_fix_trv() */ void nco_var_typ_trv /* [fnc] Transfer variable type into GTT */ (const int prc_nbr, /* I [nbr] Number of processed variables */ CST_X_PTR_CST_PTR_CST_Y(var_sct,var), /* I [sct] Array of extracted variables */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Transfer variable type to table */ /* Loop table. */ for(int idx_var=0;idx_varnbr;idx_tbl++){ if(!strcmp(var[idx_var]->nm_fll,trv_tbl->lst[idx_tbl].nm_fll)){ trv_tbl->lst[idx_tbl].var_typ_out=typ_out; break; } /* Match */ } /* Mark output type in table for "nm_fll" */ } /* Loop table. */ return; } /* end nco_var_typ_trv() */ var_sct * /* O [sct] Variable structure */ nco_var_fll_trv /* [fnc] Allocate variable structure and fill with metadata */ (const int grp_id, /* I [id] Group ID */ const int var_id, /* I [id] Variable ID */ const trv_sct * const var_trv, /* I [sct] Object to write (variable) */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: Allocate and return a completed var_sct; traversal version of nco_var_fll() */ char dmn_nm[NC_MAX_NAME+1]; /* [sng] Dimension name */ int fl_fmt; /* [enm] File format */ int *dmn_in_id_var; /* [id] Dimension IDs array for variable */ int nco_prg_id; /* [enm] Program ID */ int dmn_id; /* [nbr] Dimension ID */ long dmn_cnt; /* [nbr] Dimensio hyperslabbed count (size) */ long dmn_sz; /* [nbr] Dimension size */ var_sct *var; /* [sct] Variable structure (output) */ dmn_trv_sct *dmn_trv; /* [sct] GTT unique dimension object */ dmn_sct *dim; /* [sct] Dimension structure */ /* Get Program ID */ nco_prg_id=nco_prg_id_get(); assert(var_trv->nco_typ == nco_obj_typ_var); /* Get file format */ (void)nco_inq_format(grp_id,&fl_fmt); /* Allocate space for variable structure */ var=(var_sct *)nco_malloc(sizeof(var_sct)); /* Set defaults for each member of variable structure */ (void)var_dfl_set(var); /* Fill-in known fields */ var->nm=(char *)strdup(var_trv->nm); var->nm_fll=(char *)strdup(var_trv->nm_fll); var->id=var_id; var->nc_id=grp_id; var->is_crd_var=var_trv->is_crd_var; /* Get type and number of dimensions and attributes for variable */ (void)nco_inq_var(var->nc_id,var->id,(char *)NULL,&var->typ_dsk,&var->nbr_dim,(int *)NULL,&var->nbr_att); if(nco_prg_id == ncks) assert(var->typ_dsk == var_trv->var_typ); assert(var->nbr_dim == var_trv->nbr_dmn); assert(var->nbr_att == var_trv->nbr_att); dmn_in_id_var=(int *)nco_malloc(var->nbr_dim*sizeof(int)); /* Get dimension IDs for *variable* */ (void)nco_inq_vardimid(var->nc_id,var->id,dmn_in_id_var); /* Allocate space for dimension information */ if(var->nbr_dim > 0) var->dim=(dmn_sct **)nco_malloc(var->nbr_dim*sizeof(dmn_sct *)); else var->dim=(dmn_sct **)NULL; if(var->nbr_dim > 0) var->dmn_id=(int *)nco_malloc(var->nbr_dim*sizeof(int)); else var->dmn_id=(int *)NULL; if(var->nbr_dim > 0) var->cnk_sz=(size_t *)nco_malloc(var->nbr_dim*sizeof(size_t)); else var->cnk_sz=(size_t *)NULL; if(var->nbr_dim > 0) var->cnt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->cnt=(long *)NULL; if(var->nbr_dim > 0) var->srt=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srt=(long *)NULL; if(var->nbr_dim > 0) var->end=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->end=(long *)NULL; if(var->nbr_dim > 0) var->srd=(long *)nco_malloc(var->nbr_dim*sizeof(long)); else var->srd=(long *)NULL; /* Get dimension IDs from input file */ (void)nco_inq_vardimid(var->nc_id,var->id,var->dmn_id); /* Size defaults to 1 in var_dfl_set(), and set to 1 here for extra safety */ var->sz=1L; var->sz_rec=1L; /* Uninitialized values */ var->cid=-1; var->fmt[0]='\0'; /* Loop dimensions */ for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Dimension ID for variable, used to get dimension object in input list */ dmn_id=dmn_in_id_var[idx_dmn]; assert(var->dmn_id[idx_dmn] == dmn_id); /* Get unique dimension object from unique dimension ID, in input list */ dmn_trv=nco_dmn_trv_sct(dmn_id,trv_tbl); /* Get dimension name and size from ID in group */ (void)nco_inq_dim(grp_id,dmn_id,dmn_nm,&dmn_sz); assert((size_t)dmn_sz == dmn_trv->sz); assert(!strcmp(dmn_nm,dmn_trv->nm)); /* Get hyperslabbed count */ dmn_cnt=-1L; if(var_trv->var_dmn[idx_dmn].crd) dmn_cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; else if(var_trv->var_dmn[idx_dmn].ncd) dmn_cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; var->cnt[idx_dmn]=dmn_cnt; var->end[idx_dmn]=dmn_cnt-1L; var->srt[idx_dmn]=0L; var->srd[idx_dmn]=1L; var->sz*=dmn_cnt; /* This definition of "is_rec_var" says if any of the dimensions is a record then the variable is marked as so */ if(dmn_trv->is_rec_dmn) var->is_rec_var=True; else var->sz_rec*=var->cnt[idx_dmn]; /* Return a completed dmn_sct, use dimension ID and name from TRV object */ dim=nco_dmn_fll(grp_id,dmn_id,dmn_trv->nm); assert(!strcmp(dim->nm,dmn_trv->nm)); assert((size_t)dim->sz == dmn_trv->sz); assert(dim->id == var->dmn_id[idx_dmn]); /* Set the hyperslabbed size for this dimension */ dim->cnt=dmn_cnt; /* Set the *real* (NB: var->sz is hyperslabbed size) size for this dimension */ dim->sz=dmn_sz; /* Use info from GTT unique dimension */ dim->is_rec_dmn=dmn_trv->is_rec_dmn; /* Use info from GTT variable dimension */ dim->is_crd_dmn=var_trv->var_dmn[idx_dmn].is_crd_var; var->dim[idx_dmn]=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); var->dim[idx_dmn]->nm=(char *)strdup(dim->nm); var->dim[idx_dmn]->nm_fll=NULL; var->dim[idx_dmn]->id=dim->id; var->dim[idx_dmn]->cnk_sz=dim->cnk_sz; var->dim[idx_dmn]->srt=dim->srt; var->dim[idx_dmn]->end=dim->end; var->dim[idx_dmn]->srd=dim->srd; var->dim[idx_dmn]->cnt=dim->cnt; var->dim[idx_dmn]->sz=dmn_sz; var->dim[idx_dmn]->is_rec_dmn=dim->is_rec_dmn; var->dim[idx_dmn]->is_crd_dmn=dim->is_crd_dmn; dim->xrf=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); dim->xrf->nm=(char *)strdup(dim->nm); dim->xrf->id=dim->id; dim->xrf->cnk_sz=dim->cnk_sz; dim->xrf->srt=dim->srt; dim->xrf->end=dim->end; dim->xrf->srd=dim->srd; dim->xrf->cnt=dim->cnt; dim->xrf->sz=dim->sz; dim->xrf->is_rec_dmn=dim->is_rec_dmn; dim->xrf->is_crd_dmn=dim->is_crd_dmn; var->dim[idx_dmn]->xrf=nco_dmn_dpl(dim->xrf); dim->xrf=nco_dmn_free(dim->xrf); dim=nco_dmn_free(dim); } /* Loop dimensions */ /* Type in memory begins as same type as on disk */ /* Type of variable in RAM */ var->type=var->typ_dsk; /* Type of packed data on disk */ /* Type of variable when packed (on disk). This should be same as typ_dsk except in cases where variable is packed in input file and unpacked in output file. */ var->typ_pck=var->type; /* Refresh number of attributes and missing value attribute, if any */ var->has_mss_val=nco_mss_val_get(var->nc_id,var); /* Check variable for duplicate dimensions */ for(int idx_var=0;idx_varnbr_dim;idx_var++){ int idx_dmn; for(idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ if(idx_var != idx_dmn){ if(var->dmn_id[idx_var] == var->dmn_id[idx_dmn]){ /* Dimensions are duplicated when IDs for different ordinal dimensions are equal */ var->has_dpl_dmn=True; break; } /* endif IDs are equal */ } /* endif navel gazing */ } /* endif inner dimension */ /* Found a duplicate, so stop looking */ if(idx_dmn != var->nbr_dim) break; } /* Check variable for duplicate dimensions */ /* Treat variables associated with "bounds", "climatology", and "coordinates" attributes as coordinates */ if(nco_is_spc_in_bnd_att(var->nc_id,var->id)) var->is_crd_var=True; if(nco_is_spc_in_clm_att(var->nc_id,var->id)) var->is_crd_var=True; if(nco_is_spc_in_crd_att(var->nc_id,var->id)) var->is_crd_var=True; /* Portions of variable structure depend on packing properties, e.g., typ_upk nco_pck_dsk_inq() fills in these portions harmlessly */ (void)nco_pck_dsk_inq(grp_id,var); /* Set deflate and chunking to defaults */ var->dfl_lvl=NCO_DFL_LVL_UNDEFINED; /* [enm] Deflate level */ var->shuffle=NC_NOSHUFFLE; /* [flg] Turn on shuffle filter */ for(int idx=0;idxnbr_dim;idx++) var->cnk_sz[idx]=(size_t)0L; /* Read deflate levels and chunking (if any) */ if((nco_fmt_xtn_get() != nco_fmt_xtn_hdf4 || NC_LIB_VERSION >= 433) && (fl_fmt == NC_FORMAT_NETCDF4 || fl_fmt == NC_FORMAT_NETCDF4_CLASSIC)){ int deflate; /* [enm] Deflate filter is on */ int srg_typ; /* [enm] Storage type */ (void)nco_inq_var_deflate(grp_id,var->id,&var->shuffle,&deflate,&var->dfl_lvl); (void)nco_inq_var_chunking(grp_id,var->id,&srg_typ,var->cnk_sz); } /* endif */ /* Get enm_prc_typ from GTT */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ if(!strcmp(var->nm_fll,trv_tbl->lst[idx_tbl].nm_fll)){ if(trv_tbl->lst[idx_tbl].enm_prc_typ == prc_typ) var->is_fix_var=False; else if(trv_tbl->lst[idx_tbl].enm_prc_typ == fix_typ) var->is_fix_var=True; break; } /* endif */ } /* endfor */ var->undefined=False; /* [flg] Used by ncap parser */ dmn_in_id_var=(int *)nco_free(dmn_in_id_var); return var; } /* nco_var_fll_trv() */ int /* O [id] Output file variable ID */ nco_cpy_var_dfn_trv /* [fnc] Define specified variable in output file */ (const int nc_in_id, /* I [ID] netCDF input file ID */ const int nc_out_id, /* I [ID] netCDF output file ID */ const cnk_sct * const cnk, /* I [sct] Chunking structure */ const char * const grp_out_fll, /* I [sng] Output group name */ const int dfl_lvl, /* I [enm] Deflate level [0..9] */ const gpe_sct * const gpe, /* I [sct] GPE structure */ const char * const rec_dmn_nm_cst, /* I [sng] User-specified record dimension, if any, to create or fix in output file */ trv_sct *var_trv, /* I/O [sct] Object to write (variable) trv_map_dmn_set() is O */ dmn_cmn_sct **dmn_cmn_out, /* I/O [sct] List of all dimensions in output file (used for RETAIN_ALL_DIMS) */ int *nbr_dmn_cmn_out, /* I/O [sct] Number of all dimensions in output file (used for RETAIN_ALL_DIMS) */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Copy variable metadata from input netCDF file to output netCDF file Routine was based on nco_cpy_var_dfn_lmt(), and differed trivially from it Routine truncates dimensions in variable definition in output file according to user-specified limits Routine copies variable-by-variable 20130126: csz Behavior until today required rec_dmn_nm even if not changing it As of today, rec_dmn_nm passed only when user-specified Otherwise, re-use old record dimension name 20130222: csz Same routine is called with or without limits Routine works with GTT instead of plain names */ const char fnc_nm[]="nco_cpy_var_dfn_trv()"; /* [sng] Function name */ char *dmn_nm_fll_out=NULL; /* [sng] Full name of dimension in output */ char *grp_dmn_out_fll=NULL; /* [sng] Group name of dimension in output */ char *rec_dmn_nm=NULL; /* [sng] User-specified record dimension name */ char *rec_dmn_nm_mlc=NULL; /* [sng] Local copy of rec_dmn_nm_cst, which may be encoded */ char dmn_nm[NC_MAX_NAME+1]; /* [sng] Dimension name */ char dmn_nm_grp[NC_MAX_NAME+1]; /* [sng] Dimension name for group */ char var_nm[NC_MAX_NAME+1]; /* [sng] Variable name (local copy of object name) */ dmn_cmn_sct dmn_cmn[NC_MAX_DIMS]; /* [sct] Dimension information on output (for a variable) */ dmn_trv_sct *dmn_trv; /* [sct] Unique dimension object */ int *dmn_idx_in_out; /* [idx] Dimension correspondence, input->output (ncpdq) */ int *dmn_in_id_var; /* [id] Dimension IDs array for input variable */ int *dmn_out_id_grp; /* [id] Dimension IDs array in output group */ int *dmn_out_id_tmp; /* [idx] Copy of dmn_out_id (ncpdq) */ int *udm_out_id_grp; /* [enm] Unlimited dimension IDs */ int dmn_id_out; /* [id] Dimension ID defined in outout group */ int dmn_out_id[NC_MAX_DIMS]; /* [id] Dimension IDs array for output variable */ int fl_fmt; /* [enm] Output file format */ int grp_dmn_out_id; /* [id] Group ID where dimension visible to specified group is defined */ int grp_in_id; /* [id] Group ID */ int grp_out_id; /* [id] Group ID */ int idx_dmn_out; /* [idx] Index for output dimensions */ int idx_udm_grp; /* [idx] Index for unlimited dimensions */ int nbr_dmn_out_grp; /* [id] Number of dimensions in group */ int nbr_dmn_var; /* [nbr] Number of dimensions for variable */ int nbr_dmn_var_out; /* [nbr] Number of dimensions for variable on output ( can change for ncwa) */ int nbr_udm_out_grp; /* [nbr] Number of unlimited dimensions */ int nco_prg_id; /* [enm] Program ID */ int rcd=NC_NOERR; /* [rcd] Return code */ int rcd_lcl; /* [rcd] Return code */ int rec_dmn_out_id; /* [id] Record dimension for output variable */ int rec_id_out; /* [id] Dimension ID for ncecat "record" dimension */ int var_dim_id; /* [id] Variable dimension ID */ int var_in_id; /* [id] Variable ID */ int var_out_id; /* [id] Variable ID */ long dmn_cnt=NC_UNLIMITED; /* [nbr] Hyperslabbed size of dimension */ long dmn_sz; /* [nbr] Size of dimension (on input) */ long dmn_sz_grp; /* [sng] Dimension size for group */ nc_type var_typ; /* [enm] netCDF type in input variable (usually same as output) */ nc_type var_typ_out; /* [enm] netCDF type in output variable (usually same as input) */ nco_bool CRR_DMN_IS_REC_IN_INPUT; /* [flg] Current dimension of variable is record dimension of variable in input file/group */ nco_bool DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; /* [flg] Define current dimension as record dimension in output file */ nco_bool FIX_ALL_REC_DMN=False; /* [flg] Fix all record dimensions */ nco_bool FIX_REC_DMN=False; /* [flg] Fix record dimension (opposite of MK_REC_DMN) */ nco_bool NEED_TO_DEFINE_DIM; /* [flg] Dimension needs to be defined in *this* group */ nco_bool DEFINE_DIM[NC_MAX_DIMS]; /* [flg] Defined dimension (always True, except for ncwa) */ rec_dmn_out_id=NCO_REC_DMN_UNDEFINED; for(int idx_dmn=0;idx_dmnnm); /* Initialize output dimensions to input sizes */ for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ /* Dimensions exist */ if(var_trv->var_dmn){ dmn_trv=NULL; /* [sct] Unique dimension */ crd_sct *crd=NULL; /* [sct] Coordinate dimension */ dmn_cmn[idx_dmn].nm_fll=var_trv->var_dmn[idx_dmn].dmn_nm_fll; dmn_cmn[idx_dmn].id=nco_obj_typ_err; /* This dimension has a coordinate variable */ if(var_trv->var_dmn[idx_dmn].is_crd_var){ /* Get coordinate from table */ crd=var_trv->var_dmn[idx_dmn].crd; dmn_cmn[idx_dmn].sz=crd->sz; dmn_cmn[idx_dmn].is_rec_dmn=crd->is_rec_dmn; dmn_cmn[idx_dmn].NON_HYP_DMN=crd->lmt_msa.NON_HYP_DMN; dmn_cmn[idx_dmn].dmn_cnt=crd->lmt_msa.dmn_cnt; strcpy(dmn_cmn[idx_dmn].nm,crd->nm); }else{ /* Get unique dimension from table */ dmn_trv=var_trv->var_dmn[idx_dmn].ncd; dmn_cmn[idx_dmn].sz=dmn_trv->sz; dmn_cmn[idx_dmn].is_rec_dmn=dmn_trv->is_rec_dmn; dmn_cmn[idx_dmn].NON_HYP_DMN=dmn_trv->lmt_msa.NON_HYP_DMN; dmn_cmn[idx_dmn].dmn_cnt=dmn_trv->lmt_msa.dmn_cnt; strcpy(dmn_cmn[idx_dmn].nm,dmn_trv->nm); } /* This dimension has a coordinate variable */ } /* Dimensions exist */ } /* Loop over dimensions */ /* Recall: 1. Dimensions must be defined before variables 2. Variables must be defined before attributes */ /* Get output group ID */ (void)nco_inq_grp_full_ncid(nc_out_id,grp_out_fll,&grp_out_id); /* Is requested variable already in output file? This situation legally occurs with appends, i.e., when -A = FORCE_APPEND is used */ rcd=nco_inq_varid_flg(grp_out_id,var_nm,&var_out_id); if(rcd == NC_NOERR){ /* 20141201: Due diligence to warn user when output type does not match input type Again, this can happen when appending, e.g., from lower-to-higher precision */ (void)nco_inq_vartype(grp_out_id,var_out_id,&var_typ_out); if(var_typ_out != var_trv->var_typ) (void)fprintf(stdout,"%s: WARNING %s reports variable \"%s\" output type = %s does not equal input type = %s. This is legal yet usually ill-advised when appending variables (i.e., with -A). Writing values into slots created for a different type is begging for trouble (e.g., data corruption, truncation, gingivitis).\n",nco_prg_nm_get(),fnc_nm,var_nm,nco_typ_sng(var_typ_out),nco_typ_sng(var_trv->var_typ)); return var_out_id; } /* endif */ /* Get input group ID */ (void)nco_inq_grp_full_ncid(nc_in_id,var_trv->grp_nm_fll,&grp_in_id); /* Is requested variable in input file? */ rcd=nco_inq_varid_flg(grp_in_id,var_nm,&var_in_id); if(rcd != NC_NOERR) (void)fprintf(stdout,"%s: %s reports ERROR unable to find variable \"%s\"\n",nco_prg_nm_get(),fnc_nm,var_nm); /* Get type of variable and number of dimensions from input */ (void)nco_inq_var(grp_in_id,var_in_id,(char *)NULL,&var_typ,&nbr_dmn_var,(int *)NULL,(int *)NULL); /* Get Program ID */ nco_prg_id=nco_prg_id_get(); if(nco_prg_id == ncks) assert(var_typ == var_trv->var_typ); assert(nbr_dmn_var == var_trv->nbr_dmn); nbr_dmn_var_out=nbr_dmn_var; var_typ=var_trv->var_typ; nbr_dmn_var=var_trv->nbr_dmn; /* Alloc array */ dmn_in_id_var=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); dmn_idx_in_out=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); dmn_out_id_tmp=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); /* Get dimension IDs for variable */ (void)nco_inq_vardimid(grp_in_id,var_in_id,dmn_in_id_var); if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: DEBUG %s defining variable <%s> with dimensions: ",nco_prg_nm_get(),fnc_nm,var_trv->nm_fll); for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++) (void)fprintf(stdout,"#%d<%s> : ",var_trv->var_dmn[idx_dmn].dmn_id,var_trv->var_dmn[idx_dmn].dmn_nm); (void)fprintf(stdout,"\n"); } /* endif */ /* Does user want a record dimension to receive special handling? */ if(rec_dmn_nm_cst){ /* Create (and later free()) local copy to preserve const-ness of passed value For simplicity, work with canonical name rec_dmn_nm */ rec_dmn_nm_mlc=strdup(rec_dmn_nm_cst); /* Parse rec_dmn_nm argument */ if(!strcmp("fix_all",rec_dmn_nm_mlc)){ FIX_ALL_REC_DMN=True; FIX_REC_DMN=True; rec_dmn_nm=rec_dmn_nm_mlc+4; }else if(!strncmp("fix_",rec_dmn_nm_mlc,(size_t)4)){ FIX_REC_DMN=True; /* [flg] Fix record dimension */ rec_dmn_nm=rec_dmn_nm_mlc+4; }else{ FIX_REC_DMN=False; /* [flg] Fix record dimension */ rec_dmn_nm=rec_dmn_nm_mlc; } /* strncmp() */ } /* !rec_dmn_nm_cst */ /* If variable has re-defined record dimension. NB: this implies passing NULL as user-specified record dimension parameter */ if(var_trv->rec_dmn_nm_out){ /* Must be ncpdq */ assert(nco_prg_id == ncpdq); rec_dmn_nm=(char *)strdup(var_trv->rec_dmn_nm_out); } /* endif */ /* Is requested record dimension in this group ? */ if(rec_dmn_nm){ if(nco_prg_id == ncks){ if(!FIX_ALL_REC_DMN){ int rec_dmn_id_dmy; rcd=nco_inq_dimid_flg(grp_in_id,rec_dmn_nm,&rec_dmn_id_dmy); if(rcd == NC_NOERR){ /* Does variable contain requested record dimension? */ for(int idx_dmn=0;idx_dmn\n",nco_prg_nm_get(),fnc_nm,rec_dmn_nm); (void)nco_def_dim(nc_out_id,rec_dmn_nm,NC_UNLIMITED,&rec_id_out); } /* !dimension */ } /* !ncecat */ } /* !rec_dmn_nm */ /* Loop over each dimension in variable */ for(int idx_dmn=0;idx_dmngrp_nm_fll); else grp_dmn_out_fll=(char *)strdup(dmn_trv->grp_nm_fll); } /* !ncge */ /* Test existence of group and create if necessary */ if(nco_inq_grp_full_ncid_flg(nc_out_id,grp_dmn_out_fll,&grp_dmn_out_id)) nco_def_grp_full(nc_out_id,grp_dmn_out_fll,&grp_dmn_out_id); /* Inquire if dimension defined in output using obtained group ID (return value not used in logic) */ rcd_lcl=nco_inq_dimid_flg(grp_dmn_out_id,dmn_nm,&dmn_id_out); if(nco_dbg_lvl_get() == nco_dbg_old){ if(rcd_lcl == NC_NOERR) (void)fprintf(stdout,"%s: DEBUG %s dimension is visible (by parents or group) #%d<%s>\n",nco_prg_nm_get(),fnc_nm,var_dim_id,dmn_trv->nm_fll); else (void)fprintf(stdout,"%s: DEBUG %s dimension is not visible (by parents or group) #%d<%s>\n",nco_prg_nm_get(),fnc_nm,var_dim_id,dmn_trv->nm_fll); } /* endif dbg */ /* Check output group (only, not parent) dimensions */ (void)nco_inq_dimids(grp_dmn_out_id,&nbr_dmn_out_grp,(int *)NULL,0); dmn_out_id_grp=(int *)nco_malloc(nbr_dmn_out_grp*sizeof(int)); (void)nco_inq_dimids(grp_dmn_out_id,&nbr_dmn_out_grp,dmn_out_id_grp,0); /* Get unlimited dimension IDs for output group */ (void)nco_inq_unlimdims(grp_dmn_out_id,&nbr_udm_out_grp,(int *)NULL); udm_out_id_grp=(int *)nco_malloc(nbr_udm_out_grp*sizeof(int)); (void)nco_inq_unlimdims(grp_dmn_out_id,&nbr_udm_out_grp,udm_out_id_grp); /* Is dimension is already defined? */ for(int idx_dmn_grp=0;idx_dmn_grpis_rec_dmn; if(FIX_ALL_REC_DMN){ DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; if(CRR_DMN_IS_REC_IN_INPUT && nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s is defining all input record dimensions including this one, %s, as fixed dimensions in output file per user request\n",nco_prg_nm_get(),fnc_nm,dmn_nm); }else if(rec_dmn_nm){ /* User requested (with --fix_rec_dmn or --mk_rec_dmn) to treat a certain dimension specially */ /* ... and this dimension is that dimension, i.e., the user-specified dimension ... */ if(!strcmp(dmn_nm,rec_dmn_nm)){ /* ... then honor user's request to define it as a fixed or record dimension ... */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s is defining dimension %s as %s dimension in output file per user request\n",nco_prg_nm_get(),fnc_nm,rec_dmn_nm,(FIX_REC_DMN) ? "fixed" : "record"); if(FIX_REC_DMN) DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; }else{ /* strcmp() */ if(FIX_REC_DMN){ /* ... fix_rec_dmn case is straightforward: output dimension has same format as input dimension */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; }else{ /* !FIX_REC_DMN */ /* ... otherwise we are in the --mk_rec_dmn case where things get complicated ... This dimension can be a record dimension only if it would not conflict with the requested record dimension being defined a record dimension, and that depends on file format. Uggh. 1. netCDF3 API allows only one record-dimension so conflicts are possible 2. netCDF4 API permits any number of unlimited dimensions so conflicts are impossible */ if(fl_fmt == NC_FORMAT_NETCDF4){ /* ... no conflicts possible so define dimension in output same as in input ... */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; }else{ /* !netCDF4 */ /* ... output file adheres to netCDF3 API so there can be only one record dimension. In other words, define all other dimensions as fixed, non-record dimensions, even if they are a record dimension in the input file ... */ if(CRR_DMN_IS_REC_IN_INPUT) (void)fprintf(stderr,"%s: INFO %s is defining dimension %s as fixed (non-record) in output file even though it is a record dimension in the input file. This is necessary to satisfy user request that %s be the record dimension in the output file which adheres to the netCDF3 API where the record dimension, if any, must be a variable's first dimension.\n",nco_prg_nm_get(),fnc_nm,dmn_nm,rec_dmn_nm); DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; } /* !netCDF4 */ /* Impose special cases to limit production of excessive additional record dimensions How might excessive additional record dimensions be produced? ncpdq reorders try to preserve the "record" property of record variables ncpdq tries to define as a record dimension whichever dimension ends up first in a record variable, and, in netCDF4 files, this becomes an additional record dimension unless the original record dimension is changed to a fixed dimension (as must be done in netCDF3 files). ncecat (in record aggregate mode) defines a new leading record dimension In netCDF4 files this becomes an additional record dimension unless the original record dimension is changed to a fixed dimension (as must be done in netCDF3 files). Easier if ncpdq and ncecat do not increase number of record dimensions in a variable So NCO defaults to prevent production of additional record dimensions by ncecat, ncpdq User can override this with --mrd (multiple record dimension) switch */ /* Undefine dimension as record if current dimension (e.g., name "time") is also record */ if(nco_prg_id == ncecat || nco_prg_id == ncpdq) if(dmn_trv->is_rec_dmn && nco_mrd_cnv_get() == nco_mrd_restrict) DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; } /* !FIX_REC_DMN */ } /* strcmp() */ }else{ /* !rec_dmn_nm */ /* ... no user-specified record dimension so define dimension in output same as in input ... */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; } /* !rec_dmn_nm && !FIX_ALL_REC_DMN */ /* At long last ... */ /* Define current index dimension size */ /* If current dimension is to be defined as record dimension in output file */ if(DFN_CRR_DMN_AS_REC_IN_OUTPUT){ dmn_cnt=NC_UNLIMITED; long cnt; if(var_trv->var_dmn[idx_dmn].is_crd_var) cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; else cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; (void)nco_dmn_set_msa(var_dim_id,cnt,trv_tbl); /* Update output dimension info */ dmn_cmn[idx_dmn].is_rec_dmn=True; }else{ /* Get size from GTT */ /* Update output dimension info */ dmn_cmn[idx_dmn].is_rec_dmn=False; if(var_trv->var_dmn[idx_dmn].is_crd_var) dmn_cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; else dmn_cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; /* 20140108: Converting variables with multiple record dimensions and empty input to all fixed dimensions and netCDF3 output Empty input means size is zero so dmn_cnt looks like NC_UNLIMITED, i.e., a record dimension In other words, there is no good way to "fix" a record dimension for a variable with no records/data Workaround is to arbitrarily assign such dimensions a size of 1 so they are fixed output, and still have no data This ugly hack seems to work and is only invoked in this extreme corner case so may be OK */ if(dmn_cnt == 0) dmn_cnt=1L; /* Update GTT dimension */ (void)nco_dmn_set_msa(var_dim_id,dmn_cnt,trv_tbl); } /* !DFN_CRR_DMN_AS_REC_IN_OUTPUT */ /* ncwa */ if(nco_prg_id == ncwa){ nco_bool found_dim=False; /* Degenerate dimensions */ for(int idx_dmn_dgn=0;idx_dmn_dgnnbr_dmn_dgn;idx_dmn_dgn++){ /* Compare ID */ if(trv_tbl->dmn_dgn[idx_dmn_dgn].id == var_dim_id){ found_dim=True; dmn_cnt=trv_tbl->dmn_dgn[idx_dmn_dgn].cnt; /* If dimension is record keep it that way */ if(dmn_trv->is_rec_dmn) dmn_cnt=NC_UNLIMITED; break; } /* Compare ID */ } /* !Degenerate */ if(var_trv->var_dmn[idx_dmn].flg_rdd){ found_dim=True; /* If dimension was to be record keep it that way, otherwise define degenerate size of 1 */ if(DFN_CRR_DMN_AS_REC_IN_OUTPUT) dmn_cnt=NC_UNLIMITED; else dmn_cnt=1L; } if(!found_dim){ DEFINE_DIM[idx_dmn]=False; nbr_dmn_var_out--; } /* found_dim */ } /* !ncwa */ /* Always define, except maybe for ncwa */ if(DEFINE_DIM[idx_dmn]){ /* Define dimension and obtain dimension ID */ (void)nco_def_dim(grp_dmn_out_id,dmn_nm,dmn_cnt,&dmn_id_out); if(nco_dbg_lvl_get() == nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s Defined dimension <%s><%s>#%d\n",nco_prg_nm_get(),fnc_nm,grp_dmn_out_fll,dmn_nm,dmn_id_out); /* Assign defined ID to dimension ID array for the variable */ dmn_out_id[idx_dmn]=dmn_id_out; } /* !DEFINE_DIM */ } /* !NEED_TO_DEFINE_DIM */ /* pvn 20140824 Always redefine output dimension array; repeat logic above regarding value of "dmn_cnt" for both non ncwa and ncwa cases */ if(nco_prg_id != ncwa){ if(var_trv->var_dmn[idx_dmn].is_crd_var) dmn_cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; else dmn_cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; }else{ /* Degenerate dimensions */ for(int idx_dmn_dgn=0;idx_dmn_dgnnbr_dmn_dgn;idx_dmn_dgn++){ /* Compare ID */ if(trv_tbl->dmn_dgn[idx_dmn_dgn].id == var_dim_id){ dmn_cnt=trv_tbl->dmn_dgn[idx_dmn_dgn].cnt; /* If dimension is record keep it that way */ if(dmn_trv->is_rec_dmn) dmn_cnt=NC_UNLIMITED; break; } /* Compare ID */ } /* !Degenerate */ if(var_trv->var_dmn[idx_dmn].flg_rdd){ /* If dimension was to be record keep it that way, otherwise define degenerate size of 1 */ if(DFN_CRR_DMN_AS_REC_IN_OUTPUT) dmn_cnt=NC_UNLIMITED; else dmn_cnt=1L; } /* endif */ } /* !ncwa */ /* Construct full dimension name using the full group name */ dmn_nm_fll_out=(char *)nco_malloc(strlen(grp_dmn_out_fll)+strlen(dmn_nm)+2L); strcpy(dmn_nm_fll_out,grp_dmn_out_fll); if(strcmp(grp_dmn_out_fll,"/")) strcat(dmn_nm_fll_out,"/"); strcat(dmn_nm_fll_out,dmn_nm); /* Redefine output dimension array for this dimension */ (void)nco_dfn_dmn(dmn_nm_fll_out,dmn_cnt,dmn_id_out,dmn_cmn,var_trv->nbr_dmn); /* Die informatively if record dimension is not first dimension in netCDF3 output */ if(idx_dmn > 0 && dmn_out_id[idx_dmn] == rec_dmn_out_id && fl_fmt != NC_FORMAT_NETCDF4 && DEFINE_DIM[idx_dmn]){ (void)fprintf(stdout,"%s: ERROR User defined the output record dimension to be \"%s\". Yet in the variable \"%s\" this is dimension number %d. The output file adheres to the netCDF3 API which only supports the record dimension as the first (i.e., least rapidly varying) dimension. Consider using ncpdq to permute the location of the record dimension in the output file.\n",nco_prg_nm_get(),rec_dmn_nm,var_nm,idx_dmn+1); nco_exit(EXIT_FAILURE); } /* end if err */ /* Memory management after defining current output dimension */ if(grp_dmn_out_fll) grp_dmn_out_fll=(char *)nco_free(grp_dmn_out_fll); if(dmn_nm_fll_out) dmn_nm_fll_out=(char *)nco_free(dmn_nm_fll_out); } /* End of the very important dimension loop */ /* If variable needs dimension re-ordering */ if(var_trv->flg_rdr){ /* Must be ncpdq */ assert(nco_prg_id == ncpdq); for(int dmn_out_idx=0;dmn_out_idxdmn_idx_out_in[dmn_out_idx]]=dmn_out_idx; for(int dmn_out_idx=0;dmn_out_idxrdr */ if(nco_prg_id == ncecat && rec_dmn_nm && var_trv->enm_prc_typ == prc_typ){ /* Insert extra "record" dimension in dimension array if... ...is ncecat and ...user requested (with --fix_rec_dmn or --mk_rec_dmn) to treat a certain dimension specially and ...variable is processing type */ /* Temporary store for old IDs */ int dmn_tmp_id[NC_MAX_DIMS]; for(int idx_dmn=0;idx_dmnvar_typ_out != (nc_type)err_typ) var_typ_out=var_trv->var_typ_out; else var_typ_out=var_typ; }else if(nco_prg_id != ncbo){ int var_id; /* [id] Variable ID */ var_sct *var_prc; /* [sct] Variable to process */ /* Get variable ID */ (void)nco_inq_varid(grp_in_id,var_trv->nm,&var_id); /* Allocate variable structure and fill with metadata */ var_prc=nco_var_fll_trv(grp_in_id,var_id,var_trv,trv_tbl); /* Obtain netCDF type to define variable from NCO program ID */ var_typ_out=nco_get_typ(var_prc); for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ var_prc->dim[idx_dmn]->xrf=(dmn_sct *)nco_dmn_free(var_prc->dim[idx_dmn]->xrf); var_prc->dim[idx_dmn]=(dmn_sct *)nco_dmn_free(var_prc->dim[idx_dmn]); } var_prc=(var_sct *)nco_var_free(var_prc); } /* !(ncflint || ncpdq) */ /* Special case for ncwa */ if(nco_prg_id == ncwa){ int dmn_ids_out[NC_MAX_DIMS]; /* [id] Dimension IDs array for output variable (ncwa can skip some dimensions, rearrange) */ int idx_dmn_def=0; for(int idx_dmn=0;idx_dmn<%s> : ",nco_prg_nm_get(),fnc_nm,grp_out_fll,var_nm); for(int idx_dmn=0;idx_dmn#%d SIZE=%ld : ",dmn_cmn[idx_dmn].nm_fll,dmn_out_id[idx_dmn],dmn_cmn[idx_dmn].sz); (void)fprintf(stdout,"\n"); } /* endif dbg */ /* If output dimensions array exists */ if(dmn_cmn_out != NULL && nco_prg_id == ncks){ for(int idx_dmn=0;idx_dmn 0){ int deflate; /* [flg] Turn on deflate filter */ int dfl_lvl_in; /* [enm] Deflate level [0..9] */ int shuffle; /* [flg] Turn on shuffle filter */ rcd=nco_inq_var_deflate(grp_in_id,var_in_id,&shuffle,&deflate,&dfl_lvl_in); /* Copy original deflation settings */ if(deflate || shuffle) (void)nco_def_var_deflate(grp_out_id,var_out_id,shuffle,deflate,dfl_lvl_in); /* Overwrite HDF Lempel-Ziv compression level, if requested */ if(dfl_lvl == 0) deflate=(int)False; else deflate=(int)True; /* Turn-off shuffle when uncompressing otherwise chunking requests may fail */ if(dfl_lvl == 0) shuffle=NC_NOSHUFFLE; /* Shuffle never, to my knowledge, increases filesize, so shuffle by default when manually deflating */ if(dfl_lvl >= 0) shuffle=NC_SHUFFLE; if(dfl_lvl >= 0) (void)nco_def_var_deflate(grp_out_id,var_out_id,shuffle,deflate,dfl_lvl); } /* endif */ /* 20141013 Previously called chunking only when user selected a chunking switch Now always call chunking because default is to preserve input chunking This requires explicitly overriding netCDF defaults */ /* Define extra dimension on output (e.g., ncecat adds "record" dimension) */ if(nco_prg_id == ncecat && rec_dmn_nm && var_trv->enm_prc_typ == prc_typ){ /* Temporary store for old dimensions */ dmn_cmn_sct dmn_cmn_tmp[NC_MAX_DIMS]; for(int idx_dmn=0;idx_dmngrp_nm_fll,rec_dmn_nm); /* Make room for inserted dimension at 0 index */ for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ if(DEFINE_DIM[idx_dmn]){ /* Redefine the array */ dmn_cmn[idx_dmn_def]=dmn_cmn[idx_dmn]; idx_dmn_def++; } /* DEFINE_DIM[idx_dmn]) */ } /* Loop dimensions */ } /* !ncwa */ /* Special case for ncpdq */ if(nco_prg_id == ncpdq && nbr_dmn_var > 1){ int var_id_out; /* [id] Variable ID */ int var_dmn_nbr; /* [nbr] Number of dimensions */ int var_dimid[NC_MAX_VAR_DIMS]; /* [lst] Dimension IDs */ (void)nco_inq_varid(grp_out_id,var_trv->nm,&var_id_out); (void)nco_inq_var(grp_out_id,var_id_out,var_nm,&var_typ,&var_dmn_nbr,var_dimid,NULL); /* Sanity check */ assert(nbr_dmn_var == var_trv->nbr_dmn); assert(nbr_dmn_var == var_dmn_nbr); for(int idx_dmn=0;idx_dmnnm,dmn_cmn); if(nco_prg_id == ncecat && rec_dmn_nm && var_trv->enm_prc_typ == prc_typ) dmn_cmn[0].nm_fll=(char *)nco_free(dmn_cmn[0].nm_fll); } /* !NC_FORMAT_NETCDF4 */ /* Free locally allocated space */ if(rec_dmn_nm_mlc) rec_dmn_nm_mlc=(char *)nco_free(rec_dmn_nm_mlc); dmn_in_id_var=(int *)nco_free(dmn_in_id_var); dmn_idx_in_out=(int *)nco_free(dmn_idx_in_out); dmn_out_id_tmp=(int *)nco_free(dmn_out_id_tmp); return var_out_id; } /* end nco_cpy_var_dfn_trv() */ void nco_dmn_swap /* [fnc] Swap dimensions */ (const char * const dmn_nm_1, /* I [sng] Name of dimension 1 */ const char * const dmn_nm_2, /* I [sng] Name of dimension 2 */ dmn_cmn_sct *dmn_cmn, /* I/O [sct] Dimension structure array */ const int nbr_dmn) /* I [nbr] Number of dimensions (size of above array) */ { int dmn_nm_1_idx=int_CEWI; int dmn_nm_2_idx=int_CEWI; dmn_cmn_sct dmn_cmn_tmp; for(int idx_dmn=0;idx_dmninput, output of nco_var_dmn_rdr_mtd() */ const int nbr_var_prc, /* I [nbr] Size of above array (number of processed variables) */ var_sct **var_prc_out, /* I [sct] Processed variables */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Transfer dimension structures to be re-ordered (ncpdq) into GTT */ assert(nco_prg_id_get() == ncpdq); /* Loop processed variables */ for(int idx_var_prc=0;idx_var_prcnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* If GTT variable object is to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Match by full variable name */ if(!strcmp(var_prc_out[idx_var_prc]->nm_fll,var_trv.nm_fll)){ /* Mark re-order flag */ trv_tbl->lst[idx_var].flg_rdr=True; assert(var_trv.nbr_dmn==var_prc_out[idx_var_prc]->nbr_dim); /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnlst[idx_var].dmn_idx_out_in[idx_var_dmn]=dmn_idx_out_in[idx_var_prc][idx_var_dmn]; } /* Loop variable dimensions */ } /* Match by full variable name */ } /* If GTT variable object is to extract */ } /* Loop table */ } /* Loop processed variables */ return; } /* end nco_dmn_rdr_trv() */ void nco_var_dmn_rdr_mtd_trv /* [fnc] Set new dimensionality in metadata of each re-ordered variable */ (trv_tbl_sct * const trv_tbl, /* I/O [sct] GTT (Group Traversal Table) */ const int nbr_var_prc, /* I [nbr] Number of processed variables */ var_sct **var_prc, /* I/O [sct] Processed variables */ var_sct **var_prc_out, /* I/O [sct] Processed variables */ const int nbr_var_fix, /* I [nbr] Number of processed variables */ var_sct **var_fix, /* I/O [sct] Fixed variables */ dmn_sct **dmn_rdr, /* I [sct] Dimension structures to be re-ordered */ const int dmn_rdr_nbr, /* I [nbr] Number of dimension to re-order */ const nco_bool *dmn_rvr_rdr) /* I [flg] Reverse dimension */ { /* Purpose: Determine and set new dimensionality in metadata of each re-ordered variable Based in nco_var_dmn_rdr_mtd(). NB: first record dimension for object variable is used Test case: ncpdq -O -a lev,time -v two_dmn_rec_var in.nc out.nc Mark lev as record and un-mark time as record (by setting record name to lev) */ char *rec_dmn_nm_out_crr; /* [sng] Name of record dimension, if any, required by re-order */ char *rec_dmn_nm_in; /* [sng] Record dimension name, original */ char *rec_dmn_nm_out; /* [sng] Record dimension name, re-ordered */ int dmn_idx_out_in[NC_MAX_DIMS]; /* [idx] Dimension correspondence, output->input (Stored in GTT) */ int nco_prg_id; /* [enm] Program ID */ nco_bool REDEFINED_RECORD_DIMENSION; /* [flg] Re-defined record dimension */ nco_bool dmn_rvr_in[NC_MAX_DIMS]; /* [flg] Reverse dimension (Stored in GTT) */ nm_lst_sct *rec_dmn_nm; /* [sct] Record dimension names array */ /* Get Program ID */ nco_prg_id=nco_prg_id_get(); assert(nco_prg_id == ncpdq); CEWI_unused(nco_prg_id); /* Loop processed variables */ for(int idx_var_prc=0;idx_var_prcnm_fll,trv_tbl); assert(var_trv->flg_xtr); assert(var_trv->nbr_dmn == var_prc_out[idx_var_prc]->nbr_dim); /* Initialize for this variable */ REDEFINED_RECORD_DIMENSION=False; /* Mark re-order flag */ var_trv->flg_rdr=True; /* Initialize record names for this object */ rec_dmn_nm=NULL; rec_dmn_nm_out_crr=NULL; rec_dmn_nm_in=NULL; rec_dmn_nm_out=NULL; /* Get array of record names for object */ (void)nco_get_rec_dmn_nm(var_trv,trv_tbl,&rec_dmn_nm); /* Use for record dimension name the first in array */ if(rec_dmn_nm && rec_dmn_nm->lst){ rec_dmn_nm_in=(char *)strdup(rec_dmn_nm->lst[0].nm); rec_dmn_nm_out=(char *)strdup(rec_dmn_nm->lst[0].nm); } /* !rec_dmn_nm->lst */ /* nco_var_dmn_rdr_mtd() does re-order heavy lifting */ rec_dmn_nm_out_crr=nco_var_dmn_rdr_mtd(var_prc[idx_var_prc],var_prc_out[idx_var_prc],dmn_rdr,dmn_rdr_nbr,dmn_idx_out_in,dmn_rvr_rdr,dmn_rvr_in); var_trv->dmn_idx_out_in=(int *)nco_malloc(var_trv->nbr_dmn*sizeof(int)); var_trv->dmn_rvr_in=(nco_bool *)nco_malloc(var_trv->nbr_dmn*sizeof(nco_bool)); /* Transfer dimension structures to be re-ordered into GTT */ for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ var_trv->dmn_idx_out_in[idx_dmn]=dmn_idx_out_in[idx_dmn]; var_trv->dmn_rvr_in[idx_dmn]=dmn_rvr_in[idx_dmn]; } /* end loop over dimensions */ /* If record dimension required by current variable re-order... ...and variable is multi-dimensional (one dimensional arrays cannot request record dimension changes)... */ if(rec_dmn_nm_in && rec_dmn_nm_out_crr && var_prc_out[idx_var_prc]->nbr_dim > 1){ /* ...differs from input and current output record dimension(s)... */ if(strcmp(rec_dmn_nm_out_crr,rec_dmn_nm_in) && strcmp(rec_dmn_nm_out_crr,rec_dmn_nm_out)){ /* ...and current output record dimension already differs from input record dimension... */ if(REDEFINED_RECORD_DIMENSION){ /* ...then requested re-order requires multiple record dimensions... */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stdout,"%s: WARNING Re-order requests multiple record dimensions\n. Only first request will be honored (netCDF3 allows only one record dimension). Record dimensions involved [original,first change request (honored),latest change request (made by variable %s)]=[%s,%s,%s]\n",nco_prg_nm_get(),var_prc[idx_var_prc]->nm,rec_dmn_nm_in,rec_dmn_nm_out,rec_dmn_nm_out_crr); break; }else{ /* !REDEFINED_RECORD_DIMENSION */ /* ...otherwise, update output record dimension name... */ rec_dmn_nm_out=rec_dmn_nm_out_crr; /* ...and set new dimensions... */ var_prc_out[idx_var_prc]->dim[0]->is_rec_dmn=True; /* ...and set flag that record dimension has been re-defined... */ REDEFINED_RECORD_DIMENSION=True; /* ...store the name of the record dimension on output... */ var_trv->rec_dmn_nm_out=(char *)strdup(rec_dmn_nm_out); } /* !REDEFINED_RECORD_DIMENSION */ } /* endif new and old record dimensions differ */ } /* endif current variable is record variable */ /* Memory management for record dimension names */ if(rec_dmn_nm){ for(int idx=0;idxnbr;idx++) rec_dmn_nm->lst[idx].nm=(char *)nco_free(rec_dmn_nm->lst[idx].nm); rec_dmn_nm=(nm_lst_sct *)nco_free(rec_dmn_nm); } /* !rec_dmn_nm */ if(rec_dmn_nm_in)rec_dmn_nm_in=(char *)nco_free(rec_dmn_nm_in); if(rec_dmn_nm_out)rec_dmn_nm_out=(char *)nco_free(rec_dmn_nm_out); } /* Loop processed variables */ /* Loop to deal with REDEFINED_RECORD_DIMENSION */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Changing record dimension may invalidate is_rec_var flag Updating is_rec_var flag to correct value, even if value is ignored, helps keep user appraised of unexpected dimension re-orders. is_rec_var may change both for "fixed" and "processed" variables When is_rec_var changes for processed variables, may also need to change ancillary information and to check for duplicate dimensions. Ancillary information (dmn_idx_out_in) is available only for var_prc! Hence must update is_rec_var flag for var_fix and var_prc separately */ /* Update is_rec_var flag for var_fix */ for(int idx_var_fix=0;idx_var_fixnm_fll,var_trv.nm_fll) == 0){ /* ...get the name of the record dimension on output... stored to GTT in first loop above */ rec_dmn_nm_out=trv_tbl->lst[idx_var].rec_dmn_nm_out; int dmn_out_idx; /* Search all dimensions in variable for new record dimension */ for(dmn_out_idx=0;dmn_out_idxnbr_dim;dmn_out_idx++){ if(rec_dmn_nm_out && !strcmp(var_fix[idx_var_fix]->dim[dmn_out_idx]->nm,rec_dmn_nm_out)){ break; } } /* ...Will variable be record variable in output file?... */ if(dmn_out_idx == var_fix[idx_var_fix]->nbr_dim){ /* ...No. Variable will be non-record---does this change its status?... */ if(nco_dbg_lvl_get() >= nco_dbg_var){ if(var_fix[idx_var_fix]->is_rec_var) (void)fprintf(stdout,"%s: INFO Requested re-order will change variable %s from record to non-record variable\n", nco_prg_nm_get(),var_fix[idx_var_fix]->nm); } /* Assign record flag dictated by re-order */ var_fix[idx_var_fix]->is_rec_var=False; }else{ /* ...otherwise variable will be record variable... */ /* ...Yes. Variable will be record... */ /* ...Will becoming record variable change its status?... */ if(!var_fix[idx_var_fix]->is_rec_var){ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: INFO Requested re-order will change variable %s from non-record to record variable\n", nco_prg_nm_get(),var_fix[idx_var_fix]->nm); /* Change record flag to status dictated by re-order */ var_fix[idx_var_fix]->is_rec_var=True; } /* endif status changing from non-record to record */ } /* endif variable will be record variable */ } /* Match by full variable name */ } /* end loop over var_fix */ } /* Loop table */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Update is_rec_var flag for var_prc */ for(int idx_var_prc=0;idx_var_prcnm_fll,var_trv.nm_fll) == 0){ /* ...get the name of the record dimension on output... stored to GTT in first loop above */ rec_dmn_nm_out=trv_tbl->lst[idx_var].rec_dmn_nm_out; /* Loop table, search for other variables that share the same dimension name */ for(unsigned idx_var_mrk=0;idx_var_mrknbr;idx_var_mrk++){ /* Looking for this variable */ trv_sct var_trv_mrk=trv_tbl->lst[idx_var_mrk]; /* Avoid same variable ... ...look if there is a record name to find ...and look for variables only ...and look for extracted variables only ...and look for variables with dimensions > 1 */ if(rec_dmn_nm_out && strcmp(var_trv.nm_fll,var_trv_mrk.nm_fll) != 0 && var_trv_mrk.nco_typ == nco_obj_typ_var && var_trv_mrk.flg_xtr && var_trv_mrk.nbr_dmn > 1){ nco_bool NEEDS_REORDER; /* [flg] Variable needs re-ordering */ int idx_var_prc_out; /* [nbr] Index of variable that needs re-ordering */ NEEDS_REORDER=False; /* Loop dimensions of to search variable */ for(int idx_dmn=0;idx_dmnnbr_dim;dmn_out_idx++) if(!strcmp(var_prc_out[idx_var_prc_out]->dim[dmn_out_idx]->nm,rec_dmn_nm_out)) break; /* ...Will variable be record variable in output file?... */ if(dmn_out_idx == var_prc_out[idx_var_prc_out]->nbr_dim){ /* ...No. Variable will be non-record---does this change its status?... */ if(nco_dbg_lvl_get() >= nco_dbg_var) if(var_prc_out[idx_var_prc_out]->is_rec_var) (void)fprintf(stdout,"%s: INFO Requested re-order will change variable %s from record to non-record variable\n",nco_prg_nm_get(),var_prc_out[idx_var_prc_out]->nm); /* Assign record flag dictated by re-order */ var_prc_out[idx_var_prc_out]->is_rec_var=False; }else{ /* ...otherwise variable will be record variable... */ /* ...Yes. Variable will be record... */ /* ...must ensure new record dimension is not duplicate dimension... */ if(var_prc_out[idx_var_prc_out]->has_dpl_dmn){ int dmn_dpl_idx; for(dmn_dpl_idx=1;dmn_dpl_idxnbr_dim;dmn_dpl_idx++){ /* NB: loop starts from 1 */ if(var_prc_out[idx_var_prc_out]->dmn_id[0] == var_prc_out[idx_var_prc_out]->dmn_id[dmn_dpl_idx]){ (void)fprintf(stdout,"%s: ERROR Requested re-order turns duplicate non-record dimension %s in variable %s into output record dimension. netCDF does not support duplicate record dimensions in a single variable.\n%s: HINT: Exclude variable %s from extraction list with \"-x -v %s\".\n",nco_prg_nm_get(),rec_dmn_nm_out,var_prc_out[idx_var_prc_out]->nm,nco_prg_nm_get(),var_prc_out[idx_var_prc_out]->nm,var_prc_out[idx_var_prc_out]->nm); nco_exit(EXIT_FAILURE); } /* endif err */ } /* end loop over dmn_out */ } /* endif has_dpl_dmn */ /* ...Will becoming record variable change its status?... */ if(!var_prc_out[idx_var_prc_out]->is_rec_var){ if(nco_dbg_lvl_get() >= nco_dbg_var) (void)fprintf(stdout,"%s: INFO Requested re-order will change variable %s from non-record to record variable\n",nco_prg_nm_get(),var_prc_out[idx_var_prc_out]->nm); /* Change record flag to status dictated by re-order */ var_prc_out[idx_var_prc_out]->is_rec_var=True; /* ...Swap dimension information for multi-dimensional variables... */ if(var_prc_out[idx_var_prc_out]->nbr_dim > 1){ /* Swap dimension information when turning multi-dimensional non-record variable into record variable. Single dimensional non-record variables that turn into record variables already have correct dimension information */ dmn_sct *dmn_swp; /* [sct] Dimension structure for swapping */ int dmn_idx_rec_in; /* [idx] Record dimension index in input variable */ int dmn_idx_rec_out; /* [idx] Record dimension index in output variable */ int dmn_idx_swp; /* [idx] Dimension index for swapping */ /* If necessary, swap new record dimension to first position */ /* Label indices with standard names */ dmn_idx_rec_in=dmn_out_idx; dmn_idx_rec_out=0; /* Swap indices in map */ dmn_idx_swp=dmn_idx_out_in[dmn_idx_rec_out]; dmn_idx_out_in[dmn_idx_rec_out]=dmn_idx_rec_in; dmn_idx_out_in[dmn_idx_rec_in]=dmn_idx_swp; /* Transfer dimension structures (re-ordered again) into GTT */ for(int idx_dmn=0;idx_dmnlst[ idx_var_mrk ].dmn_idx_out_in[idx_dmn]=dmn_idx_out_in[idx_dmn]; /* Swap dimensions in list */ dmn_swp=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]; var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]; var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]=dmn_swp; /* NB: Change dmn_id,cnt,srt,end,srd together to minimize chances of forgetting one */ /* Correct output variable structure copy of output record dimension information */ var_prc_out[idx_var_prc_out]->dmn_id[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]->id; var_prc_out[idx_var_prc_out]->cnt[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]->cnt; var_prc_out[idx_var_prc_out]->srt[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]->srt; var_prc_out[idx_var_prc_out]->end[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]->end; var_prc_out[idx_var_prc_out]->srd[dmn_idx_rec_out]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_out]->srd; /* Correct output variable structure copy of input record dimension information */ var_prc_out[idx_var_prc_out]->dmn_id[dmn_idx_rec_in]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]->id; var_prc_out[idx_var_prc_out]->cnt[dmn_idx_rec_in]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]->cnt; var_prc_out[idx_var_prc_out]->srt[dmn_idx_rec_in]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]->srt; var_prc_out[idx_var_prc_out]->end[dmn_idx_rec_in]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]->end; var_prc_out[idx_var_prc_out]->srd[dmn_idx_rec_in]=var_prc_out[idx_var_prc_out]->dim[dmn_idx_rec_in]->srd; } /* endif multi-dimensional */ } /* endif status changing from non-record to record */ } /* endif variable will be record variable */ } /* Loop table, search for other variables that share same dimension name */ } /* NEEDS_REORDER */ } /* ...look if there is a record name to find */ } /* Match by full variable name */ } /* end loop over var_prc */ } /* Loop table */ /* Final step: search for all redefined record dimension variables and mark other variables */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Has re-defined record dimension */ if(var_trv.rec_dmn_nm_out){ rec_dmn_nm_out=trv_tbl->lst[idx_var].rec_dmn_nm_out; /* Loop table, search for other variables that share same dimension name */ for(unsigned idx_var_mrk=0;idx_var_mrknbr;idx_var_mrk++){ /* Looking for this variable */ trv_sct var_trv_mrk=trv_tbl->lst[idx_var_mrk]; /* Avoid same variable ... ...and look for variables only ...and look for extracted variables only */ if(strcmp(var_trv.nm_fll,var_trv_mrk.nm_fll) != 0 && var_trv_mrk.nco_typ == nco_obj_typ_var && var_trv_mrk.flg_xtr){ /* Loop dimensions of to search variable */ for(int idx_dmn=0;idx_dmnlst[idx_var_mrk].rec_dmn_nm_out=(char *)strdup(rec_dmn_nm_out); /* Get unique dimension object from unique dimension ID, in input list */ dmn_trv=nco_dmn_trv_sct(var_trv_mrk.var_dmn[idx_dmn].dmn_id,trv_tbl); /* Is record? */ /* Store record dimension name on output */ if(dmn_trv->is_rec_dmn) trv_tbl->lst[idx_var_mrk].rec_dmn_nm_out=(char *)strdup(rec_dmn_nm_out); } /* Loop variable dimensions */ } /* Avoid same */ } /* Loop table */ } /* Has re-defined record dimension */ } /* Loop table */ return; } /* nco_var_dmn_rdr_mtd_trv() */ nco_bool /* [flg] Name was found */ nco_var_prc_idx_trv /* [fnc] Find index of processed variable that matches full name */ (const char * const var_nm_fll, /* I [nbr] Full name of variable */ var_sct **var_prc_out, /* I [sct] Processed variables */ const int nbr_var_prc, /* I [nbr] Number of processed variables */ int * idx_var_prc_out) /* O [nbr] Number of dimension to re-order */ { /* Loop processed variables */ for(int idx_var_prc=0;idx_var_prcnm_fll,var_nm_fll) == 0){ *idx_var_prc_out=idx_var_prc; return True; } /* Match by full variable name */ } /* Loop processed variables */ assert(0); return False; } /* nco_var_prc_idx_trv() */ nco_bool /* O [flg] Re-define dimension ordering */ nco_rdf_dmn_trv /* [fnc] Re-define dimension ordering */ (trv_sct var_trv, /* I [sct] varible with record dimension name, re-ordered */ const trv_tbl_sct * const trv_tbl, /* I [sct] GTT (Group Traversal Table) */ int * idx_var_mrk_out) /* O [nbr] Index in GTT where name was found */ { if(var_trv.rec_dmn_nm_out == NULL) return False; /* Loop table, search for other variables that share same dimension name */ for(unsigned idx_var_mrk=0;idx_var_mrknbr;idx_var_mrk++){ /* Looking for this variable */ trv_sct var_trv_mrk=trv_tbl->lst[idx_var_mrk]; /* Avoid same variable ... ...and look for variables only ...and look for extracted variables only ...and look for variables with dimensions > 1 */ if(strcmp(var_trv.nm_fll,var_trv_mrk.nm_fll) != 0 && var_trv_mrk.nco_typ == nco_obj_typ_var && var_trv_mrk.flg_xtr && var_trv_mrk.nbr_dmn > 1){ /* Loop dimensions of to search variable */ for(int idx_dmn=0;idx_dmninput (Stored in GTT ) */ nco_bool *dmn_rvr_in; /* [flg] Reverse dimension (Stored in GTT ) */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* Match by full variable name */ if(!strcmp(var_out->nm_fll,var_trv.nm_fll)){ assert(var_trv.nco_typ == nco_obj_typ_var); assert(var_trv.flg_xtr); assert(var_trv.nbr_dmn==var_out->nbr_dim); /* Transfer dimension structures to be re-ordered *from* GTT */ dmn_idx_out_in=(int *)nco_malloc(var_trv.nbr_dmn*sizeof(int)); dmn_rvr_in=(nco_bool *)nco_malloc(var_trv.nbr_dmn*sizeof(nco_bool)); for(int idx_dmn=0;idx_dmnlst[idx_var].dmn_idx_out_in[idx_dmn]; dmn_rvr_in[idx_dmn]=trv_tbl->lst[idx_var].dmn_rvr_in[idx_dmn]; } /* !idx_dmn */ /* Initialize variables to reduce indirection */ /* NB: Number of input and output dimensions are equal for pure re-orders However, keep dimension numbers in separate variables to ease relax this rule in future */ dmn_in_nbr=var_in->nbr_dim; dmn_out_nbr=var_out->nbr_dim; /* On entry to this section of code, we assume: 1. var_out metadata are re-ordered 2. var_out->val buffer has been allocated (calling routine must do this) */ /* Get ready to re-order */ /* dmn_id_out=var_out->dmn_id; */ /* dmn_in=var_in->dim; */ dmn_in_nbr_m1=dmn_in_nbr-1; dmn_out=var_out->dim; typ_sz=nco_typ_lng(var_out->type); val_in_cp=(char *)var_in->val.vp; val_out_cp=(char *)var_out->val.vp; var_in_cnt=var_in->cnt; var_sz=var_in->sz; /* As explained in nco_var_dmn_rdr_mtd(), "Hence, we must re-update dmn_out->id after nco_dmn_dfn() in nco_cnf_dmn_rdr_val() Structures should be completely consistent at that point Not updating these structures (at least dmn_out->id) is equivalent to assuming that dmn_out->id does not depend on record dimension identity, which is an ASSUMPTION that may currently be true, but is not guaranteed by the netCDF API to always be true." */ for(dmn_out_idx=0;dmn_out_idxdmn_id[dmn_out_idx]=dmn_out[dmn_out_idx]->id; var_out->cnt[dmn_out_idx]=dmn_out[dmn_out_idx]->cnt; var_out->srt[dmn_out_idx]=dmn_out[dmn_out_idx]->srt; var_out->end[dmn_out_idx]=dmn_out[dmn_out_idx]->end; var_out->srd[dmn_out_idx]=dmn_out[dmn_out_idx]->srd; } /* end loop over dmn_out */ /* Report full metadata re-order, if requested */ if(nco_dbg_lvl_get() > 3){ int dmn_idx_in_out[NC_MAX_DIMS]; /* [idx] Dimension correspondence, input->output */ /* Create reverse correspondence */ for(dmn_out_idx=0;dmn_out_idxnm,var_in->dim[dmn_in_idx]->nm,dmn_in_idx,var_in->dmn_id[dmn_in_idx],dmn_idx_in_out[dmn_in_idx],var_out->dmn_id[dmn_idx_in_out[dmn_in_idx]]); } /* endif dbg */ /* Is identity re-ordering requested? */ for(dmn_out_idx=0;dmn_out_idx= nco_dbg_scl) (void)fprintf(stdout,"%s: INFO %s reports re-order is identity transformation for variable %s\n",nco_prg_nm_get(),fnc_nm,var_in->nm); /* Copy in one fell swoop then return */ (void)memcpy((void *)(var_out->val.vp),(void *)(var_in->val.vp),var_out->sz*nco_typ_lng(var_out->type)); return; } /* !IDENTITY_REORDER */ if(var_in->has_dpl_dmn) (void)fprintf(stdout,"%s: WARNING %s reports non-identity re-order for variable with duplicate dimensions %s.\n%s does not support non-identity re-orders of variables with duplicate dimensions\n",nco_prg_nm_get(),fnc_nm,var_in->nm,nco_prg_nm_get()); /* Compute map for each dimension of input variable */ for(dmn_in_idx=0;dmn_in_idxcnt[dmn_idx]; /* Compute map for each dimension of output variable */ for(dmn_out_idx=0;dmn_out_idxcnt[dmn_idx]; /* There is more than one method to re-order dimensions Output dimensionality is known in advance, unlike nco_var_avg() Hence outer loop may be over dimensions or over elements Method 1: Loop over input elements 1a. Loop over 1-D input array offsets 1b. Invert 1-D input array offset to get N-D input subscripts 1c. Turn N-D input subscripts into N-D output subscripts 1d. Map N-D output subscripts to get 1-D output element 1e. Copy input element to output element This method is simplified from method used in nco_var_avg() Method 2: Loop over input dimensions 1a. Loop over input dimensions, from slowest to fastest varying 1b. */ /* Begin Method 1: Loop over input elements */ /* var_in_lmn is offset into 1-D array */ for(var_in_lmn=0;var_in_lmnnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* If object is an extracted variable... */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* Update for this variable */ (void)nco_dmn_msa_tbl(grp_id,rec_dmn_nm,&var_trv,trv_tbl); } /* If object is an extracted variable... */ } /* Loop table */ } /* end nco_dmn_trv_msa_tbl() */ void nco_dmn_msa_tbl /* [fnc] Update all GTT dimensions with hyperslabbed size */ (const int grp_in_id, /* I [id] netCDF input group ID */ const char * const rec_dmn_nm_cst, /* I [sng] User-specified record dimension, if any, to create or fix in output file */ trv_sct *var_trv, /* I/O [sct] Object to write (variable) trv_map_dmn_set() is O */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { /* Purpose: Update all GTT dimensions with hyperslabbed size */ const char fnc_nm[]="nco_dmn_msa_tbl()"; /* [sng] Function name */ char var_nm[NC_MAX_NAME+1L]; /* [sng] Variable name (local copy of object name) */ char *rec_dmn_nm=NULL; /* [sng] User-specified record dimension name */ char *rec_dmn_nm_mlc=NULL; /* [sng] Local copy of rec_dmn_nm_cst, which may be encoded */ char dmn_nm[NC_MAX_NAME+1L]; /* [sng] Dimension names */ int *dmn_in_id_var; /* [id] Dimension IDs array for input variable */ int var_in_id; /* [id] Variable ID */ int fl_fmt; /* [enm] Output file format */ int nbr_dmn_var; /* [nbr] Number of dimensions for variable */ int rcd=NC_NOERR; /* [rcd] Return code */ int nco_prg_id; /* [enm] Program ID */ int var_dim_id; /* [id] Variable dimension ID */ long dmn_cnt; /* [sng] Hyperslabbed dimension size */ long dmn_sz; /* [sng] Dimension size */ nc_type var_typ; /* [enm] netCDF type in input variable (usually same as output) */ nco_bool CRR_DMN_IS_REC_IN_INPUT; /* [flg] Current dimension of variable is record dimension of variable in input file/group */ nco_bool DFN_CRR_DMN_AS_REC_IN_OUTPUT; /* [flg] Define current dimension as record dimension in output file */ nco_bool FIX_ALL_REC_DMN=False; /* [flg] Fix all record dimensions */ nco_bool FIX_REC_DMN=False; /* [flg] Fix record dimension (opposite of MK_REC_DMN) */ nco_bool NEED_TO_DEFINE_DIM; /* [flg] Dimension needs to be defined in *this* group */ dmn_trv_sct *dmn_trv; /* [sct] Unique dimension object */ /* File format needed for decision tree and to enable netCDF4 features */ (void)nco_inq_format(grp_in_id,&fl_fmt); /* Local copy of object name */ strcpy(var_nm,var_trv->nm); /* Is requested variable in input file? */ rcd=nco_inq_varid_flg(grp_in_id,var_nm,&var_in_id); if(rcd != NC_NOERR) (void)fprintf(stdout,"%s: %s reports ERROR unable to find variable \"%s\"\n",nco_prg_nm_get(),fnc_nm,var_nm); /* Get type of variable and number of dimensions from input */ (void)nco_inq_var(grp_in_id,var_in_id,(char *)NULL,&var_typ,&nbr_dmn_var,(int *)NULL,(int *)NULL); dmn_in_id_var=(int *)nco_malloc(nbr_dmn_var*sizeof(int)); /* Get Program ID */ nco_prg_id=nco_prg_id_get(); if(nco_prg_id == ncks) assert(var_typ == var_trv->var_typ); assert(nbr_dmn_var == var_trv->nbr_dmn); var_typ=var_trv->var_typ; nbr_dmn_var=var_trv->nbr_dmn; /* Get dimension IDs for *variable* */ (void)nco_inq_vardimid(grp_in_id,var_in_id,dmn_in_id_var); /* Does user want a record dimension to receive special handling? */ if(rec_dmn_nm_cst){ /* Create (and later free()) local copy to preserve const-ness of passed value For simplicity, work with canonical name rec_dmn_nm */ rec_dmn_nm_mlc=strdup(rec_dmn_nm_cst); /* Parse rec_dmn_nm argument */ if(!strcmp("fix_all",rec_dmn_nm_mlc)){ FIX_ALL_REC_DMN=True; FIX_REC_DMN=True; rec_dmn_nm=rec_dmn_nm_mlc+4; }else if(!strncmp("fix_",rec_dmn_nm_mlc,(size_t)4)){ FIX_REC_DMN=True; /* [flg] Fix record dimension */ rec_dmn_nm=rec_dmn_nm_mlc+4; }else{ FIX_REC_DMN=False; /* [flg] Fix record dimension */ rec_dmn_nm=rec_dmn_nm_mlc; } /* strncmp() */ } /* !rec_dmn_nm_cst */ /* If variable has a re-defined record dimension. NOTE: this implies passing NULL as User-specified record dimension parameter */ if(var_trv->rec_dmn_nm_out){ assert(nco_prg_id == ncpdq); rec_dmn_nm=(char *)strdup(var_trv->rec_dmn_nm_out); } /* If variable has a re-defined record dimension */ /* Is requested record dimension in input file? */ if(rec_dmn_nm){ /* ncks */ if(nco_prg_id == ncks){ if(!FIX_ALL_REC_DMN){ int rec_dmn_id_dmy; rcd=nco_inq_dimid_flg(grp_in_id,rec_dmn_nm,&rec_dmn_id_dmy); /* Record name not found in this group */ if(rcd != NC_NOERR){ /* Nothing to do, error cheking for invalid dimension names was made at start */ } /* endif rcd != NC_NOERR */ if(rcd == NC_NOERR){ /* Does variable contain requested record dimension? */ for(int idx_dmn=0;idx_dmnis_rec_dmn; if(FIX_ALL_REC_DMN){ DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; if(CRR_DMN_IS_REC_IN_INPUT && nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s is defining all input record dimensions, including this one, %s, as fixed dimensions in output file per user request\n",nco_prg_nm_get(),fnc_nm,dmn_nm); }else if(rec_dmn_nm){ /* User requested (with --fix_rec_dmn or --mk_rec_dmn) to treat a certain dimension specially */ /* ... and this dimension is that dimension, i.e., the user-specified dimension ... */ if(!strcmp(dmn_nm,rec_dmn_nm)){ /* ... then honor user's request to define it as a fixed or record dimension ... */ if(nco_dbg_lvl_get() >= nco_dbg_std) (void)fprintf(stderr,"%s: INFO %s is defining dimension %s as %s dimension in output file per user request\n",nco_prg_nm_get(),fnc_nm,rec_dmn_nm,(FIX_REC_DMN) ? "fixed" : "record"); if(FIX_REC_DMN) DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; }else{ /* strcmp() */ if(FIX_REC_DMN){ /* ... fix_rec_dmn case is straightforward: output dimension has same format as input dimension */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; }else{ /* !FIX_REC_DMN */ /* ... otherwise we are in the --mk_rec_dmn case where things get complicated ... This dimension can be a record dimension only if it would not conflict with the requested record dimension being defined a record dimension, and that depends on file format. Uggh. 1. netCDF3 API allows only one record-dimension so conflicts are possible 2. netCDF4 API permits any number of unlimited dimensions so conflicts are impossible */ if(fl_fmt == NC_FORMAT_NETCDF4){ /* ... no conflicts possible so define dimension in output same as in input ... */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; }else{ /* !netCDF4 */ /* ... output file adheres to netCDF3 API so there can be only one record dimension. In other words, define all other dimensions as fixed, non-record dimensions, even if they are a record dimension in the input file ... */ if(CRR_DMN_IS_REC_IN_INPUT) (void)fprintf(stderr,"%s: INFO %s is defining dimension %s as fixed (non-record) in output file even though it is a record dimension in the input file. This is necessary to satisfy user request that %s be the record dimension in the output file which adheres to the netCDF3 API where the record dimension, if any, must be a variable's first dimension.\n",nco_prg_nm_get(),fnc_nm,dmn_nm,rec_dmn_nm); DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; } /* !netCDF4 */ } /* !FIX_REC_DMN */ } /* strcmp() */ }else{ /* !rec_dmn_nm */ /* ... no user-specified record dimension so define dimension in output same as in input ... */ if(CRR_DMN_IS_REC_IN_INPUT) DFN_CRR_DMN_AS_REC_IN_OUTPUT=True; else DFN_CRR_DMN_AS_REC_IN_OUTPUT=False; } /* !rec_dmn_nm && !FIX_ALL_REC_DMN */ /* At long last ... */ /* Define current index dimension size */ /* If current dimension is to be defined as record dimension in output file */ if(DFN_CRR_DMN_AS_REC_IN_OUTPUT){ if(var_trv->var_dmn[idx_dmn].is_crd_var){ dmn_cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; } else { dmn_cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; } (void)nco_dmn_set_msa(var_dim_id,dmn_cnt,trv_tbl); /* ! DFN_CRR_DMN_AS_REC_IN_OUTPUT */ }else{ /* Get size from GTT */ if(var_trv->var_dmn[idx_dmn].is_crd_var){ /* Set size */ dmn_cnt=var_trv->var_dmn[idx_dmn].crd->lmt_msa.dmn_cnt; /* Update GTT dimension */ (void)nco_dmn_set_msa(var_dim_id,dmn_cnt,trv_tbl); }else{ /* Set size */ dmn_cnt=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.dmn_cnt; /* Update GTT dimension */ (void)nco_dmn_set_msa(var_dim_id,dmn_cnt,trv_tbl); } /* end else */ } /* Define dimension size */ } /* end if dimension is not yet defined */ } /* End of the very important dimension loop */ dmn_in_id_var=(int *)nco_free(dmn_in_id_var); } /* end nco_dmn_msa_tbl() */ void nco_dmn_dgn_tbl /* [fnc] Transfer degenerated dimensions information into GTT */ (dmn_sct **dmn_dgn, /* [sct] Degenerate (size 1) dimensions used by ncwa */ const int nbr_dmn_dgn, /* I [nbr] Total number of dimensions in list */ trv_tbl_sct *trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { trv_tbl->nbr_dmn_dgn=nbr_dmn_dgn; trv_tbl->dmn_dgn=(dmn_sct *)nco_malloc(nbr_dmn_dgn*sizeof(dmn_sct)); /* Loop dimensions */ for(int idx_dmn=0;idx_dmndmn_dgn[idx_dmn].id=dmn_dgn[idx_dmn]->id; trv_tbl->dmn_dgn[idx_dmn].cnt=dmn_dgn[idx_dmn]->cnt; } /* Loop dimensions */ } /* nco_dmn_dgn_tbl() */ void nco_dmn_lst_ass_var_trv /* [fnc] Create list of all dimensions associated with input variable list (ncpdq, ncwa) */ (const int nc_id, /* I [id] netCDF file ID */ const trv_tbl_sct * const trv_tbl, /* I [sct] GTT (Group Traversal Table) */ int *nbr_dmn_xtr, /* O [nbr] Number of dimensions associated with variables to be extracted */ dmn_sct ***dmn) /* O [sct] Array of dimensions associated with variables to be extracted */ { /* Purpose: Create list of all dimensions associated with input variable list */ const char fnc_nm[]="nco_dmn_lst_ass_var_trv()"; /* [sng] Function name */ int nbr_dmn; /* [nbr] Number of dimensions associated with variables to be extracted */ long dmn_cnt; /* [nbr] Hyperslabbed size of dimension */ long dmn_sz; /* [nbr] Size of dimension */ nco_bool dmn_flg; /* [flg] Is dimension already inserted in output array */ nbr_dmn=0; /* Traverse table and match relative dimension names */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* If GTT variable object is to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Loop variable dimensions */ for(int idx_dmn_var=0;idx_dmn_varnm,var_trv.var_dmn[idx_dmn_var].dmn_nm)); /* Loop constructed array of output dimensions to see if already inserted */ for(int idx_dmn_out=0;idx_dmn_outid){ dmn_flg=True; break; } /* Match by ID */ } /* Loop constructed array of output dimensions to see if already inserted */ /* If this dimension is not in output array */ if(!dmn_flg){ /* Add one more element to array */ (*dmn)=(dmn_sct **)nco_realloc((*dmn),(nbr_dmn+1)*sizeof(dmn_sct *)); (*dmn)[nbr_dmn]=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); /* Get size from GTT. NOTE use index idx_dmn_var */ if(var_trv.var_dmn[idx_dmn_var].is_crd_var){ dmn_cnt=var_trv.var_dmn[idx_dmn_var].crd->lmt_msa.dmn_cnt; dmn_sz=var_trv.var_dmn[idx_dmn_var].crd->sz; (*dmn)[nbr_dmn]->is_crd_dmn=True; }else{ dmn_cnt=var_trv.var_dmn[idx_dmn_var].ncd->lmt_msa.dmn_cnt; dmn_sz=var_trv.var_dmn[idx_dmn_var].ncd->sz; (*dmn)[nbr_dmn]->is_crd_dmn=False; } /* end else */ (*dmn)[nbr_dmn]->nm=(char *)strdup(var_trv.var_dmn[idx_dmn_var].dmn_nm); (*dmn)[nbr_dmn]->id=var_trv.var_dmn[idx_dmn_var].dmn_id; (*dmn)[nbr_dmn]->nc_id=nc_id; (*dmn)[nbr_dmn]->xrf=NULL; (*dmn)[nbr_dmn]->val.vp=NULL; (*dmn)[nbr_dmn]->is_rec_dmn=dmn_trv->is_rec_dmn; (*dmn)[nbr_dmn]->cnt=dmn_cnt; (*dmn)[nbr_dmn]->sz=dmn_sz; (*dmn)[nbr_dmn]->srt=0L; (*dmn)[nbr_dmn]->end=dmn_cnt-1L; (*dmn)[nbr_dmn]->srd=1L; (*dmn)[nbr_dmn]->cid=-1; (*dmn)[nbr_dmn]->cnk_sz=0L; (*dmn)[nbr_dmn]->type=(nc_type)-1; nbr_dmn++; } /* If this dimension is not in output array */ } /* Loop variable dimensions */ } /* Filter variables */ } /* Loop table */ /* Export */ *nbr_dmn_xtr=nbr_dmn; if(nco_dbg_lvl_get() >= nco_dbg_dev){ (void)fprintf(stdout,"%s: DEBUG %s dimensions to export: ",nco_prg_nm_get(),fnc_nm); for(int idx_dmn=0;idx_dmn : ",(*dmn)[idx_dmn]->id,(*dmn)[idx_dmn]->nm); (void)fprintf(stdout,"\n"); } /* endif */ return; } /* end nco_dmn_lst_ass_var_trv() */ void nco_dmn_avg_mk /* [fnc] Build dimensions to average(ncwa)/re-order(ncpdq) array from input dimension names */ (const int nc_id, /* I [id] netCDF file ID */ char **obj_lst_in, /* I [sng] User-specified list of dimension names (-a names) */ const int nbr_dmn_in, /* I [nbr] Total number of dimensions in input list (size of above array) */ const nco_bool flg_dmn_prc_usr_spc, /* I [flg] Processed dimensions specified on command line */ const nco_bool flg_rdd, /* I [flg] Retain degenerate dimensions */ const trv_tbl_sct * const trv_tbl, /* I [sct] GTT (Group Traversal Table) */ dmn_sct ***dmn_avg, /* O [sct] Array of dimensions to average */ int *nbr_dmn_avg) /* O [nbr] Number of dimensions to average (size of above array) */ { /* Purpose: Create list of dimensions from list of dimension name strings. Function based on nco_xtr_mk(). */ /* Dimensions to average/not average are built using these 3 functions: nco_dmn_avg_mk() Build dimensions to average array from input dimension names nco_dmn_out_mk() Build dimensions array to keep on output nco_dmn_id_mk() Mark flag average for all dimensions that have the input ID nco_dmn_avg_mk() parses -a names and exports an array of dmn_sct; it marks the flag "flg_dmn_avg" of "var_dmn_sct" as True, if the dimension is to be averaged. Since variables share dimensions, this flag has to be marked to all variable's dimensions that have it; This broadcast is made in nco_dmn_id_mk(), using the unique dimension ID as key. nco_dmn_out_mk() checks this flag, and if the dimension is not to be averaged, it is added to an array of dmn_sct, dimensions on output. */ char *usr_sng; /* [sng] User-supplied object name */ int obj_nbr; /* [nbr] Number of objects in list */ int nbr_avg_dmn; /* [nbr] Number of dimensions to average (output) */ long dmn_cnt; /* [nbr] Hyperslabbed size of dimension */ long dmn_sz; /* [nbr] Size of dimension */ /* Used only by ncpdq , ncwa */ assert(nco_prg_id_get() == ncpdq || nco_prg_id_get() == ncwa); /* Initialize values */ obj_nbr=nbr_dmn_in; nbr_avg_dmn=0; /* Loop input dimension name list */ for(int idx_obj=0;idx_obj+?|{}")){ /* ... and regular expression library is present */ #ifdef NCO_HAVE_REGEX_FUNCTIONALITY /* fxm 20131217 TODO */ (void)fprintf(stdout,"%s: ERROR: Sorry, wildcarding (extended regular expression matches to dimension names) is not implemented for -a option.\n",nco_prg_nm_get()); nco_exit(EXIT_FAILURE); #else /* !NCO_HAVE_REGEX_FUNCTIONALITY */ (void)fprintf(stdout,"%s: ERROR: Sorry, wildcarding (extended regular expression matches to dimension names) was not built into this NCO executable, so unable to compile regular expression \"%s\".\nHINT: Make sure libregex.a is on path and re-build NCO.\n",nco_prg_nm_get(),usr_sng); nco_exit(EXIT_FAILURE); #endif /* !NCO_HAVE_REGEX_FUNCTIONALITY */ } /* end if regular expression */ } /* flg_dmn_prc_usr_spc */ /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv_obj=trv_tbl->lst[idx_tbl]; /* Variable to extract */ if(trv_obj.nco_typ == nco_obj_typ_var && trv_obj.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnnm,trv_obj.var_dmn[idx_var_dmn].dmn_nm) == 0); /* Dimension ID, used to avoid duplicate insertions */ int dmn_id=trv_obj.var_dmn[idx_var_dmn].dmn_id; /* Dimension name full */ char *dmn_nm_fll=trv_obj.var_dmn[idx_var_dmn].dmn_nm_fll; /* Dimension name relative */ char *dmn_nm=trv_obj.var_dmn[idx_var_dmn].dmn_nm; /* Must meet necessary flags */ nco_bool pth_mth=nco_pth_mch(dmn_nm_fll,dmn_nm,usr_sng); if(pth_mth){ int idx_dmn_out; /* [idx] Index for output dimensions */ /* Is dimension already in output array? Match by dimension ID since dimension IDs are unique */ for(idx_dmn_out=0;idx_dmn_outid) break; /* If this dimension is not yet in output array */ if(idx_dmn_out == nbr_avg_dmn){ /* Change flag to mark that dimension is to be averaged instead of to keep on output */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].flg_dmn_avg=True; /* Add one more element to array */ (*dmn_avg)=(dmn_sct **)nco_realloc((*dmn_avg),(nbr_avg_dmn+1)*sizeof(dmn_sct *)); (*dmn_avg)[nbr_avg_dmn]=(dmn_sct *)nco_malloc(sizeof(dmn_sct)); /* Get size from GTT. NOTE use index idx_var_dmn */ if(trv_obj.var_dmn[idx_var_dmn].is_crd_var){ dmn_cnt=trv_obj.var_dmn[idx_var_dmn].crd->lmt_msa.dmn_cnt; dmn_sz=trv_obj.var_dmn[idx_var_dmn].crd->sz; (*dmn_avg)[nbr_avg_dmn]->is_crd_dmn=True; }else{ dmn_cnt=trv_obj.var_dmn[idx_var_dmn].ncd->lmt_msa.dmn_cnt; dmn_sz=trv_obj.var_dmn[idx_var_dmn].ncd->sz; (*dmn_avg)[nbr_avg_dmn]->is_crd_dmn=False; } /* end else */ (*dmn_avg)[nbr_avg_dmn]->nm=(char *)strdup(trv_obj.var_dmn[idx_var_dmn].dmn_nm); (*dmn_avg)[nbr_avg_dmn]->nm_fll=(char *)strdup(trv_obj.var_dmn[idx_var_dmn].dmn_nm_fll); (*dmn_avg)[nbr_avg_dmn]->id=trv_obj.var_dmn[idx_var_dmn].dmn_id; (*dmn_avg)[nbr_avg_dmn]->nc_id=nc_id; (*dmn_avg)[nbr_avg_dmn]->xrf=NULL; (*dmn_avg)[nbr_avg_dmn]->val.vp=NULL; (*dmn_avg)[nbr_avg_dmn]->is_rec_dmn=dmn_trv->is_rec_dmn; (*dmn_avg)[nbr_avg_dmn]->cnt=dmn_cnt; (*dmn_avg)[nbr_avg_dmn]->sz=dmn_sz; (*dmn_avg)[nbr_avg_dmn]->srt=0L; (*dmn_avg)[nbr_avg_dmn]->end=dmn_cnt-1L; (*dmn_avg)[nbr_avg_dmn]->srd=1L; (*dmn_avg)[nbr_avg_dmn]->cid=-1; (*dmn_avg)[nbr_avg_dmn]->cnk_sz=0L; (*dmn_avg)[nbr_avg_dmn]->type=(nc_type)-1; /* Broadcast flag average/keep using dimension ID; variables share dimensions */ (void)nco_dmn_id_mk(dmn_id,flg_rdd,trv_tbl); /* Increment number of dimensions found */ nbr_avg_dmn++; } /* If this dimension is not in output array */ } /* Must meet necessary flags */ } /* Loop variable dimensions */ } /* Variable to extract */ } /* Loop table */ } /* Loop input dimension name list */ /* Export */ *nbr_dmn_avg=nbr_avg_dmn; if(nco_dbg_lvl_get() >= nco_dbg_var){ (void)fprintf(stdout,"%s: INFO dimensions to average: ",nco_prg_nm_get()); for(int idx_dmn=0;idx_dmn",(*dmn_avg)[idx_dmn]->nm); (void)fprintf(stdout,"\n"); } /* endif dbg */ return; } /* nco_dmn_avg_mk() */ void nco_dmn_out_mk /* [fnc] Build dimensions array to keep on output */ (dmn_sct **dmn_xtr, /* I [sct] Array of dimensions associated with variables to be extracted */ const int nbr_dmn_xtr, /* I [nbr] Number of dimensions associated with variables to be extracted (size of above array) */ const trv_tbl_sct * const trv_tbl, /* I [sct] GTT (Group Traversal Table) */ dmn_sct ***dmn_out, /* O [sct] Array of dimensions on ouput */ int *nbr_dmn_out) /* O [nbr] Number of dimensions on output (size of above array) */ { /* Purpose: Create list of dimensions from list of dimension name strings */ const char fnc_nm[]="nco_dmn_out_mk()"; /* [sng] Function name */ int nbr_out_dmn; /* [nbr] Number of dimensions to keep in output */ nco_bool flg_dmn_ins; /* [flg] Is dimension already inserted in output array */ /* Used only by ncpdq , ncwa */ assert(nco_prg_id_get() == ncpdq || nco_prg_id_get() == ncwa); /* Initialize values */ nbr_out_dmn=0; /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv_obj=trv_tbl->lst[idx_tbl]; /* Variable to extract */ if(trv_obj.nco_typ == nco_obj_typ_var && trv_obj.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnid){ /* Assume dimension is not yet inserted in array */ flg_dmn_ins=False; /* Loop constructed array of output dimensions to see if already inserted */ for(int idx_dmn_out=0;idx_dmn_outid){ /* Mark as inserted in array */ flg_dmn_ins=True; break; } /* Match by ID */ } /* Loop constructed array of output dimensions to see if already inserted */ /* If this dimension is not in output array */ if(!flg_dmn_ins){ /* Output list comprises non-averaged and, if specified, degenerate dimensions */ (*dmn_out)[nbr_out_dmn]=nco_dmn_dpl(dmn_xtr[idx_xtr_dmn]); (void)nco_dmn_xrf(dmn_xtr[idx_xtr_dmn],(*dmn_out)[nbr_out_dmn]); nbr_out_dmn++; } /* If this dimension is not in output array */ } /* Match by ID */ } /* Search dimensions to be extracted */ } /* This dimension is not to be averaged, it is to be kept on output */ } /* Loop variable dimensions */ } /* Variable to extract */ } /* Loop table */ /* Export */ *nbr_dmn_out=nbr_out_dmn; if(nco_dbg_lvl_get() >= nco_dbg_dev){ (void)fprintf(stdout,"%s: DEBUG %s dimensions to keep on output: ",nco_prg_nm_get(),fnc_nm); for(int idx_dmn=0;idx_dmn : ",(*dmn_out)[idx_dmn]->id,(*dmn_out)[idx_dmn]->nm); (void)fprintf(stdout,"\n"); } /* endif dbg */ return; } /* nco_dmn_out_mk() */ void nco_dmn_id_mk /* [fnc] Mark flag average, optionally flag degenerate for all dimensions that have the input ID */ (const int dmn_id, /* I [nbr] Number of dimensions associated with variables to be extracted (size of above array) */ const nco_bool flg_rdd, /* I [flg] Mark flag retain degenerate dimension */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Purpose: Mark flag average, optionally flag degenerate for all dimensions that have the input ID */ /* Used only by ncpdq , ncwa */ assert(nco_prg_id_get() == ncpdq || nco_prg_id_get() == ncwa); /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct trv_obj=trv_tbl->lst[idx_tbl]; /* Variable to extract */ if(trv_obj.nco_typ == nco_obj_typ_var && trv_obj.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnlst[idx_tbl].var_dmn[idx_var_dmn].flg_dmn_avg=True; /* Change flag to retain degenerate dimension */ if(flg_rdd) trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].flg_rdd=True; } /* Match ID */ } /* Loop variable dimensions */ } /* Variable to extract */ } /* Loop table */ return; } /* nco_dmn_id_mk() */ void nco_bld_rec_dmn /* [fnc] Build record dimensions array */ (const int nc_id, /* I [ID] netCDF input file ID */ const nco_bool FORTRAN_IDX_CNV, /* I [flg] Hyperslab indices obey Fortran convention */ lmt_sct ***lmt_rec, /* I/O [lst] (ncra) Record dimensions */ int *nbr_rec, /* I/O [nbr] (ncra) Number of record dimensions (size of above array) */ trv_tbl_sct * trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { const char fnc_nm[]="nco_bld_rec_dmn()"; /* [sng] Function name */ int var_id; /* [id] Variable ID */ int grp_id; /* [id] Group ID */ dmn_trv_sct *dmn_trv; /* [sct] Unique dimension object */ nco_bool flg_dmn_ins; /* [flg] Is dimension already inserted in output array */ int rec_nbr; /* [sct] Number of record dimensions to export */ #ifndef ENABLE_UDUNITS nco_bool flg_prn=False; #endif /* !ENABLE_UDUNITS */ /* Initialize */ rec_nbr=0; /* Used only by record operators ncra,ncrcat */ assert(nco_prg_id_get() == ncra || nco_prg_id_get() == ncrcat); /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Filter extracted variables */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnis_rec_dmn){ /* Loop constructed array of output dimensions to see if already inserted */ for(int idx_dmn_out=0;idx_dmn_outid){ /* Mark as inserted in array */ flg_dmn_ins=True; break; } /* Match by ID */ } /* Loop constructed array of output dimensions to see if already inserted */ /* If this dimension is not in output array */ if(!flg_dmn_ins){ /* Add one more element to array */ (*lmt_rec)=(lmt_sct **)nco_realloc((*lmt_rec),(rec_nbr+1)*sizeof(lmt_sct *)); (*lmt_rec)[rec_nbr]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv.grp_nm_fll,&grp_id); /* a) case where the dimension has coordinate variables */ if(var_trv.var_dmn[idx_var_dmn].crd){ crd_sct *crd=var_trv.var_dmn[idx_var_dmn].crd; /* Create stand-alone limit structure for given dimension */ (*lmt_rec)[rec_nbr]=nco_lmt_sct_mk(grp_id,dmn_id,crd->lmt_msa.lmt_dmn,crd->lmt_msa.lmt_dmn_nbr,FORTRAN_IDX_CNV); /* Insert full group name, key for group ID match */ (*lmt_rec)[rec_nbr]->grp_nm_fll=(char *)strdup(crd->crd_grp_nm_fll); (*lmt_rec)[rec_nbr]->nm_fll=(char *)strdup(crd->dmn_nm_fll); /* b) case of dimension only (there is no coordinate variable for this dimension */ }else{ dmn_trv_sct *ncd=var_trv.var_dmn[idx_var_dmn].ncd; /* Create stand-alone limit structure for given dimension */ (*lmt_rec)[rec_nbr]=nco_lmt_sct_mk(grp_id,dmn_id,ncd->lmt_msa.lmt_dmn,ncd->lmt_msa.lmt_dmn_nbr,FORTRAN_IDX_CNV); /* Insert full group name, key for group ID match */ (*lmt_rec)[rec_nbr]->grp_nm_fll=(char *)strdup(ncd->grp_nm_fll); (*lmt_rec)[rec_nbr]->nm_fll=(char *)strdup(ncd->nm_fll); } /* b) case of dimension only (there is no coordinate variable for this dimension */ (*lmt_rec)[rec_nbr]->lmt_cln=cln_nil; (*lmt_rec)[rec_nbr]->origin=0.0; (*lmt_rec)[rec_nbr]->rbs_sng=NULL; /* Check if coordinate variable */ int rcd=nco_inq_varid_flg(grp_id,var_trv.var_dmn[idx_var_dmn].dmn_nm,&var_id); /* Obtain record coordinate metadata */ if(rcd == NC_NOERR){ char *cln_att_sng=NULL; (*lmt_rec)[rec_nbr]->rbs_sng=nco_lmt_get_udu_att(grp_id,var_id,"units"); cln_att_sng=nco_lmt_get_udu_att(grp_id,var_id,"calendar"); (*lmt_rec)[rec_nbr]->lmt_cln=nco_cln_get_cln_typ(cln_att_sng); if(cln_att_sng) cln_att_sng=(char*)nco_free(cln_att_sng); } /* endif */ /* Store ID */ (*lmt_rec)[rec_nbr]->id=dmn_id; #ifndef ENABLE_UDUNITS if(nco_dbg_lvl_get() >= nco_dbg_vrb && nco_dbg_lvl_get() != nco_dbg_dev && flg_prn == False){ if((*lmt_rec)[rec_nbr]->rbs_sng) (void)fprintf(stderr,"%s: WARNING Record coordinate %s has a \"units\" attribute but NCO was built without UDUnits. NCO is therefore unable to detect and correct for inter-file unit re-basing issues. See http://nco.sf.net/nco.html#rbs for more information.\n%s: HINT Re-build or re-install NCO enabled with UDUnits.\n", nco_prg_nm_get(),(*lmt_rec)[rec_nbr]->nm,nco_prg_nm_get()); flg_prn=True; } #endif /* !ENABLE_UDUNITS */ /* Increase array size */ rec_nbr++; } /* If this dimension is not in output array */ } /* Is record */ } /* Loop variable dimensions */ } /* Variable to extract */ } /* Loop table */ if(nco_dbg_lvl_get() >= nco_dbg_dev){ (void)fprintf(stdout,"%s: DEBUG %s record dimensions to process: ",nco_prg_nm_get(),fnc_nm); for(int idx_rec=0;idx_rec : ",(*lmt_rec)[idx_rec]->id,(*lmt_rec)[idx_rec]->grp_nm_fll,(*lmt_rec)[idx_rec]->nm); (void)fprintf(stdout,"\n"); } /* endif dbg */ /* Export */ *nbr_rec=rec_nbr; return; } /* nco_bld_rec_dmn() */ void nco_prn_tbl_lmt /* [fnc] Print table limits */ (trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { const char fnc_nm[]="nco_prn_tbl_lmt()"; /* [sng] Function name */ /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Is variable */ if(var_trv.nco_typ == nco_obj_typ_var){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnlst[idx_tbl].var_dmn[idx_var_dmn].crd; int lmt_dmn_nbr=crd->lmt_msa.lmt_dmn_nbr; if(lmt_dmn_nbr){ (void)fprintf(stdout,"%s: INFO %s : <%s> : %s : limits:%d ->",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,var_trv.var_dmn[idx_var_dmn].dmn_nm,lmt_dmn_nbr); for(int lmt_idx=0;lmt_idxlmt_msa.lmt_dmn[lmt_idx]; (void)fprintf(stdout," [%d]%s(%li,%li,%li) :",lmt_idx,lmt_dmn->nm,lmt_dmn->srt,lmt_dmn->cnt,lmt_dmn->srd); } /* endfor */ (void)fprintf(stdout,"\n"); } /* endif */ /* b) case of dimension only (there is no coordinate variable for this dimension */ }else{ dmn_trv_sct *ncd=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd; int lmt_dmn_nbr=ncd->lmt_msa.lmt_dmn_nbr; if(lmt_dmn_nbr){ (void)fprintf(stdout,"%s: INFO %s : <%s> : %s :limits: %d->",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,var_trv.var_dmn[idx_var_dmn].dmn_nm,lmt_dmn_nbr); for(int lmt_idx=0;lmt_idxlmt_msa.lmt_dmn[lmt_idx]; (void)fprintf(stdout," [%d]%s(%li,%li,%li) :",lmt_idx,lmt_dmn->nm,lmt_dmn->srt,lmt_dmn->cnt,lmt_dmn->srd); } /* endfor */ (void)fprintf(stdout,"\n"); } /* endif */ } /* b) case of dimension only (there is no coordinate variable for this dimension */ } /* Loop variable dimensions */ } /* Is variable */ } /* Loop table */ } /* nco_prn_tbl_lmt() */ void nco_bld_trv_tbl /* [fnc] Construct GTT, Group Traversal Table (groups,variables,dimensions, limits) */ (const int nc_id, /* I [ID] netCDF file ID */ char * const grp_pth, /* I [sng] Absolute group path where to start build (root typically) */ int lmt_nbr, /* I [nbr] number of dimensions with limits */ CST_X_PTR_CST_PTR_CST_Y(char,lmt_arg), /* I [sng] List of user-specified dimension limits */ const int aux_nbr, /* I [nbr] Number of auxiliary coordinates */ char *aux_arg[], /* I [sng] Auxiliary coordinates */ nco_bool MSA_USR_RDR, /* I [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ nco_bool FORTRAN_IDX_CNV, /* I [flg] Hyperslab indices obey Fortran convention */ char **grp_lst_in, /* I [sng] User-specified list of groups */ const int grp_lst_in_nbr, /* I [nbr] Number of groups in list */ char **var_lst_in, /* I [sng] User-specified list of variables */ const int var_xtr_nbr, /* I [nbr] Number of variables in list */ const nco_bool EXTRACT_ALL_COORDINATES, /* I [flg] Process all coordinates */ const nco_bool flg_unn, /* I [flg] Select union of specified groups and variables */ const nco_bool GRP_XTR_VAR_XCL, /* I [flg] Extract matching groups, exclude matching variables */ const nco_bool EXCLUDE_INPUT_LIST, /* I [flg] Exclude rather than extract groups and variables specified with -v */ const nco_bool EXTRACT_ASSOCIATED_COORDINATES, /* I [flg] Extract all coordinates associated with extracted variables? */ const int nco_pck_plc, /* I [enm] Packing policy */ nco_dmn_dne_t **flg_dne, /* I/O [lst] Flag to check if input dimension -d "does not exist" */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Construct GTT, Group Traversal Table (groups, variables, dimensions, limits) Return value: Check for valid input; NC_NOERR (0) or > 0 for a user input error, used to go to close_and_free on main Notes: Dimension limit structures are handled internally in this function and not exported Call sequence is important: 1) nco_trv_hsh_bld() must be called after nco_grp_itr() because other functions use hash table 2) nco_grp_itr() must be first, main iterator function. Then nco_bld_dmn_ids_trv() nco_bld_crd_rec_var_trv() nco_bld_crd_var_trv() nco_has_crd_dmn_scp() nco_bld_var_dmn() Traversal table now has all necessary _structures_ complete Next, call functions dependent on user-supplied options: nco_xtr_mk() nco_xtr_xcl() nco_xtr_crd_add() nco_xtr_crd_ass_add() nco_xtr_cf_add() Limit-related functions must be called in order: nco_lmt_prs() nco_prs_aux_crd() nco_chk_dmn_in() Functions called for specific operators include: ncbo: trv_tbl_srt() nces: nco_bld_nsm() */ const char fnc_nm[]="nco_bld_trv_tbl()"; /* [sng] Function name */ nco_bool CNV_CCM_CCSM_CF; /* [flg] File adheres to NCAR CCM/CCSM/CF conventions */ lmt_sct **lmt=NULL_CEWI; /* [sct] User defined limits */ /* Construct traversal table objects (groups, variables) */ (void)nco_grp_itr(nc_id,(char *)NULL,grp_pth,trv_tbl); /* Build dimension information for all variables (match dimension IDs) */ (void)nco_bld_dmn_ids_trv(nc_id,trv_tbl); /* Build "is_crd_var" and "is_rec_var" members for all variables */ (void)nco_bld_crd_rec_var_trv(trv_tbl); /* Build GTT "crd_sct" coordinate variable structure */ (void)nco_bld_crd_var_trv(trv_tbl); /* Variables in dimension's scope? */ (void)nco_has_crd_dmn_scp(trv_tbl); /* Assign variables' dimensions to either coordinates or dimension structs */ (void)nco_bld_var_dmn(trv_tbl); /* ncbo co-sequential match algorithm requires alphabetical sorted full names. Do it here, to avoid rebuilding hash table */ if(nco_prg_id_get() == ncbo) (void)trv_tbl_srt(trv_tbl); /* Hash traversal table for faster access */ (void)nco_trv_hsh_bld(trv_tbl); /* Build auxiliary coordinates information into table */ if(aux_nbr) (void)nco_bld_crd_aux(nc_id,trv_tbl); /* Check -v and -g input names and create extraction list */ (void)nco_xtr_mk(grp_lst_in,grp_lst_in_nbr,var_lst_in,var_xtr_nbr,EXCLUDE_INPUT_LIST,EXTRACT_ALL_COORDINATES,flg_unn,trv_tbl); /* Change included variables to excluded variables */ if(EXCLUDE_INPUT_LIST) (void)nco_xtr_xcl(EXTRACT_ASSOCIATED_COORDINATES,GRP_XTR_VAR_XCL,trv_tbl); /* Add all coordinate variables to extraction list */ if(EXTRACT_ALL_COORDINATES) (void)nco_xtr_crd_add(trv_tbl); /* Extract coordinates associated with extracted variables */ if(EXTRACT_ASSOCIATED_COORDINATES) (void)nco_xtr_crd_ass_add(nc_id,trv_tbl); /* Is this a CCM/CCSM/CF-format history tape? */ CNV_CCM_CCSM_CF=nco_cnv_ccm_ccsm_cf_inq(nc_id); if(!CNV_CCM_CCSM_CF && aux_nbr){ (void)fprintf(stderr,"%s: WARNING -X option selected on input lacking global \"Conventions=CF-1.X\" attribute. Assuming CF-compliance intended in order to exploit -X. HINT: To fix this warning, add conformant Conventions attribute with, e.g., \"ncatted -a Conventions,global,c,c,CF-1.0 in.nc\"\n",nco_prg_nm_get()); CNV_CCM_CCSM_CF=True; } /* endif */ if(CNV_CCM_CCSM_CF && EXTRACT_ASSOCIATED_COORDINATES){ /* Implement CF "ancillary_variables", "bounds", "climatology", and "coordinates" */ (void)nco_xtr_cf_add(nc_id,"ancillary_variables",trv_tbl); (void)nco_xtr_cf_add(nc_id,"bounds",trv_tbl); (void)nco_xtr_cf_add(nc_id,"climatology",trv_tbl); (void)nco_xtr_cf_add(nc_id,"coordinates",trv_tbl); /* Do all twice, so that, e.g., auxiliary coordinates retrieved because of "coordinates" come with their bounds variables */ (void)nco_xtr_cf_add(nc_id,"ancillary_variables",trv_tbl); (void)nco_xtr_cf_add(nc_id,"climatology",trv_tbl); (void)nco_xtr_cf_add(nc_id,"coordinates",trv_tbl); (void)nco_xtr_cf_add(nc_id,"bounds",trv_tbl); } /* CNV_CCM_CCSM_CF */ /* Mark extracted dimensions */ (void)nco_xtr_dmn_mrk(trv_tbl); /* Mark extracted groups */ (void)nco_xtr_grp_mrk(trv_tbl); /* Parse auxiliary coordinates and build found limits directly into table (auxiliary limits are not merged into regular limits) */ if(aux_nbr) (void)nco_prs_aux_crd(nc_id,aux_nbr,aux_arg,FORTRAN_IDX_CNV,MSA_USR_RDR,EXTRACT_ASSOCIATED_COORDINATES,trv_tbl); /* Add dimension limits */ if(lmt_nbr){ lmt=nco_lmt_prs(lmt_nbr,lmt_arg); (void)nco_bld_lmt(nc_id,MSA_USR_RDR,lmt_nbr,lmt,FORTRAN_IDX_CNV,trv_tbl); } /* !lmt_nbr */ /* Build ensembles */ if(nco_prg_id_get() == ncge) (void)nco_bld_nsm(nc_id,True,CNV_CCM_CCSM_CF,nco_pck_plc,trv_tbl); if(nco_prg_id_get() == ncbo) (void)nco_bld_nsm(nc_id,False,CNV_CCM_CCSM_CF,nco_pck_plc,trv_tbl); /* Check valid input (limits) */ if(lmt_nbr) (void)nco_chk_dmn_in(lmt_nbr,lmt,flg_dne,trv_tbl); /* Free limits */ if(lmt_nbr > 0) lmt=nco_lmt_lst_free(lmt,lmt_nbr); if(nco_dbg_lvl_get() == nco_dbg_vrb) trv_tbl_prn_flg_xtr(fnc_nm,trv_tbl); return; } /* nco_bld_trv_tbl() */ void nco_chk_dmn /* [fnc] Check valid dimension names */ (const int lmt_nbr, /* I [nbr] number of dimensions with limits */ nco_dmn_dne_t * flg_dne) /* I/O [lst] Flag to check if input dimension -d "does not exist" */ { /* Were all user-specified dimensions found? */ for(int lmt_idx=0;lmt_idxnm); (*dne_lst)[lmt_idx].dim_nm=(char *) strdup(lmt[lmt_idx]->nm); /* Match input relative name to dimension relative name */ for(unsigned int dmn_idx=0;dmn_idxnbr_dmn;dmn_idx++) if(!strcmp(lmt[lmt_idx]->nm,trv_tbl->lst_dmn[dmn_idx].nm)) (*dne_lst)[lmt_idx].flg_dne=False; } /* end for */ } /* nco_chk_dmn_in() */ void nco_bld_lmt /* [fnc] Assign user specified dimension limits to traversal table */ (const int nc_id, /* I [ID] netCDF file ID */ nco_bool MSA_USR_RDR, /* I [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ int lmt_nbr, /* I [nbr] Number of user-specified dimension limits */ lmt_sct **lmt, /* I [sct] Limit array. Structure comming from nco_lmt_prs() */ nco_bool FORTRAN_IDX_CNV, /* I [flg] Hyperslab indices obey Fortran convention */ trv_tbl_sct * const trv_tbl) /* I/O [sct] Traversal table */ { /* Purpose: Assign user-specified dimension limits to traversal table At this point "lmt" was parsed from nco_lmt_prs(); only the relative names and min, max, stride are known Steps: Find the total numbers of matches for a dimension ncks -d lon,0,0,1 ~/nco/data/in_grp.nc Here "lmt_nbr" is 1 and there is 1 match at most ncks -d lon,0,0,1 -d lon,0,0,1 -d lat,0,0,1 ~/nco/data/in_grp.nc Here "lmt_nbr" is 3 and there are 2 matches at most for "lon" and 1 match at most for "lat" The limits have to be separated to a) case of coordinate variables b) case of dimension only (there is no coordinate variable for that dimension) Deep copy matches to table, match at the current index, increment current index Apply MSA for each Dimension in a new cycle (that now has all its limits in place :-) ) At this point lmt_sct is no longer needed; Tests: ncks -D 11 -d lon,0,0,1 -d lon,1,1,1 -d lat,0,0,1 -d time,1,2,1 -d time,6,7,1 -v lon,lat,time -H ~/nco/data/in_grp.nc ncks -D 11 -d time,8,9 -d time,0,2 -v time -H ~/nco/data/in_grp.nc ncks -D 11 -d time,8,2 -v time -H ~/nco/data/in_grp.nc # wrapped limit */ /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Is variable to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnnm,var_trv.var_dmn[idx_var_dmn].dmn_nm) == 0){ /* The limits have to be separated to */ /* a) case where the dimension has coordinate variables */ if(var_trv.var_dmn[idx_var_dmn].crd){ /* Increment number of dimension limits for this dimension */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn_nbr++; int nbr_lmt=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn_nbr; trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn=(lmt_sct **)nco_realloc( trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn,nbr_lmt*sizeof(lmt_sct *)); /* b) case of dimension only (there is no coordinate variable for this dimension */ }else{ /* Increment number of dimension limits for this dimension */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn_nbr++; int nbr_lmt=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn_nbr; trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn=(lmt_sct **)nco_realloc( trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn,nbr_lmt*sizeof(lmt_sct *)); } /* b) case of dimension only (there is no coordinate variable for this dimension */ } /* Match input relative name to dimension relative name */ } /* Loop input name list */ } /* Loop variable dimensions */ } /* Is variable to extract */ } /* Loop table */ /* Store matches in table, match at the current index, increment current index */ /* Loop table */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Is variable to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnnm,var_trv.var_dmn[idx_var_dmn].dmn_nm) == 0){ /* Divide limits into two different cases */ /* a) Dimension has coordinate variables */ if(var_trv.var_dmn[idx_var_dmn].crd){ crd_sct *crd=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd; /* Limit is same as dimension in input file? */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.NON_HYP_DMN=False; /* Parse user-specified limits into hyperslab specifications. NOTE: Use True parameter and "crd" */ (void)nco_lmt_evl_dmn_crd(nc_id,0L,FORTRAN_IDX_CNV,crd->crd_grp_nm_fll,crd->nm,crd->sz,crd->is_rec_dmn,True,lmt[lmt_idx]); /* Current index (lmt_crr) of dimension limits for this (idx_dmn) table dimension */ int lmt_crr=crd->lmt_msa.lmt_crr; /* Increment current index being initialized */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_crr++; /* Alloc this limit */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn[lmt_crr]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize this entry */ (void)nco_lmt_init(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn[lmt_crr]); /* Store dimension ID */ lmt[lmt_idx]->id=crd->dmn_id; /* Store this valid input; deep-copy to table */ (void)nco_lmt_cpy(lmt[lmt_idx],trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn[lmt_crr]); }else{ /* b) Dimension only (no coordinate variable for this dimension) */ dmn_trv_sct *ncd=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd; /* Limit is same as dimension in input file ? */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.NON_HYP_DMN=False; /* Parse user-specified limits into hyperslab specifications. NOTE: Use False parameter and "dmn" */ (void)nco_lmt_evl_dmn_crd(nc_id,0L,FORTRAN_IDX_CNV,ncd->grp_nm_fll,ncd->nm,ncd->sz,ncd->is_rec_dmn,False,lmt[lmt_idx]); /* Current index (lmt_crr) of dimension limits for this (idx_dmn) table dimension */ int lmt_crr=ncd->lmt_msa.lmt_crr; /* Increment current index being initialized */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_crr++; /* Alloc this limit */ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn[lmt_crr]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize this entry */ (void)nco_lmt_init(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn[lmt_crr]); /* Store dimension ID */ lmt[lmt_idx]->id=ncd->dmn_id; /* Store this valid input; deep-copy to table */ (void)nco_lmt_cpy(lmt[lmt_idx],trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn[lmt_crr]); } /* b) case of dimension only (there is no coordinate variable for this dimension */ } /* Match input relative name to dimension relative name */ } /* Loop input name list */ } /* Loop variable dimensions */ } /* Is variable to extract */ } /* Loop table step 2 */ /* Apply MSA for each Dimension in new cycle (that now has all its limits in place) */ /* Loop table step 3 */ for(unsigned int idx_tbl=0;idx_tblnbr;idx_tbl++){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Is variable to extract */ if(var_trv.nco_typ == nco_obj_typ_var && var_trv.flg_xtr){ /* Loop variable dimensions */ for(int idx_var_dmn=0;idx_var_dmnnm,var_trv.var_dmn[idx_var_dmn].dmn_nm) == 0){ /* Limits divide into two cases */ /* a) Dimension has coordinate variables */ if(var_trv.var_dmn[idx_var_dmn].crd){ /* Adapted from original MSA loop in nco_msa_lmt_all_ntl(); differences are marked GTT specific */ nco_bool flg_ovl; /* [flg] Limits overlap */ crd_sct *crd=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd; /* GTT: If this coordinate has no limits, continue */ if(crd->lmt_msa.lmt_dmn_nbr == 0) continue; /* ncra/ncrcat have only one limit for record dimension so skip evaluation otherwise this messes up multi-file operation */ if(crd->is_rec_dmn && (nco_prg_id_get() == ncra || nco_prg_id_get() == ncrcat)) continue; /* Split-up wrapped limits. NOTE: using deep copy version nco_msa_wrp_splt_cpy() */ (void)nco_msa_wrp_splt_cpy(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); /* Wrapped hyperslabs are dimensions broken into the "wrong" order, e.g., from -d time,8,2 broken into -d time,8,9 -d time,0,2 WRP flag set only when list contains dimensions split as above */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.WRP){ /* Find and store size of output dim */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); continue; } /* End WRP flag set */ /* Single slab---no analysis needed */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.lmt_dmn_nbr == 1){ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); continue; } /* End Single slab */ /* Does Multi-Slab Algorithm returns hyperslabs in user-specified order? */ if(MSA_USR_RDR){ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa.MSA_USR_RDR=True; /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); continue; } /* End MSA_USR_RDR */ /* Sort limits */ (void)nco_msa_qsort_srt(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); /* Check for overlap */ flg_ovl=nco_msa_ovl(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].crd->lmt_msa); if(nco_dbg_lvl_get() >= nco_dbg_fl){ if(flg_ovl) (void)fprintf(stdout,"%s: coordinate \"%s\" has overlapping hyperslabs\n",nco_prg_nm_get(),crd->nm); else (void)fprintf(stdout,"%s: coordinate \"%s\" has distinct hyperslabs\n",nco_prg_nm_get(),crd->nm); } /* endif */ }else{ /* b) Dimension only (no coordinate variable for this dimension) */ dmn_trv_sct *ncd=trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd; /* Adapted from the original MSA loop in nco_msa_lmt_all_ntl(); differences are marked GTT specific */ nco_bool flg_ovl; /* [flg] Limits overlap */ /* GTT: If this dimension has no limits, continue */ if(ncd->lmt_msa.lmt_dmn_nbr == 0) continue; /* ncra/ncrcat have only one limit for record dimension so skip evaluation otherwise this messes up multi-file operation */ if(ncd->is_rec_dmn && (nco_prg_id_get() == ncra || nco_prg_id_get() == ncrcat)) continue; /* Split-up wrapped limits */ (void)nco_msa_wrp_splt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); /* Wrapped hyperslabs are dimensions broken into the "wrong" order,e.g. from -d time,8,2 broken into -d time,8,9 -d time,0,2 WRP flag set only when list contains dimensions split as above */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.WRP){ /* Find and store size of output dim */ (void)nco_msa_clc_cnt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); continue; } /* End WRP flag set */ /* Single slab---no analysis needed */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.lmt_dmn_nbr == 1){ (void)nco_msa_clc_cnt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); continue; } /* End Single slab */ /* Does Multi-Slab Algorithm returns hyperslabs in user-specified order ? */ if(MSA_USR_RDR){ trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.MSA_USR_RDR=True; /* Find and store size of output dimension */ (void)nco_msa_clc_cnt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); continue; } /* End MSA_USR_RDR */ /* Sort limits */ (void)nco_msa_qsort_srt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); /* Check for overlap */ flg_ovl=nco_msa_ovl_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); if(!flg_ovl) trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd->lmt_msa.MSA_USR_RDR=True; /* Find and store size of output dimension */ (void)nco_msa_clc_cnt_trv(trv_tbl->lst[idx_tbl].var_dmn[idx_var_dmn].ncd); if(nco_dbg_lvl_get() >= nco_dbg_fl){ if(flg_ovl) (void)fprintf(stdout,"%s: dimension \"%s\" has overlapping hyperslabs\n",nco_prg_nm_get(),ncd->nm); else (void)fprintf(stdout,"%s: dimension \"%s\" has distinct hyperslabs\n",nco_prg_nm_get(),ncd->nm); } /* endif */ } /* b) case of dimension only (there is no coordinate variable for this dimension */ } /* Match input relative name to dimension relative name */ } /* Loop input name list */ } /* Loop variable dimensions */ } /* Is variable to extract */ } /* Loop table step 3 */ } /* nco_bld_lmt() */ void nco_msa_var_get_rec_trv /* [fnc] Read a user-defined limit */ (const int nc_id, /* I [ID] netCDF file ID */ var_sct *var_prc, /* I/O [sct] Variable */ const char * const rec_nm_fll, /* I [sng] Record dimension name */ const long idx_rec_crr_in, /* [idx] Index of current record in current input file */ const trv_tbl_sct * const trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { /* Routine acts as a "shim" for nco_msa_var_get_trv() nco_msa_var_get_trv() typically reads entire variable as hyperslabbed by user Yet ncra and ncrcat require only one record at a time, and that record changes nco_msa_var_get_rec_trv() defines a temporary, artificial MSA limit that corresponds to desired single record It then calls nco_msa_var_get_trv() with this limit structure */ int lmt_dmn_nbr; nco_bool flg_lmt=False; /* [flg] Allocate custom limit */ trv_sct *var_trv; /* Obtain variable GTT object using full variable name */ var_trv=trv_tbl_var_nm_fll(var_prc->nm_fll,trv_tbl); for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ /* Match current record by name since ID may differ for records across files */ if(!strcmp(var_trv->var_dmn[idx_dmn].dmn_nm_fll,rec_nm_fll)){ if(var_trv->var_dmn[idx_dmn].crd){ /* Dimension is coordinate */ lmt_dmn_nbr=var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr; /* Case of previously existing limits */ if(lmt_dmn_nbr > 0){ for(int idx_lmt=0;idx_lmtvar_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]->srt=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]->end=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]->cnt=1L; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]->srd=1L; } }else{ /* lmt_dmn_nbr == 0 */ flg_lmt=True; /* Alloc dummy limit */ var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr=1; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn=(lmt_sct **)nco_malloc(sizeof(lmt_sct *)); /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize NULL/invalid */ (void)nco_lmt_init(var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]); /* Set start, count, stride to match current record */ /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]->srt=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]->end=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]->cnt=1L; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]->srd=1L; var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]->nm=strdup("record_limit"); } /* lmt_dmn_nbr == 0 */ }else{ /* Dimension is not coordinate */ assert(!var_trv->var_dmn[idx_dmn].is_crd_var); lmt_dmn_nbr=var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr; if(lmt_dmn_nbr > 0){ for(int idx_lmt=0;idx_lmtvar_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]->srt=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]->end=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]->cnt=1L; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]->srd=1L; } }else{ /* lmt_dmn_nbr == 0 */ flg_lmt=True; /* Allocate dummy limit */ var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr=1; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn=(lmt_sct **)nco_malloc(1*sizeof(lmt_sct *)); /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize NULL/invalid */ (void)nco_lmt_init(var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]); /* Set start, count, stride to match current record */ /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]->srt=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]->end=idx_rec_crr_in; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]->cnt=1L; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]->srd=1L; var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]->nm=strdup("record_limit"); } /* lmt_dmn_nbr == 0 */ } /* end Dimension is not coordinate */ break; } /* end record dimension */ } /* end loop over dimensions */ /* Retrieve variable from disk into memory */ (void)nco_msa_var_get_trv(nc_id,var_prc,trv_tbl); /* Free artificial limit and reset number of limits */ for(int idx_dmn=0;idx_dmnnbr_dmn;idx_dmn++){ /* Match current record by name since ID may differ for records across files */ if(!strcmp(var_trv->var_dmn[idx_dmn].dmn_nm_fll,rec_nm_fll)){ /* Custom limit */ if(flg_lmt){ if(var_trv->var_dmn[idx_dmn].is_crd_var){ /* Dimension is coordinate */ var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr=0; /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]=(lmt_sct *)nco_lmt_free(var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[0]); var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn=(lmt_sct **)nco_free(var_trv->var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn); }else if(!var_trv->var_dmn[idx_dmn].is_crd_var){ /* Dimension is not coordinate */ var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr=0; /* fxm: 20140918 TODO nco1114 subscript [0] fails unless record is first dimension, generalize with [rec_dmn_idx] */ var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]=(lmt_sct *)nco_lmt_free(var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[0]); var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn=(lmt_sct **)nco_free(var_trv->var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn); } /* Dimension is not coordinate */ break; } /* Custom limit */ } /* end record dimension */ } /* end loop over dimensions */ } /* end nco_msa_var_get_rec_trv() */ nco_bool /* O [flg] Skip variable */ nco_skp_var /* [fnc] Skip variable while doing record */ (const var_sct * const var_prc, /* I [sct] Processed variable */ const char * const rec_nm_fll, /* I [sng] Full name of record being done in loop */ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { nco_bool flg_skp; /* [flg] Skip variable */ dmn_trv_sct *dmn_trv; /* [sct] GTT dimension structure */ /* Variable must contain one record */ assert(var_prc->is_rec_var); flg_skp=False; /* Loop dimensions */ for(int idx_dmn=0;idx_dmnnbr_dim;idx_dmn++){ /* Is this the record dimension ? */ if(var_prc->dim[idx_dmn]->is_rec_dmn){ /* Get unique dimension object from unique dimension ID, in input list (NB: this is needed because dmn_sct does not have name full) */ dmn_trv=nco_dmn_trv_sct(var_prc->dim[idx_dmn]->id,trv_tbl); /* And it is not the same as the input record dimension name currently being done then skip it */ if(strcmp(dmn_trv->nm_fll,rec_nm_fll)) flg_skp=True; } /* Is this the record dimension */ } /* Loop dimensions */ return flg_skp; } /* nco_skp_var() */ var_sct * /* O [sct] Variable (weight/mask) */ nco_var_get_wgt_trv /* [fnc] Retrieve weighting or mask variable */ (const int nc_id, /* I [id] netCDF file ID */ const char * const wgt_nm, /* I [sng] Weight variable name (relative or absolute) */ const var_sct * const var, /* I [sct] Variable that needs weight/mask */ const trv_tbl_sct * const trv_tbl) /* I [lst] Traversal table */ { /* Purpose: Return weight or mask variable closest in-scope to specified variable */ int grp_id; /* [ID] Group ID */ int var_id; /* [ID] Variable ID */ int idx_wgt; /* [nbr] Weight array counter */ var_sct *wgt_var; /* If first character is '/' then weight name is absolute path */ if(wgt_nm[0] == '/'){ /* Absolute name given for weight. Straightforward extract and copy */ trv_sct *wgt_trv; wgt_trv=trv_tbl_var_nm_fll(wgt_nm,trv_tbl); (void)nco_inq_grp_full_ncid(nc_id,wgt_trv->grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,wgt_trv->nm,&var_id); /* Transfer from table to local variable */ wgt_var=nco_var_fll_trv(grp_id,var_id,wgt_trv,trv_tbl); /* Retrieve variable NB: use GTT version, that "knows" all limits */ (void)nco_msa_var_get_trv(nc_id,wgt_var,trv_tbl); return wgt_var; }else{ /* Relative name given for weight. Must identify most-in-scope match... */ int wgt_nbr=0; /* [nbr] Number of weight/mask variables in file */ trv_sct **wgt_trv=NULL; /* [sct] Weight/mask list */ /* Count matching weight names in order to allocate space */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++) if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && (!strcmp(trv_tbl->lst[tbl_idx].nm,wgt_nm))) wgt_nbr++; /* Fill-in variable structure list for all weights */ wgt_trv=(trv_sct **)nco_malloc(wgt_nbr*sizeof(trv_sct *)); idx_wgt=0; /* Creat list of potential weight structures */ for(unsigned tbl_idx=0;tbl_idxnbr;tbl_idx++){ if(trv_tbl->lst[tbl_idx].nco_typ == nco_obj_typ_var && !strcmp(trv_tbl->lst[tbl_idx].nm,wgt_nm)){ wgt_trv[idx_wgt]=&trv_tbl->lst[tbl_idx]; idx_wgt++; } /* endif */ } /* !tbl_idx */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ /* Find variable that needs weight/mask */ if(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_var].flg_xtr && !strcmp(trv_tbl->lst[idx_var].nm_fll,var->nm_fll)){ trv_sct var_trv=trv_tbl->lst[idx_var]; /* 20150711: This is buggy, at best it returns last weight found, not closest-in-scope */ /* Which weight is closest-in-scope to variable? */ for(idx_wgt=0;idx_wgtgrp_nm_fll,var_trv.grp_nm_fll)){ (void)nco_inq_grp_full_ncid(nc_id,wgt_trv[idx_wgt]->grp_nm_fll,&grp_id); (void)nco_inq_varid(grp_id,wgt_trv[idx_wgt]->nm,&var_id); /* Transfer from table to local variable */ wgt_var=nco_var_fll_trv(grp_id,var_id,wgt_trv[idx_wgt],trv_tbl); /* Retrieve variable NB: use GTT version, that "knows" all limits */ (void)nco_msa_var_get_trv(nc_id,wgt_var,trv_tbl); wgt_trv=(trv_sct **)nco_free(wgt_trv); return wgt_var; } /* !strcmp() */ } /* !idx_wgt */ } /* !var */ } /* !idx_var */ } /* !Relative name */ /* If function has not yet returned, then variable was not found */ (void)fprintf(stdout,"%s: ERROR nco_var_get_wgt_trv() reports unable to find specified weight or mask variable \"%s\"\n",nco_prg_nm_get(),wgt_nm); nco_exit(EXIT_FAILURE); return NULL; } /* nco_var_get_wgt_trv() */ void nco_grp_var_lst /* [fnc] Export list of variable names for group */ (const int nc_id, /* I [id] netCDF file ID */ const char * const grp_nm_fll, /* I [sng] Absolute group name */ char ***nm_lst, /* I/O [sng] List of names (relative) */ int *nm_lst_nbr) /* I/O [nbr] Number of items in list */ { /* Purpose: Export list of variable names for group */ char var_nm[NC_MAX_NAME+1L]; /* [sng] Variable name */ int nbr_var; /* [nbr] Number of variables */ int grp_id; /* [id] Group ID */ /* Get group ID */ (void)nco_inq_grp_full_ncid(nc_id,grp_nm_fll,&grp_id); /* Obtain number of variable for group */ (void)nco_inq(grp_id,(int *)NULL,&nbr_var,(int *)NULL,(int *)NULL); /* Allocate list */ (*nm_lst)=(char **)nco_malloc(nbr_var*sizeof(char *)); /* Iterate variables for this group */ for(int idx_var=0;idx_varnco_typ == nco_obj_typ_var); /* Initialize return value */ *flg_cf_fnd=False; /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,var_trv->grp_nm_fll,&grp_id); /* Obtain variable ID */ (void)nco_inq_varid(grp_id,var_trv->nm,&var_id); /* Find number of attributes */ (void)nco_inq_varnatts(grp_id,var_id,&nbr_att); assert(nbr_att == var_trv->nbr_att); /* Loop attributes */ for(int idx_att=0;idx_attnm_fll,nco_typ_sng(att_typ),nco_typ_sng(NC_CHAR)); return NULL; } /* end if */ att_val=(char *)nco_malloc((att_sz+1L)*sizeof(char)); if(att_sz > 0L) (void)nco_get_att(grp_id,var_id,att_nm,(void *)att_val,NC_CHAR); /* NUL-terminate attribute */ att_val[att_sz]='\0'; /* Split list into separate coordinate names Use nco_lst_prs_sgl_2D() not nco_lst_prs_2D() to avert TODO nco944 */ cf_lst=nco_lst_prs_sgl_2D(att_val,dlm_sng,&nbr_cf); /* ...for each associated variable in CF convention attribute, i.e., "ancillary_variables", "bounds", "climatology", or "coordinates"... */ for(int idx_cf=0;idx_cf] 0 iff val_1 [<,==,>] val_2 */ nco_cmp_aux_crd_dpt /* [fnc] Compare two aux_crd_sct's by group depth */ (const void *val_1, /* I [sct] aux_crd_sct * to compare */ const void *val_2) /* I [sct] aux_crd_sct * to compare */ { /* Purpose: Compare two aux_crd_sct's by group depth structure member Function is suitable for argument to ANSI C qsort() routine in stdlib.h */ const aux_crd_sct * const crd_1=(const aux_crd_sct *)val_1; const aux_crd_sct * const crd_2=(const aux_crd_sct *)val_2; if(crd_1->grp_dpt > crd_2->grp_dpt) return 1; else if(crd_1->grp_dpt < crd_2->grp_dpt) return -1; else return 0; } /* nco_cmp_aux_crd_dpt() */ void nco_prs_aux_crd /* [fnc] Parse auxiliary coordinates */ (const int nc_id, /* I [ID] netCDF file ID */ const int aux_nbr, /* I [nbr] Number of auxiliary coordinates */ char *aux_arg[], /* I [sng] Auxiliary coordinates */ const nco_bool FORTRAN_IDX_CNV, /* I [flg] Hyperslab indices obey Fortran convention */ const nco_bool MSA_USR_RDR, /* I [flg] Multi-Slab Algorithm returns hyperslabs in user-specified order */ const nco_bool EXTRACT_ASSOCIATED_COORDINATES, /* I [flg] Extract all coordinates associated with extracted variables? */ trv_tbl_sct * const trv_tbl) /* I/O [sct] GTT (Group Traversal Table) */ { const char fnc_nm[]="nco_prs_aux_crd()"; /* [sng] Function name */ /* Loop table */ for(unsigned idx_tbl=0;idx_tblnbr;idx_tbl++){ /* Filter variables to extract */ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && trv_tbl->lst[idx_tbl].flg_xtr){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Filter variables with auxiliary coordinates */ if(var_trv.flg_aux){ if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s reports variable with auxiliary coordinates %s\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_tbl].nm_fll); int dmn_idx_fnd=-1; /* [nbr] Index of dimension that has the coordinate */ int dmn_id_fnd_lat=-1; /* [id] ID of dimension that has the latitude coordinate */ int dmn_id_fnd_lon=-1; /* [id] ID of dimension that has the longituee coordinate */ trv_sct *lat_trv=NULL; trv_sct *lon_trv=NULL; /* Loop dimensions, look for latitude */ for(int idx_dmn=0;idx_dmnlst[idx_tbl].var_dmn[dmn_idx_fnd].lat_crd[0].crd_typ; strcpy(units,trv_tbl->lst[idx_tbl].var_dmn[dmn_idx_fnd].lat_crd[0].units); aux=nco_aux_evl_trv(nc_id,aux_nbr,aux_arg,lat_trv,lon_trv,crd_typ,units,&aux_lmt_nbr); /* Mark both 'latitude' and 'longitude' for extraction */ if(EXTRACT_ASSOCIATED_COORDINATES){ (void)trv_tbl_mrk_xtr(lat_trv->nm_fll,True,trv_tbl); (void)trv_tbl_mrk_xtr(lon_trv->nm_fll,True,trv_tbl); } /* Found limits */ if(aux_lmt_nbr > 0){ if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s variable <%s> (%d) limits\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_tbl].nm_fll,aux_lmt_nbr); lmt_sct **lmt=aux; int lmt_dmn_nbr=aux_lmt_nbr; /* Dimension IDs of both 'latitude' and 'longitude' must refer to same dimemsion (e.g., 'gds_crd) */ assert(dmn_id_fnd_lon == dmn_id_fnd_lat); CEWI_unused(dmn_id_fnd_lon); /* Apply limits to variable in table */ (void)nco_lmt_aux_tbl(nc_id,lmt,lmt_dmn_nbr,var_trv.nm_fll,dmn_id_fnd_lat,FORTRAN_IDX_CNV,MSA_USR_RDR,trv_tbl); /* Apply limits to *all* 'latitude', 'longitude' variables that share the same ID */ (void)nco_lmt_std_att_lat_lon(nc_id,lmt,lmt_dmn_nbr,dmn_id_fnd_lat,FORTRAN_IDX_CNV,MSA_USR_RDR,trv_tbl); /* Get unique dimension object from unique dimension ID (e.g., 'gds_crd) */ dmn_trv_sct *dmn_trv=nco_dmn_trv_sct(dmn_id_fnd_lat,trv_tbl); /* The dimension IDs of both 'latitude' and 'longitude' must refer to the same dimemsion (e.g., 'gds_crd) */ assert(dmn_id_fnd_lon == dmn_trv->dmn_id); /* Apply limits to the coordinate (e.g., 'gds_crd) */ (void)nco_lmt_aux_tbl(nc_id,lmt,lmt_dmn_nbr,dmn_trv->nm_fll,dmn_id_fnd_lat,FORTRAN_IDX_CNV,MSA_USR_RDR,trv_tbl); if(nco_dbg_lvl_get() == nco_dbg_old) { for(int idx_lmt=0;idx_lmtnbr;idx_tbl++){ /* Match variable */ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && !strcmp(var_nm_fll,trv_tbl->lst[idx_tbl].nm_fll)){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; /* Loop dimensions */ for(int idx_dmn=0;idx_dmnnbr;idx_tbl++){ /* Match variable that has 'standard_name' flag */ if(trv_tbl->lst[idx_tbl].nco_typ == nco_obj_typ_var && (trv_tbl->lst[idx_tbl].flg_std_att_lat || trv_tbl->lst[idx_tbl].flg_std_att_lon)){ trv_sct var_trv=trv_tbl->lst[idx_tbl]; for(int idx_dmn=0;idx_dmnlst[idx_tbl].var_dmn[idx_dmn].crd) { /* For this call (-X) the *same* limits are applied to all coordinates, and other variables might apply them too, so make sure they are applied only once by setting -1 in lmt_crr */ if (trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_crr == -1) return; trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_crr=-1; /* Loop limits */ for(int idx_lmt=0;idx_lmtlst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr++; int nbr_lmt=trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr; trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn=(lmt_sct **)nco_realloc(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn,nbr_lmt*sizeof(lmt_sct *)); crd_sct *crd=trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd; /* Limit is same as dimension in input file? */ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.NON_HYP_DMN=False; /* Parse user-specified limits into hyperslab specifications. NOTE: Use True parameter and "crd" */ (void)nco_lmt_evl_dmn_crd(nc_id,0L,FORTRAN_IDX_CNV,crd->crd_grp_nm_fll,crd->nm,crd->sz,crd->is_rec_dmn,True,lmt[idx_lmt]); /* Alloc this limit */ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize this entry */ (void)nco_lmt_init(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]); /* Store dimension ID */ lmt[idx_lmt]->id=crd->dmn_id; /* Store this valid input; deep-copy to table */ (void)nco_lmt_cpy(lmt[idx_lmt],trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn[idx_lmt]); } /* Loop limits */ /* Apply MSA for each Dimension in new cycle (that now has all its limits in place) */ /* Loop limits */ for(int idx_lmt=0;idx_lmtlst[idx_tbl].var_dmn[idx_dmn].crd; /* Adapted from original MSA loop in nco_msa_lmt_all_ntl(); differences are marked GTT specific */ nco_bool flg_ovl; /* [flg] Limits overlap */ /* GTT: If this coordinate has no limits, continue */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr == 0) continue; /* ncra/ncrcat have only one limit for record dimension so skip evaluation otherwise this messes up multi-file operation */ if(crd->is_rec_dmn && (nco_prg_id_get() == ncra || nco_prg_id_get() == ncrcat)) continue; /* Split-up wrapped limits. NOTE: using deep copy version nco_msa_wrp_splt_cpy() */ (void)nco_msa_wrp_splt_cpy(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); /* Wrapped hyperslabs are dimensions broken into the "wrong" order, e.g., from -d time,8,2 broken into -d time,8,9 -d time,0,2 WRP flag set only when list contains dimensions split as above */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.WRP){ /* Find and store size of output dim */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); continue; } /* End WRP flag set */ /* Single slab---no analysis needed */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.lmt_dmn_nbr == 1){ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); continue; } /* End Single slab */ /* Does Multi-Slab Algorithm returns hyperslabs in user-specified order? */ if(MSA_USR_RDR){ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa.MSA_USR_RDR=True; /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); continue; } /* End MSA_USR_RDR */ /* Sort limits */ (void)nco_msa_qsort_srt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); /* Check for overlap */ flg_ovl=nco_msa_ovl(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].crd->lmt_msa); if(nco_dbg_lvl_get() >= nco_dbg_fl){ if(flg_ovl) (void)fprintf(stdout,"%s: coordinate \"%s\" has overlapping hyperslabs\n",nco_prg_nm_get(),crd->nm); else (void)fprintf(stdout,"%s: coordinate \"%s\" has distinct hyperslabs\n",nco_prg_nm_get(),crd->nm); } /* endif */ } /* Loop limits */ } /* a) case where the dimension has coordinate variables */ /* b) Dimension only (no coordinate variable for this dimension) */ else if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd) { if(nco_dbg_lvl_get() >= nco_dbg_dev) { } /* For this call (-X) the *same* limits are applied to all coordinates, and other variables might apply them too, so make sure they are applied only once by setting -1 in lmt_crr */ if (trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_crr == -1) return; trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_crr=-1; /* Loop limits */ for(int idx_lmt=0;idx_lmtlst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr++; int nbr_lmt=trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr; trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn=(lmt_sct **)nco_realloc(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn,nbr_lmt*sizeof(lmt_sct *)); dmn_trv_sct *ncd=trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd; /* Limit is same as dimension in input file? */ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.NON_HYP_DMN=False; /* Parse user-specified limits into hyperslab specifications. NOTE: Use False parameter */ (void)nco_lmt_evl_dmn_crd(nc_id,0L,FORTRAN_IDX_CNV,ncd->grp_nm_fll,ncd->nm,ncd->sz,ncd->is_rec_dmn,False,lmt[idx_lmt]); /* Alloc this limit */ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]=(lmt_sct *)nco_malloc(sizeof(lmt_sct)); /* Initialize this entry */ (void)nco_lmt_init(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]); /* Store dimension ID */ lmt[idx_lmt]->id=ncd->dmn_id; /* Store this valid input; deep-copy to table */ (void)nco_lmt_cpy(lmt[idx_lmt],trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn[idx_lmt]); } /* Loop limits */ /* Apply MSA for each Dimension in new cycle (that now has all its limits in place) */ /* Loop limits */ for(int idx_lmt=0;idx_lmtlst[idx_tbl].var_dmn[idx_dmn].ncd; /* Adapted from original MSA loop in nco_msa_lmt_all_ntl(); differences are marked GTT specific */ nco_bool flg_ovl; /* [flg] Limits overlap */ /* GTT: If this coordinate has no limits, continue */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr == 0) continue; /* ncra/ncrcat have only one limit for record dimension so skip evaluation otherwise this messes up multi-file operation */ if(ncd->is_rec_dmn && (nco_prg_id_get() == ncra || nco_prg_id_get() == ncrcat)) continue; /* Split-up wrapped limits. NOTE: using deep copy version nco_msa_wrp_splt_cpy() */ (void)nco_msa_wrp_splt_cpy(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); /* Wrapped hyperslabs are dimensions broken into the "wrong" order, e.g., from -d time,8,2 broken into -d time,8,9 -d time,0,2 WRP flag set only when list contains dimensions split as above */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.WRP){ /* Find and store size of output dim */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); continue; } /* End WRP flag set */ /* Single slab---no analysis needed */ if(trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.lmt_dmn_nbr == 1){ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); continue; } /* End Single slab */ /* Does Multi-Slab Algorithm return hyperslabs in user-specified order? */ if(MSA_USR_RDR){ trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa.MSA_USR_RDR=True; /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); continue; } /* End MSA_USR_RDR */ /* Sort limits */ (void)nco_msa_qsort_srt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); /* Check for overlap */ flg_ovl=nco_msa_ovl(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); /* Find and store size of output dimension */ (void)nco_msa_clc_cnt(&trv_tbl->lst[idx_tbl].var_dmn[idx_dmn].ncd->lmt_msa); if(nco_dbg_lvl_get() >= nco_dbg_fl){ if(flg_ovl) (void)fprintf(stdout,"%s: coordinate \"%s\" has overlapping hyperslabs\n",nco_prg_nm_get(),ncd->nm); else (void)fprintf(stdout,"%s: coordinate \"%s\" has distinct hyperslabs\n",nco_prg_nm_get(),ncd->nm); } /* endif dbg */ } /* Loop limits */ } /* b) Dimension only (no coordinate variable for this dimension) */ return; } /* nco_lmt_aux() */ void nco_bld_crd_aux /* [fnc] Build auxiliary coordinates information into table */ (const int nc_id, /* I [ID] netCDF file ID */ trv_tbl_sct *trv_tbl) /* I [sct] GTT (Group Traversal Table) */ { const char fnc_nm[]="nco_bld_crd_aux()"; /* [sng] Function name */ /* Look for attributes 'standard_name' == 'latitude' and 'longitude' */ char *var_nm_fll=NULL; int dmn_id; /* [id] Dimension ID for 'latitude' and 'longitude' coordinate variables, e.g., lat_gds(gds_crd) */ nc_type crd_typ; for(unsigned idx_var=0;idx_varnbr;idx_var++){ nco_bool has_lat; nco_bool has_lon; trv_sct var_trv=trv_tbl->lst[idx_var]; if(var_trv.nco_typ == nco_obj_typ_var){ char units_lat[NC_MAX_NAME+1L]; char units_lon[NC_MAX_NAME+1L]; has_lat=nco_find_lat_lon_trv(nc_id,&var_trv,"latitude",&var_nm_fll,&dmn_id,&crd_typ,units_lat); if(has_lat){ /* Variable contains 'standard_name' attribute 'latitude' */ trv_tbl->lst[idx_var].flg_std_att_lat=True; if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s 'standard_name' attribute is 'latitude' for variable %s with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,dmn_id); for(unsigned idx_crd=0;idx_crdnbr;idx_crd++){ /* Detect 'standard_name' attribute 'latitude' in the compared variable, to avoid inserting it */ nco_bool has_lat_lcl=False; nco_bool has_lon_lcl=False; char *var_nm_fll_lcl=NULL; int dmn_id_lcl; if(trv_tbl->lst[idx_crd].nco_typ == nco_obj_typ_var){ has_lat_lcl=nco_find_lat_lon_trv(nc_id,&trv_tbl->lst[idx_crd],"latitude",&var_nm_fll_lcl,&dmn_id_lcl,&crd_typ,units_lat); has_lon_lcl=nco_find_lat_lon_trv(nc_id,&trv_tbl->lst[idx_crd],"longitude",&var_nm_fll_lcl,&dmn_id_lcl,&crd_typ,units_lon); } /* endif */ if(nco_dbg_lvl_get() >= nco_dbg_dev){ if(has_lat_lcl) (void)fprintf(stdout,"%s: DEBUG %s \t AVOID 'standard_name' attribute 'latitude' for variable %s with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,var_nm_fll_lcl,dmn_id_lcl); if(has_lon_lcl) (void)fprintf(stdout,"%s: DEBUG %s \t AVOID 'standard_name' attribute 'longitude' for variable %s with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,var_nm_fll_lcl,dmn_id_lcl); } /* endif dbg */ if(trv_tbl->lst[idx_crd].nco_typ == nco_obj_typ_var && (!has_lat_lcl && !has_lon_lcl) && /* Avoid inserting 'lat_gds' or 'lon_gds' */ !trv_tbl->lst[idx_crd].is_crd_var){ for(int idx_dmn=0;idx_dmnlst[idx_crd].nbr_dmn;idx_dmn++){ /* Match dimension */ int var_dim_id=trv_tbl->lst[idx_crd].var_dmn[idx_dmn].dmn_id; if(var_dim_id == dmn_id){ /* Check if possible 'latitude' (var_trv) is in-scope */ if(nco_var_scp(&trv_tbl->lst[idx_crd],&var_trv,trv_tbl)){ /* Mark variable (e.g., gds_var, gds_3dvar) as containing auxiliary coordinates */ trv_tbl->lst[idx_crd].flg_aux=True; if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s reports variable %s has auxiliary coordinates with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_crd].nm_fll,var_dim_id); /* Insert item into list */ trv_tbl->lst[idx_crd].var_dmn[idx_dmn].nbr_lat_crd++; int nbr_lat_crd=trv_tbl->lst[idx_crd].var_dmn[idx_dmn].nbr_lat_crd; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd=(aux_crd_sct *)nco_realloc(trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd,nbr_lat_crd*sizeof(aux_crd_sct)); trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd[nbr_lat_crd-1].nm_fll=strdup(var_nm_fll); trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd[nbr_lat_crd-1].dmn_id=dmn_id; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd[nbr_lat_crd-1].grp_dpt=var_trv.grp_dpt; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd[nbr_lat_crd-1].crd_typ=crd_typ; strcpy(trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lat_crd[nbr_lat_crd-1].units,units_lat); } /* Is in-scope */ } /* Match dimension */ } /* Loop dimensions */ } /* variables only */ } /* end inner loop over possible coordinates */ } /* !has_lat */ has_lon=nco_find_lat_lon_trv(nc_id,&var_trv,"longitude",&var_nm_fll,&dmn_id,&crd_typ,units_lon); if(has_lon){ /* Variable contains 'standard_name' attribute 'longitude' */ trv_tbl->lst[idx_var].flg_std_att_lon=True; if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s 'standard_name' attribute is 'longitude' for variable %s with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,var_trv.nm_fll,dmn_id); for(unsigned idx_crd=0;idx_crdnbr;idx_crd++){ /* Detect 'standard_name' attribute 'latitude' in the compared variable, to avoid inserting it */ nco_bool has_lat_lcl=False; nco_bool has_lon_lcl=False; char *var_nm_fll_lcl=NULL; int dmn_id_lcl; if(trv_tbl->lst[idx_crd].nco_typ == nco_obj_typ_var){ has_lat_lcl=nco_find_lat_lon_trv(nc_id,&trv_tbl->lst[idx_crd],"latitude",&var_nm_fll_lcl,&dmn_id_lcl,&crd_typ,units_lat); has_lon_lcl=nco_find_lat_lon_trv(nc_id,&trv_tbl->lst[idx_crd],"longitude",&var_nm_fll_lcl,&dmn_id_lcl,&crd_typ,units_lon); } /* endif */ if(trv_tbl->lst[idx_crd].nco_typ == nco_obj_typ_var && (!has_lat_lcl && !has_lon_lcl) && /* Avoid inserting 'lat_gds' or 'lon_gds' */ !trv_tbl->lst[idx_crd].is_crd_var){ for(int idx_dmn=0;idx_dmnlst[idx_crd].nbr_dmn;idx_dmn++){ /* Match dimension */ int var_dim_id=trv_tbl->lst[idx_crd].var_dmn[idx_dmn].dmn_id; if (var_dim_id == dmn_id){ /* Check if possible 'longitude' (var_trv) is in-scope */ if(nco_var_scp(&trv_tbl->lst[idx_crd],&var_trv,trv_tbl)){ /* Mark variable (e.g., gds_var, gds_3dvar) as containing auxiliary coordinates */ trv_tbl->lst[idx_crd].flg_aux=True; if(nco_dbg_lvl_get() >= nco_dbg_dev) (void)fprintf(stdout,"%s: DEBUG %s reports variable %s has auxiliary coordinates with dimension ID = %d\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_crd].nm_fll,var_dim_id); /* Insert item into list */ trv_tbl->lst[idx_crd].var_dmn[idx_dmn].nbr_lon_crd++; int nbr_lon_crd=trv_tbl->lst[idx_crd].var_dmn[idx_dmn].nbr_lon_crd; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd=(aux_crd_sct *)nco_realloc(trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd,nbr_lon_crd*sizeof(aux_crd_sct)); trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd[nbr_lon_crd-1].nm_fll=strdup(var_nm_fll); trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd[nbr_lon_crd-1].dmn_id=dmn_id; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd[nbr_lon_crd-1].grp_dpt=var_trv.grp_dpt; trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd[nbr_lon_crd-1].crd_typ=crd_typ; strcpy(trv_tbl->lst[idx_crd].var_dmn[idx_dmn].lon_crd[nbr_lon_crd-1].units,units_lat); } /* Is in-scope */ } /* Match dimension */ } /* Loop dimensions */ } /* variables only */ } /* end inner loop over possible coordinates */ } /* has_lon */ } /* Filter variables */ } /* Loop table 1*/ /* Sort array of 'latitude' and 'longitude' coordinate variables by group depth and choose the most in-scope variables */ /* Loop table */ for(unsigned idx_var=0;idx_varnbr;idx_var++){ /* Filter variables with auxiliary coordinates */ if(trv_tbl->lst[idx_var].flg_aux){ assert(trv_tbl->lst[idx_var].nco_typ == nco_obj_typ_var); if(nco_dbg_lvl_get() == nco_dbg_old) (void)fprintf(stdout,"%s: DEBUG %s variable with auxiliary coordinates <%s>\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_var].nm_fll); /* Loop dimensions */ for(int idx_dmn=0;idx_dmnlst[idx_var].nbr_dmn;idx_dmn++){ /* Has 'latitude' auxiliary coordinates */ if(trv_tbl->lst[idx_var].var_dmn[idx_dmn].nbr_lat_crd){ int nbr_lat_crd=trv_tbl->lst[idx_var].var_dmn[idx_dmn].nbr_lat_crd; /* Sort by group depth */ qsort(trv_tbl->lst[idx_var].var_dmn[idx_dmn].lat_crd,(size_t)nbr_lat_crd,sizeof(trv_tbl->lst[idx_var].var_dmn[idx_dmn].lat_crd[0]),nco_cmp_aux_crd_dpt); if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: DEBUG %s 'latitude' auxiliary coordinates %s: %s\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_var].nm_fll,trv_tbl->lst[idx_var].var_dmn[idx_dmn].dmn_nm_fll); for(int idx_crd=0;idx_crdlst[idx_var].var_dmn[idx_dmn].lat_crd[idx_crd].nm_fll,trv_tbl->lst[idx_var].var_dmn[idx_dmn].lat_crd[idx_crd].grp_dpt); } /* endif dbg */ } /* Has 'latitude' auxiliary coordinates */ /* Has 'longitude' auxiliary coordinates */ if(trv_tbl->lst[idx_var].var_dmn[idx_dmn].nbr_lon_crd){ int nbr_lon_crd=trv_tbl->lst[idx_var].var_dmn[idx_dmn].nbr_lon_crd; /* Sort them by group depth */ qsort(trv_tbl->lst[idx_var].var_dmn[idx_dmn].lon_crd,(size_t)nbr_lon_crd,sizeof(trv_tbl->lst[idx_var].var_dmn[idx_dmn].lon_crd[0]),nco_cmp_aux_crd_dpt); if(nco_dbg_lvl_get() == nco_dbg_old){ (void)fprintf(stdout,"%s: DEBUG %s 'longitude' auxiliary coordinates %s: %s\n",nco_prg_nm_get(),fnc_nm,trv_tbl->lst[idx_var].nm_fll,trv_tbl->lst[idx_var].var_dmn[idx_dmn].dmn_nm_fll); for(int idx_crd=0;idx_crdlst[idx_var].var_dmn[idx_dmn].lon_crd[idx_crd].nm_fll,trv_tbl->lst[idx_var].var_dmn[idx_dmn].lon_crd[idx_crd].grp_dpt); } /* endif dbg */ } /* Has 'longitude' auxiliary coordinates */ } /* Loop dimensions */ } /* Filter variables with auxiliary coordinates */ } /* Loop table */ return; } /* nco_bld_crd_aux() */ nco_bool /* O [flg] True if variable 1 is in-scope of variable 2 */ nco_var_scp /* [fnc] Is variable 1 is in-scope of variable 2 */ (const trv_sct * const var_trv_1, /* I [sct] Variable 1 */ const trv_sct * const var_trv_2, /* I [sct] Variable 2 (use case , find 'latitude in-scope)*/ const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { /* Same group */ if(!strcmp(var_trv_1->grp_nm_fll,var_trv_2->grp_nm_fll)) return True; /* Different groups: traverse down the higher and look for a group match name */ if(var_trv_2->grp_dpt > var_trv_1->grp_dpt){ char *grp_nm_fll_prn_2=var_trv_2->grp_nm_fll_prn; /* [sct] Parent group */ trv_sct *grp_prn_2; grp_prn_2=trv_tbl_grp_nm_fll(grp_nm_fll_prn_2,trv_tbl); /* Look for same group name in hierarchy */ while (grp_nm_fll_prn_2){ /* Same group in hierarchy */ if(!strcmp(grp_prn_2->grp_nm,var_trv_1->grp_nm)) return True; /* Exit loop when root reached */ if(grp_prn_2->grp_dpt == 0) break; grp_nm_fll_prn_2=grp_prn_2->grp_nm_fll_prn; grp_prn_2=trv_tbl_grp_nm_fll(grp_nm_fll_prn_2,trv_tbl); } /* end while */ } /* end if */ return False; } /* end nco_var_scp() */ int * nco_dmn_malloc /* [fnc] Inquire about number of dimensions in group and return dynamic array of dimension IDs */ (const int nc_id, /* I [ID] netCDF file ID */ const char * const grp_nm_fll, /* I [sng] Group full name */ int *dmn_nbr) /* I/O [nbr] Number of dimensions in group */ { const int flg_prn=0; /* [flg] Retrieve all dimensions in parent groups */ int *dmn_ids; /* [nbr] Dimensions IDs array */ int grp_id; /* [ID] Group ID */ int nbr_dmn; /* [nbr] Number of dimensions */ /* Obtain group ID */ (void)nco_inq_grp_full_ncid(nc_id,grp_nm_fll,&grp_id); /* Obtain number of dimensions for group */ (void)nco_inq(grp_id,&nbr_dmn,(int *)NULL,(int *)NULL,(int *)NULL); /* Alloc array */ dmn_ids=(int *)nco_malloc(nbr_dmn*sizeof(int)); /* Obtain dimensions IDs for group */ (void)nco_inq_dimids(grp_id,&nbr_dmn,dmn_ids,flg_prn); /* Export number of dimensions */ *dmn_nbr=nbr_dmn; return dmn_ids; } /* end nco_dmn_malloc() */ void nco_dmn_lmt /* [fnc] Convert a lmt_sct array to dmn_sct (name only) */ (lmt_sct **lmt, /* I [lst] lmt_sct array */ const int nbr_lmt, /* I [nbr] Size of lmt_sct array */ dmn_sct ***dmn) /* O [sct] dmn_sct array */ { for(int idx=0;idxnm=(char *)strdup(lmt[idx]->nm); (*dmn)[idx]->nm_fll=(char *)strdup(lmt[idx]->nm_fll); (*dmn)[idx]->id=-1; (*dmn)[idx]->nc_id=-1; (*dmn)[idx]->xrf=NULL; (*dmn)[idx]->val.vp=NULL; (*dmn)[idx]->is_rec_dmn=lmt[idx]->is_rec_dmn; (*dmn)[idx]->cnt=-1L; (*dmn)[idx]->sz=-1L; (*dmn)[idx]->srt=-1L; (*dmn)[idx]->end=-1L; (*dmn)[idx]->srd=-1L; (*dmn)[idx]->cid=-1; (*dmn)[idx]->cnk_sz=-1L; (*dmn)[idx]->type=(nc_type)-1; } /* endfor */ return; } /* end nco_dmn_lmt() */ void nco_prn_nsm /* [fnc] Print ensembles */ (const trv_tbl_sct * const trv_tbl) /* I [sct] Traversal table */ { if(!trv_tbl->nsm_nbr) return; (void)fprintf(stdout,"%s: list of ensembles\n",nco_prg_nm_get()); for(int idx_nsm=0;idx_nsmnsm_nbr;idx_nsm++) (void)fprintf(stdout,"%s: <%s>\n",nco_prg_nm_get(),trv_tbl->nsm[idx_nsm].grp_nm_fll_prn); (void)fprintf(stdout,"%s: list of fixed templates\n",nco_prg_nm_get()); for(int idx_skp=0;idx_skpnsm->skp_nbr;idx_skp++) (void)fprintf(stdout,"%s: